فهرست منبع

2025/5/15提交 工卡 钥匙 挂锁新增状态和原因 新增rfid标识菜单和锁柜管理菜单

pm 5 ماه پیش
والد
کامیت
5eceec87bb

+ 46 - 0
src/api/mes/rfid_token/index.js

@@ -0,0 +1,46 @@
+import request from '@/utils/request'
+
+
+// 查询锁控机柜-列表
+export function getIsRfidTokenPage(query) {
+  return request({
+    url: '/iscs/token/getIsRfidTokenPage',
+    method: 'get',
+    params: query
+  })
+}
+
+// 获取锁控机柜详细信息
+export function selectIsRfidTokenById(repairId) {
+  return request({
+    url: '/iscs/token/selectIsRfidTokenById?rfidId=' + repairId,
+    method: 'get'
+  })
+}
+
+//新增锁控机柜
+export function insertIsRfidToken(query) {
+  return request({
+    url: '/iscs/token/insertIsRfidToken',
+    method: 'post',
+    data: query
+  })
+}
+
+// 修改锁控机柜信息
+export function updateIsRfidToken(data) {
+  return request({
+    url: '/iscs/token/updateIsRfidToken',
+    method: 'post',
+    data: data
+  })
+}
+
+// 删除锁控机柜信息
+export function deleteIsRfidTokenByRfidIds(repairId) {
+  return request({
+    url: '/iscs/token/deleteIsRfidTokenByRfidIds?rfidIds=' + repairId,
+    method: 'post'
+
+  })
+}

+ 15 - 0
src/router/index.js

@@ -263,6 +263,21 @@ export const dynamicRoutes = [
       }
     ]
   },
+  // 硬件锁柜管理详情
+  {
+    path: '/mes/hw/lockCabinet',
+    component: Layout,
+    hidden: true,
+    permissions: ['iscs:station:list'],
+    children: [
+      {
+        path: 'LookDetail',
+        component: () => import('@/views/mes/hw/lockCabinet/lookDetail'),
+        name: 'LookDetail',
+        meta: { title: '详情', activeMenu: '/mes/hw/lockCabinet/lookDetail' }
+      }
+    ]
+  },
   // 设备工艺详情
   {
     path: '/mes/dv/technology/technologyList/index',

+ 23 - 8
src/views/mes/dv/segregationpoint/index.vue

@@ -396,13 +396,16 @@
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="隔离点NFC" prop="pointNfc">
-              <el-input
-                style="width: 300px"
-                v-model="form.pointNfc"
-                placeholder="请输入隔离点NFC"
-                maxlength="16"
-              />
+            <el-form-item label="隔离点NFC" prop="pointNfc" >
+<!--              <el-input-->
+<!--                style="width: 300px"-->
+<!--                v-model="form.pointNfc"-->
+<!--                placeholder="请输入隔离点NFC"-->
+<!--                maxlength="16"-->
+<!--              />-->
+              <el-select v-model="form.pointNfc" style="width: 300px">
+                <el-option v-for="dict in this.RfidTokenData" :label="dict.label" :value="dict.value"></el-option>
+              </el-select>
             </el-form-item>
           </el-col>
         </el-row>
@@ -591,6 +594,7 @@ import { listLoto } from '@/api/mes/lotoStation/lotoStation'
 import { listMarsDept } from '@/api/system/marsdept'
 import { listTechnology } from '@/api/system/machinery'
 import { getIsSystemAttributeByKey, selectIsSystemAttributeById } from '@/api/system/configuration'
+import {getIsRfidTokenPage} from "@/api/mes/rfid_token";
 
 export default {
   name: 'Team',
@@ -713,7 +717,8 @@ export default {
         2: '', //空气能
         3: '' //急停开关
       },
-      selectedImageIndex: -1 // 用于记录选中的图片索引
+      selectedImageIndex: -1, // 用于记录选中的图片索引
+      RfidTokenData:null,//绑定rfid的列表
     }
   },
   created() {
@@ -783,6 +788,16 @@ export default {
         current: 1,
         size: -1
       }
+      // 隔离点nfc-rfid-token的数据
+      getIsRfidTokenPage(data).then(response => {
+        console.log(response,'responserfid_token')
+        this.RfidTokenData = response.data.records.map((record, index) => {
+          return{
+            value: record.rfidId,
+            label:record.rfid,
+          }
+        })
+      })
       // listWorkarea(data).then((response) => {
       //   this.deptOptions = this.handleTree(
       //     response.data.records,

+ 1 - 1
src/views/mes/dv/technology/technologyDetail/MapData.vue

@@ -278,7 +278,7 @@ const positions=this.pointList
         point.src = pos.pointIcon
         point.onload = () => {
           const knovaImage = new Konva.Image({
-            x: x,
+            x: x+2,
             y: y,
             image: point,
             width: 45,

+ 59 - 18
src/views/mes/hw/Keys/index.vue

@@ -106,7 +106,26 @@
         :show-overflow-tooltip="true"
       />
       <el-table-column label="MAC地址" align="center" prop="macAddress" />
-
+      <el-table-column label="状态" align="center" prop="exStatus">
+        <template slot-scope="scope">
+          <el-switch
+            style="pointer-events: none;"
+            v-if="scope.row.exStatus!==null"
+            v-model="scope.row.exStatus"
+            active-value="1"
+            inactive-value="0"
+            active-color="#13ce66"
+            inactive-color="grey"
+          ></el-switch>
+          <span v-else>-</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="原因" align="center" prop="exRemark" >
+        <template slot-scope="scope">
+          <dict-tag v-if="scope.row.exRemark" :options="dict.type.key_reason" :value="scope.row.exRemark"/>
+          <span v-else>-</span>
+        </template>
+      </el-table-column>
       <el-table-column label="所属硬件" align="center" prop="hardwareName" />
       <el-table-column
         label="创建时间"
@@ -220,6 +239,26 @@
 
           />
         </el-form-item>
+        <el-form-item label="状态" prop="exStatus">
+          <el-radio-group v-model="form.exStatus">
+            <el-radio
+              v-for="dict in dict.type.key_status"
+              :key="dict.value"
+              :label="dict.value"
+            >{{ dict.label }}</el-radio
+            >
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="原因" prop="exRemark" >
+          <el-select v-model="form.exRemark">
+            <el-option
+              v-for="dict in dict.type.key_reason"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
         <el-form-item label="备注" prop="remark">
           <el-input v-model="form.remark" placeholder="请输入备注" />
         </el-form-item>
@@ -244,12 +283,13 @@ import { listHardware } from "@/api/mes/hw/hardwareinfo";
 import { genCode } from "@/api/system/autocode/rule";
 import Treeselect from "@riophae/vue-treeselect";
 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+import Template from "@/views/print/printtemplate/list.vue";
 // import { listHanrwareType } from "@/api/mes/hw/hadrwareType";
 
 export default {
   name: "lock",
-  dicts: ["hardware_status"],
-  components: { Treeselect },
+  dicts: ["hardware_status",'key_status','key_reason'],
+  components: {Template, Treeselect },
   data() {
     return {
       autoGenFlag: false,
@@ -447,6 +487,7 @@ export default {
       this.$refs["form"].validate((valid) => {
         if (valid) {
           if (this.EditId != null) {
+            console.log(this.form,'编辑传递的form')
             updateKeyAPI(this.form).then((response) => {
               this.$modal.msgSuccess("修改成功");
               this.open = false;
@@ -490,23 +531,23 @@ export default {
 }
 
 /deep/ .el-radio__inner {
-  border-radius: 2px;
+  //border-radius: 2px;
 }
 
 /deep/ .el-radio__input.is-checked .el-radio__inner::after {
-  content: "";
-  width: 8px;
-  height: 3px;
-  border: 1px solid white;
-  border-top: transparent;
-  border-right: transparent;
-  text-align: center;
-  display: block;
-  position: absolute;
-  top: 3px;
-  left: 2px;
-  transform: rotate(-45deg);
-  border-radius: 0pc;
-  background: none;
+  //content: "";
+  //width: 8px;
+  //height: 3px;
+  //border: 1px solid white;
+  //border-top: transparent;
+  //border-right: transparent;
+  //text-align: center;
+  //display: block;
+  //position: absolute;
+  //top: 3px;
+  //left: 2px;
+  //transform: rotate(-45deg);
+  //border-radius: 0pc;
+  //background: none;
 }
 </style>

+ 179 - 0
src/views/mes/hw/lockCabinet/MapData.vue

@@ -0,0 +1,179 @@
+<template>
+  <div>
+    <div ref="container" style="width: 900px; height: 400px;"></div>
+  </div>
+</template>
+
+<script>
+import Konva from 'konva'
+import { getIsSystemAttributeByKey } from '@/api/system/configuration'
+import { getIsLockCabinetSlotsPage } from '@/api/mes/lockcabinet/slots'
+
+export default {
+  data() {
+    return {
+      stage: null,
+      layer: null,
+      cachedResults: {},
+      slotData: []
+    }
+  },
+  mounted() {
+    this.initKonva()
+    this.getData()
+  },
+  methods: {
+    async getData() {
+      const data = {
+        current: 1,
+        size: -1,
+        cabinetId: this.$route.query.cabinetId
+      }
+
+      try {
+        const res = await getIsLockCabinetSlotsPage(data)
+        this.slotData = res.data?.records || []
+
+        const icons = [
+          'icon.locker.normal',
+          'icon.locker.out',
+          'icon.padlock.normal',
+          'icon.padlock.out',
+          'icon.locker.exception'
+        ]
+
+        const results = await Promise.all(icons.map(key => getIsSystemAttributeByKey(key)))
+        this.cachedResults = icons.reduce((map, key, idx) => {
+          map[key] = results[idx].data?.sysAttrValue || ''
+          return map
+        }, {})
+
+        this.renderSlots()
+      } catch (err) {
+        console.error('获取数据失败:', err)
+      }
+    },
+
+    initKonva() {
+      this.stage = new Konva.Stage({
+        container: this.$refs.container,
+        width: 1800,
+        height: 400
+      })
+      this.layer = new Konva.Layer()
+      this.stage.add(this.layer)
+    },
+
+    async renderSlots() {
+      this.layer.destroyChildren()
+
+      // 分组
+      const keySlots = this.slotData.filter(item => item.slotType === '0')
+      const lockSlots = this.slotData.filter(item => item.slotType === '1')
+
+      // 先渲染钥匙类
+      await this.renderSlotRow(keySlots, 50)
+
+      // 再渲染挂锁类
+      await this.renderSlotRow(lockSlots, 170)
+
+      this.layer.draw()
+    },
+    async renderSlotRow(slots, boxTopY) {
+      const padding = 20 // 图片与边框的内边距
+      const boxWidth = 700
+      const boxHeight = 120 // 黑框高度
+
+      const centerX = this.stage.width() / 2
+      const boxStartX = centerX - boxWidth / 2
+
+      // 绘制黑色边框容器
+      const box = new Konva.Rect({
+        x: boxStartX,
+        y: boxTopY,
+        width: boxWidth,
+        height: boxHeight,
+        stroke: 'black',
+        strokeWidth: 2,
+        cornerRadius: 0
+      })
+      this.layer.add(box)
+
+      const loadedImages = []
+
+      // 预加载图像(不渲染)
+      for (const slot of slots) {
+        const { slotType, isOccupied } = slot
+        let baseKey = ''
+        if (slotType === '0') {
+          baseKey = isOccupied === '1' ? 'icon.locker.normal' : 'icon.locker.out'
+        } else {
+          baseKey = isOccupied === '1' ? 'icon.padlock.normal' : 'icon.padlock.out'
+        }
+
+        const baseUrl = this.cachedResults[baseKey]
+        if (!baseUrl) continue
+
+        const imageNode = await this.loadImage(baseUrl)
+
+        const width = slotType === '0' ? 110 : 40
+        const height = 90
+        imageNode.setAttrs({ width, height })
+
+        loadedImages.push({ imageNode, slot, width, height })
+      }
+
+      // 平均分布计算(在 box 内部)
+      const totalSlots = loadedImages.length
+      const spacing = (boxWidth - 2 * padding - totalSlots * loadedImages[0].width) / (totalSlots - 1)
+
+      let currentX = boxStartX + padding
+
+      for (const { imageNode, slot, width, height } of loadedImages) {
+        imageNode.setAttrs({
+          x: currentX,
+          y: boxTopY + (boxHeight - height) / 2
+        })
+        this.layer.add(imageNode)
+
+        // 如果异常,添加异常图标
+        if (slot.status === '1') {
+          const exceptionUrl = this.cachedResults['icon.locker.exception']
+          if (exceptionUrl) {
+            const exceptionImage = await this.loadImage(exceptionUrl)
+            const exWidth = 30
+            const exHeight = 30
+            exceptionImage.setAttrs({
+              x: currentX + (width - exWidth) / 2,
+              y: boxTopY + (boxHeight - exHeight) / 2,
+              width: exWidth,
+              height: exHeight
+            })
+            this.layer.add(exceptionImage)
+          }
+        }
+
+        currentX += width + spacing
+      }
+    },
+
+
+
+    loadImage(url) {
+      return new Promise((resolve, reject) => {
+        const image = new window.Image()
+        image.crossOrigin = 'Anonymous'
+        image.src = url
+        image.onload = () => {
+          const konvaImage = new Konva.Image({ image })
+          resolve(konvaImage)
+        }
+        image.onerror = reject
+      })
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+</style>

+ 642 - 0
src/views/mes/hw/lockCabinet/index.vue

@@ -0,0 +1,642 @@
+<template>
+  <div class="app-container">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="100px"
+    >
+      <el-row>
+        <el-form-item label="锁柜名称" prop="cabinetName">
+          <el-input
+            v-model="queryParams.cabinetName"
+            placeholder="请输入锁柜名称"
+            clearable
+            @keyup.enter.native="handleQuery"
+          />
+        </el-form-item>
+
+        <el-form-item label="是否在线" prop="isOnline">
+          <el-select
+            v-model="queryParams.isOnline"
+            placeholder="请选择是否在线"
+            clearable
+          >
+            <el-option
+              v-for="dict in dict.type.isOnline_status"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-select
+            v-model="queryParams.status"
+            placeholder="请选择状态"
+            clearable
+          >
+            <el-option
+              v-for="dict in dict.type.canbinet_status"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
+
+        <el-form-item style="margin-left: 20px">
+          <el-button
+            v-no-more-click
+            type="primary"
+            icon="el-icon-search"
+            size="mini"
+            @click="handleQuery"
+          >搜索
+          </el-button>
+          <el-button
+            v-no-more-click
+            icon="el-icon-refresh"
+            size="mini"
+            @click="resetQuery"
+          >重置
+          </el-button>
+        </el-form-item>
+      </el-row>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          v-no-more-click
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['mes:hw:work:add']"
+        >新增
+        </el-button>
+      </el-col>
+
+      <el-col :span="1.5">
+        <el-button
+          v-no-more-click
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['mes:hw:work:batchremove']"
+        >批量删除
+        </el-button>
+      </el-col>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
+    </el-row>
+
+    <el-table
+      v-loading="loading"
+      :data="LockCabinetList"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" align="center"/>
+      <el-table-column
+        label="锁柜编码"
+        width="150px"
+        align="center"
+        prop="cabinetCode"
+      />
+      <el-table-column label="锁柜名称" align="center" prop="cabinetName"/>
+<!--      <el-table-column label="硬件ID" align="center" prop="hardwareId"></el-table-column>-->
+      <el-table-column label="岗位" align="center" prop="workstationName">
+
+      </el-table-column>
+      <el-table-column label="图片" align="left" prop="cabinetPicture">
+        <template slot-scope="scope">
+          <div class="img-box" v-if="scope.row.cabinetPicture">
+            <el-image
+              style="width: 50px; height: 50px"
+              :preview-teleported="true"
+              class="images"
+              :hide-on-click-modal="true"
+              :src="scope.row.cabinetPicture"
+              :zoom-rate="1.2"
+              :preview-src-list="[scope.row.cabinetPicture]"
+              :initial-index="1"
+
+            >
+            </el-image>
+            <i class="el-icon-zoom-in" id="eyeicon"></i>
+          </div>
+          <span v-else>-</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="图标" align="left" prop="cabinetIcon">
+        <template slot-scope="scope">
+          <div class="img-box" v-if="scope.row.cabinetIcon">
+            <el-image
+              style="width: 50px; height: 50px"
+              :preview-teleported="true"
+              class="images"
+              :hide-on-click-modal="true"
+              :src="scope.row.cabinetIcon"
+              :zoom-rate="1.2"
+              :preview-src-list="[scope.row.cabinetIcon]"
+              :initial-index="1"
+
+            >
+            </el-image>
+            <i class="el-icon-zoom-in" id="eyeicon"></i>
+          </div>
+          <span v-else>-</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="是否在线" align="center" prop="isOnline">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.isOnline_status" :value="scope.row.isOnline"/>
+
+        </template>
+      </el-table-column>
+      <el-table-column label="状态" align="center" prop="status">
+        <template slot-scope="scope">
+          <el-switch
+            style="pointer-events: none;"
+            v-if="scope.row.status!==null"
+            v-model="scope.row.status"
+            active-value="1"
+            inactive-value="0"
+            active-color="#13ce66"
+            inactive-color="grey"
+          ></el-switch>
+          <span v-else>-</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remark"></el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime"></el-table-column>
+      <el-table-column label="详情" align="center" prop="detail">
+        <template slot-scope="scope">
+          <el-button type="text" @click="lookDetail(scope.row)">查看</el-button>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+        fixed="right"
+      >
+        <template slot-scope="scope">
+          <el-button
+            v-no-more-click
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['mes:hw:work:edit']"
+          >编辑
+          </el-button>
+          <el-button
+            v-no-more-click
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['mes:hw:work:remove']"
+          >删除
+          </el-button>
+          <!--          <el-button v-no-more-click size="mini" type="text">预览</el-button>-->
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.current"
+      :limit.sync="queryParams.size"
+      @pagination="getList"
+    />
+    <!-- 添加或修改设备维修单对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="650px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+        <el-row>
+          <el-col :span="15">
+            <el-form-item label="锁柜编号" prop="cabinetCode">
+              <el-input
+                v-model="form.cabinetCode"
+                placeholder="请输入锁柜编号"
+                style="width: 100%"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label-width="80">
+              <el-switch
+                v-model="autoGenFlag"
+                active-color="#13ce66"
+                active-text="自动生成"
+                @change="handleAutoGenChange(autoGenFlag)"
+              >
+              </el-switch>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-form-item label="锁柜名称" prop="cabinetName" style="width: 380px">
+          <el-input
+            v-model="form.cabinetName"
+            placeholder="请输入锁柜名称"
+          />
+        </el-form-item>
+        <el-form-item label="岗位序号" prop="workstationId" style="width: 380px">
+          <treeselect v-model="form.workstationId" :options="marsOptions"  :normalizer="Marsnormalizer" placeholder="选择岗位" />
+        </el-form-item>
+<!--        <el-form-item label="硬件ID" prop="hardwareId" style="width: 380px">-->
+<!--          <el-select-->
+<!--            v-model="form.hardwareId"-->
+<!--            placeholder="请选择硬件ID"-->
+<!--            clearable-->
+<!--            style="width: 100%"-->
+<!--            @change="handleSelectHardware"-->
+<!--          >-->
+<!--            <el-option-->
+<!--              v-for="dict in this.hardwareList"-->
+<!--              :key="dict.value"-->
+<!--              :label="dict.label"-->
+<!--              :value="dict.value"-->
+<!--            />-->
+<!--          </el-select>-->
+<!--        </el-form-item>-->
+        <el-form-item label="是否在线" prop="isOnline">
+          <el-radio-group v-model="form.isOnline">
+            <el-radio
+              v-for="dict in dict.type.isOnline_status"
+              :key="dict.value"
+              :label="dict.value"
+            >{{ dict.label }}
+            </el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in dict.type.canbinet_status"
+              :key="dict.value"
+              :label="dict.value"
+            >{{ dict.label }}
+            </el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-row>
+          <el-col :span="10">
+            <el-form-item label="图标" prop="cabinetIcon">
+              <ImageUploadSingle
+                :limit="1"
+                :value="form.cabinetIcon"
+                :fileSize="5"
+                @onUploaded="handleImgUplaoded"
+                @onRemoved="handleImgRemoved"
+              ></ImageUploadSingle>
+            </el-form-item>
+          </el-col>
+          <el-col :span="10">
+            <el-form-item label="图片" prop="cabinetPicture">
+              <ImageUploadSingle
+                :limit="1"
+                :value="form.cabinetPicture"
+                :fileSize="5"
+                @onUploaded="handleImgUplaoded1"
+                @onRemoved="handleImgRemoved1"
+              ></ImageUploadSingle>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-form-item label="备注" prop="remark" style="width: 380px">
+          <el-input v-model="form.remark" placeholder="请输入备注"/>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button v-no-more-click type="primary" @click="submitForm"
+        >确 定
+        </el-button
+        >
+        <el-button v-no-more-click @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+
+import {listHardware} from "@/api/mes/hw/hardwareinfo";
+import {genCode} from "@/api/system/autocode/rule";
+import {listMarsDept} from "@/api/system/marsdept";
+import {
+  deleteIsLockCabinetByCabinetIds,
+  getIsLockCabinetPage,
+  insertIsLockCabinet,
+  selectIsLockCabinetById,
+  updateIsLockCabinet
+} from "@/api/mes/lockcabinet";
+
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+import Template from "@/views/print/printtemplate/list.vue";
+
+export default {
+  name: "lock",
+  components: {Template, Treeselect},
+  dicts: ["card_type", 'isOnline_status', 'canbinet_status'],
+  data() {
+    return {
+      autoGenFlag: false,
+      optType: undefined,
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      codes: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 岗位数据
+      marsOptions: [],
+      //锁柜列表
+      LockCabinetList:[],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      createTime: "",
+      queryParams: {
+        current: 1,
+        size: 10,
+        cardCode: null,
+        cardType: null,
+        userName: null,
+      },
+      hardwareList: [],
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        cabinetCode: [
+          {required: true, message: "锁柜编码不能为空", trigger: "blur"},
+        ],
+        cabinetName: [
+          {required: true, message: "锁柜名称不能为空", trigger: "blur"},
+        ],
+        hardwareId:[
+          {required: true, message: "硬件ID不能为空", trigger: "blur"},
+        ],
+        workstationId:[
+          {required: true, message: "岗位序号不能为空", trigger: "blur"},
+        ]
+      },
+      // 新增状态
+      EditId: 0, //修改判断
+    };
+  },
+  created() {
+    this.getList();
+    this.getOtherList()
+  },
+  methods: {
+    //自动生成编码
+    handleAutoGenChange(autoGenFlag) {
+      if (autoGenFlag) {
+        genCode("CABINET_CODE").then((response) => {
+          this.form.cabinetCode = response;
+          //  console.log(response, this.form.cardCode, "cardCode");
+        });
+      } else {
+        this.form.cabinetCode = null;
+      }
+    },
+    lookDetail(row) {
+      this.$router.push({
+        path:'/mes/hw/lockCabinet/LookDetail',
+        query:{
+          cabinetId:row.cabinetId,
+        }
+      })
+    },
+    /** 查询设备维修单列表 */
+
+    getList() {
+      this.loading = true;
+
+      // 工卡数据
+      getIsLockCabinetPage(this.queryParams).then((response) => {
+        this.LockCabinetList = response.data.records;
+        this.total = response.data.total;
+        this.loading = false;
+      });
+    },
+    getOtherList() {
+      const data = {
+        current: 1,
+        size: -1
+      }
+      // 硬件Id
+      listHardware(data).then(res => {
+        console.log(res,'硬件');
+        this.hardwareList = res.data.records.map((item) => {
+          return {
+            value: item.id,
+            label: item.hardwareName,
+          }
+        })
+      })
+      // 岗位Id
+      listMarsDept(data).then(res => {
+        console.log(res);
+        this.marsOptions = this.handleTree(
+          res.data.records,
+          "workstationId",
+          "parentId"
+        );
+      })
+
+    },
+    /** 转换mars岗位数据结构 */
+    Marsnormalizer(node) {
+      if (node.children && !node.children.length) {
+        delete node.children;
+      }
+      return {
+        id: node.workstationId,
+        label: node.workstationName,
+        children: node.children,
+      };
+    },
+    handleSelectHardware(value) {
+      this.form.hardwareId = value
+    },
+    handleSelectWorkstation(value) {
+      this.form.workstationId = value
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        cabinetCode: null,
+        cabinetIcon: null,
+        cabinetName: null,
+        cabinetPicture: null,
+        hardwareId: null,
+        isOnline: null,
+        status: null,
+        remark: null,
+        workstationId: null,
+      };
+
+      this.autoGenFlag = false;
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.current = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.queryParams.cardCode = "";
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.cabinetId);
+      this.codes = selection.map((item) => item.cabinetCode);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length;
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.EditId = null;
+      this.title = "添加工卡信息";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      this.EditId = row.cabinetId || this.ids;
+      selectIsLockCabinetById(this.EditId).then((response) => {
+        console.log(response, "response");
+        this.form = response.data;
+
+        this.open = true;
+        this.title = "编辑工卡信息";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          if (this.EditId != null) {
+            updateIsLockCabinet(this.form).then((response) => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            insertIsLockCabinet(this.form).then((response) => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.EditId = null;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    //图片上传成功
+    handleImgUplaoded(imgUrl) {
+      console.log(imgUrl);
+      this.form.cabinetIcon = imgUrl[0].url;
+    },
+    //图片移除
+    handleImgRemoved(imgUrl) {
+      console.log(imgUrl);
+      this.form.cabinetIcon = null;
+    },
+    handleImgUplaoded1(imgUrl) {
+      console.log(imgUrl);
+      this.form.cabinetPicture = imgUrl[0].url;
+    },
+    //图片移除
+    handleImgRemoved1(imgUrl) {
+      console.log(imgUrl);
+      this.form.cabinetPicture = null;
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const repairIds = row.cabinetId || this.ids;
+      const repairCodes = row.cabinetCode || this.codes;
+      this.$modal
+        .confirm('是否确认删除所选数据项?')
+        .then(function () {
+          return deleteIsLockCabinetByCabinetIds(repairIds);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {
+        });
+    },
+  },
+};
+</script>
+<style scoped lang="scss">
+.imgstatus {
+  position: relative;
+  top: 1px;
+  left: 0px;
+}
+//图片放大
+.img-box {
+  width: 50px;
+  height: 50px;
+  position: relative;
+
+  #eyeicon {
+    display: none;
+  }
+}
+
+.img-box:hover {
+  background: #000;
+
+  .images {
+    opacity: 0.6;
+  }
+
+  #eyeicon {
+    display: block;
+    position: absolute;
+    top: 40%;
+    left: 30%;
+    z-index: 100;
+    color: white;
+    pointer-events: none;
+  }
+}
+
+</style>

+ 47 - 0
src/views/mes/hw/lockCabinet/lookDetail.vue

@@ -0,0 +1,47 @@
+<template>
+  <div>
+    <el-radio-group v-model="tabPosition" style="margin: 5px">
+      <el-radio-button label="first">锁柜视图</el-radio-button>
+      <el-radio-button label="second">列表视图</el-radio-button>
+    </el-radio-group>
+    <component :is="currentComponent" :cabinetId="this.cabinetId"/>
+  </div>
+
+</template>
+
+<script>
+
+import lookList from "./lookList"
+import MapData from "./MapData"
+
+export default {
+  name: '',
+  components: {
+    lookList,
+    MapData
+  },
+  data() {
+    return {
+      tabPosition: 'first',
+      cabinetId:null,
+    }
+  },
+  computed: {
+    currentComponent() {
+      const components = {
+        first: 'MapData',
+        second: 'lookList',
+      }
+      return components[this.tabPosition]
+    }
+  },
+  mounted() {
+    this.cabinetId = this.$route.query.cabinetId;
+    console.log(this.cabinetId,'this.cabinetId');
+  },
+  methods: {}
+}
+</script>
+
+<style scoped>
+</style>

+ 576 - 0
src/views/mes/hw/lockCabinet/lookList.vue

@@ -0,0 +1,576 @@
+<template>
+  <div class="app-container">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="100px"
+    >
+      <el-row>
+        <el-form-item label="仓位编码" prop="slotCode">
+          <el-input
+            v-model="queryParams.slotCode"
+            placeholder="请输入仓位编码"
+            clearable
+            @keyup.enter.native="handleQuery"
+          />
+        </el-form-item>
+
+        <el-form-item label="仓位类型" prop="slotType">
+          <el-select
+            v-model="queryParams.slotType"
+            placeholder="请选择仓位类型"
+            clearable
+          >
+            <el-option
+              v-for="dict in dict.type.slot_type"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-select
+            v-model="queryParams.status"
+            placeholder="请选择状态"
+            clearable
+          >
+            <el-option
+              v-for="dict in dict.type.slot_status"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
+
+        <el-form-item style="margin-left: 20px">
+          <el-button
+            v-no-more-click
+            type="primary"
+            icon="el-icon-search"
+            size="mini"
+            @click="handleQuery"
+          >搜索
+          </el-button>
+          <el-button
+            v-no-more-click
+            icon="el-icon-refresh"
+            size="mini"
+            @click="resetQuery"
+          >重置
+          </el-button>
+        </el-form-item>
+      </el-row>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          v-no-more-click
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['mes:hw:work:add']"
+        >新增
+        </el-button>
+      </el-col>
+
+      <el-col :span="1.5">
+        <el-button
+          v-no-more-click
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['mes:hw:work:batchremove']"
+        >批量删除
+        </el-button>
+      </el-col>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
+    </el-row>
+
+    <el-table
+      v-loading="loading"
+      :data="SlotsList"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" align="center"/>
+      <el-table-column
+        label="仓位编码"
+        width="150px"
+        align="center"
+        prop="slotCode"
+      />
+      <el-table-column label="仓位类型" align="center" prop="slotType">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.slot_type" :value="scope.row.slotType"/>
+        </template>
+      </el-table-column>
+
+      <el-table-column label="行" align="center" prop="row">
+
+      </el-table-column>
+      <el-table-column label="列" align="center" prop="col">
+
+      </el-table-column>
+      <el-table-column label="是否被占用" align="center" prop="isOccupied">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.isOccupied_status" :value="scope.row.isOccupied"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="占用仓位的硬件ID" align="center" prop="hardwareId"></el-table-column>
+      <el-table-column label="状态" align="center" prop="status">
+        <template slot-scope="scope">
+          <el-switch
+            style="pointer-events: none;"
+            v-if="scope.row.status!==null"
+            v-model="scope.row.status"
+            active-value="0"
+            inactive-value="1"
+            active-color="#13ce66"
+            inactive-color="grey"
+          ></el-switch>
+          <span v-else>-</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime"></el-table-column>
+
+      <el-table-column
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+        fixed="right"
+      >
+        <template slot-scope="scope">
+          <el-button
+            v-no-more-click
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['mes:hw:work:edit']"
+          >编辑
+          </el-button>
+          <el-button
+            v-no-more-click
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['mes:hw:work:remove']"
+          >删除
+          </el-button>
+          <!--          <el-button v-no-more-click size="mini" type="text">预览</el-button>-->
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.current"
+      :limit.sync="queryParams.size"
+      @pagination="getList"
+    />
+    <!-- 添加或修改设备维修单对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+        <el-form-item label="锁柜序号" prop="cabinetId" style="width: 380px">
+          <el-select v-model="form.cabinetId">
+            <el-option v-for="dict in this.LockCabinetList" :value="dict.value" :label="dict.label"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-row>
+          <el-col :span="15">
+            <el-form-item label="仓位编号" prop="slotCode">
+              <el-input
+                v-model="form.slotCode"
+                placeholder="请输入仓位编号"
+                style="width: 100%"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label-width="80">
+              <el-switch
+                v-model="autoGenFlag"
+                active-color="#13ce66"
+                active-text="自动生成"
+                @change="handleAutoGenChange(autoGenFlag)"
+              >
+              </el-switch>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-form-item label="仓位类型" prop="slotType">
+          <el-select v-model="form.slotType">
+            <el-option v-for="dict in dict.type.slot_type" :value="dict.value" :label="dict.label"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="行" prop="row" style="width: 340px">
+          <el-input
+            v-model="form.row"
+            placeholder="请输入行"
+
+          />
+        </el-form-item>
+        <el-form-item label="列" prop="col" style="width: 340px">
+          <el-input
+            v-model="form.col"
+            placeholder="请输入列"
+          />
+        </el-form-item>
+        <el-form-item label="是否被占用" prop="isOccupied">
+          <el-radio-group v-model="form.isOccupied">
+            <el-radio
+              v-for="dict in dict.type.isOccupied_status"
+              :key="dict.value"
+              :label="dict.value"
+            >{{ dict.label }}
+            </el-radio>
+          </el-radio-group>
+        </el-form-item>
+<!--        <el-form-item label="占用仓位的硬件" prop="hardwareId" style="width: 380px" v-if="form.isOccupied=='1'">-->
+<!--          <el-select-->
+<!--            v-model="form.hardwareId"-->
+<!--            placeholder="请选择硬件ID"-->
+<!--            clearable-->
+<!--            style="width: 100%"-->
+<!--            @change="handleSelectHardware"-->
+<!--          >-->
+<!--            <el-option-->
+<!--              v-for="dict in this.hardwareList"-->
+<!--              :key="dict.value"-->
+<!--              :label="dict.label"-->
+<!--              :value="dict.value"-->
+<!--            />-->
+<!--          </el-select>-->
+<!--        </el-form-item>-->
+        <el-form-item label="状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in dict.type.slot_status"
+              :key="dict.value"
+              :label="dict.value"
+            >{{ dict.label }}
+            </el-radio>
+          </el-radio-group>
+        </el-form-item>
+
+        <el-form-item label="备注" prop="remark" style="width: 340px">
+          <el-input v-model="form.remark" placeholder="请输入备注"/>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button v-no-more-click type="primary" @click="submitForm"
+        >确 定
+        </el-button
+        >
+        <el-button v-no-more-click @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+
+import {listHardware} from "@/api/mes/hw/hardwareinfo";
+import {genCode} from "@/api/system/autocode/rule";
+import {listMarsDept} from "@/api/system/marsdept";
+import {
+  deleteIsLockCabinetByCabinetIds,
+  getIsLockCabinetPage,
+  insertIsLockCabinet,
+  selectIsLockCabinetById,
+  updateIsLockCabinet
+} from "@/api/mes/lockcabinet";
+
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+import Template from "@/views/print/printtemplate/list.vue";
+import {
+  deleteIsLockCabinetSlotsBySlotIds,
+  getIsLockCabinetSlotsPage,
+  insertIsLockCabinetSlots, selectIsLockCabinetSlotsById, updateIsLockCabinetSlots
+} from "@/api/mes/lockcabinet/slots";
+
+export default {
+  name: "lock",
+  components: {Template, Treeselect},
+  dicts: ['isOccupied_status', 'slot_type', 'slot_status'],
+  data() {
+    return {
+      autoGenFlag: false,
+      optType: undefined,
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      codes: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 岗位数据
+      marsOptions: [],
+      // 仓位列表
+      SlotsList:[],
+      //锁柜列表
+      LockCabinetList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      createTime: "",
+      queryParams: {
+        current: 1,
+        size: 10,
+        slotCode: null,
+        slotType: null,
+        status: null,
+      },
+      hardwareList: [],
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        cabinetCode: [
+          {required: true, message: "锁柜编码不能为空", trigger: "blur"},
+        ],
+        cabinetName: [
+          {required: true, message: "锁柜名称不能为空", trigger: "blur"},
+        ],
+        hardwareId: [
+          {required: true, message: "硬件ID不能为空", trigger: "blur"},
+        ],
+        workstationId: [
+          {required: true, message: "岗位序号不能为空", trigger: "blur"},
+        ]
+      },
+      // 新增状态
+      EditId: 0, //修改判断
+    };
+  },
+  created() {
+    this.getList();
+    this.getOtherList()
+  },
+  methods: {
+    //自动生成编码
+    handleAutoGenChange(autoGenFlag) {
+      if (autoGenFlag) {
+        genCode("CABINET_CODE").then((response) => {
+          this.form.slotCode = response;
+          //  console.log(response, this.form.cardCode, "cardCode");
+        });
+      } else {
+        this.form.slotCode = null;
+      }
+    },
+
+    /** 查询设备维修单列表 */
+
+    getList() {
+      this.loading = true;
+      // 仓位列表
+      getIsLockCabinetSlotsPage(this.queryParams).then((response) => {
+        this.SlotsList = response.data.records;
+        this.total = response.data.total;
+        this.loading = false;
+      });
+
+    },
+    getOtherList() {
+      const data = {
+        current: 1,
+        size: -1
+      }
+      // 锁柜列表
+      getIsLockCabinetPage(data).then((response) => {
+        this.LockCabinetList = response.data.records.map((record) => {
+          return {
+            value: record.cabinetId,
+            label: record.cabinetName,
+          }
+        });
+      });
+      // 硬件Id
+      listHardware(data).then(res => {
+        console.log(res, '硬件');
+        this.hardwareList = res.data.records.map((item) => {
+          return {
+            value: item.id,
+            label: item.hardwareName,
+          }
+        })
+      })
+      // 岗位Id
+      listMarsDept(data).then(res => {
+        console.log(res);
+        this.marsOptions = this.handleTree(
+          res.data.records,
+          "workstationId",
+          "parentId"
+        );
+      })
+
+    },
+
+    handleSelectHardware(value) {
+      this.form.hardwareId = value
+    },
+
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        slotCode: null,
+        slotType: null,
+        occupiedBy: null,
+        isOccupied: null,
+        col: null,
+        cabinetId: null,
+        status: null,
+        row: null,
+        remark: null,
+      };
+
+      this.autoGenFlag = false;
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.current = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.queryParams.slotCode = "";
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.slotId);
+      this.codes = selection.map((item) => item.slotCode);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length;
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.EditId = null;
+      this.title = "添加仓位数据信息";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      this.EditId = row.slotId || this.ids;
+      selectIsLockCabinetSlotsById(this.EditId).then((response) => {
+        console.log(response, "response");
+        this.form = response.data;
+
+        this.open = true;
+        this.title = "编辑仓位数据信息";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          if (this.EditId != null) {
+            updateIsLockCabinetSlots(this.form).then((response) => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            insertIsLockCabinetSlots(this.form).then((response) => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.EditId = null;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const repairIds = row.slotId || this.ids;
+      const repairCodes = row.slotCode || this.codes;
+      this.$modal
+        .confirm('是否确认删除所选数据项?')
+        .then(function () {
+          return deleteIsLockCabinetSlotsBySlotIds(repairIds);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {
+        });
+    },
+  },
+};
+</script>
+<style scoped lang="scss">
+.imgstatus {
+  position: relative;
+  top: 1px;
+  left: 0px;
+}
+
+//图片放大
+.img-box {
+  width: 50px;
+  height: 50px;
+  position: relative;
+
+  #eyeicon {
+    display: none;
+  }
+}
+
+.img-box:hover {
+  background: #000;
+
+  .images {
+    opacity: 0.6;
+  }
+
+  #eyeicon {
+    display: block;
+    position: absolute;
+    top: 40%;
+    left: 30%;
+    z-index: 100;
+    color: white;
+    pointer-events: none;
+  }
+}
+
+</style>

+ 81 - 37
src/views/mes/hw/padLocks/index.vue

@@ -34,14 +34,14 @@
             icon="el-icon-search"
             size="mini"
             @click="handleQuery"
-            >搜索
+          >搜索
           </el-button>
           <el-button
             v-no-more-click
             icon="el-icon-refresh"
             size="mini"
             @click="resetQuery"
-            >重置
+          >重置
           </el-button>
         </el-form-item>
       </el-row>
@@ -57,7 +57,7 @@
           size="mini"
           @click="handleAdd"
           v-hasPermi="['mes:hw:plk:add']"
-          >新增
+        >新增
         </el-button>
       </el-col>
 
@@ -71,7 +71,7 @@
           :disabled="multiple"
           @click="handleDelete"
           v-hasPermi="['mes:hw:plk:batchremove']"
-          >批量删除
+        >批量删除
         </el-button>
       </el-col>
       <right-toolbar
@@ -85,7 +85,7 @@
       :data="repairList"
       @selection-change="handleSelectionChange"
     >
-      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column type="selection" width="55" align="center"/>
       <el-table-column
         label="挂锁编码"
         width="150px"
@@ -106,9 +106,29 @@
         :show-overflow-tooltip="true"
       />
 
-      <el-table-column label="所属硬件" align="center" prop="hardwareName" />
-      <el-table-column label="挂锁类型" align="center" prop="lockTypeName" />
-      <el-table-column label="挂锁型号" align="center" prop="lockSpec" />
+      <el-table-column label="所属硬件" align="center" prop="hardwareName"/>
+      <el-table-column label="挂锁类型" align="center" prop="lockTypeName"/>
+      <el-table-column label="挂锁型号" align="center" prop="lockSpec"/>
+      <el-table-column label="状态" align="center" prop="exStatus">
+        <template slot-scope="scope">
+          <el-switch
+            style="pointer-events: none;"
+            v-if="scope.row.exStatus!==null"
+            v-model="scope.row.exStatus"
+            active-value="1"
+            inactive-value="0"
+            active-color="#13ce66"
+            inactive-color="grey"
+          ></el-switch>
+          <span v-else>-</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="原因" align="center" prop="exRemark">
+        <template slot-scope="scope">
+          <dict-tag v-if="scope.row.exRemark" :options="dict.type.padlock_reason" :value="scope.row.exRemark"/>
+          <span v-else>-</span>
+        </template>
+      </el-table-column>
       <el-table-column
         label="创建时间"
         align="center"
@@ -134,7 +154,7 @@
             icon="el-icon-edit"
             @click="handleUpdate(scope.row)"
             v-hasPermi="['mes:hw:plk:edit']"
-            >编辑
+          >编辑
           </el-button>
           <el-button
             v-no-more-click
@@ -143,7 +163,7 @@
             icon="el-icon-delete"
             @click="handleDelete(scope.row)"
             v-hasPermi="['mes:hw:plk:remove']"
-            >删除
+          >删除
           </el-button>
           <!--          <el-button v-no-more-click size="mini" type="text">预览</el-button>-->
         </template>
@@ -208,7 +228,7 @@
         </el-row>
 
         <el-form-item label="挂锁名称" prop="lockName">
-          <el-input v-model="form.lockName" placeholder="请输入挂锁名称" />
+          <el-input v-model="form.lockName" placeholder="请输入挂锁名称"/>
         </el-form-item>
         <el-form-item label="挂锁NFC" prop="lockNfc">
           <el-input
@@ -223,13 +243,35 @@
 
           />
         </el-form-item>
+        <el-form-item label="状态" prop="exStatus">
+          <el-radio-group v-model="form.exStatus">
+            <el-radio
+              v-for="dict in dict.type.padlock_status"
+              :key="dict.value"
+              :label="dict.value"
+            >{{ dict.label }}
+            </el-radio
+            >
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="原因" prop="exRemark" >
+          <el-select v-model="form.exRemark">
+            <el-option
+              v-for="dict in dict.type.padlock_reason"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
         <el-form-item label="备注" prop="remark">
-          <el-input v-model="form.remark" placeholder="请输入备注" />
+          <el-input v-model="form.remark" placeholder="请输入备注"/>
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button v-no-more-click type="primary" @click="submitForm"
-          >确 定</el-button
+        >确 定
+        </el-button
         >
         <el-button v-no-more-click @click="cancel">取 消</el-button>
       </div>
@@ -245,17 +287,18 @@ import {
   delPadLockAPI,
   getPadLockInfoAPI,
 } from "@/api/mes/padLocks/padLocks";
-import { listHardware } from "@/api/mes/hw/hardwareinfo";
-import { listPadLockTypeAPI } from "@/api/mes/padLockType/padLockType";
-import { genCode } from "@/api/system/autocode/rule";
+import {listHardware} from "@/api/mes/hw/hardwareinfo";
+import {listPadLockTypeAPI} from "@/api/mes/padLockType/padLockType";
+import {genCode} from "@/api/system/autocode/rule";
 import Treeselect from "@riophae/vue-treeselect";
 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+import Template from "@/views/print/printtemplate/list.vue";
 // import { listHanrwareType } from "@/api/mes/hw/hadrwareType";
 
 export default {
   name: "lock",
-  dicts: ["hardware_status"],
-  components: { Treeselect },
+  dicts: ["hardware_status", 'padlock_status', 'padlock_reason'],
+  components: {Template, Treeselect},
   data() {
     return {
       autoGenFlag: false,
@@ -303,13 +346,13 @@ export default {
       // 表单校验
       rules: {
         lockCode: [
-          { required: true, message: "挂锁编码不能为空", trigger: "blur" },
+          {required: true, message: "挂锁编码不能为空", trigger: "blur"},
         ],
         lockName: [
-          { required: true, message: "挂锁名称不能为空", trigger: "blur" },
+          {required: true, message: "挂锁名称不能为空", trigger: "blur"},
         ],
         lockNfc: [
-          { required: true, message: "挂锁NFC不能为空", trigger: "blur" },
+          {required: true, message: "挂锁NFC不能为空", trigger: "blur"},
         ],
       },
       // 日期选择
@@ -543,7 +586,8 @@ export default {
           this.getList();
           this.$modal.msgSuccess("删除成功");
         })
-        .catch(() => {});
+        .catch(() => {
+        });
     },
   },
 };
@@ -556,23 +600,23 @@ export default {
 }
 
 /deep/ .el-radio__inner {
-  border-radius: 2px;
+  //border-radius: 2px;
 }
 
 /deep/ .el-radio__input.is-checked .el-radio__inner::after {
-  content: "";
-  width: 8px;
-  height: 3px;
-  border: 1px solid white;
-  border-top: transparent;
-  border-right: transparent;
-  text-align: center;
-  display: block;
-  position: absolute;
-  top: 3px;
-  left: 2px;
-  transform: rotate(-45deg);
-  border-radius: 0pc;
-  background: none;
+  //content: "";
+  //width: 8px;
+  //height: 3px;
+  //border: 1px solid white;
+  //border-top: transparent;
+  //border-right: transparent;
+  //text-align: center;
+  //display: block;
+  //position: absolute;
+  //top: 3px;
+  //left: 2px;
+  //transform: rotate(-45deg);
+  //border-radius: 0pc;
+  //background: none;
 }
 </style>

+ 533 - 0
src/views/mes/hw/rfid/index.vue

@@ -0,0 +1,533 @@
+<template>
+  <div class="app-container">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="100px"
+    >
+      <el-row>
+        <el-form-item label="RFID编码" prop="rfidCode">
+          <el-input
+            v-model="queryParams.rfidCode"
+            placeholder="请输入RFID编码"
+            clearable
+            @keyup.enter.native="handleQuery"
+          />
+        </el-form-item>
+        <el-form-item label="RFID内容" prop="rfid">
+          <el-input
+            v-model="queryParams.rfid"
+            placeholder="请输入锁柜名称"
+            clearable
+            @keyup.enter.native="handleQuery"
+          />
+        </el-form-item>
+
+        <el-form-item label="RFID类型" prop="rfidType">
+          <el-select
+            v-model="queryParams.rfidType"
+            placeholder="请选择RFID类型"
+            clearable
+          >
+            <el-option
+              v-for="dict in dict.type.rfid_token_type"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-select
+            v-model="queryParams.status"
+            placeholder="请选择状态"
+            clearable
+          >
+            <el-option
+              v-for="dict in dict.type.rfid_token_status"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
+
+        <el-form-item style="margin-left: 20px">
+          <el-button
+            v-no-more-click
+            type="primary"
+            icon="el-icon-search"
+            size="mini"
+            @click="handleQuery"
+          >搜索
+          </el-button>
+          <el-button
+            v-no-more-click
+            icon="el-icon-refresh"
+            size="mini"
+            @click="resetQuery"
+          >重置
+          </el-button>
+        </el-form-item>
+      </el-row>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          v-no-more-click
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['mes:hw:work:add']"
+        >新增
+        </el-button>
+      </el-col>
+
+      <el-col :span="1.5">
+        <el-button
+          v-no-more-click
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['mes:hw:work:batchremove']"
+        >批量删除
+        </el-button>
+      </el-col>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
+    </el-row>
+
+    <el-table
+      v-loading="loading"
+      :data="LockCabinetList"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" align="center"/>
+      <el-table-column
+        label="RIFID编码"
+        width="150px"
+        align="center"
+        prop="rfidCode"
+      />
+      <el-table-column label="RFID内容" align="center" prop="rfid"/>
+      <el-table-column label="RFID类型" align="center" prop="rfidType">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.rfid_token_type" :value="scope.row.rfidType"/>
+        </template>
+      </el-table-column>
+<!--      <el-table-column label="硬件ID" align="center" prop="hardwareId">-->
+
+<!--      </el-table-column>-->
+
+      <el-table-column label="状态" align="center" prop="status">
+        <template slot-scope="scope">
+          <el-switch
+            style="pointer-events: none;"
+            v-if="scope.row.status!==null"
+            v-model="scope.row.status"
+            active-value="1"
+            inactive-value="0"
+            active-color="#13ce66"
+            inactive-color="grey"
+          ></el-switch>
+          <span v-else>-</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remark"></el-table-column>
+
+      <el-table-column label="创建时间" align="center" prop="createTime"></el-table-column>
+
+      <el-table-column
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+        fixed="right"
+      >
+        <template slot-scope="scope">
+          <el-button
+            v-no-more-click
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['mes:hw:work:edit']"
+          >编辑
+          </el-button>
+          <el-button
+            v-no-more-click
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['mes:hw:work:remove']"
+          >删除
+          </el-button>
+          <!--          <el-button v-no-more-click size="mini" type="text">预览</el-button>-->
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.current"
+      :limit.sync="queryParams.size"
+      @pagination="getList"
+    />
+    <!-- 添加或修改设备维修单对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="650px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+        <el-row>
+          <el-col :span="15">
+            <el-form-item label="RFID编码" prop="rfidCode">
+              <el-input
+                v-model="form.rfidCode"
+                placeholder="请输入RFID编码"
+                style="width: 100%"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label-width="80">
+              <el-switch
+                v-model="autoGenFlag"
+                active-color="#13ce66"
+                active-text="自动生成"
+                @change="handleAutoGenChange(autoGenFlag)"
+              >
+              </el-switch>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-form-item label="RFID内容" prop="rfid" style="width: 380px">
+          <el-input
+            v-model="form.rfid"
+            placeholder="请输入RFID内容"
+          />
+        </el-form-item>
+
+
+        <el-form-item label="RFID类型" prop="rfidType" style="width: 380px">
+          <el-select
+            v-model="form.rfidType"
+            placeholder="请选择RFID类型"
+            clearable
+            style="width: 100%"
+            @change="handleSelectHardware"
+          >
+            <el-option
+              v-for="dict in dict.type.rfid_token_type"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
+<!--        <el-form-item label="硬件ID" prop="hardwareId" style="width: 380px">-->
+<!--          <el-select-->
+<!--            v-model="form.hardwareId"-->
+<!--            placeholder="请选择硬件ID"-->
+<!--            clearable-->
+<!--            style="width: 100%"-->
+<!--            @change="handleSelectHardware"-->
+<!--          >-->
+<!--            <el-option-->
+<!--              v-for="dict in this.hardwareList"-->
+<!--              :key="dict.value"-->
+<!--              :label="dict.label"-->
+<!--              :value="dict.value"-->
+<!--            />-->
+<!--          </el-select>-->
+<!--        </el-form-item>-->
+        <el-form-item label="状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in dict.type.rfid_token_status"
+              :key="dict.value"
+              :label="dict.value"
+            >{{ dict.label }}
+            </el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="备注" prop="remark" style="width: 380px">
+          <el-input v-model="form.remark" placeholder="请输入备注"/>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button v-no-more-click type="primary" @click="submitForm"
+        >确 定
+        </el-button
+        >
+        <el-button v-no-more-click @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+
+import {listHardware} from "@/api/mes/hw/hardwareinfo";
+import {genCode} from "@/api/system/autocode/rule";
+
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+import Template from "@/views/print/printtemplate/list.vue";
+import {
+  deleteIsRfidTokenByRfidIds,
+  getIsRfidTokenPage,
+  insertIsRfidToken,
+  selectIsRfidTokenById,
+  updateIsRfidToken
+} from "@/api/mes/rfid_token";
+
+export default {
+  name: "lock",
+  components: {Template, Treeselect},
+  dicts: ["card_type", 'rfid_token_status', 'rfid_token_type'],
+  data() {
+    return {
+      autoGenFlag: false,
+      optType: undefined,
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      codes: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 岗位数据
+      marsOptions: [],
+      //锁柜列表
+      LockCabinetList:[],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      createTime: "",
+      queryParams: {
+        current: 1,
+        size: 10,
+        rfid: null,
+        rfidType: null,
+        rfidCode: null,
+      },
+      hardwareList: [],
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        rfidCode: [
+          {required: true, message: "RFID编码不能为空", trigger: "blur"},
+        ],
+        rfid: [
+          {required: true, message: "RFID内容不能为空", trigger: "blur"},
+        ],
+        rfidType:[
+          {required: true, message: "RFID类型不能为空", trigger: "blur"},
+        ],
+       /* hardwareId:[
+          {required: true, message: "硬件ID不能为空", trigger: "blur"},
+        ]*/
+      },
+      // 新增状态
+      EditId: 0, //修改判断
+    };
+  },
+  created() {
+    this.getList();
+    this.getOtherList()
+  },
+  methods: {
+    //自动生成编码
+    handleAutoGenChange(autoGenFlag) {
+      if (autoGenFlag) {
+        genCode("RFID_CODE").then((response) => {
+          this.form.rfidCode = response;
+          //  console.log(response, this.form.cardCode, "cardCode");
+        });
+      } else {
+        this.form.rfidCode = null;
+      }
+    },
+
+    /** 查询设备维修单列表 */
+    getList() {
+      this.loading = true;
+      // 工卡数据
+      getIsRfidTokenPage(this.queryParams).then((response) => {
+        this.LockCabinetList = response.data.records;
+        this.total = response.data.total;
+        this.loading = false;
+      });
+    },
+    getOtherList() {
+      const data = {
+        current: 1,
+        size: -1
+      }
+      // 硬件Id
+      listHardware(data).then(res => {
+        console.log(res,'硬件');
+        this.hardwareList = res.data.records.map((item) => {
+          return {
+            value: item.id,
+            label: item.hardwareName,
+          }
+        })
+      })
+    },
+
+    handleSelectHardware(value) {
+      this.form.hardwareId = value
+    },
+
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        rfid: null,
+        rfidCode: null,
+        rfidType: null,
+        status: null,
+        hardwareId: null,
+      };
+
+      this.autoGenFlag = false;
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.current = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.queryParams.cardCode = "";
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.rfidId);
+      this.codes = selection.map((item) => item.rfidCode);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length;
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.EditId = null;
+      this.title = "添加工卡信息";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      this.EditId = row.rfidId || this.ids;
+      selectIsRfidTokenById(this.EditId).then((response) => {
+        console.log(response, "response");
+        this.form = response.data;
+
+        this.open = true;
+        this.title = "编辑工卡信息";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          if (this.EditId != null) {
+            updateIsRfidToken(this.form).then((response) => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            insertIsRfidToken(this.form).then((response) => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.EditId = null;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const repairIds = row.rfidId || this.ids;
+      const repairCodes = row.rfidCode || this.codes;
+      this.$modal
+        .confirm('是否确认删除所选数据项?')
+        .then(function () {
+          return deleteIsRfidTokenByRfidIds(repairIds);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {
+        });
+    },
+  },
+};
+</script>
+<style scoped lang="scss">
+.imgstatus {
+  position: relative;
+  top: 1px;
+  left: 0px;
+}
+//图片放大
+.img-box {
+  width: 50px;
+  height: 50px;
+  position: relative;
+
+  #eyeicon {
+    display: none;
+  }
+}
+
+.img-box:hover {
+  background: #000;
+
+  .images {
+    opacity: 0.6;
+  }
+
+  #eyeicon {
+    display: block;
+    position: absolute;
+    top: 40%;
+    left: 30%;
+    z-index: 100;
+    color: white;
+    pointer-events: none;
+  }
+}
+
+</style>

+ 62 - 21
src/views/mes/hw/workCard/index.vue

@@ -135,7 +135,26 @@
         :show-overflow-tooltip="true"
       />
       <el-table-column label="用户名称" align="center" prop="userName" />
-
+      <el-table-column label="状态" align="center" prop="exStatus">
+        <template slot-scope="scope">
+          <el-switch
+            style="pointer-events: none;"
+            v-if="scope.row.exStatus!==null"
+            v-model="scope.row.exStatus"
+            active-value="1"
+            inactive-value="0"
+            active-color="#13ce66"
+            inactive-color="grey"
+          ></el-switch>
+          <span v-else>-</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="原因" align="center" prop="exRemark">
+        <template slot-scope="scope">
+          <dict-tag v-if="scope.row.exRemark" :options="dict.type.job_card_reason" :value="scope.row.exRemark"/>
+          <span v-else>-</span>
+        </template>
+      </el-table-column>
       <el-table-column
         label="操作"
         align="center"
@@ -177,7 +196,7 @@
     <!-- 添加或修改设备维修单对话框 -->
     <el-dialog :title="title" :visible.sync="open" width="450px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="120px">
-        <el-form-item label="用户名称" prop="userId">
+        <el-form-item label="用户名称" prop="userId" style="width: 340px">
           <el-select
             v-model="form.userId"
             placeholder="请选择工卡用户"
@@ -215,7 +234,7 @@
             </el-form-item>
           </el-col>
         </el-row>
-        <el-form-item label="工卡NFC" prop="cardNfc">
+        <el-form-item label="工卡NFC" prop="cardNfc" style="width: 340px">
           <el-input
             v-model="form.cardNfc"
             placeholder="请输入工卡Nfc"
@@ -236,8 +255,28 @@
             />
           </el-select>
         </el-form-item>
-
-        <el-form-item label="备注" prop="remark">
+        <el-form-item label="状态" prop="exStatus">
+          <el-radio-group v-model="form.exStatus">
+            <el-radio
+              v-for="dict in dict.type.job_card_status"
+              :key="dict.value"
+              :label="dict.value"
+            >{{ dict.label }}
+            </el-radio
+            >
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="原因" prop="exRemark" >
+          <el-select v-model="form.exRemark">
+            <el-option
+              v-for="dict in dict.type.job_card_reason"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="备注" prop="remark" style="width: 340px">
           <el-input v-model="form.remark" placeholder="请输入备注" />
         </el-form-item>
       </el-form>
@@ -262,10 +301,12 @@ import {
 } from "@/api/mes/workCard/index";
 import { listHardware } from "@/api/mes/hw/hardwareinfo";
 import { genCode } from "@/api/system/autocode/rule";
+import Template from "@/views/print/printtemplate/list.vue";
 
 export default {
   name: "lock",
-  dicts: ["card_type"],
+  components: {Template},
+  dicts: ["card_type",'job_card_reason','job_card_status'],
   data() {
     return {
       autoGenFlag: false,
@@ -492,23 +533,23 @@ export default {
 }
 
 /deep/ .el-radio__inner {
-  border-radius: 2px;
+  //border-radius: 2px;
 }
 
 /deep/ .el-radio__input.is-checked .el-radio__inner::after {
-  content: "";
-  width: 8px;
-  height: 3px;
-  border: 1px solid white;
-  border-top: transparent;
-  border-right: transparent;
-  text-align: center;
-  display: block;
-  position: absolute;
-  top: 3px;
-  left: 2px;
-  transform: rotate(-45deg);
-  border-radius: 0pc;
-  background: none;
+  //content: "";
+  //width: 8px;
+  //height: 3px;
+  //border: 1px solid white;
+  //border-top: transparent;
+  //border-right: transparent;
+  //text-align: center;
+  //display: block;
+  //position: absolute;
+  //top: 3px;
+  //left: 2px;
+  //transform: rotate(-45deg);
+  //border-radius: 0pc;
+  //background: none;
 }
 </style>

+ 31 - 10
src/views/mes/job/jobplay/jobPlayDetail.vue

@@ -216,6 +216,7 @@
 <script>
 import { getJobPlayTicketInfo } from '@/api/mes/jobplay/jobplay'
 import { connectWebsocket, closeWebsocket, sendMsg } from '@/utils/websocket'
+import { getIsSystemAttributeByKey, selectIsSystemAttributeById } from '@/api/system/configuration'
 
 export default {
   name: 'jobPlayDetail',
@@ -251,7 +252,8 @@ export default {
         { index: '2020-8-19 13:20:30', content: '还得写前端。。。。。', date: '2018/5/9' }
       ],
 
-      isFetching: false // 标志位,控制接口请求是否已经执行过
+      isFetching: false, // 标志位,控制接口请求是否已经执行过
+      websocketAddress:null,//websocket访问地址
     }
   },
   watch: {
@@ -303,16 +305,35 @@ export default {
     },
     initWebSocket() {
       const timestep = Date.now()
-      connectWebsocket(`ws://192.168.1.127:9090/websocket/jobTicket/${timestep}`, { w: 'S' }, (res) => {
-          console.log(res, 'websocket接收服务器的数据')
-          const resMsg = res
-          if (resMsg == 'refresh') {
-            this.handleRefresh()
+      const address='sys.websocket.address'
+      // 先获取WebSocket地址,再建立连接
+      getIsSystemAttributeByKey(address).then((res) => {
+        console.log(res, 'websocket地址');
+        this.websocketAddress = res.data.sysAttrValue
+        const isLocalDev = window.location.hostname === 'localhost'
+
+        const baseAddress = isLocalDev
+          ? 'ws://192.168.0.10:9190'
+          : this.websocketAddress;
+
+        // 使用获取到的地址建立WebSocket连接
+        connectWebsocket(
+          `${baseAddress}/websocket/jobTicket/${timestep}`,
+          { w: 'S' },
+          (res) => {
+            console.log(res, 'websocket接收服务器的数据');
+            const resMsg = res;
+            if (resMsg == 'refresh') {
+              this.handleRefresh();
+            }
+          },
+          (err) => {
+            console.log('断开重连');
           }
-        },
-        (err) => {
-          console.log('断开重连')
-        })
+        );
+      }).catch(err => {
+        console.error('获取WebSocket地址失败:', err);
+      });
     },
     handleRefresh() {
       if (this.isFetching) {

+ 2 - 2
vue.config.js

@@ -35,8 +35,8 @@ module.exports = {
     proxy: {
       // detail: https://cli.vuejs.org/config/#devserver-proxy
       [process.env.VUE_APP_BASE_API]: {
-        // http://36.133.174.236:9090  http://192.168.1.127:9090 http://192.168.31.110:9090(动感光波) 192.168.28.97:9090(车总GRKJ)
-        target: `http://192.168.1.121:9190`,
+        // http://36.133.174.236:9090  http://192.168.1.127:9090 http://192.168.31.110:9090(动感光波) 192.168.28.97:9090(车总GRKJ) 120.27.232.27:9190(东上阿里云)
+        target: `http://192.168.0.10:1000`,
         changeOrigin: true,
         pathRewrite: {
           ['^' + process.env.VUE_APP_BASE_API]: ''