挂账需求

This commit is contained in:
Tankaikai
2025-03-05 14:18:27 +08:00
parent e3833b8bfc
commit 3f03cd2583
30 changed files with 1983 additions and 1 deletions

View File

@@ -0,0 +1,102 @@
package com.czg.order.dto;
import cn.hutool.core.util.NumberUtil;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* 挂账人
*
* @author Tankaikai tankaikai@aliyun.com
* @since 1.0 2025-03-04
*/
@Data
public class CreditBuyerDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 挂账编码
*/
private String id;
/**
* 店铺id
*/
private Long shopId;
/**
* 状态 1-启用 0-停用
*/
private Integer status;
/**
* 挂账人
*/
private String debtor;
/**
* 手机号
*/
private String mobile;
/**
* 职务
*/
private String position;
/**
* 挂账额度
*/
private BigDecimal creditAmount;
/**
* 账户余额
*/
private BigDecimal accountBalance;
/**
* 还款方式 total-按总金额还款 order-按订单还款
*/
private String repaymentMethod;
/**
* 支付方式
*/
private String paymentMethod;
/**
* 责任人
*/
private String responsiblePerson;
/**
* 备注
*/
private String remark;
/**
* 删除标志 0-正常 1-删除
*/
private Integer isDel;
/**
* 已挂账金额
*/
private BigDecimal owedAmount;
/**
* 剩余挂账额度
*/
private BigDecimal remainingAmount;
/**
* 累计挂账金额
*/
private BigDecimal accumulateAmount;
/**
* 适用门店
*/
private String shopName;
/**
* 剩余挂账额度
*/
public BigDecimal getRemainingAmount() {
return NumberUtil.sub(creditAmount, NumberUtil.nullToZero(owedAmount));
}
}

View File

@@ -0,0 +1,71 @@
package com.czg.order.dto;
import com.alibaba.fastjson2.annotation.JSONField;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
/**
* 挂账账单
*
* @author Tankaikai tankaikai@aliyun.com
* @since 1.0 2025-03-04
*/
@Data
public class CreditBuyerOrderDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* id
*/
private Long id;
/**
* 订单id
*/
private Long orderId;
/**
* 挂账人编码
*/
private String creditBuyerId;
/**
* 应付金额
*/
private BigDecimal payAmount;
/**
* 已付金额
*/
private BigDecimal paidAmount;
/**
* 未付金额
*/
private BigDecimal unpaidAmount;
/**
* 状态 unpaid-未付款 partial-部分支付 paid-已付款
*/
private String status;
/**
* 最近一次付款时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime lastPaymentTime;
/**
* 最近一次付款方式
*/
private String lastPaymentMethod;
/**
* 备注
*/
private String remark;
/**
* 创建时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
}

View File

@@ -0,0 +1,57 @@
package com.czg.order.dto;
import com.alibaba.fastjson2.annotation.JSONField;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 挂账账单付款记录
*
* @author Tankaikai tankaikai@aliyun.com
* @since 1.0 2025-03-04
*/
@Data
public class CreditPaymentRecordDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* id
*/
private Long id;
/**
* 订单id
*/
private Long orderId;
/**
* 挂账人编码
*/
private String creditBuyerId;
/**
* 还款金额
*/
private BigDecimal repaymentAmount;
/**
* 支付方式
*/
private String paymentMethod;
/**
* 备注
*/
private String remark;
/**
* 还款时间
*/
private LocalDateTime paymentTime;
/**
* 操作时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
}

View File

@@ -0,0 +1,79 @@
package com.czg.order.entity;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import com.mybatisflex.core.keygen.KeyGenerators;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* 挂账人
*
* @author Tankaikai tankaikai@aliyun.com
* @since 1.0 2025-03-04
*/
@Data
@Table("tb_credit_buyer")
public class CreditBuyer implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 挂账编码
*/
@Id(keyType = KeyType.Generator, value = KeyGenerators.snowFlakeId)
private String id;
/**
* 店铺id
*/
private Long shopId;
/**
* 状态 1-启用 0-停用
*/
private Integer status;
/**
* 挂账人
*/
private String debtor;
/**
* 手机号
*/
private String mobile;
/**
* 职务
*/
private String position;
/**
* 挂账额度
*/
private BigDecimal creditAmount;
/**
* 账户余额
*/
private BigDecimal accountBalance;
/**
* 还款方式 total-按总金额还款 order-按订单还款
*/
private String repaymentMethod;
/**
* 支付方式
*/
private String paymentMethod;
/**
* 责任人
*/
private String responsiblePerson;
/**
* 备注
*/
private String remark;
/**
* 删除标志 0-正常 1-删除
*/
private Integer isDel;
}

View File

@@ -0,0 +1,59 @@
package com.czg.order.entity;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 挂账账单
*
* @author Tankaikai tankaikai@aliyun.com
* @since 1.0 2025-03-04
*/
@Data
@Table("tb_credit_buyer_order")
public class CreditBuyerOrder implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* id
*/
@Id(keyType = KeyType.Auto)
private Long id;
/**
* 订单id
*/
private Long orderId;
/**
* 挂账人编码
*/
private String creditBuyerId;
/**
* 已付金额
*/
private BigDecimal paidAmount;
/**
* 状态 unpaid-未付款 partial-部分支付 paid-已付款
*/
private String status;
/**
* 最近一次付款时间
*/
private LocalDateTime lastPaymentTime;
/**
* 最近一次付款方式
*/
private String lastPaymentMethod;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,61 @@
package com.czg.order.entity;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 挂账账单付款记录
*
* @author Tankaikai tankaikai@aliyun.com
* @since 1.0 2025-03-04
*/
@Data
@Table("tb_credit_payment_record")
public class CreditPaymentRecord implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* id
*/
@Id(keyType = KeyType.Auto)
private Long id;
/**
* 订单id
*/
private Long orderId;
/**
* 挂账人编码
*/
private String creditBuyerId;
/**
* 还款金额
*/
private BigDecimal repaymentAmount;
/**
* 支付方式
*/
private String paymentMethod;
/**
* 备注
*/
private String remark;
/**
* 还款时间
*/
private LocalDateTime paymentTime;
/**
* 操作时间
*/
@Column(onInsertValue = "now()")
private LocalDateTime createTime;
}

View File

@@ -0,0 +1,50 @@
package com.czg.order.enums;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import java.util.Arrays;
import java.util.List;
/**
* 挂账还款状态枚举
*
* @author tankaikai
* @since 2025-03-04 17:53
*/
@Getter
@RequiredArgsConstructor
public enum CreditBuyerEnums {
/**
* 未还款
*/
UNPAID("unpaid", "未还款"),
/**
* 部分还款
*/
PARTIAL("partial", "部分还款"),
/**
* 已还清
*/
PAID("paid", "已还清"),
;
private final String value;
private final String text;
public static List<String> getValues() {
return Arrays.stream(values()).map(CreditBuyerEnums::getValue).toList();
}
public static String getText(String value) {
CreditBuyerEnums item = Arrays.stream(values()).filter(obj -> value.equals(obj.getValue())).findFirst().orElse(null);
if (item != null) {
return item.getText();
}
return null;
}
}

View File

@@ -0,0 +1,50 @@
package com.czg.order.param;
import com.alibaba.fastjson2.annotation.JSONField;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
/**
* 挂账订单查询入参
*
* @author tankaikai
* @since 2025-03-05 11:02
*/
@Data
public class CreditBuyerOrderQueryParam implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* id
*/
@JSONField(serialize = false)
private Long id;
/**
* 挂账人id
*/
private String creditBuyerId;
/**
* 挂账订单id
*/
private String orderId;
/**
* 开始日期 格式yyyy-MM-dd
*/
private String beginDate;
/**
* 结束日期 格式yyyy-MM-dd
*/
private String endDate;
/**
* 订单状态 unpaid-未付款 partial-部分支付 paid-已付款
*/
private String status;
/**
* 订单状态集合 unpaid-未付款 partial-部分支付 paid-已付款
*/
private List<String> statusList;
}

View File

@@ -0,0 +1,46 @@
package com.czg.order.param;
import com.alibaba.fastjson2.annotation.JSONField;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 挂账人查询入参
*
* @author tankaikai
* @since 2025-03-04 17:42
*/
@Data
public class CreditBuyerQueryParam implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 挂账编码
*/
@JSONField(serialize = false)
private String id;
/**
* 关键字
*/
private String keywords;
/**
* 还款状态 unpaid-未还款 partial-部分还款 paid-已还清
*/
private String repaymentStatus;
/**
* 责任人
*/
private String responsiblePerson;
/**
* 状态 1-启用 0-停用
*/
private Integer status;
/**
* 店铺id
*/
@JSONField(serialize = false)
private Long shopId;
}

View File

@@ -0,0 +1,36 @@
package com.czg.order.param;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* 挂账还款入参
*
* @author tankaikai
* @since 2025-03-04 17:42
*/
@Data
public class CreditBuyerRepaymentParam implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 挂账编码挂账人id
*/
private String id;
/**
* 还款金额
*/
private BigDecimal repaymentAmount;
/**
* 支付方式
*/
private String paymentMethod;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,33 @@
package com.czg.order.param;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 挂账账单付款记录查询入参
*
* @author Tankaikai tankaikai@aliyun.com
* @since 1.0 2025-03-04
*/
@Data
public class CreditPaymentRecordQueryParam implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 挂账人编码
*/
private String creditBuyerId;
/**
* 订单id
*/
private Long orderId;
/**
* 支付方式
*/
private String paymentMethod;
}

View File

@@ -0,0 +1,72 @@
package com.czg.order.service;
import com.czg.order.dto.CreditBuyerOrderDTO;
import com.czg.order.entity.CreditBuyerOrder;
import com.czg.order.entity.CreditPaymentRecord;
import com.czg.order.param.CreditBuyerOrderQueryParam;
import com.czg.order.vo.CreditBuyerOrderSummaryVo;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService;
import java.math.BigDecimal;
/**
* 挂账账单
*
* @author Tankaikai tankaikai@aliyun.com
* @since 1.0 2025-03-04
*/
public interface CreditBuyerOrderService extends IService<CreditBuyerOrder> {
/**
* 分页查询挂账账单
*
* @param param 查询参数
* @return 分页结果
*/
Page<CreditBuyerOrderDTO> getCreditBuyerOrderPage(CreditBuyerOrderQueryParam param);
/**
* 挂账账单汇总
*
* @param param 查询参数
* @return 汇总结果
*/
CreditBuyerOrderSummaryVo summary(CreditBuyerOrderQueryParam param);
/**
* 支付挂账订单
*
* @param record 入参
*/
void pay(CreditPaymentRecord record);
/**
* 保存挂账账单
*
* @param creditBuyerId 挂账人id
* @param orderId 订单id
*/
boolean save(String creditBuyerId, Long orderId);
/**
* 挂账人退款(整单退款)
*
* @param creditBuyerId 挂账人id
* @param orderId 订单id
* @return
*/
@Deprecated
boolean refund(String creditBuyerId, Long orderId);
/**
* 挂账人退款(部分退款)
*
* @param creditBuyerId 挂账人id
* @param orderId 订单id
* @param refundAmount 退款金额
* @return
*/
boolean partRefund(String creditBuyerId, Long orderId, BigDecimal refundAmount);
}

View File

@@ -0,0 +1,30 @@
package com.czg.order.service;
import com.czg.order.dto.CreditBuyerDTO;
import com.czg.order.entity.CreditBuyer;
import com.czg.order.param.CreditBuyerQueryParam;
import com.czg.order.param.CreditBuyerRepaymentParam;
import com.czg.order.vo.CreditBuyerRepaymentVo;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService;
/**
* 挂账人
*
* @author Tankaikai tankaikai@aliyun.com
* @since 1.0 2025-03-04
*/
public interface CreditBuyerService extends IService<CreditBuyer> {
Page<CreditBuyerDTO> getCreditBuyerPage(CreditBuyerQueryParam param);
CreditBuyerDTO getCreditBuyerById(String id);
void addCreditBuyer(CreditBuyerDTO dto);
void updateCreditBuyer(CreditBuyerDTO dto);
void deleteCreditBuyer(String id);
CreditBuyerRepaymentVo repayment(CreditBuyerRepaymentParam param);
}

View File

@@ -0,0 +1,18 @@
package com.czg.order.service;
import com.czg.order.dto.CreditPaymentRecordDTO;
import com.czg.order.entity.CreditPaymentRecord;
import com.czg.order.param.CreditPaymentRecordQueryParam;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService;
/**
* 挂账账单付款记录
*
* @author Tankaikai tankaikai@aliyun.com
* @since 1.0 2025-03-04
*/
public interface CreditPaymentRecordService extends IService<CreditPaymentRecord> {
Page<CreditPaymentRecordDTO> getCreditPaymentRecordPage(CreditPaymentRecordQueryParam param);
}

View File

@@ -0,0 +1,42 @@
package com.czg.order.vo;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* 挂账账单统计结果
*
* @author Tankaikai tankaikai@aliyun.com
* @since 1.0 2025-03-04
*/
@Data
public class CreditBuyerOrderSummaryVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 总交易笔数
*/
private Long count;
/**
* 总交易金额
*/
private BigDecimal payAmountTotal;
/**
* 已支付金额
*/
private BigDecimal paidAmountTotal;
/**
* 待支付金额
*/
private BigDecimal unpaidAmountTotal;
/**
* 待支付笔数
*/
private Long unpaidCount;
}

View File

@@ -0,0 +1,40 @@
package com.czg.order.vo;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* 挂账还款出参
*
* @author tankaikai
* @since 2025-03-04 17:42
*/
@Data
public class CreditBuyerRepaymentVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 还款笔数
*/
private Integer repaymentCount;
/**
* 还款金额
*/
private BigDecimal repaymentAmount;
/**
* 支付欠款
*/
private BigDecimal payAmount;
/**
* 转存金额
*/
private BigDecimal rechargeAmount;
/**
* 还款反馈消息
*/
private String repaymentMsg;
}