Explorar o código

定金支付逻辑,订单支付扣减已支付定金金额

lishiqiang hai 1 semana
pai
achega
fd700a4312

+ 30 - 0
ship-module-trade/ship-module-trade-api/src/main/java/com/yc/ship/module/trade/api/dto/TradeCancelAuditReqDTO.java

@@ -0,0 +1,30 @@
+package com.yc.ship.module.trade.api.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Schema(description = "RPC 服务 - 退款审核创建 Request DTO")
+@Data
+public class TradeCancelAuditReqDTO implements Serializable {
+
+
+    @Schema(description = "订单ID", example = "")
+    @NotNull(message = "订单ID不能为空")
+    private Long orderId;
+
+    @Schema(description = "审核状态 0拒绝 1同意", example = "")
+    @NotNull(message = "审核状态不能为空")
+    private Integer auditStatus;
+
+    @Schema(description = "审核意见", example = "")
+    private String auditAdvice;
+
+    @Schema(description = "审核人", example = "")
+    @NotNull(message = "审核人不能为空")
+    private Long auditUser;
+
+}

+ 16 - 0
ship-module-trade/ship-module-trade-api/src/main/java/com/yc/ship/module/trade/api/dto/TradeCancelAuditRespDTO.java

@@ -0,0 +1,16 @@
+package com.yc.ship.module.trade.api.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+
+@Schema(description = "RPC 服务 - 退款审核返回信息 Response DTO")
+@Data
+@Accessors(chain = true)
+public class TradeCancelAuditRespDTO {
+
+    private Long orderId;
+    private Long cancelAuditId;
+
+}

+ 48 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/dataobject/refund/CancelAuditDO.java

@@ -0,0 +1,48 @@
+package com.yc.ship.module.trade.dal.dataobject.refund;
+
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.yc.ship.framework.tenant.core.db.TenantBaseDO;
+import lombok.*;
+
+import java.math.BigDecimal;
+
+/**
+ * 取消审核记录 DO
+ *
+ * @author 管理员
+ */
+@TableName("trade_cancel_audit")
+@KeySequence("trade_cancel_audit_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class CancelAuditDO extends TenantBaseDO {
+
+    /**
+     * 主键
+     */
+    @TableId
+    private Long id;
+    /**
+     * 订单ID
+     */
+    private Long orderId;
+    /**
+     * 审核状态
+     */
+    private Integer auditStatus;
+    /**
+     * 审核意见
+     */
+    private String auditAdvice;
+    /**
+     * 审核人
+     */
+    private String auditUser;
+
+}

+ 19 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/mysql/refund/CancelAuditMapper.java

@@ -0,0 +1,19 @@
+package com.yc.ship.module.trade.dal.mysql.refund;
+
+
+import com.yc.ship.framework.mybatis.core.mapper.BaseMapperX;
+import com.yc.ship.module.trade.dal.dataobject.refund.CancelAuditDO;
+import org.apache.ibatis.annotations.Mapper;
+
+
+/**
+ * 取消审核记录 Mapper
+ *
+ * @author 管理员
+ */
+@Mapper
+public interface CancelAuditMapper extends BaseMapperX<CancelAuditDO> {
+
+
+
+}

+ 14 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/order/impl/AdminTradeOrderServiceImpl.java

@@ -22,8 +22,11 @@ import com.yc.ship.module.trade.convert.order.TradeRefundConvert;
 import com.yc.ship.module.trade.dal.dataobject.order.TradeDetailDO;
 import com.yc.ship.module.trade.dal.dataobject.order.TradeOrderDO;
 import com.yc.ship.module.trade.dal.dataobject.order.TradeOrderUserDO;
+import com.yc.ship.module.trade.dal.dataobject.refund.CancelAuditDO;
 import com.yc.ship.module.trade.dal.mysql.order.TradeDetailMapper;
+import com.yc.ship.module.trade.dal.mysql.refund.CancelAuditMapper;
 import com.yc.ship.module.trade.enums.RefundChannelEnum;
+import com.yc.ship.module.trade.enums.TradeOrderStatusEnum;
 import com.yc.ship.module.trade.service.order.AdminTradeOrderService;
 import com.yc.ship.module.trade.service.order.TradeOrderRepositoryService;
 import com.yc.ship.module.trade.service.order.bo.TradeVisitorBO;
@@ -37,6 +40,7 @@ import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 import static com.yc.ship.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -63,6 +67,9 @@ public class AdminTradeOrderServiceImpl implements AdminTradeOrderService {
     private TradeOrderPayService tradeOrderPayService;
     @Resource
     private TradeDetailMapper tradeDetailMapper;
+
+    @Resource
+    private CancelAuditMapper cancelAuditMapper;
     @Resource
     private ContractApi contractApi;
     @Resource
@@ -311,6 +318,13 @@ public class AdminTradeOrderServiceImpl implements AdminTradeOrderService {
     public CommonResult<?> cancelOrder(Long orderId) {
         TradeOrderDO tradeOrderDO = tradeOrderRepositoryService.getById(orderId);
         Asserts.isTrue(tradeOrderDO != null, "订单不存在");
+        if(Objects.equals(tradeOrderDO.getOrderStatus(), TradeOrderStatusEnum.UNPAID.getStatus())){
+            //需要审核
+            CancelAuditDO cancelAuditDO = new CancelAuditDO();
+            cancelAuditDO.setOrderId(orderId);
+            cancelAuditDO.setAuditStatus(TradeOrderStatusEnum.CANCELED.getStatus());
+            cancelAuditMapper.insert(cancelAuditDO);
+        }
         return tradeOrderPayService.cancelOrder(orderId);
     }
 

+ 5 - 3
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/otc/impl/OtcTradeOrderServiceImpl.java

@@ -1762,9 +1762,8 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
                 tradeOrderRoomModelDO.setOrderNo(orderNo);
                 list.add(tradeOrderRoomModelDO);
             });
-
-            if (!Objects.equals(shipTradeOrderCreateReqVO.getAmount(), tradeOrderDO.getAmount()) && loginUser.getDistributorId() != null) {
-                auditType = 4;
+            if (!Objects.equals(shipTradeOrderCreateReqVO.getRemark(), tradeOrderDO.getRemark()) || !Objects.equals(shipTradeOrderCreateReqVO.getLinkMobile(), tradeOrderDO.getLinkMobile())  || !Objects.equals(shipTradeOrderCreateReqVO.getLinkMan(), tradeOrderDO.getLinkMan()) ) {
+                auditType = 2;
             }
             if (!Objects.equals(shipTradeOrderCreateReqVO.getAmount(), tradeOrderDO.getAmount()) && loginUser.getDistributorId() == null) {
                 auditType = 3;
@@ -1772,6 +1771,9 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
             if (!Objects.equals(shipTradeOrderCreateReqVO.getDeposi(), tradeOrderDO.getDeposi()) ) {
                 auditType = 3;
             }
+            if (!Objects.equals(shipTradeOrderCreateReqVO.getAmount(), tradeOrderDO.getAmount()) && loginUser.getDistributorId() != null) {
+                auditType = 4;
+            }
             String msg = "";
             if (auditType > 0 && createVO.getIsYd() != 1) {
                 AuditUserDO auditUserDO = auditUserMapper.selectOne(new LambdaQueryWrapperX<AuditUserDO>().eq(AuditUserDO::getType, auditType).eq(AuditUserDO::getDeleted, 0).orderByDesc(AuditUserDO::getCreateTime).last("limit 1"));

+ 16 - 3
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/pay/impl/TradeOrderPayServiceImpl.java

@@ -293,11 +293,20 @@ public class TradeOrderPayServiceImpl implements TradeOrderPayService {
                             tradeOrderPayDO.setPaymentDate(DateUtil.parseLocalDateTime(payNotifyReqBO.getBillDate(), DatePattern.PURE_DATETIME_PATTERN));
                         } catch (Exception e) {
                             log.error("支付平台返回的支付时间转换错误{}", payNotifyReqBO.getBillDate());
+                            tradeOrderPayDO.setPaymentDate(LocalDateTime.now());
                         }
                     }
-                    //4.1支付成功
                     TradeOrderDO tradeOrderDO = tradeOrderRepositoryService.getById(tradeOrderPayDO.getOrderId());
-                    updateDeposiOrderPaid(tradeOrderDO,tradeOrderPayDO);
+                    //验证订单是否已全部支付完成
+                    BigDecimal hadPayAmount = tradeOrderRepositoryService.getHadPayAmount(tradeOrderPayDO.getOrderId());
+                    if(hadPayAmount.compareTo(tradeOrderDO.getAmount()) >= 0){
+                        log.error("计算订单全部支付金额:{},订单金额:{}", hadPayAmount,tradeOrderDO.getAmount());
+                        tradeOrderDO.setOrderStatus(TradeOrderStatusEnum.UNUSED.getStatus());
+                    }
+                    //更新支付单状态
+                    updatePayOrderSuccess(tradeOrderPayDO);
+                    //4.1支付成功
+                    updateDeposiOrderPaid(tradeOrderDO, tradeOrderPayDO);
                 });
             }
         } catch (ServiceException e) {
@@ -690,7 +699,7 @@ public class TradeOrderPayServiceImpl implements TradeOrderPayService {
     public void updateDeposiOrderPaid(TradeOrderDO tradeOrderDO, TradeOrderPayDO tradeOrderPayDO) {
         Integer orderStatus = tradeOrderDO.getOrderStatus();
         tradeOrderMapper.update(new LambdaUpdateWrapper<TradeOrderDO>()
-                .eq(TradeOrderDO::getId, tradeOrderDO.getId()).set(TradeOrderDO::getDeposiStatus, 2).set(TradeOrderDO::getDeposiPayTime, LocalDateTime.now()));
+                .eq(TradeOrderDO::getId, tradeOrderDO.getId()).set(TradeOrderDO::getOrderStatus, orderStatus).set(TradeOrderDO::getDeposiStatus, 2).set(TradeOrderDO::getDeposiPayTime, LocalDateTime.now()));
         //保存订单日志
         TradeOrderLogUtils.setOrderInfo(tradeOrderDO.getId(), orderStatus, tradeOrderDO.getOrderStatus(), MapUtil.<String, Object>builder().put("payType", PayTypeEnum.valueOf(tradeOrderPayDO.getPaymentType()).getName()).put("payAmount", tradeOrderPayDO.getPayAmount()).build());
     }
@@ -999,4 +1008,8 @@ public class TradeOrderPayServiceImpl implements TradeOrderPayService {
         return CommonResult.error(500, "合同不存在");
     }
 
+    public static void main(String[] args) {
+        System.out.println(DateUtil.parseLocalDateTime("20260304", DatePattern.PURE_DATETIME_PATTERN));
+    }
+
 }

+ 7 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/refund/TradeRefundService.java

@@ -45,6 +45,13 @@ public interface TradeRefundService {
      */
     CommonResult<TradeRefundAuditRespDTO> refundAudit(TradeRefundAuditReqDTO refundAuditReqDTO);
 
+    /**
+     * 退款审计
+     * @param cancelAuditReqDTO
+     * @return
+     */
+    CommonResult<TradeCancelAuditRespDTO> cancelAudit(TradeCancelAuditReqDTO cancelAuditReqDTO);
+
     /**
      * 根据支付类型退款
      * @param refundId

+ 16 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/refund/impl/TradeRefundServiceImpl.java

@@ -266,6 +266,22 @@ public class TradeRefundServiceImpl implements TradeRefundService {
         return CommonResult.success(respDTO);
     }
 
+    @Override
+    public CommonResult<TradeCancelAuditRespDTO> cancelAudit(TradeCancelAuditReqDTO cancelAuditReqDTO) {
+        TradeCancelAuditRespDTO respDTO = new TradeCancelAuditRespDTO();
+        respDTO.setOrderId(cancelAuditReqDTO.getOrderId());
+        if (ObjectUtil.equal(cancelAuditReqDTO.getAuditStatus(), YES)) {
+            //同意
+
+
+        } else {
+            //拒绝
+
+        }
+
+        return CommonResult.success(respDTO);
+    }
+
     @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.ORDER_REFUND_AUDIT)
     public RefundAuditDO doAudit(RefundDO refundDO, TradeRefundAuditReqDTO refundAuditReqDTO) {
         Asserts.isTrue(ObjectUtil.equal(refundDO.getRefundStatus(), RefundStatusEnum.AUDITING.getStatus()), "当前状态不能审批,{}", refundDO.getRefundStatus());