瀏覽代碼

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

695593266@qq.com 8 月之前
父節點
當前提交
55cc50f9c6

+ 49 - 0
src/api/equipment/work.js

@@ -0,0 +1,49 @@
+import request from '@/utils/request';
+export async function workPage(data) {
+  const res = await request.get('/eam/workordermaintenance/page', {
+    params: data
+  });
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+export async function maintenanceDetail(workOrderId) {
+  const res = await request.get(
+    `/eam/workordermaintenance/maintenanceDetail/${workOrderId}`
+  );
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+// 报工
+export async function report(data) {
+  const res = await request.post('/eam/workordermaintenance/report', data);
+  if (res.data.code == 0) {
+    return res.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+// 查询设备工单信息
+export async function deviceWorkList(data) {
+  const res = await request.get(`/eam/plan/deviceWorkList`, {
+    params: data
+  });
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+// 非完成报工
+export async function loseReport(data) {
+  const res = await request.post('/eam/workordermaintenance/loseReport', data);
+  if (res.data.code == 0) {
+    return res.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}

+ 2 - 1
src/enum/dict.js

@@ -43,7 +43,8 @@ export default {
   取样类型: 'quality_method_code',
   放行类型: 'checklist_type',
   文档类型: 'doc_type',
-  工艺参数单位: 'parameter_code'
+  工艺参数单位: 'parameter_code',
+  巡点检周期: 'patrol_cycle'
 };
 export const numberList = ['date_method'];
 

+ 1 - 1
src/views/checklistManagement/components/checkDetails.vue

@@ -75,7 +75,7 @@
       >
         <template v-slot:action="{ row }">
           <el-link
-            icon="el-icon-edit"
+            icon="el-icon-view"
             type="primary"
             :underline="false"
             @click="openWorkOrderDetail(row)"

+ 32 - 9
src/views/produce/components/prenatalExamination/PlanRulesDialog.vue

@@ -9,12 +9,25 @@
     width="80%"
     append-to-body
   >
-    <div v-if="rulesInfo">
-      {{ JSON.stringify(planDevices) }}
+    <div v-if="rulesInfo && currentPlanDevices">
+      <!-- 根据当前currentPlanDevices的 planStatus状态展示不同内容 -->
+      <!-- 0 派单 -->
+      <!-- 1 报工 -->
+      <signingUpWork
+        v-if="currentPlanDevices.planStatus == 1"
+        :planId="currentPlanDevices.planId"
+        :workOrderId="currentPlanDevices.eamWorkOrderId"
+        @refresh="setPlanStatus(2)"
+      ></signingUpWork>
+      <!-- 2 详情-->
+      <workOrderDetails
+        v-if="currentPlanDevices.planStatus == 3"
+        :workOrderId="currentPlanDevices.eamWorkOrderId"
+      ></workOrderDetails>
     </div>
 
     <template v-slot:footer>
-      <div class="footer-box">
+      <div v-if="rulesInfo" class="footer-box">
         <div class="txt-tip">
           <span class="active">
@@ -53,8 +66,15 @@
 
 <script>
   import dictMixins from '@/mixins/dictMixins';
+  import signingUpWork from './components/workOrder/signingUpWork.vue';
+  import workOrderDetails from './components/workOrder/details.vue';
+
   export default {
     mixins: [dictMixins],
+    components: {
+      signingUpWork,
+      workOrderDetails
+    },
     data() {
       return {
         visible: false,
@@ -67,28 +87,31 @@
     },
     computed: {
       // 当前设备信息
-      planDevices() {
+      currentPlanDevices() {
         if (this.rulesInfo && this.rulesInfo.planDevices) {
           return this.rulesInfo.planDevices[this.activeIndex];
         }
-        return null;
+        return {};
       }
     },
     methods: {
       // 外部调用,打开弹窗
-      open(data, title = '') {
-        if (title) {
-          this.title = title;
-        }
+      open(data) {
         this.rulesInfo = data;
         console.log('this.rulesInfo', this.rulesInfo);
         this.visible = true;
       },
       // 关闭时清理表单
       handleClose() {
+        this.rulesInfo = null;
+        this.activeIndex = 0;
         this.$nextTick(() => {
           this.visible = false;
         });
+      },
+      // 报工成功后刷新当前项状态
+      setPlanStatus(status) {
+        this.rulesInfo.planDevices[this.activeIndex].planStatus = status;
       }
     }
   };

+ 827 - 0
src/views/produce/components/prenatalExamination/components/workOrder/details.vue

@@ -0,0 +1,827 @@
+<template>
+  <div class="page" v-loading="pageLoading">
+    <el-form label-width="130px">
+      <div class="content-detail" v-show="num == 1">
+        <div class="basic-details">
+          <HeaderTitle title="基本信息" size="16px"> </HeaderTitle>
+          <el-row>
+            <el-col :span="24">
+              <el-col :span="12">
+                <el-form-item label="计划单号">
+                  <span> {{ infoData.planCode }} </span>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="来源计划配置单号">
+                  <span> {{ infoData.planConfigCode }} </span>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="名称">
+                  <span> {{ infoData.planName }} </span>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="部门">
+                  <span>
+                    {{ infoData.executeGroupName }}
+                  </span>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="人员">
+                  <span>
+                    {{ infoData.executeUserName }}
+                  </span>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="计划完成时长">
+                  <span v-if="infoData.duration >= 0"
+                    >{{ infoData.duration }}分钟</span
+                  >
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="周期">
+                  <span v-if="infoData.ruleInfo">
+                    {{ infoData.ruleInfo.cycleValue
+                    }}{{
+                      getDictValue('巡点检周期', infoData.ruleInfo.cycleType)
+                    }}
+                  </span>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="设备分类">
+                  <span> {{ infoData.categoryLevelName }} </span>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="规则名称">
+                  <span>
+                    {{ infoData.ruleName }}
+                  </span>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="创建部门">
+                  <span> {{ infoData.createGroupName }} </span>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="创建人">
+                  <span> {{ infoData.createUserName }} </span>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="创建时间">
+                  <span> {{ infoData.createTime }} </span>
+                </el-form-item>
+              </el-col>
+              <el-col :span="24">
+                <el-form-item label="备注">
+                  <span> {{ infoData.remark }} </span>
+                </el-form-item>
+              </el-col>
+            </el-col>
+            <!-- <el-col :span="12">
+              <img :src="data.imageUrl" alt="" />
+            </el-col> -->
+          </el-row>
+        </div>
+
+        <!-- 巡点检、执行信息 -->
+        <!-- <div class="execute_info">
+          <div class="execute_info_title">
+            <span>执行信息</span>
+            <span
+              >执行人:{{ data.executeUserName }}
+              <i style="margin: 0 18px"></i> 执行时间:{{
+                data.acceptTime
+              }}</span
+            >
+          </div>
+          <HeaderTitle title="执行信息" size="16px"></HeaderTitle>
+          <el-row class="execute_row">
+            <el-col :span="8" class="column">
+              <span class="label">确认结果:</span>
+              <span class="value">{{
+                infoData.status ? infoData.status.descp : ''
+              }}</span>
+            </el-col>
+            <el-col :span="8" class="column">
+              <span class="label">实际开始时间:</span>
+              <span class="value">{{ infoData.acceptTime }}</span>
+            </el-col>
+            <el-col :span="8" class="column">
+              <span class="label">实际结束时间:</span>
+              <span class="value">{{ infoData.finishTime }}</span>
+            </el-col>
+            <el-col :span="24" class="column">
+              <span class="label">超期原因:</span>
+              <span class="value">{{ infoData.timeoutCause }}</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 infoData.deviceList"
+              :key="item.id"
+            >
+              <div class="equipment_info" v-if="item.substance">
+                <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="ruleMatters_box">
+                <el-table :data="item.workItems" border>
+                  <el-table-column label="序号" width="50">
+                    <template slot-scope="scope">
+                      <span>{{ scope.$index + 1 }}</span>
+                    </template>
+                  </el-table-column>
+                  <el-table-column
+                    label="零部件编码"
+                    prop="categoryCode"
+                    width="100"
+                  >
+                    <template slot-scope="scope">
+                      <div>
+                        <span>{{ scope.row.categoryCode }}</span>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column
+                    label="零部件名称"
+                    prop="categoryName"
+                    width="100"
+                  >
+                    <template slot-scope="scope">
+                      <div>
+                        <span>{{ scope.row.categoryName }}</span>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="事项" prop="name" width="100">
+                    <template slot-scope="scope">
+                      <div>
+                        <span>{{ scope.row.name }}</span>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="内容" prop="content" width="300">
+                    <template slot-scope="scope">
+                      <div>
+                        <span>{{ scope.row.content }}</span>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="操作指导" prop="operationGuide">
+                    <template slot-scope="scope">
+                      <div class="operationGuide_box">
+                        <div class="left_content">
+                          <template v-if="scope.row.operationGuide">
+                            <div
+                              v-for="(item, index) in scope.row.operationGuide
+                                .toolList"
+                              :key="item.id"
+                              >{{ index + 1 }}.{{ item.name }}</div
+                            >
+                          </template>
+                        </div>
+                        <div class="line"></div>
+                        <div class="right_content">
+                          <template v-if="scope.row.operationGuide">
+                            <div
+                              v-for="(item, index) in scope.row.operationGuide
+                                .procedureList"
+                              :key="item.id"
+                              >{{ index + 1 }}.{{ item.content }}</div
+                            >
+                          </template>
+                        </div>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="标准" prop="norm" width="100">
+                    <template slot-scope="scope">
+                      <div>
+                        <span>{{ scope.row.norm }}</span>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="状态" prop="status" width="100">
+                    <template slot-scope="scope">
+                      <div>
+                        <span>{{ options[scope.row.status] }}</span>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column
+                    label="现场照片"
+                    prop="photoList"
+                    width="300"
+                  >
+                    <template slot-scope="scope">
+                      <div>
+                        <el-image
+                          v-for="imgItem in scope.row.photoList"
+                          :key="imgItem"
+                          style="width: 100px; height: 100px"
+                          :src="imgItem"
+                          :preview-src-list="scope.row.photoList"
+                        >
+                        </el-image>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="结果" prop="result" width="200">
+                  </el-table-column>
+                </el-table>
+              </div>
+              <!-- <div class="matter_info">
+                <el-table :data="item.workItems || []" 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="item" />
+                  <el-table-column label="内容" prop="content" />
+                  <el-table-column label="标准" prop="standard" />
+                </el-table>
+              </div> -->
+            </div>
+            <!-- <div class="btnbox" v-if="$route.query.isshow">
+              <el-button class="confirm-btn" type="danger" plain @click="reject"
+                >驳回</el-button
+              >
+              <el-button class="confirm-btn" type="success" plain @click="pass"
+                >通过</el-button
+              >
+              <el-button class="cancel-btn">关闭</el-button>
+            </div> -->
+            <!-- <div class="textbox" v-if="showtext">
+              <el-input
+                type="textarea"
+                placeholder="请输入驳回原因"
+                v-model="cause"
+                maxlength="30"
+                rows="5"
+                show-word-limit
+              >
+              </el-input>
+              <div class="textbtnbox">
+                <el-button size="small" round @click="cancelreject"
+                  >取消</el-button
+                >
+                <el-button size="small" round @click="surereject"
+                  >提交</el-button
+                >
+              </div>
+            </div> -->
+          </div>
+        </div>
+        <HeaderTitle title="备品备件申请单" size="16px"></HeaderTitle>
+        <editd :id="infoData.id" />
+
+        <!-- 巡点检、缺陷设备报修记录 -->
+        <!-- <div class="repair_notes">
+          <HeaderTitle title="缺陷设备报修记录" size="16px"></HeaderTitle>
+          <div class="repair_notes_equipment_item">
+            <el-row class="equipment_item_tilte">
+              <el-col :span="8">
+                <span class="label">设备名称:</span>
+                <span>{{ repairNotes.equiName }}</span>
+              </el-col>
+              <el-col :span="8">
+                <span class="label">规格型号:</span>
+                <span>{{ repairNotes.equiModel }}</span>
+              </el-col>
+              <el-col :span="8">
+                <span class="label">设备编码:</span>
+                <span>{{ repairNotes.equiCode }}</span>
+              </el-col>
+            </el-row>
+            <div class="main_info">
+              <div>
+                <span>报修记录编号:</span>
+                <span>{{ repairNotes.repairsCode }}</span>
+              </div>
+              <div>
+                <span>故障描述:</span>
+                <span>{{ repairNotes.repairsDescription }}</span>
+              </div>
+              <div>
+                <span>处理进度:</span>
+                <span>{{ statusObj[repairNotes.status] }}</span>
+              </div>
+            </div>
+          </div>
+        </div> -->
+      </div>
+    </el-form>
+  </div>
+</template>
+
+<script>
+  import dictMixins from '@/mixins/dictMixins';
+  import { getWordOrderDetail } from '@/api/maintenance/patrol_maintenance';
+  import editd from './editd';
+
+  export default {
+    components: {
+      editd
+    },
+    props: {
+      workOrderId: {
+        type: [Number, String],
+        required: true
+      }
+    },
+    mixins: [dictMixins],
+    watch: {
+      workOrderId: {
+        handler(newVal) {
+          if (newVal) {
+            this.getInfo();
+          }
+        }
+      }
+    },
+    data() {
+      return {
+        options: {
+          0: '正常',
+          '-1': '缺陷'
+        },
+        num: 1,
+        infoData: {},
+        dialogVisible: false,
+        data: {},
+        repairNotes: {},
+        pageLoading: false,
+        typeValue: null,
+        contract_type: [],
+        status: [
+          {
+            value: true,
+            label: '失效'
+          },
+          {
+            value: false,
+            label: '生效'
+          }
+        ],
+        ruleItem: [],
+        cause: '',
+        showtext: false,
+        from: null
+      };
+    },
+    created() {
+      this.requestDict('巡点检周期');
+      this.getInfo();
+    },
+    methods: {
+      // getStatus: useDictLabel(patrolMatterStatus),
+      delete() {},
+      // 点击切换事件
+      tab(index) {
+        this.num = index;
+      },
+      goBack() {
+        window.sessionStorage.setItem('patrolTabType', 'work');
+        if (this.form) {
+          this.$router.push({
+            path: '/workspace/workOrder',
+            query: { activeName: 'polling' }
+          });
+        } else {
+          this.$router.go(-1);
+        }
+      },
+      // 表格数据
+      getInfo() {
+        this.pageLoading = true;
+        getWordOrderDetail(this.workOrderId)
+          .then((data) => {
+            data.deviceList.forEach((item) => {
+              item.workItems.forEach((val) => {
+                val.photoList.map((url) => {
+                  return window.location.origin + url;
+                });
+              });
+            });
+            this.infoData = data;
+            // if (res.success) {
+            //   this.data = res.data;
+            //   this.data.planEquiList = this.data.planEquiList.filter(
+            //     (item) => item.itemList && item.itemList.length > 0
+            //   );
+            //   // 获取 缺陷设备报修记录
+            //   const repairId = res.data.planEquiList[0].repairId;
+            //   if (repairId) {
+            //     this.getRepairNotes(repairId);
+            //   }
+            // }
+            this.pageLoading = false;
+          })
+          .catch(() => {
+            this.pageLoading = false;
+          });
+      },
+      // 获取 缺陷设备报修记录
+      async getRepairNotes(repairId) {
+        const res = await repair.getInfo(repairId);
+        if (res?.success) {
+          console.log('缺陷设备报修记录:', res.data);
+          this.repairNotes = res.data;
+        }
+      },
+      //通过按钮事件
+      pass() {
+        let params = {
+          planId: this.$route.query.id,
+          checked: 2,
+          myHandleId: this.$route.query.dbid,
+          cause: this.cause,
+          type: 2, //1维修;2保养,巡点检
+          handleType: 0 //办理类型(0 审批 1 验收)
+        };
+        sendAudit(params).then((res) => {
+          if (res.success) {
+            this.$message.success('审批通过!');
+            this.$router.back();
+          }
+        });
+      },
+      //驳回按钮事件
+      reject() {
+        this.showtext = true;
+      },
+      cancelreject() {
+        this.showtext = false;
+        this.cause = '';
+      },
+      surereject() {
+        if (!this.cause) {
+          this.$message.info('请填写驳回原因!');
+        } else {
+          let params = {
+            id: this.$route.query.id,
+            checked: 0,
+            myHandleId: this.$route.query.dbid,
+            cause: this.cause,
+            type: 2, //1维修;2保养,巡点检
+            handleType: 0 //办理类型(0 审批 1 验收)
+          };
+          sendAudit(params).then((res) => {
+            if (res.success) {
+              this.$message.error('审批驳回!');
+              this.$router.back();
+            }
+          });
+        }
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+  // @import '@/assets/css/oaa.scss';
+  .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;
+  }
+
+  .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;
+            }
+          }
+        }
+        .ruleMatters_box {
+          flex: 3;
+          height: 100%;
+          display: flex;
+          flex-direction: column;
+          .divider {
+            flex: 0 0 50px;
+            .title {
+              height: 35px;
+            }
+          }
+          .el-table {
+            overflow: auto;
+            .operationGuide_box {
+              width: 100%;
+              display: flex;
+              position: relative;
+              .left_content {
+                flex: 0 0 300px;
+                padding: 10px;
+                margin-right: 10px;
+                overflow-y: auto;
+              }
+              .line {
+                position: absolute;
+                top: -10px;
+                left: 300px;
+                bottom: -10px;
+                height: 110%;
+                width: 1px;
+                background-color: #ededed;
+              }
+              .right_content {
+                flex: 1;
+                padding: 10px;
+                overflow-y: auto;
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  .execute_info {
+    margin: 30px 0;
+    .execute_info_title {
+      border-bottom: 1px solid #1890ff;
+      padding-bottom: 3px;
+      margin-bottom: 20px;
+      display: flex;
+      justify-content: space-between;
+      > span:first-child {
+        line-height: 16px;
+        border-left: 6px solid #1890ff;
+        padding-left: 6px;
+      }
+    }
+    .execute_row {
+      padding: 0 30px;
+      .column {
+        display: flex;
+        font-size: 14px;
+        margin-bottom: 20px;
+        .label {
+          // width: 110px;
+          text-align: center;
+          font-weight: 700;
+        }
+      }
+    }
+  }
+  .repair_notes {
+    .repair_notes_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;
+      }
+    }
+    .repair_notes_equipment_item {
+      padding: 0 20px;
+      .equipment_item_tilte {
+        background-color: #f7f7f7;
+        height: 36px;
+        line-height: 36px;
+        .label {
+          font-weight: 700;
+        }
+      }
+      .main_info {
+        font-size: 14px;
+        margin-top: 15px;
+        > div {
+          margin-bottom: 10px;
+        }
+      }
+    }
+  }
+  .btnbox {
+    display: flex;
+    justify-content: center;
+  }
+  ::v-deep .el-button {
+    padding: 10px 20px;
+    margin-right: 10px;
+  }
+  .textbtnbox {
+    margin-top: 10px;
+    display: flex;
+    justify-content: center;
+  }
+</style>

+ 198 - 0
src/views/produce/components/prenatalExamination/components/workOrder/editd.vue

@@ -0,0 +1,198 @@
+<template>
+  <div class="ele-body">
+    <el-card shadow="never" v-loading="loading">
+      <!-- 数据表格 -->
+      <ele-pro-table
+        ref="table"
+        :columns="columns"
+        :datasource="tableList"
+        :needPage="false"
+        :toolbar="false"
+      >
+        <template v-slot:totalCount="{ row }">
+          {{ row.totalCount }} {{ row.measuringUnit }}
+        </template>
+
+        <template v-slot:totalPackage="{ row }">
+          {{ row.totalPackage }}
+        </template>
+
+        <template v-slot:totalWeight="{ row }">
+          {{ row.totalWeight }} {{ row.weightUnit }}
+        </template>
+
+        <template v-slot:approvalStatus="{ row }">
+          <span :class="{ 'ele-text-danger': row.approvalStatus == 2 }">
+            {{ statusFormatter(row.approvalStatus) }}
+          </span>
+        </template>
+      </ele-pro-table>
+    </el-card>
+
+    <!-- <edit ref="edit"></edit> -->
+  </div>
+</template>
+
+<script>
+  import { details } from '@/api/maintenance/repair.js';
+
+  export default {
+    props: {
+      id: ''
+    },
+    components: {},
+    data() {
+      return {
+        loading: false,
+        tableList: [],
+        outputSceneState: [
+          { code: 1, label: '退供出库' },
+          { code: 2, label: '调拨出库' },
+          { code: 3, label: '销售出库' },
+          { code: 4, label: '领用出库' },
+          { code: 5, label: '报废出库' },
+          { code: 6, label: '外协出库' },
+          { code: 7, label: '委外出库' },
+          { code: 8, label: '受托退货出库' },
+          { code: 9, label: '仓库委外出库' },
+          { code: 10, label: '采购退货出库' },
+          { code: 11, label: '自选领用出库' },
+          { code: 12, label: '配料出库' }
+        ],
+        statusOpt: [
+          { label: '审核中', value: 0 },
+          { label: '审核通过', value: 1 },
+          { label: '审核不通过', value: 2 }
+        ]
+      };
+    },
+    computed: {
+      // 表格列配置
+      columns() {
+        return [
+          {
+            columnKey: 'index',
+            label: '序号',
+            type: 'index',
+            width: 55,
+            align: 'center',
+            showOverflowTooltip: true,
+            fixed: 'left'
+          },
+          {
+            prop: 'code',
+            label: '编码',
+            align: 'center',
+            minWidth: 110
+          },
+          {
+            prop: 'repairCode',
+            label: '工单编码',
+            align: 'center',
+            minWidth: 110
+          },
+          {
+            prop: 'repairName',
+            label: '工单名称',
+            align: 'center',
+            minWidth: 110
+          },
+          {
+            prop: 'deviceName',
+            label: '设备名称',
+            align: 'center',
+            minWidth: 110
+          },
+          {
+            prop: 'fixCode',
+            label: '固资编码',
+            align: 'center',
+            minWidth: 110
+          },
+          {
+            prop: 'deviceCode',
+            label: '设备编码',
+            align: 'center',
+            minWidth: 110
+          },
+          {
+            prop: 'receivingDeptName',
+            label: '领用部门',
+            align: 'center',
+            minWidth: 110
+          },
+          {
+            prop: 'recipientName',
+            label: '领用人',
+            align: 'center',
+            minWidth: 110
+          },
+          {
+            prop: 'usageTime',
+            label: '领用时间',
+            align: 'center',
+            minWidth: 110
+          },
+          {
+            prop: 'purpose',
+            label: '用途',
+            align: 'center',
+            minWidth: 110
+          },
+
+          {
+            prop: 'type',
+            label: '出库场景',
+            align: 'center',
+            formatter: (row, column, cellValue) => {
+              return this.outputSceneState.find(
+                (item) => item.code == cellValue
+              )?.label;
+            }
+          },
+          // {
+          //   prop: 'approvalUserName',
+          //   label: '审核人',
+          //   align: 'center'
+          // },
+          {
+            slot: 'approvalStatus',
+            label: '状态',
+            align: 'center'
+          }
+        ];
+      }
+    },
+    watch: {
+      id(val) {
+        console.log(val);
+        if (val) {
+          this.getValue();
+        }
+      }
+    },
+    created() {},
+    methods: {
+      async getValue() {
+        const data = await details(this.id);
+        console.log(data, 'data');
+        this.tableList = data.map((item) => {
+          return {
+            ...item,
+            deviceName: item.deviceList[0].name,
+            fixCode: item.deviceList[0].fixCode,
+            deviceCode: item.deviceList[0].code
+          };
+        });
+      },
+      statusFormatter(status) {
+        const obj = this.statusOpt.find((i) => i.value == status);
+        return obj && obj.label;
+      },
+
+      open(row, type) {
+        this.$refs.edit.open(row, type);
+      }
+    }
+  };
+</script>

+ 1063 - 0
src/views/produce/components/prenatalExamination/components/workOrder/programRulesDialog.vue

@@ -0,0 +1,1063 @@
+<template>
+  <ele-modal width="80%" :visible="visible" v-if="visible" append-to-body custom-class="ele-dialog-form"
+    :title="dialogTitle" :close-on-click-modal="false" :before-close="close" :maxable="true">
+    <header-title title="基本信息"></header-title>
+    <el-form ref="addFormRef" :model="addForm" :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 :disabled="dialogTitle === '派单'" v-model="addForm.name" size="small" placeholder="请输入"></el-input>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="8">
+          <el-form-item label="自动派单" prop="autoOrder">
+            <el-select :disabled="dialogTitle === '派单' || dialogTitle.includes('量具送检')
+              " v-model="addForm.autoOrder" size="small" style="width: 100%" @change="autoOrderChange">
+              <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="duration">
+            <div style="display: flex">
+              <el-input type="number" :disabled="dialogTitle === '派单'" v-model="addForm.duration" size="small"
+                placeholder="请输入" @input="formDataDurationTime">
+                <template #suffix>分钟</template>
+              </el-input>
+            </div>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="8" v-if="addForm.autoOrder && !dialogTitle.includes('量具送检')">
+          <el-form-item label="部门" prop="groupId">
+            <deptSelect v-model="addForm.groupId" @changeGroup="searchDeptNodeClick" :disabled="isBindPlan" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="8" v-if="addForm.autoOrder && !dialogTitle.includes('量具送检')">
+          <el-form-item label="负责人" prop="executorId">
+            <el-select v-model="addForm.executorId" 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" v-if="!dialogTitle.includes('量具送检')">
+          <el-form-item label="审核人" prop="approvalUserId">
+            <el-select :disabled="dialogTitle === '派单'" v-model="addForm.approvalUserId" size="small" clearable
+              style="width: 100%" 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="urgent">
+            <DictSelection dictName="紧急程度" clearable v-model="addForm.urgent" :disabled="dialogTitle === '派单'">
+            </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="24">
+          <el-form-item label="备注" prop="remark">
+            <el-input type="textarea" resize="none" v-model="addForm.remark" :rows="2" placeholder="请详细说明" size="small"
+              :disabled="dialogTitle === '派单'"></el-input>
+          </el-form-item>
+        </el-col>
+      </el-row>
+
+      <el-button v-if="dialogTitle.includes('新增')" type="primary" size="small" style="margin-bottom: 10px"
+        @click="handleAddTab">添加规则</el-button>
+
+      <el-tabs v-model="tabsValue" type="card" :closable="dialogTitle !== '派单'" @tab-click="handleTab"
+        @tab-remove="removeTab">
+        <el-tab-pane v-for="(item, ruleIdListIndex) in ruleIdList" :key="item.ruleId" :label="item.name"
+          :name="item.ruleId">
+          <div class="el-tab_box">
+            <div class="equipmentList_box">
+              <header-title title="设备列表">
+                <div v-if="dialogTitle !== '派单'">
+                  <el-button size="small" icon="el-icon-plus" class="ele-btn-icon" type="primary"
+                    :disables="hasCategoryId" @click="handleAdd(ruleIdList, ruleIdListIndex)">新增</el-button>
+                </div>
+              </header-title>
+              <el-table :data="item.equipmentList" border>
+                <el-table-column label="序号" type="index" width="50">
+                </el-table-column>
+                <el-table-column label="设备名称" align="center" prop="name">
+                  <template slot-scope="{ row }">
+                    <template>
+                      {{ row.name }}
+                    </template>
+                  </template>
+                </el-table-column>
+                <el-table-column label="编号" align="center" prop="codeNumber">
+                  <template slot-scope="{ row }">
+                    <template>
+                      {{ row.codeNumber }}
+                    </template>
+                  </template>
+                </el-table-column>
+                <el-table-column label="固资编码" align="center" prop="fixCode">
+                  <template slot-scope="{ row }">
+                    <template>
+                      {{ row.fixCode }}
+                    </template>
+                  </template>
+                </el-table-column>
+                <el-table-column v-if="dialogTitle !== '派单'" label="操作" width="100">
+                  <template slot-scope="scope">
+                    <el-button type="text" @click="deleteEquipment(scope.$index)">删除</el-button>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+            <div class="ruleMatters_box">
+              <header-title title="规则事项">
+                <div v-if="dialogTitle !== '派单'">
+                  <el-button size="small" icon="el-icon-plus" class="ele-btn-icon" type="primary"
+                    @click="addPostscript">新增</el-button>
+                </div>
+              </header-title>
+              <el-table :data="item.ruleItems" border>
+                <el-table-column label="序号" width="50">
+                  <template slot-scope="scope">
+                    <span>{{ scope.$index + 1 }}</span>
+                  </template>
+                </el-table-column>
+                <el-table-column label="零部件编码" prop="categoryCode" width="100">
+                  <template slot-scope="scope">
+                    <div v-if="scope.row.isNew">
+                      <el-input v-model="scope.row.categoryCode" placeholder="请输入零部件编码"></el-input>
+                    </div>
+                    <div v-else>
+                      <span>{{ scope.row.categoryCode }}</span>
+                    </div>
+                  </template>
+                </el-table-column>
+                <el-table-column label="零部件名称" prop="categoryName" width="100">
+                  <template slot-scope="scope">
+                    <div v-if="scope.row.isNew">
+                      <el-input v-model="scope.row.categoryName" placeholder="请输入零部件名称"></el-input>
+                    </div>
+                    <div v-else>
+                      <span>{{ scope.row.categoryName }}</span>
+                    </div>
+                  </template>
+                </el-table-column>
+                <el-table-column label="事项" prop="name" width="100">
+                  <template slot-scope="scope">
+                    <div v-if="scope.row.isNew">
+                      <el-input v-model="scope.row.name" placeholder="请输入内容"></el-input>
+                    </div>
+                    <div v-else>
+                      <span>{{ scope.row.name }}</span>
+                    </div>
+                  </template>
+                </el-table-column>
+                <el-table-column label="内容" prop="content" width="200">
+                  <template slot-scope="scope">
+                    <div v-if="scope.row.isNew">
+                      <el-input v-model="scope.row.content" placeholder="请输入内容"></el-input>
+                    </div>
+                    <div v-else>
+                      <span>{{ scope.row.content }}</span>
+                    </div>
+                  </template>
+                </el-table-column>
+                <el-table-column label="操作指导" prop="operationGuide">
+                  <template slot-scope="scope">
+                    <div class="operationGuide_box" @click="
+                      openOperationGuideDialogDialog(
+                        scope.row.operationGuide,
+                        scope.$index
+                      )
+                      ">
+                      <div class="left_content">
+                        <template v-if="scope.row.operationGuide">
+                          <div v-for="(item, index) in scope.row.operationGuide
+                            .toolList" :key="item.id">{{ index + 1 }}.{{ item.name }}</div>
+                        </template>
+                      </div>
+                      <div class="right_content">
+                        <template v-if="scope.row.operationGuide">
+                          <div v-for="(item, index) in scope.row.operationGuide
+                            .procedureList" :key="item.id">{{ index + 1 }}.{{ item.content }}</div>
+                        </template>
+                      </div>
+                    </div>
+                  </template>
+                </el-table-column>
+                <el-table-column label="标准" prop="norm" width="100">
+                  <template slot-scope="scope">
+                    <div v-if="scope.row.isNew">
+                      <el-input v-model="scope.row.norm" placeholder="请输入内容"></el-input>
+                    </div>
+                    <div v-else>
+                      <span>{{ scope.row.norm }}</span>
+                    </div>
+                  </template>
+                </el-table-column>
+                <el-table-column v-if="dialogTitle !== '派单'" label="操作" width="100">
+                  <template slot-scope="scope">
+                    <el-button type="text" @click="deleteItem(scope.$index)">删除</el-button>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+          </div>
+        </el-tab-pane>
+      </el-tabs>
+    </el-form>
+    <template v-slot:footer>
+      <el-button @click="visible = false">取消</el-button>
+      <el-button type="primary" @click="save">
+        {{ dialogTitle === '派单' ? '派单' : '保存' }}</el-button>
+    </template>
+
+    <!-- 添加规则 -->
+    <ele-modal width="800px" :visible="addDialog" :append-to-body="true" title="规则配置" :close-on-click-modal="true"
+      @update:visible="closeAdd" :maxable="true">
+      <el-select v-model="ruleObj.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.code + '-' + item.name"
+          @click.native="ruleChange(item)"></el-option>
+      </el-select>
+      <template v-slot:footer>
+        <el-button @click="addDialog = false">取消</el-button>
+        <el-button type="primary" @click="addRule"> 添加 </el-button>
+      </template>
+    </ele-modal>
+  </ele-modal>
+</template>
+
+<script>
+import { getDetail, getCode } from '@/api/ruleManagement/matter';
+import {
+  getRule,
+  getCategory,
+} from '@/api/ruleManagement/plan';
+import { saveOrUpdate } from '@/api/maintenance/patrol_maintenance';
+import { getUserPage } from '@/api/system/organization';
+import deptSelect from '@/components/CommomSelect/dept-select.vue';
+import { pageList } from '@/api/technology/version/version.js';
+import { getById } from '@/api/maintenance/patrol_maintenance';
+import { getFile } from '@/api/system/file';
+import { deepClone } from 'ele-admin/lib/utils/core';
+
+export default {
+  components: {
+    deptSelect
+  },
+  props: {
+    dialogTitle: {
+      type: String,
+      default: () => {
+        return '派单';
+      }
+    }
+    // visible: {
+    //   type: Boolean,
+    //   default: false
+    // }
+  },
+  data() {
+    const defaultForm = {
+      id: null,
+      code: '',
+      name: '',
+      modelType: '',
+      brandNum: '',
+      specification: '',
+      measuringUnit: '',
+
+      bomList: []
+    };
+    return {
+      visible: false,
+      ruleIndex: 0, // 规则index
+      ruleId: '',
+      formLabel: '',
+      isBindPlan: false,
+      ruleObj: {
+        ruleId: '',
+        name: '',
+        code: '',
+        equipmentList: []
+      },
+      ruleIdList: [],
+      addForm: {
+        id: '',
+        code: '', // 计划配置单号
+        name: '', // 计划配置名称
+        autoOrder: 1, // 自动派单
+        ruleId: '', // 规则id
+        ruleName: '', // 规则名称
+        duration: null, // 计划完成时长
+        categoryId: '', // 设备类别id
+        approvalUserId: '', // 审核人id
+        groupId: '', // 巡点检部门code
+        executorId: [], // 巡点检人员id
+        executorPhone: '',
+        status: 1, // 状态
+        remark: '', // 备注
+        urgent: '1'
+      },
+      ruleNameList: [], // 规则列表
+      uerList: [], // 审核人列表
+      executorList: [], // 业务人员列表
+      defaultForm,
+      // 表单数据
+      form: {
+        ...defaultForm
+      },
+
+      versionList: [],
+
+      // 表单验证规则
+      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' }
+        ],
+        executorId: [
+          { required: true, message: '请选择巡点检人员', trigger: 'change' }
+        ],
+        urgent: [
+          { required: true, message: '请选择紧急程度', trigger: 'change' }
+        ]
+      },
+
+      columns: [
+        {
+          type: 'index',
+          width: 55,
+          align: 'center'
+        },
+        {
+          label: '子项编号',
+          prop: 'subCode',
+          action: 'subCode'
+        },
+        {
+          label: '物料名称',
+          prop: 'categoryName',
+          action: 'categoryName'
+        },
+
+        {
+          label: '是否回收料',
+          prop: 'isReworkBom',
+          action: 'isReworkBom',
+          slot: 'isReworkBom',
+          width: 95
+        },
+
+        {
+          label: '物料编码',
+          prop: 'categoryCode'
+        },
+        {
+          label: '牌号',
+          prop: 'brandNum'
+        },
+        {
+          label: '型号',
+          prop: 'modelType'
+        },
+        {
+          label: '数量',
+          prop: 'count'
+        },
+        {
+          label: '计量单位',
+          prop: 'unit'
+        },
+
+        {
+          label: '附件',
+          slot: 'bomArtFiles',
+          action: 'bomArtFiles',
+          minWidth: 100
+        },
+
+        {
+          label: '单位',
+          prop: 'weightUnit'
+        },
+
+        {
+          label: '备注',
+          prop: 'remark'
+        }
+      ],
+
+      statusList: [
+        { label: '草稿', value: -1 },
+        { label: '失效', value: 0 },
+        { label: '生效', value: 1 }
+      ],
+
+      // 提交状态
+      loading: false,
+
+      categoryId: null,
+
+      current: null,
+
+      materialShow: false,
+
+      tabsList: [],
+      tableData: [],
+
+      taskId: null,
+
+      addDialog: false,
+      tabsValue: null,
+
+      hasCategoryId: false,
+      getByIdData: {}
+    };
+  },
+  computed: {
+    // 是否开启响应式布局
+    styleResponsive() {
+      return this.$store.state.theme.styleResponsive;
+    }
+  },
+  watch: {
+    visible(val) {
+      if (val) {
+        // 获取审核人列表数据
+        this.getUserList();
+        // 获取规则名称
+        this._getRuleNameList();
+      }
+    }
+  },
+  methods: {
+    close() {
+      this.visible = false;
+    },
+    // 初始化
+    async init(row, tips) {
+      console.log(row);
+      console.log(tips);
+      this.visible = true;
+      if (row) {
+        this.getInfo(row.id, tips);
+      } else {
+        //  获取计划配置单号
+        this.getOrderCode(tips);
+        this.addForm = {
+          code: '', // 计划配置单号
+          name: '', // 计划配置名称
+          autoOrder: 1, // 自动派单
+          ruleId: '', // 规则id
+          ruleName: '', // 规则名称
+          duration: null, // 计划完成时长
+          categoryId: '', // 设备类别id
+          approvalUserId: '', // 审核人id
+          groupId: '', // 巡点检部门code
+          executorId: [], // 巡点检人员id
+          executorPhone: '',
+          status: 1, // 状态
+          remark: '', // 备注
+          urgent: '1'
+        };
+        this.ruleIdList = [];
+        this.isBindPlan = false;
+        this.planRuleEquiList = [];
+        //   this.matterRulesList = [];
+      }
+      this.formLabel = this.dialogTitle.includes('巡点检')
+        ? '巡点检'
+        : this.dialogTitle.includes('保养')
+          ? '保养'
+          : this.dialogTitle.includes('量具送检')
+            ? '量具送检'
+            : this.dialogTitle.includes('运行记录')
+              ? '运行记录'
+              : '盘点';
+      const typeOptions = {
+        巡点检: 1,
+        保养: 2,
+        维修: 3,
+        计划性维修: 4,
+        量具送检: 5,
+        运行记录: 6
+      };
+      this.$set(this.addForm, 'type', typeOptions[this.formLabel]);
+
+      // const planRuleTypeObj = {
+      //   巡点检: 'PATROL',
+      //   保养: 'MAINTAIN',
+      //   量具送检: '',
+      //   盘点: 'INVENTORY'
+      // };
+      // this.addForm.planType = planRuleTypeObj[this.formLabel];
+    },
+    autoOrderChange(val) {
+      if (val == 0) {
+        this.addForm.executorId = '';
+        this.addForm.groupId = '';
+      }
+    },
+    ruleChange(item) {
+      this.ruleObj.name = item.name;
+      this.ruleObj.code = item.code;
+    },
+    save() {
+      console.log(this.addForm, 888);
+      console.log(this.ruleIdList);
+      if (this.ruleIdList && this.ruleIdList.length > 0) {
+        this.$refs.addFormRef.validate(async (valid) => {
+          console.log(valid);
+          if (valid) {
+            const planDeviceList = this.ruleIdList.map((ruleItem) => {
+              return ruleItem.equipmentList.map((item) => {
+                return {
+                  // equiCode: item.code,
+                  // equiName: item.name,
+                  deviceId: item.id,
+                  codeNumber: item.codeNumber,
+                  // equiModel: item.modelType,
+                  equiLocation: item.position[0] && item.position[0].pathName,
+                  equiLocationCode:
+                    item.position[0] && item.position[0].pathIds,
+                  workItems: ruleItem.ruleItems ? ruleItem.ruleItems : []
+                  // categoryId: item.category.categoryLevelId,
+                  // categoryName: item.category.categoryLevelName
+                  // sparePart: ruleItem.sparePart ? obj.sparePart : []
+                };
+              });
+            });
+            let boolen = planDeviceList.every((item) => item.length > 0);
+            console.log(planDeviceList);
+            if (!boolen) {
+              this.$message.error('请添加设备!');
+              return false;
+            }
+            let sendMsg = this.ruleIdList.map((item, index) => {
+              return {
+                ...this.addForm,
+                ruleId: item.ruleId,
+                categoryId: item.categoryId,
+                planDeviceList: planDeviceList[index],
+                executorId: this.addForm.executorId
+                  ? this.addForm.executorId.join(',')
+                  : ''
+              };
+            });
+            let type = '';
+            if (this.dialogTitle === '派单') {
+              type = '派单';
+            } else {
+              type = this.dialogTitle.includes('新增') ? '新增' : '编辑';
+            }
+            // return
+            try {
+              let res = await saveOrUpdate(sendMsg);
+              if (res) {
+                this.$message.success(type + '成功!');
+                this.$emit('done');
+                this.visible = false;
+              }
+            } catch (error) {
+              this.$message.error(type + '失败!');
+            }
+          }
+        });
+      } else {
+        this.$message.error('请添加规则!');
+      }
+    },
+    // 保存操作指导数据
+    saveEdit(data, index) {
+      console.log(this.matterRulesList);
+      console.log(data);
+      console.log(index);
+      this.$set(
+        this.ruleIdList[this.ruleIndex].ruleItems[index],
+        'operationGuide',
+        data
+      );
+    },
+    /* 打开操作手册编辑款 */
+    openOperationGuideDialogDialog(row, index) {
+      if (this.dialogTitle !== '派单') {
+        this.$refs.operationGuideDialog.open(row, index);
+      }
+    },
+    deleteEquipment(index) {
+      this.ruleIdList[this.ruleIndex].equipmentList.splice(index, 1);
+    },
+    deleteItem(index) {
+      if (this.ruleIdList[this.ruleIndex].ruleItems.length > 1) {
+        this.ruleIdList[this.ruleIndex].ruleItems.splice(index, 1);
+      } else {
+        this.$message.error('至少要有一个规则事项!');
+      }
+    },
+    addPostscript() {
+      console.log(
+        'this.matterRulesList---------------',
+        this.matterRulesList
+      );
+      this.ruleIdList[this.ruleIndex].ruleItems.push({
+        sort: null,
+        name: '',
+        content: '',
+        norm: '',
+        isNew: true,
+        operationGuide: {
+          procedureList: [],
+          toolList: []
+        }
+      });
+    },
+    async getInfo(id, tips) {
+      console.log(id);
+      try {
+        const res = await getById(id);
+        console.log('res----------', res);
+        this.addForm = res.data;
+        this.addForm.id = res.data.planId;
+        if (this.dialogTitle === '派单') {
+          this.addForm.autoOrder = 1;
+        }
+        this.isBindPlan = res.isBindPlan;
+        // this.categoryEquipment(res.categoryLevelId);
+        this.ruleIdList = [
+          {
+            id: res.data.id,
+            ruleId: res.data.ruleId,
+            name: res.data.name,
+            code: res.data.code,
+            categoryId: res.data.categoryId,
+            equipmentList: res.data.planDeviceList.map((item) => {
+              return {
+                name: item.substance.name,
+                position: item.substance.position,
+                id: item.substance.id,
+                fixCode: item.substance.fixCode,
+                codeNumber: item.substance.codeNumber
+                // category: {
+                //   categoryLevelId: item.categoryId,
+                //   categoryLevelName: item.categoryName
+                // }
+              };
+            }),
+            ruleItems: res.data.planDeviceList[0].workItems
+          }
+        ];
+        console.log(this.ruleIdList);
+        this.tabsValue = this.ruleIdList[0].ruleId;
+
+        // this._getMatterRulesDetails(res.ruleId);
+        this.$set(this.addForm, 'code', res.data.code);
+        this.$set(this.addForm, 'urgent', JSON.stringify(res.data.urgent));
+        this.$set(this.addForm, 'executorId', res.data.executorId.split(','));
+        this.$set(this.addForm, 'imageUrl', {});
+        console.log(this.rootData);
+        if(res.data.groupId){
+        this.getUserList({ groupId: res.data.groupId });
+
+        }
+        // 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) {
+        console.log(error);
+      }
+    },
+    // 获取设备分类数据
+    async categoryEquipment(id) {
+      const params = { categoryLevelId: id, pageNum: 1, size: -1 };
+      console.log('params==', params);
+      const data = await getCategory(params);
+      console.log(data);
+      this.equipmentList = data.list;
+    },
+    // 选择设备
+    chooseEquipment(data, index, categoryId) {
+      this.$set(
+        this.ruleIdList[index],
+        'equipmentList',
+        this.ruleIdList[index].equipmentList.concat(data)
+      );
+      this.$set(this.ruleIdList[index], 'categoryId', categoryId);
+      console.log(this.ruleIdList);
+    },
+    // 获取计划配置单号
+    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);
+      }
+      if (tips.includes('量具送检')) {
+        const code = await getCode('quantity_code');
+        this.$set(this.addForm, 'code', code);
+      }
+      if (tips.includes('运行记录')) {
+        const code = await getCode('runRecord_code');
+        this.$set(this.addForm, 'code', code);
+      }
+    },
+    //选择部门(搜索)
+    searchDeptNodeClick(info, data) {
+      if (info) {
+        // 根据部门获取人员
+        this.addForm.groupName = data.name;
+        const params = { groupId: info };
+        this.getUserList(params);
+      } else {
+        this.addForm.groupId = null;
+      }
+    },
+    // 过滤计划完成时长
+    formDataDurationTime(value) {
+      if (value > 0) {
+        this.addForm.duration = value.replace(/^[0]+/, '');
+      } else {
+        this.addForm.duration = 0;
+      }
+    },
+    // 获取审核人列表、巡点检人员
+    async getUserList(params) {
+      try {
+        let data = { pageNum: 1, size: -1 };
+        // 如果传了参数就是获取巡点检人员数据
+        if (params) {
+          data = Object.assign(data, params);
+        }
+        const res = await getUserPage(data);
+        console.log('res------------', res);
+        if (params) {
+          this.executorList = res.list;
+        } else {
+          this.uerList = res.list;
+        }
+      } catch (error) { }
+    },
+    // 获取规则名列表
+    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 || [];
+        }
+      }
+      if (
+        this.dialogTitle === '新增量具送检计划配置' ||
+        this.dialogTitle === '编辑量具送检计划配置'
+      ) {
+        const res = await getRule({
+          status: 1,
+          type: 5,
+          pageNum: 1,
+          size: -1
+        });
+        if (res.list) {
+          this.ruleNameList = res.list || [];
+        }
+      }
+      if (
+        this.dialogTitle === '新增运行记录配置' ||
+        this.dialogTitle === '编辑运行记录配置'
+      ) {
+        const res = await getRule({
+          status: 1,
+          type: 6,
+          pageNum: 1,
+          size: -1
+        });
+        if (res.list) {
+          this.ruleNameList = res.list || [];
+        }
+      }
+    },
+    downloadFile(file) {
+      getFile({ objectName: file.storePath }, file.name);
+    },
+
+    openEdit(index) {
+      this.current = this.form.bomList[index];
+      console.log(this.current);
+      this.materialShow = true;
+    },
+
+    /* 表格数据源 */
+    datasource({ page, limit, where }) {
+      return [];
+    },
+
+    async getVersionList() {
+      const res = await pageList({
+        pageNum: 1,
+        size: 100
+      });
+
+      this.versionList = res.list;
+    },
+
+    handleAdd(ruleIdList, ruleIdListIndex) {
+      this.$refs.productRefs.open(ruleIdList, ruleIdListIndex);
+    },
+
+    // /* 更新visible */
+    // updateVisible(value) {
+    //   this.$emit('update:visible', value);
+    // },
+
+    handleAddTab() {
+      this.tableData = this.tabsList;
+      this.addDialog = true;
+    },
+
+    handleTab(e) {
+      this.ruleIndex = e.index;
+      // this.ruleIdList[e.index].ruleItems = this._getMatterRulesDetails(this.ruleId)
+    },
+
+    removeTab(targetName) {
+      this.$confirm('是否删除当前工序?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      })
+        .then(() => {
+          this.ruleIdList.forEach((e, index) => {
+            if (e.ruleId == targetName) {
+              this.ruleIdList.splice(index, 1);
+              this.$nextTick(() => {
+                if (this.ruleIdList.length == 1) {
+                  this.tabsValue = this.ruleIdList[0].ruleId;
+                }
+              });
+            }
+          });
+        })
+        .catch(() => { });
+    },
+
+    /*关闭选择参数*/
+    closeAdd() {
+      this.addDialog = false;
+    },
+    // 规则名称下拉触发
+    handleRuleNameChange(val) {
+      this.ruleId = val;
+      console.log('勾选的规则----', val);
+      this.getRulesDetails(val);
+    },
+    async getRulesDetails(val) {
+      const res = await getDetail(val);
+      this.hasCategoryId = res?.categoryId;
+      this.getByIdData = res;
+      console.log(res, 'sssssssssssssssssssssss')
+    },
+    // 封装 - 获取规则下面的详情数据及事项
+    async _getMatterRulesDetails(val) {
+      const res = await getDetail(val);
+      return res.ruleItems;
+    },
+    async addRule() {
+
+      let boolen = this.ruleIdList.every((item) => {
+        return this.ruleId != item.ruleId;
+      });
+      if (boolen) {
+        this.ruleObj.ruleItems = await this._getMatterRulesDetails(
+          this.ruleId
+        );
+
+        for (let i = 0; i < this.ruleObj.ruleItems.length; i++) {
+          const id = this.getByIdData?.categoryId;
+          const name = this.getByIdData?.categoryName;
+
+          this.ruleObj.ruleItems[i].categoryId = id;
+          this.ruleObj.ruleItems[i].categoryName = name;
+
+          this.ruleObj.ruleItems[i].isNew = true;
+        }
+
+        this.ruleIdList.push(deepClone(this.ruleObj));
+
+        console.log('this.ruleIdList--------', this.ruleIdList);
+
+        this.addDialog = false;
+        this.$nextTick(() => {
+          if (this.ruleIdList.length == 1) {
+            this.tabsValue = this.ruleIdList[0].ruleId;
+          }
+        });
+      } else {
+        this.$message.error('请误重复添加规则');
+      }
+    },
+    onClose() {
+      console.log('关闭窗口');
+      this.visible = false;
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+::v-deep .el-row {
+  display: flex;
+  flex-wrap: wrap;
+}
+
+::v-deep .el-tab_box {
+  display: flex;
+  margin-top: 10px;
+  height: 300px;
+  width: 100%;
+
+  .equipmentList_box {
+    flex: 1;
+    height: 100%;
+    margin-right: 10px;
+    display: flex;
+    flex-direction: column;
+
+    .divider {
+      flex: 0 0 50px;
+
+      .title {
+        height: 35px;
+      }
+    }
+
+    .el-table {
+      overflow: auto;
+    }
+  }
+
+  .ruleMatters_box {
+    flex: 3;
+    height: 100%;
+    display: flex;
+    flex-direction: column;
+    overflow: hidden;
+
+    .divider {
+      flex: 0 0 50px;
+
+      .title {
+        height: 35px;
+      }
+    }
+
+    .el-table {
+      overflow: auto;
+
+      .operationGuide_box {
+        width: 100%;
+        height: 50px;
+        display: flex;
+        overflow: hidden;
+        cursor: pointer;
+
+        .left_content {
+          flex: 0 0 200px;
+          padding: 10px;
+          box-sizing: border-box;
+          border: 1px solid #c0c4cc;
+          border-radius: 10px;
+          margin-right: 10px;
+          overflow-y: auto;
+        }
+
+        .right_content {
+          flex: 1;
+          padding: 10px;
+          box-sizing: border-box;
+          border: 1px solid #c0c4cc;
+          border-radius: 10px;
+          overflow-y: auto;
+        }
+      }
+    }
+
+    .el-table::before {
+      display: none;
+    }
+  }
+}
+</style>

+ 589 - 0
src/views/produce/components/prenatalExamination/components/workOrder/signingUpWork.vue

@@ -0,0 +1,589 @@
+<template>
+  <!-- 报工 -->
+  <div v-loading="loading">
+    <el-form>
+      <el-form-item label="实际起始时间">
+        <el-date-picker
+          v-model="time"
+          type="datetimerange"
+          value-format="yyyy-MM-dd HH:mm:ss"
+          range-separator="至"
+          start-placeholder="实际开始日期"
+          end-placeholder="实际结束日期"
+        >
+        </el-date-picker>
+      </el-form-item>
+    </el-form>
+    <div class="page">
+      <div class="content-detail">
+        <!-- 巡点检、保养设备 -->
+        <div class="maintain_equipment_info">
+          <HeaderTitle title="运行设备" size="16px"></HeaderTitle>
+          <div class="maintain_equipment_info_content">
+            <div
+              class="equipment_item"
+              v-for="item in infoData.planDeviceList"
+              :key="item.id"
+            >
+              <div class="equipment_info" v-if="item.substance">
+                <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 class="item_info">
+                  <span class="item_label">固资编码</span>
+                  <span class="item_value">{{ item.substance.fixCode }}</span>
+                </div>
+                <div class="item_info">
+                  <span class="item_label">编号</span>
+                  <span class="item_value">{{
+                    item.substance.extInfo.codeNumber
+                  }}</span>
+                </div>
+              </div>
+              <p>操作事项</p>
+              <div class="ruleMatters_box">
+                <el-table :data="item.workItems" border>
+                  <el-table-column label="序号" width="50">
+                    <template slot-scope="scope">
+                      <span>{{ scope.$index + 1 }}</span>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="事项" prop="name" width="100">
+                    <template slot-scope="scope">
+                      <div>
+                        <span>{{ scope.row.name }}</span>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="内容" prop="content" width="300">
+                    <template slot-scope="scope">
+                      <div>
+                        <span>{{ scope.row.content }}</span>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="操作指导" prop="operationGuide">
+                    <template slot-scope="scope">
+                      <div class="operationGuide_box">
+                        <div class="left_content">
+                          <template v-if="scope.row.operationGuide">
+                            <div
+                              v-for="(item, index) in scope.row.operationGuide
+                                .toolList"
+                              :key="item.id"
+                              >{{ index + 1 }}.{{ item.name }}</div
+                            >
+                          </template>
+                        </div>
+                        <div class="line"></div>
+                        <div class="right_content">
+                          <template v-if="scope.row.operationGuide">
+                            <div
+                              v-for="(item, index) in scope.row.operationGuide
+                                .procedureList"
+                              :key="item.id"
+                              >{{ index + 1 }}.{{ item.content }}</div
+                            >
+                          </template>
+                        </div>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="标准" prop="norm" width="100">
+                    <template slot-scope="scope">
+                      <div>
+                        <span>{{ scope.row.norm }}</span>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="状态" prop="status" width="150">
+                    <template slot-scope="scope">
+                      <template>
+                        <el-select
+                          v-model="scope.row.status"
+                          placeholder="请选择"
+                        >
+                          <el-option
+                            v-for="item in options"
+                            :label="item.label"
+                            :value="item.value"
+                            :key="item.value"
+                          >
+                          </el-option>
+                        </el-select>
+                      </template>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="结果" prop="result" width="250">
+                    <template slot-scope="scope">
+                      <el-input
+                        v-model="scope.row.result"
+                        placeholder="请输入内容"
+                      ></el-input>
+                    </template>
+                  </el-table-column>
+                </el-table>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="footer">
+      <el-button type="primary" @click="submit" :loading="butLoading"
+        >报 工</el-button
+      >
+    </div>
+  </div>
+</template>
+
+<script>
+  import { report } from '@/api/equipment/work.js';
+  import { getById } from '@/api/maintenance/patrol_maintenance';
+  export default {
+    props: {
+      // 计划id
+      planId: {
+        type: String,
+        required: true
+      },
+      // 计划转工单后的 工单id
+      workOrderId: {
+        type: String,
+        required: true
+      }
+    },
+    watch: {
+      // 监听planId变化
+      planId: {
+        handler() {
+          this.getInfo();
+        }
+      }
+    },
+    data() {
+      return {
+        fullscreen: false,
+        time: [],
+        options: [
+          {
+            label: '未定义',
+            value: 0
+          },
+          {
+            label: '正常',
+            value: 1
+          },
+          {
+            label: '缺陷',
+            value: -1
+          }
+        ],
+        visible: false,
+        infoData: {},
+        loading: false,
+        butLoading: false
+      };
+    },
+    mounted() {
+      // 获取数据
+      this.getInfo();
+    },
+    methods: {
+      async submit() {
+        console.log(this.time);
+        if (this.time.length > 0) {
+          this.butLoading = true;
+          this.infoData.acceptTime = this.time[0];
+          this.infoData.finishTime = this.time[1];
+          this.infoData.deviceList = this.infoData.planDeviceList;
+          console.log(this.infoData);
+          let deviceList = this.infoData.deviceList
+            .map((item) => {
+              return item.workItems;
+            })
+            .flat();
+          let boolen = deviceList.every((item) => item.status > -1);
+          this.infoData.isAbnormal = boolen ? 1 : 0;
+          report(this.infoData).then((res) => {
+            if (res.code == 0) {
+              this.$message.success('报工成功');
+              this.visible = false;
+              this.$emit('refresh');
+            }
+            this.butLoading = false;
+          });
+        } else {
+          this.$message.error('请选择实际起始时间');
+        }
+      },
+      // 表格数据
+      async getInfo() {
+        this.loading = true;
+        let res = await getById(this.planId);
+        console.log(res);
+        this.infoData = res.data;
+        this.infoData.workOrderId = this.workOrderId;
+        this.loading = false;
+      }
+    }
+  };
+</script>
+<style lang="scss" scoped>
+  .page {
+  }
+  .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: 10px;
+  }
+  .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 #157a2c;
+    padding-bottom: 8px;
+    display: flex;
+    justify-content: space-between;
+  }
+  .basic-details-title .border-span {
+    height: 18px;
+    font-size: 16px;
+    border-left: 4px solid #157a2c;
+    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;
+  }
+  .maintain_equipment_info_content {
+    padding: 0 15px;
+    .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;
+          }
+        }
+      }
+      .ruleMatters_box {
+        flex: 3;
+        height: 100%;
+        display: flex;
+        flex-direction: column;
+        .divider {
+          flex: 0 0 50px;
+          .title {
+            height: 35px;
+          }
+        }
+        .el-table {
+          overflow: auto;
+          .operationGuide_box {
+            width: 100%;
+            display: flex;
+            position: relative;
+            .left_content {
+              width: 30%;
+              padding: 10px;
+              margin-right: 10px;
+              overflow-y: auto;
+            }
+            .line {
+              position: absolute;
+              top: -10px;
+              left: 30%;
+              bottom: -10px;
+              height: 110%;
+              width: 1px;
+              background-color: #ededed;
+            }
+            .right_content {
+              flex: 1;
+              padding: 10px;
+              overflow-y: auto;
+            }
+          }
+        }
+      }
+    }
+  }
+  ::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;
+  }
+
+  .map {
+    display: inline-block;
+    position: absolute;
+    right: 4%;
+    top: 15%;
+    width: 380px;
+    height: 200px;
+    background-color: #b12492;
+  }
+  .mapTitle {
+    display: inline-block;
+    position: absolute;
+    transform: translate(-50%, -50%);
+    right: 11%;
+    top: 39%;
+  }
+  .equipment {
+    position: relative;
+    width: 100%;
+    min-height: 200px;
+    .equipment-icon {
+      text-align: center;
+      line-height: 30px;
+      width: 30px;
+      height: 30px;
+      border-radius: 15px;
+      border: 2px solid #000;
+    }
+    .equipment-step {
+      position: absolute;
+      left: 15px;
+      border-left: 2px solid #000;
+      width: 2px;
+      height: 85%;
+    }
+
+    .equipment-arrows {
+      position: absolute;
+      bottom: -8px;
+      left: 8px;
+      border: 8px solid rgb(255, 255, 255);
+      border-top-color: #000;
+      width: 0;
+      height: 0;
+    }
+    .equipment-title {
+      position: absolute;
+      top: 3%;
+      left: 3%;
+    }
+    .equipment-details {
+      position: absolute;
+      top: 3%;
+      left: 25%;
+      span {
+        margin-right: 70px;
+      }
+    }
+    .equipment-content {
+      display: flex;
+      .equipment-content-span1 {
+        width: 150px;
+        margin: 20px 70px 5px 47px;
+      }
+      .equipment-content-span2 {
+        width: 350px;
+        margin: 20px 70px 5px 120px;
+      }
+    }
+  }
+  .btnbox {
+    display: flex;
+    justify-content: center;
+  }
+  ::v-deep .el-button {
+    padding: 10px 20px;
+    margin-right: 10px;
+  }
+  .textbox {
+    margin-top: 10px;
+  }
+  .execute_info {
+    margin: 30px 0;
+    .execute_info_title {
+      border-bottom: 1px solid #157a2c;
+      padding-bottom: 3px;
+      margin-bottom: 20px;
+      display: flex;
+      justify-content: space-between;
+      > span:first-child {
+        line-height: 16px;
+        border-left: 6px solid #157a2c;
+        padding-left: 6px;
+      }
+    }
+    .execute_row {
+      padding: 0 30px;
+      .column {
+        display: flex;
+        font-size: 14px;
+        margin-bottom: 20px;
+        .label {
+          // width: 110px;
+          text-align: center;
+          font-weight: 700;
+        }
+      }
+    }
+  }
+
+  .footer {
+    display: flex;
+    align-items: center;
+    justify-content: flex-end;
+  }
+</style>

+ 0 - 1
src/views/produce/components/prenatalExamination/index.vue

@@ -156,7 +156,6 @@
         if (item.executeMethod == 1) {
           // 计划规则 巡点检
           this.$refs.planRulesDialogRef.open(item);
-
         } else if (item.executeMethod == 2) {
           this.$refs.releaseRulesDialogRef.open(
             item,