LAPTOP-16IUEB3P\Lenovo 3 лет назад
Родитель
Сommit
fa7e1b1c34

+ 61 - 0
src/api/ruleManagement/matter.js

@@ -0,0 +1,61 @@
+import request from '@/utils/request';
+
+// 更新或保存
+export async function saveOrUpdate (data) {
+  const res = await request.post('/main/ruleinfo/saveOrEdit', data);
+  if (res.data.code == 0) {
+    return res.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+// 生成编码
+export async function getCode (code) {
+  const res = await request.get(`/main/codemanage/getCode/` + code, {});
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+// 获取规则列表页
+export async function getList (data) {
+	let par = new URLSearchParams(data);
+  const res = await request.get(`/main/ruleinfo/page?` + par, {});
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+// 获取规则详情
+export async function getDetail (id) {
+  const res = await request.get(`/main/ruleinfo/getById/` + id, {});
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+
+/**
+ * 删除事项
+ */
+export async function removeRule(data) {
+  const res = await request.delete('/main/ruleinfo/delete', { data } );
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+
+// 获取仓库列表 
+export async function getWarehouseList (params) {
+  const res = await request.get('/wms/warehouse/page',  params );
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+

+ 114 - 0
src/api/ruleManagement/plan.js

@@ -0,0 +1,114 @@
+import request from '@/utils/request';
+
+// 获取规则名称下拉
+export async function getRule (data) {
+	let par = new URLSearchParams(data);
+  const res = await request.get(`/main/ruleinfo/page?` + par, {});
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+// 获取类别信息列表
+export async function getCategory (data) {
+  const res = await request.post(`/main/category/getList` , data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+
+// 获取实体列表分页
+export async function getAssetList (data) {
+  let par = new URLSearchParams(data);
+  const res = await request.get(`/main/asset/page?` + par, {});
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+// 巡点检计划配置新增或更新 
+export async function saveOrUpdate (data) {
+  const res = await request.post('/eam/planconfig/saveOrUpdate' , data );
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+// 获取巡点检分页数据
+export async function planConfigPage (data) {
+	let par = new URLSearchParams(data);
+  const res = await request.get(`/eam/planconfig/page?`+ par , {} );
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+// 获取详情  
+export async function getInfoById (id) {
+  const res = await request.get(`/eam/planconfig/getById/`+ id , {} );
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+/**
+ * 删除事项
+ */
+export async function removeRule(data) {
+  const res = await request.delete('/eam/planconfig/delete', { data } );
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+
+// // 更新或保存
+// export async function saveOrUpdate (data) {
+//   const res = await request.post('/main/ruleinfo/saveOrEdit', data);
+//   if (res.data.code == 0) {
+//     return res.data;
+//   }
+//   return Promise.reject(new Error(res.data.message));
+// }
+
+// // 生成编码
+// export async function getCode (code) {
+//   const res = await request.get(`/main/codemanage/getCode/` + code, {});
+//   if (res.data.code == 0) {
+//     return res.data.data;
+//   }
+//   return Promise.reject(new Error(res.data.message));
+// }
+
+// // 获取规则列表页
+// export async function getList (data) {
+// 	let par = new URLSearchParams(data);
+//   const res = await request.get(`/main/ruleinfo/page?` + par, {});
+//   if (res.data.code == 0) {
+//     return res.data.data;
+//   }
+//   return Promise.reject(new Error(res.data.message));
+// }
+
+// // 获取规则详情
+// export async function getDetail (id) {
+//   const res = await request.get(`/main/ruleinfo/getById/` + id, {});
+//   if (res.data.code == 0) {
+//     return res.data.data;
+//   }
+//   return Promise.reject(new Error(res.data.message));
+// }
+
+
+
+
+
+

+ 59 - 0
src/components/CommomSelect/equipment-select.vue

@@ -0,0 +1,59 @@
+<!-- 设备分类树形选择下拉框 -->
+<template>
+  <ele-tree-select
+    clearable
+    filterable
+    :value="value || ''"
+    :data="treeData"
+    label-key="name"
+    value-key="id"
+    default-expand-all
+    :placeholder="placeholder"
+    @input="updateValue"
+    v-on="$listeners"
+		@change="chooseNode"
+  />
+</template>
+
+<script>
+  import { getTreeByType } from '@/api/classifyManage';
+  export default {
+    props: {
+      // 选中的数据(v-model)
+      value: [Number, String],
+      // 提示信息
+      placeholder: {
+        type: String,
+        default: '请选择'
+      }
+    },
+    data () {
+      return {
+        treeData: []
+      };
+    },
+    created () {
+      this.getData();
+    },
+    methods: {
+      async getData () {
+        const res = await getTreeByType(1);
+        this.treeData = res.data;
+		this.$emit('setRootId', res.data[0].id);
+        // this.treeData = this.$util.toTreeData({
+        //   data: data || [],
+        //   idField: 'id',
+        //   parentIdField: 'parentId'
+        // });
+      },
+      /* 更新选中数据 */
+      updateValue (value) {
+        this.$emit('input', value);
+      },
+			
+		chooseNode(node){
+			this.$emit('changeNode', node);
+		}
+    }
+  };
+</script>

+ 6 - 1
src/enum/dict.js

@@ -8,5 +8,10 @@ export default {
   生命周期: 'life_cycle',
   网络状态: 'network_status',
   金额单位: 'money_unit',
-  时间单位: 'time_unit'
+  时间单位: 'time_unit',
+  规则类型: 'rule_type',
+  规则状态: 'rule_status',
+  规则周期: 'rule_cycle',
+  运维计划状态: 'plan_status',
+  紧急程度: 'urgent_type'
 };

+ 144 - 0
src/utils/index.js

@@ -0,0 +1,144 @@
+
+/**
+ * This is just a simple version of deep copy
+ * Has a lot of edge cases bug
+ * If you want to use a perfect deep copy, use lodash's _.cloneDeep
+ * @param {Object} source
+ * @returns {Object}
+ */
+export function deepClone (source) {
+  if (!source && typeof source !== 'object') {
+    throw new Error('error arguments', 'deepClone')
+  }
+  const targetObj = source.constructor === Array ? [] : {}
+  Object.keys(source).forEach(keys => {
+    if (source[keys] && typeof source[keys] === 'object') {
+      targetObj[keys] = deepClone(source[keys])
+    } else {
+      targetObj[keys] = source[keys]
+    }
+  })
+  return targetObj
+}
+
+/**
+ * @description:封装方法:获取今天、昨天、明天
+ * @param {*} dates  0 今天   -1   -2
+ * @returns
+ */
+export function getDay (dates) {
+  var dd = new Date()
+  var n = dates || 0
+  dd.setDate(dd.getDate() + n)
+  var y = dd.getFullYear()
+  var m = dd.getMonth() + 1
+  var d = dd.getDate()
+  m = m < 10 ? '0' + m : m
+  d = d < 10 ? '0' + d : d
+  var day = y + '-' + m + '-' + d
+  return day
+}
+
+/**
+ * @description: 获取某月的起始、结束日期
+ * @param {*} val 年月 2023-01
+ * @returns
+ */
+export function getMonday (val) {
+  let date = new Date(val)
+  let new_year = date.getFullYear() // 取当前的年份
+  let month = date.getMonth()
+  let new_month = month + 1 // 取当前的月份
+  let mon = ''
+  let day = ''
+  if (month > 12) {
+    new_month -= 12 // 月份减
+    new_year++ // 年份增
+  }
+  let firstDay = new Date(new_year, new_month, 1) // 取当年当月中的第一天
+  let lastDay = new Date(firstDay.getTime() - 1000 * 60 * 60 * 24).getDate() // 获取当月最后一天日期
+  if (firstDay.getMonth() < 10) {
+    mon = '0' + firstDay.getMonth()
+  } else {
+    mon = firstDay.getMonth()
+  }
+  if (lastDay < 10) {
+    day = '0' + lastDay
+  } else {
+    day = lastDay
+  }
+  let startDate =
+    firstDay.getFullYear() + '-' + mon + '-' + '0' + firstDay.getDate()
+  let endDate = firstDay.getFullYear() + '-' + mon + '-' + day
+  let dateRange = [startDate, endDate]
+  return dateRange
+}
+
+/**
+ * @description: 获取本周起始日期
+ * @param {*} type s 周开始  e周结束
+ * @param {*} dates  0 本周
+ * @returns
+ */
+export function getDate (type, dates = 0) {
+  var now = new Date()
+  var nowTime = now.getTime()
+  var day = now.getDay()
+  var longTime = 24 * 60 * 60 * 1000
+  var n = longTime * 7 * (dates || 0)
+  if (type == 's') {
+    var dd = nowTime - (day - 1) * longTime + n
+  }
+  if (type == 'e') {
+    var dd = nowTime + (7 - day) * longTime + n
+  }
+  dd = new Date(dd)
+  var y = dd.getFullYear()
+  var m = dd.getMonth() + 1
+  var d = dd.getDate()
+  m = m < 10 ? '0' + m : m
+  d = d < 10 ? '0' + d : d
+  var day = y + '-' + m + '-' + d
+  return day
+}
+
+/**
+ * @description 获取最近 7天日期
+ * @returns days
+ */
+export function getRecent7Days () {
+  let days = []
+  for (let i = 0; i <= 24 * 6; i += 24) {
+    // 使用当天时间戳减去以前的时间毫秒(小时 * 分 * 秒 * 毫秒)
+    let dateItem = new Date(Date.now() - i * 60 * 60 * 1000)
+    let y = dateItem.getFullYear()
+    let m = dateItem.getMonth() + 1
+    let d = dateItem.getDate()
+    m = addDate0(m)
+    d = addDate0(d)
+    let valueItem = y + '-' + m + '-' + d
+    days.push(valueItem)
+  }
+  return days
+}
+// 给日期拼接 0
+function addDate0 (time) {
+  if (time.toString().length === 1) {
+    time = '0' + time.toString()
+  }
+  return time
+}
+
+//补零 000
+export function pushZero (num) {
+  let count = 3 - String(num).length
+  if (count > 0) {
+    return new Array(count).fill('0').join('') + num
+  }
+  return num
+}
+
+//表格分页 序号连续
+export function tableIndex (index, page, size) {
+  return index + 1 + size * (page - 1)
+}

+ 1 - 1
src/views/ledgerAssets/boat/components/boat-list.vue

@@ -137,7 +137,7 @@
           ...order,
           pageNum: page,
           size: limit,
-          categoryId: this.categoryId,
+          categoryLevelId: this.categoryId,
           rootCategoryLevelId: this.rootId
         });
       },

+ 1 - 1
src/views/ledgerAssets/material/components/material-list.vue

@@ -119,7 +119,7 @@
           ...order,
           pageNum: page,
           size: limit,
-          categoryId: this.categoryId,
+          categoryLevelId: this.categoryId,
           rootCategoryLevelId: this.rootId
         });
       },

+ 1 - 1
src/views/ledgerAssets/mould/components/mould-list.vue

@@ -182,7 +182,7 @@
           ...order,
           pageNum: page,
           size: limit,
-          categoryId: this.categoryId,
+          categoryLevelId: this.categoryId,
           rootCategoryLevelId: this.rootId
         });
       },

+ 1 - 1
src/views/ledgerAssets/sparepart/components/sparepart-list.vue

@@ -182,7 +182,7 @@
           ...order,
           pageNum: page,
           size: limit,
-          categoryId: this.categoryId,
+          categoryLevelId: this.categoryId,
           rootCategoryLevelId: this.rootId
         });
       },

+ 1 - 1
src/views/ledgerAssets/turnoverCar/components/turnovercar-list.vue

@@ -184,7 +184,7 @@
           ...order,
           pageNum: page,
           size: limit,
-          categoryId: this.categoryId,
+          categoryLevelId: this.categoryId,
           rootCategoryLevelId: this.rootId
         });
       },

+ 453 - 0
src/views/rulesManagement/matterRules/components/matter-add.vue

@@ -0,0 +1,453 @@
+<template>
+  <ele-modal
+    :title="dialogTitle"
+    :visible.sync="addMatterDialog"
+    :before-close="handleClose"
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    width="80%"
+  >
+    <el-form
+      :model="formData"
+      v-loading="dialogLoading"
+      ref="contentConfigForm"
+      label-width="100px"
+      :show-message="false"
+      :rules="contentConfigFormRules"
+    >
+      <el-row>
+		<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="6">
+          <el-form-item label="规则名称" prop="name">
+            <el-input
+              v-model="formData.name"
+              placeholder="请输入"
+              size="small"
+              :disabled="isBindPlan"
+            ></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="规则类型" prop="ruleType">
+			  <DictSelection dictName="规则类型" clearable v-model="formData.ruleType">
+			  </DictSelection>
+          </el-form-item>
+        </el-col>
+        <el-col :span="5">
+          <el-form-item label="状态" prop="status" label-width="70px">
+            <el-switch
+              v-model="formData.status"
+              active-text="生效"
+              inactive-text="失效"
+              :active-value="1"
+              :inactive-value="0"
+            >
+            </el-switch>
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="周期" prop="cycleValue">
+            <rule-cycle
+              ref="cycleMultipleRef"
+              :formData="formData"
+              :pageType="pageType"
+              :isBindPlan="isBindPlan"
+            />
+          </el-form-item>
+        </el-col>
+      </el-row>
+
+      <el-table
+        ref="multipleTable"
+        v-if="formData.ruleType !== 4"
+        :data="formData.ruleItems"
+        tooltip-effect="dark"
+        style="width: 95%; margin: auto"
+        border
+        :header-cell-style="{ background: '#F0F3F3' }"
+      >
+        <el-table-column type="index" width="100" align="center">
+          <template slot="header">
+            <el-button type="text" @click="addItem" icon="el-icon-plus" :disabled="isBindPlan"
+              >新增</el-button
+            >
+          </template>
+        </el-table-column>
+        <el-table-column prop="name" label="事项">
+          <template slot-scope="scope">
+            <el-form-item
+              :prop="'ruleItems.' + scope.$index + '.name'"
+              label-width="0"
+              :rules="contentConfigFormRules.name"
+            >
+              <span v-if="scope.row.readonly">{{ scope.row.name }}</span>
+              <el-input
+                v-if="!scope.row.readonly"
+                size="small"
+                placeholder="请输入"
+                v-model="scope.row.name"
+                :disabled="isBindPlan"
+              ></el-input>
+            </el-form-item>
+          </template>
+        </el-table-column>
+        <el-table-column prop="content" label="内容">
+          <template slot-scope="scope">
+            <el-form-item
+              :prop="'ruleItems.' + scope.$index + '.content'"
+              label-width="0"
+              :rules="contentConfigFormRules.content"
+            >
+              <span v-if="scope.row.readonly">{{ scope.row.content }}</span>
+              <el-input
+                v-if="!scope.row.readonly"
+                size="small"
+                placeholder="请输入"
+                v-model="scope.row.content"
+                :disabled="isBindPlan"
+              ></el-input>
+            </el-form-item>
+          </template>
+        </el-table-column>
+
+        <el-table-column prop="norm" label="标准">
+          <template slot-scope="scope">
+            <el-form-item
+              :prop="'ruleItems.' + scope.$index + '.norm'"
+              label-width="0"
+              :rules="contentConfigFormRules.norm"
+            >
+              <span v-if="scope.row.readonly">{{ scope.row.norm }}</span>
+              <el-input
+                v-if="!scope.row.readonly"
+                size="small"
+                placeholder="请输入"
+                v-model="scope.row.norm"
+                :disabled="isBindPlan"
+              ></el-input>
+            </el-form-item>
+          </template>
+        </el-table-column>
+
+        <el-table-column width="200" label="操作">
+          <template slot-scope="scope">
+            <el-button type="text" @click="delItem(scope.$index)" size="small" :disabled="isBindPlan"
+              >删除</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>  
+    </el-form>
+	 <template v-slot:footer>
+	   <el-button @click="handleClose">取消</el-button>
+	   <el-button type="primary" @click="dataKeep">
+	     保存
+	   </el-button>
+	 </template>
+  </ele-modal>
+</template>
+<script>
+import RuleCycle from './rule-cycle'
+import { deepClone } from '@/utils/index'
+import { saveOrUpdate , getCode , getDetail  } from '@/api/ruleManagement/matter'
+
+export default {
+  components: {  RuleCycle },
+  props: {
+    pageType: {
+      type: String,
+      default: ''
+    },
+    infoData: {
+      type: Object,
+      default: () => {
+        return {}
+      }
+    },
+    dialogTitle: {
+      type: String,
+      default: '新建规则'
+    },
+    dialogLoading: {
+      type: Boolean,
+      default: () => {
+        return false
+      }
+    }
+  },
+  data () {
+		// 默认表单数据
+		const defaultForm = {
+		  code:'',
+		  name: '',
+		  ruleType: '1',
+		  status: 1,
+		  cycleValue: undefined,
+		  cycleType: 1,
+		  contentImage: {},
+		  ruleCycleList: [], // 规则周期日期值
+		  ruleItems: [
+		    {
+		      name: '', // 巡点检事项
+		      content: '', // 巡点检内容
+		      norm: '', // 巡点检标准
+		      // readonly: false
+		    }
+		  ]
+		};
+    return {
+      addMatterDialog: false,
+      cycleValue: '',
+      uploadList: [],
+      formData: { },
+      contentConfigFormRules: {
+        name: [{ required: true, message: '请输入规则名称', trigger: 'blur' }],
+        ruleType: [
+          { required: true, message: '请选择规则类型', trigger: 'change' }
+        ],
+        cycleValue: [
+          { required: true, message: '请输入巡点检周期', trigger: 'blur' }
+        ],
+        // contentImage: [
+        //   { required: false, message: '请上传图片', trigger: 'blur' }
+        // ],
+        status: [{ required: true }],
+        name: [
+          { required: true, message: '请输入巡点检事项', trigger: 'blur' }
+        ],
+        content: [
+          { required: true, message: '请输入巡点检内容', trigger: 'blur' }
+        ],
+        norm: [{ required: true, message: '请输入巡点检标准', trigger: 'blur' }]
+      },
+      isBindPlan:false
+    }
+  },
+	watch: {
+	
+	},
+  methods: {
+		openDialog(row,type){
+			this.addMatterDialog = true
+			if(type !='add'){
+				this.getRuleInfo(row.id,type)
+			}else{
+				this.formData = {...this.defaultForm}
+				this.$set(this.formData,'status',1)
+				this.$set(this.formData,'ruleType','1')
+				this.$refs.contentConfigForm && this.$refs.contentConfigForm.resetFields()
+			}
+			if(type!='edit'){
+				this.getOrderCode()
+			}
+		},
+	
+	async getRuleInfo(id,type){
+		const data = await getDetail(id)
+		this.formData = data
+		this.formData.ruleType = JSON.stringify(this.formData.ruleType)
+		if(type=='clone'){
+			delete this.formData.id
+		}
+	},
+	
+	async getOrderCode () {
+	  const data = await getCode('rule_code');
+	  this.$set(this.formData, 'code', data);
+	},  
+	
+    handleClose () {
+      this.addMatterDialog = false
+      this.$emit('handleClose')
+    },
+    addItem () {
+      if (this.formData.ruleItems) {
+        this.formData.ruleItems.push({
+          name: '', // 巡点检事项
+          content: '', // 巡点检内容
+          norm: '', // 巡点检标准
+          readonly: false
+        })
+      } else {
+        this.formData.ruleItems = [
+          {
+            name: '', // 巡点检事项
+            content: '', // 巡点检内容
+            norm: '', // 巡点检标准
+            readonly: false
+          }
+        ]
+      }
+    },
+    saveItem (index, row) {
+      this.$nextTick(() => {
+        let flag = false
+        let name = row.name
+        let content = row.content
+        let norm = row.norm
+        flag = name && content && norm
+        this.$refs.contentConfigForm.validate(valid => {
+          if (valid || flag) {
+            this.$set(this.formData.ruleItems[index], 'readonly', true)
+          }
+        })
+      })
+    },
+    upload (data) {
+      if (data && data[0]?.accessUrl) {
+        this.formData.contentImage = data
+      } else {
+        this.formData.contentImage = {}
+      }
+      this.$nextTick(() => {
+        this.$refs.contentConfigForm.validateField('contentImage')
+      })
+      console.log(this.formData.contentImage)
+    },
+    editItem (index) {
+      this.$nextTick(() => {
+        this.$set(this.formData.ruleItems[index], 'readonly', false)
+      })
+    },
+    delItem (index) {
+      this.formData.ruleItems.splice(index, 1)
+    },
+
+    // 保存
+    dataKeep () {
+      let form = deepClone(this.formData)
+      form.cycle = this.$refs.cycleMultipleRef.ruleCycleList
+      switch(form.cycleType){
+          case 1:
+              if(form.cycle[0].minute===''){
+                 this.$message.warning('周期信息需补充完整!')
+                 return;
+              }
+              break;
+          case 2:
+              if(form.cycle[0].hour===''||form.cycle[0].minute===''){
+                 this.$message.warning('周期信息需补充完整!')
+                 return;
+              }
+              break;
+          case 4:
+              if(form.cycle[0].day===''||form.cycle[0].hour===''||form.cycle[0].minute===''){
+                 this.$message.warning('周期信息需补充完整!')
+                 return;
+              }
+              break;
+          case 5:
+              if(form.cycle[0].month===''||form.cycle[0].day===''||form.cycle[0].hour===''||form.cycle[0].minute===''){
+                 this.$message.warning('周期信息需补充完整!')
+                 return;
+              }
+              break;
+          case 11:
+               let flg = false
+              form.cycle.map((item,index)=>{
+                  if(item.hour===''||item.minute===''){
+                     flg = true
+                  }
+              })
+              if(flg){
+                this.$message.warning('周期信息需补充完整!')
+                return;
+              }
+              break;
+          case 13:
+               let flag = false
+              form.cycle.map((item,index)=>{
+                  if(item.day===''||item.hour===''){
+                     flag = true
+                  }
+              })
+              if(flag){
+                this.$message.warning('周期信息需补充完整!')
+                return;
+              }
+              break;
+          case 14:
+               let fla = false
+              form.cycle.map((item,index)=>{
+                  if(item.month===''||item.day===''||item.hour===''){
+                     fla = true
+                  }
+              })
+              if(fla){
+                this.$message.warning('周期信息需补充完整!')
+                return;
+              }
+              break;
+      }
+      this.$refs.contentConfigForm.validate(async valid => {
+        if (valid) {
+          // let form = deepClone(this.formData)
+          // form.ruleCycleList = this.$refs.cycleMultipleRef.ruleCycleList
+          // form.ruleItems.forEach(item => {
+          //   if (item.ruleType) {
+          //     item.ruleType = this.ruleTypeObj[item.ruleType.code]
+          //   }
+          // })
+          let res = await saveOrUpdate(form)
+          if (res) {
+            this.$message.success('操作成功!')
+            this.handleClose()
+            this.$emit('done')
+          }
+        } else {
+          this.$message.warning('请将信息补充完整!')
+        }
+      })
+    },
+  }
+}
+</script>
+<style scoped lang="scss">
+.form-ipt {
+  width: 310px;
+}
+.details-div {
+  font-size: 14px;
+  padding-left: 40px;
+  .details-div-title {
+    display: flex;
+    justify-content: space-between;
+    span {
+      padding-top: 8px;
+    }
+  }
+}
+.zw-container {
+  height: 450px;
+}
+.page-footer-btn {
+  margin: 20px 0;
+  text-align: center;
+}
+// .app-container {
+::v-deep .el-form-item {
+  margin-bottom: 14px;
+}
+::v-deep .el-table__body-wrapper {
+  .el-form-item {
+    margin-bottom: 0;
+  }
+}
+::v-deep .el-form-item__error {
+  padding-top: 0;
+}
+.cycle_value {
+  ::v-deep .el-input__inner {
+    text-align: center;
+  }
+}
+// }
+</style>

+ 120 - 0
src/views/rulesManagement/matterRules/components/matter-search.vue

@@ -0,0 +1,120 @@
+<!-- 搜索表单 -->
+<template>
+  <el-form
+    label-width="80px"
+    class="ele-form-search"
+    @keyup.enter.native="search"
+    @submit.native.prevent
+  >
+    <el-row :gutter="15">
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="规则名称:">
+          <el-input clearable v-model="where.name" placeholder="请输入" />
+        </el-form-item>
+		<el-form-item label="规则状态:">
+		  <DictSelection dictName="规则状态" clearable v-model="where.status">
+		  </DictSelection>
+		</el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="规则编码:">
+          <el-input clearable v-model="where.code" placeholder="请输入" />
+        </el-form-item>
+        <el-form-item label="创建时间:">
+            <el-date-picker
+                v-model="time"
+                type="daterange"
+                range-separator="至"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+				value-format="yyyy-MM-dd HH:mm:ss"
+				:default-time="['00:00:00', '23:59:59']"
+        	  >
+            </el-date-picker>
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="规则类型:">
+          <DictSelection dictName="规则类型" clearable v-model="where.type">
+          </DictSelection>
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="创建人:">
+          <el-input clearable v-model="where.userName" placeholder="请输入" />
+        </el-form-item>
+		<div class="ele-form-actions">
+		  <el-button
+		    type="primary"
+		    icon="el-icon-search"
+		    class="ele-btn-icon"
+		    @click="search"
+		    size="small"
+		  >
+		    查询
+		  </el-button>
+		   <el-button @click="reset"
+		     icon="el-icon-refresh-left"
+		     size="small"
+		     type="primary"
+		   >重置</el-button>
+		</div>
+      </el-col>
+    </el-row>
+  </el-form>
+</template>
+
+<script>
+  import { login } from '@/api/login';
+  export default {
+    data() {
+      // 默认表单数据
+      const defaultWhere = {
+        name: '',
+        code: '',
+        userName:'',
+        type:'',
+		status:'',
+		startTime:'',
+		endTime:''
+      };
+      return {
+        // 表单数据
+        where: { ...defaultWhere },
+        treeData:[],
+		time:[]
+      };
+    },
+    computed: {
+      // 是否开启响应式布局
+      styleResponsive() {
+        return this.$store.state.theme.styleResponsive;
+      }
+    },
+    created(){
+    },
+    methods: {
+      /* 搜索 */
+      search() {
+		if(this.time.length){
+			this.where.startTime = this.time[0]
+			this.where.endTime = this.time[1]
+		}
+        this.$emit('search', this.where);
+      },
+      /*  重置 */
+      reset() {
+		this.time = []
+        this.where = { ...this.defaultWhere };
+        this.search();
+      }
+    }
+  };
+</script>
+<style lang="scss" scoped>
+    .ele-form-actions{
+		display:flex;
+		align-items: center;
+		justify-content: flex-end;
+	}
+</style>

+ 457 - 0
src/views/rulesManagement/matterRules/components/rule-cycle.vue

@@ -0,0 +1,457 @@
+<template>
+  <div>
+    <el-row :gutter="8" v-if="pageType">
+      <el-col :span="2">
+        <el-input
+          @input="
+            value => (formData.cycleValue = value.replace(/^(0+)|[^\d]+/g, ''))
+          "
+          class="cycle_value"
+          size="small"
+          v-model.number="formData.cycleValue"
+          @change="cycleValueChange"
+          placeholder="请输入"
+          :disabled="isBindPlan"
+        ></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.label"
+            :value="item.code"
+          ></el-option>
+        </el-select>
+      </el-col>
+
+      <el-col :span="8" v-if="[1, 2, 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="[2, 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="[1, 2, 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="[2, 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 === 11">
+        <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 === 13">
+        <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 === 14">
+        <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>
+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: '周/次',
+        4: '月/次',
+        5: '年/次',
+        11: '次/天',
+        //12: '次/周',
+        13: '次/月',
+        14: '次/年'
+      },
+      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: '次/年' }
+      ]
+    }
+  },
+  watch: {
+    formData (val) {
+      this.ruleCycleList = val.cycle
+    }
+  },
+  methods: {
+    // 巡点检周期输入数量
+    cycleValueChange (val) {
+      console.log(val)
+      const cycleType01 = [1, 2, 4, 5]
+      const cycleType02 = [11, 13, 14]
+      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 ([2, 11].includes(this.formData.cycleType)) {
+        this.ruleCycleList.forEach(item => {
+          delete item.month
+          delete item.day
+        })
+      }
+      // 月/次、次/月
+      if ([4, 13].includes(this.formData.cycleType)) {
+        this.ruleCycleList.forEach(item => {
+          delete item.month
+        })
+      }
+    },
+
+    // 周期类型选择
+    handleCycleTypeChange () {
+      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>

+ 263 - 0
src/views/rulesManagement/matterRules/details.vue

@@ -0,0 +1,263 @@
+<template>
+  <div class="page">
+    <el-form label-width="140px">
+      <div class="content-detail">
+        <div class="basic-details">
+          <div class="basic-details-title">
+            <span class="border-span">基本信息</span>
+          </div>
+          <el-row>
+            <el-col :span="6">
+              <el-form-item label="规则编码">
+                <span> {{ infoData.code }} </span>
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item label="规则名称">
+                <span> {{ infoData.name }} </span>
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item label="规则类型">
+                <span>
+                  {{ getDictValue('规则类型',  infoData.ruleType) }}
+				  </span>
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item label="状态">
+                <span class="primary-text" v-if="infoData.status">生效</span>
+                <span class="danger-text" v-else-if="!infoData.status"
+                  >失效</span
+                >
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item label="创建人">
+                <span> {{ infoData.createUserName }} </span>
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item label="创建时间">
+                <span> {{ infoData.createTime }} </span>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="巡点检周期">
+                <rule-cycle :formData="infoData" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="操作方式/注意事项">
+                <el-link
+                  v-for="item in infoData.contentImage"
+                  @click="$fileSystemDownload(item)"
+                  :key="item.docId"
+                  >{{ item.name }}</el-link
+                >
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </div>
+        <template v-if="!(infoData.ruleType && infoData.ruleType.code == 4)">
+          <div class="basic-details-title">
+            <span class="border-span">内容配置</span>
+          </div>
+          <el-table
+            ref="multipleTable"
+            :data="tableData"
+            tooltip-effect="dark"
+            style="width: 100%"
+            border
+            :header-cell-style="{ background: '#F0F3F3' }"
+          >
+            <el-table-column type="index" label="序号" width="60"/>
+            <el-table-column prop="name" label="检测事项" />
+            <el-table-column prop="content" label="检测内容" />
+            <el-table-column prop="norm" label="检测标准" />
+          </el-table>
+        </template>
+      </div>
+
+      <div class="content-detail" v-show="num == 2"></div>
+    </el-form>
+  </div>
+</template>
+<script>
+  import dictMixins from '@/mixins/dictMixins';
+  import RuleCycle from './components/rule-cycle'
+  import {  getDetail  } from '@/api/ruleManagement/matter'
+export default {
+  mixins: [dictMixins],
+  components: { RuleCycle },
+  data () {
+    return {
+      num: 1,
+      dialogVisible: false,
+      infoData: {},
+      form: {},
+      type: [],
+      tableData: [],
+      ruleTypeObj: {
+        1: '巡点检规则',
+        2: '保养规则',
+        4: '盘点规则'
+      }
+    }
+  },
+  async created () {
+    this.getInfo()
+	 this.requestDict('规则类型');
+  },
+  methods: {
+    delete () {},
+    // 点击切换事件
+    tab (index) {
+      this.num = index
+    },
+
+    // 表格数据
+    async getInfo () {
+      const data = await getDetail(this.$route.query.id)
+        this.tableData = data.ruleItems
+        this.infoData = data
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.page {
+  padding: 10px;
+}
+.page-title {
+  background: #fff;
+  font-size: 18px;
+  padding: 6px 20px;
+  font-weight: 500;
+  .page-title-div {
+    margin: 5px 0;
+    height: 30px;
+    line-height: 30px;
+    border-bottom: 1px solid #eaeefb;
+    .title-div-no {
+      margin-left: 10px;
+      font-weight: 400;
+      color: #909090;
+      font-size: 14px;
+    }
+  }
+}
+.page-data {
+  padding-top: 10px;
+}
+.content-detail {
+  background: #fff;
+  padding: 20px;
+}
+.flows {
+  .flow-left {
+    width: 156px;
+    height: 70px;
+    border: 1px dashed #ccc;
+    padding: 10px;
+  }
+  .row {
+    margin-top: 13px;
+  }
+}
+.basic-details-title {
+  margin-bottom: 12px;
+  margin-top: 20px;
+  border-bottom: 1px solid #1890ff;
+  padding-bottom: 8px;
+  display: flex;
+  justify-content: space-between;
+}
+.basic-details-title .border-span {
+  height: 18px;
+  font-size: 16px;
+  border-left: 4px solid #1890ff;
+  padding-left: 8px;
+
+  font-weight: 500;
+}
+.heade-right {
+  // float: right;
+  .heade-right-content {
+    margin-right: 12px;
+    font-size: 14px;
+    display: inline-block;
+    .content-key {
+      color: #3e3e3e;
+      margin-right: 12px;
+      font-weight: 500;
+    }
+    .content-value {
+      color: #000;
+    }
+  }
+}
+.list-title {
+  font-size: 14px;
+  color: #3e3e3e;
+  margin: 10px 0px;
+}
+.goods {
+  background: #a30014;
+  border: 1px solid #a30014;
+}
+.details-title {
+  display: inline-block;
+  color: #6e6e6e;
+  font-size: 14px;
+  font-weight: bold;
+  margin-right: 13px;
+  width: 70px;
+  text-align: right;
+}
+.details-con {
+  color: #3e3e3e;
+  font-size: 14px;
+}
+.detailed-tab {
+  margin-left: 10px;
+  margin-top: 10px;
+}
+::v-deep .el-form-item--medium .el-form-item__label {
+  color: #6e6e6e;
+  font-size: 14px;
+  font-weight: bold;
+}
+.warehouse {
+  display: block;
+  border-bottom: 1px solid #eaeefb;
+  padding: 10px 0;
+}
+.box-card {
+  .store-box {
+    width: 80%;
+    .store-box-span {
+      display: inline-block;
+      font-size: 14px;
+      height: 50px;
+      width: 50px;
+      text-align: center;
+      line-height: 50px;
+      color: #fff;
+      margin: 2px;
+    }
+  }
+}
+.vacant {
+  background: #3196fb;
+}
+.inUse {
+  background: #157a2c;
+}
+.invalid {
+  background: #cccccc;
+}
+.full {
+  background: #cc3300;
+}
+</style>

+ 222 - 0
src/views/rulesManagement/matterRules/index.vue

@@ -0,0 +1,222 @@
+<template>
+  <div class="ele-body">
+     <el-card shadow="never" v-loading="loading">
+	   <matter-search @search="reload">
+	   </matter-search>
+	   <!-- 数据表格 -->
+	   <ele-pro-table
+	     ref="table"
+	     :columns="columns"
+	     :datasource="datasource"
+	     cache-key="systemRoleTable"
+	   >
+	     <!-- 表头工具栏 -->
+	     <template v-slot:toolbar>
+	       <el-button
+	         size="small"
+	         type="primary"
+	         icon="el-icon-plus"
+	         class="ele-btn-icon"
+	         @click="openEdit('add')"
+	       >
+	         新建
+	       </el-button>
+	     </template>
+		 <!-- 编码列 -->
+		 <template v-slot:code="{ row }">
+		   <el-link type="primary" :underline="false" @click="goDetail(row)">
+		     {{ row.code }}
+		   </el-link>
+		 </template>
+	     <!-- 操作列 -->
+	     <template v-slot:action="{ row }">
+		   <el-link
+		     type="primary"
+		     :underline="false"
+		     icon="el-icon-finished"
+		     @click="openEdit('clone',row)"
+		   >
+		     克隆
+		   </el-link>
+	       <el-link
+	         type="primary"
+	         :underline="false"
+	         icon="el-icon-edit"
+	         @click="openEdit('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>
+	 
+	 <!-- 新建或编辑弹窗 -->
+	 <matter-add
+	   ref="addMatterRulesRef"
+	   :pageType="pageType"
+	   :dialogTitle="dialogTitle"
+	   @done="reload"
+	 />
+  </div>
+</template>
+
+<script>
+
+  import MatterSearch from './components/matter-search.vue';
+  import MatterAdd from './components/matter-add.vue';
+  import { getList , getDetail , removeRule } from '@/api/ruleManagement/matter';
+  import dictMixins from '@/mixins/dictMixins';
+  export default {
+	mixins: [dictMixins],
+    components: {
+        MatterSearch,
+	    MatterAdd
+    },
+    data () {
+      return {
+		// 表格列配置
+		columns: [
+			{
+				columnKey: 'index',
+				label: '序号',
+				type: 'index',
+				width: 55,
+				align: 'center',
+				showOverflowTooltip: true,
+				fixed: 'left'
+			},
+			{
+				prop: 'code',
+				label: '规则编码',
+				align: 'center',	
+				showOverflowTooltip: true,
+				minWidth: 110,
+				slot:'code'
+			},
+			{
+				prop: 'status',
+				label: '状态',
+				align: 'center',
+				showOverflowTooltip: true,
+				minWidth: 110,
+				formatter: (_row, _column, cellValue) => {
+				  return this.getDictValue('规则状态',  _row.status)
+				}
+			},
+			{
+				prop: 'ruleType',
+				label: '规则类型',
+				align: 'center',	
+				showOverflowTooltip: true,
+				slot: 'enable',
+				minWidth: 110,
+				formatter: (_row, _column, cellValue) => {
+				  return this.getDictValue('规则类型',  _row.ruleType)
+				}
+			},
+			{
+				prop: 'name',
+				label: '规则名称',
+				align: 'center',	
+				showOverflowTooltip: true,
+				minWidth: 110
+			},
+			{
+				prop: 'cycle',
+				label: '周期',
+				align: 'center',	
+				showOverflowTooltip: true,
+				minWidth: 110,
+				formatter: (_row, _column, cellValue) => {
+				  return this.getDictValue('规则周期',  _row.cycleType)
+				}
+			},
+			{
+				prop: 'createUserName',
+				label: '创建人',
+				align: 'center',	
+				showOverflowTooltip: true,
+				minWidth: 110
+			},
+			{
+				prop: 'createTime',
+				label: '创建时间',
+				align: 'center',
+				showOverflowTooltip: true,
+				minWidth: 110,
+				formatter: (_row, _column, cellValue) => {
+					return this.$util.toDateString(cellValue);
+				}
+			},
+			{
+				columnKey: 'action',
+				label: '操作',
+				width: 230,
+				align: 'center',
+				resizable: false,
+				slot: 'action',
+				showOverflowTooltip: true
+			}
+		],
+        // 加载状态
+        loading: false,
+        pageType: 'add',
+        dialogTitle: '',
+      };
+    },
+    computed: {
+
+    },
+	created () {
+	  this.requestDict('规则周期');
+	  this.requestDict('规则类型');
+	  this.requestDict('规则状态');
+	},
+    methods: {
+      /* 表格数据源 */
+      datasource({ page, limit, where, order }) {
+        return getList({ pageNum: page, size: limit, ...where });
+      },
+      /* 刷新表格 */
+      reload(where) {
+        this.$refs.table.reload({ page: 1, where });
+      },
+	  
+	  remove(row){
+		  removeRule([row.id]).then(res=>{
+			  this.$message.success('删除成功!')
+			  this.reload()
+		  })
+	  },
+	  
+	  openEdit(type,row){
+		  this.pageType = type
+		  this.dialogTitle = type=='add'? '新建规则':(type=='edit'?'编辑规则':'克隆规则')
+		  this.$refs.addMatterRulesRef.openDialog(row , type)
+	  },
+	  
+	  goDetail({id}){
+		  this.$router.push({
+		    path: '/rulesManagement/matterRules/details',
+		    query: {id}
+		  })
+	  },
+
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+
+</style>

+ 520 - 0
src/views/rulesManagement/planRules/components/AssetsInWarehouse.vue

@@ -0,0 +1,520 @@
+<template>
+  <div class="assets-container" v-show="assetsName">
+    <div class="tree-wrapper">
+      <div class="title">
+        {{ assetsName }}
+        <el-checkbox
+          :value="assetsSelectAll"
+          @click.native.prevent="handleAssetsSelectAll"
+          :disabled="isBindPlan"
+        ></el-checkbox>
+      </div>
+      <div class="scroll-wrapper">
+        <el-tree
+          show-checkbox
+          :data="treeList"
+          :props="{
+            children: 'children',
+            value: 'code',
+            label: 'name',
+          }"
+          :filter-node-method="filterNode"
+          v-loading="treeLoading"
+          node-key="id"
+          ref="treeRef"
+          :default-expanded-keys="defaultExpandedKeys"
+          :highlight-current="true"
+          @node-click="handleNodeClick"
+          @check="clickCheck"
+        >
+          <span class="custom-tree-node" slot-scope="{ node, data }">
+            <span>{{ node.label }}</span>
+          </span>
+        </el-tree>
+      </div>
+    </div>
+    <div :class="isBindPlan ? 'table-wrapper' : 'table-box'">
+      <el-table
+        style="width: 100% !important"
+        height="400px"
+        ref="tableRef"
+        :data="tableData"
+        @selection-change="handleSelectionChange"
+        @select="handleCurSelectionChange"
+        :key="assetsName"
+        :header-cell-style="{
+          background: '#F0F3F3',
+          border: 'none',
+        }"
+        :disabled="isBindPlan"
+      >
+        <el-table-column
+          v-for="item in tableInfoData"
+          :key="item.key"
+          :prop="item.inKey"
+          :label="item.label"
+          :width="item.width"
+        >
+        </el-table-column>
+        <el-table-column
+          type="selection"
+          :selectable="selectable"
+          :width="tableData.length ? '55' : '500'"
+        >
+        </el-table-column>
+      </el-table>
+    </div>
+  </div>
+</template>
+
+<script>
+// import classManagement from "@/api/ledgerAssets/classManagement";
+// import { tableContentData } from '../../../components/enum'
+import { mapGetters } from "vuex";
+// import {
+//   getInventoryListGroup,
+//   getgoodspage,
+// } from "@/api/stockManagement/stocking";
+import { tableContentData } from "./tableContentData.js";
+export default {
+  props: {
+    assetsName: {
+      type: String,
+      default: "",
+    },
+    warehouseId: {
+      type: [Number, String],
+      default: "",
+    },
+    tableValuableList: {
+      type: Array,
+      default: () => [],
+    },
+    assetsType: {
+      type: [String, Number],
+      default: "",
+    },
+    assetSubType: {
+      type: [String, Number],
+      default: "",
+    },
+    planRuleInventoryDetailList: {
+      type: Array,
+      default: [],
+    },
+    isBindPlan: {
+      type: Boolean,
+      default: function () {
+        return false;
+      },
+    },
+  },
+  computed: {
+    ...mapGetters(["addOrUpdate"]),
+  },
+  watch: {
+    // warehouseId() {
+    //   if (this.curNode) {
+    //     this.getTableInfo(
+    //       this.curNode.data.id === this.curNode.data.originId
+    //         ? ""
+    //         : this.curNode.data.id
+    //     );
+    //   }
+    // },
+    planRuleInventoryDetailList(val) {
+      console.log('asd',val)
+      if (val) {
+        this.$nextTick(() => {
+          val.forEach((item) => {
+            if (!this.tableSelectionList[item.bizTypeId]) {
+              this.tableSelectionList[item.bizTypeId] = [item];
+            } else {
+              this.tableSelectionList[item.bizTypeId].push(item);
+            }
+          });
+          this.handleAssetsChange();
+        });
+      }
+    },
+  },
+  data() {
+    return {
+      treeList: [],
+      tableInfoData: [],
+      tableData: [],
+      requestApi: "",
+      treeLoading: false,
+      tableSelectionList: {},
+      assetsSelectionList: [],
+      assetsSelectAll: false,
+      curNode: null,
+      defaultExpandedKeys: [],
+      changeData: [],
+      isChecked: false,
+    };
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.handleAssetsChange();
+    });
+  },
+  created() {
+    // console.log('库内')
+    // if(this.planRuleInventoryDetailList){
+    //   console.log('this.planRuleInventoryDetailList',this.planRuleInventoryDetailList)
+    //   this.tableData = this.planRuleInventoryDetailList
+    // }
+  },
+  methods: {
+    //表格复选框禁用
+    selectable(row, rowIndex) {
+      if (this.isBindPlan) {
+        return false;
+      } else {
+        return true;
+      }
+    },
+    // 重置
+    resetData() {
+      this.clearSelection();
+      this.treeList = [];
+    },
+    //清除选中
+    clearSelection() {
+      this.assetsSelectAll = false;
+      this.tableData = [];
+      this.tableSelectionList = {};
+    },
+    //派单过滤
+    filterNode(value, data, node) {
+      return (
+        this.tableValuableList.findIndex(
+          (item) => item.bizTypeId === data.id
+        ) !== -1
+      );
+    },
+    getSelectList() {
+      const classificationList =
+        (this.$refs.treeRef && this.$refs.treeRef.getCheckedNodes()) || [];
+      const list = Object.values(this.tableSelectionList) || [];
+      var arr = [];
+      list.map((item, index) => {
+        for (var i = 0; i < item.length; i++) {
+          arr.push(item[i]);
+        }
+      });
+      const tableSelectionList = arr;
+      return {
+        classificationList,
+        tableSelectionList,
+        // tableSelectionList: Object.values(this.tableSelectionList)
+        //   .flat()
+        //   .filter(
+        //     // i => !classificationList.find(itm => i.classificationId == itm.id)
+        //      i => !classificationList.find(itm => i.bizTypeId == itm.id)
+        //   )
+        //   .map(item => {
+        //     item.minPackUnit = item.minPackUtil
+        //     return item
+        //   })
+      };
+    },
+    handleAssetsChange() {
+      setTimeout(() => {
+        if (this.assetsName) {
+          let obj = tableContentData.find(
+            (item) => item.name === this.assetsName
+          );
+          this.tableInfoData = (obj && obj.tableData) || [];
+          this._getTreeList();
+          // this.clearSelection()
+        }
+      }, 0);
+    },
+    // 设备、舟皿、周转车、模具
+    async _getTreeList() {
+      let res = await classManagement.getClassificationTreeAsyncCall({
+        id: "0",
+        type: this.assetsType,
+      });
+      if (res?.success) {
+        this.treeList = res.data[0]?.children || [];
+        if (this.isBindPlan) {
+          this.deepEach(this.treeList);
+        }
+        if (this.tableValuableList?.length) {
+          this.$nextTick(() => {
+            this.$refs.treeRef.filter();
+          });
+        }
+
+        if (this.addOrUpdate === "edit") {
+          let keys = [];
+          this.planRuleInventoryDetailList.map((item) => {
+            if (item.bizTypeId !== null) {
+              keys.push(item.bizTypeId);
+            }
+          });
+          keys = [...new Set(keys)];
+          this.defaultExpandedKeys = keys;
+          if (keys.length) {
+            this.$nextTick(() => {
+              this.$refs.treeRef.setCurrentKey(keys[0]);
+              this.convertTreeData();
+              let chooseData = null;
+              this.changeData.map((item) => {
+                if (item.id == keys[0]) {
+                  chooseData = item;
+                }
+              });
+              if (chooseData) {
+                this.getTableInfo(chooseData.id);
+              }
+              //    this.handleNodeClick(chooseData,node)
+            });
+          }
+        }
+      }
+    },
+    handleNodeClick(data, node) {
+      console.log(node, "node");
+      if (!node.isLeaf) return; //限制叶子节点
+      this.curNode = node;
+      // this.getTableInfo(data.id === data.originId ? '' : data.id)
+      this.getTableInfo({
+        assetType: data.type,
+        classificationIds: [data.id],
+      });
+    },
+    setclassIds(data, list) {
+      if (data && data.length !== 0) {
+        data.forEach((item) => {
+          if (item.children && item.children.length !== 0) {
+            this.setclassIds(item.children, list);
+          }
+          list.push(item.id);
+        });
+      }
+      return list;
+    },
+
+    async getTableInfo(assetSubType) {
+      const params = {
+        page: 1,
+        size: 9999,
+        ...assetSubType,
+      };
+
+      if (assetSubType) {
+        params.assetSubType = assetSubType;
+      }
+      const res = await getgoodspage(params);
+      if (res?.success) {
+        if (this.tableValuableList && this.tableValuableList.length) {
+          // 派单过滤
+          this.tableData = res.data.records
+            .filter(
+              (item) =>
+                this.tableValuableList.findIndex(
+                  (i) => i.assetId == item.id
+                ) !== -1
+            )
+            .map((i, index) => ({
+              ...i,
+              index,
+              classificationId: assetSubType,
+            }));
+        } else {
+          this.tableData = res.data.records.map((i, index) => ({
+            ...i,
+            index,
+            classificationId: assetSubType,
+          }));
+        }
+        const checkedTrees = this.$refs.treeRef.getCheckedKeys();
+
+        // if(this.addOrUpdate === 'edit'){
+        //   this.defaultExpandedKeys
+        // }
+        this.$nextTick(() => {
+          //分类选中
+          this.tableData.map((item) => {
+            if (checkedTrees.includes(item.classificationId + "")) {
+              this.$refs.tableRef.toggleRowSelection(item);
+            }
+          });
+          // 表格选中(切换保存状态
+          for (const key in this.tableSelectionList) {
+            this.tableSelectionList[key].forEach((item) => {
+              const row = this.tableData.find((i) => i.id === item.id);
+              if (row) {
+                //this.$refs.tableRef.toggleRowSelection(row, true)
+              }
+            });
+          }
+        });
+
+        if (this.addOrUpdate === "edit") {
+          if (this.planRuleInventoryDetailList) {
+            this.tableData.map((item) => {
+              for (
+                var i = 0;
+                i < this.planRuleInventoryDetailList.length;
+                i++
+              ) {
+                if (
+                  item.id == this.planRuleInventoryDetailList[i].id
+                ) {
+                  this.$nextTick(() => {
+                    this.$refs.tableRef.toggleRowSelection(item, true);
+                  });
+                }
+              }
+            });
+          }
+        }
+      }
+    },
+
+    // tree选中状态改变
+    clickCheck(data, checkinfo) {
+      const isChecked = checkinfo.checkedKeys.indexOf(data.id) > -1;
+
+      if (!isChecked) {
+        //取消全选
+        this.assetsSelectAll = false;
+      }
+
+      if (this.curNode && this.curNode.data.id === data.id) {
+        this.tableData.forEach((row) => {
+          this.$refs.tableRef.toggleRowSelection(row, isChecked);
+        });
+      }
+    },
+
+    // 资产分类全选  通过点击事件更改状态
+    handleAssetsSelectAll() {
+      if (this.isBindPlan) return;
+      this.assetsSelectAll = !this.assetsSelectAll;
+      if (this.assetsSelectAll) {
+        const keys = this.treeList.map((item) => item.id);
+        this.$refs.treeRef.setCheckedKeys(keys);
+      } else {
+        this.$refs.treeRef.setCheckedKeys([]);
+      }
+    },
+    handleSelectionChange(val) {
+      console.log(val);
+      let bizType = {};
+      if (this.curNode) {
+        bizType = {
+          bizTypeId: this.curNode.data?.id,
+          bizTypeName: this.curNode.data?.name,
+        };
+        this.$set(
+          this.tableSelectionList,
+          this.curNode.data.id,
+          val.map((i) => ({
+            ...i,
+            ...bizType,
+          }))
+        );
+      }
+      if (val.length > 0 && val.length === this.tableData.length) {
+        //全选
+        this.$refs.treeRef.setChecked(val[0].classificationId, true);
+      }
+      if (val.length === 0 && this.tableData.length > 0) {
+        //全不选
+        this.$refs.treeRef.setChecked(
+          this.tableData[0].classificationId,
+          false
+        );
+      }
+    },
+    handleCurSelectionChange(selection, row) {
+      if (selection.findIndex((item) => item.index === row.index) === -1) {
+        //取消选中
+        this.$refs.treeRef.setChecked(row.classificationId, false);
+
+        for (const key in this.tableSelectionList) {
+          const idx = this.tableSelectionList[key].findIndex(
+            (item) => item.id === row.id
+          );
+          if (idx !== -1) {
+            this.tableSelectionList[key].splice(idx, 1);
+          }
+        }
+      }
+    },
+
+    convertTreeData() {
+      this.changeData = this.treeList;
+      for (let i = 0; i < this.changeData.length; i++) {
+        if (this.changeData[i].children != undefined) {
+          const temp = this.changeData[i].children;
+          delete this.changeData[i].children;
+          this.changeData = this.changeData.concat(temp);
+        }
+      }
+    },
+
+    // 子节点处理
+    deepEach(arr) {
+      arr.forEach((item) => {
+        item.disabled = true;
+        if (item.children) {
+          this.deepEach(item.children); // 递归
+        }
+      });
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+::v-deep .table-wrapper .el-table__header-wrapper .el-checkbox {
+  display: none;
+}
+::v-deep.assets-container {
+  display: flex;
+  width: 100%;
+  .el-tree-node__content > .el-checkbox {
+    position: absolute;
+    right: 0;
+  }
+  .tree-wrapper {
+    // width: 350px;
+    width: 30%;
+    margin-right: 12px;
+    border: 1px solid #ccc;
+
+    .title {
+      text-align: center;
+      font-size: 16px;
+      font-weight: bold;
+      background: #f0f3f3;
+      padding: 4px;
+      padding-right: 8px;
+      .el-checkbox {
+        float: right;
+      }
+    }
+    .scroll-wrapper {
+      padding-top: 8px;
+    }
+  }
+  .table-wrapper {
+    width: 70%;
+    padding: 8px;
+    border: 1px solid #ccc;
+  }
+
+  .table-box {
+    width: 70%;
+    padding: 8px;
+    border: 1px solid #ccc;
+  }
+}
+</style>

+ 580 - 0
src/views/rulesManagement/planRules/components/addInventoryDialog.vue

@@ -0,0 +1,580 @@
+<template>
+  <el-dialog
+    :visible.sync="dialogVisible"
+    :title="dialogTile"
+    :before-close="handleClose"
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    v-loading="addDialogLoading"
+    width="80%"
+  >
+    <el-form
+      :model="addForm"
+      class="add_form"
+      ref="addFormRef"
+      :rules="rules"
+      label-width="110px"
+    >
+      <el-row :gutter="20">
+       <el-col :span="8">
+          <el-form-item label="计划配置单号" prop="code">
+            <el-input
+              v-model="addForm.code"
+              placeholder="自动生成"
+              disabled
+            ></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="计划配置名称" prop="planRuleName">
+            <el-input
+              v-model="addForm.planRuleName"
+              placeholder="请输入"
+               :disabled="isBindPlan"
+            ></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="自动派单" prop="isSyncBill">
+            <el-select
+              v-model="addForm.isSyncBill"
+              class="w100"
+              placeholder="请选择"
+               :disabled="isBindPlan"
+			   filterable
+            >
+              <el-option :value="true" label="是"></el-option>
+              <el-option :value="false" label="否"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="规则名称" prop="ruleId">
+            <el-select
+              v-model="addForm.ruleId"
+              class="w100"
+              placeholder="请选择规则名称"
+               :disabled="isBindPlan"
+			  filterable
+            >
+              <el-option
+                v-for="item in ruleNameList"
+                :key="item.id"
+                :value="item.id"
+                :label="item.name"
+                @click.native="addForm.ruleName = item.name"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="盘点类型" prop="bizType">
+            <el-select
+              v-model="addForm.bizType"
+              class="w100"
+              placeholder="请选择"
+              @change="chooseType"
+               :disabled="isBindPlan"
+			  filterable
+            >
+              <el-option
+                v-for="item in wh_checkStatus"
+                :key="item.code"
+                :value="item.code"
+                :label="item.label"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item
+            label="盘点仓库"
+            :rules="
+              addForm.bizType == 1
+                ? [
+                    {
+                      required: true,
+                      message: '请选择资产类别',
+                      trigger: ['blur', 'change']
+                    }
+                  ]
+                : []
+            "
+          >
+            <el-select
+              placeholder="请选择"
+              class="w100"
+              v-model="addForm.bizTypeId"
+              :disabled="addForm.bizType == 2||isBindPlan"
+			  filterable
+            >
+              <el-option
+                v-for="item in warehouseList"
+                :key="item.id"
+                :value="item.id"
+                :label="item.name"
+                @click.native="
+                  () => {
+                    addForm.bizTypeName = item.name
+                  }
+                "
+              ></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="审核人" prop="verifyUserId">
+            <el-select
+              v-model="addForm.verifyUserId"
+              size="small"
+              style="width: 100%"
+               :disabled="isBindPlan"
+			   filterable
+            >
+			  <el-option
+			    v-for="item in uerList"
+			    :key="item.id"
+			    :value="item.id"
+			    :label="item.name"
+			  ></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="计划盘点时长" prop="duration">
+            <el-input v-model.number="addForm.duration" placeholder="请输入" :disabled="isBindPlan">
+              <template #suffix>分钟</template>
+            </el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="资产分类" prop="assetDict">
+            <DictSelection dictName="类型用途" clearable filterable v-model="addForm.assetDict">
+            </DictSelection>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8" v-if="addForm.isSyncBill">
+          <el-form-item label="执行部门" prop="executorDeptCode">
+				<deptSelect v-model="addForm.executorDeptCode" @changeGroup="searchDeptNodeClick"/>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8" v-if="addForm.isSyncBill">
+          <el-form-item label="执行人员" prop="executorId">
+			  <el-select
+			    v-model="addForm.executorId"
+			    size="small"
+			    style="width: 100%"
+			    :disabled="isBindPlan"
+				filterable
+			  >
+			    <el-option
+			      v-for="item in executorList"
+			      :key="item.id"
+			      :value="item.id"
+			      :label="item.name"
+			    ></el-option>
+			  </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="紧急程度" prop="urgent">
+			  <DictSelection dictName="紧急程度" clearable filterable v-model="addForm.urgent">
+			  </DictSelection>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="锁库盘点" prop="isTreasuryLock">
+            <el-switch
+              v-model="addForm.isTreasuryLock"
+              active-text="开"
+              inactive-text="关"
+              :active-value="1"
+              :inactive-value="0"
+               :disabled="isBindPlan"
+            ></el-switch>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="状态" prop="status">
+            <el-switch
+              v-model="addForm.status"
+              active-text="开"
+              inactive-text="关"
+              :active-value="true"
+              :inactive-value="false"
+            ></el-switch>
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="备注" prop="remark">
+            <el-input
+              placeholder="请输入"
+              type="textarea"
+              :rows="2"
+              resize="none"
+              v-model="addForm.remark"
+               :disabled="isBindPlan"
+            ></el-input>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <!-- 库外 -->
+      <!-- <Assets
+        ref="assetsRef"
+        :assetsName="addForm.assetsName"
+        :assetsType="assetsType"
+        :planRuleInventoryDetailList="planRuleInventoryDetailList"
+        :isBindPlan = "isBindPlan"
+        v-if="
+          addForm.bizType === 2 &&
+          addForm.assetsName != '物料' &&
+          addForm.assetsName != '产品' &&
+          addForm.assetsName != '备品备件'
+        "
+      /> -->
+      <!-- 库内 库存台账 -->
+      <AssetsInWarehouse
+        ref="assetsRef"
+        :assetsName="addForm.assetsName"
+        :warehouseId="addForm.bizTypeId"
+        :assetsType="assetsType"
+        :bizType="addForm.bizType"
+        :planRuleInventoryDetailList="planRuleInventoryDetailList"
+        :isBindPlan = "isBindPlan"
+      />
+    </el-form>
+    <div slot="footer">
+      <el-button type="primary" size="small" @click="submit">提交</el-button>
+      <el-button size="small" @click="handleClose">关闭</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { mapGetters } from 'vuex'
+// import { wh_checkStatus} from '@/utils/dict/warehouse'
+import { getCode , getWarehouseList } from '@/api/ruleManagement/matter';
+import AssetsInWarehouse from './AssetsInWarehouse'
+import { getRule } from '@/api/ruleManagement/plan'
+import {  getUserPage } from '@/api/system/organization';
+import deptSelect from '@/components/CommomSelect/dept-select.vue'
+export default {
+  props: {
+    dialogTile: {
+      type: String,
+      default: '新增盘点计划配置'
+    },
+    isBindPlan: {
+      type: Boolean,
+      default: function () {
+        return false
+      }
+    },
+  },
+  components: { 
+	deptSelect,
+    AssetsInWarehouse 
+  },
+  data () {
+    return {
+	  addDialogLoading:false,
+      dialogVisible: false,
+      wh_checkStatus:[], // 盘点类型
+      warehouseList: [], // 盘点仓库
+      uerList: [], // 审核人
+      executorList: [], // 执行人
+      assetsType: null,
+      planRuleInventoryDetailList: [],
+      addForm: {
+        code: '', // 计划配置单号
+        planRuleName: '', // 计划配置名称
+        isSyncBill: true, // 是否自动派单
+        ruleId: '', // 规则名称
+        bizType: '', // 盘点类型
+        bizTypeId: '', // 盘点仓库Id
+        bizTypeName: '', // 盘点仓库name
+        verifyUserId: '', // 审核人Id
+        verifyUserName: '', // 审核人name
+        duration: null, // 盘点时长
+        assetDict: '', // 资产分类id
+        assetsName: '', // 资产分类name
+        urgent: null, // 紧急程度
+        executorDeptCode: '', // 执行部门code
+        executorDeptName: '', // 执行部门name
+        executorId: '', // 执行人id
+        executorName: '', // 执行人name
+        isTreasuryLock: false, // 是否锁库盘点
+        status: true, // 状态
+        remark: '' // 备注
+      },
+      rules: {
+        planRuleName: [
+          { required: true, message: '请输入计划配置名称', trigger: 'blur' }
+        ],
+        isSyncBill: [
+          { required: true, message: '请选择是否自动派单', trigger: 'change' }
+        ],
+        ruleId: [
+          { required: true, message: '请选择规则名称', trigger: 'change' }
+        ],
+        duration: [
+          { required: true, message: '请输入计划完成时长', trigger: 'blur' }
+        ],
+        bizType: [
+          { required: true, message: '请选择盘点类型', trigger: 'change' }
+        ],
+        bizTypeId: [
+          { required: true, message: '请选择盘点仓库', trigger: 'change' }
+        ],
+        verifyUserId: [
+          { required: false, message: '请选择审核人', trigger: 'change' }
+        ],
+        executorDeptCode: [
+          { required: true, message: '请选择选择执行部门', trigger: 'change' }
+        ],
+        executorId: [
+          { required: true, message: '请选择选择执行人员', trigger: 'change' }
+        ],
+        assetDict: [
+          { required: true, message: '请选择资产分类', trigger: 'change' }
+        ]
+      },
+      ruleNameList:[],
+    }
+  },
+  watch: {
+    dialogVisible (val) {
+      if (val) {
+        // 获取审核人列表数据
+        this.getUserList()
+        // 获取盘点仓库
+        this._getWarehouse()
+        // 获取计划单号
+        this.getOrderCode()
+        // 获取规则名称
+        this._getRuleNameList()
+      }
+    },
+    planRulesDetails (val) {
+      if (!this.dialogVisible) return
+      this.addForm = val
+      this.addForm.assetsName = val.assetDictDESC
+      this.assetsType = val.assetDict
+      // this.warehousingType.map(item => {
+      //   if (val.assetsName == item.label) {
+      //     this.assetsType = item.code
+      //   }
+      // })
+      // this.assetsType = this.warehousingType.filter(
+      //   item => item.code === val.assetDict.code
+      // )[0].type
+      // this.addForm.assetDict = this.warehousingType.filter(
+      //   item => item.code === val.assetDict.code
+      // )[0].key
+      // 根据部门回显人员
+      const params = { deptCode: val.executorDeptCode, status: 1 }
+      this.getUserList(params)
+      this.planRuleInventoryDetailList = val.planRuleInventoryDetailList
+      console.log(
+        'planRuleInventoryDetailList',
+        this.planRuleInventoryDetailList
+      )
+      // 将 planRuleInventoryDetailList 保存到store,在 assets.vue 中获取用来高亮树节点和请求右边的列表
+      // 取出 planRuleInventoryDetailList 里面的分类 bizTypeId、bizTypeName,用来高亮树节点和请求右边的列表
+      // console.log('资产分类:', val.assetDict)
+      // console.log(this.addForm.assetsName)
+    }
+  },
+  computed: {
+    // ...mapGetters([
+    //   'equipmentList',
+    //   // 'ruleNameList',
+    //   'planRulesDetails',
+    //   'addDialogLoading',
+    //   'addOrUpdate'
+    // ])
+  },
+  methods: {
+    // 获取规则名列表
+    async _getRuleNameList () {
+      const res = await getRule({status:1,type:4,pageNum:1,size:-1})
+      if (res.list) {
+        this.ruleNameList = res.list || []
+      }
+    },
+	// 获取计划配置单号
+	async getOrderCode (tips) {
+		const code = await getCode('inventoryconfig_code');
+		this.$set(this.addForm, 'code', code);
+	}, 
+    // 关闭弹窗
+    handleClose () {
+      this.dialogVisible = false
+      this.$refs.addFormRef.resetFields()
+      if (this.$refs.searchTree) {
+        this.$refs.searchTree.clearHandle()
+      }
+      if (this.addForm.bizType == 2) {
+        this.$refs.assetsRef._clearTreeTableData()
+      }
+      this.addForm.assetsName = ''
+      this.assetsType = null
+      this.addForm = {
+        code: '', // 计划配置单号
+        planRuleName: '', // 计划配置名称
+        isSyncBill: null, // 是否自动派单
+        ruleId: '', // 规则名称
+        bizType: '', // 盘点类型
+        bizTypeId: '', // 盘点仓库Id
+        bizTypeName: '', // 盘点仓库name
+        verifyUserId: '', // 审核人Id
+        verifyUserName: '', // 审核人name
+        duration: null, // 盘点时长
+        assetDict: '', // 资产分类id
+        assetsName: '', // 资产分类name
+        urgent: null, // 紧急程度
+        executorDeptCode: '', // 执行部门code
+        executorDeptName: '', // 执行部门name
+        executorId: '', // 执行人id
+        executorName: '', // 执行人name
+        isTreasuryLock: false, // 是否锁库盘点
+        status: true, // 状态
+        remark: '' // 备注
+      }
+    },
+
+    // 封装 - 获取盘点仓库
+    async _getWarehouse () {
+	  const params =  {  pageNum: 1 ,size:-1 }
+      const res = await getWarehouseList(params)
+	  this.warehouseList = res.list
+    },
+
+    //选择部门(搜索)
+    searchDeptNodeClick (info) {
+      if (info) {
+		   const params = { groupId: info }
+		   this.getUserList(params)
+      } else {
+        this.addForm.executorDeptCode = null
+      }
+    },
+	
+	// 获取审核人列表、巡点检人员
+	async getUserList (params) {
+	  try {
+	    let data = {  pageNum: 1 ,size:-1 }
+	    // 如果传了参数就是获取巡点检人员数据
+	    if (params) {
+	      data = Object.assign(data, params)
+	    }
+	    const res = await getUserPage(data)
+	    if (params) {
+	      this.executorList = res.list
+	    } else {
+	      this.uerList = res.list
+	    }
+	  } catch (error) {}
+	},
+
+    // 资产分类
+    handleAssetsChange (item) {
+      this.addForm.assetsName = item.dictValue
+      this.assetsType = item.dictCode
+      this.$nextTick(
+        () => this.$refs.assetsRef && this.$refs.assetsRef.handleAssetsChange()
+      )
+    },
+
+    // 参数处理
+    getParams () {
+      const { classificationList, tableSelectionList } =
+      this.$refs.assetsRef.getSelectList()
+      console.log('getParams-tableSelectionList',tableSelectionList)
+      return {
+        ...this.addForm,
+        classificationList: classificationList.map(i => ({
+          classificationID: i.id,
+          classificationName: i.name
+        })),
+        planRuleInventoryDetailList:
+          this.formData && this.formData.bizType === 2
+            ? tableSelectionList.map(item => ({
+                assetBrand: item.brand,
+                assetCode: item.code,
+                assetId: item.id,
+                assetLocationId: `${this.initLocation(
+                  item.positionWorkshop
+                )}${this.initLocation(item.positionLine)}${this.initLocation(
+                  item.positionFarm
+                )}${this.initLocation(item.positionFactory)}`,
+                assetLocationName: `${this.initLocation(
+                  item.positionWorkshopCode
+                )}${this.initLocation(
+                  item.positionLineCode
+                )}${this.initLocation(
+                  item.positionFarmCode
+                )}${this.initLocation(item.positionFactoryCode)}`,
+                assetName: item.name,
+                assetSku: item.specifications,
+                assetTypeDict: this.addForm ? this.addForm.assetDict : '',
+                bizTypeId: item.bizTypeId,
+                bizTypeName: item.bizTypeName,
+                unit: this.addForm ? this.addForm.unit : ''
+              }))
+            : tableSelectionList,
+        planRuleType: 'INVENTORY'
+      }
+
+    },
+    initLocation (inp) {
+      return inp ? inp + ',' : ''
+    },
+
+    // x选择盘点类型
+    chooseType (val) {
+      if (val == 2) {
+        this.addForm.bizTypeId = null
+        this.addForm.bizTypeName = null
+      }
+    },
+
+    // 提交
+    submit () {
+      this.$refs.addFormRef.validate(async valid => {
+        if (valid) {
+          const params = this.getParams()
+          console.log('planRuleInventoryDetailList',params.planRuleInventoryDetailList)
+          if(this.addOrUpdate!='edit'){
+              if (
+                !(
+                  params.classificationList.length ||
+                  params.planRuleInventoryDetailList.length
+                )
+              ) {
+                return this.$message.error('请选择资产分类台账!')
+              }
+          }
+          const res = await planRules.handleSaveOrUpdate(params)
+          if (res?.success) {
+            this.handleClose()
+            this.$message.success('保存成功!')
+            this.$emit('refreshList')
+          }
+        }
+      })
+    },
+    handleChangeassetDict(data){
+        console.log(data)
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.add_form {
+  ::v-deep .el-form-item {
+    margin-bottom: 20px !important;
+  }
+}
+</style>

+ 116 - 0
src/views/rulesManagement/planRules/components/inventory-search.vue

@@ -0,0 +1,116 @@
+<!-- 搜索表单 -->
+<template>
+  <el-form
+    label-width="100px"
+    class="ele-form-search"
+    @keyup.enter.native="search"
+    @submit.native.prevent
+  >
+    <el-row :gutter="15">
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="计划配置单号:">
+          <el-input clearable v-model="where.code" placeholder="请输入" />
+        </el-form-item>
+		<el-form-item label="资产分类:">
+			<DictSelection dictName="类型用途" clearable v-model="where.staus">
+			</DictSelection>
+		</el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="盘点名称:">
+          <el-input clearable v-model="where.name" placeholder="请输入" />
+        </el-form-item>
+        <el-form-item label="规则名称:">
+           <el-input clearable v-model="where.name" placeholder="请输入" />
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="盘点部门:">
+          <deptSelect v-model="where.groupId" />
+        </el-form-item>
+		<el-form-item label="创建时间:">
+			<el-date-picker
+				v-model="where.time"
+				type="daterange"
+				range-separator="至"
+				start-placeholder="开始日期"
+				end-placeholder="结束日期"
+				value-format="yyyy-MM-dd HH:mm:ss"
+				:default-time="['00:00:00', '23:59:59']"
+			  >
+			</el-date-picker>
+		</el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="盘点名称:">
+          <el-input clearable v-model="where.texture" placeholder="请输入" />
+        </el-form-item>
+		<div class="ele-form-actions">
+			<el-button
+				type="primary"
+				icon="el-icon-search"
+				class="ele-btn-icon"
+				@click="search"
+				size="small"
+			>
+				查询
+			</el-button>
+			 <el-button @click="reset"
+				 icon="el-icon-refresh-left"
+				 size="small"
+				 type="primary"
+			 >重置</el-button>
+		</div>
+      </el-col>
+    </el-row>
+  </el-form>
+</template>
+
+<script>
+  import { login } from '@/api/login';
+	import deptSelect from '@/components/CommomSelect/dept-select.vue';
+  export default {
+		components: { deptSelect },
+    data() {
+      // 默认表单数据
+      const defaultWhere = {
+        name: '',
+        code: '',
+        fixCode:'',
+        ownershipGroupId:''
+      };
+      return {
+        // 表单数据
+        where: { ...defaultWhere },
+        treeData:[]
+      };
+    },
+    computed: {
+      // 是否开启响应式布局
+      styleResponsive() {
+        return this.$store.state.theme.styleResponsive;
+      }
+    },
+    created(){
+    },
+    methods: {
+      /* 搜索 */
+      search() {
+        console.log(this.where);
+        this.$emit('search', this.where);
+      },
+      /*  重置 */
+      reset() {
+        this.where = { ...this.defaultWhere };
+        this.search();
+      }
+    }
+  };
+</script>
+<style lang="scss" scoped>
+    .ele-form-actions{
+		display:flex;
+		align-items: center;
+		justify-content: flex-end;
+	}
+</style>

+ 86 - 0
src/views/rulesManagement/planRules/components/tableContentData.js

@@ -0,0 +1,86 @@
+// 盘点
+export const tableContentData = [
+    {
+        name: '原料',
+        tableData: [
+            { label: '物品编码', key: 'informationCode', inKey: 'informationCode' },
+            { label: '物品名称', key: 'informationName', inKey: 'informationName' },
+            { label: '牌号', key: 'brandNum', inKey: 'brandNum' },
+        ]
+    },
+    {
+        name: '耗材',
+        tableData: [
+            { label: '物品编码', key: 'informationCode', inKey: 'informationCode' },
+            { label: '物品名称', key: 'informationName', inKey: 'informationName' },
+            { label: '规格', key: 'specification', inKey: 'specification' },
+            { label: '型号', key: 'modelType', inKey: 'modelType' }
+        ]
+    },
+    {
+        name: '物料',
+        tableData: [
+            { label: '物品编码', key: 'informationCode', inKey: 'informationCode' },
+            { label: '物品名称', key: 'informationName', inKey: 'informationName' },
+            { label: '规格', key: 'specification', inKey: 'specification' },
+            { label: '型号', key: 'modelType', inKey: 'modelType' },    
+        ]
+    },
+    {
+        name: '产品',
+        tableData: [
+            { label: '物品编码', key: 'informationCode', inKey: 'informationCode' },
+            { label: '物品名称', key: 'informationName', inKey: 'informationName' },
+            { label: '牌号', key: 'brandNum', inKey: 'brandNum' },
+            { label: '型号', key: 'modelType', inKey: 'modelType' }
+        ]
+    },
+    {
+        name: '周转车',
+        tableData: [
+            { label: '物品编码', key: 'informationCode', inKey: 'informationCode' },
+            { label: '物品名称', key: 'informationName', inKey: 'informationName' },
+            { label: '规格', key: 'specification', inKey: 'specification' },
+            { label: '材质', key: 'specification', inKey: 'specification' },
+            { label: '长/宽/高', key: 'ckg', inKey: 'ckg' },
+        ]
+    },
+    {
+        name: '舟皿',
+        tableData: [
+            { label: '物品编码', key: 'informationCode', inKey: 'informationCode' },
+            { label: '物品名称', key: 'informationName', inKey: 'informationName' },
+            { label: '规格', key: 'specification', inKey: 'specification' },
+            { label: '型号', key: 'modelType', inKey: 'modelType' },    
+            { label: '长/宽/高', key: 'ckg', inKey: 'ckg' },
+        ]
+    },
+    {
+        name: '生产设备',
+        tableData: [
+            { label: '物品编码', key: 'informationCode', inKey: 'informationCode' },
+            { label: '物品名称', key: 'informationName', inKey: 'informationName' },
+            { label: '规格', key: 'specification', inKey: 'specification' },
+            { label: '型号', key: 'modelType', inKey: 'modelType' }
+        ]
+    },
+    {
+        name: '模具',
+        tableData: [
+            { label: '物品编码', key: 'informationCode', inKey: 'informationCode' },
+            { label: '物品名称', key: 'informationName', inKey: 'informationName' },
+            { label: '规格', key: 'specification', inKey: 'specification' },
+            { label: '型号', key: 'modelType', inKey: 'modelType' },
+            { label: '收缩系数', key: 'shrinkageCoefficient', inKey: 'shrinkageCoefficient' }
+        ]
+    },
+    {
+        name: '备品备件',
+        tableData: [
+            { label: '物品编码', key: 'informationCode', inKey: 'informationCode' },
+            { label: '物品名称', key: 'informationName', inKey: 'informationName' },
+            { label: '规格', key: 'specification', inKey: 'specification' },
+            { label: '型号', key: 'modelType', inKey: 'modelType' },    
+        ]
+    }
+]

+ 528 - 0
src/views/rulesManagement/planRules/detail.vue

@@ -0,0 +1,528 @@
+<template>
+  <div class="content-height p20">
+    <div class="flex createdInfo">
+      <!-- <div>
+        <span class="col">状态</span>
+        <span>{{ infoData.planStatus && infoData.planStatus.descp }}</span>
+      </div> -->
+      <div>
+        <span class="col">创建人</span>
+        <span>{{ infoData.createUserName }}</span>
+      </div>
+      <div>
+        <span class="col">创建时间</span>
+        <span>{{ infoData.createTime }}</span>
+      </div>
+    </div>
+<!--    <div class="switch mt40">
+      <div class="switch_left">
+        <ul>
+          <li :class="{ active: num == 1 }" @click="selectActive(1)">详情</li>
+        </ul>
+      </div>
+    </div> -->
+
+    <div v-if="num === 1">
+      <div class="content-detail mt40">
+		<HeaderTitle title="派单信息" size="16px"></HeaderTitle>
+        <div class="mt20">
+          <el-form label-width="130px">
+            <el-col :span="8">
+              <el-form-item label="单据编号">
+                {{ infoData.planRuleCode }}
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="盘点名称">
+                {{ infoData.planRuleName }}
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="资产类型">
+                {{ infoData.assetDict && infoData.assetDict.descp }}
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="盘点类型">
+                {{ infoData.bizType | useDictLabelFilter(wh_checkStatus) }}
+              </el-form-item>
+            </el-col>
+            <el-col :span="8" v-if="infoData.bizType == 1">
+              <el-form-item label="盘点仓库">
+                {{ infoData.bizTypeName }}
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="盘点部门">
+                {{ infoData.executorDeptName }}
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="盘点人员">
+                {{ infoData.executorName }}
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="计划盘点时长">
+                {{ infoData.duration }}分钟
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="审批人">
+                {{ infoData.verifyUserName }}
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="紧急程度">
+                {{ infoData.urgent | useDictLabelFilter(emergencyState) }}
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="创建人">
+                {{ infoData.createUserName }}
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="创建时间">
+                {{ infoData.createTime }}
+              </el-form-item>
+            </el-col>
+            <!-- <el-col :span="24">
+              <el-form-item label="附件">
+              </el-form-item>
+            </el-col> -->
+            <el-col :span="16">
+              <el-form-item label="备注">
+                {{ infoData.remark }}
+              </el-form-item>
+            </el-col>
+          </el-form>
+        </div>
+      </div>
+      <div class="content-detail mt20">
+		<HeaderTitle title="盘点明细" size="16px"></HeaderTitle>
+        <div class="mt20">
+          <el-form label-width="80px" label-position="top">
+            <el-form-item>
+              <el-table
+                ref="multipleTable"
+                :data="infoData.planRuleInventoryDetailList || []"
+                tooltip-effect="dark"
+                style="width: 100%"
+                stripe
+                :header-cell-style="{ background: '#EEEEEE', border: 'none' }"
+              >
+                <el-table-column
+                  :label="`${
+                    (infoData.assetDict && infoData.assetDict.descp) || ''
+                  }编号`"
+                  prop="assetCode"
+                ></el-table-column>
+                <el-table-column
+                  :label="`${
+                    (infoData.assetDict && infoData.assetDict.descp) || ''
+                  }名称`"
+                  prop="assetName"
+                ></el-table-column>
+                <el-table-column
+                  v-if="infoData.bizType == 1"
+                  label="批次号"
+                  prop="batchNum"
+                ></el-table-column>
+                <el-table-column
+                  label="牌号"
+                  prop="assetBrand"
+                ></el-table-column>
+                <el-table-column label="型号" prop="equiModel"></el-table-column>
+                <el-table-column label="类型" prop="assetTypeDict.descp">
+                  <template>
+                    {{ infoData.assetDict && infoData.assetDict.descp }}
+                  </template>
+                </el-table-column>
+                <!-- <el-table-column
+                  label="仓库"
+                  prop="bizTypeName"
+                ></el-table-column> -->
+                <el-table-column
+                  label="库存量"
+                  prop="inventoryNum"
+                ></el-table-column>
+                <el-table-column label="单位" prop="unit"></el-table-column>
+              </el-table>
+            </el-form-item>
+          </el-form>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+// import { getPlanDetail, workOrderDetails } from '@/api/stockManagement/stocking'
+// import PageHeader from '@/components/PageHeader'
+// import StatusStep from '@/components/StatusStep'
+// import { useDictLabelFilter } from '@/utils/dict'
+
+// import {
+//   wh_planStatus,
+//   wh_checkStatus,
+//   emergencyState,
+//   warehousingType
+// } from '@/utils/dict/warehouse'
+export default {
+  // components: { PageHeader, StatusStep },
+  // filters: {
+  //   useDictLabelFilter: useDictLabelFilter
+  // },
+  data () {
+    return {
+      emergencyState,
+      wh_checkStatus,
+      wh_planStatus,
+      activeName: 'a',
+      num: 1,
+      workOrderData: [],
+      infoData: {},
+      stepsList: [
+        { status: 'Done', nodeName: '创建' },
+        { status: 'Done', nodeName: '审批中' },
+        { status: 'Done', nodeName: '审批完成' },
+        { status: 'Processing', nodeName: '已收货' },
+        { status: '', nodeName: '收货中' },
+        { status: '', nodeName: '已收货' }
+      ],
+      btnList1: [
+        { name: '受理' },
+        {
+          name: '作废'
+        },
+        {
+          name: '执行'
+        },
+        {
+          name: '编辑'
+        },
+        {
+          name: '确认'
+        },
+        {
+          name: '打印'
+        },
+        {
+          name: '关闭'
+        }
+      ],
+      btnList2: [
+        {
+          name: '撤销'
+        },
+        {
+          name: '催办'
+        },
+        {
+          name: '批复'
+        },
+        {
+          name: '编辑'
+        },
+        {
+          name: '提交'
+        },
+        {
+          name: '打印'
+        },
+        {
+          name: '关闭'
+        }
+      ],
+      list: [
+        {
+          name: '紧急',
+          color: 'red'
+        },
+        {
+          name: '重要',
+          color: 'blue'
+        },
+        {
+          name: '已催办',
+          color: 'red'
+        }
+      ],
+      detailsData: [],
+      tableData: [],
+      tableData1: [],
+      tableData2: []
+    }
+  },
+  created () {
+    this.getInfo()
+  },
+  methods: {
+    async getInfo () {
+      const res = await getPlanDetail({ id: this.$route.query.id })
+      if (res?.success) {
+        console.log(res)
+        this.infoData = res.data
+      }
+    },
+    selectActive (num) {
+      this.num = num
+    },
+    async _workOrderDetails () {
+      const res = await workOrderDetails()
+    },
+    // 时间差计算
+    difference (beginTime, endTime) {
+      var dateBegin = new Date(beginTime)
+      var dateEnd = new Date(endTime)
+      var dateDiff = dateEnd.getTime() - dateBegin.getTime() //时间差的毫秒数
+      var dayDiff = Math.floor(dateDiff / (24 * 3600 * 1000)) //计算出相差天数
+      var leave1 = dateDiff % (24 * 3600 * 1000) //计算天数后剩余的毫秒数
+      var hours = Math.floor(leave1 / (3600 * 1000)) //计算出小时数
+      //计算相差分钟数
+      var leave2 = leave1 % (3600 * 1000) //计算小时数后剩余的毫秒数
+      var minutes = Math.floor(leave2 / (60 * 1000)) //计算相差分钟数
+      //计算相差秒数
+      var leave3 = leave2 % (60 * 1000) //计算分钟数后剩余的毫秒数
+      var seconds = Math.round(leave3 / 1000)
+
+      if (dayDiff == -1) {
+        dayDiff = 0
+        hours = 0
+        minutes = 0
+      }
+
+      return dayDiff + '天' + hours + '小时' + minutes + '分钟'
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+	.content-height{
+		background: #fff;
+	}
+.p20 {
+  padding: 20px;
+}
+.flex {
+  display: flex;
+}
+.title {
+  justify-content: space-between;
+  border-bottom: 1px solid #ccc;
+  padding-bottom: 5px;
+  span {
+    font-size: 16px;
+  }
+  .col {
+    padding-left: 40px;
+    font-size: 14px;
+    color: #aaaaaa;
+  }
+}
+.degree {
+  margin-right: 10px;
+  padding: 0px 15px;
+  color: #fff;
+  font-size: 13px;
+  line-height: 23px;
+  border-radius: 23px;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  span {
+    width: 5px;
+    height: 5px;
+    border-radius: 100%;
+    margin-right: 6px;
+    background-color: #fff;
+  }
+}
+.red {
+  background-color: rgb(163, 0, 20);
+}
+.blue {
+  background-color: #1989fa;
+}
+.createdInfo {
+  justify-content: space-around;
+  margin-top: 10px;
+  font-size: 14px;
+  .col {
+    color: #6e6e6e;
+    padding-right: 10px;
+  }
+}
+.mt40 {
+  margin-top: 40px;
+}
+
+.custSteps {
+  margin-top: 20px;
+  margin-left: 70px;
+
+  .box {
+    width: 158px;
+    border: 1px solid #ccc;
+    padding: 10px;
+    flex-direction: row;
+    flex-wrap: wrap;
+    // justify-content: space-between;
+    font-size: 12px;
+    color: #9e9e9e;
+    .x {
+      width: 20px;
+      height: 15px;
+      margin-right: 5px;
+    }
+    .q {
+      background-color: #d0e4d5;
+    }
+    .b {
+      background-color: #1989fa;
+    }
+    .g {
+      background-color: #157a2c;
+    }
+    .r {
+      background-color: #a30014;
+    }
+    .a {
+      align-items: center;
+      margin-bottom: 10px;
+    }
+    .mr10 {
+      margin-right: 10px;
+    }
+    .mb0 {
+      margin-bottom: 0;
+    }
+  }
+  .stepsInfo {
+    // flex: 1;
+    width: 483px;
+  }
+}
+.mt20 {
+  margin-top: 20px;
+}
+.content-detail {
+  overflow: hidden;
+}
+.executor {
+  font-size: 14px;
+  .col {
+    color: #6e6e6e;
+    padding-right: 10px;
+  }
+}
+.result {
+  justify-content: space-around;
+}
+.mr20 {
+  margin-right: 20px;
+}
+.details {
+  font-size: 14px;
+  margin-bottom: 10px;
+}
+
+.customSteps {
+  margin-top: 40px;
+  font-size: 14px;
+  margin-left: 80px;
+  .time {
+    font-size: 12px;
+    color: #6e6e6e;
+    margin-right: 20px;
+    position: relative;
+    .col {
+      color: #c1bdbd;
+      text-align: right;
+    }
+    &::after {
+      content: '';
+      width: 1px;
+      height: 100%;
+      background-color: #157a2c;
+      position: absolute;
+      right: -26px;
+    }
+  }
+  .flex:last-child {
+    .time {
+      &::after {
+        display: none;
+      }
+    }
+  }
+  .round {
+    margin-right: 20px;
+    width: 10px;
+    height: 10px;
+    border-radius: 100%;
+    background-color: #157a2c;
+    position: relative;
+    span {
+      position: absolute;
+      top: 50%;
+      left: 50%;
+      width: 4px;
+      height: 4px;
+      background-color: #fff;
+      border-radius: 100%;
+      transform: translate(-2px, -2px);
+    }
+  }
+  .text {
+    .info {
+      margin-top: 10px;
+      width: 955px;
+      background-color: #f0f3f3;
+      overflow: hidden;
+      padding: 10px;
+      margin-bottom: 10px;
+    }
+  }
+}
+.customInfo {
+  .time {
+    &::after {
+      top: 0;
+      right: -28px;
+    }
+  }
+}
+.tips {
+  font-size: 14px;
+  color: #6e6e6e;
+  margin-left: 52px;
+  .shape {
+    margin-left: 30px;
+    p {
+      margin-right: 10px;
+    }
+  }
+}
+.f {
+  width: 15px;
+  height: 15px;
+  background-color: #157a2c;
+  border-radius: 3px;
+}
+.j {
+  width: 0;
+  height: 0;
+  border-left: 8px solid transparent;
+  border-right: 8px solid transparent;
+  border-bottom: 15px solid #157a2c;
+}
+.y {
+  width: 15px;
+  height: 15px;
+  border-radius: 100%;
+  background-color: #157a2c;
+}
+</style>

+ 220 - 0
src/views/rulesManagement/planRules/index.vue

@@ -0,0 +1,220 @@
+<template>
+  <div class="ele-body">
+     <el-card shadow="never" v-loading="loading">
+	   <inventory-search @search="reload">
+	   </inventory-search>
+	   <!-- 数据表格 -->
+	   <ele-pro-table
+	     ref="table"
+	     :columns="columns"
+	     :datasource="datasource"
+	     cache-key="systemRoleTable"
+	   >
+	     <!-- 表头工具栏 -->
+	     <template v-slot:toolbar>
+	       <el-button
+	         size="small"
+	         type="primary"
+	         icon="el-icon-plus"
+	         class="ele-btn-icon"
+	         @click="openEdit()"
+	       >
+	         新建
+	       </el-button>
+		   <el-button
+		     size="small"
+		     type="primary"
+		     class="ele-btn-icon"
+		     @click="goDetail()"
+		   >
+		     详情
+		   </el-button>
+	     </template>
+	     <!-- 操作列 -->
+	     <template v-slot:action="{ row }">
+	       <el-link
+	         type="primary"
+	         :underline="false"
+	         icon="el-icon-edit"
+	         @click="openEdit(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>
+	 
+	 <!-- 新建或编辑弹窗 -->
+	<AddInventoryDialog
+	  ref="addInventoryDialogRef"
+	  :dialogTile="dialogTitle"
+	  @refreshList="resetForm"
+	  :isBindPlan="isBindPlan"
+	/>
+  </div>
+</template>
+
+<script>
+  import InventorySearch from './components/inventory-search.vue';
+  import AddInventoryDialog from './components/addInventoryDialog.vue'
+  import { pageRoles } from '@/api/system/role'; 
+  export default {
+    components: {
+      InventorySearch,
+	    AddInventoryDialog
+    },
+    data () {
+      return {
+		// 表格列配置
+		columns: [
+		  {
+		    columnKey: 'index',
+		    label: '序号',
+		    type: 'index',
+		    width: 55,
+		    align: 'center',
+		    showOverflowTooltip: true,
+		    fixed: 'left'
+		  },
+		  {
+		    prop: 'code',
+		    label: '计划单号',
+		    align: 'center',	
+		    showOverflowTooltip: true,
+		    minWidth: 110
+		  },
+		  {
+		    prop: 'groupId',
+		    label: '盘点名称',
+		    align: 'center',
+		    showOverflowTooltip: true,
+		    minWidth: 110
+		  },
+		  {
+		    prop: 'enable',
+		    label: '盘点仓库',
+		    align: 'center',	
+		    showOverflowTooltip: true,
+		    slot: 'enable',
+		    minWidth: 110
+		  },
+		  {
+		    prop: 'name',
+		    label: '盘点部门',
+		    align: 'center',	
+		    showOverflowTooltip: true,
+		    minWidth: 110
+		  },
+			{
+			  prop: 'type',
+			  label: '资产分类',
+			  align: 'center',	
+			  showOverflowTooltip: true,
+			  minWidth: 110
+			},
+		  {
+		    prop: 'cycle',
+		    label: '规则名称',
+		    align: 'center',	
+		    showOverflowTooltip: true,
+		    minWidth: 110
+		  },
+			{
+			  prop: 'auto',
+			  label: '自动派单',
+			  align: 'center',	
+			  showOverflowTooltip: true,
+			  minWidth: 110
+			},
+			{
+			  prop: 'status',
+			  label: '状态',
+			  align: 'center',	
+			  showOverflowTooltip: true,
+			  minWidth: 110
+			},
+		  {
+		    prop: 'creater',
+		    label: '创建人',
+		    align: 'center',	
+		    showOverflowTooltip: true,
+		    minWidth: 110
+		  },
+		  {
+		    prop: 'createTime',
+		    label: '创建时间',
+		    align: 'center',
+		    showOverflowTooltip: true,
+		    minWidth: 110,
+		    formatter: (_row, _column, cellValue) => {
+		      return this.$util.toDateString(cellValue);
+		    }
+		  },
+		  {
+		    columnKey: 'action',
+		    label: '操作',
+		    width: 150,
+		    align: 'center',
+		    resizable: false,
+		    slot: 'action',
+		    showOverflowTooltip: true
+		  }
+		],
+        // 加载状态
+        loading: false,
+        pageType: 'add',
+        dialogTitle: '',
+		isBindPlan:false,
+      };
+    },
+    computed: {
+
+    },
+    methods: {
+	  // 重置
+	  resetForm () {
+	    this.$refs.configFormRef.resetFields()
+	    // this.searchForm()
+	  },
+      /* 表格数据源 */
+      datasource({ page, limit, where, order }) {
+        return pageRoles({ pageNum: page, size: limit, ...where });
+      },
+      /* 刷新表格 */
+      reload(where) {
+        this.$refs.table.reload({ page: 1, where });
+      },
+	  
+	  openEdit(row){
+		  this.isBindPlan = false
+		  this.dialogTitle = '新增盘点计划配置'
+		  this.$refs.addInventoryDialogRef.dialogVisible = true
+		  // this.$store.dispatch('planRules/setAddOrUpdate', 'add')
+	  },	  
+	  goDetail(){
+		  this.$router.push({
+		    path: '/rulesManagement/planRules/detail',
+		    // query: {
+		    //   id
+		    // }
+		  })
+	  }
+	  
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+
+</style>

+ 3 - 4
vue.config.js

@@ -32,13 +32,12 @@ module.exports = {
       // 当我们的本地的请求 有/api的时候,就会代理我们的请求地址向另外一个服务器发出请求
       '/api': {
         // target: 'http://192.168.3.51:86', // 测试
-
         // target: 'http://192.168.3.35:8080', // kang杨威
-        // target: 'http://192.168.3.25:8080', // 黄峥嵘
+        target: 'http://192.168.3.25:8080', // 黄峥嵘
         // target: 'http://192.168.3.41:8080', // 何江鹏
         // target: 'http://192.168.3.33:8080', // 谢一平
-        target: 'http://192.168.3.64:8080', // 粟勋
-
+        // target: 'http://192.168.3.64:8080', // 粟勋
+        // target: 'http://192.168.3.34:8080', // 刘毅
         changeOrigin: true, // 只有这个值为true的情况下 才表示开启跨域
         pathRewrite: {
           '^/api': ''