diff --git a/src/main/java/com/glxp/api/config/rabbit/TopicRabbitConfig.java b/src/main/java/com/glxp/api/config/rabbit/TopicRabbitConfig.java index 78c4cf5..be99f7d 100644 --- a/src/main/java/com/glxp/api/config/rabbit/TopicRabbitConfig.java +++ b/src/main/java/com/glxp/api/config/rabbit/TopicRabbitConfig.java @@ -15,6 +15,9 @@ public class TopicRabbitConfig { public final static String trace = "topic.trace"; public final static String delaytrace = "local.trace.delay"; + public final static String TRACE_TOPIC_EXCHANGE = "trace.topic.exchange"; + public final static String TRACE_DELAY_EXCHANGE = "local.trace.delay.exchang"; + @Bean public Queue traceQueue() { @@ -36,14 +39,14 @@ public class TopicRabbitConfig { @Bean TopicExchange exchange() { - return new TopicExchange("topicExchange"); + return new TopicExchange(TRACE_TOPIC_EXCHANGE); } @Bean public Exchange traceDelayExchange() { Map args = new HashMap<>(1); args.put("x-delayed-type", "topic"); - return new CustomExchange("local.trace.delay.exchange", "x-delayed-message", true, false, args); + return new CustomExchange(TRACE_DELAY_EXCHANGE, "x-delayed-message", true, false, args); } @Bean diff --git a/src/main/java/com/glxp/api/controller/trace/UdiTraceController.java b/src/main/java/com/glxp/api/controller/trace/UdiTraceController.java index 278fde2..a899cbc 100644 --- a/src/main/java/com/glxp/api/controller/trace/UdiTraceController.java +++ b/src/main/java/com/glxp/api/controller/trace/UdiTraceController.java @@ -1,5 +1,6 @@ package com.glxp.api.controller.trace; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -13,12 +14,15 @@ import com.glxp.api.entity.basic.UdiEntity; import com.glxp.api.entity.sup.UserCompanyEntity; import com.glxp.api.entity.trace.*; import com.glxp.api.req.basic.FilterUdiRelRequest; +import com.glxp.api.req.trace.TraceManuDetailRequest; +import com.glxp.api.req.trace.TraceManuOrderUploadRequest; import com.glxp.api.req.trace.TraceOrderUploadRequest; import com.glxp.api.req.trace.TraceRecordRequest; import com.glxp.api.res.basic.BasicUdiRelResponse; import com.glxp.api.res.trace.TraceSearchReponse; import com.glxp.api.service.basic.BasicUdiRelService; import com.glxp.api.service.sup.UserCompanyService; +import com.glxp.api.service.system.SystemParamConfigService; import com.glxp.api.service.trace.*; import com.glxp.api.util.GennerOrderUtils; import com.glxp.api.util.udi.FilterUdiUtils; @@ -53,11 +57,19 @@ public class UdiTraceController extends BaseController { @Resource TraceOrderService traceOrderService; @Resource + TraceManuOrderService traceManuOrderService; + @Resource + TraceManuCodeRelService traceManuCodeRelService; + @Resource TraceRecordService traceRecordService; @Resource UdiTraceService udiTraceService; @Resource UserCompanyService userCompanyService; + @Resource + SystemParamConfigService systemParamConfigService; + @Resource + RabbitPushService rabbitPushService; /** @@ -163,20 +175,17 @@ public class UdiTraceController extends BaseController { public BaseResponse sceneTrace(TraceRecordRequest traceRecordRequest) { TraceSearchReponse traceSearchReponse = new TraceSearchReponse(); - TraceRecordLogEntity traceRecordLogEntity = traceRecordService.getById(traceRecordRequest.getRecordCode()); - if (traceRecordLogEntity != null) { - List traceOrderEntities = traceOrderService.findByProductIdFk(traceRecordLogEntity.getTraceProductIdFk()); - traceSearchReponse.setTraceRecordLogEntity(traceRecordLogEntity); - traceSearchReponse.setTraceOrderEntities(traceOrderEntities); - return ResultVOUtils.success(traceSearchReponse); - } - + TraceRecordLogEntity traceRecordLogEntity = null; TraceProductDetailEntity traceProductDetailEntity = null; BasicUdiRelResponse basicUdiRelResponse = null; UdiEntity udiEntity = null; UserCompanyEntity userCompanyEntity = null; - if (traceRecordRequest.getTraceType() == Constant.UDI_TRACE) { + if (StrUtil.isNotEmpty(traceRecordRequest.getUdiCode())) { + traceRecordRequest.setTraceType(Constant.UDI_TRACE); + } + + if (traceRecordRequest.getTraceType() == Constant.UDI_TRACE) { //1.校验UDI码格式 udiEntity = FilterUdiUtils.getUdi(traceRecordRequest.getUdiCode()); if (udiEntity == null) { @@ -197,23 +206,14 @@ public class UdiTraceController extends BaseController { //4.生成查询记录 String userId = getUserId() + ""; - if (traceRecordLogEntity == null) - traceRecordLogEntity = udiTraceService.createRecordLog(userId, traceRecordRequest.getFromType(), traceRecordRequest.getTraceType()); + traceRecordLogEntity = udiTraceService.createRecordLog(userId, traceRecordRequest.getFromType(), traceRecordRequest.getTraceType()); //5.创建查询详情记录,若存在相同查询记录则直接获取 - if (traceRecordLogEntity.getTraceProductIdFk() != null) { - traceProductDetailEntity = traceProductDetailService.getById(traceRecordLogEntity.getTraceProductIdFk()); - if (traceProductDetailEntity == null) { - traceProductDetailEntity = udiTraceService.createTracerProductByUdiCode(traceRecordRequest.getUdiCode(), 2, 1, basicUdiRelResponse, udiEntity); - traceRecordLogEntity.setTraceProductIdFk(traceProductDetailEntity.getId()); - traceRecordService.updateById(traceRecordLogEntity); - } - } else { - traceProductDetailEntity = udiTraceService.createTracerProductByUdiCode(traceRecordRequest.getUdiCode(), 2, 1, basicUdiRelResponse, udiEntity); - } + traceProductDetailEntity = udiTraceService.createTracerProductByUdiCode(traceRecordRequest.getUdiCode(), 2, 1, basicUdiRelResponse, udiEntity); + traceRecordLogEntity.setTraceProductIdFk(traceProductDetailEntity.getId()); + traceRecordService.updateById(traceRecordLogEntity); udiTraceService.createCheckTraceTask(traceProductDetailEntity, userCompanyEntity.getId()); - } else { //1:校验参数是否正确 if (StrUtil.isEmpty(traceRecordRequest.getYlqxzcrbarmc())) { @@ -251,8 +251,8 @@ public class UdiTraceController extends BaseController { traceProductDetailEntity = udiTraceService.createTracerProductByBatchNo(traceRecordRequest, 2, 2, basicUdiRelResponse); udiTraceService.createCheckTraceTask(traceProductDetailEntity, userCompanyEntity.getId()); } - traceSearchReponse.setTraceRecordLogEntity(traceRecordLogEntity); - return ResultVOUtils.success(traceSearchReponse); + List traceOrderEntities = traceOrderService.findByProductIdFk(traceRecordLogEntity.getTraceProductIdFk()); + return ResultVOUtils.success(traceOrderEntities); } @@ -269,11 +269,22 @@ public class UdiTraceController extends BaseController { if (bindingResult.hasErrors()) { return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL, bindingResult.getFieldError().getDefaultMessage()); } + + TraceTaskNoticeEntity taskNoticeEntity = traceTaskNoticeService.getById(traceOrderUploadRequest.getTaskId()); + if (taskNoticeEntity == null) { + return ResultVOUtils.error(500, "任务已过期,或任务不存在!"); + } + TraceOrderEntity traceOrderEntity = new TraceOrderEntity(); BeanUtils.copyProperties(traceOrderUploadRequest, traceOrderEntity); traceOrderEntity.setId(IdUtil.getSnowflakeNextId()); traceOrderEntity.setUpdateTime(new Date()); traceOrderService.save(traceOrderEntity); + + //设置任务已完成 + taskNoticeEntity.setStatus(3); + traceTaskNoticeService.updateById(taskNoticeEntity); + udiTraceService.pushDelayRemoveTask(taskNoticeEntity); return ResultVOUtils.success("上传成功"); } @@ -281,21 +292,42 @@ public class UdiTraceController extends BaseController { /** * 客户端根据任务上传生产关联关系信息 * - * @param traceOrderUploadRequest + * @param traceManuOrderUploadRequest * @param bindingResult * @return */ @AuthRuleAnnotation("udi/trace/manuOrder/upload") @PostMapping("udi/trace/manuOrder/upload") - public BaseResponse uploadManuOrder(@RequestBody TraceOrderUploadRequest traceOrderUploadRequest, BindingResult bindingResult) { + public BaseResponse uploadManuOrder(@RequestBody TraceManuOrderUploadRequest traceManuOrderUploadRequest, BindingResult bindingResult) { if (bindingResult.hasErrors()) { return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL, bindingResult.getFieldError().getDefaultMessage()); } - TraceOrderEntity traceOrderEntity = new TraceOrderEntity(); - BeanUtils.copyProperties(traceOrderUploadRequest, traceOrderEntity); - traceOrderEntity.setId(IdUtil.getSnowflakeNextId()); - traceOrderEntity.setUpdateTime(new Date()); - traceOrderService.save(traceOrderEntity); + + + TraceTaskNoticeEntity taskNoticeEntity = traceTaskNoticeService.getById(traceManuOrderUploadRequest.getTaskId()); + if (taskNoticeEntity == null) { + return ResultVOUtils.error(500, "任务已过期,或任务不存在!"); + } + TraceManuOrderEntity traceManuOrderEntity = new TraceManuOrderEntity(); + BeanUtils.copyProperties(traceManuOrderUploadRequest, traceManuOrderEntity); + traceManuOrderEntity.setId(IdUtil.getSnowflakeNextId()); + traceManuOrderService.save(traceManuOrderEntity); + List traceManuDetailRequests = traceManuOrderUploadRequest.getDetails(); + if (CollUtil.isNotEmpty(traceManuDetailRequests)) { + for (TraceManuDetailRequest traceManuDetailRequest : traceManuDetailRequests) { + TraceManuCodeRelEntity traceManuCodeRelEntity = new TraceManuCodeRelEntity(); + BeanUtils.copyProperties(traceManuDetailRequest, traceManuCodeRelEntity); + traceManuCodeRelEntity.setId(IdUtil.getSnowflakeNextId()); + traceManuCodeRelEntity.setManuOrderIdFk(traceManuOrderEntity.getId()); + traceManuOrderService.save(traceManuOrderEntity); + } + } + + //设置任务已完成 + taskNoticeEntity.setStatus(3); + traceTaskNoticeService.updateById(taskNoticeEntity); + udiTraceService.pushDelayRemoveTask(taskNoticeEntity); + return ResultVOUtils.success("上传成功"); } diff --git a/src/main/java/com/glxp/api/entity/trace/MqTaskDelayMessage.java b/src/main/java/com/glxp/api/entity/trace/MqTaskDelayMessage.java index 659e966..2387781 100644 --- a/src/main/java/com/glxp/api/entity/trace/MqTaskDelayMessage.java +++ b/src/main/java/com/glxp/api/entity/trace/MqTaskDelayMessage.java @@ -1,6 +1,9 @@ package com.glxp.api.entity.trace; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; import java.util.Date; @@ -8,6 +11,7 @@ import java.util.Date; * 查询任务超时处理 */ @Data +@Builder public class MqTaskDelayMessage { private Date createTime; diff --git a/src/main/java/com/glxp/api/req/trace/TraceManuOrderUploadRequest.java b/src/main/java/com/glxp/api/req/trace/TraceManuOrderUploadRequest.java index bd1584d..02481f9 100644 --- a/src/main/java/com/glxp/api/req/trace/TraceManuOrderUploadRequest.java +++ b/src/main/java/com/glxp/api/req/trace/TraceManuOrderUploadRequest.java @@ -9,8 +9,8 @@ import java.util.List; public class TraceManuOrderUploadRequest { - @NotNull(message = "追溯记录号") - private String recordCode; + @NotNull(message = "任务ID") + private Long taskId; /** diff --git a/src/main/java/com/glxp/api/req/trace/TraceOrderUploadRequest.java b/src/main/java/com/glxp/api/req/trace/TraceOrderUploadRequest.java index fe61bdf..0202074 100644 --- a/src/main/java/com/glxp/api/req/trace/TraceOrderUploadRequest.java +++ b/src/main/java/com/glxp/api/req/trace/TraceOrderUploadRequest.java @@ -6,6 +6,8 @@ import lombok.Data; public class TraceOrderUploadRequest { + private Long taskId; + /** * 单据号 */ diff --git a/src/main/java/com/glxp/api/service/system/SystemParamConfigService.java b/src/main/java/com/glxp/api/service/system/SystemParamConfigService.java index d062330..2e73687 100644 --- a/src/main/java/com/glxp/api/service/system/SystemParamConfigService.java +++ b/src/main/java/com/glxp/api/service/system/SystemParamConfigService.java @@ -27,6 +27,9 @@ public interface SystemParamConfigService extends IService implements SystemParamConfigService { +public class SystemParamConfigServiceImpl extends ServiceImpl implements SystemParamConfigService { @Resource SystemParamConfigDao systemParamConfigDao; @@ -69,6 +69,16 @@ public class SystemParamConfigServiceImpl extends ServiceImpl findBasicAll() { diff --git a/src/main/java/com/glxp/api/service/trace/RabbitPushService.java b/src/main/java/com/glxp/api/service/trace/RabbitPushService.java index 1eec54d..95c369c 100644 --- a/src/main/java/com/glxp/api/service/trace/RabbitPushService.java +++ b/src/main/java/com/glxp/api/service/trace/RabbitPushService.java @@ -4,9 +4,11 @@ import cn.hutool.core.lang.UUID; import com.glxp.api.common.res.BaseResponse; import com.glxp.api.common.util.ResultVOUtils; import com.glxp.api.config.rabbit.TopicRabbitConfig; +import com.glxp.api.entity.trace.MqTaskDelayMessage; import com.glxp.api.entity.trace.MqTraceMessage; import com.glxp.api.util.DateUtil; import lombok.RequiredArgsConstructor; +import org.springframework.amqp.core.MessageProperties; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.GetMapping; @@ -23,18 +25,30 @@ public class RabbitPushService { @Resource private final RabbitTemplate rabbitTemplate; + public BaseResponse send(MqTraceMessage mqTraceMessage) { - rabbitTemplate.convertAndSend("topicExchange", TopicRabbitConfig.trace, mqTraceMessage); + rabbitTemplate.convertAndSend(TopicRabbitConfig.TRACE_TOPIC_EXCHANGE, TopicRabbitConfig.trace, mqTraceMessage); + return ResultVOUtils.success("发送成功"); + } + + + public BaseResponse sendDeleyTask(MqTaskDelayMessage mqTaskDelayMessage, Integer delayTime) { + rabbitTemplate.convertAndSend(TopicRabbitConfig.TRACE_DELAY_EXCHANGE, TopicRabbitConfig.delaytrace, mqTaskDelayMessage, message -> { + MessageProperties messageProperties = message.getMessageProperties(); + messageProperties.setDelay(delayTime * 60); + return message; + }); return ResultVOUtils.success("发送成功"); } + public BaseResponse sendCommon(String key) { String messageId = String.valueOf(UUID.randomUUID()); Map messageMap = new HashMap<>(); messageMap.put("messageId", messageId); messageMap.put("messageData", key); messageMap.put("createTime", DateUtil.formatDate(new Date())); - rabbitTemplate.convertAndSend("topicExchange", TopicRabbitConfig.common, messageMap); + rabbitTemplate.convertAndSend(TopicRabbitConfig.TRACE_TOPIC_EXCHANGE, TopicRabbitConfig.common, messageMap); return ResultVOUtils.success("发送成功"); } } diff --git a/src/main/java/com/glxp/api/service/trace/UdiTraceService.java b/src/main/java/com/glxp/api/service/trace/UdiTraceService.java index 74a8194..162f519 100644 --- a/src/main/java/com/glxp/api/service/trace/UdiTraceService.java +++ b/src/main/java/com/glxp/api/service/trace/UdiTraceService.java @@ -13,6 +13,7 @@ import com.glxp.api.res.basic.BasicUdiRelResponse; import com.glxp.api.service.basic.BasicUdiProductService; import com.glxp.api.service.basic.BasicUdiRelService; import com.glxp.api.service.sup.UserCompanyService; +import com.glxp.api.service.system.SystemParamConfigService; import com.glxp.api.util.GennerOrderUtils; import org.springframework.stereotype.Service; @@ -44,6 +45,8 @@ public class UdiTraceService { RabbitPushService rabbitPushService; @Resource TraceManuOrderService traceManuOrderService; + @Resource + SystemParamConfigService systemParamConfigService; //创建查询日志 public TraceRecordLogEntity createRecordLog(String userId, Integer fromType, Integer traceType) { @@ -126,7 +129,8 @@ public class UdiTraceService { //生产订单关联关系 TraceTaskNoticeEntity manuTaskNotity = traceTaskNoticeService.findTask(1, traceProductDetailEntity.getId(), companyId); if (manuTaskNotity == null) { - createTraceNotice(1, traceProductDetailEntity, companyId); + manuTaskNotity = createTraceNotice(1, traceProductDetailEntity, companyId); + pushDelayExpireTask(manuTaskNotity); pushMq(traceProductDetailEntity, companyId); } else if (manuTaskNotity.getStatus() == 4) { //任务超时未处理,重新推送消息 @@ -143,13 +147,13 @@ public class UdiTraceService { toCorpCreditNums.add(traceOrderEntity.getToCorpCreditNum()); } } - List certNums = toCorpCreditNums.stream().distinct().collect(Collectors.toList()); for (String certNum : certNums) { UserCompanyEntity userCompanyEntity = userCompanyService.getOne(new QueryWrapper().eq("creditNum", certNum)); TraceTaskNoticeEntity taskNoticeEntity = traceTaskNoticeService.findTask(1, traceProductDetailEntity.getId(), userCompanyEntity.getId()); if (taskNoticeEntity == null) { - createTraceNotice(1, traceProductDetailEntity, companyId); + taskNoticeEntity = createTraceNotice(1, traceProductDetailEntity, companyId); + pushDelayExpireTask(taskNoticeEntity); pushMq(traceProductDetailEntity, companyId); } else if (taskNoticeEntity.getStatus() == 4) { //任务超时未处理,重新推送消息 @@ -185,7 +189,8 @@ public class UdiTraceService { UserCompanyEntity userCompanyEntity = userCompanyService.getOne(new QueryWrapper().eq("creditNum", certNum)); TraceTaskNoticeEntity taskNoticeEntity = traceTaskNoticeService.findTask(1, traceProductDetailEntity.getId(), userCompanyEntity.getId()); if (taskNoticeEntity == null) { - createTraceNotice(1, traceProductDetailEntity, companyId); + taskNoticeEntity = createTraceNotice(1, traceProductDetailEntity, companyId); + pushDelayExpireTask(taskNoticeEntity); pushMq(traceProductDetailEntity, companyId); } else if (taskNoticeEntity.getStatus() == 4) { //任务超时未处理,重新推送消息 @@ -236,7 +241,28 @@ public class UdiTraceService { mqTraceMessage.setCerditNo(traceProductDetailEntity.getCreditNum()); mqTraceMessage.setTaskId(traceProductDetailEntity.getId()); rabbitPushService.send(mqTraceMessage); + } + + + public void pushDelayRemoveTask(TraceTaskNoticeEntity taskNoticeEntity) { + //设置任务自动过期 + Integer taskExitTime = systemParamConfigService.selectIntValueByParamKey("task_exit"); + MqTaskDelayMessage mqTaskDelayMessage = MqTaskDelayMessage + .builder().taskId(taskNoticeEntity.getId()) + .createTime(new Date()) + .taskStatus(taskNoticeEntity.getStatus()).build(); + rabbitPushService.sendDeleyTask(mqTaskDelayMessage, taskExitTime); + } + + public void pushDelayExpireTask(TraceTaskNoticeEntity taskNoticeEntity) { + //设置任务自动过期 + Integer taskExitTime = systemParamConfigService.selectIntValueByParamKey("task_expire"); + MqTaskDelayMessage mqTaskDelayMessage = MqTaskDelayMessage + .builder().taskId(taskNoticeEntity.getId()) + .createTime(new Date()) + .taskStatus(taskNoticeEntity.getStatus()).build(); + rabbitPushService.sendDeleyTask(mqTaskDelayMessage, taskExitTime); } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index dc28405..7a2c59f 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -4,9 +4,9 @@ server: spring: datasource: driver-class-name: com.p6spy.engine.spy.P6SpyDriver - jdbc-url: jdbc:p6spy:mysql://127.0.0.1:3306/udi_cpt?allowMultiQueries=true&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true + jdbc-url: jdbc:p6spy:mysql://192.168.0.66:3364/udi_cpt?allowMultiQueries=true&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true username: root - password: 123456 + password: Glxp@6066 hikari: connection-timeout: 60000 maximum-pool-size: 20