wuyouming666
2024-04-01 f42bb93047f0aba68f358968499e1174e67a715a
更新下片逻辑
7个文件已修改
212 ■■■■■ 已修改文件
UI-Project/package-lock.json 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/package.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/UnLoadGlass/Landingindicationtwo.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/mm/identify/identify.vue 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UnLoadGlassModule/src/main/java/com/mes/entity/DownWorkstation.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UnLoadGlassModule/src/main/java/com/mes/mapper/DownWorkstationMapper.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UnLoadGlassModule/src/main/java/com/mes/service/PlcService.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/package-lock.json
@@ -16,6 +16,7 @@
        "pinia": "^2.1.6",
        "pinia-plugin-persistedstate": "^3.2.0",
        "sortablejs": "^1.15.1",
        "sweetalert2": "^11.10.7",
        "vue": "^3.3.4",
        "vue-router": "^4.2.4",
        "vxe-table": "^4.5.15",
@@ -1405,6 +1406,11 @@
        "node": ">=0.8"
      }
    },
    "node_modules/sweetalert2": {
      "version": "11.10.7",
      "resolved": "https://registry.npmmirror.com/sweetalert2/-/sweetalert2-11.10.7.tgz",
      "integrity": "sha512-5Jlzrmaitay6KzU+2+LhYu9q+L4v/dZ8oZyEDH14ep0C/QilCnFLHmqAyD/Lhq/lm5DiwsOs6Tr58iv8k3wyGg=="
    },
    "node_modules/to-fast-properties": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
@@ -2440,6 +2446,11 @@
        "frac": "~1.1.2"
      }
    },
    "sweetalert2": {
      "version": "11.10.7",
      "resolved": "https://registry.npmmirror.com/sweetalert2/-/sweetalert2-11.10.7.tgz",
      "integrity": "sha512-5Jlzrmaitay6KzU+2+LhYu9q+L4v/dZ8oZyEDH14ep0C/QilCnFLHmqAyD/Lhq/lm5DiwsOs6Tr58iv8k3wyGg=="
    },
    "to-fast-properties": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
UI-Project/package.json
@@ -16,6 +16,7 @@
    "pinia": "^2.1.6",
    "pinia-plugin-persistedstate": "^3.2.0",
    "sortablejs": "^1.15.1",
    "sweetalert2": "^11.10.7",
    "vue": "^3.3.4",
    "vue-router": "^4.2.4",
    "vxe-table": "^4.5.15",
UI-Project/src/views/UnLoadGlass/Landingindicationtwo.vue
@@ -29,6 +29,7 @@
</template>
<script>
export default {
  data() {
    return {
UI-Project/src/views/mm/identify/identify.vue
@@ -1,67 +1,107 @@
<template>
  <el-card style="margin-left: 10px;margin-top: 10px;margin-right: 10px;" v-loading="loading">
  <el-card style="margin-left: 10px; margin-top: 10px; margin-right: 10px;" v-loading="loading">
    <div style="display: flex;">
      <div style="margin-left: 400px;font-size: 20px;">工程号:P20240305001 </div>
      <div style="margin-left: 150px;font-size: 20px;">版图编号:1</div>
      <div style="margin-left: 400px; font-size: 20px;">工程号:P20240305001 </div>
      <div style="margin-left: 150px; font-size: 20px;">版图编号:1</div>
    </div>
      <svg width="100%" height="650" xmlns="http://www.w3.org/2000/svg">
        <g stroke="null" id="Layer_1">
          <title stroke="null">Layer 1</title>
          <image x="100" y="50" width="100" xlink:href="${pageContext.request.contextPath}/static/images/log2.png"/>
          <!-- <text stroke="#000" xml:space="preserve" font-family="'Catamaran'" font-size="25" class="font1" y="105" x="740">1号线玻璃落架指导</text> -->
          <!-- 使用 v-for 循环渲染数据 -->
          <g v-for="(rack, index) in racks" :key="index">
            <rect :x="rack.x" :y="rack.y" :width="rack.width" :height="rack.height" :fill="rack.fillColor"/>
            <rect
              :x="calculateItemXPosition(rack, rack.item, index)"
              :y="calculateItemYPosition(rack, rack.item, index)"
              :width="rack.item.width"
              :height="rack.item.height"
              :fill="rack.item.fillColor"
            />
            <!-- <text :x="rack.x" :y="rack.y-10"  text-anchor="middle">{{ index + 1 }}号工位</text> -->
            <!-- <text :x="rack.x" :y="rack.y-30"  text-anchor="middle">{{rack.item.content}}</text> -->
          </g>
          <!-- 其他元素 -->
          <!-- <text id="glass_size" font-size="30px" font-weight="bold" x="100" y="600" text-anchor="middle" alignment-baseline="middle"></text> -->
          <!-- <text id="glass_pos" font-size="30px" font-weight="bold" x="100" y="600" text-anchor="middle" alignment-baseline="middle"></text> -->
    <svg width="100%" height="650" xmlns="http://www.w3.org/2000/svg">
      <g v-for="(rack, index) in racks" :key="index">
        <rect
          :x="rack.x"
          :y="rack.y"
          :width="rack.width"
          :height="rack.height"
          :fill="rack.fillColor"
          :data-index="index"
          class="rack-rect"
          @click="showRectInfo(rack)"
        />
        <g v-for="(item, itemIndex) in rack.items" :key="itemIndex">
          <rect
            :x="calculateItemXPosition(rack, item, itemIndex)"
            :y="calculateItemYPosition(rack, item, itemIndex)"
            :width="item.width"
            :height="item.height"
            :fill="item.fillColor"
          />
        </g>
      </svg>
      </g>
    </svg>
  </el-card>
</template>
<script>
import Swal from 'sweetalert2'
export default {
  data() {
    return {
      loading: false,
      racks: [
        { x: 70, y: 126, width: 600, height: 240, fillColor: '#79bbff', item: { width: 40, height: 30, top:5, fillColor: '#911005' ,content:'NG123456'} },
        { x: 675, y: 126, width: 600, height: 240, fillColor: '#a0cfff', item: { width: 40, height: 30, fillColor: 'yellow' ,content:'NG1234567'} },
        { x: 70, y: 370, width: 1100, height: 260, fillColor: '#529b2e', item: { width: 40, height: 30, fillColor: 'yellow' ,content:'NG12345678'} },
        { x: 1175, y: 370, width: 200, height: 300, fillColor: '#529b2e', item: { width: 40, height: 30, fillColor: 'yellow' ,content:'NG123456910'} },
      ]
        {
          x: 70, y: 126, width: 600, height: 240, fillColor: '#79bbff',
          items: [
            { position: 'top-left', width: 40, height: 30, fillColor: '#911005', content: 'NG123456' },
            { position: 'bottom-right', width: 40, height: 30, fillColor: 'yellow', content: 'NG1234567' }
          ]
        },
        {
          x: 675, y: 126, width: 600, height: 240,  fillColor: '#79bbff',
          items: [
            { position: 'top-left', width: 40, height: 30, fillColor: '#911005', content: 'NG123456' },
            { position: 'top-right', width: 40, height: 30, fillColor: 'yellow', content: 'NG1234567' }
          ]
        },
        {
          x: 70, y: 370, width: 1100, height: 260, fillColor: '#79bbff',
          items: [
            { position: 'top-left', width: 40, height: 30, fillColor: '#911005', content: 'NG123456' },
            { position: 'top-right', width: 40, height: 30, fillColor: 'yellow', content: 'NG1234567' }
          ]
        },
        {
          x: 1175, y: 370, width: 200, height: 300,fillColor: '#79bbff',
          items: [
            { position: 'top-left', width: 40, height: 30, fillColor: '#911005', content: 'NG123456' },
            { position: 'top-right', width: 40, height: 30, fillColor: 'yellow', content: 'NG1234567' }
          ]
        }
        // Add more racks and items here as needed
      ],
    };
  },
  methods: {
    calculateItemXPosition(rack, item, index) {
  if (index === 4) {
    // 第五个矩形,确保不超出架子右边界
    return Math.min(rack.x + rack.width - item.width, rack.x + rack.width);
  } else {
    return Math.max(rack.x, Math.min(rack.x + rack.width / 2 - item.width / 2, rack.x + rack.width - item.width));
  }
},
calculateItemYPosition(rack, item, index) {
  if (index === 0 || index === 2) {
    // 第一个和第三个矩形,贴近架子顶部
    return Math.min(rack.y, rack.y + rack.height);
  } else if (index === 1 || index === 3) {
    // 第二个和第四个矩形,贴近架子底部
    return Math.max(rack.y, Math.min(rack.y + rack.height - item.height, rack.y + rack.height));
  }
}
      if (item.position === 'top-right' || item.position === 'bottom-right') {
        return Math.min(rack.x + rack.width - item.width, rack.x + rack.width);
      } else {
        return rack.x;
      }
    },
    calculateItemYPosition(rack, item, index) {
      if (item.position === 'bottom-left' || item.position === 'bottom-right') {
        return Math.min(rack.y + rack.height - item.height, rack.y + rack.height);
      } else {
        return rack.y;
      }
    },
    showCustomAlert(content) {
      Swal.fire({
        title: 'Rack Information',
        text: content,
        icon: 'info',
      });
    },
    showRectInfo(rectInfo) {
      const contents = rectInfo.items.map(item => item.content).join(', ');
      this.$nextTick(() => {
        this.showCustomAlert(contents);
      });
    },
  }
};
</script>
@@ -71,4 +111,12 @@
  width: 100%;
  height: 80vh;
}
.rack-rect:hover {
  cursor: pointer;
}
.custom-popover-class {
  background-color: lightgrey;
  color: black;
  border: 1px solid black;
}
</style>
UnLoadGlassModule/src/main/java/com/mes/entity/DownWorkstation.java
@@ -14,7 +14,7 @@
    private Integer deviceId; // 设备id
    private Integer enableState; // 启用状态
    private Integer workState; // 工作状态
    private Integer racks_number; // 已落架数量
    private Integer total_quantity; // 总数量
    private int racksnumber; // 已落架数量
    private Integer totalquantity; // 总数量
}
UnLoadGlassModule/src/main/java/com/mes/mapper/DownWorkstationMapper.java
@@ -38,22 +38,32 @@
//从机械手任务表查询状态为1的流程卡号
//    @Select("SELECT *  FROM down_workstation_task WHERE state = 1")
//    List<DownWorkstation> selectdownWorkstationstate();
    @Select("SELECT dw.flow_card_id,dw.racks_number FROM down_workstation_task dwt JOIN down_workstation dw ON dwt.flow_card_id = dw.flow_card_id WHERE dwt.state = 1 LIMIT 1")
//查询工位表和任务表中状态为1的流程卡号和已落架数量
    @Select("SELECT dwt.flow_card_id,dw.id,dw.racks_number FROM down_workstation_task dwt JOIN down_workstation dw ON dwt.flow_card_id = dw.flow_card_id WHERE dwt.state = 1 LIMIT 1")
    List<DownWorkstation> selectdownWorkstationstate();
//更新落架数量
    @Update("UPDATE down_workstation SET racks_number = #{racksNumber} " +
            "WHERE flow_card_id = #{flowCardId}")
    void  update_racks_number(@Param("flowCardId") String flowCardId,
                                   @Param("racksNumber") Integer racksNumber);
//插入机械任务表
    @Insert("INSERT INTO down_workstation_task (flow_card_id, width, height, thickness, filmsid,state) " +
            "VALUES (#{flowCardId}, #{width}, #{height}, #{thickness}, #{filmsid},1)")
    void insertdownWorkstationtask(DownGlassInfo downGlassInfo);
//根据工位id更新实体类接收的数据
@Update("UPDATE down_workstation SET width = #{width}, height = #{height}, flow_card_id = #{flowCardId} WHERE workstation_id = #{workstationId}")
void updateFlowCardId(DownWorkstation downWorkstation);
//满架拉走,清空信息
    @Update("UPDATE down_workstation SET width = null, height = null, flow_card_id = null WHERE workstation_id = #{workstationId}")
    void clearFlowCardId(DownWorkstation downWorkstation);
    @Update("UPDATE down_workstation_task SET state = 0 WHERE flow_card_id = #{flowCardId}")
    void update_task_state_to_zero(@Param("flowCardId") String flowCardId);
}
UnLoadGlassModule/src/main/java/com/mes/service/PlcService.java
@@ -72,11 +72,10 @@
                downGlassInfoMapper.insert(newdownGlassInfo);
                //插入数据到机械手任务表
                downWorkstationMapper.insertdownWorkstationtask(newdownGlassInfo);
                //更新任务表状态为0
                //更新下片任务表状态为0
                downGlassInfoMapper.updateTaskStateToZero(downGlassInfo.getFlowCardId());
                sequence++; // 递增顺序字段值
@@ -91,11 +90,18 @@
        //downWorkstationMapper = WebSocketServer.applicationContext.getBean(DownWorkstationMapper.class);
        //downGlassInfoMapper = WebSocketServer.applicationContext.getBean(DownGlassInfoMapper.class);
        try {
            //查询下片工位表中架子是否绑定了流程卡号 工位表和任务表中状态为1的流程卡号和已落架数量
            List<DownWorkstation> taskdownWorkstation = downWorkstationMapper.selectdownWorkstationstate();
            if (taskdownWorkstation != null && !taskdownWorkstation.isEmpty()) {
                //查询下片工位表中是否绑定了架子是否绑定了流程卡号,如果已经绑定则更新已落架数量,并且删除下片任务表中的记录
                //,如果已经绑定则更新已落架数量,并且删除下片任务表中的记录
                for (DownWorkstation downWorkstation : taskdownWorkstation) {
                    downWorkstationMapper.update_racks_number(downWorkstation.getFlowCardId(),6 );
                    //更新下片工位表中已落架数量
                    downWorkstationMapper.update_racks_number(downWorkstation.getFlowCardId(),downWorkstation.getRacksnumber()+1 );
                    //更新机械任务表中状态为0
                    downWorkstationMapper.update_task_state_to_zero(downWorkstation.getFlowCardId());
                    //删除下片任务表中的记录
                    downGlassInfoMapper.deletetask(downWorkstation.getFlowCardId());
                }
@@ -111,18 +117,23 @@
    //绑定流程卡号架子
    // 绑定流程卡号架子
    public void bindingshelf(DownWorkstation downWorkstation){
        String FlowCardId=downWorkstation.getFlowCardId();
        int WorkstationId=downWorkstation.getWorkstationId();
        downWorkstationMapper.updateFlowCardId(downWorkstation);
    }
    // 满架拉走 清除流程卡信息
    public void clearFlowCardId(DownWorkstation downWorkstation){
       downWorkstationMapper.clearFlowCardId(downWorkstation);
    }