Przeglądaj źródła

一直规则配置

huang_an 2 lat temu
rodzic
commit
6f13496e2a

+ 11 - 12
src/api/classifyManage/index.js

@@ -1,6 +1,6 @@
 import request from '@/utils/request';
 
-export async function getSubPage (data) {
+export async function getSubPage(data) {
   const res = await request.get('/main/categoryLevel/getSubPage', {
     params: data
   });
@@ -9,7 +9,7 @@ export async function getSubPage (data) {
   }
   return Promise.reject(new Error(res.data.message));
 }
-export async function saveOrUpdate (data) {
+export async function saveOrUpdate(data) {
   const res = await request.post('/main/categoryLevel/saveOrUpdate', data);
   if (res.data.code == 0) {
     return res.data;
@@ -18,7 +18,7 @@ export async function saveOrUpdate (data) {
 }
 
 // 根据父级id查分类树
-export async function getTreeByPid (parentId) {
+export async function getTreeByPid(parentId) {
   const res = await request.get(`/main/categoryLevel/getTreeByPid/${parentId}`);
   if (res.data.code == 0) {
     return res.data;
@@ -26,21 +26,20 @@ export async function getTreeByPid (parentId) {
   return Promise.reject(new Error(res.data.message));
 }
 
-
 // 根据type查分类树组
-export async function getTreeByGroup (data) {
-  const res = await request.get(`/main/categoryLevel/getProduceTreeByPid`, {  params: data});
+export async function getTreeByGroup(data) {
+  const res = await request.get(`/main/categoryLevel/getProduceTreeByPid`, {
+    params: data
+  });
   if (res.data.code == 0) {
     return res.data;
   }
   return Promise.reject(new Error(res.data.message));
 }
 
-
-
 // 根据类型查分类树
-export async function getTreeByType (type) {
-  const res = await request.get(`/main/categoryLevel/getTreeByType/${type}`);
+export async function getTreeByType(type) {
+  const res = await request.get(`/main/categoryLevel/getTreeByPid/${type}`);
   if (res.data.code == 0) {
     return res.data;
   }
@@ -48,7 +47,7 @@ export async function getTreeByType (type) {
 }
 
 // 删除分类
-export async function deleteCategory (id) {
+export async function deleteCategory(id) {
   const res = await request.get(`/main/categoryLevel/delete/${id}`);
   if (res.data.code == 0) {
     return res.data;
@@ -56,7 +55,7 @@ export async function deleteCategory (id) {
   return Promise.reject(new Error(res.data.message));
 }
 //根据ID查询分类详情系信息
-export async function getInfoById (id) {
+export async function getInfoById(id) {
   const res = await request.get(`/main/categoryLevel/getById/${id}`);
   if (res.data.code == 0) {
     return res.data;

+ 15 - 23
src/api/ruleManagement/plan.js

@@ -1,8 +1,8 @@
 import request from '@/utils/request';
 
 // 获取规则名称下拉
-export async function getRule (data) {
-	let par = new URLSearchParams(data);
+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;
@@ -11,17 +11,16 @@ export async function getRule (data) {
 }
 
 // 获取类别信息列表
-export async function getCategory (data) {
-  const res = await request.post(`/main/category/getList` , data);
+export async function getCategory(data) {
+  const res = await request.get(`/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) {
+export async function getAssetList(data) {
   let par = new URLSearchParams(data);
   const res = await request.get(`/main/asset/page?` + par, {});
   if (res.data.code == 0) {
@@ -30,9 +29,9 @@ export async function getAssetList (data) {
   return Promise.reject(new Error(res.data.message));
 }
 
-// 巡点检计划配置新增或更新 
-export async function saveOrUpdate (data) {
-  const res = await request.post('/eam/planconfig/saveOrUpdate' , data );
+// 巡点检计划配置新增或更新
+export async function saveOrUpdate(data) {
+  const res = await request.post('/eam/planconfig/saveOrUpdate', data);
   if (res.data.code == 0) {
     return res.data.data;
   }
@@ -40,18 +39,18 @@ export async function saveOrUpdate (data) {
 }
 
 // 获取巡点检分页数据
-export async function planConfigPage (data) {
-	let par = new URLSearchParams(data);
-  const res = await request.get(`/eam/planconfig/page?`+ par , {} );
+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 , {} );
+// 获取详情
+export async function getInfoById(id) {
+  const res = await request.get(`/eam/planconfig/getById/` + id, {});
   if (res.data.code == 0) {
     return res.data.data;
   }
@@ -62,14 +61,13 @@ export async function getInfoById (id) {
  * 删除事项
  */
 export async function removeRule(data) {
-  const res = await request.delete('/eam/planconfig/delete', { 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);
@@ -106,9 +104,3 @@ export async function removeRule(data) {
 //   }
 //   return Promise.reject(new Error(res.data.message));
 // }
-
-
-
-
-
-

+ 11 - 11
src/components/CommomSelect/equipment-select.vue

@@ -11,7 +11,7 @@
     :placeholder="placeholder"
     @input="updateValue"
     v-on="$listeners"
-		@change="chooseNode"
+    @change="chooseNode"
   />
 </template>
 
@@ -27,19 +27,19 @@
         default: '请选择'
       }
     },
-    data () {
+    data() {
       return {
         treeData: []
       };
     },
-    created () {
+    created() {
       this.getData();
     },
     methods: {
-      async getData () {
-        const res = await getTreeByType(1);
+      async getData() {
+        const res = await getTreeByType(0);
         this.treeData = res.data;
-		this.$emit('setRootId', res.data[0].id);
+        this.$emit('setRootId', res.data[0].id, res.data);
         // this.treeData = this.$util.toTreeData({
         //   data: data || [],
         //   idField: 'id',
@@ -47,13 +47,13 @@
         // });
       },
       /* 更新选中数据 */
-      updateValue (value) {
+      updateValue(value) {
         this.$emit('input', value);
       },
-			
-		chooseNode(node){
-			this.$emit('changeNode', node);
-		}
+
+      chooseNode(node) {
+        this.$emit('changeNode', node);
+      }
     }
   };
 </script>

+ 949 - 0
src/components/addPatrolConfigDialog/index.vue

@@ -0,0 +1,949 @@
+<template>
+  <el-dialog
+    :title="dialogTitle"
+    :visible.sync="addPatrolConfigDialog"
+    :before-close="handleClose"
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    v-loading="addDialogLoading"
+    width="80%"
+  >
+    <div class="dialog_body">
+      <el-form
+        :model="addForm"
+        ref="addFormRef"
+        :rules="addFormRules"
+        label-width="120px"
+      >
+        <el-row>
+          <el-col :span="8">
+            <el-form-item label="计划配置单号" prop="code">
+              <el-input
+                v-model="addForm.code"
+                size="small"
+                placeholder="自动带出"
+                disabled
+              ></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="计划配置名称" prop="name">
+              <el-input
+                v-model="addForm.name"
+                size="small"
+                placeholder="请输入"
+                :disabled="isBindPlan"
+              ></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="自动派单" prop="autoOrder">
+              <el-select
+                v-model="addForm.autoOrder"
+                size="small"
+                style="width: 100%"
+                :disabled="isBindPlan"
+              >
+                <el-option :value="1" label="是"></el-option>
+                <el-option :value="0" 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"
+                size="small"
+                style="width: 100%"
+                @change="handleRuleNameChange"
+                :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="duration">
+              <div style="display: flex">
+                <el-input
+                  v-model="addForm.duration"
+                  size="small"
+                  placeholder="请输入"
+                  :disabled="isBindPlan"
+                >
+                  <template #suffix>分钟</template>
+                </el-input>
+              </div>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="设备分类" prop="categoryLevelId">
+              <equipmentSelect
+                v-model="addForm.categoryLevelId"
+                @changeNode="chooseClassify"
+                @setRootId="getRootId"
+                :disabled="isBindPlan"
+              />
+            </el-form-item>
+          </el-col>
+          <!-- <el-col :span="8">
+            <el-form-item label="设备类别" prop="categoryId">
+              <el-select
+                v-model="addForm.categoryId"
+                size="small"
+                style="width: 100%"
+                :disabled="isBindPlan"
+                filterable
+              >
+                <el-option
+                  v-for="item in equipmentList"
+                  :key="item.id"
+                  :value="item.id"
+                  :label="item.name"
+                  @click.native="handleEquipmentClassChange(item)"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col> -->
+          <el-col :span="8">
+            <el-form-item label="审核人" prop="approvalUserId">
+              <el-select
+                v-model="addForm.approvalUserId"
+                size="small"
+                clearable
+                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" v-if="addForm.autoOrder">
+            <el-form-item :label="formLabel + '部门'" prop="groupId">
+              <deptSelect
+                v-model="addForm.groupId"
+                @changeGroup="searchDeptNodeClick"
+                :disabled="isBindPlan"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8" v-if="addForm.autoOrder">
+            <el-form-item :label="formLabel + '人员'" prop="executeIdList">
+              <el-select
+                v-model="addForm.executeIdList"
+                size="small"
+                style="width: 100%"
+                :disabled="isBindPlan"
+                multiple
+                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
+                v-model="addForm.urgent"
+                :disabled="isBindPlan"
+              >
+              </DictSelection>
+            </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="1"
+                :inactive-value="0"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="16">
+            <el-form-item label="备注" prop="remark">
+              <el-input
+                type="textarea"
+                resize="none"
+                v-model="addForm.remark"
+                :rows="2"
+                placeholder="请详细说明"
+                size="small"
+                :disabled="isBindPlan"
+              ></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <!-- 设备分类 -->
+        <div class="equipment_box">
+          <div class="left_aside">
+            <div class="equipment_list_title">设备列表</div>
+            <div class="equipment_tree">
+              <el-tree
+                :data="planRuleEquiList"
+                :props="defaultProps"
+                ref="equiListTree"
+                highlight-current
+                node-key="id"
+                @node-click="handleNodeClick"
+                :disabled="isBindPlan"
+                show-checkbox
+              ></el-tree>
+            </div>
+          </div>
+          <div class="right_aside">
+            <div class="equipment_info">
+              <div class="item_info">
+                <span class="item_label">设备编码</span>
+                <span class="item_value">{{ equipmentInfo.equiCode }}</span>
+              </div>
+              <div class="item_info">
+                <span class="item_label">设备名称</span>
+                <span class="item_value">{{ equipmentInfo.equiName }}</span>
+              </div>
+              <div class="item_info">
+                <span class="item_label">设备型号</span>
+                <span class="item_value">{{ equipmentInfo.equiModel }}</span>
+              </div>
+              <div class="item_info">
+                <span class="item_label">设备位置</span>
+                <span class="item_value">{{ equipmentInfo.equiLocation }}</span>
+              </div>
+            </div>
+            <!-- 添加操作事项 -->
+            <div>
+              <div class="box_tips">操作事项</div>
+              <el-table :data="matterRulesList" border>
+                <el-table-column label="序号" align="center" width="60">
+                  <template slot-scope="scope">
+                    <span>{{ scope.$index + 1 }}</span>
+                  </template>
+                </el-table-column>
+                <el-table-column label="事项" align="center" prop="name">
+                </el-table-column>
+                <el-table-column label="内容" align="center" prop="content">
+                </el-table-column>
+                <el-table-column label="标准" align="center" prop="norm">
+                </el-table-column>
+              </el-table>
+            </div>
+
+            <!-- 添加备品备件  -->
+            <div v-if="dialogTitle.includes('保养')">
+              <el-button
+                type="text"
+                @click="addSpareItems"
+                :disabled="isBindPlan"
+                >添加备品备件</el-button
+              >
+              <el-table
+                :data="
+                  planRuleEquiList[currentEquItemIndex] &&
+                  planRuleEquiList[currentEquItemIndex].sparePart
+                "
+                height="300"
+                :key="currentEquItemIndex"
+                border
+              >
+                <el-table-column label="序号" align="center" width="60">
+                  <template slot-scope="scope">
+                    <span>{{ scope.$index + 1 }}</span>
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  label="备件类别名称"
+                  align="center"
+                  prop="categoryName"
+                >
+                </el-table-column>
+                <el-table-column label="型号" align="center" prop="model">
+                </el-table-column>
+                <el-table-column label="所需数量" align="center" prop="needNum">
+                  <template slot-scope="scope">
+                    <el-input
+                      v-model.number="scope.row.needNum"
+                      size="small"
+                      oninput="value=value.replace(/[^\d]/g,'')"
+                      style="width: 100%"
+                      placeholder="输入数量"
+                      @input="changeNum"
+                    ></el-input>
+                  </template>
+                </el-table-column>
+                <el-table-column label="单位" align="center" prop="unit">
+                </el-table-column>
+                <el-table-column label="费用" align="center">
+                  <template slot-scope="scope">
+                    {{
+                      scope.row.needNum * scope.row.unitPrice
+                        ? scope.row.needNum * scope.row.unitPrice
+                        : '0'
+                    }}{{ scope.row.parValue == 'wanyuan' ? '万元' : '元' }}
+                  </template>
+                </el-table-column>
+                <el-table-column label="操作" align="center" width="70">
+                  <template slot-scope="scope">
+                    <el-button
+                      type="text"
+                      @click="handleDeleteSpareItem(scope.$index)"
+                      :disabled="isBindPlan"
+                      >删除</el-button
+                    >
+                  </template>
+                </el-table-column>
+              </el-table>
+              <div style="text-align: center"
+                >备件总费用:
+                {{
+                  planRuleEquiList[currentEquItemIndex] &&
+                  planRuleEquiList[currentEquItemIndex].totalCost
+                    ? planRuleEquiList[currentEquItemIndex].totalCost
+                    : '-'
+                }}
+                元
+              </div>
+            </div>
+          </div>
+        </div>
+      </el-form>
+    </div>
+    <div slot="footer" class="dialog_footer">
+      <el-button size="small" type="primary" @click="submit">提交</el-button>
+      <el-button size="small" @click="handleClose">关闭</el-button>
+    </div>
+    <AddSpareDialog
+      ref="addSpareDialogRef"
+      :selectedSpare="selectedSpare"
+      @submit="spareItemSelectSubmit"
+    />
+  </el-dialog>
+</template>
+
+<script>
+  import RuleItemSelection from '@/components/ruleItemSelection';
+  import AddSpareDialog from '@/components/addSpareDialog';
+  import { deepClone } from '@/utils';
+  import {
+    getRule,
+    getCategory,
+    getAssetList,
+    saveOrUpdate,
+    getInfoById
+  } from '@/api/ruleManagement/plan';
+  import { getDetail, getCode } from '@/api/ruleManagement/matter';
+  import { getUserPage } from '@/api/system/organization';
+  import { getTreeByType } from '@/api/classifyManage';
+  import equipmentSelect from '@/components/CommomSelect/equipment-select.vue';
+  import deptSelect from '@/components/CommomSelect/dept-select.vue';
+  export default {
+    name: 'addPatrolConfigDialog',
+    components: {
+      RuleItemSelection,
+      AddSpareDialog,
+      equipmentSelect,
+      deptSelect
+    },
+    props: {
+      dialogTitle: {
+        type: String,
+        default: () => {
+          return '新增巡点检计划配置';
+        }
+      }
+    },
+    data() {
+      return {
+        defaultProps: {
+          label: 'showName'
+        },
+        addPatrolConfigDialog: false,
+        matterRulesList: [], // 选择规则名称的时候,获取的事项
+        equipmentInfo: {},
+        clickedTreeNode: false,
+        selectedMatter: [],
+        selectedSpare: [],
+        uerList: [],
+        // deptList: [],
+        executorList: [],
+        currentEquItemIndex: 0,
+        formLabel: '',
+        treeData: [],
+        addForm: {
+          code: '', // 计划配置单号
+          name: '', // 计划配置名称
+          autoOrder: 1, // 自动派单
+          ruleId: '', // 规则id
+          ruleName: '', // 规则名称
+          duration: null, // 计划完成时长
+          categoryId: '', // 设备类别id
+          approvalUserId: '', // 审核人id
+          groupId: '', // 巡点检部门code
+          executeIdList: [], // 巡点检人员id
+          executorPhone: '',
+          status: 1, // 状态
+          remark: '', // 备注
+          urgent: ''
+        },
+        // 计划规则设备列表
+        planRuleEquiList: [
+          {
+            equiCode: '', // 设备编码 equCode
+            equiName: '', // 设备名称 name
+            equiModel: '', // 设备型号 specifications
+            equiLocation: '', // 设备位置
+            // 设备备品备件 - 巡点检不需要备品备件,保养需要
+            sparePart: [],
+            totalCost: 0
+          }
+        ],
+        addFormRules: {
+          name: [
+            { required: true, message: '请输入计划配置名称', trigger: 'blur' }
+          ],
+          autoOrder: [
+            { required: true, message: '请选择是否自动派单', trigger: 'change' }
+          ],
+          ruleId: [
+            { required: true, message: '请选择规则名称', trigger: 'change' }
+          ],
+          duration: [
+            { required: true, message: '请输入计划完成时长', trigger: 'blur' }
+          ],
+          categoryLevelId: [
+            { required: true, message: '请选择设备分类', trigger: 'change' }
+          ],
+          categoryId: [
+            { required: true, message: '请选择设备类别', trigger: 'change' }
+          ],
+          groupId: [
+            { required: true, message: '请选择巡点检部门', trigger: 'change' }
+          ],
+          executeIdList: [
+            { required: true, message: '请选择巡点检人员', trigger: 'change' }
+          ],
+          urgent: [
+            { required: true, message: '请选择紧急程度', trigger: 'change' }
+          ]
+        },
+        ruleNameList: [],
+        addDialogLoading: false,
+        equipmentList: [],
+        rootId: null,
+        isBindPlan: false,
+        rootData: []
+      };
+    },
+    computed: {},
+    watch: {
+      addPatrolConfigDialog(val) {
+        if (val) {
+          this.formLabel = this.dialogTitle.includes('巡点检')
+            ? '巡点检'
+            : this.dialogTitle.includes('保养')
+            ? '保养'
+            : '盘点';
+          // 获取审核人列表数据
+          this.getUserList();
+          // 获取部门
+          // this.getDeptList()
+          // 获取规则名称
+          this._getRuleNameList();
+        }
+      }
+    },
+    created() {},
+    methods: {
+      async init(row, tips) {
+        if (row) {
+          this.getInfo(row.id);
+        } else {
+          //  获取计划配置单号
+          this.getOrderCode(tips);
+          this.isBindPlan = false;
+          this.planRuleEquiList = [];
+          this.matterRulesList = [];
+        }
+      },
+
+      async getInfo(id) {
+        try {
+          const res = await getInfoById(id);
+          this.addForm = res;
+          this.isBindPlan = res.isBindPlan;
+          this.categoryEquipment(res.categoryLevelId);
+          const params = { groupId: res.groupId };
+          this.getUserList(params);
+          this._getMatterRulesDetails(res.ruleId);
+          this.$set(this.addForm, 'code', res.code);
+          this.$set(this.addForm, 'urgent', JSON.stringify(res.urgent));
+          this.$set(this.addForm, 'executeIdList', res.executeId.split(','));
+          this.$set(this.addForm, 'imageUrl', {});
+          console.log(this.rootData);
+          const rep = await getTreeByType(0);
+          console.log('sasas', res);
+          const ids = this.findTopLevelAncestorId(
+            rep.data,
+            res.categoryLevelId
+          );
+          this.rootId = ids;
+          await this._getEquipmentList(res.categoryLevelId, this.isBindPlan);
+          let keys = [];
+          res.deviceInfo.map((item) => {
+            keys.push(item.substanceId);
+          });
+          this.$nextTick(() => {
+            this.$refs.equiListTree.setCheckedKeys(keys);
+          });
+          this.clickedTreeNode = true;
+        } catch (error) {}
+      },
+
+      handleClose() {
+        this.clickedTreeNode = false;
+        this.addPatrolConfigDialog = false;
+        this.$refs.addFormRef.resetFields();
+        if (this.$refs.equiListTree) {
+          this.$refs.equiListTree.setCheckedKeys([]);
+        }
+        this.currentEquItemIndex = 0;
+        this.equipmentInfo = {};
+        this.addForm = {
+          code: '', // 计划配置单号
+          name: '', // 计划配置名称
+          autoOrder: 1, // 自动派单
+          ruleId: '', // 规则id
+          duration: null, // 计划完成时长
+          categoryId: '', // 设备类别
+          approvalUserId: '', // 审核人id
+          groupId: '', // 巡点检部门code
+          executeIdList: [], // 巡点检人员id
+          executorPhone: '',
+          status: 1, // 状态
+          remark: '', // 备注
+          urgent: ''
+        };
+        this.equipmentList = [];
+      },
+      // 设备分类选择
+      async handleEquipmentClassChange(item) {
+        this.clickedTreeNode = true;
+        this.equipmentInfo = {};
+        this._getEquipmentList(item.id, this.isBindPlan);
+      },
+      // 封装 - 获取设备分类列表
+      async _getEquipmentList(val, bind) {
+        console.log('==== this.rootId', this.rootId);
+        const params = {
+          pageNum: 1,
+          size: 999,
+          categoryLevelId: val,
+          rootCategoryLevelId: this.rootId
+        };
+        const res = await getAssetList(params);
+        console.log('===', res);
+        this.planRuleEquiList = res.list;
+        this.addForm.categoryId = res.list[0]?.categoryId;
+        if (!res.list.length) return;
+        this.planRuleEquiList.map((item) => {
+          item.showName = item.name + '(' + item.code + ')';
+          item.disabled = bind;
+        });
+        this.currentEquItemIndex = 0;
+        const item = this.planRuleEquiList[0];
+        this.$nextTick(() => {
+          this.$refs.equiListTree.setCurrentKey(item.id);
+          this.equipmentInfo = {
+            equiCode: item.code,
+            equiName: item.name,
+            equiModel: item.category.modelType,
+            equiLocation: item.position[0].pathName
+          };
+          // 对比详情返回的数据和设备分类下面所有的设备列表,将sparePart同步过去
+          if (this.addForm.deviceInfo) {
+            for (let i = 0; i < this.planRuleEquiList.length; i++) {
+              for (let j = 0; j < this.addForm.deviceInfo.length; j++) {
+                if (
+                  this.planRuleEquiList[i].code ===
+                  this.addForm.deviceInfo[j].substance.code
+                ) {
+                  this.$set(
+                    this.planRuleEquiList[i],
+                    'sparePart',
+                    this.addForm.deviceInfo[j].sparePart
+                  );
+                  this.$set(
+                    this.planRuleEquiList[i],
+                    'totalCost',
+                    this.addForm.deviceInfo[j].totalCost
+                  );
+                }
+              }
+            }
+          }
+        });
+      },
+
+      // 获取审核人列表、巡点检人员
+      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) {}
+      },
+
+      //选择部门(搜索)
+      searchDeptNodeClick(info) {
+        if (info) {
+          // 根据部门获取人员
+          const params = { groupId: info };
+          this.getUserList(params);
+        } else {
+          this.addForm.groupId = null;
+        }
+      },
+
+      // 分类树的选择
+      chooseClassify(val) {
+        const id = this.findTopLevelAncestorId(this.rootData, val);
+        this.rootId = id;
+        this._getEquipmentList(val, this.isBindPlan);
+        // this.categoryEquipment(val);
+      },
+      findTopLevelAncestorId(dataArray, targetId) {
+        for (const item of dataArray) {
+          const result = this.findTopLevelAncestorIdRecursive(
+            item,
+            targetId,
+            item.id
+          );
+          if (result) {
+            return result; // 返回找到的最顶层祖先的 ID
+          }
+        }
+
+        return null;
+      },
+
+      findTopLevelAncestorIdRecursive(dataItem, targetId, topLevelAncestorId) {
+        if (dataItem.id === targetId) {
+          return topLevelAncestorId;
+        }
+
+        if (dataItem.children) {
+          for (const child of dataItem.children) {
+            const result = this.findTopLevelAncestorIdRecursive(
+              child,
+              targetId,
+              topLevelAncestorId
+            );
+            if (result) {
+              return result; // 返回找到的最顶层祖先的 ID
+            }
+          }
+        }
+
+        return null;
+      },
+
+      getRootId(val, data) {
+        // this.rootId = val;
+        this.rootData = data;
+      },
+
+      // 获取设备分类数据
+      async categoryEquipment(id) {
+        const params = { categoryLevelId: id, pageNum: 1, size: -1 };
+        console.log('params==', params);
+        const data = await getCategory(params);
+        // this.addForm.categoryId = '';
+        console.log(data);
+        this.equipmentList = data.list;
+      },
+
+      // 获取计划配置单号
+      async getOrderCode(tips) {
+        if (tips.includes('巡点检')) {
+          const data = await getCode('patrolconfig_code');
+          this.$set(this.addForm, 'code', data);
+        }
+        if (tips.includes('保养')) {
+          const code = await getCode('maintainconfig_code');
+          this.$set(this.addForm, 'code', code);
+        }
+      },
+
+      // 设备列表树点击
+      handleNodeClick(data, node) {
+        this.equipmentInfo = {
+          equiCode: data.code,
+          equiName: data.name,
+          equiId: data.id,
+          equiModel: data.category.modelType,
+          equiLocation: data.position[0].pathName
+        };
+        // 保存当前点击的设备列表某节点的index,在添加操作事项的时候,可以将事项list放到对应的节点对象中,以及切换节点的时候回显事项list
+        this.currentEquItemIndex = this.planRuleEquiList.findIndex(
+          (item) => item.code === data.code
+        );
+        this.clickedTreeNode = true;
+      },
+      // 获取规则名列表
+      async _getRuleNameList() {
+        if (
+          this.dialogTitle === '新增保养计划配置' ||
+          this.dialogTitle === '编辑保养计划配置'
+        ) {
+          const res = await getRule({
+            status: 1,
+            type: 2,
+            pageNum: 1,
+            size: -1
+          });
+          if (res.list) {
+            this.ruleNameList = res.list || [];
+          }
+        }
+        if (
+          this.dialogTitle === '新增巡点检计划配置' ||
+          this.dialogTitle === '编辑巡点检计划配置'
+        ) {
+          const res = await getRule({
+            status: 1,
+            type: 1,
+            pageNum: 1,
+            size: -1
+          });
+          if (res.list) {
+            this.ruleNameList = res.list || [];
+          }
+        }
+      },
+      // 规则名称下拉触发
+      handleRuleNameChange(val) {
+        this._getMatterRulesDetails(val);
+      },
+      // 封装 - 获取规则下面的详情数据及事项
+      async _getMatterRulesDetails(val) {
+        const res = await getDetail(val);
+        this.matterRulesList = res.ruleItems;
+      },
+
+      // 添加备品备件
+      addSpareItems() {
+        if (!this.clickedTreeNode) {
+          return this.$message.warning('请选择设备分类!');
+        }
+        this.$refs.addSpareDialogRef.open();
+        if (this.planRuleEquiList[this.currentEquItemIndex]['sparePart']) {
+          this.selectedSpare =
+            this.planRuleEquiList[this.currentEquItemIndex]['sparePart'];
+        } else {
+          this.selectedSpare = [];
+        }
+        // console.log('this.selectedSpare',this.selectedSpare)
+      },
+
+      // 从备品备件弹窗将数据丢到备品备件配置
+      spareItemSelectSubmit(list) {
+        this.planRuleEquiList[this.currentEquItemIndex]['sparePart'] = list.map(
+          (item) => {
+            return {
+              categoryName: item.name,
+              model: item.modelType,
+              needNum: item.num,
+              parValue: item.univalenceUnit,
+              unitPrice: item.univalence,
+              unit: item.measuringUnit,
+              code: item.code,
+              id: item.id
+            };
+          }
+        );
+        this.$forceUpdate();
+      },
+
+      // 删除备品备件
+      handleDeleteSpareItem(index) {
+        this.planRuleEquiList[this.currentEquItemIndex]['sparePart'].splice(
+          index,
+          1
+        );
+        this.changeNum();
+      },
+
+      // 改变input数据重新计算总费用
+      changeNum() {
+        let applayList =
+          this.planRuleEquiList[this.currentEquItemIndex].sparePart;
+        let total = 0;
+        applayList.map((item) => {
+          if (item.needNum && item.needNum != '') {
+            switch (item.parValue) {
+              case 'wanyuan': {
+                item.chengs = 10000;
+                break;
+              }
+              case 'yuan': {
+                item.chengs = 1;
+                break;
+              }
+              default:
+                break;
+            }
+            item.cost = item.needNum * item.unitPrice * item.chengs;
+            total = total + item.needNum * item.unitPrice * item.chengs;
+          }
+        });
+        this.$set(
+          this.planRuleEquiList[this.currentEquItemIndex],
+          'totalCost',
+          total
+        );
+      },
+
+      // 提交
+      submit() {
+        this.$refs.addFormRef.validate(async (valid) => {
+          if (valid) {
+            try {
+              const selectList = this.$refs.equiListTree.getCheckedNodes();
+              this.addForm.deviceInfo = selectList.map((item) => {
+                return {
+                  substanceId: item.id,
+                  sparePart: item.sparePart ? item.sparePart : [],
+                  totalCost: item.totalCost
+                };
+              });
+              this.addForm.executeId = this.addForm.executeIdList.join(',');
+              this.addForm.ruleType = this.dialogTitle.includes('巡点检')
+                ? 1
+                : this.dialogTitle.includes('保养')
+                ? 2
+                : 3;
+              this.addForm.isBindPlan = this.isBindPlan;
+              const res = await saveOrUpdate(this.addForm);
+              if (res) {
+                const type = this.dialogTitle.includes('新增')
+                  ? '新增'
+                  : '编辑';
+                this.handleClose();
+                this.$message.success(type + '成功!');
+                this.$emit('done');
+              }
+            } catch (error) {}
+          }
+        });
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+  :deep(.el-form) {
+    .el-form-item {
+      margin-bottom: 14px;
+    }
+    .el-form-item__error {
+      padding-top: 0;
+    }
+  }
+  .equipment_box {
+    display: flex;
+    .left_aside {
+      width: 300px;
+      border: 1px solid #797979;
+      margin-right: 5px;
+      .equipment_list_title {
+        height: 34px;
+        line-height: 34px;
+        text-align: center;
+        background-color: #d7d7d7;
+        color: #000;
+        font-weight: 700;
+      }
+      .equipment_tree {
+        height: 510px;
+        overflow: auto;
+      }
+      ::v-deep .el-tree-node__expand-icon.el-icon-caret-right {
+        padding: 0;
+      }
+      ::v-deep
+        .el-tree--highlight-current
+        .el-tree-node.is-current
+        > .el-tree-node__content {
+        background-color: #d7f1fd !important;
+      }
+    }
+    .right_aside {
+      flex: 1;
+      border: 1px solid #797979;
+      padding: 10px;
+      .equipment_info {
+        display: flex;
+        flex-wrap: wrap;
+        border: 1px solid #ddd;
+        .item_info {
+          width: 33%;
+          height: 34px;
+          line-height: 34px;
+          display: flex;
+          .item_label {
+            width: 90px;
+            text-align: center;
+            background-color: #f2f2f2;
+            font-weight: 700;
+          }
+          .item_value {
+            border-bottom: 1px solid #f2f2f2;
+            flex: 1;
+            padding-left: 5px;
+          }
+          &:last-child {
+            width: 100%;
+            .item_value {
+              border: 0;
+            }
+          }
+        }
+      }
+    }
+  }
+  .dialog_footer {
+    text-align: center;
+  }
+  .box_tips {
+    color: #1890ff;
+    margin: 10px 0;
+  }
+</style>

+ 208 - 0
src/components/addSpareDialog/index.vue

@@ -0,0 +1,208 @@
+<template>
+  <el-dialog
+    title="添加备品备件"
+    :visible.sync="dialogVisible"
+    width="70%"
+    :before-close="handleClose"
+    append-to-body
+  >
+    <div class="search_wrapper">
+      <el-input
+        size="small"
+        v-model="searchParams.code"
+        class="search_input"
+        placeholder="请输入编码"
+      ></el-input>
+      <el-button type="primary" size="small" @click="doSearch">搜索</el-button>
+    </div>
+    <el-row style="height: 80vh">
+      <el-col class="tree-col" :span="6">
+        <div class="table-add" style="margin-left: 10px"></div>
+        <AssetTree
+          @handleNodeClick="handleNodeClick"
+          @setRootId="setRootId"
+          :type="'7'"
+          :paramsType="'type'"
+          ref="treeList"
+        />
+      </el-col>
+      <el-col :span="18">
+        <el-table
+          ref="dialogMultipleTable"
+          :data="tableData"
+          tooltip-effect="dark"
+          v-loading="tableLoading"
+          style="width: 100%; overflow: auto"
+          height="80vh"
+          border
+          @select="pickSpareData"
+          @select-all="pickSpareData"
+          :header-cell-style="{ background: '#F0F3F3' }"
+        >
+          <el-table-column
+            type="selection"
+            label="操作"
+            width="55"
+            align="center"
+          />
+          <el-table-column prop="code" label="备件类别编码" />
+          <el-table-column prop="name" label="备件类别名称" />
+          <el-table-column label="型号" prop="modelType"> </el-table-column>
+        </el-table>
+      </el-col>
+    </el-row>
+
+    <div slot="footer" class="dialog-footer">
+      <el-button size="small" @click="submit" type="primary">提 交</el-button>
+      <el-button size="small" @click="handleClose">关 闭</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+  import AssetTree from '@/components/AssetTree';
+  import { getCategoryList } from '@/api/ledgerAssets';
+  export default {
+    components: {
+      // CommonTree,
+      AssetTree
+    },
+    props: {
+      selectedSpare: {
+        type: Array,
+        default: () => []
+      }
+    },
+    data() {
+      return {
+        dialogVisible: false,
+        searchParams: {
+          code: '',
+          page: 1,
+          size: 99999
+        },
+        tableLoading: false,
+        tableData: [],
+        currentTreeData: {},
+        pickSpareDataObject: [],
+        rootId: null
+      };
+    },
+    watch: {
+      selectedSpare(val) {
+        val.map((item) => {
+          this.tableData.forEach((c) => {
+            if (item.id === c.id) {
+              this.$refs.dialogMultipleTable.toggleRowSelection(c, true);
+            }
+          });
+        });
+      }
+    },
+    methods: {
+      open() {
+        this.pickSpareDataObject = [];
+        this.dialogVisible = true;
+        this.$nextTick(() => {
+          this.selectedSpare.map((item) => {
+            this.tableData.forEach((c) => {
+              if (item.id === c.id) {
+                this.$refs.dialogMultipleTable.toggleRowSelection(c, true);
+              }
+            });
+          });
+        });
+      },
+
+      async doSearch() {
+        const params = {
+          categoryLevelId: this.currentTreeData.id,
+          rootCategoryLevelId: this.rootId,
+          code: this.searchParams.code
+        };
+        this._getClassificationSpareList(params);
+      },
+
+      // 获取根节点id
+      setRootId(id) {
+        this.rootId = id;
+      },
+
+      // 树结构点击事件
+      async handleNodeClick(data, node) {
+        this.currentTreeData = data;
+        this._getClassificationSpareList(data);
+      },
+
+      // setDefaultList(id){
+      //   let data = {id:id}
+      //    this._getClassificationSpareList(data)
+      // },
+
+      // 获取添加备件弹窗表格数据
+      async _getClassificationSpareList(data) {
+        this.tableLoading = true;
+        let params = {
+          page: 1,
+          size: 99999,
+          categoryLevelId: this.currentTreeData.id
+        };
+        const res = await getCategoryList(params);
+        console.log('res', res);
+        this.tableLoading = false;
+        if (res.list.length) {
+          this.tableData = res.list;
+          // 切换树节点时回显添加了的备品备件
+          this.$nextTick(() => {
+            this.selectedSpare.map((item) => {
+              this.tableData.forEach((c) => {
+                if (item.id === c.id) {
+                  this.$refs.dialogMultipleTable.toggleRowSelection(c, true);
+                }
+              });
+            });
+          });
+        } else {
+          this.tableData = [];
+        }
+      },
+      // 备件单选框选择时事件
+      pickSpareData(data) {
+        this.pickSpareDataObject = data;
+      },
+
+      // 关闭弹窗
+      handleClose() {
+        this.$nextTick(() => {
+          this.$refs.dialogMultipleTable.clearSelection();
+          this.dialogVisible = false;
+        });
+      },
+
+      async submit() {
+        this.$emit('submit', this.pickSpareDataObject);
+        this.handleClose();
+        //   this.form.exportList = this.pickSpareDataObject
+        //   this.$forceUpdate()
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+  .tree-col {
+    border: 1px solid #e6ebf5;
+    margin-right: 10px;
+    width: 20%;
+    padding: 0 !important;
+    height: 100%;
+    overflow: auto;
+  }
+  .search_wrapper {
+    margin-bottom: 10px;
+    .search_input {
+      width: 200px;
+      margin-right: 10px;
+    }
+  }
+</style>

+ 99 - 0
src/components/ruleItemSelection/index.vue

@@ -0,0 +1,99 @@
+<template>
+  <el-dialog
+    title="添加规则事项"
+    :visible.sync="dialogVisible"
+    :destroy-on-close="true"
+    append-to-body
+    width="70%"
+    :before-close="handleClose"
+  >
+    <el-table
+      ref="multipleTable"
+      :data="ruleItem"
+      tooltip-effect="dark"
+      style="width: 100%; overflow: auto"
+      height="80vh"
+      border
+      @selection-change="handleSelectionChange"
+      :header-cell-style="{ background: '#F0F3F3' }"
+    >
+      <el-table-column type="selection" width="55" align="center">
+      </el-table-column>
+      <el-table-column :label="labelTitle + '事项'" prop="name" />
+      <el-table-column :label="labelTitle + '内容'" prop="content" />
+      <el-table-column :label="labelTitle + '标准'" prop="norm" />
+    </el-table>
+    <div slot="footer" class="dialog-footer">
+      <el-button size="small" @click="submit" type="primary">提 交</el-button>
+      <el-button size="small" @click="handleClose">关 闭</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+  import { getDetail, getCode } from '@/api/ruleManagement/matter';
+  export default {
+    props: {
+      selectedMatter: {
+        type: Array,
+        default: () => []
+      },
+      labelTitle: {
+        type: String,
+        default: '巡点检'
+      }
+    },
+    data() {
+      return {
+        dialogVisible: false,
+        ruleItem: [],
+        multipleSelection: []
+      };
+    },
+    methods: {
+      handleClose() {
+        this.dialogVisible = false;
+        this.$refs.multipleTable.clearSelection();
+      },
+      open() {
+        this.multipleSelection = [];
+        this.dialogVisible = true;
+        this.$nextTick(() => {
+          this.selectedMatter.map((item) => {
+            this.ruleItem.forEach((c) => {
+              if (item.id === c.id) {
+                this.$refs.multipleTable.toggleRowSelection(c, true);
+              }
+            });
+          });
+        });
+      },
+      // 封装 - 获取规则下面的详情数据及事项
+      async _getMatterRulesDetails(val) {
+        const res = await getDetail(val);
+        this.ruleItem = res.ruleItems;
+      },
+      submit() {
+        if (!this.multipleSelection.length) {
+          return this.$message.error('请选择事项!');
+        }
+        this.$emit('submit', this.multipleSelection);
+        this.handleClose();
+      },
+      handleSelectionChange(val) {
+        this.multipleSelection = val;
+      }
+    }
+  };
+</script>
+
+<style scoped>
+  .tree-col {
+    border: 1px solid #e6ebf5;
+    margin-right: 10px;
+    width: 20%;
+    padding: 0 !important;
+    height: 100%;
+    overflow: auto;
+  }
+</style>

+ 146 - 0
src/views/ruleConfiguration/inspectionPoint/components/patrol-search.vue

@@ -0,0 +1,146 @@
+<!-- 搜索表单 -->
+<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="规则名称:">
+          <el-input clearable v-model="where.ruleName" placeholder="请输入" />
+        </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="状态:">
+          <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="巡点检部门:">
+          <deptSelect v-model="where.groupId" />
+        </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="设备分类:">
+          <equipmentSelect v-model="where.categoryLevelId" />
+        </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 {  listOrganizations } from '@/api/system/organization';
+  import equipmentSelect from '@/components/CommomSelect/equipment-select.vue';
+  import deptSelect from '@/components/CommomSelect/dept-select.vue';
+  export default {
+    components: { equipmentSelect, deptSelect },
+    data() {
+      // 默认表单数据
+      const defaultWhere = {
+        name: '',
+        code: '',
+        groupId: '',
+        status: '',
+        ruleName: '',
+        startTime: '',
+        endTime: '',
+        categoryLevelId: ''
+      };
+      return {
+        // 表单数据
+        where: { ...defaultWhere },
+        // deptData:[],   //部门树
+        time: []
+      };
+    },
+    computed: {
+      // 是否开启响应式布局
+      styleResponsive() {
+        return this.$store.state.theme.styleResponsive;
+      }
+    },
+    created() {
+      // this.getDeptList()
+    },
+    methods: {
+      /* 搜索 */
+      search() {
+        if (this.time != null && this.time.length) {
+          this.where.startTime = this.time[0];
+          this.where.endTime = this.time[1];
+        }
+        if (this.time == null) {
+          this.where.startTime = '';
+          this.where.endTime = '';
+        }
+        this.$emit('search', this.where);
+      },
+      /*  重置 */
+      reset() {
+        this.time = [];
+        this.where = { ...this.defaultWhere };
+        this.search();
+      }
+
+      // 获取部门列表数据
+      // async getDeptList () {
+      //   try {
+      //     let list = await listOrganizations()
+      //     this.deptData = this.$util.toTreeData({
+      // 		  data: list,
+      // 		  idField: 'id',
+      // 		  parentIdField: 'parentId'
+      //     });
+      //   } catch (error) {}
+      // },
+    }
+  };
+</script>
+<style lang="scss" scoped>
+  .ele-form-actions {
+    display: flex;
+    align-items: center;
+    justify-content: flex-end;
+  }
+</style>

+ 262 - 0
src/views/ruleConfiguration/inspectionPoint/detail.vue

@@ -0,0 +1,262 @@
+<template>
+  <div class="patrol_config_detail" v-loading="detailsLoading">
+    <div class="main_content">
+      <!-- 基本信息 -->
+      <div class="base_info">
+        <HeaderTitle title="基本信息" size="16px"></HeaderTitle>
+        <el-row class="base_info_content">
+          <el-col :span="6">
+            <span>计划单号:</span>
+            <span>{{ detailsForm.code }}</span>
+          </el-col>
+          <el-col :span="6">
+            <span>巡点检名称:</span>
+            <span>{{ detailsForm.name }}</span>
+          </el-col>
+          <el-col :span="6">
+            <span>巡点检部门:</span>
+            <span>{{ detailsForm.groupName }}</span>
+          </el-col>
+          <el-col :span="6">
+            <span>:</span>
+            <span>{{ detailsForm.executorName }}</span>
+          </el-col>
+          <el-col :span="6">
+            <span>计划完成时长:</span>
+            <span>{{ detailsForm.duration }}分钟</span>
+          </el-col>
+          <el-col :span="6">
+            <span>设备分类:</span>
+            <span>{{ detailsForm.categoryName }}</span>
+          </el-col>
+          <el-col :span="6">
+            <span>规则名称:</span>
+            <span>{{ detailsForm.ruleName }}</span>
+          </el-col>
+          <!--          <el-col :span="6">
+            <span>创建部门:</span>
+            <span>{{ detailsForm.createOrgName }}</span>
+          </el-col> -->
+          <el-col :span="6">
+            <span>创建人:</span>
+            <span>{{ detailsForm.createUserName }}</span>
+          </el-col>
+          <el-col :span="6">
+            <span>创建时间:</span>
+            <span>{{ detailsForm.createTime }}</span>
+          </el-col>
+          <el-col :span="6">
+            <span>审核人:</span>
+            <span>{{ detailsForm.approvalUserName }}</span>
+          </el-col>
+          <el-col :span="24">
+            <span>备注:</span>
+            <span>{{ detailsForm.remark }}</span>
+          </el-col>
+        </el-row>
+      </div>
+      <!-- 巡点检设备 -->
+      <div class="patrol_equipment_info">
+        <HeaderTitle title="巡点检设备" size="16px"></HeaderTitle>
+        <div class="patrol_equipment_info_content">
+          <div
+            class="equipment_item"
+            v-for="item in detailsForm.deviceInfo"
+            :key="item.id"
+          >
+            <div class="equipment_info">
+              <div class="item_info">
+                <span class="item_label">设备编码</span>
+                <span class="item_value">{{ item.substance.code }}</span>
+              </div>
+              <div class="item_info">
+                <span class="item_label">设备名称</span>
+                <span class="item_value">{{ item.substance.name }}</span>
+              </div>
+              <div class="item_info">
+                <span class="item_label">设备型号</span>
+                <span class="item_value">{{ item.substance.model }}</span>
+              </div>
+              <div class="item_info">
+                <span class="item_label">设备位置</span>
+                <span class="item_value">{{
+                  item.substance.positionNames
+                }}</span>
+              </div>
+            </div>
+            <p>操作事项</p>
+            <div class="matter_info">
+              <el-table :data="matterRulesList" border>
+                <el-table-column label="序号" align="center" width="80">
+                  <template slot-scope="scope">
+                    <span>{{ scope.$index + 1 }}</span>
+                  </template>
+                </el-table-column>
+                <el-table-column label="事项" prop="name" />
+                <el-table-column label="内容" prop="content" />
+                <el-table-column label="标准" prop="norm" />
+              </el-table>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+  import { getInfoById } from '@/api/ruleManagement/plan';
+  import { getDetail } from '@/api/ruleManagement/matter';
+  export default {
+    name: 'patrolConfigDetail',
+    data() {
+      return {
+        detailsLoading: false,
+        detailsForm: {},
+        matterRulesList: []
+      };
+    },
+    mounted() {
+      this.getDetailsData(this.$route.query.id);
+    },
+    computed: {},
+    methods: {
+      // 获取详情数据
+      async getDetailsData(id) {
+        this.detailsLoading = true;
+        getInfoById(id)
+          .then((res) => {
+            this.detailsLoading = false;
+            console.log('====res', res);
+            this.detailsForm = res;
+            let arr = [];
+            res.execute.map((item) => {
+              arr.push(item.userName);
+            });
+            this.$set(this.detailsForm, 'executorName', arr.join(','));
+            this._getMatterRulesDetails(res.ruleId);
+          })
+          .catch(() => {
+            this.detailsLoading = false;
+          });
+      },
+
+      // 封装 - 获取规则下面的详情数据及事项
+      async _getMatterRulesDetails(val) {
+        const res = await getDetail(val);
+        this.matterRulesList = res.ruleItems;
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+  .patrol_config_detail {
+    padding: 5px 0;
+    .detail_title {
+      display: flex;
+      height: 40px;
+      align-items: center;
+      justify-content: space-between;
+      > span {
+        background-color: #fff;
+        line-height: 40px;
+        width: 90px;
+        text-align: center;
+        border-top: 4px solid #157a2c;
+      }
+    }
+    .main_content {
+      background-color: #fff;
+      padding: 20px 40px;
+      .base_info {
+        .base_info_title {
+          border-bottom: 1px solid #1890ff;
+          padding-bottom: 3px;
+          margin-bottom: 20px;
+          > span {
+            display: inline-block;
+            line-height: 16px;
+            border-left: 6px solid #1890ff;
+            padding-left: 6px;
+          }
+        }
+        .base_info_content {
+          padding: 0 60px;
+          font-size: 14px;
+          ::v-deep .el-col {
+            margin-bottom: 20px;
+            > span:first-child {
+              font-weight: 700;
+            }
+          }
+        }
+      }
+      .patrol_equipment_info {
+        .patrol_equipment_info_title {
+          border-bottom: 1px solid #1890ff;
+          padding-bottom: 3px;
+          margin-bottom: 20px;
+          > span {
+            display: inline-block;
+            line-height: 16px;
+            border-left: 6px solid #1890ff;
+            padding-left: 6px;
+          }
+        }
+        .patrol_equipment_info_content {
+          padding: 0 30px;
+          .equipment_item {
+            border: 1px solid #ccc;
+            font-size: 14px;
+            padding: 15px;
+            margin-bottom: 30px;
+            .equipment_info {
+              display: flex;
+              flex-wrap: wrap;
+              border: 1px solid #ddd;
+              .item_info {
+                width: 33.33%;
+                height: 24px;
+                line-height: 24px;
+                display: flex;
+                .item_label {
+                  width: 90px;
+                  text-align: center;
+                  background-color: #f2f2f2;
+                  font-weight: 700;
+                }
+                .item_value {
+                  border-bottom: 1px solid #f2f2f2;
+                  flex: 1;
+                  padding-left: 5px;
+                }
+                &:last-child {
+                  width: 100%;
+                  .item_value {
+                    border: 0;
+                  }
+                }
+              }
+            }
+            > p {
+              margin-top: 20px;
+              color: #797979;
+            }
+            .matter_info {
+              ::v-deep .el-table {
+                th.el-table__cell {
+                  background-color: #f2f2f2;
+                  padding: 0;
+                }
+                td.el-table__cell {
+                  padding: 0;
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+</style>

+ 233 - 0
src/views/ruleConfiguration/inspectionPoint/index.vue

@@ -0,0 +1,233 @@
+<template>
+  <div class="ele-body">
+    <el-card shadow="never" v-loading="loading">
+      <patrol-search @search="reload"> </patrol-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>
+        </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-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>
+
+    <!-- 新建或编辑弹窗 -->
+    <AddPatrolConfigDialog
+      ref="addPatrolConfigDialogRef"
+      :dialogTitle="dialogTitle"
+      :isBindPlan="isBindPlan"
+      @done="reload"
+    />
+  </div>
+</template>
+
+<script>
+  import AddPatrolConfigDialog from '@/components/addPatrolConfigDialog';
+  import PatrolSearch from './components/patrol-search.vue';
+  import { planConfigPage, removeRule } from '@/api/ruleManagement/plan';
+  import dictMixins from '@/mixins/dictMixins';
+  export default {
+    mixins: [dictMixins],
+    components: {
+      PatrolSearch,
+      AddPatrolConfigDialog
+    },
+    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: 'name',
+            label: '计划配置名称',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'groupName',
+            label: '巡点检部门',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'categoryName',
+            label: '设备分类',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'ruleName',
+            label: '规则名称',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'autoOrder',
+            label: '自动派单',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110,
+            formatter: (_row, _column, cellValue) => {
+              let autoOrder =
+                _row.autoOrder == 1 ? '是' : _row.autoOrder == 0 ? '否' : '-';
+              return autoOrder;
+            }
+          },
+          {
+            prop: 'status',
+            label: '状态',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110,
+            formatter: (_row, _column, cellValue) => {
+              return this.getDictValue('规则状态', _row.status);
+            }
+          },
+          {
+            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: 150,
+            align: 'center',
+            resizable: false,
+            slot: 'action',
+            showOverflowTooltip: true
+          }
+        ],
+        // 加载状态
+        loading: false,
+        pageType: 'add',
+        dialogTitle: '',
+        isBindPlan: false
+      };
+    },
+    computed: {},
+    created() {
+      this.requestDict('规则状态');
+    },
+    methods: {
+      /* 表格数据源 */
+      datasource({ page, limit, where, order }) {
+        return planConfigPage({
+          pageNum: page,
+          size: limit,
+          ...where,
+          groupId: where.groupId == null ? '' : where.groupId,
+          categoryLevelId:
+            where.categoryLevelId == null ? '' : where.categoryLevelId,
+          ruleType: 1
+        });
+      },
+
+      /* 刷新表格 */
+      reload(where) {
+        this.$refs.table.reload({ page: 1, where, ruleType: 1 });
+      },
+
+      openEdit(row) {
+        this.isBindPlan = false;
+        this.$refs.addPatrolConfigDialogRef.addPatrolConfigDialog = true;
+        if (row) {
+          this.dialogTitle = '编辑巡点检计划配置';
+        } else {
+          this.dialogTitle = '新增巡点检计划配置';
+        }
+        this.$refs.addPatrolConfigDialogRef.init(row, '巡点检');
+      },
+
+      remove(row) {
+        removeRule([row.id]).then((res) => {
+          this.$message.success('删除成功!');
+          this.reload();
+        });
+      },
+
+      goDetail({ id }) {
+        this.$router.push({
+          path: '/ruleConfiguration/inspectionPoint/detail',
+          query: {
+            id
+          }
+        });
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped></style>

+ 128 - 0
src/views/ruleConfiguration/maintenance/components/maintain-search.vue

@@ -0,0 +1,128 @@
+<!-- 搜索表单 -->
+<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="规则名称:">
+          <el-input clearable v-model="where.ruleName" placeholder="请输入" />
+        </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="状态:">
+          <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="执行部门:">
+          <deptSelect v-model="where.groupId" />
+        </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="设备分类:">
+          <equipmentSelect v-model="where.categoryLevelId" />
+        </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 equipmentSelect from '@/components/CommomSelect/equipment-select.vue';
+  import deptSelect from '@/components/CommomSelect/dept-select.vue';
+  export default {
+    components: { equipmentSelect, deptSelect },
+    data() {
+      // 默认表单数据
+      const defaultWhere = {
+        name: '',
+        ruleName: '',
+        code: '',
+        groupId: '',
+        status: '',
+        categoryLevelId: ''
+      };
+      return {
+        // 表单数据
+        where: { ...defaultWhere },
+        time: []
+      };
+    },
+    computed: {
+      // 是否开启响应式布局
+      styleResponsive() {
+        return this.$store.state.theme.styleResponsive;
+      }
+    },
+    created() {},
+    methods: {
+      /* 搜索 */
+      search() {
+        if (this.time != null && this.time.length) {
+          this.where.startTime = this.time[0];
+          this.where.endTime = this.time[1];
+        }
+        if (this.time == null) {
+          this.where.startTime = '';
+          this.where.endTime = '';
+        }
+        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>

+ 280 - 0
src/views/ruleConfiguration/maintenance/detail.vue

@@ -0,0 +1,280 @@
+<template>
+  <div class="maintain_config_detail" v-loading="detailsLoading">
+    <div class="main_content">
+      <!-- 基本信息 -->
+      <div class="base_info">
+        <HeaderTitle title="基本信息" size="16px"></HeaderTitle>
+        <el-row class="base_info_content">
+          <el-col :span="6">
+            <span>计划单号:</span>
+            <span>{{ detailsForm.code }}</span>
+          </el-col>
+          <el-col :span="6">
+            <span>保养名称:</span>
+            <span>{{ detailsForm.name }}</span>
+          </el-col>
+          <el-col :span="6">
+            <span>保养部门:</span>
+            <span>{{ detailsForm.groupName }}</span>
+          </el-col>
+          <el-col :span="6">
+            <span>保养人员:</span>
+            <span>{{ detailsForm.executorName }}</span>
+          </el-col>
+          <el-col :span="6">
+            <span>计划完成时长:</span>
+            <span>{{ detailsForm.duration }}分钟</span>
+          </el-col>
+          <el-col :span="6">
+            <span>设备分类:</span>
+            <span>{{ detailsForm.categoryName }}</span>
+          </el-col>
+          <el-col :span="6">
+            <span>规则名称:</span>
+            <span>{{ detailsForm.ruleName }}</span>
+          </el-col>
+<!--          <el-col :span="6">
+            <span>创建部门:</span>
+            <span>{{ detailsForm.createOrgName }}</span>
+          </el-col> -->
+          <el-col :span="6">
+            <span>创建人:</span>
+            <span>{{ detailsForm.createUserName }}</span>
+          </el-col>
+		  <el-col :span="6">
+		    <span>创建时间:</span>
+		    <span>{{ detailsForm.createTime }}</span>
+		  </el-col>
+          <el-col :span="6">
+            <span>审核人:</span>
+            <span>{{ detailsForm.approvalUserName }}</span>
+          </el-col>
+          <el-col :span="24">
+            <span>备注:</span>
+            <span>{{ detailsForm.remark }}</span>
+          </el-col>
+        </el-row>
+      </div>
+      <!-- 保养设备 -->
+      <div class="maintain_equipment_info">
+		<HeaderTitle title="保养设备" size="16px"></HeaderTitle>
+        <div class="maintain_equipment_info_content">
+          <div
+            class="equipment_item"
+            v-for="item in detailsForm.deviceInfo"
+            :key="item.id"
+          >
+            <div class="equipment_info">
+              <div class="item_info">
+                <span class="item_label">设备编码</span>
+                <span class="item_value">{{  item.substance.code }}</span>
+              </div>
+              <div class="item_info">
+                <span class="item_label">设备名称</span>
+                <span class="item_value">{{ item.substance.name }}</span>
+              </div>
+              <div class="item_info">
+                <span class="item_label">设备型号</span>
+                <span class="item_value">{{ item.substance.model }}</span>
+              </div>
+              <div class="item_info">
+                <span class="item_label">设备位置</span>
+                <span class="item_value">{{ item.substance.positionNames }}</span>
+              </div>
+            </div>
+            <p>操作事项</p>
+            <div class="matter_info">
+              <el-table :data="matterRulesList" border>
+                <el-table-column label="序号" align="center" width="80">
+                  <template slot-scope="scope">
+                    <span>{{ scope.$index + 1 }}</span>
+                  </template>
+                </el-table-column>
+                <el-table-column label="事项" prop="name" />
+                <el-table-column label="内容" prop="content" />
+                <el-table-column label="标准" prop="norm" />
+              </el-table>
+            </div>
+            <p>备品备件</p>
+            <div class="matter_info">
+              <el-table :data="item.sparePart" border>
+                <el-table-column label="序号" align="center" width="80">
+                  <template slot-scope="scope">
+                    <span>{{ scope.$index + 1 }}</span>
+                  </template>
+                </el-table-column>
+                <el-table-column label="备件类别名称" align="center" prop="categoryName">
+                </el-table-column>
+                <el-table-column label="规格型号" align="center" prop="model">
+                </el-table-column>
+                <el-table-column label="所需数量" align="center" prop="needNum">
+                </el-table-column>
+                <el-table-column label="单位" align="center" prop="unit">
+                </el-table-column>
+              </el-table>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+  import { getInfoById } from '@/api/ruleManagement/plan';
+  import {  getDetail } from '@/api/ruleManagement/matter';
+
+export default {
+  name: 'maintainConfigDetail',
+  data () {
+    return {
+      detailsLoading: false,
+      detailsForm: {},
+      matterRulesList:[]
+    }
+  },
+  computed: {
+    
+  },
+  mounted () {
+    this.getDetailsData(this.$route.query.id)
+  },
+  methods: {
+    // 获取详情数据
+    async getDetailsData (id) {
+      this.detailsLoading = true
+      getInfoById(id)
+        .then(res => {
+          this.detailsLoading = false
+          this.detailsForm = res
+    		let arr = []
+    		res.execute.map(item=>{
+    			 arr.push(item.userName)
+    		})
+    		 this.$set(this.detailsForm,'executorName',arr.join(','))
+    		 this._getMatterRulesDetails(res.ruleId)
+        })
+        .catch(() => {
+          this.detailsLoading = false
+        })
+    },
+    
+    // 封装 - 获取规则下面的详情数据及事项
+    async _getMatterRulesDetails (val) {		
+      const res = await getDetail(val)
+       this.matterRulesList = res.ruleItems
+    },
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.maintain_config_detail {
+  padding: 5px 0;
+  .detail_title {
+    display: flex;
+    height: 40px;
+    align-items: center;
+    justify-content: space-between;
+    > span {
+      background-color: #fff;
+      line-height: 40px;
+      width: 90px;
+      text-align: center;
+      border-top: 4px solid #1890ff;
+    }
+  }
+  .main_content {
+    background-color: #fff;
+    padding: 20px 40px;
+    .base_info {
+      .base_info_title {
+        border-bottom: 1px solid #1890ff;
+        padding-bottom: 3px;
+        margin-bottom: 20px;
+        > span {
+          display: inline-block;
+          line-height: 16px;
+          border-left: 6px solid #1890ff;
+          padding-left: 6px;
+        }
+      }
+      .base_info_content {
+        padding: 0 100px;
+        font-size: 14px;
+        ::v-deep .el-col {
+          margin-bottom: 20px;
+          > span:first-child {
+            font-weight: 700;
+          }
+        }
+      }
+    }
+    .maintain_equipment_info {
+      .maintain_equipment_info_title {
+        border-bottom: 1px solid #1890ff;
+        padding-bottom: 3px;
+        margin-bottom: 20px;
+        > span {
+          display: inline-block;
+          line-height: 16px;
+          border-left: 6px solid #1890ff;
+          padding-left: 6px;
+        }
+      }
+      .maintain_equipment_info_content {
+        padding: 0 30px;
+        .equipment_item {
+          border: 1px solid #ccc;
+          font-size: 14px;
+          padding: 15px;
+          margin-bottom: 30px;
+          .equipment_info {
+            display: flex;
+            flex-wrap: wrap;
+            border: 1px solid #ddd;
+            .item_info {
+              width: 33.33%;
+              height: 24px;
+              line-height: 24px;
+              display: flex;
+              .item_label {
+                width: 90px;
+                text-align: center;
+                background-color: #f2f2f2;
+                font-weight: 700;
+              }
+              .item_value {
+                border-bottom: 1px solid #f2f2f2;
+                flex: 1;
+                padding-left: 5px;
+              }
+              &:last-child {
+                width: 100%;
+                .item_value {
+                  border: 0;
+                }
+              }
+            }
+          }
+          > p {
+            margin-top: 20px;
+            color: #797979;
+          }
+          .matter_info {
+            ::v-deep .el-table {
+              th.el-table__cell {
+                background-color: #f2f2f2;
+                padding: 0;
+              }
+              td.el-table__cell {
+                padding: 0;
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
+</style>

+ 234 - 0
src/views/ruleConfiguration/maintenance/index.vue

@@ -0,0 +1,234 @@
+<template>
+  <div class="ele-body">
+    <el-card shadow="never" v-loading="loading">
+      <maintain-search @search="reload"> </maintain-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>
+        </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-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>
+
+    <!-- 新建或编辑弹窗 -->
+    <AddPatrolConfigDialog
+      ref="addPatrolConfigDialogRef"
+      :dialogTitle="dialogTitle"
+      :isBindPlan="isBindPlan"
+      @done="reload"
+    />
+  </div>
+</template>
+
+<script>
+  import AddPatrolConfigDialog from '@/components/addPatrolConfigDialog';
+  import MaintainSearch from './components/maintain-search.vue';
+  import { planConfigPage, removeRule } from '@/api/ruleManagement/plan';
+  import dictMixins from '@/mixins/dictMixins';
+  export default {
+    mixins: [dictMixins],
+    components: {
+      MaintainSearch,
+      AddPatrolConfigDialog
+    },
+    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: 'name',
+            label: '计划配置名称',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'groupName',
+            label: '执行部门',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'categoryName',
+            label: '设备分类',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'ruleName',
+            label: '规则名称',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'autoOrder',
+            label: '自动派单',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110,
+            formatter: (_row, _column, cellValue) => {
+              let autoOrder =
+                _row.autoOrder == 1 ? '是' : _row.autoOrder == 0 ? '否' : '-';
+              return autoOrder;
+            }
+          },
+          {
+            prop: 'status',
+            label: '状态',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110,
+            formatter: (_row, _column, cellValue) => {
+              return this.getDictValue('规则状态', _row.status);
+            }
+          },
+          {
+            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: 150,
+            align: 'center',
+            resizable: false,
+            slot: 'action',
+            showOverflowTooltip: true
+          }
+        ],
+        // 加载状态
+        loading: false,
+        pageType: 'add',
+        dialogTitle: '',
+        isBindPlan: false
+      };
+    },
+    computed: {},
+    created() {
+      this.requestDict('规则状态');
+    },
+    methods: {
+      /* 表格数据源 */
+      datasource({ page, limit, where, order }) {
+        return planConfigPage({
+          pageNum: page,
+          size: limit,
+          ...where,
+          groupId: where.groupId == null ? '' : where.groupId,
+          categoryLevelId:
+            where.categoryLevelId == null ? '' : where.categoryLevelId,
+          ruleType: 2
+        });
+      },
+
+      /* 刷新表格 */
+      reload(where) {
+        this.$refs.table.reload({ page: 1, where, ruleType: 2 });
+      },
+
+      openEdit(row) {
+        this.isBindPlan = false;
+        // this.$refs.addPatrolConfigDialogRef.$refs.addFormRef && this.$refs.addPatrolConfigDialogRef.$refs.addFormRef.clearValidate()
+        this.$refs.addPatrolConfigDialogRef.addPatrolConfigDialog = true;
+        if (row) {
+          this.dialogTitle = '编辑保养计划配置';
+        } else {
+          this.dialogTitle = '新增保养计划配置';
+        }
+        this.$refs.addPatrolConfigDialogRef.init(row, '保养');
+      },
+
+      goDetail({ id }) {
+        this.$router.push({
+          path: '/ruleConfiguration/maintenance/detail',
+          query: {
+            id
+          }
+        });
+      },
+
+      remove(row) {
+        removeRule([row.id]).then((res) => {
+          this.$message.success('删除成功!');
+          this.reload();
+        });
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped></style>

+ 104 - 59
src/views/rulesManagement/planRules/index.vue

@@ -1,57 +1,83 @@
 <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="systemRoleTable14"
-      >
-        <!-- 表头工具栏 -->
-        <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>
+      <div class="switch">
+        <div class="switch_left">
+          <ul>
+            <li
+              v-for="item in tabOptions"
+              :key="item.key"
+              :class="{ active: activeComp == item.key }"
+              @click="activeComp = item.key"
+            >
+              {{ item.name }}
+            </li>
+          </ul>
+        </div>
+        <!-- <div class="right" style="padding: 10px">
+          <el-button @click="$router.go(-1)">返回</el-button>
+        </div> -->
+      </div>
+
+      <div class="plan" v-if="activeComp == 'point'">
+        <InspectionPoint />
+      </div>
+      <div class="plan" v-if="activeComp == 'ance'">
+        <Maintenance />
+      </div>
+      <div class="plan" v-if="activeComp == 'plan'">
+        <inventory-search @search="reload"> </inventory-search>
+        <!-- 数据表格 -->
+        <ele-pro-table
+          ref="table"
+          :columns="columns"
+          :datasource="datasource"
+          cache-key="systemRoleTable14"
+        >
+          <!-- 表头工具栏 -->
+          <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>
+      </div>
     </el-card>
 
     <!-- 新建或编辑弹窗 -->
@@ -65,16 +91,26 @@
 </template>
 
 <script>
+  import InspectionPoint from '../../ruleConfiguration/inspectionPoint';
+  import Maintenance from '../../ruleConfiguration/maintenance';
   import InventorySearch from './components/inventory-search.vue';
   import AddInventoryDialog from './components/addInventoryDialog.vue';
   import { pageRoles } from '@/api/system/role';
   export default {
     components: {
       InventorySearch,
-      AddInventoryDialog
+      AddInventoryDialog,
+      InspectionPoint,
+      Maintenance
     },
-    data () {
+    data() {
       return {
+        activeComp: 'point',
+        tabOptions: [
+          { key: 'point', name: '巡检点配置' },
+          { key: 'ance', name: '保养配置' },
+          { key: 'plan', name: '盘点配置' }
+        ],
         // 表格列配置
         columns: [
           {
@@ -180,26 +216,26 @@
     computed: {},
     methods: {
       // 重置
-      resetForm () {
+      resetForm() {
         this.$refs.configFormRef.resetFields();
         // this.searchForm()
       },
       /* 表格数据源 */
-      datasource ({ page, limit, where, order }) {
+      datasource({ page, limit, where, order }) {
         return pageRoles({ pageNum: page, size: limit, ...where });
       },
       /* 刷新表格 */
-      reload (where) {
+      reload(where) {
         this.$refs.table.reload({ page: 1, where });
       },
 
-      openEdit (row) {
+      openEdit(row) {
         this.isBindPlan = false;
         this.dialogTitle = '新增盘点计划配置';
         this.$refs.addInventoryDialogRef.dialogVisible = true;
         // this.$store.dispatch('planRules/setAddOrUpdate', 'add')
       },
-      goDetail () {
+      goDetail() {
         this.$router.push({
           path: '/rulesManagement/planRules/detail'
           // query: {
@@ -211,4 +247,13 @@
   };
 </script>
 
-<style lang="scss" scoped></style>
+<style lang="scss" scoped>
+  ::v-deep .el-card__body {
+    padding-top: 0;
+    padding-left: 0;
+  }
+  .plan {
+    margin-left: 17px;
+    margin-top: 17px;
+  }
+</style>