From 68b96deeb6c9fcfe61a0ea2cc5f30d5a92f05e89 Mon Sep 17 00:00:00 2001 From: quyixiao <2621048238@qq.com> Date: Thu, 23 Oct 2025 19:17:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../heyu/api/data/config/RabbitConfig.java | 30 ++- .../heyu/api/data/dao/vv/VvPackageDao.java | 2 + .../java/com/heyu/api/data/dto/DelayDTO.java | 23 ++ .../api/data/dto/PackageDelivedDelayDTO.java | 11 + .../entity/vv/VvTradeOrderLineEntity.java | 215 +++++++++++------- .../com/heyu/api/data/enums/RoleEnums.java | 36 +++ .../service/impl/vv/VvPackageServiceImpl.java | 160 +++++++++---- .../api/data/service/vv/VvPackageService.java | 2 +- .../java/com/test/xxx/MysqlMain_update.java | 2 +- .../vv/AppKuaiDiCallBackController.java | 19 +- .../controller/vv/AppLogisticsController.java | 8 +- .../api/controller/vv/AppTestController.java | 41 +++- .../listener/DelaySimpleRabbitListener.java | 49 ++++ .../api/schedule/impl/PackageUpdateJob.java | 39 ++++ .../src/main/resources/bootstrap.yml | 2 + 15 files changed, 485 insertions(+), 154 deletions(-) create mode 100644 api-mapper/src/main/java/com/heyu/api/data/dto/DelayDTO.java create mode 100644 api-mapper/src/main/java/com/heyu/api/data/dto/PackageDelivedDelayDTO.java create mode 100644 api-mapper/src/main/java/com/heyu/api/data/enums/RoleEnums.java create mode 100644 api-web/api-interface/src/main/java/com/heyu/api/listener/DelaySimpleRabbitListener.java create mode 100644 api-web/api-interface/src/main/java/com/heyu/api/schedule/impl/PackageUpdateJob.java diff --git a/api-mapper/src/main/java/com/heyu/api/data/config/RabbitConfig.java b/api-mapper/src/main/java/com/heyu/api/data/config/RabbitConfig.java index 51aa0d8..8c9cae9 100644 --- a/api-mapper/src/main/java/com/heyu/api/data/config/RabbitConfig.java +++ b/api-mapper/src/main/java/com/heyu/api/data/config/RabbitConfig.java @@ -2,8 +2,7 @@ package com.heyu.api.data.config; import lombok.extern.slf4j.Slf4j; -import org.springframework.amqp.core.AcknowledgeMode; -import org.springframework.amqp.core.Queue; +import org.springframework.amqp.core.*; import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory; import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; import org.springframework.amqp.rabbit.core.RabbitTemplate; @@ -12,6 +11,9 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.util.HashMap; +import java.util.Map; + /** * @author wutao * @description mq配置 @@ -63,6 +65,30 @@ public class RabbitConfig { + @Bean + public Queue delayQueue(@Value("${eb.config.rabbitQueue.delayQueue}") String queueName) { + return new Queue(queueName,true); + } + + + // ---------------------------- 定义exchange --------------------------------- + // 定义广播模式的延时交换机 无需绑定路由 + @Bean + FanoutExchange delayExchange(@Value("${eb.config.rabbitQueue.delayExchangeName}") String delay_exchange_name){ + Map args = new HashMap(); + args.put("x-delayed-type", "direct"); + FanoutExchange topicExchange = new FanoutExchange(delay_exchange_name, true, false, args); + topicExchange.setDelayed(true); + return topicExchange; + } + + // 绑定延时队列与交换机 + @Bean + public Binding delayPayBind(@Value("${eb.config.rabbitQueue.delayQueue}") String delay_queue_name, + @Value("${eb.config.rabbitQueue.delayExchangeName}") String delay_exchange_name ) { + return BindingBuilder.bind(delayQueue(delay_queue_name)).to(delayExchange(delay_exchange_name)); + } + diff --git a/api-mapper/src/main/java/com/heyu/api/data/dao/vv/VvPackageDao.java b/api-mapper/src/main/java/com/heyu/api/data/dao/vv/VvPackageDao.java index a502783..d643aa7 100644 --- a/api-mapper/src/main/java/com/heyu/api/data/dao/vv/VvPackageDao.java +++ b/api-mapper/src/main/java/com/heyu/api/data/dao/vv/VvPackageDao.java @@ -13,6 +13,7 @@ import com.heyu.api.data.entity.vv.VvPackageEntity; import com.lz.mybatis.plugin.annotations.IFNullReturnEmpty; import com.lz.mybatis.plugin.annotations.IN; import com.lz.mybatis.plugin.annotations.LIMIT; +import com.lz.mybatis.plugin.annotations.NotIn; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -49,4 +50,5 @@ public interface VvPackageDao extends BaseMapper { @LIMIT VvPackageEntity selectVvPackageByTrackNumber(String trackNumber); + List selectVvPackageByIsCheckNotIN(@NotIn List ischeck); } \ No newline at end of file diff --git a/api-mapper/src/main/java/com/heyu/api/data/dto/DelayDTO.java b/api-mapper/src/main/java/com/heyu/api/data/dto/DelayDTO.java new file mode 100644 index 0000000..4a78767 --- /dev/null +++ b/api-mapper/src/main/java/com/heyu/api/data/dto/DelayDTO.java @@ -0,0 +1,23 @@ +package com.heyu.api.data.dto; + +import lombok.Data; + +@Data +public class DelayDTO { + + private String sendTime; + /*** + * + */ + private String delayTime; + + /*** + * 谁调用的 + */ + private String role; + + /*** + * 当前类型 + */ + private String type; +} diff --git a/api-mapper/src/main/java/com/heyu/api/data/dto/PackageDelivedDelayDTO.java b/api-mapper/src/main/java/com/heyu/api/data/dto/PackageDelivedDelayDTO.java new file mode 100644 index 0000000..da4c130 --- /dev/null +++ b/api-mapper/src/main/java/com/heyu/api/data/dto/PackageDelivedDelayDTO.java @@ -0,0 +1,11 @@ +package com.heyu.api.data.dto; + + +import lombok.Data; + +@Data +public class PackageDelivedDelayDTO extends DelayDTO{ + + private String packageId; + +} diff --git a/api-mapper/src/main/java/com/heyu/api/data/entity/vv/VvTradeOrderLineEntity.java b/api-mapper/src/main/java/com/heyu/api/data/entity/vv/VvTradeOrderLineEntity.java index b1a6cef..ebdde25 100644 --- a/api-mapper/src/main/java/com/heyu/api/data/entity/vv/VvTradeOrderLineEntity.java +++ b/api-mapper/src/main/java/com/heyu/api/data/entity/vv/VvTradeOrderLineEntity.java @@ -1,16 +1,16 @@ package com.heyu.api.data.entity.vv; - import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; +import com.lz.mybatis.plugin.annotations.AS; import java.math.BigDecimal; -import java.util.Date; +import java.util.Date;import java.util.Date; /** *购物车 * @author quyixiao -* @since 2025-10-22 +* @since 2025-10-23 */ @Data @@ -39,10 +39,6 @@ private static final long serialVersionUID = 1L; public final static String sku_id = CLASS_NAME + "sku_id"; // skuid public final static String sku_image_url = CLASS_NAME + "sku_image_url"; // sku图片 public final static String comment_id = CLASS_NAME + "comment_id"; // 评论 id - public final static String gmt_down_order = CLASS_NAME + "gmt_down_order"; // 下单时间 - public final static String gmt_pay = CLASS_NAME + "gmt_pay"; // 支付时间 - public final static String gmt_to_shipping = CLASS_NAME + "gmt_to_shipping"; // 打包时间 - public final static String gmt_delivered = CLASS_NAME + "gmt_delivered"; // 妥投时间 public final static String delivered_type = CLASS_NAME + "delivered_type"; // 1 买家手动确认收货, 2 系统自动确认收货 public final static String settle_status = CLASS_NAME + "settle_status"; // 0 未结算,1 已经结算 public final static String gmt_settle = CLASS_NAME + "gmt_settle"; // 结算时间 @@ -63,6 +59,13 @@ private static final long serialVersionUID = 1L; public final static String batch_num = CLASS_NAME + "batch_num"; // 批次数量 public final static String shipping_amount = CLASS_NAME + "shipping_amount"; // 运费 public final static String promotion_price = CLASS_NAME + "promotion_price"; // 当时促销价 + public final static String state_ = CLASS_NAME + "state"; // 快递单当前状态,默认为0在途,1揽收,2疑难,3签收,4退签,5派件,8清关,14拒签等10个基础物流状态,如需要返回高级物流状态,请参考 resultv2 传值 + public final static String gmt_down_order = CLASS_NAME + "gmt_down_order"; // 下单时间 + public final static String gmt_pay = CLASS_NAME + "gmt_pay"; // 支付时间 + public final static String gmt_to_shipping = CLASS_NAME + "gmt_to_shipping"; // 打包时间 + public final static String gmt_sign_receipt = CLASS_NAME + "gmt_sign_receipt"; // 签收日期 + public final static String gmt_delivered = CLASS_NAME + "gmt_delivered"; // 妥投时间 + public final static String delivered_by = CLASS_NAME + "delivered_by"; // system:系统,user:用户 ,admin 后台确认 // @TableId(value = "id", type = IdType.AUTO) private Long id; @@ -100,14 +103,6 @@ private static final long serialVersionUID = 1L; private String skuImageUrl; //评论 id private Long commentId; - //下单时间 - private Date gmtDownOrder; - //支付时间 - private Date gmtPay; - //打包时间 - private Date gmtToShipping; - //妥投时间 - private Date gmtDelivered; //1 买家手动确认收货, 2 系统自动确认收货 private Integer deliveredType; //0 未结算,1 已经结算 @@ -148,6 +143,20 @@ private static final long serialVersionUID = 1L; private BigDecimal shippingAmount; //当时促销价 private BigDecimal promotionPrice; + //快递单当前状态,默认为0在途,1揽收,2疑难,3签收,4退签,5派件,8清关,14拒签等10个基础物流状态,如需要返回高级物流状态,请参考 resultv2 传值 + private String state; + //下单时间 + private Date gmtDownOrder; + //支付时间 + private Date gmtPay; + //打包时间 + private Date gmtToShipping; + //签收日期 + private Date gmtSignReceipt; + //妥投时间 + private Date gmtDelivered; + //system:系统,user:用户 ,admin 后台确认 + private String deliveredBy; /** * * @return @@ -418,66 +427,6 @@ private static final long serialVersionUID = 1L; this.commentId = commentId; } - /** - * 下单时间 - * @return - */ - public Date getGmtDownOrder() { - return gmtDownOrder; - } - /** - * 下单时间 - * @param gmtDownOrder - */ - public void setGmtDownOrder(Date gmtDownOrder) { - this.gmtDownOrder = gmtDownOrder; - } - - /** - * 支付时间 - * @return - */ - public Date getGmtPay() { - return gmtPay; - } - /** - * 支付时间 - * @param gmtPay - */ - public void setGmtPay(Date gmtPay) { - this.gmtPay = gmtPay; - } - - /** - * 打包时间 - * @return - */ - public Date getGmtToShipping() { - return gmtToShipping; - } - /** - * 打包时间 - * @param gmtToShipping - */ - public void setGmtToShipping(Date gmtToShipping) { - this.gmtToShipping = gmtToShipping; - } - - /** - * 妥投时间 - * @return - */ - public Date getGmtDelivered() { - return gmtDelivered; - } - /** - * 妥投时间 - * @param gmtDelivered - */ - public void setGmtDelivered(Date gmtDelivered) { - this.gmtDelivered = gmtDelivered; - } - /** * 1 买家手动确认收货, 2 系统自动确认收货 * @return @@ -778,6 +727,111 @@ private static final long serialVersionUID = 1L; this.promotionPrice = promotionPrice; } + /** + * 快递单当前状态,默认为0在途,1揽收,2疑难,3签收,4退签,5派件,8清关,14拒签等10个基础物流状态,如需要返回高级物流状态,请参考 resultv2 传值 + * @return + */ + public String getState() { + return state; + } + /** + * 快递单当前状态,默认为0在途,1揽收,2疑难,3签收,4退签,5派件,8清关,14拒签等10个基础物流状态,如需要返回高级物流状态,请参考 resultv2 传值 + * @param state + */ + public void setState(String state) { + this.state = state; + } + + /** + * 下单时间 + * @return + */ + public Date getGmtDownOrder() { + return gmtDownOrder; + } + /** + * 下单时间 + * @param gmtDownOrder + */ + public void setGmtDownOrder(Date gmtDownOrder) { + this.gmtDownOrder = gmtDownOrder; + } + + /** + * 支付时间 + * @return + */ + public Date getGmtPay() { + return gmtPay; + } + /** + * 支付时间 + * @param gmtPay + */ + public void setGmtPay(Date gmtPay) { + this.gmtPay = gmtPay; + } + + /** + * 打包时间 + * @return + */ + public Date getGmtToShipping() { + return gmtToShipping; + } + /** + * 打包时间 + * @param gmtToShipping + */ + public void setGmtToShipping(Date gmtToShipping) { + this.gmtToShipping = gmtToShipping; + } + + /** + * 签收日期 + * @return + */ + public Date getGmtSignReceipt() { + return gmtSignReceipt; + } + /** + * 签收日期 + * @param gmtSignReceipt + */ + public void setGmtSignReceipt(Date gmtSignReceipt) { + this.gmtSignReceipt = gmtSignReceipt; + } + + /** + * 妥投时间 + * @return + */ + public Date getGmtDelivered() { + return gmtDelivered; + } + /** + * 妥投时间 + * @param gmtDelivered + */ + public void setGmtDelivered(Date gmtDelivered) { + this.gmtDelivered = gmtDelivered; + } + + /** + * system:系统,user:用户 ,admin 后台确认 + * @return + */ + public String getDeliveredBy() { + return deliveredBy; + } + /** + * system:系统,user:用户 ,admin 后台确认 + * @param deliveredBy + */ + public void setDeliveredBy(String deliveredBy) { + this.deliveredBy = deliveredBy; + } + @Override public String toString() { return "VvTradeOrderLineEntity{" + @@ -799,10 +853,6 @@ private static final long serialVersionUID = 1L; ",skuId=" + skuId + ",skuImageUrl=" + skuImageUrl + ",commentId=" + commentId + - ",gmtDownOrder=" + gmtDownOrder + - ",gmtPay=" + gmtPay + - ",gmtToShipping=" + gmtToShipping + - ",gmtDelivered=" + gmtDelivered + ",deliveredType=" + deliveredType + ",settleStatus=" + settleStatus + ",gmtSettle=" + gmtSettle + @@ -823,6 +873,13 @@ private static final long serialVersionUID = 1L; ",batchNum=" + batchNum + ",shippingAmount=" + shippingAmount + ",promotionPrice=" + promotionPrice + + ",state=" + state + + ",gmtDownOrder=" + gmtDownOrder + + ",gmtPay=" + gmtPay + + ",gmtToShipping=" + gmtToShipping + + ",gmtSignReceipt=" + gmtSignReceipt + + ",gmtDelivered=" + gmtDelivered + + ",deliveredBy=" + deliveredBy + "}"; } } \ No newline at end of file diff --git a/api-mapper/src/main/java/com/heyu/api/data/enums/RoleEnums.java b/api-mapper/src/main/java/com/heyu/api/data/enums/RoleEnums.java new file mode 100644 index 0000000..cbd593b --- /dev/null +++ b/api-mapper/src/main/java/com/heyu/api/data/enums/RoleEnums.java @@ -0,0 +1,36 @@ +package com.heyu.api.data.enums; + + +public enum RoleEnums { + system("system","系统"), + user("user","用户"), + admin("admin","后台"), + job("job","定时任务"), + kuaidi100_callback("kuaidi100_callback","快递100回调"), + ; + + RoleEnums(String role, String desc) { + this.role = role; + this.desc = desc; + } + + public String getRole() { + return role; + } + + public void setRole(String role) { + this.role = role; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + private String role; + + private String desc; +} diff --git a/api-mapper/src/main/java/com/heyu/api/data/service/impl/vv/VvPackageServiceImpl.java b/api-mapper/src/main/java/com/heyu/api/data/service/impl/vv/VvPackageServiceImpl.java index 2fe2f57..ac0f230 100644 --- a/api-mapper/src/main/java/com/heyu/api/data/service/impl/vv/VvPackageServiceImpl.java +++ b/api-mapper/src/main/java/com/heyu/api/data/service/impl/vv/VvPackageServiceImpl.java @@ -1,82 +1,106 @@ package com.heyu.api.data.service.impl.vv; /** -*

-* 包裹表 服务类 -*

-* -* @author quyixiao -* @since 2025-08-23 -*/ + *

+ * 包裹表 服务类 + *

+ * + * @author quyixiao + * @since 2025-08-23 + */ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.heyu.api.data.dao.vv.VvPackageDao; +import com.heyu.api.data.dao.vv.VvTradeOrderLineDao; +import com.heyu.api.data.dto.PackageDelivedDelayDTO; import com.heyu.api.data.dto.vv.KuaiDi100DTO; import com.heyu.api.data.entity.vv.VvPackageEntity; +import com.heyu.api.data.entity.vv.VvTradeOrderLineEntity; import com.heyu.api.data.enums.KuaiDi100StateEnums; import com.heyu.api.data.kuaidi100.KuaiDi100Utils; import com.heyu.api.data.kuaidi100.LogisticsMapUtils; import com.heyu.api.data.service.vv.VvPackageService; +import com.heyu.api.data.utils.DateUtils; import com.heyu.api.data.utils.StringUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.core.MessageDeliveryMode; +import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; + @Service +@Slf4j public class VvPackageServiceImpl extends ServiceImpl implements VvPackageService { @Autowired - private VvPackageDao vvPackageDao; + private VvPackageDao vvPackageDao; - - @Override - public VvPackageEntity selectVvPackageById(Long id){ - return vvPackageDao.selectVvPackageById(id); - } + @Value("${eb.config.rabbitQueue.delayQueue}") + private String delayQueue; + @Value("${eb.config.rabbitQueue.delayExchangeName}") + private String delayExchangeName; - @Override - public Long insertVvPackage(VvPackageEntity vvPackage){ - return vvPackageDao.insertVvPackage(vvPackage); - } + @Autowired + private RabbitTemplate rabbitTemplate; + @Autowired + private VvTradeOrderLineDao tradeOrderLineDao; - @Override - public Long insertOrUpdateVvPackage(VvPackageEntity vvPackage){ - return vvPackageDao.insertOrUpdateVvPackage(vvPackage); - } - - - - @Override - public int updateVvPackageById(VvPackageEntity vvPackage){ - return vvPackageDao.updateVvPackageById(vvPackage); - } - - - - @Override - public int updateCoverVvPackageById(VvPackageEntity vvPackage){ - return vvPackageDao.updateCoverVvPackageById(vvPackage); - } - - - - @Override - public int deleteVvPackageById(Long id){ - return vvPackageDao.deleteVvPackageById(id); - } @Override - public KuaiDi100DTO selectVvKuaidiAndUpdateData(String trackNumber) { + public VvPackageEntity selectVvPackageById(Long id) { + return vvPackageDao.selectVvPackageById(id); + } + + + @Override + public Long insertVvPackage(VvPackageEntity vvPackage) { + return vvPackageDao.insertVvPackage(vvPackage); + } + + + @Override + public Long insertOrUpdateVvPackage(VvPackageEntity vvPackage) { + return vvPackageDao.insertOrUpdateVvPackage(vvPackage); + } + + + @Override + public int updateVvPackageById(VvPackageEntity vvPackage) { + return vvPackageDao.updateVvPackageById(vvPackage); + } + + + @Override + public int updateCoverVvPackageById(VvPackageEntity vvPackage) { + return vvPackageDao.updateCoverVvPackageById(vvPackage); + } + + + @Override + public int deleteVvPackageById(Long id) { + return vvPackageDao.deleteVvPackageById(id); + } + + + @Override + public KuaiDi100DTO selectVvKuaidiAndUpdateData(String trackNumber, String role) { VvPackageEntity vvPackageEntity = vvPackageDao.selectVvPackageByTrackNumber(trackNumber); KuaiDi100DTO kuaiDi100DTO = null; + // 如果是已经签收状态 if (KuaiDi100StateEnums.sign_receipt.getState().equals(vvPackageEntity.getState())) { kuaiDi100DTO = JSONObject.parseObject(vvPackageEntity.getPackageLogisticsInfo(), KuaiDi100DTO.class); - } else { + } else { //如果当次查到的是已经签收状态 kuaiDi100DTO = KuaiDi100Utils.getLogisticsInfo(trackNumber); vvPackageEntity.setIscheck(kuaiDi100DTO.getIscheck()); vvPackageEntity.setCom(kuaiDi100DTO.getCom()); @@ -86,18 +110,60 @@ public class VvPackageServiceImpl extends ServiceImpl dataDTOS = kuaiDi100DTO.getData(); + if (dataDTOS != null && dataDTOS.size() > 0) { + for (KuaiDi100DTO.DataDTO dataDTO : dataDTOS) { + String status = dataDTO.getStatus(); + if (KuaiDi100StateEnums.sign_receipt.getDesc().equals(status)) { + String fTime = dataDTO.getFtime(); + Date time = DateUtils.parseDate(fTime); + Date timeAfter15 = DateUtils.addDays(time, 15); + // 设置签收时间 + vvPackageEntity.setGmtSignReceipt(time); + PackageDelivedDelayDTO dto = new PackageDelivedDelayDTO(); + dto.setPackageId(vvPackageEntity.getId() + ""); + dto.setRole(role); + dto.setSendTime(DateUtils.formatDate(new Date(), com.heyu.api.data.utils.DateUtils.YYYY_MM_DD_HH_MM_SS)); + dto.setDelayTime(DateUtils.formatDate(timeAfter15, com.heyu.api.data.utils.DateUtils.YYYY_MM_DD_HH_MM_SS)); + + int second = DateUtils.betweenSecond(time, timeAfter15); + log.info("VvPackageServiceImpl delay send :{}",JSON.toJSONString(dto)); + // 通过广播模式发布延时消息 延时30分钟 持久化消息 消费后销毁 这里无需指定路由,会广播至每个绑定此交换机的队列 + rabbitTemplate.convertAndSend(delayExchangeName, "", JSON.toJSONString(dto), message -> { + message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT); + message.getMessageProperties().setDelay((second) * 1000); // 毫秒为单位,指定此消息的延时时长 ,+ 1 尽量保证机器人跑完了,再发送消息 + return message; + }); + + // 设置已经发送消息了 + vvPackageEntity.setIscheck("2"); + vvPackageEntity.setGmtSendMqDelivered(new Date()); + + + + List tradeOrderLineEntities = tradeOrderLineDao.selectVvTradeOrderLineByTrackNumber(trackNumber); + for (VvTradeOrderLineEntity tradeOrderLineEntity : tradeOrderLineEntities) { + tradeOrderLineEntity.setGmtSignReceipt(time); + tradeOrderLineEntity.setState(kuaiDi100DTO.getState()); + + tradeOrderLineDao.updateVvTradeOrderLineById(tradeOrderLineEntity); + } + + } + } + } + } vvPackageDao.updateVvPackageById(vvPackageEntity); - } return kuaiDi100DTO; } diff --git a/api-mapper/src/main/java/com/heyu/api/data/service/vv/VvPackageService.java b/api-mapper/src/main/java/com/heyu/api/data/service/vv/VvPackageService.java index ecebb2d..2b97dfa 100644 --- a/api-mapper/src/main/java/com/heyu/api/data/service/vv/VvPackageService.java +++ b/api-mapper/src/main/java/com/heyu/api/data/service/vv/VvPackageService.java @@ -32,5 +32,5 @@ public interface VvPackageService extends IService { int deleteVvPackageById(Long id); - KuaiDi100DTO selectVvKuaidiAndUpdateData(String trackNumber); + KuaiDi100DTO selectVvKuaidiAndUpdateData(String trackNumber,String role); } \ No newline at end of file diff --git a/api-mapper/src/test/java/com/test/xxx/MysqlMain_update.java b/api-mapper/src/test/java/com/test/xxx/MysqlMain_update.java index 3eac3da..d28fb85 100644 --- a/api-mapper/src/test/java/com/test/xxx/MysqlMain_update.java +++ b/api-mapper/src/test/java/com/test/xxx/MysqlMain_update.java @@ -49,7 +49,7 @@ public class MysqlMain_update { List list = new ArrayList(); - String a = "vv_package"; + String a = "vv_trade_order_line"; for (String s : a.split(",")) { list.add(new TablesBean(s)); } diff --git a/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppKuaiDiCallBackController.java b/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppKuaiDiCallBackController.java index d1a8de4..5c4f270 100644 --- a/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppKuaiDiCallBackController.java +++ b/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppKuaiDiCallBackController.java @@ -2,8 +2,8 @@ package com.heyu.api.controller.vv; import com.google.gson.Gson; import com.heyu.api.common.annotation.Describe; -import com.heyu.api.data.dao.vv.VvPackageDao; -import com.heyu.api.data.entity.vv.VvPackageEntity; +import com.heyu.api.data.enums.RoleEnums; +import com.heyu.api.data.service.vv.VvPackageService; import com.kuaidi100.sdk.response.SubscribePushParamResp; import com.kuaidi100.sdk.response.SubscribePushResult; import com.kuaidi100.sdk.response.SubscribeResp; @@ -19,7 +19,7 @@ import org.springframework.web.bind.annotation.RestController; public class AppKuaiDiCallBackController { @Autowired - private VvPackageDao vvPackageDao; + private VvPackageService vvPackageService; /*** * https://api.1024api.com/api-interface/app/kuaidi/callback @@ -30,7 +30,7 @@ public class AppKuaiDiCallBackController { @RequestMapping("/callback") public SubscribeResp callback(String param, String sign) { - log.info("kuaidi callback param:{},sign", param,sign); + log.info("kuaidi callback param:{},sign", param, sign); //建议记录一下这个回调的内容,方便出问题后双方排查问题 //log.debug("快递100订阅推送回调结果|{}|{}",param,sign); @@ -42,18 +42,13 @@ public class AppKuaiDiCallBackController { subscribeResp.setReturnCode("200"); subscribeResp.setMessage("成功"); //加密如果相等,属于快递100推送;否则可以忽略掉当前请求 - if (ourSign.equals(sign)){ + if (ourSign.equals(sign)) { //TODO 业务处理 SubscribePushParamResp subscribePushParamResp = new Gson().fromJson(param, SubscribePushParamResp.class); SubscribePushResult subscribePushResult = subscribePushParamResp.getLastResult(); - if(subscribePushResult !=null){ - VvPackageEntity vvPackageEntity = vvPackageDao.selectVvPackageByTrackNumber(subscribePushResult.getNu()); - vvPackageEntity.setIscheck(subscribePushResult.getIscheck()); - vvPackageEntity.setCom(subscribePushResult.getCom()); - vvPackageEntity.setStatus(subscribePushResult.getStatus()); - vvPackageEntity.setState(subscribePushResult.getState()); - vvPackageDao.updateVvPackageById(vvPackageEntity); + if (subscribePushResult != null) { + vvPackageService.selectVvKuaidiAndUpdateData(subscribePushResult.getNu(), RoleEnums.kuaidi100_callback.getRole()); } return subscribeResp; } diff --git a/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppLogisticsController.java b/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppLogisticsController.java index f89d005..29f5add 100644 --- a/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppLogisticsController.java +++ b/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppLogisticsController.java @@ -7,6 +7,7 @@ import com.heyu.api.data.dao.vv.VvPackageDao; import com.heyu.api.data.dao.vv.VvTradeOrderLineDao; import com.heyu.api.data.dto.vv.KuaiDi100DTO; import com.heyu.api.data.entity.vv.VvTradeOrderLineEntity; +import com.heyu.api.data.enums.RoleEnums; import com.heyu.api.data.service.vv.VvPackageService; import com.heyu.api.data.utils.R; import lombok.extern.slf4j.Slf4j; @@ -38,17 +39,12 @@ public class AppLogisticsController { @Describe("物流查询") @RequestMapping("/query") public R query(@RequestBody VvAppLogisticsRequest request) { - List vvTradeOrderLineEntity = vvTradeOrderLineDao.selectVvTradeOrderLineByBuyerIdTrackNumber(request.getBuyerId(), request.getTrackNumber()); - if (CollectionUtils.isEmpty(vvTradeOrderLineEntity)) { return R.error("trackNumber不是你的"); } - - KuaiDi100DTO kuaiDi100DTO = vvPackageService.selectVvKuaidiAndUpdateData(request.getTrackNumber()); - - + KuaiDi100DTO kuaiDi100DTO = vvPackageService.selectVvKuaidiAndUpdateData(request.getTrackNumber(), RoleEnums.user.getRole()); return R.ok().setData(kuaiDi100DTO); diff --git a/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppTestController.java b/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppTestController.java index 18764bc..bd0f409 100644 --- a/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppTestController.java +++ b/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppTestController.java @@ -6,14 +6,17 @@ import com.heyu.api.common.annotation.Describe; import com.heyu.api.data.dao.vv.VvAllDataDao; import com.heyu.api.data.dao.vv.VvChartConfigDao; import com.heyu.api.data.dao.vv.VvCreateDataConfigDao; +import com.heyu.api.data.dto.PackageDelivedDelayDTO; import com.heyu.api.data.dto.VvCreateDataConfigDTO; import com.heyu.api.data.entity.vv.VvChartConfigEntity; import com.heyu.api.data.entity.vv.VvCreateDataConfigEntity; import com.heyu.api.data.utils.ChartUtil; +import com.heyu.api.data.utils.DateUtils; import com.heyu.api.data.utils.R; import com.heyu.api.oss.OssFileUploadService; import com.heyu.api.schedule.CronTriggerUtils; import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.core.MessageDeliveryMode; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -50,8 +53,6 @@ public class AppTestController { private VvChartConfigDao vvChartConfigDao; - - @Value("${eb.config.rabbitQueue.createDataQueue}") private String createDataQueue; @@ -63,6 +64,14 @@ public class AppTestController { private RabbitTemplate rabbitTemplate; + @Value("${eb.config.rabbitQueue.delayQueue}") + private String delayQueue; + + + @Value("${eb.config.rabbitQueue.delayExchangeName}") + private String delayExchangeName; + + // /app/test/insert @Describe("测试数据插入") @RequestMapping("/insert") @@ -94,9 +103,29 @@ public class AppTestController { } - public static void main(String[] args) { - System.out.println(System.currentTimeMillis() ); + // /app/test/delay + @Describe("测试延迟队列") + @RequestMapping("/delay") + public R delay(@RequestBody AppOrderRequest vvOrderRequest) throws Exception { + PackageDelivedDelayDTO dto = new PackageDelivedDelayDTO(); + dto.setPackageId("10"); + dto.setRole("test"); + Date time = new Date(); + Date timeAfter15 = DateUtils.addSeconds(time, 10); + dto.setSendTime(DateUtils.formatDate(new Date(), com.heyu.api.data.utils.DateUtils.YYYY_MM_DD_HH_MM_SS)); + dto.setDelayTime(DateUtils.formatDate(timeAfter15, com.heyu.api.data.utils.DateUtils.YYYY_MM_DD_HH_MM_SS)); + + int second = DateUtils.betweenSecond(time, timeAfter15); + // 通过广播模式发布延时消息 延时30分钟 持久化消息 消费后销毁 这里无需指定路由,会广播至每个绑定此交换机的队列 + rabbitTemplate.convertAndSend(delayExchangeName, "", JSON.toJSONString(dto), message -> { + message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT); + message.getMessageProperties().setDelay((second) * 1000); // 毫秒为单位,指定此消息的延时时长 ,+ 1 尽量保证机器人跑完了,再发送消息 + return message; + }); + return R.ok(); + + } + public static void main(String[] args) { + System.out.println(System.currentTimeMillis()); } - - } diff --git a/api-web/api-interface/src/main/java/com/heyu/api/listener/DelaySimpleRabbitListener.java b/api-web/api-interface/src/main/java/com/heyu/api/listener/DelaySimpleRabbitListener.java new file mode 100644 index 0000000..8d5223c --- /dev/null +++ b/api-web/api-interface/src/main/java/com/heyu/api/listener/DelaySimpleRabbitListener.java @@ -0,0 +1,49 @@ +package com.heyu.api.listener; + +import com.rabbitmq.client.Channel; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.rabbit.annotation.RabbitHandler; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.amqp.support.AmqpHeaders; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.messaging.handler.annotation.Header; +import org.springframework.messaging.handler.annotation.Payload; +import org.springframework.stereotype.Component; + +import java.io.IOException; + +@Component +@Slf4j +public class DelaySimpleRabbitListener { + + @Value("${eb.config.rabbitQueue.delayQueue}") + private String delayQueue; + + + @RabbitHandler + @RabbitListener(queues = "#{delayQueue.name}", containerFactory = "accountAmountQueueSimpleRabbitListenerContainerFactory") + public void consumeMessage(@Payload String message, @Header(AmqpHeaders.DELIVERY_TAG) long delivertTag, Channel channel) { + try { + log.info("DeliveredDelaySimpleRabbitListener delayQueue :{} message:{}", delayQueue, message); + + + + + + + + + + + } catch (Exception e) { + log.error("DeliveredDelaySimpleRabbitListener handle", e); + } finally { + try { + log.info("DeliveredDelaySimpleRabbitListener 消息{},消息确认完成", message); + channel.basicAck(delivertTag, true); + } catch (IOException e) { + log.error("DeliveredDelaySimpleRabbitListener 消息确认异常", e); + } + } + } +} \ No newline at end of file diff --git a/api-web/api-interface/src/main/java/com/heyu/api/schedule/impl/PackageUpdateJob.java b/api-web/api-interface/src/main/java/com/heyu/api/schedule/impl/PackageUpdateJob.java new file mode 100644 index 0000000..d39c6f3 --- /dev/null +++ b/api-web/api-interface/src/main/java/com/heyu/api/schedule/impl/PackageUpdateJob.java @@ -0,0 +1,39 @@ +package com.heyu.api.schedule.impl; + + +import com.heyu.api.data.dao.vv.VvPackageDao; +import com.heyu.api.data.entity.vv.VvPackageEntity; +import com.heyu.api.data.enums.RoleEnums; +import com.heyu.api.data.service.vv.VvPackageService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.List; + +@Component("packageUpdateJob") +@Slf4j +public class PackageUpdateJob { + + + @Autowired + private VvPackageDao vvPackageDao; + + + @Autowired + private VvPackageService vvPackageService; + + public void run() { + + + List vvPackageEntityList = vvPackageDao.selectVvPackageByIsCheckNotIN(Arrays.asList("2", "3")); + + for (VvPackageEntity vvPackageEntity : vvPackageEntityList) { + + vvPackageService.selectVvKuaidiAndUpdateData(vvPackageEntity.getTrackNumber(), RoleEnums.job.getRole()); + } + + + } +} diff --git a/api-web/api-interface/src/main/resources/bootstrap.yml b/api-web/api-interface/src/main/resources/bootstrap.yml index 4650faa..d232284 100644 --- a/api-web/api-interface/src/main/resources/bootstrap.yml +++ b/api-web/api-interface/src/main/resources/bootstrap.yml @@ -60,6 +60,8 @@ eb: urlStatisticQueue: URL_STATISTIC_QUEUE createDataQueue: CREATE_DATA_QUEUE_TEST sendDingDingQueue: SEND_DING_DING_QUEUE_TEST + delayQueue: DELAY_QUEUE_NAME + delayExchangeName: DELAY_EXCHANGE_NAME tencent: