From 9e7d81bb4bd7c93ef1bf2f7e17297767ac29fcef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=81=E5=AE=87=E5=A5=87?= Date: Sun, 10 Aug 2025 00:07:14 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ruoyi/quartz/task/XktTask.java | 142 +++++++++++------- sql/ry_20240629.sql | 11 ++ .../java/com/ruoyi/xkt/domain/StoreOrder.java | 8 + .../ruoyi/xkt/dto/order/StoreOrderDTO.java | 8 + .../ruoyi/xkt/mapper/StoreOrderMapper.java | 6 + .../ruoyi/xkt/service/IStoreOrderService.java | 25 +++ .../service/impl/StoreOrderServiceImpl.java | 73 +++++++++ .../service/impl/StoreProductServiceImpl.java | 6 + .../resources/mapper/StoreOrderMapper.xml | 28 +++- 9 files changed, 253 insertions(+), 54 deletions(-) diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/XktTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/XktTask.java index d5229d2ff..82c366855 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/XktTask.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/XktTask.java @@ -805,11 +805,11 @@ public class XktTask { storeProdList.forEach(storeProd -> { // 构建部分文档更新请求 list.add(new BulkOperation.Builder().update(u -> u - .action(a -> a.doc(new HashMap() {{ - put("storeWeight", ObjectUtils.defaultIfNull(storeWeightMap.get(storeProd.getStoreId()), Constants.STORE_WEIGHT_DEFAULT_ZERO)); - }})) - .id(String.valueOf(storeProd.getId())) - .index(Constants.ES_IDX_PRODUCT_INFO)) + .action(a -> a.doc(new HashMap() {{ + put("storeWeight", ObjectUtils.defaultIfNull(storeWeightMap.get(storeProd.getStoreId()), Constants.STORE_WEIGHT_DEFAULT_ZERO)); + }})) + .id(String.valueOf(storeProd.getId())) + .index(Constants.ES_IDX_PRODUCT_INFO)) .build()); }); try { @@ -873,11 +873,11 @@ public class XktTask { .toMap(x -> x.getStoreProdId(), x -> x.getPrice())); // 档口商品的属性map Map cateAttrMap = this.cateAttrMapper.selectList(new LambdaQueryWrapper() - .eq(StoreProductCategoryAttribute::getDelFlag, Constants.UNDELETED).in(StoreProductCategoryAttribute::getStoreProdId, storeProdIdList)) + .eq(StoreProductCategoryAttribute::getDelFlag, Constants.UNDELETED).in(StoreProductCategoryAttribute::getStoreProdId, storeProdIdList)) .stream().collect(Collectors.toMap(x -> x.getStoreProdId(), x -> x)); // 档口商品对应的档口 Map storeMap = this.storeMapper.selectList(new LambdaQueryWrapper().eq(Store::getDelFlag, Constants.UNDELETED) - .in(Store::getId, unpublicList.stream().map(x -> x.getStoreId()).collect(Collectors.toList()))) + .in(Store::getId, unpublicList.stream().map(x -> x.getStoreId()).collect(Collectors.toList()))) .stream().collect(Collectors.toMap(x -> x.getId(), x -> x)); // 构建批量操作请求 List bulkOperations = new ArrayList<>(); @@ -959,6 +959,40 @@ public class XktTask { log.info("-------------自动关闭超时订单结束-------------"); } + public void autoCompleteStoreOrder() { + log.info("-------------自动完成订单开始-------------"); + Integer batchCount = 20; + Date beforeDate = DateUtil.offset(new Date(), DateField.DAY_OF_YEAR, 14); + List storeOrderIds = storeOrderService.listNeedAutoCompleteOrder(beforeDate, batchCount); + for (Long storeOrderId : storeOrderIds) { + log.info("开始处理: {}", storeOrderId); + try { + storeOrderService.completeOrder(storeOrderId, -1L); + } catch (Exception e) { + log.error("自动完成订单异常", e); + fsNotice.sendMsg2DefaultChat("自动完成订单异常", "订单ID:" + storeOrderId); + } + } + log.info("-------------自动完成订单结束-------------"); + } + + public void autoRefundStoreOrder() { + log.info("-------------自动订单退款开始-------------"); + Integer batchCount = 20; + List storeOrderIds = storeOrderService.listNeedAutoRefundOrder(batchCount); + for (Long storeOrderId : storeOrderIds) { + log.info("开始处理: {}", storeOrderId); + try { + StoreOrderRefund storeOrderRefund = storeOrderService.prepareRefundByOriginOrder(storeOrderId); + callRefund(storeOrderRefund); + } catch (Exception e) { + log.error("自动完成订单异常", e); + fsNotice.sendMsg2DefaultChat("自动完成订单异常", "订单ID:" + storeOrderId); + } + } + log.info("-------------自动订单退款结束-------------"); + } + /** * 继续处理退款(异常中断补偿,非正常流程) */ @@ -968,46 +1002,50 @@ public class XktTask { List storeOrderRefunds = storeOrderService.listNeedContinueRefundOrder(batchCount); for (StoreOrderRefund storeOrderRefund : storeOrderRefunds) { log.info("开始处理: {}", storeOrderRefund); - try { - //支付宝接口要求:同一笔交易的退款至少间隔3s后发起 - String markKey = CacheConstants.STORE_ORDER_REFUND_PROCESSING_MARK + - storeOrderRefund.getRefundOrder().getId(); - boolean less3s = redisCache.hasKey(markKey); - if (less3s) { - log.warn("订单[{}]退款间隔小于3s跳过执行", storeOrderRefund.getRefundOrder().getId()); - continue; - } - PaymentManager paymentManager = getPaymentManager(EPayChannel.of(storeOrderRefund.getRefundOrder().getPayChannel())); - //查询退款结果 - ENetResult queryResult = paymentManager.queryStoreOrderRefundResult( - storeOrderRefund.getRefundOrder().getOrderNo(), - storeOrderRefund.getOriginOrder().getOrderNo()); - if (ENetResult.SUCCESS == queryResult) { - //退款成功 + callRefund(storeOrderRefund); + } + log.info("-------------继续处理退款结束-------------"); + } + + private void callRefund(StoreOrderRefund storeOrderRefund) { + try { + //支付宝接口要求:同一笔交易的退款至少间隔3s后发起 + String markKey = CacheConstants.STORE_ORDER_REFUND_PROCESSING_MARK + + storeOrderRefund.getRefundOrder().getId(); + boolean less3s = redisCache.hasKey(markKey); + if (less3s) { + log.warn("订单[{}]退款间隔小于3s跳过执行", storeOrderRefund.getRefundOrder().getId()); + return; + } + PaymentManager paymentManager = getPaymentManager(EPayChannel.of(storeOrderRefund.getRefundOrder().getPayChannel())); + //查询退款结果 + ENetResult queryResult = paymentManager.queryStoreOrderRefundResult( + storeOrderRefund.getRefundOrder().getOrderNo(), + storeOrderRefund.getOriginOrder().getOrderNo()); + if (ENetResult.SUCCESS == queryResult) { + //退款成功 + //支付状态->已支付,收款单到账 + storeOrderService.refundSuccess(storeOrderRefund.getRefundOrder().getId(), + storeOrderRefund.getRefundOrderDetails().stream().map(SimpleEntity::getId).collect(Collectors.toList()), + null); + } else { + //可能是退款失败,也可能是退款处理中,重复调用支付宝接口时只要参数正确也不会重复退款 + boolean success = paymentManager.refundStoreOrder(storeOrderRefund); + //标记 + redisCache.setCacheObject(markKey, 1, 3, TimeUnit.SECONDS); + if (success) { //支付状态->已支付,收款单到账 storeOrderService.refundSuccess(storeOrderRefund.getRefundOrder().getId(), storeOrderRefund.getRefundOrderDetails().stream().map(SimpleEntity::getId).collect(Collectors.toList()), null); } else { - //可能是退款失败,也可能是退款处理中,重复调用支付宝接口时只要参数正确也不会重复退款 - boolean success = paymentManager.refundStoreOrder(storeOrderRefund); - //标记 - redisCache.setCacheObject(markKey, 1, 3, TimeUnit.SECONDS); - if (success) { - //支付状态->已支付,收款单到账 - storeOrderService.refundSuccess(storeOrderRefund.getRefundOrder().getId(), - storeOrderRefund.getRefundOrderDetails().stream().map(SimpleEntity::getId).collect(Collectors.toList()), - null); - } else { - fsNotice.sendMsg2DefaultChat("退款失败", "参数: " + JSON.toJSONString(storeOrderRefund)); - } + fsNotice.sendMsg2DefaultChat("退款失败", "参数: " + JSON.toJSONString(storeOrderRefund)); } - } catch (Exception e) { - log.error("继续处理退款异常", e); - fsNotice.sendMsg2DefaultChat("退款异常", "参数: " + JSON.toJSONString(storeOrderRefund)); } + } catch (Exception e) { + log.error("继续处理退款异常", e); + fsNotice.sendMsg2DefaultChat("退款异常", "参数: " + JSON.toJSONString(storeOrderRefund)); } - log.info("-------------继续处理退款结束-------------"); } /** @@ -1276,7 +1314,7 @@ public class XktTask { return; } tagList.addAll(storeProdList.stream().map(x -> DailyProdTag.builder().storeId(x.getStoreId()).storeProdId(x.getId()) - .type(ProdTagType.SEVEN_DAY_NEW.getValue()).tag(ProdTagType.SEVEN_DAY_NEW.getLabel()).voucherDate(now).build()) + .type(ProdTagType.SEVEN_DAY_NEW.getValue()).tag(ProdTagType.SEVEN_DAY_NEW.getLabel()).voucherDate(now).build()) .collect(Collectors.toList())); } @@ -1319,7 +1357,7 @@ public class XktTask { .collectingAndThen(Collectors.toList(), list -> list.stream().limit(20).collect(Collectors.toList())))); storeHotSaleMap.forEach((storeId, saleList) -> { tagList.addAll(saleList.stream().map(x -> DailyProdTag.builder().storeId(x.getStoreId()).storeProdId(x.getStoreProdId()) - .type(ProdTagType.STORE_HOT.getValue()).tag(ProdTagType.STORE_HOT.getLabel()).voucherDate(now).build()) + .type(ProdTagType.STORE_HOT.getValue()).tag(ProdTagType.STORE_HOT.getLabel()).voucherDate(now).build()) .collect(Collectors.toList())); }); } @@ -1338,7 +1376,7 @@ public class XktTask { return; } tagList.addAll(top50List.stream().map(x -> DailyProdTag.builder().storeId(x.getStoreId()).storeProdId(x.getStoreProdId()) - .tag(ProdTagType.MONTH_HOT.getLabel()).type(ProdTagType.MONTH_HOT.getValue()).voucherDate(now).build()) + .tag(ProdTagType.MONTH_HOT.getLabel()).type(ProdTagType.MONTH_HOT.getValue()).voucherDate(now).build()) .collect(Collectors.toList())); } @@ -1424,7 +1462,7 @@ public class XktTask { return; } tagList.addAll(thousandSaleList.stream().map(x -> DailyStoreTag.builder().storeId(x.getStoreId()).voucherDate(now) - .type(StoreTagType.MONTH_SALES_THOUSAND.getValue()).tag(StoreTagType.MONTH_SALES_THOUSAND.getLabel()).build()) + .type(StoreTagType.MONTH_SALES_THOUSAND.getValue()).tag(StoreTagType.MONTH_SALES_THOUSAND.getLabel()).build()) .collect(Collectors.toList())); } @@ -1476,8 +1514,8 @@ public class XktTask { return; } tagList.addAll(top50List.stream().map(DailyStoreTagDTO::getStoreId).distinct().map(storeId -> DailyStoreTag.builder() - .storeId(storeId).type(StoreTagType.HOT_RANK.getValue()).tag(StoreTagType.HOT_RANK.getLabel()) - .voucherDate(now).build()) + .storeId(storeId).type(StoreTagType.HOT_RANK.getValue()).tag(StoreTagType.HOT_RANK.getLabel()) + .voucherDate(now).build()) .collect(Collectors.toList())); } @@ -1495,8 +1533,8 @@ public class XktTask { return; } tagList.addAll(top20List.stream().map(DailyStoreTagDTO::getStoreId).distinct().map(storeId -> DailyStoreTag.builder() - .storeId(storeId).type(StoreTagType.NEW_PRODUCT.getValue()).tag(StoreTagType.NEW_PRODUCT.getLabel()) - .voucherDate(now).build()) + .storeId(storeId).type(StoreTagType.NEW_PRODUCT.getValue()).tag(StoreTagType.NEW_PRODUCT.getLabel()) + .voucherDate(now).build()) .collect(Collectors.toList())); } @@ -1514,11 +1552,11 @@ public class XktTask { .forEach((storeProdId, tags) -> { // 构建部分文档更新请求 list.add(new BulkOperation.Builder().update(u -> u - .action(a -> a.doc(new HashMap() {{ - put("tags", tags.stream().sorted(Comparator.comparing(x -> x.getType())).map(DailyProdTag::getTag).collect(Collectors.toList())); - }})) - .id(String.valueOf(storeProdId)) - .index(Constants.ES_IDX_PRODUCT_INFO)) + .action(a -> a.doc(new HashMap() {{ + put("tags", tags.stream().sorted(Comparator.comparing(x -> x.getType())).map(DailyProdTag::getTag).collect(Collectors.toList())); + }})) + .id(String.valueOf(storeProdId)) + .index(Constants.ES_IDX_PRODUCT_INFO)) .build()); }); // 调用bulk方法执行批量更新操作 diff --git a/sql/ry_20240629.sql b/sql/ry_20240629.sql index 85c8ffc4d..94f96d957 100644 --- a/sql/ry_20240629.sql +++ b/sql/ry_20240629.sql @@ -2458,6 +2458,17 @@ ALTER TABLE `store_order` ADD COLUMN `platform_involve_reason` varchar (512) NULL COMMENT '平台介入原因' AFTER `refund_reject_reason`, ADD COLUMN `platform_involve_result` varchar (512) NULL COMMENT '平台介入结果' AFTER `platform_involve_reason`; +ALTER TABLE `store_order` +ADD COLUMN `pay_over_time` datetime NULL COMMENT '支付完成时间' AFTER `voucher_date`, +ADD COLUMN `delivery_over_time` datetime NULL COMMENT '发货完成时间' AFTER `pay_over_time`; + +ALTER TABLE `store_order` +ADD INDEX `idx_delivery_end_time`(`delivery_end_time`) USING BTREE, +ADD INDEX `idx_delivery_over_time`(`delivery_over_time`) USING BTREE; + +ALTER TABLE `store_order` +ADD INDEX `idx_pay_over_time`(`pay_over_time`) USING BTREE; + DROP TABLE IF EXISTS `store_order_detail`; CREATE TABLE `store_order_detail` ( diff --git a/xkt/src/main/java/com/ruoyi/xkt/domain/StoreOrder.java b/xkt/src/main/java/com/ruoyi/xkt/domain/StoreOrder.java index 07f05cf46..01f389343 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/domain/StoreOrder.java +++ b/xkt/src/main/java/com/ruoyi/xkt/domain/StoreOrder.java @@ -155,6 +155,14 @@ public class StoreOrder extends SimpleEntity { * 凭证日期 */ private Date voucherDate; + /** + * 支付完成时间 + */ + private Date payOverTime; + /** + * 发货完成时间 + */ + private Date deliveryOverTime; /** * 平台介入原因 */ diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/order/StoreOrderDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/order/StoreOrderDTO.java index 447894b34..7dfc09e8e 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/dto/order/StoreOrderDTO.java +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/order/StoreOrderDTO.java @@ -153,6 +153,14 @@ public class StoreOrderDTO { * 凭证日期 */ private Date voucherDate; + /** + * 支付完成时间 + */ + private Date payOverTime; + /** + * 发货完成时间 + */ + private Date deliveryOverTime; /** * 删除标志(0代表存在 2代表删除) */ diff --git a/xkt/src/main/java/com/ruoyi/xkt/mapper/StoreOrderMapper.java b/xkt/src/main/java/com/ruoyi/xkt/mapper/StoreOrderMapper.java index 21e391296..17a2d0346 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/mapper/StoreOrderMapper.java +++ b/xkt/src/main/java/com/ruoyi/xkt/mapper/StoreOrderMapper.java @@ -6,8 +6,10 @@ import com.ruoyi.xkt.dto.order.StoreOrderCountDTO; import com.ruoyi.xkt.dto.order.StoreOrderCountQueryDTO; import com.ruoyi.xkt.dto.order.StoreOrderPageItemDTO; import com.ruoyi.xkt.dto.order.StoreOrderQueryDTO; +import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; +import java.util.Date; import java.util.List; /** @@ -22,4 +24,8 @@ public interface StoreOrderMapper extends BaseMapper { List listNeedContinueRefundOrder(); StoreOrderCountDTO countOrder(StoreOrderCountQueryDTO queryDTO); + + List listNeedAutoCompleteOrder(@Param("deliveryBeforeTime") Date deliveryBeforeTime); + + List listNeedAutoRefundOrder(); } diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/IStoreOrderService.java b/xkt/src/main/java/com/ruoyi/xkt/service/IStoreOrderService.java index b4c2d2812..bf9bc91ee 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/IStoreOrderService.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/IStoreOrderService.java @@ -206,6 +206,14 @@ public interface IStoreOrderService { */ StoreOrderRefund prepareRefundOrder(StoreOrderRefundConfirmDTO refundConfirmDTO); + /** + * 准备退款 + * + * @param storeOrderId + * @return + */ + StoreOrderRefund prepareRefundByOriginOrder(Long storeOrderId); + /** * 退款成功 * @@ -231,6 +239,23 @@ public interface IStoreOrderService { */ List listNeedAutoCloseOrder(Date beforeDate, Integer count); + /** + * 获取需要自动完成的订单 + * + * @param beforeDate + * @param count + * @return + */ + List listNeedAutoCompleteOrder(Date beforeDate, Integer count); + + /** + * 获取需要自动退款的订单 + * + * @param count + * @return + */ + List listNeedAutoRefundOrder(Integer count); + /** * 获取需要继续退款的订单信息 * diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreOrderServiceImpl.java b/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreOrderServiceImpl.java index 7da5aa31a..acb79b8c1 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreOrderServiceImpl.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreOrderServiceImpl.java @@ -663,6 +663,7 @@ public class StoreOrderServiceImpl implements IStoreOrderService { order.setPayStatus(EPayStatus.PAID.getValue()); order.setPayTradeNo(payTradeNo); order.setRealTotalAmount(realTotalAmount); + order.setPayOverTime(new Date()); int orderSuccess = storeOrderMapper.updateById(prepareUpdate(order)); if (orderSuccess == 0) { throw new ServiceException(Constants.VERSION_LOCK_ERROR_COMMON_MSG); @@ -812,6 +813,10 @@ public class StoreOrderServiceImpl implements IStoreOrderService { } //订单 -> 代发货/已发货 order.setOrderStatus(currentOrderStatus.getValue()); + if (EOrderStatus.SHIPPED == currentOrderStatus) { + //发货完成时间 + order.setDeliveryOverTime(new Date()); + } int orderSuccess = storeOrderMapper.updateById(prepareUpdate(order)); if (orderSuccess == 0) { throw new ServiceException(Constants.VERSION_LOCK_ERROR_COMMON_MSG); @@ -893,6 +898,10 @@ public class StoreOrderServiceImpl implements IStoreOrderService { } //订单 -> 代发货/已发货 order.setOrderStatus(currentOrderStatus.getValue()); + if (EOrderStatus.SHIPPED == currentOrderStatus) { + //发货完成时间 + order.setDeliveryOverTime(new Date()); + } int orderSuccess = storeOrderMapper.updateById(prepareUpdate(order)); if (orderSuccess == 0) { throw new ServiceException(Constants.VERSION_LOCK_ERROR_COMMON_MSG); @@ -1374,6 +1383,52 @@ public class StoreOrderServiceImpl implements IStoreOrderService { return new StoreOrderRefund(order, refundOrderDetails, getAndBaseCheck(order.getOriginOrderId())); } + @Transactional(rollbackFor = Exception.class) + @Override + public StoreOrderRefund prepareRefundByOriginOrder(Long storeOrderId) { + StoreOrder order = getAndBaseCheck(storeOrderId); + if (!EOrderStatus.PENDING_SHIPMENT.getValue().equals(order.getOrderStatus())) { + throw new ServiceException(CharSequenceUtil.format("订单[{}]当前状态无法自动退款", + order.getOrderNo())); + } + boolean existsRefund = storeOrderMapper.exists(Wrappers.lambdaQuery(StoreOrder.class) + .eq(SimpleEntity::getDelFlag, Constants.UNDELETED) + .eq(StoreOrder::getOriginOrderId, storeOrderId)); + if (existsRefund) { + throw new ServiceException(CharSequenceUtil.format("订单[{}]已存在售后订单,无法自动退款", + order.getOrderNo())); + } + List details = storeOrderDetailMapper.selectList(Wrappers.lambdaQuery(StoreOrderDetail.class) + .eq(StoreOrderDetail::getStoreOrderId, order.getId()) + .eq(SimpleEntity::getDelFlag, Constants.UNDELETED)); + for (StoreOrderDetail detail : details) { + if (!EOrderStatus.PENDING_SHIPMENT.getValue().equals(detail.getDetailStatus())) { + throw new ServiceException(CharSequenceUtil.format("订单[{}]存在非待发货状态明细,无法自动退款", + order.getOrderNo())); + } + detail.setDetailStatus(EOrderStatus.CANCELLED.getValue()); + int orderDetailSuccess = storeOrderDetailMapper.updateById(prepareUpdate(detail)); + if (orderDetailSuccess == 0) { + throw new ServiceException(Constants.VERSION_LOCK_ERROR_COMMON_MSG); + } + } + order.setOrderStatus(EOrderStatus.CANCELLED.getValue()); + int orderSuccess = storeOrderMapper.updateById(prepareUpdate(order)); + if (orderSuccess == 0) { + throw new ServiceException(Constants.VERSION_LOCK_ERROR_COMMON_MSG); + } + StoreOrderAfterSaleDTO applyDTO = new StoreOrderAfterSaleDTO(); + applyDTO.setStoreOrderId(storeOrderId); + applyDTO.setStoreOrderDetailIds(details.stream().map(SimpleEntity::getId).collect(Collectors.toList())); + applyDTO.setOperatorId(-1L); + applyDTO.setRefundReasonCode("超时未发货自动退款"); + AfterSaleApplyResultDTO applyResult = createAfterSaleOrder(applyDTO); + StoreOrderRefundConfirmDTO confirmDTO = new StoreOrderRefundConfirmDTO(); + confirmDTO.setStoreOrderId(applyResult.getStoreOrderId()); + confirmDTO.setOperatorId(-1L); + return prepareRefundOrder(confirmDTO); + } + @Transactional(rollbackFor = Exception.class) @Override public void refundSuccess(Long storeOrderId, List storeOrderDetailIds, Long operatorId) { @@ -1480,6 +1535,24 @@ public class StoreOrderServiceImpl implements IStoreOrderService { return orders.stream().map(SimpleEntity::getId).collect(Collectors.toList()); } + @Override + public List listNeedAutoCompleteOrder(Date beforeDate, Integer count) { + if (count != null) { + PageHelper.startPage(1, count, false); + } + List orders = storeOrderMapper.listNeedAutoCompleteOrder(beforeDate); + return orders.stream().map(SimpleEntity::getId).collect(Collectors.toList()); + } + + @Override + public List listNeedAutoRefundOrder(Integer count) { + if (count != null) { + PageHelper.startPage(1, count, false); + } + List orders = storeOrderMapper.listNeedAutoRefundOrder(); + return orders.stream().map(SimpleEntity::getId).collect(Collectors.toList()); + } + @Override public List listNeedContinueRefundOrder(Integer count) { if (count != null) { diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreProductServiceImpl.java b/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreProductServiceImpl.java index 55a6e7654..e48c0a326 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreProductServiceImpl.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreProductServiceImpl.java @@ -592,6 +592,8 @@ public class StoreProductServiceImpl implements IStoreProductService { if (CollUtil.isEmpty(fileIds)) { return ListUtil.empty(); } + // 商品下载量+1 + redisCache.valueIncr(CacheConstants.PRODUCT_STATISTICS_DOWNLOAD_COUNT, storeProductId); List files = fileMapper.selectByIds(fileIds); return files.stream() .filter(o -> UNDELETED.equals(o.getDelFlag())) @@ -732,6 +734,8 @@ public class StoreProductServiceImpl implements IStoreProductService { // 将用户浏览足迹添加到redis中 this.updateUserBrowsingToRedis(storeProdId, appResDTO.getStoreId(), appResDTO.getStoreName(), appResDTO.getProdArtNum(), appResDTO.getProdTitle(), appResDTO.getMinPrice(), mainPicUrl); + // 商品浏览量+1 + redisCache.valueIncr(CacheConstants.PRODUCT_STATISTICS_VIEW_COUNT, storeProdId); return appResDTO.setTags(StringUtils.isNotBlank(appResDTO.getTagStr()) ? StrUtil.split(appResDTO.getTagStr(), ",") : null) // 拼接几色几码 .setSpecification((CollectionUtils.isNotEmpty(colorList) ? colorList.size() + "色" : "") + @@ -853,6 +857,8 @@ public class StoreProductServiceImpl implements IStoreProductService { .filter(x -> Objects.equals(x.getOrderNum(), ORDER_NUM_1)).map(StoreProdFileResDTO::getFileUrl).findAny().orElse(""); // 将用户浏览足迹添加到redis中 this.updateUserBrowsingToRedis(storeProdId, prodInfoDTO.getStoreId(), prodInfoDTO.getStoreName(), prodInfoDTO.getProdArtNum(), prodInfoDTO.getProdTitle(), minPrice, mainPicUrl); + // 商品浏览量+1 + redisCache.valueIncr(CacheConstants.PRODUCT_STATISTICS_VIEW_COUNT, storeProdId); return prodInfoDTO.setColorList(colorList); } diff --git a/xkt/src/main/resources/mapper/StoreOrderMapper.xml b/xkt/src/main/resources/mapper/StoreOrderMapper.xml index f381cd3ef..da47035b5 100644 --- a/xkt/src/main/resources/mapper/StoreOrderMapper.xml +++ b/xkt/src/main/resources/mapper/StoreOrderMapper.xml @@ -42,10 +42,10 @@ AND so.delivery_type = #{deliveryType} - AND EXISTS (SELECT 1 FROM store_order_operation_record r WHERE r.target_type = 1 AND r.target_id = so.id AND r.action = 1 AND r.operation_time BETWEEN #{orderTimeBegin} AND #{orderTimeEnd}) + AND so.create_time BETWEEN #{orderTimeBegin} AND #{orderTimeEnd} - AND EXISTS (SELECT 1 FROM store_order_operation_record r WHERE r.target_type = 1 AND r.target_id = so.id AND r.action = 4 AND r.operation_time BETWEEN #{payTimeBegin} AND #{payTimeEnd}) + AND so.pay_over_time BETWEEN #{payTimeBegin} AND #{payTimeEnd} AND EXISTS (SELECT 1 FROM store_order_detail sod WHERE sod.store_order_id = so.id AND sod.del_flag = '0' AND sod.express_waybill_no LIKE CONCAT('%', #{expressWaybillNo}, '%')) @@ -101,4 +101,28 @@ + + \ No newline at end of file