Просмотр исходного кода

feat(合同评审): 新增合同评审模块及相关功能

liujt 9 месяцев назад
Родитель
Сommit
44b76e80ca

+ 86 - 0
src/api/bpm/model.js

@@ -0,0 +1,86 @@
+import request from '@/utils/request'
+
+export async function getModelPage(query) {
+  const res = await request({
+    url: '/bpm/model/page',
+    method: 'get',
+    params: query
+  })
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+export async function getModel(id) {
+  const res = await request({
+    url: '/bpm/model/get?id=' + id,
+    method: 'get'
+  })
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+export async function updateModel(data) {
+  const res = await request({
+    url: '/bpm/model/update',
+    method: 'PUT',
+    data: data
+  })
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+// 任务状态修改
+export async function updateModelState(id, state) {
+  const res = await request({
+    url: '/bpm/model/update-state',
+    method: 'put',
+    data: {
+      id,
+      state
+    }
+  })
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+export async function createModel(data) {
+  const res = await request({
+    url: '/bpm/model/create',
+    method: 'POST',
+    data: data
+  })
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+export async function deleteModel(id) {
+  const res = await request({
+    url: '/bpm/model/delete?id=' + id,
+    method: 'DELETE'
+  })
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+export async function deployModel(id) {
+  const res = await request({
+    url: '/bpm/model/deploy?id=' + id,
+    method: 'POST'
+  })
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}

+ 12 - 0
src/api/main/index.js

@@ -78,3 +78,15 @@ export async function getProduceTreeByCode(code) {
   }
   return Promise.reject(new Error(res.data.message));
 }
+
+//h获取部门用户
+export async function getGroupUserTree(params) {
+  const res = await request.get(
+    `/main/group/getGroupUserTree`,
+    params
+  );
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}

+ 697 - 0
src/views/contractManage/contractReview/components/addDialog.vue

@@ -0,0 +1,697 @@
+<template>
+  <ele-modal
+    custom-class="ele-dialog-form long-dialog-form"
+    :centered="true"
+    :visible="addFlag"
+    :title="title"
+    append-to-body
+    :close-on-click-modal="false"
+    width="1100px"
+    :before-close="cancel"
+    :maxable="true"
+    :resizable="true"
+  >
+    <div style="height: 100%;">
+      <div>
+        <el-form
+          class="ele-form-search"
+        >
+          <el-row
+            :gutter="15"
+            style="display: flex; align-items: center"
+          >
+            <el-col v-bind="{ span: 10 }">
+              <el-form-item label="单据:" label-width="60px">
+                <el-select v-model="formId"
+                    @change="init"
+                >
+                  <el-option
+                    v-for="(item, index) in list"
+                    :key="index"
+                    :value="item.id"
+                    :label="item.name"
+                  ></el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-form>
+      </div>
+      <div class="form-box">
+        <fm-generate-form
+          :preview="true"
+          class="el-form-box"
+          v-if="Object.keys(form?.formJson || {}).length !== 0"
+          :data="jsonData"
+          :value="form.valueJson"
+          ref="generateForm"
+        >
+          <!-- 客户名称 -->
+          <template v-slot:eom_contact="scope">
+            <div class="eom_contact">
+              <el-input
+                  v-model="scope.model.eom_contact.name"
+                  style="width: 100%"
+                  @click.native="addContact('eom_contact')"
+                ></el-input>
+            </div>
+          </template>
+        </fm-generate-form>
+      </div>
+    </div>
+
+    <div slot="footer">
+      <el-form :model="form">
+        <el-form-item label="通知人:">
+          <el-button
+            style="float: left; margin-top: 5px"
+            icon="el-icon-circle-plus-outline"
+            round
+            @click="handleEditDataScope"
+          ></el-button>
+          <div style="display: flex; flex-direction: row; flex-wrap: wrap">
+            <el-tag
+              style="float: left; margin: 5px 5px 0 5px"
+              v-for="(item, index) in form.noticeScope"
+              :key="item.name"
+              effect="plain"
+              closable
+              :title="item.name"
+              @close="handleCloseTag(index)"
+            >
+              {{
+                item.name.length > 3
+                  ? item.name[0] + item.name[1] + item.name[2] + '...'
+                  : item.name
+              }}
+            </el-tag>
+          </div>
+        </el-form-item>
+      </el-form>
+      <el-button type="primary" size="small" @click="submit">提交</el-button>
+      <el-button size="small" @click="cancel">关闭</el-button>
+      <staffSelection
+        ref="staffSelection"
+        @confirm="getTreeList"
+      ></staffSelection>
+    </div>
+    <parentList
+      ref="parentRef"
+      @changeParent="handleConcatConfirm"
+    ></parentList>
+  </ele-modal>
+</template>
+<script>
+  import {
+    getModelPage,
+    getProcessDefinitionBpmnXML,
+    getTaskAssignRuleList,
+    listAllUserBind,
+    listSimpleUserGroups,
+    processInstanceCreateAPI
+  } from './api';
+  import { treeClassifyCodeEnum } from '@/enum/dict';
+  import { listRoles } from '@/api/system/role';
+  import { listOrganizations } from '@/api/system/organization';
+  import dictMixins from '@/mixins/dictMixins';
+  import { getByCode } from '@/api/system/dictionary-data';
+  import { getGroupUserTree, getProduceTreeByCode } from '@/api/main';
+  import { getModel } from '@/api/bpm/model';
+  import { getToken } from '@/utils/token-util';
+  import { mapGetters } from 'vuex';
+  import staffSelection from '@/components/staffSelection/staffSelection.vue';
+  import { topLevel1, topLevel2, topLevel3 } from '@/enum/dict';
+  import dayjs from 'dayjs';
+  import parentList from '@/views/saleManage/contact/components/parentList.vue';
+  export default {
+    name: 'processSubmitDialog',
+    components: { staffSelection, parentList },
+    mixins: [dictMixins],
+    props: {
+      addFlag: {
+        type: Boolean,
+        default: false
+      },
+      list: {
+        type: Array,
+        default: () => []
+      },
+    },
+    watch: {
+      filterText(val) {
+        this.$refs.tree.filter(val);
+      }
+    },
+    data() {
+      return {
+        isRight: false,
+        jsonData: {},
+        form: {
+          LCFL: '',
+          FQLC: '',
+          processDefinitionId: '',
+          name: '',
+          businessId: '',
+          noticeScope: [],
+          formJson: {},
+          valueJson: {},
+          businessKey: ''
+        },
+        formId: '',
+        title: '',
+        active: 0,
+        bpmnXML: null,
+        filterText: null,
+        treeList: [],
+        treeData: [],
+        defaultProps: {
+          children: 'children',
+          label: 'name'
+        },
+        LCFLList: [],
+        processList: [],
+        datasource: [],
+        roleOptions: [],
+        deptOptions: [],
+        deptTreeOptions: [],
+        postOptions: [],
+        userOptions: [],
+        userGroupOptions: [],
+        dictList: {},
+        rules: {},
+        editForm: {
+          start: '',
+          end: '',
+          days: ''
+        },
+        componentRef: ['blank_business_component', 'blank_use_seal', 'blank_use_qualification', 'blank_product_specification', 'blank_event_component', 'blank_reissue_component'],
+
+      };
+    },
+    computed: {
+      ...mapGetters(['user']),
+      modelWidth() {
+        let width = this.jsonData.config?.platform && this.jsonData.config.platform === 'pc' ? 1100 : 450;
+        if(this.isRight) {
+          return width + 350 + 'px'
+        } else {
+          return width + 'px'
+        }
+      }
+    },
+    async created() {
+      let typeObj = await getProduceTreeByCode(
+        treeClassifyCodeEnum['PROCESSTYPE']
+      );
+      //  await this.getTreeData();
+      this.LCFLList = typeObj[0].children;
+
+      // 获得角色列表
+      this.roleOptions = [];
+      listRoles({
+        current: 1,
+        size: 9999
+      }).then((data) => {
+        this.roleOptions.push(...data.list);
+      });
+      // 获得部门列表
+      this.deptOptions = [];
+      this.deptTreeOptions = [];
+      listOrganizations().then((data) => {
+        this.deptOptions.push(...data);
+        this.deptTreeOptions.push(...this.handleTree(data, 'id'));
+      });
+      // 获得岗位列表 暂无岗位概念
+      this.postOptions = [];
+      /*listSimplePosts().then(response => {
+this.postOptions.push(...response.data);
+});*/
+      // 获得用户列表
+      this.userOptions = [];
+      listAllUserBind().then((data) => {
+        this.userOptions.push(...data);
+      });
+      // 获得用户组列表
+      this.userGroupOptions = [];
+      listSimpleUserGroups().then((response) => {
+        this.userGroupOptions.push(...response);
+      });
+
+      //this.dictEnum['工作流任务分配自定义脚本']
+      await this.getDictList(this.dictEnum['工作流任务分配自定义脚本']);
+      await this.getDictList(this.dictEnum['工种类型']);
+    },
+    mounted() {
+      //this.isRight = false
+    },
+    methods: {
+      async addNewRow(key) {
+        console.log(key);
+        let data = await this.$refs.generateForm.getData(false);
+        data[key].push({
+          price: '',
+          remark: ''
+        });
+        this.$refs.generateForm.setData({
+          key: data[key]
+        });
+      },
+      async delNewRow(key, index) {
+        let data = await this.$refs.generateForm.getData(false);
+        data[key] = data[key].filter((item, index1) => index1 != index);
+        this.$refs.generateForm.setData({
+          [key]: data[key]
+        });
+        this.changePrice(data[key]);
+      },
+      changePrice(data) {
+        let num = 0;
+        data.forEach((item) => {
+          num += Number(item.price);
+        });
+        this.$refs.generateForm.setData({
+          input_jd9ouzyh: num
+        });
+      },
+
+      // 获取组件的中文名称,用于错误提示
+      getComponentName(componentKey) {
+        const nameMap = {
+          'blank_business_component': '差旅交通',
+          'blank_use_seal': '印章使用',
+          'blank_use_qualification': '资质使用',
+          'blank_product_specification': '产品规格',
+          'blank_event_component': '事件',
+          'blank_reissue_component': '补发信息'
+        }
+        return nameMap[componentKey] || componentKey;
+      },
+      
+      async addContact(type) {
+        console.log(type);
+        let data = await this.$refs.generateForm.getData(false);
+        console.log('data', data);
+        data[type] = {
+          id: '',
+          name: ''
+        };
+        this.$refs.generateForm.setData({
+          type: data[type]
+        });
+        let item = {
+          id: data[type].id
+        };
+        this.$refs.parentRef.open(item);
+      },
+
+      async handleConcatConfirm(item) {
+        console.log('选择的客户', item);
+
+        let data = await this.$refs.generateForm.getData(false);
+        data['eom_contact'] = {
+          id: item.id,
+          name: item.name
+        }
+        this.$refs.generateForm.setData({
+          'eom_contact': data['eom_contact']
+        });
+        console.log('data~~~~', data);
+      },
+      async init(id) {
+        const row = this.list.find(item => item.id === id) || {};
+        console.log('row', row);
+        this.title = row.name; //'新建' + row.name + '单';
+        this.form = _.cloneDeep(row);
+        this.form.formId = row.id;
+        this.$set(this.form, 'noticeScope', []);
+        this.$set(this.form, 'LCFL', '');
+        this.$set(this.form, 'FQLC', '');
+        this.$set(this.form, 'name', '');
+        this.$set(this.form, 'key', '');
+        this.$set(this.form, 'valueJson', {});
+        this.jsonData = JSON.parse(this.form.formJson.makingJson);
+        console.log('jsonData', this.jsonData);
+
+        this.jsonData.config.dataSource &&
+          this.jsonData.config.dataSource.forEach((item) => {
+            item.headers = {
+              Authorization: getToken()
+            };
+            // item.url = item.url && item.url.replace('/api', this.APIUrl);
+          });
+        this.jsonData.list.forEach((item) => {
+          if (item.type == 'deptAndUserCascader') {
+          }
+          if (item.type == 'deptCascader') {
+            if (item.options.isDefaultLoginUser) {
+              this.form.valueJson[item.model] = this.user.info.groupIdList;
+            }
+          }
+          if (item.type == 'userSelect') {
+            if (item.options.isDefaultLoginUser) {
+              this.form.valueJson[item.model] = this.user.info.userId;
+            }
+          }
+          if (item.type == 'imgupload') {
+            // this.form.valueJson[item.model].length &&
+            //   this.form.valueJson[item.model].forEach((item) => {
+            //     //item.objectUrl = this.APIUrl +'/kd-aiot' + item.storePath
+            //     // item.objectUrl = item.url;
+            //     // console.log(item);
+            //   });
+          }
+        });
+        await this.getProcessDefinitionBpmnXMLInfo(this.form.processModelId);
+        await this.getTaskAssignRuleListInfo({
+          modelId: this.form.processModelId,
+          processDefinitionId: this.form.processDefinitionId
+        });
+        await this.getDefaultInfo(row.processModelId);
+      },
+      async getDefaultInfo(businessKey) {
+        let info = await getModel(businessKey);
+        this.form.LCFL = info?.category;
+        this.form.FQLC = info?.id;
+        this.form.name = this.title;
+        this.form.key = info?.key;
+        if (this.form.LCFL) await this.getProcessList(this.form.LCFL);
+      },
+      async getProcessList(val) {
+        let params = {
+          pageNo: 1,
+          pageSize: 999,
+          processTypeId: val
+        };
+        const { list } = await getModelPage(params);
+        this.processList = list.filter((item) => item.processDefinition);
+      },
+      async getProcessDefinitionBpmnXML(val) {
+        this.bpmnXML = await getProcessDefinitionBpmnXML(val);
+      },
+      async getProcessDefinitionBpmnXMLInfo(val) {
+        // 加载流程图
+        let res = await getModel(val);
+        this.bpmnXML = res.bpmnXml;
+      },
+      async getTaskAssignRuleListInfo(find) {
+        this.datasource = await getTaskAssignRuleList({
+          modelId: find.modelId,
+          processDefinitionId: find.processDefinitionId
+        });
+      },
+      handleEditDataScope() {
+        this.$refs.staffSelection.open(this.form.noticeScope);
+      },
+      getTreeList(list) {
+        list.forEach((item) => {
+          item.type = 1;
+        });
+        this.form.noticeScope = list;
+      },
+      handleCloseTag(index) {
+        this.form.noticeScope.splice(index, 1);
+      },
+      getAssignRuleOptionName(row, option) {
+        if (row.type == 10) {
+          for (const roleOption of this.roleOptions) {
+            if (roleOption.id === option) {
+              return roleOption.name;
+            }
+          }
+        } else if (row.type === 20 || row.type === 21) {
+          for (const deptOption of this.deptOptions) {
+            if (deptOption.id === option) {
+              return deptOption.name;
+            }
+          }
+        } else if (row.type === 22) {
+          option = option + ''; // 转换成 string
+          return this.getDictV(this.dictEnum['工种类型'], option);
+        } else if (row.type === 30 || row.type === 31 || row.type === 32) {
+          for (const userOption of this.userOptions) {
+            if (userOption.id === option) {
+              return userOption.nickname || userOption.name;
+            }
+          }
+        } else if (row.type === 40) {
+          for (const userGroupOption of this.userGroupOptions) {
+            if (userGroupOption.id === option) {
+              return userGroupOption.name;
+            }
+          }
+        } else if (row.type === 50) {
+          option = option + ''; // 转换成 string
+          return this.getDictV(
+            this.dictEnum['工作流任务分配自定义脚本'],
+            option
+          );
+        } else if (row.type === 60) {
+          return row.variableName;
+        } else if (row.type === 70) {
+          let data = JSON.parse(row.variableName);
+          if (data.direction == 1) {
+            return topLevel2.find((item) => item.value == data.topLevel)?.label;
+          } else {
+            return topLevel1.find((item) => item.value == data.topLevel)?.label;
+          }
+        } else if (row.type === 80) {
+          let data = JSON.parse(row.variableName);
+          return topLevel3.find((item) => item.value == data.topLevel)?.label;
+        }
+        return '未知(' + option + ')';
+      },
+      async getTreeData() {
+        this.treeData = await getGroupUserTree();
+      },
+      filterNode(value, data) {
+        if (!value) return true;
+        return data.name.indexOf(value) !== -1;
+      },
+      /**
+       * 构造树型结构数据
+       * @param {*} data 数据源
+       * @param {*} id id字段 默认 'id'
+       * @param {*} parentId 父节点字段 默认 'parentId'
+       * @param {*} children 孩子节点字段 默认 'children'
+       * @param {*} rootId 根Id 默认 0
+       */
+      handleTree(data, id, parentId, children, rootId) {
+        id = id || 'id';
+        parentId = parentId || 'parentId';
+        children = children || 'children';
+        rootId =
+          rootId ||
+          Math.min.apply(
+            Math,
+            data.map((item) => {
+              return item[parentId];
+            })
+          ) ||
+          0;
+        //对源数据深度克隆
+        const cloneData = JSON.parse(JSON.stringify(data));
+        //循环所有项
+        const treeData = cloneData.filter((father) => {
+          let branchArr = cloneData.filter((child) => {
+            //返回每一项的子级数组
+            return father[id] == child[parentId];
+          });
+          branchArr.length > 0 ? (father.children = branchArr) : '';
+          //返回第一层
+          return father[parentId] == rootId;
+        });
+        return treeData !== '' ? treeData : data;
+      },
+      getDictV(code, val) {
+        if (!this.dictList[code]) return '';
+        return this.dictList[code].find((item) => item.value == val)?.label;
+      },
+      async getDictList(code) {
+        let { data: res } = await getByCode(code);
+        this.dictList[code] = res.map((item) => {
+          let values = Object.keys(item);
+          return {
+            value: values[0],
+            label: item[values[0]]
+          };
+        });
+      },
+      generateFormValid(validate = true) {
+        return this.$refs.generateForm.getData(validate).then((data) => {
+          return data;
+        });
+      },
+      handleTreeChange() {
+        this.$nextTick(() => {
+          this.form.noticeScope =
+            this.$refs.treeSelect.$refs.tree.getCheckedNodes();
+          console.log(this.form.noticeScope);
+        });
+      },
+      async changeLCFL(val) {
+        this.bpmnXML = null;
+        this.form.processDefinitionId = null;
+        this.form.FQLC = null;
+        await this.getProcessList(val);
+      },
+      async changeFQLC(val) {
+        if (!val) return;
+        let find = this.processList.find((item) => item.id === val) || {};
+        this.form.name = find.name;
+        this.form.key = find.key;
+        this.form.processDefinitionId = find.processDefinition.id;
+        this.form.processModelId = val;
+        await this.getProcessDefinitionBpmnXML(find.processDefinition.id);
+        await this.getTaskAssignRuleListInfo({
+          modelId: find.id,
+          processDefinitionId: find.processDefinition.id
+        });
+      },
+      async submit() {
+        // console.log('this.form~~~', this.$refs.businessComponentRef.form);
+        
+        // const businessComponentForm = this.$refs.businessComponentRef.form;
+        let data = await this.$refs.generateForm.getData(false);
+        // data['blank_business_component'] = businessComponentForm.blank_business_component;
+        // this.$refs.generateForm.setData({
+        //   'blank_business_component': data['blank_business_component']
+        // });
+        // 获取所有组件的引用
+        let validArr = []
+        // 过滤出存在于componentRef中的键
+        Object.keys(data).forEach((key) => {
+          if (this.componentRef.includes(key)) {
+            validArr.push(key)
+          }
+        })
+        
+        // 检查每个组件的数据是否为空数组
+        let emptyComponents = []
+        validArr.forEach(item => {
+          // 检查data[item]是否存在且为数组,并且长度为0
+          if (Array.isArray(data[item]) && data[item].length === 0) {
+            emptyComponents.push(item)
+          }
+        })
+        
+        // 如果有未填写的组件,显示提示信息
+        if (emptyComponents.length > 0) {
+          // this.$message.warning(`请填写完整信息:${emptyComponents.map(comp => this.getComponentName(comp)).join('、')}`);
+          this.$message.warning(`请填写完整信息`);
+          return false;
+        }
+        
+        // 使用Promise.all并行校验所有组件
+        // try {
+        //   await Promise.all(validArr.map(key => {
+        //     if (this.$refs[key] && typeof this.$refs[key].validateForm === 'function') {
+        //       return this.$refs[key].validateForm();
+        //     }
+        //     return Promise.resolve(true); // 如果组件不存在或没有validateForm方法,默认通过
+        //   }));
+        //   console.log('所有组件校验通过');
+        // } catch (error) {
+        //   console.error('表单校验失败:', error);
+        //   this.$message.error('表单校验失败,请检查必填项');
+        //   return false; // 任一组件校验失败则整体失败
+        // }
+        // console.log('data~~~~', data);
+        this.form.valueJson = await this.generateFormValid()
+        this.form.processType = '1';
+        console.log('formformformform', this.form);
+        await processInstanceCreateAPI({
+          ...this.form,
+          variables: { ...this.form.valueJson }
+        });
+        this.$message('提交审核成功');
+        this.$emit('reload');
+        this.cancel();
+      },
+      cancel() {
+        this.$emit('update:addFlag', false);
+      },
+      getDays(start, end) {
+        const startDay = dayjs(start);
+        const endDay = dayjs(end);
+        const diffInMilliseconds = endDay.diff(startDay);
+
+        // 计算天数
+        const days = Math.floor(diffInMilliseconds / (1000 * 60 * 60 * 24));
+        // 计算剩余小时数
+        const hours = Math.floor(
+          (diffInMilliseconds % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)
+        );
+        // 计算剩余分钟数
+        const minutes = Math.floor(
+          (diffInMilliseconds % (1000 * 60 * 60)) / (1000 * 60)
+        );
+        // 计算剩余秒数
+        const seconds = Math.floor((diffInMilliseconds % (1000 * 60)) / 1000);
+
+        let result = '';
+        if (days > 0) result += `${days} 天 `;
+        if (hours > 0) result += `${hours} 小时 `;
+        if (minutes > 0) result += `${minutes} 分钟 `;
+        if (seconds > 0) result += `${seconds} 秒`;
+        return result.trim();
+      }
+    }
+  };
+</script>
+<style scoped lang="scss">
+  .box {
+    display: flex;
+    height: 450px;
+
+    .left-box {
+      width: 55%;
+      border-right: 1px solid #e2e4e7;
+      padding-right: 15px;
+      height: 100%;
+
+      .el-tree {
+        height: 85%;
+        overflow-y: auto;
+      }
+    }
+
+    .right-box {
+      flex: 1;
+      padding-left: 20px;
+      height: 100%;
+
+      .right-box-item {
+        margin-top: 5px;
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+      }
+    }
+  }
+
+  .form-box {
+    // max-height: 500px;
+    min-width: 400px;
+    overflow: auto;
+    background: #4298fd0d;
+  }
+  ::v-deep .el-dialog {
+    min-width: 400px;
+    .el-dialog__header {
+      background: #1890ffd6;
+    }
+    .el-dialog__title,
+    .el-dialog__close {
+      color: #ffffff;
+    }
+  }
+  .blank_adopzrdd {
+    display: flex;
+    align-items: center;
+    > span {
+      display: inline-block;
+      width: 80px;
+    }
+    margin-bottom: 10px;
+  }
+</style>

+ 89 - 0
src/views/contractManage/contractReview/components/api.js

@@ -0,0 +1,89 @@
+import request from '@/utils/request';
+
+export async function getProcessDefinitionBpmnXML(id) {
+  const res = await request({
+    url: '/bpm/process-definition/get-bpmn-xml?id=' + id,
+    method: 'get'
+  });
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+export async function getTaskAssignRuleList(query) {
+  const res = await request({
+    url: '/bpm/task-assign-rule/list',
+    method: 'get',
+    params: query
+  });
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+export async function processInstanceCreateAPI(data) {
+  const res = await request(
+    {
+      url: '/bpm/process-instance/create',
+      method: 'post',
+      data
+    },
+    data
+  );
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+export async function getModelPage(query) {
+  const res = await request({
+    url: '/bpm/model/page',
+    method: 'get',
+    params: query
+  });
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+export async function getProcessDefinitionInfo(params) {
+  const res = await request({
+    url: `/bpm/process-definition/get`,
+    method: 'get',
+    params
+  });
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+export async function listAllUserBind() {
+  const res = await request.get('/main/user/listAllUserBind');
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+// 获取用户组精简信息列表
+export async function listSimpleUserGroups() {
+  const res = await request({
+    url: '/bpm/user-group/list-all-simple',
+    method: 'get'
+  });
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+/**
+ * 获取客户信息列表
+ */
+export async function contactPageUsages(params) {
+  const res = await request.get(`/eom/contact/page2Usages`, { params });
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+

+ 228 - 482
src/views/contractManage/contractReview/index.vue

@@ -1,255 +1,241 @@
 <template>
   <div class="ele-body">
-    <el-card shadow="never">
-        <div>
-            <seekPage :seekList="seekList" :formLength="3" @search="search"></seekPage>
-        </div>
-        <ele-pro-table
-            ref="table"
-            height="calc(100vh - 325px)"
-            full-height="calc(100vh - 116px)"
-            :columns="columns"
-            :datasource="datasource"
-            :init-load="false"
-            @columns-change="handleColumnChange"
-            :cache-key="cacheKeyUrl"
-            :page-size="20"
+    <el-card
+      shadow="never"
+    >
+      <div class="filter-container">
+        <el-form
+          class="ele-form-search"
+          @keyup.enter.native="reload"
+          @submit.native.prevent
         >
-            <template v-slot:toolbar="{ row }">
-                <div class="filter-container">
-                    <el-button type="primary">新建</el-button>
-                <!--     <el-form
-                    class="ele-form-search"
-                    @keyup.enter.native="reload"
-                    @submit.native.prevent
-                    >
-                    <el-row
-                        :gutter="15"
-                        style="display: flex; align-items: center"
-                    >
-                        <el-col v-bind="{ span: 4 }">
-                        <el-form-item label="分类:" label-width="60px">
-                            <el-select v-model="params.dictType">
-                            <el-option
-                                v-for="(item, index) in dictList[
-                                'collaborative_type'
-                                ]"
-                                :key="index"
-                                :value="item.value"
-                                :label="item.label"
-                            ></el-option>
-                            </el-select>
-                        </el-form-item>
-                        </el-col>
-                        <el-col v-bind="{ span: 4 }">
-                        <el-form-item label="单据:" label-width="60px">
-                            <el-select v-model="params.formId">
-                            <el-option
-                                v-for="(item, index) in templateList[
-                                params.dictType
-                                ]"
-                                :key="index"
-                                :value="item.id"
-                                :label="item.name"
-                            ></el-option>
-                            </el-select>
-                        </el-form-item>
-                        </el-col>
-                        <el-col v-bind="{ span: 4 }">
-                        <el-form-item
-                            label="结果:"
-                            prop="result"
-                            label-width="60px"
-                        >
-                            <DictSelection
-                            dictName="流程实例的结果"
-                            clearable
-                            v-model="params.result"
-                            >
-                            </DictSelection>
-                        </el-form-item>
-                        </el-col>
-                        <el-col v-bind="{ span: 10 }">
-                        <el-form-item
-                            label="创建时间:"
-                            prop="createTime1"
-                            label-width="90px"
-                        >
-                            <el-date-picker
-                            v-model="createTime1"
-                            style="width: 100%"
-                            value-format="yyyy-MM-dd HH:mm:ss"
-                            type="daterange"
-                            range-separator="-"
-                            start-placeholder="开始日期"
-                            end-placeholder="结束日期"
-                            :default-time="['00:00:00', '23:59:59']"
-                            />
-                        </el-form-item>
-                        </el-col>
-                    </el-row>
-                    </el-form> -->
-                </div>
-            </template>
-            <!-- <template v-slot:toolkit="{ row }">
-                <div class="filter-container">
-                    <div class="ele-form-actions">
-                    <el-button
-                        type="primary"
-                        icon="el-icon-search"
-                        class="ele-btn-icon"
-                        @click="reload"
-                    >
-                        查询
-                    </el-button>
-                    <el-button @click="reset">重置</el-button>
-                    </div>
-                </div>
-            </template> -->
-            <template v-slot:result="{ row }">
-            <el-tag
-                size="medium"
-                :type="
-                getTimelineItemType(
-                    getDictValue('流程实例的结果', row.result)
-                )
-                "
-            >
-                {{ getDictValue('流程实例的结果', row.result) }}
-            </el-tag>
-            </template>
-            <template v-slot:dictType="{ row }">
-            {{ getDictV('collaborative_type', row.dictType) }}
-            </template>
-            <template v-slot:durationInMillis="{ row }">
-            {{ getDateTime(row.durationInMillis) }}
-            </template>
-            <template v-slot:name="{ row }">
-            <el-link
-                type="primary"
-                :underline="false"
-                @click="handleDetail(row)"
-            >
-                {{ row.name }}
-            </el-link>
-            </template>
-            <template
-                v-if="formColumnList.length"
-                v-for="(item, index) in formColumnList"
-                v-slot:[item.model]="{ row }"
-            >
-            <div v-if="item.type == 'imgupload'">
-                <el-image
-                v-if="row[item.model].length"
-                style="width: 100px; height: 100px"
-                :src="row[item.model][0].url"
-                :preview-src-list="row[item.model].map((i) => i.url)"
+          <el-row
+            :gutter="15"
+            style="display: flex; align-items: center"
+          >
+            <!-- <el-col v-bind="{ span: 4 }">
+              <el-form-item label="分类:" label-width="60px">
+                <el-select v-model="params.dictType">
+                  <el-option
+                    v-for="(item, index) in dictList[
+                      'collaborative_type'
+                    ]"
+                    :key="index"
+                    :value="item.value"
+                    :label="item.label"
+                  ></el-option>
+                </el-select>
+              </el-form-item>
+            </el-col> -->
+            <el-col v-bind="{ span: 6 }">
+              <el-form-item label="单据:" label-width="60px">
+                <el-select v-model="params.formId">
+                  <el-option
+                    v-for="(item, index) in templateList"
+                    :key="index"
+                    :value="item.id"
+                    :label="item.name"
+                  ></el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col v-bind="{ span: 6 }">
+              <el-form-item
+                label="结果:"
+                prop="result"
+                label-width="60px"
+              >
+                <DictSelection
+                  dictName="流程实例的结果"
+                  clearable
+                  v-model="params.result"
                 >
-                </el-image>
-            </div>
-            <div v-else-if="item.type == 'fileupload'">
+                </DictSelection>
+              </el-form-item>
+            </el-col>
+            <el-col v-bind="{ span: 6 }">
+              <el-form-item
+                label="创建时间:"
+                prop="createTime1"
+                label-width="90px"
+              >
+                <el-date-picker
+                  v-model="createTime1"
+                  style="width: 100%"
+                  value-format="yyyy-MM-dd HH:mm:ss"
+                  type="daterange"
+                  range-separator="-"
+                  start-placeholder="开始日期"
+                  end-placeholder="结束日期"
+                  :default-time="['00:00:00', '23:59:59']"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col v-bind="{ span: 6 }">
+              <el-form-item>
                 <el-button
-                type="text"
-                v-if="row[item.model]?.length"
-                @click="getFiles(row[item.model])"
-                >下载
+                  type="primary"
+                  icon="el-icon-search"
+                  class="ele-btn-icon"
+                  @click="reload"
+                >
+                  查询
                 </el-button>
-            </div>
-
-            <div v-else-if="item.type == 'userSelect'">
-                {{ getUserName(row[item.model]) }}
-            </div>
-            <div v-else-if="item.type == 'deptAndUserCascader'">
-                {{ getDeptAndUserName(row[item.model]) }}
-            </div>
-            <div v-else-if="item.type == 'deptCascader'">
-                {{ getDeptName(row[item.model]) }}
-            </div>
-            <div v-else>
-                {{ row[item.model] }}
-            </div>
-            </template>
-            <!-- 操作列 -->
-            <!-- <template v-slot:action="{ row }">
+                <el-button @click="reset">重置</el-button>
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-form>
+      </div>
+      <ele-pro-table
+        ref="table"
+        height="calc(100vh - 350px)"
+        :columns="columns"
+        :datasource="datasource"
+        :init-load="false"
+        @columns-change="handleColumnChange"
+        :cache-key="cacheKeyUrl"
+        :page-size="20"
+      >
+        <template v-slot:toolbar="{ row }">
+          <el-button
+            type="primary"
+            icon="el-icon-search"
+            class="ele-btn-icon"
+            @click="handleStartProcess"
+          >
+            新建
+          </el-button>
+        </template>
+        <template v-slot:result="{ row }">
+          <el-tag
+            size="medium"
+            :type="
+              getTimelineItemType(
+                getDictValue('流程实例的结果', row.result)
+              )
+            "
+          >
+            {{ getDictValue('流程实例的结果', row.result) }}
+          </el-tag>
+        </template>
+        <template v-slot:dictType="{ row }">
+          {{ getDictV('collaborative_type', row.dictType) }}
+        </template>
+        <template v-slot:durationInMillis="{ row }">
+          {{ getDateTime(row.durationInMillis) }}
+        </template>
+        <template v-slot:name="{ row }">
+          <el-link
+            type="primary"
+            :underline="false"
+            @click="handleDetail(row)"
+          >
+            {{ row.name }}
+          </el-link>
+        </template>
+        <template
+          v-if="formColumnList.length"
+          v-for="(item, index) in formColumnList"
+          v-slot:[item.model]="{ row }"
+        >
+          <div v-if="item.type == 'imgupload'">
+            <el-image
+              v-if="row[item.model].length"
+              style="width: 100px; height: 100px"
+              :src="row[item.model][0].url"
+              :preview-src-list="row[item.model].map((i) => i.url)"
+            >
+            </el-image>
+          </div>
+          <div v-else-if="item.type == 'fileupload'">
             <el-button
-                size="mini"
-                type="text"
-                icon="el-icon-edit"
-                @click="handleAudit(row)"
-                >详情
+              type="text"
+              v-if="row[item.model]?.length"
+              @click="getFiles(row[item.model])"
+              >下载
             </el-button>
-            </template> -->
-        </ele-pro-table>
+          </div>
+
+          <div v-else-if="item.type == 'userSelect'">
+            {{ getUserName(row[item.model]) }}
+          </div>
+          <div v-else-if="item.type == 'deptAndUserCascader'">
+            {{ getDeptAndUserName(row[item.model]) }}
+          </div>
+          <div v-else-if="item.type == 'deptCascader'">
+            {{ getDeptName(row[item.model]) }}
+          </div>
+          <div v-else>
+            {{ row[item.model] }}
+          </div>
+        </template>
+        <!-- 操作列 -->
+        <!-- <template v-slot:action="{ row }">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleAudit(row)"
+            >详情
+          </el-button>
+        </template> -->
+      </ele-pro-table>
     </el-card>
-    <!-- <process-submit-dialog
-      :process-submit-dialog-flag.sync="processSubmitDialogFlag"
-      v-if="processSubmitDialogFlag"
-      ref="processSubmitDialogRef"
+    <add-dialog
+      :add-flag.sync="addFlag"
+      v-if="addFlag"
+      :list="templateList"
+      ref="addDialogRef"
       @reload="reload"
-    ></process-submit-dialog> -->
-<!-- 
-    <detail ref="detailRef"></detail>
-    <formDetail
-      v-if="formDetailDialogFlag"
-      :view="true"
-      ref="formDetailDialogRef"
-      :form-detail-dialog-flag.sync="formDetailDialogFlag"
-    ></formDetail> -->
+    ></add-dialog>
   </div>
 </template>
 <script>
   import {
     getBpmCustomFormList,
-    getProcessInstanceDeptPage,
-    getProcessInstanceNoticePage,
     getProcessInstancePage
   } from '@/api/bpm/task';
   import { getDate } from '@/utils/dateUtils';
   import dictMixins from '@/mixins/dictMixins';
-//   import detail from '@/views/bpm/processInstance/detail.vue';
-//   import formDetail from './detail.vue';
+  // import detail from '@/views/bpm/processInstance/detail.vue';
+  // import formDetail from './detail.vue';
   import { getByCode } from '@/api/system/dictionary-data';
   import { getFile } from '@/api/system/file';
   import { getUserPage } from '@/api/system/organization';
   import { listOrganizations } from '@/api/system/organization';
   import tabMixins from '@/mixins/tableColumnsMixin';
+  import addDialog from './components/addDialog.vue';
 
   // 默认表单数据
-  // const defaultParams = {
-  //   dictType: '5',
-  //   status: '',
-  //   name: '',
-  //   formId: ''
-  // };
+  const defaultParams = {
+    dictType: '5',
+    status: '',
+    name: '',
+    formId: ''
+  };
   export default {
     name: 'index',
-    // components: {
-    //   detail,
-    //   formDetail
-    // },
+    components: {
+      addDialog
+      // detail,
+      // formDetail
+    },
     mixins: [dictMixins, tabMixins],
     data() {
       return {
-        cacheKeyUrl: 'eom-contract-review-index',
-        configFormDialogFlag: false,
-        processSubmitDialogFlag: false,
+        cacheKeyUrl: 'wt-eaf1548b-collaborative',
+        addFlag: false,
         formDetailDialogFlag: false,
         templateList: {},
         dictList: {},
         defaultTemplateList: [],
         userList: [],
         deptList: [],
-        params: {
-          status: '',
-          formId: '',
-          createTimeBegin: '',
-          createTimeEnd: ''
-        },
+        params: { ...defaultParams },
         statusList: [],
         formColumnList: [],
         createTime1: [],
-        // 个人 / 部门 / 通知我的
-        activeName: 'user',
       };
     },
     computed: {
@@ -257,40 +243,6 @@
       styleResponsive() {
         return this.$store.state.theme.styleResponsive;
       },
-      // 表格列配置
-      seekList() {
-        return [
-            // {
-            //     label: '分类:',
-            //     value: 'dictType',
-            //     type: 'select',
-            //     placeholder: '请选择分类',
-            // },
-            {
-                label: '单据:',
-                value: 'formId',
-                type: 'select',
-                placeholder: '请选择单据',
-                planList: this.templateList
-            },
-            {
-                label: '结果:',
-                value: 'status',
-                type: 'DictSelection',
-                placeholder: '请选择结果',
-                dictName: '流程实例的结果'
-            },
-            {
-                label: '创建时间:',
-                value: 'createTime',
-                type: 'date',
-                // dateType: 'datetimerange',
-                placeholder: '',
-                width: 280,
-                valueAr: ['createTimeBegin', 'createTimeEnd']
-            },
-        ];
-        },
       columns() {
         let list = this.formColumnList.map((item) => {
           return {
@@ -359,25 +311,16 @@
             showOverflowTooltip: true,
             minWidth: 120
           },
-
-          // {
-          //   prop: 'durationInMillis',
-          //   slot: 'durationInMillis',
-          //   label: '耗时',
-          //   align: 'center',
-          //   showOverflowTooltip: true,
-          //   minWidth: 130
-          // },
-        //   {
-        //     columnKey: 'action',
-        //     label: '操作',
-        //     width: 100,
-        //     align: 'center',
-        //     resizable: false,
-        //     slot: 'action',
-        //     showOverflowTooltip: true,
-        //     fixed: 'right'
-        //   }
+          {
+            columnKey: 'action',
+            label: '操作',
+            width: 100,
+            align: 'center',
+            resizable: false,
+            slot: 'action',
+            showOverflowTooltip: true,
+            fixed: 'right'
+          }
         ];
       },
       getUserName() {
@@ -410,22 +353,10 @@
       'params.formId': {
         handler(val) {
           this.reload();
-          // this.deptReload();
-          // this.reload();
-          // this.noticeReload();
         }
       },
-    //   'params.dictType': {
-    //     handler(val) {
-    //       this.params.formId = this.templateList[val][0].id;
-    //       this.reload();
-    //       this.deptReload();
-    //       this.reload();
-    //       this.noticeReload();
-    //     }
-    //   }
     },
-    async created() {
+    async mounted() {
       await this.getDictList('collaborative_type');
       await this.getTemplateList();
       await this.getUserList();
@@ -463,47 +394,31 @@
       },
       async getTemplateList() {
         this.defaultTemplateList = await getBpmCustomFormList({ status: 1 });
-        const list  = _.groupBy(this.defaultTemplateList, 'dictType')
-        this.templateList = list['5']?.map((item) => ({
-                    ...item,
-                    label: item.name,
-                    value: item.id
-                })) || [];
-        console.log('templateList~~~', this.templateList);
+        this.templateList = _.groupBy(this.defaultTemplateList, 'dictType')['5'];
         // this.params.dictType = this.dictList['collaborative_type'][0].value;
         this.params.formId = this.templateList[0]?.id;
-        console.log('this.params.formId~~~', this.params.formId);
-        // 安全获取第一个模板的formJson数据
-        let makingJson = {};
-        if (this.templateList.length > 0 && this.templateList[0]?.formJson?.makingJson) {
-          try {
-            makingJson = JSON.parse(this.templateList[0].formJson.makingJson) || {};
-          } catch (e) {
-            console.error('解析formJson失败:', e);
-          }
-        }
-        this.formColumnList = makingJson.list || [];
+        let makingJson =
+          JSON.parse(this.defaultTemplateList[0].formJson.makingJson) || {};
+        this.formColumnList = makingJson.list;
         console.log(this.formColumnList);
       },
-      handleStartProcess(i) {
-        this.processSubmitDialogFlag = true;
-        this.$nextTick(() => {
-          this.$refs.processSubmitDialogRef.init(i);
-        });
+      handleStartProcess() {
+        this.addFlag = true;
+        // this.$nextTick(() => {
+        //   this.$refs.addDialogRef.init();
+        // });
       },
       /* 表格数据源 */
       async datasource({ page, limit, where, order }) {
-        // let [createTimeBegin, createTimeEnd] = this.createTime1 || [];
+        let [createTimeBegin, createTimeEnd] = this.createTime1 || [];
 
         let data = await getProcessInstancePage({
           pageNo: page,
           pageSize: limit,
-          ...where,
-          dictType: '5',
-        //   ...this.params,
+          ...this.params,
           processType: '1',
-        //   createTimeBegin,
-        //   createTimeEnd
+          createTimeBegin,
+          createTimeEnd
         });
         data = data.list.map((item) => {
           return {
@@ -513,96 +428,27 @@
         });
         return data;
       },
-      search(e) {
-        this.params = e;
-        this.$refs.table.reload({ page: 1, where: e });
-      },
       /* 刷新表格 */
       reload(where) {
         let find =
-          this.templateList.find(
+          this.defaultTemplateList.find(
             (item) => item.id == this.params.formId
           ) || {};
-        // 安全获取模板的formJson数据
-        let makingJson = {};
-        if (find && find.formJson && find.formJson.makingJson) {
-          try {
-            makingJson = JSON.parse(find.formJson.makingJson) || {};
-          } catch (e) {
-            console.error('解析formJson失败:', e);
-          }
-        }
-        this.formColumnList = makingJson.list || [];
+        let makingJson = JSON.parse(find.formJson.makingJson) || {};
+        this.formColumnList = makingJson.list;
         this.$refs.table.reload({ page: 1, where });
+        this.$refs.table.reRenderTable();
       },
 
       /*  重置 */
       reset() {
         this.params = { ...defaultParams };
         this.createTime1 = [];
-        // this.params.dictType = this.dictList['collaborative_type'][0].value;
-        this.params.formId = this.templateList[0]?.id;
+        this.params.dictType = this.dictList['collaborative_type'][0].value;
+        this.params.formId = this.templateList[this.params.dictType][0]?.id;
 
         this.reload();
       },
-      /* 表格数据源 */
-      // async deptDatasource({ page, limit, where, order }) {
-      //   let [createTimeBegin, createTimeEnd] = this.createTime1 || [];
-      //   let data = await getProcessInstanceDeptPage({
-      //     pageNo: page,
-      //     pageSize: limit,
-      //     ...this.params,
-      //     processType: '1',
-      //     createTimeBegin,
-      //     createTimeEnd
-      //   });
-      //   data = data.list.map((item) => {
-      //     return {
-      //       ...item,
-      //       ...item.valueJson
-      //     };
-      //   });
-      //   return data;
-      // },
-      /* 刷新表格 */
-      // deptReload(where) {
-      //   let find =
-      //     this.defaultTemplateList.find(
-      //       (item) => item.id == this.params.formId
-      //     ) || {};
-      //   let makingJson = JSON.parse(find.formJson.makingJson) || {};
-      //   this.formColumnList = makingJson.list;
-
-      //   this.$refs.deptTable.reload({ page: 1, where });
-      // },
-      /*  重置 */
-      // deptReset() {
-      //   this.params = { ...defaultParams };
-      //   this.createTime1 = [];
-      //   this.params.formId = this.defaultTemplateList[0]?.id;
-      //   this.params.dictType = this.dictList['collaborative_type'][0].value;
-      //   this.deptReload();
-      // },
-      /* 表格数据源 */
-      // async noticeDatasource({ page, limit, where, order }) {
-      //   let [createTimeBegin, createTimeEnd] = this.createTime1 || [];
-
-      //   let data = await getProcessInstanceNoticePage({
-      //     pageNo: page,
-      //     pageSize: limit,
-      //     ...this.params,
-      //     processType: '1',
-      //     createTimeBegin,
-      //     createTimeEnd
-      //   });
-      //   data = data.list.map((item) => {
-      //     return {
-      //       ...item,
-      //       ...item.valueJson
-      //     };
-      //   });
-      //   return data;
-      // },
       /**  */
       handleAudit(row) {
         this.$refs.detailRef.open(row.id);
@@ -637,105 +483,5 @@
   };
 </script>
 <style scoped lang="scss">
-  .ele-body {
-    padding: 15px;
-  }
-
-  .content-box {
-    width: 100%;
-    //max-width: 273px;
-    //min-width: 90px;
-    // margin-right: 10px;
-    display: flex;
-    flex-direction: row;
-    flex-wrap: wrap;
-    //justify-content: space-between;
-
-    .category_box {
-      border-left: 1px solid #e1e1e1;
-      border-bottom: 1px solid #e1e1e1;
-      border-radius: 1px;
-      // flex: 1 0 25%;
-      margin-top: 5px;
-      overflow: auto;
-      width: 100%;
-
-      .category_box_title {
-        font-size: 14px;
-        font-weight: bold;
-        color: #fff8f8;
-        height: 39px;
-        display: flex;
-        padding: 5px 20px;
-        align-items: center;
-        background: #1890ffd6;
-        border-bottom: 1px solid #e1e1e1;
-      }
-
-      .category_box_content {
-        display: flex;
-        flex-direction: row;
-        flex-wrap: wrap;
-        // height: 60px;
-        overflow: auto;
-
-        .category_content {
-          min-width: 33%;
-          min-height: 60px;
-          //flex: 1 1 0;
-          display: flex;
-          flex-direction: column;
-          border-right: 1px solid #e1e1e1;
-          border-bottom: 1px solid #e1e1e1;
-          align-items: center;
-          justify-content: center;
-          //  font-weight: bold;
-
-          &:nth-child(n) {
-            span:nth-child(1) {
-              transform: scale(2);
-            }
-
-            span:nth-child(2) {
-              padding-top: 5px;
-            }
-          }
-        }
-
-        .category_content:hover {
-          cursor: pointer;
-          background-color: rgba(135, 181, 243, 0.29);
-        }
-      }
-    }
-
-    .category_box:last-child {
-      border-right: 1px solid #e1e1e1;
-    }
-  }
-
-  .tab-box {
-    width: calc(100vw - 300px);
-    //max-width: 1100px;
-    //min-width: 600px;
-    margin-top: 6px;
-    height: 98%;
-
-    .el-tabs--border-card {
-      height: 100%;
-    }
-  }
-
-  ::v-deep .card_box {
-    .el-card__body {
-      padding: 10px;
-      height: 86vh;
-    }
-  }
 
-  ::v-deep .ele-table-tool {
-    display: flex;
-    flex-direction: row;
-    flex-wrap: nowrap !important;
-  }
 </style>