tengmingxue 2 лет назад
Родитель
Сommit
4ccb13a271

+ 37 - 2
src/api/resource/examine.ts

@@ -2,7 +2,7 @@
  * @Author: tengmingxue 1473375109@qq.com
  * @Date: 2023-09-11 19:36:34
  * @LastEditors: tengmingxue 1473375109@qq.com
- * @LastEditTime: 2023-09-16 09:55:47
+ * @LastEditTime: 2023-09-19 18:37:16
  * @FilePath: \xld-gis-admin\src\api\resource\examine.ts
  * @Description: 流程配置信息api
  */
@@ -12,6 +12,7 @@ enum Api {
     SelectFlowInfo = '/base-center/flow/selectFlowInfo',   //查询流程信息
     SaveFlowInfo = '/base-center/flow/saveFlowInfo',        //新增、更新流程信息
     SaveFlowInfoAll = '/base-center/flow/insertFlowInfoAll', //新增流程、节点、节点人员信息
+    DelFLowInfo = '/base-center/flow/deleteFlowInfo',    //删除流程
 }
 
 /**
@@ -25,7 +26,41 @@ export const queryFlowInfo = (params) => {
     params['row'] = params?.pageSize ? params?.pageSize : 10
     return new Promise<void>((resolve) => {
         defHttp.post({ url: Api.SelectFlowInfo, params: params }).then((res) => {
+            const result = res.resp_code === 0 ? res.datas : []
+            result.forEach(item => {
+                item['status'] = true
+            });
+            resolve(result)
+        })
+    })
+};
+
+/**
+ * @description: 一次提交流程配置信息
+ * @param: flowInfo:流程信息              must
+ * @param: flowNode:流程步骤结点信息       must
+ * @param: flowNodePerson:流程审核人信息   must
+ * 
+ */
+export const addFlowInfoAll = (params) => {
+    return new Promise<void>((resolve) => {
+        defHttp.post({ url: Api.SaveFlowInfoAll, params }).then((res) => {
+            resolve(res)
+        })
+    })
+};
+
+
+/**
+ * @description: 批量删除流程信息
+ * @param:  ids:流程信息id       must
+ * 
+ */
+ export const delFlowInfo = (params) => {
+    const data = params.toString()
+    return new Promise<void>((resolve) => {
+        defHttp.post({ url: Api.DelFLowInfo, data }).then((res) => {
             resolve(res)
         })
     })
-};
+};

+ 24 - 0
src/utils/uuid.ts

@@ -1,3 +1,11 @@
+/*
+ * @Author: tengmingxue 1473375109@qq.com
+ * @Date: 2023-08-15 11:20:48
+ * @LastEditors: tengmingxue 1473375109@qq.com
+ * @LastEditTime: 2023-09-19 08:48:16
+ * @FilePath: \xld-gis-admin\src\utils\uuid.ts
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
 const hexList: string[] = [];
 for (let i = 0; i <= 15; i++) {
   hexList[i] = i.toString(16);
@@ -19,6 +27,22 @@ export function buildUUID(): string {
   return uuid.replace(/-/g, '');
 }
 
+export function getBuildUUID(): string {
+  let uuid = '';
+  for (let i = 1; i <= 36; i++) {
+    if (i === 9 || i === 14 || i === 19 || i === 24) {
+      uuid += '-';
+    } else if (i === 15) {
+      uuid += 4;
+    } else if (i === 20) {
+      uuid += hexList[(Math.random() * 4) | 8];
+    } else {
+      uuid += hexList[(Math.random() * 16) | 0];
+    }
+  }
+  return uuid;
+}
+
 let unique = 0;
 export function buildShortUUID(prefix = ''): string {
   const time = Date.now();

+ 167 - 22
src/views/dataAdmin/dataAdmin/configProcess/AddProcess.vue

@@ -49,7 +49,8 @@
                 style="height: 100%"
               >
                 <template #operation="{ record }">
-                  <a style="color: #2d74e7" @click="editStep(record)">编辑</a>
+                  <a style="color: #2d74e7" @click="editStep(record)" v-if="record.xh !== 1">编辑</a>
+                  <a style="color: #9b9c9e"  v-else>编辑</a>
                 </template>
               </a-table>
             </div>
@@ -85,6 +86,8 @@ import { BasicForm, useForm } from '/@/components/Form/index';
 import { accountFormSchema, accountFormSchema2, busType, stepColumns } from './configData';
 import { useMessage } from '/@/hooks/web/useMessage';
 import AddStepForm from './addStepForm.vue';
+import { getBuildUUID } from '/@/utils/uuid';
+import { addFlowInfoAll } from '/@/api/resource/examine';
 interface StepInfo {
   xh: number;
   name: string;
@@ -94,8 +97,28 @@ interface StepInfo {
 }
 interface FormState {
   type: string;
+  name: string;
   steps: StepInfo[];
 }
+interface FlowNode {
+  flowid: string; //流程id
+  id: string; //流程步骤id
+  nodename: string; //结点名称
+  prenodeid: string; //上一个结点id
+  nextnodeid: string; //下一个结点id
+  nodediscription: string; //结点描述
+  model: string; //审核模式
+  depts: string; //审核部门
+}
+
+interface FlowNodePerson {
+  flownodeid: string; //流程结点id
+  id: string; //审核id
+  userid: string; //审核人id
+  preuserid: string; //上一个审核人id
+  nextuserid: string; //下一个审核人id
+  nodetype: string; //结点类型
+}
 export default defineComponent({
   name: 'AccountModal',
   components: {
@@ -110,20 +133,22 @@ export default defineComponent({
     const isUpdate = ref(true);
     const rowId = ref('');
     const postData = ref(null);
-    const formState: UnwrapRef<FormState> = reactive({
+    const formState = reactive({
       type: '',
-      name:'',
+      name: '',
       steps: ref([{ xh: 1, name: '', model: 'update', dept: [], user: [] }]),
     });
+
     const rules = {
       type: [{ required: true, message: '请选择业务类型', trigger: 'change' }],
       steps: [{ required: true, message: '请配置审核步骤', trigger: 'change', type: 'array' }],
     };
     const dicBusiness = busType;
     const pColumns = stepColumns;
-    const currStep = ref(null);
+    const currStep = ref();
     const addStepForm = ref(null);
     const { createMessage } = useMessage();
+
     onMounted(async () => {
       //判断当前类型是否新增
     });
@@ -140,8 +165,8 @@ export default defineComponent({
       await resetFields();
       setModalProps({ confirmLoading: false });
       isUpdate.value = !!data?.isUpdate;
-      postData.value = data?.record ? data?.record : null;
       if (unref(isUpdate)) {
+        postData.value = data?.record ? data?.record : null;
         rowId.value = data.record.id;
         setFieldsValue(data.record);
       }
@@ -159,7 +184,7 @@ export default defineComponent({
       try {
         //校验当前界面是否数据完整
         const flag = await addStepForm.value.validateForm();
-        if(!flag){
+        if (!flag) {
           return createMessage.warning('请填写必填数据');
         }
         formRef.value
@@ -243,34 +268,153 @@ export default defineComponent({
       if (obj) formState.steps[0].name = obj.label;
       //console.log('业务类型改变',value,obj)
       currStep.value = formState.steps[0];
-      if (obj) formState.name = obj.label
+      if (obj) formState.name = obj.label;
     };
 
     /**
      * 新增流程
      */
-    const addProcess = (formData) => {
-      console.log('新增流程数据', formData);
-      closeModal();
-      emit('success');
-      createMessage.success(unref(isUpdate) ? '编辑成功' : '新增成功');
+    const addProcess = async (fdata) => {
+      const processInfo = formDataHandle(fdata) as any;
+      console.log('提交数据', processInfo, JSON.stringify(processInfo));
+      // const formData = new FormData();
+      // formData.append("flowInfo",processInfo.flowInfo)
+      // formData.append("flowNode",processInfo.flowNode);
+      // formData.append("flowNodePerson",processInfo.flowNodePerson);
+      const res = (await addFlowInfoAll(processInfo)) as any;
+      if (res && res.resp_code === 0) {
+        closeModal();
+        emit('success');
+        createMessage.success(unref(isUpdate) ? '编辑成功' : '新增成功');
+        //清理数据
+        clearFormData()
+      }
+      else{
+        createMessage.error('数据提交失败!失败原因:'+res.resp_msg)
+      }
+    };
+    /**
+     * 清空数据
+    */
+    const clearFormData = () => {
+      resetForm()
+      // formState = {
+      //   type: '',
+      //   name: '',
+      //   steps: [{ xh: 1, name: '', model: 'update', dept: [], user: [] }],
+      // };
+      formState.type = ''
+      formState.name = ''
+      formState.steps = [{ xh: 1, name: '', model: 'update', dept: [], user: [] }]
+      currStep.value = null;
+      (addStepForm.value as any)?.clearFormData()
     };
 
+    /**
+     * 生成提交的数据
+     */
     const formDataHandle = (formData) => {
+      //const uuid = buildUUID()
+      const flowId = getBuildUUID(); //生成流程id
       //流程数据
       let flowInfo = {
-        flowdiscription:'',
-        flowname:formData.name,
-      }
+        flowdiscription: '',
+        flowname: formData.name,
+        id: flowId,
+      };
+      console.log('流程信息', flowInfo);
+      //排除第一个
+      const steps = formData.steps.value.filter((step) => step.xh !== 1);
+      //生成步骤结点id
+      steps.forEach((item) => {
+        item['id'] = getBuildUUID();
+      });
+      console.log('新增步骤', steps);
       //流程结点数据
-      let flowNode = []
+      let flowNode: Array<FlowNode> = [];
       //审核人数据
-      let flowNodePerson = []
-      //不加入第一个结点
-      for(let i = 1; i < formData.steps.length; i++){
-        
+      let flowNodePerson: Array<FlowNodePerson> = [];
+      //生成流程结点数据
+      for (let i = 0; i < steps.length; i++) {
+        flowNode.push({
+          flowid: flowId,
+          id: steps[i].id,
+          nodename: steps[i].name, //结点名称
+          prenodeid: i === 0 ? '' : steps[i - 1].id, //上一个结点id
+          nextnodeid: i < steps.length - 1 ? steps[i + 1].id : '', //下一个结点id
+          nodediscription: steps[i].name, //结点描述
+          model: steps[i].model,
+          depts: steps[i].dept.toString(),
+        });
       }
-    }
+      //生成审核人id
+      steps.forEach((item) => {
+        item.userList.forEach((user) => {
+          user['id'] = getBuildUUID();
+        });
+      });
+      console.log('生成审核人id', steps);
+      //生成审核数据
+      for (let i = 0; i < steps.length; i++) {
+        const step = steps[i];
+        for (let j = 0; j < step.userList.length; j++) {
+          let preuserid = ''; //上一个审核人id
+          let nextuserid = ''; //下一个审核人id
+          //model 1:逐级   2:并行
+          //逐级审核获取前一个审核人和后一个审核人
+          if (step.model === '1') {
+            //步骤结点的第一个审核人
+            if (j === 0) {
+              ////第一个审核步骤,第一个审核人
+              // if (i === 0){
+              //   preuserid = '';   //此时第一个审核人没有上一个审核人
+              // }
+              // else {
+              //   //不是第一个审核步骤,不是第一个审核人,则选择上一个结点的最后一个审核人
+              //   const userList = steps[i - 1].userList;
+              //   preuserid = userList[userList.length - 1].userId;
+              // }
+              preuserid = '';
+            } else {
+              //步骤结点的非第一个审核人
+              preuserid = step.userList[j - 1].userId;
+            }
+            //步骤结点的最后一个审核人
+            if (j === step.userList.length - 1) {
+              //也是最后一个步骤结点
+              // if(i === (steps.length - 1)){
+              //   nextuserid = ''  //下一个审核人不存在
+              // }
+              // else{   //不是最后一个步骤结点
+              //   nextuserid = steps[i + 1].userList[0].userId  //下一个审核步骤结点的第一个审核人
+              // }
+              nextuserid = ''; //下一个审核人不存在
+            }
+            //不是步骤的最后一个审核人
+            else {
+              nextuserid = steps[i].userList[j + 1].userId; //下一个审核步骤结点的第一个审核人
+            }
+          }
+          //model 1:逐级   2:并行
+          //并行审核获取前一个审核人和后一个审核人
+          if (step.model === '2') {
+            preuserid = '';
+            nextuserid = '';
+          }
+
+          const user = step.userList[j];
+          flowNodePerson.push({
+            flownodeid: step.id, //流程结点id
+            id: user.id, //审核id
+            userid: user.userId, //审核人id
+            preuserid: preuserid, //上一个审核人id
+            nextuserid: nextuserid, //下一个审核人id
+            nodetype: step.model, //结点类型
+          });
+        }
+      }
+      return { flowInfo, flowNode, flowNodePerson };
+    };
 
     const resetForm = () => {
       formRef.value.resetFields();
@@ -312,7 +456,8 @@ export default defineComponent({
       reduceStep,
       businessChange,
       addProcess,
-      formDataHandle
+      formDataHandle,
+      clearFormData,
     };
   },
 });

+ 51 - 42
src/views/dataAdmin/dataAdmin/configProcess/addStepForm.vue

@@ -2,7 +2,7 @@
  * @Author: tengmingxue 1473375109@qq.com
  * @Date: 2023-08-29 16:44:32
  * @LastEditors: tengmingxue 1473375109@qq.com
- * @LastEditTime: 2023-09-17 19:16:57
+ * @LastEditTime: 2023-09-19 22:40:41
  * @FilePath: \xld-gis-admin\src\views\dataAdmin\dataAdmin\configProcess\addStepForm.vue
  * @Description: 流程步骤配置表单
 -->
@@ -39,7 +39,7 @@
       :labelCol="{ span: 4 }"
       :wrapper-col="{ span: 12 }"
     >
-      <a-input v-model:value="formState.name" @change="stepInfoChange" />
+      <a-input v-model:value="formState.name" @change="stepInfoChange" :disabled="formState.xh === 1" />
     </a-form-item>
     <a-form-item
       v-if="formState.xh !== 1"
@@ -62,16 +62,6 @@
       :labelCol="{ span: 4 }"
       :wrapper-col="{ span: 12 }"
     >
-      <!-- <a-select
-        v-model:value="formState.dept"
-        placeholder="请选择处理部门"
-        mode="multiple"
-        @change="stepInfoChange"
-        style="width: 100%"
-      >
-        <a-select-option value="1">部门1</a-select-option>
-        <a-select-option value="2">部门2</a-select-option>
-      </a-select> -->
       <a-tree-select
         show-search
         style="width: 100%"
@@ -113,7 +103,7 @@
     <a-table
       v-if="formState.user.length > 0"
       bordered
-      :data-source="userList"
+      :data-source="formState.userList"
       :columns="columns"
       :pagination="false"
       style="height: 100%"
@@ -126,7 +116,7 @@
           >上移</a
         >
         <a
-          v-if="record.xh < userList.length"
+          v-if="record.xh < formState.userList.length"
           style="color: #2d74e7; margin: 10px"
           @click="moveClick(1, record)"
           >下移</a
@@ -152,6 +142,7 @@ interface FormState {
   model: string;
   dept: string[];
   user: string[];
+  userList: object[];
 }
 export default defineComponent({
   name: 'AddStepForm',
@@ -193,12 +184,13 @@ export default defineComponent({
     ]);
 
     const userList = ref([]);
-    const formState: UnwrapRef<FormState> = reactive({
+    let formState = ref({
       xh: 1,
       name: '',
       model: '1',
       dept: [],
       user: [],
+      userList: [],
     });
     const rules = {
       name: [{ required: true, message: '请填写步骤名称', trigger: 'blur' }],
@@ -214,23 +206,24 @@ export default defineComponent({
       () => props.currStep,
       (obj) => {
         currStep.value = obj;
-        formState.xh = currStep.value?.xh;
-        formState.name = currStep.value?.name;
-        formState.model = currStep.value?.model;
-        formState.dept = currStep.value?.dept;
-        formState.user = currStep.value?.user;
+        formState.value.xh = currStep.value?.xh ? currStep.value?.xh : 1;
+        formState.value.name = currStep.value?.name ? currStep.value?.name : '';
+        formState.value.model = currStep.value?.model ? currStep.value?.model : '1';
+        formState.value.dept = currStep.value?.dept ? currStep.value?.dept : [];
+        formState.value.user = currStep.value?.user ? currStep.value?.user : [];
       }
     );
 
     watch(
-      () => formState.user,
+      () => formState.value.user,
       (list) => {
-        userList.value = [];
+        formState.value.userList = [];
+        if(!list || list.length < 1) return;
         list.map((item, index) => {
           const obj = handlers.value.find((user) => user.userId === item);
           if (obj) {
             obj['xh'] = index + 1;
-            userList.value.push(obj);
+            formState.value.userList.push(obj);
           }
         });
       }
@@ -240,7 +233,7 @@ export default defineComponent({
      * 信息内容改变
      */
     const stepInfoChange = () => {
-      emit('editStep', formState);
+      emit('editStep', formState.value);
     };
 
     const stepEdit = (flag) => {
@@ -248,15 +241,15 @@ export default defineComponent({
         formRef.value
           .validate()
           .then(() => {
-            console.log('values', formState, toRaw(formState));
+            console.log('values', formState.value, toRaw(formState.value));
             //校验通过
-            formState.xh = formState.xh + 1;
-            formState.name = '';
-            formState.model = '1';
-            formState.dept = [];
-            formState.user = [];
+            formState.value.xh = formState.value.xh + 1;
+            formState.value.name = '';
+            formState.value.model = '1';
+            formState.value.dept = [];
+            formState.value.user = [];
             const stepInfo = cloneDeep({
-              xh: formState.xh,
+              xh: formState.value.xh,
               name: '',
               model: '',
               dept: [],
@@ -270,7 +263,7 @@ export default defineComponent({
       }
       if (flag === -1) {
         //删除当前数据
-        emit('reduceStep', cloneDeep(formState));
+        emit('reduceStep', cloneDeep(formState.value));
       }
     };
 
@@ -296,15 +289,15 @@ export default defineComponent({
      */
     const moveClick = (flag, row) => {
       //1、修改顺序
-      const obj = userList.value.find((item) => item.xh === row.xh);
-      const index = userList.value.indexOf(obj);
+      const obj = formState.value.userList.find((item) => item.xh === row.xh);
+      const index = formState.value.userList.indexOf(obj);
       if (index < 0) return;
-      const temp = cloneDeep(userList.value[index]);
+      const temp = cloneDeep(formState.value.userList[index]);
       const increment = flag;
-      userList.value[index] = cloneDeep(userList.value[index + increment]);
-      userList.value[index + increment] = cloneDeep(temp);
+      formState.value.userList[index] = cloneDeep(formState.value.userList[index + increment]);
+      formState.value.userList[index + increment] = cloneDeep(temp);
       //2、重新生成序号
-      userList.value.forEach((item, index) => {
+      formState.value.userList.forEach((item, index) => {
         item['xh'] = index + 1;
       });
     };
@@ -322,10 +315,10 @@ export default defineComponent({
       const formData = new FormData();
       formData.append('depId', nodeIds.toString());
       const res = await queryPersonByDepId(formData);
-      if(res && res.resp_code === 0){
+      if (res && res.resp_code === 0) {
         //过滤userId不存在的
-        handlers.value =  res?.datas ? res?.datas : []
-        handlers.value = handlers.value.filter(user=>user.userId != null)
+        handlers.value = res?.datas ? res?.datas : [];
+        handlers.value = handlers.value.filter((user) => user.userId != null);
       }
     };
 
@@ -333,7 +326,7 @@ export default defineComponent({
       //console.log('选择部门',nodeIds,nodeNames,nodes)
       if (nodeIds.length > 0) queryUsers(nodeIds);
       else {
-        handlers.value = []
+        handlers.value = [];
       }
     };
 
@@ -348,6 +341,21 @@ export default defineComponent({
       }));
     };
 
+    /**
+     * 清理数据
+     */
+    const clearFormData = () => {
+      formState.value = {
+        xh: 1,
+        name: '',
+        model: '1',
+        dept: [],
+        user: [],
+        userList: [],
+      };
+      formRef.value.resetFields();
+    };
+
     onMounted(async () => {
       queryDept();
     });
@@ -371,6 +379,7 @@ export default defineComponent({
       queryUsers,
       dealData,
       treeSelectChange,
+      clearFormData,
     };
   },
 });

+ 4 - 4
src/views/dataAdmin/dataAdmin/configProcess/configData.js

@@ -2,7 +2,7 @@
  * @Author: tengmingxue 1473375109@qq.com
  * @Date: 2023-08-28 21:12:52
  * @LastEditors: tengmingxue 1473375109@qq.com
- * @LastEditTime: 2023-09-16 15:00:15
+ * @LastEditTime: 2023-09-19 16:14:21
  * @FilePath: \xld-gis-admin\src\views\dataAdmin\dataAdmin\configProcess\configData.js
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -11,7 +11,7 @@
 export const columns = [
   {
     title: '流程业务',
-    dataIndex: 'serviceid',
+    dataIndex: 'flowname',
   },
   {
     title: '启用状态',
@@ -20,11 +20,11 @@ export const columns = [
   },
   {
     title: '维护人',
-    dataIndex: 'typename',
+    dataIndex: 'createuser',
   },
   {
     title: '维护时间',
-    dataIndex: 'publisher',
+    dataIndex: 'createtime',
     slots: { customRender: 'pdate' },
   }
 ];

+ 5 - 10
src/views/dataAdmin/dataAdmin/configProcess/index.vue

@@ -48,11 +48,11 @@
           ]"
         />
       </template>
-      <template #pdate="{ record }">
+      <!-- <template #pdate="{ record }">
         <Tag :color="'red'">
           {{ record.publishdate ? moment(record.publishdate).format('YYYY-MM-DD HH:mm:ss') : '' }}
         </Tag>
-      </template>
+      </template> -->
       <template #status="{ record }">
         <a-switch
           checked-children="启用"
@@ -80,7 +80,7 @@ import { list } from '/@/api/resource/files';
 import { useBatchDelete } from '/@/hooks/web/useBatchDelete';
 import AddProcess from './AddProcess.vue';
 import Moment from 'moment';
-import { queryFlowInfo } from '/@/api/resource/examine'
+import { queryFlowInfo,delFlowInfo } from '/@/api/resource/examine'
 
 export default defineComponent({
   name: 'configProcess',
@@ -131,16 +131,11 @@ export default defineComponent({
         page: 1,
         pageSize:20,
       },
-      tableSetting: {
-        redo: true,
-        size: true,
-        setting: false,
-        fullScreen: false
-      },
     });
     //
     const { hasBatchDelete, handleDeleteOrBatchDelete, selectionOptions, resetSelectedRowKeys } =
-      useBatchDelete(delFileResource, handleSuccess, setProps);
+      //useBatchDelete(delFileResource, handleSuccess, setProps);
+      useBatchDelete(delFlowInfo, handleSuccess, setProps);
     //
     selectionOptions.rowSelection.getCheckboxProps = (record) => {
       // Demo:status为1的选择框禁用 控制选择框勾选状态