diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/QmsApplication.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/QmsApplication.java index 7801c664..ce9aeb32 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/QmsApplication.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/QmsApplication.java @@ -7,6 +7,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.context.annotation.ComponentScan; import org.springframework.retry.annotation.EnableRetry; +import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; @Slf4j @@ -15,6 +16,7 @@ import org.springframework.scheduling.annotation.EnableScheduling; @EnableDiscoveryClient @EnableScheduling @EnableRetry +@EnableAsync public class QmsApplication { public static void main(String[] args) { diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/config/AsyncConfig.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/config/AsyncConfig.java index 08244936..e37f3f9e 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/config/AsyncConfig.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/config/AsyncConfig.java @@ -21,4 +21,21 @@ public class AsyncConfig { executor.initialize(); return executor; } + + @Bean(name = "wmsCallbackExecutor") + public Executor getAsyncExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + // 核心线程数(平时保持的线程数量) + executor.setCorePoolSize(5); + // 最大线程数(高峰期最多扩容到这个数量) + executor.setMaxPoolSize(20); + // 队列容量(核心线程满后,任务会放进队列,队列满后才扩容最大线程) + executor.setQueueCapacity(100); + // 线程空闲存活时间(秒) + executor.setKeepAliveSeconds(60); + // 线程名称前缀,方便在日志中排查问题 + executor.setThreadNamePrefix("wms-callback-async-"); + executor.initialize(); + return executor; + } } diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsIncomingInspectionTaskController.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsIncomingInspectionTaskController.java index 51282c22..7faa9a75 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsIncomingInspectionTaskController.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsIncomingInspectionTaskController.java @@ -1,6 +1,7 @@ package com.nflg.qms.admin.controller; import com.nflg.qms.admin.service.IncomingInspectionTaskControllerService; +import com.nflg.qms.admin.service.WmsIncomingInspectionTaskCallbackService; import com.nflg.wms.common.pojo.ApiResult; import com.nflg.wms.common.pojo.PageData; import com.nflg.wms.common.pojo.qo.*; @@ -28,6 +29,9 @@ public class QmsIncomingInspectionTaskController extends BaseController { @Resource private IncomingInspectionTaskControllerService incomingInspectionTaskControllerService; + @Resource + private WmsIncomingInspectionTaskCallbackService wmsIncomingInspectionTaskCallbackService; + /** * 分页查询来料检测任务列表 */ @@ -131,5 +135,12 @@ public class QmsIncomingInspectionTaskController extends BaseController { return ApiResult.success(); } - + /** + * 回调 + */ + @PostMapping("callback") + public ApiResult callback(@RequestParam Long taskId){ + wmsIncomingInspectionTaskCallbackService.process(taskId, (short) 0); + return ApiResult.success(); + } } diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/IncomingInspectionTaskControllerService.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/IncomingInspectionTaskControllerService.java index 342ffcf2..a1c0b4e6 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/IncomingInspectionTaskControllerService.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/IncomingInspectionTaskControllerService.java @@ -110,6 +110,9 @@ public class IncomingInspectionTaskControllerService { @Resource private QmsIssueTicketControllerService issueTicketControllerService; + @Resource + private WmsIncomingInspectionTaskCallbackService wmsIncomingInspectionTaskCallbackService; + /** * 来料检验申请(对外接口) * 业务规则: @@ -532,6 +535,7 @@ public class IncomingInspectionTaskControllerService { // 通过当前登录用户的 userId 查询对应的质检人员记录 QmsQualityInspector inspector = qualityInspectorService.lambdaQuery() .eq(QmsQualityInspector::getUserId, userId) + .eq(QmsQualityInspector::getInspectionType,1) .last("LIMIT 1") .one(); VUtil.trueThrowBusinessError(Objects.isNull(inspector)) @@ -548,6 +552,7 @@ public class IncomingInspectionTaskControllerService { // 通过当前登录用户的 userId 查询对应的质检人员记录 QmsQualityInspector inspector = qualityInspectorService.lambdaQuery() .eq(QmsQualityInspector::getUserId, userId) + .eq(QmsQualityInspector::getInspectionType,1) .last("LIMIT 1") .one(); VUtil.trueThrowBusinessError(Objects.isNull(inspector)) @@ -954,7 +959,11 @@ public class IncomingInspectionTaskControllerService { updateWrapper.update(); - issueTicketControllerService.initiate(task.getId()); + if (task.getInspectionResult()) { + wmsIncomingInspectionTaskCallbackService.process(task.getId(), (short) 0); + } else { + issueTicketControllerService.initiate(task.getId()); + } } /** diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsIssueTicketControllerService.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsIssueTicketControllerService.java index 6e7707f4..1978d801 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsIssueTicketControllerService.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsIssueTicketControllerService.java @@ -57,6 +57,9 @@ public class QmsIssueTicketControllerService { @Resource private QmsIssueTicketProcessControllerService issueTicketProcessControllerService; + @Resource + private WmsIncomingInspectionTaskCallbackService wmsIncomingInspectionTaskCallbackService; + /** * 审核质量问题工单 * 更新审批状态、审批意见、审批人信息、事故类型,并更新工单状态 @@ -88,6 +91,8 @@ public class QmsIssueTicketControllerService { .setApprovalTime(now); issueTicketService.updateById(entity); + + wmsIncomingInspectionTaskCallbackService.processAsync(entity.getSourceId(), request.getApprovalStatus()); } /** diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/WmsApiService.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/WmsApiService.java index a2bb64d4..12c76349 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/WmsApiService.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/WmsApiService.java @@ -1,7 +1,9 @@ package com.nflg.qms.admin.service; +import cn.dev33.satoken.stp.StpUtil; import cn.hutool.json.JSONUtil; import com.nflg.wms.common.pojo.ApiResult; +import com.nflg.wms.common.util.UserUtil; import com.nflg.wms.common.util.VUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -33,7 +35,6 @@ public class WmsApiService { /** * 向WMS系统发送POST请求 - * * @param path 接口路径 * @param body 请求体 * @param bizDesc 业务描述,用于日志和异常提示 @@ -45,6 +46,7 @@ public class WmsApiService { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); + headers.add("Authorization", StpUtil.getTokenValue()); HttpEntity requestEntity = new HttpEntity<>(body, headers); log.info("{},URL: {},数据: {}", bizDesc, fullUrl, JSONUtil.toJsonStr(body)); diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/WmsIncomingInspectionTaskCallbackService.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/WmsIncomingInspectionTaskCallbackService.java index 6dabf254..dcae7505 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/WmsIncomingInspectionTaskCallbackService.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/WmsIncomingInspectionTaskCallbackService.java @@ -1,14 +1,19 @@ package com.nflg.qms.admin.service; +import com.nflg.wms.common.constant.STATE; +import com.nflg.wms.common.exception.NflgException; import com.nflg.wms.common.pojo.qo.WmsIncomingInspectionTaskCallbackQO; import com.nflg.wms.common.pojo.qo.WmsInventoryInspectionTaskCallbackQO; import com.nflg.wms.common.pojo.vo.QmsIncomingInspectionTaskVO; +import com.nflg.wms.common.util.VUtil; +import com.nflg.wms.repository.entity.QmsIncomingInspectionTask; import com.nflg.wms.repository.entity.QmsIncomingInspectionTaskRecord; import com.nflg.wms.repository.service.IQmsIncomingInspectionTaskRecordService; import com.nflg.wms.repository.service.IQmsIncomingInspectionTaskService; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import java.util.List; @@ -38,8 +43,7 @@ public class WmsIncomingInspectionTaskCallbackService { /** * 向WMS系统发送来料检验任务回调 */ - public void incoming(Long taskId) { - QmsIncomingInspectionTaskVO taskVO = incomingInspectionTaskService.getDetail(taskId); + private void incoming(QmsIncomingInspectionTaskVO taskVO, Short processingResult) { WmsIncomingInspectionTaskCallbackQO qo = new WmsIncomingInspectionTaskCallbackQO() .setTaskNo(taskVO.getTaskNo()) .setInspectionType(taskVO.getInspectionType()) @@ -55,11 +59,12 @@ public class WmsIncomingInspectionTaskCallbackService { .setQualifiedQty(taskVO.getQualifiedQty()) .setUnqualifiedQty(taskVO.getUnqualifiedQty()) .setInspectionResult(taskVO.getInspectionResult()) - .setPurchaseGroup(taskVO.getPurchaseGroup()); + .setPurchaseGroup(taskVO.getPurchaseGroup()) + .setProcessingResult(processingResult); List records = incomingInspectionTaskRecordService.lambdaQuery() .select(QmsIncomingInspectionTaskRecord::getMaterialUniqueNo, QmsIncomingInspectionTaskRecord::getQualified) - .eq(QmsIncomingInspectionTaskRecord::getTaskId, taskId) + .eq(QmsIncomingInspectionTaskRecord::getTaskId, taskVO.getId()) .list(); qo.setQualifiedMaterialUniqueNo(records.stream() .filter(QmsIncomingInspectionTaskRecord::getQualified) @@ -72,14 +77,25 @@ public class WmsIncomingInspectionTaskCallbackService { .toList() ); - wmsApiService.post(incomingUrl, qo, "来料检验任务回调WMS"); + boolean callbackResult = true; + try { + wmsApiService.post(incomingUrl, qo, "来料检验任务回调WMS"); + } catch (Exception e) { + callbackResult = false; + throw new NflgException(STATE.BusinessError, "调用WMS接口失败:" + e.getMessage()); + } finally { + incomingInspectionTaskService.lambdaUpdate() + .eq(QmsIncomingInspectionTask::getId, taskVO.getId()) + .ne(QmsIncomingInspectionTask::getCallbackResult, true) + .set(QmsIncomingInspectionTask::getCallbackResult, callbackResult) + .update(); + } } /** * 向WMS系统发送库存检验任务回调 */ - public void inventory(Long taskId) { - QmsIncomingInspectionTaskVO taskVO = incomingInspectionTaskService.getDetail(taskId); + private void inventory(QmsIncomingInspectionTaskVO taskVO, Short processingResult) { WmsInventoryInspectionTaskCallbackQO qo = new WmsInventoryInspectionTaskCallbackQO() .setTaskNo(taskVO.getTaskNo()) .setMaterialNo(taskVO.getMaterialNo()) @@ -90,11 +106,12 @@ public class WmsIncomingInspectionTaskCallbackService { .setInspectionQty(taskVO.getInspectionQty()) .setQualifiedQty(taskVO.getQualifiedQty()) .setUnqualifiedQty(taskVO.getUnqualifiedQty()) - .setInspectionResult(taskVO.getInspectionResult()); + .setInspectionResult(taskVO.getInspectionResult()) + .setProcessingResult(processingResult); List records = incomingInspectionTaskRecordService.lambdaQuery() .select(QmsIncomingInspectionTaskRecord::getMaterialUniqueNo, QmsIncomingInspectionTaskRecord::getQualified) - .eq(QmsIncomingInspectionTaskRecord::getTaskId, taskId) + .eq(QmsIncomingInspectionTaskRecord::getTaskId, taskVO.getId()) .list(); qo.setQualifiedMaterialUniqueNo(records.stream() .filter(QmsIncomingInspectionTaskRecord::getQualified) @@ -107,6 +124,49 @@ public class WmsIncomingInspectionTaskCallbackService { .toList() ); - wmsApiService.post(inventoryUrl, qo, "库存检验任务回调WMS"); + boolean callbackResult = true; + try { + wmsApiService.post(inventoryUrl, qo, "库存检验任务回调WMS"); + } catch (Exception e) { + callbackResult = false; + throw new NflgException(STATE.BusinessError, "调用WMS接口失败:" + e.getMessage()); + } finally { + incomingInspectionTaskService.lambdaUpdate() + .eq(QmsIncomingInspectionTask::getId, taskVO.getId()) + .ne(QmsIncomingInspectionTask::getCallbackResult, true) + .set(QmsIncomingInspectionTask::getCallbackResult, callbackResult) + .update(); + } + } + + /** + * WMS系统来料检验任务回调 + * @param taskId 来料检验任务ID + * @param processingResult 处理结果:0=通过,3=报废,4=维修,5=挑选使用,6=让渡使用 + */ + @Async("wmsCallbackExecutor") + public void processAsync(Long taskId, Short processingResult) { + process(taskId, processingResult); + } + + /** + * WMS系统来料检验任务回调 + * @param taskId 来料检验任务ID + * @param processingResult 处理结果:0=通过,3=报废,4=维修,5=挑选使用,6=让渡使用 + */ + public void process(Long taskId, Short processingResult) { + QmsIncomingInspectionTaskVO taskVO = incomingInspectionTaskService.getDetail(taskId); + VUtil.trueThrowBusinessError(taskVO.getCallbackResult()).throwMessage("请勿重复回调"); + switch (taskVO.getInspectionType()) { + case 1: + incoming(taskVO,processingResult); + break; + case 2: + inventory(taskVO,processingResult); + break; + default: + VUtil.trueThrowBusinessError(true).throwMessage("无效的检验类型:" + taskVO.getInspectionType()); + break; + } } } diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/WmsIncomingInspectionTaskCallbackQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/WmsIncomingInspectionTaskCallbackQO.java index b4df5033..2c44a08a 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/WmsIncomingInspectionTaskCallbackQO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/WmsIncomingInspectionTaskCallbackQO.java @@ -84,6 +84,11 @@ public class WmsIncomingInspectionTaskCallbackQO { */ private String purchaseGroup; + /** + * 处理结果:0=通过,3=报废,4=维修,5=挑选使用,6=让渡使用 + */ + private Short processingResult = 0; + /** * 合格物料唯一编号列表 */ diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/WmsInventoryInspectionTaskCallbackQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/WmsInventoryInspectionTaskCallbackQO.java index a535e3c4..e325c2a6 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/WmsInventoryInspectionTaskCallbackQO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/WmsInventoryInspectionTaskCallbackQO.java @@ -59,6 +59,11 @@ public class WmsInventoryInspectionTaskCallbackQO { */ private Boolean inspectionResult; + /** + * 处理结果:0=通过,3=报废,4=维修,5=挑选使用,6=让渡使用 + */ + private Short processingResult = 0; + /** * 合格物料唯一编号列表 */ diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsIncomingInspectionTaskVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsIncomingInspectionTaskVO.java index 10d7b085..1a27ed8a 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsIncomingInspectionTaskVO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsIncomingInspectionTaskVO.java @@ -182,6 +182,11 @@ public class QmsIncomingInspectionTaskVO { */ private String purchaseGroup; + /** + * 回调结果 + */ + private Boolean callbackResult; + /** * 最近更新人id */ diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsIncomingInspectionTask.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsIncomingInspectionTask.java index 30403472..178216c0 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsIncomingInspectionTask.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsIncomingInspectionTask.java @@ -187,6 +187,11 @@ public class QmsIncomingInspectionTask implements Serializable { */ private String purchaseGroup; + /** + * 回调结果 + */ + private Boolean callbackResult; + /** * 最近更新人id */ diff --git a/nflg-wms-repository/src/main/resources/mapper/QmsIncomingInspectionTaskMapper.xml b/nflg-wms-repository/src/main/resources/mapper/QmsIncomingInspectionTaskMapper.xml index 06b532d6..675876ff 100644 --- a/nflg-wms-repository/src/main/resources/mapper/QmsIncomingInspectionTaskMapper.xml +++ b/nflg-wms-repository/src/main/resources/mapper/QmsIncomingInspectionTaskMapper.xml @@ -4,40 +4,42 @@