ljw 2025-11-14 16:06:16 +08:00
parent be6808af55
commit fc7632f9b4
2 changed files with 80 additions and 17 deletions

View File

@ -0,0 +1,19 @@
package com.njzscloud.supervisory.order.contant;
import com.njzscloud.common.core.ienum.DictStr;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
/**
* discount_type
*
*/
@Getter
@RequiredArgsConstructor
public enum DiscountType implements DictStr {
DISCOUNT("discount", "优惠"),
RAISE("raise", "加价"),
;
private final String val;
private final String txt;
}

View File

@ -32,6 +32,8 @@ import com.njzscloud.supervisory.biz.pojo.entity.*;
import com.njzscloud.supervisory.biz.service.*;
import com.njzscloud.supervisory.constant.Constant;
import com.njzscloud.supervisory.device.pojo.entity.DeviceLocalizerEntity;
import com.njzscloud.supervisory.discount.pojo.DiscountManageEntity;
import com.njzscloud.supervisory.discount.service.DiscountManageService;
import com.njzscloud.supervisory.expense.contant.BillingType;
import com.njzscloud.supervisory.expense.contant.ExpenseItemCategory;
import com.njzscloud.supervisory.expense.contant.GoodsScope;
@ -115,6 +117,7 @@ public class OrderInfoService extends ServiceImpl<OrderInfoMapper, OrderInfoEnti
private final UserRoleService userRoleService;
private final UserService userService;
private final BizTruckService bizTruckService;
private final DiscountManageService discountManageService;
private final AtomicBoolean test_thread_running = new AtomicBoolean(false);
Thread test_thread = null;
@Value("${app.check-gps:false}")
@ -1170,7 +1173,7 @@ public class OrderInfoService extends ServiceImpl<OrderInfoMapper, OrderInfoEnti
Assert.notNull(entity, () -> Exceptions.clierr("产品不存在"));
if (MoneyWay.OUT.getVal().equals(entity.getMoneyWay())) {
// 计算费用,出厂付费可能需要称重,需要更新付费项
updateOrderItems(orderInfoEntity.getId(), settleWeight, Boolean.FALSE);
updateOrderItems(orderInfoEntity.getId(), orderInfoEntity.getTransCompanyId(), settleWeight, Boolean.FALSE);
orderInfoEntity = this.getById(truckLeavingOrderParam.getOrderId());
}
@ -1265,23 +1268,62 @@ public class OrderInfoService extends ServiceImpl<OrderInfoMapper, OrderInfoEnti
}
}
/**
*
* @param companyId id
* @param item
* @return
*/
private BigDecimal calculateItemDiscountMoney(Long companyId, OrderExpenseItemsEntity item) {
BigDecimal discountMoney = new BigDecimal("0");
Long goodsId = null;
Long itemId = null;
if (ExpenseItemCategory.ChanPin.getVal().equals(item.getExpenseItemCategory())) {
OrderGoodsEntity entity = orderGoodsService.getById(item.getOriginExpenseItemId());
if (null == entity) {
return discountMoney;
}
goodsId = entity.getOriginGoodsId();
} else if (ExpenseItemCategory.QingYunFuWuFei.getVal().equals(item.getExpenseItemCategory())){
itemId = item.getOriginExpenseItemId();
}
List<DiscountManageEntity> discountList = discountManageService.list(Wrappers.lambdaQuery(DiscountManageEntity.class)
.eq(DiscountManageEntity::getCompanyId, companyId)
.in(null != goodsId, DiscountManageEntity::getGoodsIds, goodsId)
.eq(null != itemId, DiscountManageEntity::getExpenseId, itemId)
.eq(DiscountManageEntity::getDeleted, Boolean.FALSE));
if (null != discountList && discountList.size() > 0) {
for (DiscountManageEntity discount: discountList) {
if (DiscountType.DISCOUNT.getVal().equals(discount.getType())) {
discountMoney = discountMoney.subtract(discount.getMoney());
} else if (DiscountType.RAISE.getVal().equals(discount.getType())) {
discountMoney = discountMoney.add(discount.getMoney());
}
}
}
return discountMoney;
}
/**
*
*
* @param item
*/
private void calculateAndSetItemMoney(OrderExpenseItemsEntity item, Boolean isChange) {
private void calculateAndSetItemMoney(OrderExpenseItemsEntity item, Long companyId, Boolean isChange) {
// 计算总金额
BigDecimal totalMoney = calculateItemTotalMoney(item);
// 计算优惠金额(有正负)
BigDecimal discountMoney = calculateItemDiscountMoney(companyId, item);
// settle_money = total_money + discount_money + revise_moneydiscount、revise 可为正负)
BigDecimal discount = item.getDiscountMoney() == null ? BigDecimal.ZERO : item.getDiscountMoney();
BigDecimal discount = discountMoney == null ? BigDecimal.ZERO : discountMoney;
BigDecimal revise = item.getReviseMoney() == null ? BigDecimal.ZERO : item.getReviseMoney();
BigDecimal settle = totalMoney.add(discount).add(revise);
if (isChange) {
item.setChangeMoney(settle);
item.setTotalMoney(totalMoney).setSettleMoney(settle).setDiscountMoney(discount).setChangeMoney(settle);
} else {
item.setTotalMoney(totalMoney).setSettleMoney(settle);
item.setTotalMoney(totalMoney).setSettleMoney(settle).setDiscountMoney(discount);
}
}
@ -1333,10 +1375,10 @@ public class OrderInfoService extends ServiceImpl<OrderInfoMapper, OrderInfoEnti
* @param orderId ID
* @param items
*/
private void calculateItemsAndUpdateOrder(Long orderId, List<OrderExpenseItemsEntity> items) {
private void calculateItemsAndUpdateOrder(Long orderId, Long companyId, List<OrderExpenseItemsEntity> items) {
// 计算各付费项金额
for (OrderExpenseItemsEntity item : items) {
calculateAndSetItemMoney(item, Boolean.FALSE);
calculateAndSetItemMoney(item, companyId, Boolean.FALSE);
}
// 批量更新付费项包含quantity和所有金额字段
@ -1346,7 +1388,7 @@ public class OrderInfoService extends ServiceImpl<OrderInfoMapper, OrderInfoEnti
updateOrderTotalMoney(orderId, items, Boolean.FALSE, Boolean.TRUE);
}
public void updateOrderItems(Long orderId, Integer settleWeight, Boolean isChange) {
public void updateOrderItems(Long orderId, Long companyId, Integer settleWeight, Boolean isChange) {
List<OrderExpenseItemsEntity> extraItems = orderExpenseItemsService.list(Wrappers.lambdaQuery(OrderExpenseItemsEntity.class)
.eq(OrderExpenseItemsEntity::getOrderId, orderId)
.eq(OrderExpenseItemsEntity::getDeleted, Boolean.FALSE));
@ -1355,7 +1397,7 @@ public class OrderInfoService extends ServiceImpl<OrderInfoMapper, OrderInfoEnti
for (OrderExpenseItemsEntity item : extraItems) {
item.setQuantity(MoneyStrategy.Che.getVal().equals(item.getMoneyStrategy()) ? 1 : settleWeight);
// 重新计算金额totalMoney、settleMoney
calculateAndSetItemMoney(item, isChange);
calculateAndSetItemMoney(item, companyId, isChange);
}
// 批量更新付费项包含quantity和所有金额字段
@ -1455,7 +1497,7 @@ public class OrderInfoService extends ServiceImpl<OrderInfoMapper, OrderInfoEnti
orderExpenseItemsService.saveBatch(extraItems);
// 计算付费项金额并更新订单汇总
calculateItemsAndUpdateOrder(orderId, extraItems);
calculateItemsAndUpdateOrder(orderId, transCompanyId, extraItems);
}
public OrderPagingResult pendingOrder(String licensePlate) {
@ -1909,27 +1951,29 @@ public class OrderInfoService extends ServiceImpl<OrderInfoMapper, OrderInfoEnti
* 退
*/
public void reSettlement(OrderInfoEntity order, String oldMoneyWay) {
// 旧的结算金额
BigDecimal oldSettleMoney = order.getSettleMoney();
// 计算费用
updateOrderItems(order.getId(), 0, Boolean.TRUE);
updateOrderItems(order.getId(), order.getTransCompanyId(), 0, Boolean.TRUE);
// 多退少补 获取改价后的订单信息
OrderInfoEntity newOrder = this.getById(order.getId());
BigDecimal changeMoney = newOrder.getChangeMoney() == null ? BigDecimal.ZERO : newOrder.getChangeMoney();
BigDecimal settleMoney = newOrder.getSettleMoney() == null ? BigDecimal.ZERO : newOrder.getSettleMoney();
// 新的结算金额
BigDecimal newMoney = newOrder.getSettleMoney() == null ? BigDecimal.ZERO : newOrder.getSettleMoney();
// 如果之前的计费方式就是入场付费,并且订单为已支付时,才需要多退少补;
// 如果之前的计费方式就是出场付费,勘料时一定是未支付,所以不必走下面的多退少补流程
if (MoneyWay.IN.getVal().equals(oldMoneyWay) && PaymentStatus.YiZhiFu.getVal().equals(order.getPaymentStatus().getVal())) {
// 比较改价后金额和结算金额
if (changeMoney.compareTo(settleMoney) > 0) {
if (newMoney.compareTo(oldSettleMoney) > 0) {
// 改价后金额大于结算金额,需要付款(多付)
BigDecimal payAmount = changeMoney.subtract(settleMoney);
BigDecimal payAmount = newMoney.subtract(oldSettleMoney);
// 处理公司支付
handleCompanyPay(newOrder, Boolean.TRUE, payAmount, Boolean.TRUE);
// TODO: 微信支付暂不处理
// paymentService.pay(order, payAmount);
} else if (changeMoney.compareTo(settleMoney) < 0) {
} else if (newMoney.compareTo(oldSettleMoney) < 0) {
// 改价后金额小于结算金额,需要退款(少补)
BigDecimal refundAmount = settleMoney.subtract(changeMoney);
BigDecimal refundAmount = oldSettleMoney.subtract(newMoney);
// 调用退款接口
RefundRequestDto dto = new RefundRequestDto();
dto.setOrderId(order.getId());