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

Merge branch 'dev' of http://110.41.163.243:9980/kd-aiot/kd-aiot-frontend into dev

ysy 1 год назад
Родитель
Сommit
0ab06054fb

+ 37 - 0
src/api/bpm/processInstance.js

@@ -39,3 +39,40 @@ export async function getProcessInstance(id) {
   }
   return Promise.reject(new Error(res.data.message));
 }
+
+export async function getActivityList(query) {
+
+  const res= await request({
+    url: '/bpm/activity/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 getTaskListByProcessInstanceId(processInstanceId) {
+  const res = await request({
+    url:
+      '/bpm/task/list-by-process-instance-id?processInstanceId=' +
+      processInstanceId,
+    method: 'get'
+  });
+
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+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));
+}

+ 7 - 0
src/api/classifyManage/index.js

@@ -9,6 +9,13 @@ export async function getSubPage(data) {
   }
   return Promise.reject(new Error(res.data.message));
 }
+export async function getAllCategoryLevelAPI() {
+  const res = await request.get('/main/categoryLevel/allCategoryLevel');
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
 export async function saveOrUpdate(data) {
   const res = await request.post('/main/categoryLevel/saveOrUpdate', data);
   if (res.data.code == 0) {

+ 71 - 0
src/api/versionManage/index.js

@@ -0,0 +1,71 @@
+import request from '@/utils/request';
+
+// 列表
+export async function getVersionManagePageAPI(data) {
+  const res = await request.post(`/main/versionmanagerment/page`, data);
+  console.log(res.data.code == 0)
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+// 详情
+export async function getDetailsByTypeAPI(type) {
+  const res = await request.get(`/main/versionmanagerment/getDetailsByType/${type}`, {
+    data
+  });
+  if (res.data.code == 0) {
+    return res.data.message;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+// 详情
+export async function getDetailsByIdAPI(id) {
+  const res = await request.get(`/main/versionmanagerment/getById/${id}`);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+// 删除
+export async function versionManageDeleteAPI(data) {
+  const res = await request.delete(`/main/versionmanagerment/delete`, {
+    data
+  });
+  if (res.data.code == 0) {
+    return res.data.message;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+// 新增
+export async function versionManageSaveAPI(data) {
+  const res = await request.post(`/main/versionmanagerment/save`, data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+// 修改
+export async function versionManageUpdateAPI(data) {
+  const res = await request.put(`/main/versionmanagerment/update`, data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+// 修改updateStatus
+export async function updateStatus(data) {
+  const res = await request.put(`/main/versionmanagerment/updateStatus`, data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+// 查询分类列表一二级数据
+export async function getSubTwoLevelAPI(params) {
+  const res = await request.get(`/main/categoryLevel/getSubPageList`, {params});
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}

+ 19 - 4
src/components/authSelection/index.vue

@@ -27,8 +27,12 @@
     },
     props: {
       value: {
-        type: String,
+        type: [String, Array],
         default: ''
+      },
+      dataType: {
+        type: String,
+        default: 'String'
       }
     },
     data() {
@@ -40,16 +44,27 @@
       ...mapGetters(['user']),
       selectVal: {
         set(val) {
-          this.$emit('updateVal', val.join(','));
+          switch (this.dataType) {
+            case 'Array':
+              this.$emit('updateVal', val);
+              break;
+            default:
+              this.$emit('updateVal', val.join(','));
+          }
         },
         get() {
-          return this.value ? this.value.split(',') : [];
+          switch (this.dataType) {
+            case 'Array':
+              return this.value || [];
+            default:
+              return this.value ? this.value.split(',') : [];
+          }
         }
       }
     },
     mounted() {
       this.deptTreeList = this.$util.toTreeData({
-        data: this.user.authorityDept.groupList,
+        data: this.user?.authorityDept?.groupList || [],
         idField: 'id',
         parentIdField: 'parentId'
       });

+ 274 - 0
src/views/bpm/processInstance/businessDetail.vue

@@ -0,0 +1,274 @@
+<template>
+
+    <div class="app-container" style="padding: 15px">
+      <!-- 审批记录 -->
+      <el-card class="box-card" v-loading="tasksLoad">
+        <div slot="header" class="clearfix">
+          <span class="el-icon-picture-outline">审批记录</span>
+        </div>
+        <el-col :span="16" :offset="4">
+          <div class="block">
+            <el-timeline>
+              <el-timeline-item
+                v-for="(item, index) in tasks"
+                :key="index"
+                :icon="getTimelineItemIcon(item)"
+                :type="getTimelineItemType(item)"
+              >
+                <p style="font-weight: 700">任务:{{ item.name }}</p>
+                <el-card :body-style="{ padding: '10px' }">
+                  <label
+                    v-if="item.assigneeUser"
+                    style="font-weight: normal; margin-right: 30px"
+                  >
+                    审批人:{{ item.assigneeUser.nickname }}
+                    <el-tag type="info" size="mini">{{
+                      item.assigneeUser.deptName
+                    }}</el-tag>
+                  </label>
+                  <label style="font-weight: normal" v-if="item.createTime"
+                    >创建时间:</label
+                  >
+                  <label style="color: #8a909c; font-weight: normal">{{
+                    item.createTime
+                  }}</label>
+                  <label
+                    v-if="item.endTime"
+                    style="margin-left: 30px; font-weight: normal"
+                    >审批时间:</label
+                  >
+                  <label
+                    v-if="item.endTime"
+                    style="color: #8a909c; font-weight: normal"
+                  >
+                    {{ item.endTime }}</label
+                  >
+                  <label
+                    v-if="item.durationInMillis"
+                    style="margin-left: 30px; font-weight: normal"
+                    >耗时:</label
+                  >
+                  <label
+                    v-if="item.durationInMillis"
+                    style="color: #8a909c; font-weight: normal"
+                  >
+                    {{ getDateStar(item.durationInMillis) }}
+                  </label>
+                  <p v-if="item.reason">
+                    <el-tag :type="getTimelineItemType(item)">{{
+                      item.reason
+                    }}</el-tag>
+                  </p>
+                </el-card>
+              </el-timeline-item>
+            </el-timeline>
+          </div>
+        </el-col>
+      </el-card>
+
+      <!-- 高亮流程图 -->
+      <el-card class="box-card" v-loading="processInstanceLoading">
+        <div slot="header" class="clearfix">
+          <span class="el-icon-picture-outline">流程图</span>
+        </div>
+        <my-process-viewer
+          key="designer"
+          v-model="bpmnXML"
+          v-bind="bpmnControlForm"
+          :activityData="activityList"
+          :processInstanceData="processInstance"
+          :taskData="tasks"
+        />
+      </el-card>
+    </div>
+
+</template>
+
+<script>
+  import {
+    getProcessDefinitionBpmnXML,
+    getProcessInstance,
+    getTaskListByProcessInstanceId,
+    getActivityList
+  } from '@/api/bpm/processInstance';
+  import store from '@/store';
+  import { getDate } from '@/utils/dateUtils';
+  import dictMixins from '@/mixins/dictMixins';
+  // import Vue from 'vue';
+
+  // 流程实例的详情页,可用于审批
+  export default {
+    name: 'ProcessInstanceDetail',
+    mixins: [dictMixins],
+    props: {
+      id: {
+        default: ''
+      }
+    },
+    components: {},
+    data() {
+      return {
+        // 遮罩层
+        processInstanceLoading: true,
+        dialogVisible: false,
+
+        // 流程实例
+        // id: undefined, // 流程实例的编号
+        processInstance: {},
+
+        // BPMN 数据
+        bpmnXML: null,
+        bpmnControlForm: {
+          prefix: 'flowable'
+        },
+        activityList: [],
+
+        // 审批记录
+        tasksLoad: true,
+        tasks: []
+      };
+    },
+    created() {
+
+      this.getDetail();
+    },
+    methods: {
+
+      /** 获得流程实例 */
+      getDetail() {
+        // 获得流程实例相关
+        this.processInstanceLoading = true;
+        getProcessInstance(this.id).then((response) => {
+          if (!response) {
+            this.$message.error('查询不到流程信息!');
+            return;
+          }
+          // 设置流程信息
+          this.processInstance = response;
+
+          // //将业务表单,注册为动态组件
+          // const path = this.processInstance.processDefinition.formCustomViewPath;
+          // Vue.component("async-biz-form-component", function (resolve) {
+          //   require([`@/views${path}`], resolve);
+          // });
+
+          // 加载流程图
+          getProcessDefinitionBpmnXML(
+            this.processInstance.processDefinition.id
+          ).then((response) => {
+            this.bpmnXML = response;
+          });
+          // 加载活动列表
+          getActivityList({
+            processInstanceId: this.processInstance.id
+          }).then((response) => {
+            console.log(response, 'response');
+            this.activityList = response;
+          });
+
+          // 取消加载中
+          this.processInstanceLoading = false;
+        });
+
+        // 获得流程任务列表(审批记录)
+        this.tasksLoad = true;
+        getTaskListByProcessInstanceId(this.id).then((response) => {
+          // 审批记录
+          this.tasks = [];
+          // 移除已取消的审批
+          response.forEach((task) => {
+            if (task.result !== 4) {
+              this.tasks.push(task);
+            }
+          });
+          // 排序,将未完成的排在前面,已完成的排在后面;
+          this.tasks.sort((a, b) => {
+            // 有已完成的情况,按照完成时间倒序
+            if (a.endTime && b.endTime) {
+              return b.endTime - a.endTime;
+            } else if (a.endTime) {
+              return 1;
+            } else if (b.endTime) {
+              return -1;
+              // 都是未完成,按照创建时间倒序
+            } else {
+              return b.createTime - a.createTime;
+            }
+          });
+
+          // 需要审核的记录
+          const userId = store.getters.userId;
+          this.tasks.forEach((task) => {
+            if (task.result !== 1 && task.result !== 6) {
+              // 只有待处理才需要
+              return;
+            }
+            if (!task.assigneeUser || task.assigneeUser.id !== userId) {
+              // 自己不是处理人
+              return;
+            }
+          });
+
+          // 取消加载中
+          this.tasksLoad = false;
+        });
+      },
+      getDateStar(ms) {
+        return getDate(ms);
+      },
+      getTimelineItemIcon(item) {
+        if (item.result === 1) {
+          return 'el-icon-time';
+        }
+        if (item.result === 2) {
+          return 'el-icon-check';
+        }
+        if (item.result === 3) {
+          return 'el-icon-close';
+        }
+        if (item.result === 4) {
+          return 'el-icon-remove-outline';
+        }
+        if (item.result === 5) {
+          return 'el-icon-back';
+        }
+        return '';
+      },
+      getTimelineItemType(item) {
+        if (item.result === 1) {
+          return 'primary';
+        }
+        if (item.result === 2) {
+          return 'success';
+        }
+        if (item.result === 3) {
+          return 'danger';
+        }
+        if (item.result === 4) {
+          return 'info';
+        }
+        if (item.result === 5) {
+          return 'warning';
+        }
+        if (item.result === 6) {
+          return 'default';
+        }
+        return '';
+      },
+      handleClose() {
+        this.dialogVisible = false;
+      }
+    }
+  };
+</script>
+
+<style lang="scss">
+  .my-process-designer {
+    height: calc(100vh - 200px);
+  }
+
+  .box-card {
+    width: 100%;
+    margin-bottom: 20px;
+  }
+</style>

+ 248 - 247
src/views/factoryModel/qualificationManagement/components/addOrEditDialog.vue

@@ -3,291 +3,291 @@
              :centered="true" :visible.sync="addOrEditDialogFlag" :title="title"
              append-to-body
              :close-on-click-modal="false" width="70%" :before-close="cancel">
-    <el-form ref="form" :model="form" :rules="rules" class="el-form-box">
-      <headerTitle title="基本信息"/>
-      <el-row :gutter="20">
-        <!--        <el-col :span="12">-->
-        <!--          <el-form-item label="编码:" prop="code" label-width="90px">-->
-        <!--            <el-input-->
-        <!--              :disabled="type=='view'"-->
-        <!--              v-model="form.code"-->
-        <!--              clearable-->
-        <!--              placeholder="请输入"-->
-        <!--            />-->
-        <!--          </el-form-item>-->
-        <!--        </el-col>-->
-        <el-col :span="12">
-          <el-form-item label="名称" prop="name"
-                        label-width="90px"
-                        :rules=" {required: true, message: '请输入',trigger: 'blur' }">
-            <el-input v-model="form.name" :disabled="type=='view'" clearable></el-input>
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="有效时间:" prop="date" label-width="90px">
-            <el-date-picker
-              :disabled="type=='view'"
-              v-model="form.date"
-              style="width: 100%;"
-              type="daterange"
-              value-format="yyyy-MM-dd"
-              range-separator="至"
-              start-placeholder="开始日期"
-              end-placeholder="结束日期"
-            >
-            </el-date-picker>
-          </el-form-item>
-        </el-col>
 
-      </el-row>
-      <el-row :gutter="20">
-        <el-col :span="12">
-          <el-form-item label="资质类型:" prop="certificationType" label-width="90px">
-            <el-select
-              style="width: 100%"
-              :disabled="type=='view'"
-              v-model="form.certificationType"
-              @change="changeCertificationType"
-              filterable
-            >
-              <el-option
-                v-for="item in qualificationOptions"
-                :key="item.value"
-                :label="item.label"
-                :value="item.value"
-              >
-              </el-option>
-            </el-select>
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="关联类型:" prop="relationName" label-width="90px">
-            <el-input
-              :disabled="type=='view'"
-              v-model="form.relationName"
-              readonly
-              clearable
-              @click.native="handleClick"
-              placeholder="请选择"
-            />
-          </el-form-item>
-        </el-col>
-      </el-row>
-      <el-row :gutter="20">
-        <el-col :span="12">
-          <el-form-item label="备注" label-width="90px">
-            <el-input type="textarea" v-model="form.remark" :disabled="type=='view'" clearable></el-input>
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="附件:" prop="accessory" label-width="90px">
-            <fileUpload
-              v-if="type!=='view'"
-              v-model="form.accessory"
-              module="main"
-              :showLib="false"
-              :limit="10"/>
-            <div v-else>
-              <el-link
-                v-for="link in form.accessory"
-                :key="link.id"
-                type="primary"
-                :underline="false"
-                @click="downloadFile(link)">
-                {{ link.name }}
-              </el-link>
-            </div>
-          </el-form-item>
-        </el-col>
-      </el-row>
-      <headerTitle title="资质信息"/>
-      <ele-pro-table ref="linkTable" :columns="columns" :datasource="form.detailsList" :toolkit="[]" height="300px"
-                     :need-page="false">
-        <!-- 表头工具栏 -->
-        <template v-slot:toolbar>
+        <el-tabs v-model="activeName" type="card" >
+          <el-tab-pane label="证书资质" name="QC">
+            <el-form ref="form" :model="form" :rules="rules" class="el-form-box">
+              <headerTitle title="基本信息"/>
+              <el-row :gutter="20">
+                <!--        <el-col :span="12">-->
+                <!--          <el-form-item label="编码:" prop="code" label-width="90px">-->
+                <!--            <el-input-->
+                <!--              :disabled="type=='view'"-->
+                <!--              v-model="form.code"-->
+                <!--              clearable-->
+                <!--              placeholder="请输入"-->
+                <!--            />-->
+                <!--          </el-form-item>-->
+                <!--        </el-col>-->
+                <el-col :span="12">
+                  <el-form-item label="名称" prop="name"
+                                label-width="90px"
+                                :rules=" {required: true, message: '请输入',trigger: 'blur' }">
+                    <el-input v-model="form.name" :disabled="type=='view'" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="有效时间:" prop="date" label-width="90px">
+                    <el-date-picker
+                      :disabled="type=='view'"
+                      v-model="form.date"
+                      style="width: 100%;"
+                      type="daterange"
+                      value-format="yyyy-MM-dd"
+                      range-separator="至"
+                      start-placeholder="开始日期"
+                      end-placeholder="结束日期"
+                    >
+                    </el-date-picker>
+                  </el-form-item>
+                </el-col>
 
-          <el-button v-if="type!=='view'" type="primary" @click="handleAdd">添加</el-button>
-        </template>
-        <template v-slot:name="scope">
-          <el-form-item :prop="'detailsList.' + scope.$index + '.name'" :rules="{
+              </el-row>
+              <el-row :gutter="20">
+                <el-col :span="12">
+                  <el-form-item label="资质类型:" prop="certificationType" label-width="90px">
+                    <el-select
+                      style="width: 100%"
+                      :disabled="type=='view'"
+                      v-model="form.certificationType"
+                      @change="changeCertificationType"
+                      filterable
+                    >
+                      <el-option
+                        v-for="item in qualificationOptions"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value"
+                      >
+                      </el-option>
+                    </el-select>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="关联类型:" prop="relationName" label-width="90px">
+                    <el-input
+                      :disabled="type=='view'"
+                      v-model="form.relationName"
+                      readonly
+                      clearable
+                      @click.native="handleClick"
+                      placeholder="请选择"
+                    />
+                  </el-form-item>
+                </el-col>
+              </el-row>
+              <el-row :gutter="20">
+                <el-col :span="12">
+                  <el-form-item label="备注" label-width="90px">
+                    <el-input type="textarea" v-model="form.remark" :disabled="type=='view'" clearable></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="附件:" prop="accessory" label-width="90px">
+                    <fileUpload
+                      v-if="type!=='view'"
+                      v-model="form.accessory"
+                      module="main"
+                      :showLib="false"
+                      :limit="10"/>
+                    <div v-else>
+                      <el-link
+                        v-for="link in form.accessory"
+                        :key="link.id"
+                        type="primary"
+                        :underline="false"
+                        @click="downloadFile(link)">
+                        {{ link.name }}
+                      </el-link>
+                    </div>
+                  </el-form-item>
+                </el-col>
+              </el-row>
+              <headerTitle title="资质信息"/>
+              <ele-pro-table ref="linkTable" :columns="columns" :datasource="form.detailsList" :toolkit="[]" height="300px"
+                             :need-page="false">
+                <!-- 表头工具栏 -->
+                <template v-slot:toolbar>
+
+                  <el-button v-if="type!=='view'" type="primary" @click="handleAdd">添加</el-button>
+                </template>
+                <template v-slot:name="scope">
+                  <el-form-item :prop="'detailsList.' + scope.$index + '.name'" :rules="{
             required: true,
             message: '',
             trigger: 'change'
           }">
-            <el-select v-if="type!=='view'" v-model="scope.row.name" clearable>
-              <el-option :disabled="disabledToType(scope.row).includes(item.dictCode)"
-                         v-for="item in dictList" :value="item.dictCode"
-                         :label="item.dictValue"></el-option>
-            </el-select>
-            <!--                <DictSelection v-if="type!=='view'" clearable dictName="客户/供应商资质类型" v-model="scope.row.type"-->
-            <!--                               @itemChange="(val)=>handleChangeType(val,scope.row)"></DictSelection>-->
-            <span v-else>{{ getLabelName(dictList, scope.row.name) }}</span>
-          </el-form-item>
+                    <el-select v-if="type!=='view'" v-model="scope.row.name" clearable>
+                      <el-option :disabled="disabledToType(scope.row).includes(item.dictCode)"
+                                 v-for="item in dictList" :value="item.dictCode"
+                                 :label="item.dictValue"></el-option>
+                    </el-select>
+                    <!--                <DictSelection v-if="type!=='view'" clearable dictName="客户/供应商资质类型" v-model="scope.row.type"-->
+                    <!--                               @itemChange="(val)=>handleChangeType(val,scope.row)"></DictSelection>-->
+                    <span v-else>{{ getLabelName(dictList, scope.row.name) }}</span>
+                  </el-form-item>
 
-        </template>
-        <template v-slot:code="scope">
-          <el-form-item :prop="'detailsList.' + scope.$index + '.code'" :rules="{
+                </template>
+                <template v-slot:code="scope">
+                  <el-form-item :prop="'detailsList.' + scope.$index + '.code'" :rules="{
             required: true,
             message: '',
             trigger: 'blur'
           }">
-            <el-input v-model="scope.row.code" :disabled="type=='view'" clearable></el-input>
-          </el-form-item>
+                    <el-input v-model="scope.row.code" :disabled="type=='view'" clearable></el-input>
+                  </el-form-item>
 
-        </template>
-        <template v-slot:businessRange="scope">
-          <el-form-item :prop="'detailsList.' + scope.$index + '.businessRange'">
-            <el-input type="textarea" v-model="scope.row.businessRange" :disabled="type=='view'" clearable></el-input>
-          </el-form-item>
-        </template>
-        <template v-slot:startTime="scope">
-          <el-form-item inline-message :prop="'detailsList.' + scope.$index + '.startTime'" :rules="{
+                </template>
+                <template v-slot:businessRange="scope">
+                  <el-form-item :prop="'detailsList.' + scope.$index + '.businessRange'">
+                    <el-input type="textarea" v-model="scope.row.businessRange" :disabled="type=='view'" clearable></el-input>
+                  </el-form-item>
+                </template>
+                <template v-slot:startTime="scope">
+                  <el-form-item inline-message :prop="'detailsList.' + scope.$index + '.startTime'" :rules="{
             required: true,
             message: '',
             trigger: 'change'
 
           }">
-            <el-date-picker
-              :disabled="type=='view'"
-              v-model="scope.row.startTime"
-              type="date"
-              style="width: 100%"
-              value-format="yyyy-MM-dd"
-              placeholder="选择日期">
-            </el-date-picker>
-          </el-form-item>
+                    <el-date-picker
+                      :disabled="type=='view'"
+                      v-model="scope.row.startTime"
+                      type="date"
+                      style="width: 100%"
+                      value-format="yyyy-MM-dd"
+                      placeholder="选择日期">
+                    </el-date-picker>
+                  </el-form-item>
 
-        </template>
-        <template v-slot:endTime="scope">
-          <el-form-item :prop="'detailsList.' + scope.$index + '.endTime'"
-                        :rules="{
+                </template>
+                <template v-slot:endTime="scope">
+                  <el-form-item :prop="'detailsList.' + scope.$index + '.endTime'"
+                                :rules="{
             required: true,
             validator: validateEndDate(scope.row,scope.$index),
             trigger: ['blur','change']
           }">
-            <el-date-picker
-              :disabled="type=='view'"
-              v-model="scope.row.endTime"
-              type="date"
-              style="width: 100%"
-              value-format="yyyy-MM-dd"
-              placeholder="选择日期">
-            </el-date-picker>
-          </el-form-item>
+                    <el-date-picker
+                      :disabled="type=='view'"
+                      v-model="scope.row.endTime"
+                      type="date"
+                      style="width: 100%"
+                      value-format="yyyy-MM-dd"
+                      placeholder="选择日期">
+                    </el-date-picker>
+                  </el-form-item>
 
-        </template>
-        <template v-slot:noticePersonName="scope">
-          <el-form-item :prop="'detailsList.' + scope.$index + '.noticePersonName'" :rules="{
+                </template>
+                <template v-slot:noticePersonName="scope">
+                  <el-form-item :prop="'detailsList.' + scope.$index + '.noticePersonName'" :rules="{
             required: true,
             message: '',
             trigger: ['blur','change']
 
           }">
-            <el-input
-              :disabled="type=='view'"
-              @click.native="openStaffSelection(scope.$index)"
-              v-model="scope.row.noticePersonName"
-              placeholder="请选择"
-            ></el-input>
-          </el-form-item>
+                    <el-input
+                      :disabled="type=='view'"
+                      @click.native="openStaffSelection(scope.$index)"
+                      v-model="scope.row.noticePersonName"
+                      placeholder="请选择"
+                    ></el-input>
+                  </el-form-item>
 
-        </template>
-        <template v-slot:accessory="scope">
-          <el-form-item :prop="'detailsList.' + scope.$index + '.accessory'" :rules="{
+                </template>
+                <template v-slot:accessory="scope">
+                  <el-form-item :prop="'detailsList.' + scope.$index + '.accessory'" :rules="{
             required: true,
             message: '',
             trigger: ['change','blur']
           }">
-            <fileUpload
-              v-if="type!=='view'"
-              v-model="scope.row.accessory"
-              module="main"
-              :showLib="false"
-              :limit="10"/>
-            <div v-else>
-              <el-link
-                v-for="link in scope.row.accessory"
-                :key="link.id"
-                type="primary"
-                :underline="false"
-                @click="downloadFile(link)">
-                {{ link.name }}
-              </el-link>
-            </div>
-          </el-form-item>
+                    <fileUpload
+                      v-if="type!=='view'"
+                      v-model="scope.row.accessory"
+                      module="main"
+                      :showLib="false"
+                      :limit="10"/>
+                    <div v-else>
+                      <el-link
+                        v-for="link in scope.row.accessory"
+                        :key="link.id"
+                        type="primary"
+                        :underline="false"
+                        @click="downloadFile(link)">
+                        {{ link.name }}
+                      </el-link>
+                    </div>
+                  </el-form-item>
 
-        </template>
-        <template v-slot:type="scope">
-          <el-form-item :prop="'detailsList.' + scope.$index + '.type'">
-            <el-select v-if="type!=='view'" v-model="scope.row.type" clearable>
-              <el-option v-for="item in typeList" :value="item.dictCode"
-                         :label="item.dictValue"></el-option>
-            </el-select>
-            <!--                <DictSelection v-if="type!=='view'" clearable dictName="客户/供应商资质类型" v-model="scope.row.type"-->
-            <!--                               @itemChange="(val)=>handleChangeType(val,scope.row)"></DictSelection>-->
-            <span v-else>{{ getLabelName(typeList, scope.row.type) }}</span>
-          </el-form-item>
+                </template>
+                <template v-slot:type="scope">
+                  <el-form-item :prop="'detailsList.' + scope.$index + '.type'">
+                    <el-select v-if="type!=='view'" v-model="scope.row.type" clearable>
+                      <el-option v-for="item in typeList" :value="item.dictCode"
+                                 :label="item.dictValue"></el-option>
+                    </el-select>
+                    <!--                <DictSelection v-if="type!=='view'" clearable dictName="客户/供应商资质类型" v-model="scope.row.type"-->
+                    <!--                               @itemChange="(val)=>handleChangeType(val,scope.row)"></DictSelection>-->
+                    <span v-else>{{ getLabelName(typeList, scope.row.type) }}</span>
+                  </el-form-item>
 
-        </template>
-        <template v-slot:level="scope">
-          <el-form-item :prop="'detailsList.' + scope.$index + '.level'">
-            <el-select v-if="type!=='view'" v-model="scope.row.level" clearable>
-              <el-option v-for="item in levelOptions" :value="item.dictCode"
-                         :label="item.dictValue"></el-option>
-            </el-select>
-            <!--                <DictSelection v-if="type!=='view'" clearable dictName="客户/供应商资质类型" v-model="scope.row.type"-->
-            <!--                               @itemChange="(val)=>handleChangeType(val,scope.row)"></DictSelection>-->
-            <span v-else>{{ getLabelName(levelOptions, scope.row.type) }}</span>
-          </el-form-item>
+                </template>
+                <template v-slot:level="scope">
+                  <el-form-item :prop="'detailsList.' + scope.$index + '.level'">
+                    <el-select v-if="type!=='view'" v-model="scope.row.level" clearable>
+                      <el-option v-for="item in levelOptions" :value="item.dictCode"
+                                 :label="item.dictValue"></el-option>
+                    </el-select>
+                    <!--                <DictSelection v-if="type!=='view'" clearable dictName="客户/供应商资质类型" v-model="scope.row.type"-->
+                    <!--                               @itemChange="(val)=>handleChangeType(val,scope.row)"></DictSelection>-->
+                    <span v-else>{{ getLabelName(levelOptions, scope.row.type) }}</span>
+                  </el-form-item>
 
-        </template>
-        <template v-slot:remark="scope">
-          <el-form-item :prop="'detailsList.' + scope.$index + '.remark'">
-            <el-input type="textarea" :disabled="type=='view'" v-model="scope.row.remark"></el-input>
-          </el-form-item>
-        </template>
-        <template v-slot:status="scope">
-          <el-form-item :prop="'detailsList.' + scope.$index + '.status'">
-            <el-tag v-if="scope.row.status" :type="statusTagTypeList[scope.row.status]">
-              {{ statusList[scope.row.status] }}
-            </el-tag>
-          </el-form-item>
-        </template>
-        <template v-slot:isRequired="{ column }">
-          <span class="is-required">{{ column.label }}</span>
-        </template>
-        <template v-slot:action="{ row, $index }">
-          <el-popconfirm
-            class="ele-action"
-            title="确定要删除该信息吗?"
-            @confirm="handleRemove($index)"
-          >
-            <template v-slot:reference>
-              <el-link
-                v-if="type!=='view'"
-                type="danger"
-                :underline="false"
-                icon="el-icon-delete"
-              >
-                删除
-              </el-link>
-            </template>
-          </el-popconfirm>
-        </template>
+                </template>
+                <template v-slot:remark="scope">
+                  <el-form-item :prop="'detailsList.' + scope.$index + '.remark'">
+                    <el-input type="textarea" :disabled="type=='view'" v-model="scope.row.remark"></el-input>
+                  </el-form-item>
+                </template>
+                <template v-slot:status="scope">
+                  <el-form-item :prop="'detailsList.' + scope.$index + '.status'">
+                    <el-tag v-if="scope.row.status" :type="statusTagTypeList[scope.row.status]">
+                      {{ statusList[scope.row.status] }}
+                    </el-tag>
+                  </el-form-item>
+                </template>
+                <template v-slot:isRequired="{ column }">
+                  <span class="is-required">{{ column.label }}</span>
+                </template>
+                <template v-slot:action="{ row, $index }">
+                  <el-popconfirm
+                    class="ele-action"
+                    title="确定要删除该信息吗?"
+                    @confirm="handleRemove($index)"
+                  >
+                    <template v-slot:reference>
+                      <el-link
+                        v-if="type!=='view'"
+                        type="danger"
+                        :underline="false"
+                        icon="el-icon-delete"
+                      >
+                        删除
+                      </el-link>
+                    </template>
+                  </el-popconfirm>
+                </template>
 
-      </ele-pro-table>
+              </ele-pro-table>
 
-    </el-form>
-    <!--    <el-tabs v-model="activeName" type="card">-->
-    <!--      <el-tab-pane label="证书资质" name="QC">-->
-    <!--     -->
+            </el-form>
 
-    <!--      </el-tab-pane>-->
-    <!--      <el-tab-pane v-if="form.processInstanceId" label="流程详情" name="processInstance">-->
-    <!--        <bpmDetail :id="form.processInstanceId"></bpmDetail>-->
-    <!--      </el-tab-pane>-->
-    <!--    </el-tabs>-->
-    <div slot="footer">
+          </el-tab-pane>
+          <el-tab-pane v-if="form.processInstanceId" label="流程详情" name="processInstance">
+            <bpmDetail :id="form.processInstanceId"></bpmDetail>
+          </el-tab-pane>
+        </el-tabs>
+    <div slot="footer" v-if="activeName=='QC'">
       <el-button v-if="type!=='view'" type="primary" @click="handleSave(false)">保存</el-button>
       <el-button v-if="type!=='view'" type="primary" plan @click="handleSave(true)">提交</el-button>
       <el-button @click="cancel">返回</el-button>
@@ -316,7 +316,7 @@ import {
   contactQcSubmit
 } from "@/api/qualification";
 import {getFile} from "@/api/system/file";
-import bpmDetail from "@/views/bpm/processInstance/detail.vue";
+import bpmDetail from "@/views/bpm/processInstance/businessDetail.vue";
 import {mapActions, mapGetters} from "vuex";
 import dictEnum from "@/enum/dict";
 import clientDialog from "@/views/factoryModel/qualificationManagement/components/clientDialog.vue";
@@ -335,6 +335,7 @@ export default {
     return {
       title: '',
       type: '',
+      activeName:'QC',
       qualificationOptions: [
         {
           label: '客户资质',

+ 240 - 0
src/views/versionManage/components/addOrEditDialog.vue

@@ -0,0 +1,240 @@
+<template>
+  <ele-modal custom-class="ele-dialog-form long-dialog-form"
+             :centered="true" :visible.sync="addOrEditDialogFlag" :title="title"
+             append-to-body
+             :close-on-click-modal="false" width="28%" :before-close="cancel">
+    <el-form ref="form" :model="form" :rules="rules" class="el-form-box" label-width="110px">
+      <headerTitle title="基本信息"/>
+      <el-row :gutter="12">
+        <el-col :span="12">
+          <div style="margin:0 0 10px 70px">
+            <span>示例</span>
+            <span style="color: red;margin-left: 10px">
+               {{ getExample }}
+             </span>
+          </div>
+        </el-col>
+      </el-row>
+      <el-row :gutter="12">
+        <el-col :span="24">
+          <el-form-item label="分类" prop="type">
+            <ele-tree-select
+              clearable
+              :data="typeList"
+              v-model="form.type"
+              placeholder="请选择"
+              valueKey="id"
+              labelKey="name"
+              childrenKey="subList"
+            />
+<!--            <el-select v-model="form.type" filterable style="width: 100%;" :disabled="type=='view'">-->
+<!--              <el-option v-for="item in typeList" :key="item.id" :value="item.id" :label="item.name"></el-option>-->
+<!--            </el-select>-->
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="12">
+        <el-col :span="24">
+          <el-form-item label="名称" prop="name">
+            <el-input v-model="form.name" :disabled="type=='view'"></el-input>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="12">
+        <el-col :span="16">
+          <el-form-item label="大版本采用" prop="noteType">
+            <el-select v-model="form.noteType" @change="handleNoteType" :disabled="type=='view'" style="width: 100%;">
+              <el-option :value="1" label="字母"></el-option>
+              <el-option :value="2" label="数字"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="位数" prop="noteNum" label-width="50px">
+            <el-select v-model="form.noteNum" style="width: 100%;" :disabled="type=='view'">
+              <el-option :value="1" label="1"></el-option>
+              <el-option :value="2" label="2"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="12">
+        <el-col :span="16">
+          <el-form-item label="大版本初始值" prop="note">
+            <el-input v-model="form.note" :disabled="type=='view'"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <span style="margin-left: 10px;line-height: 38px;color: red">默认字母A,数字1</span>
+        </el-col>
+      </el-row>
+      <el-row :gutter="12">
+        <el-col :span="16">
+          <el-form-item label="连接符" prop="mark">
+            <el-input v-model="form.mark" :disabled="type=='view'"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+        </el-col>
+      </el-row>
+      <el-row :gutter="12">
+        <el-col :span="16">
+          <el-form-item label="小版本初始值" prop="versionNumber">
+            <el-input type="number" v-model="form.versionNumber" :disabled="type=='view'"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="位数" prop="versionNum" label-width="50px">
+            <el-select v-model="form.versionNum" style="width: 100%;" :disabled="type=='view'">
+              <el-option :value="1" label="1"></el-option>
+              <el-option :value="2" label="2"></el-option>
+              <el-option :value="3" label="3"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="12">
+        <el-col :span="16">
+          <el-form-item label="变更后版本">
+            <el-select v-model="form.changeType" style="width: 100%;" :disabled="type=='view'">
+              <el-option :value="1" label="提升大版本"></el-option>
+              <el-option :value="2" label="提升小版本"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <div slot="footer">
+      <el-button v-if="type!=='view'" type="primary" @click="handleSave">保存</el-button>
+      <el-button @click="cancel">返回</el-button>
+    </div>
+  </ele-modal>
+</template>
+
+<script>
+import {getDetailsByIdAPI, versionManageSaveAPI, versionManageUpdateAPI} from "@/api/versionManage";
+import {getInfoById} from "@/api/classifyManage";
+
+export default {
+  name: "addOrEditDIalog",
+  props: {
+    addOrEditDialogFlag: Boolean,
+    typeList: {
+      type: Array,
+      default: () => {
+        return []
+      }
+    },
+  },
+  data() {
+    return {
+      title: '',
+      type: '',
+      form: {
+        id: '',
+        type: '',
+        name: '',
+        noteType: 1,
+        noteNum: 1,
+        note: 'A',
+        mark: '.',
+        versionNumber: '1',
+        versionNum: 1,
+        changeType: 1,
+      },
+
+    }
+  },
+  computed: {
+    getExample() {
+      let value = this.form.note || (this.form.noteType == 1 ? 'A' : '1')
+      return value + this.form.mark + this.form.versionNumber
+    },
+    rules() {
+      return {
+        type: [{required: true, message: '请选择', trigger: 'change'}],
+        name: [{required: true, message: '请输入', trigger: 'blur'}],
+        noteType: [{required: true, message: '请选择', trigger: 'change'}],
+        noteNum: [{required: true, message: '请选择', trigger: 'change'}],
+        mark: [
+          {required: true, message: '请输入', trigger: 'blur'},
+          {validator: this.markValidate, trigger: ['blur']},
+        ],
+        note: [{required: false, validator: this.noteValidate, trigger: 'blur'}],
+        versionNum: [
+          {required: true, message: '请输入', trigger: ['blur', 'change']},
+
+        ],
+        versionNumber: [
+          {required: true, message: '请输入', trigger: 'blur'},
+          {validator: this.versionNumValidate, trigger: ['blur', 'change']},
+        ],
+      }
+    }
+  },
+  methods: {
+    handleNoteType(val) {
+      this.form.note = val == 1 ? 'A' : '1'
+    },
+    noteValidate(rule, value, callback) {
+      if (!value) callback()
+      let regex = this.form.noteType == 1 ? `[A-Z]` : `[0-9]`
+      let regexA = new RegExp(`^${regex}{${this.form.noteNum}}$`)
+      if (!regexA.test(value)) {
+        callback(new Error('输入格式错误'))
+      }
+      callback()
+    },
+    versionNumValidate(rule, value, callback) {
+      if (!value) callback('请输入')
+      let regex = `[0-9]`
+      let regexA = new RegExp(`^${regex}{${this.form.versionNum}}$`)
+      if (!regexA.test(value)) {
+        callback(new Error('输入格式错误'))
+      }
+      callback()
+    },
+    markValidate(rule, value, callback) {
+      if (!value) callback('请输入')
+      const regex = /^[~*_\-:;,./]+$/;
+      if (!regex.test(value)) {
+        callback(new Error('输入格式错误,可选连接符(~ * _ \ - : ; , . /)'))
+      }
+      callback()
+    },
+    //页面初始化
+    init(type, row = {}) {
+      this.title = type == 'add' ? '新增' : type == 'edit' ? '修改' : '详情'
+      this.type = type
+      if (type !== 'add') {
+        this.getDetail(row.id)
+      }
+    },
+    async getDetail(id) {
+      this.loading = true;
+      this.form = await getDetailsByIdAPI(id);
+      this.loading = false;
+    },
+    handleSave() {
+      this.$refs.form.validate(async valid => {
+        if (!valid) return
+        const API = this.type == 'add' ? versionManageSaveAPI : versionManageUpdateAPI
+        await API(this.form)
+        this.$message.success('操作成功')
+        this.cancel()
+        this.$emit('reload')
+      })
+
+    },
+    //关闭弹窗
+    cancel() {
+      this.$emit('update:addOrEditDialogFlag', false)
+    },
+  }
+}
+</script>
+
+
+<style scoped lang="scss">
+
+</style>

+ 93 - 0
src/views/versionManage/components/index-search.vue

@@ -0,0 +1,93 @@
+<!-- 搜索表单 -->
+<template>
+  <el-form
+    label-width="77px"
+    class="ele-form-search"
+    @keyup.enter.native="search"
+    @submit.native.prevent
+  >
+    <el-row :gutter="15">
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="名称:">
+          <el-input clearable v-model="where.name" placeholder="请输入" />
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="分类" prop="type">
+          <!-- 单选 -->
+          <ele-tree-select
+            clearable
+            :data="typeList"
+            v-model="where.type"
+            placeholder="请选择"
+            valueKey="id"
+            labelKey="name"
+            childrenKey="subList"
+          />
+<!--          <el-select v-model="where.type" filterable style="width: 100%;" :disabled="type=='view'">-->
+<!--            <el-option v-for="item in typeList" :key="item.id" :value="item.id" :label="item.name"></el-option>-->
+<!--          </el-select>-->
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="组织机构:">
+          <auth-selection data-type="Array" v-model="where.deptIds" style="width: 100%"></auth-selection>
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <div class="ele-form-actions">
+          <el-button
+            type="primary"
+            icon="el-icon-search"
+            class="ele-btn-icon"
+            @click="search"
+          >
+            查询
+          </el-button>
+          <el-button @click="reset">重置</el-button>
+        </div>
+      </el-col>
+    </el-row>
+  </el-form>
+</template>
+<script>
+  export default {
+    data() {
+      // 默认表单数据
+      const defaultWhere = {
+        code: '',
+        name: '',
+      };
+      return {
+        // 表单数据
+        where: { ...defaultWhere },
+        controlList: []
+      };
+    },
+    props: {
+      typeList: {
+        type: Array,
+        default() {
+          return [];
+        }
+      }
+    },
+    computed: {
+      // 是否开启响应式布局
+      styleResponsive() {
+        return this.$store.state.theme.styleResponsive;
+      }
+    },
+    methods: {
+      /* 搜索 */
+      search() {
+        this.$emit('search', this.where);
+      },
+      /*  重置 */
+      reset() {
+        this.where = { ...this.defaultWhere };
+        this.search();
+      }
+    }
+  };
+</script>

+ 326 - 0
src/views/versionManage/index.vue

@@ -0,0 +1,326 @@
+<template>
+  <div class="ele-body">
+    <el-card shadow="never">
+      <!-- 搜索表单 -->
+      <index-search :typeList="typeList" @search="reload"/>
+      <!-- 数据表格 -->
+      <ele-pro-table
+        ref="table"
+        height="calc(100vh - 325px)"
+        :columns="columns"
+        :datasource="datasource"
+        :selection.sync="selection"
+        row-key="id"
+      >
+        <!-- 表头工具栏 -->
+        <template v-slot:toolbar>
+          <el-button
+            size="small"
+            type="primary"
+            icon="el-icon-plus"
+            class="ele-btn-icon"
+            @click="openEdit('','add')"
+          >
+            新建
+          </el-button>
+          <el-button
+            size="small"
+            type="danger"
+            icon="el-icon-delete"
+            class="ele-btn-icon"
+            @click="removeBatch"
+            plain
+          >
+            删除
+          </el-button>
+          <!--          <el-button-->
+          <!--            size="small"-->
+          <!--            type="primary"-->
+          <!--            icon="el-icon-upload2"-->
+          <!--            class="ele-btn-icon"-->
+          <!--            plain-->
+          <!--          >-->
+          <!--            导出-->
+          <!--          </el-button>-->
+          <!--          <el-button-->
+          <!--            size="small"-->
+          <!--            type="primary"-->
+          <!--            icon="el-icon-download"-->
+          <!--            class="ele-btn-icon"-->
+          <!--            plain-->
+          <!--          >-->
+          <!--            导入-->
+          <!--          </el-button>-->
+        </template>
+
+        <!-- 操作列 -->
+        <template v-slot:action="{ row }">
+          <el-link
+            v-if="row.status!=1"
+            type="primary"
+            :underline="false"
+            icon="el-icon-edit"
+            @click="openEdit(row,'edit')"
+          >
+            修改
+          </el-link>
+          <el-link
+            type="primary"
+            :underline="false"
+            icon="el-icon-setting"
+            @click="openEdit(row, 'view')"
+          >
+            详情
+          </el-link>
+          <el-popconfirm
+            v-if="row.status!=1"
+            class="ele-action"
+            title="确定要删除当前资质吗?"
+            @confirm="remove(row)"
+          >
+            <template v-slot:reference>
+              <el-link type="danger" :underline="false" icon="el-icon-delete">
+                删除
+              </el-link>
+            </template>
+          </el-popconfirm>
+        </template>
+        <template v-slot:status="scope">
+          <el-switch
+            @change="(val)=>handleStatus(scope,val)"
+            :active-value="1"
+            :inactive-value="0"
+            v-model="scope.row.status"
+            active-color="#13ce66"
+            inactive-color="#ff4949">
+          </el-switch>
+        </template>
+      </ele-pro-table>
+    </el-card>
+    <!-- 新增/编辑/详情弹窗 -->
+    <add-or-edit-dialog
+      :addOrEditDialogFlag.sync="addOrEditDialogFlag"
+      v-if="addOrEditDialogFlag"
+      ref="addOrEditDialogRef"
+      :data="current"
+      :typeList="typeList"
+      @reload="reload"
+    />
+  </div>
+</template>
+
+<script>
+import addOrEditDialog from './components/addOrEditDialog.vue';
+import dictMixins from '@/mixins/dictMixins';
+import FileUpload from "@/components/upload/fileUpload.vue";
+import {getFile} from "@/api/system/file";
+import {reviewStatus} from "@/enum/dict";
+import {getSubTwoLevelAPI, getVersionManagePageAPI, updateStatus, versionManageDeleteAPI} from "@/api/versionManage";
+import indexSearch from "@/views/versionManage/components/index-search.vue";
+import {getSubPage} from "@/api/classifyManage";
+
+export default {
+  name: 'technologyProduction',
+  components: {
+    FileUpload,
+    indexSearch,
+    addOrEditDialog
+  },
+  mixins: [dictMixins],
+  data() {
+    return {
+      levelOptions: [
+        {
+          label: '初级',
+          value: '1'
+        },
+        {
+          label: '中级',
+          value: '2'
+        },
+        {
+          label: '高级',
+          value: '3'
+        }
+      ],
+      isView: false,
+      // 表格列配置
+      columns: [
+        {
+          columnKey: 'selection',
+          type: 'selection',
+          width: 45,
+          align: 'center',
+          fixed: 'left'
+        },
+        {
+          label: '序号',
+          type: 'index',
+          width: 55,
+          align: 'center'
+        },
+        {
+          slot: 'name',
+          prop: 'name',
+          label: '名称',
+          showOverflowTooltip: true,
+          align: 'center',
+          minWidth: 110
+        },
+        {
+          slot: 'type',
+          prop: 'type',
+          label: '分类',
+          showOverflowTooltip: true,
+          align: 'center',
+          formatter: (_row, _column, cellValue) => {
+            /* && this.typeList.find(item => item.id == cellValue)?.name*/
+
+            return this.getTypeName(this.typeList, cellValue, (item) => item.id == cellValue)
+          },
+          minWidth: 110
+        },
+        {
+          slot: 'getExample',
+          prop: 'getExample',
+          label: '规则示例',
+          showOverflowTooltip: true,
+          align: 'center',
+          formatter: (_row, _column, cellValue) => {
+            let value = _row.note || (_row.noteType == 1 ? 'A' : '1')
+            return value + _row.mark + _row.versionNumber
+          },
+          minWidth: 120
+        },
+        {
+          label: '是否启用',
+          prop: 'status',
+          slot: 'status',
+          align: "center",
+          width: 120,
+        },
+        {
+          columnKey: 'action',
+          label: '操作',
+          width: 260,
+          align: 'center',
+          resizable: false,
+          slot: 'action',
+          showOverflowTooltip: true
+        }
+      ],
+      // 表格选中数据
+      selection: [],
+      // 当前编辑数据
+      current: null,
+      typeList: [],
+      // 是否显示编辑弹窗
+      addOrEditDialogFlag: false,
+    };
+  },
+  created() {
+    this.getTypeList()
+  },
+  computed: {},
+  methods: {
+    getTypeName(list, val, callBack) {
+      let find = list.find(item => callBack(item, val)) || {}
+      if (find.name) {
+        return find.name
+      } else {
+        for (let i = 0; i < list.length; i++) {
+          let find = list[i].subList.find(item => callBack(item, val)) || {}
+          if (find.name) {
+            return find.name
+          }
+        }
+      }
+    },
+    /* 表格数据源 */
+    async datasource({page, limit, where, order}) {
+      return await getVersionManagePageAPI({
+        ...where,
+        ...order,
+        pageNum: page,
+        size: limit
+      });
+    },
+    handleStatus(scope, val) {
+      let msg = val == 1 ? '是否启用该规则' : '是否关闭该规则'
+      this.$confirm(msg, '提示', {
+        type: 'warning'
+      }).then(async () => {
+        await updateStatus(
+          {
+            id: scope.row.id,
+            status: val
+          }
+        )
+        this.$message.success('操作成功')
+      }).catch(() => {
+        scope.row.status = val == 1 ? 0 : 1
+      })
+
+    },
+    async getTypeList() {
+      this.typeList = await getSubTwoLevelAPI({
+        parentId: 0,
+        pageNum: 1,
+        size: 9999
+      })
+
+      console.log(this.typeList);
+    },
+    downloadFile(file) {
+      getFile({objectName: file.storePath}, file.name);
+    },
+    /* 刷新表格 */
+    reload(where) {
+      this.$refs.table.reload({page: 1, where: where});
+    },
+    /* 打开编辑弹窗 */
+    openEdit(row = {}, type) {
+      this.addOrEditDialogFlag = true
+      this.$nextTick(() => {
+        this.$refs.addOrEditDialogRef.init(type, {...row})
+      })
+    },
+    /* 删除 */
+    remove(row) {
+      const loading = this.$loading({lock: true});
+      versionManageDeleteAPI([row.id])
+        .then((msg) => {
+          loading.close();
+          this.$message.success('删除成功');
+          this.reload();
+        })
+        .catch((e) => {
+          loading.close();
+          // this.$message.error(e.message);
+        });
+    },
+    /* 批量删除 */
+    removeBatch() {
+      if (!this.selection.length) return this.$message.error('请至少选择一条数据');
+      if (this.selection.some(item => item.status == 1)) return this.$message.error('启用状态的规则不允许删除!请检查');
+      this.$confirm('确定要删除选中的资质吗?', '提示', {
+        type: 'warning'
+      }).then(() => {
+        const loading = this.$loading({lock: true});
+        versionManageDeleteAPI(this.selection.map((d) => d.id))
+          .then((msg) => {
+            loading.close();
+            this.$message.success('删除成功');
+            this.reload();
+          })
+          .catch((e) => {
+            loading.close();
+            // this.$message.error(e.message);
+          });
+      })
+        .catch(() => {
+        });
+    }
+  }
+};
+</script>