huang
2025-10-22 3eaf0f2f1b909ac429cac9fc26af767ddecda065
上片接口返回信息国际化,添加定时任务线程池配置类
2个文件已添加
18个文件已修改
398 ■■■■ 已修改文件
UI-Project/src/utils/constants.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/GlassStorage/rawfilmstorage2.vue 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Returns/upreturnhistory.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Returns/upreturns3.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/pom.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/service/impl/LoadGlassDeviceTaskHistoryServiceImpl.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/I18nConfig.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/SchedulerConfig.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/WebSocketExecutorConfig.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/resources/i18n/messages.properties 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/resources/i18n/messages_en_US.properties 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/resources/i18n/messages_zh_CN.properties 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/target/classes/mapper/UpPattenUsageMapper.xml 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/job/RawGlassPushMessage.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglassdetails/controller/RawGlassStorageDetailsController.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/engineering/controller/EngineeringController.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/job/OpcLoadGlassTask.java 47 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/job/PlcLoadGlassTask.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/loadglassdevicetaskhistory/controller/LoadGlassDeviceTaskHistoryController.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/uppattenusage/controller/UpPattenUsageController.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/utils/constants.js
@@ -1,6 +1,6 @@
// export const WebSocketHost = "192.168.10.86";
export const WebSocketHost = "192.168.10.86";
// export const WebSocketHost = "192.168.0.39";
export const WebSocketHost = "10.153.19.179";
// export const WebSocketHost = "10.153.19.179";
// export const WebSocketHost = "10.153.19.47";
// export const WebSocketHost = "10.153.19.162";
// export const WebSocketHost = "127.0.0.1";
UI-Project/src/views/GlassStorage/rawfilmstorage2.vue
@@ -9,6 +9,9 @@
import { closeWebSocket, initializeWebSocket } from '@/utils/WebSocketService';
import { inject } from 'vue';
const router = useRouter()
// 表格加载状态(转圈)
const loading = ref(true)
const tableDataa = ref([])
const tableDatab = ref([])
const tableDatad = ref([])
@@ -136,6 +139,7 @@
  rawTableData.value = formattedTasks;
  tableDataa.value = formattedTasks;
  if (data.rawStationDetailsList != null) {
    loading.value = false
    tableDatab.value = data.rawStationDetailsList[0]
    if (data.rawStationDetailsList[0][0].patternThickness != null) {
      card1.value = true
@@ -289,6 +293,11 @@
const handleEdit = (row) => {
  window.localStorage.setItem('deviceId', row.deviceId)
  window.localStorage.setItem('slot', row.slot)
  patternWidth.value = row.patternWidth;
  patternHeight.value = row.patternHeight;
  patternThickness.value = row.patternThickness;
  filmsId.value = row.filmsId;
  remainQuantity.value = row.remainQuantity;
  Edit.value = true;
};
const handleBinda = (row) => {
@@ -475,7 +484,7 @@
  tableDataa.value = filteredData;
  ElMessage.success(`查询成功,共 ${filteredData.length} 条数据`);
  ElMessage.success(t('film.inquire') + ` ${filteredData.length} ` + t('searchOrder.tit'));
};
// 是否禁用
@@ -805,7 +814,7 @@
    </div>
    <el-dialog v-model="dialogFormVisiblea" top="5vh" width="85%">
      <el-table ref="table" style="margin-top: 20px;height: 700px;" :data="tableDatab"
      <el-table ref="table" style="margin-top: 20px;height: 700px;" :data="tableDatab" v-loading="loading"
        :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }">
        <!-- <el-table-column prop="deviceId" fixed align="center" :label="$t('film.station')" min-width="80" /> -->
        <el-table-column prop="slot" fixed align="center" :label="$t('film.slot')" min-width="80" />
UI-Project/src/views/Returns/upreturnhistory.vue
@@ -299,7 +299,7 @@
    case 2:  
      return t('searchOrder.endtask');
    case 3:  
      return t('film.fail');
      return t('searchOrder.breakage');
  }  
}
function getStatusTypea(taskRunning: number) {  
UI-Project/src/views/Returns/upreturns3.vue
@@ -678,10 +678,10 @@
          <el-table-column fixed="right" :label="$t('film.operate')" align="center" width="270">
            <template #default="scope">
              <el-input v-model="inputQuantities[scope.row.slot]" type="number" min="0" @input="handleInput(scope.row)"
                :placeholder="$t('basicData.selectquantity')" v-if ="scope.row.slot < 99"
                :placeholder="$t('basicData.selectquantity')" v-if ="scope.row.slot != 99"
                style="width: 120px; margin-right: 10px;">
              </el-input>
              <el-button type="text" v-if = "scope.row.slot < 99"  :disabled="isPaused || hasRunningTask" @click="handleBind(scope.row)">
              <el-button type="text" v-if = "scope.row.slot != 99"  :disabled="isPaused || hasRunningTask" @click="handleBind(scope.row)">
                {{ $t('basicData.startloading') }} </el-button>
            </template>
          </el-table-column>
@@ -700,9 +700,10 @@
        <!-- 工程列表展示 -->
        <div v-if="pauseEngineeringList.length > 0">
          <div style="text-align: center; margin-bottom: 10px;">
          {{ $t('basicData.isEnable')}}{{ pauseEngineeringList[0].engineerId }}{{ $t('basicData.project') }}
          {{ $t('basicData.isEnable')}} {{ pauseEngineeringList[0].engineerId }} {{ $t('basicData.project') }}
          </div>
        </div>
        <!-- 无暂停工程时的提示 -->
        <div v-else class="no-data" style="text-align: center; padding: 20px;">
          <el-empty description="No pause engineering" />
hangzhoumesParent/common/servicebase/pom.xml
@@ -46,5 +46,16 @@
    </dependencies>
    <build>
        <resources>
            <resource>
                <!-- 源资源目录(默认是 src/main/resources) -->
                <directory>src/main/resources</directory>
                <!-- 排除 i18n 文件夹及其所有内容 -->
                <excludes>
                    <exclude>i18n/**/*</exclude> <!-- **表示递归匹配所有子目录,*表示所有文件 -->
                </excludes>
            </resource>
        </resources>
    </build>
</project>
hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/service/impl/LoadGlassDeviceTaskHistoryServiceImpl.java
@@ -29,10 +29,10 @@
        }
        Page<LoadGlassDeviceTaskHistory> page = new Page<>(request.getPageNo(), request.getPageSize());
        LambdaQueryWrapper<LoadGlassDeviceTaskHistory> wrapper = new LambdaQueryWrapper<LoadGlassDeviceTaskHistory>()
                .like(StringUtils.isNotBlank(request.getRawGlassWidth()), LoadGlassDeviceTaskHistory::getRawGlassWidth, "%" + request.getRawGlassWidth() + "%")
                .like(StringUtils.isNotBlank(request.getRawGlassHeight()), LoadGlassDeviceTaskHistory::getRawGlassHeight, "%" + request.getRawGlassHeight() + "%")
                .like(StringUtils.isNotBlank(request.getRawGlassThickness()), LoadGlassDeviceTaskHistory::getRawGlassThickness, "%" + request.getRawGlassThickness() + "%")
                .like(StringUtils.isNotBlank(request.getRawGlassfilmsId()), LoadGlassDeviceTaskHistory::getRawGlassFilmsId, "%" + request.getRawGlassfilmsId() + "%")
                .like(StringUtils.isNotBlank(request.getRawGlassWidth()), LoadGlassDeviceTaskHistory::getRawGlassWidth,  request.getRawGlassWidth())
                .like(StringUtils.isNotBlank(request.getRawGlassHeight()), LoadGlassDeviceTaskHistory::getRawGlassHeight, request.getRawGlassHeight())
                .like(StringUtils.isNotBlank(request.getRawGlassThickness()), LoadGlassDeviceTaskHistory::getRawGlassThickness,  request.getRawGlassThickness())
                .like(StringUtils.isNotBlank(request.getRawGlassfilmsId()), LoadGlassDeviceTaskHistory::getRawGlassFilmsId,  request.getRawGlassfilmsId())
                .eq(request.getEngineeringId() != null, LoadGlassDeviceTaskHistory::getEngineeringId, request.getEngineeringId())
                .eq(request.getStation() != 0, LoadGlassDeviceTaskHistory::getStation, request.getStation())
                .eq(request.getSlot() != 0, LoadGlassDeviceTaskHistory::getSlot, request.getSlot())
hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/I18nConfig.java
@@ -22,7 +22,7 @@
    public ReloadableResourceBundleMessageSource  messageSource() {
        ReloadableResourceBundleMessageSource  messageSource = new ReloadableResourceBundleMessageSource();
        // 配置文件i18n目录下的messages开头文件
        messageSource.setBasename("file:D:/mes/aerjiliya/i18n/messages");
        messageSource.setBasename("file:D:/MES/i18n/messages");
        messageSource.setDefaultEncoding("UTF-8");
        messageSource.setCacheSeconds(20);
        return messageSource;
hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/SchedulerConfig.java
New file
@@ -0,0 +1,39 @@
package com.mes.tools;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
/**
 * @author huang
 * @since 2025/10/22
 */
@Configuration
public class SchedulerConfig implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        // 使用 ScheduledThreadPoolExecutor(支持定时调度的线程池)
        ScheduledThreadPoolExecutor schedulerPool = new ScheduledThreadPoolExecutor(
                // 核心线程数:根据定时任务数量设置
                5,
                new ThreadFactory() {
                    private final AtomicInteger count = new AtomicInteger(1);
                    @Override
                    public Thread newThread(Runnable r) {
                        return new Thread(r, "scheduler-thread-" + count.getAndIncrement());
                    }
                },
                new ThreadPoolExecutor.CallerRunsPolicy()
        );
        // 设置空闲线程存活时间(非核心线程,默认60秒,可按需调整)
        schedulerPool.setKeepAliveTime(60, TimeUnit.SECONDS);
        // 允许核心线程超时销毁(如果任务不频繁,可节省资源)
        schedulerPool.allowCoreThreadTimeOut(true);
        taskRegistrar.setScheduler(schedulerPool);
    }
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/WebSocketExecutorConfig.java
New file
@@ -0,0 +1,35 @@
package com.mes.tools;
import liquibase.pro.packaged.C;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
/**
 * @author huang
 * @since 2025/10/22
 */
@Configuration
public class WebSocketExecutorConfig {
    @Bean("webSocketSenderPool")
    public ExecutorService webSocketSenderPool() {
        return new ThreadPoolExecutor(
                2, // 核心线程数:根据客户端数量设置(一般2-5足够)
                4, // 最大线程数:客户端峰值时临时扩容
                30L, TimeUnit.SECONDS,
                new SynchronousQueue<>(), // 同步队列:无缓冲,直接提交给线程执行
                new ThreadFactory() {
                    private final AtomicInteger count = new AtomicInteger(1);
                    @Override
                    public Thread newThread(Runnable r) {
                        Thread thread = new Thread(r, "ws-sender-thread-" + count.getAndIncrement());
                        thread.setDaemon(true); // 守护线程:应用退出时自动销毁
                        return thread;
                    }
                },
                new ThreadPoolExecutor.DiscardOldestPolicy() // 队列满时:丢弃最旧的任务,执行新任务(避免消息堆积过久)
        );
    }
}
hangzhoumesParent/common/servicebase/src/main/resources/i18n/messages.properties
@@ -1,19 +1,19 @@
#基础通用
rawglass.success=任务下发成功,等待任务执行
rawglass.details.success=录入信息成功
rawglass.error=任务失败,请稍后重试
rawglass.task.generate.error=生成任务异常
rawglass.no.empty.shelf=当前工位不存在可用的架子
rawglass.modify.success=修改成功
rawglass.query.success=查询成功
rawglass.delete.success=删除成功
rawglass.enable=启用
rawglass.unenable=禁用
#????
rawglass.success=?????????????
rawglass.details.success=??????
rawglass.error=??????????
rawglass.task.generate.error=??????
rawglass.no.empty.shelf=????????????
rawglass.modify.success=????
rawglass.query.success=????
rawglass.delete.success=????
rawglass.enable=??
rawglass.disable=??
#吊装位请求
rawglass.warehousing.request.error=吊装位请求失败
rawglass.warehousing.slot.occupied=当前吊装位有架子,请求失败
rawglass.warehousing.task.exists=当前吊装位已经存在任务
#?????
rawglass.warehousing.request.error=???????
rawglass.warehousing.slot.occupied=?????????????
rawglass.warehousing.task.exists=???????????
#出库请求
rawglass.outWarehousing.error=当前架子不在库内(状态异常),无法执行出库操作
#????
rawglass.outWarehousing.error=???????????????????????
hangzhoumesParent/common/servicebase/src/main/resources/i18n/messages_en_US.properties
@@ -1,4 +1,4 @@
#基础通用
#????
rawglass.success=The task is successfully issued and waiting for the task to be executed
rawglass.details.success=Successfully entered information
rawglass.error=The task failed, please try again later
@@ -8,11 +8,12 @@
rawglass.query.success=Query successfully
rawglass.delete.success=Deleted successfully
rawglass.enable=Enable
rawglass.Disable=Disable
#吊装位请求
rawglass.disable=Disable
#?????
rawglass.warehousing.request.error=Hoisting position request failed, please check parameters
rawglass.warehousing.slot.occupied=Current hoisting position has a shelf, request failed
rawglass.warehousing.task.exists=Task already exists for the current hanger
#出库请求
#????
rawglass.outWarehousing.error=The current shelf is not in the library (abnormal status), and the checkout operation cannot be performed
hangzhoumesParent/common/servicebase/src/main/resources/i18n/messages_zh_CN.properties
@@ -1,19 +1,21 @@
#基础通用
rawglass.success=任务下发成功,等待任务执行
rawglass.details.success=录入信息成功
rawglass.error=任务失败,请稍后重试
rawglass.task.generate.error=生成任务异常
rawglass.no.empty.shelf=当前工位不存在可用的架子
rawglass.modify.success=修改成功
rawglass.query.success=查询成功
rawglass.delete.success=删除成功
rawglass.enable=启用
rawglass.disable=禁用
#????
rawglass.success=?????????????
rawglass.details.success=??????
rawglass.error=??????????
rawglass.task.generate.error=??????
rawglass.no.empty.shelf=????????????
rawglass.modify.success=????
rawglass.query.success=????
query.error=????
#吊装位请求
rawglass.warehousing.request.error=吊装位请求失败
rawglass.warehousing.slot.occupied=当前吊装位有架子,请求失败
rawglass.warehousing.task.exists=当前吊装位已经存在任务
rawglass.delete.success=????
rawglass.enable=??
rawglass.disable=??
#出库请求
rawglass.outWarehousing.error=当前架子不在库内(状态异常),无法执行出库操作
#?????
rawglass.warehousing.request.error=???????
rawglass.warehousing.slot.occupied=?????????????
rawglass.warehousing.task.exists=???????????
#????
rawglass.outWarehousing.error=???????????????????????
hangzhoumesParent/common/servicebase/target/classes/mapper/UpPattenUsageMapper.xml
@@ -14,17 +14,29 @@
        <result column="group_number" property="groupNumber"/>
    </resultMap>
    <select id="queryRawGlassByEngineeringId" resultMap="baseMap">
        SET @prev_width := NULL;
        SET @prev_height := NULL;
        SET @counter := 0;
        SELECT t.*,
               @counter := IF(@prev_width = width and @prev_height = height, @counter, @counter + 1) AS group_number,
               @prev_width := width,
               @prev_height := height
        FROM up_patten_usage t
        where t.engineering_id = #{engineeringId}
          and t.state = 0
        ORDER BY t.layout_sequence
        SELECT
            t.*,
            t.group_number
        FROM (
                 SELECT
                     upu.*,
                     -- 计算组号
                     @counter := IF(@prev_width = upu.width AND @prev_height = upu.height,
                                    @counter,
                                    @counter + 1) AS group_number,
                     -- 变量赋值
                     @prev_width := upu.width,
                     @prev_height := upu.height
                 FROM
                     up_patten_usage upu,
                     -- 关键:用虚拟表初始化变量,替代单独的SET语句
                     (SELECT @prev_width := NULL, @prev_height := NULL, @counter := 0) AS init_var
                 WHERE
                     upu.engineering_id = #{engineeringId}
                   AND upu.state = 0
                 ORDER BY
                     upu.layout_sequence
             ) AS t
    </select>
    <select id="queryFinishByEngineering" resultType="java.lang.Integer">
        SELECT id
hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/job/RawGlassPushMessage.java
@@ -17,11 +17,14 @@
import com.mes.rawglasstask.service.RawGlassStorageTaskService;
import com.mes.tools.WebSocketServer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
import java.util.concurrent.ExecutorService;
/**
 * @author wangfei
@@ -42,7 +45,11 @@
    @Resource
    private OrdersService ordersService;
    @Scheduled(fixedDelay = 2000)
    @Autowired
    @Qualifier("webSocketSenderPool")
    private ExecutorService webSocketSenderPool;
    @Scheduled(fixedDelay = 5000)
    public void sendRawGlassMessage() {
        log.info("发送任务信息和架子信息");
        JSONObject jsonObject = new JSONObject();
@@ -51,11 +58,10 @@
        List<RawGlassStorageTask> tasks = rawGlassStorageTaskService.listRawGlassTask();
        jsonObject.append("rawStationDetailsList", rawStationDetailsList);
        jsonObject.append("tasks", tasks);
        String message = String.valueOf(jsonObject);
        List<WebSocketServer> sendwServer = WebSocketServer.sessionMap.get("rawGlass");
        if (CollectionUtil.isNotEmpty(sendwServer)) {
            sendwServer.stream().forEach(e -> {
                e.sendMessage(String.valueOf(jsonObject));
            });
            sendwServer.forEach(ws -> webSocketSenderPool.submit(() -> ws.sendMessage(message)));
        }
    }
hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglassdetails/controller/RawGlassStorageDetailsController.java
@@ -77,23 +77,33 @@
    @ApiOperation("更新剩余数量")
    @PostMapping("/updateQuantity")
    public Result<Object> updateQuantity(@Validated @RequestBody RawGlassRequest request) {
        String successMsg = messageSource.getMessage(
                "rawglass.modify.success",
                null,
                LocaleContextHolder.getLocale()
        );
        return Result.build(200, successMsg, rawGlassStorageDetailsService.updateQuantity(request));
        String result = rawGlassStorageDetailsService.updateQuantity(request);
        if ("success".equals(result)) {
            String successMsg = messageSource.getMessage(
                    "rawglass.modify.success",
                    null,
                    LocaleContextHolder.getLocale()
            );
            return Result.build(200, successMsg, null);
        } else {
            return Result.build(500, "fail", null);
        }
    }
    @ApiOperation("删除原片")
    @PostMapping("/deleteWarehousing")
    public Result<Object> deleteWarehousing(Long slot) {
        String successMsg = messageSource.getMessage(
                "rawglass.delete.success",
                null,
                LocaleContextHolder.getLocale()
        );
        return Result.build(200, successMsg, rawGlassStorageDetailsService.deleteWarehousing(slot));
        String result = rawGlassStorageDetailsService.deleteWarehousing(slot);
        if ("success".equals(result)) {
            String successMsg = messageSource.getMessage(
                    "rawglass.delete.success",
                    null,
                    LocaleContextHolder.getLocale()
            );
            return Result.build(200, successMsg, null);
        } else {
            return Result.build(500, "fail", null);
        }
    }
    @ApiOperation("出库")
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/engineering/controller/EngineeringController.java
@@ -16,9 +16,12 @@
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
@@ -44,6 +47,9 @@
    @Autowired
    DamageService damageService;
    // 国际语言库
    @Resource
    private MessageSource messageSource;
    @ApiOperation("开始/暂停任务/传递工程号和状态,开始是1 暂停是0")
    @PostMapping("/pauseTask") //暂停上片任务
@@ -65,9 +71,9 @@
        boolean work = engineeringService.pauseTask(engineering.getEngineerId(),engineering.getState());
//        List<UpPattenUsage> glass = upPattenUsageService.prioritylist();String message;
        if(work){
            return Result.build(200, "成功", null);
            return Result.build(200, "success", null);
        }else {
            return Result.build(100, "失敗", null);
            return Result.build(500, "fail", null);
        }
    }
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/job/OpcLoadGlassTask.java
@@ -159,11 +159,23 @@
        }
        List<UpPattenUsageVO> pattenUsageList = upPattenUsageMapper.queryRawGlassByEngineeringId(engineering.getEngineerId());
        log.info("按照当前获取到正在需要上片的原片信息有:{}", pattenUsageList);
        log.info("获取正在需要上片的原片信息有:{}", pattenUsageList);
        if (CollectionUtils.isEmpty(pattenUsageList)) {
            log.info("当前工程需要上片的原片信息为空,任务已结束");
            return;
        }
        // 有无正在执行的任务
        UpPattenUsage runningTask = upPattenUsageMapper.selectOne(
                new LambdaQueryWrapper<UpPattenUsage>()
                        .eq(UpPattenUsage::getEngineeringId, engineering.getEngineerId())
                        .eq(UpPattenUsage::getState, 101)
                        .last("limit 1") // 只取一条
        );
        if (runningTask != null) {
            log.info("当前工程存在正在执行的上片任务,跳过本次处理");
            return;
        }
        Map<String, List<UpPattenUsageVO>> upListMap = pattenUsageList.stream()
                .collect(Collectors.groupingBy(UpPattenUsageVO::getGroupNumber));
        log.info("获取当前需要上片的原片数据");
@@ -192,7 +204,7 @@
            task.setTaskRunning(1);
            task.setRawGlassWidth((int) usageVOS.get(0).getWidth());
            task.setRawGlassHeight((int) usageVOS.get(0).getHeight());
            task.setSlot(loadStation.get(0));
            task.setSlot(1);
            task.setRawGlassFilmsId(usageVOS.get(0).getFilmsId());
            task.setEngineeringId(usageVOS.get(0).getEngineeringId());
            saveHistoryTask(task, deviceId);
@@ -201,7 +213,7 @@
            s7DataSPWrite.setMesSend(1);
            s7DataSPWrite.setRawGlassWidth((int) usageVOS.get(0).getWidth());
            s7DataSPWrite.setRawGlassHeight((int) usageVOS.get(0).getHeight());
            s7DataSPWrite.setSlot(loadStation.get(1));
            s7DataSPWrite.setSlot(1);
            if (LOAD_GLASS_ONE_DEVICE.equals(deviceId)) {
                s7SerializerSPOne.write(s7DataSPWrite);
            } else {
@@ -222,7 +234,7 @@
        task.setRawGlassWidth((int) usageVOS.get(0).getWidth());
        task.setRawGlassHeight((int) usageVOS.get(0).getHeight());
        task.setRawGlassThickness((int) usageVOS.get(0).getThickness());
        task.setSlot(loadStation.get(0));
        task.setSlot(1);
        task.setRawGlassFilmsId(usageVOS.get(0).getFilmsId());
        task.setEngineeringId(usageVOS.get(0).getEngineeringId());
        saveHistoryTask(task, deviceId);
@@ -235,7 +247,7 @@
        s7DataSPWrite.setMesSend(1);
        s7DataSPWrite.setRawGlassWidth((int) usageVOS.get(0).getWidth());
        s7DataSPWrite.setRawGlassHeight((int) usageVOS.get(0).getHeight());
        s7DataSPWrite.setSlot(loadStation.get(0));
        s7DataSPWrite.setSlot(1);
        if (LOAD_GLASS_ONE_DEVICE.equals(deviceId)) {
            s7SerializerSPOne.write(s7DataSPWrite);
        } else {
@@ -285,11 +297,28 @@
            unconfirmedTask.setTaskState(Const.RAW_GLASS_TASK_SUCCESS);
            unconfirmedTask.setFinishCount(unconfirmedTask.getFinishCount() + 1);
            log.info("{}上片线,任务汇报成功,更新上片记录[{}]为成功", deviceId, upUsageId);
            // PLC确认字1
            s7DataSP.setMesConfirm(1);
            s7SerializerSPOne.write(s7DataSP);
        } else if (s7DataSP.getPlcReport() == 2) {
            // 汇报失败
            unconfirmedTask.setTaskState(2);
//            unconfirmedTask.setDamageCount(unconfirmedTask.getDamageCount() + 1);
            log.warn("{}上片线,任务汇报失败,上片记录[{}]标记为失败", deviceId,  upUsageId);
            // PLC确认字2
            s7DataSP.setMesConfirm(2);
            s7SerializerSPOne.write(s7DataSP);
        }else if (s7DataSP.getPlcReport() == 3) {
            // 汇报破损
            unconfirmedTask.setTaskState(200);
            unconfirmedTask.setTaskState(3);
            unconfirmedTask.setDamageCount(unconfirmedTask.getDamageCount() + 1);
            log.warn("{}上片线,任务汇报破损,上片记录[{}]标记为破损", deviceId,  upUsageId);
            // PLC确认字3
            s7DataSP.setMesConfirm(3);
            s7SerializerSPOne.write(s7DataSP);
        }
        unconfirmedTask.setUpdateTime(new Date());
        loadGlassDeviceTaskHistoryService.updateById(unconfirmedTask);
@@ -298,13 +327,9 @@
        rawGlassStorageDetailsService.update(new UpdateWrapper<RawGlassStorageDetails>()
                .inSql("slot", "select slot from raw_glass_storage_station where enable_state = 1")
//                .eq("slot", task.getSlot())
                .eq("slot", unconfirmedTask.getSlot())
                .eq("slot", 101)
                .eq("state", Const.RAW_GLASS_STATE_IN)
                .setSql("remain_quantity = GREATEST(remain_quantity - 1, 0)"));
        //汇报字给1
        S7DataSP s7DataSPWrite = new S7DataSP();
        s7DataSPWrite.setMesConfirm(1);
        s7SerializerSPOne.write(s7DataSPWrite);
    }
    private boolean saveHistoryTask(LoadGlassDeviceTaskHistory task, Integer deviceId) {
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/job/PlcLoadGlassTask.java
@@ -137,7 +137,7 @@
        loadGlassChild("loadGlassRequestOne", 5, LOAD_GLASS_DEVICE_ONE_TASK, "loadGlassOne");
    }
    @Scheduled(fixedDelay = 10000)
//    @Scheduled(fixedDelay = 10000)
    public void loadTwoGlass() {
        loadGlassChild("loadGlassRequestTwo", 6, LOAD_GLASS_DEVICE_TWO_TASK, "loadGlassTwo");
    }
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/loadglassdevicetaskhistory/controller/LoadGlassDeviceTaskHistoryController.java
@@ -5,15 +5,15 @@
import com.mes.opctask.entity.LoadGlassDeviceTaskHistory;
import com.mes.opctask.entity.request.LoadGlassDeviceTaskHistoryRequest;
import com.mes.opctask.service.LoadGlassDeviceTaskHistoryService;
import com.mes.pp.service.OptimizeProjectService;
import com.mes.uppattenusage.entity.UpPattenUsage;
import com.mes.utils.Result;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import javax.annotation.Resource;
/**
 * <p>
@@ -30,10 +30,24 @@
    @Autowired
    private LoadGlassDeviceTaskHistoryService loadGlassDeviceTaskHistoryService;
    // 国际语言库
    @Resource
    private MessageSource messageSource;
    @ApiOperation("按照查询条件查询上片历史任务")
    @PostMapping("/queryLoadGlassHistoryTask") //查询现在上片机的玻璃信息
    public Result<Page<LoadGlassDeviceTaskHistory>> queryBigStorageCageHistoryTask(@RequestBody @Validated LoadGlassDeviceTaskHistoryRequest request) {
        return Result.build(200, "查询成功", loadGlassDeviceTaskHistoryService.queryLoadGlassHistoryTask(request));
        Page<LoadGlassDeviceTaskHistory> result = loadGlassDeviceTaskHistoryService.queryLoadGlassHistoryTask(request);
        if (result != null) {
            String successMsg = messageSource.getMessage(
                    "rawglass.query.success",
                    null,
                    LocaleContextHolder.getLocale()
            );
            return Result.build(200, successMsg, result);
        }else {
            return Result.build(500, "fail", result);
        }
    }
}
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/uppattenusage/controller/UpPattenUsageController.java
@@ -10,13 +10,16 @@
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
 * <p>
 *  前端控制器
 * 前端控制器
 * </p>
 *
 * @author zhoush
@@ -35,6 +38,10 @@
    private EngineeringService engineeringService;
    @Autowired
    private OptimizeProjectService optimizeProjectService;
    // 国际语言库
    @Resource
    private MessageSource messageSource;
    @ApiOperation("显示选择的工程信息")
@@ -98,13 +105,33 @@
    @ApiOperation("添加任务")
    @PostMapping("/insertTask")
    public Result insertTask(Integer quantity, Integer slot) {
        return Result.build(200, "添加成功", upPattenUsageService.insertTask(quantity, slot));
        Boolean result = upPattenUsageService.insertTask(quantity, slot);
        String successMsg = messageSource.getMessage(
                "rawglass.success",
                null,
                LocaleContextHolder.getLocale()
        );
        if (result) {
            return Result.build(200, successMsg, true);
        } else {
            return Result.build(500, "fail", false);
        }
    }
    @ApiOperation("删除任务")
    @PostMapping("/deleteTask")
    public Result deleteUpPattenTask(String id) {
        return Result.build(200, "删除成功", upPattenUsageService.deleteUpPattenTask(id));
        Boolean result = upPattenUsageService.deleteUpPattenTask(id);
        String successMsg = messageSource.getMessage(
                "rawglass.delete.success",
                null,
                LocaleContextHolder.getLocale()
        );
        if (result) {
            return Result.build(200, successMsg, true);
        } else {
            return Result.build(500, "fail", false);
        }
    }
}