Explorar o código

指标管理页面功能开发

jingshuyong hai 10 meses
pai
achega
1caea81c18

+ 68 - 39
src/api/regulationManagement/index.js

@@ -1,72 +1,101 @@
 import request from '@/utils/request';
 
-
 /**
  * 获取指标列表
  */
 export async function targetDefinitionPage(data) {
-    const res = await request.post(`/eom/target_definition/page `, data);
-    if (res.data.code == 0) {
-        return res.data.data;
-    }
-    return Promise.reject(new Error(res.data.message));
+  const res = await request.post(`/eom/target_definition/page `, data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
 }
 
 /**
  * 保存修改指标
  */
 export async function targetDefinitionSave(data) {
-    const res = await request.post(`/eom/target_definition/` +( data.id ? 'update' : 'save'), data);
-    if (res.data.code == 0) {
-        return res.data.data;
-    }
-    return Promise.reject(new Error(res.data.message));
+  const res = await request.post(
+    `/eom/target_definition/` + (data.id ? 'update' : 'save'),
+    data
+  );
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
 }
 
 // 删除指标
 export async function targetDefinitionDel(data) {
-    const res = await request.delete(`/eom/target_definition/delete`, {data});
-    if (res.data.code == 0) {
-        return res.data;
-    }
-    return Promise.reject(new Error(res.data.message));
+  const res = await request.delete(`/eom/target_definition/delete`, { data });
+  if (res.data.code == 0) {
+    return res.data;
+  }
+  return Promise.reject(new Error(res.data.message));
 }
 
 /**
  * 获取目标列表
  */
- export async function salesTargetPage(data) {
-    const res = await request.post(`/eom/sales_target/page`, data);
-    if (res.data.code == 0) {
-        return res.data.data;
-    }
-    return Promise.reject(new Error(res.data.message));
+export async function salesTargetPage(data) {
+  const res = await request.post(`/eom/sales_target/page`, data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
 }
 
 /**
  * 保存修改目标
  */
- export async function salesTargetSave(data) {
-    const res = await request.post(`/eom/sales_target/` +( data.id ? 'update' : 'save'), data);
-    if (res.data.code == 0) {
-        return res.data.data;
-    }
-    return Promise.reject(new Error(res.data.message));
+export async function salesTargetSave(data) {
+  const res = await request.post(
+    `/eom/sales_target/` + (data.id ? 'update' : 'save'),
+    data
+  );
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
 }
 // 删除指标
 export async function settlementAccountRemoveAPI(data) {
-    const res = await request.delete(`/eom/sales_target/delete`, {data});
-    if (res.data.code == 0) {
-        return res.data;
-    }
-    return Promise.reject(new Error(res.data.message));
+  const res = await request.delete(`/eom/sales_target/delete`, { data });
+  if (res.data.code == 0) {
+    return res.data;
+  }
+  return Promise.reject(new Error(res.data.message));
 }
 
 // 获取详情
 export async function getById(id) {
-    const res = await request.get(`/eom/sales_target/getById/${id}`);
-    if (res.data.code == 0) {
-      return res.data.data;
-    }
-    return Promise.reject(new Error(res.data.message));
-  }
+  const res = await request.get(`/eom/sales_target/getById/${id}`);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+// 获取 指标管理信息
+export async function getIndicatorRootNodeList() {
+  const res = await request.get(
+    `/main/indicatorManage/getIndicatorRootNodeList`
+  );
+
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+// 获取指标类型列表
+export async function getIndicatorTypeList() {
+  const res = await request.get(
+    `/main/indicatorManage/getIndicatorTypeList`
+  );
+
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}

+ 1 - 1
src/router/index.js

@@ -42,7 +42,7 @@ router.beforeEach((to, from, next) => {
         store.commit('user/setUserInfo', res);
       });
     }
-    console.log(!store.state.user.menus);
+    
     // 还未注册动态路由则先获取
     if (!store.state.user.menus) {
       store

+ 86 - 28
src/views/regulationManagement/components/addOrEditDialog.vue

@@ -21,14 +21,26 @@
       <headerTitle title="基本信息"></headerTitle>
       <el-row>
         <el-col :span="8">
-          <el-form-item label="编码" prop="code">
-            <el-input v-model="form.code" disabled></el-input>
+          <el-form-item label="名称" prop="name">
+            <el-input v-model="form.name"></el-input>
           </el-form-item>
         </el-col>
-
         <el-col :span="8">
-          <el-form-item label="名称" prop="name">
-            <el-input v-model="form.name"></el-input>
+          <el-form-item label="业务类型" prop="type">
+            <el-select
+              @change="buissChange"
+              v-model="form.type"
+              placeholder="请选择"
+              style="width: 100%"
+            >
+              <el-option
+                v-for="item in businessTypeList"
+                :key="item.value"
+                :label="item.name"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
           </el-form-item>
         </el-col>
         <el-col :span="8">
@@ -42,15 +54,19 @@
               <el-option
                 v-for="item in options"
                 :key="item.value"
-                :label="item.label"
+                :label="item.name"
                 :value="item.value"
               >
               </el-option>
             </el-select>
           </el-form-item>
         </el-col>
-
-        <el-col :span="24">
+        <el-col :span="8">
+          <el-form-item label="编码" prop="code">
+            <el-input v-model="form.code" disabled></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="16">
           <el-form-item label="描述" prop="describes">
             <el-input v-model="form.describes" type="textarea"></el-input>
           </el-form-item>
@@ -191,10 +207,14 @@
 </template>
 <script>
   import { mapGetters } from 'vuex';
-  import { targetDefinitionSave } from '@/api/regulationManagement/index.js';
+  import {
+    targetDefinitionSave,
+    getIndicatorRootNodeList
+  } from '@/api/regulationManagement/index.js';
   import {
     salesRegulationOption,
-    assessmentIndicatorsOptions
+    // assessmentIndicatorsOptions,
+    businessTypeList
   } from './util.js';
 
   const defForm = {
@@ -231,33 +251,46 @@
             value: '2'
           }
         ],
-        options: assessmentIndicatorsOptions,
+        businessTypeList: [],
+        // options: assessmentIndicatorsOptions,
+        options: [],
         rules: {
           name: { required: true, message: '请输入', trigger: 'change' },
           assessmentIndicators: {
             required: true,
             message: '请选择',
             trigger: 'change'
-          }
+          },
+          type: { required: true, message: '请选择', trigger: 'change' }
         }
       };
     },
-    created() {},
+    created() {
+      this.init();
+    },
     methods: {
+      async init() {
+        getIndicatorRootNodeList().then((res) => {
+          this.businessTypeList = res;
+        });
+      },
       //初始化
-      async open(row = {}, type) {
+      async open(row = {}, type, treeType) {
         this.addOrEditDialogFlag = true;
         this.title = type == 'add' ? '新增' : '修改';
         this.dialogType = type;
         if (type !== 'add') {
+          row.assessmentIndicators = Number(row.assessmentIndicators);
           this.form = JSON.parse(JSON.stringify(row));
           this.tableList = this.form.assessmentCriteria;
-          const { valueOption } = salesRegulationOption(
-            this.form.assessmentIndicators
-          );
-          this.valueOptions = valueOption;
+          this.buissChange(row.type, 'init');
+          this.salesChange(row.assessmentIndicators, 'init');
         } else {
           this.add();
+          if (treeType != -1) {
+            this.form.type = treeType;
+            this.buissChange(treeType);
+          }
         }
       },
       addItem(item) {
@@ -286,10 +319,33 @@
         ]);
       },
 
-      salesChange(val) {
-        const { valueOption, statusOption } = salesRegulationOption(val);
-        this.valueOptions = valueOption;
-        this.statusOptions = statusOption;
+      salesChange(val, type) {
+        let data = this.options.find((el) => el.value == val);
+        this.valueOptions = data.nodes;
+        this.statusOptions = data.equles;
+        if (type == 'init') {
+          return;
+        }
+        this.form.indicatorName = data.name;
+        this.tableList.forEach((item) => {
+          item.forEach((_item) => {
+            _item.status = [];
+            _item.statusOptions = [];
+            _item.value = '';
+          });
+        });
+      },
+
+      buissChange(val, type) {
+        let data = this.businessTypeList.find((el) => el.value == val);
+        this.options = data.nodes || [];
+        if (type == 'init') {
+          return;
+        }
+        this.form.typeName = data.name;
+        this.form.assessmentIndicators = '';
+        this.valueOptions = [];
+        this.statusOptions = [];
         this.tableList.forEach((item) => {
           item.forEach((_item) => {
             _item.status = [];
@@ -299,11 +355,11 @@
         });
       },
       valChange(item, val) {
-        const { statusOption } = salesRegulationOption(
-          this.form.assessmentIndicators,
-          item.value
-        );
-        val.statusOptions = statusOption;
+        // const { statusOption } = salesRegulationOption(
+        //   this.form.assessmentIndicators,
+        //   item.value
+        // );
+        val.statusOptions = item.equals;
         val.status = [];
       },
       //获取详情
@@ -316,7 +372,7 @@
           let isTrue = true;
           this.tableList.forEach((item) => {
             item.forEach((val) => {
-              if (!val.value || val.status.length == 0) {
+              if ((!val.value && val.value != 0) || val.status.length == 0) {
                 isTrue = false;
               }
             });
@@ -344,7 +400,9 @@
         this.form = {
           ...defForm
         };
+        this.options = [];
         this.tableList = [];
+        this.$refs['form'].resetFields();
         this.addOrEditDialogFlag = false;
       }
     }

+ 159 - 0
src/views/regulationManagement/components/leftTree.vue

@@ -0,0 +1,159 @@
+<template>
+  <div class="tree-wrapper">
+    <el-tree
+      :data="treeList"
+      :props="defaultProps"
+      v-loading="treeLoading"
+      :node-key="nodeKey"
+      ref="tree"
+      :highlight-current="true"
+      :expand-on-click-node="false"
+      @node-click="handleNodeClick"
+      v-bind="$attrs"
+      :default-expand-all="defaultExpandAll"
+    >
+    </el-tree>
+  </div>
+</template>
+
+<script>
+  import { getIndicatorTypeList } from '@/api/regulationManagement';
+  // let originId = '';
+  // let originType = '';
+  export default {
+    props: {
+      // treeList私有化处理
+      treeFormate: {
+        type: Function,
+        default: null
+      },
+      defaultProps: {
+        type: Object,
+        default: function () {
+          return {
+            children: 'children',
+            value: 'value',
+            label: 'name'
+          };
+        }
+      },
+      defaultExpandAll: {
+        type: Boolean,
+        default: function () {
+          return true;
+        }
+      },
+      // 初始请求treeList
+      init: {
+        type: Boolean,
+        default: true
+      },
+      id: {
+        type: String,
+        default: '0'
+      },
+      nodeKey: {
+        type: String,
+        default: 'id'
+      },
+      ids: {
+        type: String,
+        default: ''
+      }
+      // appendRoot: {
+      //   type: Boolean,
+      //   default: false
+      // },
+    },
+    data() {
+      return {
+        treeList: [],
+        treeLoading: false,
+        parentName: '',
+        parentId: '',
+        currentKey: ''
+      };
+    },
+    mounted() {
+      if (this.init) {
+        this.getTreeData();
+      }
+    },
+    methods: {
+      getInstance() {
+        return this.$refs.tree;
+      },
+      // 获取树结构数据
+      async getTreeData() {
+        try {
+          this.treeLoading = true;
+          const res = await getIndicatorTypeList();
+          this.treeLoading = false;
+          let data = [
+            {
+              name: '全部',
+              value: -1,
+              children: res
+            }
+          ];
+          console.log(data, 'data');
+          this.treeList = data;
+          this.$nextTick(() => {
+            // 默认高亮第一级树节点
+            if (this.treeList[0]) {
+              this.setCurrentKey(this.treeList[0].value);
+              this.handleNodeClick(this.treeList[0], 'init');
+            }
+          });
+          //   if (res?.code === '0') {
+          //     this.treeList = res.data;
+          //     this.$emit('setRootId', res.data[0].id);
+          //     if (this.treeFormate) {
+          //       this.treeList = this.treeFormate(this.treeList);
+          //     }
+          //     this.$nextTick(() => {
+          //       // 默认高亮第一级树节点
+          //       if (this.treeList[0]) {
+          //         this.setCurrentKey(this.treeList[0].id);
+          //         this.handleNodeClick(
+          //           this.treeList[0],
+          //           this.$refs.tree.getCurrentNode()
+          //         );
+          //       }
+          //     });
+          //     // return this.treeList;
+          //   }
+        } catch (error) {}
+        this.treeLoading = false;
+      },
+
+      handleNodeClick(data, type) {
+        this.$emit('handleNodeClick', data, type);
+      },
+      // 设置默认高亮行
+      setCurrentKey(id) {
+        this.currentKey = id;
+        this.$refs.tree.setCurrentKey(this.currentKey);
+      },
+
+      // 获取树的选中状态
+      getSelectList() {
+        const selectList = this.$refs.tree.getCurrentNode();
+        return selectList;
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+  .tree-wrapper {
+    width: 100%;
+    height: 100%;
+    overflow: auto;
+
+    :deep(.el-tree) {
+      display: inline-block;
+      min-width: 100%;
+    }
+  }
+</style>

+ 26 - 26
src/views/regulationManagement/components/searchTable.vue

@@ -15,9 +15,9 @@
         return [
           {
             label: '关键字:',
-            value: 'searchName',
+            value: 'keyword',
             type: 'input',
-            placeholder: '编码/名称/创建人'
+            placeholder: '编码/名称/考核指标'
           },
           {
             label: '编码:',
@@ -31,30 +31,30 @@
             type: 'input',
             placeholder: '请输入'
           },
-          {
-            label: '考核指标:',
-            value: 'assessmentIndicators',
-            width: 380,
-            type: 'select',
-            placeholder: '请选择状态',
-            planList: assessmentIndicatorsOptions
-          },
-          {
-            label: '创建人:',
-            value: 'createUsername',
-            width: 380,
-            type: 'input',
-            placeholder: '请输入'
-          },
-          {
-            label: '创建时间:',
-            value: 'createTime',
-            type: 'date',
-            dateType: 'datetimerange',
-            placeholder: '',
-            width: 380,
-            valueAr: ['createTimeStart', 'createTimeEnd']
-          }
+          // {
+          //   label: '考核指标:',
+          //   value: 'assessmentIndicators',
+          //   width: 380,
+          //   type: 'select',
+          //   placeholder: '请选择状态',
+          //   planList: assessmentIndicatorsOptions
+          // },
+          // {
+          //   label: '创建人:',
+          //   value: 'createUsername',
+          //   width: 380,
+          //   type: 'input',
+          //   placeholder: '请输入'
+          // },
+          // {
+          //   label: '创建时间:',
+          //   value: 'createTime',
+          //   type: 'date',
+          //   dateType: 'datetimerange',
+          //   placeholder: '',
+          //   width: 380,
+          //   valueAr: ['createTimeStart', 'createTimeEnd']
+          // }
         ];
       }
     },

+ 127 - 2
src/views/regulationManagement/components/util.js

@@ -2,7 +2,6 @@ import { number } from 'echarts';
 
 //指标定义获取option
 export function salesRegulationOption(assessmentIndicators, value) {
- 
   let valueOption = [],
     statusOption = [];
   if (assessmentIndicators == 1) {
@@ -231,6 +230,132 @@ export const assessmentIndicatorsOptions = [
   }
 ];
 
+//
+
+const qualificationList = [
+  {
+    label: '营业执照',
+    value: '1'
+  },
+  {
+    label: '药品生产许可证',
+    value: '2'
+  },
+  {
+    label: '药品经营许可证',
+    value: '3'
+  },
+  {
+    label: 'GMP证书',
+    value: '4'
+  },
+  {
+    label: 'GSP证书',
+    value: '5'
+  },
+  {
+    label: '法人委托书',
+    value: '6'
+  },
+  {
+    label: '签订委托生产质量协议授权委托书',
+    value: '7'
+  },
+  {
+    label: '医疗器械生产许可证',
+    value: '8'
+  },
+  {
+    label: '医疗器械产品注册证',
+    value: '9'
+  },
+  {
+    label: '第一类医疗器械生产备案凭证',
+    value: '10'
+  },
+  {
+    label: '第一类医疗器械产品备案凭证',
+    value: '11'
+  },
+  {
+    label: '医疗器械出口销售证明',
+    value: '12'
+  },
+  {
+    label: '体系认证证明',
+    value: '13'
+  },
+  {
+    label: '知识产权证书',
+    value: '14'
+  },
+  {
+    label: 'MDR注册证书',
+    value: '15'
+  },
+  {
+    label: '医疗器械生产品种登记汇总表',
+    value: '16'
+  }
+];
+
+// 业务类型列表
+export const businessTypeList = [
+  {
+    name: '销售指标',
+    value: 0,
+    type: 0,
+    childs: [
+      {
+        name: '回款额',
+        value: 1,
+        childs: [
+          {
+            name: '发票管理',
+            value: 1,
+            oprator: [
+              {
+                name: '属于',
+                value: 0
+              },
+              {
+                name: '不属于',
+                value: 0
+              }
+            ],
+            equles: [
+              {
+                name: '已开票',
+                value: 1
+              },
+              {
+                name: '未开票',
+                value: 1
+              }
+            ]
+          }
+        ]
+      },
+      {
+        name: '回款额2',
+        value: 2
+      },
+      {
+        name: '回款额3',
+        value: 3
+      },
+      {
+        name: '回款额4',
+        value: 4
+      },
+      {
+        name: '回款额5',
+        value: 5
+      }
+    ]
+  }
+];
+
 //目标tree
 export function getTargetManageTree(data, type) {
   let tree = {
@@ -427,7 +552,7 @@ export function renderSelect(h, data, form, children) {
     // { name: '万' },
     // { name: '百万' },
     { name: '元' },
-    { name: '万元' },
+    { name: '万元' }
   ];
   let disabled = false;
   if (!data.type) {

+ 35 - 16
src/views/regulationManagement/index.vue

@@ -110,13 +110,16 @@
 <script>
   import addOrEditDialog from './components/addOrEditDialog.vue';
   import searchTable from './components/searchTable.vue';
-  import { assessmentIndicatorsOptions } from './components/util.js';
+  import {
+    // assessmentIndicatorsOptions,
+    businessTypeList
+  } from './components/util.js';
   import {
     targetDefinitionPage,
     targetDefinitionDel
   } from '@/api/regulationManagement/index.js';
   import tabMixins from '@/mixins/tableColumnsMixin';
-  import AssetTree from '@/components/AssetTree';
+  import AssetTree from './components/leftTree.vue';
   export default {
     mixins: [tabMixins],
     components: {
@@ -132,7 +135,8 @@
         addOrEditDialogFlag: false,
         selection: [],
         cacheKeyUrl: 'mian-1ee05028-salesRegulation',
-        columnsVersion: 1
+        columnsVersion: 1,
+        treeType: -1
       };
     },
     computed: {
@@ -167,18 +171,27 @@
             align: 'center',
             showOverflowTooltip: true
           },
-
           {
             minWidth: 200,
-            prop: 'assessmentIndicators',
+            prop: 'typeName',
+            label: '业务类型',
+            slot: 'type',
+            align: 'center',
+            showOverflowTooltip: true
+            // formatter: (row, column, val) => {
+            //   return businessTypeList.find((item) => item.value == val)?.label;
+            // }
+          },
+          {
+            minWidth: 200,
+            prop: 'indicatorName',
             label: '考核指标',
             align: 'center',
-            showOverflowTooltip: true,
-            formatter: (row, column, val) => {
-              return assessmentIndicatorsOptions.find(
-                (item) => item.value == val
-              )?.label;
-            }
+            showOverflowTooltip: true
+            // formatter: (row, column, val) => {
+            //   let data = businessTypeList.find((item) => item.value == row.type);
+            //   return data.examineList.find((item) => item.value == val)?.label;
+            // }
           },
 
           // {
@@ -194,10 +207,9 @@
           // },
           {
             minWidth: 100,
-            prop: 'createTime',
+            prop: 'createUserName',
             label: '创建人',
             align: 'center',
-            slot: 'createTime',
             showOverflowTooltip: true
           },
           {
@@ -225,7 +237,7 @@
     methods: {
       //新增、修改
       handleAddOrEdit(row = {}, type) {
-        this.$refs.addOrEditDialogRef.open(row, type);
+        this.$refs.addOrEditDialogRef.open(row, type, this.treeType);
       },
       //新增、修改
       handleDetail(row = {}, type) {
@@ -240,7 +252,8 @@
         return targetDefinitionPage({
           pageNum: page,
           size: limit,
-          ...where
+          ...where,
+          type: this.treeType
         });
       },
 
@@ -275,7 +288,13 @@
           this.reload();
         });
       },
-
+      handleNodeClick(node, type) {
+        this.treeType = node.value;
+        if (type !== 'init') {
+          this.reload();
+        }
+        console.log(node, 'node 333');
+      },
       sub(res) {
         settlementAccountSubmit({
           businessId: res.id

+ 367 - 0
src/views/rulesManagement/releaseRules/components/permitAdd.vue

@@ -0,0 +1,367 @@
+<template>
+  <ele-modal
+    :title="dialogTitle"
+    :visible.sync="visible"
+    :before-close="handleClose"
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    width="80%"
+    :maxable="true"
+  >
+    <el-form label-width="115px" :model="formData">
+      <el-row>
+        <el-col :span="8">
+          <el-form-item
+            label="记录表分类"
+            prop="classification"
+            :rules="{
+              required: true,
+              message: '请选择记录表分类',
+              trigger: 'change'
+            }"
+          >
+            <el-select
+              style="width: 100%"
+              v-model="formData.classification"
+              placeholder="请选择"
+            >
+              <el-option
+                v-for="item in recordSheet"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="记录规则编码" prop="code" required>
+            <el-input v-model="formData.code" disabled></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="模块分类" prop="name" required>
+            <el-input v-model="formData.code" disabled></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item
+            label="模块分类"
+            prop="module"
+            :rules="{
+              required: true,
+              message: '请选择模块分类',
+              trigger: 'change'
+            }"
+          >
+            <el-select
+              style="width: 100%"
+              v-model="formData.classification"
+              placeholder="请选择"
+            >
+              <el-option
+                v-for="item in recordSheet"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="记录规则编码" prop="code" required>
+            <el-input v-model="formData.code" disabled></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="记录规则名称" prop="name" required>
+            <el-input v-model="formData.code" disabled></el-input>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <!-- <el-table
+        ref="multipleTable"
+        :data="formData.ruleItems"
+        tooltip-effect="dark"
+        border
+        :header-cell-style="{ background: '#F0F3F3' }"
+      ></el-table> -->
+      <ele-pro-table
+        ref="table"
+        :columns="bankColumns"
+        :datasource="formData.ruleItems"
+        :toolkit="[]"
+        :need-page="false"
+        row-key="id"
+        class="table_list"
+      >
+        <template v-slot:inspectionName="{ row, $index }">
+          <el-form-item
+            :prop="`ruleItems.${$index}.inspectionName`"
+            :rules="{
+              required: true,
+              message: '请输入名称',
+              trigger: 'change'
+            }"
+          >
+            <el-input
+              v-model="row.inspectionName"
+              placeholder="请输入"
+            ></el-input>
+          </el-form-item>
+        </template>
+        <template v-slot:textType="{ row, $index }">
+          <el-form-item
+            :prop="`ruleItems.${$index}.textType`"
+            :rules="{
+              required: true,
+              message: '请选择参数类型',
+              trigger: 'change'
+            }"
+          >
+            <el-select
+              v-model="row.textType"
+              placeholder="请选择"
+              class="ele-block"
+              style="width: 100%"
+            >
+              <el-option
+                v-for="item in textTypeList"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+        </template>
+        <template v-slot:operationGuide="{ row, $index }">
+          <div
+            class="operationGuide_box"
+            @click="openOperationGuideDialogDialog(row.operationGuide, $index)"
+          >
+            <div class="left_content">
+              <template v-if="row.operationGuide">
+                <div
+                  v-for="(item, index) in row.operationGuide.toolList"
+                  :key="item.id"
+                  >{{ index + 1 }}.{{ item.name }}</div
+                >
+              </template>
+            </div>
+            <div class="right_content">
+              <template v-if="row.operationGuide">
+                <div
+                  v-for="(item, index) in row.operationGuide.procedureList"
+                  :key="item.id"
+                  >{{ index + 1 }}.{{ item.content }}</div
+                >
+              </template>
+            </div>
+          </div>
+        </template>
+        <template v-slot:headerContacIndex="{ column }">
+          <el-button type="text" @click="addItem" icon="el-icon-plus"
+            >新增</el-button
+          >
+        </template>
+        <template v-slot:action="{ $index }">
+          <el-popconfirm
+            class="ele-action"
+            title="确定要删除当前数据吗?"
+            @confirm="itemDel($index)"
+          >
+            <template v-slot:reference>
+              <el-link type="danger" :underline="false" icon="el-icon-delete"
+                >删除</el-link
+              >
+            </template>
+          </el-popconfirm>
+        </template>
+      </ele-pro-table>
+    </el-form>
+    <operation-guideDialog ref="operationGuideDialog" @save="saveEdit" />
+  </ele-modal>
+</template>
+
+<script>
+  import OperationGuideDialog from '@/views/rulesManagement/matterRules/components/operationGuideDialog.vue';
+  export default {
+    components: { OperationGuideDialog },
+    computed: {
+      bankColumns() {
+        return [
+          {
+            columnKey: 'index',
+            slot: 'index',
+            label: '序号',
+            type: 'index',
+            headerSlot: 'headerContacIndex',
+            width: 75,
+            align: 'center'
+          },
+          {
+            slot: 'inspectionName',
+            label: '参数名称',
+            prop: 'inspectionName',
+            minWidth: 165,
+            align: 'center'
+          },
+          {
+            slot: 'textType',
+            label: '参数类型',
+            prop: 'textType',
+            width: 180,
+            align: 'center'
+          },
+          {
+            slot: 'operationGuide',
+            label: '操作指导',
+            prop: 'operationGuide',
+            width: 400,
+            align: 'center'
+          },
+          {
+            columnKey: 'action',
+            label: '操作',
+            width: 90,
+            align: 'center',
+            resizable: false,
+            slot: 'action'
+          }
+        ];
+      }
+    },
+    data() {
+      return {
+        dialogTitle: '',
+        visible: false,
+        formData: {
+          ruleItems: []
+        },
+        textTypeList: [
+          {
+            label: '数值',
+            value: '1'
+          },
+          {
+            label: '选择',
+            value: '2'
+          },
+          {
+            label: '上下限',
+            value: '3'
+          },
+          {
+            label: '规格',
+            value: '4'
+          },
+          {
+            label: '时间',
+            value: '5'
+          },
+          {
+            label: '范围',
+            value: '6'
+          },
+          {
+            label: '文本',
+            value: '7'
+          }
+        ],
+        recordSheet: [
+          {
+            value: '选项1',
+            label: '黄金糕'
+          },
+          {
+            value: '选项2',
+            label: '双皮奶'
+          },
+          {
+            value: '选项3',
+            label: '蚵仔煎'
+          },
+          {
+            value: '选项4',
+            label: '龙须面'
+          },
+          {
+            value: '选项5',
+            label: '北京烤鸭'
+          }
+        ] // 记录表
+      };
+    },
+    methods: {
+      open(row, type, title) {
+        this.visible = true;
+        this.dialogTitle = title;
+        this.type = type;
+      },
+      addItem() {
+        let obj = {
+          operationGuide: {
+            toolList: [],
+            procedureList: []
+          },
+          name: '123'
+        };
+        this.formData.ruleItems.push(obj);
+        console.log(this.formData.ruleItems, '000000000');
+      },
+      itemDel(index) {
+        this.formData.ruleItems.splice(index, 1);
+      },
+      /* 打开操作手册编辑款 */
+      openOperationGuideDialogDialog(row, index) {
+        this.$refs.operationGuideDialog.open(row, index);
+      },
+      saveEdit(data, index) {
+        this.$set(this.formData.ruleItems[index], 'operationGuide', data);
+      },
+      handleClose() {
+        this.visible = false;
+      }
+    }
+  };
+</script>
+
+<style scoped lang="scss">
+  .operationGuide_box {
+    width: 100%;
+    height: 48px;
+    display: flex;
+    overflow: hidden;
+    cursor: pointer;
+    box-sizing: border-box;
+    padding: 5px 10px;
+
+    .left_content {
+      width: 50%;
+      padding: 10px;
+      box-sizing: border-box;
+      border: 1px solid #c0c4cc;
+      border-radius: 10px;
+      margin-right: 10px;
+      overflow-y: auto;
+    }
+    .right_content {
+      flex: 1;
+      padding: 10px;
+      box-sizing: border-box;
+      border: 1px solid #c0c4cc;
+      border-radius: 10px;
+      overflow-y: auto;
+    }
+  }
+
+  ::v--deep .table_list {
+    .el-form-item {
+      .el-form-item__content{
+         margin-left: 0;
+      }
+    }
+  }
+</style>

+ 52 - 0
src/views/rulesManagement/releaseRules/components/search.vue

@@ -0,0 +1,52 @@
+<!-- 搜索表单 -->
+<template>
+  <seekPage :seekList="seekList" :formLength="3" @search="search"></seekPage>
+</template>
+
+<script>
+  export default {
+    props: {},
+    data() {
+      return {};
+    },
+    computed: {
+      // 表格列配置
+      seekList() {
+        return [
+          {
+            label: '规则编码:',
+            value: 'code',
+            type: 'input',
+            placeholder: '规则编码'
+          },
+          {
+            label: '规则名称:',
+            value: 'name',
+            type: 'input',
+            placeholder: '规则名称'
+          },
+          {
+            label: '记录表分类:',
+            value: 'fl',
+            type: 'input',
+            placeholder: '记录表分类'
+          },
+          {
+            label: '状态:',
+            value: 'status',
+            type: 'input',
+            placeholder: '状态'
+          }
+        ];
+      }
+    },
+    methods: {
+      /* 搜索 */
+      search(e) {
+        this.$emit('search', {
+          ...e
+        });
+      }
+    }
+  };
+</script>

+ 153 - 0
src/views/rulesManagement/releaseRules/index.vue

@@ -0,0 +1,153 @@
+<!-- <template>
+  <div class="ele-body">
+    <el-card shadow="never" v-loading="loading">
+      <search @search="reload" />
+      <ele-pro-table ref="table" :columns="columns" :datasource="datasource">
+        <template v-slot:toolbar>
+          <el-button
+            size="small"
+            type="primary"
+            icon="el-icon-plus"
+            class="ele-btn-icon"
+            @click="addPermit('', 'add', '新增记录规则')"
+          >
+            新建
+          </el-button>
+        </template>
+        <template v-slot:status="{ row }">
+        </template>
+        <template v-slot:action="{ row }">
+          <el-link
+            type="primary"
+            :underline="false"
+            icon="el-icon-finished"
+            @click="addPermit('clone', row)"
+          >
+            克隆
+          </el-link>
+          <el-link
+            type="primary"
+            :underline="false"
+            icon="el-icon-edit"
+            @click="addPermit('edit', row)"
+          >
+            修改
+          </el-link>
+          <el-popconfirm
+            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>
+      </ele-pro-table>
+    </el-card>
+    <permitAdd ref="permitAddRef" />
+  </div>
+</template>
+
+<script>
+  import { getList } from '@/api/ruleManagement/matter';
+  import search from './components/search.vue';
+  import permitAdd from './components/permitAdd.vue';
+  export default {
+    components: { search, permitAdd },
+    computed: {
+      columns() {
+        return [
+          {
+            columnKey: 'index',
+            label: '序号',
+            type: 'index',
+            width: 55,
+            align: 'center',
+            showOverflowTooltip: true,
+            fixed: 'left'
+          },
+          {
+            prop: 'code',
+            label: '记录规则编码',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'name',
+            label: '记录规则名称',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'fl',
+            label: '模块分类',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'bfl',
+            label: '记录表分类',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'createName',
+            label: '创建人',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'startTime',
+            label: '创建时间',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'status',
+            slot: 'status',
+            label: '状态',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            columnKey: 'action',
+            label: '操作',
+            width: 230,
+            align: 'center',
+            resizable: false,
+            slot: 'action'
+          }
+        ];
+      }
+    },
+    data() {
+      return {
+        loading: false
+      };
+    },
+    methods: {
+      addPermit(row, type, title) {
+        this.$refs.permitAddRef.open(row, type, title);
+      },
+      remove(row) {},
+      /* 表格数据源 */
+      datasource({ page, limit, where, order }) {
+        return getList({ pageNum: page, size: limit, ...where });
+      },
+      /* 刷新表格 */
+      reload(where) {
+        this.$refs.table.reload({ page: 1, where });
+      }
+    }
+  };
+</script> -->