瀏覽代碼

新增拖拽锁定站与物资给mars

pm 10 月之前
父節點
當前提交
a2d7544fd3

+ 200 - 9
src/views/mes/hw/lotoStation/MapData.vue

@@ -19,7 +19,6 @@
         </div>
         <div style="height: 100%;padding-bottom:10px">
           <el-input v-model="value" type="textarea" :rows="34" ></el-input>
-
         </div>
         <div class="bottombtn" style="width:100%;height: 35px;padding: 10px 0 0">
           <el-button v-no-more-click @click="save" type="primary" icon="el-icon-edit" style="float: right; height: 33px; line-height: 2px">保存</el-button>
@@ -36,6 +35,7 @@
 <script>
 import Konva from "konva";
 import {getLotoMapInfo,getLotoInfo,updateLoto} from '@/api/mes/lotoStation/lotoStation'
+import { getIsIsolationPointPage } from '@/api/mes/spm/segregationPoint'
 
 
 export default {
@@ -46,13 +46,16 @@ export default {
       layer: null,
       selectedStates: [], // 用于存储每个元素的选中状态
       selectedText: [], // 用于存储未选中的元素文本
-      rects: [], // 白色r        ect合集
+      rects: [], // 白色rect合集
       texts: [], // 白色text合集
       redrects: [], // 红色rect合集
       redtexts: [], // 白色text合集
       value:'',
       form:{},//拿到单个数据
-      orignData:null,//原始数据
+      originData:null,//原始数据
+      filterData:null,//用来过滤掉已经渲染出来的隔离点
+      allPoints:[],
+      groups:[],//组移动数据
     };
   },
   watch:{
@@ -66,6 +69,7 @@ export default {
     }
   },
   mounted() {
+    this.getIsIsolationPointPage()
     this.$nextTick(()=>{
       this.getLoToInfo()
     })
@@ -87,19 +91,51 @@ export default {
       getLotoMapInfo(lotoId,sopId,ticketId).then(response => {
         console.log(response,'作业区域预览接口调用');
         this.form.map=response.data;
-
+        this.filterData=response.data
         if (response.data) {
           try {
             this.value = JSON.stringify(response.data, null, 4);
-            this.orignData=this.value
+            this.originData=this.value
           } catch (err) {}
         }
         this.initKonva();
       })
     },
+    // 获取所有隔离点
+    getIsIsolationPointPage(){
+      const data={
+        current: 1,
+        size: -1,
+      }
+      getIsIsolationPointPage(data).then(res=>{
+        console.log(res,'所有隔离点')
+        // 过滤掉 originData 中已经存在的数据
+        // const filter = res.data.records.filter(record => {
+        //   // 判断 res.data.records 中的 record 是否不在 this.filterData 中
+        //   return !this.filterData.some(item => item.pointId === record.pointId);
+        // });
+        this.allPoints = res.data.records.map(item => {
+          return {
+            pointId: item.pointId,
+            pointName: item.pointName,
+            remark: item.remark,
+            prePointId: item.prePointId,
+            pointType: item.pointType,
+            pointTypeName: item.pointTypeName,
+            powerType: item.powerType,
+            powerTypeName: item.powerTypeName,
+            pointIcon: item.pointIcon,
+            status: false,
+            pointPicture: item.pointPicture,
+            mapImg: null
+          };
+        });
+
+      })
+    },
     // 重置
     reset(){
-      this.value = this.orignData;
+      this.value = this.originData;
       this.initKonva(); // 重新初始化 Konva
     },
     // 预览
@@ -130,7 +166,7 @@ export default {
           console.log( formData,'map')
           updateLoto(formData).then(response => {
             console.log(response, '修改车间区域地图');
-            this.$router.push('/hw/information/lotoStation');
+            this.$router.push('/mes/dv/lotoStation');
             this.$message({
               type: 'success',
               message: '保存成功!'
@@ -185,7 +221,21 @@ export default {
 
       // 绘制无限网格
       this.drawGrid(50, 50, "#e0e0e0"); // 每个单元格50x50,浅灰色网格
-
+      // 创建所有隔离点父盒子 放置于网格线上
+      const allPointsBox=new Konva.Rect({
+        x: 1000,
+        y: 10,
+        width: 200,
+        height: 800,
+        cornerRadius: 5,
+        stroke: 'black',
+        strokeWidth: 2,
+        fill: 'white'
+      })
+      this.layer.add(allPointsBox);
+      this.layer.draw();
+      // 调用函数将隔离点添加到 allPointsBox
+      this.addPointsToAllPointsBox(allPointsBox);
       // 渲染数据
       const imageSrc = require("@/assets/images/localSetIcon.jpg"); // 图片路径
       this.renderGrid(imageSrc, 6, 3, 450, 100, 120, 100, 50, 50, 60, 25);
@@ -223,8 +273,149 @@ export default {
         this.layer.add(horizontalLine);
       }
 
+      // 添加网格坐标文本
+      // for (let row = 0; row < height / cellHeight; row++) {
+      //   for (let col = 0; col < width / cellWidth; col++) {
+      //     const text = new Konva.Text({
+      //       x: col * cellWidth + 5, // 调整位置以适应网格
+      //       y: row * cellHeight + 5, // 调整位置以适应网格
+      //       text: `(${col},${row})`,
+      //       fontSize: 10,
+      //       fill: 'gray',
+      //     });
+      //     this.layer.add(text);
+      //   }
+      // }
+
       this.layer.draw();
     },
+    // 绘制所有隔离点列表
+    addPointsToAllPointsBox(allPointsBox) {
+      if (this.allPoints && this.allPoints.length > 0) {
+        const boxWidth = allPointsBox.width();
+        const boxHeight = allPointsBox.height();
+        const boxX = allPointsBox.x();
+        const boxY = allPointsBox.y();
+        const padding = 10; // 每个隔离点之间的间距
+        const pointWidth = 50; // 每个隔离点的宽度
+        const pointHeight = 70; // 每个隔离点的高度(包括图片和文字)
+
+        let currentX = boxX + padding;
+        let currentY = boxY + padding;
+
+        this.allPoints.forEach((point, index) => {
+          // 创建一个组来组合红色边框、图片和文字
+          const group = new Konva.Group({
+            x: currentX,
+            y: currentY,
+            draggable: true // 启用拖拽功能
+          });
+
+          // 创建红色边框
+          const borderRect = new Konva.Rect({
+            x: 0,
+            y: 0,
+            width: pointWidth,
+            height: pointHeight,
+            cornerRadius: 5,
+            stroke: 'red',
+            strokeWidth: 2,
+            fill: 'white'
+          });
+          group.add(borderRect);
+
+          // 创建图片
+          const image = new Image();
+          image.src = point.pointIcon;
+          image.onload = () => {
+            const knovaImage = new Konva.Image({
+              x: 1, // 图片在组内的位置
+              y: 5, // 图片在组内的位置
+              image: image,
+              width: 50, // 图片宽度
+              height: 50 // 图片高度
+            });
+            group.add(knovaImage);
+
+            // 创建文字
+            const pointText = new Konva.Text({
+              x: 12, // 文字在组内的位置
+              y: 53, // 文字在组内的位置
+              text: point.pointName,
+              fontSize: 12,
+              fill: 'red'
+            });
+            group.add(pointText);
+
+            // 将组添加到图层
+            this.layer.add(group);
+            this.groups[point.pointName] = group; // 用文字作为键存储
+
+            // 监听组的拖拽结束事件
+            group.on('dragend', () => {
+              const gridX = 50; // 网格单元格宽度
+              const gridY = 50; // 网格单元格高度
+
+              // 计算最近的网格点位置
+              const snappedX = Math.round(group.x() / gridX) * gridX;
+              const snappedY = Math.round(group.y() / gridY) * gridY;
+
+              // 设置组到最近的网格点位置
+              group.x(snappedX);
+              group.y(snappedY);
+              console.log(group,'组移动');
+              // 计算网格坐标
+              const row = Math.floor(snappedY / gridY);
+              const col = Math.floor(snappedX / gridX);
+
+              // 生成 JSON 数据
+              const pointData = {
+                row: row,
+                col: col,
+                pointId: point.pointId,
+                pointName: point.pointName,
+                remark: point.remark,
+                prePointId: point.prePointId,
+                pointType: point.pointType,
+                pointTypeName: point.pointTypeName,
+                powerType: point.powerType,
+                powerTypeName: point.powerTypeName,
+                state: point.status,
+                pointIcon: point.pointIcon,
+                pointPicture: point.pointPicture,
+                mapImg: null
+              };
+
+              // 将字符串转换为数组
+              let valueArray = [];
+              try {
+                valueArray = JSON.parse(this.value);
+              } catch (e) {
+                console.error("Failed to parse value:", e);
+              }
+              // 添加新数据到数组
+              valueArray.push(pointData);
+              console.log(valueArray);
+              // 将数组转换回字符串
+              this.value = JSON.stringify(valueArray, null, 4);
+
+              // 重新绘制图层
+              this.layer.draw();
+            });
+
+            // 重新绘制图层
+            this.layer.draw();
+          };
+
+          // 更新下一个隔离点的位置
+          currentX += pointWidth + padding;
+          if (currentX + pointWidth > boxX + boxWidth) {
+            currentX = boxX + padding;
+            currentY += pointHeight + padding;
+          }
+        });
+      }
+    },
 
     renderGrid(imageSrc) {
       this.selectedStates = []; // 用数组来存储选中状态
@@ -245,7 +436,7 @@ export default {
 
         const point = new Image();
         point.src=pos.pointIcon
-        // point.src = imageSrc;
+
         point.onload = () => {
           const knovaImage = new Konva.Image({
             x: x,

+ 5 - 7
src/views/mes/material/inspectionplan/index.vue

@@ -70,7 +70,7 @@
           icon="el-icon-plus"
           size="mini"
           @click="handleAdd"
-          v-hasPermi="['mes:mat:plan:add']"
+          v-hasPermi="['iscs:task:add']"
         >新增
         </el-button>
       </el-col>
@@ -83,7 +83,7 @@
           size="mini"
           :disabled="multiple"
           @click="handleDelete"
-          v-hasPermi="['mes:mat:plan:batchremove']"
+          v-hasPermi="['iscs:task:remove']"
         >批量删除
         </el-button>
       </el-col>
@@ -135,7 +135,7 @@
             type="text"
             icon="el-icon-edit"
             @click="handleUpdate(scope.row)"
-            v-hasPermi="['mes:mat:plan:edit']"
+            v-hasPermi="['iscs:task:query']"
           >编辑
           </el-button>
           <el-button
@@ -144,7 +144,7 @@
             type="text"
             icon="el-icon-edit"
             @click="handleResult(scope.row)"
-            v-hasPermi="['mes:mat:plan:result']"
+            v-hasPermi="['iscs:task:result']"
           >结果记录
           </el-button>
           <el-button
@@ -153,7 +153,7 @@
             type="text"
             icon="el-icon-delete"
             @click="handleDelete(scope.row)"
-            v-hasPermi="['mes:mat:plan:remove']"
+            v-hasPermi="['iscs:task:remove']"
           >删除
           </el-button>
         </template>
@@ -472,8 +472,6 @@ export default {
         this.form = response.data
         this.form.userIdStr = response.data.userIdStr.split(',')
         this.form.cabinetIdStr = response.data.cabinetIdStr.split(',')
-
-
         this.open = true
         this.title = '编辑检查计划'
         this.optType = 'edit'

+ 36 - 36
src/views/mes/material/lockers/index.vue

@@ -93,11 +93,11 @@
         align="center"
         prop="hardwareName"
       />
-      <el-table-column
-        label="工作区域"
-        align="center"
-        prop="workareaName"
-      />
+<!--      <el-table-column-->
+<!--        label="工作区域"-->
+<!--        align="center"-->
+<!--        prop="workareaName"-->
+<!--      />-->
       <el-table-column label="创建时间" align="center" prop="createTime"/>
       <el-table-column label="更新时间" align="center" prop="updateTime"/>
 
@@ -178,15 +178,15 @@
             />
           </el-select>
         </el-form-item>
-        <el-form-item label="工作区域" prop="workareaId">
-          <treeselect
-            style="width: 348px"
-            v-model="form.workareaId"
-            :options="workareaOptions"
-            :normalizer="normalizer"
-            placeholder="选择工作区域"
-          />
-        </el-form-item>
+<!--        <el-form-item label="工作区域" prop="workareaId">-->
+<!--          <treeselect-->
+<!--            style="width: 348px"-->
+<!--            v-model="form.workareaId"-->
+<!--            :options="workareaOptions"-->
+<!--            :normalizer="normalizer"-->
+<!--            placeholder="选择工作区域"-->
+<!--          />-->
+<!--        </el-form-item>-->
 
         <el-form-item label="备注" prop="remark">
           <el-input
@@ -331,11 +331,11 @@ export default {
             require:true,message:'硬件名称不能为空',trigger:'blur'
           }
         ],
-        workareaId:[
-          {
-            require:true,message:'工作区域不能为空',trigger:'blur'
-          }
-        ]
+        // workareaId:[
+        //   {
+        //     require:true,message:'工作区域不能为空',trigger:'blur'
+        //   }
+        // ]
       },
 
       workareaOptions: []
@@ -358,25 +358,25 @@ export default {
         })
         // console.log(response, this.hardWareList, '获取硬件信息')
       })
-      listWorkarea(this.queryParams).then((response) => {
-        debugger;
-        var depts = this.handleTree(response.data.records, 'workareaId')
-
-        this.workareaOptions = depts
-        this.loading = false
-      })
+      // listWorkarea(this.queryParams).then((response) => {
+      //   debugger;
+      //   var depts = this.handleTree(response.data.records, 'workareaId')
+      //
+      //   this.workareaOptions = depts
+      //   this.loading = false
+      // })
     },
     /** 转换数据结构 */
-    normalizer(node) {
-      if (node.children && !node.children.length) {
-        delete node.children
-      }
-      return {
-        id: node.workareaId,
-        label: node.workareaName,
-        children: node.children
-      }
-    },
+    // normalizer(node) {
+    //   if (node.children && !node.children.length) {
+    //     delete node.children
+    //   }
+    //   return {
+    //     id: node.workareaId,
+    //     label: node.workareaName,
+    //     children: node.children
+    //   }
+    // },
     /** 查询物资类型下拉树结构 */
     getTreeselect() {
       const data = {

+ 85 - 86
src/views/mes/md/segregationpoint/index.vue

@@ -190,7 +190,7 @@
       </el-table-column>
       <el-table-column label="设备/工艺" align="center" prop="machineryName" >
       </el-table-column>
-      <el-table-column label="LOTO站" align="center" prop="lotoName" >
+      <el-table-column label="锁定站" align="center" prop="lotoName" >
       </el-table-column>
       <el-table-column label="作用" align="center" prop="remark">
       </el-table-column>
@@ -319,10 +319,10 @@
       <el-form ref="form" :model="form" :rules="rules" label-width="110px">
         <el-row>
           <el-col :span="7">
-            <el-form-item label="隔离点编" prop="pointCode">
+            <el-form-item label="隔离点编" prop="pointCode">
               <el-input
                 v-model="form.pointCode"
-                placeholder="请输入隔离点编"
+                placeholder="请输入隔离点编"
               />
             </el-form-item>
           </el-col>
@@ -350,15 +350,31 @@
           </el-col>
         </el-row>
         <el-row>
+<!--          <el-col :span="11">-->
+<!--            <el-form-item label="隔离点类型" prop="pointType">-->
+<!--              <el-select-->
+<!--                style="width: 300px"-->
+<!--                v-model="form.pointType"-->
+<!--                placeholder="请选择隔离点类型"-->
+<!--              >-->
+<!--                <el-option-->
+<!--                  v-for="dict in dict.type.point_type"-->
+<!--                  :key="dict.value"-->
+<!--                  :label="dict.label"-->
+<!--                  :value="dict.value"-->
+<!--                />-->
+<!--              </el-select>-->
+<!--            </el-form-item>-->
+<!--          </el-col>-->
           <el-col :span="11">
-            <el-form-item label="隔离点类型" prop="pointType">
+            <el-form-item label="锁定站" prop="lockTypeName">
               <el-select
                 style="width: 300px"
-                v-model="form.pointType"
-                placeholder="请选择隔离点类型"
+                v-model="form.lotoId"
+                placeholder="请选择锁定站"
               >
                 <el-option
-                  v-for="dict in dict.type.point_type"
+                  v-for="dict in lotoOptions"
                   :key="dict.value"
                   :label="dict.label"
                   :value="dict.value"
@@ -375,26 +391,10 @@
                 maxlength="16"
               />
             </el-form-item>
-
-
           </el-col>
         </el-row>
         <el-row>
-          <el-col :span="11">
-            <el-form-item label="锁定站" prop="lockTypeName">
-              <el-select
-                style="width: 300px"
-                v-model="form.lotoId"
-                placeholder="请选择锁定站"
-              >
-                <el-option
-                  v-for="dict in lotoOptions"
-                  :key="dict.value"
-                  :label="dict.label"
-                  :value="dict.value"
-                />
-              </el-select>
-            </el-form-item>
+
 <!--             <el-form-item label="作业区域" prop="workareaId">-->
 <!--              <treeselect-->
 <!--                style="width: 300px"-->
@@ -404,27 +404,13 @@
 <!--                placeholder="选择作业区域"-->
 <!--              />-->
 <!--            </el-form-item>-->
-          </el-col>
-          <el-col :span="11">
-            <el-form-item label="挂锁类型" prop="lockTypeId">
-              <treeselect
-                style="width: 300px"
-                v-model="form.lockTypeId"
-                :options="padLockTypeOptions"
-                :normalizer="normalizerpadLock"
-                placeholder="选择挂锁类型"
-              />
-            </el-form-item>
 
-          </el-col>
-        </el-row>
-        <el-row>
           <el-col :span="11">
-              <el-form-item label="危险能量类型" prop="powerType">
+            <el-form-item label="能量源" prop="powerType">
               <el-select
                 style="width: 300px"
                 v-model="form.powerType"
-                placeholder="请选择危险能量类型"
+                placeholder="请选择能量源"
               >
                 <el-option
                   v-for="dict in dict.type.power_type"
@@ -436,28 +422,6 @@
             </el-form-item>
 
           </el-col>
-          <el-col :span="12">
-             <el-form-item label="锁具机构类型" prop="locksetTypeId">
-              <treeselect
-                style="width: 300px"
-                v-model="form.locksetTypeId"
-                :options="LockTypeOptions"
-                :normalizer="normalizerLockset"
-                placeholder="选择锁具机构类型"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row>
-          <el-col :span="11">
-           <el-form-item label="锁具机构名称" prop="lockTypeName">
-              <el-input
-                style="width: 300px"
-                v-model="form.lockTypeName"
-                placeholder="请输入锁具机构名称"
-              />
-            </el-form-item>
-          </el-col>
           <el-col :span="11">
             <el-form-item label="作用" prop="remark">
               <el-input
@@ -467,7 +431,42 @@
               />
             </el-form-item>
           </el-col>
+<!--          <el-col :span="11">-->
+<!--            <el-form-item label="挂锁类型" prop="lockTypeId">-->
+<!--              <treeselect-->
+<!--                style="width: 300px"-->
+<!--                v-model="form.lockTypeId"-->
+<!--                :options="padLockTypeOptions"-->
+<!--                :normalizer="normalizerpadLock"-->
+<!--                placeholder="选择挂锁类型"-->
+<!--              />-->
+<!--            </el-form-item>-->
+<!--          </el-col>-->
         </el-row>
+
+<!--        <el-row>-->
+<!--          <el-col :span="11">-->
+<!--           <el-form-item label="锁具机构名称" prop="lockTypeName">-->
+<!--              <el-input-->
+<!--                style="width: 300px"-->
+<!--                v-model="form.lockTypeName"-->
+<!--                placeholder="请输入锁具机构名称"-->
+<!--              />-->
+<!--            </el-form-item>-->
+<!--          </el-col>-->
+<!--          <el-col :span="12">-->
+<!--            <el-form-item label="锁具机构类型" prop="locksetTypeId">-->
+<!--              <treeselect-->
+<!--                style="width: 300px"-->
+<!--                v-model="form.locksetTypeId"-->
+<!--                :options="LockTypeOptions"-->
+<!--                :normalizer="normalizerLockset"-->
+<!--                placeholder="选择锁具机构类型"-->
+<!--              />-->
+<!--            </el-form-item>-->
+<!--          </el-col>-->
+<!--         -->
+<!--        </el-row>-->
         <el-row>
           <el-col :span="8">
             <el-form-item label="隔离点图标" prop="pointIcon">
@@ -492,30 +491,30 @@
             </el-form-item>
           </el-col>
         </el-row>
-        <el-row>
-          <el-col :span="8">
-            <el-form-item label="挂锁类型图" prop="lockTypeImg">
-              <ImageUploadSingle
-                :limit="1"
-                :value="form.lockTypeImg"
-                :fileSize="5"
-                @onUploaded="lockTypeImgUplaoded"
-                @onRemoved="lockTypeImgRemoved"
-              ></ImageUploadSingle>
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="锁具机构类型图" prop="locksetTypeImg">
-              <ImageUploadSingle
-                :limit="1"
-                :value="form.locksetTypeImg"
-                :fileSize="5"
-                @onUploaded="locksetTypeImgUplaoded"
-                @onRemoved="locksetTypeImgRemoved"
-              ></ImageUploadSingle>
-            </el-form-item>
-          </el-col>
-        </el-row>
+<!--        <el-row>-->
+<!--          <el-col :span="8">-->
+<!--            <el-form-item label="挂锁类型图" prop="lockTypeImg">-->
+<!--              <ImageUploadSingle-->
+<!--                :limit="1"-->
+<!--                :value="form.lockTypeImg"-->
+<!--                :fileSize="5"-->
+<!--                @onUploaded="lockTypeImgUplaoded"-->
+<!--                @onRemoved="lockTypeImgRemoved"-->
+<!--              ></ImageUploadSingle>-->
+<!--            </el-form-item>-->
+<!--          </el-col>-->
+<!--          <el-col :span="8">-->
+<!--            <el-form-item label="锁具机构类型图" prop="locksetTypeImg">-->
+<!--              <ImageUploadSingle-->
+<!--                :limit="1"-->
+<!--                :value="form.locksetTypeImg"-->
+<!--                :fileSize="5"-->
+<!--                @onUploaded="locksetTypeImgUplaoded"-->
+<!--                @onRemoved="locksetTypeImgRemoved"-->
+<!--              ></ImageUploadSingle>-->
+<!--            </el-form-item>-->
+<!--          </el-col>-->
+<!--        </el-row>-->
 
       </el-form>