This commit is contained in:
luojiaquan
2026-09-22 09:53:09 +08:00
18 changed files with 366 additions and 53 deletions
@@ -21,6 +21,8 @@ public class ArBillDetail implements Serializable {
private Integer detailNo;
private String orderNo;
private String trackingNo;
/** 转单号快照;账单生成时从来源计费订单复制,保证历史账单可追溯。 */
private String transferNo;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date receiveTime;
private String productCode;
@@ -17,9 +17,9 @@ public class ArBillGenerateQuery
private String currency;
/** 订单号或运单号关键词,按 OR 条件模糊查询。 */
/** 订单号、运单号或转单号关键词,按 OR 条件模糊查询。 */
private String orderOrTrackingNo;
/** 全选模式下,排除弹窗使用的附加订单号或运单号关键词。 */
/** 全选模式下,排除弹窗使用的附加订单号、运单号或转单号关键词。 */
private String excludeOrderOrTrackingNo;
}
@@ -3,8 +3,11 @@ package com.ruoyi.ar.domain.vo;
import java.util.Date;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import com.ruoyi.common.config.serializer.StrictDateDeserializer;
import com.ruoyi.ar.enums.ArBillSelectionMode;
import lombok.Data;
@@ -15,11 +18,13 @@ public class ArBillGenerateRequest
@NotNull(message = "客户不能为空")
private Long customerId;
@NotBlank(message = "账单名称不能为空")
@Size(max = 100, message = "账单名称不能超过100个字符")
private String billName;
private String customerCode;
private String customerName;
@NotNull(message = "账单截止日不能为空")
@JsonFormat(pattern = "yyyy-MM-dd")
@JsonDeserialize(using = StrictDateDeserializer.class)
private Date billPeriodEnd;
/** 手动模式选中的来源订单 ID;全选模式为空。 */
private List<String> sourceBillIds;
@@ -28,13 +33,15 @@ public class ArBillGenerateRequest
/** 全选模式中用户明确排除的来源订单 ID。 */
private List<String> excludedSourceBillIds;
@JsonFormat(pattern = "yyyy-MM-dd")
@JsonDeserialize(using = StrictDateDeserializer.class)
private Date billDate;
private String currency = "CNY";
/** 订单号或运单号关键词,生成时用于再次校验筛选条件。 */
/** 订单号、运单号或转单号关键词,生成时用于再次校验筛选条件。 */
private String orderOrTrackingNo;
private String bankAccountName;
private String bankAccountNo;
private String bankName;
@Size(max = 500, message = "备注不能超过500个字符")
private String remark;
/** 前端幂等号;重复提交同一请求时复用原任务。 */
private String requestId;
@@ -90,6 +90,9 @@ public class ArBalanceWriteoffServiceImpl implements IArBalanceWriteoffService {
throw new ServiceException("核销金额必须大于0");
}
amount = amount.setScale(MONEY_SCALE, RoundingMode.HALF_UP);
if (amount.compareTo(BigDecimal.ZERO) <= 0) {
throw new ServiceException("核销金额保留两位小数后必须大于0");
}
// 1. 行锁锁定账单(加锁顺序:账单 -> 账户,与反核销保持一致)
ArBill bill = billMapper.selectArBillByIdForUpdate(cmd.getArBillId());
@@ -984,6 +984,7 @@ public class ArBillServiceImpl implements IArBillService {
detail.setDetailNo(detailNo);
detail.setOrderNo(source.getOrderNo());
detail.setTrackingNo(source.getTrackingNo());
detail.setTransferNo(source.getTransferNo());
detail.setReceiveTime(source.getOrderTime());
detail.setProductCode(source.getProductCode());
detail.setProductName(source.getProductName());
@@ -1631,15 +1632,23 @@ public class ArBillServiceImpl implements IArBillService {
}
private void validatePeriod(ArBillGenerateRequest request) {
if (request == null || request.getCustomerId() == null || StringUtils.isEmpty(request.getBillName())
if (request == null || request.getCustomerId() == null || request.getCustomerId() <= 0
|| StringUtils.isEmpty(request.getBillName())
|| request.getBillName().trim().isEmpty()
|| request.getBillPeriodEnd() == null) {
throw new ServiceException("客户、账单名称和账单截止日不能为空");
}
if (request.getBillName().trim().length() > 100) {
throw new ServiceException("账单名称不能超过100个字符");
}
if (StringUtils.isNotEmpty(request.getRemark()) && request.getRemark().trim().length() > 500) {
throw new ServiceException("备注不能超过500个字符");
}
}
private void validatePreviewQuery(ArBillGenerateQuery query) {
if (query == null || query.getCustomerId() == null || query.getBillPeriodEnd() == null) {
if (query == null || query.getCustomerId() == null || query.getCustomerId() <= 0
|| query.getBillPeriodEnd() == null) {
throw new ServiceException("客户和账单截止日不能为空");
}
}