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

工序管理新增 选择工作中心bug修复

jingshuyong 1 год назад
Родитель
Сommit
a451e879fe

+ 11 - 0
src/api/material/list.js

@@ -150,3 +150,14 @@ export async function exportFile(data) {
   });
   download(res.data, '产品/物品数据.xlsx');
 }
+
+export async function getProduceTreeByPid(parentId) {
+  console.log(parentId, '55555');
+  const res = await request.get(
+    `/main/categoryLevel/getProduceTreeByPid?type=${parentId}`
+  );
+  if (res.data.code == 0) {
+    return res.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}

+ 49 - 0
src/api/releasePermitRules/index.js

@@ -0,0 +1,49 @@
+import request from '@/utils/request';
+
+// 获取放行单规则频率单位列表
+export async function frequencyUnitList() {
+  const res = await request.get(`/main/releasePermitRules/frequencyUnitList`);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+
+// 保存放行单规则
+export async function releasePermitRules(data) {
+  const res = await request.post(`/main/releasePermitRules`,data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+// 更新放行单规则
+export async function updatePermitRules(data) {
+  const res = await request.post(`/main/releasePermitRules`,data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+
+
+// 分页查询放行单规则
+export async function getRulesList(params) {
+  const res = await request.get(`/main/releasePermitRules/page`,{params});
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+// 根据放行单规则ID查询事项
+export async function findByReleasePermitRulesId(id) {
+  const res = await request.get(`/main/releasePermitRules/item/findByReleasePermitRulesId/${id}`);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}

+ 236 - 0
src/views/rulesManagement/releaseRules/components/ProductModal.vue

@@ -0,0 +1,236 @@
+<template>
+  <ele-modal
+    :title="title"
+    :visible.sync="visible"
+    :before-close="handleClose"
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    append-to-body
+    width="70%"
+    :maxable="true"
+  >
+    <el-card shadow="never">
+      <ele-split-layout
+        width="236px"
+        allow-collapse
+        :right-style="{ overflow: 'hidden' }"
+      >
+        <div>
+          <div class="ele-border-lighter split-layout-right-content">
+            <el-tree
+              :data="treeList"
+              :props="defaultProps"
+              ref="treeRef"
+              :default-expanded-keys="categoryId ? [categoryId] : []"
+              :highlight-current="true"
+              node-key="id"
+              @node-click="handleNodeClick"
+            ></el-tree>
+          </div>
+        </div>
+
+        <!-- 数据表格 -->
+        <template v-slot:content>
+          <ProductSearch @search="reload" ref="searchRef" />
+          <ele-pro-table
+            style="min-height: 400px"
+            ref="table"
+            :columns="columns"
+            :datasource="datasource"
+            :selection.sync="selection"
+            row-key="id"
+          >
+          </ele-pro-table>
+        </template>
+      </ele-split-layout>
+    </el-card>
+
+    <div class="rx-sc">
+      <el-button type="primary" size="small" @click="selected">选择</el-button>
+      <el-button size="small" @click="handleClose">关闭</el-button>
+    </div>
+  </ele-modal>
+</template>
+
+<script>
+  import ProductSearch from './product-search.vue';
+  import { getMaterialList, getProduceTreeByPid } from '@/api/material/list';
+  export default {
+    components: {
+      ProductSearch
+    },
+    data() {
+      return {
+        visible: false,
+        title: '选择工具',
+
+        categoryLevelId: null,
+        categoryId: 1,
+        treeList: [],
+        treeLoading: false,
+
+        defaultProps: {
+          children: 'children',
+          label: 'name'
+        },
+        type: null,
+
+        // 表格列配置
+        columns: [
+          {
+            columnKey: 'selection',
+            type: 'selection',
+            width: 45,
+            align: 'center',
+            selectable: (row, index) => {
+              return !this.processData.some((it) => row.id == it.categoryId);
+            },
+            reserveSelection: true,
+            fixed: 'left'
+          },
+
+          {
+            label: '物料名称',
+            prop: 'name'
+          },
+
+          {
+            label: '物料编码',
+            prop: 'code'
+          },
+          {
+            label: '牌号',
+            prop: 'brandNum'
+          },
+          {
+            label: '型号',
+            prop: 'modelType'
+          },
+
+          {
+            prop: 'availableCountBase',
+            label: '包装库存',
+            sortable: 'custom'
+          },
+          {
+            label: '单位',
+            prop: 'weightUnit'
+          },
+
+          {
+            prop: 'packingCountBase',
+            label: '计量库存',
+            sortable: 'custom'
+          },
+
+          {
+            label: '计量单位',
+            prop: 'unit'
+          },
+
+          {
+            label: '数量',
+            prop: 'count'
+          }
+        ],
+
+        // 表格选中数据
+        selection: [],
+
+        processData: [],
+        current: null
+      };
+    },
+
+    watch: {},
+    methods: {
+      /* 表格数据源 */
+      async datasource({ page, limit, where }) {
+        const res = await getMaterialList({
+          ...where,
+          pageNum: page,
+          size: limit,
+          categoryLevelId: this.categoryLevelId
+        });
+        return res;
+      },
+
+      open(item) {
+        this.processData = item || [];
+        this.visible = true;
+
+        this.getTreeData();
+      },
+
+      async getTreeData() {
+        try {
+          this.treeLoading = true;
+
+          const res = await getProduceTreeByPid(5);
+          this.treeLoading = false;
+          if (res?.code === '0') {
+            this.treeList = res.data;
+
+            this.$nextTick(() => {
+              // 默认高亮第一级树节点
+              if (this.treeList[0]) {
+                this.rootTreeId = this.treeList[0].id;
+                this.$nextTick(() => {
+                  this.$refs.treeRef.setCurrentKey(this.treeList[0].id);
+                });
+              }
+            });
+            return this.treeList;
+          }
+        } catch (error) {}
+        this.treeLoading = false;
+      },
+
+      handleNodeClick(data) {
+        this.categoryLevelId = data.id;
+        this.$refs.table.reload({ pageNum: 1, where: {} });
+      },
+
+      /* 刷新表格 */
+      reload(where) {
+        this.$refs.table.reload({ page: 1, where: where });
+      },
+
+      handleClose() {
+        this.visible = false;
+        this.$refs.table.setSelectedRows([]);
+        this.selection = [];
+      },
+      selected() {
+        let _arr = [];
+        if (!this.selection.length) {
+          this.$message.error('请至少选择一条数据');
+          return;
+        }
+
+        _arr = this.selection.map((m) => {
+          m.categoryId = m.id;
+          delete m.id;
+          return {
+            ...m
+          };
+        });
+
+        this.$emit('chooseModal', _arr);
+        this.handleClose();
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+  .rx-sc {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+  }
+
+  .ml60 {
+    margin-left: 60px;
+  }
+</style>

+ 563 - 0
src/views/rulesManagement/releaseRules/components/details.vue

@@ -0,0 +1,563 @@
+<!-- 用户编辑弹窗 -->
+<template>
+  <ele-modal
+    width="1000px"
+    :visible="visible"
+    :append-to-body="true"
+    :close-on-click-modal="false"
+    custom-class="ele-dialog-form"
+    :title="isUpdate ? '修改' : '新增'"
+    @update:visible="updateVisible"
+    :maxable="true"
+  >
+    <header-title title="基本信息"></header-title>
+    <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+      <el-row>
+        <el-col :span="12">
+          <el-form-item label="参数名称:" prop="name">
+            <el-input v-model="form.name" clearable placeholder="请输入" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="参数编码:">
+            <el-input
+              clearable
+              disabled
+              v-model="form.code"
+              placeholder="请输入"
+            />
+          </el-form-item>
+        </el-col>
+      </el-row>
+
+      <el-row>
+        <el-col :span="12">
+          <el-form-item label="参数类型:" prop="paramType">
+            <el-select
+              v-model="form.paramType"
+              placeholder="请选择"
+              class="ele-block"
+              style="width: 100%"
+              @change="changeTextChange"
+            >
+              <el-option label="数值" :value="'1'" />
+              <el-option label="选择" :value="'2'" />
+              <el-option label="上下限" :value="'3'" />
+              <el-option label="规格" :value="'4'" />
+              <el-option label="时间" :value="'5'" />
+              <el-option label="范围" :value="'6'" />
+              <el-option label="文本" :value="'7'" />
+              <el-option label="枚举" :value="'8'" />
+            </el-select>
+          </el-form-item>
+        </el-col>
+
+        <el-col
+          :span="12"
+          v-if="
+            form.paramType == 1 || form.paramType == 4 || form.paramType == 5
+          "
+        >
+          <el-form-item label="默认值:">
+            <DictSelection
+              style="width: 100px"
+              clearable
+              dictName="数学字符"
+              v-model="form.numberOperator"
+            ></DictSelection>
+            <el-input
+              v-model="form.defaultVal"
+              :placeholder="form.paramType == '1' ? '请输入数字' : '请输入'"
+              style="width: calc(100% - 100px)"
+              @input="defaultInput"
+            ></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="24" v-if="form.paramType == 7">
+          <el-form-item label="默认值:" prop="defaultVal">
+            <el-input v-model="form.defaultVal" type="textarea"> </el-input>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12" v-if="form.paramType == 2">
+          <el-form-item label="默认值:" prop="defaultVal">
+            <DictSelection
+              style="width: 100px"
+              clearable
+              dictName="数学字符"
+              v-model="form.numberOperator"
+            ></DictSelection>
+            <el-select
+              v-model="form.defaultVal"
+              placeholder="请选择"
+              class="ele-block"
+            >
+              <el-option label="TRUE" :value="'TRUE'" />
+              <el-option label="FALSE" :value="'FALSE'" />
+            </el-select>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12" v-if="form.paramType == 6">
+          <el-form-item label="默认值:">
+            <DictSelection
+              style="width: 100px"
+              clearable
+              dictName="数学字符"
+              v-model="form.numberOperator"
+            ></DictSelection>
+            <el-input
+              v-model="form.defaultVal"
+              placeholder="案例: 12.7≤IC<19.05 ;IC<12.7"
+              style="width: calc(100% - 100px)"
+            ></el-input>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12" v-if="form.paramType == 3">
+          <el-form-item label="参数上限:">
+            <el-input placeholder="请输入" v-model="form.upperLimit" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12" v-if="form.paramType == 3">
+          <el-form-item label="参数下限:">
+            <el-input placeholder="请输入" v-model="form.lowerLimit" />
+          </el-form-item>
+        </el-col>
+        <el-col
+          :span="12"
+          v-if="
+            form.paramType != 2 && form.paramType != 5 && form.paramType != 8
+          "
+        >
+          <el-form-item
+            label="参数单位:"
+            prop="paramUnit"
+            :rules="[
+              {
+                required: form.paramType == 7 ? false : true,
+                message: '请选择参数单位',
+                trigger: 'change'
+              }
+            ]"
+          >
+            <DictSelection
+              dictName="工艺参数单位"
+              clearable
+              filterable
+              v-model="form.paramUnit"
+            >
+            </DictSelection>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12" v-if="form.paramType == 5">
+          <el-form-item label="参数单位:" prop=""> h(小时) </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="状态:" prop="enable">
+            <el-select
+              v-model="form.enable"
+              placeholder="请选择"
+              style="width: 100%"
+            >
+              <el-option label="停用" :value="false" />
+              <el-option label="启用" :value="true" />
+            </el-select>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="24">
+          <el-form-item label="备注:" prop="remarks	">
+            <el-input
+              placeholder="请输入"
+              v-model="form.remarks"
+              type="textarea"
+            />
+          </el-form-item>
+        </el-col>
+      </el-row>
+
+      <headerTitle title="操作工具">
+        <el-button type="primary" size="small" @click="handleAdd"
+          >新增</el-button
+        >
+      </headerTitle>
+
+      <el-table
+        ref="multipleTable"
+        :data="form.tools"
+        tooltip-effect="dark"
+        style="width: 100%"
+        stripe
+        :header-cell-style="{ background: '#EEEEEE', border: 'none' }"
+      >
+        <el-table-column label="设备名称" prop="name" min-width="120">
+          <template slot-scope="{ row }">
+            {{ row.name }}
+          </template></el-table-column
+        >
+
+        <el-table-column label="设备编码" prop="code" min-width="120">
+          <template slot-scope="{ row }">
+            {{ row.code }}
+          </template></el-table-column
+        >
+
+        <el-table-column label="牌号" prop="brandNum" min-width="120">
+          <template slot-scope="{ row }">
+            {{ row.brandNum }}
+          </template></el-table-column
+        >
+
+        <el-table-column label="型号" prop="modelType" min-width="120">
+          <template slot-scope="{ row }">
+            {{ row.model }}
+          </template></el-table-column
+        >
+
+        <el-table-column label="操作" fixed="right">
+          <template slot-scope="{ $index, row }">
+            <el-button type="text" @click="removeItem($index, row)"
+              >删除设备</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <headerTitle title="注意事项">
+        <el-button type="primary" size="small" @click="addPostscript"
+          >新增</el-button
+        >
+      </headerTitle>
+
+      <el-table
+        ref="multipleTable"
+        :data="form.notes"
+        tooltip-effect="dark"
+        style="width: 100%"
+        stripe
+        :header-cell-style="{ background: '#EEEEEE', border: 'none' }"
+      >
+        <el-table-column label="排序" prop="" width="140">
+          <template slot-scope="{ row }">
+            <el-input
+              placeholder="请输入"
+              type="number"
+              v-model.number="row.sortOrder"
+              clearable
+            ></el-input> </template
+        ></el-table-column>
+
+        <el-table-column label="注意事项" prop="" min-width="120">
+          <template slot-scope="{ row }">
+            <el-input
+              placeholder="请输入"
+              type="textarea"
+              :rows="1"
+              v-model="row.content"
+              clearable
+            ></el-input> </template
+        ></el-table-column>
+
+        <el-table-column label="操作" fixed="right" width="100">
+          <template slot-scope="{ $index, row }">
+            <el-button type="text" @click="removePostscript($index, row)"
+              >删除</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-form>
+
+    <template v-slot:footer>
+      <el-button @click="updateVisible(false)">取消</el-button>
+      <el-button type="primary" @click="save"> 保存 </el-button>
+    </template>
+
+    <ProductModal ref="productRefs" @chooseModal="chooseModal" />
+  </ele-modal>
+</template>
+
+<script>
+  import ProductModal from './ProductModal.vue';
+  export default {
+    components: {
+      ProductModal
+    },
+
+    props: {
+      //   弹窗是否打开
+      visible: Boolean,
+      //   修改回显的数据
+      data: Object,
+      dataIndex: {
+        type: Number,
+        default: null
+      }
+    },
+    data() {
+      const defaultForm = {
+        id: null,
+        // code: '',
+        name: '',
+        paramType: '8',
+        defaultVal: '',
+        upperLimit: '',
+        lowerLimit: '',
+        paramUnit: '',
+        enable: true,
+        numberOperator: '',
+        remarks: '',
+        tools: [],
+        notes: []
+      };
+      return {
+        defaultForm,
+        // 表单数据
+        form: { ...defaultForm },
+
+        qualityStandardList: [],
+        // 表单验证规则
+        rules: {
+          name: [
+            { required: true, message: '请输入质检名称', trigger: 'blur' }
+          ],
+          fillTypes: [
+            { required: true, message: '请选择填写类型', trigger: 'change' }
+          ],
+
+          paramType: [
+            { required: true, message: '请选择参数类型', trigger: 'change' }
+          ]
+        },
+        // 记录类型
+        recordList: [
+          {
+            value: '1',
+            label: '工艺参数类'
+          },
+          {
+            value: '2',
+            label: '生产检查类'
+          },
+          {
+            value: '3',
+            label: '合同文档类'
+          },
+          {
+            value: '4',
+            label: '环境检查类'
+          },
+          {
+            value: '5',
+            label: '质量检验类'
+          },
+          {
+            value: '6',
+            label: '资质证照类'
+          },
+          {
+            value: '7',
+            label: '设备监测类'
+          }
+        ],
+        // 提交状态
+        loading: false,
+        // 是否是修改
+        isUpdate: false
+      };
+    },
+    computed: {
+      // 是否开启响应式布局
+      styleResponsive() {
+        return this.$store.state.theme.styleResponsive;
+      },
+      fillType() {
+        return [
+          { value: 1, label: '枚举' },
+          { value: 2, label: '文本' }
+        ];
+      }
+    },
+
+    created() {
+      this.getListFn();
+    },
+    methods: {
+      changeTextChange() {
+        this.form.numberOperator = '';
+        this.form.defaultVal = '';
+        this.form.upperLimit = '';
+        this.form.lowerLimit = '';
+        this.form.paramUnit = '';
+      },
+
+      recordChange(val) {
+        let data = this.recordList.find((el) => el.value === val);
+        this.form.recordName = data.label;
+      },
+      changeFill(val) {
+        let data = this.fillType.find((el) => el.value === val);
+        this.form.fillTypeName = data.label;
+      },
+      defaultInput(value) {
+        if (this.form.paramType !== '1') {
+          return;
+        }
+        // 1. 过滤非法字符(只保留数字、负号和小数点)
+        let filteredValue = value.replace(/[^0-9.-]/g, '');
+        // 2. 处理负号规则
+        const minusIndex = filteredValue.indexOf('-');
+        if (minusIndex > 0) {
+          // 负号不在首位则删除所有负号
+          filteredValue = filteredValue.replace(/-/g, '');
+        } else if (minusIndex === 0) {
+          // 保留首位的负号并移除其他负号
+          filteredValue = '-' + filteredValue.substring(1).replace(/-/g, '');
+        }
+
+        // 3. 处理小数点规则
+        const dotIndex = filteredValue.indexOf('.');
+        if (dotIndex !== -1) {
+          // 只保留第一个小数点,移除后续小数点
+          const parts = filteredValue.split('.');
+          filteredValue = parts[0] + '.' + parts.slice(1).join('');
+        }
+        // 4. 更新绑定值
+        this.form.defaultVal = filteredValue;
+      },
+      /* 保存编辑 */
+      save() {
+        this.$refs.form.validate((valid) => {
+          if (!valid) {
+            return false;
+          }
+          if (!this.isUpdate) {
+            delete this.form.id;
+          }
+          const defaultVal = Number(this.form.defaultVal);
+          const upperLimit = Number(this.form.upperLimit);
+          const lowerLimit = Number(this.form.lowerLimit);
+          if ((defaultVal != '') & (upperLimit != '')) {
+            if (defaultVal > upperLimit || defaultVal == upperLimit) {
+              return this.$message.warning('默认值应小于参数上限');
+            }
+          }
+          if ((defaultVal != '') & (lowerLimit != '')) {
+            if (defaultVal < lowerLimit || defaultVal == lowerLimit) {
+              return this.$message.warning('默认值应大于参数下限');
+            }
+          }
+          if ((upperLimit != '') & (lowerLimit != '')) {
+            if (upperLimit < lowerLimit || upperLimit == lowerLimit) {
+              return this.$message.warning('参数上限应大于参数下限');
+            }
+          }
+          if (this.form.paramType == 5) {
+            this.form.paramUnit = 'h';
+          }
+          let data = JSON.parse(JSON.stringify(this.form));
+          this.form = {};
+          this.updateVisible(false);
+          this.$emit('done', data, this.dataIndex);
+        });
+      },
+      /* 更新visible */
+      updateVisible(value) {
+        this.$emit('update:visible', value);
+      },
+
+      getListFn() {
+        let param = {
+          pageNum: 1,
+          size: -1
+        };
+
+        // getList(param).then((res) => {
+        //   this.qualityStandardList = res.list;
+        // });
+      },
+
+      handleAdd() {
+        this.$refs.productRefs.open(this.form.tools);
+      },
+
+      chooseModal(data) {
+        console.log(data);
+        let list = data.map((item) => {
+          return {
+            name: item.name,
+            code: item.code,
+            brandNumber: item.brandNum,
+            model: item.modelType,
+            toolId: item.categoryId
+          };
+        });
+        this.form.tools = [...this.form.tools, ...list];
+      },
+
+      removeItem(idx, row) {
+        this.$confirm(`是否删除这个设备?`).then(async () => {
+          this.form.tools.splice(idx, 1);
+
+          if (row.id) {
+            this.form.toolRemoveIds.push(row.id);
+          }
+        });
+      },
+
+      addPostscript() {
+        this.form.notes.push({ sortOrder: null, content: '' });
+      },
+      removePostscript(idx, row) {
+        this.$confirm(`是否删除这个注意事项?`).then(async () => {
+          this.form.notes.splice(idx, 1);
+          if (row.id) {
+            this.form.postscriptRemoveIds.push(row.id);
+          }
+        });
+      },
+      init() {}
+    },
+
+    watch: {
+      async visible(visible) {
+        if (visible) {
+          if (this.data && this.data.name) {
+            this.$util.assignObject(this.form, {
+              ...this.data
+            });
+            this.isUpdate = true;
+          } else {
+            this.isUpdate = false;
+          }
+        } else {
+          this.$refs.form.clearValidate();
+          this.form = { ...this.defaultForm };
+        }
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+  .btn_case {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    margin: 6px 0;
+
+    span {
+      display: inline-block;
+      margin: 0 10px;
+      font-size: 18px;
+      cursor: pointer;
+    }
+  }
+
+  ::v-deep .el-form-item__content {
+    display: flex !important;
+  }
+</style>

+ 298 - 193
src/views/rulesManagement/releaseRules/components/permitAdd.vue

@@ -8,12 +8,12 @@
     width="80%"
     :maxable="true"
   >
-    <el-form label-width="115px" :model="formData">
+    <el-form label-width="115px" :model="formData" ref="formRef">
       <el-row>
         <el-col :span="8">
           <el-form-item
-            label="记录表分类"
-            prop="classification"
+            label="记录规则分类"
+            prop="classifyId"
             :rules="{
               required: true,
               message: '请选择记录表分类',
@@ -22,7 +22,7 @@
           >
             <el-select
               style="width: 100%"
-              v-model="formData.classification"
+              v-model="formData.classifyId"
               placeholder="请选择"
             >
               <el-option
@@ -35,59 +35,57 @@
             </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-col :span="7">
+          <el-form-item label="规则编码" prop="name">
+            <el-input
+              v-model="formData.code"
+              size="small"
+              :disabled="true"
+            ></el-input>
           </el-form-item>
         </el-col>
-        <el-col :span="8">
+        <el-col :span="6">
           <el-form-item
-            label="模块分类"
-            prop="module"
+            label="规则名称"
+            prop="name"
             :rules="{
               required: true,
-              message: '请选择模块分类',
+              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-input
+              v-model="formData.name"
+              placeholder="请输入"
+              size="small"
+            ></el-input>
           </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-col :span="5">
+          <el-form-item label="状态" label-width="70px" required>
+            <el-switch
+              v-model="formData.enable"
+              active-text="生效"
+              inactive-text="失效"
+              :active-value="true"
+              :inactive-value="false"
+            >
+            </el-switch>
           </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-col :span="24">
+          <el-form-item label="周期" required>
+            <RuleCycle
+              ref="cycleMultipleRef"
+              :isOnce="true"
+              :formData="formData"
+              pageType="1"
+              :isBindPlan="false"
+            />
           </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"
@@ -97,76 +95,55 @@
         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'
-            }"
+        <template v-slot:toolbar>
+          <el-button
+            size="small"
+            type="primary"
+            icon="el-icon-plus"
+            class="ele-btn-icon"
+            @click="add({})"
           >
-            <el-input
-              v-model="row.inspectionName"
-              placeholder="请输入"
-            ></el-input>
-          </el-form-item>
+            新建
+          </el-button>
         </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 }">
+        <template v-slot:tools="{ row }">
           <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>
+            style="display: inline-block"
+            v-for="(item, idx) in row.tools"
+            :key="idx"
+            >{{ item.name }}
+            <span v-if="row.tools && idx != row.tools.length - 1">, </span>
           </div>
         </template>
-        <template v-slot:headerContacIndex="{ column }">
-          <el-button type="text" @click="addItem" icon="el-icon-plus"
-            >新增</el-button
-          >
+        <template v-slot:textType="{ row }">
+          {{
+            row.textType == 1
+              ? '数值'
+              : row.textType == 2
+              ? '选择'
+              : row.textType == 3
+              ? '上下限'
+              : row.textType == 4
+              ? '规格'
+              : row.textType == 5
+              ? '时间'
+              : row.textType == 6
+              ? '范围'
+              : row.textType == 7
+              ? '文本'
+              : row.textType == 8
+              ? '枚举'
+              : ''
+          }}
         </template>
-        <template v-slot:action="{ $index }">
+        <template v-slot:action="{ row, $index }">
+          <el-link
+            type="primary"
+            @click="edit(row, $index)"
+            :underline="false"
+            icon="el-icon-edit"
+            >编辑</el-link
+          >
           <el-popconfirm
             class="ele-action"
             title="确定要删除当前数据吗?"
@@ -182,50 +159,152 @@
       </ele-pro-table>
     </el-form>
     <operation-guideDialog ref="operationGuideDialog" @save="saveEdit" />
+    <Details
+      ref="userEdit"
+      :visible.sync="showEdit"
+      :data="current"
+      :dataIndex="dataIndex"
+      @done="save"
+    />
+    <template v-slot:footer>
+      <el-button :loading="btnLoading" @click="handleClose">取消</el-button>
+      <el-button :loading="btnLoading" type="primary" @click="confirm"> 保存 </el-button>
+    </template>
   </ele-modal>
 </template>
 
 <script>
+  import { getByCode } from '@/api/system/dictionary-data';
+  // import RuleCycle from '../../matterRules/components/rule-cycle.vue';
+  import RuleCycle from './rule-cycle.vue';
   import OperationGuideDialog from '@/views/rulesManagement/matterRules/components/operationGuideDialog.vue';
+  import Details from './details.vue';
+  import { releasePermitRules,updatePermitRules } from '@/api/releasePermitRules/index';
   export default {
-    components: { OperationGuideDialog },
+    components: { OperationGuideDialog, RuleCycle, Details },
     computed: {
       bankColumns() {
+        // return [
+        //   {
+        //     columnKey: 'index',
+        //     slot: 'index',
+        //     label: '序号',
+        //     type: 'index',
+        //     headerSlot: 'headerContacIndex',
+        //     width: 75,
+        //     align: 'center'
+        //   },
+        //   {
+        //     slot: 'record',
+        //     label: '记录类型',
+        //     prop: 'record',
+        //     minWidth: 165,
+        //     align: 'center'
+        //   },
+        //   {
+        //     slot: 'code',
+        //     label: '编码',
+        //     prop: 'code',
+        //     minWidth: 165,
+        //     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'
+        //   }
+        // ];
+
         return [
           {
-            columnKey: 'index',
-            slot: 'index',
-            label: '序号',
-            type: 'index',
-            headerSlot: 'headerContacIndex',
-            width: 75,
-            align: 'center'
+            prop: 'name',
+            label: '参数名称',
+            align: 'center',
+            minWidth: 130
           },
           {
-            slot: 'inspectionName',
-            label: '参数名称',
-            prop: 'inspectionName',
-            minWidth: 165,
-            align: 'center'
+            prop: 'code',
+            label: '参数编码',
+            align: 'center',
+            minWidth: 130
           },
           {
-            slot: 'textType',
+            prop: 'paramType',
             label: '参数类型',
-            prop: 'textType',
-            width: 180,
-            align: 'center'
+            align: 'center',
+            slot: 'paramType',
+            minWidth: 110
           },
           {
-            slot: 'operationGuide',
-            label: '操作指导',
-            prop: 'operationGuide',
-            width: 400,
+            prop: 'defaultVal',
+            label: '默认值',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+
+          {
+            prop: 'upperLimit',
+            label: '参数上限',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          {
+            slot: 'lowerLimit',
+            label: '参数下限',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'paramUnit',
+            label: '参数单位',
             align: 'center'
           },
+          {
+            prop: 'tools',
+            slot: 'tools',
+            label: '工具名称',
+            align: 'center',
+            minWidth: 150
+          },
+          {
+            label: '状态',
+            prop: 'enable',
+            formatter: (row, column, cellValue) => {
+              return cellValue == 1 ? '启用' : cellValue === 0 ? '停用' : '';
+            }
+          },
+          {
+            label: '备注',
+            prop: 'remarks'
+          },
           {
             columnKey: 'action',
             label: '操作',
-            width: 90,
+            width: 140,
             align: 'center',
             resizable: false,
             slot: 'action'
@@ -238,78 +317,56 @@
         dialogTitle: '',
         visible: false,
         formData: {
-          ruleItems: []
+          ruleItems: [],
+          enable: true
         },
-        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: '北京烤鸭'
-          }
-        ] // 记录表
+        recordSheet: [], // 记录表
+        current: {},
+        dataIndex: null,
+        showEdit: false,
+        btnLoading:false
       };
     },
+    mounted() {
+      this.getByCodeData();
+    },
     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');
+      async getByCodeData() {
+        let res = await getByCode('record_sheet');
+        let list = res.data.map((item) => {
+          let values = Object.keys(item);
+          return {
+            value: Number(values[0]),
+            label: item[values[0]]
+          };
+        });
+        this.recordSheet = list;
+      },
+      add(row) {
+        this.current = row;
+        this.showEdit = true;
+        this.$refs.userEdit.$refs.form &&
+          this.$refs.userEdit.$refs.form.clearValidate();
+      },
+      // 保存数据
+      save(data, idx) {
+        if (idx || idx === 0) {
+          this.$set(this.formData.ruleItems, idx, data);
+        } else {
+          this.formData.ruleItems.push(data);
+        }
+      },
+      edit(row, index) {
+        this.current = row;
+        this.dataIndex = index;
+        this.showEdit = true;
+        this.$refs.userEdit.$refs.form &&
+          this.$refs.userEdit.$refs.form.clearValidate();
       },
       itemDel(index) {
         this.formData.ruleItems.splice(index, 1);
@@ -323,6 +380,54 @@
       },
       handleClose() {
         this.visible = false;
+        // this.formData= {
+        //   ruleItems: [],
+        //   enable: true
+        // },
+        this.formData = {
+          ruleItems: [],
+          enable: true
+        };
+        this.$refs['formRef'].resetFields();
+      },
+      confirm() {
+        if (!this.formData.cycleValue || !this.formData.cycleType) {
+          return this.$message.warning('请填写周期参数');
+        }
+        if (this.formData.ruleItems.length == 0) {
+          return this.$message.warning('至少条件一条规则项');
+        }
+
+        this.$refs.formRef.validate((valid) => {
+          if (!valid) {
+            return false;
+          }
+          let data = {
+            name: this.formData.name,
+            classifyId: this.formData.classifyId,
+            enable: this.formData.enable,
+            frequencyUnit: this.formData.cycleType,
+            frequencyValue: this.formData.cycleValue,
+            items: this.formData.ruleItems
+          };
+          let cycle = this.$refs.cycleMultipleRef.ruleCycleList;
+          if (cycle.length > 0) {
+            data.frequencyTimes = cycle;
+          }
+          this.btnLoading = true;
+          releasePermitRules(data)
+            .then((res) => {
+              this.btnLoading = false;
+              if (res) {
+                this.$message.success('操作成功');
+                this.handleClose();
+                this.$emit('reload');
+              }
+            })
+            .catch((err) => {
+              this.btnLoading = false;
+            });
+        });
       }
     }
   };
@@ -359,8 +464,8 @@
 
   ::v--deep .table_list {
     .el-form-item {
-      .el-form-item__content{
-         margin-left: 0;
+      .el-form-item__content {
+        margin-left: 0;
       }
     }
   }

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

@@ -0,0 +1,86 @@
+<!-- 搜索表单 -->
+<template>
+  <el-form label-width="60px" class="ele-form-search" @keyup.enter.native="search" @submit.native.prevent>
+    <el-row :gutter="24">
+      <el-col v-bind="styleResponsive ? { md: 6 } : { span: 6 }">
+        <el-form-item label="编码">
+          <el-input clearable v-model="where.code" placeholder="请输入" />
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { md: 6 } : { span: 6 }">
+        <el-form-item label="名称">
+          <el-input clearable v-model="where.name" placeholder="请输入" />
+        </el-form-item>
+      </el-col>
+
+      <el-col v-bind="styleResponsive ? { md: 6 } : { span: 6 }">
+        <el-form-item label="型号">
+          <el-input clearable v-model="where.modelType" placeholder="请输入" />
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { md: 6 } : { md: 6 }" style="text-align: right;">
+        <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" icon="el-icon-refresh" class="ele-btn-icon" size="medium">重置</el-button>
+        </div>
+      </el-col>
+    </el-row>
+  </el-form>
+</template>
+
+<script>
+export default {
+  data() {
+    // 默认表单数据
+    const defaultWhere = {
+      name: '',
+      code: '',
+      modelType: ''
+    };
+    return {
+      defaultWhere,
+      // 表单数据
+      where: { ...defaultWhere },
+      treeData: []
+    };
+  },
+  computed: {
+    // 是否开启响应式布局
+    styleResponsive() {
+      return this.$store.state.theme.styleResponsive;
+    }
+  },
+  created() {
+  },
+  methods: {
+
+    /* 搜索 */
+    search() {
+      if (this.where.appType === 0) {
+        this.where.appType = '';
+      }
+      this.$emit('search', this.where);
+    },
+    /*  重置 */
+    reset() {
+      this.where = { ...this.defaultWhere };
+      this.search();
+    },
+    reset2() {
+      this.where = { ...this.defaultWhere };
+
+    }
+  }
+};
+</script>
+
+<style>
+.ele-form-actions {
+  display: inline-block;
+  transform: translate(0);
+  transition: all;
+}
+</style>

+ 489 - 0
src/views/rulesManagement/releaseRules/components/rule-cycle.vue

@@ -0,0 +1,489 @@
+<template>
+  <div>
+    <el-row :gutter="8" v-if="pageType">
+      <el-col :span="2">
+        <!-- @input="
+            (value) =>
+              (formData.cycleValue = value.replace(/^(0+)|[^\d]+/g, ''))
+          " -->
+        <el-input
+          class="cycle_value"
+          size="small"
+          v-model.number="formData.cycleValue"
+          @change="cycleValueChange"
+          placeholder="请输入"
+          :disabled="isBindPlan || formData.cycleType == 1"
+        ></el-input>
+      </el-col>
+      <el-col :span="3">
+        <el-select
+          v-model="formData.cycleType"
+          size="small"
+          @change="handleCycleTypeChange"
+          :disabled="isBindPlan"
+        >
+          <el-option
+            v-for="item in cycleOpt"
+            :key="item.code"
+            :label="item.desc"
+            :value="item.code"
+          ></el-option>
+        </el-select>
+      </el-col>
+
+      <el-col :span="8" v-if="[2, 3, 4, 5].includes(formData.cycleType)">
+        <div
+          v-for="(item, index) in ruleCycleList"
+          :key="index"
+          class="cycle01_box"
+        >
+          <el-input
+            v-model.number="item.month"
+            size="small"
+            oninput="value = value.replace(/^(0+)|[^\d]+/g,'')"
+            @input="(e) => inputMonth(e, index)"
+            v-if="[5].includes(formData.cycleType)"
+            :disabled="isBindPlan"
+          >
+            <template #suffix>月</template>
+          </el-input>
+
+          <el-input
+            v-model.number="item.day"
+            size="small"
+            oninput="value = value.replace(/^(0+)|[^\d]+/g,'')"
+            @input="(e) => inputDay(e, index)"
+            v-if="[4, 5].includes(formData.cycleType)"
+            :disabled="isBindPlan"
+          >
+            <template #suffix>日</template>
+          </el-input>
+
+          <el-input
+            v-model.number="item.hour"
+            size="small"
+            oninput="value = value.replace(/^0+(\d)|[^\d]+/g,'')"
+            @input="(e) => inputHour(e, index)"
+            v-if="[3, 4, 5].includes(formData.cycleType)"
+            :disabled="isBindPlan"
+          >
+            <template #suffix>时</template>
+          </el-input>
+
+          <el-input
+            v-model.number="item.minute"
+            size="small"
+            oninput="value = value.replace(/^0+(\d)|[^\d]+/g,'')"
+            @input="(e) => inputMinute(e, index)"
+            :disabled="isBindPlan"
+          >
+            <template #suffix>分</template>
+          </el-input>
+        </div>
+      </el-col>
+    </el-row>
+    <el-row v-else>
+      <el-col :span="24" class="cycle_time_column">
+        <span style="margin-right: 20px"
+          >{{ formData.cycleValue }}{{ cycleOptObj[formData.cycleType] }}</span
+        >
+        <div v-if="[2, 3, 4, 5].includes(formData.cycleType)">
+          <span v-if="[5].includes(formData.cycleType)"
+            >{{ ruleCycleList[0].month }}月</span
+          >
+          <span v-if="[4, 5].includes(formData.cycleType)"
+            >{{ ruleCycleList[0].day }}日</span
+          >
+          <span v-if="[3, 4, 5].includes(formData.cycleType)"
+            >{{ ruleCycleList[0].hour }}时</span
+          >
+          <span>{{ ruleCycleList[0].minute }}分</span>
+        </div>
+      </el-col>
+    </el-row>
+
+    <!-- 根据周期类型展示时间组件 11,12,13,14 -->
+    <div>
+      <!-- 次/天 -->
+      <el-row :gutter="20" v-if="formData.cycleType === 6">
+        <el-col
+          v-for="(item, index) in ruleCycleList"
+          :key="index"
+          :span="6"
+          class="cycle_item"
+        >
+          <span>第{{ index + 1 }}次</span>
+          <div class="cycle_sub_item" v-if="pageType">
+            <el-input
+              v-model.number="item.hour"
+              size="small"
+              placeholder="时"
+              oninput="value = value.replace(/^0+(\d)|[^\d]+/g,'')"
+              @input="(e) => inputHour(e, index)"
+              :disabled="isBindPlan"
+            >
+              <template #suffix>时</template>
+            </el-input>
+          </div>
+          <div v-else>{{ item.hour }}时</div>
+          <div class="cycle_sub_item" v-if="pageType">
+            <el-input
+              v-model.number="item.minute"
+              size="small"
+              oninput="value = value.replace(/^0+(\d)|[^\d]+/g,'')"
+              @input="(e) => inputMinute(e, index)"
+              placeholder="分"
+              :disabled="isBindPlan"
+            >
+              <template #suffix>分</template>
+            </el-input>
+          </div>
+          <div v-else>
+            {{ item.minute > 9 ? item.minute : '0' + item.minute }}分
+          </div>
+        </el-col>
+      </el-row>
+      <!-- 次/周 -->
+      <el-row :gutter="20" v-else-if="formData.cycleType === 12">
+        <el-col
+          v-for="(item, index) in ruleCycleList"
+          :key="index"
+          :span="6"
+          class="cycle_item"
+        >
+          <span>第{{ index + 1 }}次</span>
+          <div class="cycle_sub_item" v-if="pageType">
+            <el-select
+              v-model.number="item.week"
+              size="small"
+              placeholder="周"
+              :disabled="isBindPlan"
+            >
+              <el-option
+                v-for="item in weekList"
+                :key="item.value"
+                :value="item.value"
+                :label="item.label"
+              ></el-option> </el-select
+            >周
+          </div>
+          <div v-else>{{ item.week }}</div>
+          <div class="cycle_sub_item" v-if="pageType">
+            <el-input
+              v-model.number="item.hour"
+              size="small"
+              placeholder="时"
+              oninput="value = value.replace(/^0+(\d)|[^\d]+/g,'')"
+              @input="(e) => inputHour(e, index)"
+              :disabled="isBindPlan"
+            >
+              <template #suffix>时</template>
+            </el-input>
+          </div>
+          <div v-else>{{ item.hour }}时</div>
+        </el-col>
+      </el-row>
+      <!-- 次/月 -->
+      <el-row :gutter="20" v-else-if="formData.cycleType === 7">
+        <el-col
+          v-for="(item, index) in ruleCycleList"
+          :key="index"
+          :span="6"
+          class="cycle_item"
+        >
+          <span>第{{ index + 1 }}次</span>
+          <div class="cycle_sub_item" v-if="pageType">
+            <el-input
+              v-model.number="item.day"
+              size="small"
+              placeholder="日"
+              oninput="value = value.replace(/^(0+)|[^\d]+/g,'')"
+              @input="(e) => inputDay(e, index)"
+              :disabled="isBindPlan"
+            >
+              <template #suffix>日</template>
+            </el-input>
+          </div>
+          <div v-else>{{ item.day }}日</div>
+          <div class="cycle_sub_item" v-if="pageType">
+            <el-input
+              v-model.number="item.hour"
+              size="small"
+              placeholder="时"
+              oninput="value = value.replace(/^0+(\d)|[^\d]+/g,'')"
+              @input="(e) => inputHour(e, index)"
+              :disabled="isBindPlan"
+            >
+              <template #suffix>时</template>
+            </el-input>
+          </div>
+          <div v-else>{{ item.hour }}</div>
+        </el-col>
+      </el-row>
+      <!-- 次/年 -->
+      <el-row :gutter="20" v-else-if="formData.cycleType === 8">
+        <el-col
+          v-for="(item, index) in ruleCycleList"
+          :key="index"
+          :span="6"
+          class="cycle_item"
+        >
+          <span>第{{ index + 1 }}次</span>
+          <div class="cycle_sub_item" v-if="pageType">
+            <el-input
+              v-model.number="item.month"
+              size="small"
+              placeholder="月"
+              oninput="value = value.replace(/^(0+)|[^\d]+/g,'')"
+              @input="(e) => inputMonth(e, index)"
+              :disabled="isBindPlan"
+            >
+              <template #suffix>月</template>
+            </el-input>
+          </div>
+          <div v-else>{{ item.month }}月</div>
+          <div class="cycle_sub_item" v-if="pageType">
+            <el-input
+              v-model.number="item.day"
+              size="small"
+              placeholder="日"
+              oninput="value = value.replace(/^(0+)|[^\d]+/g,'')"
+              @input="(e) => inputDay(e, index)"
+              :disabled="isBindPlan"
+            >
+              <template #suffix>日</template>
+            </el-input>
+          </div>
+          <div v-else>{{ item.day }}日</div>
+          <div class="cycle_sub_item" v-if="pageType">
+            <el-input
+              v-model.number="item.hour"
+              size="small"
+              placeholder="时"
+              oninput="value = value.replace(/^0+(\d)|[^\d]+/g,'')"
+              @input="(e) => inputHour(e, index)"
+              :disabled="isBindPlan"
+            >
+              <template #suffix>时</template>
+            </el-input>
+          </div>
+          <div v-else>{{ item.hour }}时</div>
+        </el-col>
+      </el-row>
+    </div>
+  </div>
+</template>
+
+<script>
+  import { frequencyUnitList } from '@/api/releasePermitRules/index';
+  export default {
+    props: {
+      formData: {
+        type: Object,
+        default: () => {
+          return {};
+        }
+      },
+      // 编辑edit和新增add
+      pageType: {
+        type: String,
+        default: ''
+      },
+
+      isBindPlan: {
+        type: Boolean,
+        default: () => {
+          return false;
+        }
+      }
+    },
+    data() {
+      return {
+        ruleCycleList: [
+          // {
+          //   year: '', // 周期年
+          //   month: '', // 周期月
+          //   week: '', // 周期周
+          //   day: '', // 周期日
+          //   hour: '', // 周期时
+          //   minute: '', // 周期分
+          //   second: '' // 周期秒
+          // }
+        ],
+        weekList: [
+          { value: 1, label: '周一' },
+          { value: 2, label: '周二' },
+          { value: 3, label: '周三' },
+          { value: 4, label: '周四' },
+          { value: 5, label: '周五' },
+          { value: 6, label: '周六' },
+          { value: 7, label: '周日' }
+        ],
+        cycleOptObj: {
+          1: '次',
+          2: '时/次',
+          3: '天/次',
+          //3: '周/次',
+          4: '月/次',
+          5: '年/次',
+          6: '次/天',
+          //12: '次/周',
+          7: '次/月',
+          8: '次/年'
+        },
+        cycleOpt: [
+          // { code: 1, label: '时/次' },
+          // { code: 2, label: '天/次' },
+          // //{ code: 3, label: '周/次' },
+          // { code: 4, label: '月/次' },
+          // { code: 5, label: '年/次' },
+          // { code: 11, label: '次/天' },
+          // //{ code: 12, label: '次/周' },
+          // { code: 13, label: '次/月' },
+          // { code: 14, label: '次/年' }
+        ],
+        // frequencyUnit:{}
+      };
+    },
+    watch: {
+      formData(val) {
+        if (val.cycle) {
+          this.ruleCycleList = val.cycle;
+        }
+      }
+    },
+    mounted() {
+      this.getFrequency();
+    },
+    methods: {
+      async getFrequency() {
+        try {
+          const res = await frequencyUnitList();
+          // let list = res.map((item) => {
+          //   return {
+          //     code: item.code,
+          //     label: item.desc
+          //   };
+          // });
+          this.cycleOpt = res;
+        } catch (err) {}
+      },
+      // 巡点检周期输入数量
+      cycleValueChange(val) {
+        const cycleType01 = [2, 3, 4, 5];
+        const cycleType02 = [6, 7, 8];
+        this.ruleCycleList = [];
+
+        // 次在后
+        if (cycleType01.includes(this.formData.cycleType)) {
+          this.ruleCycleList.push({
+            month: 1, // 周期月
+            day: 1, // 周期日
+            hour: 0, // 周期时
+            minute: 0 // 周期分
+          });
+        }
+
+        // 次在前
+        if (cycleType02.includes(this.formData.cycleType)) {
+          for (let i = 0; i < val; i++) {
+            this.ruleCycleList.push({
+              month: 1, // 周期月
+              day: 1, // 周期日
+              hour: 0, // 周期时
+              minute: 0 // 周期分
+            });
+          }
+        }
+
+        // 时/次
+        if (this.formData.cycleType === 1) {
+          this.ruleCycleList.forEach((item) => {
+            delete item.month;
+            delete item.day;
+            delete item.hour;
+          });
+        }
+
+        // 天/次、次/天
+        if ([3, 6].includes(this.formData.cycleType)) {
+          this.ruleCycleList.forEach((item) => {
+            delete item.month;
+            delete item.day;
+          });
+        }
+        // 月/次、次/月
+        if ([4, 7].includes(this.formData.cycleType)) {
+          this.ruleCycleList.forEach((item) => {
+            delete item.month;
+          });
+        }
+      },
+
+      // 周期类型选择
+      handleCycleTypeChange(val) {
+        // this.frequencyUnit = this.cycleOpt.find((el)=>el.code == val)
+        if (val == 1) {
+          this.$set(this.formData, 'cycleValue', 1);
+          // this.formData.cycleValue = 1;
+        }
+        // console.log(val,'val');
+        this.cycleValueChange(this.formData.cycleValue);
+      },
+
+      // 输入月
+      inputMonth(e, index) {
+        if (e > 12) {
+          this.ruleCycleList[index].month = 1;
+          return this.$message.warning('月份最大值为12月');
+        }
+      },
+      // 输入日
+      inputDay(e, index) {
+        if (e > 31) {
+          this.ruleCycleList[index].day = 1;
+          return this.$message.warning('日期最大值为31日');
+        }
+      },
+      // 输入时
+      inputHour(e, index) {
+        if (e > 23) {
+          this.ruleCycleList[index].hour = 0;
+          return this.$message.warning('时间最大值为23时');
+        }
+      },
+      // 输入时
+      inputMinute(e, index) {
+        if (e > 59) {
+          this.ruleCycleList[index].minute = 0;
+          return this.$message.warning('分钟最大值为59分');
+        }
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+  .cycle_item {
+    display: flex;
+    align-items: center;
+    color: #666;
+    > span {
+      width: 50px;
+    }
+    .cycle_sub_item {
+      flex: 1;
+      display: flex;
+      align-items: center;
+    }
+  }
+  .cycle01_box {
+    display: flex;
+    ::v-deep .el-input {
+      width: 80px;
+    }
+  }
+  .cycle_time_column {
+    display: flex;
+  }
+</style>

+ 14 - 19
src/views/rulesManagement/releaseRules/index.vue

@@ -1,4 +1,4 @@
-<!-- <template>
+<template>
   <div class="ele-body">
     <el-card shadow="never" v-loading="loading">
       <search @search="reload" />
@@ -14,8 +14,7 @@
             新建
           </el-button>
         </template>
-        <template v-slot:status="{ row }">
-        </template>
+        <template v-slot:status="{ row }"> </template>
         <template v-slot:action="{ row }">
           <el-link
             type="primary"
@@ -47,14 +46,15 @@
         </template>
       </ele-pro-table>
     </el-card>
-    <permitAdd ref="permitAddRef" />
+    <permitAdd ref="permitAddRef" @reload="reload" />
   </div>
 </template>
 
 <script>
-  import { getList } from '@/api/ruleManagement/matter';
+  // import { getList } from '@/api/ruleManagement/matter';
   import search from './components/search.vue';
   import permitAdd from './components/permitAdd.vue';
+  import { getRulesList } from '@/api/releasePermitRules/index';
   export default {
     components: { search, permitAdd },
     computed: {
@@ -84,14 +84,7 @@
             minWidth: 110
           },
           {
-            prop: 'fl',
-            label: '模块分类',
-            align: 'center',
-            showOverflowTooltip: true,
-            minWidth: 110
-          },
-          {
-            prop: 'bfl',
+            prop: 'classifyName',
             label: '记录表分类',
             align: 'center',
             showOverflowTooltip: true,
@@ -105,19 +98,21 @@
             minWidth: 110
           },
           {
-            prop: 'startTime',
+            prop: 'createTime',
             label: '创建时间',
             align: 'center',
             showOverflowTooltip: true,
             minWidth: 110
           },
           {
-            prop: 'status',
-            slot: 'status',
+            prop: 'enable',
             label: '状态',
             align: 'center',
             showOverflowTooltip: true,
-            minWidth: 110
+            minWidth: 110,
+            formatter: (row) => {
+              return row.enable ? '生效' : '失效';
+            }
           },
           {
             columnKey: 'action',
@@ -142,7 +137,7 @@
       remove(row) {},
       /* 表格数据源 */
       datasource({ page, limit, where, order }) {
-        return getList({ pageNum: page, size: limit, ...where });
+        return getRulesList({ pageNum: page, size: limit, ...where });
       },
       /* 刷新表格 */
       reload(where) {
@@ -150,4 +145,4 @@
       }
     }
   };
-</script> -->
+</script>

+ 3 - 2
src/views/technology/production/components/WorkCenter.vue

@@ -149,10 +149,11 @@
       },
 
       selected() {
-        if (!this.current) {
+        if (!this.current || !this.current.id) {
           return this.$message.warning('请选择工作中心');
         }
-        this.$emit('changeCenter', this.current);
+        let data = this.tableData.find((el) => el.id == this.current.id);
+        this.$emit('changeCenter', data);
         this.handleClose();
       },