Compare commits
2 Commits
12754a7015
...
3bdb6185b6
| Author | SHA1 | Date |
|---|---|---|
|
|
3bdb6185b6 | |
|
|
db370adfdf |
|
|
@ -0,0 +1,229 @@
|
|||
package com.njzscloud.dispose.cst.order.helper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.njzscloud.dispose.cst.customer.constant.SettlementWay;
|
||||
import com.njzscloud.dispose.cst.order.constant.PaymentStatus;
|
||||
import com.njzscloud.dispose.cst.order.pojo.entity.OrderExpenseItemsEntity;
|
||||
import com.njzscloud.dispose.cst.order.pojo.entity.OrderPaymentRecordEntity;
|
||||
import com.njzscloud.dispose.cst.order.service.OrderExpenseItemsService;
|
||||
import com.njzscloud.dispose.cst.order.service.OrderPaymentRecordService;
|
||||
import com.njzscloud.dispose.finance.constant.ExpenseStrategy;
|
||||
import com.njzscloud.dispose.finance.constant.MoneyChangeCategory;
|
||||
import com.njzscloud.dispose.finance.constant.Unit;
|
||||
import com.njzscloud.dispose.finance.pojo.entity.MoneyAccountEntity;
|
||||
import com.njzscloud.dispose.finance.pojo.entity.MoneyFlowEntity;
|
||||
import com.njzscloud.dispose.finance.service.MoneyAccountService;
|
||||
import com.njzscloud.dispose.finance.service.MoneyFlowService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 付费记录业务处理帮助类
|
||||
*
|
||||
* @author ljw
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
public class PaymentRecordHelper {
|
||||
|
||||
private final OrderPaymentRecordService orderPaymentRecordService;
|
||||
private final OrderExpenseItemsService orderExpenseItemsService;
|
||||
private final MoneyAccountService moneyAccountService;
|
||||
private final MoneyFlowService moneyFlowService;
|
||||
|
||||
/**
|
||||
* 更新付费记录的量,计算结算金额并支付
|
||||
*
|
||||
* @param transId 运输记录ID
|
||||
* @param settleWeight 净重(单位:千克)
|
||||
* @param transDistance 运距(单位:米)
|
||||
* @param orderSn 订单编号(用于资金流水)
|
||||
* @param trainNum 车次(用于资金流水)
|
||||
* @return 该运输记录下的所有付费记录是否都已完成(支付状态为免费或已支付)
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public boolean updatePaymentRecordQuantity(Long transId, Integer settleWeight, Integer transDistance, String orderSn, Integer trainNum) {
|
||||
// 1. 通过运输信息ID查询付费记录
|
||||
List<OrderPaymentRecordEntity> paymentRecords = orderPaymentRecordService.list(
|
||||
Wrappers.<OrderPaymentRecordEntity>lambdaQuery()
|
||||
.eq(OrderPaymentRecordEntity::getTransId, transId));
|
||||
|
||||
if (paymentRecords.isEmpty()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// 2. 遍历更新每条付费记录的量
|
||||
for (OrderPaymentRecordEntity record : paymentRecords) {
|
||||
// 通过付费记录的订单收费项 Id 查询付费项
|
||||
OrderExpenseItemsEntity expenseItem = orderExpenseItemsService.getById(record.getExpenseItemId());
|
||||
Unit unit = expenseItem.getUnit();
|
||||
ExpenseStrategy expenseStrategy = expenseItem.getExpenseStrategy();
|
||||
|
||||
// 3. 根据单位计算量
|
||||
BigDecimal quantity = calculateQuantity(unit, settleWeight, transDistance);
|
||||
if (quantity == null) {
|
||||
// 单位为方,暂不处理
|
||||
continue;
|
||||
}
|
||||
|
||||
// 4. 计算总金额
|
||||
BigDecimal totalMoney = calculateTotalMoney(expenseStrategy, expenseItem, quantity);
|
||||
|
||||
// 5. 计算结算金额(discountMoney、reviseMoney 可为正负,直接做加法)
|
||||
BigDecimal discountMoney = record.getDiscountMoney() != null ? record.getDiscountMoney() : BigDecimal.ZERO;
|
||||
BigDecimal reviseMoney = record.getReviseMoney() != null ? record.getReviseMoney() : BigDecimal.ZERO;
|
||||
BigDecimal settleMoney = totalMoney.add(discountMoney).add(reviseMoney);
|
||||
|
||||
// 6. 更新付费记录
|
||||
OrderPaymentRecordEntity updateRecord = new OrderPaymentRecordEntity();
|
||||
updateRecord.setId(record.getId());
|
||||
updateRecord.setQuantity(quantity);
|
||||
updateRecord.setTotalMoney(totalMoney);
|
||||
updateRecord.setSettleMoney(settleMoney);
|
||||
orderPaymentRecordService.updateById(updateRecord);
|
||||
|
||||
// 7. 处理支付完成
|
||||
if (ExpenseStrategy.MianFei.equals(expenseStrategy)) {
|
||||
// 免费
|
||||
OrderPaymentRecordEntity payRecord = new OrderPaymentRecordEntity();
|
||||
payRecord.setId(record.getId());
|
||||
payRecord.setPaymentStatus(PaymentStatus.MianFei);
|
||||
payRecord.setPayTime(LocalDateTime.now());
|
||||
orderPaymentRecordService.updateById(payRecord);
|
||||
} else {
|
||||
// 非免费,需要处理支付
|
||||
SettlementWay settlementWay = record.getSettlementWay();
|
||||
if (SettlementWay.YueJie.equals(settlementWay) || SettlementWay.YuE.equals(settlementWay)) {
|
||||
// 月结/余额结算
|
||||
this.deductPayment(record, settleMoney, orderSn, trainNum);
|
||||
OrderPaymentRecordEntity payRecord = new OrderPaymentRecordEntity();
|
||||
payRecord.setId(record.getId());
|
||||
payRecord.setPaymentStatus(PaymentStatus.YiZhiFu);
|
||||
payRecord.setPayTime(LocalDateTime.now());
|
||||
orderPaymentRecordService.updateById(payRecord);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 8. 检查该运输记录下所有付费记录是否都已完成
|
||||
List<OrderPaymentRecordEntity> updatedRecords = orderPaymentRecordService.list(
|
||||
Wrappers.<OrderPaymentRecordEntity>lambdaQuery()
|
||||
.eq(OrderPaymentRecordEntity::getTransId, transId));
|
||||
|
||||
boolean allCompleted = updatedRecords.stream()
|
||||
.allMatch(r -> PaymentStatus.MianFei.equals(r.getPaymentStatus()) || PaymentStatus.YiZhiFu.equals(r.getPaymentStatus()));
|
||||
|
||||
log.info("运输记录 {} 的付费记录量更新完成,所有记录已完成: {}", transId, allCompleted);
|
||||
return allCompleted;
|
||||
}
|
||||
|
||||
/**
|
||||
* 扣减付款人资金账户并记录流水
|
||||
*
|
||||
* @param record 付费记录
|
||||
* @param settleMoney 结算金额(支付金额)
|
||||
* @param orderSn 订单编号
|
||||
* @param trainNum 车次
|
||||
*/
|
||||
private void deductPayment(OrderPaymentRecordEntity record, BigDecimal settleMoney, String orderSn, Integer trainNum) {
|
||||
Long moneyAccountId = record.getPayerMoneyAccountId();
|
||||
if (moneyAccountId == null) {
|
||||
log.warn("付费记录 {} 缺少资金账户ID,无法扣款", record.getId());
|
||||
return;
|
||||
}
|
||||
|
||||
MoneyAccountEntity accountEntity = moneyAccountService.getById(moneyAccountId);
|
||||
if (accountEntity == null) {
|
||||
log.warn("资金账户 {} 不存在,无法扣款", moneyAccountId);
|
||||
return;
|
||||
}
|
||||
|
||||
BigDecimal beforeBalance = accountEntity.getRecharge();
|
||||
BigDecimal afterBalance = beforeBalance.subtract(settleMoney);
|
||||
|
||||
// 更新资金账户余额
|
||||
accountEntity.setRecharge(afterBalance);
|
||||
moneyAccountService.updateById(accountEntity);
|
||||
|
||||
// 记录资金流水
|
||||
MoneyFlowEntity flowEntity = new MoneyFlowEntity()
|
||||
.setOrderId(record.getOrderId())
|
||||
.setOrderSn(orderSn)
|
||||
.setTrainNum(trainNum)
|
||||
.setMoneyAccountId(moneyAccountId)
|
||||
.setBeforeBalance(beforeBalance)
|
||||
.setDelta(settleMoney.negate()) // 支出为负
|
||||
.setAfterBalance(afterBalance)
|
||||
.setMoneyChangeCategory(MoneyChangeCategory.ZhiFu)
|
||||
.setMemo("订单支付");
|
||||
moneyFlowService.save(flowEntity);
|
||||
|
||||
log.info("资金账户 {} 扣款成功,扣款前余额:{},扣款金额:{},扣款后余额:{}",
|
||||
moneyAccountId, beforeBalance, settleMoney, afterBalance);
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算总金额
|
||||
*
|
||||
* @param expenseStrategy 计费策略
|
||||
* @param expenseItem 付费项配置
|
||||
* @param quantity 量
|
||||
* @return 总金额
|
||||
*/
|
||||
private BigDecimal calculateTotalMoney(ExpenseStrategy expenseStrategy, OrderExpenseItemsEntity expenseItem, BigDecimal quantity) {
|
||||
return switch (expenseStrategy) {
|
||||
case MianFei -> BigDecimal.ZERO; // 免费
|
||||
case TanXing -> { // 弹性计费
|
||||
BigDecimal initialPrice = expenseItem.getInitialPrice();
|
||||
Integer initialQuantity = expenseItem.getInitialQuantity();
|
||||
Integer everyQuantity = expenseItem.getEveryQuantity();
|
||||
BigDecimal unitPrice = expenseItem.getUnitPrice();
|
||||
|
||||
if (quantity.compareTo(BigDecimal.valueOf(initialQuantity)) <= 0) {
|
||||
// 净重 <= 起步量,总价 = 起步价
|
||||
yield initialPrice;
|
||||
} else {
|
||||
// 净重 > 起步量,计算超出部分的档次
|
||||
BigDecimal exceededQuantity = quantity.subtract(BigDecimal.valueOf(initialQuantity));
|
||||
int tiers = (int) Math.ceil(exceededQuantity.doubleValue() / everyQuantity);
|
||||
yield initialPrice.add(unitPrice.multiply(BigDecimal.valueOf(tiers)));
|
||||
}
|
||||
}
|
||||
case GuDing -> expenseItem.getUnitPrice(); // 固定价格
|
||||
case DanJia -> expenseItem.getUnitPrice().multiply(quantity); // 单价计费
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据单位计算量
|
||||
*
|
||||
* @param unit 单位
|
||||
* @param settleWeight 净重(单位:千克)
|
||||
* @param transDistance 运距(单位:米)
|
||||
* @return 量,单位为BigDecimal;返回null表示暂不处理(如方)
|
||||
*/
|
||||
private BigDecimal calculateQuantity(Unit unit, Integer settleWeight, Integer transDistance) {
|
||||
if (unit == null) {
|
||||
return null;
|
||||
}
|
||||
return switch (unit) {
|
||||
case Che -> BigDecimal.ONE; // 车:量为1
|
||||
case Fang -> null; // 方:暂不处理
|
||||
case GongLi -> transDistance != null
|
||||
? BigDecimal.valueOf(transDistance).divide(BigDecimal.valueOf(1000), 2, RoundingMode.HALF_UP) // 公里:米转公里
|
||||
: null;
|
||||
case Dun -> settleWeight != null
|
||||
? BigDecimal.valueOf(settleWeight).divide(BigDecimal.valueOf(1000), 2, RoundingMode.HALF_UP) // 吨:千克转吨
|
||||
: null;
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -3,6 +3,7 @@ package com.njzscloud.dispose.cst.order.pojo.entity;
|
|||
import com.baomidou.mybatisplus.annotation.*;
|
||||
import com.njzscloud.dispose.cst.order.constant.OrderCategory;
|
||||
import com.njzscloud.dispose.cst.order.constant.OrderStatus;
|
||||
import com.njzscloud.dispose.finance.constant.Unit;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
|
|
@ -131,7 +132,7 @@ public class OrderEntity {
|
|||
/**
|
||||
* 计量单位;字典代码:unit
|
||||
*/
|
||||
private String unit;
|
||||
private Unit unit;
|
||||
|
||||
/**
|
||||
* 客户备注
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
|
|||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.njzscloud.dispose.finance.constant.ExpenseItemCategory;
|
||||
import com.njzscloud.dispose.finance.constant.ExpenseStrategy;
|
||||
import com.njzscloud.dispose.finance.constant.Unit;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
|
|
@ -69,7 +70,7 @@ public class OrderExpenseItemsEntity {
|
|||
/**
|
||||
* 计量单位;字典代码:unit
|
||||
*/
|
||||
private String unit;
|
||||
private Unit unit;
|
||||
|
||||
/**
|
||||
* 单价;单位:元,弹性模式-->每档价格
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ public class OrderPaymentRecordEntity {
|
|||
/**
|
||||
* 量
|
||||
*/
|
||||
private Integer quantity;
|
||||
private BigDecimal quantity;
|
||||
|
||||
/**
|
||||
* 支付状态,MianFei-->免费、WeiZhiFu-->未支付、YiZhiFu-->已支付、YiTuiKuan-->已退款
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ package com.njzscloud.dispose.cst.order.pojo.param;
|
|||
|
||||
import com.njzscloud.dispose.cst.order.constant.OrderCategory;
|
||||
import com.njzscloud.dispose.cst.order.constant.OrderStatus;
|
||||
import com.njzscloud.dispose.finance.constant.Unit;
|
||||
import lombok.Data;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
|
@ -98,7 +99,7 @@ public class CreateOrderParam {
|
|||
/**
|
||||
* 计量单位;字典代码:unit
|
||||
*/
|
||||
private String unit;
|
||||
private Unit unit;
|
||||
|
||||
/**
|
||||
* 客户备注
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ import com.njzscloud.dispose.cst.order.constant.CheckStatus;
|
|||
import com.njzscloud.dispose.cst.order.constant.OrderCategory;
|
||||
import com.njzscloud.dispose.cst.order.constant.OrderStatus;
|
||||
import com.njzscloud.dispose.cst.order.constant.TransStatus;
|
||||
import com.njzscloud.dispose.finance.constant.Unit;
|
||||
import lombok.Data;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
|
@ -177,6 +178,11 @@ public class OrderTransResult {
|
|||
*/
|
||||
private LocalDateTime outTime;
|
||||
|
||||
/**
|
||||
* 订单号
|
||||
*/
|
||||
private String sn;
|
||||
|
||||
/**
|
||||
* 运输组织 Id;cst_org.id
|
||||
*/
|
||||
|
|
@ -245,7 +251,7 @@ public class OrderTransResult {
|
|||
/**
|
||||
* 单位
|
||||
*/
|
||||
private String unit;
|
||||
private Unit unit;
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -9,22 +9,28 @@ import com.njzscloud.common.mp.support.PageParam;
|
|||
import com.njzscloud.common.mp.support.PageResult;
|
||||
import com.njzscloud.common.security.util.SecurityUtil;
|
||||
import com.njzscloud.common.sn.support.SnUtil;
|
||||
import com.njzscloud.dispose.cst.customer.constant.IdentityCategory;
|
||||
import com.njzscloud.dispose.cst.customer.constant.SettlementWay;
|
||||
import com.njzscloud.dispose.cst.customer.mapper.CustomerMapper;
|
||||
import com.njzscloud.dispose.cst.customer.pojo.entity.CustomerEntity;
|
||||
import com.njzscloud.dispose.cst.driver.mapper.DriverMapper;
|
||||
import com.njzscloud.dispose.cst.driver.pojo.entity.DriverEntity;
|
||||
import com.njzscloud.dispose.cst.order.constant.*;
|
||||
import com.njzscloud.dispose.cst.order.helper.PaymentRecordHelper;
|
||||
import com.njzscloud.dispose.cst.order.mapper.OrderMapper;
|
||||
import com.njzscloud.dispose.cst.order.mapper.OrderTransMapper;
|
||||
import com.njzscloud.dispose.cst.order.pojo.entity.*;
|
||||
import com.njzscloud.dispose.cst.order.pojo.param.*;
|
||||
import com.njzscloud.dispose.cst.order.pojo.result.OrderTransResult;
|
||||
import com.njzscloud.dispose.cst.station.mapper.StationMapper;
|
||||
import com.njzscloud.dispose.cst.station.pojo.entity.StationEntity;
|
||||
import com.njzscloud.dispose.cst.truck.mapper.TruckMapper;
|
||||
import com.njzscloud.dispose.cst.truck.pojo.entity.TruckEntity;
|
||||
import com.njzscloud.dispose.finance.constant.ExpenseStrategy;
|
||||
import com.njzscloud.dispose.finance.constant.ExpenseItemCategory;
|
||||
import com.njzscloud.dispose.finance.mapper.MoneyAccountMapper;
|
||||
import com.njzscloud.dispose.finance.pojo.entity.ExpenseItemEntity;
|
||||
import com.njzscloud.dispose.finance.pojo.entity.MoneyAccountEntity;
|
||||
import com.njzscloud.dispose.finance.pojo.result.MoneyAccountResult;
|
||||
import com.njzscloud.dispose.finance.service.ExpenseItemService;
|
||||
import com.njzscloud.dispose.sys.auth.pojo.result.MyResult;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
|
@ -33,10 +39,13 @@ import org.apache.commons.compress.utils.Lists;
|
|||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static com.njzscloud.dispose.event.SysMittEvent.PURCHASE_ORDER;
|
||||
import static com.njzscloud.dispose.event.SysMittEvent.SALES_ORDER;
|
||||
|
||||
/**
|
||||
* 收/销订单
|
||||
|
|
@ -57,6 +66,8 @@ public class OrderService extends ServiceImpl<OrderMapper, OrderEntity> {
|
|||
private final OrderExpenseItemsService orderExpenseItemsService;
|
||||
private final OrderPaymentRecordService orderPaymentRecordService;
|
||||
private final MoneyAccountMapper moneyAccountMapper;
|
||||
private final StationMapper stationMapper;
|
||||
private final PaymentRecordHelper paymentRecordHelper;
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void add(CreateOrderParam param) {
|
||||
|
|
@ -167,6 +178,21 @@ public class OrderService extends ServiceImpl<OrderMapper, OrderEntity> {
|
|||
Assert.isNull(result.getDriverId(), () -> Exceptions.clierr("当前订单已分配司机,无需重复分配"));
|
||||
Assert.isTrue(TransStatus.DaiPaiDan.equals(result.getTransStatus()), () -> Exceptions.clierr("当前订单状态,无法分配司机"));
|
||||
|
||||
// 获取订单的所有运输记录
|
||||
List<OrderPaymentRecordEntity> recordList = orderPaymentRecordService.list(Wrappers.<OrderPaymentRecordEntity>lambdaQuery()
|
||||
.eq(OrderPaymentRecordEntity::getTransId, result.getId()));
|
||||
for (OrderPaymentRecordEntity record : recordList) {
|
||||
if (SettlementWay.YuE.equals(record.getSettlementWay())) {
|
||||
MoneyAccountResult accountResult = moneyAccountMapper.detail(record.getPayerMoneyAccountId());
|
||||
// 如果该笔订单支付方式为余额支付,需在分配之前查询当前付款账户余额是否充足,
|
||||
// 不足则提示余额不足,不允许在派司机
|
||||
if (accountResult.getRecharge().compareTo(BigDecimal.ZERO) < 0) {
|
||||
// 已经是负数,禁止再次支付
|
||||
throw Exceptions.clierr(accountResult.getAccountName() + "账户余额不足");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DriverEntity driver = driverMapper.selectById(driverParam.getDriverId());
|
||||
Assert.notNull(driver, () -> Exceptions.clierr("司机不存在"));
|
||||
|
||||
|
|
@ -339,36 +365,27 @@ public class OrderService extends ServiceImpl<OrderMapper, OrderEntity> {
|
|||
transEntity.setOutTime(LocalDateTime.now());
|
||||
orderTransMapper.updateById(transEntity);
|
||||
|
||||
// 更新付费记录的量
|
||||
this.updatePaymentRecordQuantity(transEntity.getId(), transEntity.getSettleWeight());
|
||||
}
|
||||
// 更新付费记录的量,计算结算金额并支付
|
||||
boolean allCompleted = paymentRecordHelper.updatePaymentRecordQuantity(
|
||||
transEntity.getId(), transEntity.getSettleWeight(), transEntity.getTransDistance(),
|
||||
result.getSn(), result.getTrainNum());
|
||||
|
||||
/**
|
||||
* 更新付费记录的量
|
||||
*
|
||||
* @param transId 运输记录ID
|
||||
*/
|
||||
private void updatePaymentRecordQuantity(Long transId, Integer settleWeight) {
|
||||
// 1. 通过运输信息ID查询付费记录
|
||||
List<OrderPaymentRecordEntity> paymentRecords = orderPaymentRecordService.list(Wrappers.<OrderPaymentRecordEntity>lambdaQuery()
|
||||
.eq(OrderPaymentRecordEntity::getTransId, transId));
|
||||
// 如果该运输记录下所有付费记录都已完成,更新运输状态为已完成
|
||||
if (allCompleted) {
|
||||
OrderTransEntity updateTrans = new OrderTransEntity();
|
||||
updateTrans.setId(transEntity.getId());
|
||||
updateTrans.setTransStatus(TransStatus.YiWanCheng);
|
||||
updateTrans.setFinishTime(LocalDateTime.now());
|
||||
orderTransMapper.updateById(updateTrans);
|
||||
// 添加采购单或销售单
|
||||
if (OrderCategory.HuiShouYuYue.equals(result.getOrderCategory())) {
|
||||
PURCHASE_ORDER.emit(updateTrans.getId());
|
||||
} else if (OrderCategory.XiaoShouYuYue.equals(result.getOrderCategory())) {
|
||||
SALES_ORDER.emit(updateTrans.getId());
|
||||
}
|
||||
|
||||
if (paymentRecords.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 2. 遍历更新每条付费记录的量
|
||||
for (OrderPaymentRecordEntity record : paymentRecords) {
|
||||
// 通过付费记录的订单收费项 Id 查询付费项
|
||||
OrderExpenseItemsEntity expenseItem = orderExpenseItemsService.getById(record.getExpenseItemId());
|
||||
|
||||
// 3. 如果计费策略为Che,则量为1,否则为净重
|
||||
Integer quantity = ExpenseStrategy.Che.equals(expenseItem.getExpenseStrategy()) ? 1 : settleWeight;
|
||||
|
||||
OrderPaymentRecordEntity updateRecord = new OrderPaymentRecordEntity();
|
||||
updateRecord.setId(record.getId());
|
||||
updateRecord.setQuantity(quantity);
|
||||
orderPaymentRecordService.updateById(updateRecord);
|
||||
// 检查订单下所有运输记录是否都完成
|
||||
this.checkAndUpdateOrderStatus(result.getId());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -382,6 +399,30 @@ public class OrderService extends ServiceImpl<OrderMapper, OrderEntity> {
|
|||
truckMapper.updateById(truck);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查订单下所有运输记录是否都完成,如果都完成则更新订单状态
|
||||
*
|
||||
* @param orderId 订单ID
|
||||
*/
|
||||
private void checkAndUpdateOrderStatus(Long orderId) {
|
||||
List<OrderTransEntity> transList = orderTransMapper.selectList(
|
||||
Wrappers.<OrderTransEntity>lambdaQuery()
|
||||
.eq(OrderTransEntity::getOrderId, orderId)
|
||||
.ne(OrderTransEntity::getTransStatus, TransStatus.YiQuXiao));
|
||||
|
||||
boolean allCompleted = transList.stream()
|
||||
.allMatch(t -> TransStatus.YiWanCheng.equals(t.getTransStatus()));
|
||||
|
||||
if (allCompleted) {
|
||||
OrderEntity updateOrder = new OrderEntity();
|
||||
updateOrder.setId(orderId);
|
||||
updateOrder.setOrderStatus(OrderStatus.YiWanCheng);
|
||||
updateOrder.setFinishTime(LocalDateTime.now());
|
||||
this.updateById(updateOrder);
|
||||
log.info("订单 {} 所有运输记录已完成,更新订单状态为已完成", orderId);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成订单号
|
||||
*
|
||||
|
|
@ -401,61 +442,71 @@ public class OrderService extends ServiceImpl<OrderMapper, OrderEntity> {
|
|||
* @param orderEntity 订单信息
|
||||
*/
|
||||
public void createOrderExpenseItems(OrderEntity orderEntity) {
|
||||
// 组织ids集合
|
||||
List<Long> orgIds = Lists.newArrayList();
|
||||
Long transOrgId = orderEntity.getTransOrgId();
|
||||
orgIds.add(transOrgId);
|
||||
CustomerEntity customerEntity = customerMapper.selectOne(Wrappers.<CustomerEntity>lambdaQuery()
|
||||
.eq(CustomerEntity::getIdentityCategory, IdentityCategory.PingTai)
|
||||
.eq(CustomerEntity::getManager, Boolean.TRUE)
|
||||
.eq(CustomerEntity::getDeleted, Boolean.FALSE));
|
||||
orgIds.add(customerEntity.getOrgId());
|
||||
StationEntity station = stationMapper.selectById(orderEntity.getStationId());
|
||||
orgIds.add(station.getOrgId());
|
||||
|
||||
// 读取启用的付费项配置,并按过滤
|
||||
List<ExpenseItemEntity> itemEntityList = expenseItemService.list(Wrappers.<ExpenseItemEntity>lambdaQuery()
|
||||
.in(ExpenseItemEntity::getOrgId, orgIds)
|
||||
.eq(ExpenseItemEntity::getCanuse, Boolean.TRUE)
|
||||
.eq(ExpenseItemEntity::getDeleted, Boolean.FALSE));
|
||||
Long transOrgId = orderEntity.getTransOrgId();
|
||||
Long goodsId = orderEntity.getGoodsId();
|
||||
Long stationId = orderEntity.getStationId();
|
||||
List<ExpenseItemEntity> goodsItems = itemEntityList.stream().filter(item ->
|
||||
item.getGoodsId().equals(goodsId)).toList();
|
||||
// 1. 查找产品付费项(goodsId + station.getOrgId() + ChanPin,只会匹配到一个)
|
||||
ExpenseItemEntity firstGoodsItem = itemEntityList.stream()
|
||||
.filter(item -> goodsId.equals(item.getGoodsId())
|
||||
&& station.getOrgId().equals(item.getOrgId())
|
||||
&& ExpenseItemCategory.ChanPin.equals(item.getExpenseItemCategory()))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
|
||||
OrderExpenseItemsEntity goodsOrderItem = null;
|
||||
if (!goodsItems.isEmpty()) {
|
||||
goodsOrderItem = BeanUtil.copyProperties(goodsItems.getFirst(), OrderExpenseItemsEntity.class)
|
||||
.setOrderId(orderEntity.getId())
|
||||
.setOriginExpenseItemsId(goodsItems.getFirst().getId());
|
||||
}
|
||||
// 2. 查找运费付费项(YunFei + transOrgId,可能有多条)
|
||||
List<ExpenseItemEntity> freightItems = itemEntityList.stream()
|
||||
.filter(item -> transOrgId.equals(item.getOrgId())
|
||||
&& ExpenseItemCategory.YunFei.equals(item.getExpenseItemCategory()))
|
||||
.toList();
|
||||
|
||||
// 3. 过滤其他付费项(排除产品、运费)
|
||||
List<OrderExpenseItemsEntity> extraItems = itemEntityList.stream()
|
||||
.filter(cfg -> {
|
||||
Long userId = cfg.getUserId();
|
||||
Long customerId = cfg.getCustomerId();
|
||||
Long orgId = cfg.getOrgId();
|
||||
|
||||
// 判断用户归属范围
|
||||
boolean isUserTrue = userId == null || userId.equals(orderEntity.getUserId());
|
||||
|
||||
// 判断客户归属范围
|
||||
boolean isCustomerTrue = customerId == null || customerId.equals(orderEntity.getCustomerId());
|
||||
|
||||
// 判断组织归属范围
|
||||
boolean isOrgTrue = orgId == null || orgId.equals(orderEntity.getTransOrgId());
|
||||
|
||||
// 只有当三个条件都为true时,才返回true
|
||||
return isUserTrue && isCustomerTrue && isOrgTrue;
|
||||
})
|
||||
// 复制配置为订单付费项(数量口径与产品一致:按车=1,否则=settleWeight)
|
||||
.filter(cfg -> !ExpenseItemCategory.ChanPin.equals(cfg.getExpenseItemCategory())
|
||||
&& !ExpenseItemCategory.YunFei.equals(cfg.getExpenseItemCategory()))
|
||||
// 复制配置为订单付费项
|
||||
.map(cfg -> {
|
||||
OrderExpenseItemsEntity entity = BeanUtil.copyProperties(cfg, OrderExpenseItemsEntity.class);
|
||||
entity.setOrderId(orderEntity.getId());
|
||||
entity.setOriginExpenseItemsId(cfg.getId());
|
||||
return entity;
|
||||
})
|
||||
.collect(Collectors.toList());
|
||||
.toList();
|
||||
|
||||
// 第三步:合并集合并计算金额,然后批量落库
|
||||
if (goodsOrderItem != null) {
|
||||
extraItems.addFirst(goodsOrderItem);
|
||||
// 第四步:合并集合并计算金额,然后批量落库
|
||||
List<OrderExpenseItemsEntity> allItems = Lists.newArrayList();
|
||||
if (firstGoodsItem != null) {
|
||||
allItems.add(BeanUtil.copyProperties(firstGoodsItem, OrderExpenseItemsEntity.class)
|
||||
.setOrderId(orderEntity.getId())
|
||||
.setOriginExpenseItemsId(firstGoodsItem.getId()));
|
||||
}
|
||||
// 添加所有运费付费项
|
||||
freightItems.forEach(item -> allItems.add(
|
||||
BeanUtil.copyProperties(item, OrderExpenseItemsEntity.class)
|
||||
.setOrderId(orderEntity.getId())
|
||||
.setOriginExpenseItemsId(item.getId())));
|
||||
allItems.addAll(extraItems);
|
||||
|
||||
if (extraItems.isEmpty()) {
|
||||
if (allItems.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 批量保存付费项
|
||||
orderExpenseItemsService.saveBatch(extraItems);
|
||||
orderExpenseItemsService.saveBatch(allItems);
|
||||
|
||||
// 获取订单的所有运输记录
|
||||
List<OrderTransEntity> transList = orderTransMapper.selectList(Wrappers.<OrderTransEntity>lambdaQuery()
|
||||
|
|
@ -463,7 +514,7 @@ public class OrderService extends ServiceImpl<OrderMapper, OrderEntity> {
|
|||
|
||||
List<OrderPaymentRecordEntity> recordList = Lists.newArrayList();
|
||||
for (OrderTransEntity transEntity : transList) {
|
||||
List<OrderPaymentRecordEntity> paymentRecords = extraItems.stream()
|
||||
List<OrderPaymentRecordEntity> paymentRecords = allItems.stream()
|
||||
.map(item -> {
|
||||
OrderPaymentRecordEntity record = new OrderPaymentRecordEntity()
|
||||
.setOrderId(orderEntity.getId())
|
||||
|
|
@ -473,11 +524,6 @@ public class OrderService extends ServiceImpl<OrderMapper, OrderEntity> {
|
|||
|
||||
// 根据归属字段获取结算方式和账户信息
|
||||
Long customerId = item.getCustomerId();
|
||||
if (customerId == null) {
|
||||
// 如果没有归属客户,尝试从订单获取
|
||||
customerId = orderEntity.getCustomerId();
|
||||
}
|
||||
|
||||
CustomerEntity customer = customerMapper.selectOne(Wrappers.<CustomerEntity>lambdaQuery()
|
||||
.eq(CustomerEntity::getId, customerId));
|
||||
if (customer != null && customer.getSettlementWay() != null) {
|
||||
|
|
@ -497,7 +543,6 @@ public class OrderService extends ServiceImpl<OrderMapper, OrderEntity> {
|
|||
} else {
|
||||
throw Exceptions.clierr("付款人资金账户不存在");
|
||||
}
|
||||
|
||||
return record;
|
||||
})
|
||||
.toList();
|
||||
|
|
|
|||
|
|
@ -4,16 +4,15 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|||
import com.njzscloud.common.core.tuple.Tuple2;
|
||||
import com.njzscloud.common.oss.util.AliOSS;
|
||||
import com.njzscloud.dispose.cst.order.constant.*;
|
||||
import com.njzscloud.dispose.cst.order.helper.PaymentRecordHelper;
|
||||
import com.njzscloud.dispose.cst.order.mapper.OrderMapper;
|
||||
import com.njzscloud.dispose.cst.order.mapper.OrderTransMapper;
|
||||
import com.njzscloud.dispose.cst.order.pojo.entity.OrderEntity;
|
||||
import com.njzscloud.dispose.cst.order.pojo.entity.OrderExpenseItemsEntity;
|
||||
import com.njzscloud.dispose.cst.order.pojo.entity.OrderPaymentRecordEntity;
|
||||
import com.njzscloud.dispose.cst.order.pojo.entity.OrderTransEntity;
|
||||
import com.njzscloud.dispose.cst.order.pojo.result.OrderTransResult;
|
||||
import com.njzscloud.dispose.dev.DiscoverTruckMsg;
|
||||
import com.njzscloud.dispose.dev.ObtainTruckDataResultMsg;
|
||||
import com.njzscloud.dispose.dev.WbsHandle;
|
||||
import com.njzscloud.dispose.finance.constant.ExpenseStrategy;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
|
@ -37,9 +36,9 @@ import java.util.List;
|
|||
public class TruckWeighingBusinessService {
|
||||
|
||||
private final OrderService orderService;
|
||||
private final OrderMapper orderMapper;
|
||||
private final OrderTransMapper orderTransMapper;
|
||||
private final OrderPaymentRecordService orderPaymentRecordService;
|
||||
private final OrderExpenseItemsService orderExpenseItemsService;
|
||||
private final PaymentRecordHelper paymentRecordHelper;
|
||||
|
||||
/**
|
||||
* 请求数据 - 处理车辆识别
|
||||
|
|
@ -173,11 +172,9 @@ public class TruckWeighingBusinessService {
|
|||
wbsHandle.playVoice(VoiceConstants.VOICE_PLEASE_PASS);
|
||||
wbsHandle.open();
|
||||
} else if (TransStatus.YiJinChang.equals(orderTrans.getTransStatus())) {
|
||||
// 出场:设置相应重量并计算净重、账目,等待支付完成后再开门
|
||||
handleTruckLeavingData(orderTrans, weight, image);
|
||||
// 出场:设置相应重量并计算净重、账目,支付完成后开门
|
||||
handleTruckLeavingData(orderTrans, weight, image, wbsHandle);
|
||||
wbsHandle.playVoice(VoiceConstants.VOICE_WEIGH_COMPLETE);
|
||||
// TODO: 触发算账流程,支付完成后调用 completePaymentAndOpenGate 方法开门
|
||||
processSettlementAndWaitForPayment(orderTrans, wbsHandle);
|
||||
} else {
|
||||
log.warn("运输订单 {} 状态 {} 不支持称重操作", orderTrans.getId(), orderTrans.getTransStatus());
|
||||
wbsHandle.playVoice(VoiceConstants.VOICE_STATUS_ERROR);
|
||||
|
|
@ -209,7 +206,7 @@ public class TruckWeighingBusinessService {
|
|||
/**
|
||||
* 处理出场称重数据
|
||||
*/
|
||||
private void handleTruckLeavingData(OrderTransResult orderTrans, Integer weight, String bodyPhoto) {
|
||||
private void handleTruckLeavingData(OrderTransResult orderTrans, Integer weight, String bodyPhoto, WbsHandle wbsHandle) {
|
||||
OrderTransEntity transEntity = new OrderTransEntity();
|
||||
transEntity.setId(orderTrans.getId());
|
||||
transEntity.setTransStatus(TransStatus.YiChuChang);
|
||||
|
|
@ -232,42 +229,28 @@ public class TruckWeighingBusinessService {
|
|||
log.info("车辆出场称重完成,订单ID: {}, 重量: {}kg, 净重: {}kg",
|
||||
orderTrans.getId(), weight, settleWeight);
|
||||
|
||||
// 更新付费记录的量
|
||||
this.updatePaymentRecordQuantity(orderTrans.getId(), settleWeight);
|
||||
}
|
||||
// 更新付费记录的量,计算结算金额并支付
|
||||
String orderSn = orderMapper.selectById(orderTrans.getOrderId()).getSn();
|
||||
boolean allCompleted = paymentRecordHelper.updatePaymentRecordQuantity(
|
||||
orderTrans.getId(), settleWeight, orderTrans.getTransDistance(),
|
||||
orderSn, orderTrans.getTrainNum());
|
||||
|
||||
/**
|
||||
* 更新付费记录的量
|
||||
*
|
||||
* @param transId 运输记录ID
|
||||
* @param settleWeight 净重
|
||||
*/
|
||||
private void updatePaymentRecordQuantity(Long transId, Integer settleWeight) {
|
||||
// 1. 通过运输信息ID查询付费记录
|
||||
List<OrderPaymentRecordEntity> paymentRecords = orderPaymentRecordService.list(Wrappers.<OrderPaymentRecordEntity>lambdaQuery()
|
||||
.eq(OrderPaymentRecordEntity::getTransId, transId));
|
||||
// 如果该运输记录下所有付费记录都已完成,更新运输状态为已完成并开门
|
||||
if (allCompleted) {
|
||||
OrderTransEntity updateTrans = new OrderTransEntity();
|
||||
updateTrans.setId(orderTrans.getId());
|
||||
updateTrans.setTransStatus(TransStatus.YiWanCheng);
|
||||
updateTrans.setFinishTime(LocalDateTime.now());
|
||||
orderTransMapper.updateById(updateTrans);
|
||||
|
||||
if (paymentRecords.isEmpty()) {
|
||||
return;
|
||||
// 检查订单下所有运输记录是否都完成
|
||||
this.checkAndUpdateOrderStatus(orderTrans.getOrderId());
|
||||
|
||||
// 开门放行
|
||||
wbsHandle.playVoice(VoiceConstants.VOICE_PLEASE_PASS);
|
||||
wbsHandle.open();
|
||||
log.info("运输记录 {} 支付完成,开门放行", orderTrans.getId());
|
||||
}
|
||||
|
||||
// 2. 遍历更新每条付费记录的量
|
||||
for (OrderPaymentRecordEntity record : paymentRecords) {
|
||||
// 通过付费记录的订单收费项 Id 查询付费项
|
||||
OrderExpenseItemsEntity expenseItem = orderExpenseItemsService.getById(record.getExpenseItemId());
|
||||
if (expenseItem == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// 3. 如果计费策略为Che,则量为1,否则为净重
|
||||
Integer quantity = ExpenseStrategy.Che.equals(expenseItem.getExpenseStrategy()) ? 1 : settleWeight;
|
||||
|
||||
OrderPaymentRecordEntity updateRecord = new OrderPaymentRecordEntity();
|
||||
updateRecord.setId(record.getId());
|
||||
updateRecord.setQuantity(quantity);
|
||||
orderPaymentRecordService.updateById(updateRecord);
|
||||
}
|
||||
log.info("运输记录 {} 的付费记录量更新完成", transId);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -395,141 +378,26 @@ public class TruckWeighingBusinessService {
|
|||
}
|
||||
|
||||
/**
|
||||
* 检查订单下所有运输记录是否都已完成
|
||||
* 检查订单下所有运输记录是否都完成,如果都完成则更新订单状态
|
||||
*
|
||||
* @param orderId 订单ID
|
||||
*/
|
||||
private boolean checkAllTransCompleted(Long orderId) {
|
||||
try {
|
||||
// 查询该订单下的所有运输记录
|
||||
List<OrderTransEntity> transList = orderTransMapper.selectList(
|
||||
Wrappers.<OrderTransEntity>lambdaQuery()
|
||||
.eq(OrderTransEntity::getOrderId, orderId)
|
||||
);
|
||||
private void checkAndUpdateOrderStatus(Long orderId) {
|
||||
List<OrderTransEntity> transList = orderTransMapper.selectList(
|
||||
Wrappers.<OrderTransEntity>lambdaQuery()
|
||||
.eq(OrderTransEntity::getOrderId, orderId)
|
||||
.ne(OrderTransEntity::getTransStatus, TransStatus.YiQuXiao));
|
||||
|
||||
if (transList.isEmpty()) {
|
||||
log.warn("订单 {} 下没有找到运输记录", orderId);
|
||||
return false;
|
||||
}
|
||||
boolean allCompleted = transList.stream()
|
||||
.allMatch(t -> TransStatus.YiWanCheng.equals(t.getTransStatus()));
|
||||
|
||||
// 检查所有运输记录的状态是否都为已完成
|
||||
boolean allCompleted = transList.stream()
|
||||
.allMatch(trans -> TransStatus.YiWanCheng.equals(trans.getTransStatus()));
|
||||
|
||||
if (allCompleted) {
|
||||
log.info("订单 {} 下所有 {} 条运输记录都已完成", orderId, transList.size());
|
||||
} else {
|
||||
long completedCount = transList.stream()
|
||||
.filter(trans -> TransStatus.YiWanCheng.equals(trans.getTransStatus()))
|
||||
.count();
|
||||
log.info("订单 {} 下 {}/{} 条运输记录已完成", orderId, completedCount, transList.size());
|
||||
}
|
||||
|
||||
return allCompleted;
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("检查订单 {} 运输完成状态异常", orderId, e);
|
||||
// 出现异常时保守处理,返回false
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理结算并等待支付完成
|
||||
*/
|
||||
private void processSettlementAndWaitForPayment(OrderTransResult orderTrans, WbsHandle wbsHandle) {
|
||||
try {
|
||||
log.info("开始处理订单 {} 的结算流程", orderTrans.getId());
|
||||
|
||||
// TODO: 执行算账逻辑
|
||||
// 这里应该调用财务结算服务,计算费用并生成支付订单
|
||||
// calculateSettlement(orderTrans);
|
||||
|
||||
// 模拟支付完成通知(实际应该通过支付回调或消息队列处理)
|
||||
// 在实际生产环境中,应该:
|
||||
// 1. 调用财务服务计算费用
|
||||
// 2. 生成支付订单
|
||||
// 3. 等待支付完成的通知(通过消息队列或回调)
|
||||
// 4. 支付完成后调用 completePaymentAndOpenGate 方法
|
||||
|
||||
log.info("订单 {} 结算流程启动,等待支付完成", orderTrans.getId());
|
||||
|
||||
// TODO: 在实际支付完成后调用以下方法
|
||||
// completePaymentAndOpenGate(orderTrans, wbsHandle);
|
||||
|
||||
// 临时实现:直接完成(用于测试)
|
||||
simulatePaymentCompletion(orderTrans, wbsHandle);
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("处理订单 {} 结算异常", orderTrans.getId(), e);
|
||||
handleBusinessException(wbsHandle, "结算处理失败", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 模拟支付完成(测试用)
|
||||
*/
|
||||
private void simulatePaymentCompletion(OrderTransResult orderTrans, WbsHandle wbsHandle) {
|
||||
// 在实际应用中,这里应该通过消息队列或定时任务等待支付完成
|
||||
// 这里只是为了演示流程,实际应该移除
|
||||
try {
|
||||
// 模拟支付处理时间
|
||||
Thread.sleep(2000);
|
||||
completePaymentAndOpenGate(orderTrans, wbsHandle);
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
log.error("模拟支付完成被中断", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 支付完成并开门
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void completePaymentAndOpenGate(OrderTransResult orderTrans, WbsHandle wbsHandle) {
|
||||
synchronized (this) {
|
||||
try {
|
||||
// 更新运输状态为已完成
|
||||
OrderTransEntity transEntity = new OrderTransEntity();
|
||||
transEntity.setId(orderTrans.getId());
|
||||
transEntity.setTransStatus(TransStatus.YiWanCheng);
|
||||
transEntity.setFinishTime(LocalDateTime.now());
|
||||
orderTransMapper.updateById(transEntity);
|
||||
|
||||
// 检查该订单下所有运输记录是否都已完成
|
||||
boolean allTransCompleted = checkAllTransCompleted(orderTrans.getOrderId());
|
||||
|
||||
if (allTransCompleted) {
|
||||
// 更新订单状态为已完成
|
||||
OrderEntity orderEntity = new OrderEntity();
|
||||
orderEntity.setId(orderTrans.getOrderId());
|
||||
orderEntity.setOrderStatus(OrderStatus.YiWanCheng);
|
||||
orderEntity.setFinishTime(LocalDateTime.now());
|
||||
orderService.updateById(orderEntity);
|
||||
log.info("订单 {} 所有运输记录已完成,订单状态更新为已完成", orderTrans.getOrderId());
|
||||
} else {
|
||||
log.info("订单 {} 还有未完成的运输记录,暂不更新订单状态", orderTrans.getOrderId());
|
||||
}
|
||||
|
||||
// 开门放行
|
||||
wbsHandle.playVoice(VoiceConstants.VOICE_PLEASE_PASS);
|
||||
wbsHandle.open();
|
||||
|
||||
log.info("运输记录 {} 支付完成,开门放行", orderTrans.getId());
|
||||
|
||||
} catch (Exception e) {
|
||||
handleBusinessException(wbsHandle, "完成订单 " + orderTrans.getId() + " 支付并开门异常", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理业务异常
|
||||
*/
|
||||
private void handleBusinessException(WbsHandle wbsHandle, String message, Exception e) {
|
||||
log.error("业务处理异常: {}", message, e);
|
||||
try {
|
||||
wbsHandle.playVoice(VoiceConstants.VOICE_SYSTEM_ERROR);
|
||||
} catch (Exception voiceException) {
|
||||
log.error("播放语音失败", voiceException);
|
||||
if (allCompleted) {
|
||||
OrderEntity updateOrder = new OrderEntity();
|
||||
updateOrder.setId(orderId);
|
||||
updateOrder.setOrderStatus(OrderStatus.YiWanCheng);
|
||||
updateOrder.setFinishTime(LocalDateTime.now());
|
||||
orderService.updateById(updateOrder);
|
||||
log.info("订单 {} 所有运输记录已完成,更新订单状态为已完成", orderId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,13 +17,8 @@ public enum ExpenseStrategy implements DictStr {
|
|||
|
||||
GuDing("GuDing", "固定"),
|
||||
|
||||
Che("Che", "车"),
|
||||
DanJia("DanJia", "单价");
|
||||
|
||||
Fang("Fang", "方"),
|
||||
|
||||
JuLi("JuLi", "距离"),
|
||||
|
||||
;
|
||||
private final String val;
|
||||
|
||||
private final String txt;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,26 @@
|
|||
package com.njzscloud.dispose.finance.constant;
|
||||
|
||||
import com.njzscloud.common.core.ienum.DictStr;
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
||||
/**
|
||||
* 字典代码:expense_strategy
|
||||
* 字典名称:计费策略
|
||||
* @author ljw
|
||||
*/
|
||||
@Getter
|
||||
@RequiredArgsConstructor
|
||||
public enum Unit implements DictStr {
|
||||
Che("Che", "车"),
|
||||
|
||||
Fang("Fang", "方"),
|
||||
|
||||
GongLi("GongLi", "公里"),
|
||||
|
||||
Dun("Dun", "吨");
|
||||
|
||||
private final String val;
|
||||
|
||||
private final String txt;
|
||||
}
|
||||
|
|
@ -8,6 +8,7 @@ import com.njzscloud.common.mp.support.handler.j.JsonTypeHandler;
|
|||
import com.njzscloud.dispose.common.pojo.entity.BaseEntity;
|
||||
import com.njzscloud.dispose.finance.constant.ExpenseItemCategory;
|
||||
import com.njzscloud.dispose.finance.constant.ExpenseStrategy;
|
||||
import com.njzscloud.dispose.finance.constant.Unit;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
|
|
@ -51,7 +52,7 @@ public class ExpenseItemEntity extends BaseEntity {
|
|||
/**
|
||||
* 计量单位;字典代码:unit
|
||||
*/
|
||||
private String unit;
|
||||
private Unit unit;
|
||||
|
||||
/**
|
||||
* 税率
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ package com.njzscloud.dispose.finance.pojo.param;
|
|||
|
||||
import com.njzscloud.dispose.finance.constant.ExpenseItemCategory;
|
||||
import com.njzscloud.dispose.finance.constant.ExpenseStrategy;
|
||||
import com.njzscloud.dispose.finance.constant.Unit;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
|
|
@ -33,7 +34,7 @@ public class AddExpenseItemParam {
|
|||
/**
|
||||
* 计量单位;字典代码:unit
|
||||
*/
|
||||
private String unit;
|
||||
private Unit unit;
|
||||
|
||||
/**
|
||||
* 税率
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ package com.njzscloud.dispose.finance.pojo.param;
|
|||
|
||||
import com.njzscloud.dispose.finance.constant.ExpenseItemCategory;
|
||||
import com.njzscloud.dispose.finance.constant.ExpenseStrategy;
|
||||
import com.njzscloud.dispose.finance.constant.Unit;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
|
|
@ -37,7 +38,7 @@ public class ModifyExpenseItemParam {
|
|||
/**
|
||||
* 计量单位;字典代码:unit
|
||||
*/
|
||||
private String unit;
|
||||
private Unit unit;
|
||||
|
||||
/**
|
||||
* 税率
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ package com.njzscloud.dispose.finance.pojo.result;
|
|||
|
||||
import com.njzscloud.dispose.finance.constant.ExpenseItemCategory;
|
||||
import com.njzscloud.dispose.finance.constant.ExpenseStrategy;
|
||||
import com.njzscloud.dispose.finance.constant.Unit;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
|
|
@ -43,7 +44,7 @@ public class SearchExpenseItemResult {
|
|||
/**
|
||||
* 计量单位;字典代码:unit
|
||||
*/
|
||||
private String unit;
|
||||
private Unit unit;
|
||||
|
||||
/**
|
||||
* 税率
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ import com.njzscloud.common.core.ienum.DictKey;
|
|||
import com.njzscloud.dispose.finance.constant.ExpenseItemCategory;
|
||||
import com.njzscloud.dispose.finance.constant.ExpenseStrategy;
|
||||
import com.njzscloud.dispose.finance.constant.Payer;
|
||||
import com.njzscloud.dispose.finance.constant.Unit;
|
||||
import com.njzscloud.dispose.finance.pojo.entity.ScopeStrategyConfig;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
|
@ -94,7 +95,7 @@ public class AddGoodsParam {
|
|||
/**
|
||||
* 计量单位;字典代码:unit
|
||||
*/
|
||||
private String unit;
|
||||
private Unit unit;
|
||||
|
||||
/**
|
||||
* 税率
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ package com.njzscloud.dispose.goods.pojo.param;
|
|||
import com.njzscloud.dispose.finance.constant.ExpenseItemCategory;
|
||||
import com.njzscloud.dispose.finance.constant.ExpenseStrategy;
|
||||
import com.njzscloud.dispose.finance.constant.Payer;
|
||||
import com.njzscloud.dispose.finance.constant.Unit;
|
||||
import com.njzscloud.dispose.finance.pojo.entity.ScopeStrategyConfig;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
|
@ -54,7 +55,7 @@ public class ModifyGoodsParam {
|
|||
/**
|
||||
* 计量单位;字典代码:unit
|
||||
*/
|
||||
private String unit;
|
||||
private Unit unit;
|
||||
|
||||
/**
|
||||
* 排序
|
||||
|
|
@ -100,7 +101,7 @@ public class ModifyGoodsParam {
|
|||
/**
|
||||
* 计量单位;字典代码:unit
|
||||
*/
|
||||
private String unit;
|
||||
private Unit unit;
|
||||
|
||||
/**
|
||||
* 税率
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
package com.njzscloud.dispose.wh.pojo.entity;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.*;
|
||||
import com.njzscloud.dispose.finance.constant.Unit;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
|
|
@ -93,7 +94,7 @@ public class InOrderEntity {
|
|||
/**
|
||||
* 计量单位;字典代码:unit
|
||||
*/
|
||||
private String unit;
|
||||
private Unit unit;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
package com.njzscloud.dispose.wh.pojo.entity;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.*;
|
||||
import com.njzscloud.dispose.finance.constant.Unit;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
|
|
@ -62,7 +63,7 @@ public class InventoryEntity {
|
|||
/**
|
||||
* 计量单位;字典代码:unit
|
||||
*/
|
||||
private String unit;
|
||||
private Unit unit;
|
||||
|
||||
/**
|
||||
* 创建人 Id;sys_user.id
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
package com.njzscloud.dispose.wh.pojo.entity;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.*;
|
||||
import com.njzscloud.dispose.finance.constant.Unit;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
|
|
@ -93,7 +94,7 @@ public class OutOrderEntity {
|
|||
/**
|
||||
* 计量单位;字典代码:unit
|
||||
*/
|
||||
private String unit;
|
||||
private Unit unit;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
package com.njzscloud.dispose.wh.pojo.entity;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.*;
|
||||
import com.njzscloud.dispose.finance.constant.Unit;
|
||||
import com.njzscloud.dispose.wh.constant.PurchaseOrderStatus;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
|
@ -96,7 +97,7 @@ public class PurchaseOrderEntity {
|
|||
/**
|
||||
* 计量单位;字典代码:unit
|
||||
*/
|
||||
private String unit;
|
||||
private Unit unit;
|
||||
|
||||
/**
|
||||
* 总金额;单位:元
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
package com.njzscloud.dispose.wh.pojo.entity;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.*;
|
||||
import com.njzscloud.dispose.finance.constant.Unit;
|
||||
import com.njzscloud.dispose.wh.constant.SalesOrderStatus;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
|
@ -96,7 +97,7 @@ public class SalesOrderEntity {
|
|||
/**
|
||||
* 计量单位;字典代码:unit
|
||||
*/
|
||||
private String unit;
|
||||
private Unit unit;
|
||||
|
||||
/**
|
||||
* 总金额;单位:元
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
package com.njzscloud.dispose.wh.pojo.entity;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.*;
|
||||
import com.njzscloud.dispose.finance.constant.Unit;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
|
|
@ -72,7 +73,7 @@ public class WarehouseCheckDetailEntity {
|
|||
/**
|
||||
* 计量单位;字典代码:unit
|
||||
*/
|
||||
private String unit;
|
||||
private Unit unit;
|
||||
|
||||
/**
|
||||
* 处理建议
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
package com.njzscloud.dispose.wh.pojo.param;
|
||||
|
||||
import com.njzscloud.dispose.finance.constant.Unit;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
|
|
@ -74,7 +75,7 @@ public class AddInOrderParam {
|
|||
/**
|
||||
* 计量单位;字典代码:unit
|
||||
*/
|
||||
private String unit;
|
||||
private Unit unit;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
package com.njzscloud.dispose.wh.pojo.param;
|
||||
|
||||
import com.njzscloud.dispose.finance.constant.Unit;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
|
|
@ -51,5 +52,5 @@ public class AddInventoryParam {
|
|||
/**
|
||||
* 计量单位;字典代码:unit
|
||||
*/
|
||||
private String unit;
|
||||
private Unit unit;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
package com.njzscloud.dispose.wh.pojo.param;
|
||||
|
||||
import com.njzscloud.dispose.finance.constant.Unit;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
|
|
@ -73,7 +74,7 @@ public class AddOutOrderParam {
|
|||
/**
|
||||
* 计量单位;字典代码:unit
|
||||
*/
|
||||
private String unit;
|
||||
private Unit unit;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
package com.njzscloud.dispose.wh.pojo.param;
|
||||
|
||||
import com.njzscloud.dispose.finance.constant.Unit;
|
||||
import com.njzscloud.dispose.wh.constant.SalesOrderStatus;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
|
@ -87,7 +88,7 @@ public class AddSalesOrderParam {
|
|||
/**
|
||||
* 计量单位;字典代码:unit
|
||||
*/
|
||||
private String unit;
|
||||
private Unit unit;
|
||||
|
||||
/**
|
||||
* 总金额;单位:元
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
package com.njzscloud.dispose.wh.pojo.param;
|
||||
|
||||
import com.njzscloud.dispose.finance.constant.Unit;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
|
|
@ -63,7 +64,7 @@ public class AddWarehouseCheckDetailParam {
|
|||
/**
|
||||
* 计量单位;字典代码:unit
|
||||
*/
|
||||
private String unit;
|
||||
private Unit unit;
|
||||
|
||||
/**
|
||||
* 处理建议
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ package com.njzscloud.dispose.wh.pojo.result;
|
|||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.njzscloud.dispose.finance.constant.Unit;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
|
|
@ -104,7 +105,7 @@ public class SearchInOrderResult {
|
|||
/**
|
||||
* 计量单位;字典代码:unit
|
||||
*/
|
||||
private String unit;
|
||||
private Unit unit;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ package com.njzscloud.dispose.wh.pojo.result;
|
|||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.njzscloud.dispose.finance.constant.Unit;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
|
|
@ -63,7 +64,7 @@ public class SearchInventoryResult {
|
|||
/**
|
||||
* 计量单位;字典代码:unit
|
||||
*/
|
||||
private String unit;
|
||||
private Unit unit;
|
||||
|
||||
/**
|
||||
* 创建人 Id;sys_user.id
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ package com.njzscloud.dispose.wh.pojo.result;
|
|||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.njzscloud.dispose.finance.constant.Unit;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
|
|
@ -103,7 +104,7 @@ public class SearchOutOrderResult {
|
|||
/**
|
||||
* 计量单位;字典代码:unit
|
||||
*/
|
||||
private String unit;
|
||||
private Unit unit;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ package com.njzscloud.dispose.wh.pojo.result;
|
|||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.njzscloud.dispose.finance.constant.Unit;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
|
|
@ -72,7 +73,7 @@ public class SearchWarehouseCheckDetailResult {
|
|||
/**
|
||||
* 计量单位;字典代码:unit
|
||||
*/
|
||||
private String unit;
|
||||
private Unit unit;
|
||||
|
||||
/**
|
||||
* 处理建议
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ public class PurchaseOrderService extends ServiceImpl<PurchaseOrderMapper, Purch
|
|||
.setArrivalDate(LocalDate.now())
|
||||
.setQuantity(orderTrans.getEstimatedQuantity())
|
||||
.setTotalMoney(totalMoney)
|
||||
.setMemo(""));
|
||||
.setMemo("回收预约单自动添加"));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -68,7 +68,7 @@ public class SalesOrderService extends ServiceImpl<SalesOrderMapper, SalesOrderE
|
|||
.setShipmentDate(LocalDate.now())
|
||||
.setQuantity(orderTrans.getEstimatedQuantity())
|
||||
.setTotalMoney(totalMoney)
|
||||
.setMemo(""));
|
||||
.setMemo("销售预约单自动添加"));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@
|
|||
<result column="out_body_photo" property="outBodyPhoto"/>
|
||||
<result column="in_time" property="inTime"/>
|
||||
<result column="out_time" property="outTime"/>
|
||||
<result column="sn" property="sn"/>
|
||||
<result column="trans_org_id" property="transOrgId"/>
|
||||
<result column="trans_customer_id" property="transCustomerId"/>
|
||||
<result column="assignment_trans_time" property="assignmentTransTime"/>
|
||||
|
|
@ -82,6 +83,7 @@
|
|||
cot.out_body_photo AS out_body_photo,
|
||||
cot.in_time AS in_time,
|
||||
cot.out_time AS out_time,
|
||||
co.sn,
|
||||
co.trans_org_id AS trans_org_id,
|
||||
co.trans_customer_id AS trans_customer_id,
|
||||
co.assignment_trans_time AS assignment_trans_time,
|
||||
|
|
|
|||
Loading…
Reference in New Issue