wuyouming666
2023-09-12 27a3b60fdd102fac12999684ead75a3a412ed66d
Merge branch 'master' of ssh://10.153.19.150:29418/CanadaMes

# Conflicts:
# springboot-vue3/src/main/java/com/example/springboot/config/AppRunnerConfig.java
26个文件已修改
2个文件已添加
1726 ■■■■■ 已修改文件
CanadaMes-ui/src/api/home.js 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
CanadaMes-ui/src/lang/locales/en-US.json 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
CanadaMes-ui/src/lang/locales/zh-CN.json 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
CanadaMes-ui/src/views/Electrical/Action.vue 410 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
CanadaMes-ui/src/views/Electrical/Parameter.vue 114 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
CanadaMes-ui/src/views/Electrical/Sign.vue 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
CanadaMes-ui/src/views/Electrical/State.vue 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
CanadaMes-ui/src/views/Electrical/alarm.vue 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
CanadaMes-ui/src/views/home/index.vue 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
CanadaMes-ui/src/views/user/index.vue 236 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
springboot-vue3/package-lock.json 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
springboot-vue3/src/main/java/com/example/springboot/AuthorityApplication.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
springboot-vue3/src/main/java/com/example/springboot/component/PlcHold.java 62 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
springboot-vue3/src/main/java/com/example/springboot/component/Plcalarm.java 126 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
springboot-vue3/src/main/java/com/example/springboot/component/Plchome.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
springboot-vue3/src/main/java/com/example/springboot/component/Plcsign.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
springboot-vue3/src/main/java/com/example/springboot/component/Plcstate.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
springboot-vue3/src/main/java/com/example/springboot/component/WebSocketServer.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
springboot-vue3/src/main/java/com/example/springboot/config/AppRunnerConfig.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
springboot-vue3/src/main/java/com/example/springboot/controller/AlarmController.java 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
springboot-vue3/src/main/java/com/example/springboot/controller/HomeController.java 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
springboot-vue3/src/main/java/com/example/springboot/controller/SpianController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
springboot-vue3/src/main/java/com/example/springboot/entity/Glass.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
springboot-vue3/src/main/java/com/example/springboot/entity/StorageCage.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
springboot-vue3/src/main/java/com/example/springboot/entity/alarmmg.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
springboot-vue3/src/main/java/com/example/springboot/mapper/HomeMapper.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
springboot-vue3/src/main/java/com/example/springboot/mapper/SpianMapper.java 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
springboot-vue3/src/main/java/com/example/springboot/service/SpianService.java 176 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
CanadaMes-ui/src/api/home.js
@@ -58,3 +58,27 @@
        data :""
    })
}
export function SelectCageInfo(cage) {
    return request({
        url: '/home/SelectCageInfo?cage='+cage,
        method: 'get',
        data :""
    })
}
export function DeleteByGlassID(glassid) {
    return request({
        url: '/home/DeleteByGlassID?glassid='+glassid,
        method: 'get',
        data :""
    })
}
export function OutByGlassID(glassid) {
    return request({
        url: '/home/OutByGlassID?glassid='+glassid,
        method: 'get',
        data :""
    })
}
CanadaMes-ui/src/lang/locales/en-US.json
@@ -170,5 +170,6 @@
  "Sign": "Sign",
  "State": "State",
  "Alarm": "Alarm",
  "Distribute": "Distribute"
  "Distribute": "Distribute",
  "Search": "Search"
}
CanadaMes-ui/src/lang/locales/zh-CN.json
@@ -35,7 +35,6 @@
  "exit": "退出",
  "changePassword": "修改密码",
  "resetPassword": "重置密码",
  "home": "主页",
  "role": "角色",
  "langRoleManagement": "角色管理",
@@ -171,6 +170,6 @@
  "Sign": "IO状态",
  "State": "State",
  "Alarm": "报警信息",
  "Distribute": "下发"
}
  "Distribute": "下发",
  "Search": "搜索"
}
CanadaMes-ui/src/views/Electrical/Action.vue
@@ -1,206 +1,206 @@
<template>
  <div class="app">
    <!--面包屑导航区域-->
    <el-breadcrumb separator-class="el-icon-arrow-right" class="el-breadcrumb">
      <router-link to="/home" tag="el-button" type="text">{{ $t('langHome') }}</router-link>
      <el-button type="text">Electrical</el-button>
      <router-link to="/Electrical/Parameter" tag="el-button" type="text">Parameter</router-link>
      <router-link to="/Electrical/Action" tag="el-button" type="text">Action</router-link>
      <router-link to="/Electrical/Sign" tag="el-button" type="text">Sign</router-link>
      <router-link to="/Electrical/State" tag="el-button" type="text">State</router-link>
      <router-link to="/Electrical/alarm" tag="el-button" type="text">Alarm</router-link>
    </el-breadcrumb>
    <div>Action</div>
    <el-form label-width="100px" style="display: flex;flex-wrap: wrap;" :model="{ messagepack }">
      <!-- <div class="kuai_div" v-for="item in record.xyData" :key="item.value">
        <el-input v-model="item.name" style="width: 240px;" class="in_mc"></el-input>
        <el-switch v-model="item.value" active-value="0" inactive-value="1"></el-switch>
      </div> -->
      <div class="kuai_div" v-for="(item, index) in record.xyData" :key="index">
        <el-input v-model="item.name" style="width: 240px;" class="in_mc" readonly></el-input>
        <el-switch v-model="item.value" active-value="1" inactive-value="0" @change="send()"></el-switch>
      </div>
    </el-form>
  </div>
</template>
<script >
import LanguageMixin from '../../lang/LanguageMixin'
let socket;
export default {
  name: "action",
  mixins: [LanguageMixin],
  data () {
    return {
      record: {
        params: [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        canshu: [
          'D01 VFD conveyor',
          'D02 VFD conveyor',
          'D03 VFD conveyor',
          'D04 VFD conveyor',
          'D05 VFD conveyor',
          'D06 VFD conveyor',
          'A01 VFD conveyor',
          'A02 VFD conveyor',
          'B01 VFD conveyor',
          'B02 VFD conveyor',
          'A01 SERVE TURN JOG+',
          'A02 SERVE TURN JOG-',
          'A01 SERVE TRAVEL JOG+',
          'A02 SERVE TRAVEL JOG-',
          'B01 SERVE TRAVEL JOG+',
          'B02 SERVE TRAVEL JOG-',
          'A01 SERVE TURN POS',
          'A02 SERVE TURN POS',
          'A01 SERVE TRAVEL POS',
          'A02 SERVE TRAVEL POS',
          'B01 SERVE TRAVEL POS',
          'B02 SERVE TRAVEL POS',
          'B01 YV TURN',
          'B01 YV UP DOWN',
          'B02 YV TURN',
          'B02 YV UP DOWN',
        ],
        xyData: [
          { name: 'D01 VFD conveyor', value: "0" },
          { name: 'D02 VFD conveyor', value: "0" },
          { name: 'D03 VFD conveyor', value: "1" },
          { name: 'D04 VFD conveyor', value: "0" },
          { name: 'D05 VFD conveyor', value: "0" },
          { name: 'D06 VFD conveyor', value: "0" },
          { name: 'A01 VFD conveyor', value: "0" },
          { name: 'A02 VFD conveyor', value: "0" },
          { name: 'B01 VFD conveyor', value: "0" },
          { name: 'B02 VFD conveyor', value: "0" },
          { name: 'A01 SERVE TURN JOG+', value: "0" },
          { name: 'A02 SERVE TURN JOG-', value: "0" },
          { name: 'A01 SERVE TRAVEL JOG+', value: "0" },
          { name: 'A02 SERVE TRAVEL JOG-', value: "0" },
          { name: 'B01 SERVE TRAVEL JOG+', value: "0" },
          { name: 'B02 SERVE TRAVEL JOG-', value: "0" },
          { name: 'A01 SERVE TURN POS', value: "0" },
          { name: 'A02 SERVE TURN POS', value: "0" },
          { name: 'A01 SERVE TRAVEL POS', value: "0" },
          { name: 'A02 SERVE TRAVEL POS', value: "0" },
          { name: 'B01 SERVE TRAVEL POS', value: "0" },
          { name: 'B02 SERVE TRAVEL POS', value: "0" },
          { name: 'B01 YV TURN', value: "0" },
          { name: 'B01 YV UP DOWN', value: "0" },
          { name: 'B02 YV TURN', value: "0" },
          { name: 'B02 YV UP DOWN', value: "0" },
        ]
        ,
      },
      messagepack: {
        data: { taskname: "" }
      },
      queryInfo: {
        data: "1",
        pageSize: 10
      },
    }
  },
  created () {
    this.init();
  },
  methods: {
    init () {
      let viewname = "action";
      if (typeof (WebSocket) == "undefined") {
        console.log("您的浏览器不支持WebSocket");
      } else {
        //console.log("您的浏览器支持WebSocket");
        let socketUrl = "ws://" + "localhost:8888" + "/springboot-vue3/api/talk/" + viewname;
        if (socket != null) {
          socket.close();
          socket = null;
        }
        // 开启一个websocket服务
        socket = new WebSocket(socketUrl);
        //打开事件
        socket.onopen = function () {
          console.log("websocket已打开");
        };
        //  浏览器端收消息,获得从服务端发送过来的文本消息
        socket.onmessage = (msg) => {
          if (!msg.data) {
            return; // 如果收到空数据,则直接返回,不执行后续逻辑
          }
          let obj = JSON.parse(msg.data);
          this.record.params[0] = obj.params[0];
          for (let a = 0; a <= this.record.params[0].length - 1; a++) {
            if (!this.record.xyData[a]) {
              this.record.xyData[a] = { name: this.record.canshu[a], value: this.record.params[0][a].toString() };
            } else {
              this.record.xyData[a].value = this.record.params[0][a].toString();
            }
          }
          console.log(this.record.xyData);
          this.$forceUpdate();
        };
        //关闭事件
        socket.onclose = function () {
          console.log("websocket已关闭");
        };
        //发生了错误事件
        socket.onerror = function () {
          console.log("websocket发生了错误");
        }
      }
    },
    send () {
      this.messagepack.data = this.record.xyData.map(item => parseInt(item.value)); // 转换为整数数组
      console.log(this.messagepack);
      socket?.send(JSON.stringify(this.messagepack));
    }
  }
}
</script>
<style>
.kuai_div {
  /* width: 30%; */
  margin-bottom: 30px;
}
.el-input {
  border: none;
}
.el-input__inner {
  border: 1 solid black;
}
.in_mc {}
.el-input__inner {
  border: none;
}
<template>
  <div class="app">
    <!--面包屑导航区域-->
    <el-breadcrumb separator-class="el-icon-arrow-right" class="el-breadcrumb">
      <router-link to="/home" tag="el-button" type="text">{{ $t('langHome') }}</router-link>
      <el-button type="text">Electrical</el-button>
      <router-link to="/Electrical/Parameter" tag="el-button" type="text">Parameter</router-link>
      <router-link to="/Electrical/Action" tag="el-button" type="text">Action</router-link>
      <router-link to="/Electrical/Sign" tag="el-button" type="text">Sign</router-link>
      <router-link to="/Electrical/State" tag="el-button" type="text">State</router-link>
      <router-link to="/Electrical/alarm" tag="el-button" type="text">Alarm</router-link>
    </el-breadcrumb>
    <div>Action</div>
    <el-form label-width="100px" style="display: flex;flex-wrap: wrap;" :model="{ messagepack }">
      <!-- <div class="kuai_div" v-for="item in record.xyData" :key="item.value">
        <el-input v-model="item.name" style="width: 240px;" class="in_mc"></el-input>
        <el-switch v-model="item.value" active-value="0" inactive-value="1"></el-switch>
      </div> -->
      <div class="kuai_div" v-for="(item, index) in record.xyData" :key="index">
        <el-input v-model="item.name" style="width: 240px;" class="in_mc" readonly></el-input>
        <el-switch v-model="item.value" active-value="1" inactive-value="0" @change="send()"></el-switch>
      </div>
    </el-form>
  </div>
</template>
<script >
import LanguageMixin from '../../lang/LanguageMixin'
let socket;
export default {
  name: "action",
  mixins: [LanguageMixin],
  data () {
    return {
      record: {
        params: [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        canshu: [
          'D01 VFD conveyor',
          'D02 VFD conveyor',
          'D03 VFD conveyor',
          'D04 VFD conveyor',
          'D05 VFD conveyor',
          'D06 VFD conveyor',
          'A01 VFD conveyor',
          'A02 VFD conveyor',
          'B01 VFD conveyor',
          'B02 VFD conveyor',
          'A01 SERVE TURN JOG+',
          'A02 SERVE TURN JOG-',
          'A01 SERVE TRAVEL JOG+',
          'A02 SERVE TRAVEL JOG-',
          'B01 SERVE TRAVEL JOG+',
          'B02 SERVE TRAVEL JOG-',
          'A01 SERVE TURN POS',
          'A02 SERVE TURN POS',
          'A01 SERVE TRAVEL POS',
          'A02 SERVE TRAVEL POS',
          'B01 SERVE TRAVEL POS',
          'B02 SERVE TRAVEL POS',
          'B01 YV TURN',
          'B01 YV UP DOWN',
          'B02 YV TURN',
          'B02 YV UP DOWN',
        ],
        xyData: [
          { name: 'D01 VFD conveyor', value: "0" },
          { name: 'D02 VFD conveyor', value: "0" },
          { name: 'D03 VFD conveyor', value: "1" },
          { name: 'D04 VFD conveyor', value: "0" },
          { name: 'D05 VFD conveyor', value: "0" },
          { name: 'D06 VFD conveyor', value: "0" },
          { name: 'A01 VFD conveyor', value: "0" },
          { name: 'A02 VFD conveyor', value: "0" },
          { name: 'B01 VFD conveyor', value: "0" },
          { name: 'B02 VFD conveyor', value: "0" },
          { name: 'A01 SERVE TURN JOG+', value: "0" },
          { name: 'A02 SERVE TURN JOG-', value: "0" },
          { name: 'A01 SERVE TRAVEL JOG+', value: "0" },
          { name: 'A02 SERVE TRAVEL JOG-', value: "0" },
          { name: 'B01 SERVE TRAVEL JOG+', value: "0" },
          { name: 'B02 SERVE TRAVEL JOG-', value: "0" },
          { name: 'A01 SERVE TURN POS', value: "0" },
          { name: 'A02 SERVE TURN POS', value: "0" },
          { name: 'A01 SERVE TRAVEL POS', value: "0" },
          { name: 'A02 SERVE TRAVEL POS', value: "0" },
          { name: 'B01 SERVE TRAVEL POS', value: "0" },
          { name: 'B02 SERVE TRAVEL POS', value: "0" },
          { name: 'B01 YV TURN', value: "0" },
          { name: 'B01 YV UP DOWN', value: "0" },
          { name: 'B02 YV TURN', value: "0" },
          { name: 'B02 YV UP DOWN', value: "0" },
        ]
        ,
      },
      messagepack: {
        data: { taskname: "" }
      },
      queryInfo: {
        data: "1",
        pageSize: 10
      },
    }
  },
  created () {
    this.init();
  },
  methods: {
    init () {
      let viewname = "action";
      if (typeof (WebSocket) == "undefined") {
        console.log("您的浏览器不支持WebSocket");
      } else {
        //console.log("您的浏览器支持WebSocket");
        let socketUrl = "ws://" + "localhost:8888" + "/springboot-vue3/api/talk/" + viewname;
        if (socket != null) {
          socket.close();
          socket = null;
        }
        // 开启一个websocket服务
        socket = new WebSocket(socketUrl);
        //打开事件
        socket.onopen = function () {
          console.log("websocket已打开");
        };
        //  浏览器端收消息,获得从服务端发送过来的文本消息
        socket.onmessage = (msg) => {
          if (!msg.data) {
            return; // 如果收到空数据,则直接返回,不执行后续逻辑
          }
          let obj = JSON.parse(msg.data);
          this.record.params[0] = obj.params[0];
          for (let a = 0; a <= this.record.params[0].length - 1; a++) {
            if (!this.record.xyData[a]) {
              this.record.xyData[a] = { name: this.record.canshu[a], value: this.record.params[0][a].toString() };
            } else {
              this.record.xyData[a].value = this.record.params[0][a].toString();
            }
          }
          // console.log(this.record.xyData);
          this.$forceUpdate();
        };
        //关闭事件
        socket.onclose = function () {
          console.log("websocket已关闭");
        };
        //发生了错误事件
        socket.onerror = function () {
          console.log("websocket发生了错误");
        }
      }
    },
    send () {
      this.messagepack.data = this.record.xyData.map(item => parseInt(item.value)); // 转换为整数数组
      //console.log(this.messagepack);
      socket?.send(JSON.stringify(this.messagepack));
    }
  }
}
</script>
<style>
.kuai_div {
  /* width: 30%; */
  margin-bottom: 30px;
}
.el-input {
  border: none;
}
.el-input__inner {
  border: 1 solid black;
}
.in_mc {}
.el-input__inner {
  border: none;
}
</style>
CanadaMes-ui/src/views/Electrical/Parameter.vue
@@ -10,20 +10,21 @@
      <router-link to="/Electrical/State" tag="el-button" type="text">State</router-link>
      <router-link to="/Electrical/alarm" tag="el-button" type="text">Alarm</router-link>
    </el-breadcrumb>
    <div>Parameter</div>
    <el-form label-width="100px" style="display: flex; flex-wrap: wrap;" :model="messagepack.data">
      <div id="btn_div">
        <el-button type="primary" @click="send()" id="xiafa"  :disabled="isButtonDisabled">下发参数</el-button>
        <el-button type="primary" @click="send()" id="xiafa" :disabled="isButtonDisabled">下发参数</el-button>
      </div>
      <div class="kuai_div" v-for="(item, index) in record.xyData" :key="index">
  <el-input style="width: 280px; border:none;" class="in_mc" v-model="item.name" readonly></el-input>
  <span style="margin-right: 5px; width: 50px;">{{ item.value }}</span>
  <span style="margin-right: 5px; font-size: 14px;">|</span>
  <input v-model="item.value2" type="number" style="width: 30px; margin-right: 5px; margin-top: 5px; font-size: 16px;">
</div>
        <el-input style="width: 280px; border:none;" class="in_mc" v-model="item.name" readonly></el-input>
        <span style="margin-right: 5px; width: 50px;">{{ item.value }}</span>
        <span style="margin-right: 5px; font-size: 14px;">|</span>
        <input v-model="item.value2" type="number"
          style="width: 30px; margin-right: 5px; margin-top: 5px; font-size: 16px;">
      </div>
    </el-form>
  </div>
</template>
@@ -33,14 +34,14 @@
export default {
  name: "Parameter",
  data() {
  data () {
    return {
      record: {
        params: [100, 200, 10, 10, 10, 10],
        xyData: [
          { name: "conveyor Velocity(Auto FAST)", value: 0, value2: 0 },
          { name: "conveyor Velocity(Auto SLOW)", value: 0, value2: 0 },
          { name: "conveyor Velocity(Manual)", value: 0 ,value2: 0 },
          { name: "conveyor Velocity(Manual)", value: 0, value2: 0 },
          { name: "A01 A02 TURN JOG Velocity", value: 0, value2: 0 },
          { name: "A01 A02 TRAVEL JOG Velocity", value: 0, value2: 0 },
          { name: "B01 B02 TRAVEL JOG Velocity", value: 0, value2: 0 },
@@ -62,78 +63,78 @@
      }
    };
  },
  created() {
  created () {
    this.initWebSocket();
    this.isButtonDisabled = true;
  },
  methods: {
    initWebSocket() {
    initWebSocket () {
      let viewname = "Parameter";
      if (typeof WebSocket === "undefined") {
        console.log("您的浏览器不支持WebSocket");
      } else {
        let socketUrl = "ws://" + "localhost:8888" + "/springboot-vue3/api/talk/" + viewname;
        if (socket != null) {
          socket.close();
          socket = null;
        }
        // 开启一个websocket服务
        socket = new WebSocket(socketUrl);
        // 打开事件
        socket.onopen = function () {
          console.log("websocket已打开");
        };
        // 收到消息
        socket.onmessage = (msg) => {
  if (!msg.data) {
    return; // 如果收到空数据,则直接返回,不执行后续逻辑
  }
          if (!msg.data) {
            return; // 如果收到空数据,则直接返回,不执行后续逻辑
          }
  let obj = JSON.parse(msg.data);
  this.record.params[0] = obj.params[0];
  this.record.state = obj.state[0];
          let obj = JSON.parse(msg.data);
          this.record.params[0] = obj.params[0];
          this.record.state = obj.state[0];
  let isButtonDisabled = this.record.state.includes(1);
  // 判断state中是否存在1
  console.log(isButtonDisabled)
  this.isButtonDisabled = isButtonDisabled; // 将判断结果保存到变量isButtonDisabled中
          let isButtonDisabled = this.record.state.includes(1);
          // 判断state中是否存在1
          //console.log(isButtonDisabled)
          this.isButtonDisabled = isButtonDisabled; // 将判断结果保存到变量isButtonDisabled中
  for (let a = 0; a <= this.record.params[0].length - 1; a++) {
    if (!this.record.xyData[a]) {
      this.record.xyData[a] = { name: this.record.canshu[a], value: this.record.params[0][a] };
    } else {
      this.record.xyData[a].value = this.record.params[0][a];
    }
  }
          for (let a = 0; a <= this.record.params[0].length - 1; a++) {
            if (!this.record.xyData[a]) {
              this.record.xyData[a] = { name: this.record.canshu[a], value: this.record.params[0][a] };
            } else {
              this.record.xyData[a].value = this.record.params[0][a];
            }
          }
  console.log(this.record.xyData);
  this.$forceUpdate();
};
          //console.log(this.record.xyData);
          this.$forceUpdate();
        };
        // 关闭事件
        socket.onclose = function () {
          console.log("websocket已关闭");
        };
        // 发生错误事件
        socket.onerror = function () {
          console.log("websocket发生了错误");
        };
      }
    },
    send() {
    send () {
      this.messagepack.data = this.record.xyData.map((item) => parseInt(item.value2)); // 转换为整数数组
      console.log(this.messagepack);
      //console.log(this.messagepack);
      socket?.send(JSON.stringify(this.messagepack));
    },
    handleChange(index, value) {
    handleChange (index, value) {
      this.record.xyData[index].value = value;
    }
  }
@@ -149,9 +150,10 @@
.el-input__inner {
  border: 1px solid black;
}
.in_mc{
  border:none;
.in_mc {
  border: none;
}
@@ -162,13 +164,15 @@
#btn_div .el-button {
  float: right;
}
input[type="number"]::-webkit-inner-spin-button,
  input[type="number"]::-webkit-outer-spin-button {
    -webkit-appearance: none;
    margin: 0;
  }
  input[type="number"] {
    -moz-appearance: textfield; /* Firefox中禁用上下箭头 */
  }
input[type="number"]::-webkit-inner-spin-button,
input[type="number"]::-webkit-outer-spin-button {
  -webkit-appearance: none;
  margin: 0;
}
input[type="number"] {
  -moz-appearance: textfield;
  /* Firefox中禁用上下箭头 */
}
</style>
CanadaMes-ui/src/views/Electrical/Sign.vue
@@ -13,8 +13,7 @@
    <div>Sign</div>
    <div style="padding-right: 30px;display: flex;flex-wrap: wrap;" class="neir">
      <div class="kuai_sb" v-for="item in record.xyData" :key="item.name">
        <el-col class="deng" :class="getStatusClass(item.value, item.name)">
          <!-- <el-input v-model="item.value" style="width: 280px;" class="in_mc"></el-input> -->
        <el-col class="deng" :class="getStatusClass(item.value)">
        </el-col>
        <el-input v-model="item.name" style="width: 280px;" class="in_mc"></el-input>
@@ -34,6 +33,7 @@
  data () {
    return {
      record: {
        //定义数组,并添加默认值
        params: [1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
          1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,],
        xyData: [
@@ -148,18 +148,17 @@
    this.init();
  },
  methods: {
    getStatusClass (zhuangtai, mc) {
      if (mc === "LED.green" && zhuangtai === 0) {
        return "green";
      }
      if (mc === "LED.red" && zhuangtai === 0) {
        return "red";
      }
      if (mc === "LED.yellow" && zhuangtai === 0) {
        return "yellow"
      }
    //根据读取PLC的值,根据名称改变颜色
    getStatusClass (zhuangtai) {
      // if (mc === "LED.green" && zhuangtai === 0) {
      //   return "green";
      // }
      // if (mc === "LED.red" && zhuangtai === 0) {
      //   return "red";
      // }
      // if (mc === "LED.yellow" && zhuangtai === 0) {
      //   return "yellow"
      // }
      if (zhuangtai === 0) {
@@ -241,10 +240,15 @@
  padding: 0;
}
/* .neir {
.app {
  height: 100%;
}
.neir {
  /* height: 580px; */
  height: 90%;
  overflow-y: auto;
} */
}
.el-input__inner {
  text-align: center;
CanadaMes-ui/src/views/Electrical/State.vue
@@ -107,6 +107,7 @@
          //console.log("收到数据====" + msg.data);
          let obj = JSON.parse(msg.data);
          this.record.params[0] = obj.sta[0];
          //将读取到的PLC的数据,与定义的xyData,组合成新的数组
          for (let a = 0; a <= this.record.xyData[0].length - 1; a++) {
            if (!this.record.xyData[a]) {
              this.record.xyData[a] = { name: this.record.canshu[a], value: this.record.params[0][a] };
@@ -133,9 +134,6 @@
      console.log(this.messagepack);
      socket?.send(JSON.stringify(this.messagepack));
    },
    handleChange (index, value) {
      this.record.xyData[index].value = value;
    }
  }
CanadaMes-ui/src/views/Electrical/alarm.vue
@@ -20,7 +20,8 @@
      <el-date-picker v-model="shijian2" type="datetime" placeholder="选择日期时间" align="right"
        :picker-options="pickerOptions">
      </el-date-picker>
      <el-button type="primary" @click="selectTime()">查询</el-button>
      &nbsp;&nbsp;
      <el-button type="primary" @click="selectTime()">{{ $t('Search') }}</el-button>
    </div>
    <el-table :data="localizedRoles" style="width: 100%;" height="550">
@@ -99,9 +100,11 @@
    if (this.shijian1 == "" || this.shijian2 == "") {
      //查询当天报警信息
      this.load();
    }
    else {
      //根据时间查询报警信息
      this.selectTime();
    }
@@ -122,11 +125,13 @@
    },
    selectTime () {
      //moment需要单独安转依赖,npm install moment
      let sj1 = moment(this.shijian1).format('YYYY-MM-DD%20HH:mm');
      let sj2 = moment(this.shijian2).format('YYYY-MM-DD%20HH:mm')
      //调用setTime方法给roles赋值
      setTime(sj1, sj2).then(res => {
        this.roles = res.data.list;
        //table中的内容进行语言转换
        const language = this.$i18n.locale;
        if (language === 'zh-CN') {
          this.replaceChineseWithEnglish();
@@ -135,7 +140,7 @@
        }
      });
    },
    //语言转换
    replaceChineseWithEnglish () {
      const translation = this.$t('translation');
      this.localizedRoles = this.roles.map(role => ({
@@ -165,8 +170,6 @@
        };
        //  浏览器端收消息,获得从服务端发送过来的文本消息
        socket.onmessage = function (msg) {
          //console.log("收到数据====" + msg.data);
          let obj = JSON.parse(msg.data);
          this.record.params[0] = obj.arm;
@@ -190,10 +193,6 @@
      }
    },
    send () {
      this.messagepack.data = { taskname: "前端到后台" };
      socket?.send(JSON.stringify(this.messagepack));  // 将组装好的json发送给服务端,由服务端进行转发
    }
  }
CanadaMes-ui/src/views/home/index.vue
@@ -59,36 +59,36 @@
}
.gezi {
    height: 25px;
    width: 3.25px;
    height: 35px;
    width: 4.22px;
}
.gezi:nth-child(22),
.gezi:nth-child(43),
.gezi:nth-child(64),
.gezi:nth-child(85) {
    margin-left: 7.7px;
    margin-left: 10px;
}
.blocks {
    min-height: 49vh;
    min-height: 55vh;
    max-width: 100vw;
    background-image: url('../../img/xmjc.png');
    margin: 0 auto;
    background-repeat: no-repeat;
    /* background-size: 100% 100%; */
    background-size: 1280px 377px;
    background-size: 1660px 560px;
    background-attachment: local;
    width: 1280px;
    width: 1660px;
}
.blocks-img {
    height: 100px;
    max-width: 100vw;
    background-repeat: no-repeat;
    background-size: 32px 66px;
    background-size: 46px 94px;
    background-attachment: local;
    width: 32px;
@@ -142,7 +142,7 @@
    <el-container>
        <!-- <el-header style="padding: 10px;"></el-header> -->
        <el-main>
            <div class="box">
            <div class="box" @click="dialogFormVisible2 = true">
                <div class="text">
                    Alarm:
                    <label v-for="item in this.alarm" :key="item['id']">
@@ -150,7 +150,6 @@
                    </label>
                </div>
            </div>
            <div style="display:flex;justify-content: space-around;width: 95%;margin: 0 auto;">
                <el-input style="width:15%;" placeholder="Enter the glass lD" v-model="glassid"></el-input>
                <el-button type="primary" @click="showform()">Manually feed the glass</el-button>
@@ -162,7 +161,7 @@
                    <el-table-column prop="glassId" label="Coming out glass ID"></el-table-column>
                    <el-table-column :width="250" prop="cell" label="The Grille number being used"></el-table-column>
                    <el-table-column prop="orderId" label="Order Nmuber"></el-table-column>
                    <el-table-column prop="lengthwidth" label="Length and width"></el-table-column>
                    <el-table-column prop="lengthWidth" label="Length and width"></el-table-column>
                    <el-table-column prop="coating" label="coating"></el-table-column>
                    <el-table-column label="Operate">
                        <el-button type="primary" style="padding: 4px 10px;font-size: 12px;" @click="endtask(0)">end
@@ -173,7 +172,7 @@
                    <el-table-column prop="glassId" label="Incoming glass ID"></el-table-column>
                    <el-table-column :width="250" prop="cell" label="The Grille number being used"></el-table-column>
                    <el-table-column prop="orderId" label="Order Nmuber"></el-table-column>
                    <el-table-column prop="lengthwidth" label="Length and width"></el-table-column>
                    <el-table-column prop="lengthWidth" label="Length and width"></el-table-column>
                    <el-table-column prop="coating" label="coating"></el-table-column>
                    <el-table-column label="Operate">
                        <el-button type="primary" style="padding: 4px 10px;font-size: 12px;" @click="endtask(1)">end
@@ -196,24 +195,24 @@
        </el-main>
        <el-footer>
            <div class="blocks" style="position: relative;">
                <div style="display:flex;position: absolute;float:left;z-index: 999;top:76px;left:253px;">
                    <div :class="getStatusClass(item.state)" v-for="item in cagelist1" :key="item['date']"></div>
                <div style="display:flex;position: absolute;float:left;z-index: 999;top:112px;left:328px;">
                    <div :class="getStatusClass(item.state)" v-for="item in cagelist1" :key="item['date']"
                        @click="showcageinfo(item['cage'])"></div>
                </div>
                <div style="display:flex;position: absolute;float:left;z-index: 999;top:76px;left:682.5px;">
                    <div :class="getStatusClass(item.state)" v-for="item in cagelist2" :key="item['date']"></div>
                <div style="display:flex;position: absolute;float:left;z-index: 999;top:112px;left:885px;">
                    <div :class="getStatusClass(item.state)" v-for="item in cagelist2" :key="item['date']"
                        @click="showcageinfo(item['cage'])"></div>
                </div>
                <div style="display:flex;position: absolute;float:left;z-index: 999;top:102px;left:253px;">
                    <div :class="getStatusClass(item.state)" v-for="item in cagelist3" :key="item['date']"></div>
                <div style="display:flex;position: absolute;float:left;z-index: 999;top:154px;left:328px;">
                    <div :class="getStatusClass(item.state)" v-for="item in cagelist3" :key="item['date']"
                        @click="showcageinfo(item['cage'])"></div>
                </div>
                <div style="display:flex;position: absolute;float:left;z-index: 999;top:102px;left:682.5px;">
                    <div :class="getStatusClass(item.state)" v-for="item in cagelist4" :key="item['date']"></div>
                <div style="display:flex;position: absolute;float:left;z-index: 999;top:154px;left:885px;">
                    <div :class="getStatusClass(item.state)" v-for="item in cagelist4" :key="item['date']"
                        @click="showcageinfo(item['cage'])"></div>
                </div>
                <div class="blocks-img" :style="{ left: car1 + 'px', top: '10px' }">
                </div>
                <div class="blocks-img" :style="{ left: car2 + 'px', top: '129px' }">
                </div>
                <div class="blocks-img" :style="{ left: car1 + 'px', top: '16px' }"></div>
                <div class="blocks-img" :style="{ left: car2 + 'px', top: '194px' }"></div>
            </div>
        </el-footer>
        <el-dialog :visible.sync="dialogFormVisible" title="Please confirm the information">
@@ -254,20 +253,52 @@
                </span>
            </template>
        </el-dialog>
        <el-dialog :visible.sync="dialogFormVisible2" title="Ordering Information">
            <el-table :data="this.alarm" border style="width: 100%;">
                <el-table-column prop="id" label="id"></el-table-column>
                <el-table-column prop="content" label="content"></el-table-column>
                <el-table-column prop="timeons" label="timeon"></el-table-column>
                <el-table-column prop="endTime" label="endTime"></el-table-column>
            </el-table>
        </el-dialog>
        <el-dialog :visible.sync="dialogFormVisible3" title="Ordering Information">
            <el-table :data="this.cageinfo" border style="width: 100%;height: 700px;overflow: auto;">
                <el-table-column :width="150" prop="cage" label="the grille number"></el-table-column>
                <el-table-column prop="cell" label="cell"></el-table-column>
                <el-table-column prop="tier" label="tier"></el-table-column>
                <el-table-column prop="glassId" label="glassid"></el-table-column>
                <el-table-column :width="130" prop="orderId" label="order number"></el-table-column>
                <el-table-column :width="150" prop="lengthWidth" label="length and width"></el-table-column>
                <el-table-column prop="coating" label="coating"></el-table-column>
                <el-table-column :width="150" label="operate">
                    <template slot-scope='scope'>
                        <el-button type="primary" style="padding: 4px 10px;font-size: 12px;"
                            @click="deleteglass(scope.row.glassId, scope.row.state)">delete</el-button>
                        <el-button type="primary" style="padding: 4px 10px;font-size: 12px;"
                            @click="outglass(scope.row.glassId,scope.row.state)">out</el-button>
                    </template>
                </el-table-column>
            </el-table>
        </el-dialog>
    </el-container>
</template>
<script>
import { home, home2, loadtask, InsertOrder, Addglassid, UpdateTask, SelectAlarmmgInfo } from "../../api/home";
import { home, home2, loadtask, InsertOrder, Addglassid, UpdateTask, SelectAlarmmgInfo, SelectCageInfo, DeleteByGlassID, OutByGlassID } from "../../api/home";
import LanguageMixin from '../../lang/LanguageMixin'
let socket;
export default {
    name: "Home",
    data() {
        return {
            mixins: [LanguageMixin],
            dialogFormVisible: false,
            dialogFormVisible1: false,
            dialogFormVisible2: false,
            dialogFormVisible3: false,
            form: {
                orderno: "NG2210210",
                length: 800,
@@ -291,10 +322,12 @@
            order: "",
            glassid: "",
            url: "../../img/bigcar01.png",
            car1: 116,
            car2: 187,
            car1: 150,
            car2: 242,
            incell: "",
            outcell: ""
            outcell: "",
            cageinfo: [],
            cage: 0
        };
    },
    created() {
@@ -309,7 +342,6 @@
                console.log("您的浏览器不支持WebSocket");
            } else {
                //console.log("您的浏览器支持WebSocket");
                let socketUrl = "ws://" + "localhost:8888" + "/springboot-vue3/api/talk/" + viewname;
                if (socket != null) {
                    socket.close();
@@ -326,10 +358,11 @@
                    //console.log("收到数据====" + msg.data);
                    let obj = JSON.parse(msg.data);
                    //this.$set(this.record.params, 0, obj.params[0]);
                    if (obj.params != null) {
                        this.car1 = 150 + 24.6 * obj.params[0][0];
                        this.car2 = 242 + 24.6 * obj.params[0][1];
                    }
                    this.car1 = 116 + 18.88 * obj.params[0][0];
                    this.car2 = 187 + 18.8 * obj.params[0][1];
                    this.tableData = obj.tableData[0];
                    this.cagelist1 = obj.cagelist1[0];
                    this.cagelist2 = obj.cagelist2[0];
@@ -344,16 +377,11 @@
                        this.outcell = this.tasklist2[0]['cell'];
                    }
                    this.alarm = obj.alarmmg[0];
                    // for (let a = 0; a <= this.record.params.length - 1; a++) {
                    //     // this.record.xyData[a] = [this.record.canshu[a], this.record.params[0][a]];
                    //     // this.record.xyData[a] = { name: this.record.canshu[a], value: this.record.params[0][a] };
                    //     // this.record.xyData[a].value = this.record.params[0][a];
                    //     this.car1=this.record.params[0][a];
                    //     console.log(this.record.params[0][a]);
                    SelectCageInfo(this.cage).then(res => {
                        this.cageinfo = res.data.cageinfo;
                    });
                    // }
                    this.$forceUpdate();
                }.bind(this);
@@ -401,7 +429,7 @@
        //根据格子状态修改颜色
        getStatusClass(state) {
            if (state == 0) {
                return "green gezi";
                return "gezi";
            } else if (state == 1) {
                return "blue gezi";
            } else if (state == 2) {
@@ -486,7 +514,35 @@
                });
            }
        },
        showcageinfo(cage) {
            this.cage = cage;
            SelectCageInfo(cage).then(res => {
                this.cageinfo = res.data.cageinfo;
                this.dialogFormVisible3 = true;
            });
        },
        deleteglass(glassid, state) {
            if (state == 1) {
                DeleteByGlassID(glassid).then(res=>{
                    if (res.data.message3 == 200) {
                        this.$message.success("Operation successful");
                    }
                });
            } else {
                this.$message.success("No out allowed");
            }
        },
        outglass(glassid,state){
            if (state == 1) {
                OutByGlassID(glassid).then(res=>{
                    if (res.data.message3 == 200) {
                        this.$message.success("Operation successful");
                    }
                });
            } else {
                this.$message.success("No out allowed");
            }
        }
    }
CanadaMes-ui/src/views/user/index.vue
@@ -11,11 +11,12 @@
      <el-row :gutter="20">
        <!--搜索与添加区域-->
        <el-col :span="6">
          <el-input :placeholder= "$t('langUsernamePlaceholder')"  v-model="queryInfo.username" clearable @clear="getUserList">
          <el-input :placeholder="$t('langUsernamePlaceholder')" v-model="queryInfo.username" clearable
            @clear="getUserList">
          </el-input>
        </el-col>
        <el-col :span="6">
          <el-input  :placeholder="$t('langEmailPlaceholder')"  v-model="queryInfo.email" clearable @clear="getUserList">
          <el-input :placeholder="$t('langEmailPlaceholder')" v-model="queryInfo.email" clearable @clear="getUserList">
          </el-input>
        </el-col>
        <!--搜索按钮-->
@@ -35,86 +36,62 @@
        <el-table-column :label="$t('langCreateTime')" prop="createTime"></el-table-column>
        <el-table-column :label="$t('langDisabled')">
          <template slot-scope="scope">
            <el-switch
                :active-value="0"
                :inactive-value="1"
                v-model="scope.row.state"
                @change="stateChange(scope.row)">
            <el-switch :active-value="0" :inactive-value="1" v-model="scope.row.state" @change="stateChange(scope.row)">
            </el-switch>
          </template>
        </el-table-column>
        <el-table-column label="操作">
  <template slot-scope="scope">
    <el-button  type="primary" icon="el-icon-refresh" @click="resetPassword(scope.row)">
      {{ $t('resetPassword') }}
    </el-button>
  </template>
</el-table-column>
          <template slot-scope="scope">
            <el-button type="primary" icon="el-icon-refresh" @click="resetPassword(scope.row)">
              {{ $t('resetPassword') }}
            </el-button>
          </template>
        </el-table-column>
        <el-table-column :label="$t('langAction')">
          <template slot-scope="scope">
            <!--修改-->
            <el-tooltip effect="dark" :content="$t('langEdit')" placement="top" :enterable="false">
              <el-button type="primary" icon="el-icon-edit" size="mini"
                         @click="showEditDialog(scope.row.id)"></el-button>
              <el-button type="primary" icon="el-icon-edit" size="mini" @click="showEditDialog(scope.row.id)"></el-button>
            </el-tooltip>
            <!--删除-->
            <el-tooltip effect="dark" :content="$t('langDelete')" placement="top" :enterable="false">
              <el-button type="danger" icon="el-icon-delete" size="mini"
                         @click="removeUserById(scope.row)"></el-button>
              <el-button type="danger" icon="el-icon-delete" size="mini" @click="removeUserById(scope.row)"></el-button>
            </el-tooltip>
          </template>
        </el-table-column>
      </el-table>
      <!--分页区域-->
       <el-pagination
      @size-change="handleSizeChange"
      @current-change="handleCurrentChange"
      :current-page="queryInfo.pageNum"
      :page-sizes="[6, 12, 18, 24]"
      :page-size="queryInfo.pageSize"
      :total="userList.total"
      :pager-count="7"
      :layout="layout"
    >
    </el-pagination>
      <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
        :current-page="queryInfo.pageNum" :page-sizes="[6, 12, 18, 24]" :page-size="queryInfo.pageSize"
        :total="userList.total" :pager-count="7" :layout="layout">
      </el-pagination>
    </el-card>
    <!--添加用户的对话框-->
    <el-dialog
        :title="$t('langAddUserTitle')"
        :visible.sync="addDialogVisible"
        width="50%"
        @close="addDialogClosed">
    <el-dialog :title="$t('langAddUserTitle')" :visible.sync="addDialogVisible" width="50%" @close="addDialogClosed">
      <!--内容主体区域-->
      <el-form :model="addUserForm" :rules="addUserRules" ref="addUserRef" label-width="100px">
        <el-form-item :label="$t('langUsername')" prop="username" >
          <el-input v-model="addUserForm.username" ></el-input>
        <el-form-item :label="$t('langUsername')" prop="username">
          <el-input v-model="addUserForm.username"></el-input>
        </el-form-item>
        <el-form-item :label="$t('langPassword')" prop="password" >
        <el-form-item :label="$t('langPassword')" prop="password">
          <el-input v-model="addUserForm.password" type="password"></el-input>
        </el-form-item>
        <el-form-item :label="$t('langEmail')" prop="email">
          <el-input v-model="addUserForm.email"></el-input>
        </el-form-item>
        <el-form-item :label="$t('langState')" prop="state">
          <el-select v-model="addUserForm.state" >
            <el-option v-for="(item,index) in options"
                       :key="index"
                       :value="item.value"
                       :label="item.label">
          <el-select v-model="addUserForm.state">
            <el-option v-for="(item, index) in options" :key="index" :value="item.value" :label="item.label">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item :label="$t('role')" prop="roleId">
          <el-select filterable v-model="addUserForm.roleId" :placeholder="$t('langSelect')"  >
            <el-option v-for="item in roleList"
                       :key="item.id"
                       :value="item.id"
                       :label="item.name">
          <el-select filterable v-model="addUserForm.roleId" :placeholder="$t('langSelect')">
            <el-option v-for="item in roleList" :key="item.id" :value="item.id" :label="item.name">
            </el-option>
          </el-select>
        </el-form-item>
@@ -125,21 +102,15 @@
      </span>
    </el-dialog>
    <!--修改用户的对话框-->
    <el-dialog
        :title="$t('langEditUserTitle')"
        :visible.sync="editDialogVisible"
        width="50%">
    <el-dialog :title="$t('langEditUserTitle')" :visible.sync="editDialogVisible" width="50%">
      <!--内容主体区域-->
      <el-form :model="editUserForm" :rules="addUserRules" ref="addCategoryRef" label-width="100px">
        <el-form-item :label="$t('langUsername')" prop="username">
          <el-input v-model="editUserForm.username" disabled></el-input>
        </el-form-item>
        <el-form-item :label="$t('role')" prop="roleId">
          <el-select filterable v-model="editUserForm.roleId" :placeholder="$t('langSelect')" >
            <el-option v-for="item in roleList"
                       :key="item.id"
                       :value="item.id"
                       :label="item.name">
          <el-select filterable v-model="editUserForm.roleId" :placeholder="$t('langSelect')">
            <el-option v-for="item in roleList" :key="item.id" :value="item.id" :label="item.name">
            </el-option>
          </el-select>
        </el-form-item>
@@ -147,11 +118,8 @@
          <el-input v-model="editUserForm.email"></el-input>
        </el-form-item>
        <el-form-item :label="$t('langDisabled')" prop="state">
          <el-select v-model="editUserForm.state" >
            <el-option v-for="(item,index) in options"
                       :key="index"
                       :value="item.value"
                       :label="item.label">
          <el-select v-model="editUserForm.state">
            <el-option v-for="(item, index) in options" :key="index" :value="item.value" :label="item.label">
            </el-option>
          </el-select>
        </el-form-item>
@@ -166,15 +134,15 @@
<script>
import {getById, removeById, saveOrUpdate, selectPage,resetPass} from "../../api/user";
import {select} from "../../api/role";
import { getById, removeById, saveOrUpdate, selectPage, resetPass } from "../../api/user";
import { select } from "../../api/role";
import LanguageMixin from '../../lang/LanguageMixin'
export default {
  name: "User",
  mixins: [LanguageMixin],
  data() {
  data () {
    return {
      layout: 'total, sizes, prev, pager, next, jumper',
      queryInfo: {
@@ -193,23 +161,23 @@
      editUserForm: {
        roleId: null,
        name:null,
        roleid:null,
        name: null,
        roleid: null,
      },
      // 添加分类的验证规则
      addUserRules: {
        roleId: null,
        username: [
          {required: true, message: '请输入用户名', trigger: 'blur'},
          {min: 5, max: 15, message: '长度在 5 到 15 个字符', trigger: 'blur'}
          { required: true, message: '请输入用户名', trigger: 'blur' },
          { min: 5, max: 15, message: '长度在 5 到 15 个字符', trigger: 'blur' }
        ],
        password: [
          {required: true, message: '请输入密码', trigger: 'blur'},
          {min: 5, max: 15, message: '长度在 5 到 15 个字符', trigger: 'blur'}
          { required: true, message: '请输入密码', trigger: 'blur' },
          { min: 5, max: 15, message: '长度在 5 到 15 个字符', trigger: 'blur' }
        ],
        email: [
          {required: true, message: '请输入邮箱', trigger: 'blur'},
          {type: 'email', message: '请输入正确格式的邮箱地址', trigger: 'blur'}
          { required: true, message: '请输入邮箱', trigger: 'blur' },
          { type: 'email', message: '请输入正确格式的邮箱地址', trigger: 'blur' }
        ]
      },
      // 控制添加用户弹框的显示和隐藏
@@ -217,95 +185,95 @@
      // 控制修改用户弹框的显示和隐藏
      editDialogVisible: false,
      options: [
        {label: '正常', value: 1},
        {label: '禁用', value: 0}
        { label: '正常', value: 1 },
        { label: '禁用', value: 0 }
      ],
      roleList: [],
    }
  },
  created() {
  created () {
    this.getUserList();
  },
  methods: {
    getUserList() {
    getUserList () {
      selectPage(this.queryInfo).then(res => {
        this.userList.records = res.data.records;
        this.userList.total = res.data.total
      });
//       test().then(res => {
//         console.log(res.data)
//       });
//       const data6 = [
//   { id: 32, deviceName: 'Device 7', address: 'Address 1' },
//   { id: 33, deviceName: 'Device 8', address: 'Address 2' },
// ];
      //       test().then(res => {
      //         console.log(res.data)
      //       });
      //       const data6 = [
      //   { id: 32, deviceName: 'Device 7', address: 'Address 1' },
      //   { id: 33, deviceName: 'Device 8', address: 'Address 2' },
//       testup(data6).then(res => {
//         console.log(res.data);
//       });
//       call({
//   id: 1,
//   name: 12345
// }).then(res => {
//         console.log(res.data);
//       });
      // ];
      //       testup(data6).then(res => {
      //         console.log(res.data);
      //       });
      //       call({
      //   id: 1,
      //   name: 12345
      // }).then(res => {
      //         console.log(res.data);
      //       });
    },
    showAddDialog() {
    showAddDialog () {
      this.addDialogVisible = true;
       select().then(res => {
  this.roleList = res.data;
});
      select().then(res => {
        this.roleList = res.data;
      });
    },
    // stateChange(info) {
    //   saveOrUpdate(info).then(() => {
    //     this.$message.success("更新状态成功")
    //   });
    // },
    stateChange(info) {
  saveOrUpdate(info).then(() => {
    const successMessage = this.$t('updateSuccessMessage');
    this.$message.success(successMessage);
  });
},
    resetPassword(info) {
  this.$confirm('确认重置密码为默认值吗?', '重置密码', {
    confirmButtonText: '确定',
    cancelButtonText: '取消',
    type: 'warning',
  })
    .then(() => {
      resetPass(info).then(() => {
        this.$message.success('密码已重置为默认值');
    stateChange (info) {
      saveOrUpdate(info).then(() => {
        const successMessage = this.$t('updateSuccessMessage');
        this.$message.success(successMessage);
      });
    })
    .catch(() => {
      // 用户取消重置密码操作
    });
},
    showEditDialog(id) {
      getById({id: id}).then(res => {
    },
    resetPassword (info) {
      this.$confirm('确认重置密码为默认值吗?', '重置密码', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
      })
        .then(() => {
          resetPass(info).then(() => {
            this.$message.success('密码已重置为默认值');
          });
        })
        .catch(() => {
          // 用户取消重置密码操作
        });
    },
    showEditDialog (id) {
      getById({ id: id }).then(res => {
        this.editUserForm = res.data;
        this.editDialogVisible = true;
      });
      select().then(res => {
  this.roleList = res.data;
});
        this.roleList = res.data;
      });
    },
    removeUserById(user) {
    removeUserById (user) {
      // 弹框询问用户是否删除分类
      this.$confirm('此操作将永久删除该分类, 是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        removeById({id: user.id}).then(() => {
        removeById({ id: user.id }).then(() => {
          // 重新获取分类列表
          this.getUserList();
          this.$message.success("删除用户成功");
@@ -314,18 +282,18 @@
        this.$message.info('已取消删除');
      });
    },
    handleSizeChange(newSize) {
    handleSizeChange (newSize) {
      this.queryInfo.pageSize = newSize;
      this.getUserList()
    },
    handleCurrentChange(newPage) {
    handleCurrentChange (newPage) {
      this.queryInfo.pageNum = newPage;
      this.getUserList()
    },
    addDialogClosed() {
    addDialogClosed () {
      this.$refs['addUserRef'].resetFields();
    },
    addUser() {
    addUser () {
      this.$refs.addUserRef.validate(async valid => {
        if (!valid) return;
        saveOrUpdate(this.addUserForm).then(() => {
@@ -337,10 +305,10 @@
        });
      })
    },
    editUserInfo() {
    editUserInfo () {
      this.$refs.addCategoryRef.validate(async valid => {
        if (!valid) return;
        saveOrUpdate(this.editUserForm).then(() => {
          const 修改用户成功 = this.$t('修改用户成功');
          this.$message.success(修改用户成功);
springboot-vue3/package-lock.json
New file
@@ -0,0 +1,6 @@
{
  "name": "springboot-vue3",
  "lockfileVersion": 3,
  "requires": true,
  "packages": {}
}
springboot-vue3/src/main/java/com/example/springboot/AuthorityApplication.java
@@ -5,10 +5,10 @@
import org.springframework.context.ConfigurableApplicationContext;
import com.example.springboot.component.WebSocketServer;
import org.springframework.context.annotation.Import;
@SpringBootApplication
@Import({CorsConfig.class})
public class AuthorityApplication {
  public static void main(String[] args) {
springboot-vue3/src/main/java/com/example/springboot/component/PlcHold.java
@@ -1,22 +1,19 @@
package com.example.springboot.component;
import java.util.ArrayList;
import java.util.List;
import javax.websocket.Session;
import com.example.springboot.controller.SpianController;
import com.example.springboot.service.SpianService;
import com.example.springboot.mapper.AlarmMapper;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
public class PlcHold extends Thread {
  private AlarmMapper alarmMapper;
  private SpianService spianService;
  @Override
  public void run() {
    while (this != null) {
      try {
@@ -25,39 +22,38 @@
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
      List<Boolean> bitlist = S7control.getinstance().ReadBits("DB2.0.0", 100);
      List<Short> paramlist = S7control.getinstance().ReadWord("DB100.6", 1);
      spianService = WebSocketServer.applicationContext.getBean(SpianService.class);
      //spianService.selectout("112");
      //判断进片请求 
      // List<Short> datas1List=S7control.getinstance().ReadWord("DB106.24", 1);
      // List<Short> datas1ListState=S7control.getinstance().ReadWord("DB106.8", 1);
      SpianController spianController=new SpianController();
      List<Short> datas1List1=new ArrayList<>();
      List<Short> datas1List2=new ArrayList<>();
      datas1List1.add((short)1);
      datas1List2.add((short)0);
      //获取prc进片请求数据
      boolean exist = datas1List1.contains((short)1);
      boolean exist1 = datas1List2.contains((short)0);
       List<Short> datas1List=S7control.getinstance().ReadWord("DB106.24", 1);
       List<Short> datas1ListState=S7control.getinstance().ReadWord("DB106.8", 1);
      if(datas1List!=null &&datas1ListState!=null){
          //获取prc进片请求数据
       boolean exist = datas1List.contains((short)1);
       //获取进片车状态
       boolean exist1 = datas1ListState.contains((short)0);
      //进片请求为1时
      if(exist=true){
       if(exist=true){
        //当进片车空闲时
        if(exist=true){
        if(exist1=true){
        //获取进片id
        List<Short> datas1ListID=S7control.getinstance().ReadWord("DB106.26", 13);
        //获取玻璃id
        for(Short list1:datas1ListID)
        spianController.selectAll(list1);
        //获取玻璃id
        for(Short list1:datas1ListID){
            spianService.selectAll((short)list1);
        }
        //System.out.println(exist);
      }
            //获取进片id
            // List<Short> datas1ListID=S7control.getinstance().ReadWord("DB106.26", 13);
        
        //System.out.println(exist);
      }
    }
      
      // 查询数据库
      // 推送到前端
springboot-vue3/src/main/java/com/example/springboot/component/Plcalarm.java
@@ -20,71 +20,75 @@
      }
      List<Boolean> plclist = S7control.getinstance().ReadBits("DB104.DBx0.0", 40);
      if (plclist == null) {
      JSONObject jsonObject = new JSONObject();
      } else {
      jsonObject.append("params", plclist);
      WebSocketServer sendwServer = WebSocketServer.sessionMap.get("alarm");
      if (sendwServer != null) {
        sendwServer.sendMessage(jsonObject.toString());
      }
        JSONObject jsonObject = new JSONObject();
      Short[] shuzu1 = plclist.toArray(new Short[0]);
      // Short[] shuzu1 = {
      // 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
      // 1, 0, 1, 0, 0,
      // 1, 0, 1, 0, 1, 0, 1, 0, 1,
      // };
        jsonObject.append("params", plclist);
        WebSocketServer sendwServer = WebSocketServer.sessionMap.get("alarm");
        if (sendwServer != null) {
          sendwServer.sendMessage(jsonObject.toString());
        }
        // 将读取plc数据的plclist转换为数组
        Short[] shuzu1 = plclist.toArray(new Short[0]);
        // Short[] shuzu1 = {
        // 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
        // 1, 0, 1, 0, 0,
        // 1, 0, 1, 0, 1, 0, 1, 0, 1,
        // };
      String[] shuzu = {
          "D01 VFD error",
          "D02 VFD error",
          "D03 VFD error",
          "D04 VFD error",
          "D05 VFD error",
          "D06 VFD error",
          "B01 VFD error",
          "B02 VFD error",
          "A01 VFD error",
          "A02 VFD error",
          "A01 servo turn error",
          "A02 servo turn error",
          "A01 servo travel error",
          "A02 servo travel error",
          "B01 servo travel error",
          "B02 servo travel error",
          "D01 DEC error",
          "D01 pos error",
          "D02 DEC error",
          "D02 pos error",
          "D03 DEC error",
          "D03 pos error",
          "D04 DEC error",
          "D04 pos error",
          "D05 DEC error",
          "D05 pos error",
          "D06 DEC error",
          "D06 pos error",
          "A01 DEC error",
          "A01 pos error",
          "A02 DEC error",
          "A02 pos error",
          "B01 IN DEC error",
          "B01 IN pos error",
          "B01 OUT DEC error",
          "B01 OUT pos error",
          "B02 IN DEC error",
          "B02 IN pos error",
          "B02 OUT DEC error",
          "B02 OUT pos error",
      };
      alarmMapper = WebSocketServer.applicationContext.getBean(AlarmMapper.class);
      for (short i = 0; i < shuzu1.length; i++) {
        short result = alarmMapper.selectnullti(shuzu[i]);
        if (shuzu1[i] == 1 && result == 0) {
          // alarmMapper.Insertalarm(shuzu[i]);
        } else if (shuzu1[i] == 0 && result > 0) {
          alarmMapper.updatealarm(shuzu[i]);
        String[] shuzu = {
            "D01 VFD error",
            "D02 VFD error",
            "D03 VFD error",
            "D04 VFD error",
            "D05 VFD error",
            "D06 VFD error",
            "B01 VFD error",
            "B02 VFD error",
            "A01 VFD error",
            "A02 VFD error",
            "A01 servo turn error",
            "A02 servo turn error",
            "A01 servo travel error",
            "A02 servo travel error",
            "B01 servo travel error",
            "B02 servo travel error",
            "D01 DEC error",
            "D01 pos error",
            "D02 DEC error",
            "D02 pos error",
            "D03 DEC error",
            "D03 pos error",
            "D04 DEC error",
            "D04 pos error",
            "D05 DEC error",
            "D05 pos error",
            "D06 DEC error",
            "D06 pos error",
            "A01 DEC error",
            "A01 pos error",
            "A02 DEC error",
            "A02 pos error",
            "B01 IN DEC error",
            "B01 IN pos error",
            "B01 OUT DEC error",
            "B01 OUT pos error",
            "B02 IN DEC error",
            "B02 IN pos error",
            "B02 OUT DEC error",
            "B02 OUT pos error",
        };
        alarmMapper = WebSocketServer.applicationContext.getBean(AlarmMapper.class);
        for (short i = 0; i < shuzu1.length; i++) {
          short result = alarmMapper.selectnullti(shuzu[i]);
          if (shuzu1[i] == 1 && result == 0) {
            alarmMapper.Insertalarm(shuzu[i]);
          } else if (shuzu1[i] == 0 && result > 0) {
            alarmMapper.updatealarm(shuzu[i]);
          }
        }
      }
    }
springboot-vue3/src/main/java/com/example/springboot/component/Plchome.java
@@ -2,9 +2,9 @@
import cn.hutool.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
import org.springframework.context.ConfigurableApplicationContext;
import com.example.springboot.entity.StorageCage;
import com.example.springboot.entity.alarmmg;
@@ -18,13 +18,14 @@
    public void run() {
        while (this != null) {
            try {
                Thread.sleep(10000);
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            JSONObject jsonObject = new JSONObject();
            
            //注入mapper
            homeMapper = WebSocketServer.applicationContext.getBean(HomeMapper.class);
            // 笼子使用情况
            List<StorageCage> tableData = homeMapper.selectAll();
@@ -46,27 +47,21 @@
            //查询报警信息
            List<alarmmg> alarmmg=homeMapper.SelectAlarmmgInfo();
            jsonObject.append("alarmmg", alarmmg);
            //读去Plc进片车与出片车位置
            // List<String> addressList = new ArrayList<>();
            // addressList.add("DB100.DBW0");
            // addressList.add("DB100.DBW2");
            // List<Short> paramlist = S7control.getinstance().ReadWord(addressList);
            // jsonObject.append("params", paramlist);
            jsonObject.append("params", new short[] { 30, 40, });
            //读去Plc进片车与出片车位置W
            List<String> addressList = new ArrayList<String>();
            addressList.add("DB105.DBW0");
            addressList.add("DB105.DBW12");
            List<Short> paramlist = S7control.getinstance().ReadWord(addressList);
            //将集合转为数组
            if(paramlist!=null){
                Short[] paramlists = paramlist.toArray(new Short[0]);
                jsonObject.append("params", paramlists);
            }
            // jsonObject.append("params", new short[] { 30, 40, });
            WebSocketServer sendwServer = WebSocketServer.sessionMap.get("Home");
            if (sendwServer != null) {
                sendwServer.sendMessage(jsonObject.toString());
            }
            // JSONObject jsonObject = new JSONObject();
            // jsonObject.append("params", new short[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
            // 11, });
            // WebSocketServer sendwServer = WebSocketServer.sessionMap.get("Home");
            // if (sendwServer != null) {
            // sendwServer.sendMessage(jsonObject.toString());
            // }
        }
    }
springboot-vue3/src/main/java/com/example/springboot/component/Plcsign.java
@@ -16,19 +16,22 @@
      }
      List<Boolean> plclist = S7control.getinstance().ReadBits("DB102.DBX0.0", 58);
      if (plclist == null) {
      JSONObject jsonObject = new JSONObject();
      // jsonObject3.append("sig",
      // new short[] { 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
      // 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
      // 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
      // });
      jsonObject.append("sig", plclist);
      WebSocketServer sendwServer3 = WebSocketServer.sessionMap.get("Sign");
      if (sendwServer3 != null) {
        sendwServer3.sendMessage(jsonObject.toString());
      } else {
        JSONObject jsonObject = new JSONObject();
        // jsonObject3.append("sig",
        // new short[] { 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
        // 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
        // 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
        // });
        jsonObject.append("sig", plclist);
        WebSocketServer sendwServer3 = WebSocketServer.sessionMap.get("Sign");
        if (sendwServer3 != null) {
          sendwServer3.sendMessage(jsonObject.toString());
        }
      }
    }
  }
}
springboot-vue3/src/main/java/com/example/springboot/component/Plcstate.java
@@ -16,16 +16,20 @@
      }
      List<Short> plclist = S7control.getinstance().ReadWord("DB103.DBW0", 10);
      if (plclist == null) {
      JSONObject jsonObject = new JSONObject();
      // jsonObject.append("sta",
      // new short[] { 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, });
      jsonObject.append("sta", plclist);
      WebSocketServer sendwServer = WebSocketServer.sessionMap.get("State");
      if (sendwServer != null) {
        sendwServer.sendMessage(jsonObject.toString());
      } else {
        JSONObject jsonObject = new JSONObject();
        // jsonObject.append("sta",
        // new short[] { 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, });
        jsonObject.append("sta", plclist);
        WebSocketServer sendwServer = WebSocketServer.sessionMap.get("State");
        if (sendwServer != null) {
          sendwServer.sendMessage(jsonObject.toString());
        }
      }
    }
  }
}
springboot-vue3/src/main/java/com/example/springboot/component/WebSocketServer.java
@@ -5,7 +5,6 @@
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.catalina.core.ApplicationContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
springboot-vue3/src/main/java/com/example/springboot/config/AppRunnerConfig.java
@@ -25,7 +25,11 @@
    //
    System.out.println("启动完成");
//    new PlcHold().start();
  new PlcHold().start();
    new Plcaction().start();
@@ -33,7 +37,7 @@
    new PlcParameter().start();
  /*  new Plcalarm().start();*/
 new Plcalarm().start();
    new Plcsign().start();
springboot-vue3/src/main/java/com/example/springboot/controller/AlarmController.java
@@ -35,22 +35,21 @@
  @GetMapping("/stTime")
  public Result selecttime(String shijian1, String shijian2) {
    System.out.println("++++++");
    System.out.println(shijian1);
    if (shijian1 != "" || shijian2 != "") {
      String sj1 = shijian1.replace("#20", " ");
      String sj2 = shijian2.replace("#20", " ");
      List<alarmmg> storageCagelist = alarmMapper.selecttime(sj1, sj2);
      Map<String, Object> map = new HashMap<>();
      map.put("list", storageCagelist);
      return Result.success(map);
    } else {
      List<alarmmg> storageCagelist = alarmMapper.selectAll();
      Map<String, Object> map = new HashMap<>();
      map.put("list", storageCagelist);
      return Result.success(map);
    }
    // if (shijian1 != "" || shijian2 != "") {
    // 将get方法传过来的参数中"#20"替换为" "
    String sj1 = shijian1.replace("#20", " ");
    String sj2 = shijian2.replace("#20", " ");
    List<alarmmg> storageCagelist = alarmMapper.selecttime(sj1, sj2);
    Map<String, Object> map = new HashMap<>();
    map.put("list", storageCagelist);
    return Result.success(map);
    // } else {
    // List<alarmmg> storageCagelist = alarmMapper.selectAll();
    // Map<String, Object> map = new HashMap<>();
    // map.put("list", storageCagelist);
    // return Result.success(map);
    // }
  }
springboot-vue3/src/main/java/com/example/springboot/controller/HomeController.java
@@ -8,6 +8,7 @@
import com.example.springboot.mapper.HomeMapper;
import com.example.springboot.service.HomeService;
import com.example.springboot.service.SpianService;
import com.example.springboot.common.Result;
import com.example.springboot.entity.StorageCage;
import com.example.springboot.entity.alarmmg;
@@ -23,84 +24,111 @@
    @Autowired
    HomeService storageRackService;
    @GetMapping("/load")
    public Result selectAll(){
        List<StorageCage> storageCagelist=homeMapper.selectAll();
    @Autowired
    SpianService spianService;
    @GetMapping("/load")
    public Result selectAll() {
        List<StorageCage> storageCagelist = homeMapper.selectAll();
        Map<String, Object> map = new HashMap<>();
        map.put("list",storageCagelist);
        map.put("list", storageCagelist);
        return Result.success(map);
    }
    @GetMapping("/loads")
    public Result selectRack(){
        List<StorageCage> storageCagelist1=homeMapper.selectRack1();
        List<StorageCage> storageCagelist2=homeMapper.selectRack2();
        List<StorageCage> storageCagelist3=homeMapper.selectRack3();
        List<StorageCage> storageCagelist4=homeMapper.selectRack4();
    @GetMapping("/loads")
    public Result selectRack() {
        List<StorageCage> storageCagelist1 = homeMapper.selectRack1();
        List<StorageCage> storageCagelist2 = homeMapper.selectRack2();
        List<StorageCage> storageCagelist3 = homeMapper.selectRack3();
        List<StorageCage> storageCagelist4 = homeMapper.selectRack4();
        Map<String, Object> map = new HashMap<>();
        map.put("list1",storageCagelist1);
        map.put("list2",storageCagelist2);
        map.put("list3",storageCagelist3);
        map.put("list4",storageCagelist4);
        map.put("list1", storageCagelist1);
        map.put("list2", storageCagelist2);
        map.put("list3", storageCagelist3);
        map.put("list4", storageCagelist4);
        return Result.success(map);
    }
    @GetMapping("/loadinout")
    public Result selectinout(Integer types){
        List<StorageCage> storageCageinout=homeMapper.selectinout(types);
    @GetMapping("/loadinout")
    public Result selectinout(Integer types) {
        List<StorageCage> storageCageinout = homeMapper.selectinout(types);
        Map<String, Object> map = new HashMap<>();
        map.put("list",storageCageinout);
        map.put("list", storageCageinout);
        return Result.success(map);
    }
    @GetMapping("/InsertOrder")
    public Result InsertOrder(String orderid){
        short result=homeMapper.SelectOrder(orderid);
    public Result InsertOrder(String orderid) {
        short result = homeMapper.SelectOrder(orderid);
        Map<String, Object> map = new HashMap<>();
        if(result>0){
        if (result > 0) {
            homeMapper.updateOrder();
            homeMapper.InsertOrder(orderid);
            map.put("message","200");
        }else{
            map.put("message","500");
            map.put("message", "200");
        } else {
            map.put("message", "500");
        }
        return Result.success(map);
    }
    @GetMapping("/Addglassid")
    public Result Addglassid(Integer glassid){
    public Result Addglassid(short glassid) {
        Map<String, Object> map = new HashMap<>();
        short taskno=homeMapper.SelectOutTask();
        if(taskno>0){
            map.put("message2","500");
        }else{
            map.put("message2","200");
            //调用伍上片函数
        short taskno = homeMapper.SelectOutTask();
        if (taskno > 0) {
            map.put("message2", "500");
        } else {
            map.put("message2", "200");
            // 调用伍上片函数
            spianService.selectAll(glassid);
        }
        return Result.success(map);
    }
    @GetMapping("/UpdateTask")
    public Result UpdateTask(Integer types,Integer shelfrack){
    public Result UpdateTask(Integer types, Integer shelfrack) {
        Map<String, Object> map = new HashMap<>();
        homeMapper.UpdateTask(types,shelfrack);
        if(types==0){
        homeMapper.UpdateTask(types, shelfrack);
        if (types == 0) {
            homeMapper.UpdateCageTask1(shelfrack);
        }else{
        } else {
            homeMapper.UpdateCageTask2(shelfrack);
        }
        map.put("message3","200");
        map.put("message3", "200");
        return Result.success(map);
    }
    @GetMapping("/SelectAlarmmgInfo")
    public Result SelectAlarmmgInfo(){
        List<alarmmg> alarmmg=homeMapper.SelectAlarmmgInfo();
    @GetMapping("/SelectAlarmmgInfo")
    public Result SelectAlarmmgInfo() {
        List<alarmmg> alarmmg = homeMapper.SelectAlarmmgInfo();
        Map<String, Object> map = new HashMap<>();
        map.put("alarmmg",alarmmg);
        map.put("alarmmg", alarmmg);
        return Result.success(map);
    }
    @GetMapping("/SelectCageInfo")
    public Result SelectCageInfo(short cage) {
        List<StorageCage> cageinfo = homeMapper.SelectCageInfo(cage);
        Map<String, Object> map = new HashMap<>();
        map.put("cageinfo", cageinfo);
        return Result.success(map);
    }
    @GetMapping("/DeleteByGlassID")
    public Result DeleteByGlassID(short glassid) {
        homeMapper.DeleteByGlassID(glassid);
        Map<String, Object> map = new HashMap<>();
        map.put("message3", "200");
        return Result.success(map);
    }
    @GetMapping("/OutByGlassID")
    public Result OutByGlassID(String glassid) {
        spianService.selectout2(glassid);
        Map<String, Object> map = new HashMap<>();
        map.put("message3", "200");
        return Result.success(map);
    }
}
springboot-vue3/src/main/java/com/example/springboot/controller/SpianController.java
@@ -31,7 +31,7 @@
@GetMapping("/all2")
    public void selectdd(String orderid){
       SpianService service=new SpianService();
       service.selectadd(orderid);
       service.selectout(orderid);
    
}
springboot-vue3/src/main/java/com/example/springboot/entity/Glass.java
New file
@@ -0,0 +1,48 @@
package com.example.springboot.entity;
public class Glass{
    private Integer id;
    private Short orderId;
    private double glassWidth;
    private Short glassId;
    public Integer id() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public Integer getId() {
        return id;
    }
    public Short getOrderId() {
        return orderId;
    }
    public void setOrderId(Short orderId) {
        this.orderId = orderId;
    }
    public double getWidth() {
        return glassWidth;
    }
    public void setWidth(double glassWidth) {
        this.glassWidth = glassWidth;
    }
     public Short getGlassId() {
        return glassId;
    }
    public void setGlassId(Short glassId) {
        this.glassId = glassId;
    }
}
springboot-vue3/src/main/java/com/example/springboot/entity/StorageCage.java
@@ -2,6 +2,7 @@
public class StorageCage {
    private Integer id;
    private Integer prcId;
    private String glassId;
    private Integer cage;
    private Integer cell;
@@ -12,7 +13,7 @@
    private Integer tier;
    private String orderId;
    private String coating;
    private String lengthwidth;
    private String lengthWidth;
    public Integer id() {
        return id;
@@ -25,6 +26,14 @@
    public Integer getId() {
        return id;
    }
    public Integer getPrcId() {
        return prcId;
    }
    public void setPrcId(Integer prcId) {
        this.prcId = prcId;
    }
    public String getGlassId() {
        return glassId;
@@ -107,10 +116,10 @@
    }
    public String getLengthWidth() {
        return lengthwidth;
        return lengthWidth;
    }
    public void setLengthWidth(String lengthwidth) {
        this.lengthwidth = lengthwidth;
    public void setLengthWidth(String lengthWidth) {
        this.lengthWidth = lengthWidth;
    }
}
springboot-vue3/src/main/java/com/example/springboot/entity/alarmmg.java
@@ -2,11 +2,14 @@
import java.util.Date;
public class alarmmg {
  private Integer id;
  private String content;
  private Date timeon;
  private Date endTime;
  private String timeons;
  public void setid(Integer id) {
    this.id = id;
@@ -40,4 +43,12 @@
    return endTime;
  }
  public void settimeons(String timeons) {
    this.timeons = timeons;
  }
  public String gettimeons() {
    return timeons;
  }
}
springboot-vue3/src/main/java/com/example/springboot/mapper/HomeMapper.java
@@ -10,23 +10,23 @@
@Mapper
public interface HomeMapper {
  //查询每个笼子的使用情况
  @Select("SELECT cage,round(round(sum(state)/42,2)*100) as cell,42-sum(state) as state FROM storage_cage group by cage")
  @Select("SELECT cage,ROUND(sum(case when state=1 or state=2 or state=3 then 1 else 0 end)/42*100) as cell,42-sum(case when state=1 or state=2 or state=3 then 1 else 0 end) as state FROM `storage_cage` group by cage")
  List<StorageCage> selectAll();
  // 查询1-5笼内层格子状态
  @Select("SELECT state from storage_cage where cage<=5 and tier=1")
  @Select("SELECT cage,state from storage_cage where cage<=5 and tier=1")
  List<StorageCage> selectRack1();
  // 查询6-10笼内层格子状态
  @Select("SELECT state from storage_cage where cage>5 and tier=1")
  @Select("SELECT cage,state from storage_cage where cage>5 and tier=1")
  List<StorageCage> selectRack2();
  // 查询1-5笼外层格子状态
  @Select("SELECT state from storage_cage where cage<=5 and tier=2")
  @Select("SELECT cage,state from storage_cage where cage<=5 and tier=2")
  List<StorageCage> selectRack3();
  // 查询6-10笼外层格子状态
  @Select("SELECT state from storage_cage where cage>5 and tier=2")
  @Select("SELECT cage,state from storage_cage where cage>5 and tier=2")
  List<StorageCage> selectRack4();
  // 根据任务类型查询当前正在出片,进片的玻璃信息
@@ -62,6 +62,14 @@
  void UpdateCageTask2(@Param("cell") Integer cell);
  //获取报警信息
  @Select("select * from alarmmg where endTime is null")
  @Select("select id,content,timeon as timeons,endTime from alarmmg where endTime is null")
  List<alarmmg> SelectAlarmmgInfo();
  //获取理片笼内玻璃信息
  @Select("select *,concat(glasswidth,' x ',glassheight) as lengthwidth from storage_cage where cage=#{cage} ")
  List<StorageCage> SelectCageInfo(short cage);
  @Update("update storage_cage set state=0,glass_id=null,order_id=null,glasswidth=null,glassheight=null,coating=null where glass_id=#{glassid}")
  void DeleteByGlassID(short glassid);
}
springboot-vue3/src/main/java/com/example/springboot/mapper/SpianMapper.java
@@ -2,6 +2,7 @@
import org.apache.ibatis.annotations.*;
import com.example.springboot.common.Result;
import com.example.springboot.entity.Glass;
import com.example.springboot.entity.StorageCage;
import com.example.springboot.entity.StorageTask;
import com.example.springboot.entity.StorageCage;
@@ -12,7 +13,7 @@
public interface SpianMapper {
    //判断相邻笼子是否有空格  
    @Select("select COUNT(if(a.state1=0,cell,null))as cell,ROUND(id/2)as id from (select *,max(state)as state1 from storage_cage a  GROUP BY cage,cell)as a where (a.cage=#{cage1}-1 or a.cage=#{cage1}+1)and if(#{cage1}<6,a.cage>0 and a.cage<6,a.cage>5) GROUP BY cage ORDER BY cell desc LIMIT 1")
    @Select("select COUNT(if(a.state1=0,cell,null))as cell,ROUND(id/2)as id from (select *,max(state)as state1 from storage_cage a  GROUP BY cage,cell)as a where (a.cage=#{cage1}-1 or a.cage=#{cage1}+1)and if(a.cage<6,a.cage>0 and a.cage<6,a.cage>5) GROUP BY cage ORDER BY cell desc LIMIT 1")
     int selectCage(int  cage1);
     
     //@Select("(select*from storage_cage as a  where a.state=0 and cage%2=0 ORDER BY id LIMIT 1)union (select a.* from storage_cage a inner join  (select cage,if(shu2=1,shu3,shu5) as gezi from ( select  cage, count(case when state1=1 and state2=0 then cell else null end)as shu1,  count(case when state1=0 then cell else null end) as shu2, min(case when state1=1 and state2=0 then cell else null end) as shu3, min(case when state1=0 then cell else null end) as shu4, min(case when state1=0 or state2=0 then cell else null end) as shu5 from  (select *,max(state) as state1,min(state) as state2 from storage_cage group by cage,cell) as a where  cage%2!=0  GROUP BY cage HAVING shu2>1 or (shu2=1 and shu1>0)  ) as sss limit 1)as b on a.cage=b.cage and a.cell=b.gezi and a.state=0 order by tier limit 1) ORDER BY id LIMIT 1;")
@@ -21,35 +22,47 @@
     List<StorageCage> selectAll(Short glassid);
     //判断该笼子是否有合适宽度空格
     @Select("select COUNT(*),cage,cell,IF(tier=1,0,1)as tier,ROUND(id/2)as id from storage_cage where cage=#{cage1} and state=0 and width>=#{width} ORDER BY cell,tier")
     @Select("select cage,cell,tier,id,ROUND(id/2)as prcId from storage_cage where cage=#{cage1} and state=0 and width>=#{width} ORDER BY cell,tier LIMIT 1")
     StorageCage selectCage1(int  cage1,double width);
     //判断笼子内玻璃数
     @Select("select COUNT(tier)as tier from storage_cage where  cage=#{cage} and cell=#{cell} and state=1;")
     int selectsum(int cage,int cell);
    //@Update("update longzi set glass_id = #{glass_id}, width = #{width}, state = #{state} where cell = #{cell}")
    @Update("update longzi set glass_id =123, width =1600, state =1 where cell =24")
     void  update();
     //获取玻璃信息
     @Select("select orderid,width from glass where glassid=#{glassid}")
     Glass selectGlass(Short glassid);
    
    @Insert("insert into storage_task(task_type,task_state,shelf_rack,load_rack)values(#{storage_task},#{task_state},#{shelf_rack},#{load_rack})")
     void insert(StorageTask storageTask);
    
    //出片任务查询
    @Select("select cage,cell,tier,glasswidth,ROUND(id/2)as id from storage_cage as a where a.order_id=#{orderId} and state=1 order by cage desc,tier desc,cell desc LIMIT 1")
    @Select("select cage,cell,tier,glasswidth,ROUND(id/2)as prcId,id from storage_cage as a where a.order_id=#{orderId} and state=1 order by cage desc,tier desc,cell desc LIMIT 1")
     StorageCage selectOut(String  orderId);
    //按玻璃ID出片任务查询
    @Select("select cage,cell,tier,glasswidth,ROUND(id/2)as prcId,id from storage_cage as a where a.order_id=#{orderId} and state=1 order by cage desc,tier desc,cell desc LIMIT 1")
     StorageCage selectOut2(String  glassid);
    //判断出片为1时,是否可直接出片
    @Select("select state from storage_cage where cage=#{cage} and cell=#{cell} and tier=2;")
     int selectGlassState(int  cage,int cell);
     //判断该调拨的笼子
     @Select("select cage,cell,max(state)as shu,ROUND(id/2)as id from storage_cage where width>=#{width} and cage>#{cage1} and cage<#{cage2} GROUP BY cage,cell HAVING shu=0 order by abs(#{cage} - cage) limit 1;")
     @Select("select cage,cell,max(state)as shu,ROUND(id/2)as prcid,id from storage_cage where width>=#{width} and cage>#{cage1} and cage<#{cage2} GROUP BY cage,cell HAVING shu=0 order by abs(#{cage} - cage) limit 1;")
     StorageCage selectGlassCage(int cage,double width,int cage1,int cage2);
    //修改笼子信息(出片)
    //删除笼子信息(出片)
    @Update("update storage_cage set state=#{state},width=width+#{width},glass_id=#{glassid},order_id=#{orderid},glasswidth=0 where cage=#{cage} and cell=#{cell} and tier=#{tier};")
    void UpdataGlassCage(String orderid,String glassid,double width,int cage,int cell,int tier,int state);
    //修改笼子信息(进片)
    @Update("update storage_cage set state=#{state},width=width-#{width},glass_id=#{glassid},order_id=#{orderid},glasswidth=#{width} where cage=#{cage} and cell=#{cell} and tier=#{tier};")
    void UpdataAddCage(String orderid,Short glassid,double width,int cage,int cell,int tier,int state);
    @Update("update storage_cage set state=#{state},width=width-#{width},glass_id=#{glassid},order_id=#{orderid},glasswidth=#{width} where id=#{id};")
    void UpdataAddCage(Short orderid,Short glassid,double width,int cage,int cell,int id,int state);
    //调拨更换笼子信息
    @Update("update storage_cage as a,(select*from storage_cage b where b.cage=#{cage} and b.cell=#{cell} and b.tier=2)as b set a.glass_id=b.glass_id,a.order_id=b.order_id,a.glasswidth=b.glasswidth,a.width=a.width-b.glasswidth,a.state=1 where a.id=#{id1}")
    void UpdateDBCage(int id1,int cage,int cell);
    // @Insert("insert into user(name, date, address, user_no) values (#{name}, #{date}, #{address}, #{userNo})")
    // void insert (Spian spian);
    
springboot-vue3/src/main/java/com/example/springboot/service/SpianService.java
@@ -9,6 +9,7 @@
import com.example.springboot.common.Result;
import com.example.springboot.component.S7control;
import com.example.springboot.entity.Glass;
import com.example.springboot.entity.StorageCage;
import com.example.springboot.mapper.SpianMapper;
@@ -17,7 +18,7 @@
    @Autowired
    private SpianMapper spianMapper;
    @GetMapping("/all2")
    public Result selectadd(String orderid){
    public Result selectout(String orderid){
        //定义PRC数据传送数组
        List<String> adddresslist=new ArrayList<>();
        adddresslist.add("DB105.6");//出片车起始位置
@@ -28,9 +29,10 @@
        //获取优先出片的位置
         StorageCage cageout=spianMapper.selectOut(orderid);
         int cage =cageout.getCage(); //储存出片位置,笼子格子几号玻璃
         int cell =cageout.getCell();
         int tier =cageout.getTier();
         int id=cageout.getId();
         int cell =cageout.getCell();//出片格号
         int tier =cageout.getTier();//出片内外片
         int prcid=cageout.getPrcId();//prcid
         int prcid2;
         int ids;
         double glasswidth=cageout.getGlassWidth();
         //判断玻璃内外片
@@ -38,7 +40,8 @@
             //判断玻璃可直接出片时
                //修改数据库笼子表(出片)
                spianMapper.UpdataGlassCage("","",glasswidth, cage, cell, tier, 0);
                datas.add((short)id);
                datas.add((short)prcid);
                datas.add((short)1000);
                datas.add((short)1);
                datas.add((short)1);
@@ -55,42 +58,55 @@
              //玻璃需要调拨时,判断属于哪个半区的笼子
               if(cage<6){
                StorageCage cagecell= spianMapper.selectGlassCage(cage,glasswidth,0,6);
                if(cagecell==null){
                    return Result.success(cagecell);
                }
                //获取调拨位置进行调拨
                prcid2=cagecell.getPrcId();//调拨目标位PRCID
                ids=cagecell.getId();//调拨目标位ID
                //更换玻璃的笼子
                spianMapper.UpdateDBCage(ids, cage, cell);//将原格子数据更新到新格子里
                spianMapper.UpdataGlassCage("", "", glasswidth, cage, cell, 2, 0);//清除原格子数据
                //填入调拨数据
                datas.add((short)id);
                datas.add((short)ids);
                datas.add((short)prcid);//调拨外片起始位置
                datas.add((short)prcid2);
                datas.add((short)2);
                datas.add((short)1);
                //传输mes数据,坐标,数据
                S7control.getinstance().WriteWord(adddresslist, datas);
                //更换玻璃的笼子
                datas.clear(); // 清空整个列表
                //判断调拨结束后再次出片,填入出片数据
                datas.add((short)id);
                datas.add((short)prcid);
                datas.add((short)1000);
                datas.add((short)1);
                datas.add((short)1);
                S7control.getinstance().WriteWord(adddresslist, datas);
                 //修改数据库笼子表(出片)
                spianMapper.UpdataGlassCage("","",glasswidth, cage, cell, tier, 0);
                return Result.success(cagecell);  //调拨位置的参数内容
                
               }else{
               }else{//笼子号大于5时
                StorageCage cagecell= spianMapper.selectGlassCage(cage,glasswidth,5,11);
                if(cagecell==null){
                    return Result.success(cagecell);
                }
                //获取调拨位置进行调拨
                prcid2=cagecell.getPrcId();//调拨目标位prcID
                ids=cagecell.getId();//调拨目标位ID
                //填入调拨数据
                datas.add((short)id);
                datas.add((short)ids);
                datas.add((short)prcid);
                datas.add((short)prcid2);
                datas.add((short)2);
                datas.add((short)1);
                //转移原调拨格子数据
                spianMapper.UpdateDBCage(ids, cage, cell);//将原格子数据更新到新格子里
                spianMapper.UpdataGlassCage("", "", glasswidth, cage, cell, 2, 0);//清除原格子数据
                //传输mes数据,坐标,数据
                S7control.getinstance().WriteWord(adddresslist, datas);
                datas.clear(); // 清空整个列表
                //判断调拨结束后再次出片
                //填入出片数据
                datas.add((short)id);
                datas.add((short)prcid);
                datas.add((short)1000);
                datas.add((short)1);
                datas.add((short)1);
@@ -110,18 +126,29 @@
    public Result selectAll(Short glassid){
        //return spianMapper.selectAll(); 
        int cage1;
        int cells;
        int ids;
        int tier;
        double widths=1500;
        int prcid;
        int tiers;
        int prctier;
        Glass glasslist=spianMapper.selectGlass(glassid);
        double widths=glasslist.getWidth();
        Short orderids=glasslist.getOrderId();
        List<String> adddresslist=new ArrayList<>();
        adddresslist.add("DB105.0");//进片车起始位置
        adddresslist.add("DB105.2");//进片车目标位置
        adddresslist.add("DB105.4");//进片笼玻璃数
        adddresslist.add("DB105.12");//进片车启动 1为启动
        List<Short> datas=new ArrayList<>();
        //String orderid="A001";
        //获取订单相关度最高的笼子排序
        List<StorageCage> storageCage=spianMapper.selectAll(glassid);
        if(storageCage==null){
                    return Result.success(storageCage);
                }
        for (StorageCage storageCage2 : storageCage) {
            //保存订单优先顺序笼子号
            cage1=storageCage2.getCage();
@@ -129,18 +156,22 @@
            int cages=spianMapper.selectCage(cage1);
            //判断选中笼子是否有合适宽度空格
            StorageCage cages1=spianMapper.selectCage1(cage1,widths);
            ids=cages1.getId();
            tier=cages1.getTier();
            ids=cages1.getId();//数据库ID
            tiers=cages1.getTier();//内外片
            cells=cages1.getCell();//格子号
            prcid=cages1.getPrcId();//传给prc的目标地id
            prctier=spianMapper.selectsum(cage1, cells);//传给prc的格子内玻璃数
            //有合适空格时进片
            if(cages>1 &&cages1.getTier()!=null){
                //执行进片
                datas.add((short)1000);
                datas.add((short)ids);
                datas.add((short)tier);
                datas.add((short)prcid);
                datas.add((short)prctier);
                datas.add((short)1);
                S7control.getinstance().WriteWord(adddresslist, datas);
                //数据库修改笼子表新增一条玻璃
                spianMapper.UpdataAddCage("glassid", glassid, widths, cages, ids, tier, 1);//还未获取玻璃id
                spianMapper.UpdataAddCage(orderids, glassid, widths, cage1, cells, ids, 1);
                return Result.success(cages1);
            }
            
@@ -149,5 +180,108 @@
        return Result.success("不可进片");      
      
    }
   @GetMapping("/all2")
    public Result selectout2(String glassid){
        //定义PRC数据传送数组
        List<String> adddresslist=new ArrayList<>();
        adddresslist.add("DB105.6");//出片车起始位置
        adddresslist.add("DB105.8");//出片车目标位置
        adddresslist.add("DB105.10");//出片笼玻璃数
        adddresslist.add("DB105.14");//出片车启动 1为启动
        List<Short> datas=new ArrayList<>();
        //获取优先出片的位置
         StorageCage cageout=spianMapper.selectOut2(glassid);
         int cage =cageout.getCage(); //储存出片位置,笼子格子几号玻璃
         int cell =cageout.getCell();//出片格号
         int tier =cageout.getTier();//出片内外片
         int prcid=cageout.getPrcId();//prcid
         int prcid2;
         int ids;
         double glasswidth=cageout.getGlassWidth();
         //判断玻璃内外片
         if(tier==2){
             //判断玻璃可直接出片时
                //修改数据库笼子表(出片)
                spianMapper.UpdataGlassCage("","",glasswidth, cage, cell, tier, 0);
                datas.add((short)prcid);
                datas.add((short)1000);
                datas.add((short)1);
                datas.add((short)1);
                S7control.getinstance().WriteWord(adddresslist, datas);
                return Result.success(datas);
         }
         else{
            //获取格子的玻璃数量
           int state= spianMapper.selectGlassState(cage,cell);
            //判断内片是否需要调拨
            if(state==0){
             return Result.success("状态为0,直接出片");
             }else{
              //玻璃需要调拨时,判断属于哪个半区的笼子
               if(cage<6){
                StorageCage cagecell= spianMapper.selectGlassCage(cage,glasswidth,0,6);
                if(cagecell==null){
                    return Result.success(cagecell);
                }
                //获取调拨位置进行调拨
                prcid2=cagecell.getPrcId();//调拨目标位PRCID
                ids=cagecell.getId();//调拨目标位ID
                //更换玻璃的笼子
                spianMapper.UpdateDBCage(ids, cage, cell);//将原格子数据更新到新格子里
                spianMapper.UpdataGlassCage("", "", glasswidth, cage, cell, 2, 0);//清除原格子数据
                //填入调拨数据
                datas.add((short)prcid);//调拨外片起始位置
                datas.add((short)prcid2);
                datas.add((short)2);
                datas.add((short)1);
                //传输mes数据,坐标,数据
                S7control.getinstance().WriteWord(adddresslist, datas);
                datas.clear(); // 清空整个列表
                //判断调拨结束后再次出片,填入出片数据
                datas.add((short)prcid);
                datas.add((short)1000);
                datas.add((short)1);
                datas.add((short)1);
                S7control.getinstance().WriteWord(adddresslist, datas);
                 //修改数据库笼子表(出片)
                return Result.success(cagecell);  //调拨位置的参数内容
               }else{//笼子号大于5时
                StorageCage cagecell= spianMapper.selectGlassCage(cage,glasswidth,5,11);
                if(cagecell==null){
                    return Result.success(cagecell);
                }
                //获取调拨位置进行调拨
                prcid2=cagecell.getPrcId();//调拨目标位prcID
                ids=cagecell.getId();//调拨目标位ID
                //填入调拨数据
                datas.add((short)prcid);
                datas.add((short)prcid2);
                datas.add((short)2);
                datas.add((short)1);
                //转移原调拨格子数据
                spianMapper.UpdateDBCage(ids, cage, cell);//将原格子数据更新到新格子里
                spianMapper.UpdataGlassCage("", "", glasswidth, cage, cell, 2, 0);//清除原格子数据
                //传输mes数据,坐标,数据
                S7control.getinstance().WriteWord(adddresslist, datas);
                datas.clear(); // 清空整个列表
                //判断调拨结束后再次出片
                //填入出片数据
                datas.add((short)prcid);
                datas.add((short)1000);
                datas.add((short)1);
                datas.add((short)1);
                S7control.getinstance().WriteWord(adddresslist, datas);
                return Result.success(cagecell);  //调拨位置的参数内容
               }
             }
        }
}
    
}