修改计费订单ID类型为Long,优化相关逻辑

This commit is contained in:
wuweihua
2026-11-14 00:23:47 +08:00
parent 87eab12d51
commit 8b7c346ec4
71 changed files with 929 additions and 346 deletions
@@ -253,7 +253,7 @@ public class BillingController extends BaseController
/** 订单列表弹窗:按 billId 查询计费失败原因(受数据权限控制)。 */
@PreAuthorize("@ss.hasPermi('price:orderBill:list')")
@GetMapping("/orderBill/{billId}/failReason")
public AjaxResult orderBillFailReason(@PathVariable("billId") String billId)
public AjaxResult orderBillFailReason(@PathVariable("billId") Long billId)
{
return success(prcOrderBillService.getBillingFailReason(billId));
}
@@ -380,7 +380,7 @@ public class BillingController extends BaseController
@PreAuthorize("@ss.hasPermi('price:billing:bill') or @ss.hasPermi('price:orderBill:list')")
@GetMapping("/bill/{billId}")
public AjaxResult getBill(@PathVariable String billId)
public AjaxResult getBill(@PathVariable Long billId)
{
return success(prcOrderBillService.getBill(billId));
}
@@ -391,13 +391,13 @@ public class BillingController extends BaseController
*/
@PreAuthorize("@ss.hasPermi('price:billing:bill') or @ss.hasPermi('price:orderBill:list')")
@GetMapping("/bill/{billId}/history")
public TableDataInfo billHistory(@PathVariable("billId") String billId)
public TableDataInfo billHistory(@PathVariable("billId") Long billId)
{
if (StringUtils.isEmpty(billId))
if (billId == null)
{
return getDataTable(new ArrayList<BillSyncSnapshot>());
}
TmsPriceQuoteResult bill = prcOrderBillService.getBill(billId.trim());
TmsPriceQuoteResult bill = prcOrderBillService.getBill(billId);
if (bill == null)
{
TableDataInfo empty = new TableDataInfo();
@@ -482,13 +482,13 @@ public class BillingController extends BaseController
@PreAuthorize("@ss.hasPermi('price:billing:refund')")
@Log(title = "Billing refund", businessType = BusinessType.UPDATE)
@PostMapping("/bill/{billId}/refund")
public AjaxResult refundBill(@PathVariable("billId") String billId)
public AjaxResult refundBill(@PathVariable("billId") Long billId)
{
if (StringUtils.isEmpty(billId))
if (billId == null)
{
return error("billId required");
}
TmsPriceQuoteResult bill = prcOrderBillService.getBill(billId.trim());
TmsPriceQuoteResult bill = prcOrderBillService.getBill(billId);
if (bill == null || StringUtils.isEmpty(bill.getOrderNo()))
{
return error("bill not found");
@@ -519,7 +519,7 @@ public class BillingController extends BaseController
@PreAuthorize("@ss.hasPermi('price:billing:arrearsUpdate')")
@Log(title = "Billing credit arrears", businessType = BusinessType.UPDATE)
@PutMapping("/bill/creditArrears")
public AjaxResult updateCreditArrears(@RequestBody java.util.List<String> billIds)
public AjaxResult updateCreditArrears(@RequestBody java.util.List<Long> billIds)
{
if (billIds == null || billIds.isEmpty())
{
@@ -527,7 +527,7 @@ public class BillingController extends BaseController
}
int success = 0;
java.util.List<String> fails = new java.util.ArrayList<String>();
for (String billId : billIds)
for (Long billId : billIds)
{
try
{
@@ -664,7 +664,7 @@ public class BillingController extends BaseController
@PreAuthorize("@ss.hasPermi('price:billing:feeRemove')")
@Log(title = "Billing income fee", businessType = BusinessType.DELETE)
@DeleteMapping("/bill/fee/{feeId}")
public AjaxResult deleteIncomeFee(@PathVariable String feeId)
public AjaxResult deleteIncomeFee(@PathVariable Long feeId)
{
return success(prcOrderBillService.deleteIncomeFee(feeId));
}
@@ -89,7 +89,7 @@ public class PayProductController extends BaseController
@PreAuthorize("@ss.hasAnyPermi('price:billing:bill,price:pay:edit')")
@Log(title = "应付账单", businessType = BusinessType.INSERT)
@PostMapping("/order/{billId}")
public AjaxResult generateOrderCost(@PathVariable String billId)
public AjaxResult generateOrderCost(@PathVariable Long billId)
{
payOrderCostService.generate(billId);
return success("操作成功");
@@ -12,7 +12,7 @@ public class SrvBillAirAllocOrder
private String orderNo;
/** 计费订单 ID,对应 prc_order_bill.bill_id */
private String billId;
private Long billId;
/** 计费重,没有计费重时依次取实际重量、收货重量 */
private BigDecimal chargeWeight;
@@ -15,7 +15,7 @@ public class PayBillDiff
private Long lineId;
private String feeId;
private Long feeId;
private BigDecimal ourAmount;
@@ -28,7 +28,7 @@ public class PayBillDiff
/** OPEN ACCEPT_OURS ACCEPT_THEIRS */
private String handleType;
private String adjustFeeId;
private Long adjustFeeId;
private String createBy;
@@ -13,9 +13,9 @@ public class PayBillLine
private Long billId;
private String feeId;
private Long feeId;
private String orderBillId;
private Long orderBillId;
private String orderNo;
@@ -19,7 +19,7 @@ public class PayBillLog
private Long lineId;
private String feeId;
private Long feeId;
private String operationType;
@@ -9,7 +9,7 @@ import lombok.Data;
@Data
public class PayBillOrder
{
private String billId;
private Long billId;
private String orderNo;
@@ -8,7 +8,7 @@ import lombok.Data;
@Data
public class PayOrderCostResult
{
private String billId;
private Long billId;
private String channelId;
@@ -26,7 +26,7 @@ public class PrcBillingTask extends BaseEntity
/** 移动端传入的计费时间(非 Oracle 订单时间;回写时不会被覆盖) */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date billTime;
private String billId;
private Long billId;
/** 用于查询的稳定失败码,例如 NO_CUSTOMER_PACKAGE */
private String failCode;
private String errorMessage;
@@ -13,9 +13,9 @@ public class PrcIncomeBill implements Serializable
private static final long serialVersionUID = 1L;
/** 应收主表ID */
private String incomeBillId;
private Long incomeBillId;
/** 计费订单ID */
private String billId;
private Long billId;
/** 币种 */
private String currency;
/** 产品价合计 */
@@ -12,10 +12,10 @@ public class PrcIncomeBillFee implements Serializable
{
private static final long serialVersionUID = 1L;
private String feeId;
private String billId;
private Long feeId;
private Long billId;
/** 应收主表ID */
private String incomeBillId;
private Long incomeBillId;
private String feeType;
private String feeName;
private Long scId;
@@ -15,9 +15,9 @@ public class PrcOrderBill extends BaseEntity
{
private static final long serialVersionUID = 1L;
private String billId;
private Long billId;
/** 批量查询:多个账单ID精确匹配(仅查询用,非表字段) */
private List<String> billIds;
private List<Long> billIds;
private String billKey;
private String orderNo;
/** 批量查询:多个订单号精确匹配(仅查询用,非表字段) */
@@ -12,7 +12,7 @@ public class PrcOrderBillExt implements Serializable
{
private static final long serialVersionUID = 1L;
private String billId;
private Long billId;
private String orderNo;
private String upstreamId;
private String lineNo;
@@ -13,9 +13,9 @@ public class PrcPayBill implements Serializable
private static final long serialVersionUID = 1L;
/** 应付主表ID */
private String payBillId;
private Long payBillId;
/** 计费订单ID */
private String billId;
private Long billId;
/** 币种 */
private String currency;
/** 产品价合计 */
@@ -12,10 +12,10 @@ public class PrcPayBillFee implements Serializable
{
private static final long serialVersionUID = 1L;
private String feeId;
private String billId;
private Long feeId;
private Long billId;
/** 应付主表ID */
private String payBillId;
private Long payBillId;
private String feeType;
private String feeName;
private Long scId;
@@ -13,7 +13,7 @@ public class AddIncomeBillFeeRequest implements Serializable
private static final long serialVersionUID = 1L;
@NotBlank(message = "billId required")
private String billId;
private Long billId;
/** 附加费配置ID(prc_surcharge.sc_id)。 */
@NotNull(message = "scId required")
@@ -19,7 +19,7 @@ public class BatchAddIncomeBillFeeRequest implements Serializable
private String scopeMode;
/** scopeMode=SELECTED 时选中的账单ID。 */
private List<String> billIds;
private List<Long> billIds;
/** 与计费列表搜索相同的筛选条件。 */
private List<String> orderNos;
@@ -15,7 +15,7 @@ public class LocalRebillRequest implements Serializable
/** ALL | SELECTED */
private String scopeMode;
private List<String> billIds;
private List<Long> billIds;
private List<String> orderNos;
private List<String> trackingNos;
private List<String> transferNos;
@@ -14,7 +14,7 @@ public class OrderBillFailReasonVo implements Serializable
{
private static final long serialVersionUID = 1L;
private String billId;
private Long billId;
private String orderNo;
private String transferNo;
private String trackingNo;
@@ -15,7 +15,7 @@ public class RecalcBillPriceRequest implements Serializable
/** ALL = 筛选条件;SELECTED = billIds。 */
private String scopeMode;
private List<String> billIds;
private List<Long> billIds;
private List<String> orderNos;
private List<String> trackingNos;
private List<String> transferNos;
@@ -27,7 +27,7 @@ public class TmsOrderBillStatusResult {
/**
* 计费订单标识,仅在唯一命中时返回。
*/
private String billId;
private Long billId;
private String orderNo;
private String trackingNo;
@@ -82,7 +82,7 @@ public class TmsPriceQuoteResult implements Serializable
/** 应付费用明细 */
private List<TmsPriceQuoteFeeLine> payFeeDetails;
private String quoteId;
private String billId;
private Long billId;
private String orderNo;
private String trackingNo;
/** 转单号 */
@@ -14,7 +14,7 @@ public class UpdateChargeWeightRequest implements Serializable
private static final long serialVersionUID = 1L;
@NotBlank(message = "billId is required")
private String billId;
private Long billId;
@NotNull(message = "chargeWeight is required")
@DecimalMin(value = "0.001", message = "chargeWeight must be > 0")
@@ -12,7 +12,7 @@ public class UpdateIncomeBillFeeRequest implements Serializable
private static final long serialVersionUID = 1L;
@NotBlank(message = "feeId required")
private String feeId;
private Long feeId;
/** 可选:更换附加费配置。 */
private Long scId;
@@ -65,7 +65,7 @@ public interface PayBillMapper
* @param billIds 计费订单ID
* @return 订单应付费用
*/
List<PrcPayBillFee> selectOrderFees(@Param("billIds") List<String> billIds);
List<PrcPayBillFee> selectOrderFees(@Param("billIds") List<Long> billIds);
/**
* 读取还没被未作废账单占用的费用。旧账单没有费用行号时,整票视为已占用。
@@ -73,7 +73,7 @@ public interface PayBillMapper
* @param billIds 计费订单ID
* @return 可抄进本次账单的费用
*/
List<PrcPayBillFee> selectFreeFees(@Param("billIds") List<String> billIds);
List<PrcPayBillFee> selectFreeFees(@Param("billIds") List<Long> billIds);
/**
* 这票订单还有没有未删除的计算费用。
@@ -81,7 +81,7 @@ public interface PayBillMapper
* @param billId 计费订单ID
* @return 计算费用条数
*/
int countCalcFees(@Param("billId") String billId);
int countCalcFees(@Param("billId") Long billId);
/**
* 插入一张草稿应付账单。
@@ -122,7 +122,7 @@ public interface PayBillMapper
* @param lineId 账单行ID
* @return 影响行数
*/
int bindFeeLine(@Param("feeId") String feeId, @Param("lineId") Long lineId);
int bindFeeLine(@Param("feeId") Long feeId, @Param("lineId") Long lineId);
/**
* 释放一张账单占用的费用明细。
@@ -22,7 +22,7 @@ public interface PayFinanceMapper
Long selectLadingSupplier(@Param("ladingNo") String ladingNo);
int stampFee(@Param("feeId") String feeId, @Param("supplierId") Long supplierId, @Param("supplierName") String supplierName);
int stampFee(@Param("feeId") Long feeId, @Param("supplierId") Long supplierId, @Param("supplierName") String supplierName);
int stampCalc(@Param("billId") String billId, @Param("supplierId") Long supplierId, @Param("supplierName") String supplierName);
int stampCalc(@Param("billId") Long billId, @Param("supplierId") Long supplierId, @Param("supplierName") String supplierName);
}
@@ -7,22 +7,22 @@ import com.bms.price.domain.PrcIncomeBillFee;
/** 应收账单费用 mapper */
public interface PrcIncomeBillFeeMapper
{
public List<PrcIncomeBillFee> selectByBillId(String billId);
public List<PrcIncomeBillFee> selectByBillId(Long billId);
public List<PrcIncomeBillFee> selectByBillIds(@Param("billIds") List<String> billIds);
public List<PrcIncomeBillFee> selectByBillIds(@Param("billIds") List<Long> billIds);
/** 查询指定计费订单中尚未生成应收账单的费用。 */
public List<PrcIncomeBillFee> selectUnbilledByBillIds(@Param("billIds") List<String> billIds,
public List<PrcIncomeBillFee> selectUnbilledByBillIds(@Param("billIds") List<Long> billIds,
@Param("arBillStatus") String arBillStatus);
public PrcIncomeBillFee selectByFeeId(String feeId);
public PrcIncomeBillFee selectByFeeId(Long feeId);
/** 按唯一键 uk_bill_fee_item(bill_id、fee_type、sc_id)查询。 */
public PrcIncomeBillFee selectByBillIdAndFeeTypeAndScId(@Param("billId") String billId,
public PrcIncomeBillFee selectByBillIdAndFeeTypeAndScId(@Param("billId") Long billId,
@Param("feeType") String feeType, @Param("scId") Long scId);
/** 统计某账单在指定 ar_bill_status 和 fee_type 下的费用数(例如 BILLED + BASIC_FREIGHT)。 */
public int countByBillIdAndArBillStatusAndFeeType(@Param("billId") String billId,
public int countByBillIdAndArBillStatusAndFeeType(@Param("billId") Long billId,
@Param("arBillStatus") String arBillStatus, @Param("feeType") String feeType);
public int insertPrcIncomeBillFee(PrcIncomeBillFee fee);
@@ -31,23 +31,23 @@ public interface PrcIncomeBillFeeMapper
public int updatePrcIncomeBillFee(PrcIncomeBillFee fee);
public int updateArBillStatusByBillIds(@Param("billIds") List<String> billIds,
public int updateArBillStatusByBillIds(@Param("billIds") List<Long> billIds,
@Param("fromStatus") String fromStatus, @Param("toStatus") String toStatus);
/** 按费用明细 ID 精确更新状态,避免误更新同一订单的历史费用。 */
public int updateArBillStatusByFeeIds(@Param("feeIds") List<String> feeIds,
public int updateArBillStatusByFeeIds(@Param("feeIds") List<Long> feeIds,
@Param("fromStatus") String fromStatus, @Param("toStatus") String toStatus);
/** 作废或失败清理后,仅在不存在其他有效账单关联时恢复为未出账。 */
public int restoreUnbilledIfNoActiveArBill(@Param("feeIds") List<String> feeIds);
public int restoreUnbilledIfNoActiveArBill(@Param("feeIds") List<Long> feeIds);
/** 按应收账单批量恢复其关联费用,避免大账单组装超大的费用 ID 列表。 */
public int restoreUnbilledIfNoActiveArBillByArBillId(@Param("arBillId") Long arBillId);
public int deleteByFeeId(String feeId);
public int deleteByFeeId(Long feeId);
public int deleteByBillId(String billId);
public int deleteByBillId(Long billId);
/** 重新出账:只删除自动费用;保留 manual_flag=1 的行。 */
public int deleteAutoFeesByBillId(String billId);
public int deleteAutoFeesByBillId(Long billId);
}
@@ -7,11 +7,11 @@ import org.apache.ibatis.annotations.Param;
/** 应收账单 prc_income_bill 的 mapper */
public interface PrcIncomeBillMapper
{
PrcIncomeBill selectByBillId(String billId);
PrcIncomeBill selectByBillId(Long billId);
List<PrcIncomeBill> selectByBillIds(@Param("billIds") List<String> billIds);
List<PrcIncomeBill> selectByBillIds(@Param("billIds") List<Long> billIds);
PrcIncomeBill selectByIncomeBillId(String incomeBillId);
PrcIncomeBill selectByIncomeBillId(Long incomeBillId);
int insertPrcIncomeBill(PrcIncomeBill row);
@@ -19,5 +19,5 @@ public interface PrcIncomeBillMapper
int upsertPrcIncomeBill(PrcIncomeBill row);
int deleteByBillId(String billId);
int deleteByBillId(Long billId);
}
@@ -5,7 +5,7 @@ import com.bms.price.domain.PrcOrderBillExt;
/** 订单账单扩展 prc_order_bill_ext 的 mapper */
public interface PrcOrderBillExtMapper
{
public PrcOrderBillExt selectByBillId(String billId);
public PrcOrderBillExt selectByBillId(Long billId);
public PrcOrderBillExt selectByOrderNo(String orderNo);
@@ -17,12 +17,12 @@ public interface PrcOrderBillMapper
/** TMS 状态查询:按订单号、运单号或转单号精确匹配,最多返回两条用于识别歧义。 */
List<PrcOrderBill> selectPrcOrderBillByTmsIdentifier(@Param("identifier") String identifier);
public PrcOrderBill selectPrcOrderBillById(String billId);
public PrcOrderBill selectPrcOrderBillById(Long billId);
public List<PrcOrderBill> selectPrcOrderBillList(PrcOrderBill bill);
/** 只取 bill_id(筛选条件/数据权限与列表一致),用于本地大批量重新出账。 */
List<String> selectPrcOrderBillIds(PrcOrderBill bill);
List<Long> selectPrcOrderBillIds(PrcOrderBill bill);
/** 统计匹配的账单数(筛选条件/数据权限与列表一致)。 */
int countPrcOrderBillIds(PrcOrderBill bill);
@@ -65,7 +65,7 @@ public interface PrcOrderBillMapper
@Param("excludeOrderIdentifiers") List<String> excludeOrderIdentifiers,
@Param("cutoffDate") Date cutoffDate, @Param("dateType") String dateType, @Param("currency") String currency,
@Param("arBillStatuses") List<String> arBillStatuses, @Param("feeArBillStatus") String feeArBillStatus,
@Param("excludedBillIds") List<String> excludedBillIds);
@Param("excludedBillIds") List<Long> excludedBillIds);
/** 统计应收账单预览结果金额,供全选模式展示。 */
BigDecimal sumPrcOrderBillIncomeByCustomerPeriod(@Param("customerId") Long customerId,
@@ -80,8 +80,8 @@ public interface PrcOrderBillMapper
@Param("cutoffDate") Date cutoffDate, @Param("dateType") String dateType, @Param("currency") String currency,
@Param("arBillStatuses") List<String> arBillStatuses, @Param("feeArBillStatus") String feeArBillStatus,
@Param("snapshotCreateTime") Date snapshotCreateTime,
@Param("lastSourceBillId") String lastSourceBillId, @Param("billIds") List<String> billIds,
@Param("excludedBillIds") List<String> excludedBillIds,
@Param("lastSourceBillId") Long lastSourceBillId, @Param("billIds") List<Long> billIds,
@Param("excludedBillIds") List<Long> excludedBillIds,
@Param("excludedOrderIdentifiers") List<String> excludedOrderIdentifiers, @Param("limit") int limit);
int countPrcOrderBillByCustomerPeriod(@Param("customerId") Long customerId,
@@ -89,29 +89,29 @@ public interface PrcOrderBillMapper
@Param("cutoffDate") Date cutoffDate, @Param("dateType") String dateType, @Param("currency") String currency,
@Param("arBillStatuses") List<String> arBillStatuses, @Param("feeArBillStatus") String feeArBillStatus,
@Param("snapshotCreateTime") Date snapshotCreateTime,
@Param("billIds") List<String> billIds, @Param("excludedBillIds") List<String> excludedBillIds,
@Param("billIds") List<Long> billIds, @Param("excludedBillIds") List<Long> excludedBillIds,
@Param("excludedOrderIdentifiers") List<String> excludedOrderIdentifiers);
/** 按生成账单时用户勾选的订单读取,并再次校验账单筛选条件。 */
public List<PrcOrderBill> selectPrcOrderBillByCustomerCutoffAndIds(@Param("customerId") Long customerId,
@Param("customerCode") String customerCode, @Param("orderIdentifiers") List<String> orderIdentifiers,
@Param("cutoffDate") Date cutoffDate, @Param("dateType") String dateType,
@Param("currency") String currency, @Param("billIds") List<String> billIds,
@Param("currency") String currency, @Param("billIds") List<Long> billIds,
@Param("arBillStatuses") List<String> arBillStatuses, @Param("feeArBillStatus") String feeArBillStatus);
/** 原子占用订单,防止同一订单被并发生成到多张应收账单。 */
public int claimArBillOrders(@Param("billIds") List<String> billIds, @Param("operator") String operator,
public int claimArBillOrders(@Param("billIds") List<Long> billIds, @Param("operator") String operator,
@Param("arBillStatuses") List<String> arBillStatuses, @Param("toStatus") String toStatus);
/** 作废账单后释放订单,允许后续重新生成新版本账单。 */
public int releaseArBillOrders(@Param("billIds") List<String> billIds, @Param("operator") String operator,
public int releaseArBillOrders(@Param("billIds") List<Long> billIds, @Param("operator") String operator,
@Param("fromStatus") String fromStatus, @Param("toStatus") String toStatus);
int releaseArBillOrdersByArBillId(@Param("arBillId") Long arBillId, @Param("operator") String operator,
@Param("fromStatus") String fromStatus, @Param("toStatus") String toStatus);
/** 根据费用明细状态及无费用失败订单的有效账单快照汇总订单出账状态。 */
int refreshArBillStatusByBillIds(@Param("billIds") List<String> billIds);
int refreshArBillStatusByBillIds(@Param("billIds") List<Long> billIds);
/** 清理或作废时批量释放来源订单;无费用失败订单的占用判断排除当前账单。 */
int refreshArBillStatusByArBillId(@Param("arBillId") Long arBillId);
@@ -126,20 +126,20 @@ public interface PrcOrderBillMapper
@Param("creditArrearsStatus") String creditArrearsStatus);
/** 更新订单额度欠费状态 */
int updateCreditArrearsStatus(@Param("billId") String billId,
int updateCreditArrearsStatus(@Param("billId") Long billId,
@Param("creditArrearsStatus") String creditArrearsStatus,
@Param("updateBy") String updateBy);
public int updateOrderBillAmounts(@Param("billId") String billId,
public int updateOrderBillAmounts(@Param("billId") Long billId,
@Param("surchargeAmount") BigDecimal surchargeAmount,
@Param("incomeTotal") BigDecimal incomeTotal,
@Param("payTotal") BigDecimal payTotal);
/** 只更新应付合计,不改应收。 */
int updatePayTotal(@Param("billId") String billId, @Param("payTotal") BigDecimal payTotal);
int updatePayTotal(@Param("billId") Long billId, @Param("payTotal") BigDecimal payTotal);
/** 按未删除应付明细合计回写订单上的应付总额。单次不超过 1000 个订单。 */
int refreshPayTotalFromFees(@Param("billIds") List<String> billIds);
int refreshPayTotalFromFees(@Param("billIds") List<Long> billIds);
/** 统计引用该销售套餐版本的订单账单数。 */
int countByPsvId(@Param("psvId") Long psvId);
@@ -13,7 +13,7 @@ public interface PrcPayBillFeeMapper
* @param billId 计费订单ID
* @return 费用明细
*/
public List<PrcPayBillFee> selectByBillId(String billId);
public List<PrcPayBillFee> selectByBillId(Long billId);
/**
* 插入一条订单应付费用。
@@ -37,7 +37,7 @@ public interface PrcPayBillFeeMapper
* @param billId 计费订单ID
* @return 影响行数
*/
public int deleteByBillId(String billId);
public int deleteByBillId(Long billId);
/**
* 逻辑删除某一条提单费用分摊到订单上的明细。
@@ -48,10 +48,10 @@ public interface PrcPayBillFeeMapper
public int markLadingFeeDeleted(@Param("feeId") Long feeId);
/** 这条提单费用已经分摊到的订单。作废前取出,用来重算应付总额。 */
public List<String> selectBillIdsByLadingFee(@Param("feeId") Long feeId);
public List<Long> selectBillIdsByLadingFee(@Param("feeId") Long feeId);
/** 明细还没挂上应付主表时,按订单补上主表 ID。单次不超过 1000 个订单。 */
public int bindPayBillId(@Param("billIds") List<String> billIds);
public int bindPayBillId(@Param("billIds") List<Long> billIds);
/**
* 这条提单费用分摊到的订单里,取一个已经生成应付账单的订单号。
@@ -13,7 +13,7 @@ public interface PrcPayBillMapper
* @param billId 计费订单ID
* @return 订单应付,没有时为 null
*/
PrcPayBill selectByBillId(String billId);
PrcPayBill selectByBillId(Long billId);
/**
* 按应付主表ID读取。
@@ -21,7 +21,7 @@ public interface PrcPayBillMapper
* @param payBillId 订单应付ID
* @return 订单应付,没有时为 null
*/
PrcPayBill selectByPayBillId(String payBillId);
PrcPayBill selectByPayBillId(Long payBillId);
/**
* 新增一票订单的应付主表。
@@ -53,7 +53,7 @@ public interface PrcPayBillMapper
* @param billId 计费订单ID
* @return 影响行数
*/
int deleteByBillId(String billId);
int deleteByBillId(Long billId);
/**
* 按未删除的应付明细合计,回写这些订单的应付总额。
@@ -61,8 +61,8 @@ public interface PrcPayBillMapper
* @param billIds 计费订单 ID,单次不超过 1000 个
* @return 影响行数
*/
int refreshPayTotal(@Param("billIds") List<String> billIds);
int refreshPayTotal(@Param("billIds") List<Long> billIds);
/** 订单还没有应付主表时补一行,总额随后按明细重算。单次不超过 1000 个订单。 */
int insertMissingPayBills(@Param("billIds") List<String> billIds, @Param("operator") String operator);
int insertMissingPayBills(@Param("billIds") List<Long> billIds, @Param("operator") String operator);
}
@@ -34,7 +34,7 @@ public interface SrvBillAirAllocMapper
* @param billIds 计费订单 ID
* @return 应付主表编号
*/
List<PrcPayBill> selectPayBills(@Param("billIds") List<String> billIds);
List<PrcPayBill> selectPayBills(@Param("billIds") List<Long> billIds);
/**
* 把仍是未分摊的费用改为已分摊。已经不是未分摊的行不会被改到。
@@ -24,10 +24,10 @@ public class PaySettleSupport
* @param billId 计费订单ID
* @param cardName 价卡归属名称
*/
public void stampCalc(String billId, String cardName)
public void stampCalc(Long billId, String cardName)
{
BmsSupplier supplier = match(cardName);
if (supplier == null || billId == null || billId.isBlank())
if (supplier == null || billId == null)
{
return;
}
@@ -13,7 +13,7 @@ public interface IPayOrderCostService
* @param billId 计费订单ID,对应 prc_order_bill.bill_id
* @return 本次算出的产品、版本、币种和费用明细
*/
PayOrderCostResult generate(String billId);
PayOrderCostResult generate(Long billId);
/**
* 单独提交一票尾程。失败时只回滚这一票,不影响外面的对账单事务。
@@ -21,7 +21,7 @@ public interface IPayOrderCostService
* @param billId 计费订单ID
* @return 本次算出的产品、版本、币种和费用明细
*/
PayOrderCostResult generateIsolated(String billId);
PayOrderCostResult generateIsolated(Long billId);
/**
* 这票订单当前尾程价卡上的归属供应商名称。没有价卡时返回空字符串。
@@ -29,5 +29,5 @@ public interface IPayOrderCostService
* @param billId 计费订单ID
* @return 价卡归属名称
*/
String cardSupplierName(String billId);
String cardSupplierName(Long billId);
}
@@ -33,7 +33,7 @@ public interface IPrcOrderBillService
* @param upstreamRow Oracle TAB_ORDER 整行数据
* @return billId
*/
String syncUpstreamOverwrite(java.util.Map<String, Object> upstreamRow);
Long syncUpstreamOverwrite(java.util.Map<String, Object> upstreamRow);
/**
* 计费无法生成报价时,仍然落库 prc_order_bill 及其扩展表。
@@ -59,10 +59,10 @@ public interface IPrcOrderBillService
/** 转单号下拉搜索选项(模糊匹配,去重限量,带数据权限) */
List<String> listTransferNoOptions(PrcOrderBill query);
TmsPriceQuoteResult getBill(String billId);
TmsPriceQuoteResult getBill(Long billId);
/** 订单列表弹窗使用的计费失败原因(带数据权限)。 */
OrderBillFailReasonVo getBillingFailReason(String billId);
OrderBillFailReasonVo getBillingFailReason(Long billId);
TmsPriceQuoteResult getBillByOrderNo(String orderNo);
@@ -73,7 +73,7 @@ public interface IPrcOrderBillService
TmsPriceQuoteResult updateIncomeFee(UpdateIncomeBillFeeRequest request);
/** 删除手工录入的 UNBILLED 收入费用;同时刷新应收合计。 */
TmsPriceQuoteResult deleteIncomeFee(String feeId);
TmsPriceQuoteResult deleteIncomeFee(Long feeId);
/** 预览批量添加费用命中的账单(带数据权限)。 */
BatchAddIncomeBillFeePreview previewBatchAddIncomeFee(BatchAddIncomeBillFeeRequest request);
@@ -103,7 +103,7 @@ public interface IPrcOrderBillService
* @param billId 订单计费ID
* @return 更新后的计费结果
*/
TmsPriceQuoteResult updateCreditArrearsStatus(String billId);
TmsPriceQuoteResult updateCreditArrearsStatus(Long billId);
/**
* 更新 charge_weight(手工覆盖),保留原重量,并重新计费。
@@ -112,12 +112,12 @@ public interface IPrcOrderBillService
* @param billId 账单 ID
* @param chargeWeight 新的计费重量(kg)
*/
TmsPriceQuoteResult updateChargeWeight(String billId, BigDecimal chargeWeight);
TmsPriceQuoteResult updateChargeWeight(Long billId, BigDecimal chargeWeight);
/**
* 更新 charge_weight,不做数据权限校验(供已校验的异步导入使用)。
*/
TmsPriceQuoteResult updateChargeWeightByBillId(String billId, BigDecimal chargeWeight);
TmsPriceQuoteResult updateChargeWeightByBillId(Long billId, BigDecimal chargeWeight);
/**
* 提交 charge_weight 更新的异步导入;返回 taskId。
@@ -151,7 +151,7 @@ public interface IPrcOrderBillService
* 按模式(PRODUCT/REDLINE)重算并落库 product_amount 或 redline_amount。
* 要求 prc_order_bill 已存在;跳过应收可编辑校验。
*/
void recalcBillPriceByBillId(String billId, String mode);
void recalcBillPriceByBillId(Long billId, String mode);
/**
* 仅基于本地 prc_order_bill 做完整重算(不调 Oracle 上游)。
@@ -159,7 +159,7 @@ public interface IPrcOrderBillService
* 若 prc_income_bill_fee 已有 fee_type=REFUND 则跳过,否则走 {@link #refund}。
* 其余情况用账单行重建请求后走 {@link #bill}。
*/
TmsPriceQuoteResult rebillLocalByBillId(String billId);
TmsPriceQuoteResult rebillLocalByBillId(Long billId);
/**
* 按选中的 billId 或列表筛选条件做异步本地重算。返回 taskId 用于进度轮询。
@@ -174,7 +174,7 @@ public interface IPrcOrderBillService
BatchAddIncomeBillFeeTask cancelLocalRebill(String taskId);
/** 本地重算用的带数据权限的 bill_id 列表(筛选条件与订单账单列表一致)。 */
List<String> selectBillIdsForLocalRebill(PrcOrderBill query);
List<Long> selectBillIdsForLocalRebill(PrcOrderBill query);
/** 本地重算的带数据权限的数量统计。 */
int countBillIdsForLocalRebill(PrcOrderBill query);
@@ -21,5 +21,5 @@ public interface IPrcPayBillFeeService
*
* @param billIds 计费订单 ID
*/
void refreshTotals(List<String> billIds);
void refreshTotals(List<Long> billIds);
}
@@ -15,7 +15,6 @@ import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
@@ -152,9 +151,9 @@ public class PayBillServiceImpl implements IPayBillService
throw new ServiceException(preview.getMissingNos().isEmpty() ? PaymentMesEnum.BMS_PAY_NO_GEN.getCnMes() : "订单号没有对上:" + String.join("、", preview.getMissingNos()));
}
String currency = currencyOf(orders);
Map<String, Integer> versions = new HashMap<>();
Map<Long, Integer> versions = new HashMap<>();
List<String> skipped = new ArrayList<>();
List<String> billIds = new ArrayList<>();
List<Long> billIds = new ArrayList<>();
for (PayBillOrder order : orders)
{
billIds.add(order.getBillId());
@@ -228,7 +227,7 @@ public class PayBillServiceImpl implements IPayBillService
bill.setSourceType(mode(command));
bill.setPeriodStart(parseDay(command.getBeginDate()));
bill.setPeriodEnd(parseDay(command.getEndDate()));
Set<String> orderIds = new HashSet<>();
Set<Long> orderIds = new HashSet<>();
for (PayBillLine line : lines)
{
if (line.getOrderBillId() != null)
@@ -260,7 +259,7 @@ public class PayBillServiceImpl implements IPayBillService
{
line.setBillId(bill.getBillId());
payBillMapper.insertLine(line);
if (line.getFeeId() != null && !line.getFeeId().isBlank() && payBillMapper.bindFeeLine(line.getFeeId(), line.getLineId()) != 1)
if (line.getFeeId() != null && payBillMapper.bindFeeLine(line.getFeeId(), line.getLineId()) != 1)
{
throw PaymentMesEnum.BMS_PAY_FEE_TAKEN.exception();
}
@@ -574,7 +573,6 @@ public class PayBillServiceImpl implements IPayBillService
}
}
PrcPayBillFee adjust = new PrcPayBillFee();
adjust.setFeeId(UUID.randomUUID().toString());
adjust.setBillId(line.getOrderBillId());
adjust.setPayBillId(source == null ? null : source.getPayBillId());
adjust.setFeeType("对账调整");
@@ -943,7 +941,7 @@ public class PayBillServiceImpl implements IPayBillService
* @param billId 计费订单ID
* @return 订单;对不上时返回 null
*/
private PayBillOrder findOrder(List<PayBillOrder> orders, String billId)
private PayBillOrder findOrder(List<PayBillOrder> orders, Long billId)
{
for (PayBillOrder order : orders)
{
@@ -1107,11 +1105,11 @@ public class PayBillServiceImpl implements IPayBillService
{
List<PrcPayBillFee> kept = new ArrayList<>();
Set<String> notes = new LinkedHashSet<>();
Map<String, String> cards = new HashMap<>();
Map<Long, String> cards = new HashMap<>();
for (PrcPayBillFee fee : fees)
{
PayBillOrder order = findOrder(orders, fee.getBillId());
String orderNo = order == null || order.getOrderNo() == null ? fee.getBillId() : order.getOrderNo();
String orderNo = order == null || order.getOrderNo() == null ? String.valueOf(fee.getBillId()) : order.getOrderNo();
String why = partyReason(fee, order, supplier, cards);
if (why == null)
{
@@ -1127,7 +1125,7 @@ public class PayBillServiceImpl implements IPayBillService
return kept;
}
private String partyReason(PrcPayBillFee fee, PayBillOrder order, BmsSupplier supplier, Map<String, String> cards)
private String partyReason(PrcPayBillFee fee, PayBillOrder order, BmsSupplier supplier, Map<Long, String> cards)
{
if (fee.getSettleSupplierId() != null)
{
@@ -1263,7 +1261,7 @@ public class PayBillServiceImpl implements IPayBillService
List<PayBillLine> lines = payBillMapper.selectLines(billId);
BigDecimal total = BigDecimal.ZERO;
BigDecimal supplier = BigDecimal.ZERO;
Set<String> orders = new HashSet<>();
Set<Long> orders = new HashSet<>();
for (PayBillLine line : lines)
{
BigDecimal amount = line.getAmount() == null ? BigDecimal.ZERO : line.getAmount();
@@ -84,20 +84,20 @@ public class PayOrderCostServiceImpl implements IPayOrderCostService
*/
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
public PayOrderCostResult generateIsolated(String billId)
public PayOrderCostResult generateIsolated(Long billId)
{
return generate(billId);
}
@Override
@Transactional(rollbackFor = Exception.class)
public PayOrderCostResult generate(String billId)
public PayOrderCostResult generate(Long billId)
{
if (billId == null || billId.isBlank())
if (billId == null)
{
throw PaymentMesEnum.BMS_PAY_PICK_ORDER.exception();
}
PrcOrderBill bill = orderBillMapper.selectPrcOrderBillById(billId.trim());
PrcOrderBill bill = orderBillMapper.selectPrcOrderBillById(billId);
if (bill == null)
{
throw PaymentMesEnum.BMS_PAY_ORDER_MISS.exception();
@@ -146,15 +146,15 @@ public class PayOrderCostServiceImpl implements IPayOrderCostService
}
@Override
public String cardSupplierName(String billId)
public String cardSupplierName(Long billId)
{
if (billId == null || billId.isBlank())
if (billId == null)
{
return "";
}
try
{
PrcOrderBill bill = orderBillMapper.selectPrcOrderBillById(billId.trim());
PrcOrderBill bill = orderBillMapper.selectPrcOrderBillById(billId);
if (bill == null)
{
return "";
@@ -529,7 +529,6 @@ public class PayOrderCostServiceImpl implements IPayOrderCostService
PrcPayBill row = existed == null ? new PrcPayBill() : existed;
if (existed == null)
{
row.setPayBillId(UUID.randomUUID().toString());
row.setBillId(bill.getBillId());
row.setCreateBy(operator);
}
@@ -559,7 +558,7 @@ public class PayOrderCostServiceImpl implements IPayOrderCostService
* @param payBillId 订单应付主表ID
* @param fees 本次算出的费用
*/
private void saveFees(String billId, String payBillId, List<PayCostLine> fees)
private void saveFees(Long billId, Long payBillId, List<PayCostLine> fees)
{
payBillFeeMapper.deleteByBillId(billId);
List<PrcPayBillFee> rows = new java.util.ArrayList<>();
@@ -567,7 +566,6 @@ public class PayOrderCostServiceImpl implements IPayOrderCostService
for (PayCostLine fee : fees)
{
PrcPayBillFee row = new PrcPayBillFee();
row.setFeeId(UUID.randomUUID().toString());
row.setBillId(billId);
row.setPayBillId(payBillId);
row.setFeeType(fee.getFeeType());
@@ -635,7 +635,7 @@ public class PrcBillingTaskServiceImpl implements IPrcBillingTaskService
{
bill = orderBillMapper.selectPrcOrderBillByOrderNo(orderNo.trim());
}
if (bill == null && StringUtils.isNotEmpty(task.getBillId()))
if (bill == null && task.getBillId() != null)
{
bill = orderBillMapper.selectPrcOrderBillById(task.getBillId());
}
@@ -645,7 +645,7 @@ public class PrcBillingTaskServiceImpl implements IPrcBillingTaskService
}
}
private void writeback(PrcBillingTask task, BillTaskSuccessStatus status, String billId,
private void writeback(PrcBillingTask task, BillTaskSuccessStatus status, Long billId,
String errorMessage, String failCode)
{
PrcBillingTask upd = new PrcBillingTask();
@@ -12,7 +12,6 @@ import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
import jakarta.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
@@ -297,7 +296,6 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
}
PrcIncomeBillFee refundFee = new PrcIncomeBillFee();
refundFee.setFeeId(UUID.randomUUID().toString());
refundFee.setBillId(bill.getBillId());
refundFee.setIncomeBillId(incomeBill == null ? null : incomeBill.getIncomeBillId());
String refundFeeType = FEE_TYPE_REFUND;
@@ -423,6 +421,19 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
return cleaned.isEmpty() ? null : cleaned;
}
/** 账单ID去空去重。 */
private List<Long> normalizeIdList(List<Long> ids)
{
if (ids == null || ids.isEmpty())
{
return null;
}
List<Long> cleaned = ids.stream().filter(java.util.Objects::nonNull).distinct()
.collect(Collectors.toList());
return cleaned.isEmpty() ? null : cleaned;
}
/** 单号筛选按去重后的订单号/运单号/转单号数量限制,避免过大的 IN 参数。 */
private List<String> normalizeOrderIdentifiers(List<String> identifiers)
{
@@ -435,14 +446,14 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
}
@Override
public TmsPriceQuoteResult getBill(String billId)
public TmsPriceQuoteResult getBill(Long billId)
{
if (billId == null)
{
throw new ServiceException(MessageUtils.message("price.bill.billIdRequired"));
}
PrcOrderBill query = new PrcOrderBill();
query.setBillId(billId.trim());
query.setBillId(billId);
// 走 selectBillList,复用销售员/结算员数据权限,避免越权查详情
List<PrcOrderBill> list = self.selectBillList(query);
if (list == null || list.isEmpty())
@@ -456,14 +467,14 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
@Override
public OrderBillFailReasonVo getBillingFailReason(String billId)
public OrderBillFailReasonVo getBillingFailReason(Long billId)
{
if (StringUtils.isEmpty(billId))
if (billId == null)
{
throw new ServiceException(MessageUtils.message("price.bill.billIdRequired"));
}
PrcOrderBill query = new PrcOrderBill();
query.setBillId(billId.trim());
query.setBillId(billId);
List<PrcOrderBill> list = self.selectBillList(query);
if (list == null || list.isEmpty())
{
@@ -687,7 +698,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
@Transactional(rollbackFor = Exception.class)
public TmsPriceQuoteResult addIncomeFee(AddIncomeBillFeeRequest request)
{
if (request == null || StringUtils.isEmpty(request.getBillId()))
if (request == null || request.getBillId() == null)
{
throw new ServiceException(MessageUtils.message("price.bill.billIdRequired"));
}
@@ -695,7 +706,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
{
throw new ServiceException(MessageUtils.message("price.bill.fee.scIdRequired"));
}
PrcOrderBill bill = orderBillMapper.selectPrcOrderBillById(request.getBillId().trim());
PrcOrderBill bill = orderBillMapper.selectPrcOrderBillById(request.getBillId());
if (bill == null)
{
throw new ServiceException(MessageUtils.message("price.bill.notFound"));
@@ -734,7 +745,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
: surcharge.getRoundMode());
existing.setRemark(request.getRemark());
existing.setManualFlag("1");
if (incomeBill != null && StringUtils.isEmpty(existing.getIncomeBillId()))
if (incomeBill != null && existing.getIncomeBillId() == null)
{
existing.setIncomeBillId(incomeBill.getIncomeBillId());
}
@@ -743,7 +754,6 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
else
{
PrcIncomeBillFee fee = new PrcIncomeBillFee();
fee.setFeeId(UUID.randomUUID().toString());
fee.setBillId(bill.getBillId());
fee.setIncomeBillId(incomeBill == null ? null : incomeBill.getIncomeBillId());
fee.setFeeType(feeType);
@@ -766,11 +776,11 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
@Transactional(rollbackFor = Exception.class)
public TmsPriceQuoteResult updateIncomeFee(UpdateIncomeBillFeeRequest request)
{
if (request == null || StringUtils.isEmpty(request.getFeeId()))
if (request == null || request.getFeeId() == null)
{
throw new ServiceException(MessageUtils.message("price.bill.fee.idRequired"));
}
PrcIncomeBillFee fee = requireEditableManualFee(request.getFeeId().trim());
PrcIncomeBillFee fee = requireEditableManualFee(request.getFeeId());
PrcOrderBill bill = orderBillMapper.selectPrcOrderBillById(fee.getBillId());
if (bill == null)
{
@@ -813,13 +823,13 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
@Override
@Transactional(rollbackFor = Exception.class)
public TmsPriceQuoteResult deleteIncomeFee(String feeId)
public TmsPriceQuoteResult deleteIncomeFee(Long feeId)
{
if (StringUtils.isEmpty(feeId))
if (feeId == null)
{
throw new ServiceException(MessageUtils.message("price.bill.fee.idRequired"));
}
PrcIncomeBillFee fee = requireEditableManualFee(feeId.trim());
PrcIncomeBillFee fee = requireEditableManualFee(feeId);
PrcOrderBill bill = orderBillMapper.selectPrcOrderBillById(fee.getBillId());
if (bill == null)
{
@@ -858,10 +868,10 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
throw new ServiceException(MessageUtils.message("price.bill.fee.batch.tooMany",
Integer.valueOf(BATCH_ADD_FEE_MAX)));
}
List<String> billIds = new ArrayList<String>();
List<Long> billIds = new ArrayList<Long>();
for (PrcOrderBill bill : bills)
{
if (bill != null && StringUtils.isNotEmpty(bill.getBillId()))
if (bill != null && bill.getBillId() != null)
{
billIds.add(bill.getBillId());
}
@@ -913,10 +923,10 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
throw new ServiceException(MessageUtils.message("price.bill.recalc.tooMany",
Integer.valueOf(RECALC_PRICE_MAX)));
}
List<String> billIds = new ArrayList<String>();
List<Long> billIds = new ArrayList<Long>();
for (PrcOrderBill bill : bills)
{
if (bill != null && StringUtils.isNotEmpty(bill.getBillId()))
if (bill != null && bill.getBillId() != null)
{
billIds.add(bill.getBillId());
}
@@ -944,14 +954,14 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
@Override
@Transactional(rollbackFor = Exception.class)
public void recalcBillPriceByBillId(String billId, String mode)
public void recalcBillPriceByBillId(Long billId, String mode)
{
boolean productMode = "PRODUCT".equals(normalizeRecalcMode(mode));
if (StringUtils.isEmpty(billId))
if (billId == null)
{
throw new ServiceException(MessageUtils.message("price.bill.billIdRequired"));
}
PrcOrderBill bill = orderBillMapper.selectPrcOrderBillById(billId.trim());
PrcOrderBill bill = orderBillMapper.selectPrcOrderBillById(billId);
if (bill == null)
{
throw new ServiceException(MessageUtils.message("price.bill.notFound"));
@@ -980,13 +990,13 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
* 其他情况走正常的 {@link #bill}。
*/
@Override
public TmsPriceQuoteResult rebillLocalByBillId(String billId)
public TmsPriceQuoteResult rebillLocalByBillId(Long billId)
{
if (StringUtils.isEmpty(billId))
if (billId == null)
{
throw new ServiceException(MessageUtils.message("price.bill.billIdRequired"));
}
PrcOrderBill bill = orderBillMapper.selectPrcOrderBillById(billId.trim());
PrcOrderBill bill = orderBillMapper.selectPrcOrderBillById(billId);
if (bill == null)
{
throw new ServiceException(MessageUtils.message("price.bill.notFound"));
@@ -1012,7 +1022,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
return refundLocalWithDbRetry(bill.getOrderNo().trim());
}
TmsPriceBillRequest req = buildBillRequestFromBill(bill);
return billLocalWithDbRetry(billId.trim(), req);
return billLocalWithDbRetry(billId, req);
}
/** order_status 为 9/10 或 refund_status=REFUNDED。 */
@@ -1029,9 +1039,9 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
return BillRefundStatus.REFUNDED.getCode().equalsIgnoreCase(bill.getRefundStatus());
}
private boolean hasRefundFeeLine(String billId)
private boolean hasRefundFeeLine(Long billId)
{
if (StringUtils.isEmpty(billId))
if (billId == null)
{
return false;
}
@@ -1050,7 +1060,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
return false;
}
private TmsPriceQuoteResult billLocalWithDbRetry(String billId, TmsPriceBillRequest billReq)
private TmsPriceQuoteResult billLocalWithDbRetry(Long billId, TmsPriceBillRequest billReq)
{
RuntimeException last = null;
for (int attempt = 1; attempt <= LOCAL_REBILL_DB_RETRY_MAX; attempt++)
@@ -1170,7 +1180,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
Integer.valueOf(LOCAL_REBILL_MAX)));
}
// 仅取 ID:大数据量任务避免加载完整的 prc_order_bill 行。
List<String> billIds = self.selectBillIdsForLocalRebill(query);
List<Long> billIds = self.selectBillIdsForLocalRebill(query);
if (billIds == null || billIds.isEmpty())
{
throw new ServiceException(MessageUtils.message("price.bill.recalc.noMatch"));
@@ -1292,15 +1302,15 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
@Override
@DataScope(deptAlias = "su", deptField = "dept_id", userAlias = "su", userField = "user_id", permission = "price:billing:bill")
public List<String> selectBillIdsForLocalRebill(PrcOrderBill query)
public List<Long> selectBillIdsForLocalRebill(PrcOrderBill query)
{
if (query == null)
{
return new ArrayList<String>();
return new ArrayList<Long>();
}
normalizeLocalRebillQuery(query);
List<String> ids = orderBillMapper.selectPrcOrderBillIds(query);
return ids == null ? new ArrayList<String>() : ids;
List<Long> ids = orderBillMapper.selectPrcOrderBillIds(query);
return ids == null ? new ArrayList<Long>() : ids;
}
@Override
@@ -1321,7 +1331,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
PrcOrderBill query = new PrcOrderBill();
if ("SELECTED".equals(scopeMode))
{
List<String> billIds = normalizeCodeList(request.getBillIds());
List<Long> billIds = normalizeIdList(request.getBillIds());
if (billIds == null || billIds.isEmpty())
{
throw new ServiceException(MessageUtils.message("price.bill.recalc.selectedRequired"));
@@ -1400,7 +1410,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
query.setTrackingNos(normalizeCodeList(query.getTrackingNos()));
query.setTransferNos(normalizeCodeList(query.getTransferNos()));
query.setOrderIdentifiers(normalizeOrderIdentifiers(query.getOrderIdentifiers()));
query.setBillIds(normalizeCodeList(query.getBillIds()));
query.setBillIds(normalizeIdList(query.getBillIds()));
}
private static String normalizeRecalcMode(String mode)
@@ -1421,7 +1431,6 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
if (insert)
{
incomeBill = new PrcIncomeBill();
incomeBill.setIncomeBillId(UUID.randomUUID().toString());
incomeBill.setBillId(bill.getBillId());
incomeBill.setCurrency(StringUtils.isEmpty(bill.getCurrency()) ? "CNY" : bill.getCurrency());
incomeBill.setSalesAmount(nz(bill.getIncomeTotal()));
@@ -1507,7 +1516,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
* scopeMode:SELECTED 使用 billIds;ALL 使用筛选条件(至少需要一个)。
* 仅传 orderStatuses 不算有效筛选(与导出规则一致)。
*/
private List<PrcOrderBill> resolveListScopedBills(String scopeModeRaw, List<String> billIdsRaw,
private List<PrcOrderBill> resolveListScopedBills(String scopeModeRaw, List<Long> billIdsRaw,
List<String> orderNosRaw, List<String> trackingNosRaw, List<String> transferNosRaw, List<String> orderIdentifiersRaw,
List<String> customerCodesRaw, List<String> productCodesRaw, String countryCodeRaw,
String creditArrearsStatusRaw, List<Integer> orderStatusesRaw, List<Integer> billingFailStatusesRaw,
@@ -1556,7 +1565,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
PrcOrderBill query = new PrcOrderBill();
if ("SELECTED".equals(scopeMode))
{
List<String> billIds = normalizeCodeList(billIdsRaw);
List<Long> billIds = normalizeIdList(billIdsRaw);
if (billIds == null || billIds.isEmpty())
{
throw new ServiceException(MessageUtils.message(msgSelected));
@@ -1624,7 +1633,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
return surcharge;
}
private PrcIncomeBillFee requireEditableManualFee(String feeId)
private PrcIncomeBillFee requireEditableManualFee(Long feeId)
{
PrcIncomeBillFee fee = incomeBillFeeMapper.selectByFeeId(feeId);
if (fee == null)
@@ -1832,13 +1841,13 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
*/
@Override
@Transactional(rollbackFor = Exception.class)
public TmsPriceQuoteResult updateCreditArrearsStatus(String billId)
public TmsPriceQuoteResult updateCreditArrearsStatus(Long billId)
{
if (StringUtils.isEmpty(billId))
if (billId == null)
{
throw new ServiceException(MessageUtils.message("price.bill.billIdRequired"));
}
PrcOrderBill bill = orderBillMapper.selectPrcOrderBillById(billId.trim());
PrcOrderBill bill = orderBillMapper.selectPrcOrderBillById(billId);
if (bill == null)
{
throw new ServiceException(MessageUtils.message("price.bill.notFound"));
@@ -1999,10 +2008,6 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
assertOrderBillEditable(existed);
BigDecimal previousIncome = existed == null ? BigDecimal.ZERO : nz(existed.getIncomeTotal());
PrcOrderBill bill = existed == null ? new PrcOrderBill() : existed;
if (existed == null)
{
bill.setBillId(UUID.randomUUID().toString());
}
bill.setBillKey(billKey);
bill.setOrderNo(orderNo);
// 上游表头覆盖(不做校验)。
@@ -2140,7 +2145,6 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
{
bill.setRefundStatus(BillRefundStatus.NONE.getCode());
}
result.setBillId(bill.getBillId());
result.setOrderNo(orderNo);
result.setTransferNo(bill.getTransferNo());
result.setCustomerId(bill.getCustomerId());
@@ -2175,6 +2179,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
// 应付暂不在范围内:跳过 prc_pay_bill_fee 的清理/写入。
// payBillFeeMapper.deleteByBillId(bill.getBillId());
}
result.setBillId(bill.getBillId());
PrcIncomeBill incomeBill = null;
if (storeIncome)
{
@@ -2236,9 +2241,9 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
* 丢弃在 uk_bill_fee_item(bill_id, fee_type, sc_id)上与保留的人工行冲突的自动费用行。
* 重算时以人工费用优先。
*/
private List<PrcIncomeBillFee> filterAutoFeesAgainstManual(String billId, List<PrcIncomeBillFee> autoFees)
private List<PrcIncomeBillFee> filterAutoFeesAgainstManual(Long billId, List<PrcIncomeBillFee> autoFees)
{
if (autoFees == null || autoFees.isEmpty() || StringUtils.isEmpty(billId))
if (autoFees == null || autoFees.isEmpty() || billId == null)
{
return autoFees == null ? new ArrayList<PrcIncomeBillFee>() : autoFees;
}
@@ -2439,7 +2444,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
private boolean isAlreadyInArBill(PrcOrderBill existed)
{
if (existed == null || StringUtils.isEmpty(existed.getBillId()))
if (existed == null || existed.getBillId() == null)
{
return false;
}
@@ -2462,7 +2467,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
return v == null ? BigDecimal.ZERO : v;
}
private List<PrcIncomeBillFee> toFeeRows(String billId, String incomeBillId, TmsPriceQuoteResult result)
private List<PrcIncomeBillFee> toFeeRows(Long billId, Long incomeBillId, TmsPriceQuoteResult result)
{
List<PrcIncomeBillFee> fees = new ArrayList<PrcIncomeBillFee>();
if (result.getFeeDetails() == null)
@@ -2472,7 +2477,6 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
for (TmsPriceQuoteFeeLine line : result.getFeeDetails())
{
PrcIncomeBillFee fee = new PrcIncomeBillFee();
fee.setFeeId(UUID.randomUUID().toString());
fee.setBillId(billId);
fee.setIncomeBillId(incomeBillId);
fee.setFeeType(line.getFeeType());
@@ -2494,7 +2498,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
/** 应收主表与订单计费一对一落库;销售价=套餐计费,产品价=产品目录价,红线价=红线目录价(含 REDLINE 附加费)。 */
private PrcIncomeBill persistIncomeBill(PrcOrderBill bill, TmsPriceQuoteResult result)
{
if (bill == null || StringUtils.isEmpty(bill.getBillId()))
if (bill == null || bill.getBillId() == null)
{
return null;
}
@@ -2503,7 +2507,6 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
PrcIncomeBill row = existed == null ? new PrcIncomeBill() : existed;
if (existed == null)
{
row.setIncomeBillId(UUID.randomUUID().toString());
row.setBillId(bill.getBillId());
row.setCreateBy(bill.getCreateBy());
}
@@ -2532,7 +2535,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
}
private List<PrcPayBillFee> toPayFeeRows(String billId, String payBillId, TmsPriceQuoteResult result)
private List<PrcPayBillFee> toPayFeeRows(Long billId, Long payBillId, TmsPriceQuoteResult result)
{
List<PrcPayBillFee> fees = new ArrayList<PrcPayBillFee>();
if (result.getPayFeeDetails() == null)
@@ -2542,7 +2545,6 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
for (TmsPriceQuoteFeeLine line : result.getPayFeeDetails())
{
PrcPayBillFee fee = new PrcPayBillFee();
fee.setFeeId(UUID.randomUUID().toString());
fee.setBillId(billId);
fee.setPayBillId(payBillId);
fee.setFeeType(line.getFeeType());
@@ -2560,7 +2562,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
/** 应付主表与订单计费一对一落库;product_amount 取产品目录价、redline_amount 取红线价;应付/成本价留空待接入真实成本源。 */
private PrcPayBill persistPayBill(PrcOrderBill bill, TmsPriceQuoteResult result)
{
if (bill == null || StringUtils.isEmpty(bill.getBillId()))
if (bill == null || bill.getBillId() == null)
{
return null;
}
@@ -2568,7 +2570,6 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
PrcPayBill row = existed == null ? new PrcPayBill() : existed;
if (existed == null)
{
row.setPayBillId(UUID.randomUUID().toString());
row.setBillId(bill.getBillId());
row.setCreateBy(bill.getCreateBy());
}
@@ -2655,7 +2656,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
/** 仅在存在上游 TAB_ORDER 行时写入 prc_order_bill_ext。 */
private void persistBillExt(PrcOrderBill bill, java.util.Map<String, Object> upstreamRow)
{
if (bill == null || StringUtils.isEmpty(bill.getBillId()))
if (bill == null || bill.getBillId() == null)
{
return;
}
@@ -2680,7 +2681,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
for (PrcIncomeBillFee fee : fees)
{
TmsPriceQuoteFeeLine line = new TmsPriceQuoteFeeLine();
line.setFeeId(fee.getFeeId());
line.setFeeId(fee.getFeeId() == null ? null : String.valueOf(fee.getFeeId()));
line.setFeeType(fee.getFeeType());
line.setFeeName(fee.getFeeName());
line.setScId(fee.getScId());
@@ -2792,26 +2793,26 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
@Override
@Transactional(rollbackFor = Exception.class)
public TmsPriceQuoteResult updateChargeWeight(String billId, BigDecimal chargeWeight)
public TmsPriceQuoteResult updateChargeWeight(Long billId, BigDecimal chargeWeight)
{
if (StringUtils.isEmpty(billId))
if (billId == null)
{
throw new ServiceException(MessageUtils.message("price.bill.billIdRequired"));
}
// 通过列表查询做数据范围校验
self.getBill(billId.trim());
return self.updateChargeWeightByBillId(billId.trim(), chargeWeight);
self.getBill(billId);
return self.updateChargeWeightByBillId(billId, chargeWeight);
}
@Override
@Transactional(rollbackFor = Exception.class)
public TmsPriceQuoteResult updateChargeWeightByBillId(String billId, BigDecimal chargeWeight)
public TmsPriceQuoteResult updateChargeWeightByBillId(Long billId, BigDecimal chargeWeight)
{
if (StringUtils.isEmpty(billId))
if (billId == null)
{
throw new ServiceException(MessageUtils.message("price.bill.billIdRequired"));
}
PrcOrderBill bill = orderBillMapper.selectPrcOrderBillById(billId.trim());
PrcOrderBill bill = orderBillMapper.selectPrcOrderBillById(billId);
if (bill == null)
{
throw new ServiceException(MessageUtils.message("price.bill.notFound"));
@@ -3058,7 +3059,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
return rows;
}
private TmsPriceQuoteResult toResult(String billId)
private TmsPriceQuoteResult toResult(Long billId)
{
PrcOrderBill bill = orderBillMapper.selectPrcOrderBillById(billId);
if (bill == null)
@@ -3220,7 +3221,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
{
return name;
}
if (StringUtils.isEmpty(bill.getBillId()) || orderBillExtMapper == null)
if (bill.getBillId() == null || orderBillExtMapper == null)
{
return StringUtils.isNotEmpty(name) ? name : null;
}
@@ -3264,7 +3265,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
*/
@Override
@Transactional(rollbackFor = Exception.class)
public String syncUpstreamOverwrite(java.util.Map<String, Object> upstreamRow)
public Long syncUpstreamOverwrite(java.util.Map<String, Object> upstreamRow)
{
if (upstreamRow == null || upstreamRow.isEmpty())
{
@@ -3312,7 +3313,6 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
PrcOrderBill bill = creating ? new PrcOrderBill() : existed;
if (creating)
{
bill.setBillId(UUID.randomUUID().toString());
bill.setArBillStatus(ArOrderBillStatus.UNBILLED.getCode());
bill.setRefundStatus(BillRefundStatus.NONE.getCode());
// 仅订单来源同步:在报价/计费执行前标记为未计费。
@@ -3430,7 +3430,6 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
PrcOrderBill bill = existed == null ? new PrcOrderBill() : existed;
if (existed == null)
{
bill.setBillId(UUID.randomUUID().toString());
bill.setArBillStatus(ArOrderBillStatus.UNBILLED.getCode());
bill.setRefundStatus(BillRefundStatus.NONE.getCode());
}
@@ -38,16 +38,16 @@ public class PrcPayBillFeeServiceImpl implements IPrcPayBillFeeService
{
return;
}
LinkedHashSet<String> billIds = new LinkedHashSet<>();
LinkedHashSet<Long> billIds = new LinkedHashSet<>();
for (int from = 0; from < fees.size(); from += BATCH_SIZE)
{
List<PrcPayBillFee> chunk = fees.subList(from, Math.min(from + BATCH_SIZE, fees.size()));
payBillFeeMapper.insertBatch(chunk);
for (PrcPayBillFee fee : chunk)
{
if (fee != null && fee.getBillId() != null && !fee.getBillId().isBlank())
if (fee != null && fee.getBillId() != null)
{
billIds.add(fee.getBillId().trim());
billIds.add(fee.getBillId());
}
}
}
@@ -55,25 +55,25 @@ public class PrcPayBillFeeServiceImpl implements IPrcPayBillFeeService
}
@Override
public void refreshTotals(List<String> billIds)
public void refreshTotals(List<Long> billIds)
{
if (billIds == null || billIds.isEmpty())
{
return;
}
LinkedHashSet<String> unique = new LinkedHashSet<>();
for (String billId : billIds)
LinkedHashSet<Long> unique = new LinkedHashSet<>();
for (Long billId : billIds)
{
if (billId != null && !billId.isBlank())
if (billId != null)
{
unique.add(billId.trim());
unique.add(billId);
}
}
List<String> ids = new ArrayList<>(unique);
List<Long> ids = new ArrayList<>(unique);
String operator = currentOperator();
for (int from = 0; from < ids.size(); from += BATCH_SIZE)
{
List<String> chunk = ids.subList(from, Math.min(from + BATCH_SIZE, ids.size()));
List<Long> chunk = ids.subList(from, Math.min(from + BATCH_SIZE, ids.size()));
payBillMapper.insertMissingPayBills(chunk, operator);
payBillFeeMapper.bindPayBillId(chunk);
payBillMapper.refreshPayTotal(chunk);
@@ -8,7 +8,6 @@ import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -95,7 +94,7 @@ public class SrvBillAirAllocServiceImpl implements ISrvBillAirAllocService
throw new ServiceException(fee.getBillCode() + " " + blankName(fee) + ":" + reason);
}
}
Map<String, String> payBillIds = payBillIds(orders);
Map<Long, Long> payBillIds = payBillIds(orders);
List<PrcPayBillFee> batch = new ArrayList<>(BATCH_SIZE);
int lineCount = 0;
for (SrvBillAirAllocFee fee : fees)
@@ -168,7 +167,7 @@ public class SrvBillAirAllocServiceImpl implements ISrvBillAirAllocService
Map<String, List<SrvBillAirAllocOrder>> grouped = new LinkedHashMap<>();
for (SrvBillAirAllocOrder order : allocMapper.selectOrders(codes))
{
if (order.getBillId() == null || order.getBillId().isBlank())
if (order.getBillId() == null)
{
continue;
}
@@ -177,9 +176,9 @@ public class SrvBillAirAllocServiceImpl implements ISrvBillAirAllocService
return grouped;
}
private Map<String, String> payBillIds(Map<String, List<SrvBillAirAllocOrder>> orders)
private Map<Long, Long> payBillIds(Map<String, List<SrvBillAirAllocOrder>> orders)
{
List<String> billIds = new ArrayList<>();
List<Long> billIds = new ArrayList<>();
for (List<SrvBillAirAllocOrder> rows : orders.values())
{
for (SrvBillAirAllocOrder order : rows)
@@ -187,10 +186,10 @@ public class SrvBillAirAllocServiceImpl implements ISrvBillAirAllocService
billIds.add(order.getBillId());
}
}
Map<String, String> payIds = new LinkedHashMap<>();
Map<Long, Long> payIds = new LinkedHashMap<>();
for (int from = 0; from < billIds.size(); from += BATCH_SIZE)
{
List<String> chunk = billIds.subList(from, Math.min(from + BATCH_SIZE, billIds.size()));
List<Long> chunk = billIds.subList(from, Math.min(from + BATCH_SIZE, billIds.size()));
for (PrcPayBill payBill : allocMapper.selectPayBills(chunk))
{
if (payBill.getBillId() != null && payBill.getPayBillId() != null)
@@ -231,10 +230,9 @@ public class SrvBillAirAllocServiceImpl implements ISrvBillAirAllocService
return "";
}
private PrcPayBillFee toOrderFee(SrvBillAirAllocFee fee, SrvBillAirAllocOrder order, BigDecimal amount, Map<String, String> payBillIds)
private PrcPayBillFee toOrderFee(SrvBillAirAllocFee fee, SrvBillAirAllocOrder order, BigDecimal amount, Map<Long, Long> payBillIds)
{
PrcPayBillFee row = new PrcPayBillFee();
row.setFeeId(UUID.randomUUID().toString());
row.setBillId(order.getBillId());
row.setPayBillId(payBillIds.get(order.getBillId()));
String name = blankName(fee);
@@ -409,7 +409,7 @@ public class SrvBillAirFeeServiceImpl implements ISrvBillAirFeeService
}
Operator operator = operator();
Date now = DateUtils.getNowDate();
List<String> affectedBills = payBillFeeMapper.selectBillIdsByLadingFee(feeId);
List<Long> affectedBills = payBillFeeMapper.selectBillIdsByLadingFee(feeId);
payBillFeeMapper.markLadingFeeDeleted(feeId);
payBillFeeService.refreshTotals(affectedBills);
if (feeMapper.voidFee(feeId, code, operator.account, now) != 1)
@@ -34,7 +34,7 @@ public class PrcBatchAddIncomeFeeAsyncRunner
private RedisCache redisCache;
@Async("threadPoolTaskExecutor")
public void run(String taskId, List<String> billIds, Long scId, String feeType, BigDecimal amount,
public void run(String taskId, List<Long> billIds, Long scId, String feeType, BigDecimal amount,
String currency, String remark)
{
int total = billIds == null ? 0 : billIds.size();
@@ -51,7 +51,7 @@ public class PrcBatchAddIncomeFeeAsyncRunner
}
for (int i = 0; i < total; i++)
{
String billId = billIds.get(i);
Long billId = billIds.get(i);
try
{
AddIncomeBillFeeRequest req = new AddIncomeBillFeeRequest();
@@ -200,7 +200,7 @@ public class PrcChargeWeightImportAsyncRunner
public static class ChargeWeightImportWorkItem implements java.io.Serializable
{
private static final long serialVersionUID = 1L;
private String billId;
private Long billId;
private String orderNo;
private BigDecimal chargeWeight;
@@ -208,19 +208,19 @@ public class PrcChargeWeightImportAsyncRunner
{
}
public ChargeWeightImportWorkItem(String billId, String orderNo, BigDecimal chargeWeight)
public ChargeWeightImportWorkItem(Long billId, String orderNo, BigDecimal chargeWeight)
{
this.billId = billId;
this.orderNo = orderNo;
this.chargeWeight = chargeWeight;
}
public String getBillId()
public Long getBillId()
{
return billId;
}
public void setBillId(String billId)
public void setBillId(Long billId)
{
this.billId = billId;
}
@@ -74,13 +74,13 @@ public class PrcOrderBillLocalRebillAsyncRunner
private PrcOrderBillMapper orderBillMapper;
@Async("threadPoolTaskExecutor")
public void run(String taskId, List<String> billIds)
public void run(String taskId, List<Long> billIds)
{
run(taskId, billIds, null);
}
@Async("threadPoolTaskExecutor")
public void run(String taskId, List<String> billIds, LocalRebillRequest request)
public void run(String taskId, List<Long> billIds, LocalRebillRequest request)
{
int total = billIds == null ? 0 : billIds.size();
AtomicInteger success = new AtomicInteger(0);
@@ -110,7 +110,7 @@ public class PrcOrderBillLocalRebillAsyncRunner
return;
}
// 连续拉取:N 个工作线程取下一个 billId —— 没有分页屏障式空等。
final List<String> ids = billIds;
final List<Long> ids = billIds;
List<Callable<Boolean>> workers = new ArrayList<Callable<Boolean>>(threads);
for (int w = 0; w < threads; w++)
{
@@ -122,7 +122,7 @@ public class PrcOrderBillLocalRebillAsyncRunner
{
return Boolean.TRUE;
}
String one = ids.get(i);
Long one = ids.get(i);
try
{
TmsPriceQuoteResult result = orderBillService.rebillLocalByBillId(one);
@@ -269,12 +269,12 @@ public class PrcOrderBillLocalRebillAsyncRunner
TabOrderSyncEsLog.save(billSearchStore, taskId, "LOCAL_REBILL_DONE", request, resp, status, errorMessage);
}
private void collectFailDetail(List<Map<String, Object>> failDetails, String billId, Exception e)
private void collectFailDetail(List<Map<String, Object>> failDetails, Long billId, Exception e)
{
collectFailDetail(failDetails, billId, errorMessage(e));
}
private void collectFailDetail(List<Map<String, Object>> failDetails, String billId, String message)
private void collectFailDetail(List<Map<String, Object>> failDetails, Long billId, String message)
{
if (failDetails == null)
{
@@ -293,8 +293,8 @@ public class PrcOrderBillLocalRebillAsyncRunner
String trackingNo = null;
try
{
PrcOrderBill bill = orderBillMapper == null || StringUtils.isEmpty(billId)
? null : orderBillMapper.selectPrcOrderBillById(billId.trim());
PrcOrderBill bill = orderBillMapper == null || billId == null
? null : orderBillMapper.selectPrcOrderBillById(billId);
if (bill != null)
{
orderNo = bill.getOrderNo();
@@ -475,19 +475,19 @@ public class PrcOrderBillLocalRebillAsyncRunner
}
/** UI 提示优先用 transferNo;没有则退回 orderNo,再退回 billId。 */
private String failTransferLabel(String billId, String transferNoHint)
private String failTransferLabel(Long billId, String transferNoHint)
{
if (StringUtils.isNotEmpty(transferNoHint))
{
return transferNoHint.trim();
}
if (StringUtils.isEmpty(billId) || orderBillMapper == null)
if (billId == null || orderBillMapper == null)
{
return billId;
return billId == null ? null : String.valueOf(billId);
}
try
{
PrcOrderBill bill = orderBillMapper.selectPrcOrderBillById(billId.trim());
PrcOrderBill bill = orderBillMapper.selectPrcOrderBillById(billId);
if (bill != null)
{
if (StringUtils.isNotEmpty(bill.getTransferNo()))
@@ -504,7 +504,7 @@ public class PrcOrderBillLocalRebillAsyncRunner
{
// 提示标签尽力而为
}
return billId;
return billId == null ? null : String.valueOf(billId);
}
private static String softFailMessage(TmsPriceQuoteResult result)
@@ -29,7 +29,7 @@ public class PrcRecalcBillPriceAsyncRunner
private RedisCache redisCache;
@Async("threadPoolTaskExecutor")
public void run(String taskId, String mode, List<String> billIds)
public void run(String taskId, String mode, List<Long> billIds)
{
int total = billIds == null ? 0 : billIds.size();
int success = 0;
@@ -45,7 +45,7 @@ public class PrcRecalcBillPriceAsyncRunner
}
for (int i = 0; i < total; i++)
{
String billId = billIds.get(i);
Long billId = billIds.get(i);
try
{
orderBillService.recalcBillPriceByBillId(billId, mode);
@@ -94,7 +94,7 @@ public class PrcRecalcBillPriceAsyncRunner
return redisCache.getCacheObject(CACHE_KEY_PREFIX + taskId);
}
private static void appendFail(StringBuilder failTips, String billId, Exception e)
private static void appendFail(StringBuilder failTips, Long billId, Exception e)
{
if (failTips.length() >= 800)
{
@@ -250,7 +250,7 @@ public class TabOrderSyncAsyncRunner
item.put("transferOrderId", vo == null ? null : vo.getTransferOrderId());
try
{
String billId = overwriteOne(one);
Long billId = overwriteOne(one);
item.put("successStatus", "SUCCESS");
item.put("billId", billId);
ok.incrementAndGet();
@@ -317,7 +317,7 @@ public class TabOrderSyncAsyncRunner
}
/** 解析出 Oracle 行后覆盖本地账单及其扩展信息(不计费)。 */
private String overwriteOne(com.bms.price.oracle.TabOrderRow row)
private Long overwriteOne(com.bms.price.oracle.TabOrderRow row)
{
Map<String, Object> raw = row == null ? null : row.getRaw();
TabOrderMonitorVo vo = row == null ? null : row.getVo();
@@ -17,7 +17,7 @@ public class ArBillDetail implements Serializable {
private Long detailId;
private Long arBillId;
private String prcOrderBillId;
private Long prcOrderBillId;
private Integer detailNo;
private String orderNo;
private String trackingNo;
@@ -16,7 +16,7 @@ public class ArBillDetailFee implements Serializable {
private Long detailFeeId;
private Long detailId;
private String prcIncomeBillFeeId;
private Long prcIncomeBillFeeId;
private Integer feeNo;
private String feeType;
private String feeName;
@@ -42,7 +42,7 @@ public class ArBillGenerateTask implements Serializable {
/**
* 按 bill_id 字典序处理的游标。
*/
private String lastSourceBillId;
private Long lastSourceBillId;
/**
* 待处理总数;全选模式统计完成前使用 -1。
*/
@@ -29,11 +29,11 @@ public class ArBillGenerateRequest
/** 截止日筛选字段:BIZ_DATE=计费时间,PICKUP_DATE=收货时间;历史任务默认计费时间。 */
private String dateType = "BIZ_DATE";
/** 手动模式选中的来源订单 ID;全选模式为空。 */
private List<String> sourceBillIds;
private List<Long> sourceBillIds;
/** 选择模式:EXPLICIT 手动选择,ALL_MATCHED 全选查询结果。 */
private String selectionMode = ArBillSelectionMode.EXPLICIT.getCode();
/** 全选模式中用户明确排除的来源订单 ID。 */
private List<String> excludedSourceBillIds;
private List<Long> excludedSourceBillIds;
/** 全选模式下按订单号、运单号或转单号排除;后台生成任务按批次应用该条件。 */
private String excludedOrderOrTrackingNo;
@JsonFormat(pattern = "yyyy-MM-dd")
@@ -14,7 +14,7 @@ public interface ArBillDetailMapper {
List<ArBillDetail> selectByBillId(Long arBillId);
List<ArBillDetail> selectByBillIdAndSourceIds(@Param("arBillId") Long arBillId,
@Param("sourceBillIds") List<String> sourceBillIds);
@Param("sourceBillIds") List<Long> sourceBillIds);
List<ArBillDetail> selectExportPage(@Param("arBillId") Long arBillId,
@Param("lastDetailNo") Integer lastDetailNo, @Param("pageSize") Integer pageSize);
@@ -27,7 +27,7 @@ public interface ArBillGenerateTaskMapper {
int updateTotalCount(@Param("taskId") Long taskId, @Param("totalCount") Integer totalCount);
int updateProgress(@Param("taskId") Long taskId, @Param("lastSourceBillId") String lastSourceBillId,
int updateProgress(@Param("taskId") Long taskId, @Param("lastSourceBillId") Long lastSourceBillId,
@Param("processedCount") Integer processedCount, @Param("successCount") Integer successCount,
@Param("totalAmount") java.math.BigDecimal totalAmount, @Param("heartbeatTime") Date heartbeatTime);
@@ -6,7 +6,7 @@ import com.bms.receivable.security.ArBillRowScope;
import com.bms.customer.customerinfo.domain.BmsCustomerOption;
public interface ArBillScopeMapper {
int countCustomerSourceBills(@Param("customerId") Long customerId, @Param("sourceIds") List<String> sourceIds);
int countCustomerSourceBills(@Param("customerId") Long customerId, @Param("sourceIds") List<Long> sourceIds);
int countAccessibleBill(@Param("arBillId") Long arBillId, @Param("scope") ArBillRowScope scope);
@@ -86,7 +86,7 @@ public class ArBillScopeResolver {
return mapper.selectCustomerOptions(values, resolve());
}
public void requireCustomerSourceBills(Long customerId, List<String> sourceIds) {
public void requireCustomerSourceBills(Long customerId, List<Long> sourceIds) {
if (!sourceIds.isEmpty() && withoutPagination(() -> mapper.countCustomerSourceBills(customerId, sourceIds)) != sourceIds.size()) {
throw new ServiceException("所选订单不存在或不属于当前客户");
}
@@ -419,8 +419,8 @@ public class ArBillServiceImpl implements IArBillService {
}
String selectionMode = selectionModeEnum.getCode();
boolean allMatched = selectionModeEnum == ArBillSelectionMode.ALL_MATCHED;
List<String> sourceBillIds = normalizeSourceBillIds(request.getSourceBillIds());
List<String> excludedSourceBillIds = normalizeSourceBillIds(request.getExcludedSourceBillIds());
List<Long> sourceBillIds = normalizeSourceBillIds(request.getSourceBillIds());
List<Long> excludedSourceBillIds = normalizeSourceBillIds(request.getExcludedSourceBillIds());
if (!allMatched && sourceBillIds.isEmpty()) {
throw failure(null, ArLogObjectType.BILL, "", ArLogOperationType.GENERATE,
null, "请至少选择一条有效订单", operator, requestId);
@@ -638,8 +638,8 @@ public class ArBillServiceImpl implements IArBillService {
log.info("开始执行应收账单生成任务,taskId={}, arBillId={}, selectionMode={}",
taskId, task.getArBillId(), task.getSelectionMode());
ArBillGenerateRequest request = JSON.parseObject(task.getRequestPayload(), ArBillGenerateRequest.class);
List<String> sourceBillIds = normalizeSourceBillIds(request.getSourceBillIds());
List<String> excludedSourceBillIds = normalizeSourceBillIds(request.getExcludedSourceBillIds());
List<Long> sourceBillIds = normalizeSourceBillIds(request.getSourceBillIds());
List<Long> excludedSourceBillIds = normalizeSourceBillIds(request.getExcludedSourceBillIds());
List<String> excludedOrderIdentifiers = ArBillSelectionMode.ALL_MATCHED.getCode().equals(task.getSelectionMode())
? normalizeOrderIdentifiers(request.getExcludedOrderOrTrackingNo()) : new ArrayList<>();
TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
@@ -766,13 +766,13 @@ public class ArBillServiceImpl implements IArBillService {
* 每批最多 GENERATE_PAGE_SIZE 条,成功后原子更新任务进度。
*/
private GenerateBatchResult processGenerateBatch(ArBillGenerateTask task, ArBillGenerateRequest request,
List<String> sourceBillIds, List<String> excludedSourceBillIds,
List<Long> sourceBillIds, List<Long> excludedSourceBillIds,
List<String> excludedOrderIdentifiers) {
ArBillSelectionMode selectionMode = ArBillSelectionMode.of(task.getSelectionMode());
if (selectionMode == null) {
throw new ServiceException("账单生成任务的订单选择模式无效");
}
List<String> explicitIds = selectionMode == ArBillSelectionMode.EXPLICIT
List<Long> explicitIds = selectionMode == ArBillSelectionMode.EXPLICIT
? sourceBillIds : null;
List<PrcOrderBill> sources = sourceBillMapper.selectPrcOrderBillByCustomerPeriodCursor(
request.getCustomerId(), request.getCustomerCode(),
@@ -792,7 +792,7 @@ public class ArBillServiceImpl implements IArBillService {
if (bill == null) {
throw new ServiceException("应收账单不存在");
}
List<String> currentSourceBillIds = new ArrayList<>();
List<Long> currentSourceBillIds = new ArrayList<>();
for (PrcOrderBill source : sources) {
currentSourceBillIds.add(source.getBillId());
if (source.getCurrency() != null && !bill.getCurrency().equalsIgnoreCase(source.getCurrency())) {
@@ -800,7 +800,7 @@ public class ArBillServiceImpl implements IArBillService {
}
}
Map<String, PrcIncomeBill> sourceIncomeBillsByBillId = new HashMap<>();
Map<Long, PrcIncomeBill> sourceIncomeBillsByBillId = new HashMap<>();
List<PrcIncomeBill> sourceIncomeBills = sourceIncomeBillMapper.selectByBillIds(currentSourceBillIds);
if (sourceIncomeBills != null) {
for (PrcIncomeBill sourceIncomeBill : sourceIncomeBills) {
@@ -814,8 +814,8 @@ public class ArBillServiceImpl implements IArBillService {
if (sourceFees == null) {
sourceFees = new ArrayList<>();
}
Map<String, Integer> sourceFeeCounts = new HashMap<>();
List<String> sourceFeeIds = new ArrayList<>(sourceFees.size());
Map<Long, Integer> sourceFeeCounts = new HashMap<>();
List<Long> sourceFeeIds = new ArrayList<>(sourceFees.size());
for (PrcIncomeBillFee sourceFee : sourceFees) {
sourceFeeCounts.merge(sourceFee.getBillId(), 1, Integer::sum);
sourceFeeIds.add(sourceFee.getFeeId());
@@ -853,7 +853,7 @@ public class ArBillServiceImpl implements IArBillService {
// 失败订单先落快照,再汇总占用状态,避免无费用订单被错误恢复为 UNBILLED。
sourceBillMapper.refreshArBillStatusByBillIds(currentSourceBillIds);
Map<String, ArBillDetail> detailsBySourceBill = new HashMap<>();
Map<Long, ArBillDetail> detailsBySourceBill = new HashMap<>();
for (ArBillDetail detail : detailMapper.selectByBillIdAndSourceIds(bill.getArBillId(), currentSourceBillIds)) {
detailsBySourceBill.put(detail.getPrcOrderBillId(), detail);
}
@@ -862,7 +862,7 @@ public class ArBillServiceImpl implements IArBillService {
}
List<ArBillDetailFee> detailFees = new ArrayList<>(sourceFees == null ? 0 : sourceFees.size());
Map<String, Integer> feeNumbers = new HashMap<>();
Map<Long, Integer> feeNumbers = new HashMap<>();
if (sourceFees != null) {
for (PrcIncomeBillFee sourceFee : sourceFees) {
ArBillDetail detail = detailsBySourceBill.get(sourceFee.getBillId());
@@ -886,7 +886,7 @@ public class ArBillServiceImpl implements IArBillService {
Date periodStart = earliestDate(sources, request.getDateType());
billMapper.updateArBillProgress(bill.getArBillId(), processedCount, totalAmount, totalAmount,
periodStart, task.getCreateBy());
String lastSourceBillId = sources.get(sources.size() - 1).getBillId();
Long lastSourceBillId = sources.get(sources.size() - 1).getBillId();
if (generateTaskMapper.updateProgress(task.getTaskId(), lastSourceBillId, processedCount,
processedCount, totalAmount, new Date()) != 1) {
throw new ServiceException("账单生成任务状态已发生变化,请稍后重试");
@@ -2312,12 +2312,12 @@ public class ArBillServiceImpl implements IArBillService {
return type.getCode();
}
private List<String> normalizeSourceBillIds(List<String> sourceBillIds) {
LinkedHashSet<String> uniqueIds = new LinkedHashSet<>();
private List<Long> normalizeSourceBillIds(List<Long> sourceBillIds) {
LinkedHashSet<Long> uniqueIds = new LinkedHashSet<>();
if (sourceBillIds != null) {
for (String billId : sourceBillIds) {
if (!StringUtils.isEmpty(billId) && billId.trim().length() <= 36) {
uniqueIds.add(billId.trim());
for (Long billId : sourceBillIds) {
if (billId != null) {
uniqueIds.add(billId);
}
}
}
@@ -70,7 +70,7 @@
select 1 from pay_bill_line l
inner join pay_bill b on b.bill_id = l.bill_id
where l.order_bill_id = o.bill_id
and (l.fee_id is null or l.fee_id = '')
and l.fee_id is null
and b.status not in ('VOID', 'RED')
)) as unbilledCount,
(select b.bill_no from pay_bill_line l
@@ -240,7 +240,7 @@
select 1 from pay_bill_line l
inner join pay_bill b on b.bill_id = l.bill_id
where l.order_bill_id = f.bill_id
and (l.fee_id is null or l.fee_id = '')
and l.fee_id is null
and b.status not in ('VOID', 'RED')
)
order by f.bill_id, f.fee_id
@@ -22,7 +22,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="createTime" column="create_time" />
</resultMap>
<select id="selectByBillId" parameterType="String" resultMap="PrcIncomeBillFeeResult">
<select id="selectByBillId" parameterType="Long" resultMap="PrcIncomeBillFeeResult">
select fee_id, bill_id, income_bill_id, fee_type, fee_name, sc_id, amount, product_amount, redline_amount, currency, round_mode, remark,
ar_bill_status, manual_flag, create_time
from prc_income_bill_fee
@@ -53,7 +53,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
order by bill_id, field(fee_type, 'BASIC_FREIGHT', 'REGISTRATION_FEE', 'SURCHARGE', 'REFUND'), fee_id
</select>
<select id="selectByFeeId" parameterType="String" resultMap="PrcIncomeBillFeeResult">
<select id="selectByFeeId" parameterType="Long" resultMap="PrcIncomeBillFeeResult">
select fee_id, bill_id, income_bill_id, fee_type, fee_name, sc_id, amount, product_amount, redline_amount, currency, round_mode, remark,
ar_bill_status, manual_flag, create_time
from prc_income_bill_fee
@@ -78,23 +78,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
and fee_type = #{feeType}
</select>
<insert id="insertPrcIncomeBillFee" parameterType="PrcIncomeBillFee">
<insert id="insertPrcIncomeBillFee" parameterType="PrcIncomeBillFee" useGeneratedKeys="true" keyProperty="feeId">
insert into prc_income_bill_fee (
fee_id, bill_id, income_bill_id, fee_type, fee_name, sc_id, amount, product_amount, redline_amount, currency, round_mode, remark,
bill_id, income_bill_id, fee_type, fee_name, sc_id, amount, product_amount, redline_amount, currency, round_mode, remark,
ar_bill_status, manual_flag, create_time
) values (
#{feeId}, #{billId}, #{incomeBillId}, #{feeType}, #{feeName}, #{scId}, #{amount}, #{productAmount}, #{redlineAmount}, #{currency}, #{roundMode}, #{remark},
#{billId}, #{incomeBillId}, #{feeType}, #{feeName}, #{scId}, #{amount}, #{productAmount}, #{redlineAmount}, #{currency}, #{roundMode}, #{remark},
#{arBillStatus}, #{manualFlag}, sysdate()
)
</insert>
<insert id="insertBatch" parameterType="java.util.List">
<insert id="insertBatch" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="feeId">
insert into prc_income_bill_fee (
fee_id, bill_id, income_bill_id, fee_type, fee_name, sc_id, amount, product_amount, redline_amount, currency, round_mode, remark,
bill_id, income_bill_id, fee_type, fee_name, sc_id, amount, product_amount, redline_amount, currency, round_mode, remark,
ar_bill_status, manual_flag, create_time
) values
<foreach collection="list" item="item" separator=",">
(#{item.feeId}, #{item.billId}, #{item.incomeBillId}, #{item.feeType}, #{item.feeName}, #{item.scId}, #{item.amount},
(#{item.billId}, #{item.incomeBillId}, #{item.feeType}, #{item.feeName}, #{item.scId}, #{item.amount},
#{item.productAmount}, #{item.redlineAmount},
#{item.currency}, #{item.roundMode}, #{item.remark},
#{item.arBillStatus}, #{item.manualFlag}, sysdate())
@@ -173,15 +173,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
)
</update>
<delete id="deleteByFeeId" parameterType="String">
<delete id="deleteByFeeId" parameterType="Long">
delete from prc_income_bill_fee where fee_id = #{feeId}
</delete>
<delete id="deleteByBillId" parameterType="String">
<delete id="deleteByBillId" parameterType="Long">
delete from prc_income_bill_fee where bill_id = #{billId}
</delete>
<delete id="deleteAutoFeesByBillId" parameterType="String">
<delete id="deleteAutoFeesByBillId" parameterType="Long">
delete from prc_income_bill_fee
where bill_id = #{billId}
and (manual_flag is null or manual_flag &lt;&gt; '1')
@@ -31,7 +31,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
from prc_income_bill
</sql>
<select id="selectByBillId" parameterType="String" resultMap="PrcIncomeBillResult">
<select id="selectByBillId" parameterType="Long" resultMap="PrcIncomeBillResult">
<include refid="selectPrcIncomeBillVo"/>
where bill_id = #{billId}
</select>
@@ -44,19 +44,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</foreach>
</select>
<select id="selectByIncomeBillId" parameterType="String" resultMap="PrcIncomeBillResult">
<select id="selectByIncomeBillId" parameterType="Long" resultMap="PrcIncomeBillResult">
<include refid="selectPrcIncomeBillVo"/>
where income_bill_id = #{incomeBillId}
</select>
<insert id="insertPrcIncomeBill" parameterType="PrcIncomeBill">
<insert id="insertPrcIncomeBill" parameterType="PrcIncomeBill" useGeneratedKeys="true" keyProperty="incomeBillId">
insert into prc_income_bill (
income_bill_id, bill_id, currency, product_amount, redline_amount,
bill_id, currency, product_amount, redline_amount,
sales_amount, income_total, refund_status,
belong_saler, belong_saler_code, settlement_man, settlement_man_code,
create_by, create_time
) values (
#{incomeBillId}, #{billId}, #{currency}, #{productAmount}, #{redlineAmount},
#{billId}, #{currency}, #{productAmount}, #{redlineAmount},
#{salesAmount}, #{incomeTotal}, #{refundStatus},
#{belongSaler}, #{belongSalerCode}, #{settlementMan}, #{settlementManCode},
#{createBy}, sysdate()
@@ -80,14 +80,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where bill_id = #{billId}
</update>
<insert id="upsertPrcIncomeBill" parameterType="PrcIncomeBill">
<insert id="upsertPrcIncomeBill" parameterType="PrcIncomeBill" useGeneratedKeys="true" keyProperty="incomeBillId">
insert into prc_income_bill (
income_bill_id, bill_id, currency, product_amount, redline_amount,
bill_id, currency, product_amount, redline_amount,
sales_amount, income_total, refund_status,
belong_saler, belong_saler_code, settlement_man, settlement_man_code,
create_by, create_time
) values (
#{incomeBillId}, #{billId}, #{currency}, #{productAmount}, #{redlineAmount},
#{billId}, #{currency}, #{productAmount}, #{redlineAmount},
#{salesAmount}, #{incomeTotal}, #{refundStatus},
#{belongSaler}, #{belongSalerCode}, #{settlementMan}, #{settlementManCode},
#{createBy}, sysdate()
@@ -107,7 +107,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
update_time = sysdate()
</insert>
<delete id="deleteByBillId" parameterType="String">
<delete id="deleteByBillId" parameterType="Long">
delete from prc_income_bill where bill_id = #{billId}
</delete>
</mapper>
@@ -189,7 +189,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
from prc_order_bill_ext
</sql>
<select id="selectByBillId" parameterType="String" resultMap="PrcOrderBillExtResult">
<select id="selectByBillId" parameterType="Long" resultMap="PrcOrderBillExtResult">
<include refid="selectPrcOrderBillExtVo"/>
where bill_id = #{billId}
</select>
@@ -157,7 +157,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
limit 2
</select>
<select id="selectPrcOrderBillById" parameterType="String" resultMap="PrcOrderBillResult">
<select id="selectPrcOrderBillById" parameterType="Long" resultMap="PrcOrderBillResult">
<include refid="selectPrcOrderBillVo"/>
where bill_id = #{billId}
</select>
@@ -578,7 +578,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</select>
<!-- Id-only for large local rebill (avoid loading full rows into memory). -->
<select id="selectPrcOrderBillIds" parameterType="PrcOrderBill" resultType="string">
<select id="selectPrcOrderBillIds" parameterType="PrcOrderBill" resultType="java.lang.Long">
select p.bill_id
from prc_order_bill p
<where>
@@ -785,7 +785,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectPrcOrderBillByCustomerPeriodCursor" resultMap="PrcOrderBillArSourceResult">
<include refid="selectArBillSourceVo"/>
<include refid="customerPeriodConditions"/>
<if test="lastSourceBillId != null and lastSourceBillId != ''">
<if test="lastSourceBillId != null">
and p.bill_id &gt; #{lastSourceBillId}
</if>
order by p.bill_id
@@ -829,9 +829,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</choose>
</select>
<insert id="insertPrcOrderBill" parameterType="PrcOrderBill">
<insert id="insertPrcOrderBill" parameterType="PrcOrderBill" useGeneratedKeys="true" keyProperty="billId">
insert into prc_order_bill (
bill_id, bill_key, order_no, tracking_no, transfer_no,
bill_key, order_no, tracking_no, transfer_no,
belong_saler, belong_saler_code, settlement_man, settlement_man_code, service_man, service_man_code,
customer_id, customer_code, customer_name,
pieces, actual_weight, receive_weight, volume, volume_weight, pkg_length, pkg_width, pkg_height,
@@ -845,7 +845,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
customer_active_status, credit_arrears_status, refund_status, billing_fail_status, error_message, round_mode,
create_time
) values (
#{billId}, #{billKey}, #{orderNo}, #{trackingNo}, #{transferNo},
#{billKey}, #{orderNo}, #{trackingNo}, #{transferNo},
#{belongSaler}, #{belongSalerCode}, #{settlementMan}, #{settlementManCode}, #{serviceMan}, #{serviceManCode},
#{customerId}, #{customerCode}, #{customerName},
#{pieces}, #{actualWeight}, #{receiveWeight}, #{volume}, #{volumeWeight}, #{pkgLength}, #{pkgWidth}, #{pkgHeight},
@@ -22,7 +22,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="createTime" column="create_time" />
</resultMap>
<select id="selectByBillId" parameterType="String" resultMap="PrcPayBillFeeResult">
<select id="selectByBillId" parameterType="Long" resultMap="PrcPayBillFeeResult">
select fee_id, bill_id, pay_bill_id, fee_type, fee_name, sc_id, fee_level, amount, currency, round_mode, remark,
fee_source, source_id, is_deleted, create_time
from prc_pay_bill_fee
@@ -31,23 +31,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
order by field(fee_type, 'BASIC_FREIGHT', 'REGISTRATION_FEE', 'SURCHARGE', 'REFUND'), fee_id
</select>
<insert id="insertPrcPayBillFee" parameterType="PrcPayBillFee">
<insert id="insertPrcPayBillFee" parameterType="PrcPayBillFee" useGeneratedKeys="true" keyProperty="feeId">
insert into prc_pay_bill_fee (
fee_id, bill_id, pay_bill_id, fee_type, fee_name, sc_id, fee_level, amount, currency, round_mode, remark,
bill_id, pay_bill_id, fee_type, fee_name, sc_id, fee_level, amount, currency, round_mode, remark,
fee_source, source_id, is_deleted, create_time
) values (
#{feeId}, #{billId}, #{payBillId}, #{feeType}, #{feeName}, #{scId}, #{feeLevel}, #{amount}, #{currency}, #{roundMode}, #{remark},
#{billId}, #{payBillId}, #{feeType}, #{feeName}, #{scId}, #{feeLevel}, #{amount}, #{currency}, #{roundMode}, #{remark},
ifnull(#{feeSource}, 'CALC'), #{sourceId}, ifnull(#{isDeleted}, '0'), sysdate()
)
</insert>
<insert id="insertBatch" parameterType="java.util.List">
<insert id="insertBatch" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="feeId">
insert into prc_pay_bill_fee (
fee_id, bill_id, pay_bill_id, fee_type, fee_name, sc_id, fee_level, amount, currency, round_mode, remark,
bill_id, pay_bill_id, fee_type, fee_name, sc_id, fee_level, amount, currency, round_mode, remark,
fee_source, source_id, is_deleted, create_time
) values
<foreach collection="list" item="item" separator=",">
(#{item.feeId}, #{item.billId}, #{item.payBillId}, #{item.feeType}, #{item.feeName}, #{item.scId}, #{item.feeLevel},
(#{item.billId}, #{item.payBillId}, #{item.feeType}, #{item.feeName}, #{item.scId}, #{item.feeLevel},
#{item.amount}, #{item.currency}, #{item.roundMode}, #{item.remark}, ifnull(#{item.feeSource}, 'CALC'),
#{item.sourceId}, ifnull(#{item.isDeleted}, '0'), sysdate())
</foreach>
@@ -69,19 +69,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
update prc_pay_bill_fee f
inner join prc_pay_bill b on b.bill_id = f.bill_id
set f.pay_bill_id = b.pay_bill_id
where (f.pay_bill_id is null or f.pay_bill_id = '')
where f.pay_bill_id is null
and f.bill_id in
<foreach collection="billIds" item="billId" open="(" separator="," close=")">#{billId}</foreach>
</update>
<select id="selectBillIdsByLadingFee" resultType="String">
<select id="selectBillIdsByLadingFee" resultType="java.lang.Long">
select distinct bill_id
from prc_pay_bill_fee
where fee_source = 'LADING'
and sc_id = #{feeId}
and ifnull(is_deleted, '0') = '0'
and bill_id is not null
and bill_id != ''
</select>
<update id="markLadingFeeDeleted">
@@ -92,7 +91,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
and ifnull(is_deleted, '0') = '0'
</update>
<delete id="deleteByBillId" parameterType="String">
<delete id="deleteByBillId" parameterType="Long">
delete from prc_pay_bill_fee
where bill_id = #{billId}
and (fee_source is null or fee_source = '' or fee_source = 'CALC')
@@ -30,24 +30,24 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
from prc_pay_bill
</sql>
<select id="selectByBillId" parameterType="String" resultMap="PrcPayBillResult">
<select id="selectByBillId" parameterType="Long" resultMap="PrcPayBillResult">
<include refid="selectPrcPayBillVo"/>
where bill_id = #{billId}
</select>
<select id="selectByPayBillId" parameterType="String" resultMap="PrcPayBillResult">
<select id="selectByPayBillId" parameterType="Long" resultMap="PrcPayBillResult">
<include refid="selectPrcPayBillVo"/>
where pay_bill_id = #{payBillId}
</select>
<insert id="insertPrcPayBill" parameterType="PrcPayBill">
<insert id="insertPrcPayBill" parameterType="PrcPayBill" useGeneratedKeys="true" keyProperty="payBillId">
insert into prc_pay_bill (
pay_bill_id, bill_id, currency, product_amount, redline_amount,
bill_id, currency, product_amount, redline_amount,
cost_amount, pay_total,
belong_saler, belong_saler_code, settlement_man, settlement_man_code,
create_by, create_time
) values (
#{payBillId}, #{billId}, #{currency}, #{productAmount}, #{redlineAmount},
#{billId}, #{currency}, #{productAmount}, #{redlineAmount},
#{costAmount}, #{payTotal},
#{belongSaler}, #{belongSalerCode}, #{settlementMan}, #{settlementManCode},
#{createBy}, sysdate()
@@ -70,14 +70,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where bill_id = #{billId}
</update>
<insert id="upsertPrcPayBill" parameterType="PrcPayBill">
<insert id="upsertPrcPayBill" parameterType="PrcPayBill" useGeneratedKeys="true" keyProperty="payBillId">
insert into prc_pay_bill (
pay_bill_id, bill_id, currency, product_amount, redline_amount,
bill_id, currency, product_amount, redline_amount,
cost_amount, pay_total,
belong_saler, belong_saler_code, settlement_man, settlement_man_code,
create_by, create_time
) values (
#{payBillId}, #{billId}, #{currency}, #{productAmount}, #{redlineAmount},
#{billId}, #{currency}, #{productAmount}, #{redlineAmount},
#{costAmount}, #{payTotal},
#{belongSaler}, #{belongSalerCode}, #{settlementMan}, #{settlementManCode},
#{createBy}, sysdate()
@@ -98,11 +98,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<insert id="insertMissingPayBills">
insert into prc_pay_bill (
pay_bill_id, bill_id, currency, pay_total,
bill_id, currency, pay_total,
belong_saler, belong_saler_code, settlement_man, settlement_man_code,
create_by, create_time, update_by, update_time
)
select replace(uuid(), '-', ''), o.bill_id, ifnull(nullif(o.currency, ''), 'CNY'), 0,
select o.bill_id, ifnull(nullif(o.currency, ''), 'CNY'), 0,
o.belong_saler, o.belong_saler_code, o.settlement_man, o.settlement_man_code,
#{operator}, sysdate(), #{operator}, sysdate()
from prc_order_bill o
@@ -129,7 +129,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<foreach collection="billIds" item="billId" open="(" separator="," close=")">#{billId}</foreach>
</update>
<delete id="deleteByBillId" parameterType="String">
<delete id="deleteByBillId" parameterType="Long">
delete from prc_pay_bill where bill_id = #{billId}
</delete>
</mapper>
@@ -0,0 +1,409 @@
-- 夜间停机:计费/应收/应付 UUID(varchar36) -> bigint AUTO_INCREMENT
-- 执行前:1)停 BMS 应用与异步任务 2)全库或至少关键表备份 3)建议先在从库/备份库干跑
-- 范围 PK:prc_order_bill.bill_id / prc_income_bill.income_bill_id / prc_income_bill_fee.fee_id / prc_pay_bill.pay_bill_id / prc_pay_bill_fee.fee_id
-- 范围 FK/引用:prc_order_bill_ext、income/pay 上 bill_id、prc_billing_task、ar_bill_detail*、ar_bill_generate_task、pay_bill_line/log/diff
-- 不动:ar_bill 等已 bigint;prc_quote* 报价 UUID;任务 taskId
-- 回滚:见文末;更稳妥为整库备份恢复 + 旧后端包
--
-- FK盘点: fk_income_bill_order_bill, fk_income_bill_fee_order, fk_order_bill_ext_bill, fk_pay_bill_order_bill, fk_pay_bill_fee_order
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ========== 0. 前置检查 ==========
SELECT 'prc_order_bill' AS tbl, COUNT(*) AS cnt FROM prc_order_bill
UNION ALL SELECT 'prc_order_bill_ext', COUNT(*) FROM prc_order_bill_ext
UNION ALL SELECT 'prc_income_bill', COUNT(*) FROM prc_income_bill
UNION ALL SELECT 'prc_income_bill_fee', COUNT(*) FROM prc_income_bill_fee
UNION ALL SELECT 'prc_pay_bill', COUNT(*) FROM prc_pay_bill
UNION ALL SELECT 'prc_pay_bill_fee', COUNT(*) FROM prc_pay_bill_fee
UNION ALL SELECT 'ar_bill_detail', COUNT(*) FROM ar_bill_detail
UNION ALL SELECT 'ar_bill_detail_fee', COUNT(*) FROM ar_bill_detail_fee;
SELECT CONSTRAINT_NAME, TABLE_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME
FROM information_schema.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = DATABASE()
AND REFERENCED_TABLE_NAME IN ('prc_order_bill','prc_income_bill','prc_income_bill_fee','prc_pay_bill','prc_pay_bill_fee')
ORDER BY TABLE_NAME, CONSTRAINT_NAME;
-- ========== 1. 备份关键表 ==========
DROP TABLE IF EXISTS `prc_order_bill_bak_uuid`;
CREATE TABLE `prc_order_bill_bak_uuid` AS SELECT * FROM `prc_order_bill`;
DROP TABLE IF EXISTS `prc_order_bill_ext_bak_uuid`;
CREATE TABLE `prc_order_bill_ext_bak_uuid` AS SELECT * FROM `prc_order_bill_ext`;
DROP TABLE IF EXISTS `prc_income_bill_bak_uuid`;
CREATE TABLE `prc_income_bill_bak_uuid` AS SELECT * FROM `prc_income_bill`;
DROP TABLE IF EXISTS `prc_income_bill_fee_bak_uuid`;
CREATE TABLE `prc_income_bill_fee_bak_uuid` AS SELECT * FROM `prc_income_bill_fee`;
DROP TABLE IF EXISTS `prc_pay_bill_bak_uuid`;
CREATE TABLE `prc_pay_bill_bak_uuid` AS SELECT * FROM `prc_pay_bill`;
DROP TABLE IF EXISTS `prc_pay_bill_fee_bak_uuid`;
CREATE TABLE `prc_pay_bill_fee_bak_uuid` AS SELECT * FROM `prc_pay_bill_fee`;
-- ========== 2. 映射表 ==========
DROP TABLE IF EXISTS `mig_map_order_bill`;
CREATE TABLE `mig_map_order_bill` (
`old_id` varchar(36) NOT NULL,
`new_id` bigint NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`old_id`),
UNIQUE KEY `uk_new_id` (`new_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `mig_map_order_bill` (`old_id`)
SELECT `bill_id` FROM `prc_order_bill` ORDER BY IFNULL(`create_time`, '1970-01-01'), `bill_id`;
DROP TABLE IF EXISTS `mig_map_income_bill`;
CREATE TABLE `mig_map_income_bill` (
`old_id` varchar(36) NOT NULL,
`new_id` bigint NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`old_id`),
UNIQUE KEY `uk_new_id` (`new_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `mig_map_income_bill` (`old_id`)
SELECT `income_bill_id` FROM `prc_income_bill` ORDER BY IFNULL(`create_time`, '1970-01-01'), `income_bill_id`;
DROP TABLE IF EXISTS `mig_map_income_fee`;
CREATE TABLE `mig_map_income_fee` (
`old_id` varchar(36) NOT NULL,
`new_id` bigint NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`old_id`),
UNIQUE KEY `uk_new_id` (`new_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `mig_map_income_fee` (`old_id`)
SELECT `fee_id` FROM `prc_income_bill_fee` ORDER BY IFNULL(`create_time`, '1970-01-01'), `fee_id`;
DROP TABLE IF EXISTS `mig_map_pay_bill`;
CREATE TABLE `mig_map_pay_bill` (
`old_id` varchar(36) NOT NULL,
`new_id` bigint NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`old_id`),
UNIQUE KEY `uk_new_id` (`new_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `mig_map_pay_bill` (`old_id`)
SELECT `pay_bill_id` FROM `prc_pay_bill` ORDER BY IFNULL(`create_time`, '1970-01-01'), `pay_bill_id`;
DROP TABLE IF EXISTS `mig_map_pay_fee`;
CREATE TABLE `mig_map_pay_fee` (
`old_id` varchar(36) NOT NULL,
`new_id` bigint NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`old_id`),
UNIQUE KEY `uk_new_id` (`new_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `mig_map_pay_fee` (`old_id`)
SELECT `fee_id` FROM `prc_pay_bill_fee` ORDER BY IFNULL(`create_time`, '1970-01-01'), `fee_id`;
-- ========== 3. 重建核心表(动态列) ==========
DROP TABLE IF EXISTS `prc_order_bill_new`;
CREATE TABLE `prc_order_bill_new` LIKE `prc_order_bill`;
ALTER TABLE `prc_order_bill_new` MODIFY COLUMN `bill_id` bigint NOT NULL AUTO_INCREMENT;
SELECT GROUP_CONCAT(CONCAT('`', COLUMN_NAME, '`') ORDER BY ORDINAL_POSITION SEPARATOR ',') INTO @cols_rest
FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_order_bill' AND COLUMN_NAME NOT IN ('bill_id');
SELECT GROUP_CONCAT(CONCAT('t.`', COLUMN_NAME, '`') ORDER BY ORDINAL_POSITION SEPARATOR ',') INTO @sels_rest
FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_order_bill' AND COLUMN_NAME NOT IN ('bill_id');
SET @sql := CONCAT(
'INSERT INTO `prc_order_bill_new` (`bill_id`',
IF(@cols_rest IS NULL OR @cols_rest = '', '', CONCAT(', ', @cols_rest)), ') ',
'SELECT mo.new_id',
IF(@sels_rest IS NULL OR @sels_rest = '', '', CONCAT(', ', @sels_rest)), ' ',
'FROM `prc_order_bill` t ',
'JOIN `mig_map_order_bill` mo ON mo.old_id = t.`bill_id` '
);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
DROP TABLE IF EXISTS `prc_income_bill_new`;
CREATE TABLE `prc_income_bill_new` LIKE `prc_income_bill`;
ALTER TABLE `prc_income_bill_new` MODIFY COLUMN `income_bill_id` bigint NOT NULL AUTO_INCREMENT;
ALTER TABLE `prc_income_bill_new` MODIFY COLUMN `bill_id` bigint NOT NULL;
SELECT GROUP_CONCAT(CONCAT('`', COLUMN_NAME, '`') ORDER BY ORDINAL_POSITION SEPARATOR ',') INTO @cols_rest
FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_income_bill' AND COLUMN_NAME NOT IN ('income_bill_id','bill_id');
SELECT GROUP_CONCAT(CONCAT('t.`', COLUMN_NAME, '`') ORDER BY ORDINAL_POSITION SEPARATOR ',') INTO @sels_rest
FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_income_bill' AND COLUMN_NAME NOT IN ('income_bill_id','bill_id');
SET @sql := CONCAT(
'INSERT INTO `prc_income_bill_new` (`income_bill_id`, `bill_id`',
IF(@cols_rest IS NULL OR @cols_rest = '', '', CONCAT(', ', @cols_rest)), ') ',
'SELECT mi.new_id, mo.new_id',
IF(@sels_rest IS NULL OR @sels_rest = '', '', CONCAT(', ', @sels_rest)), ' ',
'FROM `prc_income_bill` t ',
'JOIN `mig_map_income_bill` mi ON mi.old_id = t.`income_bill_id` '
,'JOIN `mig_map_order_bill` mo ON mo.old_id = t.`bill_id` '
);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
DROP TABLE IF EXISTS `prc_income_bill_fee_new`;
CREATE TABLE `prc_income_bill_fee_new` LIKE `prc_income_bill_fee`;
ALTER TABLE `prc_income_bill_fee_new` MODIFY COLUMN `fee_id` bigint NOT NULL AUTO_INCREMENT;
ALTER TABLE `prc_income_bill_fee_new` MODIFY COLUMN `bill_id` bigint NOT NULL;
ALTER TABLE `prc_income_bill_fee_new` MODIFY COLUMN `income_bill_id` bigint NULL;
SELECT GROUP_CONCAT(CONCAT('`', COLUMN_NAME, '`') ORDER BY ORDINAL_POSITION SEPARATOR ',') INTO @cols_rest
FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_income_bill_fee' AND COLUMN_NAME NOT IN ('fee_id','bill_id','income_bill_id');
SELECT GROUP_CONCAT(CONCAT('t.`', COLUMN_NAME, '`') ORDER BY ORDINAL_POSITION SEPARATOR ',') INTO @sels_rest
FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_income_bill_fee' AND COLUMN_NAME NOT IN ('fee_id','bill_id','income_bill_id');
SET @sql := CONCAT(
'INSERT INTO `prc_income_bill_fee_new` (`fee_id`, `bill_id`, `income_bill_id`',
IF(@cols_rest IS NULL OR @cols_rest = '', '', CONCAT(', ', @cols_rest)), ') ',
'SELECT mf.new_id, mo.new_id, mi.new_id',
IF(@sels_rest IS NULL OR @sels_rest = '', '', CONCAT(', ', @sels_rest)), ' ',
'FROM `prc_income_bill_fee` t ',
'JOIN `mig_map_income_fee` mf ON mf.old_id = t.`fee_id` '
,'JOIN `mig_map_order_bill` mo ON mo.old_id = t.`bill_id` '
,'LEFT JOIN `mig_map_income_bill` mi ON mi.old_id = t.`income_bill_id` '
);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
DROP TABLE IF EXISTS `prc_pay_bill_new`;
CREATE TABLE `prc_pay_bill_new` LIKE `prc_pay_bill`;
ALTER TABLE `prc_pay_bill_new` MODIFY COLUMN `pay_bill_id` bigint NOT NULL AUTO_INCREMENT;
ALTER TABLE `prc_pay_bill_new` MODIFY COLUMN `bill_id` bigint NOT NULL;
SELECT GROUP_CONCAT(CONCAT('`', COLUMN_NAME, '`') ORDER BY ORDINAL_POSITION SEPARATOR ',') INTO @cols_rest
FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_pay_bill' AND COLUMN_NAME NOT IN ('pay_bill_id','bill_id');
SELECT GROUP_CONCAT(CONCAT('t.`', COLUMN_NAME, '`') ORDER BY ORDINAL_POSITION SEPARATOR ',') INTO @sels_rest
FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_pay_bill' AND COLUMN_NAME NOT IN ('pay_bill_id','bill_id');
SET @sql := CONCAT(
'INSERT INTO `prc_pay_bill_new` (`pay_bill_id`, `bill_id`',
IF(@cols_rest IS NULL OR @cols_rest = '', '', CONCAT(', ', @cols_rest)), ') ',
'SELECT mp.new_id, mo.new_id',
IF(@sels_rest IS NULL OR @sels_rest = '', '', CONCAT(', ', @sels_rest)), ' ',
'FROM `prc_pay_bill` t ',
'JOIN `mig_map_pay_bill` mp ON mp.old_id = t.`pay_bill_id` '
,'JOIN `mig_map_order_bill` mo ON mo.old_id = t.`bill_id` '
);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
DROP TABLE IF EXISTS `prc_pay_bill_fee_new`;
CREATE TABLE `prc_pay_bill_fee_new` LIKE `prc_pay_bill_fee`;
ALTER TABLE `prc_pay_bill_fee_new` MODIFY COLUMN `fee_id` bigint NOT NULL AUTO_INCREMENT;
ALTER TABLE `prc_pay_bill_fee_new` MODIFY COLUMN `bill_id` bigint NOT NULL;
ALTER TABLE `prc_pay_bill_fee_new` MODIFY COLUMN `pay_bill_id` bigint NULL;
SELECT GROUP_CONCAT(CONCAT('`', COLUMN_NAME, '`') ORDER BY ORDINAL_POSITION SEPARATOR ',') INTO @cols_rest
FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_pay_bill_fee' AND COLUMN_NAME NOT IN ('fee_id','bill_id','pay_bill_id');
SELECT GROUP_CONCAT(CONCAT('t.`', COLUMN_NAME, '`') ORDER BY ORDINAL_POSITION SEPARATOR ',') INTO @sels_rest
FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_pay_bill_fee' AND COLUMN_NAME NOT IN ('fee_id','bill_id','pay_bill_id');
SET @sql := CONCAT(
'INSERT INTO `prc_pay_bill_fee_new` (`fee_id`, `bill_id`, `pay_bill_id`',
IF(@cols_rest IS NULL OR @cols_rest = '', '', CONCAT(', ', @cols_rest)), ') ',
'SELECT mf.new_id, mo.new_id, mp.new_id',
IF(@sels_rest IS NULL OR @sels_rest = '', '', CONCAT(', ', @sels_rest)), ' ',
'FROM `prc_pay_bill_fee` t ',
'JOIN `mig_map_pay_fee` mf ON mf.old_id = t.`fee_id` '
,'JOIN `mig_map_order_bill` mo ON mo.old_id = t.`bill_id` '
,'LEFT JOIN `mig_map_pay_bill` mp ON mp.old_id = t.`pay_bill_id` '
);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- --- prc_order_bill_ext 阴影列 ---
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_order_bill_ext' AND COLUMN_NAME='bill_id_bi')=0,
'ALTER TABLE `prc_order_bill_ext` ADD COLUMN `bill_id_bi` bigint NULL', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
UPDATE `prc_order_bill_ext` e JOIN `mig_map_order_bill` m ON m.old_id = e.bill_id SET e.bill_id_bi = m.new_id;
-- ========== 4. 引用表阴影列 ==========
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_detail' AND COLUMN_NAME='prc_order_bill_id')>0
AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_detail' AND COLUMN_NAME='prc_order_bill_id_bi')=0,
'ALTER TABLE `ar_bill_detail` ADD COLUMN `prc_order_bill_id_bi` bigint NULL', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_detail' AND COLUMN_NAME='prc_order_bill_id')>0,
'UPDATE `ar_bill_detail` x JOIN `mig_map_order_bill` m ON m.old_id = x.`prc_order_bill_id` SET x.`prc_order_bill_id_bi` = m.new_id',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_detail_fee' AND COLUMN_NAME='prc_income_bill_fee_id')>0
AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_detail_fee' AND COLUMN_NAME='prc_income_bill_fee_id_bi')=0,
'ALTER TABLE `ar_bill_detail_fee` ADD COLUMN `prc_income_bill_fee_id_bi` bigint NULL', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_detail_fee' AND COLUMN_NAME='prc_income_bill_fee_id')>0,
'UPDATE `ar_bill_detail_fee` x JOIN `mig_map_income_fee` m ON m.old_id = x.`prc_income_bill_fee_id` SET x.`prc_income_bill_fee_id_bi` = m.new_id',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_generate_task' AND COLUMN_NAME='last_source_bill_id')>0
AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_generate_task' AND COLUMN_NAME='last_source_bill_id_bi')=0,
'ALTER TABLE `ar_bill_generate_task` ADD COLUMN `last_source_bill_id_bi` bigint NULL', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_generate_task' AND COLUMN_NAME='last_source_bill_id')>0,
'UPDATE `ar_bill_generate_task` x JOIN `mig_map_order_bill` m ON m.old_id = x.`last_source_bill_id` SET x.`last_source_bill_id_bi` = m.new_id WHERE x.`last_source_bill_id` IS NOT NULL AND x.`last_source_bill_id` <> \'\'',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_billing_task' AND COLUMN_NAME='bill_id')>0
AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_billing_task' AND COLUMN_NAME='bill_id_bi')=0,
'ALTER TABLE `prc_billing_task` ADD COLUMN `bill_id_bi` bigint NULL', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_billing_task' AND COLUMN_NAME='bill_id')>0,
'UPDATE `prc_billing_task` x JOIN `mig_map_order_bill` m ON m.old_id = x.`bill_id` SET x.`bill_id_bi` = m.new_id WHERE x.`bill_id` IS NOT NULL AND x.`bill_id` <> \'\'',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_line' AND COLUMN_NAME='order_bill_id')>0
AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_line' AND COLUMN_NAME='order_bill_id_bi')=0,
'ALTER TABLE `pay_bill_line` ADD COLUMN `order_bill_id_bi` bigint NULL', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_line' AND COLUMN_NAME='order_bill_id')>0,
'UPDATE `pay_bill_line` x JOIN `mig_map_order_bill` m ON m.old_id = x.`order_bill_id` SET x.`order_bill_id_bi` = m.new_id WHERE x.`order_bill_id` IS NOT NULL AND x.`order_bill_id` <> \'\'',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_line' AND COLUMN_NAME='fee_id')>0
AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_line' AND COLUMN_NAME='fee_id_bi')=0,
'ALTER TABLE `pay_bill_line` ADD COLUMN `fee_id_bi` bigint NULL', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_line' AND COLUMN_NAME='fee_id')>0,
'UPDATE `pay_bill_line` x JOIN `mig_map_pay_fee` m ON m.old_id = x.`fee_id` SET x.`fee_id_bi` = m.new_id WHERE x.`fee_id` IS NOT NULL AND x.`fee_id` <> \'\'',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_log' AND COLUMN_NAME='fee_id')>0
AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_log' AND COLUMN_NAME='fee_id_bi')=0,
'ALTER TABLE `pay_bill_log` ADD COLUMN `fee_id_bi` bigint NULL', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_log' AND COLUMN_NAME='fee_id')>0,
'UPDATE `pay_bill_log` x JOIN `mig_map_pay_fee` m ON m.old_id = x.`fee_id` SET x.`fee_id_bi` = m.new_id WHERE x.`fee_id` IS NOT NULL AND x.`fee_id` <> \'\'',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_diff' AND COLUMN_NAME='fee_id')>0
AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_diff' AND COLUMN_NAME='fee_id_bi')=0,
'ALTER TABLE `pay_bill_diff` ADD COLUMN `fee_id_bi` bigint NULL', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_diff' AND COLUMN_NAME='fee_id')>0,
'UPDATE `pay_bill_diff` x JOIN `mig_map_pay_fee` m ON m.old_id = x.`fee_id` SET x.`fee_id_bi` = m.new_id WHERE x.`fee_id` IS NOT NULL AND x.`fee_id` <> \'\'',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_diff' AND COLUMN_NAME='adjust_fee_id')>0
AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_diff' AND COLUMN_NAME='adjust_fee_id_bi')=0,
'ALTER TABLE `pay_bill_diff` ADD COLUMN `adjust_fee_id_bi` bigint NULL', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_diff' AND COLUMN_NAME='adjust_fee_id')>0,
'UPDATE `pay_bill_diff` x JOIN `mig_map_pay_fee` m ON m.old_id = x.`adjust_fee_id` SET x.`adjust_fee_id_bi` = m.new_id WHERE x.`adjust_fee_id` IS NOT NULL AND x.`adjust_fee_id` <> \'\'',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- ========== 5. 校验(bad 必须为 0,行数必须一致) ==========
SELECT 'ar_detail_orphan' AS chk, COUNT(*) AS bad FROM ar_bill_detail WHERE prc_order_bill_id_bi IS NULL;
SELECT 'ar_fee_orphan' AS chk, COUNT(*) AS bad FROM ar_bill_detail_fee WHERE prc_income_bill_fee_id_bi IS NULL;
SELECT 'ext_orphan' AS chk, COUNT(*) AS bad FROM prc_order_bill_ext WHERE bill_id_bi IS NULL;
SELECT 'order_cnt' AS chk, (SELECT COUNT(*) FROM mig_map_order_bill) m, (SELECT COUNT(*) FROM prc_order_bill) s, (SELECT COUNT(*) FROM prc_order_bill_new) n;
SELECT 'income_cnt' AS chk, (SELECT COUNT(*) FROM mig_map_income_bill) m, (SELECT COUNT(*) FROM prc_income_bill) s, (SELECT COUNT(*) FROM prc_income_bill_new) n;
SELECT 'income_fee_cnt' AS chk, (SELECT COUNT(*) FROM mig_map_income_fee) m, (SELECT COUNT(*) FROM prc_income_bill_fee) s, (SELECT COUNT(*) FROM prc_income_bill_fee_new) n;
SELECT 'pay_cnt' AS chk, (SELECT COUNT(*) FROM mig_map_pay_bill) m, (SELECT COUNT(*) FROM prc_pay_bill) s, (SELECT COUNT(*) FROM prc_pay_bill_new) n;
SELECT 'pay_fee_cnt' AS chk, (SELECT COUNT(*) FROM mig_map_pay_fee) m, (SELECT COUNT(*) FROM prc_pay_bill_fee) s, (SELECT COUNT(*) FROM prc_pay_bill_fee_new) n;
-- 若校验失败:STOP,不执行第 6 步
-- ========== 6. 掉旧 FK 后换表 ==========
SET @sql := IF((SELECT COUNT(*) FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_income_bill' AND CONSTRAINT_NAME='fk_income_bill_order_bill')>0,
'ALTER TABLE `prc_income_bill` DROP FOREIGN KEY `fk_income_bill_order_bill`', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_income_bill_fee' AND CONSTRAINT_NAME='fk_income_bill_fee_order')>0,
'ALTER TABLE `prc_income_bill_fee` DROP FOREIGN KEY `fk_income_bill_fee_order`', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_order_bill_ext' AND CONSTRAINT_NAME='fk_order_bill_ext_bill')>0,
'ALTER TABLE `prc_order_bill_ext` DROP FOREIGN KEY `fk_order_bill_ext_bill`', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_pay_bill' AND CONSTRAINT_NAME='fk_pay_bill_order_bill')>0,
'ALTER TABLE `prc_pay_bill` DROP FOREIGN KEY `fk_pay_bill_order_bill`', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_pay_bill_fee' AND CONSTRAINT_NAME='fk_pay_bill_fee_order')>0,
'ALTER TABLE `prc_pay_bill_fee` DROP FOREIGN KEY `fk_pay_bill_fee_order`', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
RENAME TABLE
`prc_order_bill` TO `prc_order_bill_old_uuid`,
`prc_order_bill_new` TO `prc_order_bill`,
`prc_income_bill` TO `prc_income_bill_old_uuid`,
`prc_income_bill_new` TO `prc_income_bill`,
`prc_income_bill_fee` TO `prc_income_bill_fee_old_uuid`,
`prc_income_bill_fee_new` TO `prc_income_bill_fee`,
`prc_pay_bill` TO `prc_pay_bill_old_uuid`,
`prc_pay_bill_new` TO `prc_pay_bill`,
`prc_pay_bill_fee` TO `prc_pay_bill_fee_old_uuid`,
`prc_pay_bill_fee_new` TO `prc_pay_bill_fee`;
-- --- ext / AR / task 引用列落地 ---
ALTER TABLE `prc_order_bill_ext` DROP PRIMARY KEY;
ALTER TABLE `prc_order_bill_ext` DROP COLUMN `bill_id`;
ALTER TABLE `prc_order_bill_ext` CHANGE COLUMN `bill_id_bi` `bill_id` bigint NOT NULL;
ALTER TABLE `prc_order_bill_ext` ADD PRIMARY KEY (`bill_id`);
SET @sql := IF((SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_detail' AND INDEX_NAME='uk_ar_bill_detail_source')>0,
'ALTER TABLE `ar_bill_detail` DROP INDEX `uk_ar_bill_detail_source`', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_detail' AND INDEX_NAME='idx_ar_bill_detail_source')>0,
'ALTER TABLE `ar_bill_detail` DROP INDEX `idx_ar_bill_detail_source`', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
ALTER TABLE `ar_bill_detail` DROP COLUMN `prc_order_bill_id`;
ALTER TABLE `ar_bill_detail` CHANGE COLUMN `prc_order_bill_id_bi` `prc_order_bill_id` bigint NOT NULL;
ALTER TABLE `ar_bill_detail` ADD UNIQUE KEY `uk_ar_bill_detail_source` (`ar_bill_id`,`prc_order_bill_id`);
ALTER TABLE `ar_bill_detail` ADD KEY `idx_ar_bill_detail_source` (`prc_order_bill_id`);
SET @sql := IF((SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_detail_fee' AND INDEX_NAME='uk_ar_detail_prc_income_fee')>0,
'ALTER TABLE `ar_bill_detail_fee` DROP INDEX `uk_ar_detail_prc_income_fee`', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_detail_fee' AND INDEX_NAME='idx_ar_detail_prc_income_fee')>0,
'ALTER TABLE `ar_bill_detail_fee` DROP INDEX `idx_ar_detail_prc_income_fee`', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
ALTER TABLE `ar_bill_detail_fee` DROP COLUMN `prc_income_bill_fee_id`;
ALTER TABLE `ar_bill_detail_fee` CHANGE COLUMN `prc_income_bill_fee_id_bi` `prc_income_bill_fee_id` bigint NOT NULL;
ALTER TABLE `ar_bill_detail_fee` ADD UNIQUE KEY `uk_ar_detail_prc_income_fee` (`detail_id`,`prc_income_bill_fee_id`);
ALTER TABLE `ar_bill_detail_fee` ADD KEY `idx_ar_detail_prc_income_fee` (`prc_income_bill_fee_id`);
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_generate_task' AND COLUMN_NAME='last_source_bill_id_bi')>0,
'ALTER TABLE `ar_bill_generate_task` DROP COLUMN `last_source_bill_id`, CHANGE COLUMN `last_source_bill_id_bi` `last_source_bill_id` bigint NULL', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_billing_task' AND COLUMN_NAME='bill_id_bi')>0,
'ALTER TABLE `prc_billing_task` DROP COLUMN `bill_id`, CHANGE COLUMN `bill_id_bi` `bill_id` bigint NULL', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_line' AND COLUMN_NAME='order_bill_id_bi')>0,
'ALTER TABLE `pay_bill_line` DROP COLUMN `order_bill_id`, CHANGE COLUMN `order_bill_id_bi` `order_bill_id` bigint NULL', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_line' AND COLUMN_NAME='fee_id_bi')>0,
'ALTER TABLE `pay_bill_line` DROP COLUMN `fee_id`, CHANGE COLUMN `fee_id_bi` `fee_id` bigint NULL', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_log' AND COLUMN_NAME='fee_id_bi')>0,
'ALTER TABLE `pay_bill_log` DROP COLUMN `fee_id`, CHANGE COLUMN `fee_id_bi` `fee_id` bigint NULL', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_diff' AND COLUMN_NAME='fee_id_bi')>0,
'ALTER TABLE `pay_bill_diff` DROP COLUMN `fee_id`, CHANGE COLUMN `fee_id_bi` `fee_id` bigint NULL', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_diff' AND COLUMN_NAME='adjust_fee_id_bi')>0,
'ALTER TABLE `pay_bill_diff` DROP COLUMN `adjust_fee_id`, CHANGE COLUMN `adjust_fee_id_bi` `adjust_fee_id` bigint NULL', 'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- ========== 7. 重建 FK + AUTO_INCREMENT ==========
ALTER TABLE `prc_order_bill_ext` ADD CONSTRAINT `fk_order_bill_ext_bill` FOREIGN KEY (`bill_id`) REFERENCES `prc_order_bill` (`bill_id`) ON DELETE CASCADE;
ALTER TABLE `prc_income_bill` ADD CONSTRAINT `fk_income_bill_order_bill` FOREIGN KEY (`bill_id`) REFERENCES `prc_order_bill` (`bill_id`) ON DELETE CASCADE;
ALTER TABLE `prc_income_bill_fee` ADD CONSTRAINT `fk_income_bill_fee_order` FOREIGN KEY (`bill_id`) REFERENCES `prc_order_bill` (`bill_id`) ON DELETE CASCADE;
ALTER TABLE `prc_pay_bill` ADD CONSTRAINT `fk_pay_bill_order_bill` FOREIGN KEY (`bill_id`) REFERENCES `prc_order_bill` (`bill_id`) ON DELETE CASCADE;
ALTER TABLE `prc_pay_bill_fee` ADD CONSTRAINT `fk_pay_bill_fee_order` FOREIGN KEY (`bill_id`) REFERENCES `prc_order_bill` (`bill_id`) ON DELETE CASCADE;
SET @ai := (SELECT IFNULL(MAX(`bill_id`),0)+1 FROM `prc_order_bill`);
SET @sql := CONCAT('ALTER TABLE `prc_order_bill` AUTO_INCREMENT=', @ai);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @ai := (SELECT IFNULL(MAX(`income_bill_id`),0)+1 FROM `prc_income_bill`);
SET @sql := CONCAT('ALTER TABLE `prc_income_bill` AUTO_INCREMENT=', @ai);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @ai := (SELECT IFNULL(MAX(`fee_id`),0)+1 FROM `prc_income_bill_fee`);
SET @sql := CONCAT('ALTER TABLE `prc_income_bill_fee` AUTO_INCREMENT=', @ai);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @ai := (SELECT IFNULL(MAX(`pay_bill_id`),0)+1 FROM `prc_pay_bill`);
SET @sql := CONCAT('ALTER TABLE `prc_pay_bill` AUTO_INCREMENT=', @ai);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @ai := (SELECT IFNULL(MAX(`fee_id`),0)+1 FROM `prc_pay_bill_fee`);
SET @sql := CONCAT('ALTER TABLE `prc_pay_bill_fee` AUTO_INCREMENT=', @ai);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;
-- ========== 8. 抽查 ==========
SELECT d.detail_id, d.prc_order_bill_id, o.order_no FROM ar_bill_detail d JOIN prc_order_bill o ON o.bill_id = d.prc_order_bill_id LIMIT 5;
SELECT f.detail_fee_id, f.prc_income_bill_fee_id, i.fee_type FROM ar_bill_detail_fee f JOIN prc_income_bill_fee i ON i.fee_id = f.prc_income_bill_fee_id LIMIT 5;
-- ========== 9. 回滚说明(勿自动执行) ==========
-- 推荐:整库从备份恢复 + 部署旧后端包
-- 或:SET FOREIGN_KEY_CHECKS=0; RENAME 把 *_bak_uuid 换回主表名(引用列需另外恢复)
--
-- ========== 10. 次日清理 ==========
-- DROP TABLE IF EXISTS prc_order_bill_old_uuid, prc_order_bill_bak_uuid, prc_income_bill_old_uuid, prc_income_bill_bak_uuid,
-- prc_income_bill_fee_old_uuid, prc_income_bill_fee_bak_uuid, prc_pay_bill_old_uuid, prc_pay_bill_bak_uuid,
-- prc_pay_bill_fee_old_uuid, prc_pay_bill_fee_bak_uuid, prc_order_bill_ext_bak_uuid;
-- DROP TABLE IF EXISTS mig_map_order_bill, mig_map_income_bill, mig_map_income_fee, mig_map_pay_bill, mig_map_pay_fee;
--
-- 冒烟:1)新建/重计费 2)出应收 3)查应付费用 4)旧 AR 明细关联订单
+118
View File
@@ -0,0 +1,118 @@
#!/usr/bin/env bash
# 夜间停机:仅在数据库服务器(或能连库的跳板机)执行
# 依赖:mysql 客户端
#
# export BMS_DB_HOST=127.0.0.1
# export BMS_DB_PORT=3306
# export BMS_DB_NAME=bms
# export BMS_DB_USER=root
# export BMS_DB_PASS='******'
# chmod +x 20261113_uuid_to_bigint_run.sh
# ./20261113_uuid_to_bigint_run.sh
#
# CONFIRM=YES ./20261113_uuid_to_bigint_run.sh
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SQL_FILE="${SQL_FILE:-${SCRIPT_DIR}/20261113_uuid_to_bigint_order_bill.sql}"
LOG_DIR="${LOG_DIR:-${SCRIPT_DIR}/logs}"
TS="$(date +%Y%m%d_%H%M%S)"
LOG_FILE="${LOG_DIR}/uuid_to_bigint_${TS}.log"
BMS_DB_HOST="${BMS_DB_HOST:-127.0.0.1}"
BMS_DB_PORT="${BMS_DB_PORT:-3306}"
BMS_DB_NAME="${BMS_DB_NAME:-bms}"
BMS_DB_USER="${BMS_DB_USER:-root}"
if [[ -z "${BMS_DB_PASS:-}" ]]; then
echo "请先设置环境变量 BMS_DB_PASS(不要把密码写进脚本)"
exit 1
fi
if [[ ! -f "${SQL_FILE}" ]]; then
echo "找不到 SQL 文件: ${SQL_FILE}"
exit 1
fi
if ! command -v mysql >/dev/null 2>&1; then
echo "未找到 mysql 客户端,请先安装"
exit 1
fi
mkdir -p "${LOG_DIR}"
echo "========================================"
echo " UUID -> bigint 迁移"
echo " host=${BMS_DB_HOST} port=${BMS_DB_PORT} db=${BMS_DB_NAME} user=${BMS_DB_USER}"
echo " sql=${SQL_FILE}"
echo " log=${LOG_FILE}"
echo "========================================"
echo
echo "【必须】先停 Java / BMS,再执行本脚本。"
echo "执行前请确认:"
echo " 1) Java / BMS 应用与异步 worker 已全部停掉(不要边跑边迁)"
echo " 2) 已做全库/关键表备份"
echo " 3) 磅盘空间足够(建议 >= 订单+ext+费用表 2~3 倍)"
echo " 4) SQL 成功后,再部署 Long 版后端并启动"
echo
if [[ "${CONFIRM:-}" != "YES" ]]; then
read -r -p "已停 Java?输入 YES 开始执行 SQL: " ans
if [[ "${ans}" != "YES" ]]; then
echo "已取消(请先停 Java 再来)"
exit 1
fi
else
echo "CONFIRM=YES:假定你已停 Java,直接开始 SQL..."
fi
MYSQL_OPTS=(
-h "${BMS_DB_HOST}"
-P "${BMS_DB_PORT}"
-u "${BMS_DB_USER}"
"-p${BMS_DB_PASS}"
--default-character-set=utf8mb4
--comments
"${BMS_DB_NAME}"
)
echo
echo "[$(date '+%F %T')] 连接检查..." | tee -a "${LOG_FILE}"
mysql "${MYSQL_OPTS[@]}" -e "SELECT DATABASE() AS db, NOW() AS now_ts;" | tee -a "${LOG_FILE}"
echo "[$(date '+%F %T')] 行数预览..." | tee -a "${LOG_FILE}"
mysql "${MYSQL_OPTS[@]}" -e "
SELECT 'prc_order_bill' AS tbl, COUNT(*) AS cnt FROM prc_order_bill
UNION ALL SELECT 'prc_order_bill_ext', COUNT(*) FROM prc_order_bill_ext
UNION ALL SELECT 'prc_income_bill', COUNT(*) FROM prc_income_bill
UNION ALL SELECT 'prc_income_bill_fee', COUNT(*) FROM prc_income_bill_fee
UNION ALL SELECT 'prc_pay_bill', COUNT(*) FROM prc_pay_bill
UNION ALL SELECT 'prc_pay_bill_fee', COUNT(*) FROM prc_pay_bill_fee;
" | tee -a "${LOG_FILE}"
START_TS="$(date +%s)"
echo "[$(date '+%F %T')] 开始执行迁移 SQL..." | tee -a "${LOG_FILE}"
set +e
mysql "${MYSQL_OPTS[@]}" < "${SQL_FILE}" 2>&1 | tee -a "${LOG_FILE}"
RC=${PIPESTATUS[0]}
set -e
END_TS="$(date +%s)"
ELAPSED=$((END_TS - START_TS))
if [[ "${RC}" -ne 0 ]]; then
echo "[$(date '+%F %T')] 失败 exit=${RC} 耗时=${ELAPSED}s,请查日志: ${LOG_FILE}" | tee -a "${LOG_FILE}"
echo "若已换表中途失败:优先整库备份恢复,不要部署新后端"
exit "${RC}"
fi
echo "[$(date '+%F %T')] 成功耗时=${ELAPSED}s (约 $((ELAPSED/60)) 分钟)" | tee -a "${LOG_FILE}"
echo
echo "下一步:"
echo " 1) 抽查日志中校验/抽查结果"
echo " 2) 部署 Long 版后端并启应用"
echo " 3) 按 20261113_uuid_to_bigint_runbook.md 做冒烟"
echo "日志: ${LOG_FILE}"
@@ -0,0 +1,64 @@
# UUID -> bigint 夜间执行与冒烟清单
脚本:`bms-back/sql/20261113_uuid_to_bigint_order_bill.sql`
## 必须顺序(不要飞)
1. **先停 Java / BMS 服务**(含计费、出账、导出等异步 worker)
2. 全库或关键表备份
3. 在服务器执行 SQL(下面一键脚本)
4. SQL 成功后,再部署 **Long 版** 后端并启动
5. 冒烟
>旧包连新库或新包连旧库都会挂。**一定先停 Java,再跑 SQL。**
## 服务器一键执行
把同目录下 `20261113_uuid_to_bigint_order_bill.sql` 与 `20261113_uuid_to_bigint_run.sh` 一起上传到服务器。
```bash
# 1) 先停 Java(按你们部署方式改,以下为示例)
# systemctl stop bms-admin
# 或:kill / docker stop / 停掉所有 java -jar bms-*.jar
# 2) 再跑迁移
export BMS_DB_HOST=127.0.0.1
export BMS_DB_PORT=3306
export BMS_DB_NAME=bms
export BMS_DB_USER=root
export BMS_DB_PASS='******'
chmod +x 20261113_uuid_to_bigint_run.sh
./20261113_uuid_to_bigint_run.sh
# 或非交互:CONFIRM=YES ./20261113_uuid_to_bigint_run.sh
```
日志写在 `sql/logs/uuid_to_bigint_*.log`。
## 执行前
1. **已停 Java / BMS**(含计费/出账/导出异步)
2. 全库备份(或至少:prc_order_bill*、prc_income*、prc_pay_bill*、ar_bill_detail*、prc_billing_task、pay_bill_line)
3. 建议在从库/备份库先干跑校验
4. 准备好 Long 版后端包(SQL 成功后再发)
## 执行
1. 确认 Java 已停
2. 跑 `./20261113_uuid_to_bigint_run.sh`(内部会执行整份 SQL)
3. 查日志校验/抽查通过
4. 部署新后端,启应用
## 冒烟
- [ ] 订单列表能打开,billId 为数字
- [ ] 新建/重计费一票,生成新 bigint bill_id
- [ ] 手动加一笔应收费用 / 查费用明细
- [ ] 生成一笔应收账单,明细能关联订单
- [ ] 旧应收账单明细 JOIN prc_order_bill 正常
- [ ] 应付费用/应付账单查看正常
## 回滚
1. 停新包
2. **推荐**:整库从备份恢复
3. 或:`SET FOREIGN_KEY_CHECKS=0` 后将 `*_bak_uuid` RENAME 回主表名(引用列需额外处理)
4. 部署旧后端包
## 次日
- 确认无误后 DROP `*_old_uuid` / `*_bak_uuid` / `mig_map_*`
+16 -16
View File
@@ -127,7 +127,7 @@ CREATE TABLE `ar_bill_void_task` (
CREATE TABLE `ar_bill_detail` (
`detail_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '账单订单明细ID',
`ar_bill_id` bigint(20) NOT NULL COMMENT '应收账单ID',
`prc_order_bill_id` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '来源计费订单ID,对应 prc_order_bill.bill_id',
`prc_order_bill_id` bigint(20) NOT NULL COMMENT '来源计费订单ID,对应 prc_order_bill.bill_id',
`detail_no` int(11) NOT NULL COMMENT '账单内顺序号',
`order_no` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '订单号快照',
`tracking_no` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '运单号快照',
@@ -170,7 +170,7 @@ CREATE TABLE `ar_bill_detail` (
CREATE TABLE `ar_bill_detail_fee` (
`detail_fee_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '账单费用明细ID',
`detail_id` bigint(20) NOT NULL COMMENT '账单订单明细ID',
`prc_income_bill_fee_id` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '来源收入费用ID,对应 prc_income_bill_fee.fee_id',
`prc_income_bill_fee_id` bigint(20) NOT NULL COMMENT '来源收入费用ID,对应 prc_income_bill_fee.fee_id',
`fee_no` int(11) NOT NULL COMMENT '订单内费用顺序号',
`fee_type` varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '费用类型快照',
`fee_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '费用名称快照',
@@ -234,7 +234,7 @@ CREATE TABLE `ar_bill_generate_task` (
`selection_mode` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '选择模式:EXPLICIT=手动选择,ALL_MATCHED=全选查询结果',
`request_payload` longtext COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '生成请求快照JSON',
`snapshot_create_time` datetime DEFAULT NULL COMMENT '来源订单创建时间快照',
`last_source_bill_id` varchar(36) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '来源订单游标',
`last_source_bill_id` bigint(20) DEFAULT NULL COMMENT '来源订单游标',
`total_count` int(11) NOT NULL DEFAULT '-1' COMMENT '待处理订单数,-1表示尚未统计',
`processed_count` int(11) NOT NULL DEFAULT '0' COMMENT '已处理订单数',
`success_count` int(11) NOT NULL DEFAULT '0' COMMENT '成功订单数',
@@ -789,7 +789,7 @@ CREATE TABLE `prc_billing_task` (
`bill_type` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '计费类型:PENDING待计费 REBILL重计费 REFUND退费',
`success_status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'WAITING' COMMENT '是否计费成功:WAITING待处理 SUCCESS成功 FAILED失败',
`bill_time` datetime DEFAULT NULL COMMENT '计费时间',
`bill_id` varchar(36) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '计费订单ID prc_order_bill.bill_id',
`bill_id` bigint(20) DEFAULT NULL COMMENT '计费订单ID prc_order_bill.bill_id',
`fail_code` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '失败码',
`error_message` varchar(1000) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '失败原因',
`create_by` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者',
@@ -834,8 +834,8 @@ CREATE TABLE `prc_customer_price_set` (
-- 表结构:`prc_income_bill`
-- ----------------------------
CREATE TABLE `prc_income_bill` (
`income_bill_id` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '应收主表ID',
`bill_id` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '计费订单ID,对应 prc_order_bill.bill_id,一对一',
`income_bill_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '应收主表ID',
`bill_id` bigint(20) NOT NULL COMMENT '计费订单ID,对应 prc_order_bill.bill_id,一对一',
`currency` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT 'CNY' COMMENT '币种',
`product_amount` decimal(18,4) DEFAULT NULL COMMENT '产品价合计',
`redline_amount` decimal(18,4) DEFAULT NULL COMMENT '红线价合计',
@@ -880,9 +880,9 @@ CREATE TABLE `prc_profit_commission_rate` (
-- 表结构:`prc_income_bill_fee`
-- ----------------------------
CREATE TABLE `prc_income_bill_fee` (
`fee_id` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '费用明细ID',
`bill_id` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '计费ID',
`income_bill_id` varchar(36) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '应收主表ID,对应 prc_income_bill.income_bill_id',
`fee_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '费用明细ID',
`bill_id` bigint(20) NOT NULL COMMENT '计费ID',
`income_bill_id` bigint(20) DEFAULT NULL COMMENT '应收主表ID,对应 prc_income_bill.income_bill_id',
`fee_type` varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '费用类型(字典bms_fee_type)',
`fee_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '费用名称',
`sc_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '附加费配置ID',
@@ -908,7 +908,7 @@ CREATE TABLE `prc_income_bill_fee` (
-- 表结构:`prc_order_bill`
-- ----------------------------
CREATE TABLE `prc_order_bill` (
`bill_id` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '计费ID',
`bill_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '计费ID',
`bill_key` char(32) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'MD5(order_no)',
`order_no` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '订单号',
`tracking_no` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '运单号',
@@ -1003,7 +1003,7 @@ CREATE TABLE `prc_order_bill` (
-- 表结构:`prc_order_bill_ext`
-- ----------------------------
CREATE TABLE `prc_order_bill_ext` (
`bill_id` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '计费订单ID,对应 prc_order_bill.bill_id',
`bill_id` bigint(20) NOT NULL COMMENT '计费订单ID,对应 prc_order_bill.bill_id',
`order_no` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '订单号',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
@@ -1189,8 +1189,8 @@ CREATE TABLE `prc_order_bill_ext` (
-- 表结构:`prc_pay_bill`
-- ----------------------------
CREATE TABLE `prc_pay_bill` (
`pay_bill_id` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '应付主表ID',
`bill_id` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '计费订单ID,对应 prc_order_bill.bill_id,一对一',
`pay_bill_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '应付主表ID',
`bill_id` bigint(20) NOT NULL COMMENT '计费订单ID,对应 prc_order_bill.bill_id,一对一',
`currency` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT 'CNY' COMMENT '币种',
`product_amount` decimal(18,4) DEFAULT NULL COMMENT '产品价合计',
`redline_amount` decimal(18,4) DEFAULT NULL COMMENT '红线价合计',
@@ -1215,9 +1215,9 @@ CREATE TABLE `prc_pay_bill` (
-- 表结构:`prc_pay_bill_fee`
-- ----------------------------
CREATE TABLE `prc_pay_bill_fee` (
`fee_id` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '费用明细ID',
`bill_id` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '计费ID',
`pay_bill_id` varchar(36) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '应付主表ID,对应 prc_pay_bill.pay_bill_id',
`fee_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '费用明细ID',
`bill_id` bigint(20) NOT NULL COMMENT '计费ID',
`pay_bill_id` bigint(20) DEFAULT NULL COMMENT '应付主表ID,对应 prc_pay_bill.pay_bill_id',
`fee_type` varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '费用类型(字典bms_fee_type)',
`fee_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '费用名称',
`sc_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '附加费配置ID',
+1 -1
View File
@@ -98,7 +98,7 @@ CREATE TABLE IF NOT EXISTS `pay_bill` (
CREATE TABLE IF NOT EXISTS `pay_bill_line` (
`line_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '账单行ID',
`bill_id` bigint(20) NOT NULL COMMENT '应付账单ID',
`order_bill_id` varchar(36) DEFAULT NULL COMMENT '订单ID',
`order_bill_id` bigint(20) DEFAULT NULL COMMENT '订单ID',
`order_no` varchar(64) DEFAULT NULL COMMENT '订单号',
`lading_no` varchar(64) DEFAULT NULL COMMENT '提单号',
`lading_fee_id` bigint(20) DEFAULT NULL COMMENT '留在主单上的费用',
+4 -4
View File
@@ -23,7 +23,7 @@ ALTER TABLE `bms`.`pay_bill` ADD COLUMN `confirm_by` varchar(64) CHARACTER SET u
ALTER TABLE `bms`.`pay_bill` ADD COLUMN `confirm_time` datetime DEFAULT NULL COMMENT '审核时间' AFTER `confirm_by`;
-- `pay_bill_line` 增加费用明细ID
ALTER TABLE `bms`.`pay_bill_line` ADD COLUMN `fee_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '应付费用明细ID' AFTER `bill_id`;
ALTER TABLE `bms`.`pay_bill_line` ADD COLUMN `fee_id` bigint(20) DEFAULT NULL COMMENT '应付费用明细ID' AFTER `bill_id`;
-- `pay_bill_line` 增加费用来源
ALTER TABLE `bms`.`pay_bill_line` ADD COLUMN `fee_source` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'CALC计算 LADING提单分摊 MANUAL人工' AFTER `fee_name`;
@@ -53,7 +53,7 @@ ALTER TABLE `bms`.`pay_bill_log` ADD COLUMN `biz_id` bigint(20) DEFAULT NULL COM
ALTER TABLE `bms`.`pay_bill_log` ADD COLUMN `line_id` bigint(20) DEFAULT NULL COMMENT '账单行ID' AFTER `biz_id`;
-- `pay_bill_log` 增加费用明细
ALTER TABLE `bms`.`pay_bill_log` ADD COLUMN `fee_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '费用明细ID' AFTER `line_id`;
ALTER TABLE `bms`.`pay_bill_log` ADD COLUMN `fee_id` bigint(20) DEFAULT NULL COMMENT '费用明细ID' AFTER `line_id`;
-- `pay_bill_log` 增加改前金额
ALTER TABLE `bms`.`pay_bill_log` ADD COLUMN `amount_before` decimal(18,4) DEFAULT NULL COMMENT '改前金额' AFTER `operation_desc`;
@@ -66,13 +66,13 @@ CREATE TABLE `bms`.`pay_bill_diff` (
`diff_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '差异ID',
`bill_id` bigint(20) NOT NULL COMMENT '应付账单ID',
`line_id` bigint(20) NOT NULL COMMENT '账单行ID',
`fee_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '费用明细ID',
`fee_id` bigint(20) DEFAULT NULL COMMENT '费用明细ID',
`our_amount` decimal(18,4) NOT NULL COMMENT '我方金额',
`supplier_amount` decimal(18,4) NOT NULL COMMENT '对方金额',
`diff_amount` decimal(18,4) NOT NULL COMMENT '差额,对方减我方',
`reason` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '差异原因',
`handle_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'OPEN未处理 ACCEPT_OURS接受我方 ACCEPT_THEIRS接受对方',
`adjust_fee_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '接受对方时新增的调整费用',
`adjust_fee_id` bigint(20) DEFAULT NULL COMMENT '接受对方时新增的调整费用',
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL COMMENT '创建时间',
PRIMARY KEY (`diff_id`),