付款,资金明细

master
ljw 2026-01-30 14:54:23 +08:00
parent 0562ec000f
commit db370adfdf
34 changed files with 476 additions and 281 deletions

View File

@ -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 BigDecimalnull
*/
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;
};
}
}

View File

@ -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;
/**
*

View File

@ -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;
/**
* -->

View File

@ -55,7 +55,7 @@ public class OrderPaymentRecordEntity {
/**
*
*/
private Integer quantity;
private BigDecimal quantity;
/**
* MianFei-->WeiZhiFu-->YiZhiFu-->YiTuiKuan-->退

View File

@ -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;
/**
*

View File

@ -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;
/**
* Idcst_org.id
*/
@ -245,7 +251,7 @@ public class OrderTransResult {
/**
*
*/
private String unit;
private Unit unit;
}

View File

@ -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());
// 如果该运输记录下所有付费记录都已完成,更新运输状态为已完成
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());
}
/**
*
*
* @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 (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();

View File

@ -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());
// 如果该运输记录下所有付费记录都已完成,更新运输状态为已完成并开门
if (allCompleted) {
OrderTransEntity updateTrans = new OrderTransEntity();
updateTrans.setId(orderTrans.getId());
updateTrans.setTransStatus(TransStatus.YiWanCheng);
updateTrans.setFinishTime(LocalDateTime.now());
orderTransMapper.updateById(updateTrans);
// 检查订单下所有运输记录是否都完成
this.checkAndUpdateOrderStatus(orderTrans.getOrderId());
// 开门放行
wbsHandle.playVoice(VoiceConstants.VOICE_PLEASE_PASS);
wbsHandle.open();
log.info("运输记录 {} 支付完成,开门放行", orderTrans.getId());
}
/**
*
*
* @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 (paymentRecords.isEmpty()) {
return;
}
// 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 {
// 查询该订单下的所有运输记录
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(trans -> TransStatus.YiWanCheng.equals(trans.getTransStatus()));
.allMatch(t -> TransStatus.YiWanCheng.equals(t.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);
OrderEntity updateOrder = new OrderEntity();
updateOrder.setId(orderId);
updateOrder.setOrderStatus(OrderStatus.YiWanCheng);
updateOrder.setFinishTime(LocalDateTime.now());
orderService.updateById(updateOrder);
log.info("订单 {} 所有运输记录已完成,更新订单状态为已完成", orderId);
}
}
}

View File

@ -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;

View File

@ -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;
}

View File

@ -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;
/**
*

View File

@ -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;
/**
*

View File

@ -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;
/**
*

View File

@ -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;
/**
*

View File

@ -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;
/**
*

View File

@ -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;
/**
*

View File

@ -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;
/**
*

View File

@ -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;
/**
* Idsys_user.id

View File

@ -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;
/**
*

View File

@ -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;
/**
*

View File

@ -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;
/**
*

View File

@ -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;
/**
*

View File

@ -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;
/**
*

View File

@ -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;
}

View File

@ -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;
/**
*

View File

@ -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;
/**
*

View File

@ -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;
/**
*

View File

@ -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;
/**
*

View File

@ -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;
/**
* Idsys_user.id

View File

@ -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;
/**
*

View File

@ -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;
/**
*

View File

@ -66,7 +66,7 @@ public class PurchaseOrderService extends ServiceImpl<PurchaseOrderMapper, Purch
.setArrivalDate(LocalDate.now())
.setQuantity(orderTrans.getEstimatedQuantity())
.setTotalMoney(totalMoney)
.setMemo(""));
.setMemo("回收预约单自动添加"));
}
/**

View File

@ -68,7 +68,7 @@ public class SalesOrderService extends ServiceImpl<SalesOrderMapper, SalesOrderE
.setShipmentDate(LocalDate.now())
.setQuantity(orderTrans.getEstimatedQuantity())
.setTotalMoney(totalMoney)
.setMemo(""));
.setMemo("销售预约单自动添加"));
}
/**

View File

@ -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,