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.biz.service.*;
|
||||||
import com.njzscloud.supervisory.constant.Constant;
|
import com.njzscloud.supervisory.constant.Constant;
|
||||||
import com.njzscloud.supervisory.device.pojo.entity.DeviceLocalizerEntity;
|
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.BillingType;
|
||||||
import com.njzscloud.supervisory.expense.contant.ExpenseItemCategory;
|
import com.njzscloud.supervisory.expense.contant.ExpenseItemCategory;
|
||||||
import com.njzscloud.supervisory.expense.contant.GoodsScope;
|
import com.njzscloud.supervisory.expense.contant.GoodsScope;
|
||||||
|
|
@ -115,6 +117,7 @@ public class OrderInfoService extends ServiceImpl<OrderInfoMapper, OrderInfoEnti
|
||||||
private final UserRoleService userRoleService;
|
private final UserRoleService userRoleService;
|
||||||
private final UserService userService;
|
private final UserService userService;
|
||||||
private final BizTruckService bizTruckService;
|
private final BizTruckService bizTruckService;
|
||||||
|
private final DiscountManageService discountManageService;
|
||||||
private final AtomicBoolean test_thread_running = new AtomicBoolean(false);
|
private final AtomicBoolean test_thread_running = new AtomicBoolean(false);
|
||||||
Thread test_thread = null;
|
Thread test_thread = null;
|
||||||
@Value("${app.check-gps:false}")
|
@Value("${app.check-gps:false}")
|
||||||
|
|
@ -1170,7 +1173,7 @@ public class OrderInfoService extends ServiceImpl<OrderInfoMapper, OrderInfoEnti
|
||||||
Assert.notNull(entity, () -> Exceptions.clierr("产品不存在"));
|
Assert.notNull(entity, () -> Exceptions.clierr("产品不存在"));
|
||||||
if (MoneyWay.OUT.getVal().equals(entity.getMoneyWay())) {
|
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());
|
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 付费项实体
|
* @param item 付费项实体
|
||||||
*/
|
*/
|
||||||
private void calculateAndSetItemMoney(OrderExpenseItemsEntity item, Boolean isChange) {
|
private void calculateAndSetItemMoney(OrderExpenseItemsEntity item, Long companyId, Boolean isChange) {
|
||||||
// 计算总金额
|
// 计算总金额
|
||||||
BigDecimal totalMoney = calculateItemTotalMoney(item);
|
BigDecimal totalMoney = calculateItemTotalMoney(item);
|
||||||
|
|
||||||
|
// 计算优惠金额(有正负)
|
||||||
|
BigDecimal discountMoney = calculateItemDiscountMoney(companyId, item);
|
||||||
|
|
||||||
// settle_money = total_money + discount_money + revise_money(discount、revise 可为正负)
|
// 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 revise = item.getReviseMoney() == null ? BigDecimal.ZERO : item.getReviseMoney();
|
||||||
BigDecimal settle = totalMoney.add(discount).add(revise);
|
BigDecimal settle = totalMoney.add(discount).add(revise);
|
||||||
if (isChange) {
|
if (isChange) {
|
||||||
item.setChangeMoney(settle);
|
item.setTotalMoney(totalMoney).setSettleMoney(settle).setDiscountMoney(discount).setChangeMoney(settle);
|
||||||
} else {
|
} 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 orderId 订单ID
|
||||||
* @param items 付费项列表
|
* @param items 付费项列表
|
||||||
*/
|
*/
|
||||||
private void calculateItemsAndUpdateOrder(Long orderId, List<OrderExpenseItemsEntity> items) {
|
private void calculateItemsAndUpdateOrder(Long orderId, Long companyId, List<OrderExpenseItemsEntity> items) {
|
||||||
// 计算各付费项金额
|
// 计算各付费项金额
|
||||||
for (OrderExpenseItemsEntity item : items) {
|
for (OrderExpenseItemsEntity item : items) {
|
||||||
calculateAndSetItemMoney(item, Boolean.FALSE);
|
calculateAndSetItemMoney(item, companyId, Boolean.FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 批量更新付费项(包含quantity和所有金额字段)
|
// 批量更新付费项(包含quantity和所有金额字段)
|
||||||
|
|
@ -1346,7 +1388,7 @@ public class OrderInfoService extends ServiceImpl<OrderInfoMapper, OrderInfoEnti
|
||||||
updateOrderTotalMoney(orderId, items, Boolean.FALSE, Boolean.TRUE);
|
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)
|
List<OrderExpenseItemsEntity> extraItems = orderExpenseItemsService.list(Wrappers.lambdaQuery(OrderExpenseItemsEntity.class)
|
||||||
.eq(OrderExpenseItemsEntity::getOrderId, orderId)
|
.eq(OrderExpenseItemsEntity::getOrderId, orderId)
|
||||||
.eq(OrderExpenseItemsEntity::getDeleted, Boolean.FALSE));
|
.eq(OrderExpenseItemsEntity::getDeleted, Boolean.FALSE));
|
||||||
|
|
@ -1355,7 +1397,7 @@ public class OrderInfoService extends ServiceImpl<OrderInfoMapper, OrderInfoEnti
|
||||||
for (OrderExpenseItemsEntity item : extraItems) {
|
for (OrderExpenseItemsEntity item : extraItems) {
|
||||||
item.setQuantity(MoneyStrategy.Che.getVal().equals(item.getMoneyStrategy()) ? 1 : settleWeight);
|
item.setQuantity(MoneyStrategy.Che.getVal().equals(item.getMoneyStrategy()) ? 1 : settleWeight);
|
||||||
// 重新计算金额(totalMoney、settleMoney)
|
// 重新计算金额(totalMoney、settleMoney)
|
||||||
calculateAndSetItemMoney(item, isChange);
|
calculateAndSetItemMoney(item, companyId, isChange);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 批量更新付费项(包含quantity和所有金额字段)
|
// 批量更新付费项(包含quantity和所有金额字段)
|
||||||
|
|
@ -1455,7 +1497,7 @@ public class OrderInfoService extends ServiceImpl<OrderInfoMapper, OrderInfoEnti
|
||||||
orderExpenseItemsService.saveBatch(extraItems);
|
orderExpenseItemsService.saveBatch(extraItems);
|
||||||
|
|
||||||
// 计算付费项金额并更新订单汇总
|
// 计算付费项金额并更新订单汇总
|
||||||
calculateItemsAndUpdateOrder(orderId, extraItems);
|
calculateItemsAndUpdateOrder(orderId, transCompanyId, extraItems);
|
||||||
}
|
}
|
||||||
|
|
||||||
public OrderPagingResult pendingOrder(String licensePlate) {
|
public OrderPagingResult pendingOrder(String licensePlate) {
|
||||||
|
|
@ -1909,27 +1951,29 @@ public class OrderInfoService extends ServiceImpl<OrderInfoMapper, OrderInfoEnti
|
||||||
* 重新计算,多退少补
|
* 重新计算,多退少补
|
||||||
*/
|
*/
|
||||||
public void reSettlement(OrderInfoEntity order, String oldMoneyWay) {
|
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());
|
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 (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);
|
handleCompanyPay(newOrder, Boolean.TRUE, payAmount, Boolean.TRUE);
|
||||||
// TODO: 微信支付暂不处理
|
// TODO: 微信支付暂不处理
|
||||||
// paymentService.pay(order, payAmount);
|
// 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();
|
RefundRequestDto dto = new RefundRequestDto();
|
||||||
dto.setOrderId(order.getId());
|
dto.setOrderId(order.getId());
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue