From 83b6913648fc11edc9f20f58b8fafd2bf3219cef Mon Sep 17 00:00:00 2001 From: Damonny <826010988@qq.com> Date: Sun, 2 Mar 2025 02:53:02 +0800 Subject: [PATCH] =?UTF-8?q?update:bug=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yudao-spring-boot-starter-mq/pom.xml | 3 +- .../yudao-module-haoka-biz/pom.xml | 5 + .../orderCatch/OrderCatchController.java | 7 +- .../orderCatch/po/DouDianOrderMessage.java | 21 +++ .../admin/orderCatch/po/Message.java | 4 +- .../admin/orders/vo/OrdersPageReqVO.java | 4 +- .../admin/orders/vo/OrdersRespVO.java | 12 ++ .../haoka/dal/dataobject/orders/OrdersDO.java | 9 + .../haoka/dal/mysql/orders/OrdersMapper.java | 2 +- .../DouDianOrderCatchServiceImpl.java | 163 ++++++++++++++++- .../orderCatch/OrderMessageConsumer.java | 41 +++++ .../orderCatch/OrderMessageProducer.java | 32 ++++ .../service/orders/OrdersServiceImpl.java | 170 +++++++++++++++++- .../yudao/module/haoka/utils/ConvertUtil.java | 34 ++++ .../DouDianOrderCatchServiceImplTest.java | 11 ++ .../service/orders/OrdersServiceImplTest.java | 1 - .../src/main/resources/application-local.yaml | 20 ++- .../src/main/resources/application-prod.yaml | 18 +- .../src/main/resources/application-test.yaml | 20 ++- .../db/migration/V5.0.18__order_clock_log.sql | 22 +++ 20 files changed, 569 insertions(+), 30 deletions(-) create mode 100644 yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/controller/admin/orderCatch/po/DouDianOrderMessage.java create mode 100644 yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/service/orderCatch/OrderMessageConsumer.java create mode 100644 yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/service/orderCatch/OrderMessageProducer.java create mode 100644 yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/utils/ConvertUtil.java create mode 100644 yudao-server/src/main/resources/db/migration/V5.0.18__order_clock_log.sql diff --git a/yudao-framework/yudao-spring-boot-starter-mq/pom.xml b/yudao-framework/yudao-spring-boot-starter-mq/pom.xml index c8972f16b2..e07cf31aa7 100644 --- a/yudao-framework/yudao-spring-boot-starter-mq/pom.xml +++ b/yudao-framework/yudao-spring-boot-starter-mq/pom.xml @@ -31,7 +31,8 @@ org.springframework.amqp spring-rabbit - true + + org.apache.rocketmq diff --git a/yudao-module-haoka/yudao-module-haoka-biz/pom.xml b/yudao-module-haoka/yudao-module-haoka-biz/pom.xml index 4dcf160a92..57c04ed663 100644 --- a/yudao-module-haoka/yudao-module-haoka-biz/pom.xml +++ b/yudao-module-haoka/yudao-module-haoka-biz/pom.xml @@ -93,5 +93,10 @@ io.github.openfeign feign-slf4j + + + cn.iocoder.boot + yudao-spring-boot-starter-mq + diff --git a/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/controller/admin/orderCatch/OrderCatchController.java b/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/controller/admin/orderCatch/OrderCatchController.java index 3464add343..21e91d22c5 100644 --- a/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/controller/admin/orderCatch/OrderCatchController.java +++ b/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/controller/admin/orderCatch/OrderCatchController.java @@ -4,6 +4,7 @@ package cn.iocoder.yudao.module.haoka.controller.admin.orderCatch; import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; import cn.iocoder.yudao.module.haoka.controller.admin.orderCatch.po.Message; import cn.iocoder.yudao.module.haoka.service.orderCatch.OrderCatchService; +import cn.iocoder.yudao.module.haoka.service.orderCatch.OrderMessageProducer; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; @@ -24,13 +25,15 @@ public class OrderCatchController { @Resource private OrderCatchService orderCatchService; - + @Resource + OrderMessageProducer orderMessageProducer; @PermitAll @RequestMapping("/catch") @Operation(summary = "抓取订单") public String catchOrders(@Valid @RequestBody List messages) { // 异步处理订单数据 - execCatchOrders(messages); +// execCatchOrders(messages); + orderMessageProducer.sendSmsSendMessage(messages); // 立即返回推送所需的响应数据 return "{\"code\":0,\"msg\":\"success\"}"; } diff --git a/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/controller/admin/orderCatch/po/DouDianOrderMessage.java b/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/controller/admin/orderCatch/po/DouDianOrderMessage.java new file mode 100644 index 0000000000..3205ee4e00 --- /dev/null +++ b/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/controller/admin/orderCatch/po/DouDianOrderMessage.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.module.haoka.controller.admin.orderCatch.po; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 抖音订单mq消息 + */ +@Data +public class DouDianOrderMessage implements Serializable { + /** + * 队列名称 + */ + public static final String QUEUE = "SEND_DOUDIAN_ORDER_MESSAGE_QUEUE"; + /** + * 消息内容 + */ + private List messages; +} diff --git a/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/controller/admin/orderCatch/po/Message.java b/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/controller/admin/orderCatch/po/Message.java index e63f8cd00a..a5ca16f121 100644 --- a/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/controller/admin/orderCatch/po/Message.java +++ b/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/controller/admin/orderCatch/po/Message.java @@ -2,7 +2,9 @@ package cn.iocoder.yudao.module.haoka.controller.admin.orderCatch.po; import com.fasterxml.jackson.annotation.JsonProperty; -public class Message { +import java.io.Serializable; + +public class Message implements Serializable { @JsonProperty("tag") private String tag; diff --git a/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/controller/admin/orders/vo/OrdersPageReqVO.java b/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/controller/admin/orders/vo/OrdersPageReqVO.java index d4c4416006..b9cae35af6 100644 --- a/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/controller/admin/orders/vo/OrdersPageReqVO.java +++ b/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/controller/admin/orders/vo/OrdersPageReqVO.java @@ -65,8 +65,8 @@ public class OrdersPageReqVO extends PageParam { @Schema(description = "激活状态", example = "2") private String activeStatus; - @Schema(description = "ICCID", example = "3384") - private String iccid; + @Schema(description = "购买号码", example = "3384") + private String planMobile; @Schema(description = "外部订单编号", example = "3091") private String realSourceId; diff --git a/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/controller/admin/orders/vo/OrdersRespVO.java b/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/controller/admin/orders/vo/OrdersRespVO.java index 6831406d19..ce2bf5a4c7 100644 --- a/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/controller/admin/orders/vo/OrdersRespVO.java +++ b/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/controller/admin/orders/vo/OrdersRespVO.java @@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.haoka.controller.admin.orders.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; + +import java.math.BigDecimal; import java.util.*; import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; @@ -324,4 +326,14 @@ public class OrdersRespVO { */ @Schema(description = "销售归属名称") private String salesAttributionName; + /* + * 订单金额 + */ + @Schema(description = "订单金额") + private BigDecimal orderAmount; + /** + * 支付金额 + */ + @Schema(description = "支付金额") + private BigDecimal payAmount; } diff --git a/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/dal/dataobject/orders/OrdersDO.java b/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/dal/dataobject/orders/OrdersDO.java index 3744a7cd3d..793908cbfe 100644 --- a/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/dal/dataobject/orders/OrdersDO.java +++ b/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/dal/dataobject/orders/OrdersDO.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.haoka.dal.dataobject.orders; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; +import java.math.BigDecimal; import java.util.*; import java.time.LocalDateTime; import java.time.LocalDateTime; @@ -350,5 +351,13 @@ public class OrdersDO extends BaseDO { * 销售归属名称 */ private String salesAttributionName; + /* + * 订单金额 + */ + private BigDecimal orderAmount; + /** + * 支付金额 + */ + private BigDecimal payAmount; } diff --git a/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/dal/mysql/orders/OrdersMapper.java b/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/dal/mysql/orders/OrdersMapper.java index ed97061708..a93f6b9504 100644 --- a/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/dal/mysql/orders/OrdersMapper.java +++ b/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/dal/mysql/orders/OrdersMapper.java @@ -36,7 +36,7 @@ public interface OrdersMapper extends BaseMapperX { .betweenIfPresent(OrdersDO::getStatusUpdatedAt, reqVO.getStatusUpdatedAt()) .eqIfPresent(OrdersDO::getRefundStatus, reqVO.getRefundStatus()) .eqIfPresent(OrdersDO::getActiveStatus, reqVO.getActiveStatus()) - .eqIfPresent(OrdersDO::getIccid, reqVO.getIccid()) + .eqIfPresent(OrdersDO::getPlanMobile, reqVO.getPlanMobile()) .eqIfPresent(OrdersDO::getIsUrgent, reqVO.getIsUrgent()) .eqIfPresent(OrdersDO::getRealSourceId, reqVO.getRealSourceId()) .eqIfPresent(OrdersDO::getAddressMobile, reqVO.getAddressMobile()) diff --git a/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/service/orderCatch/DouDianOrderCatchServiceImpl.java b/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/service/orderCatch/DouDianOrderCatchServiceImpl.java index fdf7d64156..fa39394928 100644 --- a/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/service/orderCatch/DouDianOrderCatchServiceImpl.java +++ b/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/service/orderCatch/DouDianOrderCatchServiceImpl.java @@ -12,20 +12,36 @@ import cn.iocoder.yudao.module.haoka.dal.mysql.onsaleproduct.OnSaleProductMapper import cn.iocoder.yudao.module.haoka.dal.mysql.orders.OrdersMapper; import cn.iocoder.yudao.module.haoka.service.onsaleproduct.OnSaleProductService; import cn.iocoder.yudao.module.haoka.service.orders.OrdersService; -import cn.iocoder.yudao.module.haoka.service.ordersynclog.OrderSyncLogService; import cn.iocoder.yudao.module.haoka.utils.GroupListUtil; +import cn.iocoder.yudao.module.haoka.utils.ConvertUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.doudian.open.api.order_addOrderRemark.OrderAddOrderRemarkRequest; +import com.doudian.open.api.order_addOrderRemark.OrderAddOrderRemarkResponse; +import com.doudian.open.api.order_addOrderRemark.param.OrderAddOrderRemarkParam; import com.doudian.open.api.order_batchDecrypt.OrderBatchDecryptRequest; import com.doudian.open.api.order_batchDecrypt.OrderBatchDecryptResponse; import com.doudian.open.api.order_batchDecrypt.data.DecryptInfosItem; import com.doudian.open.api.order_batchDecrypt.data.OrderBatchDecryptData; import com.doudian.open.api.order_batchDecrypt.param.CipherInfosItem; import com.doudian.open.api.order_batchDecrypt.param.OrderBatchDecryptParam; +import com.doudian.open.api.order_logisticsAdd.OrderLogisticsAddRequest; +import com.doudian.open.api.order_logisticsAdd.OrderLogisticsAddResponse; +import com.doudian.open.api.order_logisticsAdd.param.OrderLogisticsAddParam; +import com.doudian.open.api.order_logisticsCompanyList.OrderLogisticsCompanyListRequest; +import com.doudian.open.api.order_logisticsCompanyList.OrderLogisticsCompanyListResponse; +import com.doudian.open.api.order_logisticsCompanyList.data.DataItem; +import com.doudian.open.api.order_logisticsCompanyList.param.OrderLogisticsCompanyListParam; import com.doudian.open.api.order_orderDetail.OrderOrderDetailRequest; import com.doudian.open.api.order_orderDetail.OrderOrderDetailResponse; import com.doudian.open.api.order_orderDetail.data.OrderOrderDetailData; import com.doudian.open.api.order_orderDetail.data.ShopOrderDetail; import com.doudian.open.api.order_orderDetail.param.OrderOrderDetailParam; +import com.doudian.open.api.order_queryLogisticsCompanyList.OrderQueryLogisticsCompanyListRequest; +import com.doudian.open.api.order_queryLogisticsCompanyList.OrderQueryLogisticsCompanyListResponse; +import com.doudian.open.api.order_queryLogisticsCompanyList.param.OrderQueryLogisticsCompanyListParam; +import com.doudian.open.api.order_review.OrderReviewRequest; +import com.doudian.open.api.order_review.OrderReviewResponse; +import com.doudian.open.api.order_review.param.OrderReviewParam; import com.doudian.open.api.order_searchList.OrderSearchListRequest; import com.doudian.open.api.order_searchList.OrderSearchListResponse; import com.doudian.open.api.order_searchList.data.*; @@ -49,6 +65,9 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; + +import java.math.BigDecimal; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; @@ -107,6 +126,7 @@ public class DouDianOrderCatchServiceImpl implements OrderCatchService { if(CollectionUtil.isNotEmpty(ordersDOS)){ OrdersDO ordersDO = ordersDOS.get(0); ordersDO.setRefundStatus("200"); + ordersDO.setStatusUpdatedAt(LocalDateTime.now()); ordersMapper.updateById(ordersDO); } } else if("201".equals(tag)) { @@ -118,6 +138,7 @@ public class DouDianOrderCatchServiceImpl implements OrderCatchService { if(CollectionUtil.isNotEmpty(ordersDOS)){ OrdersDO ordersDO = ordersDOS.get(0); ordersDO.setRefundStatus("300"); + ordersDO.setStatusUpdatedAt(LocalDateTime.now()); ordersMapper.updateById(ordersDO); } } else if("202".equals(tag)) { @@ -129,6 +150,7 @@ public class DouDianOrderCatchServiceImpl implements OrderCatchService { if(CollectionUtil.isNotEmpty(ordersDOS)){ OrdersDO ordersDO = ordersDOS.get(0); ordersDO.setRefundStatus("300"); + ordersDO.setStatusUpdatedAt(LocalDateTime.now()); ordersMapper.updateById(ordersDO); } } else if("101".equals(tag)) { @@ -149,6 +171,7 @@ public class DouDianOrderCatchServiceImpl implements OrderCatchService { if(CollectionUtil.isNotEmpty(ordersDOS)){ OrdersDO ordersDO = ordersDOS.get(0); ordersDO.setRefundStatus("300"); + ordersDO.setStatusUpdatedAt(LocalDateTime.now()); ordersMapper.updateById(ordersDO); } } else if("110".equals(tag)) { @@ -179,6 +202,9 @@ public class DouDianOrderCatchServiceImpl implements OrderCatchService { // 店铺信息 Long shopId = order.getShopId(); String shopName = order.getShopName(); + //下单时间信息 + Long createTime = order.getCreateTime(); + Long updateTime = order.getUpdateTime(); // 物流信息 List logisticsInfo = order.getLogisticsInfo(); /** @@ -242,6 +268,7 @@ public class DouDianOrderCatchServiceImpl implements OrderCatchService { ordersDO.setSuperiorProductConfigId(onSaleProductPreOrder.getSuperiorProductConfigRespVO().getId()); ordersDO.setSuperiorApiId(onSaleProductPreOrder.getSuperiorApiRespVO().getId()); ordersDO.setProductSku(onSaleProductPreOrder.getParentProduct().getSku()); + ordersDO.setSupplierProductName(onSaleProductDO.getName()); } } // 在售商品 @@ -277,8 +304,6 @@ public class DouDianOrderCatchServiceImpl implements OrderCatchService { } ordersDO.setRefundStatus(String.valueOf(HaokaOrderRefundStatus)); // 获取计划手机号 - String productName = skuOrderListItem.getProductName(); - ordersDO.setSupplierProductName(productName); for (com.doudian.open.api.order_orderDetail.data.SpecItem specItem : skuOrderListItem.getSpec()) { String value = specItem.getValue(); String planMobile = getPlanMobile(value); @@ -292,6 +317,8 @@ public class DouDianOrderCatchServiceImpl implements OrderCatchService { // 更新订单 OrdersDO ordersDO1 = ordersDOS.get(0); ordersDO.setId(ordersDO1.getId()); + // 时间戳转成时间 + ordersDO.setStatusUpdatedAt(ConvertUtil.timestampToLocalDateTime(updateTime)); ordersMapper.updateById(ordersDO); }else { // 新增订单 @@ -327,6 +354,18 @@ public class DouDianOrderCatchServiceImpl implements OrderCatchService { // 详细地址 // ordersDO.setAddress(detail); ordersDO.setEncryptAddress(encryptDetail); + // 取时间 + ordersDO.setOrderedAt(ConvertUtil.timestampToLocalDateTime(createTime)); + ordersDO.setStatusUpdatedAt(ConvertUtil.timestampToLocalDateTime(updateTime)); + // 取价格 + Long orderAmount = skuOrderListItem.getOrderAmount(); + Long payAmount = skuOrderListItem.getPayAmount(); + BigDecimal orderAmount1 = ConvertUtil.convertFenToYuan(orderAmount); + BigDecimal payAmount1 = ConvertUtil.convertFenToYuan(payAmount); + ordersDO.setOrderAmount(orderAmount1); + ordersDO.setPayAmount(payAmount1); + // 渠道 抖音 + ordersDO.setSource(SYNC_TYPE); orderList.add(ordersDO); } @@ -339,7 +378,12 @@ public class DouDianOrderCatchServiceImpl implements OrderCatchService { for (OrdersDO ordersDO : orderList) { OrdersSaveReqVO ordersSaveReqVO = new OrdersSaveReqVO(); BeanUtils.copyProperties(ordersDO,ordersSaveReqVO); + ordersSaveReqVO.setSellerMemo("《已抓单》"); ordersService.createOrders(ordersSaveReqVO); + OrderAddOrderRemarkParam param = new OrderAddOrderRemarkParam(); + param.setOrderId(ordersDO.getUpstreamOrderId()); + param.setRemark("《已抓单》"); + addOrderRemark(param); } // ordersMapper.insertBatch(orderList); @@ -368,6 +412,8 @@ public class DouDianOrderCatchServiceImpl implements OrderCatchService { // String orderId = order.getOrderId(); // 买家备注 String buyerWords = order.getBuyerWords(); + Long createTime = order.getCreateTime(); + Long updateTime = order.getUpdateTime(); // 店铺id Long shopId = order.getShopId(); // 店铺名称 @@ -422,6 +468,7 @@ public class DouDianOrderCatchServiceImpl implements OrderCatchService { ordersDO.setSuperiorProductConfigId(onSaleProductPreOrder.getSuperiorProductConfigRespVO().getId()); ordersDO.setSuperiorApiId(onSaleProductPreOrder.getSuperiorApiRespVO().getId()); ordersDO.setProductSku(onSaleProductPreOrder.getParentProduct().getSku()); + ordersDO.setSupplierProductName(onSaleProductDO.getName()); } } // 在售商品 @@ -457,8 +504,6 @@ public class DouDianOrderCatchServiceImpl implements OrderCatchService { ordersDO.setRefundStatus(String.valueOf(HaokaOrderRefundStatus)); ordersDO.setStatusName(skuOrderListItem.getOrderStatusDesc()); // 获取计划手机号 - String productName = skuOrderListItem.getProductName(); - ordersDO.setSupplierProductName(productName); for (SpecItem specItem : skuOrderListItem.getSpec()) { String value = specItem.getValue(); String planMobile = getPlanMobile(value); @@ -472,6 +517,7 @@ public class DouDianOrderCatchServiceImpl implements OrderCatchService { // 更新订单 OrdersDO ordersDO1 = ordersDOS.get(0); ordersDO.setId(ordersDO1.getId()); + ordersDO.setStatusUpdatedAt(LocalDateTime.now()); ordersMapper.updateById(ordersDO); }else { // 新增订单 @@ -506,6 +552,18 @@ public class DouDianOrderCatchServiceImpl implements OrderCatchService { // 详细地址 // ordersDO.setAddress(detail); ordersDO.setEncryptAddress(encryptDetail); + // 取时间 + ordersDO.setOrderedAt(ConvertUtil.timestampToLocalDateTime(createTime)); + ordersDO.setStatusUpdatedAt(ConvertUtil.timestampToLocalDateTime(updateTime)); + // 取价格 + Long orderAmount = skuOrderListItem.getOrderAmount(); + Long payAmount = skuOrderListItem.getPayAmount(); + BigDecimal orderAmount1 = ConvertUtil.convertFenToYuan(orderAmount); + BigDecimal payAmount1 = ConvertUtil.convertFenToYuan(payAmount); + ordersDO.setOrderAmount(orderAmount1); + ordersDO.setPayAmount(payAmount1); + // 渠道 抖音 + ordersDO.setSource(SYNC_TYPE); orderList.add(ordersDO); } @@ -520,7 +578,12 @@ public class DouDianOrderCatchServiceImpl implements OrderCatchService { for (OrdersDO ordersDO : orderList) { OrdersSaveReqVO ordersSaveReqVO = new OrdersSaveReqVO(); BeanUtils.copyProperties(ordersDO,ordersSaveReqVO); + ordersSaveReqVO.setSellerMemo("《已抓单》"); ordersService.createOrders(ordersSaveReqVO); + OrderAddOrderRemarkParam param = new OrderAddOrderRemarkParam(); + param.setOrderId(ordersDO.getUpstreamOrderId()); + param.setRemark("《已抓单》"); + addOrderRemark(param); } // ordersMapper.insertBatch(orderList); } @@ -692,5 +755,95 @@ public class DouDianOrderCatchServiceImpl implements OrderCatchService { System.out.println(response); } + /** + * 给订单返回备注 + */ + public void addOrderRemark(OrderAddOrderRemarkParam param){ + OrderAddOrderRemarkRequest request = new OrderAddOrderRemarkRequest(); +// OrderAddOrderRemarkParam param = request.getParam(); +// param.setOrderId("6496679971677798670"); +// param.setRemark("这是具体的备注内容"); +// param.setIsAddStar("true"); +// param.setStar("2"); + request.setParam(param); + GlobalConfig.initAppKey(SYNC_APP_KEY); + GlobalConfig.initAppSecret(SYNC_APP_SECRET); +//入参为code + AccessToken accessToken= AccessTokenBuilder.build(SYNC_SHOP_ID); + OrderAddOrderRemarkResponse response = request.execute(accessToken); + if("10000".equals(response.getCode())){ +// 加入备注成功 + log.error("加入备注成功,{}",response.getMsg()); + }else { +// 加入备注失败 + log.error("加入备注失败,{}",response.getMsg()); + } + } + + /** + * 订单审核 + * @param rejectCode + * @param objectId + */ + public void reviewOrder(Long rejectCode,String objectId){ + try { + OrderReviewRequest request = new OrderReviewRequest(); + OrderReviewParam param = request.getParam(); + param.setTaskType(3001L); + param.setRejectCode(rejectCode); + param.setObjectId(objectId); + request.setParam(param); + GlobalConfig.initAppKey(SYNC_APP_KEY); + GlobalConfig.initAppSecret(SYNC_APP_SECRET); +//入参为code + AccessToken accessToken= AccessTokenBuilder.build(SYNC_SHOP_ID); + OrderReviewResponse response = request.execute(accessToken); + } catch (Exception e) { + log.error("订单审核失败,{}",e.getMessage()); + } + } + + /** + *获取快递公司列表 + */ + public static List logisticsCompanyList(){ + OrderLogisticsCompanyListRequest request = new OrderLogisticsCompanyListRequest(); + GlobalConfig.initAppKey(SYNC_APP_KEY); + GlobalConfig.initAppSecret(SYNC_APP_SECRET); +//入参为code + AccessToken accessToken= AccessTokenBuilder.build(SYNC_SHOP_ID); + OrderLogisticsCompanyListResponse response = request.execute(accessToken); + String code = response.getCode(); + if("10000".equals(code)){ + return response.getData(); + } + return null; + } + /** + * 订单发货 + * @param OrderId 订单id + * @param company 快递公司 + * @param companyCode 快递公司编码 + * @param logisticsCode 物流单号 + */ + public void logisticsAdd(String OrderId,String company,String companyCode,String logisticsCode){ + try { + OrderLogisticsAddRequest request = new OrderLogisticsAddRequest(); + OrderLogisticsAddParam param = request.getParam(); + param.setOrderId(OrderId); + param.setCompany(company); + param.setCompanyCode(companyCode); + param.setLogisticsCode(logisticsCode); + param.setIsRefundReject(false); + param.setIsRejectRefund(false); + GlobalConfig.initAppKey(SYNC_APP_KEY); + GlobalConfig.initAppSecret(SYNC_APP_SECRET); +//入参为code + AccessToken accessToken= AccessTokenBuilder.build(SYNC_SHOP_ID); + OrderLogisticsAddResponse response = request.execute(accessToken); + } catch (Exception e) { + log.error("订单发货失败,{}",e.getMessage()); + } + } } diff --git a/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/service/orderCatch/OrderMessageConsumer.java b/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/service/orderCatch/OrderMessageConsumer.java new file mode 100644 index 0000000000..f8fed81370 --- /dev/null +++ b/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/service/orderCatch/OrderMessageConsumer.java @@ -0,0 +1,41 @@ +package cn.iocoder.yudao.module.haoka.service.orderCatch; + +import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; +import cn.iocoder.yudao.module.haoka.controller.admin.orderCatch.po.DouDianOrderMessage; +import com.doudian.open.utils.JsonUtil; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.rabbit.annotation.Queue; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.amqp.support.AmqpHeaders; +import org.springframework.messaging.handler.annotation.Header; +import org.springframework.stereotype.Component; + +import com.rabbitmq.client.Channel; + +@Component +@RabbitListener(queuesToDeclare = { @Queue(value = DouDianOrderMessage.QUEUE,durable = "true", autoDelete = "false") }, ackMode = "MANUAL") +@Slf4j +public class OrderMessageConsumer { + @Resource + private OrderCatchService orderCatchService; + + @RabbitListener(queuesToDeclare = { @Queue(value = DouDianOrderMessage.QUEUE,durable = "true", autoDelete = "false") }, ackMode = "MANUAL") + public void onMessage(DouDianOrderMessage message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag) { + try { + log.info("[onMessage][消息内容({})]", JsonUtil.toJson(message)); + TenantContextHolder.setTenantId(162L); + orderCatchService.catchOrders(message.getMessages()); + // 手动确认消息 + channel.basicAck(deliveryTag, false); + } catch (Exception e) { + try { + // 处理失败,拒绝消息 + channel.basicNack(deliveryTag, false, true); + } catch (Exception ex) { + log.error("消息确认失败", ex); + } + log.error("消息处理失败", e); + } + } +} \ No newline at end of file diff --git a/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/service/orderCatch/OrderMessageProducer.java b/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/service/orderCatch/OrderMessageProducer.java new file mode 100644 index 0000000000..98929b6618 --- /dev/null +++ b/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/service/orderCatch/OrderMessageProducer.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.haoka.service.orderCatch; + +import cn.iocoder.yudao.module.haoka.controller.admin.orderCatch.po.DouDianOrderMessage; +import cn.iocoder.yudao.module.haoka.controller.admin.orderCatch.po.Message; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.rabbit.connection.CorrelationData; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.UUID; + +@Slf4j +@Component +public class OrderMessageProducer { + @Resource + private RabbitTemplate rabbitTemplate; + + /** + * 发送 {@link DouDianOrderMessage} 消息 + * + * @param messages 消息内容 + */ + public void sendSmsSendMessage(List messages) { + DouDianOrderMessage message = new DouDianOrderMessage(); + message.setMessages(messages); + // 为消息添加唯一ID + CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString()); + rabbitTemplate.convertAndSend(DouDianOrderMessage.QUEUE, message, correlationData); + } +} \ No newline at end of file diff --git a/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/service/orders/OrdersServiceImpl.java b/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/service/orders/OrdersServiceImpl.java index 56ff99322e..3fc6eab03d 100644 --- a/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/service/orders/OrdersServiceImpl.java +++ b/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/service/orders/OrdersServiceImpl.java @@ -3,29 +3,37 @@ package cn.iocoder.yudao.module.haoka.service.orders; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.module.haoka.api.ApiFrom; +import cn.iocoder.yudao.module.haoka.api.liantong.util.StringUtils; import cn.iocoder.yudao.module.haoka.controller.admin.onsaleproduct.vo.OnSaleProductPreOrderRespVO; import cn.iocoder.yudao.module.haoka.controller.admin.orderoperatelog.vo.OrderOperateLogSaveReqVO; import cn.iocoder.yudao.module.haoka.controller.admin.product.vo.HaoKaProductRespVO; import cn.iocoder.yudao.module.haoka.controller.admin.product.vo.ProductLimitAreaRespVO; import cn.iocoder.yudao.module.haoka.controller.admin.product.vo.ProductLimitCardRespVO; import cn.iocoder.yudao.module.haoka.controller.admin.product.vo.ProductLimitRespVO; +import cn.iocoder.yudao.module.haoka.dal.dataobject.blacklist.BlackListDO; import cn.iocoder.yudao.module.haoka.service.api.models.ApiDealResp; import cn.iocoder.yudao.module.haoka.service.api.ApiDealStrategyService; import cn.iocoder.yudao.module.haoka.service.api.models.OrderApiCreateParam; import cn.iocoder.yudao.module.haoka.service.api.models.OrderApiCreateResp; +import cn.iocoder.yudao.module.haoka.service.blacklist.BlackListService; import cn.iocoder.yudao.module.haoka.service.onsaleproduct.OnSaleProductService; +import cn.iocoder.yudao.module.haoka.service.orderCatch.DouDianOrderCatchServiceImpl; import cn.iocoder.yudao.module.haoka.service.orderoperatelog.OrderOperateLogService; import cn.iocoder.yudao.module.haoka.service.product.ProductLimitService; import cn.iocoder.yudao.module.haoka.service.smstask.SmsTaskService; import cn.iocoder.yudao.module.haoka.utils.IdCardAgeCalculator; import cn.iocoder.yudao.module.haoka.utils.SnowflakeId; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.doudian.open.api.order_addOrderRemark.param.OrderAddOrderRemarkParam; import com.google.common.collect.Lists; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import jakarta.annotation.Resource; import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.support.TransactionSynchronizationAdapter; +import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.validation.annotation.Validated; import cn.iocoder.yudao.module.haoka.controller.admin.orders.vo.*; @@ -37,6 +45,8 @@ import cn.iocoder.yudao.module.haoka.dal.mysql.orders.OrdersMapper; import java.util.ArrayList; import java.util.List; +import java.util.Objects; +import java.util.Set; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -66,6 +76,9 @@ public class OrdersServiceImpl extends ServiceImpl imple @Resource private OrderOperateLogService orderOperateLogService; + @Resource + private BlackListService blackListService; + /** * 重新提交订单 * @@ -97,9 +110,14 @@ public class OrdersServiceImpl extends ServiceImpl imple logSaveReqVO.setMsgType("0"); logSaveReqVO.setMsgSource("0"); orderOperateLogService.createOrderOperateLog(logSaveReqVO); - return createOrder(ordersDO); + return createOrderToOperators(ordersDO); } + /** + * 在号卡系统创建订单 + * @param createReqVO 创建信息 + * @return + */ // 19547688 -> 电信 19547688 湖南电信,:号码+号码ID @Override @@ -139,10 +157,35 @@ public class OrdersServiceImpl extends ServiceImpl imple ordersDO.getAddressMobile(), ordersDO ); + // 异步判断是否自动提交审核订单 + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { + @Override + public void afterCommit() { + //异步操作 + asyncSubmitAuditOrders(ordersDO); + } + }); // 返回 return orders.getId(); } + /** + * 异步判断是否自动提交审核订单 + * @param ordersDO + */ + @Async + public void asyncSubmitAuditOrders(OrdersDO ordersDO){ + // 是否自动生产 + Integer autoType = ordersDO.getAutoType(); + if(2 == autoType){ + // 自动生产 调用提交初审 + OrdersSaveReqVO ordersSaveReqVO = new OrdersSaveReqVO(); + ordersSaveReqVO.setId(ordersDO.getId()); + ordersSaveReqVO.setStatus(120L); + this.updateOrders(ordersSaveReqVO); + } + } + @Override public void updateOrders(OrdersSaveReqVO updateReqVO) { // 校验存在 @@ -152,7 +195,11 @@ public class OrdersServiceImpl extends ServiceImpl imple throw exception(ORDERS_NOT_EXISTS); } OrdersDO updateObj = BeanUtils.toBean(updateReqVO, OrdersDO.class); - if ("120".equals(String.valueOf(updateReqVO.getStatus()))) { + // 是否审核通过 + boolean canAudit = true; + // 是否提交初审 + boolean submit = "120".equals(String.valueOf(updateReqVO.getStatus())); + if (submit) { // 提交初审时判断限制条件 OnSaleProductPreOrderRespVO onSaleProductPreOrder = onSaleProductService.getOnSaleProductPreOrder(oldOrderDo.getOnSaleProductId()); ProductLimitRespVO productLimit = productLimitService.getProductLimit(onSaleProductPreOrder.getParentProduct().getHaokaProductLimitId()); @@ -174,6 +221,9 @@ public class OrdersServiceImpl extends ServiceImpl imple logSaveReqVO.setMsgSource("0"); orderOperateLogService.createOrderOperateLog(logSaveReqVO); updateObj.setStatus(-451L); + updateObj.setReason(oldOrderDo.getReason() + "\n"+ "提交初审:年龄限制校验不通过"); + // 初审不通过 + canAudit = false; } List productLimitCardRespVO = productLimit.getProductLimitCardRespVO(); if (ObjectUtil.isNotEmpty(productLimitCardRespVO)) { @@ -188,6 +238,9 @@ public class OrdersServiceImpl extends ServiceImpl imple logSaveReqVO.setMsgSource("0"); orderOperateLogService.createOrderOperateLog(logSaveReqVO); updateObj.setStatus(-451L); + // 初审不通过 + updateObj.setReason(oldOrderDo.getReason() + "\n"+ "提交初审:身份证号码限制校验不通过"); + canAudit = false; break; } } @@ -213,6 +266,9 @@ public class OrdersServiceImpl extends ServiceImpl imple logSaveReqVO.setMsgType("1"); logSaveReqVO.setMsgSource("0"); orderOperateLogService.createOrderOperateLog(logSaveReqVO); + // 初审不通过 + updateObj.setReason(oldOrderDo.getReason() + "\n"+ "提交初审:敏感地区待审核"); + canAudit = false; } List notAllowedAreaCode = productLimitAreaVos @@ -229,14 +285,74 @@ public class OrdersServiceImpl extends ServiceImpl imple logSaveReqVO.setMsgType("1"); logSaveReqVO.setMsgSource("0"); orderOperateLogService.createOrderOperateLog(logSaveReqVO); + // 初审不通过 + updateObj.setReason(oldOrderDo.getReason() + "\n"+ "提交初审:敏感地区待审核"); + canAudit = false; } } + // 黑名单判断 + List list = blackListService.list(); + boolean blacklisted = isBlacklisted(list, oldOrderDo.getAddressMobile(), idCardNum); + if(blacklisted){ + updateObj.setStatus(-451L); + OrderOperateLogSaveReqVO logSaveReqVO = new OrderOperateLogSaveReqVO(); + logSaveReqVO.setOrderId(updateObj.getId()); + logSaveReqVO.setMsg("提交初审:该订单身份证号码或手机号在系统黑名单中"); + logSaveReqVO.setMsgType("1"); + logSaveReqVO.setMsgSource("0"); + orderOperateLogService.createOrderOperateLog(logSaveReqVO); + // 初审不通过 + updateObj.setReason(oldOrderDo.getReason() + "\n"+ "提交初审:该订单身份证号码或手机号在系统黑名单中"); + canAudit = false; + } } this.updateOrderById(updateObj); + // 异步处理 审核成功是否自动进单 + Integer autoType = oldOrderDo.getAutoType(); + // 联合条件: 自动生产 && 审核通过 && 提交初审 + if(2 == autoType && canAudit && submit){ + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { + @Override + public void afterCommit() { + //异步操作 + OrdersSaveReqVO ordersSaveReqVO = new OrdersSaveReqVO(); + ordersSaveReqVO.setId(updateObj.getId()); + auditOrders(ordersSaveReqVO); + } + }); + } } - + + /** + * 判断手机号和身份证是否在黑名单中 + * @param list + * @param phoneNumber + * @param idcard + * @return + */ + public static boolean isBlacklisted(List list, String phoneNumber, String idcard) { + if(CollectionUtil.isEmpty(list)){ + return false; + } + Set phoneSet = list.stream() + .map(BlackListDO::getAddressPhone) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + + Set idcardSet = list.stream() + .map(BlackListDO::getPersonIdCard) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + + boolean isPhoneBlacklisted = phoneSet.contains(phoneNumber); + boolean isIdcardBlacklisted = idcardSet.contains(idcard); + // 如果手机号或身份证号在黑名单中,返回 true + return isPhoneBlacklisted || isIdcardBlacklisted; + } + + private void updateOrderById(OrdersDO updateObj){ OrdersDO oldOrderDo = ordersMapper.selectById(updateObj.getId()); if (oldOrderDo == null) { @@ -248,6 +364,30 @@ public class OrdersServiceImpl extends ServiceImpl imple updateObj.setSuperiorProductConfigId(oldOrderDo.getSuperiorProductConfigId()); updateObj.setSuperiorApiId(oldOrderDo.getSuperiorApiId()); ordersMapper.updateById(updateObj); + // 抖音订单判断备注更新 + if("2".equals(oldOrderDo.getSource())){ + String sellerMemo = oldOrderDo.getSellerMemo(); + String sellerMemo1 = updateObj.getSellerMemo(); + if(StringUtils.isNotBlank(sellerMemo) && StringUtils.isNotBlank(sellerMemo1) && !sellerMemo.equals(sellerMemo1)){ + OrderAddOrderRemarkParam param = new OrderAddOrderRemarkParam(); + param.setOrderId(oldOrderDo.getUpstreamOrderId()); + param.setRemark(sellerMemo1); + Long flag = updateObj.getFlag(); + if(null != flag){ + param.setIsAddStar("true"); + param.setStar(String.valueOf(flag)); + } + DouDianOrderCatchServiceImpl douDianOrderCatchService = new DouDianOrderCatchServiceImpl(); + douDianOrderCatchService.addOrderRemark(param); + } +// 抖音判断发货 + String trackingNumber = updateObj.getTrackingNumber(); + if(StringUtils.isNotBlank(trackingNumber)){ + Long trackingCompanyId = updateObj.getTrackingCompanyId(); + DouDianOrderCatchServiceImpl douDianOrderCatchService = new DouDianOrderCatchServiceImpl(); + douDianOrderCatchService.logisticsAdd(updateObj.getRealSourceId(),"","",trackingNumber); + } + } // 状态变化:发送短信提醒 if (updateObj.getStatus() != null && updateObj.getStatus().equals(oldOrderDo.getStatus())) { @@ -291,7 +431,7 @@ public class OrdersServiceImpl extends ServiceImpl imple logSaveReqVO.setMsgType("0"); logSaveReqVO.setMsgSource("1"); orderOperateLogService.createOrderOperateLog(logSaveReqVO); - createOrder(updateObj); + createOrderToOperators(updateObj); } else { // 手动生产 updateObj.setStatus(450L); @@ -299,8 +439,20 @@ public class OrdersServiceImpl extends ServiceImpl imple } } - - + // 如果是抖音订单 则需要调用抖音接口 返回审核结果 + String source = ordersOld.getSource(); + if("2".equals(source)){ + if(status != null && status == 450L){ + //审核通过 + DouDianOrderCatchServiceImpl douDianOrderCatchService = new DouDianOrderCatchServiceImpl(); + douDianOrderCatchService.reviewOrder(0L,updateObj.getRealSourceId()); + } + if(status != null && status == -450L){ + //审核不通过 + DouDianOrderCatchServiceImpl douDianOrderCatchService = new DouDianOrderCatchServiceImpl(); + douDianOrderCatchService.reviewOrder(200005L,updateObj.getRealSourceId()); + } + } // 状态变化:发送短信提醒 if (updateObj.getStatus() != null && !updateObj.getStatus().equals(ordersOld.getStatus())) { smsTaskService.sendSMS( @@ -325,7 +477,7 @@ public class OrdersServiceImpl extends ServiceImpl imple public void submitOrders(OrdersSaveReqVO updateReqVO) { // OrdersDO updateObj = BeanUtils.toBean(updateReqVO, OrdersDO.class); OrdersDO ordersDO = ordersMapper.selectById(updateReqVO.getId()); - createOrder(ordersDO); + createOrderToOperators(ordersDO); } @Override @@ -354,11 +506,11 @@ public class OrdersServiceImpl extends ServiceImpl imple } /** - * 调用运营商产生订单 + * 调用运营商产生订单(在运营商侧创建订单) * * @param ordersDO */ - private OrdersDO createOrder(OrdersDO ordersDO) { + private OrdersDO createOrderToOperators(OrdersDO ordersDO) { // 向上游提交订单 OrderApiCreateParam param = new OrderApiCreateParam(); BeanUtils.copyProperties(ordersDO, param); diff --git a/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/utils/ConvertUtil.java b/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/utils/ConvertUtil.java new file mode 100644 index 0000000000..380298be9d --- /dev/null +++ b/yudao-module-haoka/yudao-module-haoka-biz/src/main/java/cn/iocoder/yudao/module/haoka/utils/ConvertUtil.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.module.haoka.utils; + +import java.math.BigDecimal; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; + +/** + * 时间戳转时间工具类 + * @author xiongxiong + */ +public class ConvertUtil { + + public static LocalDateTime timestampToLocalDateTime(Long timestampInSeconds) { + // 转换为 LocalDateTime(指定时区) + return timestampToLocalDateTimeByZoneId(timestampInSeconds, ZoneId.of("Asia/Shanghai")); + } + + public static LocalDateTime timestampToLocalDateTimeByZoneId(Long timestampInSeconds, ZoneId zoneId) { + // 将时间戳从秒转换为毫秒 + Long timestampInMilliseconds = timestampInSeconds * 1000; + + // 将时间戳转换为 Instant + Instant instant = Instant.ofEpochMilli(timestampInMilliseconds); + + // 转换为 LocalDateTime(指定时区) + return instant.atZone(zoneId).toLocalDateTime(); + } + + public static BigDecimal convertFenToYuan(long amountInFen) { + // 使用 BigDecimal 确保精度 + return new BigDecimal(amountInFen).divide(new BigDecimal(100)); + } +} diff --git a/yudao-module-haoka/yudao-module-haoka-biz/src/test/java/cn/iocoder/yudao/module/haoka/service/orderCatch/DouDianOrderCatchServiceImplTest.java b/yudao-module-haoka/yudao-module-haoka-biz/src/test/java/cn/iocoder/yudao/module/haoka/service/orderCatch/DouDianOrderCatchServiceImplTest.java index 62afc95aa5..edda24a816 100644 --- a/yudao-module-haoka/yudao-module-haoka-biz/src/test/java/cn/iocoder/yudao/module/haoka/service/orderCatch/DouDianOrderCatchServiceImplTest.java +++ b/yudao-module-haoka/yudao-module-haoka-biz/src/test/java/cn/iocoder/yudao/module/haoka/service/orderCatch/DouDianOrderCatchServiceImplTest.java @@ -5,6 +5,7 @@ import cn.iocoder.yudao.module.haoka.controller.admin.orderCatch.po.Message; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.doudian.open.api.order_logisticsCompanyList.data.DataItem; import com.doudian.open.api.order_orderDetail.data.OrderOrderDetailData; import com.doudian.open.gson.Gson; import com.doudian.open.msg.refund_RefundCreated.param.RefundRefundCreatedParam; @@ -51,5 +52,15 @@ String orderString = "[{\"tag\":\"xxx\",\"msgId\":\"0443477XXXXXXX48874::xxx:161 } } + @Test + public void logisticsCompanyList() { + // 创建 DouDianOrderCatchServiceImpl 对象 + DouDianOrderCatchServiceImpl service = new DouDianOrderCatchServiceImpl(); + + List dataItems = orderCatchService.logisticsCompanyList(); + System.out.println(dataItems); + + } + } diff --git a/yudao-module-haoka/yudao-module-haoka-biz/src/test/java/cn/iocoder/yudao/module/haoka/service/orders/OrdersServiceImplTest.java b/yudao-module-haoka/yudao-module-haoka-biz/src/test/java/cn/iocoder/yudao/module/haoka/service/orders/OrdersServiceImplTest.java index b1534c361b..a6038181f4 100644 --- a/yudao-module-haoka/yudao-module-haoka-biz/src/test/java/cn/iocoder/yudao/module/haoka/service/orders/OrdersServiceImplTest.java +++ b/yudao-module-haoka/yudao-module-haoka-biz/src/test/java/cn/iocoder/yudao/module/haoka/service/orders/OrdersServiceImplTest.java @@ -194,7 +194,6 @@ public class OrdersServiceImplTest extends BaseDbUnitTest { reqVO.setStatusUpdatedAt(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); reqVO.setRefundStatus(null); reqVO.setActiveStatus(null); - reqVO.setIccid(null); reqVO.setRealSourceId(null); reqVO.setAddressMobile(null); reqVO.setTrackingNumber(null); diff --git a/yudao-server/src/main/resources/application-local.yaml b/yudao-server/src/main/resources/application-local.yaml index 2659fa72a5..eb99d8dc42 100644 --- a/yudao-server/src/main/resources/application-local.yaml +++ b/yudao-server/src/main/resources/application-local.yaml @@ -115,10 +115,24 @@ rocketmq: spring: # RabbitMQ 配置项,对应 RabbitProperties 配置类 rabbitmq: - host: 127.0.0.1 # RabbitMQ 服务的地址 + host: forz.fun # RabbitMQ 服务的地址 port: 5672 # RabbitMQ 服务的端口 - username: rabbit # RabbitMQ 服务的账号 - password: rabbit # RabbitMQ 服务的密码 + username: admin # RabbitMQ 服务的账号 + password: K18LepU5YBpSl8 # RabbitMQ 服务的密码 + publisher-confirm-type: correlated # 开启生产者确认 + publisher-returns: true # 开启返回消息 + template: + retry: + enabled: true # 开启发送失败重试 + initial-interval: 1000ms # 重试间隔 + max-attempts: 3 # 最大重试次数 + listener: + simple: + acknowledge-mode: manual # 手动确认 + retry: + enabled: true # 开启消费失败重试 + initial-interval: 1000ms # 重试间隔 + max-attempts: 3 # 最大重试次数 # Kafka 配置项,对应 KafkaProperties 配置类 kafka: bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔 diff --git a/yudao-server/src/main/resources/application-prod.yaml b/yudao-server/src/main/resources/application-prod.yaml index 2bedbed032..66f2d1036c 100644 --- a/yudao-server/src/main/resources/application-prod.yaml +++ b/yudao-server/src/main/resources/application-prod.yaml @@ -117,8 +117,22 @@ spring: rabbitmq: host: 172.18.0.1 # RabbitMQ 服务的地址 port: 5672 # RabbitMQ 服务的端口 - username: rabbit # RabbitMQ 服务的账号 - password: rabbit # RabbitMQ 服务的密码 + username: admin # RabbitMQ 服务的账号 + password: K18LepU5YBpSl8 # RabbitMQ 服务的密码 + publisher-confirm-type: correlated # 开启生产者确认 + publisher-returns: true # 开启返回消息 + template: + retry: + enabled: true # 开启发送失败重试 + initial-interval: 1000ms # 重试间隔 + max-attempts: 3 # 最大重试次数 + listener: + simple: + acknowledge-mode: manual # 手动确认 + retry: + enabled: true # 开启消费失败重试 + initial-interval: 1000ms # 重试间隔 + max-attempts: 3 # 最大重试次数 # Kafka 配置项,对应 KafkaProperties 配置类 kafka: bootstrap-servers: 172.18.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔 diff --git a/yudao-server/src/main/resources/application-test.yaml b/yudao-server/src/main/resources/application-test.yaml index 5a09ccd0a5..c6e8d8bdf7 100644 --- a/yudao-server/src/main/resources/application-test.yaml +++ b/yudao-server/src/main/resources/application-test.yaml @@ -115,10 +115,24 @@ rocketmq: spring: # RabbitMQ 配置项,对应 RabbitProperties 配置类 rabbitmq: - host: 127.0.0.1 # RabbitMQ 服务的地址 + host: forz.fun # RabbitMQ 服务的地址 port: 5672 # RabbitMQ 服务的端口 - username: rabbit # RabbitMQ 服务的账号 - password: rabbit # RabbitMQ 服务的密码 + username: admin # RabbitMQ 服务的账号 + password: K18LepU5YBpSl8 # RabbitMQ 服务的密码 + publisher-confirm-type: correlated # 开启生产者确认 + publisher-returns: true # 开启返回消息 + template: + retry: + enabled: true # 开启发送失败重试 + initial-interval: 1000ms # 重试间隔 + max-attempts: 3 # 最大重试次数 + listener: + simple: + acknowledge-mode: manual # 手动确认 + retry: + enabled: true # 开启消费失败重试 + initial-interval: 1000ms # 重试间隔 + max-attempts: 3 # 最大重试次数 # Kafka 配置项,对应 KafkaProperties 配置类 kafka: bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔 diff --git a/yudao-server/src/main/resources/db/migration/V5.0.18__order_clock_log.sql b/yudao-server/src/main/resources/db/migration/V5.0.18__order_clock_log.sql new file mode 100644 index 0000000000..86a149e508 --- /dev/null +++ b/yudao-server/src/main/resources/db/migration/V5.0.18__order_clock_log.sql @@ -0,0 +1,22 @@ +CREATE TABLE `haoka_clock_record` ( + `id` bigint(20) NOT NULL COMMENT 'ID', + `clock_type` int(11) DEFAULT NULL COMMENT '打卡类型', + `clock_user_id` varchar(100) NOT NULL COMMENT '用户ID', + `clock_shop_id` varchar(11) DEFAULT NULL COMMENT '店铺ID', + `clock_room_id` varchar(100) NOT NULL COMMENT '直播间ID', + `clock_time` datetime NOT NULL COMMENT '打卡时间', + `clock_shop_name` varchar(255) DEFAULT NULL COMMENT '店铺名称', + `clock_user_name` varchar(255) DEFAULT NULL COMMENT '姓名', + `dept_id` bigint(20) DEFAULT NULL COMMENT '部门ID', + `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '租户编号', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='打卡记录表'; +-- 订单新增参数 +ALTER TABLE `haoka_orders` + ADD COLUMN `order_amount` decimal(10, 2) NULL COMMENT '订单金额' AFTER `sales_attribution_name`, + ADD COLUMN `pay_amount` decimal(10, 2) NULL COMMENT '支付金额' AFTER `order_amount`; \ No newline at end of file