adtec-hnyzfc-core-package 1.6.8 → 1.7.0

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.
Files changed (29) hide show
  1. package/dist/chunks/DictDisplay.vue_vue_type_script_setup_true_lang-DT27bVnE.js +1 -0
  2. package/dist/src/api/DocumentApi.d.ts +7 -1
  3. package/dist/src/api/DocumentApi.js +1 -1
  4. package/dist/src/components/OperationAuth/operationAuth.vue.d.ts +9 -2
  5. package/dist/src/components/OperationAuth/operationAuth.vue.js +1 -1
  6. package/dist/src/components/dict/DictDisplay.vue.d.ts +11 -1
  7. package/dist/src/components/dict/DictDisplay.vue.js +1 -1
  8. package/dist/src/components/upload/OfficePreview.vue.d.ts +1 -1
  9. package/dist/src/components/upload/OfficePreview.vue.js +2 -2
  10. package/dist/src/components/upload/OfficePreviewHeaderBar.vue.d.ts +9 -5
  11. package/dist/src/components/upload/OfficePreviewHeaderBar.vue.js +2 -2
  12. package/dist/src/components/workflow/WorkflowTodoShell.vue.js +5 -5
  13. package/dist/src/hooks/createDialogHooks.js +6 -6
  14. package/dist/src/hooks/useWorkflowSnapshot.d.ts +9 -0
  15. package/dist/src/hooks/useWorkflowSnapshot.js +1 -1
  16. package/dist/src/hooks/workflowTodo.js +1 -1
  17. package/dist/src/mixin/globalMixin.js +1 -1
  18. package/dist/src/packages/index.d.ts +3 -0
  19. package/dist/src/packages/index.js +1 -1
  20. package/dist/src/plugins/plugins.js +1 -1
  21. package/dist/src/plugins/renderDialog.js +1 -1
  22. package/dist/src/utils/fileDownload.d.ts +6 -1
  23. package/dist/src/utils/fileDownload.js +1 -1
  24. package/dist/src/utils/modules.js +2 -2
  25. package/dist/src/utils/uploadAccept.js +1 -1
  26. package/dist/styles/element-ui.css +1 -1
  27. package/package.json +1 -1
  28. package/dist/chunks/DictDisplay.vue_vue_type_script_setup_true_lang-DiFlFWi1.js +0 -1
  29. package/dist/chunks/operationAuth.vue_vue_type_script_lang-BgqMGXbQ.js +0 -1
@@ -0,0 +1 @@
1
+ import{defineComponent as D,computed as t,openBlock as v,createBlock as x,withCtx as S,createTextVNode as f,toDisplayString as m,createElementBlock as b,Fragment as w,createCommentVNode as A,createElementVNode as h,normalizeStyle as N,renderSlot as V}from"vue";import B from"../src/hooks/useDictHooks.js";import{_ as E}from"./ElTagDisplay.vue_vue_type_script_setup_true_lang-DQXuYsW_.js";const P=D({__name:"DictDisplay",props:{dictType:{},value:{default:void 0},mode:{default:"tag"},aliasKey:{default:void 0},item:{default:void 0}},setup(i){const o=i,{getDict:p,getDictData:y}=B(),s={primary:"#0070d2",success:"#0d9e31",warning:"#e6710b",danger:"#cf2613",error:"#cf2613",info:"#909399"},c={primary:"primary",success:"success",info:"info",warning:"warning",danger:"danger",error:"danger"},l=t(()=>{if(o.item)return o.item;const e=y(String(o.value??""),o.dictType);return e&&e.value!==void 0?e:void 0}),g=()=>{const e=l.value?.remark;if(e)try{const r=JSON.parse(e);if(r&&typeof r=="object")return r}catch{}},a=t(()=>g()),u=t(()=>o.mode==="tag"?a.value?.tag:a.value?.text),_=t(()=>u.value?.aliases??a.value?.aliases),n=t(()=>{const e=u.value?.color;return typeof e=="string"?e.trim().toLowerCase():void 0}),d=t(()=>{const e=o.aliasKey?_.value?.[o.aliasKey]:void 0;return e??l.value?.label??""}),k=t(()=>{const e=n.value;return e?c[e]:"primary"}),C=t(()=>{const e=n.value;return e&&!c[e]?e:void 0}),T=t(()=>{const e=n.value;if(e){if(s[e])return{color:s[e]};if(/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(e))return{color:e}}});return p([o.dictType]),(e,r)=>i.mode==="tag"?(v(),x(E,{key:0,type:k.value,color:C.value,"disable-transitions":""},{default:S(()=>[f(m(d.value),1)]),_:1},8,["type","color"])):(v(),b(w,{key:1},[A(" 文字模式支持自定义内容(如版本号前带图标),颜色仍由字典备注统一控制 "),h("span",{style:N(T.value)},[V(e.$slots,"default",{},()=>[f(m(d.value||"—"),1)])],4)],2112))}});export{P as _};
@@ -33,9 +33,15 @@ declare const _default: {
33
33
  * format:original(默认,原始附件)/ pdf(Office 文档导出 PDF,后端转换后同样叠加水印)。
34
34
  * 返回后端 Content-Disposition 指定的文件名,前端据此命名可保证 .pdf 等后缀与内容一致。
35
35
  */
36
- downloadFile(id: string, format?: string): Promise<{
36
+ /** 下载附件:action 取 raw(原件,无水印)/ watermark(下载,带水印,默认)/ pdf(导出 PDF) */
37
+ downloadFile(id: string, action?: string): Promise<{
37
38
  blob: Blob;
38
39
  fileName?: string;
39
40
  }>;
41
+ /**
42
+ * 当前用户对该附件可用的下载动作:raw(原件,无水印)/ watermark(下载,带水印)/ pdf(导出 PDF)。
43
+ * 由后端按“文档类型 + 用户角色/用户”解析,前端只负责按结果渲染下载菜单。
44
+ */
45
+ getDownloadActions(id: string): Promise<string[]>;
40
46
  };
41
47
  export default _default;
@@ -1 +1 @@
1
- import o from"../utils/request.js";import s from"../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"vue";import"../utils/workflowTaskContext.js";import"../config/GlobalLoadingConfig.js";const i="/api/doc/",n=e=>{if(!e)return;const t=/filename\*=(?:UTF-8|utf-8)''([^;]+)/i.exec(e);if(t?.[1])try{return decodeURIComponent(t[1].trim())}catch{}return/filename="?([^";]+)"?/i.exec(e)?.[1]?.trim()},b={getUpLoadFilesVoById(e){return o.get(i+"getUpLoadFilesVoById/"+e)},getFileAccessAddress(e){return o.get(i+"getFileAccessAddress",{id:e})},async createRichTextImageUrl(e){const{url:t}=await this.createPreviewSession(e),r=/\/preview\/fileView\/([^/]+)\//.exec(t||"");if(!r?.[1])throw new Error("预览会话创建失败");return`${i}preview/fileView/${encodeURIComponent(r[1])}/image`},getUpLoadFilesByBussinessIds(e,t){const r=t===void 0?i+"getUpLoadFilesByBussinessIds":i+"getUpLoadFilesByBussinessIds/"+t;return o.post(r,e)},delSysUploadFile(e){return o.get(i+"delSysUploadFile/"+e)},getBusinessDocuments(e,t){return o.get(i+"getBusinessDocuments/"+e+"/"+t)},fileStatusConfirmation(e){return o.post(i+"fileStatusConfirmation",e)},delSysUploadFiles(e){return o.post(i+"delSysUploadFiles",e)},updateFilesCreateBy(e,t){return o.post(i+"updateFilesCreateBy",{ids:e,createBy:t})},createPreviewSession(e){return o.postWithOptions(i+"preview/session/"+e,void 0,{skipGlobalLoading:!0})},async downloadFile(e,t){const r=await s({url:i+"preview/download/"+e+(t?"?format="+t:""),method:"get",responseType:"blob"});return{blob:r.data,fileName:n(r.headers?.["content-disposition"])}}};export{b as default};
1
+ import s from"../utils/request.js";import r from"../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"vue";import"../utils/workflowTaskContext.js";import"../config/GlobalLoadingConfig.js";const o="/api/doc/",n=e=>{if(!e)return;const t=/filename\*=(?:UTF-8|utf-8)''([^;]+)/i.exec(e);if(t?.[1])try{return decodeURIComponent(t[1].trim())}catch{}return/filename="?([^";]+)"?/i.exec(e)?.[1]?.trim()},A={getUpLoadFilesVoById(e){return s.get(o+"getUpLoadFilesVoById/"+e)},getFileAccessAddress(e){return s.get(o+"getFileAccessAddress",{id:e})},async createRichTextImageUrl(e){const{url:t}=await this.createPreviewSession(e),i=/\/preview\/fileView\/([^/]+)\//.exec(t||"");if(!i?.[1])throw new Error("预览会话创建失败");return`${o}preview/fileView/${encodeURIComponent(i[1])}/image`},getUpLoadFilesByBussinessIds(e,t){const i=t===void 0?o+"getUpLoadFilesByBussinessIds":o+"getUpLoadFilesByBussinessIds/"+t;return s.post(i,e)},delSysUploadFile(e){return s.get(o+"delSysUploadFile/"+e)},getBusinessDocuments(e,t){return s.get(o+"getBusinessDocuments/"+e+"/"+t)},fileStatusConfirmation(e){return s.post(o+"fileStatusConfirmation",e)},delSysUploadFiles(e){return s.post(o+"delSysUploadFiles",e)},updateFilesCreateBy(e,t){return s.post(o+"updateFilesCreateBy",{ids:e,createBy:t})},createPreviewSession(e){return s.postWithOptions(o+"preview/session/"+e,void 0,{skipGlobalLoading:!0})},async downloadFile(e,t){const i=await r({url:o+"preview/download/"+e+(t?"?mode="+t:""),method:"get",responseType:"blob"});return{blob:i.data,fileName:n(i.headers?.["content-disposition"])}},async getDownloadActions(e){return(await s.get(o+"preview/downloadActions/"+e))?.actions??[]}};export{A as default};
@@ -19,7 +19,10 @@ declare const _default: import("vue").DefineComponent<{
19
19
  alias?: string
20
20
  /** 按钮级覆盖:图标/文字颜色。 */
21
21
  | undefined;
22
- color?: string | undefined;
22
+ color?: string
23
+ /** 展示形态:button=按权限点配置渲染按钮(默认);menuItem=下拉菜单项(图标+权限色+文字) */
24
+ | undefined;
25
+ displayMode?: ("button" | "menuItem") | undefined;
23
26
  }, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
24
27
  [key: string]: any;
25
28
  }> | VNode<import("vue").RendererNode, import("vue").RendererElement, {
@@ -44,8 +47,12 @@ declare const _default: import("vue").DefineComponent<{
44
47
  alias?: string
45
48
  /** 按钮级覆盖:图标/文字颜色。 */
46
49
  | undefined;
47
- color?: string | undefined;
50
+ color?: string
51
+ /** 展示形态:button=按权限点配置渲染按钮(默认);menuItem=下拉菜单项(图标+权限色+文字) */
52
+ | undefined;
53
+ displayMode?: ("button" | "menuItem") | undefined;
48
54
  }> & Readonly<{}>, {
49
55
  noConfig: boolean;
56
+ displayMode: string;
50
57
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
51
58
  export default _default;
@@ -1 +1 @@
1
- import{_ as o}from"../../../chunks/operationAuth.vue_vue_type_script_lang-BgqMGXbQ.js";import"vue";import"../../hooks/useBehaviorAction.js";import"../../utils/behaviorTrack.js";import"axios";import"crypto-js/enc-base64";import"crypto-js/enc-utf8";import"../../utils/uuid.js";import"uuid";import"../../utils/behaviorContext.js";import"../../utils/encrypt.js";import"jsencrypt";import"../../utils/dateTime.js";import"../../hooks/useOperationAuth.js";import"vue-router";import"../../stores/permissionStore.js";import"pinia";import"../../utils/frontendBus.js";import"../../utils/operationAuth.js";import"../../stores/userInfoStore.js";import"../../utils/userSessionStorage.js";export{o as default};
1
+ import{defineComponent as H,computed as a,isVNode as p,h as n,resolveComponent as c,resolveDynamicComponent as N,cloneVNode as J}from"vue";import K from"../../hooks/useBehaviorAction.js";import Y from"../../hooks/useOperationAuth.js";import{_ as $}from"../../../chunks/_plugin-vue_export-helper-DlAUqK2U.js";import"../../utils/behaviorTrack.js";import"axios";import"crypto-js/enc-base64";import"crypto-js/enc-utf8";import"../../utils/uuid.js";import"uuid";import"../../utils/behaviorContext.js";import"../../utils/encrypt.js";import"jsencrypt";import"../../utils/dateTime.js";import"vue-router";import"../../stores/permissionStore.js";import"pinia";import"../../utils/frontendBus.js";import"../../utils/operationAuth.js";import"../../stores/userInfoStore.js";import"../../utils/userSessionStorage.js";const T={primary:"var(--el-color-primary)",success:"var(--el-color-success)",info:"var(--el-color-info)",warning:"var(--el-color-warning)",danger:"var(--el-color-danger)",error:"var(--el-color-danger)"},j=H({name:"OperationAuth",props:{operCode:{type:[String,Array],required:!0},menuCode:String,noConfig:Boolean,loadType:String,icon:String,remark:String,alias:String,color:String,displayMode:{type:String,default:"button"}},setup(r,{slots:i}){const{getOperation:L}=Y(),{runBehaviorAction:V}=K(),z=a(()=>Array.isArray(r.operCode)?r.operCode:[r.operCode]),m=a(()=>L(z.value,r.menuCode)),x=a(()=>!!m.value),I=a(()=>{const e=r.remark??m.value?.remark;if(!e)return{alias:"",color:""};try{const t=JSON.parse(e);return{alias:t?.aliases?.alias1||t?.aliases?.alias||"",color:t?.color||t?.icon?.color||t?.text?.color||""}}catch{return{alias:"",color:""}}}),s=a(()=>(r.icon??m.value?.icon??"").trim()),C=a(()=>r.alias||I.value.alias||m.value?.name||""),S=a(()=>m.value?.code||z.value[0]||""),f=a(()=>C.value||S.value||"未命名操作"),y=a(()=>({"data-behavior-operation-code":S.value,"data-behavior-operation-name":f.value,"data-behavior-scope":"manual","data-track-code":S.value,"data-track-name":f.value})),b=a(()=>r.color||I.value.color||""),v=a(()=>b.value.trim().toLowerCase()),u=a(()=>v.value!==""&&v.value in T),h=a(()=>{if(u.value)return v.value==="error"?"danger":v.value}),g=a(()=>{if(u.value)return;const e=b.value.trim();if(e)return{color:T[v.value]||e}}),B=a(()=>r.loadType??m.value?.loadType??""),k=a(()=>String(B.value??"")),P=a(()=>{const e=i.default?.()[0];if(!e||!p(e))return!1;const t=e.type||{},l=String(t?.name||t?.__name||"").replace(/[^a-zA-Z]/g,"");return/^elicon/i.test(l)?!0:/^elbutton$/i.test(l)&&!!e.props?.icon}),w=a(()=>{const e=i.default?.()[0];if(!e||!p(e))return!1;const t=e.type||{};return String(t?.name||t?.__name||"").replace(/[^a-zA-Z]/g,"").toLowerCase()==="elbutton"&&k.value==="20"}),_=a(()=>r.displayMode==="menuItem"?"menuItem":r.noConfig?"slot":w.value||P.value?"icon":k.value==="10"?"text":k.value==="20"?"icon":k.value==="30"?"iconText":"slot"),M=a(()=>i.default?.()[0]?.props?.onClick),A=a(()=>{const e=i.default?.()[0];return p(e)&&e.props?.["data-behavior-scope"]==="manual"}),O=e=>{const t=M.value;return Array.isArray(t)?t.reduce((o,l)=>typeof l=="function"?l(...e):o,void 0):typeof t=="function"?t(...e):void 0},d=(...e)=>A.value?O(e):V({code:S.value,name:f.value,actionType:"CLICK"},()=>O(e)),Z=e=>{if(e.type==="button")return!0;const t=e.type,o=String(t?.name||t?.__name||"").replace(/[^a-zA-Z]/g,"").toLowerCase();return o==="elbutton"||o==="eliconbtn"||o==="eliconsearch"},E=e=>{const t=e.type;return String(t?.name||t?.__name||"").replace(/[^a-zA-Z]/g,"").toLowerCase()==="eliconbtn"},W=e=>u.value||!E(e)?{}:{neutral:!0},R=()=>(i.default?.()||[]).map(t=>{if(!p(t)||!Z(t))return t;const o=J(t,{...y.value,...A.value?{}:{onClick:d},type:u.value?h.value:void 0,...W(t),style:b.value.trim()?g.value:void 0});return!A.value&&o.props&&(o.props.onClick=d),o});return()=>{if(!x.value)return null;if(_.value==="icon"){const e=i.default?.()[0],t=p(e)?e.props||{}:{};if(w.value){const o={...t};delete o.modelValue,delete o.tip,delete o.elementType,delete o.neutral,delete o.icon;const l=s.value||"adtec-tips",q=n(c("el-icon"),{},()=>l.startsWith("adtec-")?n("svg",{class:"icon","aria-hidden":"true"},[n("use",{href:"#"+l})]):n(N(l))),D=n(c("el-button"),{...o,...y.value,type:u.value?h.value:void 0,title:f.value,"aria-label":f.value,style:[o.style,g.value],onClick:d},{icon:()=>q});return n(c("el-tooltip"),{content:f.value,placement:"top"},{default:()=>D})}return n(c("el-icon-btn"),{...t,...y.value,modelValue:s.value||t.modelValue||"adtec-tips",tip:C.value||t.tip,type:u.value?h.value:void 0,neutral:!u.value,style:g.value,onClick:d})}if(_.value==="text"){const e=i.default?.()[0],o={...p(e)?e.props||{}:{}};return delete o.modelValue,delete o.tip,delete o.icon,n(c("el-button"),{...o,...y.value,type:u.value?h.value:void 0,size:P.value?"small":o.size,style:[o.style,g.value],onClick:d},()=>C.value)}if(_.value==="iconText"){const e=i.default?.()[0],t=p(e)?e.props||{}:{},o=s.value?n(c("el-icon"),{},()=>s.value.startsWith("adtec-")?n("svg",{class:"icon","aria-hidden":"true"},[n("use",{href:"#"+s.value})]):n(N(s.value))):void 0;return n(c("el-button"),{...t,...y.value,type:h.value,style:[t.style,g.value],onClick:d},[o,n("span",{},C.value)])}if(_.value==="menuItem"){const e=s.value,t=v.value?{color:T[v.value]||b.value.trim()}:void 0;return n("span",{...y.value,class:"operation-auth-menu-item",style:t,onClick:d},[e?n(c("el-icon"),{},()=>e.startsWith("adtec-")?n("svg",{class:"icon","aria-hidden":"true"},[n("use",{href:"#"+e})]):n(N(e))):void 0,n("span",{},C.value)])}return R()}}}),ye=$(j,[["__scopeId","data-v-6a3579c4"]]);export{ye as default};
@@ -11,10 +11,20 @@ type __VLS_Props = {
11
11
  /** 已加载的字典项,传入时跳过缓存查找 */
12
12
  item?: ISysDictDataCacheVo;
13
13
  };
14
- declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
14
+ declare var __VLS_5: {};
15
+ type __VLS_Slots = {} & {
16
+ default?: (props: typeof __VLS_5) => any;
17
+ };
18
+ declare const __VLS_component: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
15
19
  item: ISysDictDataCacheVo;
16
20
  mode: "tag" | "text";
17
21
  value: string | number;
18
22
  aliasKey: string;
19
23
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
24
+ declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
20
25
  export default _default;
26
+ type __VLS_WithSlots<T, S> = T & {
27
+ new (): {
28
+ $slots: S;
29
+ };
30
+ };
@@ -1 +1 @@
1
- import{_ as o}from"../../../chunks/DictDisplay.vue_vue_type_script_setup_true_lang-DiFlFWi1.js";import"vue";import"../../hooks/useDictHooks.js";import"../../api/SysDictCacheApi.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/dictStore.js";import"pinia";import"../../stores/userInfoStore.js";import"../../utils/userSessionStorage.js";import"../../utils/FrameworkUtils.js";import"xlsx-js-style";import"../../../chunks/ElTagDisplay.vue_vue_type_script_setup_true_lang-DQXuYsW_.js";export{o as default};
1
+ import{_ as o}from"../../../chunks/DictDisplay.vue_vue_type_script_setup_true_lang-DT27bVnE.js";import"vue";import"../../hooks/useDictHooks.js";import"../../api/SysDictCacheApi.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/dictStore.js";import"pinia";import"../../stores/userInfoStore.js";import"../../utils/userSessionStorage.js";import"../../utils/FrameworkUtils.js";import"xlsx-js-style";import"../../../chunks/ElTagDisplay.vue_vue_type_script_setup_true_lang-DQXuYsW_.js";export{o as default};
@@ -35,7 +35,7 @@ declare const _default: import("vue").DefineComponent<__VLS_PublicProps, {
35
35
  zoomIn: () => void;
36
36
  zoomOut: () => void;
37
37
  resetZoom: () => void;
38
- download: (format?: string) => Promise<void>;
38
+ download: (action?: string) => Promise<void>;
39
39
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
40
40
  close: () => any;
41
41
  error: (err?: unknown) => any;
@@ -1,2 +1,2 @@
1
- import{defineComponent as Me,useModel as Ie,ref as c,computed as m,watch as ee,nextTick as Le,onMounted as Re,onBeforeUnmount as Pe,openBlock as B,createElementBlock as W,normalizeClass as Oe,createBlock as A,unref as O,createCommentVNode as M,createElementVNode as I,createVNode as Te,Transition as ze,withCtx as H,normalizeStyle as be,createTextVNode as ke,mergeModels as te}from"vue";import{ElEmpty as Ze,ElButton as De,ElMessage as $}from"element-plus";import Ve from"../../api/DocumentApi.js";import We from"../../utils/FrameworkUtils.js";import Ae from"../../utils/fileDownload.js";import{resolveOfficeFileExt as He,canExportPdf as $e,MAX_RICH_PREVIEW_ZOOM as oe,MIN_OFFICE_ZOOM as ae,clampRichPreviewZoom as re,OFFICE_ZOOM_STEP as le}from"../../utils/officePreviewUtil.js";import qe from"./OfficePreviewHeaderBar.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"../../utils/dateTime.js";import"../../utils/frontendBus.js";import"../../utils/globalLoading.js";import"../../utils/workflowTaskContext.js";import"../../config/GlobalLoadingConfig.js";import"xlsx-js-style";import"@element-plus/icons-vue";const Ue={class:"fileview-frame-wrap"},Xe={key:0,class:"preview-loading-overlay"},Qe=["src","title"],je=Me({__name:"OfficePreview",props:te({url:{default:""},fileId:{default:""},fileName:{default:""},fileType:{default:""},title:{default:""},showHeader:{type:Boolean,default:!0},showSearch:{type:Boolean,default:!0},showPageNav:{type:Boolean,default:!1},showZoom:{type:Boolean,default:!0},showDownload:{type:Boolean,default:!1},showRefresh:{type:Boolean,default:!1},showFullscreen:{type:Boolean,default:!1},showClose:{type:Boolean,default:!1},fullscreen:{type:Boolean,default:!1},downloadLoading:{type:Boolean,default:!1},refreshLoading:{type:Boolean,default:!1},deferRefresh:{type:Boolean,default:!1},lostDescription:{default:"附件已丢失或无权访问"},attachmentLost:{type:Boolean,default:!1}},{scale:{default:1},scaleModifiers:{}}),emits:te(["loaded","error","download","refresh","toggle-fullscreen","close"],["update:scale"]),setup(s,{expose:ne,emit:se}){const o=s,n=Ie(s,"scale"),v=se,g=c(""),x=c(null),E=c(!1),h=c(!1),L=c(""),d=c(""),S=c(-1),C=c(0),F=c(!1),u=c(!1),T=c(!1);let R=0;const ie=new Set(["pdf","doc","docx","xls","xlsx","ppt","pptx","txt","csv","html","htm","xml","json","md"]),ce=m(()=>L.value||o.lostDescription),q=m(()=>o.title||o.fileName),_=m(()=>He(o.fileType,o.fileName,o.url)),U=m(()=>o.showSearch&&!h.value&&ie.has(_.value)),de=m(()=>o.showZoom&&!h.value),ue=m(()=>o.showDownload&&$e(_.value)),fe=m(()=>o.downloadLoading||T.value),me=m(()=>u.value&&n.value!==1),ve=m(()=>{if(!me.value)return;const t=n.value;return{position:"absolute",top:"0",left:"0",width:`${100/t}%`,height:`${100/t}%`,transform:`scale(${t})`,transformOrigin:"top left"}}),z=t=>{x.value?.contentWindow?.postMessage({source:"adtec-office-preview",type:"command",...t},"*")},b=()=>{try{return x.value?.contentWindow||null}catch{return null}},k=t=>{const e=Number(t?.total||0);C.value=e,S.value=e>0?Number(t?.index||0):-1,e===0&&d.value&&$.warning("未找到匹配内容")},he=t=>{const e=t?.adtecFileViewAdapter;if(e?.zoom)try{return e.zoom(n.value),!0}catch{}try{const a=t?.document?.documentElement;if(a){const l=Math.max(ae,Math.min(oe,n.value));return a.style.zoom=String(l),a.style.width=`${100/l}%`,a.style.height=`${100/l}%`,!0}}catch{}return!1},N=()=>{!u.value&&he(b())||z({command:"zoom",scale:n.value})},X=()=>{n.value=re(n.value+le),N()},Q=()=>{n.value=re(n.value-le),N()},j=()=>{n.value=1,N()};let i={query:"",matches:[],index:-1};const we=(t,e)=>{const a=[],l=t.body;if(!l)return a;const r=e.toLocaleLowerCase(),w=t.createTreeWalker(l,NodeFilter.SHOW_TEXT,{acceptNode:f=>{const y=f.parentElement;return!y||!f.nodeValue||!f.nodeValue.trim()||y.closest("script, style, noscript, input, textarea, #wm_div_id")?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT}});let p=w.nextNode();for(;p;){const f=p.nodeValue?.toLocaleLowerCase()||"";let y=f.indexOf(r);for(;y!==-1;)a.push({node:p,start:y,end:y+e.length}),y=f.indexOf(r,y+Math.max(1,e.length));p=w.nextNode()}return a},pe=(t,e,a)=>{const l=t?.document;if(!l?.body)return null;(a==="first"||i.query!==e)&&(i={query:e,matches:we(l,e),index:-1});const r=i.matches.length;if(r===0)return{total:0,index:-1};a==="prev"?i.index=(i.index-1+r)%r:i.index=(i.index+1)%r;const w=i.matches[i.index];try{const p=l.createRange();p.setStart(w.node,w.start),p.setEnd(w.node,w.end);const f=t?.getSelection?.();f?.removeAllRanges(),f?.addRange(p),w.node.parentElement?.scrollIntoView({block:"center",behavior:"smooth"})}catch{}return{total:r,index:i.index}},Z=t=>{const e=d.value;if(!e)return;const a=b(),l=a?.adtecFileViewAdapter;if(l?.search)try{const r=l.search(e,t);r&&typeof r.then=="function"?r.then(k):k(r);return}catch{}if(!u.value){const r=pe(a,e,t);if(r){k(r);return}}z({command:"search",query:e,direction:t})},ye=()=>{i={query:"",matches:[],index:-1};const t=b(),e=t?.adtecFileViewAdapter;if(e?.clearSearch)try{e.clearSearch();return}catch{}if(!u.value)try{t?.getSelection?.()?.removeAllRanges()}catch{}z({command:"clear-search"})},ge=t=>{const e=t.trim();if(d.value=e,S.value=-1,C.value=0,!e){J();return}if(u.value){$.warning("当前预览服务不支持内容搜索,请下载后查看");return}Z("first")},J=()=>{d.value="",S.value=-1,C.value=0,ye()},xe=()=>{d.value&&Z("prev")},Ee=()=>{d.value&&Z("next")},G=t=>{if(!(t.source!==x.value?.contentWindow||t.data?.source!=="adtec-fileview")){if(t.data.type==="ready"){F.value=!0,u.value=!1,N();return}if(t.data.type==="search-result"){const e=Number(t.data.total||0);C.value=e,S.value=e>0?Number(t.data.index||0):-1,e===0&&d.value&&$.warning("未找到匹配内容")}}},P=new Set,Se=()=>{const t=x.value;if(!t)return null;try{const e=t.contentWindow;if(e?.parent&&e.parent!==e)return e.parent}catch{}return null},D=()=>{[window,Se()].forEach(e=>{if(!(!e||P.has(e)))try{e.addEventListener("message",G),P.add(e)}catch{}})},Ce=()=>{P.forEach(t=>{try{t.removeEventListener("message",G)}catch{}}),P.clear()},K=async()=>{const t=++R;if(g.value="",E.value=!1,h.value=!1,L.value="",n.value=1,d.value="",S.value=-1,C.value=0,F.value=!1,u.value=!1,o.attachmentLost){h.value=!0,v("error");return}E.value=!0;try{if(o.fileId){const e=await Ve.createPreviewSession(o.fileId);if(t!==R)return;g.value=e.url;return}if(o.url.startsWith("/api/doc/preview/fileView/")){g.value=o.url;return}throw new Error("为保护附件地址,旧版文件直链已停止预览,请使用附件 ID 打开")}catch(e){if(t!==R)return;E.value=!1,h.value=!0,L.value=e?.msg||e?.message||"文件预览失败,请下载后查看",v("error",e)}},Y=()=>{K()},Fe=()=>{v("refresh"),!o.deferRefresh&&Y()},V=async(t="original")=>{if(v("download",t),!!o.fileId){T.value=!0;try{await Ae(o.fileId,o.fileName,t)}catch(e){We.messageError(e)}finally{T.value=!1}}},Be=()=>{E.value=!1,D();const t=x.value?.contentWindow;if(t&&!F.value)try{t.adtecPreviewBridge&&(F.value=!0,u.value=!1)}catch{}F.value||window.setTimeout(()=>{F.value||(u.value=!0)},1500),N(),v("loaded")},Ne=t=>{E.value=!1,h.value=!0,L.value="文件预览服务暂不可用,请稍后重试或下载后查看",v("error",t)};return ee(()=>[o.fileId,o.url,o.attachmentLost],()=>void K(),{immediate:!0}),ee(g,t=>{t&&Le(()=>D())}),Re(()=>D()),Pe(()=>{R++,Ce()}),ne({reloadPreview:Y,zoomIn:X,zoomOut:Q,resetZoom:j,download:V}),(t,e)=>(B(),W("div",{class:Oe(["office-preview-root",{"is-fullscreen":s.fullscreen}])},[s.showHeader?(B(),A(qe,{key:0,title:q.value,"title-only":!U.value,zoom:n.value,"search-query":d.value,"search-index":S.value,"search-total":C.value,"show-search":U.value,"show-page-nav":!1,"show-zoom":de.value,"show-download":s.showDownload,"pdf-export":ue.value,"show-refresh":s.showRefresh,"show-fullscreen":s.showFullscreen,"show-close":s.showClose,fullscreen:s.fullscreen,"download-loading":fe.value,"refresh-loading":s.refreshLoading,"min-zoom":O(ae),"max-zoom":O(oe),onZoomIn:X,onZoomOut:Q,onZoomReset:j,onSearch:ge,onSearchClear:J,onSearchPrev:xe,onSearchNext:Ee,onDownload:V,onRefresh:Fe,onToggleFullscreen:e[0]||(e[0]=a=>v("toggle-fullscreen")),onClose:e[1]||(e[1]=a=>v("close"))},null,8,["title","title-only","zoom","search-query","search-index","search-total","show-search","show-zoom","show-download","pdf-export","show-refresh","show-fullscreen","show-close","fullscreen","download-loading","refresh-loading","min-zoom","max-zoom"])):M("v-if",!0),M(` 外层加载层与预览页内层样式完全一致(spinner + 正在加载文件... + 进度条),
2
- 切换时淡出过渡,避免 spinner 相位/进度条状态差异造成的跳动 `),I("div",Ue,[Te(ze,{name:"preview-loading-fade"},{default:H(()=>[E.value?(B(),W("div",Xe,[...e[3]||(e[3]=[I("div",{class:"preview-loading-spinner"},null,-1),I("div",{class:"preview-loading-text"},"正在加载文件...",-1),I("div",{class:"preview-loading-progress"},[I("div",{class:"preview-loading-bar is-indeterminate"})],-1)])])):M("v-if",!0)]),_:1}),g.value&&!h.value?(B(),W("iframe",{key:g.value,ref_key:"previewFrameRef",ref:x,class:"fileview-frame",style:be(ve.value),src:g.value,title:q.value||"文件预览",referrerpolicy:"same-origin",onLoad:Be,onError:Ne},null,44,Qe)):h.value?(B(),A(O(Ze),{key:1,description:ce.value},{default:H(()=>[s.showDownload?(B(),A(O(De),{key:0,type:"primary",onClick:e[2]||(e[2]=a=>V())},{default:H(()=>[...e[4]||(e[4]=[ke(" 下载文件 ",-1)])]),_:1})):M("v-if",!0)]),_:1},8,["description"])):M("v-if",!0)])],2))}}),St=_e(je,[["__scopeId","data-v-d048ae89"]]);export{St as default};
1
+ import{defineComponent as Oe,useModel as De,ref as s,computed as d,watch as H,nextTick as Pe,onMounted as Te,onBeforeUnmount as be,openBlock as N,createElementBlock as _,normalizeClass as ze,createBlock as $,unref as D,createCommentVNode as B,createElementVNode as L,createVNode as Ae,Transition as Ze,withCtx as q,normalizeStyle as Ve,createTextVNode as We,mergeModels as re}from"vue";import{ElEmpty as He,ElButton as _e,ElMessage as U}from"element-plus";import le from"../../api/DocumentApi.js";import $e from"../../utils/FrameworkUtils.js";import qe from"../../utils/fileDownload.js";import{resolveOfficeFileExt as Ue,canExportPdf as Xe,MAX_RICH_PREVIEW_ZOOM as ne,MIN_OFFICE_ZOOM as se,clampRichPreviewZoom as ie,OFFICE_ZOOM_STEP as ce}from"../../utils/officePreviewUtil.js";import Qe from"./OfficePreviewHeaderBar.vue.js";import{_ as je}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";import"@element-plus/icons-vue";const Je={class:"fileview-frame-wrap"},Ke={key:0,class:"preview-loading-overlay"},Ye=["src","title"],Ge=Oe({__name:"OfficePreview",props:re({url:{default:""},fileId:{default:""},fileName:{default:""},fileType:{default:""},title:{default:""},showHeader:{type:Boolean,default:!0},showSearch:{type:Boolean,default:!0},showPageNav:{type:Boolean,default:!1},showZoom:{type:Boolean,default:!0},showDownload:{type:Boolean,default:!1},showRefresh:{type:Boolean,default:!1},showFullscreen:{type:Boolean,default:!1},showClose:{type:Boolean,default:!1},fullscreen:{type:Boolean,default:!1},downloadLoading:{type:Boolean,default:!1},refreshLoading:{type:Boolean,default:!1},deferRefresh:{type:Boolean,default:!1},lostDescription:{default:"附件已丢失或无权访问"},attachmentLost:{type:Boolean,default:!1}},{scale:{default:1},scaleModifiers:{}}),emits:re(["loaded","error","download","refresh","toggle-fullscreen","close"],["update:scale"]),setup(c,{expose:de,emit:ue}){const o=c,n=De(c,"scale"),v=ue,g=s(""),x=s(null),E=s(!1),h=s(!1),M=s(""),u=s(""),S=s(-1),C=s(0),I=s(!1),f=s(!1),P=s(!1);let R=0;const fe=new Set(["pdf","doc","docx","xls","xlsx","ppt","pptx","txt","csv","html","htm","xml","json","md"]),me=d(()=>M.value||o.lostDescription),X=d(()=>o.title||o.fileName),Q=d(()=>Ue(o.fileType,o.fileName,o.url)),j=d(()=>o.showSearch&&!h.value&&fe.has(Q.value)),ve=d(()=>o.showZoom&&!h.value),J=d(()=>o.showDownload&&Xe(Q.value)),he=["raw","watermark","pdf"],k=s([]),T=d(()=>{if(!o.showDownload)return[];const t=J.value?["watermark","pdf"]:["watermark"];return(k.value.length?k.value:t).filter(a=>a==="pdf"?J.value:he.includes(a))}),we=async()=>{const t=o.fileId;if(k.value=[],!(!t||!o.showDownload))try{k.value=await le.getDownloadActions(t)}catch{}},pe=d(()=>o.downloadLoading||P.value),ye=d(()=>f.value&&n.value!==1),ge=d(()=>{if(!ye.value)return;const t=n.value;return{position:"absolute",top:"0",left:"0",width:`${100/t}%`,height:`${100/t}%`,transform:`scale(${t})`,transformOrigin:"top left"}}),b=t=>{x.value?.contentWindow?.postMessage({source:"adtec-office-preview",type:"command",...t},"*")},z=()=>{try{return x.value?.contentWindow||null}catch{return null}},A=t=>{const e=Number(t?.total||0);C.value=e,S.value=e>0?Number(t?.index||0):-1,e===0&&u.value&&U.warning("未找到匹配内容")},xe=t=>{const e=t?.adtecFileViewAdapter;if(e?.zoom)try{return e.zoom(n.value),!0}catch{}try{const a=t?.document?.documentElement;if(a){const l=Math.max(se,Math.min(ne,n.value));return a.style.zoom=String(l),a.style.width=`${100/l}%`,a.style.height=`${100/l}%`,!0}}catch{}return!1},F=()=>{!f.value&&xe(z())||b({command:"zoom",scale:n.value})},K=()=>{n.value=ie(n.value+ce),F()},Y=()=>{n.value=ie(n.value-ce),F()},G=()=>{n.value=1,F()};let i={query:"",matches:[],index:-1};const Ee=(t,e)=>{const a=[],l=t.body;if(!l)return a;const r=e.toLocaleLowerCase(),w=t.createTreeWalker(l,NodeFilter.SHOW_TEXT,{acceptNode:m=>{const y=m.parentElement;return!y||!m.nodeValue||!m.nodeValue.trim()||y.closest("script, style, noscript, input, textarea, #wm_div_id")?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT}});let p=w.nextNode();for(;p;){const m=p.nodeValue?.toLocaleLowerCase()||"";let y=m.indexOf(r);for(;y!==-1;)a.push({node:p,start:y,end:y+e.length}),y=m.indexOf(r,y+Math.max(1,e.length));p=w.nextNode()}return a},Se=(t,e,a)=>{const l=t?.document;if(!l?.body)return null;(a==="first"||i.query!==e)&&(i={query:e,matches:Ee(l,e),index:-1});const r=i.matches.length;if(r===0)return{total:0,index:-1};a==="prev"?i.index=(i.index-1+r)%r:i.index=(i.index+1)%r;const w=i.matches[i.index];try{const p=l.createRange();p.setStart(w.node,w.start),p.setEnd(w.node,w.end);const m=t?.getSelection?.();m?.removeAllRanges(),m?.addRange(p),w.node.parentElement?.scrollIntoView({block:"center",behavior:"smooth"})}catch{}return{total:r,index:i.index}},Z=t=>{const e=u.value;if(!e)return;const a=z(),l=a?.adtecFileViewAdapter;if(l?.search)try{const r=l.search(e,t);r&&typeof r.then=="function"?r.then(A):A(r);return}catch{}if(!f.value){const r=Se(a,e,t);if(r){A(r);return}}b({command:"search",query:e,direction:t})},Ce=()=>{i={query:"",matches:[],index:-1};const t=z(),e=t?.adtecFileViewAdapter;if(e?.clearSearch)try{e.clearSearch();return}catch{}if(!f.value)try{t?.getSelection?.()?.removeAllRanges()}catch{}b({command:"clear-search"})},Ie=t=>{const e=t.trim();if(u.value=e,S.value=-1,C.value=0,!e){ee();return}if(f.value){U.warning("当前预览服务不支持内容搜索,请下载后查看");return}Z("first")},ee=()=>{u.value="",S.value=-1,C.value=0,Ce()},Ne=()=>{u.value&&Z("prev")},Fe=()=>{u.value&&Z("next")},te=t=>{if(!(t.source!==x.value?.contentWindow||t.data?.source!=="adtec-fileview")){if(t.data.type==="ready"){I.value=!0,f.value=!1,F();return}if(t.data.type==="search-result"){const e=Number(t.data.total||0);C.value=e,S.value=e>0?Number(t.data.index||0):-1,e===0&&u.value&&U.warning("未找到匹配内容")}}},O=new Set,Be=()=>{const t=x.value;if(!t)return null;try{const e=t.contentWindow;if(e?.parent&&e.parent!==e)return e.parent}catch{}return null},V=()=>{[window,Be()].forEach(e=>{if(!(!e||O.has(e)))try{e.addEventListener("message",te),O.add(e)}catch{}})},Le=()=>{O.forEach(t=>{try{t.removeEventListener("message",te)}catch{}}),O.clear()},oe=async()=>{const t=++R;if(g.value="",E.value=!1,h.value=!1,M.value="",n.value=1,u.value="",S.value=-1,C.value=0,I.value=!1,f.value=!1,o.attachmentLost){h.value=!0,v("error");return}E.value=!0;try{if(o.fileId){const e=await le.createPreviewSession(o.fileId);if(t!==R)return;g.value=e.url;return}if(o.url.startsWith("/api/doc/preview/fileView/")){g.value=o.url;return}throw new Error("为保护附件地址,旧版文件直链已停止预览,请使用附件 ID 打开")}catch(e){if(t!==R)return;E.value=!1,h.value=!0,M.value=e?.msg||e?.message||"文件预览失败,请下载后查看",v("error",e)}},ae=()=>{oe()},Me=()=>{v("refresh"),!o.deferRefresh&&ae()},W=async(t="watermark")=>{if(v("download",t),!!o.fileId){P.value=!0;try{await qe(o.fileId,o.fileName,t)}catch(e){$e.messageError(e)}finally{P.value=!1}}},Re=()=>{E.value=!1,V();const t=x.value?.contentWindow;if(t&&!I.value)try{t.adtecPreviewBridge&&(I.value=!0,f.value=!1)}catch{}I.value||window.setTimeout(()=>{I.value||(f.value=!0)},1500),F(),v("loaded")},ke=t=>{E.value=!1,h.value=!0,M.value="文件预览服务暂不可用,请稍后重试或下载后查看",v("error",t)};return H(()=>[o.fileId,o.url,o.attachmentLost],()=>void oe(),{immediate:!0}),H(g,t=>{t&&Pe(()=>V())}),H(()=>[o.fileId,o.showDownload],()=>void we(),{immediate:!0}),Te(()=>V()),be(()=>{R++,Le()}),de({reloadPreview:ae,zoomIn:K,zoomOut:Y,resetZoom:G,download:W}),(t,e)=>(N(),_("div",{class:ze(["office-preview-root",{"is-fullscreen":c.fullscreen}])},[c.showHeader?(N(),$(Qe,{key:0,title:X.value,"title-only":!j.value,zoom:n.value,"search-query":u.value,"search-index":S.value,"search-total":C.value,"show-search":j.value,"show-page-nav":!1,"show-zoom":ve.value,"show-download":c.showDownload,"download-actions":T.value,"show-refresh":c.showRefresh,"show-fullscreen":c.showFullscreen,"show-close":c.showClose,fullscreen:c.fullscreen,"download-loading":pe.value,"refresh-loading":c.refreshLoading,"min-zoom":D(se),"max-zoom":D(ne),onZoomIn:K,onZoomOut:Y,onZoomReset:G,onSearch:Ie,onSearchClear:ee,onSearchPrev:Ne,onSearchNext:Fe,onDownload:W,onRefresh:Me,onToggleFullscreen:e[0]||(e[0]=a=>v("toggle-fullscreen")),onClose:e[1]||(e[1]=a=>v("close"))},null,8,["title","title-only","zoom","search-query","search-index","search-total","show-search","show-zoom","show-download","download-actions","show-refresh","show-fullscreen","show-close","fullscreen","download-loading","refresh-loading","min-zoom","max-zoom"])):B("v-if",!0),B(` 外层加载层与预览页内层样式完全一致(spinner + 正在加载文件... + 进度条),
2
+ 切换时淡出过渡,避免 spinner 相位/进度条状态差异造成的跳动 `),L("div",Je,[Ae(Ze,{name:"preview-loading-fade"},{default:q(()=>[E.value?(N(),_("div",Ke,[...e[3]||(e[3]=[L("div",{class:"preview-loading-spinner"},null,-1),L("div",{class:"preview-loading-text"},"正在加载文件...",-1),L("div",{class:"preview-loading-progress"},[L("div",{class:"preview-loading-bar is-indeterminate"})],-1)])])):B("v-if",!0)]),_:1}),g.value&&!h.value?(N(),_("iframe",{key:g.value,ref_key:"previewFrameRef",ref:x,class:"fileview-frame",style:Ve(ge.value),src:g.value,title:X.value||"文件预览",referrerpolicy:"same-origin",onLoad:Re,onError:ke},null,44,Ye)):h.value?(N(),$(D(He),{key:1,description:me.value},{default:q(()=>[T.value.length?(N(),$(D(_e),{key:0,type:"primary",onClick:e[2]||(e[2]=a=>W(T.value[0]))},{default:q(()=>[...e[4]||(e[4]=[We(" 下载 ",-1)])]),_:1})):B("v-if",!0)]),_:1},8,["description"])):B("v-if",!0)])],2))}}),Ft=je(Ge,[["__scopeId","data-v-349383c2"]]);export{Ft as default};
@@ -11,8 +11,12 @@ type __VLS_Props = {
11
11
  showPageNav?: boolean;
12
12
  showZoom?: boolean;
13
13
  showDownload?: boolean;
14
- /** 是否提供“下载原始文件 / 下载 PDF”的下载菜单(Office 类附件) */
15
- pdfExport?: boolean;
14
+ /**
15
+ * 允许的下载动作(后端按“文档类型 + 用户角色/用户”解析):
16
+ * raw=下载原件(无水印)、watermark=下载(带水印)、pdf=下载 PDF。
17
+ * 多个动作渲染成下载菜单,只有一个时渲染成单个下载按钮,为空则不显示下载入口。
18
+ */
19
+ downloadActions?: string[];
16
20
  showRefresh?: boolean;
17
21
  showFullscreen?: boolean;
18
22
  showClose?: boolean;
@@ -28,7 +32,7 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
28
32
  "zoom-in": () => any;
29
33
  "zoom-out": () => any;
30
34
  "zoom-reset": () => any;
31
- download: (format: string) => any;
35
+ download: (action: string) => any;
32
36
  refresh: () => any;
33
37
  "toggle-fullscreen": () => any;
34
38
  "page-prev": () => any;
@@ -42,7 +46,7 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
42
46
  "onZoom-in"?: (() => any) | undefined;
43
47
  "onZoom-out"?: (() => any) | undefined;
44
48
  "onZoom-reset"?: (() => any) | undefined;
45
- onDownload?: ((format: string) => any) | undefined;
49
+ onDownload?: ((action: string) => any) | undefined;
46
50
  onRefresh?: (() => any) | undefined;
47
51
  "onToggle-fullscreen"?: (() => any) | undefined;
48
52
  "onPage-prev"?: (() => any) | undefined;
@@ -65,7 +69,7 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
65
69
  showPageNav: boolean;
66
70
  showZoom: boolean;
67
71
  showDownload: boolean;
68
- pdfExport: boolean;
72
+ downloadActions: string[];
69
73
  showRefresh: boolean;
70
74
  showFullscreen: boolean;
71
75
  downloadLoading: boolean;
@@ -1,3 +1,3 @@
1
- import{defineComponent as Z,ref as F,computed as T,watch as D,resolveComponent as y,openBlock as n,createElementBlock as r,normalizeClass as V,toDisplayString as c,createCommentVNode as u,createVNode as l,unref as o,withCtx as a,createElementVNode as f,Fragment as C,createBlock as b,createTextVNode as x}from"vue";import{ArrowUp as E,ArrowDown as I,ArrowLeft as N,ArrowRight as R,ZoomOut as S,ZoomIn as A,RefreshRight as M,Loading as v,Download as B,Refresh as Q,Close as P,FullScreen as H}from"@element-plus/icons-vue";import{ElIcon as s}from"element-plus";import{MAX_PDF_ZOOM as U,MIN_OFFICE_ZOOM as X}from"../../utils/officePreviewUtil.js";import{_ as j}from"../../../chunks/_plugin-vue_export-helper-DlAUqK2U.js";const q=["title"],G={key:1,class:"header-search"},J={key:0,class:"search-count"},K={class:"header-actions"},W=["disabled"],Y={class:"page-label"},_=["disabled"],ee=["disabled"],te={class:"zoom-label"},oe=["disabled"],le=["disabled"],ne=["disabled"],ae=["disabled"],de=["title"],se=Z({__name:"OfficePreviewHeaderBar",props:{title:{default:""},titleOnly:{type:Boolean,default:!1},zoom:{default:1},currentPage:{default:1},totalPages:{default:0},searchQuery:{default:""},searchIndex:{default:-1},searchTotal:{default:0},showSearch:{type:Boolean,default:!0},showPageNav:{type:Boolean,default:!0},showZoom:{type:Boolean,default:!0},showDownload:{type:Boolean,default:!1},pdfExport:{type:Boolean,default:!1},showRefresh:{type:Boolean,default:!1},showFullscreen:{type:Boolean,default:!1},showClose:{type:Boolean,default:!1},fullscreen:{type:Boolean,default:!1},downloadLoading:{type:Boolean,default:!1},refreshLoading:{type:Boolean,default:!1},minZoom:{default:X},maxZoom:{default:U}},emits:["zoom-in","zoom-out","zoom-reset","download","refresh","toggle-fullscreen","close","page-prev","page-next","search","search-clear","search-prev","search-next"],setup(e,{emit:z}){const w=e,i=z,m=F(w.searchQuery),$=T(()=>Math.round(w.zoom*100));D(()=>w.searchQuery,g=>{m.value=g});const h=()=>{i("search",m.value.trim())};return(g,t)=>{const L=y("el-search-input"),k=y("el-dropdown-item"),p=y("el-dropdown-menu"),O=y("el-dropdown");return n(),r("div",{class:V(["office-preview-header",{"is-title-only":e.titleOnly}])},[e.title?(n(),r("div",{key:0,class:"header-title",title:e.title},c(e.title),9,q)):u("v-if",!0),e.showSearch?(n(),r("div",G,[l(L,{modelValue:m.value,"onUpdate:modelValue":t[0]||(t[0]=d=>m.value=d),class:"search-input",clearable:"",placeholder:"搜索文档内容",panel:!1,"action-tip":"查找",onSearch:h,onChange:h,onClear:t[1]||(t[1]=d=>i("search-clear"))},null,8,["modelValue"]),e.searchTotal>0?(n(),r("span",J,c(e.searchIndex+1)+"/"+c(e.searchTotal),1)):u("v-if",!0),e.searchTotal>0?(n(),r("button",{key:1,class:"toolbar-btn",type:"button",title:"上一处",onClick:t[2]||(t[2]=d=>i("search-prev"))},[l(o(s),null,{default:a(()=>[l(o(E))]),_:1})])):u("v-if",!0),e.searchTotal>0?(n(),r("button",{key:2,class:"toolbar-btn",type:"button",title:"下一处",onClick:t[3]||(t[3]=d=>i("search-next"))},[l(o(s),null,{default:a(()=>[l(o(I))]),_:1})])):u("v-if",!0)])):u("v-if",!0),f("div",K,[e.showPageNav&&e.totalPages>0?(n(),r(C,{key:0},[f("button",{class:"toolbar-btn",type:"button",title:"上一页",disabled:e.currentPage<=1,onClick:t[4]||(t[4]=d=>i("page-prev"))},[l(o(s),null,{default:a(()=>[l(o(N))]),_:1})],8,W),f("span",Y,c(e.currentPage)+" / "+c(e.totalPages),1),f("button",{class:"toolbar-btn",type:"button",title:"下一页",disabled:e.currentPage>=e.totalPages,onClick:t[5]||(t[5]=d=>i("page-next"))},[l(o(s),null,{default:a(()=>[l(o(R))]),_:1})],8,_),t[14]||(t[14]=f("span",{class:"toolbar-divider"},null,-1))],64)):u("v-if",!0),e.showZoom?(n(),r(C,{key:1},[f("button",{class:"toolbar-btn",type:"button",title:"缩小",disabled:e.zoom<=e.minZoom,onClick:t[6]||(t[6]=d=>i("zoom-out"))},[l(o(s),null,{default:a(()=>[l(o(S))]),_:1})],8,ee),f("span",te,c($.value)+"%",1),f("button",{class:"toolbar-btn",type:"button",title:"放大",disabled:e.zoom>=e.maxZoom,onClick:t[7]||(t[7]=d=>i("zoom-in"))},[l(o(s),null,{default:a(()=>[l(o(A))]),_:1})],8,oe),f("button",{class:"toolbar-btn",type:"button",title:"重置缩放",onClick:t[8]||(t[8]=d=>i("zoom-reset"))},[l(o(s),null,{default:a(()=>[l(o(M))]),_:1})]),t[15]||(t[15]=f("span",{class:"toolbar-divider"},null,-1))],64)):u("v-if",!0),u(` 下载菜单不 Teleport:预览浮层(FileView 90% 遮罩)与全屏/全屏兜底都会把
1
+ import{defineComponent as A,computed as B,ref as F,watch as I,resolveComponent as h,openBlock as a,createElementBlock as r,normalizeClass as N,toDisplayString as b,createCommentVNode as u,createVNode as o,unref as l,withCtx as d,createElementVNode as f,Fragment as g,createBlock as c,renderList as V,createTextVNode as p}from"vue";import{ArrowUp as S,ArrowDown as M,ArrowLeft as R,ArrowRight as E,ZoomOut as Q,ZoomIn as H,RefreshRight as U,Loading as k,Download as P,Refresh as W,Close as x,FullScreen as X}from"@element-plus/icons-vue";import{ElIcon as s}from"element-plus";import{MAX_PDF_ZOOM as j,MIN_OFFICE_ZOOM as q}from"../../utils/officePreviewUtil.js";import{_ as G}from"../../../chunks/_plugin-vue_export-helper-DlAUqK2U.js";const J=["title"],K={key:1,class:"header-search"},Y={key:0,class:"search-count"},_={class:"header-actions"},ee=["disabled"],te={class:"page-label"},le=["disabled"],oe=["disabled"],ae={class:"zoom-label"},ne=["disabled"],de=["disabled"],se=["title","disabled"],ie=["disabled"],re=["title"],ue=A({__name:"OfficePreviewHeaderBar",props:{title:{default:""},titleOnly:{type:Boolean,default:!1},zoom:{default:1},currentPage:{default:1},totalPages:{default:0},searchQuery:{default:""},searchIndex:{default:-1},searchTotal:{default:0},showSearch:{type:Boolean,default:!0},showPageNav:{type:Boolean,default:!0},showZoom:{type:Boolean,default:!0},showDownload:{type:Boolean,default:!1},downloadActions:{default:()=>[]},showRefresh:{type:Boolean,default:!1},showFullscreen:{type:Boolean,default:!1},showClose:{type:Boolean,default:!1},fullscreen:{type:Boolean,default:!1},downloadLoading:{type:Boolean,default:!1},refreshLoading:{type:Boolean,default:!1},minZoom:{default:q},maxZoom:{default:j}},emits:["zoom-in","zoom-out","zoom-reset","download","refresh","toggle-fullscreen","close","page-prev","page-next","search","search-clear","search-prev","search-next"],setup(e,{emit:z}){const y=e,L=[{action:"raw",label:"下载原件(无水印)"},{action:"watermark",label:"下载"},{action:"pdf",label:"下载 PDF"}],m=B(()=>L.filter(v=>y.downloadActions.includes(v.action))),i=z,w=F(y.searchQuery),O=B(()=>Math.round(y.zoom*100));I(()=>y.searchQuery,v=>{w.value=v});const C=()=>{i("search",w.value.trim())};return(v,t)=>{const $=h("el-search-input"),D=h("el-dropdown-item"),T=h("el-dropdown-menu"),Z=h("el-dropdown");return a(),r("div",{class:N(["office-preview-header",{"is-title-only":e.titleOnly}])},[e.title?(a(),r("div",{key:0,class:"header-title",title:e.title},b(e.title),9,J)):u("v-if",!0),e.showSearch?(a(),r("div",K,[o($,{modelValue:w.value,"onUpdate:modelValue":t[0]||(t[0]=n=>w.value=n),class:"search-input",clearable:"",placeholder:"搜索文档内容",panel:!1,"action-tip":"查找",onSearch:C,onChange:C,onClear:t[1]||(t[1]=n=>i("search-clear"))},null,8,["modelValue"]),e.searchTotal>0?(a(),r("span",Y,b(e.searchIndex+1)+"/"+b(e.searchTotal),1)):u("v-if",!0),e.searchTotal>0?(a(),r("button",{key:1,class:"toolbar-btn",type:"button",title:"上一处",onClick:t[2]||(t[2]=n=>i("search-prev"))},[o(l(s),null,{default:d(()=>[o(l(S))]),_:1})])):u("v-if",!0),e.searchTotal>0?(a(),r("button",{key:2,class:"toolbar-btn",type:"button",title:"下一处",onClick:t[3]||(t[3]=n=>i("search-next"))},[o(l(s),null,{default:d(()=>[o(l(M))]),_:1})])):u("v-if",!0)])):u("v-if",!0),f("div",_,[e.showPageNav&&e.totalPages>0?(a(),r(g,{key:0},[f("button",{class:"toolbar-btn",type:"button",title:"上一页",disabled:e.currentPage<=1,onClick:t[4]||(t[4]=n=>i("page-prev"))},[o(l(s),null,{default:d(()=>[o(l(R))]),_:1})],8,ee),f("span",te,b(e.currentPage)+" / "+b(e.totalPages),1),f("button",{class:"toolbar-btn",type:"button",title:"下一页",disabled:e.currentPage>=e.totalPages,onClick:t[5]||(t[5]=n=>i("page-next"))},[o(l(s),null,{default:d(()=>[o(l(E))]),_:1})],8,le),t[14]||(t[14]=f("span",{class:"toolbar-divider"},null,-1))],64)):u("v-if",!0),e.showZoom?(a(),r(g,{key:1},[f("button",{class:"toolbar-btn",type:"button",title:"缩小",disabled:e.zoom<=e.minZoom,onClick:t[6]||(t[6]=n=>i("zoom-out"))},[o(l(s),null,{default:d(()=>[o(l(Q))]),_:1})],8,oe),f("span",ae,b(O.value)+"%",1),f("button",{class:"toolbar-btn",type:"button",title:"放大",disabled:e.zoom>=e.maxZoom,onClick:t[7]||(t[7]=n=>i("zoom-in"))},[o(l(s),null,{default:d(()=>[o(l(H))]),_:1})],8,ne),f("button",{class:"toolbar-btn",type:"button",title:"重置缩放",onClick:t[8]||(t[8]=n=>i("zoom-reset"))},[o(l(s),null,{default:d(()=>[o(l(U))]),_:1})]),t[15]||(t[15]=f("span",{class:"toolbar-divider"},null,-1))],64)):u("v-if",!0),u(` 下载菜单不 Teleport:预览浮层(FileView 90% 遮罩)与全屏/全屏兜底都会把
2
2
  Element Plus 浮层(默认 z-index 2000 起)压在下面,Teleport 到 body 后菜单会被遮住,
3
- 表现为“点下载没反应”。留在预览容器内即可跟随容器层级,全屏时也仍在视口内。 `),e.showDownload&&e.pdfExport?(n(),b(O,{key:2,trigger:"click",teleported:!1,disabled:e.downloadLoading,onCommand:t[9]||(t[9]=d=>i("download",d))},{dropdown:a(()=>[l(p,null,{default:a(()=>[l(k,{command:"original"},{default:a(()=>[...t[16]||(t[16]=[x("下载原始文件",-1)])]),_:1}),l(k,{command:"pdf"},{default:a(()=>[...t[17]||(t[17]=[x("下载 PDF",-1)])]),_:1})]),_:1})]),default:a(()=>[f("button",{class:"toolbar-btn",type:"button",title:"下载",disabled:e.downloadLoading},[e.downloadLoading?(n(),b(o(s),{key:0,class:"is-loading"},{default:a(()=>[l(o(v))]),_:1})):(n(),b(o(s),{key:1},{default:a(()=>[l(o(B))]),_:1}))],8,le)]),_:1},8,["disabled"])):e.showDownload?(n(),r("button",{key:3,class:"toolbar-btn",type:"button",title:"下载",disabled:e.downloadLoading,onClick:t[10]||(t[10]=d=>i("download","original"))},[e.downloadLoading?(n(),b(o(s),{key:0,class:"is-loading"},{default:a(()=>[l(o(v))]),_:1})):(n(),b(o(s),{key:1},{default:a(()=>[l(o(B))]),_:1}))],8,ne)):u("v-if",!0),e.showRefresh?(n(),r("button",{key:4,class:"toolbar-btn",type:"button",title:"刷新附件",disabled:e.refreshLoading,onClick:t[11]||(t[11]=d=>i("refresh"))},[e.refreshLoading?(n(),b(o(s),{key:0,class:"is-loading"},{default:a(()=>[l(o(v))]),_:1})):(n(),b(o(s),{key:1},{default:a(()=>[l(o(Q))]),_:1}))],8,ae)):u("v-if",!0),e.showFullscreen?(n(),r("button",{key:5,class:"toolbar-btn",type:"button",title:e.fullscreen?"退出全屏":"全屏",onClick:t[12]||(t[12]=d=>i("toggle-fullscreen"))},[l(o(s),null,{default:a(()=>[e.fullscreen?(n(),b(o(P),{key:0})):(n(),b(o(H),{key:1}))]),_:1})],8,de)):u("v-if",!0),e.showClose?(n(),r("button",{key:6,class:"toolbar-btn toolbar-btn--close",type:"button",title:"关闭",onClick:t[13]||(t[13]=d=>i("close"))},[l(o(s),null,{default:a(()=>[l(o(P))]),_:1})])):u("v-if",!0)])],2)}}}),ce=j(se,[["__scopeId","data-v-24950265"]]);export{ce as default};
3
+ 表现为“点下载没反应”。留在预览容器内即可跟随容器层级,全屏时也仍在视口内。 `),e.showDownload&&m.value.length>1?(a(),c(Z,{key:2,trigger:"click",teleported:!1,disabled:e.downloadLoading,onCommand:t[9]||(t[9]=n=>i("download",n))},{dropdown:d(()=>[o(T,null,{default:d(()=>[(a(!0),r(g,null,V(m.value,n=>(a(),c(D,{key:n.action,command:n.action},{default:d(()=>[p(b(n.label),1)]),_:2},1032,["command"]))),128))]),_:1})]),default:d(()=>[f("button",{class:"toolbar-btn",type:"button",title:"下载",disabled:e.downloadLoading},[e.downloadLoading?(a(),c(l(s),{key:0,class:"is-loading"},{default:d(()=>[o(l(k))]),_:1})):(a(),c(l(s),{key:1},{default:d(()=>[o(l(P))]),_:1}))],8,de)]),_:1},8,["disabled"])):e.showDownload&&m.value.length===1?(a(),r("button",{key:3,class:"toolbar-btn",type:"button",title:m.value[0].label,disabled:e.downloadLoading,onClick:t[10]||(t[10]=n=>i("download",m.value[0].action))},[e.downloadLoading?(a(),c(l(s),{key:0,class:"is-loading"},{default:d(()=>[o(l(k))]),_:1})):(a(),c(l(s),{key:1},{default:d(()=>[o(l(P))]),_:1}))],8,se)):u("v-if",!0),e.showRefresh?(a(),r("button",{key:4,class:"toolbar-btn",type:"button",title:"刷新附件",disabled:e.refreshLoading,onClick:t[11]||(t[11]=n=>i("refresh"))},[e.refreshLoading?(a(),c(l(s),{key:0,class:"is-loading"},{default:d(()=>[o(l(k))]),_:1})):(a(),c(l(s),{key:1},{default:d(()=>[o(l(W))]),_:1}))],8,ie)):u("v-if",!0),e.showFullscreen?(a(),r("button",{key:5,class:"toolbar-btn",type:"button",title:e.fullscreen?"退出全屏":"全屏",onClick:t[12]||(t[12]=n=>i("toggle-fullscreen"))},[o(l(s),null,{default:d(()=>[e.fullscreen?(a(),c(l(x),{key:0})):(a(),c(l(X),{key:1}))]),_:1})],8,re)):u("v-if",!0),e.showClose?(a(),r("button",{key:6,class:"toolbar-btn toolbar-btn--close",type:"button",title:"关闭",onClick:t[13]||(t[13]=n=>i("close"))},[o(l(s),null,{default:d(()=>[o(l(x))]),_:1})])):u("v-if",!0)])],2)}}}),we=G(ue,[["__scopeId","data-v-0bd340ec"]]);export{we as default};
@@ -1,10 +1,10 @@
1
- import{defineComponent as tt,useModel as st,ref as S,computed as w,onMounted as ot,onBeforeUnmount as nt,resolveComponent as T,resolveDirective as at,openBlock as n,createElementBlock as r,createCommentVNode as l,createBlock as b,Teleport as rt,unref as C,toDisplayString as d,withDirectives as lt,normalizeStyle as Ie,normalizeClass as O,createElementVNode as c,Fragment as k,renderList as B,createVNode as K,createTextVNode as x,renderSlot as it,resolveDynamicComponent as ct,mergeProps as dt,withCtx as $,mergeModels as Te,nextTick as ut}from"vue";import{ElMessageBox as pt,ElMessage as ft}from"element-plus";import j from"../../api/workflow/workflowInstApi.js";import kt from"../../api/DocumentApi.js";import mt from"../../hooks/useFileView.js";import vt from"../../hooks/useDictHooks.js";import be from"../../utils/FrameworkUtils.js";import wt from"../../hooks/useWorkflowSnapshot.js";import{parseDateTime as ee,formatDateTime as te}from"../../utils/dateTime.js";import{formatStayDuration as se,resolveTimeoutMeta as yt}from"../../utils/flowTimeout.js";import{userInfoStore as F}from"../../stores/userInfoStore.js";import _t from"./TaskOperation.vue.js";import{_ as ht}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/frontendBus.js";import"../../utils/globalLoading.js";import"../../utils/workflowTaskContext.js";import"../../config/GlobalLoadingConfig.js";import"../../api/SysDictCacheApi.js";import"../../stores/dictStore.js";import"pinia";import"../../utils/userSessionStorage.js";import"xlsx-js-style";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 gt={key:0,class:"workflow-todo-shell__source-label"},It={class:"workflow-todo-shell__body dialog-content-fill"},Tt={key:0,class:"workflow-todo-shell__source-fallback"},bt={class:"wf-wait__icon"},Ct={key:0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},xt={class:"wf-wait__main"},Et={class:"wf-wait__title"},Nt={class:"wf-wait__sub"},Dt={key:0,class:"wf-wait__opinion"},St={key:1,class:"wf-wait__files"},Bt=["onClick"],Kt={key:0},Lt={key:1,class:"wf-progress-scroll"},Mt={class:"wf-progress-steps"},$t={class:"wf-progress-step__icon-wrap"},At={class:"wf-progress-step__icon"},Ot={key:0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"3","stroke-linecap":"round","stroke-linejoin":"round"},jt={key:4},Ft={class:"wf-progress-step__name"},Vt={class:"wf-progress-step__name-text"},Ut={class:"wf-progress-step__name-label"},Pt={key:0,class:"wf-progress-step__occurrence"},Wt={key:0,class:"workflow-todo-shell__record-occurrence"},Rt={key:1,class:"workflow-todo-shell__record-type"},zt={key:0,class:"workflow-todo-shell__record-user"},Ht={class:"workflow-todo-shell__record-person__name"},Qt={key:0,class:"workflow-todo-shell__comment"},qt={key:0,class:"workflow-todo-shell__record-files"},Gt=["onClick"],Yt={class:"workflow-todo-shell__record-person__name"},Jt={key:0,class:"workflow-todo-shell__comment"},Xt={key:1,class:"workflow-todo-shell__record-files"},Zt=["onClick"],es={class:"workflow-todo-shell__record-person__name"},ts={key:1,class:"workflow-todo-shell__footer"},Ce="__end__",ss=tt({__name:"WorkflowTodoShell",props:Te({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},withdrawEnabled:{type:Boolean,default:!1}},{loading:{type:Boolean,default:!1},loadingModifiers:{}}),emits:Te(["cancel","success"],["update:loading"]),setup(E,{expose:xe,emit:Ee}){const u=E,V=Ee,L=st(E,"loading"),v=S(),_=S(),W=S(),R=S(!1),{getDictTypeData:Ne}=vt(["SysFlowTimeout"]),De=e=>[...e].sort((t,s)=>(t.createTime||"").localeCompare(s.createTime||"")),z=w(()=>De([..._.value?.hisTasks||[],..._.value?.activeTasks||[]])),H=S({}),Q=mt().fileView,q=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?H.value[e]||[]:[],Se=async()=>{var t;const e=Array.from(new Set(z.value.map(s=>s.taskId).filter(s=>!!s)));if(e.length)try{const s=await kt.getUpLoadFilesByBussinessIds(e),o={};for(const i of s)i.businessId&&(o[t=i.businessId]||(o[t]=[])).push(i);H.value=o}catch{H.value={}}},G=w(()=>{const e=new Map;for(const t of z.value){const s=he(t),o=e.get(s);o?o.tasks.push(t):e.set(s,{taskName:t.taskName,taskDefKey:t.taskDefKey,parentExecutionId:t.parentExecutionId,tasks:[t],approvalType:t.approvalType})}return Array.from(e.values())}),U=w(()=>v.value?.procEndTime?!0:!!(_.value&&!(_.value.activeTasks||[]).length&&(_.value.hisTasks||[]).length)),Be=e=>/^#[0-9a-fA-F]{6}$/.test(e)?`${e}1f`:"var(--el-color-primary-light-9)",oe={ok:"var(--el-color-success)",warning:"var(--el-color-warning)",danger:"var(--el-color-danger)"},ne={ok:"var(--el-color-success-light-9)",warning:"var(--el-color-warning-light-9)",danger:"var(--el-color-danger-light-9)"},Ke=e=>e==="danger"?"danger":e==="warning"?"warning":"ok",ae=e=>e==="danger"?"close":e==="warning"?"back":"check",Le=e=>!e||e.startsWith("已")?e:`已${e}`,Y=w(()=>String(v.value?.finishedResult||"")==="terminate"||String(v.value?.processStatus||"")==="terminated"),J=w(()=>z.value.find(e=>!!u.taskId&&e.taskId===u.taskId)),re=e=>!!e?.assigneeId&&e.assigneeId===F().getUserInfo.userCode,Me=w(()=>{const e=F().getUserInfo.userCode;if(!e)return!1;const t=J.value;return t?.taskLocalVars?.firstTask?re(t):!t&&u.taskInfo?.startUserId===e}),$e=e=>{const t=(e?.commentList||[]).find(s=>String(s.type)!=="8");return String(t?.fullMessage||"").trim()},Ae=e=>{if(!e?.finishTime)return;const t=!!e.taskLocalVars?.firstTask,s=t?{label:"已提交",type:"success"}:fe[String((e.commentList||[]).find(A=>String(A.type)!=="8")?.type||"")]||{label:"已办",type:"success"},o=Ke(s.type),i=!!e.assigneeId&&e.assigneeId===F().getUserInfo.userCode,h=ee(e.createTime||"")?.getTime()??0,m=ee(e.finishTime||"")?.getTime()??0,g=h&&m?Math.max(m-h,0):0,y=Le(s.label);return{level:o,icon:ae(o),color:oe[o],weakColor:ne[o],title:`${i?"我的处理":e.assigneeName||"审批"}:${y}`,sub:[te(e.finishTime),g?`耗时 ${se(g)}`:""].filter(Boolean).join(" · "),opinion:t?"":$e(e),filesTaskId:t?"":e.taskId||"",ctText:e.taskName||"",ctLabel:"",ctKind:"node"}},le=()=>{const e=v.value,t=Y.value?"danger":"ok",s=Y.value?"流程已终止":"流程已办结",o=te(e?.procEndTime);return{level:t,icon:ae(t),color:oe[t],weakColor:ne[t],title:s,sub:o?`${o} ${Y.value?"已终止":"完成归档"}`:s,opinion:"",filesTaskId:"",ctText:"",ctLabel:"",ctKind:""}},ie=()=>{const e=_.value?.activeTasks||[],t=e.map(y=>ee(y.createTime||"")).filter(y=>!!y).sort((y,A)=>y.getTime()-A.getTime())[0];if(!t)return;const s=e[0],o=Array.from(new Set(e.map(y=>y.assigneeName).filter(y=>!!y))),i=s?.approvalType||"",h=i==="joint"||i==="all"?" · ":" / ",m=Math.max(Date.now()-t.getTime(),0),g=yt(Ne("SysFlowTimeout"),m);return{title:`当前等待:${s?.taskName||v.value?.taskName||"当前节点"} · ${o.length?o.join(h):"待分配"}`,sub:`已停留 ${se(m)}`,opinion:"",filesTaskId:"",ctText:se(m),ctLabel:g.level==="danger"?"超时风险":"等待中",ctKind:"stay",color:g.color||"var(--el-color-primary)",level:g.level,weakColor:Be(g.color),icon:"clock"}},p=w(()=>{const e=J.value;return Me.value?U.value?le():ie():e?.finishTime&&!e.taskLocalVars?.firstTask&&re(e)?Ae(e):U.value?le():ie()}),Oe=w(()=>{const e=[...G.value],t=new Set(e.map(o=>ce(o)));for(const o of _.value?.futureTasks||[]){const i=`${o.taskDefKey||o.taskName}-`;t.has(i)||e.push({taskName:o.taskName,taskDefKey:o.taskDefKey,tasks:[],assigneeNames:o.assigneeNames,approvalType:o.approvalType})}e.push({taskName:"结束",taskDefKey:Ce,tasks:[],isEnd:!0});const s=new Map;for(const o of e){const i=o.taskDefKey||o.taskName||"";i&&(o.occurrence=(s.get(i)||0)+1,s.set(i,o.occurrence))}return e}),ce=e=>`${e.taskDefKey||e.taskName}-${e.parentExecutionId||""}`,je={single:"或签",joint:"会签",all:"会签"},de=e=>je[e.approvalType||e.tasks[0]?.approvalType||""]||"",Fe=e=>(e.approvalType||e.tasks[0]?.approvalType||"")==="single",Ve=w(()=>{const e=J.value;if(!e?.finishTime)return;const t=F().getUserInfo.userCode;if(!(!t||e.assigneeId!==t))return e}),ue=e=>{const t=F().getUserInfo.userCode;if(!t)return"";const s=e.tasks.filter(i=>!!i.finishTime&&i.assigneeId===t);if(!s.length)return"";const o=Ve.value?.taskId;return o&&s.some(i=>i.taskId===o)?"entry":"other"},pe=e=>{const t=(e.assigneeNames||"").split(",").map(s=>s.trim()).filter(Boolean);return t.length?t:["待处理"]},fe={1:{label:"同意",type:"success"},2:{label:"退回",type:"warning"},3:{label:"驳回",type:"warning"},4:{label:"委派",type:"warning"},5:{label:"转办",type:"warning"},6:{label:"终止",type:"danger"},7:{label:"撤回",type:"info"},8:{label:"催办",type:"info"}},Ue=e=>te(e.finishTime||e.createTime),Pe={success:"var(--el-color-success)",warning:"var(--el-color-warning)",danger:"var(--el-color-danger)",primary:"var(--el-color-primary)"},We=e=>Pe[e]||"",D=e=>{if(e.isEnd)return U.value?{label:"已结束",type:"success",hollow:!0}:{label:"等待",type:"info",hollow:!0};if(!e.tasks.length)return{label:"等待",type:"info",hollow:!0};const t=e.tasks;if(t.some(i=>!i.finishTime))return{label:"进行中",type:"primary",hollow:!0};let s="已办",o="success";if(t.some(i=>i.taskLocalVars?.firstTask))s="提交";else{const i=[...t].sort((m,g)=>(g.finishTime||"").localeCompare(m.finishTime||""))[0]?.commentList?.[0],h=fe[i?.type||""];s=h?.label||"已办",o=h?.type||"success"}return{label:s,type:o,hollow:!0}},ke=e=>{const t=e.assigneeName||e.startUserName||"待处理";return e.finishTime?`${t} · ${Ue(e)}`:t},Re=e=>e.tasks.length?e.tasks.map(ke).join(" / "):pe(e).join(" / "),X=e=>e.tasks.map(t=>t.comment).filter(Boolean).join(" / "),me=w(()=>{const e=new Map,t=[];for(const s of G.value){const o=s.taskDefKey||s.taskName||"";if(!o)continue;const i=s.tasks.some(m=>!m.finishTime)?"process":D(s).type,h=e.get(o);if(h!==void 0){const m=t[h];m.occurrence=(m.occurrence||1)+1,m.parentExecutionId=s.parentExecutionId,m.status=i;continue}e.set(o,t.length),t.push({taskName:s.taskName,taskDefKey:s.taskDefKey,parentExecutionId:s.parentExecutionId,status:i,occurrence:1})}for(const s of _.value?.futureTasks||[]){const o=s.taskDefKey||s.taskName||"";if(!o)continue;const i=e.get(o);if(i!==void 0){t[i].status="wait";continue}e.set(o,t.length),t.push({taskName:s.taskName,taskDefKey:s.taskDefKey,status:"wait"})}return t.push({taskName:"结束",taskDefKey:Ce,status:U.value?"success":"wait"}),t}),ve=e=>{const t=F().getUserInfo.userCode;return!t||!e?!1:!!(e.assigneeId===t||e.candidate&&e.candidate.split(",").map(o=>o.trim()).filter(Boolean).includes(t))},ze=w(()=>ve(v.value)?!0:(_.value?.activeTasks||[]).some(e=>ve(e))),we=w(()=>u.readonly||!!v.value?.finishTime||!!v.value?.procEndTime||R.value&&!(_.value?.activeTasks||[]).length||!ze.value),Z=S(!1),ye=S(null),M=S(null);ot(()=>{const t=ye.value?.closest(".el-drawer, .el-dialog")?.querySelector(".dialog-hooks-header")??null;if(!t){M.value=null;return}const s=t.querySelector(".dialog-hooks-header-title"),o=document.createElement("span");o.style.display="contents",s?s.insertAdjacentElement("afterend",o):t.appendChild(o),M.value=o}),nt(()=>{const e=M.value;M.value=null,e?.remove()});const{snapshot:_e,dataSourceMeta:P,refresh:He}=wt(()=>String(u.taskInfo?.businessId||v.value?.businessId||""),{wfTaskId:()=>u.taskId,taskDefKey:()=>String(u.taskInfo?.taskDefKey||v.value?.taskDefKey||"")}),Qe=w(()=>we.value&&!!u.taskId&&(u.withdrawEnabled===!0||u.taskInfo?.withdrawEnabled===!0)),qe=async()=>{const e=u.taskInfo||v.value;if(!e?.taskId)return;const t={taskId:e.taskId,taskDefKey:e.taskDefKey,taskName:e.taskName,taskTitle:e.taskTitle,procInsId:e.procInsId,procDefId:e.procDefId,procDefKey:e.procDefKey,businessId:e.businessId};Z.value=!0;try{await j.processWithdrawalVerification(t);let s="";try{const o=await j.processWithdrawalPreview(t);s=String(o?.targetTaskName||"")}catch(o){console.warn("撤回预览失败",o)}await pt.confirm(`确认撤回「${e.taskTitle||e.taskName||"该申请单"}」?`+(s?`撤回后流程将回到「${s}」,需要重新提交。`:"撤回后需要重新提交。"),"撤回确认",{type:"warning",confirmButtonText:"确认撤回",cancelButtonText:"取消"}),await j.processWithdrawal(t),ft.success("撤回成功"),V("success",e),V("cancel")}catch(s){if(s==="cancel"||s==="close")return;be.messageError(s)}finally{Z.value=!1}},Ge=w(()=>W.value?.taskOption),Ye=w(()=>{const e=Ge.value;return{...e||{},cancelFunction:(...t)=>{e?.cancelFunction?.(...t),V("cancel")},workflowComplete:async(...t)=>{await e?.workflowComplete?.(...t)}}}),he=e=>`${e.taskDefKey||e.taskName}-${e.parentExecutionId||""}`,ge=async(e,t=!1)=>{const s=u.taskInfo&&u.taskInfo.procInsId==null&&u.taskInfo.processInstanceId!=null?{...u.taskInfo,procInsId:u.taskInfo.processInstanceId}:u.taskInfo;if(!(!u.taskId&&!s?.procInsId))try{L.value=!0,R.value=!1,v.value=e?{...v.value,...e}:t&&u.taskId?await j.getTaskInst(u.taskId):s||await j.getTaskInst(u.taskId),v.value?.procInsId&&(_.value=await j.getProcessTaskList(v.value.procInsId)),R.value=!0,await He(),await Se(),await ut(),await W.value?.resetQuery?.()}catch(o){be.messageError(o)}finally{L.value=!1}},Je=async e=>{V("success",e),await ge(e,!0)};return xe({resetQuery:async()=>{await ge()}}),(e,t)=>{const s=T("el-icons"),o=T("el-title"),i=T("el-empty"),h=T("el-tag-display"),m=T("el-flex"),g=T("el-timeline-item"),y=T("el-timeline"),A=T("el-button"),Xe=T("operation-auth"),Ze=at("loading");return n(),r("div",{ref_key:"shellEl",ref:ye,class:"workflow-todo-shell"},[l(`
1
+ import{defineComponent as st,useModel as ot,ref as S,computed as w,onMounted as nt,onBeforeUnmount as at,resolveComponent as T,resolveDirective as rt,openBlock as n,createElementBlock as r,createCommentVNode as l,createBlock as b,Teleport as lt,unref as C,toDisplayString as d,withDirectives as it,normalizeStyle as Ie,normalizeClass as O,createElementVNode as c,Fragment as k,renderList as B,createVNode as K,createTextVNode as x,renderSlot as ct,resolveDynamicComponent as dt,mergeProps as ut,withCtx as $,mergeModels as Te,nextTick as pt}from"vue";import{ElMessageBox as ft,ElMessage as kt}from"element-plus";import j from"../../api/workflow/workflowInstApi.js";import mt from"../../api/DocumentApi.js";import vt from"../../hooks/useFileView.js";import wt from"../../hooks/useDictHooks.js";import be from"../../utils/FrameworkUtils.js";import yt from"../../hooks/useWorkflowSnapshot.js";import{parseDateTime as te,formatDateTime as se}from"../../utils/dateTime.js";import{formatStayDuration as oe,resolveTimeoutMeta as _t}from"../../utils/flowTimeout.js";import{userInfoStore as F}from"../../stores/userInfoStore.js";import ht from"./TaskOperation.vue.js";import{_ as gt}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/frontendBus.js";import"../../utils/globalLoading.js";import"../../utils/workflowTaskContext.js";import"../../config/GlobalLoadingConfig.js";import"../../api/SysDictCacheApi.js";import"../../stores/dictStore.js";import"pinia";import"../../utils/userSessionStorage.js";import"xlsx-js-style";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 It={key:0,class:"workflow-todo-shell__source-label"},Tt={class:"workflow-todo-shell__body dialog-content-fill"},bt={key:0,class:"workflow-todo-shell__source-fallback"},Ct={class:"wf-wait__icon"},xt={key:0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},Et={class:"wf-wait__main"},Nt={class:"wf-wait__title"},Dt={class:"wf-wait__sub"},St={key:0,class:"wf-wait__opinion"},Bt={key:1,class:"wf-wait__files"},Kt=["onClick"],Lt={key:0},Mt={key:1,class:"wf-progress-scroll"},$t={class:"wf-progress-steps"},At={class:"wf-progress-step__icon-wrap"},Ot={class:"wf-progress-step__icon"},jt={key:0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"3","stroke-linecap":"round","stroke-linejoin":"round"},Ft={key:4},Vt={class:"wf-progress-step__name"},Ut={class:"wf-progress-step__name-text"},Pt={class:"wf-progress-step__name-label"},Wt={key:0,class:"wf-progress-step__occurrence"},Rt={key:0,class:"workflow-todo-shell__record-occurrence"},zt={key:1,class:"workflow-todo-shell__record-type"},Ht={key:0,class:"workflow-todo-shell__record-user"},Qt={class:"workflow-todo-shell__record-person__name"},qt={key:0,class:"workflow-todo-shell__comment"},Gt={key:0,class:"workflow-todo-shell__record-files"},Yt=["onClick"],Jt={class:"workflow-todo-shell__record-person__name"},Xt={key:0,class:"workflow-todo-shell__comment"},Zt={key:1,class:"workflow-todo-shell__record-files"},es=["onClick"],ts={class:"workflow-todo-shell__record-person__name"},ss={key:1,class:"workflow-todo-shell__footer"},Ce="__end__",os=st({__name:"WorkflowTodoShell",props:Te({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},withdrawEnabled:{type:Boolean,default:!1}},{loading:{type:Boolean,default:!1},loadingModifiers:{}}),emits:Te(["cancel","success"],["update:loading"]),setup(E,{expose:xe,emit:Ee}){const u=E,V=Ee,L=ot(E,"loading"),v=S(),_=S(),R=S(),z=S(!1),{getDictTypeData:Ne}=wt(["SysFlowTimeout"]),De=e=>[...e].sort((t,s)=>(t.createTime||"").localeCompare(s.createTime||"")),H=w(()=>De([..._.value?.hisTasks||[],..._.value?.activeTasks||[]])),Q=S({}),q=vt().fileView,G=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?Q.value[e]||[]:[],Se=async()=>{var t;const e=Array.from(new Set(H.value.map(s=>s.taskId).filter(s=>!!s)));if(e.length)try{const s=await mt.getUpLoadFilesByBussinessIds(e),o={};for(const i of s)i.businessId&&(o[t=i.businessId]||(o[t]=[])).push(i);Q.value=o}catch{Q.value={}}},Y=w(()=>{const e=new Map;for(const t of H.value){const s=he(t),o=e.get(s);o?o.tasks.push(t):e.set(s,{taskName:t.taskName,taskDefKey:t.taskDefKey,parentExecutionId:t.parentExecutionId,tasks:[t],approvalType:t.approvalType})}return Array.from(e.values())}),U=w(()=>v.value?.procEndTime?!0:!!(_.value&&!(_.value.activeTasks||[]).length&&(_.value.hisTasks||[]).length)),Be=e=>/^#[0-9a-fA-F]{6}$/.test(e)?`${e}1f`:"var(--el-color-primary-light-9)",ne={ok:"var(--el-color-success)",warning:"var(--el-color-warning)",danger:"var(--el-color-danger)"},ae={ok:"var(--el-color-success-light-9)",warning:"var(--el-color-warning-light-9)",danger:"var(--el-color-danger-light-9)"},Ke=e=>e==="danger"?"danger":e==="warning"?"warning":"ok",re=e=>e==="danger"?"close":e==="warning"?"back":"check",Le=e=>!e||e.startsWith("已")?e:`已${e}`,J=w(()=>String(v.value?.finishedResult||"")==="terminate"||String(v.value?.processStatus||"")==="terminated"),X=w(()=>H.value.find(e=>!!u.taskId&&e.taskId===u.taskId)),le=e=>!!e?.assigneeId&&e.assigneeId===F().getUserInfo.userCode,Me=w(()=>{const e=F().getUserInfo.userCode;if(!e)return!1;const t=X.value;return t?.taskLocalVars?.firstTask?le(t):!t&&u.taskInfo?.startUserId===e}),$e=e=>{const t=(e?.commentList||[]).find(s=>String(s.type)!=="8");return String(t?.fullMessage||"").trim()},Ae=e=>{if(!e?.finishTime)return;const t=!!e.taskLocalVars?.firstTask,s=t?{label:"已提交",type:"success"}:ke[String((e.commentList||[]).find(A=>String(A.type)!=="8")?.type||"")]||{label:"已办",type:"success"},o=Ke(s.type),i=!!e.assigneeId&&e.assigneeId===F().getUserInfo.userCode,h=te(e.createTime||"")?.getTime()??0,m=te(e.finishTime||"")?.getTime()??0,g=h&&m?Math.max(m-h,0):0,y=Le(s.label);return{level:o,icon:re(o),color:ne[o],weakColor:ae[o],title:`${i?"我的处理":e.assigneeName||"审批"}:${y}`,sub:[se(e.finishTime),g?`耗时 ${oe(g)}`:""].filter(Boolean).join(" · "),opinion:t?"":$e(e),filesTaskId:t?"":e.taskId||"",ctText:e.taskName||"",ctLabel:"",ctKind:"node"}},ie=()=>{const e=v.value,t=J.value?"danger":"ok",s=J.value?"流程已终止":"流程已办结",o=se(e?.procEndTime);return{level:t,icon:re(t),color:ne[t],weakColor:ae[t],title:s,sub:o?`${o} ${J.value?"已终止":"完成归档"}`:s,opinion:"",filesTaskId:"",ctText:"",ctLabel:"",ctKind:""}},ce=()=>{const e=_.value?.activeTasks||[],t=e.map(y=>te(y.createTime||"")).filter(y=>!!y).sort((y,A)=>y.getTime()-A.getTime())[0];if(!t)return;const s=e[0],o=Array.from(new Set(e.map(y=>y.assigneeName).filter(y=>!!y))),i=s?.approvalType||"",h=i==="joint"||i==="all"?" · ":" / ",m=Math.max(Date.now()-t.getTime(),0),g=_t(Ne("SysFlowTimeout"),m);return{title:`当前等待:${s?.taskName||v.value?.taskName||"当前节点"} · ${o.length?o.join(h):"待分配"}`,sub:`已停留 ${oe(m)}`,opinion:"",filesTaskId:"",ctText:oe(m),ctLabel:g.level==="danger"?"超时风险":"等待中",ctKind:"stay",color:g.color||"var(--el-color-primary)",level:g.level,weakColor:Be(g.color),icon:"clock"}},p=w(()=>{const e=X.value;return Me.value?U.value?ie():ce():e?.finishTime&&!e.taskLocalVars?.firstTask&&le(e)?Ae(e):U.value?ie():ce()}),Oe=w(()=>{const e=[...Y.value],t=new Set(e.map(o=>de(o)));for(const o of _.value?.futureTasks||[]){const i=`${o.taskDefKey||o.taskName}-`;t.has(i)||e.push({taskName:o.taskName,taskDefKey:o.taskDefKey,tasks:[],assigneeNames:o.assigneeNames,approvalType:o.approvalType})}e.push({taskName:"结束",taskDefKey:Ce,tasks:[],isEnd:!0});const s=new Map;for(const o of e){const i=o.taskDefKey||o.taskName||"";i&&(o.occurrence=(s.get(i)||0)+1,s.set(i,o.occurrence))}return e}),de=e=>`${e.taskDefKey||e.taskName}-${e.parentExecutionId||""}`,je={single:"或签",joint:"会签",all:"会签"},ue=e=>je[e.approvalType||e.tasks[0]?.approvalType||""]||"",Fe=e=>(e.approvalType||e.tasks[0]?.approvalType||"")==="single",Ve=w(()=>{const e=X.value;if(!e?.finishTime)return;const t=F().getUserInfo.userCode;if(!(!t||e.assigneeId!==t))return e}),pe=e=>{const t=F().getUserInfo.userCode;if(!t)return"";const s=e.tasks.filter(i=>!!i.finishTime&&i.assigneeId===t);if(!s.length)return"";const o=Ve.value?.taskId;return o&&s.some(i=>i.taskId===o)?"entry":"other"},fe=e=>{const t=(e.assigneeNames||"").split(",").map(s=>s.trim()).filter(Boolean);return t.length?t:["待处理"]},ke={1:{label:"同意",type:"success"},2:{label:"退回",type:"warning"},3:{label:"驳回",type:"warning"},4:{label:"委派",type:"warning"},5:{label:"转办",type:"warning"},6:{label:"终止",type:"danger"},7:{label:"撤回",type:"info"},8:{label:"催办",type:"info"}},Ue=e=>se(e.finishTime||e.createTime),Pe={success:"var(--el-color-success)",warning:"var(--el-color-warning)",danger:"var(--el-color-danger)",primary:"var(--el-color-primary)"},We=e=>Pe[e]||"",D=e=>{if(e.isEnd)return U.value?{label:"已结束",type:"success",hollow:!0}:{label:"等待",type:"info",hollow:!0};if(!e.tasks.length)return{label:"等待",type:"info",hollow:!0};const t=e.tasks;if(t.some(i=>!i.finishTime))return{label:"进行中",type:"primary",hollow:!0};let s="已办",o="success";if(t.some(i=>i.taskLocalVars?.firstTask))s="提交";else{const i=[...t].sort((m,g)=>(g.finishTime||"").localeCompare(m.finishTime||""))[0]?.commentList?.[0],h=ke[i?.type||""];s=h?.label||"已办",o=h?.type||"success"}return{label:s,type:o,hollow:!0}},me=e=>{const t=e.assigneeName||e.startUserName||"待处理";return e.finishTime?`${t} · ${Ue(e)}`:t},Re=e=>e.tasks.length?e.tasks.map(me).join(" / "):fe(e).join(" / "),Z=e=>e.tasks.map(t=>t.comment).filter(Boolean).join(" / "),ve=w(()=>{const e=new Map,t=[];for(const s of Y.value){const o=s.taskDefKey||s.taskName||"";if(!o)continue;const i=s.tasks.some(m=>!m.finishTime)?"process":D(s).type,h=e.get(o);if(h!==void 0){const m=t[h];m.occurrence=(m.occurrence||1)+1,m.parentExecutionId=s.parentExecutionId,m.status=i;continue}e.set(o,t.length),t.push({taskName:s.taskName,taskDefKey:s.taskDefKey,parentExecutionId:s.parentExecutionId,status:i,occurrence:1})}for(const s of _.value?.futureTasks||[]){const o=s.taskDefKey||s.taskName||"";if(!o)continue;const i=e.get(o);if(i!==void 0){t[i].status="wait";continue}e.set(o,t.length),t.push({taskName:s.taskName,taskDefKey:s.taskDefKey,status:"wait"})}return t.push({taskName:"结束",taskDefKey:Ce,status:U.value?"success":"wait"}),t}),we=e=>{const t=F().getUserInfo.userCode;return!t||!e?!1:!!(e.assigneeId===t||e.candidate&&e.candidate.split(",").map(o=>o.trim()).filter(Boolean).includes(t))},ze=w(()=>we(v.value)?!0:(_.value?.activeTasks||[]).some(e=>we(e))),P=w(()=>u.readonly||!!v.value?.finishTime||!!v.value?.procEndTime||z.value&&!(_.value?.activeTasks||[]).length||!ze.value),ee=S(!1),ye=S(null),M=S(null);nt(()=>{const t=ye.value?.closest(".el-drawer, .el-dialog")?.querySelector(".dialog-hooks-header")??null;if(!t){M.value=null;return}const s=t.querySelector(".dialog-hooks-header-title"),o=document.createElement("span");o.style.display="contents",s?s.insertAdjacentElement("afterend",o):t.appendChild(o),M.value=o}),at(()=>{const e=M.value;M.value=null,e?.remove()});const He=w(()=>P.value),{snapshot:_e,dataSourceMeta:W,refresh:Qe}=yt(()=>String(u.taskInfo?.businessId||v.value?.businessId||""),{wfTaskId:()=>u.taskId,taskDefKey:()=>String(u.taskInfo?.taskDefKey||v.value?.taskDefKey||""),readonly:()=>P.value,enabled:()=>He.value}),qe=w(()=>P.value&&!!u.taskId&&(u.withdrawEnabled===!0||u.taskInfo?.withdrawEnabled===!0)),Ge=async()=>{const e=u.taskInfo||v.value;if(!e?.taskId)return;const t={taskId:e.taskId,taskDefKey:e.taskDefKey,taskName:e.taskName,taskTitle:e.taskTitle,procInsId:e.procInsId,procDefId:e.procDefId,procDefKey:e.procDefKey,businessId:e.businessId};ee.value=!0;try{await j.processWithdrawalVerification(t);let s="";try{const o=await j.processWithdrawalPreview(t);s=String(o?.targetTaskName||"")}catch(o){console.warn("撤回预览失败",o)}await ft.confirm(`确认撤回「${e.taskTitle||e.taskName||"该申请单"}」?`+(s?`撤回后流程将回到「${s}」,需要重新提交。`:"撤回后需要重新提交。"),"撤回确认",{type:"warning",confirmButtonText:"确认撤回",cancelButtonText:"取消"}),await j.processWithdrawal(t),kt.success("撤回成功"),V("success",e),V("cancel")}catch(s){if(s==="cancel"||s==="close")return;be.messageError(s)}finally{ee.value=!1}},Ye=w(()=>R.value?.taskOption),Je=w(()=>{const e=Ye.value;return{...e||{},cancelFunction:(...t)=>{e?.cancelFunction?.(...t),V("cancel")},workflowComplete:async(...t)=>{await e?.workflowComplete?.(...t)}}}),he=e=>`${e.taskDefKey||e.taskName}-${e.parentExecutionId||""}`,ge=async(e,t=!1)=>{const s=u.taskInfo&&u.taskInfo.procInsId==null&&u.taskInfo.processInstanceId!=null?{...u.taskInfo,procInsId:u.taskInfo.processInstanceId}:u.taskInfo;if(!(!u.taskId&&!s?.procInsId))try{L.value=!0,z.value=!1,v.value=e?{...v.value,...e}:t&&u.taskId?await j.getTaskInst(u.taskId):s||await j.getTaskInst(u.taskId),v.value?.procInsId&&(_.value=await j.getProcessTaskList(v.value.procInsId)),z.value=!0,await Qe(),await Se(),await pt(),await R.value?.resetQuery?.()}catch(o){be.messageError(o)}finally{L.value=!1}},Xe=async e=>{V("success",e),await ge(e,!0)};return xe({resetQuery:async()=>{await ge()}}),(e,t)=>{const s=T("el-icons"),o=T("el-title"),i=T("el-empty"),h=T("el-tag-display"),m=T("el-flex"),g=T("el-timeline-item"),y=T("el-timeline"),A=T("el-button"),Ze=T("operation-auth"),et=rt("loading");return n(),r("div",{ref_key:"shellEl",ref:ye,class:"workflow-todo-shell"},[l(`
2
2
  内容区撑满剩余空间统一使用 dialog-content-fill(flex/height 由核心工具类提供),
3
3
  滚动仅保留在本内容区,底部操作栏固定不随内容滚动。
4
4
  `),l(`
5
5
  快照标记:Teleport 进「本抽屉」的标题栏(标题文字右侧),不修改 createDialogHooks;
6
6
  headerEl 由壳子在挂载时从自身所在抽屉里解析,多弹窗并存也不会串。
7
- `),M.value?(n(),b(rt,{key:0,to:M.value},[C(P)?(n(),r("span",gt,d(C(P).label),1)):l("v-if",!0)],8,["to"])):l("v-if",!0),lt((n(),r("div",It,[l(" 兜底:没有标题栏(非自定义 header 的弹窗)时,在内容区顶部显示 "),!M.value&&C(P)?(n(),r("div",Tt,d(C(P).label),1)):l("v-if",!0),l(`
7
+ `),M.value?(n(),b(lt,{key:0,to:M.value},[C(W)?(n(),r("span",It,d(C(W).label),1)):l("v-if",!0)],8,["to"])):l("v-if",!0),it((n(),r("div",Tt,[l(" 兜底:没有标题栏(非自定义 header 的弹窗)时,在内容区顶部显示 "),!M.value&&C(W)?(n(),r("div",bt,d(C(W).label),1)):l("v-if",!0),l(`
8
8
  数据来源标记(通用层统一判定,业务内容组件无需实现):
9
9
  命中快照时展示「快照 · 时间」;没有快照(展示业务当前数据)时不展示,避免噪音,
10
10
  放在内容区首行右对齐,紧贴标题栏,不随内容滚动位置变化而离开视线。
@@ -12,11 +12,11 @@ import{defineComponent as tt,useModel as st,ref as S,computed as w,onMounted as
12
12
  当前等待:参考 flowpilot 设计的时长梯度状态条。
13
13
  颜色与浅色底纹按 SysFlowTimeout 字典命中区间(正常 / 预警 / 超时)渲染,
14
14
  流程已结束(含终止)时不展示。
15
- `),p.value?(n(),r("div",{key:1,class:O(["wf-wait",p.value.level?`is-${p.value.level}`:""]),style:Ie({"--wf-wait-color":p.value.color,"--wf-wait-weak":p.value.weakColor})},[c("span",bt,[l(" 进行中:时钟 "),p.value.icon==="clock"?(n(),r("svg",Ct,[...t[3]||(t[3]=[c("circle",{cx:"12",cy:"12",r:"9"},null,-1),c("path",{d:"M12 8v4l3 3"},null,-1)])])):p.value.icon==="check"?(n(),r(k,{key:1},[l(" 已办结:对勾 "),t[4]||(t[4]=c("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2.4","stroke-linecap":"round","stroke-linejoin":"round"},[c("path",{d:"M20 6L9 17l-5-5"})],-1))],2112)):p.value.icon==="back"?(n(),r(k,{key:2},[l(" 驳回:回退箭头 "),t[5]||(t[5]=c("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[c("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)):(n(),r(k,{key:3},[l(" 已终止:叉 "),t[6]||(t[6]=c("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2.6","stroke-linecap":"round","stroke-linejoin":"round"},[c("path",{d:"M18 6L6 18"}),c("path",{d:"M6 6l12 12"})],-1))],2112))]),c("div",xt,[c("div",Et,d(p.value.title),1),c("div",Nt,d(p.value.sub),1),l(" 结束态:把该次审批的意见一并带出来,避免去审批记录里翻 "),p.value.opinion?(n(),r("div",Dt," 审核意见:"+d(p.value.opinion),1)):l("v-if",!0),l(" 该次审批的附件:与审批记录里的附件同样支持点击预览 "),p.value.filesTaskId&&N(p.value.filesTaskId).length?(n(),r("div",St,[(n(!0),r(k,null,B(N(p.value.filesTaskId),a=>(n(),r("span",{key:a.id,class:"wf-wait__file",onClick:f=>C(Q)(a.id)},[K(s,{"model-value":q(a.name)},null,8,["model-value"]),x(d(a.name),1)],8,Bt))),128))])):l("v-if",!0)]),p.value.ctText?(n(),r("div",{key:0,class:O(["wf-wait__ct",`is-${p.value.ctKind}`])},[c("b",null,d(p.value.ctText),1),p.value.ctLabel?(n(),r("span",Kt,d(p.value.ctLabel),1)):l("v-if",!0)],2)):l("v-if",!0)],6)):l("v-if",!0),K(o,{level:"1",title:"流程进度",style:{"border-bottom":"var(--border)"}}),c("div",null,[me.value.length?(n(),r("div",Lt,[c("div",Mt,[(n(!0),r(k,null,B(me.value,(a,f)=>(n(),r("div",{key:he(a),class:O(["wf-progress-step",{done:a.status==="success",current:a.status==="process",rejected:a.status==="warning",stopped:a.status==="error"||a.status==="danger"}])},[c("div",$t,[c("div",At,[l(" 同意/提交:对勾 "),a.status==="success"?(n(),r("svg",Ot,[...t[7]||(t[7]=[c("path",{d:"M20 6L9 17l-5-5"},null,-1)])])):a.status==="warning"?(n(),r(k,{key:1},[l(" 驳回:回退箭头 "),t[8]||(t[8]=c("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[c("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)):a.status==="danger"||a.status==="error"?(n(),r(k,{key:2},[l(" 终止:叉 "),t[9]||(t[9]=c("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"3","stroke-linecap":"round","stroke-linejoin":"round"},[c("path",{d:"M18 6L6 18"}),c("path",{d:"M6 6l12 12"})],-1))],2112)):a.status==="info"?(n(),r(k,{key:3},[l(" 撤回:撤销箭头 "),t[10]||(t[10]=c("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[c("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",jt,d(f+1),1))])]),c("div",Ft,[c("span",Vt,[c("span",Ut,d(a.taskName||"未命名节点"),1),a.occurrence&&a.occurrence>1?(n(),r("sup",Pt,d(a.occurrence),1)):l("v-if",!0)])])],2))),128))])])):(n(),b(i,{key:0,description:"暂无流程进度","image-size":48}))]),l(`
15
+ `),p.value?(n(),r("div",{key:1,class:O(["wf-wait",p.value.level?`is-${p.value.level}`:""]),style:Ie({"--wf-wait-color":p.value.color,"--wf-wait-weak":p.value.weakColor})},[c("span",Ct,[l(" 进行中:时钟 "),p.value.icon==="clock"?(n(),r("svg",xt,[...t[3]||(t[3]=[c("circle",{cx:"12",cy:"12",r:"9"},null,-1),c("path",{d:"M12 8v4l3 3"},null,-1)])])):p.value.icon==="check"?(n(),r(k,{key:1},[l(" 已办结:对勾 "),t[4]||(t[4]=c("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2.4","stroke-linecap":"round","stroke-linejoin":"round"},[c("path",{d:"M20 6L9 17l-5-5"})],-1))],2112)):p.value.icon==="back"?(n(),r(k,{key:2},[l(" 驳回:回退箭头 "),t[5]||(t[5]=c("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[c("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)):(n(),r(k,{key:3},[l(" 已终止:叉 "),t[6]||(t[6]=c("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2.6","stroke-linecap":"round","stroke-linejoin":"round"},[c("path",{d:"M18 6L6 18"}),c("path",{d:"M6 6l12 12"})],-1))],2112))]),c("div",Et,[c("div",Nt,d(p.value.title),1),c("div",Dt,d(p.value.sub),1),l(" 结束态:把该次审批的意见一并带出来,避免去审批记录里翻 "),p.value.opinion?(n(),r("div",St," 审核意见:"+d(p.value.opinion),1)):l("v-if",!0),l(" 该次审批的附件:与审批记录里的附件同样支持点击预览 "),p.value.filesTaskId&&N(p.value.filesTaskId).length?(n(),r("div",Bt,[(n(!0),r(k,null,B(N(p.value.filesTaskId),a=>(n(),r("span",{key:a.id,class:"wf-wait__file",onClick:f=>C(q)(a.id)},[K(s,{"model-value":G(a.name)},null,8,["model-value"]),x(d(a.name),1)],8,Kt))),128))])):l("v-if",!0)]),p.value.ctText?(n(),r("div",{key:0,class:O(["wf-wait__ct",`is-${p.value.ctKind}`])},[c("b",null,d(p.value.ctText),1),p.value.ctLabel?(n(),r("span",Lt,d(p.value.ctLabel),1)):l("v-if",!0)],2)):l("v-if",!0)],6)):l("v-if",!0),K(o,{level:"1",title:"流程进度",style:{"border-bottom":"var(--border)"}}),c("div",null,[ve.value.length?(n(),r("div",Mt,[c("div",$t,[(n(!0),r(k,null,B(ve.value,(a,f)=>(n(),r("div",{key:he(a),class:O(["wf-progress-step",{done:a.status==="success",current:a.status==="process",rejected:a.status==="warning",stopped:a.status==="error"||a.status==="danger"}])},[c("div",At,[c("div",Ot,[l(" 同意/提交:对勾 "),a.status==="success"?(n(),r("svg",jt,[...t[7]||(t[7]=[c("path",{d:"M20 6L9 17l-5-5"},null,-1)])])):a.status==="warning"?(n(),r(k,{key:1},[l(" 驳回:回退箭头 "),t[8]||(t[8]=c("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[c("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)):a.status==="danger"||a.status==="error"?(n(),r(k,{key:2},[l(" 终止:叉 "),t[9]||(t[9]=c("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"3","stroke-linecap":"round","stroke-linejoin":"round"},[c("path",{d:"M18 6L6 18"}),c("path",{d:"M6 6l12 12"})],-1))],2112)):a.status==="info"?(n(),r(k,{key:3},[l(" 撤回:撤销箭头 "),t[10]||(t[10]=c("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[c("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",Ft,d(f+1),1))])]),c("div",Vt,[c("span",Ut,[c("span",Pt,d(a.taskName||"未命名节点"),1),a.occurrence&&a.occurrence>1?(n(),r("sup",Wt,d(a.occurrence),1)):l("v-if",!0)])])],2))),128))])])):(n(),b(i,{key:0,description:"暂无流程进度","image-size":48}))]),l(`
16
16
  业务审核内容:完全由业务内容组件/插槽决定(含它自己的标题、分区、网格),
17
17
  通用抽屉不再注入任何标题,业务页面给什么就展示什么。
18
- `),it(e.$slots,"content",{task:v.value,process:_.value,snapshot:C(_e)},()=>[E.contentComponent?(n(),b(ct(E.contentComponent),dt({key:0,ref_key:"contentRef",ref:W},E.contentProps,{snapshot:C(_e),loading:L.value,"onUpdate:loading":t[0]||(t[0]=a=>L.value=a)}),null,16,["snapshot","loading"])):l("v-if",!0)],!0),K(o,{level:"1",title:"审批记录",style:{"border-bottom":"var(--border)"}}),c("div",null,[G.value.length?(n(),b(y,{key:1,class:"workflow-todo-shell__timeline"},{default:$(()=>[(n(!0),r(k,null,B(Oe.value,a=>(n(),b(g,{key:ce(a),type:D(a).type,hollow:D(a).hollow,class:O({"is-active":D(a).type==="primary"}),style:Ie({"--el-timeline-node-color":We(D(a).type)})},{default:$(()=>[K(m,{align:"center",justify:"space-between",class:O(["workflow-todo-shell__record-title",`is-${D(a).type}`])},{default:$(()=>[c("span",null,[x(d(a.taskName||"未命名节点")+" ",1),(a.occurrence||0)>1?(n(),r("span",Wt,d(a.occurrence),1)):l("v-if",!0),de(a)?(n(),r("span",Rt,d(de(a)),1)):l("v-if",!0),l(" 我办理过的节点:标注「我的操作」,颜色跟随该节点的审批结论 "),ue(a)?(n(),r("span",{key:2,class:O(["workflow-todo-shell__record-mine",`is-${ue(a)}`])}," 我的操作 ",2)):l("v-if",!0)]),K(h,{type:D(a).type,size:"small"},{default:$(()=>[x(d(D(a).label),1)]),_:2},1032,["type"])]),_:2},1032,["class"]),Fe(a)?(n(),r("div",zt,[c("span",Ht,d(Re(a)),1),X(a)||a.tasks.some(f=>N(f.taskId).length)?(n(),r("div",Qt,[X(a)?(n(),r(k,{key:0},[x(d(X(a)),1)],64)):l("v-if",!0),(n(!0),r(k,null,B(a.tasks,f=>(n(),r(k,{key:f.taskId},[N(f.taskId).length?(n(),r("div",qt,[(n(!0),r(k,null,B(N(f.taskId),I=>(n(),r("span",{key:I.id,class:"workflow-todo-shell__record-file",onClick:et=>C(Q)(I.id)},[K(s,{"model-value":q(I.name)},null,8,["model-value"]),x(d(I.name),1)],8,Gt))),128))])):l("v-if",!0)],64))),128))])):l("v-if",!0)])):a.tasks.length?(n(!0),r(k,{key:1},B(a.tasks,f=>(n(),r("div",{key:f.taskId,class:"workflow-todo-shell__record-user"},[c("span",Yt,d(ke(f)),1),f.comment||N(f.taskId).length?(n(),r("div",Jt,[f.comment?(n(),r(k,{key:0},[x(d(f.comment),1)],64)):l("v-if",!0),N(f.taskId).length?(n(),r("div",Xt,[(n(!0),r(k,null,B(N(f.taskId),I=>(n(),r("span",{key:I.id,class:"workflow-todo-shell__record-file",onClick:et=>C(Q)(I.id)},[K(s,{"model-value":q(I.name)},null,8,["model-value"]),x(d(I.name),1)],8,Zt))),128))])):l("v-if",!0)])):l("v-if",!0)]))),128)):a.isEnd?l("v-if",!0):(n(),r(k,{key:2},[l(" 结束节点只有节点名与状态,不展示审签人 "),(n(!0),r(k,null,B(pe(a),f=>(n(),r("div",{key:f,class:"workflow-todo-shell__record-user"},[c("span",es,d(f),1)]))),128))],64))]),_:2},1032,["type","hollow","class","style"]))),128))]),_:1})):(n(),b(i,{key:0,description:"暂无审批记录","image-size":48}))])])),[[Ze,L.value]]),E.showFooter?(n(),r("div",ts,[l(`
18
+ `),ct(e.$slots,"content",{task:v.value,process:_.value,snapshot:C(_e)},()=>[E.contentComponent?(n(),b(dt(E.contentComponent),ut({key:0,ref_key:"contentRef",ref:R},E.contentProps,{snapshot:C(_e),loading:L.value,"onUpdate:loading":t[0]||(t[0]=a=>L.value=a)}),null,16,["snapshot","loading"])):l("v-if",!0)],!0),K(o,{level:"1",title:"审批记录",style:{"border-bottom":"var(--border)"}}),c("div",null,[Y.value.length?(n(),b(y,{key:1,class:"workflow-todo-shell__timeline"},{default:$(()=>[(n(!0),r(k,null,B(Oe.value,a=>(n(),b(g,{key:de(a),type:D(a).type,hollow:D(a).hollow,class:O({"is-active":D(a).type==="primary"}),style:Ie({"--el-timeline-node-color":We(D(a).type)})},{default:$(()=>[K(m,{align:"center",justify:"space-between",class:O(["workflow-todo-shell__record-title",`is-${D(a).type}`])},{default:$(()=>[c("span",null,[x(d(a.taskName||"未命名节点")+" ",1),(a.occurrence||0)>1?(n(),r("span",Rt,d(a.occurrence),1)):l("v-if",!0),ue(a)?(n(),r("span",zt,d(ue(a)),1)):l("v-if",!0),l(" 我办理过的节点:标注「我的操作」,颜色跟随该节点的审批结论 "),pe(a)?(n(),r("span",{key:2,class:O(["workflow-todo-shell__record-mine",`is-${pe(a)}`])}," 我的操作 ",2)):l("v-if",!0)]),K(h,{type:D(a).type,size:"small"},{default:$(()=>[x(d(D(a).label),1)]),_:2},1032,["type"])]),_:2},1032,["class"]),Fe(a)?(n(),r("div",Ht,[c("span",Qt,d(Re(a)),1),Z(a)||a.tasks.some(f=>N(f.taskId).length)?(n(),r("div",qt,[Z(a)?(n(),r(k,{key:0},[x(d(Z(a)),1)],64)):l("v-if",!0),(n(!0),r(k,null,B(a.tasks,f=>(n(),r(k,{key:f.taskId},[N(f.taskId).length?(n(),r("div",Gt,[(n(!0),r(k,null,B(N(f.taskId),I=>(n(),r("span",{key:I.id,class:"workflow-todo-shell__record-file",onClick:tt=>C(q)(I.id)},[K(s,{"model-value":G(I.name)},null,8,["model-value"]),x(d(I.name),1)],8,Yt))),128))])):l("v-if",!0)],64))),128))])):l("v-if",!0)])):a.tasks.length?(n(!0),r(k,{key:1},B(a.tasks,f=>(n(),r("div",{key:f.taskId,class:"workflow-todo-shell__record-user"},[c("span",Jt,d(me(f)),1),f.comment||N(f.taskId).length?(n(),r("div",Xt,[f.comment?(n(),r(k,{key:0},[x(d(f.comment),1)],64)):l("v-if",!0),N(f.taskId).length?(n(),r("div",Zt,[(n(!0),r(k,null,B(N(f.taskId),I=>(n(),r("span",{key:I.id,class:"workflow-todo-shell__record-file",onClick:tt=>C(q)(I.id)},[K(s,{"model-value":G(I.name)},null,8,["model-value"]),x(d(I.name),1)],8,es))),128))])):l("v-if",!0)])):l("v-if",!0)]))),128)):a.isEnd?l("v-if",!0):(n(),r(k,{key:2},[l(" 结束节点只有节点名与状态,不展示审签人 "),(n(!0),r(k,null,B(fe(a),f=>(n(),r("div",{key:f,class:"workflow-todo-shell__record-user"},[c("span",ts,d(f),1)]))),128))],64))]),_:2},1032,["type","hollow","class","style"]))),128))]),_:1})):(n(),b(i,{key:0,description:"暂无审批记录","image-size":48}))])])),[[et,L.value]]),E.showFooter?(n(),r("div",ss,[l(`
19
19
  已办节点的只读查看:节点开了撤回(后端按节点下发 withdrawEnabled)时,
20
20
  在「取消」旁边给出撤回入口——校验、预览、二次确认、执行都在组件内完成,
21
21
  成功后通知调用方刷新列表并关闭查看。
22
- `),Qe.value?(n(),b(Xe,{key:0,"oper-code":"system:workflow:processWithdrawal"},{default:$(()=>[K(A,{type:"warning",loading:Z.value,onClick:qe},{default:$(()=>[...t[11]||(t[11]=[x("撤回",-1)])]),_:1},8,["loading"])]),_:1})):l("v-if",!0),we.value?(n(),b(A,{key:1,onClick:t[1]||(t[1]=a=>V("cancel"))},{default:$(()=>[...t[12]||(t[12]=[x("取消",-1)])]),_:1})):(n(),b(_t,{key:2,"task-id":E.taskId,params:Ye.value,"render-dialog":E.renderDialog,"show-process-btn":!1,"but-loading":L.value,"onUpdate:butLoading":t[2]||(t[2]=a=>L.value=a),onSuccess:Je},null,8,["task-id","params","render-dialog","but-loading"]))])):l("v-if",!0)],512)}}}),ko=ht(ss,[["__scopeId","data-v-ff1b77a8"]]);export{ko as default};
22
+ `),qe.value?(n(),b(Ze,{key:0,"oper-code":"system:workflow:processWithdrawal"},{default:$(()=>[K(A,{type:"warning",loading:ee.value,onClick:Ge},{default:$(()=>[...t[11]||(t[11]=[x("撤回",-1)])]),_:1},8,["loading"])]),_:1})):l("v-if",!0),P.value?(n(),b(A,{key:1,onClick:t[1]||(t[1]=a=>V("cancel"))},{default:$(()=>[...t[12]||(t[12]=[x("取消",-1)])]),_:1})):(n(),b(ht,{key:2,"task-id":E.taskId,params:Je.value,"render-dialog":E.renderDialog,"show-process-btn":!1,"but-loading":L.value,"onUpdate:butLoading":t[2]||(t[2]=a=>L.value=a),onSuccess:Xe},null,8,["task-id","params","render-dialog","but-loading"]))])):l("v-if",!0)],512)}}}),mo=gt(os,[["__scopeId","data-v-1e09a2d9"]]);export{mo as default};
@@ -1,4 +1,4 @@
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={},So="subAppModalOverlay",S="adtec-subapp-modal-open";let j=0;const b=[],v=new Map;let E=!1;const C=new WeakMap,Eo=()=>{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=Eo();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),!E&&(T.on(U,F),E=!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||!E)&&(T.off(U,F),E=!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 a={applicationModule:r,overlayId:e.overlayId,open:t};T.emit(So,a),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=`
1
+ import{computed as $,ref as y,unref as v,createApp as ho,nextTick as go,h as n}from"vue";import uo,{ElDrawer as po,ElDialog as bo,ElButton as q}from"element-plus";import H from"../stores/storeConfig.js";/* empty css */import*as P from"@element-plus/icons-vue";import"../config/ElementPlusConfig.js";import{installVxeGrid as fo}from"../config/VxeTableConfig.js";import mo from"element-plus/es/locale/lang/zh-cn";import _o from"./useListenerHooks.js";import{permissionStore as ko}from"../stores/permissionStore.js";import yo from"../components/icon/ElIcons.vue.js";import vo from"../components/ElDialogBody/ElDialogBody.vue.js";import xo from"crypto-js/enc-base64";import wo from"crypto-js/enc-utf8";import{frontendBus as D}from"../utils/frontendBus.js";import{GLOBAL_LOADING_EVENT as V,notifyDialogLoadingScope as So}from"../utils/globalLoading.js";import Eo 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 Lo={},Io="subAppModalOverlay",x="adtec-subapp-modal-open";let F=0;const p=[],k=new Map;let S=!1;const w=new WeakMap,Oo=()=>{for(let o=p.length-1;o>=0;o--)if(p[o].open.value)return p[o]},U=o=>{if(!o?.id)return;if(o.phase==="start"){const t=Oo();if(!t)return;k.set(o.id,t),t.requestLoadingIds.add(o.id),t.requestLoading.value=!0;return}const e=k.get(o.id);e&&(k.delete(o.id),e.requestLoadingIds.delete(o.id),e.requestLoading.value=e.requestLoadingIds.size>0)},Co=o=>{p.push(o),!S&&(D.on(V,U),S=!0)},Do=o=>{const e=p.indexOf(o);e>-1&&p.splice(e,1),o.requestLoadingIds.forEach(t=>k.delete(t)),o.requestLoadingIds.clear(),o.requestLoading.value=!1,!(p.length>0||!S)&&(D.off(V,U),S=!1,k.clear())},Ao=o=>{const e=Lo||{};return o.applicationModule||e.VITE_APPLICATION_MODULE||e.VITE_APP_MODULE||String(o.router.currentRoute.value.meta.applicationModule||"")},z=(o,e,t)=>{if(typeof window>"u"||!window.__POWERED_BY_WUJIE__)return;const r=Ao(o);if(!r||(t&&!e.overlayId&&(e.overlayId=`${r}-${Date.now()}-${++F}`),!e.overlayId))return;const d={applicationModule:r,overlayId:e.overlayId,open:t};D.emit(Io,d),t||(e.overlayId=void 0)},N=(o,e)=>{e&&!o.overlayId&&(o.overlayId=`dialog-${Date.now()}-${++F}`),o.overlayId&&So({id:o.overlayId,open:e})};function Mo(){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 {
@@ -276,14 +276,14 @@ import{computed as P,ref as x,unref as w,createApp as so,nextTick as no,h as d}f
276
276
 
277
277
  /* 非当前子应用被宿主提升以显示弹窗时,仅隐藏其页面壳;是否添加该状态类
278
278
  由宿主根据当前路由判断,当前子应用自己的页面始终保留在遮罩下方。 */
279
- html.${S} #app > .subapp-main {
279
+ html.${x} #app > .subapp-main {
280
280
  visibility: hidden !important;
281
281
  pointer-events: none !important;
282
282
  }
283
- html.${S},
284
- html.${S} body,
285
- html.${S} #app {
283
+ html.${x},
284
+ html.${x} body,
285
+ html.${x} #app {
286
286
  background: transparent !important;
287
287
  background-color: transparent !important;
288
288
  }
289
- `,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=>{const r=t.scrollHeight>t.clientHeight+1||t.scrollWidth>t.clientWidth+1,a=t.offsetWidth-t.clientWidth>0;(r||a)&&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 a=t;if(!a){const h={observer:new ResizeObserver(()=>A(e,h.targets)),targets:new Set};a=h,C.set(e,h)}const _=new Set(r);a.targets.forEach(h=>{_.has(h)||a.observer.unobserve(h)}),_.forEach(h=>{a.targets.has(h)||a.observer.observe(h)}),a.targets=_,typeof MutationObserver<"u"&&!a.mutationObserver&&(a.mutationObserver=new MutationObserver(()=>{e.isConnected&&A(e,M(e))}),a.mutationObserver.observe(e,{childList:!0,subtree:!0,characterData:!0}))})}function To(o){return o.closest("[class*='vxe'], [class*='umo']")!==null}function A(o,e){let t=0;e.forEach(r=>{r!==o&&To(r)||(t=Math.max(t,r.offsetWidth-r.clientWidth))}),o.style.setProperty("--dialog-hooks-scrollbar",`${Math.min(Do,Math.max(0,t))}px`)}function Bo(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 $o(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 Me(o){return function(t){const r=[],a=()=>r[r.length-1],_=s=>{const i=w(s?.data),k=w(s?.row),y=w(s?.formData),p=s?.id??s?.taskId??s?.selectedId??i?.id??k?.id??y?.id;return p==null||p===""?"":String(p)},h=(s,i,k,y="drawer",p,X=!0)=>{Co();const{icon:Z,hideConfirm:L,hideFooter:oo,dialogBody:eo,...c}=k||{},f=Bo(eo,o.defaultDialogBody??!0,X),to=`${y}|${typeof s=="string"?s:s?.__name||s?.name||""}|${c.title||""}|${_(i)}`,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(i||{}).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?$o(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 i=s||a();if(!i)return;const{runBehaviorAction:k}=xo();await k({code:`dialog:${i.renderKey}:confirm`,name:i.actionName||"确认",actionType:"SUBMIT"},async()=>{try{i.manualLoading.value=!0,await i.childInstance.value?.confirm?.(),t&&m(i)}catch{}finally{i.manualLoading.value=!1}})},m=s=>{const i=s||a();!i||!i.open.value||(i.closing=!0,i.open.value=!1)},K=s=>{const i=a();i&&(i.manualLoading.value=s)},J=()=>a()?.loading.value??!1,Q=P(()=>a()?.childInstance.value);return{render:h,cancel:m,setLoading:K,getLoading:J,instance:Q}}}export{Me as createDialogHooks,Me as default};
289
+ `,document.head.appendChild(r)}const To=8;function j(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 A(o){const e=[o];return o.querySelectorAll("*").forEach(t=>{if(t.clientWidth<=0&&t.clientHeight<=0)return;const r=t.scrollHeight>t.clientHeight+1||t.scrollWidth>t.clientWidth+1,d=t.offsetWidth-t.clientWidth>0&&G(t)>0;(r||d)&&e.push(t)}),e}function W(o){return o==="auto"||o==="scroll"||o==="overlay"}function G(o){const e=getComputedStyle(o);if(!W(e.overflowX)&&!W(e.overflowY))return 0;const t=(parseFloat(e.borderLeftWidth)||0)+(parseFloat(e.borderRightWidth)||0);return Math.max(0,o.offsetWidth-o.clientWidth-t)}const R=new WeakSet;function Bo(o){j(o).forEach(e=>{A(e).forEach(t=>{R.has(t)||(R.add(t),$o(t))})})}function $o(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 O(o){j(o).forEach(e=>{const t=w.get(e);if(!e.isConnected){t?.observer.disconnect(),t?.mutationObserver?.disconnect(),w.delete(e);return}if(typeof ResizeObserver>"u"){Y(e,A(e));return}let r=t;if(!r){const d={observer:new ResizeObserver(()=>C(e)),targets:new Set};r=d,w.set(e,d)}C(e),typeof MutationObserver<"u"&&!r.mutationObserver&&(r.mutationObserver=new MutationObserver(()=>{e.isConnected&&C(e)}),r.mutationObserver.observe(e,{childList:!0,subtree:!0,characterData:!0}))})}function C(o){const e=w.get(o);if(!e||!o.isConnected)return;const t=new Set(A(o));e.targets.forEach(r=>{t.has(r)||e.observer.unobserve(r)}),t.forEach(r=>{e.targets.has(r)||e.observer.observe(r,{box:"content-box"})}),e.targets=t,Y(o,t)}function qo(o){return o.closest("[class*='vxe'], [class*='umo']")!==null}function Y(o,e){let t=0;for(const r of e)r!==o&&qo(r)||(t=Math.max(t,G(r)));o.style.setProperty("--dialog-hooks-scrollbar",`${Math.min(To,Math.max(0,t))}px`)}function Po(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 zo(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(xo.parse(t).toString(wo));if(r?.activeMenuInfo?.icon)return r.activeMenuInfo.icon}}catch{}try{return ko(H).getActiveMenuInfo?.icon||""}catch{return""}}function $e(o){return function(t){const r=[],d=()=>r[r.length-1],K=i=>{const a=v(i?.data),m=v(i?.row),_=v(i?.formData),u=i?.id??i?.taskId??i?.selectedId??a?.id??m?.id??_?.id;return u==null||u===""?"":String(u)},J=(i,a,m,_="drawer",u,eo=!0)=>{Mo();const{icon:to,hideConfirm:E,hideFooter:ro,dialogBody:lo,...c}=m||{},f=Po(lo,o.defaultDialogBody??!0,eo),ao=`${_}|${typeof i=="string"?i:i?.__name||i?.name||""}|${c.title||""}|${K(a)}`,M=y(!1),T=y(!1),l={open:y(!0),loading:$(()=>M.value||T.value),manualLoading:M,requestLoading:T,requestLoadingIds:new Set,childInstance:y(),app:null,div:null,closing:!1,renderKey:ao,actionName:c.title||"确认"},io=Object.fromEntries(Object.entries(a||{}).map(([s,g])=>[s,v(g)])),so={...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]:[]]},no=c.onClosed,L=typeof c.title=="string"&&c.title,B=L?zo(o,to):"",co=()=>n("div",{class:"dialog-hooks-header"},[B?n("div",{class:"dialog-hooks-header-icon"},[n(yo,{modelValue:B})]):null,n("div",{class:"dialog-hooks-header-title"},[c.title]),l.loading.value&&!E?null:n("button",{type:"button",class:"dialog-hooks-header-close",onClick:()=>b(l)},[n(P.Close)])]),h=ho(()=>n(_==="drawer"?po:bo,{...so,modelValue:l.open.value,showClose:L?!1:c.showClose??!0,onClosed(){N(l,!1),z(o,l,!1),Do(l),no?.();const s=r.indexOf(l);s>-1&&r.splice(s,1),l.app?.unmount(),l.div?.parentNode&&l.div.parentNode.removeChild(l.div),l.app=null,l.div=null},onClose(){b(l)}},{...L?{header:co}:{},default:()=>{const s=n(i,{...io,loading:l.loading.value,"onUpdate:loading":g=>{l.manualLoading.value=g},ref:l.childInstance});return f.enabled?n(vo,{scroll:f.scroll,class:f.class,contentClass:f.contentClass},{default:()=>s}):s},...ro?{}:{footer:()=>{if(u&&u.length){const s=u.map(g=>typeof g=="function"?g():g);return n("div",{className:"dialog-footer"},s)}return n("div",{className:"dialog-footer"},[n(q,{onClick:()=>b(l),loading:!E&&l.loading.value},"取 消"),E?null:n(q,{type:"primary",onClick:()=>X(l),loading:l.loading.value},"确 认")])}}}));o.plugins?.forEach(s=>h.use(s)),h.use(uo,{locale:mo}),h.use(H),h.use(o.router);for(const[s,g]of Object.entries(P))h.component(s,g);fo(h),o.setupApp?.(h);const I=document.createElement("div");return document.body.appendChild(I),l.app=h,l.div=I,r.push(l),Co(l),N(l,!0),z(o,l,!0),h.mount(I),go(()=>{Bo(document.body),O(document.body),l.childInstance.value?.resetQuery?.(),setTimeout(()=>{O(document.body),window.dispatchEvent(new Event("resize"))},350),setTimeout(()=>O(document.body),1200)}),_o(),{cancel:()=>b(l)}},X=async i=>{const a=i||d();if(!a)return;const{runBehaviorAction:m}=Eo();await m({code:`dialog:${a.renderKey}:confirm`,name:a.actionName||"确认",actionType:"SUBMIT"},async()=>{try{a.manualLoading.value=!0,await a.childInstance.value?.confirm?.(),t&&b(a)}catch{}finally{a.manualLoading.value=!1}})},b=i=>{const a=i||d();!a||!a.open.value||(a.closing=!0,a.open.value=!1)},Q=i=>{const a=d();a&&(a.manualLoading.value=i)},Z=()=>d()?.loading.value??!1,oo=$(()=>d()?.childInstance.value);return{render:J,cancel:b,setLoading:Q,getLoading:Z,instance:oo}}}export{$e as createDialogHooks,$e as default};
@@ -16,6 +16,15 @@ export interface UseWorkflowSnapshotOptions {
16
16
  taskDefKey?: string | (() => string | undefined);
17
17
  /** 是否历史查看(只读):保留给后续按来源做差异化展示用;当前标记只在命中快照时展示 */
18
18
  readonly?: () => boolean;
19
+ /**
20
+ * 是否允许取快照(默认允许)。
21
+ *
22
+ * <p>只有历史查看(已办详情、流程查看、流程事项管理“查看当时数据”)才取“当时那一版”;
23
+ * 待办(当前任务仍在办)传 false:不发请求、直接按“没有快照”处理,由业务页面展示当前数据。
24
+ * 撤回会把已办结的任务还原成待办且任务ID沿用,此时任务上残留的上一轮快照不代表当前数据,
25
+ * 待办若照旧命中快照,会出现“显示旧数据”“业务组件按命中快照判成只读、改不动”等问题。
26
+ */
27
+ enabled?: () => boolean;
19
28
  }
20
29
  export interface WorkflowSnapshotSource {
21
30
  type: 'info' | 'warning';
@@ -1 +1 @@
1
- import{ref as i}from"vue";import m from"../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";const y=t=>{if(!t)return null;if(typeof t=="string")try{return JSON.parse(t)}catch{return null}return typeof t=="object"?t:null};function $(t,p={}){const o=i(null),a=i(!1),f=i(null),l=i(!1),h=()=>typeof t=="function"?t():typeof t=="string"?t:t.value,c=r=>String((typeof r=="function"?r():r)||"");return{snapshot:o,isSnapshot:a,dataSourceMeta:f,loading:l,refresh:async()=>{const r=String(h()||""),e=c(p.wfTaskId),k=c(p.taskDefKey);l.value=!0;try{if(o.value=null,a.value=!1,r||e)try{const n=await m.snapshot(r,{wfTaskId:e,taskDefKey:k}),s=y(n?.snapshot);s&&(o.value=s)}catch(n){console.warn("查询审核当时快照失败",n)}if(!o.value&&e)try{const n=await m.getTaskInst(e),s=y(n?.taskLocalVars?.bizSnapshot);s&&(o.value=s)}catch{}a.value=!!o.value;const u=String(o.value?.snapshotTime||"");f.value=a.value?{type:"info",label:u?`快照 · ${u}`:"快照"}:null}finally{l.value=!1}}}}export{$ as default,y as parseWorkflowSnapshot};
1
+ import{ref as p}from"vue";import m from"../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";const y=t=>{if(!t)return null;if(typeof t=="string")try{return JSON.parse(t)}catch{return null}return typeof t=="object"?t:null};function V(t,s={}){const o=p(null),e=p(!1),f=p(null),l=p(!1),h=()=>typeof t=="function"?t():typeof t=="string"?t:t.value,u=r=>String((typeof r=="function"?r():r)||"");return{snapshot:o,isSnapshot:e,dataSourceMeta:f,loading:l,refresh:async()=>{const r=String(h()||""),i=u(s.wfTaskId),v=u(s.taskDefKey);if(s.enabled&&!s.enabled()){o.value=null,e.value=!1,f.value=null,l.value=!1;return}l.value=!0;try{if(o.value=null,e.value=!1,r||i)try{const a=await m.snapshot(r,{wfTaskId:i,taskDefKey:v}),n=y(a?.snapshot);n&&(o.value=n)}catch(a){console.warn("查询审核当时快照失败",a)}if(!o.value&&i)try{const a=await m.getTaskInst(i),n=y(a?.taskLocalVars?.bizSnapshot);n&&(o.value=n)}catch{}e.value=!!o.value;const c=String(o.value?.snapshotTime||"");f.value=e.value?{type:"info",label:c?`快照 · ${c}`:"快照"}:null}finally{l.value=!1}}}}export{V as default,y as parseWorkflowSnapshot};