Browse Source

合并秦东代码

v5
超级管理员 2 years ago
parent
commit
92ba6061e6
  1. 1
      package.json
  2. 46
      src/api/DesignForm/requestapi.ts
  3. 45
      src/api/DesignForm/type.ts
  4. 12
      src/api/taskapi/management.ts
  5. 36
      src/api/taskapi/types.ts
  6. 1
      src/assets/icons/addshixian.svg
  7. 1
      src/assets/icons/addxuxian.svg
  8. 1
      src/assets/icons/caogaoxiang(1).svg
  9. 1
      src/assets/icons/caogaoxiang.svg
  10. 1
      src/assets/icons/daiBanShiYi.svg
  11. 1
      src/assets/icons/myQingQiu.svg
  12. 1
      src/assets/icons/newFlow.svg
  13. 1
      src/assets/icons/yiBanRenwu.svg
  14. BIN
      src/assets/images/1.png
  15. BIN
      src/assets/images/2.png
  16. 37
      src/components/DesignForm/public/expand/user.vue
  17. 43
      src/components/DesignForm/public/expand/userDialog.vue
  18. 26
      src/components/DesignForm/public/form/form.vue
  19. 1
      src/components/DesignForm/public/form/formGroup.vue
  20. 18
      src/components/DesignForm/public/form/formItem.vue
  21. 2
      src/components/workflow/dialog/common.ts
  22. 20
      src/components/workflow/dialog/employeesDialog.vue
  23. 30
      src/components/workflow/dialog/employeesRoleDialog.vue
  24. 18
      src/components/workflow/dialog/formWord.vue
  25. 6
      src/components/workflow/dialog/matrix.vue
  26. 30
      src/components/workflow/dialog/positionDialog.vue
  27. 10
      src/components/workflow/dialog/roleDialog.vue
  28. 27
      src/components/workflow/drwer/approverDrawer.vue
  29. 32
      src/components/workflow/drwer/conditionDrawer.vue
  30. 2
      src/components/workflow/drwer/copyerDrawer.vue
  31. 2
      src/components/workflow/drwer/promoterDrawer.vue
  32. 2
      src/components/workflow/nodeWrap.vue
  33. 41
      src/utils/workflow/const.ts
  34. 70
      src/utils/workflow/index.ts
  35. 2
      src/views/appstore/appmarket/ccwl.vue
  36. 11
      src/views/dashboard/components/allorgyear.vue
  37. 2
      src/views/dashboard/components/application.vue
  38. 12
      src/views/dashboard/components/dltbhb.vue
  39. 6
      src/views/dashboard/components/sanlianping.vue
  40. 2
      src/views/dashboard/components/userinfo.vue
  41. 5
      src/views/dashboard/index.vue
  42. 398
      src/views/dashboard/index_20231108.vue
  43. 347
      src/views/public/orguser/orgalluser.vue
  44. 195
      src/views/public/orguser/orguser.vue
  45. 25
      src/views/redismanage/datamigration/index.vue
  46. 6
      src/views/sysworkflow/codepage/page.vue
  47. 26
      src/views/sysworkflow/flow/flowDrawingBoard.vue
  48. 194
      src/views/taskplatform/taskmanagement/completedmatters.vue
  49. 173
      src/views/taskplatform/taskmanagement/drafts.vue
  50. 10
      src/views/taskplatform/taskmanagement/edittaskcustomerform.vue
  51. 190
      src/views/taskplatform/taskmanagement/flowStep.vue
  52. 188
      src/views/taskplatform/taskmanagement/lookAndOperateLogInfo.vue
  53. 194
      src/views/taskplatform/taskmanagement/myrequest.vue
  54. 98
      src/views/taskplatform/taskmanagement/newaddflow.vue
  55. 213
      src/views/taskplatform/taskmanagement/runFlowStep.vue
  56. 299
      src/views/taskplatform/taskmanagement/taskcustomerform.vue
  57. 580
      src/views/taskplatform/taskmanagement/taskcustomerformnew.vue
  58. 2
      src/views/taskplatform/taskmanagement/taskentry.vue
  59. 4
      src/views/taskplatform/taskmanagement/tasklist.vue
  60. 194
      src/views/taskplatform/taskmanagement/todolist.vue
  61. 160
      vite.config.ts.timestamp-1700547221061-a6108b35a7917.mjs

1
package.json

@ -75,6 +75,7 @@
"@types/md5": "^2.3.2",
"@types/nprogress": "^0.2.0",
"@types/path-browserify": "^1.0.0",
"@types/uuid": "^9.0.7",
"@typescript-eslint/eslint-plugin": "^5.59.6",
"@typescript-eslint/parser": "^5.59.6",
"autoprefixer": "^10.4.14",

46
src/api/DesignForm/requestapi.ts

@ -19,7 +19,10 @@ import {
optimizeRepairForm,
publicFormTableStruct,
hanziToPinyin,
gogoBackFormTabelStruct
gogoBackFormTabelStruct,
nodeFlow,
searchUserListForm,
taskflowquery
} from './type';
//自定义表单列表
export function getCustomerFormList(queryParams: SearchForm): AxiosPromise<CustomerFormPageResult> {
@ -167,3 +170,44 @@ export function chineseToPinyin(data: hanziToPinyin){
data: data
});
}
//自定义表单搜索人员
export function searchUserList(data: searchUserListForm){
return request({
url: '/systemapi/task_flow/searchUserList',
method: 'post',
data: data
});
}
//自定义表单搜索人员
export function gainFlowPeople(data?: string[]){
return request({
url: '/systemapi/task_flow/gainFlowPeople',
method: 'post',
data: data
});
}
//发起工作流
export function startRunFlow(data?:any){
return request({
url: '/systemapi/task_flow/startRunFlow',
method: 'post',
data: data
});
}
//流程任务
export function taskFlowList(data?:taskflowquery){
return request({
url: '/systemapi/task_flow/taskFlowList',
method: 'post',
data: data
});
}
//获取正在执行得任务流程
export function gainRunTaskFlow(data?:customerFormLogo){
return request({
url: '/systemapi/task_flow/gainRunTaskFlow',
method: 'post',
data: data
});
}

45
src/api/DesignForm/type.ts

@ -59,6 +59,8 @@ export interface customerFormVersionCont{
editTime:number;
table_structure:string;
dict:string;
createrstr:string;
flowkeystr:string;
}
//编辑自定义表单内容
export interface editFormInfo extends customerFromCont{
@ -132,3 +134,46 @@ export interface hanziToPinyin{
types:number;
connector:string;
}
//获取工作流步进节点
export interface nodeFlow extends enableVersionId{
conditionList?:conditionInfo[]
}
export interface conditionInfo{
factorid:string;
type:number;
isCheckbox?:boolean;
answers?:string[];
oneanswer?:string;
customFields?:customFieldsInfo[];
nodeUserList?:nodeUserInfo[];
}
//自定义条件
export interface customFieldsInfo{
wordfield:string;
optType:string;
leftval:string;
leftoptType?:string;
rightoptType?:string;
rightval?:string;
}
//节点条件人员
export interface nodeUserInfo{
type:number;
targetId:string;
name?:string;
icon?:string;
iconToBase64?:string;
}
//自定义表单搜索人员
export interface searchUserListForm extends PageQuery{
name?: string;
department?:number;
}
//流程任务
export interface taskflowquery extends PageQuery{
title?: string; //任务标题
class?:number; //类型:1、我的请求;2、待办事宜;3、已办事宜;4:草稿箱
state?:number; //状态:状态:1、草稿;2:驳回;3:审批中;4:归档;5:删除
}

12
src/api/taskapi/management.ts

@ -6,7 +6,8 @@ import {
gainTaskListQuery,
gainTaskListPageResult,
customerFormLogo,
customerFormVersionCont
customerFormVersionCont,
nodeFlow
} from '@/api/taskapi/types'
@ -64,3 +65,12 @@ export function delCustomerFormData(data: customerFormLogo) {
data: data
});
}
//获取工作流步进节点
export function generateFlow(data: nodeFlow):any{
return request({
url: '/systemapi/task_flow/generateFlow',
method: 'post',
data: data
});
}

36
src/api/taskapi/types.ts

@ -23,6 +23,7 @@ export interface taskLonCont{
//获取可执行得任务列表
export interface gainTaskListQuery extends PageQuery {
status?: number;
type?: number;
}
//执行得任务记录列表
export interface taskListCont{
@ -55,3 +56,38 @@ export interface customerFormVersionCont{
table_structure:string;
dict:string;
}
//获取工作流步进节点
export interface nodeFlow extends customerFormLogo{
conditionList?:conditionInfo[];
nodelPeople?:nodelPeoples[]
}
export interface nodelPeoples {
factorid?:string;
userList?:string
}
export interface conditionInfo{
factorid?:string;
type?:number;
isCheckbox?:boolean;
answers?:string[];
oneanswer?:string;
customFields?:customFieldsInfo[];
nodeUserList?:nodeUserInfo[];
}
//自定义条件
export interface customFieldsInfo{
wordfield:string;
optType:string;
leftval:string;
leftoptType?:string;
rightoptType?:string;
rightval?:string;
}
//节点条件人员
export interface nodeUserInfo{
type:number;
targetId:string;
name?:string;
icon?:string;
iconToBase64?:string;
}

1
src/assets/icons/addshixian.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1700526281008" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9447" width="200" height="200" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M795.136 935.424H164.352c-47.616 0-86.016-38.4-86.016-86.016V219.136c0-47.616 38.4-86.016 86.016-86.016h630.272c47.616 0 86.016 38.4 86.016 86.016v630.272c0.512 47.616-37.888 86.016-85.504 86.016zM164.352 177.664c-23.04 0-41.472 18.432-41.472 41.472v630.272c0 23.04 18.432 41.472 41.472 41.472h630.272c23.04 0 41.472-18.432 41.472-41.472V219.136c0-23.04-18.432-41.472-41.472-41.472H164.352z" fill="#bfbfbf" p-id="9448"></path><path d="M744.96 556.544H214.528c-12.288 0-22.528-9.728-22.528-22.528 0-12.288 9.728-22.528 22.528-22.528h530.432c12.288 0 22.528 9.728 22.528 22.528 0 12.8-10.24 22.528-22.528 22.528z" fill="#bfbfbf" p-id="9449"></path><path d="M479.744 821.76c-12.288 0-22.528-9.728-22.528-22.528V269.312c0-12.288 9.728-22.528 22.528-22.528s22.528 9.728 22.528 22.528v530.432c0 12.288-10.24 22.016-22.528 22.016z" fill="#bfbfbf" p-id="9450"></path></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

1
src/assets/icons/addxuxian.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.0 KiB

1
src/assets/icons/caogaoxiang(1).svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1700784511649" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="17318" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M729.301333 42.666667c79.552 0 142.72 69.504 145.28 154.666666L874.666667 202.666667V576h32a74.666667 74.666667 0 0 1 74.56 70.570667L981.333333 650.666667v256a74.666667 74.666667 0 0 1-74.666666 74.666666h-789.333334A74.666667 74.666667 0 0 1 42.666667 906.666667v-256A74.666667 74.666667 0 0 1 117.333333 576H149.333333V202.666667c0-85.76 61.568-157.034667 140.416-159.914667L294.698667 42.666667h434.602666zM216.832 640H117.333333a10.666667 10.666667 0 0 0-10.666666 10.666667v256a10.666667 10.666667 0 0 0 10.666666 10.666666h789.333334a10.666667 10.666667 0 0 0 10.666666-10.666666v-256a10.666667 10.666667 0 0 0-10.666666-10.666667h-78.421334a10.666667 10.666667 0 0 0-6.912 2.538667l-126.890666 107.733333a74.666667 74.666667 0 0 1-48.32 17.728H381.226667a74.666667 74.666667 0 0 1-52.522667-21.589333l-104.405333-103.317334a10.666667 10.666667 0 0 0-7.488-3.093333zM729.301333 106.666667H294.698667c-42.666667 0-79.104 39.658667-81.28 91.136L213.333333 202.666667V576h3.498667a74.666667 74.666667 0 0 1 49.194667 18.517333l3.328 3.072 104.384 103.317334a10.666667 10.666667 0 0 0 7.509333 3.093333h264.874667a10.666667 10.666667 0 0 0 6.890666-2.538667l126.912-107.733333a74.666667 74.666667 0 0 1 30.72-15.637333L810.666667 202.666667c0-52.202667-35.114667-93.44-77.397334-95.893334L729.301333 106.666667zM629.333333 448a32 32 0 0 1 0 64h-234.666666a32 32 0 0 1 0-64h234.666666z m64-192a32 32 0 0 1 0 64h-362.666666a32 32 0 0 1 0-64h362.666666z" fill="#8a8a8a" p-id="17319"></path></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

1
src/assets/icons/caogaoxiang.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1700784220084" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="17019" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M755.2 857.6H262.4c-54.4 0-98.5-44.1-98.5-98.6V512.7h49.3v-312c0-27.2 22.1-49.3 49.3-49.3h492.7c27.2 0 49.3 22.1 49.3 49.3v312h49.3v246.4c-0.1 54.4-44.2 98.5-98.6 98.5z m0-656.9H262.4v312h147.8v98.6h197.1v-98.6h147.8v-312zM804.4 562H656.6v49.3c0 27.2-22.1 49.3-49.3 49.3H410.2c-27.2 0-49.3-22.1-49.3-49.3V562H213.1v197.1c0 27.2 22.1 49.3 49.3 49.3h492.7c27.2 0 49.3-22.1 49.3-49.3V562z m0 0" fill="#8a8a8a" p-id="17020"></path><path d="M656.8 330.2H361.2c-13.6 0-24.6-11-24.6-24.6 0-13.6 11-24.6 24.6-24.6h295.6c13.6 0 24.6 11 24.6 24.6 0.1 13.6-10.9 24.6-24.6 24.6z m0 0M484.4 445.3H361.2c-13.6 0-24.6-11-24.6-24.6s11-24.6 24.6-24.6h123.2c13.6 0 24.6 11 24.6 24.6s-11 24.6-24.6 24.6z m0 0" fill="#8a8a8a" p-id="17021"></path></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

1
src/assets/icons/daiBanShiYi.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1700634309358" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5459" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M85.333333 204.16A118.826667 118.826667 0 0 1 204.16 85.333333h562.090667a118.826667 118.826667 0 0 1 118.826666 118.186667l1.706667 334.72a248.448 248.448 0 0 1-348.544 348.544l-334.677333-1.706667A118.826667 118.826667 0 0 1 85.333333 766.293333V204.16z m394.026667 617.472a248.448 248.448 0 0 1 342.272-342.272l-1.365333-275.456a54.016 54.016 0 0 0-54.016-53.76H204.16c-29.866667 0-54.016 24.192-54.016 54.016v562.090667c0 29.738667 24.021333 53.888 53.76 54.016l275.456 1.365333zM214.954667 290.56c0-17.92 14.506667-32.426667 32.426666-32.426667h475.264a32.426667 32.426667 0 1 1 0 64.853334H247.338667a32.426667 32.426667 0 0 1-32.384-32.426667z m0 172.8c0-17.877333 14.506667-32.384 32.426666-32.384h129.578667a32.426667 32.426667 0 1 1 0 64.853333H247.338667a32.426667 32.426667 0 0 1-32.384-32.426666z m475.306666 43.221333a183.637333 183.637333 0 1 0 0 367.274667 183.637333 183.637333 0 0 0 0-367.274667z m-10.837333 32.426667c17.92 0 32.426667 14.506667 32.426667 32.426667v86.4h53.973333a32.426667 32.426667 0 0 1 0 64.810666h-86.4a32.426667 32.426667 0 0 1-32.426667-32.426666v-118.826667c0-17.92 14.506667-32.426667 32.426667-32.426667zM214.954667 636.16c0-17.92 14.506667-32.426667 32.426666-32.426667h129.578667a32.426667 32.426667 0 1 1 0 64.853334H247.338667a32.426667 32.426667 0 0 1-32.384-32.426667z" fill="#000000" fill-opacity=".65" p-id="5460"></path></svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

1
src/assets/icons/myQingQiu.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1700634490529" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="14785" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M713.38277661 592.44859619a170.7132019 170.7132019 0 1 0 170.7132019 170.71320191 170.7132019 170.7132019 0 0 0-170.7132019-170.71320191z m3.84104746 191.19878613a58.46927124 58.46927124 0 0 0-31.58194236 8.96244352 58.46927124 58.46927124 0 0 0-26.88732971 50.78717715 21.76593283 21.76593283 0 0 1-21.33915024 21.33915024 21.33915024 21.33915024 0 0 1-21.33915023-21.33915024 102.00113772 102.00113772 0 0 1 42.67830047-85.35660096 73.83345941 73.83345941 0 1 1 60.17640408 23.89984827s-0.85356601 1.70713203-1.70713201 1.70713202z m80.66198748 81.0887709a21.76593283 21.76593283 0 0 1-21.33915024-21.33915022 59.32283725 59.32283725 0 0 0-13.23027274-37.55690443 21.33915024 21.33915024 0 1 1 32.86229097-26.88732889 101.14757172 101.14757172 0 0 1 23.89984826 64.44423332 21.33915024 21.33915024 0 0 1-22.19271625 21.33915022z" p-id="14786" fill="#8a8a8a"></path><path d="M713.38277661 559.58630523a213.39150237 213.39150237 0 0 1 64.01745072 10.66957471V172.06733691A85.35660096 85.35660096 0 0 0 692.04362637 90.125H265.26062244a85.35660096 85.35660096 0 0 0-85.35660096 81.94233691v615.84787547a85.35660096 85.35660096 0 0 0 85.35660096 81.94233691h259.91084947A213.39150237 213.39150237 0 0 1 713.38277661 559.58630523zM340.80121386 252.30254181H564.00872494L512.79476519 200.23501523a21.33915024 21.33915024 0 1 1 30.30159293-30.30159375L631.86722311 260.8382019a21.33915024 21.33915024 0 0 1 5.97496207 14.93740476 22.19271625 22.19271625 0 0 1-5.97496207 15.36418817L543.09635812 377.77674522a21.33915024 21.33915024 0 0 1-15.36418817 5.97496205 20.05880081 20.05880081 0 0 1-14.93740475-5.97496205 21.33915024 21.33915024 0 0 1-1e-8-31.58194236L564.00872494 294.98084229H340.80121386a21.33915024 21.33915024 0 0 1-21.33915023-21.33915025 21.33915024 21.33915024 0 0 1 21.33915024-21.33915023zM265.26062244 479.77788294h426.78300393a20.91236682 20.91236682 0 1 1 0 42.67830048H265.26062244a20.91236682 20.91236682 0 1 1 0-42.67830048z m192.05235214 150.65440109H265.26062244a20.48558423 20.48558423 0 0 1-21.33915025-20.48558423 20.91236682 20.91236682 0 0 1 21.33915025-20.48558423h192.05235214a20.91236682 20.91236682 0 0 1 21.33915023 20.48558423 20.48558423 20.48558423 0 0 1-21.33915024 20.48558423z" p-id="14787" fill="#8a8a8a"></path></svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

1
src/assets/icons/newFlow.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1700634551689" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="15939" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M256 63.936V192a64 64 0 0 0 56.512 63.552L320 256h320a64 64 0 0 0 64-64V63.936L768 64a96 96 0 0 1 96 96v328.064a256 256 0 0 0-187.968 472L192 960a96 96 0 0 1-96-96v-704A96 96 0 0 1 192 64l64-0.064zM800 544a192 192 0 1 1 0 384 192 192 0 0 1 0-384z m32 64h-64V704h-96v64H768v96h64V768h96v-64H832V608z m-352-64h-256V640h256V544z m192-192h-448V448h448V352zM608 64v96h-256V64h256z" fill="#8a8a8a" p-id="15940"></path></svg>

After

Width:  |  Height:  |  Size: 752 B

1
src/assets/icons/yiBanRenwu.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1700634416401" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10050" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M756.48 159.36H661.333333v-38.4A35.626667 35.626667 0 0 0 625.706667 85.333333H251.733333a35.626667 35.626667 0 0 0-35.626666 35.626667v38.4H120.96A35.413333 35.413333 0 0 0 85.333333 194.773333v708.266667A35.626667 35.626667 0 0 0 120.96 938.666667h238.506667a35.626667 35.626667 0 1 0 0-71.04H156.586667V230.4h59.52v37.76a35.626667 35.626667 0 0 0 35.626666 35.626667h373.973334A35.626667 35.626667 0 0 0 661.333333 268.16V230.4h59.52v130.986667a35.626667 35.626667 0 1 0 71.253334 0V194.773333a35.413333 35.413333 0 0 0-35.626667-35.413333z m-166.4 73.813333h-302.933333v-76.8h302.933333z" p-id="10051" fill="#8a8a8a"></path><path d="M381.866667 676.48h-118.613334a35.626667 35.626667 0 0 0 0 71.253333h118.613334a35.626667 35.626667 0 0 0 0-71.253333zM429.226667 525.226667h-165.973334a35.626667 35.626667 0 1 0 0 71.04h165.973334a35.626667 35.626667 0 1 0 0-71.04zM550.186667 372.693333H263.253333a35.626667 35.626667 0 1 0 0 71.04h286.933334a35.626667 35.626667 0 0 0 0-71.04zM715.733333 493.226667A222.72 222.72 0 1 0 938.666667 715.946667a222.506667 222.506667 0 0 0-222.933334-222.72z m0 378.666666a155.946667 155.946667 0 1 1 156.16-155.946666 156.16 156.16 0 0 1-156.16 155.946666z" p-id="10052" fill="#8a8a8a"></path><path d="M768 646.4l-75.093333 72.96-29.44-29.226667a33.92 33.92 0 0 0-2.773334-2.773333 32 32 0 0 0-42.666666 48l51.626666 51.413333a32 32 0 0 0 44.8 0l97.28-94.72 2.773334-2.773333a31.786667 31.786667 0 0 0-47.146667-42.666667z" p-id="10053" fill="#8a8a8a"></path></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
src/assets/images/1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
src/assets/images/2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

37
src/components/DesignForm/public/expand/user.vue

@ -28,26 +28,31 @@ const userDialogEl = ref()
// const userlist = ref<any>("")
const value = computed({
get: () => {
console.log("value-get",props.modelValue)
// console.log("value-get",props.modelValue)
// userlist.value = props.modelValue
return props.modelValue
},
set: (newVal: any) => {
console.log("value-set",newVal)
// console.log("value-set",newVal,newVal.length)
// emits('update:modelValue', newVal)
let newValJson:criteriaForPeopleList[] = JSON.parse(newVal)
console.log("value-newValJson",newValJson)
if(newValJson.length > 0){
let userAry = new Array
let userKeyAry = new Array
newValJson.forEach(item =>{
userAry.push(item.name+"("+item.number+")")
userKeyAry.push(item.userkey.toString())
})
emits('update:modelValue', userAry.join(','))
// userlist.value = userAry.join(',')
//
}
let newValJson:criteriaForPeopleList[] = JSON.parse(newVal)
// console.log("value-newValJson",newValJson)
if(newValJson.length > 0){
let userAry = new Array
let userKeyAry = new Array
newValJson.forEach(item =>{
userAry.push(item.name+"("+item.number+")")
userKeyAry.push(item.userkey.toString())
})
emits('update:modelValue', userAry.join(','))
// userlist.value = userAry.join(',')
//
}else{
emits('update:modelValue', "")
}
},
});
@ -57,7 +62,7 @@ const openDialog = () => {
userDialogEl.value.open()
}
onMounted(() => {
console.log("value---1--》",value.value,props.modelValue)
// console.log("value---1--",value.value,props.modelValue)
nextTick(() => {})
})

43
src/components/DesignForm/public/expand/userDialog.vue

@ -35,7 +35,7 @@ const getTreeData = () => {
// })
getOrgFormTree()
.then(({ data }) => {
console.log(data)
// console.log(data)
treeData.value = data.list
}).finally(()=>{})
}
@ -100,23 +100,35 @@ const tableRowClick = (row: any) => {
}else{
checkDataList.push(row)
}
console.log("checkDataList",checkDataList,row)
// console.log("checkDataList",checkDataList,row)
}
const delRowClick = (row: criteriaForPeopleList) => {
// console.log("checkDataList",row)
// checkData.value.forEach((item: any, index: number) => {
// if (item === row) {
// checkData.value.splice(index, 1)
// }
// })
let checkDataAry = checkDataList
if(checkDataAry.length > 0) {
checkDataList.splice(0,checkDataList.length)
checkDataAry.forEach(item => {
if(item.id != row.id){
checkDataList.push(item)
if(checkDataList &&checkDataList.length > 0) {
checkDataList.forEach((item:criteriaForPeopleList,index:number) => {
if(item.id == row.id){
checkDataList.splice(index,1)
}
})
}
// let checkDataAry = checkDataList
// if(checkDataAry.length > 0) {
// checkDataList.splice(0,checkDataList.length)
// console.log("checkDataList----1------>",checkDataAry,checkDataList)
// checkDataAry.forEach(item => {
// if(item.id != row.id){
// console.log("checkDataList---------->",item)
// checkDataList.push(item)
// }
// })
// }
}
const delAllClick = () => {
// checkData.value = []
@ -125,12 +137,13 @@ const delAllClick = () => {
//
const open = () => {
visible.value = true
console.log("open--->",props.modelValue)
// console.log("open--->",props.modelValue)
if (props.modelValue) {
searchUserCustomerFormList({name:props.modelValue})
.then(({data})=>{
console.log("弹窗处理",data)
// console.log("",data)
// checkDataList = data
checkDataList.splice(0,checkDataList.length)
if(data.length > 0){
data.forEach((item:any) => {
checkDataList.push(item)
@ -164,9 +177,11 @@ onMounted(() => {
getUserList()
})
})
const defaultProps ={
children: 'children',
label: 'name',
label: 'name',
}
</script>
<template>
@ -176,6 +191,8 @@ const defaultProps ={
:append-to-body="true"
:props="defaultProps "
width="80%"
top="2vh"
draggable
>
<el-row :gutter="20">
<el-col :span="6" style="padding:0">
@ -197,7 +214,7 @@ const defaultProps ={
<el-button @click="resetClick">重置</el-button>
</div>
<div class="list">
<el-table :data="tableData" style="width: 100%">
<el-table :data="tableData" style="width: 100%; height:710px">
<el-table-column prop="userName" label="照片" width="100px" align="center">
<template #default="scope">
<el-avatar v-if="scope.row.icon != ''" shape="square" :size="30" :src="scope.row.icon" />
@ -241,7 +258,7 @@ const defaultProps ={
<div>已选择{{ checkDataList.length }}</div>
<el-button type="danger" @click="delAllClick" size="small">全部移除</el-button>
</div>
<el-table :data="checkDataList">
<el-table :data="checkDataList" style="height:710px">
<el-table-column prop="userName" label="照片" width="60px" align="center">
<template #default="scope">
<el-avatar v-if="scope.row.icon != ''" shape="square" :size="30" :src="scope.row.icon" />

26
src/components/DesignForm/public/form/form.vue

@ -35,6 +35,7 @@ const props = withDefaults(
beforeSubmit?: Function | string //
afterSubmit?: Function // return false
closeAppSubmit?: Function
changeKeyVal?: Function //
value?: { [key: string]: any } // setValue
options?: { [key: string]: any } // setOptions
dict?: object //
@ -124,7 +125,7 @@ const model = ref<any>({})
const getInitModel = () => {
const obj = {}
forEachGetFormModel(props.formData.list, obj)
console.log("obj===>",obj)
// console.log("obj===>",obj)
model.value = obj
}
watch(
@ -155,7 +156,11 @@ const forEachGetFormModel = (list: FormList[], obj: any) => {
}
// tProp
provide(constControlChange, ({ key, value, data, tProp }: any) => {
provide(constControlChange, ({ key, value, data, tProp, type, attribute }: any) => {
// console.log("--constControlChange-->",key, value, data, tProp,type,attribute)
if (typeof props.changeKeyVal === 'function') {
props.changeKeyVal(key, value,type,attribute)
}
if (key) {
if (!tProp) {
// change
@ -226,9 +231,9 @@ const ruleForm = ref()
const validate = (callback: any) => {
ruleForm.value.validate((valid: boolean, fields: any) => {
console.log("ruleForm.value--->filter-->",ruleForm.value)
console.log("getValue--->fields-->",fields)
console.log("getValue--->valid-->",valid)
// console.log("ruleForm.value--->filter-->",ruleForm.value)
// console.log("getValue--->fields-->",fields)
// console.log("getValue--->valid-->",valid)
let fieldValue = fields
if (valid) {
@ -240,8 +245,8 @@ const validate = (callback: any) => {
}
//
const getValue = (filter?: boolean) => {
console.log("getValue--->filter-->",filter)
console.log("getValue--->model-->",model)
// console.log("getValue--->filter-->",filter)
// console.log("getValue--->model-->",model)
if (filter) {
const obj: any = {}
for (const key in model.value) {
@ -255,6 +260,7 @@ const getValue = (filter?: boolean) => {
}
return obj
} else {
// console.log("getValue--->model-value->",model.value)
return model.value
}
}
@ -351,7 +357,7 @@ const getData = (params = {}) => {
.then((res: any) => {
loading.value = false
const result = res.data
console.log("停止数据请求--->",res)
// console.log("--->",res)
if (result) {
let formatRes: any = result
//
@ -383,7 +389,7 @@ const getData = (params = {}) => {
loading.value = false
return ElMessage.error(res.message)
})
console.log("res------执行了获取数据方法,但配置有误----->", requestUrl,newParams2,newParams)
// console.log("res----------->", requestUrl,newParams2,newParams)
}
@ -448,7 +454,7 @@ const submit = (params = {}) => {
// loading.value = true
// console.log("apiUrl--->",apiUrl)
// console.log("submitParams--->",submitParams)
console.log("formatParams--->",formatParams)
// console.log("formatParams--->",formatParams)
//
currencyFormApiSubmit(apiUrl, submitParams ?? formatParams)
.then((res: any) => {

1
src/components/DesignForm/public/form/formGroup.vue

@ -45,6 +45,7 @@ watch(
() => props.data,
(v: FormList[]) => {
dataList.value = v
// console.log("++++++++++>",v)
}
)
const activeKey = computed(() => {

18
src/components/DesignForm/public/form/formItem.vue

@ -64,12 +64,20 @@ const control = computed(() => {
const options = ref(props.data.options)
const changeEvent = inject(constControlChange, '') as any
const updateModel = (val: any) => {
let controlAttribute = ""
if(props.data.control){
if(props.data.control.type){
controlAttribute = props.data.control.type
}
}
changeEvent &&
changeEvent({
key: props.data.name,
value: val,
data: props.data,
tProp: props.tProp
tProp: props.tProp,
type: props.data.type,
attribute: controlAttribute
})
}
const value = computed({
@ -131,6 +139,14 @@ const currentComponent = computed(() => {
if (props.data.type === 'datePicker') {
props.data.control.valueFormat="x"
}
if (props.data.type === 'switch') {
if(typeof props.data.control.activeValue === "number"){
props.data.control.activeValue=props.data.control.activeValue.toString()
}
if(typeof props.data.control.inactiveValue === "number"){
props.data.control.inactiveValue=props.data.control.inactiveValue.toString()
}
}
// if (props.data.type === 'timePicker') {
// props.data.control.valueFormat="timestamp"
// }

2
src/components/workflow/dialog/common.ts

@ -60,7 +60,7 @@ export let getRoleList = async () => {
export let getPostList = async () => {
let { data } = await GetPositionUnify()
console.log("getPostList",data);
// console.log("getPostList",data);
positionList.value = data;
}

20
src/components/workflow/dialog/employeesDialog.vue

@ -43,27 +43,27 @@ let list = computed(()=> {
isDepartment: props.isdepartment,
type: 'department',
data: departments.value.childDepartments,
isActive: (item)=> $func.toggleClass(checkedDepartmentList.value, item),
change: (item)=> $func.toChecked(checkedDepartmentList.value, item),
next: (item)=> getDepartmentList(item.id)
isActive: (item:any)=> $func.toggleClass(checkedDepartmentList.value, item),
change: (item:any)=> $func.toChecked(checkedDepartmentList.value, item),
next: (item:any)=> getDepartmentList(item.id)
},{
type: 'employee',
data: departments.value.employees,
isActive: (item)=> $func.toggleClass(checkedEmployessList.value, item),
change: (item)=> $func.toChecked(checkedEmployessList.value, item),
isActive: (item:any)=> $func.toggleClass(checkedEmployessList.value, item),
change: (item:any)=> $func.toChecked(checkedEmployessList.value, item),
}]
})
let resList = computed(()=>{
let data = [{
type: 'employee',
data: checkedEmployessList.value,
cancel: (item)=> $func.removeEle(checkedEmployessList.value, item)
cancel: (item:any)=> $func.removeEle(checkedEmployessList.value, item)
}]
if(props.isdepartment){
data.unshift({
type: 'department',
data: checkedDepartmentList.value,
cancel: (item)=> $func.removeEle(checkedDepartmentList.value, item)
cancel: (item:any)=> $func.removeEle(checkedDepartmentList.value, item)
})
}
return data
@ -84,17 +84,17 @@ const closeDialog = ()=> {
emits('update:visible', false)
}
watch(()=> props.visible, (val)=>{
watch(()=> props.visible, (val:any)=>{
if(val){
getDepartmentList();
searchVal.value = "";
// console.log("props.data:",props.data)
if(props.data){
checkedEmployessList.value = props.data.filter(item=>item.type===1).map(({name,targetId})=>({
checkedEmployessList.value = props.data.filter((item:any)=>item.type===1).map(({name,targetId})=>({
employeeName: name,
id: targetId
}));
checkedDepartmentList.value = props.data.filter(item=>item.type===3).map(({name,targetId})=>({
checkedDepartmentList.value = props.data.filter((item:any)=>item.type===3).map(({name,targetId})=>({
departmentName: name,
id: targetId
}));

30
src/components/workflow/dialog/employeesRoleDialog.vue

@ -47,8 +47,8 @@ let list = computed(()=> {
not: false,
data: roles.value,
isDepartment: props.isDepartment,
isActive: (item)=> $func.toggleClass(checkedRoleList.value, item, 'roleId'),
change: (item)=> $func.toChecked(checkedRoleList.value, item, 'roleId')
isActive: (item:any)=> $func.toggleClass(checkedRoleList.value, item, 'roleId'),
change: (item:any)=> $func.toChecked(checkedRoleList.value, item, 'roleId')
}]
}else{
return [
@ -56,14 +56,14 @@ let list = computed(()=> {
isDepartment: props.isDepartment,
type: 'department',
data: departments.value.childDepartments,
isActive: (item)=> $func.toggleClass(checkedDepartmentList.value, item),
change: (item)=> $func.toChecked(checkedDepartmentList.value, item),
next: (item)=> getDepartmentList(item.id)
isActive: (item:any)=> $func.toggleClass(checkedDepartmentList.value, item),
change: (item:any)=> $func.toChecked(checkedDepartmentList.value, item),
next: (item:any)=> getDepartmentList(item.id)
},{
type: 'employee',
data: departments.value.employees,
isActive: (item)=> $func.toggleClass(checkedEmployessList.value, item),
change: (item)=> $func.toChecked(checkedEmployessList.value, item),
isActive: (item:any)=> $func.toggleClass(checkedEmployessList.value, item),
change: (item:any)=> $func.toChecked(checkedEmployessList.value, item),
}
]
}
@ -73,38 +73,38 @@ let resList = computed(()=>{
let data = [{
type: 'role',
data: checkedRoleList.value,
cancel: (item)=> $func.removeEle(checkedRoleList.value, item, 'roleId')
cancel: (item:any)=> $func.removeEle(checkedRoleList.value, item, 'roleId')
},{
type: 'employee',
data: checkedEmployessList.value,
cancel: (item)=> $func.removeEle(checkedEmployessList.value, item)
cancel: (item:any)=> $func.removeEle(checkedEmployessList.value, item)
}]
if(props.isDepartment){
data.splice(1, 0, {
type: 'department',
data: checkedDepartmentList.value,
cancel: (item)=> $func.removeEle(checkedDepartmentList.value, item)
cancel: (item:any)=> $func.removeEle(checkedDepartmentList.value, item)
})
}
return data
})
watch(()=> props.visible, (val)=>{
watch(()=> props.visible, (val:any)=>{
// console.log("props.data====",props.data)
if(val){
activeName.value = "1";
getDepartmentList();
searchVal.value = "";
checkedEmployessList.value = props.data.filter(item=>item.type===1).map(({name,targetId,icon,iconToBase64})=>({
checkedEmployessList.value = props.data.filter((item:any)=>item.type===1).map(({name,targetId,icon,iconToBase64})=>({
employeeName: name,
id: targetId,
icon: icon,
iconToBase64: iconToBase64
}));
checkedRoleList.value = props.data.filter(item=>item.type===2).map(({name,targetId})=>({
checkedRoleList.value = props.data.filter((item:any)=>item.type===2).map(({name,targetId})=>({
roleName: name,
roleId: targetId
}));
checkedDepartmentList.value = props.data.filter(item=>item.type===3).map(({name,targetId})=>({
checkedDepartmentList.value = props.data.filter((item:any)=>item.type===3).map(({name,targetId})=>({
departmentName: name,
id: targetId
}));
@ -129,7 +129,7 @@ const saveDialog = ()=> {
...checkedRoleList.value,
...checkedEmployessList.value,
...checkedDepartmentList.value
].map(item=>({
].map((item:any)=>({
type: item.employeeName?1:(item.roleName?2:3),
targetId: item.id || item.roleId,
name: item.employeeName || item.roleName || item.departmentName,

18
src/components/workflow/dialog/formWord.vue

@ -38,9 +38,9 @@ let list = computed(() => {
type: 'formword',
not: false,
data: formWordList.value,
isActive: (item) => $func.toggleClass(checkedFormList.value, item, 'id'),
isActive: (item:any) => $func.toggleClass(checkedFormList.value, item, 'id'),
change: (item) => {
change: (item:any) => {
checkedFormList.value = [item]
}
}]
@ -49,8 +49,8 @@ let list = computed(() => {
type: 'formword',
not: true,
data: formWordList.value,
isActive: (item) => $func.toggleClass(checkedFormList.value, item, 'id'),
change: (item)=> $func.toChecked(checkedFormList.value, item),
isActive: (item:any) => $func.toggleClass(checkedFormList.value, item, 'id'),
change: (item:any)=> $func.toChecked(checkedFormList.value, item),
}]
}
@ -60,13 +60,13 @@ let resList = computed(() => {
return [{
type: 'formword',
data: checkedFormList.value,
cancel: (item) => $func.removeEle(checkedFormList.value, item, 'id')
cancel: (item:any) => $func.removeEle(checkedFormList.value, item, 'id')
}]
}else{
return [{
type: 'formword',
data: checkedFormList.value,
cancel: (item)=> $func.removeEle(checkedFormList.value, item)
cancel: (item:any)=> $func.removeEle(checkedFormList.value, item)
}]
}
})
@ -78,11 +78,11 @@ let isShow = computed({
get() {
return props.visible
},
set(val) {
set(val:any) {
closeDialog()
}
})
watch(() => props.visible, (val) => {
watch(() => props.visible, (val:any) => {
if (val) {
gainFormTableWorde(props.formid,props.formtype);
searchVal.value = "";
@ -97,7 +97,7 @@ watch(() => props.visible, (val) => {
let total = computed(() => checkedFormList.value.length)
const saveDialog = () => {
let checkedList = checkedFormList.value.map(item => ({
let checkedList = checkedFormList.value.map((item:any) => ({
type: props.formtype,
name: item.name,
id: item.id,

6
src/components/workflow/dialog/matrix.vue

@ -78,13 +78,13 @@ function searchMatrixList(){
matrixContList.value = data.list
total.value = data.total
if(data.list.length > 0){
farstId.val = data.list[0].id*1
farstId.value = data.list[0].id*1
// matrixIsClick.matrixid = data.list[0].id*1
// matrixIsClick.matrixName = data.list[0].name
}
}).finally(()=>{
loading.value = false
gainMatrixNeed(farstId.val);
gainMatrixNeed(farstId.value);
})
}
const factorList = ref<martixFieldStruct[]>()
@ -123,7 +123,7 @@ const pickval = (val:martixFieldStruct) =>{
}
//
const pickSelect = (val:any) =>{
factorList.value.forEach(item=>{
factorList.value.forEach((item:any)=>{
if(item.id==val){
matrixIsClick.factorid = item.id*1
matrixIsClick.factorName = item.name

30
src/components/workflow/dialog/positionDialog.vue

@ -28,11 +28,11 @@ let list = computed(() => {
return [{
type: 'position',
data: positionList.value,
isActive: (item) => $func.toggleClass(checkedRoleList.value, item, 'id'),
isActive: (item:any) => $func.toggleClass(checkedRoleList.value, item, 'id'),
// change: (item) => {
// checkedRoleList.value = [item]
// }
change: (item)=> $func.toChecked(checkedRoleList.value, item),
change: (item:any)=> $func.toChecked(checkedRoleList.value, item),
}]
})
let resList = computed(() => {
@ -40,7 +40,7 @@ let resList = computed(() => {
type: 'position',
data: checkedRoleList.value,
// cancel: (item) => $func.removeEle(checkedRoleList.value, item, 'id')
cancel: (item)=> $func.removeEle(checkedRoleList.value, item)
cancel: (item:any)=> $func.removeEle(checkedRoleList.value, item)
}]
})
let visibleDialog = computed({
@ -51,25 +51,41 @@ let visibleDialog = computed({
closeDialog()
}
})
watch(() => props.visible, (val) => {
watch(() => props.visible, (val:any) => {
if (val) {
getPostList();
searchVal.value = "";
// console.log("--->",props.data)
checkedRoleList.value = props.data.map(({ name, targetId }) => ({
name: name,
name: name,
id: targetId
}));
}
})
let total = computed(() => checkedRoleList.value.length)
const saveDialog = () => {
let checkedList = checkedRoleList.value.map(item => ({
// console.log("",checkedRoleList.value)
let checkedList = checkedRoleList.value.map((item:any) => ({
type: 4,
targetId: item.id.toString(),
name: item.name
name: item.name,
options:optionsList(item.PositionListId)
}))
// console.log("--2--->",checkedList)
emits('change', checkedList)
}
const optionsList = (val:any[]) =>{
let optionsAry = new Array
if(val&&val.length>0){
val.forEach((item:any) => {
optionsAry.push({
label:"",
value:item.toString()
})
})
}
return optionsAry
}
const delList = () => {
checkedRoleList.value = [];
}

10
src/components/workflow/dialog/roleDialog.vue

@ -30,8 +30,8 @@ let list = computed(() => {
not: true,
isDepartment:false,
data: roles.value,
isActive: (item) => $func.toggleClass(checkedRoleList.value, item, 'roleId'),
change: (item) => {
isActive: (item:any) => $func.toggleClass(checkedRoleList.value, item, 'roleId'),
change: (item:any) => {
checkedRoleList.value = [item]
}
}]
@ -40,7 +40,7 @@ let resList = computed(() => {
return [{
type: 'role',
data: checkedRoleList.value,
cancel: (item) => $func.removeEle(checkedRoleList.value, item, 'roleId')
cancel: (item:any) => $func.removeEle(checkedRoleList.value, item, 'roleId')
}]
})
let visibleDialog = computed({
@ -51,7 +51,7 @@ let visibleDialog = computed({
closeDialog()
}
})
watch(() => props.visible, (val) => {
watch(() => props.visible, (val:any) => {
if (val) {
getRoleList();
searchVal.value = "";
@ -63,7 +63,7 @@ watch(() => props.visible, (val) => {
})
let total = computed(() => checkedRoleList.value.length)
const saveDialog = () => {
let checkedList = checkedRoleList.value.map(item => ({
let checkedList = checkedRoleList.value.map((item:any) => ({
type: 2,
targetId: item.roleId,
name: item.roleName

27
src/components/workflow/drwer/approverDrawer.vue

@ -66,7 +66,9 @@ watch(visible,(val:any)=>{
})
watch(approverConfig1, (val:any)=>{
// console.log("directormaxlevel",visible.value)\
val.value.attribute = val.value.attribute*1
// console.log("directormaxlevel",val.value)
matrixIsShow.value = false
approverConfig.value = val.value
if(val.type == 3){
@ -75,7 +77,7 @@ watch(approverConfig1, (val:any)=>{
nodeTitle.value = "审批人设置"
}
isExecutor.value = false
// approverConfig.attribute = approverConfig.attribute*1
if(visible.value){
judgeOptionalNode(props.nodeConfig)
.then((data:any)=>{
@ -89,7 +91,7 @@ watch(approverConfig1, (val:any)=>{
if(data.code == 0){
nodeOptional.value = data.data.allcont
if(data.data.allcont && data.data.allcont.length > 0){
data.data.allcont.forEach(item => {
data.data.allcont.forEach((item:any) => {
if(item.type == 3){
isExecutor.value = true
return
@ -221,10 +223,10 @@ const updateMatrix = (val:any) =>{
<div v-if="approverConfig.settype==2" class="approver_manager">
<p>
<el-row :gutter="10">
<el-col :span="6">
<el-col v-if="isExecutor" :span="6">
<select v-model="approverConfig.attribute" style="width:100%">
<option value="1">发起人</option>
<option v-if="isExecutor" value="2">执行人</option>
<option value="2">执行人</option>
</select>
</el-col>
<el-col :span="18">
@ -245,9 +247,9 @@ const updateMatrix = (val:any) =>{
<el-button type="primary" @click="addApproverPost">添加/修改行政岗位</el-button>
</el-col>
<el-col :span="6">
<select v-model="approverConfig.attribute" style="width:100%">
<select v-if="isExecutor" v-model="approverConfig.attribute" style="width:100%">
<option value="1">发起人</option>
<option v-if="isExecutor" value="2">执行人</option>
<option value="2">执行人</option>
</select>
</el-col>
</el-row>
@ -283,10 +285,10 @@ const updateMatrix = (val:any) =>{
<p>审批终点</p>
<p style="padding-bottom:20px">
<el-row :gutter="10">
<el-col :span="6">
<el-col v-if="isExecutor" :span="6">
<select v-model="approverConfig.attribute" style="width:100%">
<option value="1">发起人</option>
<option v-if="isExecutor" value="2">执行人</option>
<option value="2">执行人</option>
</select>
</el-col>
<el-col :span="10">
@ -318,7 +320,10 @@ const updateMatrix = (val:any) =>{
</div>
<!--权限矩阵-->
<div v-if="approverConfig.settype==9" class="approver_manager">
<select v-if="isExecutor" v-model="approverConfig.attribute" style="width:100%">
<option value="1">发起人</option>
<option value="2">执行人</option>
</select>
<MatrixPage
v-model:isshow="matrixIsShow"
:data="matrixFieldList"
@ -332,7 +337,7 @@ const updateMatrix = (val:any) =>{
<el-radio-group v-model="approverConfig.examineMode" class="clear">
<el-radio :label="1">依次审批</el-radio>
<el-radio v-if="approverConfig.settype!=2" :label="2">会签(须所有审批人同意)</el-radio>
<el-radio v-if="approverConfig.settype!=2" :label="3">非会(有一位审批人同意即可)</el-radio>
<el-radio v-if="approverConfig.settype!=2" :label="3">(有一位审批人同意即可)</el-radio>
</el-radio-group>
</div>
<div v-if="approverConfig.settype==2||approverConfig.settype==6||approverConfig.settype==9" class="approver_some">

32
src/components/workflow/drwer/conditionDrawer.vue

@ -86,8 +86,8 @@ watch(visible,(val:any)=>{
gainNodeFactor(sendData)
.then(({data}) =>{
// console.log("......>",data)
if(data.length > 0){
data.forEach(item=>{
if(data && data.length > 0){
data.forEach((item:any)=>{
flowFactorList.value.push({
id:flowFactorList.value.length+1,
name:item.name,
@ -166,7 +166,7 @@ const addFactorCondition = () => {
})
}
if(currLent < flowFactorList.value.length){
tableList.value.push({id:currLent+1,name:"",factorid:"",type:0,isok:false,isCheckbox:true,options:[],answers:[],customFields:[]})
tableList.value.push({id:currLent+1,name:"",factorid:"",type:0,isok:false,isCheckbox:true,options:[],oneanswer:"",answers:[],customFields:[]})
if(currLent+1 >= flowFactorList.value.length){
maxFactor.value = true
}else{
@ -204,15 +204,15 @@ const initFactor = () => {
const delTiaoJian = (val:any) => {
let currLent = tableList.value.length
if(currLent>0){
let guoduTable = []
tableList.value.forEach(item=>{
let guoduTable = new Array
tableList.value.forEach((item:any)=>{
if(item.factorid != val.factorid){
guoduTable.push(item)
}
})
tableList.value = guoduTable
}
flowFactorList.value.forEach(item=>{
flowFactorList.value.forEach((item:any)=>{
if(item.keyid == val.factorid){
item.isok=false
}
@ -231,7 +231,7 @@ const saveCondition = () => {
let isError = false
if(tableList.value.length>0){
for (var i = 0; i < tableList.value.length; i++) {
var {name,type,options,nodeUserList,answers,isCheckbox,customFields} = tableList.value[i]
var {name,type,options,nodeUserList,oneanswer,answers,isCheckbox,customFields} = tableList.value[i]
console.log("conditionConfig.conditionList--1->",name);
console.log("conditionConfig.conditionList--2->",type);
console.log("conditionConfig.conditionList--3->",options);
@ -239,6 +239,7 @@ const saveCondition = () => {
console.log("conditionConfig.conditionList--5->",answers);
console.log("conditionConfig.conditionList--6->",isCheckbox);
console.log("conditionConfig.conditionList--7->",customFields);
console.log("conditionConfig.conditionList--8->",oneanswer);
switch(type){
case 1:
if(nodeUserList){
@ -262,13 +263,18 @@ const saveCondition = () => {
}
break;
case 3:
if(answers.length > 0){
if(!Array.isArray(answers)){
tableList.value[i].answers=[answers]
if (isCheckbox){
if(answers.length > 0){
if(!Array.isArray(answers)){
tableList.value[i].answers=[answers]
}
}else{
isError = true
}
}else{
isError = true
tableList.value[i].oneanswer=oneanswer
}
break;
default:
isError = true
@ -308,7 +314,7 @@ const addOrEditUser = (val:any) => {
checkedList.value = val
}
//
const sureCopyer = (data) => {
const sureCopyer = (data:any) => {
// console.log("",data)
// copyerConfig.value.nodeUserList = data;
copyerVisible.value = false;
@ -441,7 +447,7 @@ const delCuresTiaoJian = (val:any,old:any) => {
<el-button type="warning" style="margin-top:0px" @click="addCustomFields">添加条件</el-button>
</template>
<template v-if="itemw.type==3">
<el-radio-group v-if="!itemw.isCheckbox" v-model="itemw.answers">
<el-radio-group v-if="!itemw.isCheckbox" v-model="itemw.oneanswer">
<el-radio v-for="optVal in itemw.options" :key="optVal.value" :label="optVal.value">{{optVal.label}}</el-radio>
</el-radio-group>
<el-checkbox-group v-if="itemw.isCheckbox" v-model="itemw.answers">

2
src/components/workflow/drwer/copyerDrawer.vue

@ -32,7 +32,7 @@ const addCopyer = () => {
copyerVisible.value = true;
checkedList.value = copyerConfig.value.nodeUserList
}
const sureCopyer = (data) => {
const sureCopyer = (data:any) => {
// console.log("",data)
copyerConfig.value.nodeUserList = data;
copyerVisible.value = false;

2
src/components/workflow/drwer/promoterDrawer.vue

@ -33,7 +33,7 @@ const addPromoter = () => {
checkedList.value = flowPermission.value
promoterVisible.value = true;
}
const surePromoter = (data) => {
const surePromoter = (data:any) => {
flowPermission.value = data;
promoterVisible.value = false;
}

2
src/components/workflow/nodeWrap.vue

@ -104,7 +104,7 @@ const addTerm = () => {
const delTerm = (index: any) => {
// eslint-disable-next-line vue/no-mutating-props
props.nodeConfig.conditionNodes.splice(index, 1);
props.nodeConfig.conditionNodes.map((item, index) => {
props.nodeConfig.conditionNodes.map((item:any, index:any) => {
item.priorityLevel = index + 1;
item.nodeName = `条件${index + 1}`;
});

41
src/utils/workflow/const.ts

@ -47,3 +47,44 @@ export let flowFactor = [
{id:1,name:"申请人",keyid:"applicant",type:1,isok:false,isCheckbox:true,options:[],customFields:[]},
{id:2,name:"自定义字段",keyid:"customFields",type:2,isok:false,isCheckbox:false,options:[],customFields:[]}
]
//暂时不做审批条件得控件类型
export let notAsA_BasisForJudgment = [
"datePicker",
"input",
"password",
"textarea",
"timePicker",
"colorPicker",
"switch",
"inputNumber",
"cascader",
"rate",
"slider",
"treeSelect",
"txt",
"title",
"upload",
"tinymce",
"button",
]
//作为审批节点操作人控件
export let asAnApprovalActionControl = ["expand-user"]
//定值类控件
export let fixedValueControl = [
"switch",
"inputNumber",
"rate",
"slider",
]
//时间类控件
//定值类控件
export let timeControl = [
"datePicker",
"timePicker"
]
//时间等式取值
export let timeEquation = [
"datetimerange",
"daterange",
"monthrange"
]

70
src/utils/workflow/index.ts

@ -69,7 +69,7 @@ All.prototype = {
} else if (nodeConfig.examineMode == 2) {
return nodeConfig.nodeUserList.length + "人会签"
}else if (nodeConfig.examineMode == 3) {
return nodeConfig.nodeUserList.length + "人非会签"
return nodeConfig.nodeUserList.length + "人签"
}
}else{
// return "指定成员"
@ -82,7 +82,7 @@ All.prototype = {
} else if (nodeConfig.examineMode == 2) {
return level + "会签"
}else if (nodeConfig.examineMode == 3) {
return level + + "非会签"
return level + + "签"
}
} else if (nodeConfig.settype == 3) {
// console.log("nodeConfig==会签==>",nodeConfig)
@ -92,13 +92,13 @@ All.prototype = {
return "指定行政岗位"
}
} else if (nodeConfig.settype == 4) {
// console.log("nodeConfig.selectRange",nodeConfig.selectRange,nodeConfig.nodeUserList);
console.log("nodeConfig.selectRange",nodeConfig.selectRange,nodeConfig.nodeUserList);
if (nodeConfig.selectRange == 1) {
return "发起人自选"
} else {
if (nodeConfig.nodeUserList.length > 0) {
if (nodeConfig.selectRange == 2) {
return "发起人自选"
return "发起人从指定成员中自选"
} else {
return '发起人从' + nodeConfig.nodeUserList[0].name + '中自选'
}
@ -121,7 +121,7 @@ All.prototype = {
} else if (nodeConfig.examineMode == 2) {
return nodeConfig.nodeUserList[0].name + "会签"
}else if (nodeConfig.examineMode == 3) {
return nodeConfig.nodeUserList[0].name + "非会签"
return nodeConfig.nodeUserList[0].name + "签"
}
}
@ -133,7 +133,7 @@ All.prototype = {
} else if (nodeConfig.examineMode == 2) {
return strVal + "会签"
}else if (nodeConfig.examineMode == 3) {
return strVal + "非会签"
return strVal + "签"
}
}
@ -175,7 +175,7 @@ All.prototype = {
for (var i = 0; i < conditionList.length; i++) {
// console.log("判断调教分支形同--6->",conditionList[i])
var {name,type,options,nodeUserList,answers,isCheckbox,customFields} = conditionList[i]
var {name,type,options,nodeUserList,answers,isCheckbox,customFields,oneanswer} = conditionList[i]
switch(type){
case 1:
if(nodeUserList.length > 0){
@ -184,6 +184,7 @@ All.prototype = {
}
break;
case 2:
if(customFields.length > 0){
customFields.forEach((item:any) =>{
if (item.optType != 6 && item.leftval) {
@ -198,29 +199,42 @@ All.prototype = {
}
break;
case 3:
if(answers.length > 0){
str += name + "为"
if(Array.isArray(answers)){
let valStr = ""
options.forEach((item:any)=>{
if(answers.includes(item.value)){
valStr += `${item.label}`
}
// console.log("answers.includes(item.value)",answers.includes(item.value),answers,item.value,valStr)
})
// str += valStr+` 并且 `
str += valStr ? valStr.substring(0, valStr.length - 2)+` 并且 `:"";
}else{
options.forEach((item:any)=>{
if(item.value == answers){
str += item.label+` 并且 `
}
})
if(isCheckbox){
if(answers.length > 0){
str += name + "为"
if(Array.isArray(answers)){
let valStr = ""
options.forEach((item:any)=>{
if(answers.includes(item.value)){
valStr += `${item.label}`
}
// console.log("answers.includes(item.value)",answers.includes(item.value),answers,item.value,valStr)
})
// str += valStr+` 并且 `
str += valStr ? valStr.substring(0, valStr.length - 2)+` 并且 `:"";
}else{
options.forEach((item:any)=>{
if(item.value == answers){
str += item.label+` 并且 `
}
})
}
}
}else{
str += name + "为"
options.forEach((item:any)=>{
// console.log("判断调教分支形同--6--1--->",oneanswer,item.value == oneanswer,item.value)
if(item.value == oneanswer){
str += item.label+` 并且 `
}
})
}
// console.log("判断调教分支形同--6--1-2-->",oneanswer,str,str.substring(0, str.length - 4))
break;
default:
}

2
src/views/appstore/appmarket/ccwl.vue

@ -18,7 +18,7 @@ function lookappcont(id:number){
//
const jumpUrl = (val:any) =>{
createOneClickLogin({url:val})
.then(data =>{
.then((data:any) =>{
console.log("跳转地址--->",data.data)
if(data.code == 0){
window.open(data.data,'_blank')

11
src/views/dashboard/components/allorgyear.vue

@ -85,8 +85,11 @@ const orgChartDrowData = () => {
},
series: dataAry
};
orgYearFullMonths.value.clear();
orgYearFullMonths.value.setOption(option)
if(orgYearFullMonths.value){
orgYearFullMonths.value.clear();
orgYearFullMonths.value.setOption(option)
}
}
orgAllYearLoading.value = false
@ -105,7 +108,9 @@ onMounted(() => {
orgChartDrowData();
window.addEventListener('resize', () => {
orgYearFullMonths.value.resize();
// if(orgYearFullMonths.value){
orgYearFullMonths.value.resize();
// }
});

2
src/views/dashboard/components/application.vue

@ -21,7 +21,7 @@ const appId = ref<number>()
//
const jumpUrl = (val:any) =>{
createOneClickLogin({url:val})
.then(data =>{
.then((data:any) =>{
console.log("跳转地址--->",data.data)
if(data.code == 0){
window.open(data.data,'_blank')

12
src/views/dashboard/components/dltbhb.vue

@ -33,7 +33,7 @@ const props = defineProps({
}
}
})
const creeTime = ref<string>(new Date())
const creeTime = ref<any>(new Date())
const loadingDlTHbi = ref(false)
const dingLiangOrgIng = ref()
@ -56,10 +56,10 @@ const gainDltbhxfx = () =>{
console.log(" props.dlyear.data", data)
})
}
watch(props.mainOrgList,()=>{
watch(()=>props.mainOrgList,()=>{
})
watch(props.targetListAry,()=>{
watch(()=>props.targetListAry,()=>{
console.log("改变值---1-->",props.targetListAry)
if(props.targetListAry&&props.targetListAry.length > 0){
console.log("改变值----->",props.targetListAry)
@ -67,10 +67,10 @@ watch(props.targetListAry,()=>{
}
})
watch(props.dingLiangOrg,()=>{
watch(()=>props.dingLiangOrg,()=>{
dingLiangOrgIng.value = props.dingLiangOrg
})
watch(props.dingLiangTarget,()=>{
watch(()=>props.dingLiangTarget,()=>{
dingLiangTargetIng.value = props.dingLiangTarget
})
@ -121,7 +121,7 @@ onMounted(() => {
</el-col>
</el-row>
</div>
<div ref="dlTargetThChart" v-loading="loading" element-loading-text="Loading..." class="allOrgAxisCares">
<div ref="dlTargetThChart" v-loading="loadingDlTHbi" element-loading-text="Loading..." class="allOrgAxisCares">
</div>
</el-card>

6
src/views/dashboard/components/sanlianping.vue

@ -101,7 +101,7 @@ const drawDlTbHbFx = () =>{
datetime:[timeYears]
}
bdTtsyoy(sendInfo)
.then((data)=>{
.then((data:any)=>{
if(data.code == 0){
let seriesAry = new Array
if(data.data.series&&data.data.series.length>0){
@ -263,7 +263,7 @@ const bdBdtTsMubiao = () =>{
name: data.data.series[0].name,
type: data.data.series[0].type,
tooltip: {
valueFormatter: function (value) {
valueFormatter: function (value:any) {
return value + data.data.series[0].tooltip;
}
},
@ -273,7 +273,7 @@ const bdBdtTsMubiao = () =>{
name: data.data.series[1].name,
type: data.data.series[1].type,
tooltip: {
valueFormatter: function (value) {
valueFormatter: function (value:any) {
return value + data.data.series[1].tooltip;
}
},

2
src/views/dashboard/components/userinfo.vue

@ -23,7 +23,7 @@ const props = defineProps({
<el-row :gutter="10">
<el-col :xs="24" :sm="12" :md="11" :lg="11" :xl="10" class="readback">
<!--人员头像-->
<el-avatar shape="square" :fit="cover" :src="props.userStore.avatar!=''?props.userStore.avatar:UserRole" style="width:100%; height:130px;" />
<el-avatar shape="square" fit="cover" :src="props.userStore.avatar!=''?props.userStore.avatar:UserRole" style="width:100%; height:130px;" />
</el-col>
<el-col :xs="24" :sm="12" :md="13" :lg="13" :xl="14" class="greenColor">
<!--人员信息-->

5
src/views/dashboard/index.vue

@ -9,7 +9,7 @@ import * as echarts from 'echarts'; //引入图形界面
import { useUserStore } from "@/store/modules/user";
import { sendOrgCont } from '@/api/displayboardapi/types'
import { orgInfo } from '@/api/displayboardapi/types'
import { getOrgChiled,getCompanyDeparment,targetListForDepartment } from '@/api/displayboardapi/indexapi'
import UserInfo from "@/views/dashboard/components/userinfo.vue";
@ -22,7 +22,7 @@ import Application from "@/views/dashboard/components/application.vue";
import HostNews from "@/views/dashboard/components/hostnews.vue";
const userStore = useUserStore();
const orgListCont = ref<sendOrgCont>()
const orgListCont = ref<orgInfo[]>([])
const educationOrgId = ref<number>(309)
const masterBody = ref<any>(null)
const drawerWidht = ref<any>()
@ -35,7 +35,6 @@ function getOrgList(){
console.log("获取行政组织-2-->",data)
orgListCont.value = data.list
educationOrgId.value = data.current
})
}

398
src/views/dashboard/index_20231108.vue

@ -1,398 +0,0 @@
<!--
@ 作者: 秦东
@ 时间: 2023-11-06 13:39:13
@ 备注: 首页
-->
<script lang='ts' setup>
import * as echarts from 'echarts'; //
import { useUserStore } from "@/store/modules/user";
import { sendOrgCont } from '@/api/displayboardapi/types'
import { getOrgChiled,getCompanyDeparment,targetListForDepartment } from '@/api/displayboardapi/indexapi'
import UserInfo from "@/views/dashboard/components/userinfo.vue";
import DingLiangTongBiHuanBi from "@/views/dashboard/components/dltbhb.vue";
import EducationChart from "@/views/dashboard/components/education.vue";
const userStore = useUserStore();
const legendList = new Array
const seriesData = new Array
const orgListCont = ref<sendOrgCont>()
const educationOrgId = ref<number>(309)
//
const mainOrgList = ref<any[]>([])
const targetListAry = ref<any[]>([])
const targetXingListAry = ref<any[]>([])
//
const dingXingYear = ref<number>()
const dingXingOrg = ref<any>()
const dingXingTarget = ref<any>()
//
const dingLiangDaChengYear = ref<number>()
const dingLiangDaChengOrg = ref<any>()
const dingLiangDaChengTarget = ref<any>()
//
const dingLiangYear = ref<number>()
const dingLiangOrg = ref<any>()
const dingLiangTarget = ref<any>()
const loadPage = ref(false)
/**
* 获取行政组织
*/
function getOrgList(){
getOrgChiled({id:313})
.then(( {data} )=>{
console.log("获取行政组织-2-->",data)
orgListCont.value = data.list
educationOrgId.value = data.current
})
}
//
const orgAboutTarget = (orgId:string,tarAttribute:number) =>{
let sendIfo = {
id:orgId,
attribute:tarAttribute
}
targetListForDepartment(sendIfo)
.then((data:any) =>{
console.log("获取指标-1-->",data)
if(tarAttribute==1){
targetXingListAry.value = data.data
if(data.data&&data.data.length>0){
dingXingTarget.value = data.data[0].id
}
}else{
targetListAry.value = data.data
if(data.data&&data.data.length>0){
dingLiangDaChengTarget.value = data.data[0].id
dingLiangTarget.value = data.data[0].id.toString()
}
}
})
.finally(() =>{
loadPage.value = true
})
}
//
const orgYearFullMonths = ref<any>()
const orgAllYears = ref<any>() //
const allOrgOneMonth = ref<any>() //
const oenOrgAllYears = ref<any>() //
const oenOrg = ref<any>() //
//
const departmentYears = ref<any>(null)
//
onMounted(() => {
let dataTime:any = new Date();
console.log("dataTime--->",dataTime.getFullYear())
let timeStrint:any = dataTime;
dingXingYear.value = dataTime
dingLiangDaChengYear.value = dataTime
dingLiangYear.value = dataTime
console.log("timeStrint-1-->",dataTime,dingLiangYear)
getOrgList();
orgYearFullMonths.value = echarts.init(departmentYears.value)
let option = {
tooltip: {
trigger: 'axis'
},
legend: {
data: ['Email', 'Union Ads', 'Video Ads', 'Direct', 'Search Engine'],
bottom:0
},
grid: {
top:"20px",
left: '1%',
right: '2%',
bottom: '30px',
containLabel: true
},
toolbox: {
feature: {
saveAsImage: {}
}
},
xAxis: {
type: 'category',
boundaryGap: false,
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
},
yAxis: {
type: 'value'
},
series: [
{
name: 'Email',
type: 'line',
stack: 'Total',
data: [120, 132, 101, 134, 90, 230, 210]
},
{
name: 'Union Ads',
type: 'line',
stack: 'Total',
data: [220, 182, 191, 234, 290, 330, 310]
},
{
name: 'Video Ads',
type: 'line',
stack: 'Total',
data: [150, 232, 201, 154, 190, 330, 410]
},
{
name: 'Direct',
type: 'line',
stack: 'Total',
data: [320, 332, 301, 334, 390, 330, 320]
},
{
name: 'Search Engine',
type: 'line',
stack: 'Total',
data: [820, 932, 901, 934, 1290, 1330, 1320]
}
]
};
orgYearFullMonths.value.setOption(option)
})
</script>
<template>
<div ref="masterBody" class="app-container" style="margin-top:10px;">
<el-row :gutter="10">
<el-col :xs="24" :sm="16" :md="16" :lg="18" :xl="19" class="readback">
<el-card shadow="always" :body-style="{ padding: '10px' }" style = "border-radius: 12px;margin-top: 10px;">
<!--分厂数据统计-->
<div class="orgAllMothsTitle">
<el-text class="titleInfo">2023年绩效成绩</el-text>
<el-date-picker
v-model="allOrgOneMonth"
type="year"
placeholder="请选择时间"
/>
</div>
<div ref="departmentYears" class="allOrgAxisCares">
</div>
</el-card>
</el-col>
<el-col :xs="24" :sm="8" :md="8" :lg="6" :xl="5" class="greenColor">
<UserInfo :user-store="userStore" />
</el-col>
</el-row>
<el-row :gutter="10" class="cart_top_juLi">
<el-col :xs="24" :sm="16" :md="16" :lg="18" :xl="19" class="readback">
<el-row :gutter="10">
<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" class="readback">
<el-card shadow="always" :body-style="{ padding: '10px' }" style = "border-radius: 12px;margin-top: 10px;">
<!--单月全厂统计-->
<div class="orgAllMothsTitle">
<el-text class="titleInfo">2023年10月绩效成绩</el-text>
<el-date-picker
v-model="orgAllYears"
type="month"
placeholder="请选择时间"
/>
</div>
<div ref="departmentMonths" class="allOrgAxisCares">
</div>
</el-card>
</el-col>
<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" class="readback">
<el-card shadow="always" :body-style="{ padding: '10px' }" style = "border-radius: 12px;margin-top: 10px;">
<!--单一行政组织全年统计-->
<div class="orgAllMothsTitle">
<el-text class="titleInfo">2023年备煤绩效成绩</el-text>
<div>
<el-select v-model="oenOrg" placeholder="" style="width:100px">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
<el-date-picker
v-model="oenOrgAllmonth"
type="month"
placeholder="请选择时间"
style="width:120px"
/>
</div>
</div>
<div ref="departmentMonths" class="allOrgAxisCares">
</div>
</el-card>
</el-col>
</el-row>
</el-col>
<el-col :xs="24" :sm="8" :md="8" :lg="6" :xl="5" class="greenColor">
<el-card shadow="always" :body-style="{ padding: '10px' }" style = "border-radius: 12px;margin-top: 10px;; height: 335px">
<!--单月全厂统计-->
<div class="orgAllMothsTitle">
<el-text class="titleInfo">热门新闻</el-text>
</div>
<div ref="departmentMonths" class="allOrgAxisCares">
</div>
</el-card>
</el-col>
</el-row>
<el-row :gutter="10" class="cart_top_juLi">
<el-col :xs="24" :sm="16" :md="16" :lg="18" :xl="19" class="readback">
<el-row :gutter="10">
<el-col :xs="24" :sm="24" :md="24" :lg="8" :xl="8">
<el-card shadow="always" :body-style="{ padding: '10px' }" style = "border-radius: 12px;margin-top: 10px;">
<div class="orgAllMothsTitle">
<el-row>
<el-col :span="8">
<el-date-picker
v-model="dingXingYear"
type="year"
placeholder="请选择时间"
style="width:100%"
/>
</el-col>
<el-col :span="8">
<el-select v-model="dingXingOrg" placeholder="" style="width:100%">
<el-option
v-for="item in mainOrgList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-col>
<el-col :span="8">
<el-select v-model="dingXingTarget" placeholder="" style="width:100%">
<el-option
v-for="item in targetXingListAry"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-col>
</el-row>
</div>
<div ref="departmentMonths" class="allOrgAxisCares">
</div>
</el-card>
</el-col>
<el-col :xs="24" :sm="24" :md="24" :lg="8" :xl="8">
<el-card shadow="always" :body-style="{ padding: '10px' }" style = "border-radius: 12px;margin-top: 10px;">
<div class="orgAllMothsTitle">
<el-row>
<el-col :span="8">
<el-date-picker
v-model="dingLiangDaChengYear"
type="year"
placeholder="请选择时间"
style="width:100%"
/>
</el-col>
<el-col :span="8">
<el-select v-model="dingLiangDaChengOrg" placeholder="" style="width:100%">
<el-option
v-for="item in mainOrgList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-col>
<el-col :span="8">
<el-select v-model="dingLiangDaChengTarget" placeholder="" style="width:100%">
<el-option
v-for="item in targetListAry"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-col>
</el-row>
</div>
<div ref="departmentMonths" class="allOrgAxisCares">
</div>
</el-card>
</el-col>
<el-col :xs="24" :sm="24" :md="24" :lg="8" :xl="8">
<!--定量指标同比环比-->
<DingLiangTongBiHuanBi v-if="loadPage" :main-org-list="mainOrgList" :target-list-ary="targetListAry" :dlyear="dingLiangYear" :ding-liang-org="dingLiangOrg" :ding-liang-target="dingLiangTarget" />
</el-col>
</el-row>
</el-col>
<el-col :xs="24" :sm="8" :md="8" :lg="6" :xl="5" class="greenColor">
<EducationChart :org-list-cont="orgListCont" :education-org-id="educationOrgId" />
</el-col>
</el-row>
</div>
</template>
<style lang='scss' scoped>
.readback{
// background-color:#FF0000;
.allOrgAxisCares{
display: block;
width:100%;
height:280px;
overflow:auto;
}
}
.orgAllMothsTitle{
width:100%;
display: flex;
align-items: center;
justify-content:space-between;
}
.greenColor{
// background-color:#FFAC52;
// padding:0 10px 0 10px;
}
.span_icon_left{
margin-right:10px;
}
.cart_top_juLi{
// margin-top:10px;
}
.titleInfo{
font-size: 20px;
font-weight: bold;
}
</style>

347
src/views/public/orguser/orgalluser.vue

@ -0,0 +1,347 @@
<!--
@ 作者: 秦东
@ 时间: 2023-11-22 08:16:12
@ 备注: 全部行政组织
-->
<script lang='ts' setup>
import { getOrgFormTree,getOrgFormUserList,searchUserCustomerFormList } from '@/api/hr/org/index'
import { orgform,criteriaForPeopleList } from '@/api/hr/org/type'
import UserRole from '@/assets/icons/user.svg'
import { searchUserList,gainFlowPeople } from '@/api/DesignForm/requestapi'
const props = defineProps({
openclosebox:{
type:Boolean,
default:false
},
selectedPeople: {
type: Array,
default: () => []
}
})
const emits = defineEmits(["update:openclosebox","updateNode"]);
const isOpen = computed({
get: () => props.openclosebox,
set: (val) => {
emits("update:openclosebox", val);
},
});
const defaultProps ={
children: 'children',
label: 'name',
}
const orgLoading = ref(false)
const userLoading = ref(false)
//
const treeEl = ref(null)
const treeData = ref<orgform[]>([])
const department = ref<any>()
const userName = ref<any>()
const tableData = ref<criteriaForPeopleList[]>();
const page = reactive({
total: 0,
current: 1,
pageSize: 11
})
//
const handleNodeClick = (data: any) => {
department.value = data.id
getUserList()
}
//
const resetClick = () => {
userName.value = ''
department.value = ''
treeEl.value.setCurrentKey(null)
getUserList()
}
//
const getTreeData = () => {
orgLoading.value = true
getOrgFormTree()
.then(({ data }) => {
// console.log(data)
treeData.value = data.list
}).finally(()=>{
orgLoading.value = false
})
}
//
const getUserList = () => {
userLoading.value = true
const params = {
page: page.current,
pagesize: page.pageSize,
name: userName.value,
department: department.value
}
searchUserList(params)
.then(({ data })=>{
tableData.value = data.list
page.total = data.total
userLoading.value = false
})
.finally(()=>{
userLoading.value = false
})
}
//
const currentChange = (current: number) => {
page.current = current
getUserList()
}
onMounted(() => {
nextTick(() => {
// loading
getTreeData()
getUserList()
backfillData()
})
})
//
const checkDataList = reactive<criteriaForPeopleList[]>([]);
const tableRowClick = (row: any) => {
if(checkDataList.length > 0){
let isIn = true
checkDataList.forEach(item =>{
if(item.id == row.id){
isIn = false
}
})
if(isIn){
checkDataList.push(row)
}
}else{
checkDataList.push(row)
}
// console.log("checkDataList",checkDataList,row)
}
//
const delRowClick = (row: criteriaForPeopleList) => {
// console.log("checkDataList",row)
if(checkDataList &&checkDataList.length > 0) {
checkDataList.forEach((item:criteriaForPeopleList,index:number) => {
if(item.id == row.id){
if(!item.noedit){
checkDataList.splice(index,1)
}
}
})
}
}
//
const delAllClick = () => {
// checkDataList.splice(0,checkDataList.length)
checkDataList.forEach((item:criteriaForPeopleList,index:number) => {
if(!item.noedit){
checkDataList.splice(index,1)
}
})
}
//
const clostBox = () =>{
emits("update:openclosebox", false);
}
//
const confirmChoices = () => {
// console.log("confirmChoices",checkDataList)
emits('updateNode', checkDataList)
clostBox()
}
//
const backfillData = () => {
if(props.selectedPeople && props.selectedPeople.length > 0){
checkDataList.splice(0,checkDataList.length)
props.selectedPeople.forEach((item:any)=>{
checkDataList.push(item)
})
}
// console.log("props.selectedPeople",props.selectedPeople,checkDataList)
}
</script>
<template>
<el-dialog
v-model="isOpen"
title="选择人员"
:append-to-body="true"
:props="defaultProps "
width="80%"
top="2vh"
draggable
>
<el-row :gutter="20">
<el-col :span="6" style="padding:0">
<div class="sidebar_tree">
<el-text class="orgTitle" size="large">行政组织</el-text>
<el-tree
v-loading="orgLoading"
element-loading-text="Loading..."
ref="treeEl"
:data="treeData"
node-key="id"
@node-click="handleNodeClick"
:props="defaultProps "
highlight-current
/>
</div>
</el-col>
<el-col :span="12">
<div class="search">
<el-input placeholder="请输入用户名" v-model="userName" />
<el-button type="primary" @click="getUserList">查询</el-button>
<el-button @click="resetClick">重置</el-button>
</div>
<div class="list">
<el-table v-loading="userLoading" element-loading-text="Loading..." :data="tableData" style="width: 100%; height:660px">
<el-table-column fixed prop="userName" label="照片" width="60px" align="center">
<template #default="scope">
<el-avatar v-if="scope.row.icon != ''" shape="square" :size="30" :src="scope.row.icon" />
<el-avatar v-else shape="square" :size="30" :src="UserRole" />
</template>
</el-table-column>
<el-table-column fixed prop="name" label="姓名" width="150px" align="left">
<template #default="scope">
{{ scope.row.name }}({{ scope.row.number }})
</template>
</el-table-column>
<el-table-column prop="tel" label="联系方式" width="120px" align="left" />
<el-table-column prop="nickName" label="归属行政组织" width="500px" align="left">
<template #default="{ row }">
{{ row.companyName }}<span v-if="row.departmentname!=''"> / {{ row.departmentname }}</span><span v-if="row.postname!=''"> / {{ row.postname }}</span>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" width="60px">
<template #default="{ row }">
<el-button circle size="small" @click="tableRowClick(row)"><el-icon><ArrowRight /></el-icon></el-button>
</template>
</el-table-column>
</el-table>
<div class="page">
<el-pagination
background
layout="prev, pager, next, jumper"
small
hide-on-single-page
:current-page="page.current"
:total="page.total"
:page-size="page.pageSize"
@current-change="currentChange"
/>
</div>
</div>
</el-col>
<el-col :span="6">
<div class="has_select">
<div class="total">
<div>已选择{{ checkDataList.length }}</div>
<el-button type="danger" @click="delAllClick" size="small">全部移除</el-button>
</div>
<el-table :data="checkDataList" style="height:680px">
<el-table-column prop="userName" label="照片" width="60px" align="center">
<template #default="scope">
<el-avatar v-if="scope.row.icon != ''" shape="square" :size="30" :src="scope.row.icon" />
<el-avatar v-else shape="square" :size="30" :src="UserRole" />
</template>
</el-table-column>
<el-table-column prop="name" label="姓名" align="left">
<template #default="scope">
{{ scope.row.name }}({{ scope.row.number }})
</template>
</el-table-column>
<el-table-column label="操作" width="60px">
<template #default="{ row }">
<el-button v-if="!row.noedit" size="small" type="danger" @click="delRowClick(row)">移除</el-button>
</template>
</el-table-column>
</el-table>
</div>
</el-col>
</el-row>
<template #footer>
<div>
<el-button @click="clostBox">取消</el-button>
<el-button type="primary" @click="confirmChoices"> 确定 </el-button>
</div>
</template>
</el-dialog>
</template>
<style lang='scss' scoped>
.orgTitle{
padding: 0 0 0 5px;
}
.sidebar_tree {
width: 100%;
border: 1px solid #ebeef5;
border-radius: 3px;
padding: 10px 0;
margin-right: 10px;
height: 750px;
overflow-y: auto;
}
.has_select {
width: 100%;
.total {
display: flex;
justify-content: space-between;
align-items: center;
height: 32px;
margin-bottom: 10px;
}
}
.search {
display: flex;
margin-bottom: 10px;
.el-input {
margin-right: 10px;
}
}
.page {
padding-top: 20px;
display: flex;
justify-content:space-between;
}
.expand-user-dialog {
display: flex;
align-items: flex-start;
.sidebar-tree {
width: 180px;
border: 1px solid #ebeef5;
border-radius: 3px;
padding: 10px 0;
margin-right: 10px;
max-height: 500px;
overflow-y: auto;
}
.table-list {
}
.search {
display: flex;
margin-bottom: 10px;
.el-input {
margin-right: 10px;
}
}
.page {
padding-top: 20px;
display: flex;
justify-content: flex-end;
}
.has-select {
width: 200px;
margin-left: 20px;
.total {
display: flex;
justify-content: space-between;
align-items: center;
height: 32px;
margin-bottom: 10px;
}
}
}
</style>

195
src/views/public/orguser/orguser.vue

@ -0,0 +1,195 @@
<!--
@ 作者: 秦东
@ 时间: 2023-11-21 13:01:56
@ 备注: 选择人员
-->
<script lang='ts' setup>
const state = reactive({
circleUrl:'https://cube.elemecdn.com/3/7c/3ea6beec64369c2642b92c6726f1epng.png',
squareUrl:'https://cube.elemecdn.com/9/c2/f0ee8a3c7c9638a54940382568c9dpng.png',
sizeList: ['small', '', 'large'] as const,
})
const { circleUrl, squareUrl, sizeList } = toRefs(state)
const props = defineProps({
openclose:{
type:Boolean,
default:false
},
presetPersonnel: {
type: Array,
default: () => []
},
selectedPeople: {
type: Array,
default: () => []
}
})
const emits = defineEmits(["update:openclose","updateNode"]);
const isShow = computed({
get: () => props.openclose,
set: (val) => {
emits("update:openclose", val);
},
});
//
const prePers = ref<any>([]);
//
const setUpPrePers = ref<any>([]);
watch(() =>props.openclose,(val:boolean)=>{
// console.log("props.openclose--1-->",val)
// console.log("props.openclose--2-->",props.selectedPeople)
// console.log("props.openclose--3-->",props.presetPersonnel)
if(props.openclose){
if(props.selectedPeople && props.selectedPeople.length > 0){
setUpPrePers.value = props.selectedPeople
}else{
setUpPrePers.value = new Array
if(props.presetPersonnel && props.presetPersonnel.length > 0){
console.log("props.openclose--4-->",props.presetPersonnel)
props.presetPersonnel.forEach((item)=>{
item.isTrue = false
})
}
}
}
})
const setUpUser = (val:any) => {
// console.log("setUpUser---->",val,prePers.value)
let isNewAdd = true;
if(setUpPrePers.value && setUpPrePers.value.length > 0){
setUpPrePers.value.forEach((item:any,index:number) => {
if(val.id == item.id){
isNewAdd = false;
if(!item.noedit){
val.isTrue = false
setUpPrePers.value.splice(index,1)
}else{
val.isTrue = true
}
}
})
}
if(isNewAdd){
val.isTrue = true
setUpPrePers.value.push(val)
}
}
//
const initDataUser = () => {
// console.log("---->",prePers.value,setUpPrePers.value)
}
onMounted(() => {
if(props.openclose){
if(props.selectedPeople && props.selectedPeople.length > 0){
setUpPrePers.value = props.selectedPeople
}else{
setUpPrePers.value = new Array
if(props.presetPersonnel && props.presetPersonnel.length > 0){
// console.log("props.openclose--4-->",props.presetPersonnel)
props.presetPersonnel.forEach((item)=>{
item.isTrue = false
})
}
}
}
})
const closeBox = () => {
emits("update:openclose", false);
}
//
const saveFlowUser = () => {
emits("updateNode", setUpPrePers);
closeBox();
}
</script>
<template>
<el-dialog
v-model="isShow"
title="选择人员"
width="800"
draggable
:before-close="handleClose"
>
<el-row :gutter="20">
<el-col :span="12" >
<div class="bianKuan">
<ul>
<li v-for="item in props.presetPersonnel" :key="item.id" :class="item.isTrue?'xuanZeUser active':'xuanZeUser'" @click="setUpUser(item)">
<table>
<tr>
<td valign="top" align="center" width="50">
<el-avatar v-if="item.iconbase64==''&&item.icon!=''" shape="square" fit="cover" :src="item.icon" />
<el-avatar v-else-if="item.iconbase64!=''" shape="square" fit="cover" :src="item.iconbase64" />
<el-avatar v-else shape="square" fit="cover" :src="squareUrl" />
</td>
<td>
<el-text>{{ item.name }}{{ item.number }}</el-text><br>
<el-text v-if="item.departmentname">{{ item.departmentname }}</el-text>
<el-text v-if="item.postname"><span v-if="item.departmentname"> - </span>{{ item.postname }}</el-text>
</td>
</tr>
</table>
</li>
</ul>
</div>
</el-col>
<el-col :span="12">
<div class="bianKuan">
<ul>
<li v-for="item in setUpPrePers" :key="item.id" class="xuanZeUser" @click="setUpUser(item)">
<table>
<tr>
<td valign="top" align="center" width="50">
<el-avatar v-if="item.iconbase64==''&&item.icon!=''" shape="square" fit="cover" :src="item.icon" />
<el-avatar v-else-if="item.iconbase64!=''" shape="square" fit="cover" :src="item.iconbase64" />
<el-avatar v-else shape="square" fit="cover" :src="squareUrl" />
</td>
<td style="width:100%">
<el-text>{{ item.name }}{{ item.number }}</el-text><br>
<el-text v-if="item.departmentname">{{ item.departmentname }}</el-text>
<el-text v-if="item.postname"><span v-if="item.departmentname"> - </span>{{ item.postname }}</el-text>
</td>
<td align="center" width="10">
<i class="fa fa-close"></i>
</td>
</tr>
</table>
</li>
</ul>
</div>
</el-col>
</el-row>
<template #footer>
<span class="dialog-footer">
<el-button @click="closeBox">关闭</el-button>
<el-button type="primary" @click="saveFlowUser">确定</el-button>
</span>
</template>
</el-dialog>
</template>
<style lang='scss' scoped>
.bianKuan{
width: 100%;
height: 500px;
border: 1px solid #CCCCCC;
overflow: hidden;
overflow-y: auto;
}
.xuanZeUser{
cursor: pointer;
// background-color: #F56C6C;
padding-top: 5px;
margin-bottom: 5px;
}
.xuanZeUser.active{
background-color: #F56C6C;
}
</style>

25
src/views/redismanage/datamigration/index.vue

@ -248,12 +248,15 @@ const migrateRedisInfo = () =>{
<el-button :loading-icon="Eleme" :loading="originTestLoad" type="primary" @click="originTestLink">测试链接</el-button>
</td>
<td align="right">
<el-text class="mx-1" :type="originTextType">
<i v-if="originConfig.state == 1" class="fa fa-check"></i>
<i v-else-if="originConfig.state == 2" class="fa fa-close"></i>
<span v-else>未测试</span>
<el-text v-if="originConfig.state == 1" class="mx-1" type="success">
<i class="fa fa-check"></i>
</el-text>
<el-text v-else-if="originConfig.state == 2" class="mx-1" type="danger">
<i class="fa fa-close"></i>
</el-text>
<el-text v-else class="mx-1" type="info">
<span>未测试</span>
</el-text>
</td>
</tr>
</table>
@ -262,10 +265,14 @@ const migrateRedisInfo = () =>{
<table border="0">
<tr>
<td align="left">
<el-text class="mx-1" :type="targetTextType">
<i v-if="targetConfig.state == 1" class="fa fa-check"></i>
<i v-else-if="targetConfig.state == 2" class="fa fa-close"></i>
<span v-else>未测试</span>
<el-text v-if="targetConfig.state == 1" class="mx-1" type="success">
<i class="fa fa-check"></i>
</el-text>
<el-text v-else-if="targetConfig.state == 2" class="mx-1" type="danger">
<i class="fa fa-close"></i>
</el-text>
<el-text v-else class="mx-1" type="info">
<span>未测试</span>
</el-text>
</td>
<td width="50">

6
src/views/sysworkflow/codepage/page.vue

@ -66,7 +66,7 @@ const getFormData = () => {
const result = res.data
state.formData = stringToObj(result.data)
state.dict = string2json(result.dict)
formEl.value.getData({ formId: state.formId, id: 1})
formEl.value.getData({ formId: 9, id: 1})
console.log("res----------->", formEl.value)
nextTick(() => {
state.loading = false
@ -91,6 +91,9 @@ const afterSubmit = (type: string) => {
onMounted(() => {
getFormData()
})
const changeKeyVal = (key:any,val:any,type:any,attribute:any) => {
}
</script>
<template>
<el-card v-loading="state.loading" shadow="never" style="min-height: 300px">
@ -104,6 +107,7 @@ onMounted(() => {
edit-url="editFormContent"
:before-submit="beforeSubmit"
:after-submit="afterSubmit"
:change-key-val="changeKeyVal"
/>
</el-card>
</template>

26
src/views/sysworkflow/flow/flowDrawingBoard.vue

@ -66,22 +66,36 @@ let directorMaxLeveling = ref<number>(0);
const shenPiTitle = ref<string>("")
const activeTabs = ref<string>(""); //
const versionList = ref<flowversion[]>(); //
const versionList = reactive<flowversion[]>([]); //
const enableFlow = ref<any>();
const isRead = ref(false)
const enableVersion = ref<string>();
const enableVersion = ref<string>("1");
//
const getFlowVerList = ()=>{
gainFlowVersionList({id:props.customerFormKey.toString()})
.then(({data})=>{
console.log("获取工作流版本列表-->",data)
// versionList = data;
versionList.splice(0,versionList.length)
if(data){
if(data.length>0){
<<<<<<< HEAD
data.forEach((item:any)=>{
=======
// versionList = data;
data.forEach(item=>{
>>>>>>> v3
if(item.state == 1){
activeTabs.value = item.id
enableFlow.value = item
enableVersion.value = item.id
}
versionList.push({
id:item.id,
key:item.key,
state:item.state,
version:item.version
})
})
isRead.value = true
@ -107,7 +121,7 @@ const getFlowVerList = ()=>{
//
onMounted(async ()=>{
// getFlowVerList()
})
//
const initWorkFlowData = async() => {
@ -351,12 +365,12 @@ const setupState = (val:number) =>{
status:val
}
switchFlowVersion(sendCont)
.then((data)=>{
.then((data:any)=>{
ElMessage.success(data.msg);
// activeTabs.value = enableVersion.value
// enableFlow.value.id = enableVersion.value
if(versionList.value.length > 0){
versionList.value.forEach(item=>{
if(versionList.length > 0){
versionList.forEach(item=>{
if(item.id == enableVersion.value){
enableFlow.value = item
}

194
src/views/taskplatform/taskmanagement/completedmatters.vue

@ -0,0 +1,194 @@
<!--
@ 作者: 秦东
@ 时间: 2023-11-22 14:56:17
@ 备注: 已办事宜
-->
<script lang='ts' setup>
import { taskFlowList } from '@/api/DesignForm/requestapi'
import { taskflowquery } from '@/api/DesignForm/type'
import LookAndOperateLogInfo from '@/views/taskplatform/taskmanagement/lookAndOperateLogInfo.vue'
const selectInfo = reactive<taskflowquery>({
page: 1,
pagesize: 20,
class:3
})
const loading = ref(false)
const searckFormRef = ref(ElForm);
const totals = ref<number>(0) //
const taskFlowAry = ref<any>([]) //
//
const getToDoList = () => {
loading.value = true
taskFlowList(selectInfo)
.then((data:any)=>{
console.log("获取我的请求",data)
totals.value = data.data.total
taskFlowAry.value = data.data.list
})
.finally(()=>{
loading.value = false
})
}
//
const resetQuery = () =>{
searckFormRef.value.resetFields();
initData();
}
//
const initData = () =>{
selectInfo.page = 1;
selectInfo.pagesize = 15;
selectInfo.title = ""
selectInfo.class = 3;
selectInfo.state = 0;
}
const myappbox = ref()
const drawerMyWith = ref<number>(0);
//
onMounted(()=>{
getToDoList();
drawerMyWith.value = myappbox.value?.clientWidth
})
const flowLogInfo = ref<any>()
const darwOpenOrClose = ref(false)
/**
* 查看流程任务
* val 记录内容
* types 记录类型; 1我的请求2待办事宜3已办事宜4草稿箱
*/
const lookFlowInfo = (val:any,types:number) => {
flowLogInfo.value = val
darwOpenOrClose.value = true
}
</script>
<template>
<div ref="myappbox" class="app_box">
<div class="app-container">
<div class="search">
<el-form ref="searckFormRef" :model="selectInfo" :inline="true">
<el-form-item label="任务标题" prop="name">
<el-input
v-model="selectInfo.title"
placeholder="请输入任务标题"
clearable
@keyup.enter="searchQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="getToDoList()"><i-ep-search />搜索</el-button>
<el-button @click="resetQuery()"><i-ep-refresh />重置</el-button>
</el-form-item>
</el-form>
</div>
<el-card shadow="never">
<el-table
v-loading="loading"
element-loading-text="Loading..."
highlight-current-row
:data="taskFlowAry"
border
class="table_box"
>
<el-table-column fixed label="标题" prop="title" width="500" />
<el-table-column label="创建人" prop="creater" >
<template #default="scope">
{{ scope.row.creatorInfo.name }}<el-text type="info">{{ scope.row.creatorInfo.number }}</el-text>
</template>
</el-table-column>
<el-table-column label="发起日期" prop="startDate" align="center" width="300" />
<el-table-column label="状态" prop="status" align="center" width="220" >
<template #default="scope">
<el-tag
v-if="scope.row.status==1"
class="mx-1"
effect="plain"
round
>
草稿
</el-tag>
<el-tag
v-else-if="scope.row.status==2"
type="danger"
class="mx-1"
effect="plain"
round
>
驳回
</el-tag>
<el-tag
v-else-if="scope.row.status==3"
type="success"
class="mx-1"
effect="plain"
round
>
审批中
</el-tag>
<el-tag
v-else-if="scope.row.status==4"
type="info"
class="mx-1"
effect="plain"
round
>
归档
</el-tag>
<el-tag
v-else
type="info"
class="mx-1"
effect="plain"
round
>
删除
</el-tag>
</template>
</el-table-column>
<el-table-column label="当前节点及操作人" prop="currentStep" width="400" >
<template #default="scope">
<el-text v-if="scope.row.currentNodeName" type="success">{{ scope.row.currentNodeName }}:</el-text><el-text v-for="(item,index) in scope.row.currentNodeUser" :key="index" type="warning">{{ item.name }}({{ item.number }})</el-text>
</template>
</el-table-column>
<el-table-column fixed="right" align="center" label="操作" width="100" >
<template #default="scope">
<el-button type="primary" class="fa fa-eye" @click="lookFlowInfo(scope.row,3)" />
</template>
</el-table-column>
</el-table>
<pagination
v-model:total="totals"
v-model:page="selectInfo.page"
v-model:limit="selectInfo.pagesize"
@pagination="getToDoList"
/>
</el-card>
<LookAndOperateLogInfo v-if="darwOpenOrClose" v-model:isshow="darwOpenOrClose" :flow-log-info="flowLogInfo" :drawer-with="drawerMyWith" @getmytodolist="getMyToDoList" />
</div>
</div>
</template>
<style lang='scss' scoped>
.app_box{
width:100%;
overflow: hidden;
overflow-y: auto;
}
.box-card {
width: 100%;
}
.table_box{
width: 100%;
height: calc(100vh - 308px);
}
</style>

173
src/views/taskplatform/taskmanagement/drafts.vue

@ -0,0 +1,173 @@
<!--
@ 作者: 秦东
@ 时间: 2023-11-24 08:10:23
@ 备注: 草稿箱
-->
<script lang='ts' setup>
import { Delete, Edit, Search, Share, Upload,View } from '@element-plus/icons-vue'
import { taskFlowList } from '@/api/DesignForm/requestapi'
import { taskflowquery } from '@/api/DesignForm/type'
const selectInfoDr = reactive<taskflowquery>({
page: 1,
pagesize: 20,
class: 1,
state:1
})
const loadingDr = ref(false)
const searckFormRefdr = ref(ElForm);
const totalsdr = ref<number>(0) //
const taskFlowAryDr = ref<any>([]) //
//
const getToDoListDr = () => {
loadingDr.value = true
taskFlowList(selectInfoDr)
.then((data:any)=>{
console.log("获取我的请求",data)
totalsdr.value = data.data.total
taskFlowAryDr.value = data.data.list
})
.finally(()=>{
loadingDr.value = false
})
}
//
const resetQueryDr = () =>{
searckFormRefdr.value.resetFields();
initDataDr();
}
//
const initDataDr = () =>{
selectInfoDr.page = 1;
selectInfoDr.pagesize = 15;
selectInfoDr.title = ""
selectInfoDr.class = 1;
selectInfoDr.state = 1;
}
onMounted(()=>{
getToDoListDr();
})
</script>
<template>
<div class="app_box">
<div class="app-container">
<div class="search">
<el-form ref="searckFormRefdr" :model="selectInfoDr" :inline="true">
<el-form-item label="任务标题" prop="name">
<el-input
v-model="selectInfoDr.title"
placeholder="请输入任务标题"
clearable
@keyup.enter="searchQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="getToDoListDr()"><i-ep-search />搜索</el-button>
<el-button @click="resetQueryDr()"><i-ep-refresh />重置</el-button>
</el-form-item>
</el-form>
</div>
<el-card shadow="never">
<el-table
v-loadingDr="loadingDr"
element-loadingDr-text="Loading..."
highlight-current-row
:data="taskFlowAryDr"
border
class="table_box"
>
<el-table-column fixed label="标题" prop="title" width="500" />
<el-table-column label="创建人" prop="creater" >
<template #default="scope">
{{ scope.row.creatorInfo.name }}<el-text type="info">{{ scope.row.creatorInfo.number }}</el-text>
</template>
</el-table-column>
<el-table-column label="发起日期" prop="startDate" align="center" width="300" />
<el-table-column label="状态" prop="status" align="center" width="220" >
<template #default="scope">
<el-tag
v-if="scope.row.status==1"
class="mx-1"
effect="plain"
round
>
草稿
</el-tag>
<el-tag
v-else-if="scope.row.status==2"
type="danger"
class="mx-1"
effect="plain"
round
>
驳回
</el-tag>
<el-tag
v-else-if="scope.row.status==3"
type="success"
class="mx-1"
effect="plain"
round
>
审批中
</el-tag>
<el-tag
v-else-if="scope.row.status==4"
type="info"
class="mx-1"
effect="plain"
round
>
归档
</el-tag>
<el-tag
v-else
type="info"
class="mx-1"
effect="plain"
round
>
删除
</el-tag>
</template>
</el-table-column>
<el-table-column fixed="right" align="center" label="操作" width="150" >
<template #default="scope">
<el-button type="warning" :icon="Edit" @click="editFlow(scope.row)" />
<el-button type="danger" :icon="Delete" @click="editFlow(scope.row.flowkeys)" />
</template>
</el-table-column>
</el-table>
<pagination
v-model:total="totalsdr"
v-model:page="selectInfoDr.page"
v-model:limit="selectInfoDr.pagesize"
@pagination="getToDoListDr"
/>
</el-card>
</div>
</div>
</template>
<style lang='scss' scoped>
.app_box{
width:100%;
overflow: hidden;
overflow-y: auto;
}
.box-card {
width: 100%;
}
.table_box{
width: 100%;
height: calc(100vh - 308px);
}
</style>

10
src/views/taskplatform/taskmanagement/edittaskcustomerform.vue

@ -153,7 +153,7 @@ const getTaskFormData = () =>{
loadingData.value = true;
haveCustomerFormVersion({id:props.versionid})
.then(({ data }) =>{
console.log("表单数据",data)
// console.log("",data)
state.id=props.versionid
state.formData = stringToObj(data.mastesform)
state.dict = string2json(data.dict)
@ -185,13 +185,13 @@ const beforeSubmit = (params: any) => {
params.formId = props.masterskey
params.id = props.versionid
// emits("update:isopen", false);
console.log(params,"===========================>")
// console.log(params,"===========================>")
return params
}
const afterSubmit = (type: string) => {
if (type === 'success') {
// router.go(-1)
console.log("表单提交成功")
// console.log("")
emits("searchquery");
closeAppSubmit();
@ -219,6 +219,9 @@ watch(()=>props.iseditopen,()=>{
initData()
}
})
const changeKeyVal = (key:any,val:any,type:any,attribute:any) => {
}
</script>
<template>
<el-drawer v-model="isShow" v-loading="loadingData" :title="versiontitle" :close-on-click-modal="false" :close-on-press-escape="false" :destroy-on-close="true" :size="props.drawerwith" class="drawerClass" >
@ -234,6 +237,7 @@ watch(()=>props.iseditopen,()=>{
:before-submit="beforeSubmit"
:after-submit="afterSubmit"
:close-app-submit="closeAppSubmit"
:change-key-val="changeKeyVal"
/>
</div>

190
src/views/taskplatform/taskmanagement/flowStep.vue

@ -0,0 +1,190 @@
<!--
@ 作者: 秦东
@ 时间: 2023-11-17 16:43:55
@ 备注: 工作流步进图
-->
<script lang='ts' setup>
import SvgIcon from "@/components/SvgIcon/index.vue";
import OrgUserPage from "@/views/public/orguser/orguser.vue"
import OrgAllUserPage from "@/views/public/orguser/orgalluser.vue"
import squareUrlOne from "@/assets/images/1.png"
import squareUrlTwo from "@/assets/images/2.png"
const state = reactive({
circleUrl:squareUrlTwo,
squareUrl: squareUrlOne,
sizeList: ['small', '', 'large'] as const,
})
const { circleUrl, squareUrl, sizeList } = toRefs(state)
const openOrClose = ref(false)
const openclosebox = ref(false)
const props = defineProps({
flowMap: {
type: Array,
default: () => []
},
nodeKey:{
type:String,
default:""
},
currentProgress:{
type:Number,
default:0
}
,
nextStep:{
type:Number,
default:0
}
})
const presetPersonnel = ref<any>([]); //
const selectedPeople = ref<any>([]); //
const flowMaps = ref<any[]>();
const emits = defineEmits(["update:flowMap"]);
const flowList = computed({
get: () => props.flowMap,
set: (val) => {
emits("update:flowMap", val);
},
});
watch(()=>props.flowMap,(val:any)=>{
emits("update:flowMap", val);
})
onMounted(()=>{
})
//
const judgeAddUser = (val:any):boolean =>{
// console.log("val----->",val)
if(val.customNode == "beginnode"){
val.runscope = val.runscope!=0?val.runscope:1
return true
}
switch(val.runtype){
case 1:
val.runscope = val.runscope!=0?val.runscope:1
return true
break;
case 3:
if(val.customNode == props.nodeKey){
val.runscope = val.runscope!=0?val.runscope:1
return true
}
break;
case 4:
if(val.runscope==1){
val.runscope = val.runscope!=0?val.runscope:1
return true
}
break;
default:
if(!val.operator){
val.runscope = val.runscope!=0?val.runscope:1
return true
}else if(val.operator.length < 1){
val.runscope = val.runscope!=0?val.runscope:1
return true
}
return false
}
return false
}
let zhiXingStep = 1;
//
const addPeople = (val:any) =>{
zhiXingStep = val.step
presetPersonnel.value = val.pendpers
selectedPeople.value = val.operator
if(val.runscope == 1){
openclosebox.value = true
}else{
openOrClose.value = true
}
// console.log("PresetPersonnel.value--------1-------->",val)
// console.log("PresetPersonnel.value--------2-------->",val.pendpers)
// console.log("PresetPersonnel.value--------3-------->",val.operator)
// console.log("PresetPersonnel.value--------4-------->",selectedPeople.value)
}
//
const updateNode = (val:any) =>{
// console.log("P",zhiXingStep,val)
flowList.value.forEach((item:any) =>{
if(item.step == zhiXingStep){
// console.log("P---1-->",item.step , zhiXingStep)
item.operator = val
}
})
// console.log("P--2--->",flowList)
}
</script>
<template>
<div>
<el-steps direction="vertical" :active="props.currentProgress">
<el-step v-for="item in flowList" :key="item.step">
<template #title>
{{ item.nodeName }}
</template>
<template #description>
<table>
<tr v-for="items in item.operator" :key="items.id">
<td valign="top" align="center" width="50">
<el-avatar v-if="items.iconbase64==''&&items.icon!=''" shape="square" fit="cover" :src="items.icon" />
<el-avatar v-else-if="items.iconbase64!=''" shape="square" fit="cover" :src="items.iconbase64" />
<el-avatar v-else shape="square" fit="cover" :src="squareUrl" />
</td>
<td valign="top" align="left">
<el-row>
<el-col :span="24">
<el-text>{{ items.departmentname }}</el-text>
<el-text><span v-if="items.departmentname"> - </span>{{ items.postname }}</el-text>
<el-text><span v-if="items.departmentname||items.postname"> - </span>{{ items.name }}</el-text>
</el-col>
<el-col :span="24">
<ul>
<li v-for="(logItem,logIndex) in items.log" :key="logIndex" class="logLi">
<el-text v-if="logItem.state==2" type="success">
<span v-if="logItem.cause">logItem.cause</span><span v-else>已同意</span>
</el-text>
<el-text v-else-if="logItem.state==3" type="danger">
<span v-if="logItem.cause">logItem.cause</span><span v-else>已驳回</span>
</el-text>
<el-text v-else>
<span v-if="logItem.cause">logItem.cause</span><span v-else>未操作</span>
</el-text> · {{ logItem.time }}
</li>
</ul>
</el-col>
</el-row>
</td>
</tr>
<tr>
<td>
<div v-if="judgeAddUser(item)" class="addUser" @click="addPeople(item)">
<svg-icon icon-class="addxuxian" size="50" />
</div>
</td>
<td></td>
</tr>
</table>
</template>
</el-step>
</el-steps>
<OrgUserPage v-if="openOrClose" v-model:openclose="openOrClose" :preset-personnel="presetPersonnel" :selected-people="selectedPeople" @update-node="updateNode" />
<OrgAllUserPage v-if="openclosebox" v-model:openclosebox="openclosebox" :selected-people="selectedPeople" @update-node="updateNode" />
</div>
</template>
<style lang='scss' scoped>
.logLi{
color:#999999;
}
.addUser{
display:block;
cursor:pointer;
}
</style>

188
src/views/taskplatform/taskmanagement/lookAndOperateLogInfo.vue

@ -0,0 +1,188 @@
<!--
@ 作者: 秦东
@ 时间: 2023-11-24 08:50:26
@ 备注: 查看或操作工作流记录
-->
<script lang='ts' setup>
import {
json2string,
objToStringify,
string2json,
stringToObj
} from '@/utils/DesignForm/form'
import RunFlowStep from '@/views/taskplatform/taskmanagement/runFlowStep.vue'
const props = defineProps({
isshow:{
type:Boolean,
default:true
},
drawerWith:{
type:Number,
default:0
},
flowLogInfo:{
type:Object,
default(){
return {}
}
}
})
const emits = defineEmits(["update:isshow","getmytodolist"]);
const isOpen = computed({
get: () => props.isshow,
set: (val) => {
emits("update:isshow", val);
},
});
const loadingData = ref(false) //
const flowLoading = ref(false) //
const versiontitle = ref<any>("1")
const flowMap = ref<any>()
const nextStep = ref(0)
const nodeKey = ref<string>('');
const currentProgress = ref<number>(1);
//
const formState = reactive({
formData: {
list: [],
form: {},
config: {}
},
dict: {},
formId: 25,
id: 1,
loading: true
})
const formType = computed(() => {
// id
if (true) {
return 2
} else {
return 1
}
})
const formEl = ref()
onMounted(()=>{
versiontitle.value = props.flowLogInfo.title
console.log("props.flowLogInfo---4-------->",props.flowLogInfo)
flowMap.value = JSON.parse(props.flowLogInfo.flowcont)
nextStep.value = props.flowLogInfo.nextStep
nodeKey.value = props.flowLogInfo.nodeKey;
currentProgress.value = props.flowLogInfo.currentStep
console.log("props.flowLogInfo--5-------->",props.flowLogInfo.mastesform)
formState.formData = stringToObj(props.flowLogInfo.mastesform)
nextTick(() => {
console.log("res----------->", formEl.value)
formEl.value.getData({ id: props.flowLogInfo.flowkeys})
})
})
</script>
<template>
<el-drawer v-model="isOpen" v-loading="loadingData" element-loading-my-text="Loading..." :title="versiontitle" :close-on-click-modal="false" :close-on-press-escape="false" :destroy-on-close="true" :size="props.drawerWith" class="drawerClass" >
<table border="0" class="tableFlowBox">
<tr>
<td valign="top">
<div class="drawerFormBox boxLeft">
<ak-form
ref="formEl"
v-loading="formLoading" element-loading-text="Loading..."
:form-data="formState.formData"
:type="formType"
:dict="formState.dict"
request-url="getFormContent"
add-url="saveFormContent"
edit-url="editFormContent"
:before-submit="beforeSubmit"
:after-submit="afterSubmit"
:close-app-submit="closeAppSubmit"
:change-key-val="changeKeyVal"
/>
</div>
</td>
<td valign="top" width="350">
<RunFlowStep :flow-key="props.flowLogInfo.flowkeys" :current-progress="currentProgress" />
</td>
</tr>
</table>
</el-drawer>
</template>
<style lang='scss' scoped>
.tableFlowBox{
width: 100%;
height: 100%;
// background-color: #000000;
.drawerFormBox{
width: 100%;
height: 100%;
// background-color: #ff0000;
}
}
.boxLeft{
padding: 0 10px 0 15px;
overflow: hidden;
overflow-y: auto;
}
.flowBox{
padding: 0 5px 0 10px;
}
.boxRight{
overflow: hidden;
overflow-y: auto;
border-left: 1px solid #EEEEEE;
}
.approvalBoard{
padding: 5px 10px;
background-color: #FFFFFF;
border-top: 1px solid #EEEEEE;
.juzhong{
padding: 10px 0;
text-align: center;
}
.appBoardTitle{
padding: 5px 0 10px 0;
display: block;
}
}
</style>
<style lang='scss'>
.drawerClass ::v-deep.el-drawer__header {
font-size: 22px;
text-align: center;
margin-bottom: 0px;
padding: 0;
.el-drawer__close-btn{
background-color: rgb(255, 77, 79);
color: white;
}
}
::v-deep .el-drawer__body {
padding: 0px;
}
.details {
width: 80%;
margin-right: 0px;
margin-left: 20%;
box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);
}
.drawerBody{
padding: 20px;
}
</style>

194
src/views/taskplatform/taskmanagement/myrequest.vue

@ -0,0 +1,194 @@
<!--
@ 作者: 秦东
@ 时间: 2023-11-22 14:56:54
@ 备注: 我的请求
-->
<script lang='ts' setup>
import { Delete, Edit, Search, Share, Upload,View } from '@element-plus/icons-vue'
import { taskFlowList } from '@/api/DesignForm/requestapi'
import { taskflowquery } from '@/api/DesignForm/type'
import LookAndOperateLogInfo from '@/views/taskplatform/taskmanagement/lookAndOperateLogInfo.vue'
const selectMyInfo = reactive<taskflowquery>({
page: 1,
pagesize: 20,
class:1
})
const loadingMy = ref(false)
const searckFormReMyf = ref(ElForm);
const totalsMy = ref<number>(0) //
const taskFlowMyAry = ref<any>([]) //
//
const getMyToDoList = () => {
loadingMy.value = true
taskFlowList(selectMyInfo)
.then((data:any)=>{
console.log("获取我的请求",data)
totalsMy.value = data.data.total
taskFlowMyAry.value = data.data.list
})
.finally(()=>{
loadingMy.value = false
})
}
//
const resetQueryMy = () =>{
searckFormReMyf.value.resetFields();
initMyData();
}
//
const initMyData = () =>{
selectMyInfo.page = 1;
selectMyInfo.pagesize = 15;
selectMyInfo.title = ""
selectMyInfo.class = 1;
selectMyInfo.state = 0;
}
const myappbox = ref()
const drawerMyWith = ref<number>(0); //
onMounted(()=>{
getMyToDoList();
drawerMyWith.value = myappbox.value?.clientWidth
})
const flowLogInfo = ref<any>()
const darwOpenOrClose = ref(false)
/**
* 查看流程任务
* val 记录内容
* types 记录类型; 1我的请求2待办事宜3已办事宜4草稿箱
*/
const lookFlowInfo = (val:any,types:number) => {
flowLogInfo.value = val
darwOpenOrClose.value = true
}
</script>
<template>
<div ref="myappbox" class="app_box">
<div class="app-container">
<div class="search">
<el-form ref="searckFormReMyf" :model="selectMyInfo" :inline="true">
<el-form-item label="任务标题" prop="name">
<el-input
v-model="selectMyInfo.title"
placeholder="请输入任务标题"
clearable
@keyup.enter="searchQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="getMyToDoList()"><i-ep-search />搜索</el-button>
<el-button @click="resetQueryMy()"><i-ep-refresh />重置</el-button>
</el-form-item>
</el-form>
</div>
<el-card shadow="never">
<el-table
v-loadingMy="loadingMy"
element-loading-my-text="Loading..."
highlight-current-row
:data="taskFlowMyAry"
border
class="table_box"
>
<el-table-column fixed label="标题" prop="title" width="500" />
<el-table-column label="创建人" prop="creater" width="200" >
<template #default="scope">
{{ scope.row.creatorInfo.name }}<el-text type="info">{{ scope.row.creatorInfo.number }}</el-text>
</template>
</el-table-column>
<el-table-column label="发起日期" prop="startDate" align="center" width="300" />
<el-table-column label="状态" prop="status" align="center" width="220" >
<template #default="scope">
<el-tag
v-if="scope.row.status==1"
class="mx-1"
effect="plain"
round
>
草稿
</el-tag>
<el-tag
v-else-if="scope.row.status==2"
type="danger"
class="mx-1"
effect="plain"
round
>
驳回
</el-tag>
<el-tag
v-else-if="scope.row.status==3"
type="success"
class="mx-1"
effect="plain"
round
>
审批中
</el-tag>
<el-tag
v-else-if="scope.row.status==4"
type="info"
class="mx-1"
effect="plain"
round
>
归档
</el-tag>
<el-tag
v-else
type="info"
class="mx-1"
effect="plain"
round
>
删除
</el-tag>
</template>
</el-table-column>
<el-table-column label="当前节点及操作人" prop="currentStep" width="400" >
<template #default="scope">
<el-text v-if="scope.row.currentNodeName" type="success">{{ scope.row.currentNodeName }}:</el-text><el-text v-for="(item,index) in scope.row.currentNodeUser" :key="index" type="warning">{{ item.name }}({{ item.number }})</el-text>
</template>
</el-table-column>
<el-table-column fixed="right" align="center" label="操作" width="100" >
<template #default="scope">
<el-button type="primary" class="fa fa-eye" @click="lookFlowInfo(scope.row,1)" />
</template>
</el-table-column>
</el-table>
<pagination
v-model:total="totalsMy"
v-model:page="selectMyInfo.page"
v-model:limit="selectMyInfo.pagesize"
@pagination="getMyToDoList"
/>
</el-card>
<LookAndOperateLogInfo v-if="darwOpenOrClose" v-model:isshow="darwOpenOrClose" :flow-log-info="flowLogInfo" :drawer-with="drawerMyWith" @getmytodolist="getMyToDoList" />
</div>
</div>
</template>
<style lang='scss' scoped>
.app_box{
width:100%;
overflow: hidden;
overflow-y: auto;
}
.box-card {
width: 100%;
}
.table_box{
width: 100%;
height: calc(100vh - 308px);
}
</style>

98
src/views/taskplatform/taskmanagement/newaddflow.vue

@ -0,0 +1,98 @@
<!--
@ 作者: 秦东
@ 时间: 2023-11-22 14:55:07
@ 备注: 新建流程
-->
<script lang='ts' setup>
import { gainTaskListQuery,taskListCont } from '@/api/taskapi/types'
import { gainTaskList } from '@/api/taskapi/management'
import TaskCustomerForm from '@/views/taskplatform/taskmanagement/taskcustomerformnew.vue'
const taskLoding = ref(false);
const gainTaskListInfo = reactive<gainTaskListQuery>({
page:1,
pagesize:16,
status:1,
type:2
});
const taskTotal = ref<number>(0)
const taskList = ref<taskListCont[]>();
const openTaskDrawer = ref(false)
//
const gainTaskContAry = () => {
taskLoding.value = true
gainTaskList(gainTaskListInfo)
.then(({data})=>{
// console.log(data)
if(data != null){
taskList.value = data.list;
taskTotal.value = data.total;
}
})
.finally(()=>{
taskLoding.value = false
})
}
const contbody = ref<any>(null)
const versionId = ref<string>()
const versionTitle = ref<string>()
const drawerWith = ref<number>(0);
//使
const startUsing = (id:string,title:string) => {
drawerWith.value = contbody.value?.clientWidth
versionId.value = id
versionTitle.value = title
openTaskDrawer.value = true
}
onMounted(()=>{
gainTaskContAry();
})
</script>
<template>
<div ref="contbody" class="app_body">
<el-row :gutter="30">
<el-col v-for="item in taskList" :key="item.id" :xs="24" :sm="12" :md="12" :lg="8" :xl="6">
<el-card style="margin-top: 15px; height:200px;">
<div class="jianju" style="width:100%;"><el-text class="mx-1">{{ item.name }}</el-text></div>
<div class="jianju" style="width:100%;"><el-text class="mx-1">设计者{{ item.createrName }}{{ item.createrNumber }}</el-text></div>
<div class="jianju" style="width:100%;"><el-text class="mx-1">发布时间{{ item.createrTame }}</el-text></div>
<div class="taskButton"><el-button type="primary" @click.stop="startUsing(item.id,item.name)">创建流程</el-button></div>
</el-card>
</el-col>
</el-row>
<div class="pageCont">
<pagination
v-if="taskTotal > 0"
v-model:total="taskTotal"
v-model:page="gainTaskListInfo.page"
v-model:limit="gainTaskListInfo.pagesize"
align="center"
@pagination="gainTaskContAry"
/>
</div>
<TaskCustomerForm v-model:isopen="openTaskDrawer" :versionid="versionId" :versiontitle="versionTitle" :drawerwith="drawerWith" @searchquery="gainTaskContAry" />
</div>
</template>
<style lang='scss' scoped>
.app_body{
width: 100%;
height: calc(100vh - 85px);
// background-color:#000000;
overflow: hidden;
overflow-y: auto;
padding: 0 15px 0 15px;
.taskButton{
width: 100%;
text-align: center;
}
.jianju{
margin-bottom: 15px;
}
.pageCont{
background-color: #FFFFFF;
margin-top: 15px;
text-align: center;
}
}
</style>

213
src/views/taskplatform/taskmanagement/runFlowStep.vue

@ -0,0 +1,213 @@
<!--
@ 作者: 秦东
@ 时间: 2023-11-24 13:18:02
@ 备注: 流程执行
-->
<script lang='ts' setup>
import SvgIcon from "@/components/SvgIcon/index.vue";
import OrgUserPage from "@/views/public/orguser/orguser.vue"
import OrgAllUserPage from "@/views/public/orguser/orgalluser.vue"
// import { nodeFlow,conditionInfo,nodelPeoples } from '@/api/taskapi/types'
import { gainRunTaskFlow } from '@/api/DesignForm/requestapi'
//
import squareUrlOne from "@/assets/images/1.png"
import squareUrlTwo from "@/assets/images/2.png"
const state = reactive({
circleUrl:squareUrlTwo,
squareUrl: squareUrlOne,
sizeList: ['small', '', 'large'] as const,
})
const { circleUrl, squareUrl, sizeList } = toRefs(state)
const props = defineProps({
flowKey:{
type:String,
default:""
},
currentProgress:{
type:Number,
default:0
}
})
const flowLoading = ref(false)
const openOrClose = ref(false) //
const openclosebox = ref(false) //
const presetPersonnel = ref<any>([]); //
const selectedPeople = ref<any>([]); //
const flowOpinion = ref(false) //
const flowMaps = ref<any[]>();
//
const gainRunFlowTask = () =>{
flowLoading.value = true
let sendInfo = {
id:props.flowKey
}
gainRunTaskFlow(sendInfo)
.then((data:any) =>{
// console.log("----->",data)
flowMaps.value = data.data.flowList
flowOpinion.value = data.data.operational
})
.finally(()=>{
flowLoading.value = false
})
}
//
onBeforeMount(()=>{
gainRunFlowTask();
})
//
onMounted(()=>{
})
//
const judgeAddUser = (val:any):boolean =>{
console.log("获取流程----1111->",val.judgelist)
if(val.judgelist){
return true
}
return false
}
let zhiXingStep = 1;
//
const addPeople = (val:any) =>{
zhiXingStep = val.step
presetPersonnel.value = val.pendpers
selectedPeople.value = val.operator
if(val.runscope == 1){
openclosebox.value = true
}else{
openOrClose.value = true
}
}
//
const updateNode = (val:any) =>{
flowMaps.value.forEach((item:any) =>{
if(item.step == zhiXingStep){
item.operator = val
}
})
}
const sendFlowInfo = ref<string>() //
//
const yesOrNo = (val:string,agreeOrRefuse:number) =>{
console.log("提交审批----1111->",val,agreeOrRefuse,sendFlowInfo.value)
}
</script>
<template>
<div class="drawerFormBox boxRight">
<div class="flowBox">
<el-affix :offset="20" style="width:100%">
<el-text size="large">审批流程</el-text>
</el-affix>
<el-steps v-loading="flowLoading" element-loading-text="Loading..." direction="vertical" :active="props.currentProgress">
<el-step v-for="item in flowMaps" :key="item.step">
<template #title>
{{ item.nodeName }}
</template>
<template #description>
<table>
<tr v-for="items in item.operator" :key="items.id">
<td valign="top" align="center" width="50">
<el-avatar v-if="items.iconbase64==''&&items.icon!=''" shape="square" fit="cover" :src="items.icon" />
<el-avatar v-else-if="items.iconbase64!=''" shape="square" fit="cover" :src="items.iconbase64" />
<el-avatar v-else shape="square" fit="cover" :src="squareUrl" />
</td>
<td valign="top" align="left">
<el-row>
<el-col :span="24">
<el-text>{{ items.departmentname }}</el-text>
<el-text><span v-if="items.departmentname"> - </span>{{ items.postname }}</el-text>
<el-text><span v-if="items.departmentname||items.postname"> - </span>{{ items.name }}</el-text>
</el-col>
<el-col :span="24">
<ul>
<li v-for="(logItem,logIndex) in items.log" :key="logIndex" class="logLi">
<el-text v-if="logItem.state==2" type="success">
<span v-if="logItem.cause">logItem.cause</span><span v-else>已同意</span>
</el-text>
<el-text v-else-if="logItem.state==3" type="danger">
<span v-if="logItem.cause">logItem.cause</span><span v-else>已驳回</span>
</el-text>
<el-text v-else>
<span v-if="logItem.cause">logItem.cause</span><span v-else>未操作</span>
</el-text> · {{ logItem.time }}
</li>
</ul>
</el-col>
</el-row>
</td>
</tr>
<tr>
<td>
<div v-if="item.judgelist" class="addUser" @click="addPeople(item)">
<svg-icon icon-class="addxuxian" size="50" />
</div>
</td>
<td></td>
</tr>
</table>
</template>
</el-step>
</el-steps>
</div>
<el-affix v-if="flowOpinion" position="bottom" :offset="0">
<div class="approvalBoard">
<el-text size="large" class="appBoardTitle">审批意见</el-text>
<el-row :gutter="20">
<el-col :span="24">
<el-input
v-model="sendFlowInfo"
:autosize="{ minRows: 2, maxRows: 6 }"
type="textarea"
placeholder="请输入审批意见"
/>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="4"></el-col>
<el-col :span="8" class="juzhong"><el-button type="primary" style="width:100%" @click="yesOrNo(props.flowKey,1)">同意</el-button></el-col>
<el-col :span="8" class="juzhong"><el-button type="danger" style="width:100%" @click="yesOrNo(props.flowKey,2)">驳回</el-button></el-col>
<el-col :span="4"></el-col>
</el-row>
</div>
</el-affix>
<OrgUserPage v-if="openOrClose" v-model:openclose="openOrClose" :preset-personnel="presetPersonnel" :selected-people="selectedPeople" @update-node="updateNode" />
<OrgAllUserPage v-if="openclosebox" v-model:openclosebox="openclosebox" :selected-people="selectedPeople" @update-node="updateNode" />
</div>
</template>
<style lang='scss' scoped>
.drawerFormBox{
width: 100%;
height: 100%;
}
.boxRight{
overflow: hidden;
overflow-y: auto;
border-left: 1px solid #EEEEEE;
}
.flowBox{
width: 100%;
padding: 0 5px 0 10px;
}
.approvalBoard{
padding: 5px 10px;
background-color: #FFFFFF;
border-top: 1px solid #EEEEEE;
.juzhong{
padding: 10px 0;
text-align: center;
}
.appBoardTitle{
padding: 5px 0 10px 0;
display: block;
}
}
</style>

299
src/views/taskplatform/taskmanagement/taskcustomerform.vue

@ -6,12 +6,15 @@
<script lang='ts' setup>
import { ref, reactive, onMounted, computed, nextTick } from 'vue'
import { useRouter } from 'vue-router'
import { notAsA_BasisForJudgment,asAnApprovalActionControl,fixedValueControl,timeControl,timeEquation } from '@/utils/workflow/const'
import {
string2json,
stringToObj
} from '@/utils/DesignForm/form'
import { haveCustomerFormVersion } from '@/api/taskapi/management'
import { nodeFlow,conditionInfo,nodelPeoples } from '@/api/taskapi/types'
import { haveCustomerFormVersion,generateFlow } from '@/api/taskapi/management'
import { judgeSubmitCancel } from '@/api/DesignForm/requestapi'
import '@/assets/scss/element-var.scss'
@ -19,6 +22,8 @@ import '@/assets/scss/index.scss'
import '@/assets/iconfont/iconfont.css'
import 'element-plus/dist/index.css'
import FlowStep from '@/views/taskplatform/taskmanagement/flowStep.vue'
const props = defineProps({
isopen:{
type:Boolean,
@ -65,6 +70,7 @@ const submitButton = {
}
}]
}
const isFlowForm = ref(false)
const loadingData = ref(false)
const formEl = ref()
const router = useRouter()
@ -80,6 +86,18 @@ const state = reactive<any>({
id: 0,
loading: true
})
//
const gainFlowChart = reactive<nodeFlow>({
id:0
})
const flowFactor = reactive<conditionInfo[]>([]) //
const nodelUserList = reactive<nodelPeoples[]>([])
//
const flowMap = ref<any[]>();
const nextStep = ref<number>(0);
const currentProgress = ref<number>(1);
const nodeKey = ref<string>('');
const formType = computed(() => {
// id
if (props.infoid) {
@ -102,7 +120,12 @@ const getTaskFormData = () =>{
loadingData.value = true;
haveCustomerFormVersion({id:props.versionid})
.then(({ data }) =>{
console.log("表单数据",data)
// console.log("",data)
if(data.classify == 2){
isFlowForm.value = true;
}else{
isFlowForm.value = false;
}
state.id=props.versionid
state.formData = stringToObj(data.mastesform)
state.dict = string2json(data.dict)
@ -114,6 +137,14 @@ const getTaskFormData = () =>{
}
}
})
//
gainFlowChart.id=data.flowkeystr
// generateFlow(gainFlowChart)
// .then((data:any) =>{
// console.log("",data.data)
// flowMap.value = data.data.flowList
// console.log("--->",flowMap.value)
// })
})
.finally(()=>{
loadingData.value = false;
@ -137,7 +168,7 @@ const beforeSubmit = (params: any) => {
const afterSubmit = (type: string) => {
if (type === 'success') {
// router.go(-1)
console.log("表单提交成功")
// console.log("")
emits("searchquery");
closeAppSubmit();
}
@ -156,6 +187,8 @@ const initData = () => {
state.formId = 0;
state.id = 0;
state.loading = true;
let aryLen = flowFactor.length
if(aryLen > 0) flowFactor.splice(0,aryLen);
}
watch(()=>props.isopen,()=>{
if(props.isopen){
@ -164,24 +197,240 @@ watch(()=>props.isopen,()=>{
initData()
}
})
const changeKeyVal = (key:any,val:any,type:any,attribute:any) => {
// console.log("--key--->",key)
// console.log("--val--->",val,Array.isArray(val))
// console.log("--type--->",type)
// console.log("--attribute--->",attribute)
// console.log("--type-1-true->",notAsA_BasisForJudgment.indexOf(type))
// if(notAsA_BasisForJudgment.indexOf(type) != -1){
// console.log("--type--true->",notAsA_BasisForJudgment.indexOf(type))
// }
let unitsVal = val
let isUpdateFlowChart = false
//
if(notAsA_BasisForJudgment.indexOf(type) === -1){
let isWrite = true
flowFactor.forEach((item:any)=>{
if(item.factorid == key){
isWrite = false
isUpdateFlowChart = true
item.type=3
if(type == "checkbox"){
item.isCheckbox = true
item.answers = val.map(String)
}else{
item.isCheckbox = false
item.oneanswer = val.toString()
}
}
})
if(isWrite){
if(type == "checkbox"){
flowFactor.push({
factorid:key,
type:3,
isCheckbox:true,
answers:val.map(String)
})
}else{
flowFactor.push({
factorid:key,
type:3,
isCheckbox:false,
oneanswer:val.toString()
})
}
isUpdateFlowChart = true
}
// console.log("--flowFactor--->",flowFactor)
}
// console.log("--flowFactor--1->",unitsVal,timeControl,type)
//
if(timeControl.indexOf(type) > -1 || fixedValueControl.indexOf(type) > -1 || type == "input"){
// console.log("--flowFactor--3->",unitsVal)
let addNewTime = true //
flowFactor.forEach((item:any)=>{
// console.log("--flowFactor--5->",item.type)
if(item.type == 2){
addNewTime = false
// console.log("--flowFactor--5====1->",item.type)
// console.log("--flowFactor--5====3->",item.customFields,item.customFields.length)
if(item.customFields && item.customFields.length > 0){
// console.log("--flowFactor--5====2->",item.customFields)
let sunNewAdd = true
item.customFields.forEach((sunItem:any)=>{
// console.log("--flowFactor-4->",sunItem.wordfield , key,sunItem.wordfield == key)
if(sunItem.wordfield == key){
sunNewAdd = false
isUpdateFlowChart = true
if(timeEquation.indexOf(attribute) === -1){ //
sunItem.leftval = val.toString()
}else{ //
if(Array.isArray(val)){
if(val.length >= 2){
sunItem.leftval = val[0].toString()
sunItem.rightval = val[val.length - 1].toString()
}
}
}
}
})
if(sunNewAdd){
isUpdateFlowChart = true
if(timeEquation.indexOf(attribute) === -1){//
let customFieldInfo = {
wordfield: key,
optType: "1",
leftval: val.toString()
}
item.customFields.push(customFieldInfo)
}else{ //
if(Array.isArray(val)){
if(val.length >= 2){
let customFieldInfo = {
wordfield: key,
optType: "6",
leftval: val[0].toString(),
leftoptType:"3",
rightoptType:"3",
rightval:val[val.length - 1].toString()
}
item.customFields.push(customFieldInfo)
}
}
}
}
}
}
})
if(addNewTime){ //
isUpdateFlowChart = true
if(timeEquation.indexOf(attribute) === -1){ //
let customFieldInfo = {
wordfield: key,
optType: "1",
leftval: val.toString()
}
let condInfo = {
factorid:"customFields",
type:2,
isCheckbox:false,
customFields:[customFieldInfo]
}
flowFactor.push(condInfo)
}else{ //
if(Array.isArray(val)){
if(val.length >= 2){
let customFieldInfo = {
wordfield: key,
optType: "6",
leftval: val[0].toString(),
leftoptType:"3",
rightoptType:"3",
rightval:val[val.length - 1].toString()
}
let condInfo = {
factorid:"customFields",
type:2,
isCheckbox:false,
customFields:[customFieldInfo]
}
flowFactor.push(condInfo)
}
}
}
}
}
//
if(asAnApprovalActionControl.indexOf(type) > -1){
isUpdateFlowChart = true
let isWriteUs = true
nodelUserList.forEach((item:any)=>{
if(item.factorid == key){
isWriteUs = false
item.userList = val
}
})
if(isWriteUs){
nodelUserList.push({
factorid:key,
userList:val
})
}
}
// console.log("--flowFactor--->",flowFactor)
//
if(isUpdateFlowChart){
//
gainFlowChart.conditionList=flowFactor
gainFlowChart.nodelPeople=nodelUserList
// console.log("--gainFlowChart--->",gainFlowChart)
generateFlow(gainFlowChart)
.then((data:any) =>{
// console.log("-new-->",data)
flowMap.value = data.data.flowList
nextStep.value = data.data.nextStep;
currentProgress.value = data.data.Step;
nodeKey.value = data.data.nodeKey;
// console.log("-1-->",flowMap.value)
})
}
}
watch(()=>flowMap,(val:any)=>{
// console.log("-->",flowMap.value)
})
</script>
<template>
<el-drawer v-model="drawerOpenOrClose" v-loading="loadingData" :title="versiontitle" :close-on-click-modal="false" :close-on-press-escape="false" :destroy-on-close="true" :size="props.drawerwith" class="drawerClass" >
<div class="drawerBody">
<ak-form
ref="formEl"
:form-data="state.formData"
:type="formType"
:dict="state.dict"
request-url="getFormContent"
add-url="saveFormContent"
edit-url="editFormContent"
:before-submit="beforeSubmit"
:after-submit="afterSubmit"
:close-app-submit="closeAppSubmit"
/>
</div>
<el-tabs v-if="isFlowForm" tab-position="left" style="height: 100%" class="demo-tabs">
<el-tab-pane label="表单">
<ak-form
ref="formEl"
:form-data="state.formData"
:type="formType"
:dict="state.dict"
request-url="getFormContent"
add-url="saveFormContent"
edit-url="editFormContent"
:before-submit="beforeSubmit"
:after-submit="afterSubmit"
:close-app-submit="closeAppSubmit"
:change-key-val="changeKeyVal"
/>
</el-tab-pane>
<el-tab-pane label="流程">
<FlowStep v-model:flow-map="flowMap" :next-step="nextStep" :current-progress="currentProgress" :node-key="nodeKey" />
</el-tab-pane>
</el-tabs>
<!--无流程表单-->
<div v-else class="drawerBody">
<ak-form
ref="formEl"
:form-data="state.formData"
:type="formType"
:dict="state.dict"
request-url="getFormContent"
add-url="saveFormContent"
edit-url="editFormContent"
:before-submit="beforeSubmit"
:after-submit="afterSubmit"
:close-app-submit="closeAppSubmit"
:change-key-val="changeKeyVal"
/>
</div>
</el-drawer>
</template>
@ -209,3 +458,15 @@ watch(()=>props.isopen,()=>{
padding: 20px;
}
</style>
<style>
.demo-tabs > .el-tabs__content {
padding: 0px 20px 20px 20px;
overflow: hidden;
overflow-y: auto;
}
.el-tabs--right .el-tabs__content,
.el-tabs--left .el-tabs__content {
height: 100%;
}
</style>

580
src/views/taskplatform/taskmanagement/taskcustomerformnew.vue

@ -0,0 +1,580 @@
<!--
@ 作者: 秦东
@ 时间: 2023-09-22 15:26:36
@ 备注: 回显表单
-->
<script lang='ts' setup>
import { ref, reactive, onMounted, computed, nextTick } from 'vue'
import { useRouter } from 'vue-router'
import { notAsA_BasisForJudgment,asAnApprovalActionControl,fixedValueControl,timeControl,timeEquation } from '@/utils/workflow/const'
import {
string2json,
stringToObj
} from '@/utils/DesignForm/form'
import { nodeFlow,conditionInfo,nodelPeoples } from '@/api/taskapi/types'
import { haveCustomerFormVersion,generateFlow } from '@/api/taskapi/management'
import { judgeSubmitCancel,startRunFlow } from '@/api/DesignForm/requestapi'
import '@/assets/scss/element-var.scss'
import '@/assets/scss/index.scss'
import '@/assets/iconfont/iconfont.css'
import 'element-plus/dist/index.css'
import FlowStep from '@/views/taskplatform/taskmanagement/flowStep.vue'
const props = defineProps({
isopen:{
type:Boolean,
default:true
},
versionid:{
type:String,
default:""
},
versiontitle:{
type:String,
default:""
},
infoid:{
type:String,
default:""
},
drawerwith:{
type:Number,
default:0
}
})
const submitButton = {
type: "div",
control:
{},
config:
{
textAlign: "center",
span: ""
},
list: [
{
type: "button",
control:
{
label: "保存",
type: "primary",
key: "submit"
},
config:
{
textAlign: "center"
}
}]
}
const formLoading = ref(false)
const flowLoading = ref(false)
const flowOpinion = ref(false); //
const isFlowForm = ref(false)
const loadingData = ref(false)
const formEl = ref()
const router = useRouter()
const state = reactive<any>({
type: 1, // 123 4 5
formData: {
list: [],
form: {},
config: {}
},
dict: {},
formId: props.versionid,
id: 0,
loading: true
})
//
const gainFlowChart = reactive<nodeFlow>({
id:0
})
const flowFactor = reactive<conditionInfo[]>([]) //
const nodelUserList = reactive<nodelPeoples[]>([])
//
const flowMap = ref<any[]>();
const nextStep = ref<number>(0);
const currentProgress = ref<number>(1);
const nodeKey = ref<string>('');
const formType = computed(() => {
// id
if (props.infoid) {
return 2
} else {
return 1
}
})
const emits = defineEmits(["update:isopen","searchquery"]);
const drawerOpenOrClose = computed({
get: () => props.isopen,
set: (val) => {
emits("update:isopen", val);
},
});
//
const getTaskFormData = () =>{
loadingData.value = true;
formLoading.value = true;
formLoading.value = true;
haveCustomerFormVersion({id:props.versionid})
.then(({ data }) =>{
// console.log("",data)
if(data.classify == 2){
isFlowForm.value = true;
}else{
isFlowForm.value = false;
}
state.id=props.versionid
state.formData = stringToObj(data.mastesform)
state.dict = string2json(data.dict)
judgeSubmitCancel({"name":data.mastesformjson})
.then((data:any) =>{
if(data.code == 0){
if (data.data == 3 || data.data == 4){
state.formData.list.push(submitButton)
}
}
})
//
gainFlowChart.id=data.flowkeystr
generateFlow(gainFlowChart)
.then((data:any) =>{
console.log("获取工作流不进图",data.data)
flowMap.value = data.data.flowList
console.log("获取工作流不进图--->",flowMap.value)
formLoading.value = false
})
})
.finally(()=>{
loadingData.value = false;
formLoading.value = false;
})
}
const drawerWith = ref<number>(0);
onMounted(()=>{
drawerWith.value = window.innerWidth - 220
});
window.addEventListener("resize", function(){
drawerWith.value = window.innerWidth -220
})
const beforeSubmit = (params: any) => {
params.formId = props.versionid
params.id = ""
// emits("update:isopen", false);
return params
}
const afterSubmit = (type: string,val?:any) => {
console.log("表单提交成功------------------>",type,val)
if (type === 'success') {
// router.go(-1)
if(isFlowForm.value){
if(val.code == 0){
if(val.data){
let sendInfo ={
id:val.data.uuid,
flowList:flowMap.value
}
startRunFlow(sendInfo)
.then((data:any)=>{
console.log("流程提交成功--------1---------->",data)
})
}
}
// console.log("--------1---------->",type,val)
}
emits("searchquery");
closeAppSubmit();
}
}
const closeAppSubmit = () => {
emits("update:isopen", false);
initData();
}
const initData = () => {
state.formData = {
list: [],
form: {},
config: {}
};
state.dict = {};
state.formId = 0;
state.id = 0;
state.loading = true;
let aryLen = flowFactor.length
if(aryLen > 0) flowFactor.splice(0,aryLen);
}
watch(()=>props.isopen,()=>{
if(props.isopen){
getTaskFormData();
}else{
initData()
}
})
const changeKeyVal = (key:any,val:any,type:any,attribute:any) => {
// console.log("--key--->",key)
// console.log("--val--->",val,Array.isArray(val))
// console.log("--type--->",type)
// console.log("--attribute--->",attribute)
// console.log("--type-1-true->",notAsA_BasisForJudgment.indexOf(type))
// if(notAsA_BasisForJudgment.indexOf(type) != -1){
// console.log("--type--true->",notAsA_BasisForJudgment.indexOf(type))
// }
let unitsVal = val
let isUpdateFlowChart = false
//
if(notAsA_BasisForJudgment.indexOf(type) === -1){
let isWrite = true
flowFactor.forEach((item:any)=>{
if(item.factorid == key){
isWrite = false
isUpdateFlowChart = true
item.type=3
if(type == "checkbox"){
item.isCheckbox = true
item.answers = val.map(String)
}else{
item.isCheckbox = false
item.oneanswer = val.toString()
}
}
})
if(isWrite){
if(type == "checkbox"){
flowFactor.push({
factorid:key,
type:3,
isCheckbox:true,
answers:val.map(String)
})
}else{
flowFactor.push({
factorid:key,
type:3,
isCheckbox:false,
oneanswer:val.toString()
})
}
isUpdateFlowChart = true
}
// console.log("--flowFactor--->",flowFactor)
}
// console.log("--flowFactor--1->",unitsVal,timeControl,type)
//
if(timeControl.indexOf(type) > -1 || fixedValueControl.indexOf(type) > -1 || type == "input"){
// console.log("--flowFactor--3->",unitsVal)
let addNewTime = true //
flowFactor.forEach((item:any)=>{
// console.log("--flowFactor--5->",item.type)
if(item.type == 2){
addNewTime = false
// console.log("--flowFactor--5====1->",item.type)
// console.log("--flowFactor--5====3->",item.customFields,item.customFields.length)
if(item.customFields && item.customFields.length > 0){
// console.log("--flowFactor--5====2->",item.customFields)
let sunNewAdd = true
item.customFields.forEach((sunItem:any)=>{
// console.log("--flowFactor-4->",sunItem.wordfield , key,sunItem.wordfield == key)
if(sunItem.wordfield == key){
sunNewAdd = false
isUpdateFlowChart = true
if(timeEquation.indexOf(attribute) === -1){ //
sunItem.leftval = val.toString()
}else{ //
if(Array.isArray(val)){
if(val.length >= 2){
sunItem.leftval = val[0].toString()
sunItem.rightval = val[val.length - 1].toString()
}
}
}
}
})
if(sunNewAdd){
isUpdateFlowChart = true
if(timeEquation.indexOf(attribute) === -1){//
let customFieldInfo = {
wordfield: key,
optType: "1",
leftval: val.toString()
}
item.customFields.push(customFieldInfo)
}else{ //
if(Array.isArray(val)){
if(val.length >= 2){
let customFieldInfo = {
wordfield: key,
optType: "6",
leftval: val[0].toString(),
leftoptType:"3",
rightoptType:"3",
rightval:val[val.length - 1].toString()
}
item.customFields.push(customFieldInfo)
}
}
}
}
}
}
})
if(addNewTime){ //
isUpdateFlowChart = true
if(timeEquation.indexOf(attribute) === -1){ //
let customFieldInfo = {
wordfield: key,
optType: "1",
leftval: val.toString()
}
let condInfo = {
factorid:"customFields",
type:2,
isCheckbox:false,
customFields:[customFieldInfo]
}
flowFactor.push(condInfo)
}else{ //
if(Array.isArray(val)){
if(val.length >= 2){
let customFieldInfo = {
wordfield: key,
optType: "6",
leftval: val[0].toString(),
leftoptType:"3",
rightoptType:"3",
rightval:val[val.length - 1].toString()
}
let condInfo = {
factorid:"customFields",
type:2,
isCheckbox:false,
customFields:[customFieldInfo]
}
flowFactor.push(condInfo)
}
}
}
}
}
//
if(asAnApprovalActionControl.indexOf(type) > -1){
isUpdateFlowChart = true
let isWriteUs = true
nodelUserList.forEach((item:any)=>{
if(item.factorid == key){
isWriteUs = false
item.userList = val
}
})
if(isWriteUs){
nodelUserList.push({
factorid:key,
userList:val
})
}
}
// console.log("--flowFactor--->",flowFactor)
//
if(isUpdateFlowChart){
flowLoading.value = true
//
gainFlowChart.conditionList=flowFactor
gainFlowChart.nodelPeople=nodelUserList
// console.log("--gainFlowChart--->",gainFlowChart)
generateFlow(gainFlowChart)
.then((data:any) =>{
// console.log("-new-->",data)
flowMap.value = data.data.flowList
nextStep.value = data.data.nextStep;
currentProgress.value = data.data.Step;
nodeKey.value = data.data.nodeKey;
// console.log("-1-->",flowMap.value)
flowLoading.value = false
})
}
}
watch(()=>flowMap,(val:any)=>{
// console.log("-->",flowMap.value)
})
const sendFlowInfo = ref<any>()
</script>
<template>
<el-drawer v-model="drawerOpenOrClose" v-loading="loadingData" :title="versiontitle" :close-on-click-modal="false" :close-on-press-escape="false" :destroy-on-close="true" :size="props.drawerwith" class="drawerClass" >
<table border="0" v-if="isFlowForm" class="tableFlowBox">
<tr>
<td valign="top">
<div class="drawerFormBox boxLeft">
<ak-form
v-loading="formLoading" element-loading-text="Loading..."
ref="formEl"
:form-data="state.formData"
:type="formType"
:dict="state.dict"
request-url="getFormContent"
add-url="saveFormContent"
edit-url="editFormContent"
:before-submit="beforeSubmit"
:after-submit="afterSubmit"
:close-app-submit="closeAppSubmit"
:change-key-val="changeKeyVal"
/>
</div>
</td>
<td valign="top" width="350">
<div v-loading="flowLoading" element-loading-text="Loading..." class="drawerFormBox boxRight">
<div class="flowBox">
<el-affix :offset="20">
<el-text size="large">审批流程</el-text>
</el-affix>
<FlowStep v-model:flow-map="flowMap" :next-step="nextStep" :current-progress="currentProgress" :node-key="nodeKey" />
</div>
<el-affix v-if="flowOpinion" position="bottom" :offset="0">
<div class="approvalBoard">
<el-text size="large" class="appBoardTitle">审批意见</el-text>
<el-row :gutter="20">
<el-col :span="24">
<el-input
v-model="sendFlowInfo"
:autosize="{ minRows: 2, maxRows: 6 }"
type="textarea"
placeholder="请输入审批意见"
/>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="4"></el-col>
<el-col :span="8" class="juzhong"><el-button type="primary" style="width:100%">同意</el-button></el-col>
<el-col :span="8" class="juzhong"><el-button type="danger" style="width:100%">驳回</el-button></el-col>
<el-col :span="4"></el-col>
</el-row>
</div>
</el-affix>
</div>
</td>
</tr>
</table>
<!--无流程表单-->
<div v-else class="drawerBody">
<ak-form
ref="formEl"
:form-data="state.formData"
:type="formType"
:dict="state.dict"
request-url="getFormContent"
add-url="saveFormContent"
edit-url="editFormContent"
:before-submit="beforeSubmit"
:after-submit="afterSubmit"
:close-app-submit="closeAppSubmit"
/>
</div>
</el-drawer>
</template>
<style lang='scss' scoped>
.tableFlowBox{
width: 100%;
height: 100%;
// background-color: #000000;
.drawerFormBox{
width: 100%;
height: 100%;
// background-color: #ff0000;
}
}
.boxLeft{
padding: 0 10px 0 15px;
overflow: hidden;
overflow-y: auto;
}
.flowBox{
padding: 0 5px 0 10px;
}
.boxRight{
overflow: hidden;
overflow-y: auto;
border-left: 1px solid #EEEEEE;
}
.approvalBoard{
padding: 5px 10px;
background-color: #FFFFFF;
border-top: 1px solid #EEEEEE;
.juzhong{
padding: 10px 0;
text-align: center;
}
.appBoardTitle{
padding: 5px 0 10px 0;
display: block;
}
}
</style>
<style lang='scss'>
.drawerClass ::v-deep.el-drawer__header {
font-size: 22px;
text-align: center;
margin-bottom: 0px;
padding: 0;
.el-drawer__close-btn{
background-color: rgb(255, 77, 79);
color: white;
}
}
::v-deep .el-drawer__body {
padding: 0px;
}
.details {
width: 80%;
margin-right: 0px;
margin-left: 20%;
box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);
}
.drawerBody{
padding: 20px;
}
</style>
<style>
.demo-tabs > .el-tabs__content {
padding: 0px 20px 20px 20px;
overflow: hidden;
overflow-y: auto;
}
.el-tabs--right .el-tabs__content,
.el-tabs--left .el-tabs__content {
height: 100%;
}
</style>
<style scoped>
.affix-container {
text-align: center;
height: 400px;
border-radius: 4px;
background: var(--el-color-primary-light-9);
}
</style>

2
src/views/taskplatform/taskmanagement/taskentry.vue

@ -34,7 +34,7 @@ const gainTaskContAry = () => {
taskLoding.value = true
gainTaskList(gainTaskListInfo)
.then(({data})=>{
console.log(data)
// console.log(data)
if(data != null){
taskList.value = data.list;
taskTotal.value = data.total;

4
src/views/taskplatform/taskmanagement/tasklist.vue

@ -9,7 +9,7 @@ import { appFormdataLog,delCustomerFormData } from '@/api/taskapi/management'
//
import TaskEntry from '@/views/taskplatform/taskmanagement/taskentry.vue'
import TaskCustomerForm from '@/views/taskplatform/taskmanagement/taskcustomerform.vue'
import TaskCustomerForm from '@/views/taskplatform/taskmanagement/taskcustomerformnew.vue'
import EditTaskCustomerForm from '@/views/taskplatform/taskmanagement/edittaskcustomerform.vue'
const loading = ref(false)
@ -35,7 +35,7 @@ const searchQuery = () =>{
loading.value = true;
appFormdataLog(searchData)
.then(({data}) =>{
console.log(data)
// console.log(data)
if(data != null){
formLogList.value = data.list;
total.value = data.total;

194
src/views/taskplatform/taskmanagement/todolist.vue

@ -0,0 +1,194 @@
<!--
@ 作者: 秦东
@ 时间: 2023-11-22 14:55:46
@ 备注: 待办事宜
-->
<script lang='ts' setup>
import { taskFlowList } from '@/api/DesignForm/requestapi'
import { taskflowquery } from '@/api/DesignForm/type'
import LookAndOperateLogInfo from '@/views/taskplatform/taskmanagement/lookAndOperateLogInfo.vue'
const selectInfoTd = reactive<taskflowquery>({
page: 1,
pagesize: 20,
class: 2
})
const loadingTd = ref(false)
const searckFormRefTd = ref(ElForm);
const totalstd = ref<number>(0) //
const taskFlowAryTd = ref<any>([]) //
//
const getToDoListTd = () => {
loadingTd.value = true
taskFlowList(selectInfoTd)
.then((data:any)=>{
console.log("获取我的请求",data)
totalstd.value = data.data.total
taskFlowAryTd.value = data.data.list
})
.finally(()=>{
loadingTd.value = false
})
}
//
const resetQueryTd = () =>{
searckFormRefTd.value.resetFields();
initData();
}
//
const initData = () =>{
selectInfoTd.page = 1;
selectInfoTd.pagesize = 15;
selectInfoTd.title = ""
selectInfoTd.class = 2;
selectInfoTd.state = 0;
}
const myappbox = ref()
const drawerMyWith = ref<number>(0);
//
onMounted(()=>{
getToDoListTd();
drawerMyWith.value = myappbox.value?.clientWidth
})
const flowLogInfo = ref<any>()
const darwOpenOrClose = ref(false)
/**
* 查看流程任务
* val 记录内容
* types 记录类型; 1我的请求2待办事宜3已办事宜4草稿箱
*/
const lookFlowInfo = (val:any,types:number) => {
flowLogInfo.value = val
darwOpenOrClose.value = true
}
</script>
<template>
<div ref="myappbox" class="app_box">
<div class="app-container">
<div class="search">
<el-form ref="searckFormRefTd" :model="selectInfoTd" :inline="true">
<el-form-item label="任务标题" prop="name">
<el-input
v-model="selectInfoTd.title"
placeholder="请输入任务标题"
clearable
@keyup.enter="searchQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="getToDoListTd()"><i-ep-search />搜索</el-button>
<el-button @click="resetQueryTd()"><i-ep-refresh />重置</el-button>
</el-form-item>
</el-form>
</div>
<el-card shadow="never">
<el-table
v-loadingTd="loadingTd"
element-loadingTd-text="Loading..."
highlight-current-row
:data="taskFlowAryTd"
border
class="table_box"
>
<el-table-column fixed label="标题" prop="title" width="500" />
<el-table-column label="创建人" prop="creater" >
<template #default="scope">
{{ scope.row.creatorInfo.name }}<el-text type="info">{{ scope.row.creatorInfo.number }}</el-text>
</template>
</el-table-column>
<el-table-column label="发起日期" prop="startDate" align="center" width="300" />
<el-table-column label="状态" prop="status" align="center" width="220" >
<template #default="scope">
<el-tag
v-if="scope.row.status==1"
class="mx-1"
effect="plain"
round
>
草稿
</el-tag>
<el-tag
v-else-if="scope.row.status==2"
type="danger"
class="mx-1"
effect="plain"
round
>
驳回
</el-tag>
<el-tag
v-else-if="scope.row.status==3"
type="success"
class="mx-1"
effect="plain"
round
>
审批中
</el-tag>
<el-tag
v-else-if="scope.row.status==4"
type="info"
class="mx-1"
effect="plain"
round
>
归档
</el-tag>
<el-tag
v-else
type="info"
class="mx-1"
effect="plain"
round
>
删除
</el-tag>
</template>
</el-table-column>
<el-table-column label="当前节点及操作人" prop="currentStep" width="400" >
<template #default="scope">
<el-text v-if="scope.row.currentNodeName" type="success">{{ scope.row.currentNodeName }}:</el-text><el-text v-for="(item,index) in scope.row.currentNodeUser" :key="index" type="warning">{{ item.name }}({{ item.number }})</el-text>
</template>
</el-table-column>
<el-table-column fixed="right" align="center" label="操作" width="100" >
<template #default="scope">
<el-button type="primary" class="fa fa-eye" @click="lookFlowInfo(scope.row,2)" />
</template>
</el-table-column>
</el-table>
<pagination
v-model:total="totalstd"
v-model:page="selectInfoTd.page"
v-model:limit="selectInfoTd.pagesize"
@pagination="getToDoListTd"
/>
</el-card>
<LookAndOperateLogInfo v-if="darwOpenOrClose" v-model:isshow="darwOpenOrClose" :flow-log-info="flowLogInfo" :drawer-with="drawerMyWith" @getmytodolist="getMyToDoList" />
</div>
</div>
</template>
<style lang='scss' scoped>
.app_box{
width:100%;
overflow: hidden;
overflow-y: auto;
}
.box-card {
width: 100%;
}
.table_box{
width: 100%;
height: calc(100vh - 308px);
}
</style>

160
vite.config.ts.timestamp-1700547221061-a6108b35a7917.mjs

File diff suppressed because one or more lines are too long
Loading…
Cancel
Save