实践,针对多业务复合流程复用接口封装

目前场景是,我们的业务需要对接工作流,每个工作流都需要经过如下几步来完成工作流数据的发起,我们几乎所有涉及到的业务都需要进行工作流审批,我们梳理了下工作流的发起模式(如下图所示)都是先选用户再保存数据,然后保存用户,继而根据有无实例id来实现新工作流的发起或驳回后的重新提交操作。

其实上述步骤非常简便,那么有没有一种方法能够简化这些重复性的工作呢?,在Spring中我们有AOP的概念,在前端我们也可以利用这些思想去处理,尽量地将这些抽取成模板,以模板的方式进行调用。

该函数接收两个参数,分别是kindtype

  • kind标识发起工作流属于哪种业务
  • type标识使用的工作流种类

返回的参数有 allid,saveUser,showUserList

  • allid 用于接收工作流实例的相关参数
  • saveUser 用于保存所选用户
  • showUserList 用户展示用户列表
ts 复制代码
export default function useBPMFlow(kind = 1, type = BPM_FLOW_TYPE.rcjt) {
  const allid = ref({})
  return {
    allid,
    saveUser,
    showUserList
  }
}

内部逻辑如下

ts 复制代码
export default function useBPMFlow(kind = 1, type = BPM_FLOW_TYPE.rcjt) {
  const allid = ref({})
  const nodeId = ref('')
  const { proxy } = getCurrentInstance()
  function showUserList() {
    const { promise, resolve, reject } = withResolvers()
    获取用户({ modelKey: type }).then(res => {
      const userList = res.result
      proxy.$dialog({  //          用户选择弹框
        max: true,
        content: {
          component: SubmitDialog,
          props: {
            list: userList,
          },
          handle: true
        },
        width: '40%',
        height: '30%',
        ok: args => {
          resolve(args)
          return true
        },
        close: () => {
          reject()
          return true
        }
      })
    })
    return promise
  }
  /** 保存用户 */
  function saveUser(val, id) {
    const { promise, resolve, reject } = withResolvers()
    val.forEach(node => {
      if (node.nodeKey === nodeId.value) {
        node.chosen = 1
      }
    })
    const pro = bpmmanage_saveUser({ approveUserList: val })
    pro.then(re => {
      if (re.code === 200) {
        val = val
          .filter(function (item) {
            return item.nodeKey === nodeId.value
          })
          .map(function (item) {
            return item.userId
          })
        if (判断是否需要发起工作流) {
          // 重新提交
          const p = agree(JSON.stringify({ userList: val.join() }))
          p.then(() => resolve())
          p.catch(() => reject())
        } else {
          // 发起新工作流
          const p = startBpm(JSON.stringify({ userList: val.join() }), id)
          p.then(() => resolve())
          p.catch(() => reject())
        }
      }
    })
    pro.catch(() => {
      reject()
    })
    return promise
  }

  // 启动流程
  function startBpm(val, id) {
    const { promise, resolve, reject } = withResolvers()
    const pro = bpmmanage_startBpm({
      kind,
      type,
      relationId: id,
      formData: val
    })
    pro.then(rrr => {
      if (rrr.code === 200) {
        resolve()
      } else {
        reject()
      }
    })
    pro.catch(() => {
      reject()
    })

    return promise
  }

  function agree(val) {
    const { promise, resolve, reject } = withResolvers()
    const pro = 重新提交函数(allid)
    pro.then(rrr => {
      if (rrr.code === 200) {
        resolve()
      } else {
        reject()
      }
    })
    pro.catch(() => {
      reject()
    })
    return promise
  }
  return {
    allid,
    saveUser,
    showUserList
  }
}

该代码使用使用withResolvers将promise回调转化为扁平化padding,并将结果的成功和失败传递给自定义的处理,

业务侧使用

ts 复制代码
const { allid, showUserList, saveUser } = useBPMFlow(发起的业务类型)
async handleSubmit(){
  const userList = await showUserList() // 选择用户
  const result = await saveData() //       保存数据
  if (result.code === 200) {
    const id = result.result.id
    await saveUser(userList, id)  //       保存选中审批人
    goBack() // 跳转到列表页
    
  }

比起那些重复又复杂的回调,使用这种方式可以简化业务侧的开发工作量

(所有代码均已脱敏)

相关推荐
weixin_448119943 分钟前
Datawhale Hello-Agents入门篇202512第2次作业
java·前端·javascript
程序员爱钓鱼6 分钟前
Node.js 编程实战:路由与中间件
前端·后端·node.js
程序员爱钓鱼9 分钟前
Node.js 编程实战:Express 基础
前端·后端·node.js
Cat God 00718 分钟前
完整静态工具网站(尝试)
前端·html
WindrunnerMax21 分钟前
从零实现富文本编辑器#9-编辑器文本结构变更的受控处理
前端·架构·github
Mintopia34 分钟前
静态内容页该用HTML还是Next.js展示更好
前端·html·next.js
LYFlied41 分钟前
【每日算法】LeetCode 226. 翻转二叉树
前端·算法·leetcode·面试·职场和发展
无名无姓某罗42 分钟前
jQuery 请求 SpringMVC 接口返回404错误排查
前端·spring·jquery
霁月的小屋1 小时前
Vue响应式数据全解析:从Vue2到Vue3,ref与reactive的实战指南
前端·javascript·vue.js
李少兄1 小时前
深入理解 Java Web 开发中的 HttpServletRequest 与 HttpServletResponse
java·开发语言·前端