adtec-hnyzfc-core-package 1.6.0 → 1.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/AddOrMinusMultiDialog.vue_vue_type_script_setup_true_lang-BWVDdb4B.js +1 -0
- package/dist/src/components/workflow/TaskOperation.vue.js +1 -1
- package/dist/src/components/workflow/WorkflowTodoShell.vue.js +3 -3
- package/dist/src/components/workflow/components/AddOrMinusMultiDialog.vue.d.ts +7 -0
- package/dist/src/components/workflow/components/AddOrMinusMultiDialog.vue.js +1 -1
- package/dist/src/components/workflow/components/CheckDialog.vue.d.ts +7 -0
- package/dist/src/components/workflow/components/CheckDialog.vue.js +1 -1
- package/dist/src/components/workflow/components/SelectAssigneeDialog.vue.d.ts +7 -0
- package/dist/src/components/workflow/components/SelectAssigneeDialog.vue.js +1 -1
- package/dist/src/config/vxeSelectColumn.d.ts +3 -2
- package/dist/src/hooks/createDialogHooks.js +2 -2
- package/dist/src/hooks/userWorkflowHooks.d.ts +62 -7
- package/dist/src/hooks/userWorkflowHooks.js +1 -1
- package/dist/src/hooks/workflowCompleteRunner.d.ts +51 -0
- package/dist/src/hooks/workflowCompleteRunner.js +1 -0
- package/dist/src/interface/workflow/IWfTaskQueryVo.d.ts +9 -0
- package/dist/src/interface/workflow/IWfTaskVo.d.ts +4 -0
- package/dist/src/utils/modules.js +2 -2
- package/dist/styles/element-ui.css +1 -1
- package/package.json +1 -1
- package/dist/chunks/AddOrMinusMultiDialog.vue_vue_type_script_setup_true_lang-SYw6MXOl.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{defineComponent as q,ref as k,useModel as z,computed as w,resolveComponent as d,resolveDirective as H,openBlock as p,createBlock as v,withCtx as c,withDirectives as L,createVNode as h,createElementVNode as $,toDisplayString as x,createElementBlock as G,Fragment as J,renderList as K,createCommentVNode as N,mergeModels as U}from"vue";import A from"../src/api/workflow/workflowInstApi.js";import{ElMessage as i}from"element-plus";import{userInfoStore as R}from"../src/stores/userInfoStore.js";import X from"../src/components/business/comp.userForm.vue.js";import Y from"../src/api/SysUserApi.js";import C from"../src/utils/FrameworkUtils.js";const re=q({__name:"AddOrMinusMultiDialog",props:U({taskId:{},dialogType:{},renderDialog:{type:Function},onWorkflowSuccess:{type:Function}},{loading:{type:Boolean,default:!1},loadingModifiers:{}}),emits:U(["success"],["update:loading"]),setup(M,{expose:T,emit:B}){const s=M,S=B,I=R(),a=k({assignee:[]}),f=z(M,"loading"),u=w(()=>s.dialogType??""),r=k([]),_=k([]),V=w(()=>_.value.map(e=>e.userName||e.loginName||"")),E=w(()=>{const e=I.getUserInfo,n=e?.topDeptId||e?.mdmDeptId;return n?[n]:[]}),b=s.renderDialog,F=(e,n,l,o,t,m)=>{if(!b){console.warn("[AddOrMinusMultiDialog] 未注入 renderDialog,无法打开选人弹窗(请通过 props 传入 useDialogHooks 的 render)");return}b(e,n,l,o,t,m)},D=()=>{F(X,{multiple:!0,selectedUserCodes:[...r.value,..._.value.map(e=>e.loginName).filter(Boolean)],defalutQueryParam:{deptIds:E.value},onSuccess:async e=>{const n=Array.isArray(e)?e:e?[e]:[];if(!n.length){i.warning("请选择审批人员");return}const l=[];for(const o of n){const t=o?.code;if(!t||a.value.candidate?.some(y=>y.loginName===t))continue;try{await Y.addNBUserInfo([t])}catch{l.push(o.name||t);continue}const m={id:o.id,loginName:t,userName:o.name,deptName:o.deptName};a.value.candidate||(a.value.candidate=[]),a.value.candidate.push(m),a.value.assignee?.push(t),_.value.push(m)}l.length&&i.error(`以下人员不在用户表中且补建失败:${l.join("、")}`)}},{title:"选择新增审批人",width:"900px",top:"8vh",style:{height:"72vh"}},"dialog")},O=async()=>{if(!(!s.taskId||!s.dialogType))try{if(a.value={assignee:[]},_.value=[],f.value=!0,a.value={...await A.getTaskCandidate(s.taskId),assignee:[]},r.value=a.value.candidate?.map(e=>e.loginName)||[],s.dialogType==="minusMulti"&&r.value.length<=1){i.warning("至少需保留一名审核人,当前仅剩一名审核人,无法减签");return}a.value.assignee=[...r.value]}catch(e){C.messageError(e)}finally{f.value=!1}},P=e=>u.value==="addMulti"?r.value.includes(e):u.value==="minusMulti"?I.getUserInfo.userCode===e:!1;return T({resetQuery:O,confirm:async()=>{if(a.value.candidate?.length==0){i.warning("请指定执行人!");return}if(u.value==="addMulti"){if(a.value.assignee.length==0){i.warning("请指定执行人!");return}if(a.value.assignee.length<=r.value.length){i.warning("加签必须选择非原审批人!");return}}else if(u.value==="minusMulti"){if(a.value.assignee.length<1){i.warning("至少需保留一名审核人");return}if(a.value.assignee.length>=r.value.length){i.warning("减签必须取消选中原审批人!");return}}try{f.value=!0,a.value.type=u.value,await A.addOrMinusAssignee(a.value),await s.onWorkflowSuccess?.({actionType:u.value,previousAssignees:[...r.value]}),i.success("操作成功"),S("success")}catch(e){throw C.messageError(e),e}finally{f.value=!1}}}),(e,n)=>{const l=d("el-form-item"),o=d("el-checkbox"),t=d("el-checkbox-group"),m=d("el-icons"),y=d("el-input"),j=d("el-form"),Q=d("el-flex"),W=H("loading");return p(),v(Q,{vertical:!0,height:"100%"},{default:c(()=>[L((p(),v(j,{labelPosition:"top",size:"default",style:{width:"100%"}},{default:c(()=>[h(l,{label:"任务名"},{default:c(()=>[$("span",null,x(a.value?.taskName)+"("+x(a.value?.procName)+")",1)]),_:1}),h(l,{label:"审批人",required:!0},{default:c(()=>[a.value?.candidate&&a.value?.candidate.length>0?(p(),v(t,{key:0,modelValue:a.value.assignee,"onUpdate:modelValue":n[0]||(n[0]=g=>a.value.assignee=g)},{default:c(()=>[(p(!0),G(J,null,K(a.value?.candidate,g=>(p(),v(o,{disabled:P(g.loginName),key:g.loginName,label:g.userName,value:g.loginName},null,8,["disabled","label","value"]))),128))]),_:1},8,["modelValue"])):N("v-if",!0)]),_:1}),N(" 加签选人:与转办/产品经理同一套主数据选人,默认本部门 "),u.value==="addMulti"?(p(),v(l,{key:0,label:"新增审批人"},{default:c(()=>[h(y,{"model-value":V.value.join("、"),readonly:"",placeholder:"请选择新增审批人",onClick:D},{append:c(()=>[h(m,{"model-value":"adtec-adduser",tip:"选择新增审批人",style:{cursor:"pointer"},onClick:D})]),_:1},8,["model-value"])]),_:1})):N("v-if",!0)]),_:1})),[[W,f.value]])]),_:1})}}});export{re as _};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{defineComponent as
|
|
1
|
+
import{defineComponent as Y,ref as v,useModel as Z,computed as _,onMounted as ee,watch as te,resolveComponent as h,openBlock as l,createElementBlock as P,createVNode as ae,withCtx as u,renderSlot as W,createBlock as f,createTextVNode as m,toDisplayString as k,createCommentVNode as d,unref as oe,Fragment as re,mergeModels as q}from"vue";import D from"../../api/workflow/workflowInstApi.js";import ne from"./components/SelectAssigneeDialog.vue.js";import{_ as ie}from"../../../chunks/AddOrMinusMultiDialog.vue_vue_type_script_setup_true_lang-BWVDdb4B.js";import se from"./components/CheckDialog.vue.js";import{runWorkflowComplete as le}from"../../hooks/workflowCompleteRunner.js";import V from"../../utils/FrameworkUtils.js";import{userInfoStore as T}from"../../stores/userInfoStore.js";import{frontendBus as L}from"../../utils/frontendBus.js";import{showTodoDialog as ue}from"../../hooks/workflowTodo.js";import{_ as de}from"../../../chunks/_plugin-vue_export-helper-DlAUqK2U.js";import"../../utils/request.js";import"../../utils/AxiosConfig.js";import"axios";import"../../utils/uuid.js";import"uuid";import"../../utils/encrypt.js";import"jsencrypt";import"../../utils/behaviorTrack.js";import"crypto-js/enc-base64";import"crypto-js/enc-utf8";import"../../utils/behaviorContext.js";import"../../utils/dateTime.js";import"element-plus";import"../../utils/globalLoading.js";import"../../utils/workflowTaskContext.js";import"../../config/GlobalLoadingConfig.js";import"../business/comp.userForm.vue.js";import"@vueuse/core";import"../../api/DeptInfoApi.js";import"../../api/EmployeeInfoApi.js";import"../../hooks/useResetRefHooks.js";import"../../config/vxeSelectColumn.js";import"../../../chunks/ElTagDisplay.vue_vue_type_script_setup_true_lang-DQXuYsW_.js";/* empty css */import"xlsx-js-style";import"../../api/SysUserApi.js";import"../bpmntree/components/UserSelector/UserTag.vue.js";import"../upload/CustomElUpload.vue.js";import"@element-plus/icons-vue";import"../../hooks/useFileView.js";import"../../api/DocumentApi.js";import"../../hooks/useDeleteConfirmHooks.js";import"../../hooks/useBehaviorAction.js";import"../../utils/uploadAccept.js";import"../../utils/buildUploadHeaders.js";import"pinia";import"../../utils/userSessionStorage.js";import"../../hooks/usePermissionHooks.js";import"vue-router";import"../../stores/permissionStore.js";import"../../utils/operationAuth.js";import"../../utils/routeMetaParams.js";import"../../hooks/useOpenNewMenu.js";import"../../utils/commonUtils.js";import"../../utils/tree.js";const fe=Y({__name:"TaskOperation",props:q({taskId:{type:String,required:!1},showProcessBtn:{type:Boolean,required:!1,default:!1},params:{type:Object,required:!1},taskInfo:{type:Object,required:!1},showOperationsBtn:{type:Boolean,required:!1,default:!0},showCurWorkBth:{type:Boolean,required:!1,default:!0},onProcessDetail:{type:Function,required:!1},renderDialog:{type:Function,required:!1}},{butLoading:{type:Boolean,default:!1},butLoadingModifiers:{}}),emits:q(["success"],["update:butLoading"]),setup(o,{expose:E,emit:A}){const N=T(),b=v(null),n=o,i=Z(o,"butLoading"),R=A,e=v({taskId:"",comment:""}),O=n.renderDialog,g=(t,a,r,x,c,X)=>{if(!O){console.warn("[TaskOperation] 未注入 renderDialog,无法打开操作弹窗(请通过 props 传入 useDialogHooks 的 render)");return}O(t,a,r,x,c,X)},U=()=>{typeof n.onProcessDetail=="function"&&n.onProcessDetail(e.value)},w=_(()=>e.value?.operations==="assignee"),S=v(""),y=v(),K=v([{source:"edit"}]),j=async()=>{await ue(v(e.value),K)},p=async t=>{if(t&&(S.value=t),!e.value)return;y.value={...e.value};let a=!1;if(t==="complete"&&n.params?.beforeCompleteFunction)try{const r=await n.params?.beforeCompleteFunction({taskId:e.value.taskId,userId:T().getUserInfo.userCode,comment:"同意。",procInsId:e.value.procInsId,procDefKey:e.value.procDefKey});if(r===!1)return;r?.readonly&&(a=!0),e.value={...e.value,...r}}catch{return}if(t==="addMulti"||t==="minusMulti")g(ie,{taskId:e.value.taskId,dialogType:t,renderDialog:g,onSuccess:I,onWorkflowSuccess:C},{title:t==="addMulti"?"加签":"减签",size:"400px"},"dialog");else if(t==="assignee")M(e.value.taskId);else{if(e.value.variables,t==="complete"&&e.value.firstSubmitNode&&n.params?.ignoreConfirm){await H();return}g(se,{taskVo:e.value,dialogType:t,taskOperate:n?.params,commentReadonly:a,renderDialog:g,onOpenAssignee:M,onSuccess:I,onWorkflowSuccess:C},{title:z(t),size:"480px",closeOnClickModal:!1},"dialog")}},z=t=>{switch(t){case"complete":return"流程审批";case"refuse":return"终止审批";case"back":return"驳回审批";case"transfer":return"转办审批";default:return"流程审批"}},H=async()=>{if(!e.value||!T().getUserInfo.userCode)return;y.value={...e.value};const t={taskId:e.value.taskId,userId:T().getUserInfo.userCode,comment:e.value.comment??"",procInsId:e.value.procInsId,procDefKey:e.value.procDefKey,variables:e.value.variables};try{if(i.value=!0,n.params?.completeFunction){const a=await n.params?.completeFunction(t);a&&a?.taskId?e.value=a:e.value=await D.getTaskInst(e.value.taskId)}else e.value=await D.taskComplete(t)}catch(a){V.messageError(a);return}finally{i.value=!1}try{await F({actionType:"complete",taskVo:e.value,askVo:t})}catch{}},M=t=>{y.value={...e.value},g(ne,{taskId:t,onSuccess:I,onWorkflowSuccess:C},{title:"指定执行人",size:"450px"},"dialog")},I=t=>{t&&(e.value=t),L.emit("todoRefresh"),L.emit("homePageRefresh"),R("success")},F=async(t,a)=>{const r={...t,actionType:t.actionType||S.value,originTask:t.originTask??y.value,taskVo:t.taskVo??e.value};await le(n.params,r),a?.refresh!==!1&&I(t.taskVo)},C=t=>F({...t,originTask:t.originTask??y.value},{refresh:!1}),$=(t,a)=>t?t.classList?.contains(a)?t:$(t.parentElement,a):null,G=()=>{const t=$(b.value,"todo-dialog-class");return t?console.log("找到满足条件的元素:",t):console.log("未找到满足条件的元素"),t};ee(()=>{G(),B()});const s=v(!1),J=async()=>{s.value=!0},Q=()=>{s.value=!1},B=async()=>{if(n.taskInfo)e.value=n.taskInfo,e.value.finishTime&&console.log("该待办已完成!");else if(n.taskId)try{J(),e.value=await D.getTaskInst(n.taskId),e.value.finishTime&&console.log("该待办已完成!")}catch(t){V.messageError(t)}finally{Q()}};return E({reload:()=>{B()}}),te(()=>n.taskId,B),(t,a)=>{const r=h("el-button"),x=h("el-flex");return l(),P("div",{ref_key:"taskFlexRef",ref:b,class:"task-operation"},[ae(x,{align:"center",justify:"flex-end"},{default:u(()=>[W(t.$slots,"left",{},void 0,!0),o.params?.cancelBtnText!==""?(l(),f(r,{key:0,loading:i.value||s.value,onClick:o.params?.cancelFunction},{default:u(()=>[m(k(o.params?.cancelBtnText??"取消"),1)]),_:1},8,["loading","onClick"])):d("v-if",!0),o.showProcessBtn&&e.value?.procInsId?(l(),f(r,{key:1,type:"info",loading:i.value||s.value,onClick:U},{default:u(()=>[...a[7]||(a[7]=[m(" 流程信息 ",-1)])]),_:1},8,["loading"])):d("v-if",!0),!w.value&&e.value?.taskId&&o.showCurWorkBth&&!o.showOperationsBtn?(l(),f(r,{key:2,loading:i.value||s.value,type:"warning",disabled:e.value?.taskId&&(!e.value?.operations||oe(N).getUserInfo.userCode!==e.value?.assigneeId),onClick:j},{default:u(()=>[m(k(e.value.taskName),1)]),_:1},8,["loading","disabled"])):d("v-if",!0),w.value?(l(),f(r,{key:3,type:"primary",loading:i.value||s.value,onClick:a[0]||(a[0]=c=>p("assignee"))},{default:u(()=>[...a[8]||(a[8]=[m("指定执行人 ",-1)])]),_:1},8,["loading"])):d("v-if",!0),!w.value&&e.value?.taskId&&e.value?.operations&&o.showOperationsBtn?(l(),P(re,{key:4},[o.params?.saveBtnText?(l(),f(r,{key:0,loading:i.value||s.value,type:"primary",onClick:o.params?.saveFunction},{default:u(()=>[m(k(o.params?.saveBtnText),1)]),_:1},8,["loading","onClick"])):d("v-if",!0),e.value?.operations.indexOf("addMulti")>-1?(l(),f(r,{key:1,type:"warning",loading:i.value||s.value,onClick:a[1]||(a[1]=c=>p("addMulti"))},{default:u(()=>[...a[9]||(a[9]=[m("加签 ",-1)])]),_:1},8,["loading"])):d("v-if",!0),e.value?.operations.indexOf("minusMulti")>-1?(l(),f(r,{key:2,type:"danger",loading:i.value||s.value,onClick:a[2]||(a[2]=c=>p("minusMulti"))},{default:u(()=>[...a[10]||(a[10]=[m("减签 ",-1)])]),_:1},8,["loading"])):d("v-if",!0),e.value?.operations.indexOf("refuse")>-1&&o.params?.refuseBtnText!==""?(l(),f(r,{key:3,loading:i.value||s.value,type:"danger",onClick:a[3]||(a[3]=c=>p("refuse"))},{default:u(()=>[m(k(o.params?.refuseBtnText??"终止"),1)]),_:1},8,["loading"])):d("v-if",!0),e.value?.operations.indexOf("transfer")>-1&&o.params?.transferBtnText!==""?(l(),f(r,{key:4,loading:i.value||s.value,type:"warning",onClick:a[4]||(a[4]=c=>p("transfer"))},{default:u(()=>[m(k(o.params?.transferBtnText??"转办"),1)]),_:1},8,["loading"])):d("v-if",!0),e.value?.operations.indexOf("back")>-1&&o.params?.backBtnText!==""?(l(),f(r,{key:5,loading:i.value||s.value,type:"danger",onClick:a[5]||(a[5]=c=>p("back"))},{default:u(()=>[m(k(o.params?.backBtnText??"驳回"),1)]),_:1},8,["loading"])):d("v-if",!0),e.value?.operations.indexOf("complete")>-1&&o.params?.completeBtnText!==""?(l(),f(r,{key:6,loading:i.value||s.value,type:"primary",onClick:a[6]||(a[6]=c=>p("complete"))},{default:u(()=>[m(k(o.params?.completeBtnText??"同意"),1)]),_:1},8,["loading"])):d("v-if",!0)],64)):d("v-if",!0),W(t.$slots,"right",{},void 0,!0)]),_:3})],512)}}}),vt=de(fe,[["__scopeId","data-v-50169462"]]);export{vt as default};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{defineComponent as Ie,useModel as Te,ref as E,computed as
|
|
1
|
+
import{defineComponent as Ie,useModel as Te,ref as E,computed as _,resolveComponent as h,resolveDirective as xe,openBlock as n,createElementBlock as r,createCommentVNode as d,withDirectives as be,createVNode as D,createElementVNode as i,createBlock as x,Fragment as p,renderList as b,normalizeClass as J,toDisplayString as u,renderSlot as Ce,resolveDynamicComponent as Ne,mergeProps as De,withCtx as K,normalizeStyle as Ee,createTextVNode as C,unref as X,mergeModels as Z,nextTick as Ke}from"vue";import V from"../../api/workflow/workflowInstApi.js";import Ae from"../../api/DocumentApi.js";import Be from"../../hooks/useFileView.js";import Le from"../../utils/FrameworkUtils.js";import{formatDateTime as Me}from"../../utils/dateTime.js";import{userInfoStore as Se}from"../../stores/userInfoStore.js";import Pe from"./TaskOperation.vue.js";import{_ as $e}from"../../../chunks/_plugin-vue_export-helper-DlAUqK2U.js";import"../../utils/request.js";import"../../utils/AxiosConfig.js";import"axios";import"../../utils/uuid.js";import"uuid";import"../../utils/encrypt.js";import"jsencrypt";import"../../utils/behaviorTrack.js";import"crypto-js/enc-base64";import"crypto-js/enc-utf8";import"../../utils/behaviorContext.js";import"element-plus";import"../../utils/frontendBus.js";import"../../utils/globalLoading.js";import"../../utils/workflowTaskContext.js";import"../../config/GlobalLoadingConfig.js";import"xlsx-js-style";import"pinia";import"../../utils/userSessionStorage.js";import"./components/SelectAssigneeDialog.vue.js";import"../../../chunks/AddOrMinusMultiDialog.vue_vue_type_script_setup_true_lang-BWVDdb4B.js";import"../business/comp.userForm.vue.js";import"@vueuse/core";import"../../api/DeptInfoApi.js";import"../../api/EmployeeInfoApi.js";import"../../hooks/useResetRefHooks.js";import"../../config/vxeSelectColumn.js";import"../../../chunks/ElTagDisplay.vue_vue_type_script_setup_true_lang-DQXuYsW_.js";/* empty css */import"../../api/SysUserApi.js";import"./components/CheckDialog.vue.js";import"../bpmntree/components/UserSelector/UserTag.vue.js";import"../upload/CustomElUpload.vue.js";import"@element-plus/icons-vue";import"../../hooks/useDeleteConfirmHooks.js";import"../../hooks/useBehaviorAction.js";import"../../utils/uploadAccept.js";import"../../utils/buildUploadHeaders.js";import"../../hooks/workflowCompleteRunner.js";import"../../hooks/workflowTodo.js";import"../../hooks/usePermissionHooks.js";import"vue-router";import"../../stores/permissionStore.js";import"../../utils/operationAuth.js";import"../../utils/routeMetaParams.js";import"../../hooks/useOpenNewMenu.js";import"../../utils/commonUtils.js";import"../../utils/tree.js";const Ve={class:"workflow-todo-shell"},je={class:"workflow-todo-shell__body dialog-content-fill"},Fe={key:1,class:"wf-progress-scroll"},Oe={class:"wf-progress-steps"},Ue={class:"wf-progress-step__icon-wrap"},ze={class:"wf-progress-step__icon"},Re={key:0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"3","stroke-linecap":"round","stroke-linejoin":"round"},Qe={key:4},Ge={class:"wf-progress-step__name"},We={class:"wf-progress-step__name-text"},Ye={class:"wf-progress-step__name-label"},qe={key:0,class:"wf-progress-step__occurrence"},He={key:0,class:"workflow-todo-shell__record-occurrence"},Je={key:1,class:"workflow-todo-shell__record-type"},Xe={key:0,class:"workflow-todo-shell__record-user"},Ze={class:"workflow-todo-shell__record-person__name"},et={key:0,class:"workflow-todo-shell__comment"},tt={key:0,class:"workflow-todo-shell__record-files"},st=["onClick"],ot={class:"workflow-todo-shell__record-person__name"},nt={key:0,class:"workflow-todo-shell__comment"},at={key:1,class:"workflow-todo-shell__record-files"},rt=["onClick"],lt={class:"workflow-todo-shell__record-person__name"},it={key:0,class:"workflow-todo-shell__footer"},ee="__end__",ct=Ie({__name:"WorkflowTodoShell",props:Z({taskId:{},taskInfo:{default:void 0},readonly:{type:Boolean,default:!1},contentComponent:{default:void 0},contentProps:{default:()=>({})},renderDialog:{type:Function,default:void 0},showFooter:{type:Boolean,default:!0}},{loading:{type:Boolean,default:!1},loadingModifiers:{}}),emits:Z(["cancel","success"],["update:loading"]),setup(w,{expose:te,emit:se}){const f=w,A=se,g=Te(w,"loading"),v=E(),m=E(),B=E(),L=E(!1),oe=e=>[...e].sort((t,o)=>(t.createTime||"").localeCompare(o.createTime||"")),j=_(()=>oe([...m.value?.hisTasks||[],...m.value?.activeTasks||[]])),M=E({}),F=Be().fileView,O=e=>{const t=(e.split(".").pop()||"").toLowerCase();return".jpg,.jpeg,.png,.gif,.bmp".includes(t)?"adtec-image":t==="pdf"?"adtec-pdf":t==="doc"||t==="docx"?"adtec-word":t==="xls"||t==="xlsx"?"adtec-excel":t==="ppt"||t==="pptx"?"adtec-ppt":"adtec-text"},N=e=>e?M.value[e]||[]:[],ne=async()=>{var t;const e=Array.from(new Set(j.value.map(o=>o.taskId).filter(o=>!!o)));if(e.length)try{const o=await Ae.getUpLoadFilesByBussinessIds(e),a={};for(const l of o)l.businessId&&(a[t=l.businessId]||(a[t]=[])).push(l);M.value=a}catch{M.value={}}},S=_(()=>{const e=new Map;for(const t of j.value){const o=q(t),a=e.get(o);a?a.tasks.push(t):e.set(o,{taskName:t.taskName,taskDefKey:t.taskDefKey,parentExecutionId:t.parentExecutionId,tasks:[t],approvalType:t.approvalType})}return Array.from(e.values())}),U=_(()=>v.value?.procEndTime?!0:!!(m.value&&!(m.value.activeTasks||[]).length&&(m.value.hisTasks||[]).length)),ae=_(()=>{const e=[...S.value],t=new Set(e.map(a=>z(a)));for(const a of m.value?.futureTasks||[]){const l=`${a.taskDefKey||a.taskName}-`;t.has(l)||e.push({taskName:a.taskName,taskDefKey:a.taskDefKey,tasks:[],assigneeNames:a.assigneeNames,approvalType:a.approvalType})}e.push({taskName:"结束",taskDefKey:ee,tasks:[],isEnd:!0});const o=new Map;for(const a of e){const l=a.taskDefKey||a.taskName||"";l&&(a.occurrence=(o.get(l)||0)+1,o.set(l,a.occurrence))}return e}),z=e=>`${e.taskDefKey||e.taskName}-${e.parentExecutionId||""}`,re={single:"或签",joint:"会签",all:"会签"},R=e=>re[e.approvalType||e.tasks[0]?.approvalType||""]||"",le=e=>(e.approvalType||e.tasks[0]?.approvalType||"")==="single",Q=e=>{const t=(e.assigneeNames||"").split(",").map(o=>o.trim()).filter(Boolean);return t.length?t:["待处理"]},ie={1:{label:"同意",type:"success"},2:{label:"驳回",type:"warning"},3:{label:"终止",type:"danger"},4:{label:"委派",type:"warning"},5:{label:"转办",type:"warning"},6:{label:"终止",type:"danger"},7:{label:"撤回",type:"info"},8:{label:"催办",type:"info"}},ce=e=>Me(e.finishTime||e.createTime),de={success:"var(--el-color-success)",warning:"var(--el-color-warning)",danger:"var(--el-color-danger)",primary:"var(--el-color-primary)"},pe=e=>de[e]||"",I=e=>{if(e.isEnd)return U.value?{label:"已结束",type:"success",hollow:!1}:{label:"等待",type:"info",hollow:!1};if(!e.tasks.length)return{label:"等待",type:"info",hollow:!1};const t=e.tasks;if(t.some(l=>!l.finishTime))return{label:"进行中",type:"primary",hollow:!1};let o="已办",a="success";if(t.some(l=>l.taskLocalVars?.firstTask))o="提交";else{const l=[...t].sort((k,$)=>($.finishTime||"").localeCompare(k.finishTime||""))[0]?.commentList?.[0],T=ie[l?.type||""];o=T?.label||"已办",a=T?.type||"success"}return{label:o,type:a,hollow:!1}},G=e=>{const t=e.assigneeName||e.startUserName||"待处理";return e.finishTime?`${t} · ${ce(e)}`:t},ue=e=>e.tasks.length?e.tasks.map(G).join(" / "):Q(e).join(" / "),P=e=>e.tasks.map(t=>t.comment).filter(Boolean).join(" / "),W=_(()=>{const e=new Map,t=[];for(const o of S.value){const a=o.taskDefKey||o.taskName||"";if(!a)continue;const l=o.tasks.some(k=>!k.finishTime)?"process":I(o).type,T=e.get(a);if(T!==void 0){const k=t[T];k.occurrence=(k.occurrence||1)+1,k.parentExecutionId=o.parentExecutionId,k.status=l;continue}e.set(a,t.length),t.push({taskName:o.taskName,taskDefKey:o.taskDefKey,parentExecutionId:o.parentExecutionId,status:l,occurrence:1})}for(const o of m.value?.futureTasks||[]){const a=o.taskDefKey||o.taskName||"";if(!a)continue;const l=e.get(a);if(l!==void 0){t[l].status="wait";continue}e.set(a,t.length),t.push({taskName:o.taskName,taskDefKey:o.taskDefKey,status:"wait"})}return t.push({taskName:"结束",taskDefKey:ee,status:U.value?"success":"wait"}),t}),Y=e=>{const t=Se().getUserInfo.userCode;return!t||!e?!1:!!(e.assigneeId===t||e.candidate&&e.candidate.split(",").map(a=>a.trim()).filter(Boolean).includes(t))},fe=_(()=>Y(v.value)?!0:(m.value?.activeTasks||[]).some(e=>Y(e))),me=_(()=>f.readonly||!!v.value?.finishTime||!!v.value?.procEndTime||L.value&&!(m.value?.activeTasks||[]).length||!fe.value),ke=_(()=>B.value?.taskOption),ve=_(()=>{const e=ke.value;return{...e||{},cancelFunction:(...t)=>{e?.cancelFunction?.(...t),A("cancel")},workflowComplete:async(...t)=>{await e?.workflowComplete?.(...t)}}}),q=e=>`${e.taskDefKey||e.taskName}-${e.parentExecutionId||""}`,H=async(e,t=!1)=>{const o=f.taskInfo&&f.taskInfo.procInsId==null&&f.taskInfo.processInstanceId!=null?{...f.taskInfo,procInsId:f.taskInfo.processInstanceId}:f.taskInfo;if(!(!f.taskId&&!o?.procInsId))try{g.value=!0,L.value=!1,v.value=e?{...v.value,...e}:t&&f.taskId?await V.getTaskInst(f.taskId):o||await V.getTaskInst(f.taskId),v.value?.procInsId&&(m.value=await V.getProcessTaskList(v.value.procInsId)),L.value=!0,await ne(),await Ke(),await B.value?.resetQuery?.()}catch(a){Le.messageError(a)}finally{g.value=!1}},ye=async e=>{A("success",e),await H(e,!0)};return te({resetQuery:async()=>{await H()}}),(e,t)=>{const o=h("el-title"),a=h("el-empty"),l=h("el-tag-display"),T=h("el-flex"),k=h("el-icons"),$=h("el-timeline-item"),_e=h("el-timeline"),we=h("el-button"),he=xe("loading");return n(),r("div",Ve,[d(`
|
|
2
2
|
内容区撑满剩余空间统一使用 dialog-content-fill(flex/height 由核心工具类提供),
|
|
3
3
|
滚动仅保留在本内容区,底部操作栏固定不随内容滚动。
|
|
4
|
-
`),
|
|
4
|
+
`),be((n(),r("div",je,[D(o,{level:"1",title:"流程进度",style:{"border-bottom":"var(--border)"}}),i("div",null,[W.value.length?(n(),r("div",Fe,[i("div",Oe,[(n(!0),r(p,null,b(W.value,(s,c)=>(n(),r("div",{key:q(s),class:J(["wf-progress-step",{done:s.status==="success",current:s.status==="process",rejected:s.status==="warning",stopped:s.status==="error"||s.status==="danger"}])},[i("div",Ue,[i("div",ze,[d(" 同意/提交:对勾 "),s.status==="success"?(n(),r("svg",Re,[...t[3]||(t[3]=[i("path",{d:"M20 6L9 17l-5-5"},null,-1)])])):s.status==="warning"?(n(),r(p,{key:1},[d(" 驳回:回退箭头 "),t[4]||(t[4]=i("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[i("path",{d:"M10 9V5l-7 7 7 7v-4.1c5 0 8.5 1.6 11 5.1-1-5-4-10-11-11z"})],-1))],2112)):s.status==="danger"||s.status==="error"?(n(),r(p,{key:2},[d(" 终止:叉 "),t[5]||(t[5]=i("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"3","stroke-linecap":"round","stroke-linejoin":"round"},[i("path",{d:"M18 6L6 18"}),i("path",{d:"M6 6l12 12"})],-1))],2112)):s.status==="info"?(n(),r(p,{key:3},[d(" 撤回:撤销箭头 "),t[6]||(t[6]=i("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[i("path",{d:"M12.5 8c-2.65 0-5.05.99-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z"})],-1))],2112)):(n(),r("span",Qe,u(c+1),1))])]),i("div",Ge,[i("span",We,[i("span",Ye,u(s.taskName||"未命名节点"),1),s.occurrence&&s.occurrence>1?(n(),r("sup",qe,u(s.occurrence),1)):d("v-if",!0)])])],2))),128))])])):(n(),x(a,{key:0,description:"暂无流程进度","image-size":48}))]),d(`
|
|
5
5
|
业务审核内容:完全由业务内容组件/插槽决定(含它自己的标题、分区、网格),
|
|
6
6
|
通用抽屉不再注入任何标题,业务页面给什么就展示什么。
|
|
7
|
-
`),
|
|
7
|
+
`),Ce(e.$slots,"content",{task:v.value,process:m.value},()=>[w.contentComponent?(n(),x(Ne(w.contentComponent),De({key:0,ref_key:"contentRef",ref:B},w.contentProps,{loading:g.value,"onUpdate:loading":t[0]||(t[0]=s=>g.value=s)}),null,16,["loading"])):d("v-if",!0)],!0),D(o,{level:"1",title:"审批记录",style:{"border-bottom":"var(--border)"}}),i("div",null,[S.value.length?(n(),x(_e,{key:1,class:"workflow-todo-shell__timeline"},{default:K(()=>[(n(!0),r(p,null,b(ae.value,s=>(n(),x($,{key:z(s),type:I(s).type,hollow:I(s).hollow,style:Ee({"--el-timeline-node-color":pe(I(s).type)})},{default:K(()=>[D(T,{align:"center",justify:"space-between",class:J(["workflow-todo-shell__record-title",`is-${I(s).type}`])},{default:K(()=>[i("span",null,[C(u(s.taskName||"未命名节点")+" ",1),(s.occurrence||0)>1?(n(),r("span",He,u(s.occurrence),1)):d("v-if",!0),R(s)?(n(),r("span",Je,u(R(s)),1)):d("v-if",!0)]),D(l,{type:I(s).type,size:"small"},{default:K(()=>[C(u(I(s).label),1)]),_:2},1032,["type"])]),_:2},1032,["class"]),le(s)?(n(),r("div",Xe,[i("span",Ze,u(ue(s)),1),P(s)||s.tasks.some(c=>N(c.taskId).length)?(n(),r("div",et,[P(s)?(n(),r(p,{key:0},[C(u(P(s)),1)],64)):d("v-if",!0),(n(!0),r(p,null,b(s.tasks,c=>(n(),r(p,{key:c.taskId},[N(c.taskId).length?(n(),r("div",tt,[(n(!0),r(p,null,b(N(c.taskId),y=>(n(),r("span",{key:y.id,class:"workflow-todo-shell__record-file",onClick:ge=>X(F)(y.id)},[D(k,{"model-value":O(y.name)},null,8,["model-value"]),C(u(y.name),1)],8,st))),128))])):d("v-if",!0)],64))),128))])):d("v-if",!0)])):s.tasks.length?(n(!0),r(p,{key:1},b(s.tasks,c=>(n(),r("div",{key:c.taskId,class:"workflow-todo-shell__record-user"},[i("span",ot,u(G(c)),1),c.comment||N(c.taskId).length?(n(),r("div",nt,[c.comment?(n(),r(p,{key:0},[C(u(c.comment),1)],64)):d("v-if",!0),N(c.taskId).length?(n(),r("div",at,[(n(!0),r(p,null,b(N(c.taskId),y=>(n(),r("span",{key:y.id,class:"workflow-todo-shell__record-file",onClick:ge=>X(F)(y.id)},[D(k,{"model-value":O(y.name)},null,8,["model-value"]),C(u(y.name),1)],8,rt))),128))])):d("v-if",!0)])):d("v-if",!0)]))),128)):s.isEnd?d("v-if",!0):(n(),r(p,{key:2},[d(" 结束节点只有节点名与状态,不展示审签人 "),(n(!0),r(p,null,b(Q(s),c=>(n(),r("div",{key:c,class:"workflow-todo-shell__record-user"},[i("span",lt,u(c),1)]))),128))],64))]),_:2},1032,["type","hollow","style"]))),128))]),_:1})):(n(),x(a,{key:0,description:"暂无审批记录","image-size":48}))])])),[[he,g.value]]),w.showFooter?(n(),r("div",it,[me.value?(n(),x(we,{key:0,onClick:t[1]||(t[1]=s=>A("cancel"))},{default:K(()=>[...t[7]||(t[7]=[C("取消",-1)])]),_:1})):(n(),x(Pe,{key:1,"task-id":w.taskId,params:ve.value,"render-dialog":w.renderDialog,"show-process-btn":!1,"but-loading":g.value,"onUpdate:butLoading":t[2]||(t[2]=s=>g.value=s),onSuccess:ye},null,8,["task-id","params","render-dialog","but-loading"]))])):d("v-if",!0)])}}}),ms=$e(ct,[["__scopeId","data-v-2a1c2021"]]);export{ms as default};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { WorkflowCompleteContext } from "../../../hooks/workflowCompleteRunner";
|
|
1
2
|
type __VLS_Props = {
|
|
2
3
|
/** 任务 id */
|
|
3
4
|
taskId?: string;
|
|
@@ -8,6 +9,12 @@ type __VLS_Props = {
|
|
|
8
9
|
* 便于核心包组件脱离具体工程独立使用。
|
|
9
10
|
*/
|
|
10
11
|
renderDialog?: (...args: any[]) => any;
|
|
12
|
+
/**
|
|
13
|
+
* 引擎动作成功后的业务同步回调(由 TaskOperation 注入):
|
|
14
|
+
* 统一组件会 await 它,失败时抛出——本弹窗因此不会 emit success、不会被关闭,
|
|
15
|
+
* 错误提示与撤回由核心包统一处理。未注入时保持原行为(仅 emit success)。
|
|
16
|
+
*/
|
|
17
|
+
onWorkflowSuccess?: (ctx: WorkflowCompleteContext) => Promise<void> | void;
|
|
11
18
|
};
|
|
12
19
|
type __VLS_PublicProps = __VLS_Props & {
|
|
13
20
|
"loading"?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as o}from"../../../../chunks/AddOrMinusMultiDialog.vue_vue_type_script_setup_true_lang-
|
|
1
|
+
import{_ as o}from"../../../../chunks/AddOrMinusMultiDialog.vue_vue_type_script_setup_true_lang-BWVDdb4B.js";import"vue";import"../../../api/workflow/workflowInstApi.js";import"../../../utils/request.js";import"../../../utils/AxiosConfig.js";import"axios";import"../../../utils/uuid.js";import"uuid";import"../../../utils/encrypt.js";import"jsencrypt";import"../../../utils/behaviorTrack.js";import"crypto-js/enc-base64";import"crypto-js/enc-utf8";import"../../../utils/behaviorContext.js";import"../../../utils/dateTime.js";import"element-plus";import"../../../utils/frontendBus.js";import"../../../utils/globalLoading.js";import"../../../utils/workflowTaskContext.js";import"../../../config/GlobalLoadingConfig.js";import"../../../stores/userInfoStore.js";import"pinia";import"../../../utils/userSessionStorage.js";import"../../business/comp.userForm.vue.js";import"@vueuse/core";import"../../../api/DeptInfoApi.js";import"../../../api/EmployeeInfoApi.js";import"../../../hooks/useResetRefHooks.js";import"../../../utils/FrameworkUtils.js";import"xlsx-js-style";import"../../../config/vxeSelectColumn.js";import"../../../../chunks/ElTagDisplay.vue_vue_type_script_setup_true_lang-DQXuYsW_.js";/* empty css */import"../../../../chunks/_plugin-vue_export-helper-DlAUqK2U.js";import"../../../api/SysUserApi.js";export{o as default};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { IWfTaskVo } from "../../../interface/workflow/IWfTaskVo";
|
|
2
2
|
import type { ITaskOperate } from "../../../hooks/userWorkflowHooks";
|
|
3
|
+
import type { WorkflowCompleteContext } from "../../../hooks/workflowCompleteRunner";
|
|
3
4
|
type __VLS_Props = {
|
|
4
5
|
/** 任务对象(useDialogHooks 打开时传入) */
|
|
5
6
|
taskVo?: IWfTaskVo;
|
|
@@ -14,6 +15,12 @@ type __VLS_Props = {
|
|
|
14
15
|
* 便于核心包组件脱离具体工程独立使用。
|
|
15
16
|
*/
|
|
16
17
|
renderDialog?: (...args: any[]) => any;
|
|
18
|
+
/**
|
|
19
|
+
* 引擎动作成功后的业务同步回调(由 TaskOperation 注入):
|
|
20
|
+
* 统一组件会 await 它,失败时抛出——本弹窗因此不会 emit success、不会被关闭,
|
|
21
|
+
* 错误提示与撤回由核心包统一处理。未注入时保持原行为(仅 emit success)。
|
|
22
|
+
*/
|
|
23
|
+
onWorkflowSuccess?: (ctx: WorkflowCompleteContext) => Promise<void> | void;
|
|
17
24
|
};
|
|
18
25
|
type __VLS_PublicProps = __VLS_Props & {
|
|
19
26
|
"loading"?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{defineComponent as
|
|
1
|
+
import{defineComponent as ae,useModel as le,ref as y,computed as F,resolveComponent as d,resolveDirective as re,withDirectives as oe,openBlock as n,createBlock as f,withCtx as s,createVNode as i,createCommentVNode as D,createElementBlock as N,Fragment as T,renderList as A,normalizeClass as se,createElementVNode as M,toDisplayString as R,mergeModels as j}from"vue";import ne from"../../bpmntree/components/UserSelector/UserTag.vue.js";import p from"../../../api/workflow/workflowInstApi.js";import{ElMessage as c}from"element-plus";import ie from"../../business/comp.userForm.vue.js";import ue from"../../upload/CustomElUpload.vue.js";import{userInfoStore as w}from"../../../stores/userInfoStore.js";import L from"../../../api/DocumentApi.js";import x from"../../../utils/FrameworkUtils.js";import ce from"../../../api/SysUserApi.js";import{_ as me}from"../../../../chunks/_plugin-vue_export-helper-DlAUqK2U.js";import"../../../utils/request.js";import"../../../utils/AxiosConfig.js";import"axios";import"../../../utils/uuid.js";import"uuid";import"../../../utils/encrypt.js";import"jsencrypt";import"../../../utils/behaviorTrack.js";import"crypto-js/enc-base64";import"crypto-js/enc-utf8";import"../../../utils/behaviorContext.js";import"../../../utils/dateTime.js";import"../../../utils/frontendBus.js";import"../../../utils/globalLoading.js";import"../../../utils/workflowTaskContext.js";import"../../../config/GlobalLoadingConfig.js";import"@vueuse/core";import"../../../api/DeptInfoApi.js";import"../../../api/EmployeeInfoApi.js";import"../../../hooks/useResetRefHooks.js";import"../../../config/vxeSelectColumn.js";import"../../../../chunks/ElTagDisplay.vue_vue_type_script_setup_true_lang-DQXuYsW_.js";/* empty css */import"xlsx-js-style";import"@element-plus/icons-vue";import"../../../hooks/useFileView.js";import"../../../hooks/useDeleteConfirmHooks.js";import"../../../hooks/useBehaviorAction.js";import"../../../utils/uploadAccept.js";import"../../../utils/buildUploadHeaders.js";import"pinia";import"../../../utils/userSessionStorage.js";const de={style:{"font-size":"16px"}},pe=ae({__name:"CheckDialog",props:j({taskVo:{},dialogType:{},taskOperate:{},commentReadonly:{type:Boolean},renderDialog:{type:Function},onWorkflowSuccess:{type:Function}},{loading:{type:Boolean,default:!1},loadingModifiers:{}}),emits:j(["success","openAssignee"],["update:loading"]),setup(O,{expose:z,emit:P}){const o=O,B=P,h=le(O,"loading"),b=y(""),r=F(()=>o.dialogType??""),e=y({taskId:"",comment:""}),I=y([]),m=y({}),v=y([]),k=y(""),E=y(!1),K=F(()=>e.value?.variables?.persons?.length>0),W=async()=>{const t=o.taskVo;if(t){E.value=!!o.commentReadonly,h.value=!0,e.value={...t},e.value.comment=t.comment??"";try{I.value=await L.getBusinessDocuments("workflow",t.taskId)}catch(a){c.error(a.msg),I.value=[]}if(r.value==="complete")b.value="审批意见",e.value.comment=e.value.comment?e.value.comment:"同意。";else if(r.value==="refuse")b.value="终止原因";else if(r.value==="back"){b.value="驳回原因",k.value="",v.value=[];try{v.value=await p.findReturnTaskList(e.value.taskId),v.value.length==1&&(k.value=v.value[0].taskKey)}catch(a){v.value=[],x.messageError(a)}}else r.value==="transfer"&&(b.value="转办原因",e.value.comment="",m.value={});h.value=!1}},Q=F(()=>{const t=w().getUserInfo,a=t?.topDeptId||t?.mdmDeptId;return a?[a]:[]}),S=o.renderDialog,H=(t,a,u,g,V,_)=>{if(!S){console.warn("[CheckDialog] 未注入 renderDialog,无法打开选人弹窗(请通过 props 传入 useDialogHooks 的 render)");return}S(t,a,u,g,V,_)},q=()=>{H(ie,{multiple:!1,selectedUserCodes:m.value.loginName?[m.value.loginName]:[],defalutQueryParam:{deptIds:Q.value},onSuccess:t=>{const u=(Array.isArray(t)?t:t?[t]:[])[0];u?.code&&(m.value={id:u.id,userName:u.name,loginName:u.code},$(u.code))}},{title:"选择转办人",width:"900px",top:"8vh",style:{height:"72vh"}},"dialog")},$=async t=>{try{await ce.addNBUserInfo([t])}catch(a){m.value={},x.messageError(a)}},G=w().getUserInfo.userCode,C=async t=>{await o.onWorkflowSuccess?.({actionType:r.value,taskVo:e.value,askVo:t})};return z({resetQuery:W,confirm:async()=>{if(!(!e.value||!G))try{if(h.value=!0,I.value.length>0){const t=I.value.map(a=>a.id);if(t.length>0)try{await L.fileStatusConfirmation(t)}catch(a){x.messageError(a);return}}if(r.value==="complete"){if(!e.value.comment){c.warning("请填写审批意见!");return}if(K.value&&!e.value.variables.nextChecker?.length){c.warning("请选择下一步审核人!");return}const t={taskId:e.value.taskId,userId:w().getUserInfo.userCode,comment:e.value.comment,procInsId:e.value.procInsId,procDefKey:e.value.procDefKey,variables:e.value.variables};if(o.taskOperate?.completeFunction){const a=await o.taskOperate.completeFunction(t);a&&a?.taskId?e.value=a:e.value=await p.getTaskInst(e.value.taskId)}else e.value=await p.taskComplete(t);if(await C(t),e.value.operations&&e.value.operations?.indexOf("assignee")>-1){B("openAssignee",e.value.taskId);return}}else if(r.value==="refuse"){if(!e.value.comment){c.warning("请填写终止原因!");return}const t={taskId:e.value.taskId,userId:w().getUserInfo.userCode,comment:e.value.comment,stopWorkflow:!0};o.taskOperate?.refuseFunction?(await o.taskOperate.refuseFunction(t),e.value=await p.getTaskInst(e.value.taskId)):e.value=await p.taskReject(t),await C(t),c.success("中止成功")}else if(r.value==="back"){if(!e.value.comment){c.warning("请填写驳回原因!");return}if(!k.value){c.warning("请指定回退节点!");return}const t={taskId:e.value.taskId,userId:w().getUserInfo.userCode,comment:e.value.comment,targetKey:k.value,isFirstActivity:v.value.find(a=>a.taskKey===k.value)?.isFirstActivity};o.taskOperate?.backFunction?(await o.taskOperate.backFunction(t),e.value=await p.getTaskInst(e.value.taskId)):e.value=await p.taskReturn(t),await C(t),c.success("回退成功")}else if(r.value==="transfer"){if(!e.value.comment){c.warning("请填写转办原因!");return}if(!m.value.loginName){c.warning("请选择转办人!");return}const t={taskId:e.value.taskId,userId:w().getUserInfo.userCode,comment:w().getUserInfo.userName+"-》"+m.value.userName+":"+e.value.comment,assignee:m.value.loginName};o.taskOperate?.transferFunction?(await o.taskOperate.transferFunction(t),e.value=await p.getTaskInst(e.value.taskId)):e.value=await p.taskTransfer(t),await C(t)}B("success",e.value)}catch(t){throw x.messageError(t),t}finally{h.value=!1}}}),(t,a)=>{const u=d("el-input"),g=d("el-form-item"),V=d("el-icons"),_=d("el-flex"),J=d("el-space"),X=d("el-card"),Y=d("el-option"),Z=d("el-select"),ee=d("el-form"),te=re("loading");return oe((n(),f(_,{vertical:!0,justify:"center",height:"100%"},{default:s(()=>[i(ee,{"label-width":"80px",style:{width:"100%"}},{default:s(()=>[i(g,{label:b.value,required:r.value!=="complete"},{default:s(()=>[i(u,{readonly:E.value,disabled:e.value?.finishTime,modelValue:e.value.comment,"onUpdate:modelValue":a[0]||(a[0]=l=>e.value.comment=l),style:{width:"100%"},maxlength:255,rows:3,resize:!1,type:"textarea",placeholder:"请填入意见"},null,8,["readonly","disabled","modelValue"])]),_:1},8,["label","required"]),r.value==="transfer"?(n(),f(g,{key:0,required:r.value==="transfer",label:"转办人"},{default:s(()=>[i(u,{"model-value":m.value.userName,readonly:"",placeholder:"请选择转办人",onClick:q},{append:s(()=>[i(V,{"model-value":"adtec-adduser",tip:"选择转办人",style:{cursor:"pointer"},onClick:q})]),_:1},8,["model-value"])]),_:1},8,["required"])):D("v-if",!0),r.value==="back"&&v.value.length>1?(n(),f(g,{key:1,label:"回退节点",required:!0},{default:s(()=>[i(_,{vertical:!0,justify:"space-around"},{default:s(()=>[(n(!0),N(T,null,A(v.value,l=>(n(),f(X,{shadow:"never",style:{width:"100%","margin-bottom":"10px"},class:se(l.taskKey==k.value?"selected-card":""),key:l.taskKey,onClick:U=>k.value=l.taskKey??""},{default:s(()=>[i(_,{justify:"space-between"},{default:s(()=>[M("span",de,R(l.taskName),1),M("span",null,"完成于:"+R(l.endTime),1)]),_:2},1024),i(_,null,{default:s(()=>[i(J,null,{default:s(()=>[(n(!0),N(T,null,A(l.users,U=>(n(),f(ne,{type:"primary",closable:!1,key:U.id,"user-id":U.id,username:U.userName},null,8,["user-id","username"]))),128))]),_:2},1024)]),_:2},1024)]),_:2},1032,["class","onClick"]))),128))]),_:1})]),_:1})):D("v-if",!0),K.value?(n(),f(g,{key:2,label:"下一步审核人",required:""},{default:s(()=>[i(Z,{modelValue:e.value.variables.nextChecker,"onUpdate:modelValue":a[1]||(a[1]=l=>e.value.variables.nextChecker=l),disabled:e.value.variables.persons?.length===1,multiple:"",placeholder:"请选择下一步审核人"},{default:s(()=>[(n(!0),N(T,null,A(e.value.variables.persons,l=>(n(),f(Y,{key:l.code,label:l.name,value:l.code},null,8,["label","value"]))),128))]),_:1},8,["modelValue","disabled"])]),_:1})):D("v-if",!0),r.value!=="transfer"?(n(),f(g,{key:3,label:"附件",style:{"margin-bottom":"0"}})):D("v-if",!0)]),_:1}),i(ue,{limit:5,style:{width:"100%"},"is-edit":!0,"business-id":e.value.taskId,business:"workflow","upload-files-list":I.value,"onUpdate:uploadFilesList":a[2]||(a[2]=l=>I.value=l)},null,8,["business-id","upload-files-list"])]),_:1})),[[te,h.value]])}}}),rt=me(pe,[["__scopeId","data-v-fd5ebf4a"]]);export{rt as default};
|
|
@@ -1,6 +1,13 @@
|
|
|
1
|
+
import type { WorkflowCompleteContext } from "../../../hooks/workflowCompleteRunner";
|
|
1
2
|
type __VLS_Props = {
|
|
2
3
|
/** 任务 id(useDialogHooks 打开时传入) */
|
|
3
4
|
taskId?: string;
|
|
5
|
+
/**
|
|
6
|
+
* 引擎动作成功后的业务同步回调(由 TaskOperation 注入):
|
|
7
|
+
* 统一组件会 await 它,失败时抛出——本弹窗因此不会 emit success、不会被关闭,
|
|
8
|
+
* 错误提示与撤回由核心包统一处理。未注入时保持原行为(仅 emit success)。
|
|
9
|
+
*/
|
|
10
|
+
onWorkflowSuccess?: (ctx: WorkflowCompleteContext) => Promise<void> | void;
|
|
4
11
|
};
|
|
5
12
|
type __VLS_PublicProps = __VLS_Props & {
|
|
6
13
|
"loading"?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{defineComponent as
|
|
1
|
+
import{defineComponent as B,ref as M,useModel as L,resolveComponent as r,resolveDirective as F,withDirectives as Q,openBlock as o,createBlock as i,withCtx as s,createElementBlock as f,Fragment as g,renderList as _,createVNode as v,createElementVNode as T,toDisplayString as k,createCommentVNode as h,mergeModels as y}from"vue";import w from"../../../api/workflow/workflowInstApi.js";import{ElMessage as m}from"element-plus";import x from"../../../utils/FrameworkUtils.js";import{_ as W}from"../../../../chunks/_plugin-vue_export-helper-DlAUqK2U.js";import"../../../utils/request.js";import"../../../utils/AxiosConfig.js";import"axios";import"../../../utils/uuid.js";import"uuid";import"../../../utils/encrypt.js";import"jsencrypt";import"../../../utils/behaviorTrack.js";import"crypto-js/enc-base64";import"crypto-js/enc-utf8";import"../../../utils/behaviorContext.js";import"../../../utils/dateTime.js";import"../../../utils/frontendBus.js";import"../../../utils/globalLoading.js";import"../../../utils/workflowTaskContext.js";import"../../../config/GlobalLoadingConfig.js";import"xlsx-js-style";const q=B({__name:"SelectAssigneeDialog",props:y({taskId:{},onWorkflowSuccess:{type:Function}},{loading:{type:Boolean,default:!1},loadingModifiers:{}}),emits:y(["success"],["update:loading"]),setup(u,{expose:b,emit:N}){const c=u,V=N,l=M([]),a=L(u,"loading");return b({resetQuery:async()=>{if(c.taskId)try{l.value=[{assignee:[]}],a.value=!0;const e=await w.getTaskCandidateList(c.taskId);if(e?.length>0){for(let p of e)p.assignee=[];l.value=e}else m.warning("无候选人数据")}catch(e){x.messageError(e)}finally{a.value=!1}},confirm:async()=>{for(let e of l.value)if(e.candidate?.length==0||e.assignee.length==0){m.warning("请指定执行人!");return}try{a.value=!0,await w.setAssigneeList(l.value),await c.onWorkflowSuccess?.({actionType:"assignee"}),m.success("操作成功"),V("success","")}catch(e){throw x.messageError(e),e}finally{a.value=!1}}}),(e,p)=>{const d=r("el-form-item"),C=r("el-checkbox"),D=r("el-checkbox-group"),E=r("el-divider"),I=r("el-form"),S=r("el-flex"),U=F("loading");return Q((o(),i(S,{vertical:!0,height:"100%"},{default:s(()=>[(o(!0),f(g,null,_(l.value,(t,A)=>(o(),i(I,{labelPosition:"top",size:"default",style:{width:"100%"}},{default:s(()=>[v(d,{label:"任务名"},{default:s(()=>[T("span",null,k(t?.taskName)+"("+k(t?.procName)+")",1)]),_:2},1024),v(d,{label:"候选人",required:!0},{default:s(()=>[t?.candidate&&t?.candidate.length>0?(o(),i(D,{key:0,modelValue:t.assignee,"onUpdate:modelValue":n=>t.assignee=n},{default:s(()=>[(o(!0),f(g,null,_(t?.candidate,n=>(o(),i(C,{style:{width:"80px"},key:n.loginName,label:n.userName,value:n.loginName},null,8,["label","value"]))),128))]),_:2},1032,["modelValue","onUpdate:modelValue"])):h("v-if",!0)]),_:2},1024),A!=l.value?.length-1?(o(),i(E,{key:0})):h("v-if",!0)]),_:2},1024))),256))]),_:1})),[[U,a.value]])}}}),ue=W(q,[["__scopeId","data-v-25a3c4bf"]]);export{ue as default};
|
|
@@ -6,9 +6,10 @@
|
|
|
6
6
|
* columns: [ checkboxColumn, ...其它列 ] // 多选
|
|
7
7
|
* columns: [ radioColumn, ...其它列 ] // 单选
|
|
8
8
|
*
|
|
9
|
-
*
|
|
9
|
+
* 需要扩展时只覆盖页面级属性(如左侧固定、字段名),不要手写宽度/对齐——
|
|
10
|
+
* 选择列的宽度与对齐统一由本文件维护:
|
|
10
11
|
* { ...checkboxColumn, fixed: 'left', field: 'checkbox' }
|
|
11
|
-
* { ...radioColumn,
|
|
12
|
+
* { ...radioColumn, fixed: 'left' }
|
|
12
13
|
*
|
|
13
14
|
* 说明:vxe-grid 的复选框/单选框列是列配置对象(非 Vue 组件),
|
|
14
15
|
* 与 vxeDragRule.dragHandleColumn 同一套「公共列常量」惯例。
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{computed as
|
|
1
|
+
import{computed as P,ref as x,unref as w,createApp as so,nextTick as no,h as d}from"vue";import co,{ElDrawer as ho,ElDialog as go,ElButton as z}from"element-plus";import W from"../stores/storeConfig.js";/* empty css */import*as N from"@element-plus/icons-vue";import"../config/ElementPlusConfig.js";import{installVxeGrid as uo}from"../config/VxeTableConfig.js";import po from"element-plus/es/locale/lang/zh-cn";import bo from"./useListenerHooks.js";import{permissionStore as mo}from"../stores/permissionStore.js";import fo from"../components/icon/ElIcons.vue.js";import _o from"../components/ElDialogBody/ElDialogBody.vue.js";import ko from"crypto-js/enc-base64";import yo from"crypto-js/enc-utf8";import{frontendBus as T}from"../utils/frontendBus.js";import{GLOBAL_LOADING_EVENT as U,notifyDialogLoadingScope as vo}from"../utils/globalLoading.js";import xo from"./useBehaviorAction.js";import"pinia";import"pinia-plugin-store";import"../utils/patchWujiePopperCoordinates.js";import"vxe-table";import"@vxe-ui/core";import"@vxe-ui/plugin-export-xlsx";import"exceljs";import"vxe-table/es/style.css";import"vxe-table/es/locale/lang/zh-CN";import"../components/vxeReplace/index.js";import"../components/tooltip/index.js";import"../components/tooltip/src/tooltip.js";import"../../chunks/VxeButton.vue_vue_type_script_setup_true_lang-s_mYx9TA.js";import"../../chunks/VxeInput.vue_vue_type_script_setup_true_lang-v9AqGSoL.js";import"../../chunks/VxeSelect.vue_vue_type_script_setup_true_lang-DcVggycZ.js";import"../../chunks/VxeCheckbox.vue_vue_type_script_setup_true_lang-Ccr5YD1x.js";import"../../chunks/VxeModal.vue_vue_type_script_setup_true_lang-B4gh7jFR.js";import"../../chunks/VxeLoading.vue_vue_type_script_setup_true_lang-B253kD5t.js";import"../../chunks/VxePager.vue_vue_type_script_setup_true_lang-DpOa3T96.js";import"../../chunks/VxeForm.vue_vue_type_script_setup_true_lang-DXNZ8Qzg.js";import"../utils/behaviorTrack.js";import"axios";import"../utils/uuid.js";import"uuid";import"../utils/behaviorContext.js";import"../utils/encrypt.js";import"jsencrypt";import"../utils/dateTime.js";import"../utils/operationAuth.js";import"../stores/userInfoStore.js";import"../utils/userSessionStorage.js";import"@vueuse/core";import"../../chunks/_plugin-vue_export-helper-DlAUqK2U.js";const wo={},Eo="subAppModalOverlay",E="adtec-subapp-modal-open";let j=0;const b=[],v=new Map;let S=!1;const C=new WeakMap,So=()=>{for(let o=b.length-1;o>=0;o--)if(b[o].open.value)return b[o]},F=o=>{if(!o?.id)return;if(o.phase==="start"){const t=So();if(!t)return;v.set(o.id,t),t.requestLoadingIds.add(o.id),t.requestLoading.value=!0;return}const e=v.get(o.id);e&&(v.delete(o.id),e.requestLoadingIds.delete(o.id),e.requestLoading.value=e.requestLoadingIds.size>0)},Lo=o=>{b.push(o),!S&&(T.on(U,F),S=!0)},Io=o=>{const e=b.indexOf(o);e>-1&&b.splice(e,1),o.requestLoadingIds.forEach(t=>v.delete(t)),o.requestLoadingIds.clear(),o.requestLoading.value=!1,!(b.length>0||!S)&&(T.off(U,F),S=!1,v.clear())},Oo=o=>{const e=wo||{};return o.applicationModule||e.VITE_APPLICATION_MODULE||e.VITE_APP_MODULE||String(o.router.currentRoute.value.meta.applicationModule||"")},R=(o,e,t)=>{if(typeof window>"u"||!window.__POWERED_BY_WUJIE__)return;const r=Oo(o);if(!r||(t&&!e.overlayId&&(e.overlayId=`${r}-${Date.now()}-${++j}`),!e.overlayId))return;const i={applicationModule:r,overlayId:e.overlayId,open:t};T.emit(Eo,i),t||(e.overlayId=void 0)},H=(o,e)=>{e&&!o.overlayId&&(o.overlayId=`dialog-${Date.now()}-${++j}`),o.overlayId&&vo({id:o.overlayId,open:e})};function Co(){const e="dialog-hooks-styles",t=document.getElementById(e);if(t&&(t.textContent||"").includes("/* dialog-hooks v24 */"))return;t?.remove();const r=document.createElement("style");r.id=e,r.type="text/css",r.innerHTML=`
|
|
2
2
|
/* dialog-hooks v24 */
|
|
3
3
|
/* 抽屉组件 - 无滚动条样式 */
|
|
4
4
|
.dialog-hooks-no-scroll.el-drawer .el-drawer__body {
|
|
@@ -284,4 +284,4 @@ import{computed as $,ref as x,unref as w,createApp as so,nextTick as no,h as d}f
|
|
|
284
284
|
background: transparent !important;
|
|
285
285
|
background-color: transparent !important;
|
|
286
286
|
}
|
|
287
|
-
`,document.head.appendChild(r)}const Do=8;function
|
|
287
|
+
`,document.head.appendChild(r)}const Do=8;function G(o){const e=[];return o.querySelectorAll(".el-dialog-body__content").forEach(t=>e.push(t)),o.querySelectorAll(".el-drawer__body, .el-dialog__body").forEach(t=>{t.querySelector(".el-dialog-body__content")||e.push(t)}),e}function M(o){const e=[o];return o.querySelectorAll("*").forEach(t=>{(t.scrollHeight>t.clientHeight+1||t.scrollWidth>t.clientWidth+1)&&e.push(t)}),e}const V=new WeakSet;function Ao(o){G(o).forEach(e=>{M(e).forEach(t=>{V.has(t)||(V.add(t),Mo(t))})})}function Mo(o){let e;const t=()=>{o.classList.add("is-scrolling"),e&&window.clearTimeout(e),e=window.setTimeout(()=>o.classList.remove("is-scrolling"),600)};o.addEventListener("scroll",t,{passive:!0}),o.addEventListener("mouseenter",t),o.addEventListener("mouseleave",()=>{e&&window.clearTimeout(e),o.classList.remove("is-scrolling")})}function D(o){G(o).forEach(e=>{const t=C.get(e);if(!e.isConnected){t?.observer.disconnect(),t?.mutationObserver?.disconnect(),C.delete(e);return}const r=M(e);if(A(e,r),typeof ResizeObserver>"u")return;let i=t;if(!i){const h={observer:new ResizeObserver(()=>A(e,h.targets)),targets:new Set};i=h,C.set(e,h)}const _=new Set(r);i.targets.forEach(h=>{_.has(h)||i.observer.unobserve(h)}),_.forEach(h=>{i.targets.has(h)||i.observer.observe(h)}),i.targets=_,typeof MutationObserver<"u"&&!i.mutationObserver&&(i.mutationObserver=new MutationObserver(()=>{e.isConnected&&A(e,M(e))}),i.mutationObserver.observe(e,{childList:!0,subtree:!0,characterData:!0}))})}function A(o,e){let t=0;e.forEach(r=>{t=Math.max(t,r.offsetWidth-r.clientWidth)}),o.style.setProperty("--dialog-hooks-scrollbar",`${Math.min(Do,Math.max(0,t))}px`)}function To(o,e,t){return o===!1?{enabled:!1,scroll:t,class:void 0,contentClass:void 0}:o===!0||o===void 0?{enabled:o===!0?!0:e,scroll:t,class:void 0,contentClass:void 0}:{enabled:o.enabled??e,scroll:o.scroll??t,class:o.class,contentClass:o.contentClass}}function Bo(o,e){if(e)return e;try{const t=o.router.currentRoute.value.meta?.sysMenuData?.icon;if(t)return t}catch{}try{const t=sessionStorage.getItem("permissionStore");if(t){const r=JSON.parse(ko.parse(t).toString(yo));if(r?.activeMenuInfo?.icon)return r.activeMenuInfo.icon}}catch{}try{return mo(W).getActiveMenuInfo?.icon||""}catch{return""}}function Ae(o){return function(t){const r=[],i=()=>r[r.length-1],_=s=>{const a=w(s?.data),k=w(s?.row),y=w(s?.formData),p=s?.id??s?.taskId??s?.selectedId??a?.id??k?.id??y?.id;return p==null||p===""?"":String(p)},h=(s,a,k,y="drawer",p,X=!0)=>{Co();const{icon:Z,hideConfirm:L,hideFooter:oo,dialogBody:eo,...c}=k||{},f=To(eo,o.defaultDialogBody??!0,X),to=`${y}|${typeof s=="string"?s:s?.__name||s?.name||""}|${c.title||""}|${_(a)}`,B=x(!1),$=x(!1),l={open:x(!0),loading:P(()=>B.value||$.value),manualLoading:B,requestLoading:$,requestLoadingIds:new Set,childInstance:x(),app:null,div:null,closing:!1,renderKey:to,actionName:c.title||"确认"},lo=Object.fromEntries(Object.entries(a||{}).map(([n,u])=>[n,w(u)])),ro={...c,class:["dialog-hooks-host",...f.enabled?["dialog-hooks-body-contained"]:[],...f.scroll?[]:["dialog-hooks-no-scroll"],"dialog-hooks-scroll-auto",...Array.isArray(c.class)?c.class:c.class?[c.class]:[]]},ao=c.onClosed,I=typeof c.title=="string"&&c.title,q=I?Bo(o,Z):"",io=()=>d("div",{class:"dialog-hooks-header"},[q?d("div",{class:"dialog-hooks-header-icon"},[d(fo,{modelValue:q})]):null,d("div",{class:"dialog-hooks-header-title"},[c.title]),l.loading.value&&!L?null:d("button",{type:"button",class:"dialog-hooks-header-close",onClick:()=>m(l)},[d(N.Close)])]),g=so(()=>d(y==="drawer"?ho:go,{...ro,modelValue:l.open.value,showClose:I?!1:c.showClose??!0,onClosed(){H(l,!1),R(o,l,!1),Io(l),ao?.();const n=r.indexOf(l);n>-1&&r.splice(n,1),l.app?.unmount(),l.div?.parentNode&&l.div.parentNode.removeChild(l.div),l.app=null,l.div=null},onClose(){m(l)}},{...I?{header:io}:{},default:()=>{const n=d(s,{...lo,loading:l.loading.value,"onUpdate:loading":u=>{l.manualLoading.value=u},ref:l.childInstance});return f.enabled?d(_o,{scroll:f.scroll,class:f.class,contentClass:f.contentClass},{default:()=>n}):n},...oo?{}:{footer:()=>{if(p&&p.length){const n=p.map(u=>typeof u=="function"?u():u);return d("div",{className:"dialog-footer"},n)}return d("div",{className:"dialog-footer"},[d(z,{onClick:()=>m(l),loading:!L&&l.loading.value},"取 消"),L?null:d(z,{type:"primary",onClick:()=>Y(l),loading:l.loading.value},"确 认")])}}}));o.plugins?.forEach(n=>g.use(n)),g.use(co,{locale:po}),g.use(W),g.use(o.router);for(const[n,u]of Object.entries(N))g.component(n,u);uo(g),o.setupApp?.(g);const O=document.createElement("div");return document.body.appendChild(O),l.app=g,l.div=O,r.push(l),Lo(l),H(l,!0),R(o,l,!0),g.mount(O),no(()=>{Ao(document.body),D(document.body),l.childInstance.value?.resetQuery?.(),setTimeout(()=>{D(document.body),window.dispatchEvent(new Event("resize"))},350),setTimeout(()=>D(document.body),1200)}),bo(),{cancel:()=>m(l)}},Y=async s=>{const a=s||i();if(!a)return;const{runBehaviorAction:k}=xo();await k({code:`dialog:${a.renderKey}:confirm`,name:a.actionName||"确认",actionType:"SUBMIT"},async()=>{try{a.manualLoading.value=!0,await a.childInstance.value?.confirm?.(),t&&m(a)}catch{}finally{a.manualLoading.value=!1}})},m=s=>{const a=s||i();!a||!a.open.value||(a.closing=!0,a.open.value=!1)},K=s=>{const a=i();a&&(a.manualLoading.value=s)},J=()=>i()?.loading.value??!1,Q=P(()=>i()?.childInstance.value);return{render:h,cancel:m,setLoading:K,getLoading:J,instance:Q}}}export{Ae as createDialogHooks,Ae as default};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Ref } from 'vue';
|
|
2
2
|
import type { IWfTaskAskVo } from '../interface/workflow/IWfTaskAskVo';
|
|
3
|
+
import type { IWfTaskVo } from '../interface/workflow/IWfTaskVo';
|
|
3
4
|
/**
|
|
4
5
|
* 创建人:xux
|
|
5
6
|
* 说明: 组件工作流支持
|
|
@@ -31,14 +32,62 @@ export interface WorkflowParams {
|
|
|
31
32
|
taskName: string;
|
|
32
33
|
[key: string]: any;
|
|
33
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* 工作流办理动作类型:TaskOperation 统一在成功回调里回传,业务侧据此同步自己的业务状态。
|
|
37
|
+
* 与工作流按钮一一对应:complete 同意、refuse 终止、back 驳回、transfer 转办、
|
|
38
|
+
* addMulti 加签、minusMulti 减签、assignee 指定执行人。
|
|
39
|
+
*/
|
|
40
|
+
export type WorkflowActionType = 'complete' | 'refuse' | 'back' | 'transfer' | 'addMulti' | 'minusMulti' | 'assignee';
|
|
41
|
+
/**
|
|
42
|
+
* 成功回调的补充上下文:
|
|
43
|
+
* - askVo:本次提交给工作流引擎的参数(撤回、留痕时需要);
|
|
44
|
+
* - originTask:本次动作发生前的工作流任务快照(节点、审批人),用于定位撤回目标节点。
|
|
45
|
+
*/
|
|
46
|
+
export interface WorkflowCompleteExtra {
|
|
47
|
+
askVo?: IWfTaskAskVo;
|
|
48
|
+
originTask?: IWfTaskVo;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 业务同步失败的载荷,与成功回调相同的上下文 + 原始异常。
|
|
52
|
+
*/
|
|
53
|
+
export interface WorkflowCompleteErrorPayload extends WorkflowCompleteExtra {
|
|
54
|
+
actionType: WorkflowActionType;
|
|
55
|
+
taskVo?: IWfTaskVo;
|
|
56
|
+
originTask?: IWfTaskVo;
|
|
57
|
+
previousAssignees?: string[];
|
|
58
|
+
error: any;
|
|
59
|
+
}
|
|
34
60
|
export interface ITaskOperate {
|
|
35
61
|
/**
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
62
|
+
* 工作流动作成功后的业务同步回调(组件自己已调用工作流的推进/驳回/终止/转办/加减签接口):
|
|
63
|
+
* 业务侧在这里同步自己的业务数据。
|
|
64
|
+
*
|
|
65
|
+
* 统一组件会 await 本回调,失败按 {@link ITaskOperate.onCompleteError} 或默认撤回策略处理,
|
|
66
|
+
* 不会先提示成功、也不会先关闭弹窗。
|
|
67
|
+
*
|
|
68
|
+
* @param taskVo 动作完成后的任务对象(引擎返回值,可能是下一个节点)
|
|
69
|
+
* @param actionType 本次动作类型:complete / refuse / back / transfer / addMulti / minusMulti / assignee
|
|
70
|
+
* @param extra 本次动作的补充上下文(askVo、originTask)
|
|
71
|
+
*/
|
|
72
|
+
workflowComplete: (taskVo?: IWfTaskVo, actionType?: WorkflowActionType, extra?: WorkflowCompleteExtra) => any;
|
|
73
|
+
/**
|
|
74
|
+
* 业务同步失败时的统一处理钩子(可选)。
|
|
75
|
+
* 提供后完全由业务处理(可在其中调用核心包的 revertWorkflowAction 做撤回);
|
|
76
|
+
* 不提供时核心包按 revertOnCompleteError 决定是否自动撤回并提示。
|
|
40
77
|
*/
|
|
41
|
-
|
|
78
|
+
onCompleteError?: (payload: WorkflowCompleteErrorPayload) => any;
|
|
79
|
+
/**
|
|
80
|
+
* 业务同步失败时是否自动尝试撤回本次工作流动作。
|
|
81
|
+
*
|
|
82
|
+
* - 不传(默认):只有会改写业务单据的动作(同意/终止/驳回)才尝试撤回;
|
|
83
|
+
* 转办、加签、减签、指定执行人只是流程内部流转、不改业务数据,失败只提示不撤回;
|
|
84
|
+
* - 传 true:任何动作失败都尝试撤回;
|
|
85
|
+
* - 传 false:只提示失败,完全不撤回。
|
|
86
|
+
*
|
|
87
|
+
* 撤回是“尽力而为”:同意到最后一个节点(流程实例已结束)、终止(实例已停止)在引擎侧
|
|
88
|
+
* 没有可回退的目标节点,只会提示原因,实际补偿仍需后端幂等同步处理。
|
|
89
|
+
*/
|
|
90
|
+
revertOnCompleteError?: boolean;
|
|
42
91
|
/**
|
|
43
92
|
* 取消按钮文本
|
|
44
93
|
*/
|
|
@@ -113,7 +162,9 @@ export interface ITaskOperate {
|
|
|
113
162
|
* 2. 驳回(回退到历史节点)/ 转办只流转工作流、不改业务状态,默认展示:未提供回调时由 CheckDialog
|
|
114
163
|
* 直连工作流引擎(taskReturn / taskTransfer)处理,与安徽中烟保持一致,无需额外的业务接口;
|
|
115
164
|
* 3. approve / reject / back / transfer 完成后返回 undefined,统一组件会重新拉取当前任务;
|
|
116
|
-
* 4. 审批必须经业务接口同步业务状态,不要直接调工作流引擎的 taskComplete / taskReject
|
|
165
|
+
* 4. 审批必须经业务接口同步业务状态,不要直接调工作流引擎的 taskComplete / taskReject;
|
|
166
|
+
* 5. workflowComplete 由统一组件 await:业务同步失败时走 onCompleteError(未提供则核心包
|
|
167
|
+
* 尽力撤回本次工作流动作并提示),避免“流程成功、业务数据没落库”且用户看不到失败。
|
|
117
168
|
*/
|
|
118
169
|
export interface ApprovalOperateOptions {
|
|
119
170
|
/** 同意:调业务后端审批接口 */
|
|
@@ -130,7 +181,11 @@ export interface ApprovalOperateOptions {
|
|
|
130
181
|
*/
|
|
131
182
|
beforeApprove?: (vo: IWfTaskAskVo) => Promise<unknown> | unknown;
|
|
132
183
|
/** 流程办理完成后的业务刷新逻辑 */
|
|
133
|
-
onComplete?:
|
|
184
|
+
onComplete?: ITaskOperate['workflowComplete'];
|
|
185
|
+
/** 业务同步失败时的统一处理钩子(不提供时核心包按 revertOnCompleteError 自动撤回) */
|
|
186
|
+
onCompleteError?: ITaskOperate['onCompleteError'];
|
|
187
|
+
/** 业务同步失败时是否自动撤回本次工作流动作,默认 true */
|
|
188
|
+
revertOnCompleteError?: boolean;
|
|
134
189
|
/** 取消按钮回调(默认无) */
|
|
135
190
|
onCancel?: (...args: any[]) => any;
|
|
136
191
|
/** 按钮文案覆盖,传空串表示隐藏该按钮 */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function o(e){const
|
|
1
|
+
function o(e){const r=e.buttonText??{},c={cancelBtnText:r.cancel??"取消",saveBtnText:"",completeBtnText:r.complete??"同意",refuseBtnText:e.reject?r.refuse??"终止":"",backBtnText:r.back??"驳回",transferBtnText:r.transfer??"转办",workflowComplete:e.onComplete??(async()=>{}),onCompleteError:e.onCompleteError,revertOnCompleteError:e.revertOnCompleteError,cancelFunction:e.onCancel??(async()=>{}),completeFunction:async t=>{await e.approve(t)}};if(e.reject){const t=e.reject;c.refuseFunction=async n=>{await t(n)}}if(e.back){const t=e.back;c.backFunction=async n=>{await t(n)}}if(e.transfer){const t=e.transfer;c.transferFunction=async n=>{await t(n)}}if(e.beforeApprove){const t=e.beforeApprove;c.beforeCompleteFunction=async n=>{const a=await t(n);return a===!1?!1:a&&typeof a=="object"?a:void 0}}return c}function f(e){return{cancelBtnText:"",saveBtnText:"",completeBtnText:"",refuseBtnText:"",backBtnText:"",transferBtnText:"",workflowComplete:e?.onComplete??(async()=>{}),cancelFunction:async()=>{}}}function l(e,r){return{taskOption:e,initByWorkflow:r}}export{o as createApprovalOperate,f as createWorkflowEntryOperate,l as useWorkflowHooks};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { IWfTaskAskVo } from '../interface/workflow/IWfTaskAskVo';
|
|
2
|
+
import type { IWfTaskVo } from '../interface/workflow/IWfTaskVo';
|
|
3
|
+
import type { ITaskOperate, WorkflowActionType } from './userWorkflowHooks';
|
|
4
|
+
/** 本次业务同步的上下文 */
|
|
5
|
+
export interface WorkflowCompleteContext {
|
|
6
|
+
/** 本次工作流动作类型 */
|
|
7
|
+
actionType: WorkflowActionType;
|
|
8
|
+
/** 动作完成后的工作流任务(引擎返回值,可能是下一个节点) */
|
|
9
|
+
taskVo?: IWfTaskVo;
|
|
10
|
+
/** 动作发生前的工作流任务快照(节点、审批人),撤回时用于定位目标节点 */
|
|
11
|
+
originTask?: IWfTaskVo;
|
|
12
|
+
/** 本次提交给工作流引擎的参数,撤回时用于还原(如转办人) */
|
|
13
|
+
askVo?: IWfTaskAskVo;
|
|
14
|
+
/** 加减签等动作操作前的审批人工号快照(撤回时按差集反向处理) */
|
|
15
|
+
previousAssignees?: string[];
|
|
16
|
+
}
|
|
17
|
+
/** 业务同步失败时传给 onCompleteError 的载荷 */
|
|
18
|
+
export interface WorkflowCompleteErrorPayload extends WorkflowCompleteContext {
|
|
19
|
+
/** 业务同步抛出的原始异常 */
|
|
20
|
+
error: any;
|
|
21
|
+
}
|
|
22
|
+
/** 撤回结果 */
|
|
23
|
+
export interface WorkflowRevertResult {
|
|
24
|
+
/** 是否已成功撤回 */
|
|
25
|
+
reverted: boolean;
|
|
26
|
+
/** 未撤回(或不支持撤回)时的原因,便于提示与排查 */
|
|
27
|
+
reason?: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* 尽力撤回本次工作流动作。
|
|
31
|
+
*
|
|
32
|
+
* 各动作的支持情况:
|
|
33
|
+
* - `complete`:流程未结束且当前活动任务仍属于本人时可回退,否则返回原因;
|
|
34
|
+
* - `transfer`:可转回原审批人;
|
|
35
|
+
* - `addMulti` / `minusMulti`:提供操作前审批人快照时可反向加减签;
|
|
36
|
+
* - `assignee`:提供操作前审批人快照时可还原;
|
|
37
|
+
* - `back` / `refuse`:引擎侧已回退/已终止,不自动撤回,返回原因走人工或后端补偿。
|
|
38
|
+
*/
|
|
39
|
+
export declare function revertWorkflowAction(ctx: WorkflowCompleteContext): Promise<WorkflowRevertResult>;
|
|
40
|
+
/**
|
|
41
|
+
* 统一执行“工作流成功后”的业务同步。
|
|
42
|
+
*
|
|
43
|
+
* 业务侧两种用法:
|
|
44
|
+
* - 由 CheckDialog / AddOrMinusMultiDialog 在引擎动作成功后、`emit('success')` 之前 await 本方法,
|
|
45
|
+
* 这样业务失败时弹窗保持打开、不会误提示成功;
|
|
46
|
+
* - 业务自定义函数(completeFunction 等)内部已同步业务状态时,本方法只是兜底与错误兜底。
|
|
47
|
+
*
|
|
48
|
+
* 失败时抛出原始异常:上层据此保持弹窗/不刷新,并由 {@link ITaskOperate.onCompleteError}
|
|
49
|
+
* 或默认撤回策略完成提示与补救。
|
|
50
|
+
*/
|
|
51
|
+
export declare function runWorkflowComplete(operate: ITaskOperate | undefined, ctx: WorkflowCompleteContext): Promise<void>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ElMessage as i}from"element-plus";import o from"../api/workflow/workflowInstApi.js";import{userInfoStore as l}from"../stores/userInfoStore.js";import{frontendBus as f}from"../utils/frontendBus.js";import"../utils/request.js";import"../utils/AxiosConfig.js";import"axios";import"../utils/uuid.js";import"uuid";import"../utils/encrypt.js";import"jsencrypt";import"../utils/behaviorTrack.js";import"crypto-js/enc-base64";import"crypto-js/enc-utf8";import"../utils/behaviorContext.js";import"../utils/dateTime.js";import"../utils/globalLoading.js";import"vue";import"../utils/workflowTaskContext.js";import"../config/GlobalLoadingConfig.js";import"pinia";import"../utils/userSessionStorage.js";const c="业务数据处理失败,系统自动撤回本次审批",m=["complete","refuse","back"],p=()=>l().getUserInfo?.userCode||"",k=e=>String(e?.msg||e?.message||e||"业务数据处理失败"),d=e=>k(e?.response?.data??e),g=async e=>((await o.getTaskCandidate(e))?.candidate||[]).map(s=>s?.loginName).filter(s=>!!s),v=async e=>{const r=e.askVo?.procInsId||e.originTask?.procInsId||e.taskVo?.procInsId;if(r)return(await o.getProcessTaskList(r))?.activeTasks||[];const s=e.originTask?.businessId||e.taskVo?.businessId;if(!s)return[];const t=await o.getWfTaskByBusinessId(s);return t?.procEndTime||!t?.taskId?[]:[t]},I=async e=>{const r=e.originTask?.taskDefKey||e.taskVo?.taskDefKey;if(!r)return{reverted:!1,reason:"缺少本次审批的节点标识"};const s=p(),t=await v(e);if(!t.length)return{reverted:!1,reason:"流程已结束,无法回退"};const a=t.find(u=>u.assigneeId&&u.assigneeId===s),n=a||t[0];return n?.taskId?!a&&n.assigneeId&&s?{reverted:!1,reason:`流程已流转给 ${n.assigneeName||n.assigneeId}`}:(await o.taskReturn({taskId:n.taskId,userId:s,targetKey:r,comment:c}),{reverted:!0}):{reverted:!1,reason:"当前没有可回退的活动任务"}},w=async e=>{const r=e.taskVo?.taskId||e.originTask?.taskId,s=e.askVo?.userId;return r?s?(await o.taskTransfer({taskId:r,userId:s,assignee:s,comment:c}),{reverted:!0}):{reverted:!1,reason:"缺少原审批人信息"}:{reverted:!1,reason:"缺少工作流任务标识"}},T=async e=>{const r=e.taskVo?.taskId||e.originTask?.taskId,s=e.previousAssignees||[];if(!r)return{reverted:!1,reason:"缺少工作流任务标识"};if(!s.length)return{reverted:!1,reason:"未记录操作前的审批人"};const t=await g(r),a=e.actionType==="addMulti"?t.filter(n=>!s.includes(n)):s.filter(n=>!t.includes(n));return a.length?(await o.addOrMinusAssignee({taskId:r,assignee:a,type:e.actionType==="addMulti"?"minusMulti":"addMulti"}),{reverted:!0}):{reverted:!1,reason:"未识别到需要还原的审批人"}},y=async e=>{const r=e.taskVo?.taskId||e.originTask?.taskId,s=e.previousAssignees||[];return r?s.length?(await o.setAssigneeList([{taskId:r,assignee:s,type:"assignee"}]),{reverted:!0}):{reverted:!1,reason:"未记录操作前的审批人"}:{reverted:!1,reason:"缺少工作流任务标识"}};async function C(e){try{switch(e.actionType){case"complete":return await I(e);case"transfer":return await w(e);case"addMulti":case"minusMulti":return await T(e);case"assignee":return await y(e);case"refuse":return{reverted:!1,reason:"流程已终止,无法自动撤回"};case"back":return{reverted:!1,reason:"流程已回退,无法自动撤回"};default:return{reverted:!1,reason:"该动作不支持自动撤回"}}}catch(r){return{reverted:!1,reason:d(r)}}}const E=async e=>{const r=d(e.error),s=await C(e);if(s.reverted){f.emit("todoRefresh"),f.emit("homePageRefresh"),i.warning(`业务数据处理失败:${r};已自动撤回本次审批,请关闭后重新办理`);return}i.warning(`业务数据处理失败:${r};自动撤回未执行(${s.reason||"未知原因"}),请刷新后联系管理员处理`)};async function G(e,r){const s=e?.workflowComplete,t={askVo:r.askVo,originTask:r.originTask};try{typeof s=="function"&&await s(r.taskVo,r.actionType,t)}catch(a){const n={...r,error:a};throw typeof e?.onCompleteError=="function"?await e.onCompleteError(n):e?.revertOnCompleteError===!0||e?.revertOnCompleteError!==!1&&m.includes(r.actionType)?await E(n):i.warning(`业务数据处理失败:${d(a)}`),a}}export{C as revertWorkflowAction,G as runWorkflowComplete};
|
|
@@ -27,6 +27,15 @@ export interface IWfTaskQueryVo {
|
|
|
27
27
|
params?: {
|
|
28
28
|
[key: string]: any;
|
|
29
29
|
};
|
|
30
|
+
/**
|
|
31
|
+
* 是否按流程实例分页(已办列表“按流程收纳”:true 时一单一行,
|
|
32
|
+
* 分页与总数都按流程实例统计,同一单的多个节点不会被分页切开)
|
|
33
|
+
*/
|
|
34
|
+
groupByInstance?: boolean;
|
|
35
|
+
/**
|
|
36
|
+
* 流程实例ID(已办按实例收纳后,展开某行时取该实例下我的节点明细)
|
|
37
|
+
*/
|
|
38
|
+
procInstId?: string;
|
|
30
39
|
current: number;
|
|
31
40
|
size: number;
|
|
32
41
|
}
|