pull/1121/head
梁宇奇 2025-08-10 00:07:14 +08:00
parent 2b30158f3b
commit 9e7d81bb4b
9 changed files with 253 additions and 54 deletions

View File

@ -805,11 +805,11 @@ public class XktTask {
storeProdList.forEach(storeProd -> {
// 构建部分文档更新请求
list.add(new BulkOperation.Builder().update(u -> u
.action(a -> a.doc(new HashMap<String, Object>() {{
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<String, Object>() {{
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<Long, StoreProductCategoryAttribute> cateAttrMap = this.cateAttrMapper.selectList(new LambdaQueryWrapper<StoreProductCategoryAttribute>()
.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<Long, Store> storeMap = this.storeMapper.selectList(new LambdaQueryWrapper<Store>().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<BulkOperation> 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<Long> 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<Long> 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<StoreOrderRefund> 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<String, Object>() {{
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<String, Object>() {{
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方法执行批量更新操作

View File

@ -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`
(

View File

@ -155,6 +155,14 @@ public class StoreOrder extends SimpleEntity {
*
*/
private Date voucherDate;
/**
*
*/
private Date payOverTime;
/**
*
*/
private Date deliveryOverTime;
/**
*
*/

View File

@ -153,6 +153,14 @@ public class StoreOrderDTO {
*
*/
private Date voucherDate;
/**
*
*/
private Date payOverTime;
/**
*
*/
private Date deliveryOverTime;
/**
* 0 2
*/

View File

@ -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<StoreOrder> {
List<StoreOrder> listNeedContinueRefundOrder();
StoreOrderCountDTO countOrder(StoreOrderCountQueryDTO queryDTO);
List<StoreOrder> listNeedAutoCompleteOrder(@Param("deliveryBeforeTime") Date deliveryBeforeTime);
List<StoreOrder> listNeedAutoRefundOrder();
}

View File

@ -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<Long> listNeedAutoCloseOrder(Date beforeDate, Integer count);
/**
*
*
* @param beforeDate
* @param count
* @return
*/
List<Long> listNeedAutoCompleteOrder(Date beforeDate, Integer count);
/**
* 退
*
* @param count
* @return
*/
List<Long> listNeedAutoRefundOrder(Integer count);
/**
* 退
*

View File

@ -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<StoreOrderDetail> 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<Long> storeOrderDetailIds, Long operatorId) {
@ -1480,6 +1535,24 @@ public class StoreOrderServiceImpl implements IStoreOrderService {
return orders.stream().map(SimpleEntity::getId).collect(Collectors.toList());
}
@Override
public List<Long> listNeedAutoCompleteOrder(Date beforeDate, Integer count) {
if (count != null) {
PageHelper.startPage(1, count, false);
}
List<StoreOrder> orders = storeOrderMapper.listNeedAutoCompleteOrder(beforeDate);
return orders.stream().map(SimpleEntity::getId).collect(Collectors.toList());
}
@Override
public List<Long> listNeedAutoRefundOrder(Integer count) {
if (count != null) {
PageHelper.startPage(1, count, false);
}
List<StoreOrder> orders = storeOrderMapper.listNeedAutoRefundOrder();
return orders.stream().map(SimpleEntity::getId).collect(Collectors.toList());
}
@Override
public List<StoreOrderRefund> listNeedContinueRefundOrder(Integer count) {
if (count != null) {

View File

@ -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<SysFile> 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);
}

View File

@ -42,10 +42,10 @@
AND so.delivery_type = #{deliveryType}
</if>
<if test="orderTimeBegin != null and orderTimeEnd != null">
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}
</if>
<if test="payTimeBegin != null and payTimeEnd != null">
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}
</if>
<if test="expressWaybillNo != null and expressWaybillNo !=''">
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 @@
</if>
</where>
</select>
<select id="listNeedAutoCompleteOrder" resultType="com.ruoyi.xkt.domain.StoreOrder">
SELECT
so.*
FROM
store_order so
<where>
so.del_flag = '0'
AND so.order_status = 13
AND so.delivery_over_time &lt;= #{deliveryBeforeTime}
AND NOT EXISTS (SELECT 1 FROM store_order rso WHERE rso.origin_order_id = so.id AND rso.del_flag = '0' AND rso.order_type = 2 AND rso.order_status != 24)
</where>
</select>
<select id="listNeedAutoRefundOrder" resultType="com.ruoyi.xkt.domain.StoreOrder">
SELECT
so.*
FROM
store_order so
WHERE
so.del_flag = '0'
AND so.order_status = 12
AND so.delivery_end_time &lt;= NOW()
AND NOT EXISTS (SELECT 1 FROM store_order rso WHERE rso.origin_order_id = so.id AND rso.del_flag = '0' AND rso.order_type = 2)
AND NOT EXISTS (SELECT 1 FROM store_order_detail sod WHERE so.id = sod.store_order_id AND sod.del_flag = '0' AND sod.detail_status != 12)
</select>
</mapper>