Browse Source

sop查看

wangyani 11 months ago
parent
commit
50a80cc539
4 changed files with 1469 additions and 195 deletions
  1. 4 4
      src/router/index.js
  2. 68 170
      src/views/mes/sop/sopm/NewSop.vue
  3. 27 21
      src/views/mes/sop/sopm/index.vue
  4. 1370 0
      src/views/mes/sop/sopm/sopmLook.vue

+ 4 - 4
src/router/index.js

@@ -128,10 +128,10 @@ export const dynamicRoutes = [
 
       },
       {
-        path: 'NewSopLook',
-        component: () => import('@/views/mes/sop/sopm/NewSop'),
-        name: 'NewSopEdit',
-        meta: { title: 'SOP管理-查看SOP', activeMenu: '/mes/sop/sopm/NewSop' },
+        path: 'sopmLook',
+        component: () => import('@/views/mes/sop/sopm/sopmLook'),
+        name: 'sopmLook',
+        meta: { title: 'SOP管理-查看SOP', activeMenu: '/mes/sop/sopm/sopmLook' },
 
       },
     ]

+ 68 - 170
src/views/mes/sop/sopm/NewSop.vue

@@ -12,6 +12,7 @@
         ></SopLeft>
       </keep-alive>
       <!-- 隔离点 style="position: relative;z-index:0"-->
+
       <IsolationLeftVue
         v-show="this.activeName == 'second'"
         :points="points"
@@ -540,7 +541,6 @@ export default {
       listCoLockerOption: null,//共锁人下拉数据
       OutSideUserTableData: [],//添加外部人员多个表格
       nextUserId: 0//新增外部人员表格序号自定义
-
     }
   },
   mounted() {
@@ -602,31 +602,19 @@ export default {
         selectIsSopById(sopId).then((response) => {
           console.log(response, '详细内容')
           this.form = response.data
-          console.log(response.data.ticketUserDTOList, 'response.data.ticketUserDTOList')
+          console.log(response.data.ticketUserDTOList,'response.data.ticketUserDTOList')
           if (response.data.ticketUserDTOList.length > 0) {
-            this.openStaffing = true
+            this.openStaffing = true;
           }
 
           const value = response.data.ticketUserDTOList //找到上锁人  这里一定要先筛选locker再去给表格筛选 否则表格筛选之后直接不会有上锁人数据了
             .filter(item => item.userType == '0')
-            .map(item => item.userName)
-          this.form.locker = value[0],//map返回的是数字 所以这样写
-            console.log(value, response.data.ticketUserDTOList, 'form.locker')
-          this.form.ticketUserDTOList = response.data.ticketUserDTOList.filter((item) => {
-            return item.userType == '1'
-          })//过滤上锁人
-
-          // this.tableData = response.data.pointDetailVOList.map((item)=>{
-          //   return {
-          //     pointName: item.pointName, // 显示的名称
-          //     pointId: item.pointId, // 对应的值
-          //     pointType: item.pointTypeName,
-          //     powerType: item.powerTypeName,
-          //     prePointId: item.prePointId
-          //   }
-          // })
-          // console.log(this.tableData, '编辑拿到的隔离点数据')
-
+            .map(item => item.userName);
+          this.form.locker=value[0],//map返回的是数字 所以这样写
+          console.log(value,response.data.ticketUserDTOList,'form.locker')
+          this.form.ticketUserDTOList=response.data.ticketUserDTOList.filter((item)=>{return item.userType=='1'}) ;//过滤上锁人
+          this.tableData = response.data.pointDetailVOList
+          console.log(this.tableData, '编辑拿到的隔离点数据')
           this.sopProps = [response.data]
 
           this.title = '修改隔离点信息'
@@ -655,11 +643,35 @@ export default {
       if (!Array.isArray(this.form.spoint)) {
         this.form.spoint = []
       }
+      console.log(this.form.spoint, 'spoint')
+
       // 如果没有选中点,逆向传递为空时,使用当前表格数据中的点
       if (this.form.spoint.length === 0 && Array.isArray(this.tableData)) {
         this.form.spoint = this.tableData.map((point) => point.pointId)
       }
 
+      const selectedpointIds = this.form.spoint.join(',')
+      const UserList=[...this.form.ticketUserDTOList,...this.newticketUserDTOList]
+      const pointsList=this.form.pointDetailVOList.map((item)=>{
+        return {
+          pointId:item.pointId,
+          prePointId:item.prePointId
+        }
+      })
+      console.log(this.form.pointsList)
+      const data = {
+        pointIds: selectedpointIds,
+        sopContent: this.form.sopContent,
+        sopCode: this.form.sopCode,
+        sopName: this.form.sopName,
+        sopType: this.form.sopType,
+        workareaId: this.emitworklineId,
+        ticketUserDTOList: UserList,
+        pointsList: pointsList
+        // workshopId: this.emitWorkShop.value
+      }
+      console.log(data, '新增sop参数')
+
       // 编辑模式
       if (this.$route.query.sopId !== 'null') {
         console.log(this.$route.query.sopId, 'sopIdaaa')
@@ -669,28 +681,9 @@ export default {
           this.$message.error('隔离点id不可为空!') // 使用消息提示
           return
         }
-        const selectedpointIds = this.form.spoint.join(',')
-        const UserList = [...this.form.ticketUserDTOList, ...this.newticketUserDTOList]
-        const pointsList = this.form.pointDetailVOList.map((item) => {
-          return {
-            pointId: item.pointId,
-            prePointId: item.prePointId
-          }
-        })
-        console.log(this.form.pointsList)
-        const data = {
-          pointIds: selectedpointIds,
-          sopContent: this.form.sopContent,
-          sopCode: this.form.sopCode,
-          sopName: this.form.sopName,
-          sopType: this.form.sopType,
-          workareaId: this.emitworklineId,
-          ticketUserDTOList: UserList,
-          pointsList: pointsList
-          // workshopId: this.emitWorkShop.value
-        }
+
         data.sopId = this.form.sopId
-        console.log(data, '编辑的参数')
+console.log(data,'编辑的参数')
         updateIsSop(data).then((res) => {
           console.log(res, '修改接口')
           if (res.code == 200) {
@@ -700,26 +693,6 @@ export default {
         })
       } else {
         // 新增模式
-        const selectedpointIds = this.form.spoint.join(',')
-        const UserList = [...this.form.ticketUserDTOList, ...this.newticketUserDTOList]
-        const pointsList = this.tableData.map((item) => {
-          return {
-            pointId: item.pointId,
-            prePointId: item.prePointId
-          }
-        })
-        console.log(this.form.pointsList)
-        const data = {
-          pointIds: selectedpointIds,
-          sopContent: this.form.sopContent,
-          sopCode: this.form.sopCode,
-          sopName: this.form.sopName,
-          sopType: this.form.sopType,
-          workareaId: this.emitworklineId,
-          ticketUserDTOList: UserList,
-          pointsList: pointsList
-          // workshopId: this.emitWorkShop.value
-        }
         console.log(data, '新增参数')
         addinsertIsSop(data).then((res) => {
           console.log(res, '新增接口')
@@ -798,33 +771,26 @@ export default {
 
     // 子组件选中的隔离点逆传递拿到的数据
     handleSelectPoint(points) {
-      console.log(points, '父组件接收逆向传递选中的隔离点');
-
-      // 1. 去除重复的点,使用 Set 确保每个 pointId 唯一
-      const uniquePoints = Array.from(
-        new Set(points.map(point => point.pointId))
-      ).map(id => points.find(point => point.pointId === id));
-
-      console.log(uniquePoints, '去重后的选中节点');
-
-      this.tableData = uniquePoints; // 子组件传递过来的选中节点(去重后)
-
+      // console.log(points, '父组件接收逆向传递选中的隔离点')
+      this.tableData = points //子组件传递过来的选中节点
       // 使用 Set 来存储传递过来的点值
-      const newValues = new Set(uniquePoints.map((point) => point.pointId));
+      const newValues = new Set(points.map((point) => point.pointId))
 
-      // 2. 删除取消选中的点
+      // 1. 删除取消选中的点
       const removedPoints = this.tableData
         .filter((item) => !newValues.has(item.pointId))
-        .map((item) => item.pointId); // 记录被删除的点
+        .map((item) => item.pointId) // 记录被删除的点
 
       this.tableData = this.tableData.filter((item) =>
         newValues.has(item.pointId)
-      );
-
-      // 3. 确保新增点不会重复
-      const existingValues = new Set(this.tableData.map((item) => item.pointId));
+      )
+      // console.log(this.tableData,'handleSelectPoint函数里的tableData')
+      // 2. 确保新增点不会重复
+      const existingValues = new Set(
+        this.tableData.map((item) => item.pointId)
+      )
 
-      uniquePoints.forEach((point) => {
+      points.forEach((point) => {
         // 如果当前传递的点不在已有的点集中,则添加
         if (!existingValues.has(point.pointId)) {
           this.tableData.push({
@@ -833,114 +799,46 @@ export default {
             pointType: point.pointType,
             powerType: point.powerType,
             prePointId: null
-          });
-
+          })
+          // console.log(this.tableData,'handleSelectPoint函数里的tableData2')
           this.prePointIdOptions.push({
             pointName: point.pointName, // 显示的名称
             pointId: point.pointId // 对应的值
-          });
-          this.initprePointIdOptions = [...this.prePointIdOptions];
-          console.log(this.prePointIdOptions, '前置节点设置下拉');
-          existingValues.add(point.pointId);
+          })
+          this.initprePointIdOptions = [...this.prePointIdOptions]
+          console.log(this.prePointIdOptions, '前置节点设置下拉')
+          existingValues.add(point.pointId)
         }
-      });
+      })
 
-      // 4. 处理被删除的点,如果这些点作为父节点绑定,则将对应的 prePointId 设置为 null
+      // 3. 处理被删除的点,如果这些点作为父节点绑定,则将对应的 prePointId 设置为 null
       this.tableData.forEach((item) => {
         if (removedPoints.includes(item.prePointId)) {
-          item.prePointId = null;
+          item.prePointId = null
         }
-      });
-
-      // 5. 从下拉选项中移除被删除的点
+      })
+      // console.log(this.tableData,'handleSelectPoint函数里的tableData3')
+      // 4. 从下拉选项中移除被删除的点
       this.prePointIdOptions = this.prePointIdOptions.filter(
         (option) => !removedPoints.includes(option.pointId)
-      );
-      this.initprePointIdOptions = [...this.prePointIdOptions];
+      )
+      this.initprePointIdOptions = [...this.prePointIdOptions]
 
-      // 6. 确保下拉选项中仍然保留所有未被删除的点
-      const allPoints = uniquePoints.map((point) => ({
+      // 5. 确保下拉选项中仍然保留所有未被删除的点
+      const allPoints = points.map((point) => ({
         pointName: point.pointName,
         pointId: point.pointId
-      }));
+      }))
 
       this.prePointIdOptions = allPoints.filter(
         (option) => !removedPoints.includes(option.pointId)
-      );
-      this.initprePointIdOptions = [...this.prePointIdOptions];
+      )
+      this.initprePointIdOptions = [...this.prePointIdOptions]
 
       // 更新 form.spoint 为最新选中的隔离点数组
-      this.form.spoint = uniquePoints.map((point) => point.pointId);
-    },
+      this.form.spoint = points.map((point) => point.pointId)
 
-    // handleSelectPoint(points) {
-    //   console.log(points, '父组件接收逆向传递选中的隔离点')
-    //   this.tableData = points; //子组件传递过来的选中节点
-    //   // 使用 Set 来存储传递过来的点值
-    //   const newValues = new Set(points.map((point) => point.pointId))
-    //
-    //   // 1. 删除取消选中的点
-    //   const removedPoints = this.tableData
-    //     .filter((item) => !newValues.has(item.pointId))
-    //     .map((item) => item.pointId) // 记录被删除的点
-    //
-    //   this.tableData = this.tableData.filter((item) =>
-    //     newValues.has(item.pointId)
-    //   )
-    //   // 2. 确保新增点不会重复
-    //   const existingValues = new Set(
-    //     this.tableData.map((item) => item.pointId)
-    //   )
-    //
-    //   points.forEach((point) => {
-    //     // 如果当前传递的点不在已有的点集中,则添加
-    //     if (!existingValues.has(point.pointId)) {
-    //       this.tableData.push({
-    //         pointName: point.pointName, // 显示的名称
-    //         pointId: point.pointId, // 对应的值
-    //         pointType: point.pointType,
-    //         powerType: point.powerType,
-    //         prePointId: null
-    //       })
-    //
-    //       this.prePointIdOptions.push({
-    //         pointName: point.pointName, // 显示的名称
-    //         pointId: point.pointId // 对应的值
-    //       })
-    //       this.initprePointIdOptions = [...this.prePointIdOptions]
-    //       console.log(this.prePointIdOptions, '前置节点设置下拉')
-    //       existingValues.add(point.pointId)
-    //     }
-    //   })
-    //
-    //   // 3. 处理被删除的点,如果这些点作为父节点绑定,则将对应的 prePointId 设置为 null
-    //   this.tableData.forEach((item) => {
-    //     if (removedPoints.includes(item.prePointId)) {
-    //       item.prePointId = null
-    //     }
-    //   })
-    //
-    //   // 4. 从下拉选项中移除被删除的点
-    //   this.prePointIdOptions = this.prePointIdOptions.filter(
-    //     (option) => !removedPoints.includes(option.pointId)
-    //   )
-    //   this.initprePointIdOptions = [...this.prePointIdOptions]
-    //
-    //   // 5. 确保下拉选项中仍然保留所有未被删除的点
-    //   const allPoints = points.map((point) => ({
-    //     pointName: point.pointName,
-    //     pointId: point.pointId
-    //   }))
-    //
-    //   this.prePointIdOptions = allPoints.filter(
-    //     (option) => !removedPoints.includes(option.pointId)
-    //   )
-    //   this.initprePointIdOptions = [...this.prePointIdOptions]
-    //
-    //   // 更新 form.spoint 为最新选中的隔离点数组
-    //   this.form.spoint = points.map((point) => point.pointId)
-    //
-    // },
+    },
 
     // 车间逆向传递拿到的隔离点数据产线
     handleProductLineSelected(selectedOption) {

+ 27 - 21
src/views/mes/sop/sopm/index.vue

@@ -34,22 +34,25 @@
           />
         </el-select>
       </el-form-item>
-<!--      <el-form-item label="车间名称" prop="workshopId">-->
-<!--        <el-select-->
-<!--          v-model="queryParams.workshopId"-->
-<!--          placeholder="请选择车间名称"-->
-<!--          @change="workShopChange"-->
-<!--        >-->
-<!--          <el-option-->
-<!--            v-for="item in this.workshopList"-->
-<!--            :key="item.key"-->
-<!--            :label="item.label"-->
-<!--            :value="item.value"-->
-<!--          />-->
-<!--        </el-select>-->
-<!--      </el-form-item>-->
+      <!--      <el-form-item label="车间名称" prop="workshopId">-->
+      <!--        <el-select-->
+      <!--          v-model="queryParams.workshopId"-->
+      <!--          placeholder="请选择车间名称"-->
+      <!--          @change="workShopChange"-->
+      <!--        >-->
+      <!--          <el-option-->
+      <!--            v-for="item in this.workshopList"-->
+      <!--            :key="item.key"-->
+      <!--            :label="item.label"-->
+      <!--            :value="item.value"-->
+      <!--          />-->
+      <!--        </el-select>-->
+      <!--      </el-form-item>-->
       <el-form-item label="工作区域" prop="workareaId">
-        <el-select v-model="queryParams.workareaId" placeholder="请选择工作区域">
+        <el-select
+          v-model="queryParams.workareaId"
+          placeholder="请选择工作区域"
+        >
           <el-option
             v-for="dict in this.workareaList"
             :key="dict.value"
@@ -157,7 +160,6 @@
         v-show="this.noShow"
       /> -->
       <el-table-column label="SOP编号" align="center" prop="sopCode">
-
       </el-table-column>
       <el-table-column label="SOP名称" align="center" prop="sopName" />
       <el-table-column label="状态" align="center" prop="sopStatus">
@@ -168,8 +170,8 @@
           />
         </template>
       </el-table-column>
-<!--      <el-table-column label="车间名称" align="center" prop="workshopName">-->
-<!--      </el-table-column>-->
+      <!--      <el-table-column label="车间名称" align="center" prop="workshopName">-->
+      <!--      </el-table-column>-->
 
       <el-table-column label="SOP类型" align="center" prop="sopType">
         <template slot-scope="scope">
@@ -327,7 +329,11 @@ export default {
   },
 
   methods: {
-    ...mapActions("sopSelectPoints", ["setSopEdit", "setSopLook","setMapData"]),
+    ...mapActions("sopSelectPoints", [
+      "setSopEdit",
+      "setSopLook",
+      "setMapData",
+    ]),
     // 格式化日期查询数据
     formatDate(date) {
       if (date && date instanceof Date && !isNaN(date)) {
@@ -436,7 +442,7 @@ export default {
     /** 新增按钮操作a */
     handleAdd() {
       this.reset();
-      this.setMapData(null)
+      this.setMapData(null);
       this.setSopLook(false);
       this.$router.push("/mes/sop/sopm/NewSop?sopId=null");
       this.title = "添加隔离点";
@@ -453,7 +459,7 @@ export default {
     handleLook(row) {
       // 设置为true表示作业票里查看不可以点击隔离点
       this.setSopLook(true);
-      this.$router.push(`/mes/sop/sopm/NewSopLook?sopId=${row.sopId}`);
+      this.$router.push(`/mes/sop/sopm/sopmLook?sopId=${row.sopId}`);
     },
     /** 删除按钮操作 */
     handleDelete(row) {

+ 1370 - 0
src/views/mes/sop/sopm/sopmLook.vue

@@ -0,0 +1,1370 @@
+<template>
+  <div class="newOperations">
+    <!--    newOperations盒子开始-->
+    <div class="left">
+      <!-- 车间 -->
+      <keep-alive>
+        <SopLeft
+          v-show="this.activeName == 'first' || this.activeName == 'third'"
+          @product-line-selected="handleProductLineSelected"
+          @work-shop-selected="handleWorkshopSelected"
+          :sopProps="sopProps"
+        ></SopLeft>
+      </keep-alive>
+      <!-- 隔离点 style="position: relative;z-index:0"-->
+      <!-- <IsolationLeftVue
+        v-show="this.activeName == 'second'"
+        :points="points"
+        @selection-changed="handleSelectPoint"
+      ></IsolationLeftVue> -->
+      <IsolationLeftVue
+        :points="points"
+        @selection-changed="handleSelectPoint"
+      ></IsolationLeftVue>
+    </div>
+    <!-- 作业区域  -->
+    <div class="lefttree">
+      <el-card class="lefttree-card">
+        <b class="title">作业区域</b>
+        <div class="head-container">
+          <el-input
+            v-model="form.workline"
+            placeholder="请输入作业区域"
+            clearable
+            size="small"
+            prefix-icon="el-icon-search"
+            style="margin-bottom: 20px"
+            @input="handleInputChange"
+          />
+        </div>
+        <div class="head-container">
+          <el-tree
+            :data="deptOptions"
+            :props="defaultProps"
+            :expand-on-click-node="false"
+            :filter-node-method="filterNode"
+            ref="tree"
+            node-key="id"
+            default-expand-all
+            @node-click="handleNodeClick"
+            highlight-current
+          />
+        </div>
+      </el-card>
+    </div>
+    <div class="right">
+      <div class="right_top">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix">
+            <span style="font-size: 18px">{{ this.getSopTitle }}</span>
+            <span
+              style="
+                float: right;
+                padding: 1px 15px;
+                font-size: 22px;
+                cursor: pointer;
+              "
+              type="text"
+              @click="goBack"
+              >×</span
+            >
+            <el-tooltip
+              content="开启人员配置"
+              placement="top"
+              style="float: right; margin-top: 3px; display: none"
+            >
+              <el-switch
+                v-model="openStaffing"
+                active-color="#13ce66"
+                active-text=""
+                @change="handleOpenStaffing(openStaffing)"
+              >
+              </el-switch>
+            </el-tooltip>
+          </div>
+          <div class="text item">
+            <!-- 新增作业票信息-->
+            <b class="title">基本信息</b>
+            <el-form ref="form" :model="form" label-width="70px">
+              <el-form-item label="SOP名称" prop="sopName">
+                <el-input
+                  :disabled="this.getSopLook"
+                  v-model="form.sopName"
+                  placeholder="请输入SOP名称"
+                  style="width: 100%"
+                />
+              </el-form-item>
+              <el-row>
+                <el-col :span="16">
+                  <el-form-item label="SOP编号" prop="sopCode">
+                    <el-input
+                      :disabled="this.getSopLook"
+                      v-model="form.sopCode"
+                      placeholder="请输入SOP编号"
+                      style="width: 100%"
+                    />
+                  </el-form-item>
+                </el-col>
+                <el-col :span="8">
+                  <el-form-item label-width="80">
+                    <el-switch
+                      :disabled="this.getSopLook"
+                      v-model="autoGenFlag"
+                      active-color="#13ce66"
+                      active-text="自动生成"
+                      @change="handleAutoGenChange(autoGenFlag)"
+                    >
+                    </el-switch>
+                  </el-form-item>
+                </el-col>
+              </el-row>
+              <el-form-item label="SOP类型" prop="sopType">
+                <el-select
+                  :disabled="this.getSopLook"
+                  v-model="form.sopType"
+                  placeholder="请选择SOP类型"
+                  clearable
+                  style="width: 100%"
+                >
+                  <el-option
+                    v-for="dict in dict.type.sop_type"
+                    :key="dict.value"
+                    :label="dict.label"
+                    :value="dict.value"
+                  />
+                </el-select>
+              </el-form-item>
+              <el-form-item label="SOP内容" prop="sopContent">
+                <el-input
+                  :disabled="this.getSopLook"
+                  type="textarea"
+                  v-model="form.sopContent"
+                  :rows="3"
+                ></el-input>
+              </el-form-item>
+            </el-form>
+            <!-- 隔离点信息-->
+            <b class="title">隔离点信息</b>
+            <el-form ref="form" :model="form" label-width="90px">
+              <!--                  <el-form-item label="车间名称" prop="workshopName">-->
+              <!--                    <el-input-->
+              <!--                      v-model="form.workshopName"-->
+              <!--                      style="width: 100%"-->
+              <!--                      disabled-->
+              <!--                    />-->
+              <!--                  </el-form-item>-->
+              <!-- <el-form-item label="工作区域" prop="workline">
+                <el-input
+                  v-model="form.workline"
+                  style="width: 100%"
+                  disabled
+                />
+              </el-form-item> -->
+
+              <div class="text item">
+                <!-- <p style="color: #606266; font-weight: 600; font-size: 14px">
+                  已选隔离点
+                </p> -->
+
+                <el-table
+                  :data="tableData"
+                  stripe
+                  height="260"
+                  style="width: 100%"
+                  id="table-key"
+                  row-key="id"
+                >
+                  <el-table-column prop="pointName" label="隔离点" width="80">
+                    <template slot-scope="scope">
+                      <span style="color: #2a87ff">{{
+                        scope.row.pointName
+                      }}</span>
+                    </template>
+                  </el-table-column>
+                  <el-table-column prop="pointType" label="隔离点类型">
+                    <template slot-scope="scope">
+                      {{ scope.row.pointType }}
+                    </template>
+                  </el-table-column>
+                  <el-table-column
+                    prop="powerType"
+                    label="危险能量类型"
+                    width="100"
+                  >
+                    <template slot-scope="scope">
+                      {{ scope.row.powerType }}
+                    </template>
+                  </el-table-column>
+                  <el-table-column
+                    prop="prePointId"
+                    label="前置节点"
+                    width="100"
+                  >
+                    <template slot-scope="scope">
+                      <el-select
+                        size="mini"
+                        v-model="scope.row.prePointId"
+                        @change="prePointIdChange(scope.row)"
+                        @visible-change="onDropdownVisibleChange(scope.row)"
+                        disabled
+                      >
+                        <el-option
+                          v-for="item in prePointIdOptions"
+                          :key="item.pointId"
+                          :label="item.pointName"
+                          :value="item.pointId"
+                        >
+                        </el-option>
+                      </el-select>
+                    </template>
+                  </el-table-column>
+                </el-table>
+              </div>
+            </el-form>
+            <!--人员选择-->
+            <b class="title" v-if="openStaffing">人员信息</b>
+            <el-form
+              ref="form"
+              :model="form"
+              label-width="70px"
+              v-if="openStaffing"
+            >
+              <el-form-item label="上锁人" prop="locker">
+                <el-select
+                  :disabled="this.getSopLook"
+                  v-model="form.locker"
+                  placeholder="上锁人"
+                  clearable
+                  style="width: 100%"
+                  @change="handlelockerChage"
+                >
+                  <el-option
+                    v-for="dict in this.listLockerOption"
+                    :key="dict.value"
+                    :label="dict.label"
+                    :value="dict.value"
+                  />
+                </el-select>
+              </el-form-item>
+              <el-form-item label="共锁人" prop="coLocker">
+                <el-button
+                  type="primary"
+                  @click="addInside"
+                  class="gsr"
+                  size="mini"
+                  disabled
+                  >添加内部人员
+                </el-button>
+                <el-button
+                  type="primary"
+                  @click="addOutside"
+                  size="mini"
+                  disabled
+                  >添加外部人员
+                </el-button>
+              </el-form-item>
+              <div class="text item">
+                <el-table
+                  :data="sortedTicketUserDTOList"
+                  stripe
+                  height="300"
+                  style="width: 100%"
+                >
+                  <el-table-column prop="userId" label="序号" width="50">
+                  </el-table-column>
+                  <el-table-column prop="userName" label="共锁人" width="120">
+                    <template slot-scope="scope">
+                      <span style="color: #2a87ff">{{
+                        scope.row.userName
+                      }}</span>
+                    </template>
+                  </el-table-column>
+                  <el-table-column prop="userRole" label="共锁人来源">
+                    <template slot-scope="scope">
+                      <span>{{
+                        scope.row.userRole == "0" ? "内部" : "外部"
+                      }}</span>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="" width="80">
+                    <template slot-scope="scope">
+                      <el-button
+                        @click.native.prevent="
+                          deleteRow(scope.$index, sortedTicketUserDTOList)
+                        "
+                        type="text"
+                        size="small"
+                        disabled
+                      >
+                        移除
+                      </el-button>
+                    </template>
+                  </el-table-column>
+                </el-table>
+              </div>
+            </el-form>
+          </div>
+        </el-card>
+      </div>
+    </div>
+    <!--    newSop盒子结束-->
+    <!-- 添加或修改设备维修单对话框 -->
+    <el-dialog
+      :visible.sync="open"
+      width="450px"
+      append-to-body
+      style="margin-top: 13%"
+    >
+      <div slot="title" class="dialog-title">
+        <i></i>
+        <span class="title">{{ title }}</span>
+      </div>
+      <el-form ref="dialogForm" :model="dialogForm" label-width="70px">
+        <el-form-item label="选择人员" prop="nickName" v-if="insideMumber">
+          <el-select
+            v-model="dialogForm.nickName"
+            placeholder="请选择人员"
+            clearable
+            style="width: 100%"
+            multiple
+            @change="changeInsideUser"
+          >
+            <el-option
+              v-for="dict in this.listCoLockerOption"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="人员ID" prop="username" v-if="outsideMumber">
+          <el-row>
+            <el-col :span="16">
+              <el-input
+                v-model="dialogForm.username"
+                placeholder="请输入人员ID"
+                clearable
+                style="width: 80%"
+                @change="outSideUserInput"
+              />
+            </el-col>
+            <el-col :span="4">
+              <el-button type="primary" @click="insertOutSideTable"
+                >添加</el-button
+              >
+            </el-col>
+          </el-row>
+        </el-form-item>
+        <el-row>
+          <el-table
+            :data="OutSideUserTableData"
+            stripe
+            height="200"
+            v-if="outsideMumber"
+          >
+            <el-table-column prop="userId" label="序号"> </el-table-column>
+            <el-table-column prop="userName" label="人员ID">
+              <template slot-scope="scope">
+                <span style="color: #2a87ff">{{ scope.row.userName }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="操作" width="80">
+              <template slot-scope="scope">
+                <el-button
+                  @click.native.prevent="
+                    deleteRow(scope.$index, OutSideUserTableData)
+                  "
+                  type="text"
+                  size="small"
+                >
+                  移除
+                </el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-row>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <!--  内部人员确认-->
+        <el-button type="primary" @click="cancel" v-if="insideMumber"
+          >确认</el-button
+        >
+        <!--        外部人员确认-->
+        <el-button
+          type="primary"
+          @click="outSideDialogConfirm"
+          v-if="outsideMumber"
+          >确认</el-button
+        >
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+
+<script>
+import IsolationLeftVue from "@/components/separationPoint/index.vue";
+import SopLeft from "@/components/separationPoint/workshop.vue";
+import { genCode } from "@/api/system/autocode/rule";
+import {
+  addinsertIsSop,
+  updateIsSop,
+  selectIsSopById,
+  SopUser,
+} from "@/api/mes/sop/sopindex";
+import { mapActions, mapGetters } from "vuex";
+import { listWorkarea } from "@/api/mes/wa/workarea";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+import Treeselect from "@riophae/vue-treeselect";
+
+export default {
+  name: "addView",
+  dicts: ["power_type", "point_type", "sop_type", "job_user_role"],
+  props: {
+    sopProps: {
+      type: Array,
+      default: () => [],
+    },
+    jobProps: {
+      type: Array,
+      default: () => [],
+    },
+  },
+  components: {
+    SopLeft,
+    IsolationLeftVue,
+    Treeselect,
+  },
+
+  data() {
+    return {
+      //自动生成编码
+      autoGenFlag: false,
+      activeName: "second",
+      form: {
+        sopName: "",
+        sopCode: "",
+        SOPType: "",
+        workshopName: "", //车间名称
+        workline: "", //区域
+        workareaName: "",
+        spoint: [], //已选隔离点
+        prePointId: [], //已选隔离点的前置节点Id
+        locker: "", //上锁人
+        coLocker: "", //共锁人
+        pointDetailVOList: [], //隔离点数据
+
+        ticketUserDTOList: [
+          // {
+          //   userId: '',
+          //   userName: '',
+          //   userRole: '',//作业票角色 暂时不传递 内部人还是外部人
+          //   userType: ''//用户类型 上锁人或共锁人
+          // }
+        ], //所选择的用户
+      },
+      // 部门树选项
+      deptOptions: undefined,
+      defaultProps: {
+        children: "children",
+        label: "label",
+      },
+      pickerOptions: {
+        shortcuts: [
+          {
+            text: "今天",
+            onClick(picker) {
+              picker.$emit("pick", new Date());
+            },
+          },
+          {
+            text: "昨天",
+            onClick(picker) {
+              const date = new Date();
+              date.setTime(date.getTime() - 3600 * 1000 * 24);
+              picker.$emit("pick", date);
+            },
+          },
+          {
+            text: "一周前",
+            onClick(picker) {
+              const date = new Date();
+              date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
+              picker.$emit("pick", date);
+            },
+          },
+        ],
+      },
+      // 右侧底部已选隔离点
+      tableData: null,
+      points: null, //车间逆向传递拿到的隔离点数据
+      emitWorkShop: null, //车间逆向传递拿到车间相关数据
+      emitworklineId: null, //生产线逆向传递拿到数据
+      sopProps: [], //正传递
+      worklineMap: "",
+      prePointIdOptions: [], //前置节点的下拉选项
+      initprePointIdOptions: [], //前置节点初始化数据选项
+      prePointId: null, //回显选中的前置节点id
+      relations: [], //维护父子关系的前置节点
+      openStaffing: null,
+      newticketUserDTOList: [], //为了上锁人单独传递数据
+      // 弹框中显示的form表单内容
+      insideMumber: false,
+      outsideMumber: false,
+      // 是否显示弹出层
+      open: false,
+      // 弹出层标题
+      title: "",
+      dialogForm: {
+        nickName: "",
+        username: "",
+      },
+      listLockerOption: null, //上锁人下拉数据
+      listCoLockerOption: null, //共锁人下拉数据
+      OutSideUserTableData: [], //添加外部人员多个表格
+      nextUserId: 0, //新增外部人员表格序号自定义
+    };
+  },
+
+  mounted() {
+    this.getTreeselect(); //获取工作区域下拉
+
+    this.handleOpenStaffing();
+    if (this.$route.query.sopId !== "null") {
+      // console.log(this.$route.query.sopId, "接受路由参数");
+      this.getSopInfo();
+
+      if (this.getSopLook) {
+        this.setSopTitle("查看SOP");
+      } else {
+        this.setSopTitle("编辑SOP");
+      }
+    } else {
+      this.setSelectSopPoints([]);
+      this.setPointTableData([]);
+      this.setSopTitle("新建SOP");
+    }
+  },
+
+  computed: {
+    ...mapGetters("sopSelectPoints", [
+      "getSopTitle",
+      "getSopLook",
+      "getMapData",
+    ]),
+    // 排序 ticketUserDTOList,将 userRole 为 0 的选项放在前面
+    sortedTicketUserDTOList() {
+      return this.form.ticketUserDTOList.sort(
+        (a, b) => Number(a.userRole) - Number(b.userRole)
+      );
+    },
+  },
+
+  methods: {
+    ...mapActions("sopSelectPoints", [
+      "setSelectSopPoints",
+      "setPointTableData",
+      "setSopEdit",
+      "setSopTitle",
+    ]),
+    // handleClick(tab, event) {
+    //   // console.log(tab, event);
+    // },
+    // preStep(val) {
+    //   this.activeName = val;
+
+    //   console.log(this.form, "sopform");
+    // },
+
+    // nextStep(val) {
+    //   this.activeName = val;
+    //   // console.log("我点击了下一步");
+    // },
+    /** 查询工作区域下拉树结构 */
+    getTreeselect() {
+      const data = {
+        current: 1,
+        size: -1,
+      };
+      listWorkarea(data).then((response) => {
+        // console.log(response.data.records, '工作区域下拉树形结构');
+        // 转换为树形结构
+        this.deptOptions = this.transformToTree(response.data.records);
+        // console.log(this.deptOptions, 'deptOptions')
+        // 使用递归函数查找匹配的节点
+        console.log(this.workareaName, "name");
+        const selectedTreeNode = this.findNodeById(
+          this.deptOptions,
+          this.workareaName
+        );
+        // 调用 handleNodeClick 方法
+        if (selectedTreeNode) {
+          this.handleNodeClick(selectedTreeNode);
+        } else {
+          console.log("未找到匹配的节点");
+        }
+      });
+    },
+    // 深层次遍历
+    findNodeById(nodes, targetId) {
+      for (let i = 0; i < nodes.length; i++) {
+        const node = nodes[i];
+        if (node.id === targetId) {
+          return node;
+        }
+        if (node.children && node.children.length > 0) {
+          const foundNode = this.findNodeById(node.children, targetId);
+          if (foundNode) {
+            return foundNode;
+          }
+        }
+      }
+      return null;
+    },
+    /** 转换数据为树形结构 */
+    transformToTree(records) {
+      const recordMap = {}; // 创建一个 Map 以存储所有记录
+      const tree = []; // 最终返回的树形结构
+
+      // 初始化所有记录到 Map
+      records.forEach((record) => {
+        recordMap[record.workareaId] = {
+          id: record.workareaId,
+          label: record.workareaName,
+          map: record.map,
+          mapImg: record.mapImg,
+          children: [],
+        };
+      });
+
+      // 遍历记录并构建树
+      records.forEach((record) => {
+        const parentId = record.parentId;
+
+        if (parentId === "0") {
+          // 如果是顶层节点,直接添加到树中
+          tree.push(recordMap[record.workareaId]);
+        } else if (recordMap[parentId]) {
+          // 如果有父节点,则将当前节点加入父节点的 children 中
+          recordMap[parentId].children.push(recordMap[record.workareaId]);
+        }
+      });
+
+      return tree;
+    },
+
+    // 树节点筛选逻辑
+    filterNode(value, data) {
+      if (!value) return true; // 如果没有输入值,显示所有节点
+      return data.label.indexOf(value) !== -1; // 判断节点 label 是否包含输入值
+    },
+    // 监听输入框变化
+    handleInputChange() {
+      this.$refs.tree.filter(this.workareaName); // 调用树的 filter 方法
+    },
+    // 节点单击事件
+    handleNodeClick(data) {
+      console.log(data, "单节点点击");
+      this.treeSelectMap = data;
+      if (
+        this.$route.query.sopId === "null" ||
+        this.$route.query.ticketId === "null"
+      ) {
+        this.setMapData(data.map);
+        console.log("设置了地图数据");
+      }
+      // 传递车间地图
+      this.imgsrc = data.mapImg;
+      this.workareaName = data.label;
+      this.handleInputChange();
+    },
+    // 详情数据
+    getSopInfo() {
+      const sopId = this.$route.query.sopId;
+      console.log(this.$route.query.sopId, "接受路由参数");
+
+      if (sopId !== null) {
+        selectIsSopById(sopId).then((response) => {
+          console.log(response, "详细内容");
+          this.form = response.data;
+          this.workareaName = response.data.workline;
+
+          console.log(
+            response.data,
+            response.data.ticketUserDTOList,
+            "response.data.ticketUserDTOList"
+          );
+          if (response.data.ticketUserDTOList.length > 0) {
+            this.openStaffing = true;
+          }
+
+          const value = response.data.ticketUserDTOList //找到上锁人  这里一定要先筛选locker再去给表格筛选 否则表格筛选之后直接不会有上锁人数据了
+            .filter((item) => item.userType == "0")
+            .map((item) => item.userName);
+          (this.form.locker = value[0]), //map返回的是数字 所以这样写
+            console.log(value, response.data.ticketUserDTOList, "form.locker");
+          this.form.ticketUserDTOList = response.data.ticketUserDTOList.filter(
+            (item) => {
+              return item.userType == "1";
+            }
+          ); //过滤上锁人
+
+          // this.tableData = response.data.pointDetailVOList.map((item)=>{
+          //   return {
+          //     pointName: item.pointName, // 显示的名称
+          //     pointId: item.pointId, // 对应的值
+          //     pointType: item.pointTypeName,
+          //     powerType: item.powerTypeName,
+          //     prePointId: item.prePointId
+          //   }
+          // })
+          // console.log(this.tableData, '编辑拿到的隔离点数据')
+
+          this.sopProps = [response.data];
+
+          this.title = "修改隔离点信息";
+        });
+      } else {
+        this.title = "新增隔离点信息";
+        this.setSopEdit(true);
+        this.setSelectSopPoints([]);
+        this.setPointTableData([]);
+        this.tableData = null;
+        this.form = {
+          spoint: [],
+          sopContent: "",
+          sopCode: "",
+          sopName: "",
+          sopType: "",
+          workareaId: "",
+          workshopId: "",
+        };
+        this.autoGenFlag = false;
+      }
+    },
+    submit() {
+      console.log("我点击了确认");
+      // 确保 this.form.spoint 是一个数组,如果为空则默认空数组
+      if (!Array.isArray(this.form.spoint)) {
+        this.form.spoint = [];
+      }
+      // 如果没有选中点,逆向传递为空时,使用当前表格数据中的点
+      if (this.form.spoint.length === 0 && Array.isArray(this.tableData)) {
+        this.form.spoint = this.tableData.map((point) => point.pointId);
+      }
+
+      // 编辑模式
+      if (this.$route.query.sopId !== "null") {
+        console.log(this.$route.query.sopId, "sopIdaaa");
+        // 确保 sopId 存在
+        if (!this.form.sopId) {
+          console.error("隔离点id不可为空!");
+          this.$message.error("隔离点id不可为空!"); // 使用消息提示
+          return;
+        }
+        const selectedpointIds = this.form.spoint.join(",");
+        const UserList = [
+          ...this.form.ticketUserDTOList,
+          ...this.newticketUserDTOList,
+        ];
+        const pointsList = this.form.pointDetailVOList.map((item) => {
+          return {
+            pointId: item.pointId,
+            prePointId: item.prePointId,
+          };
+        });
+        console.log(this.form.pointsList);
+        const data = {
+          pointIds: selectedpointIds,
+          sopContent: this.form.sopContent,
+          sopCode: this.form.sopCode,
+          sopName: this.form.sopName,
+          sopType: this.form.sopType,
+          workareaId: this.emitworklineId,
+          ticketUserDTOList: UserList,
+          pointsList: pointsList,
+          // workshopId: this.emitWorkShop.value
+        };
+        data.sopId = this.form.sopId;
+        console.log(data, "编辑的参数");
+        updateIsSop(data).then((res) => {
+          console.log(res, "修改接口");
+          if (res.code == 200) {
+            this.$router.push("/sop/sopm");
+            this.$message.success("SOP修改成功");
+          }
+        });
+      } else {
+        // 新增模式
+        const selectedpointIds = this.form.spoint.join(",");
+        const UserList = [
+          ...this.form.ticketUserDTOList,
+          ...this.newticketUserDTOList,
+        ];
+        const pointsList = this.tableData.map((item) => {
+          return {
+            pointId: item.pointId,
+            prePointId: item.prePointId,
+          };
+        });
+        console.log(this.form.pointsList);
+        const data = {
+          pointIds: selectedpointIds,
+          sopContent: this.form.sopContent,
+          sopCode: this.form.sopCode,
+          sopName: this.form.sopName,
+          sopType: this.form.sopType,
+          workareaId: this.emitworklineId,
+          ticketUserDTOList: UserList,
+          pointsList: pointsList,
+          // workshopId: this.emitWorkShop.value
+        };
+        console.log(data, "新增参数");
+        addinsertIsSop(data).then((res) => {
+          console.log(res, "新增接口");
+          if (res.code == 200) {
+            this.$router.push("/sop/sopm");
+            this.$message.success("SOP新建成功");
+          }
+        });
+      }
+    },
+
+    // 选中隔离点 前置节点的change函数
+    onDropdownVisibleChange(row) {
+      console.log(row, "我执行这里拉");
+
+      // 当前节点 ID
+      const currentPointId = row.pointId;
+
+      // 获取当前行的 prePointId
+      const currentPrePointId = row.prePointId;
+
+      // 已经被选为前置节点的 ID 集合
+      const selectedPrePointIds = new Set(
+        this.tableData
+          .filter((item) => item.prePointId !== null)
+          .map((item) => item.prePointId)
+      );
+
+      // console.log(selectedPrePointIds, 'selectedPrePointIds')
+      // 构建 form.prePointId 数组对象
+      this.form.prePointId = this.tableData.map((item) => ({
+        pointId: item.pointId,
+        prePointId: item.prePointId || null,
+      }));
+      // 每次都从原始数据开始过滤
+      let filteredOptions = [...this.initprePointIdOptions];
+
+      // 过滤规则:
+      // 1. 排除自身
+      // 2. 排除已经被选为前置节点的隔离点
+      // 3. 排除所有已经选为前置节点的节点及其前置节点
+      const allExcludedPoints = new Set([currentPointId]);
+      this.getAllExcludedPoints(currentPointId, allExcludedPoints);
+
+      filteredOptions = filteredOptions.filter((option) => {
+        return !allExcludedPoints.has(option.pointId);
+      });
+
+      this.prePointIdOptions = filteredOptions;
+
+      console.log("过滤后的前置节点选项", this.prePointIdOptions);
+    },
+
+    // 递归获取所有需要排除的节点
+    getAllExcludedPoints(pointId, excludedPoints) {
+      const relatedRows = this.tableData.filter(
+        (item) => item.prePointId === pointId
+      );
+      for (const row of relatedRows) {
+        excludedPoints.add(row.pointId);
+        this.getAllExcludedPoints(row.pointId, excludedPoints);
+      }
+    },
+
+    // 前置节点改变时的处理函数
+    prePointIdChange(row) {
+      console.log(row, "前置节点改变");
+
+      // 更新 tableData 中对应行的 prePointId
+      const index = this.tableData.findIndex(
+        (item) => item.pointId === row.pointId
+      );
+      if (index !== -1) {
+        this.$set(this.tableData, index, row);
+      }
+
+      // 重新调用 onDropdownVisibleChange 确保其他节点的选项更新
+      this.onDropdownVisibleChange(row);
+    },
+
+    // 子组件选中的隔离点逆传递拿到的数据
+    handleSelectPoint(points) {
+      console.log(points, "父组件接收逆向传递选中的隔离点");
+
+      // 1. 去除重复的点,使用 Set 确保每个 pointId 唯一
+      const uniquePoints = Array.from(
+        new Set(points.map((point) => point.pointId))
+      ).map((id) => points.find((point) => point.pointId === id));
+
+      console.log(uniquePoints, "去重后的选中节点");
+
+      this.tableData = uniquePoints; // 子组件传递过来的选中节点(去重后)
+
+      // 使用 Set 来存储传递过来的点值
+      const newValues = new Set(uniquePoints.map((point) => point.pointId));
+
+      // 2. 删除取消选中的点
+      const removedPoints = this.tableData
+        .filter((item) => !newValues.has(item.pointId))
+        .map((item) => item.pointId); // 记录被删除的点
+
+      this.tableData = this.tableData.filter((item) =>
+        newValues.has(item.pointId)
+      );
+
+      // 3. 确保新增点不会重复
+      const existingValues = new Set(
+        this.tableData.map((item) => item.pointId)
+      );
+
+      uniquePoints.forEach((point) => {
+        // 如果当前传递的点不在已有的点集中,则添加
+        if (!existingValues.has(point.pointId)) {
+          this.tableData.push({
+            pointName: point.pointName, // 显示的名称
+            pointId: point.pointId, // 对应的值
+            pointType: point.pointType,
+            powerType: point.powerType,
+            prePointId: null,
+          });
+
+          this.prePointIdOptions.push({
+            pointName: point.pointName, // 显示的名称
+            pointId: point.pointId, // 对应的值
+          });
+          this.initprePointIdOptions = [...this.prePointIdOptions];
+          console.log(this.prePointIdOptions, "前置节点设置下拉");
+          existingValues.add(point.pointId);
+        }
+      });
+
+      // 4. 处理被删除的点,如果这些点作为父节点绑定,则将对应的 prePointId 设置为 null
+      this.tableData.forEach((item) => {
+        if (removedPoints.includes(item.prePointId)) {
+          item.prePointId = null;
+        }
+      });
+
+      // 5. 从下拉选项中移除被删除的点
+      this.prePointIdOptions = this.prePointIdOptions.filter(
+        (option) => !removedPoints.includes(option.pointId)
+      );
+      this.initprePointIdOptions = [...this.prePointIdOptions];
+
+      // 6. 确保下拉选项中仍然保留所有未被删除的点
+      const allPoints = uniquePoints.map((point) => ({
+        pointName: point.pointName,
+        pointId: point.pointId,
+      }));
+
+      this.prePointIdOptions = allPoints.filter(
+        (option) => !removedPoints.includes(option.pointId)
+      );
+      this.initprePointIdOptions = [...this.prePointIdOptions];
+
+      // 更新 form.spoint 为最新选中的隔离点数组
+      this.form.spoint = uniquePoints.map((point) => point.pointId);
+    },
+
+    // handleSelectPoint(points) {
+    //   console.log(points, '父组件接收逆向传递选中的隔离点')
+    //   this.tableData = points; //子组件传递过来的选中节点
+    //   // 使用 Set 来存储传递过来的点值
+    //   const newValues = new Set(points.map((point) => point.pointId))
+    //
+    //   // 1. 删除取消选中的点
+    //   const removedPoints = this.tableData
+    //     .filter((item) => !newValues.has(item.pointId))
+    //     .map((item) => item.pointId) // 记录被删除的点
+    //
+    //   this.tableData = this.tableData.filter((item) =>
+    //     newValues.has(item.pointId)
+    //   )
+    //   // 2. 确保新增点不会重复
+    //   const existingValues = new Set(
+    //     this.tableData.map((item) => item.pointId)
+    //   )
+    //
+    //   points.forEach((point) => {
+    //     // 如果当前传递的点不在已有的点集中,则添加
+    //     if (!existingValues.has(point.pointId)) {
+    //       this.tableData.push({
+    //         pointName: point.pointName, // 显示的名称
+    //         pointId: point.pointId, // 对应的值
+    //         pointType: point.pointType,
+    //         powerType: point.powerType,
+    //         prePointId: null
+    //       })
+    //
+    //       this.prePointIdOptions.push({
+    //         pointName: point.pointName, // 显示的名称
+    //         pointId: point.pointId // 对应的值
+    //       })
+    //       this.initprePointIdOptions = [...this.prePointIdOptions]
+    //       console.log(this.prePointIdOptions, '前置节点设置下拉')
+    //       existingValues.add(point.pointId)
+    //     }
+    //   })
+    //
+    //   // 3. 处理被删除的点,如果这些点作为父节点绑定,则将对应的 prePointId 设置为 null
+    //   this.tableData.forEach((item) => {
+    //     if (removedPoints.includes(item.prePointId)) {
+    //       item.prePointId = null
+    //     }
+    //   })
+    //
+    //   // 4. 从下拉选项中移除被删除的点
+    //   this.prePointIdOptions = this.prePointIdOptions.filter(
+    //     (option) => !removedPoints.includes(option.pointId)
+    //   )
+    //   this.initprePointIdOptions = [...this.prePointIdOptions]
+    //
+    //   // 5. 确保下拉选项中仍然保留所有未被删除的点
+    //   const allPoints = points.map((point) => ({
+    //     pointName: point.pointName,
+    //     pointId: point.pointId
+    //   }))
+    //
+    //   this.prePointIdOptions = allPoints.filter(
+    //     (option) => !removedPoints.includes(option.pointId)
+    //   )
+    //   this.initprePointIdOptions = [...this.prePointIdOptions]
+    //
+    //   // 更新 form.spoint 为最新选中的隔离点数组
+    //   this.form.spoint = points.map((point) => point.pointId)
+    //
+    // },
+
+    // 车间逆向传递拿到的隔离点数据产线
+    handleProductLineSelected(selectedOption) {
+      // console.log(selectedOption, "父组件接收到的 selectedOption");
+      this.points = selectedOption;
+      this.form.workline = selectedOption.label;
+      // console.log(this.worklineMap.length, '父组件接收到的 worklineMap')
+    },
+    // 车间子组件逆传递车间相关数据车间
+    handleWorkshopSelected(selectedOption) {
+      console.log(selectedOption, "handleWorkshopSelected");
+      // this.emitWorkShop = selectedOption
+      // this.form.workshopName = selectedOption.label;//这里是回显车间的 暂时不需要
+      this.form.workline = selectedOption.label; //这里是回显工作区域的
+      this.emitworklineId = selectedOption.id;
+      this.worklineMap = selectedOption.map;
+    },
+
+    // 添加内部人员
+    addInside() {
+      this.open = true;
+      this.title = "添加内部人员";
+      this.insideMumber = true;
+      this.outsideMumber = false;
+      // this.form.ticketUserDTOList = [];
+
+      this.dialogForm.nickName = "";
+    },
+    addOutside() {
+      this.open = true;
+      this.title = "添加外部人员";
+      this.insideMumber = false;
+      this.outsideMumber = true;
+      this.dialogForm.username = null;
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+    },
+    // 人员列表删除
+    deleteRow(index, rows) {
+      console.log(index, rows, "删除的行");
+      const deletedItem = rows[index]; // 获取要删除的项
+      rows.splice(index, 1); // 从显示的列表中删除
+      const formIndex = this.form.ticketUserDTOList.findIndex(
+        (item) => item.userId === deletedItem.userId
+      );
+      if (formIndex !== -1) {
+        this.form.ticketUserDTOList.splice(formIndex, 1); // 从 form.ticketUserDTOList 中删除
+      }
+    },
+    // 上锁人下拉选择change事件
+    handlelockerChage(val) {
+      console.log(val, "上锁人chage");
+      const user = this.listLockerOption.find((item) => item.value === val);
+
+      if (user && this.form.locker !== "") {
+        const existingUser = this.form.ticketUserDTOList.find(
+          (u) => u.userName === user.label
+        );
+        if (!existingUser) {
+          this.newticketUserDTOList.push({
+            userName: user.label,
+            userId: user.value,
+            userType: 0,
+            userRole: "0",
+          });
+
+          console.log(this.newticketUserDTOList, "用户");
+        } else {
+          // console.log('用户已存在', user.label)
+        }
+      }
+    },
+
+    // 添加内部人员的用户新增到ticketUserDTOList这个数据里
+    changeInsideUser(values) {
+      const usersinside = values
+        .map((value) =>
+          this.listCoLockerOption.find((item) => item.value === value)
+        )
+        .filter(Boolean);
+
+      usersinside.forEach((user) => {
+        const existingUser = this.form.ticketUserDTOList.find(
+          (u) => u.userName === user.label
+        );
+        // console.log(usersinside, 'usersinside----67')
+        if (!existingUser) {
+          this.form.ticketUserDTOList.push({
+            userName: user.label,
+            userId: user.value,
+            userType: 1,
+            userRole: 0,
+          });
+          console.log(this.form.ticketUserDTOList, "用户");
+        } else {
+          // console.log('用户已存在', user.label)
+        }
+      });
+      this.updateCoLocker();
+
+      // console.log(this.form.ticketUserDTOList, '用户')
+    },
+    // 添加外部人员 输入名称 userType==1是共锁人 0是上锁人 userId==0
+    outSideUserInput(event) {
+      this.dialogForm.username = event;
+    },
+    // 添加外部人员弹窗 添加给表格数据的按钮事件
+    insertOutSideTable() {
+      this.OutSideUserTableData.push({
+        userName: this.dialogForm.username,
+        userId: this.nextUserId++,
+      });
+      this.dialogForm.username = "";
+      console.log(this.OutSideUserTableData, "OutSideUserTableData");
+    },
+    // 添加外部人员 确认弹窗
+    outSideDialogConfirm() {
+      this.updateCoLocker();
+      this.open = false;
+    },
+    // 更新界面中共锁人下拉框显示的内容
+    updateCoLocker() {
+      // 检查并补充 ticketUserDTOList 中缺少的用户
+      this.OutSideUserTableData.forEach((item) => {
+        const existingUser = this.form.ticketUserDTOList.find(
+          (u) => u.userName === item.userName
+        );
+
+        if (!existingUser) {
+          this.form.ticketUserDTOList.push({
+            userName: item.userName,
+            userId: 0,
+            userType: 1,
+            userRole: 1,
+          });
+        }
+      });
+
+      console.log(this.form.ticketUserDTOList, "最终的 ticketUserDTOList");
+    },
+    //自动生成编码
+    handleAutoGenChange(autoGenFlag) {
+      if (autoGenFlag) {
+        genCode("SOP_CODE").then((response) => {
+          this.form.sopCode = response;
+        });
+      } else {
+        this.form.sopCode = null;
+      }
+    },
+    //是否开启人员配置界面
+    handleOpenStaffing(openStaffing) {
+      // 定义一个函数来封装接口调用逻辑
+      const fetchUserData = (roleKey) => {
+        const data = {
+          pageNum: 1,
+          pageSize: 10000,
+          roleKey: roleKey,
+        };
+        return SopUser(data)
+          .then((res) => {
+            // console.log(res, `上锁人 - ${roleKey}`);
+            return res; // 返回结果以便后续处理
+          })
+          .catch((err) => {
+            // console.error(err, `请求失败 - ${roleKey}`);
+            throw err; // 抛出错误以便捕获
+          });
+      };
+
+      // 调用两次接口,分别传递不同的 roleKey
+      Promise.all([fetchUserData("jtlocker"), fetchUserData("jtcolocker")])
+        .then((results) => {
+          // 处理两次调用的结果
+          const [jtlockerResult, jtcolockerResult] = results;
+          console.log(jtlockerResult, jtcolockerResult, "jtlocker 结果");
+          this.listLockerOption = jtlockerResult.rows.map((item) => {
+            return {
+              label: item.nickName,
+              value: item.userId,
+            };
+          });
+          this.listCoLockerOption = jtcolockerResult.rows.map((item) => {
+            return {
+              label: item.nickName,
+              value: item.userId,
+            };
+          });
+        })
+        .catch((err) => {
+          console.error(err, "其中一个请求失败");
+        });
+      if (openStaffing) {
+        console.log(openStaffing, "开启人员配置");
+        this.openStaffing = openStaffing;
+      } else {
+        console.log(openStaffing, "关闭人员配置");
+        this.openStaffing = openStaffing;
+        // this.activeName = "first";
+      }
+    },
+    // 侧边X关闭
+    goBack() {
+      this.$router.push("/sop/sopm");
+    },
+    //   methods结束
+  },
+};
+</script>
+
+
+<style scoped lang="scss">
+.newOperations {
+  width: 99%;
+  height: 100%;
+  // background: pink;
+  margin: 10px;
+  display: flex;
+  position: relative;
+
+  .left {
+    width: 75%;
+    height: 830px;
+    // background: #eee;
+    margin-right: 10px;
+  }
+  .lefttree {
+    width: 18%;
+    height: 100%;
+    position: absolute;
+    left: 0;
+    top: 2%;
+    // background: pink;
+    .lefttree-card {
+      height: 98%;
+    }
+    .title {
+      display: block;
+      width: 30%;
+      height: 30px;
+      text-align: center;
+      margin: 0 0 5%;
+      border-bottom: 2px solid #1684fc;
+      color: rgb(22, 132, 252);
+    }
+  }
+  .right {
+    flex: 1;
+    height: 100%;
+    // background: #000;
+    .right_top {
+      height: 840px;
+      // background: pink;
+      .box-card {
+        height: 100%;
+        overflow-y: auto;
+      }
+    }
+    .title {
+      display: block;
+      width: 20%;
+      height: 30px;
+      text-align: center;
+      margin: 0 0 5%;
+      border-bottom: 2px solid #1684fc;
+      color: rgb(22, 132, 252);
+    }
+  }
+}
+
+//右侧卡片样式开始
+.text {
+  font-size: 14px;
+}
+
+.item {
+  margin-bottom: 18px;
+
+  p {
+    font-size: 18px;
+    font-weight: bolder;
+    font-family: SourceHanSansSC-bold;
+  }
+}
+
+.clearfix:before,
+.clearfix:after {
+  display: table;
+  content: "";
+  width: 320px;
+}
+
+.clearfix:after {
+  clear: both;
+}
+
+.box-card {
+  // width: 390px;
+  width: 100%;
+  height: 850px;
+  //background: pink;
+}
+
+::v-deeep .el-tabs--top .el-tabs__item.is-top:nth-child(2),
+.el-tabs--top .el-tabs__item.is-bottom:nth-child(2),
+.el-tabs--bottom .el-tabs__item.is-top:nth-child(2),
+.el-tabs--bottom .el-tabs__item.is-bottom:nth-child(2) {
+  padding-left: 100px !important;
+}
+
+::v-deep .el-tabs .el-tabs__item {
+  padding: 0 30px !important;
+}
+
+//右侧卡片样式结束
+</style>
+<style>
+</style>