回滚代码

This commit is contained in:
wuweihua
2026-10-16 20:28:49 +08:00
parent 9ff89e36ee
commit 52f714c760
29 changed files with 505 additions and 1413 deletions
@@ -35,12 +35,6 @@ public interface IPrcBillingTaskService
*/
PrcBillingTask retryTask(Long taskId);
/**
* Manual resync by prc_order.order_id (task queue row may already be deleted).
* @return order after retry
*/
com.bms.price.domain.PrcOrder retryByOrderId(String orderId);
/**
* Start async filter retry (customer + bill_time). Returns async task id for progress poll.
*/
@@ -1,25 +0,0 @@
package com.bms.price.service;
import java.util.Date;
import java.util.List;
import java.util.Map;
import com.bms.price.domain.PrcOrder;
import com.bms.price.domain.vo.TmsPriceBillRequest;
/** prc_order service */
public interface IPrcOrderService
{
PrcOrder selectPrcOrderById(String orderId);
PrcOrder selectPrcOrderByTransferNo(String transferNo);
List<PrcOrder> selectPrcOrderList(PrcOrder query);
/**
* Upsert prc_order + prc_order_ext by transfer_no (overwrite upstream fields when exists).
* @return persisted order (stable orderId)
*/
PrcOrder upsertFromUpstream(Map<String, Object> upstreamRow, TmsPriceBillRequest billReq, Date bizDate);
void updateBillingStatus(String orderId, String successStatus, String failCode);
}
@@ -15,7 +15,6 @@ import com.bms.common.utils.StringUtils;
import com.bms.price.config.BillingProperties;
import com.bms.price.domain.PrcBillingTask;
import com.bms.price.domain.PrcBillingTaskRetryTask;
import com.bms.price.domain.PrcOrder;
import com.bms.price.domain.PrcOrderBill;
import com.bms.price.domain.vo.BillingTaskRetryByFilterRequest;
import com.bms.price.domain.vo.BillingTaskSubmitRequest;
@@ -33,7 +32,6 @@ import com.bms.price.oracle.OracleOrderBillMapper;
import com.bms.price.oracle.OracleUpstreamOrderService;
import com.bms.price.service.IPrcBillingTaskService;
import com.bms.price.service.IPrcOrderBillService;
import com.bms.price.service.IPrcOrderService;
import com.bms.price.task.PrcBillingTaskRetryAsyncRunner;
@Service
@@ -59,9 +57,6 @@ public class PrcBillingTaskServiceImpl implements IPrcBillingTaskService
@Autowired
private IPrcOrderBillService prcOrderBillService;
@Autowired
private IPrcOrderService prcOrderService;
@Autowired
private BillingProperties billingProperties;
@@ -254,17 +249,29 @@ public class PrcBillingTaskServiceImpl implements IPrcBillingTaskService
}
/**
* Map upstream row -> upsert prc_order(+ext) -> delete billing task by transfer_no -> bill
* -> write success_status/fail_code onto prc_order (task is already gone).
* 用上游 Oracle 全行数据映射并计费(公共逻辑:MQ 处理与订单列表同步复用)。
* 订单列表同步时行数据已由分页查询拉回,避免每单再走 findMainOrder 的公网往返。
*/
private void billFromUpstreamRow(PrcBillingTask task, Map<String, Object> row)
{
Long taskId = task.getTaskId();
TmsPriceBillRequest billReq = oracleOrderBillMapper.toBillRequest(row,
billingProperties.getOracle().getDefaultProductCode());
if (billReq == null)
if (billReq == null || StringUtils.isEmpty(billReq.getOrderNo()))
{
throw new ServiceException("Oracle order mapped empty");
throw new ServiceException("Oracle order mapped orderNo empty");
}
if (StringUtils.isEmpty(billReq.getCustomerCode()))
{
throw new ServiceException("Oracle order mapped customerCode empty");
}
if (StringUtils.isEmpty(billReq.getProductCode()))
{
throw new ServiceException("Oracle order mapped productCode empty");
}
if (billReq.getWeight() == null || billReq.getWeight().signum() <= 0)
{
throw new ServiceException("Oracle order mapped weight invalid");
}
// Identity keys from mobile inbound are source of truth; do not replace with Oracle remap.
if (StringUtils.isNotEmpty(task.getTransferNo()))
@@ -283,55 +290,21 @@ public class PrcBillingTaskServiceImpl implements IPrcBillingTaskService
billReq.setBizDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(task.getBillTime()));
task.setCustomerCode(billReq.getCustomerCode());
// Always persist upstream onto prc_order first (even if later billing validation fails).
PrcOrder order = prcOrderService.upsertFromUpstream(row, billReq, task.getBillTime());
billReq.setOrderId(order.getOrderId());
String transferNo = order.getTransferNo();
if (StringUtils.isNotEmpty(transferNo))
TmsPriceQuoteResult result = billWithDbRetry(taskId, billReq);
// Soft-fail (product/country/weight miss): order bill already persisted with zero amounts;
// still mark task FAILED so it appears in abnormal-task list for retry/ops.
if (result != null && BillBillingFailStatus.isFail(result.getBillingFailStatus()))
{
billingTaskMapper.deleteByTransferNo(transferNo);
String err = StringUtils.isNotEmpty(result.getMatchMessage())
? result.getMatchMessage()
: ("billingFailStatus=" + result.getBillingFailStatus());
writeback(task, BillTaskSuccessStatus.FAILED, result.getBillId(), cut(err, 900),
BillBillingFailStatus.toTaskFailCode(result.getBillingFailStatus()));
}
try
else
{
if (StringUtils.isEmpty(billReq.getOrderNo()))
{
throw new ServiceException("Oracle order mapped orderNo empty");
}
if (StringUtils.isEmpty(billReq.getCustomerCode()))
{
throw new ServiceException("Oracle order mapped customerCode empty");
}
if (StringUtils.isEmpty(billReq.getProductCode()))
{
throw new ServiceException("Oracle order mapped productCode empty");
}
if (billReq.getWeight() == null || billReq.getWeight().signum() <= 0)
{
throw new ServiceException("Oracle order mapped weight invalid");
}
TmsPriceQuoteResult result = billWithDbRetry(taskId, billReq);
if (result != null && BillBillingFailStatus.isFail(result.getBillingFailStatus()))
{
String failCode = BillBillingFailStatus.toTaskFailCode(result.getBillingFailStatus());
prcOrderService.updateBillingStatus(order.getOrderId(),
BillTaskSuccessStatus.FAILED.getCode(), failCode);
}
else
{
prcOrderService.updateBillingStatus(order.getOrderId(),
BillTaskSuccessStatus.SUCCESS.getCode(), null);
}
}
catch (RuntimeException e)
{
// Task row already deleted; persist fail on prc_order only (do not rethrow for writeback).
String failCode = BillTaskFailCode.resolveCode(e.getMessage());
prcOrderService.updateBillingStatus(order.getOrderId(),
BillTaskSuccessStatus.FAILED.getCode(), failCode);
log.error("billing failed after prc_order upsert orderId={} transferNo={}",
order.getOrderId(), transferNo, e);
writeback(task, BillTaskSuccessStatus.SUCCESS, result == null ? null : result.getBillId(),
null, null);
}
}
@@ -478,41 +451,6 @@ public class PrcBillingTaskServiceImpl implements IPrcBillingTaskService
return billingTaskMapper.selectPrcBillingTaskList(query);
}
@Override
public PrcOrder retryByOrderId(String orderId)
{
if (StringUtils.isEmpty(orderId))
{
throw new ServiceException("orderId required");
}
PrcOrder order = prcOrderService.selectPrcOrderById(orderId.trim());
if (order == null)
{
throw new ServiceException("prc_order not found");
}
if (order.getBizDate() == null)
{
throw new ServiceException("prc_order bizDate empty (billing time required)");
}
Map<String, Object> row = oracleUpstreamOrderService.findMainOrder(
order.getTransferNo(), order.getOrderNo(), order.getTrackingNo());
if (row == null || row.isEmpty())
{
prcOrderService.updateBillingStatus(order.getOrderId(),
BillTaskSuccessStatus.FAILED.getCode(), BillTaskFailCode.ORACLE_ORDER_NOT_FOUND.getCode());
return prcOrderService.selectPrcOrderById(order.getOrderId());
}
PrcBillingTask transientTask = new PrcBillingTask();
transientTask.setTransferNo(order.getTransferNo());
transientTask.setTrackingNo(order.getTrackingNo());
transientTask.setOrderNo(order.getOrderNo());
transientTask.setCustomerCode(order.getCustomerCode());
transientTask.setBillTime(order.getBizDate());
transientTask.setBillType(BillTaskType.REBILL.getCode());
billFromUpstreamRow(transientTask, row);
return prcOrderService.selectPrcOrderById(order.getOrderId());
}
@Override
public PrcBillingTask retryTask(Long taskId)
{
@@ -39,7 +39,7 @@ import com.bms.system.service.IBmsBizRuleService;
import com.bms.price.domain.PrcIncomeBill;
import com.bms.price.domain.PrcIncomeBillFee;
import com.bms.price.domain.PrcOrderBill;
import com.bms.price.domain.PrcOrderExt;
import com.bms.price.domain.PrcOrderBillExt;
import com.bms.price.domain.PrcPayBill;
import com.bms.price.domain.PrcPayBillFee;
import com.bms.price.domain.PrcSurcharge;
@@ -67,11 +67,11 @@ import com.bms.price.enums.BillBillingFailStatus;
import com.bms.price.enums.TmsOrderBillMatchType;
import com.bms.price.mapper.PrcIncomeBillFeeMapper;
import com.bms.price.mapper.PrcIncomeBillMapper;
import com.bms.price.mapper.PrcOrderExtMapper;
import com.bms.price.mapper.PrcOrderBillExtMapper;
import com.bms.price.mapper.PrcOrderBillMapper;
import com.bms.price.mapper.PrcPayBillFeeMapper;
import com.bms.price.mapper.PrcPayBillMapper;
import com.bms.price.oracle.OracleOrderExtFiller;
import com.bms.price.oracle.OracleOrderBillExtFiller;
import com.bms.price.search.EsBizLogSupport;
import com.bms.price.search.EsLogType;
import com.bms.price.search.IBillSearchStore;
@@ -108,7 +108,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
private SysUserMapper sysUserMapper;
@Autowired
private PrcOrderExtMapper orderExtMapper;
private PrcOrderBillExtMapper orderBillExtMapper;
@Autowired
private PrcIncomeBillFeeMapper incomeBillFeeMapper;
@@ -1255,10 +1255,6 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
}
bill.setBillKey(billKey);
bill.setOrderNo(orderNo);
if (StringUtils.isNotEmpty(request.getOrderId()))
{
bill.setOrderId(request.getOrderId());
}
Long customerId = request.getCustomerId();
if (customerId == null && result != null)
{
@@ -1301,7 +1297,6 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
bill.setDestPostcode(request.getDestPostcode());
bill.setWarehouseCode(request.getWarehouseCode());
bill.setOrderTime(request.getOrderTime());
bill.setPickupDate(request.getPickupDate());
bill.setOrderRemark(request.getOrderRemark());
bill.setProductCode(result.getProductCode());
bill.setProductName(result.getProductName());
@@ -1878,23 +1873,22 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
return r;
}
/** Persist prc_order_ext when upstream TAB_ORDER row exists. Requires bill.orderId (parent wires prc_order first). */
/** 仅在存在上游 TAB_ORDER 行时写入 prc_order_bill_ext。 */
private void persistBillExt(PrcOrderBill bill, java.util.Map<String, Object> upstreamRow)
{
if (bill == null || StringUtils.isEmpty(bill.getOrderId()))
if (bill == null || StringUtils.isEmpty(bill.getBillId()))
{
// skip ext persist until orderId is set (parent will wire order first)
return;
}
if (upstreamRow == null || upstreamRow.isEmpty())
{
return;
}
PrcOrderExt ext = new PrcOrderExt();
ext.setOrderId(bill.getOrderId());
PrcOrderBillExt ext = new PrcOrderBillExt();
ext.setBillId(bill.getBillId());
ext.setOrderNo(bill.getOrderNo());
OracleOrderExtFiller.fillFromRow(ext, upstreamRow);
orderExtMapper.upsertPrcOrderExt(ext);
OracleOrderBillExtFiller.fillFromRow(ext, upstreamRow);
orderBillExtMapper.upsertPrcOrderBillExt(ext);
}
private List<TmsPriceQuoteFeeLine> toIncomeFeeLines(List<PrcIncomeBillFee> fees)
@@ -1,108 +0,0 @@
package com.bms.price.service.impl;
import java.util.Date;
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;
import com.bms.common.exception.ServiceException;
import com.bms.common.utils.DateUtils;
import com.bms.common.utils.StringUtils;
import com.bms.price.domain.PrcOrder;
import com.bms.price.domain.PrcOrderExt;
import com.bms.price.domain.vo.TmsPriceBillRequest;
import com.bms.price.enums.BillTaskSuccessStatus;
import com.bms.price.mapper.PrcOrderExtMapper;
import com.bms.price.mapper.PrcOrderMapper;
import com.bms.price.oracle.OracleOrderExtFiller;
import com.bms.price.oracle.OracleOrderFiller;
import com.bms.price.service.IPrcOrderService;
@Service
public class PrcOrderServiceImpl implements IPrcOrderService
{
@Autowired
private PrcOrderMapper prcOrderMapper;
@Autowired
private PrcOrderExtMapper prcOrderExtMapper;
@Override
public PrcOrder selectPrcOrderById(String orderId)
{
return prcOrderMapper.selectPrcOrderById(orderId);
}
@Override
public PrcOrder selectPrcOrderByTransferNo(String transferNo)
{
return prcOrderMapper.selectPrcOrderByTransferNo(transferNo);
}
@Override
public List<PrcOrder> selectPrcOrderList(PrcOrder query)
{
return prcOrderMapper.selectPrcOrderList(query);
}
@Override
@Transactional(rollbackFor = Exception.class)
public PrcOrder upsertFromUpstream(Map<String, Object> upstreamRow, TmsPriceBillRequest billReq, Date bizDate)
{
if (upstreamRow == null || upstreamRow.isEmpty())
{
throw new ServiceException("upstream order row required");
}
PrcOrder order = new PrcOrder();
OracleOrderFiller.fillFromRow(order, upstreamRow, billReq, bizDate);
if (StringUtils.isEmpty(order.getTransferNo()))
{
throw new ServiceException("transferNo required for prc_order upsert");
}
if (StringUtils.isEmpty(order.getOrderNo()))
{
throw new ServiceException("orderNo required for prc_order upsert");
}
Date now = DateUtils.getNowDate();
PrcOrder existing = prcOrderMapper.selectPrcOrderByTransferNo(order.getTransferNo());
if (existing != null && StringUtils.isNotEmpty(existing.getOrderId()))
{
order.setOrderId(existing.getOrderId());
order.setUpdateTime(now);
// keep prior status unless caller resets; default WAITING on re-sync before bill
order.setSuccessStatus(BillTaskSuccessStatus.WAITING.getCode());
order.setFailCode(null);
prcOrderMapper.updatePrcOrder(order);
}
else
{
order.setOrderId(UUID.randomUUID().toString());
order.setSuccessStatus(BillTaskSuccessStatus.WAITING.getCode());
order.setFailCode(null);
order.setCreateTime(now);
order.setUpdateTime(now);
prcOrderMapper.insertPrcOrder(order);
}
PrcOrderExt ext = new PrcOrderExt();
ext.setOrderId(order.getOrderId());
ext.setOrderNo(order.getOrderNo());
OracleOrderExtFiller.fillFromRow(ext, upstreamRow);
ext.setCreateTime(now);
ext.setUpdateTime(now);
prcOrderExtMapper.upsertPrcOrderExt(ext);
return order;
}
@Override
public void updateBillingStatus(String orderId, String successStatus, String failCode)
{
if (StringUtils.isEmpty(orderId))
{
return;
}
prcOrderMapper.updateBillingStatus(orderId, successStatus, failCode, null);
}
}