master
parent
be6808af55
commit
fc7632f9b4
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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_money(discount、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());
|
||||
|
|
|
|||
Loading…
Reference in New Issue