From fa83eeb484cf1098da5d4a6fae296ac2c771573f Mon Sep 17 00:00:00 2001 From: suzhuhong Date: Wed, 15 Apr 2026 18:02:18 +0800 Subject: [PATCH 1/6] feat:trans --- .../cool/store/constants/RedisConstant.java | 6 +++ .../dao/order/PreAllocationRecordDAO.java | 4 ++ .../store/request/store/TransRequest.java | 25 +++++++++++ .../store/PreAllocationRecordService.java | 3 ++ .../impl/PreAllocationRecordServiceImpl.java | 42 +++++++++++++++++++ 5 files changed, 80 insertions(+) create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/store/TransRequest.java diff --git a/coolstore-partner-common/src/main/java/com/cool/store/constants/RedisConstant.java b/coolstore-partner-common/src/main/java/com/cool/store/constants/RedisConstant.java index 737b900d9..5283ea669 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/constants/RedisConstant.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/constants/RedisConstant.java @@ -418,4 +418,10 @@ public class RedisConstant { * 新管家缴费回调完成 标识 */ public static final String XGJ_CALLBACK_SHOP = "xgj_callback_shop:{0}"; + + + /** + * 预分账单 分账key + */ + public static final String PRE_ALLOCATION = "pre_allocation:{0}"; } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/order/PreAllocationRecordDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/order/PreAllocationRecordDAO.java index d5e0d3130..da99a419d 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/order/PreAllocationRecordDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/order/PreAllocationRecordDAO.java @@ -17,6 +17,10 @@ public class PreAllocationRecordDAO { return preAllocationRecordMapper.insertSelective(record) > 0; } + public boolean updateByPrimaryKeySelective(PreAllocationRecordDO record) { + return preAllocationRecordMapper.updateByPrimaryKeySelective(record) > 0; + } + public PreAllocationRecordDO getById(Long id) { return preAllocationRecordMapper.getById(id); } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/store/TransRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/store/TransRequest.java new file mode 100644 index 000000000..fc7ce6118 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/store/TransRequest.java @@ -0,0 +1,25 @@ +package com.cool.store.request.store; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Auther zx_szh + * @Date 2026/4/15 17:47 + * @Version 1.0 + */ +@Data +public class TransRequest { + + @ApiModelProperty("分账单ID") + @NotNull + private Long id; + + @ApiModelProperty("备注") + @NotBlank(message = "备注不能为空") + private String remark; + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/store/PreAllocationRecordService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/store/PreAllocationRecordService.java index f204f05be..737d2595b 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/store/PreAllocationRecordService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/store/PreAllocationRecordService.java @@ -4,6 +4,7 @@ import com.cool.store.entity.order.PreAllocationRecordDO; import com.cool.store.entity.order.StoreOrderDO; import com.cool.store.request.store.PreAllocationQueryShopRequest; import com.cool.store.request.store.PreAllocationSaveRequest; +import com.cool.store.request.store.TransRequest; import com.cool.store.vo.order.PreAllocationRecordVO; import com.github.pagehelper.PageInfo; @@ -26,4 +27,6 @@ public interface PreAllocationRecordService { Integer pushStandardStoreFee(StoreOrderDO storeOrderDO); + Boolean trans(TransRequest transRequest); + } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/store/impl/PreAllocationRecordServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/store/impl/PreAllocationRecordServiceImpl.java index 8ab630222..27b6d92d8 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/store/impl/PreAllocationRecordServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/store/impl/PreAllocationRecordServiceImpl.java @@ -2,6 +2,7 @@ package com.cool.store.service.store.impl; import cn.hutool.core.collection.CollStreamUtil; import com.alibaba.fastjson.JSONObject; +import com.cool.store.constants.RedisConstant; import com.cool.store.dao.FranchiseFeeDAO; import com.cool.store.dao.LineInfoDAO; import com.cool.store.dao.ShopInfoDAO; @@ -15,6 +16,7 @@ import com.cool.store.dao.wallet.WalletTradeDAO; import com.cool.store.dto.fees.ExpenseTypeAmountDTO; import com.cool.store.dto.fees.WalletAllocationDTO; import com.cool.store.dto.wallet.AccountInfoDTO; +import com.cool.store.dto.wallet.AccountTransferDTO; import com.cool.store.dto.wallet.BatchTransferDTO; import com.cool.store.entity.FranchiseFeeDO; import com.cool.store.entity.LineInfoDO; @@ -39,9 +41,11 @@ import com.cool.store.enums.point.ShopSubStageStatusEnum; import com.cool.store.exception.ServiceException; import com.cool.store.mapper.FranchiseFeeMapper; import com.cool.store.request.store.PreAllocationSaveRequest; +import com.cool.store.request.store.TransRequest; import com.cool.store.request.wallet.BatchTransferQueryRequest; import com.cool.store.request.wallet.BatchTransferRequest; import com.cool.store.request.wallet.OutStoreIdRequest; +import com.cool.store.request.wallet.TransferRequest; import com.cool.store.request.xgj.PushFranchiseFeeRequest; import com.cool.store.request.xgj.ReceiptRequest; import com.cool.store.service.PushService; @@ -56,6 +60,7 @@ import com.cool.store.utils.RedisUtil; import com.cool.store.utils.StringUtil; import com.cool.store.vo.order.MiniStoreOrderDetailVO; import com.cool.store.vo.order.PreAllocationRecordVO; +import com.sun.xml.bind.v2.TODO; import groovy.util.logging.Slf4j; import lombok.RequiredArgsConstructor; import org.apache.commons.collections4.CollectionUtils; @@ -64,6 +69,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; +import java.text.MessageFormat; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.function.Function; @@ -715,4 +721,40 @@ public class PreAllocationRecordServiceImpl implements PreAllocationRecordServic pushService.pushFranchiseFeeToXGJ(feeRequest); return franchiseFeeDO.getId().intValue(); } + + @Override + public Boolean trans(TransRequest transRequest) { + String lockKey = MessageFormat.format(RedisConstant.PRE_ALLOCATION,transRequest.getId()); + String uuid = UUID.randomUUID().toString(); + if(!Boolean.TRUE.equals(redisUtil.tryLock(lockKey, uuid,10, TimeUnit.MINUTES))){ + throw new ServiceException(ErrorCodeEnum.TRANSFER_ING); + } + PreAllocationRecordDO record = preAllocationRecordDAO.getById(transRequest.getId()); + if (record==null){ + throw new ServiceException(ErrorCodeEnum.PARAMS_VALIDATE_ERROR); + } + ShopInfoDO shopInfo = shopInfoDAO.getShopInfo(record.getShopId()); + OutStoreIdRequest outStoreIdRequest = new OutStoreIdRequest(); + outStoreIdRequest.setOutStoreId(shopInfo.getStoreId()); + List accountInfoList = walletApiService.getAccountInfo(outStoreIdRequest); + if (CollectionUtils.isEmpty(accountInfoList)){ + throw new ServiceException(ErrorCodeEnum.NOT_EXIST_WANG_SHANG_ACCOUNT); + } + AccountTransferDTO accountTransferDTO ; + try { + AccountInfoDTO accountInfoDTO = accountInfoList.get(0); + accountTransferDTO = walletPayInfoService.accountPay(record.getExpenseType(), record.getPayAmount(), + record.getPayeeCode(), accountInfoDTO.getAccountNo(), record.getPayNo(), transRequest.getRemark()); + }catch (Exception e){ + //分账失败 释放锁 + redisUtil.unlock(lockKey); + log.info("confirmSplitOrder:{}",e.getMessage()); + //todo 改为明确的提示 + throw new ServiceException(ErrorCodeEnum.TRANSFER_ERROR); + } + record.setAllocationStatus(AllocationPayStatusEnum.PAYING.getStatus()); + //先改为分账中 + preAllocationRecordDAO.updateByPrimaryKeySelective(record); + return null; + } } From d90f8eb2a825802fbf29f37c57951b0805c23370 Mon Sep 17 00:00:00 2001 From: suzhuhong Date: Thu, 16 Apr 2026 11:03:52 +0800 Subject: [PATCH 2/6] =?UTF-8?q?feat:=E7=8B=AC=E7=AB=8B=E5=88=86=E8=B4=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cool/store/enums/ErrorCodeEnum.java | 4 +- .../com/cool/store/utils/BigDecimalUtils.java | 240 ++++++++++++++++++ .../cool/store/dao/wallet/WalletTradeDAO.java | 11 + .../mapper/wallet/WalletTradeMapper.java | 2 + .../mapper/wallet/WalletTradeMapper.xml | 6 + .../store/entity/wallet/WalletTradeDO.java | 2 +- .../service/impl/SplitOrderServiceImpl.java | 2 +- .../store/PreAllocationRecordService.java | 8 + .../impl/PreAllocationRecordServiceImpl.java | 77 +++++- .../webb/PreAllocationRecordController.java | 7 + .../com/cool/store/job/XxlJobHandler.java | 27 ++ 11 files changed, 371 insertions(+), 15 deletions(-) create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/utils/BigDecimalUtils.java diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java index 9f0155cab..16b6aa942 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java @@ -394,10 +394,12 @@ public enum ErrorCodeEnum { TRADE_EXIST(1621006, "部分交易流水号已被使用,请检查!", null), NOT_COMPLETE_TRANS_SHEET(1621007, "存在关联未分账完成的分账单,请完成之后再操作!", null), PENDING_TRANS_AMOUNT(1621008, "分账金额不能大于待分账金额!", null), - TRANSFER_ERROR(1621009, "分账异常!", null), + TRANSFER_ERROR(1621009, "分账异常:{0}", null), TRANSFER_ING(1621010, "分账中,请勿重复分账!", null), WITHDRAW_APPLY_NOT_EXIST(1621011, "提现申请单不存在!", null), WITHDRAW_ING(1621012, "提现中,请勿重复分账!", null), + WALLET_BALANCE_INSUFFICIENT(1621013, "钱包余额不足!", null), + diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/BigDecimalUtils.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/BigDecimalUtils.java new file mode 100644 index 000000000..025edeb7e --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/BigDecimalUtils.java @@ -0,0 +1,240 @@ +package com.cool.store.utils; + +import java.math.BigDecimal; + +/** + * @Auther zx_szh + * @Date 2026/4/16 10:03 + * @Version 1.0 + */ +public class BigDecimalUtils { + + /** + * 比较两个BigDecimal是否相等(忽略精度差异) + * + * @param a 第一个值 + * @param b 第二个值 + * @return 如果相等返回true + */ + public static boolean equals(BigDecimal a, BigDecimal b) { + if (a == b) return true; + if (a == null || b == null) return false; + return a.compareTo(b) == 0; + } + + /** + * 比较两个BigDecimal是否相等(指定精度) + * + * @param a 第一个值 + * @param b 第二个值 + * @param scale 保留小数位数 + * @param roundingMode 舍入模式 + * @return 如果相等返回true + */ + public static boolean equals(BigDecimal a, BigDecimal b, int scale, int roundingMode) { + if (a == b) return true; + if (a == null || b == null) return false; + return a.setScale(scale, roundingMode).compareTo(b.setScale(scale, roundingMode)) == 0; + } + + /** + * 判断a是否大于b + * + * @param a 第一个值 + * @param b 第二个值 + * @return 如果a大于b返回true + */ + public static boolean greaterThan(BigDecimal a, BigDecimal b) { + if (a == null || b == null) return false; + return a.compareTo(b) > 0; + } + + /** + * 判断a是否大于或等于b + * + * @param a 第一个值 + * @param b 第二个值 + * @return 如果a大于或等于b返回true + */ + public static boolean greaterThanOrEqual(BigDecimal a, BigDecimal b) { + if (a == null || b == null) return false; + return a.compareTo(b) >= 0; + } + + /** + * 判断a是否小于b + * + * @param a 第一个值 + * @param b 第二个值 + * @return 如果a小于b返回true + */ + public static boolean lessThan(BigDecimal a, BigDecimal b) { + if (a == null || b == null) return false; + return a.compareTo(b) < 0; + } + + /** + * 判断a是否小于或等于b + * + * @param a 第一个值 + * @param b 第二个值 + * @return 如果a小于或等于b返回true + */ + public static boolean lessThanOrEqual(BigDecimal a, BigDecimal b) { + if (a == null || b == null) return false; + return a.compareTo(b) <= 0; + } + + /** + * 判断value是否在min和max之间(包含边界) + * + * @param value 要判断的值 + * @param min 最小值 + * @param max 最大值 + * @return 如果在范围内返回true + */ + public static boolean between(BigDecimal value, BigDecimal min, BigDecimal max) { + if (value == null || min == null || max == null) return false; + return value.compareTo(min) >= 0 && value.compareTo(max) <= 0; + } + + /** + * 判断value是否在min和max之间(不包含边界) + * + * @param value 要判断的值 + * @param min 最小值 + * @param max 最大值 + * @return 如果在范围内返回true + */ + public static boolean betweenExclusive(BigDecimal value, BigDecimal min, BigDecimal max) { + if (value == null || min == null || max == null) return false; + return value.compareTo(min) > 0 && value.compareTo(max) < 0; + } + + /** + * 判断value是否在min和max之间(左闭右开) + * + * @param value 要判断的值 + * @param min 最小值(包含) + * @param max 最大值(不包含) + * @return 如果在范围内返回true + */ + public static boolean betweenLeftClosedRightOpen(BigDecimal value, BigDecimal min, BigDecimal max) { + if (value == null || min == null || max == null) return false; + return value.compareTo(min) >= 0 && value.compareTo(max) < 0; + } + + /** + * 判断value是否在min和max之间(左开右闭) + * + * @param value 要判断的值 + * @param min 最小值(不包含) + * @param max 最大值(包含) + * @return 如果在范围内返回true + */ + public static boolean betweenLeftOpenRightClosed(BigDecimal value, BigDecimal min, BigDecimal max) { + if (value == null || min == null || max == null) return false; + return value.compareTo(min) > 0 && value.compareTo(max) <= 0; + } + + /** + * 判断value是否大于0 + * + * @param value 要判断的值 + * @return 如果大于0返回true + */ + public static boolean isPositive(BigDecimal value) { + return greaterThan(value, BigDecimal.ZERO); + } + + /** + * 判断value是否大于或等于0 + * + * @param value 要判断的值 + * @return 如果大于或等于0返回true + */ + public static boolean isNonNegative(BigDecimal value) { + return greaterThanOrEqual(value, BigDecimal.ZERO); + } + + /** + * 判断value是否小于0 + * + * @param value 要判断的值 + * @return 如果小于0返回true + */ + public static boolean isNegative(BigDecimal value) { + return lessThan(value, BigDecimal.ZERO); + } + + /** + * 判断value是否小于或等于0 + * + * @param value 要判断的值 + * @return 如果小于或等于0返回true + */ + public static boolean isNonPositive(BigDecimal value) { + return lessThanOrEqual(value, BigDecimal.ZERO); + } + + /** + * 判断value是否等于0 + * + * @param value 要判断的值 + * @return 如果等于0返回true + */ + public static boolean isZero(BigDecimal value) { + return equals(value, BigDecimal.ZERO); + } + + /** + * 判断value是否非零 + * + * @param value 要判断的值 + * @return 如果不等于0返回true + */ + public static boolean isNotZero(BigDecimal value) { + return !isZero(value); + } + + /** + * 判断两个BigDecimal中的较大值 + * + * @param a 第一个值 + * @param b 第二个值 + * @return 较大值,如果都为null返回null + */ + public static BigDecimal max(BigDecimal a, BigDecimal b) { + if (a == null) return b; + if (b == null) return a; + return a.compareTo(b) >= 0 ? a : b; + } + + /** + * 判断两个BigDecimal中的较小值 + * + * @param a 第一个值 + * @param b 第二个值 + * @return 较小值,如果都为null返回null + */ + public static BigDecimal min(BigDecimal a, BigDecimal b) { + if (a == null) return b; + if (b == null) return a; + return a.compareTo(b) <= 0 ? a : b; + } + + /** + * 安全比较,处理null情况 + * + * @param a 第一个值 + * @param b 第二个值 + * @return 比较结果:a>b返回1,a=b返回0,a getPayingOrder(String module, Integer type) { + return walletTradeMapper.getPayingOrder(module, type); + } + + public List transferTradeList(String module, Integer type) { return walletTradeMapper.transferTradeList(module, type); } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/wallet/WalletTradeMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/wallet/WalletTradeMapper.java index 752fe574a..182b1def5 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/wallet/WalletTradeMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/wallet/WalletTradeMapper.java @@ -21,5 +21,7 @@ public interface WalletTradeMapper extends Mapper { */ List getPayingOrderBatchCode(@Param("module") String module, @Param("type") Integer type); + List getPayingOrder(@Param("module") String module, @Param("type") Integer type); + List transferTradeList(@Param("module") String module, @Param("type") Integer type); } \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/wallet/WalletTradeMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/wallet/WalletTradeMapper.xml index 0eddf36ec..50762f1cb 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/wallet/WalletTradeMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/wallet/WalletTradeMapper.xml @@ -72,6 +72,12 @@ GROUP BY batch_code + + @@ -31,6 +37,7 @@ SELECT FROM zxjp_pre_allocation_record WHERE order_id = #{orderId} + AND ORDER BY create_time DESC @@ -38,6 +45,7 @@ SELECT FROM zxjp_pre_allocation_record WHERE shop_id = #{shopId} + AND ORDER BY create_time DESC @@ -45,14 +53,16 @@ SELECT FROM zxjp_pre_allocation_record WHERE shop_id = #{shopId} - and expense_type = #{expenseType} + AND expense_type = #{expenseType} ORDER BY create_time DESC + limit 1 @@ -130,6 +140,23 @@ + + UPDATE zxjp_pre_allocation_record + SET deleted = 1, + update_time = NOW() + WHERE id = #{id} + AND + + + UPDATE zxjp_pre_allocation_record + SET deleted = 1, + update_time = NOW() + WHERE id IN + + #{id} + + AND + diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/order/PreAllocationRecordDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/order/PreAllocationRecordDO.java index 58ff74434..4ede7d105 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/order/PreAllocationRecordDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/order/PreAllocationRecordDO.java @@ -53,4 +53,10 @@ public class PreAllocationRecordDO implements Serializable { @Column(name = "update_time") private Date updateTime; + + @Column(name = "remark") + private String remark; + + @Column(name = "deleted") + private Integer deleted; } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/store/PreAllocationAddRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/store/PreAllocationAddRequest.java new file mode 100644 index 000000000..1973e0fe1 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/store/PreAllocationAddRequest.java @@ -0,0 +1,42 @@ +package com.cool.store.request.store; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * 新增预分账记录请求 + */ +@Data +public class PreAllocationAddRequest { + + @NotNull(message = "订单ID不能为空") + @ApiModelProperty("订单ID") + private Long orderId; + + @NotNull(message = "门店ID不能为空") + @ApiModelProperty("门店ID") + private Long shopId; + + @NotBlank(message = "费用类型不能为空") + @ApiModelProperty("费用类型") + private String expenseType; + + @ApiModelProperty("收款公司名称") + private String payeeName; + + @ApiModelProperty("收款公司Code") + private String payeeCode; + + @NotNull(message = "分账金额不能为空") + @DecimalMin(value = "0.01", message = "分账金额必须大于0") + @ApiModelProperty("分账金额") + private BigDecimal payAmount; + + @ApiModelProperty("分账备注") + private String remark; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/store/PreAllocationEditRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/store/PreAllocationEditRequest.java new file mode 100644 index 000000000..fb46205fd --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/store/PreAllocationEditRequest.java @@ -0,0 +1,36 @@ +package com.cool.store.request.store; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * 编辑预分账记录请求 + */ +@Data +public class PreAllocationEditRequest { + + @NotNull(message = "记录ID不能为空") + @ApiModelProperty("记录ID") + private Long id; + + @ApiModelProperty("费用类型") + private String expenseType; + + @ApiModelProperty("收款公司名称") + private String payeeName; + + @ApiModelProperty("收款公司Code") + private String payeeCode; + + @ApiModelProperty("分账金额") + @DecimalMin(value = "0.01", message = "分账金额必须大于0") + private BigDecimal payAmount; + + @ApiModelProperty("分账备注") + private String remark; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/order/PreAllocationRecordVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/order/PreAllocationRecordVO.java index 2fa09362a..f676a3756 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/order/PreAllocationRecordVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/order/PreAllocationRecordVO.java @@ -50,5 +50,7 @@ public class PreAllocationRecordVO { @ApiModelProperty("更新时间") private Date updateTime; + @ApiModelProperty("分账备注") + private String remark; } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/FranchiseFeeServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/FranchiseFeeServiceImpl.java index 2ec2aca52..d56a91405 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/FranchiseFeeServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/FranchiseFeeServiceImpl.java @@ -335,7 +335,7 @@ public class FranchiseFeeServiceImpl implements FranchiseFeeService { stageList.add(SHOP_SUB_STAGE_STATUS_80); }else { //标准店 - stageList.add(SHOP_SUB_STAGE_STATUS_285); + stageList.add(SHOP_SUB_STAGE_STATUS_284_7); stageList.add(SHOP_SUB_STAGE_STATUS_80); //查询可乐机缴费状态 PreAllocationRecordDO preAllocationRecordDO = preAllocationRecordDAO.queryPageByShopIdAndExpenseType(request.getShopId(), WalletFeeItemEnum.DEVICE_EARNEST_MONEY.getExpenseType()); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/OpenApiServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/OpenApiServiceImpl.java index 1806dc855..afd726c55 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/OpenApiServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/OpenApiServiceImpl.java @@ -44,8 +44,7 @@ import java.util.Arrays; import java.util.List; import java.util.Objects; -import static com.cool.store.enums.point.ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_285; -import static com.cool.store.enums.point.ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_80; +import static com.cool.store.enums.point.ShopSubStageStatusEnum.*; /** * @Author suzhuhong @@ -127,7 +126,7 @@ public class OpenApiServiceImpl implements OpenApiService { if (request.getClaimStatus() == 1 && preAllocationRecordDO!=null&&WalletFeeItemEnum.DEVICE_EARNEST_MONEY.getExpenseType().equals(preAllocationRecordDO.getExpenseType())){ String key = MessageFormat.format(RedisConstant.XGJ_CALLBACK_SHOP, preAllocationRecordDO.getShopId()); if (StringUtils.isNotEmpty(redisUtilPool.getString(key))){ - shopStageInfoDAO.batchUpdateShopStageStatus(preAllocationRecordDO.getShopId(),Arrays.asList(SHOP_SUB_STAGE_STATUS_285,SHOP_SUB_STAGE_STATUS_80)); + shopStageInfoDAO.batchUpdateShopStageStatus(preAllocationRecordDO.getShopId(),Arrays.asList(SHOP_SUB_STAGE_STATUS_284_7,SHOP_SUB_STAGE_STATUS_80)); } } return ApiResponse.success(Boolean.TRUE); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/store/PreAllocationRecordService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/store/PreAllocationRecordService.java index cf1d70df4..5b05f58b3 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/store/PreAllocationRecordService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/store/PreAllocationRecordService.java @@ -3,6 +3,8 @@ package com.cool.store.service.store; import com.cool.store.entity.order.PreAllocationRecordDO; import com.cool.store.entity.order.StoreOrderDO; import com.cool.store.entity.wallet.WalletTradeDO; +import com.cool.store.request.store.PreAllocationAddRequest; +import com.cool.store.request.store.PreAllocationEditRequest; import com.cool.store.request.store.PreAllocationQueryShopRequest; import com.cool.store.request.store.PreAllocationSaveRequest; import com.cool.store.request.store.TransRequest; @@ -37,4 +39,26 @@ public interface PreAllocationRecordService { */ Boolean transStatusRefresh(WalletTradeDO walletTradeDO); + /** + * 新增预分账记录 + * @param request + * @return + */ + Boolean add(PreAllocationAddRequest request); + + /** + * 编辑预分账记录 + * @param request + * @return + */ + Boolean edit(PreAllocationEditRequest request); + + /** + * 删除预分账记录(软删除) + * @param id + * @return + */ + Boolean delete(Long id); + + } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/store/impl/PreAllocationRecordServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/store/impl/PreAllocationRecordServiceImpl.java index 10a08d0f4..8f04fa757 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/store/impl/PreAllocationRecordServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/store/impl/PreAllocationRecordServiceImpl.java @@ -43,6 +43,8 @@ import com.cool.store.enums.point.ShopSubStageStatusEnum; import com.cool.store.enums.wallet.TradeTypeEnum; import com.cool.store.exception.ServiceException; import com.cool.store.mapper.FranchiseFeeMapper; +import com.cool.store.request.store.PreAllocationAddRequest; +import com.cool.store.request.store.PreAllocationEditRequest; import com.cool.store.request.store.PreAllocationSaveRequest; import com.cool.store.request.store.TransRequest; import com.cool.store.request.wallet.*; @@ -74,8 +76,8 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import static com.cool.store.enums.order.StoreOrderStatusEnum.PAY_FAIL; -import static com.cool.store.enums.wallet.WalletTradeModuleEnum.STANDARD_STORE; -import static com.cool.store.enums.wallet.WalletTradeModuleEnum.TRANSFER; +import static com.cool.store.enums.point.ShopSubStageStatusEnum.*; +import static com.cool.store.enums.wallet.WalletTradeModuleEnum.*; /** * @Auther zx_szh @@ -756,6 +758,7 @@ public class PreAllocationRecordServiceImpl implements PreAllocationRecordServic throw new ServiceException(ErrorCodeEnum.ERROR_MESSAGE); } record.setAllocationStatus(AllocationPayStatusEnum.PAYING.getStatus()); + record.setRemark(transRequest.getRemark()); //先改为分账中 preAllocationRecordDAO.updateByPrimaryKeySelective(record); WalletTradeDO walletTradeDO = new WalletTradeDO(); @@ -804,10 +807,68 @@ public class PreAllocationRecordServiceImpl implements PreAllocationRecordServic if (BigDecimalUtils.equals(unpaidAmount,new BigDecimal(0))){ //剩余缴纳金额是0 缴费完成 updateOrder.setStatus( StoreOrderStatusEnum.PAID.getCode()); + //阶段状态变为完成 + shopStageInfoDAO.updateShopStageInfo(storeOrder.getShopId(), SHOP_SUB_STAGE_STATUS_285); } storeOrderDAO.updateSelective(updateOrder); } return Boolean.TRUE; } + @Override + public Boolean add(PreAllocationAddRequest request) { + if (request == null) { + throw new ServiceException(ErrorCodeEnum.PARAMS_VALIDATE_ERROR); + } + + PreAllocationRecordDO record = PreAllocationRecordDO.builder() + .orderId(request.getOrderId()) + .shopId(request.getShopId()) + .expenseType(request.getExpenseType()) + .payeeName(request.getPayeeName()) + .payeeCode(request.getPayeeCode()) + .payAmount(request.getPayAmount()) + .remark(request.getRemark()) + .deleted(0) + .allocationStatus(AllocationPayStatusEnum.UNPAID.getStatus()) + .createTime(new Date()) + .updateTime(new Date()) + .build(); + + return dao.insertSelective(record); + } + + @Override + public Boolean edit(PreAllocationEditRequest request) { + if (request == null || request.getId() == null) { + throw new ServiceException(ErrorCodeEnum.PARAMS_VALIDATE_ERROR); + } + + PreAllocationRecordDO exist = dao.getById(request.getId()); + if (exist == null) { + throw new ServiceException(ErrorCodeEnum.PARAMS_VALIDATE_ERROR); + } + + PreAllocationRecordDO record = PreAllocationRecordDO.builder() + .id(request.getId()) + .expenseType(request.getExpenseType()) + .payeeName(request.getPayeeName()) + .payeeCode(request.getPayeeCode()) + .payAmount(request.getPayAmount()) + .remark(request.getRemark()) + .updateTime(new Date()) + .build(); + + return dao.updateByPrimaryKeySelective(record); + } + + @Override + public Boolean delete(Long id) { + if (id == null) { + throw new ServiceException(ErrorCodeEnum.PARAMS_VALIDATE_ERROR); + } + return dao.softDeleteById(id); + } + + } diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PreAllocationRecordController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PreAllocationRecordController.java index 21efef8d3..0c30ce18e 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PreAllocationRecordController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PreAllocationRecordController.java @@ -1,5 +1,7 @@ package com.cool.store.controller.webb; +import com.cool.store.request.store.PreAllocationAddRequest; +import com.cool.store.request.store.PreAllocationEditRequest; import com.cool.store.request.store.PreAllocationQueryShopRequest; import com.cool.store.request.store.PreAllocationSaveRequest; import com.cool.store.request.store.TransRequest; @@ -45,4 +47,23 @@ public class PreAllocationRecordController { public ResponseResult> queryByShop(@RequestParam(value = "shopId" ,required = true) Long shopId){ return ResponseResult.success(preAllocationRecordService.queryByShop(shopId)); } + + @ApiOperation("新增预分账记录") + @PostMapping("/add") + public ResponseResult add(@RequestBody @Valid PreAllocationAddRequest request){ + return ResponseResult.success(preAllocationRecordService.add(request)); + } + + @ApiOperation("编辑预分账记录") + @PostMapping("/edit") + public ResponseResult edit(@RequestBody @Valid PreAllocationEditRequest request){ + return ResponseResult.success(preAllocationRecordService.edit(request)); + } + + @ApiOperation("删除预分账记录") + @PostMapping("/delete") + public ResponseResult delete(@RequestParam(value = "id" ,required = true) Long id){ + return ResponseResult.success(preAllocationRecordService.delete(id)); + } + } From a884919d136015b0d4caff18b20ef456ae1fd151 Mon Sep 17 00:00:00 2001 From: suzhuhong Date: Fri, 17 Apr 2026 13:41:57 +0800 Subject: [PATCH 4/6] =?UTF-8?q?feat:=E5=88=86=E8=B4=A6=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/store/impl/PreAllocationRecordServiceImpl.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/store/impl/PreAllocationRecordServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/store/impl/PreAllocationRecordServiceImpl.java index 8f04fa757..250b3915e 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/store/impl/PreAllocationRecordServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/store/impl/PreAllocationRecordServiceImpl.java @@ -788,7 +788,6 @@ public class PreAllocationRecordServiceImpl implements PreAllocationRecordServic if (AllocationPayStatusEnum.PAID.getStatus().equals(walletTradeDO.getPayStatus())) { ShopInfoDO shopInfo = shopInfoDAO.getShopInfo(preAllocationRecordDO.getShopId()); //订单状态更新 - StoreOrderDO storeOrder = storeOrderDAO.getById(preAllocationRecordDO.getOrderId()); //部分支付 StoreOrderDO updateOrder = StoreOrderDO.builder() @@ -811,6 +810,9 @@ public class PreAllocationRecordServiceImpl implements PreAllocationRecordServic shopStageInfoDAO.updateShopStageInfo(storeOrder.getShopId(), SHOP_SUB_STAGE_STATUS_285); } storeOrderDAO.updateSelective(updateOrder); + //清除缓存 + String lockKey = MessageFormat.format(RedisConstant.PRE_ALLOCATION,preAllocationRecordDO.getId()); + redisUtil.unlock(lockKey); } return Boolean.TRUE; } @@ -828,6 +830,7 @@ public class PreAllocationRecordServiceImpl implements PreAllocationRecordServic .payeeName(request.getPayeeName()) .payeeCode(request.getPayeeCode()) .payAmount(request.getPayAmount()) + .payNo(GenerateNoUtil.generateMillsNoWithRandom()) .remark(request.getRemark()) .deleted(0) .allocationStatus(AllocationPayStatusEnum.UNPAID.getStatus()) From 824ef3f90a184bd9567ba9dadd42a1a9aef312c5 Mon Sep 17 00:00:00 2001 From: suzhuhong Date: Fri, 17 Apr 2026 16:58:59 +0800 Subject: [PATCH 5/6] =?UTF-8?q?feat:=E6=8F=90=E7=A4=BA=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/store/impl/PreAllocationRecordServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/store/impl/PreAllocationRecordServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/store/impl/PreAllocationRecordServiceImpl.java index 250b3915e..4744f1593 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/store/impl/PreAllocationRecordServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/store/impl/PreAllocationRecordServiceImpl.java @@ -755,7 +755,7 @@ public class PreAllocationRecordServiceImpl implements PreAllocationRecordServic //分账失败 释放锁 redisUtil.unlock(lockKey); log.error("confirmSplitOrder:{}",e.getMessage()); - throw new ServiceException(ErrorCodeEnum.ERROR_MESSAGE); + throw new ServiceException(ErrorCodeEnum.ERROR_MESSAGE,e.getMessage()); } record.setAllocationStatus(AllocationPayStatusEnum.PAYING.getStatus()); record.setRemark(transRequest.getRemark()); From cc0659157dc8340c4541aeddd7c07334abe25442 Mon Sep 17 00:00:00 2001 From: suzhuhong Date: Mon, 20 Apr 2026 10:14:06 +0800 Subject: [PATCH 6/6] =?UTF-8?q?feat:=E6=8F=90=E7=A4=BA=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cool/store/service/impl/SplitOrderServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/SplitOrderServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/SplitOrderServiceImpl.java index dbc82fd53..8e41f2204 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/SplitOrderServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/SplitOrderServiceImpl.java @@ -252,7 +252,7 @@ public class SplitOrderServiceImpl implements SplitOrderService { //分账失败 释放锁 redisUtil.unlock(lockKey); log.info("confirmSplitOrder:{}",e.getMessage()); - throw new ServiceException(ErrorCodeEnum.ERROR_MESSAGE); + throw new ServiceException(ErrorCodeEnum.ERROR_MESSAGE,e.getMessage()); } existing.setConfirmer(userInfo.getUserId()); existing.setStatus(accountTransferDTO.getTradeStatus());