Browse Source

工作流审批

v3
超级管理员 2 years ago
parent
commit
fadd9e2e4f
  1. 27
      src/api/DesignForm/requestapi.ts
  2. 6
      src/api/DesignForm/type.ts
  3. 1
      src/api/taskapi/types.ts
  4. 1
      src/assets/icons/caogaoxiang(1).svg
  5. 1
      src/assets/icons/caogaoxiang.svg
  6. 1
      src/assets/icons/daiBanShiYi.svg
  7. 1
      src/assets/icons/myQingQiu.svg
  8. 1
      src/assets/icons/newFlow.svg
  9. 1
      src/assets/icons/yiBanRenwu.svg
  10. BIN
      src/assets/images/1.png
  11. BIN
      src/assets/images/2.png
  12. 8
      src/components/DesignForm/public/expand/user.vue
  13. 8
      src/components/DesignForm/public/expand/userDialog.vue
  14. 28
      src/components/DesignForm/public/form/form.vue
  15. 2
      src/components/DesignForm/public/form/formGroup.vue
  16. 4
      src/components/DesignForm/public/form/formItem.vue
  17. 2
      src/components/workflow/drwer/approverDrawer.vue
  18. 8
      src/utils/workflow/index.ts
  19. 6
      src/views/public/orguser/orgalluser.vue
  20. 2
      src/views/sysworkflow/codepage/page.vue
  21. 194
      src/views/taskplatform/taskmanagement/completedmatters.vue
  22. 173
      src/views/taskplatform/taskmanagement/drafts.vue
  23. 6
      src/views/taskplatform/taskmanagement/edittaskcustomerform.vue
  24. 24
      src/views/taskplatform/taskmanagement/flowStep.vue
  25. 188
      src/views/taskplatform/taskmanagement/lookAndOperateLogInfo.vue
  26. 194
      src/views/taskplatform/taskmanagement/myrequest.vue
  27. 98
      src/views/taskplatform/taskmanagement/newaddflow.vue
  28. 213
      src/views/taskplatform/taskmanagement/runFlowStep.vue
  29. 14
      src/views/taskplatform/taskmanagement/taskcustomerform.vue
  30. 62
      src/views/taskplatform/taskmanagement/taskcustomerformnew.vue
  31. 2
      src/views/taskplatform/taskmanagement/taskentry.vue
  32. 2
      src/views/taskplatform/taskmanagement/tasklist.vue
  33. 194
      src/views/taskplatform/taskmanagement/todolist.vue

27
src/api/DesignForm/requestapi.ts

@ -21,7 +21,8 @@ import {
hanziToPinyin,
gogoBackFormTabelStruct,
nodeFlow,
searchUserListForm
searchUserListForm,
taskflowquery
} from './type';
//自定义表单列表
export function getCustomerFormList(queryParams: SearchForm): AxiosPromise<CustomerFormPageResult> {
@ -186,3 +187,27 @@ export function gainFlowPeople(data?: string[]){
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
});
}

6
src/api/DesignForm/type.ts

@ -171,3 +171,9 @@ 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:删除
}

1
src/api/taskapi/types.ts

@ -23,6 +23,7 @@ export interface taskLonCont{
//获取可执行得任务列表
export interface gainTaskListQuery extends PageQuery {
status?: number;
type?: number;
}
//执行得任务记录列表
export interface taskListCont{

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

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

@ -28,16 +28,16 @@ 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,newVal.length)
// console.log("value-set",newVal,newVal.length)
// emits('update:modelValue', newVal)
let newValJson:criteriaForPeopleList[] = JSON.parse(newVal)
console.log("value-newValJson",newValJson)
// console.log("value-newValJson",newValJson)
if(newValJson.length > 0){
let userAry = new Array
@ -62,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(() => {})
})

8
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(()=>{})
}
@ -103,7 +103,7 @@ const tableRowClick = (row: any) => {
// console.log("checkDataList",checkDataList,row)
}
const delRowClick = (row: criteriaForPeopleList) => {
console.log("checkDataList",row)
// console.log("checkDataList",row)
// checkData.value.forEach((item: any, index: number) => {
// if (item === row) {
// checkData.value.splice(index, 1)
@ -137,11 +137,11 @@ 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){

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

@ -125,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(
@ -157,7 +157,7 @@ const forEachGetFormModel = (list: FormList[], obj: any) => {
// tProp
provide(constControlChange, ({ key, value, data, tProp, type, attribute }: any) => {
console.log("监听表单--constControlChange-->",key, value, data, tProp,type,attribute)
// console.log("--constControlChange-->",key, value, data, tProp,type,attribute)
if (typeof props.changeKeyVal === 'function') {
props.changeKeyVal(key, value,type,attribute)
}
@ -231,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) {
@ -245,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) {
@ -260,7 +260,7 @@ const getValue = (filter?: boolean) => {
}
return obj
} else {
console.log("getValue--->model-value->",model.value)
// console.log("getValue--->model-value->",model.value)
return model.value
}
}
@ -357,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
//
@ -389,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)
}
@ -426,9 +426,9 @@ const submit = (params = {}) => {
if (valid) {
const formatParams = Object.assign({}, fields, params)
console.log("params--->",params)
console.log("fields--->",fields)
console.log("formatParams-Object-->",formatParams)
// console.log("params--->",params)
// console.log("fields--->",fields)
// console.log("formatParams-Object-->",formatParams)
let submitParams
const beforeSubmit = props.formData.events?.beforeSubmit
@ -454,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) => {

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

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

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

@ -140,9 +140,13 @@ const currentComponent = computed(() => {
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/drwer/approverDrawer.vue

@ -337,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">

8
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)
@ -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 + "签"
}
}

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

@ -61,7 +61,7 @@ const getTreeData = () => {
orgLoading.value = true
getOrgFormTree()
.then(({ data }) => {
console.log(data)
// console.log(data)
treeData.value = data.list
}).finally(()=>{
orgLoading.value = false
@ -147,7 +147,7 @@ const clostBox = () =>{
}
//
const confirmChoices = () => {
console.log("confirmChoices",checkDataList)
// console.log("confirmChoices",checkDataList)
emits('updateNode', checkDataList)
clostBox()
}
@ -159,7 +159,7 @@ const backfillData = () => {
checkDataList.push(item)
})
}
console.log("props.selectedPeople",props.selectedPeople,checkDataList)
// console.log("props.selectedPeople",props.selectedPeople,checkDataList)
}
</script>
<template>

2
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

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>

6
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();

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

@ -8,11 +8,12 @@ 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:
'https://cube.elemecdn.com/3/7c/3ea6beec64369c2642b92c6726f1epng.png',
squareUrl:
'https://cube.elemecdn.com/9/c2/f0ee8a3c7c9638a54940382568c9dpng.png',
circleUrl:squareUrlTwo,
squareUrl: squareUrlOne,
sizeList: ['small', '', 'large'] as const,
})
@ -57,7 +58,11 @@ onMounted(()=>{
})
//
const judgeAddUser = (val:any):boolean =>{
console.log("val----->",val)
// 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
@ -85,6 +90,7 @@ const judgeAddUser = (val:any):boolean =>{
}
return false
}
return false
}
let zhiXingStep = 1;
@ -99,21 +105,21 @@ const addPeople = (val:any) =>{
openOrClose.value = true
}
console.log("PresetPersonnel.value--------1-------->",val)
// 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)
// console.log("P",zhiXingStep,val)
flowList.value.forEach((item:any) =>{
if(item.step == zhiXingStep){
console.log("P更新节点操作人---1-->",item.step , zhiXingStep)
// console.log("P---1-->",item.step , zhiXingStep)
item.operator = val
}
})
console.log("P更新节点操作人--2--->",flowList)
// console.log("P--2--->",flowList)
}
</script>
<template>

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>

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

@ -120,7 +120,7 @@ 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{
@ -168,7 +168,7 @@ const beforeSubmit = (params: any) => {
const afterSubmit = (type: string) => {
if (type === 'success') {
// router.go(-1)
console.log("表单提交成功")
// console.log("")
emits("searchquery");
closeAppSubmit();
}
@ -366,26 +366,26 @@ const changeKeyVal = (key:any,val:any,type:any,attribute:any) => {
}
}
console.log("改变表单值--flowFactor--->",flowFactor)
// console.log("--flowFactor--->",flowFactor)
//
if(isUpdateFlowChart){
//
gainFlowChart.conditionList=flowFactor
gainFlowChart.nodelPeople=nodelUserList
console.log("获取工作流不进图--gainFlowChart--->",gainFlowChart)
// console.log("--gainFlowChart--->",gainFlowChart)
generateFlow(gainFlowChart)
.then((data:any) =>{
console.log("获取工作流不进图-new-->",data)
// 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)
// console.log("-1-->",flowMap.value)
})
}
}
watch(()=>flowMap,(val:any)=>{
console.log("工作流在变化-->",flowMap.value)
// console.log("-->",flowMap.value)
})
</script>
<template>

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

@ -15,7 +15,7 @@ import {
} from '@/utils/DesignForm/form'
import { nodeFlow,conditionInfo,nodelPeoples } from '@/api/taskapi/types'
import { haveCustomerFormVersion,generateFlow } from '@/api/taskapi/management'
import { judgeSubmitCancel } from '@/api/DesignForm/requestapi'
import { judgeSubmitCancel,startRunFlow } from '@/api/DesignForm/requestapi'
import '@/assets/scss/element-var.scss'
import '@/assets/scss/index.scss'
@ -70,6 +70,10 @@ const submitButton = {
}
}]
}
const formLoading = ref(false)
const flowLoading = ref(false)
const flowOpinion = ref(false); //
const isFlowForm = ref(false)
const loadingData = ref(false)
@ -88,6 +92,8 @@ const state = reactive<any>({
loading: true
})
//
const gainFlowChart = reactive<nodeFlow>({
id:0
@ -119,9 +125,11 @@ const drawerOpenOrClose = computed({
//
const getTaskFormData = () =>{
loadingData.value = true;
formLoading.value = true;
formLoading.value = true;
haveCustomerFormVersion({id:props.versionid})
.then(({ data }) =>{
console.log("表单数据",data)
// console.log("",data)
if(data.classify == 2){
isFlowForm.value = true;
}else{
@ -140,15 +148,17 @@ const getTaskFormData = () =>{
})
//
gainFlowChart.id=data.flowkeystr
// generateFlow(gainFlowChart)
// .then((data:any) =>{
// console.log("",data.data)
// flowMap.value = data.data.flowList
// console.log("--->",flowMap.value)
// })
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;
})
}
@ -166,10 +176,25 @@ const beforeSubmit = (params: any) => {
// emits("update:isopen", false);
return params
}
const afterSubmit = (type: string) => {
const afterSubmit = (type: string,val?:any) => {
console.log("表单提交成功------------------>",type,val)
if (type === 'success') {
// router.go(-1)
console.log("表单提交成功")
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();
}
@ -367,26 +392,28 @@ const changeKeyVal = (key:any,val:any,type:any,attribute:any) => {
}
}
console.log("改变表单值--flowFactor--->",flowFactor)
// console.log("--flowFactor--->",flowFactor)
//
if(isUpdateFlowChart){
flowLoading.value = true
//
gainFlowChart.conditionList=flowFactor
gainFlowChart.nodelPeople=nodelUserList
console.log("获取工作流不进图--gainFlowChart--->",gainFlowChart)
// console.log("--gainFlowChart--->",gainFlowChart)
generateFlow(gainFlowChart)
.then((data:any) =>{
console.log("获取工作流不进图-new-->",data)
// 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)
// console.log("-1-->",flowMap.value)
flowLoading.value = false
})
}
}
watch(()=>flowMap,(val:any)=>{
console.log("工作流在变化-->",flowMap.value)
// console.log("-->",flowMap.value)
})
const sendFlowInfo = ref<any>()
</script>
@ -397,6 +424,7 @@ const sendFlowInfo = ref<any>()
<td valign="top">
<div class="drawerFormBox boxLeft">
<ak-form
v-loading="formLoading" element-loading-text="Loading..."
ref="formEl"
:form-data="state.formData"
:type="formType"
@ -412,7 +440,7 @@ const sendFlowInfo = ref<any>()
</div>
</td>
<td valign="top" width="350">
<div class="drawerFormBox boxRight">
<div v-loading="flowLoading" element-loading-text="Loading..." class="drawerFormBox boxRight">
<div class="flowBox">
<el-affix :offset="20">
<el-text size="large">审批流程</el-text>
@ -459,7 +487,7 @@ const sendFlowInfo = ref<any>()
:before-submit="beforeSubmit"
:after-submit="afterSubmit"
:close-app-submit="closeAppSubmit"
:change-key-val="changeKeyVal"
/>
</div>
</el-drawer>

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;

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

@ -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>
Loading…
Cancel
Save