|
|
@@ -468,8 +468,22 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|
|
Order orderMessage = new Order();
|
|
|
orderMessage.setId(order.getId());
|
|
|
if (CollectionUtils.isNotEmpty(list) && order.getTradeType().equals(OrderTypeEnum.DOMESTIC.getType())) {
|
|
|
+ BigDecimal correctCreateProfit = BigDecimal.ZERO;//是销售政策产生返利
|
|
|
+ BigDecimal faultCreateProfit = BigDecimal.ZERO;//不是销售政策产生返利
|
|
|
+
|
|
|
+ //有销售政策:产生返利=销售明细中的(特价-真实特价)X 条数 的明细和
|
|
|
+ correctCreateProfit = list.stream().filter(e -> ObjectUtils.isNotNull(e.getPriceType())).
|
|
|
+ reduce(BigDecimal.ZERO, (x, y) -> x.add((y.getPrice().subtract(y.getRealSpecialOffer())).multiply(y.getOrderQuantity())), BigDecimal::add);
|
|
|
+
|
|
|
+ //无销售政策:产生返利=(单价*数量)* (2%+1%+1%)
|
|
|
+ faultCreateProfit = list.stream().filter(e -> ObjectUtils.isNull(e.getPriceType())).
|
|
|
+ reduce(BigDecimal.ZERO, (x, y) -> x.add((y.getPrice().multiply(y.getOrderQuantity())).multiply(new BigDecimal(0.04))), BigDecimal::add);
|
|
|
+
|
|
|
+ //最终销售订单中产生返利=有销售政策:产生返利+无销售政策:产生返利
|
|
|
+ order.setCreateProfit(correctCreateProfit.add(faultCreateProfit));
|
|
|
// 采购金额求和
|
|
|
BigDecimal reduce = list.stream().reduce(BigDecimal.ZERO, (x, y) -> x.add(y.getPurchaseAmount().multiply(y.getOrderQuantity())), BigDecimal::add);
|
|
|
+
|
|
|
// 金额求和
|
|
|
BigDecimal amount = BigDecimal.ZERO;
|
|
|
if (AuthUtil.getTenantId().equals("577435")) {
|
|
|
@@ -478,7 +492,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|
|
amount = list.stream().map(OrderItems::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
}
|
|
|
//毛利额 = 销售金额-采购金额-预计海运费-本次使用返利+应收费用(除包装费)- 本次产生返利
|
|
|
- BigDecimal grossProfit = amount.subtract(reduce.add(order.getPredictOceanFreight())).subtract(order.getThisUsedProfit() == null ? BigDecimal.ZERO : order.getThisUsedProfit());
|
|
|
+ //BigDecimal grossProfit = amount.subtract(reduce.add(order.getPredictOceanFreight())).subtract(order.getThisUsedProfit() == null ? BigDecimal.ZERO : order.getThisUsedProfit());
|
|
|
+ BigDecimal grossProfit = amount.subtract(reduce).subtract(order.getPredictOceanFreight());
|
|
|
//BigDecimal grossProfit = amount.subtract(reduce.add(order.getPredictOceanFreight())).subtract(order.getCreateProfit() == null ? BigDecimal.ZERO : order.getCreateProfit());
|
|
|
//国内主表需要总重量总体积
|
|
|
//总重量求和
|
|
|
@@ -493,14 +508,20 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|
|
}
|
|
|
List<OrderFees> feeList = orderFeesService.list(new LambdaQueryWrapper<OrderFees>().eq(OrderFees::getPid, order.getId()).ne(OrderFees::getItemId, feeId).eq(OrderFees::getIsDeleted, 0));
|
|
|
BigDecimal totalFee = feeList.stream().map(OrderFees::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
- grossProfit = grossProfit.add(totalFee);
|
|
|
- //毛利额减去本次产生返利
|
|
|
+ grossProfit = grossProfit.subtract(totalFee);
|
|
|
+ //毛利额减去产生返利
|
|
|
grossProfit = grossProfit.subtract(order.getCreateProfit() == null ? BigDecimal.ZERO : order.getCreateProfit());
|
|
|
|
|
|
+ //毛利额加采购返利
|
|
|
+ BigDecimal purchaseRebatePrice = list.stream().reduce(BigDecimal.ZERO, (x, y) -> x.add((y.getPurchaseAmount().subtract(y.getPurchaseRebatePrice() == null ? BigDecimal.ZERO : y.getPurchaseRebatePrice())).multiply(y.getOrderQuantity())), BigDecimal::add);
|
|
|
+ grossProfit = grossProfit.add(purchaseRebatePrice);
|
|
|
+
|
|
|
BigDecimal grossProfitRate = new BigDecimal(BigInteger.ZERO);
|
|
|
if (amount.compareTo(BigDecimal.ZERO) > 0) {
|
|
|
- grossProfitRate = (grossProfit.divide(amount, RoundingMode.CEILING)).multiply(new BigDecimal(100));
|
|
|
+ grossProfitRate = (grossProfit.divide(amount, RoundingMode.CEILING));
|
|
|
}
|
|
|
+ //产生返利
|
|
|
+ orderMessage.setCreateProfit(order.getCreateProfit());
|
|
|
// 毛利额
|
|
|
orderMessage.setGrossProfit(grossProfit);
|
|
|
// 毛利率
|
|
|
@@ -5396,12 +5417,14 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|
|
List<Long> pids = pidList.stream().distinct().collect(Collectors.toList());
|
|
|
for (Long pid : pids) {
|
|
|
Order order1 = baseMapper.selectById(pid);
|
|
|
- BigDecimal purchaseQuantity = orderItemsList.stream().filter(e -> e.getSrcId().equals(pid)).map(OrderItems::getPurchaseQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+ BigDecimal purchaseQuantity = orderItemsList.stream().filter(e -> e.getSrcId().equals(pid) && "MX".equals(e.getDetailType()))
|
|
|
+ .map(OrderItems::getActualQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
if (ObjectUtils.isNotNull(order1)) {
|
|
|
if (1 == order.getPurchaseStatusType()) {
|
|
|
order1.setProductionScheduling("排产中");
|
|
|
order1.setOrderStatus("排产中");
|
|
|
order1.setProductionSchedulingDate(order.getProductionSchedulingDate());
|
|
|
+ order1.setPurchaseQuantity(order1.getPurchaseQuantity().add(purchaseQuantity));
|
|
|
} else if (2 == order.getPurchaseStatusType()) {
|
|
|
order1.setProductionScheduling("预计货好");
|
|
|
order1.setOrderStatus("预计货好");
|
|
|
@@ -5411,9 +5434,6 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|
|
order1.setOrderStatus("货备齐");
|
|
|
order1.setProductionSchedulingDate(new Date());
|
|
|
}
|
|
|
- if (order1.getStorageQuantity().equals(order1.getPurchaseQuantity().add(purchaseQuantity))) {
|
|
|
- order1.setPurchaseQuantity(order1.getPurchaseQuantity().add(purchaseQuantity));
|
|
|
- }
|
|
|
baseMapper.updateById(order1);
|
|
|
}
|
|
|
}
|
|
|
@@ -5487,6 +5507,126 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
|
|
|
+ public R cancelPurchaseStatus(Order order) {
|
|
|
+ if (null == order.getId()) {
|
|
|
+ throw new RuntimeException("缺少必要参数");
|
|
|
+ }
|
|
|
+ Order detail = baseMapper.selectById(order.getId());
|
|
|
+ if (ObjectUtils.isNull(detail)) {
|
|
|
+ throw new RuntimeException("未找到单据信息");
|
|
|
+ }
|
|
|
+ if ("预计货好".equals(detail.getFudaPurchaseStatus()) || "货备齐".equals(detail.getFudaPurchaseStatus())){
|
|
|
+ throw new RuntimeException("订单已预计货好或货备齐,无法撤销排产");
|
|
|
+ }
|
|
|
+
|
|
|
+ detail.setProductionScheduling("");
|
|
|
+ detail.setFudaPurchaseStatus("待采购");
|
|
|
+ detail.setOrderStatus("待采购");
|
|
|
+ detail.setProductionSchedulingDate(null);
|
|
|
+
|
|
|
+ //获得所有明细数据
|
|
|
+ LambdaQueryWrapper<OrderItems> lambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ lambdaQueryWrapper.eq(OrderItems::getIsDeleted, 0)
|
|
|
+ .eq(OrderItems::getTenantId, AuthUtil.getTenantId())
|
|
|
+ .eq(OrderItems::getPid, detail.getId());
|
|
|
+ List<OrderItems> orderItemsList = orderItemsMapper.selectList(lambdaQueryWrapper);
|
|
|
+
|
|
|
+ if (ObjectUtils.isNotNull(orderItemsList) && orderItemsList.size() > 0) {
|
|
|
+ List<Long> pidList = new ArrayList<>();
|
|
|
+ for (OrderItems orderItems : orderItemsList) {
|
|
|
+ orderItemsMapper.updateById(orderItems);
|
|
|
+ if (ObjectUtils.isNotEmpty(orderItems.getDetailType())){
|
|
|
+ if (OrderTypeEnum.PARTSTYPE.getType().equals(orderItems.getDetailType())){//更新对应配件明细采购数量
|
|
|
+ OrderParts srcItems = orderPartsMapper.selectById(orderItems.getSrcItemId());
|
|
|
+ srcItems.setPurchasesNumber(srcItems.getPurchasesNumber().subtract(orderItems.getActualQuantity()));
|
|
|
+ orderPartsMapper.updateById(srcItems);
|
|
|
+ }else {
|
|
|
+ //更新对应销售单明细采购数量
|
|
|
+ OrderItems srcItems = new OrderItems();
|
|
|
+ srcItems.setId(orderItems.getSrcItemId());
|
|
|
+ srcItems.setPurchaseQuantity(orderItems.getPurchaseQuantity().subtract(orderItems.getActualQuantity()));
|
|
|
+ orderItemsMapper.updateById(srcItems);
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ //更新对应销售单明细采购数量
|
|
|
+ OrderItems srcItems = new OrderItems();
|
|
|
+ srcItems.setId(orderItems.getSrcItemId());
|
|
|
+ srcItems.setPurchaseQuantity(orderItems.getPurchaseQuantity().subtract(orderItems.getActualQuantity()));
|
|
|
+ orderItemsMapper.updateById(srcItems);
|
|
|
+ }
|
|
|
+
|
|
|
+ pidList.add(orderItems.getSrcId());
|
|
|
+ }
|
|
|
+ List<Long> pids = pidList.stream().distinct().collect(Collectors.toList());
|
|
|
+ for (Long pid : pids) {
|
|
|
+ Order order1 = baseMapper.selectById(pid);
|
|
|
+ BigDecimal purchaseQuantity = orderItemsList.stream().filter(e -> e.getSrcId().equals(pid) && "MX".equals(e.getDetailType()))
|
|
|
+ .map(OrderItems::getActualQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+ if (ObjectUtils.isNotNull(order1)) {
|
|
|
+ order1.setProductionScheduling("待采购");
|
|
|
+ order1.setOrderStatus("待采购");
|
|
|
+ order1.setProductionSchedulingDate(null);
|
|
|
+ order1.setPurchaseQuantity(order1.getPurchaseQuantity().subtract(purchaseQuantity));
|
|
|
+ baseMapper.updateById(order1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ baseMapper.updateById(detail);
|
|
|
+ String[] arrs = detail.getSrcIds().split(",");
|
|
|
+ for (String arr : arrs) {
|
|
|
+ Order selectOrder = baseMapper.selectById(Long.parseLong(arr));
|
|
|
+ if (ObjectUtils.isNotNull(selectOrder)) {
|
|
|
+ selectOrder.setUpdateTime(new Date());
|
|
|
+ selectOrder.setUpdateUser(AuthUtil.getUserId());
|
|
|
+ selectOrder.setUpdateUserName(AuthUtil.getUserName());
|
|
|
+
|
|
|
+ //循环发送消息
|
|
|
+ Message sendMessage = new Message();
|
|
|
+ sendMessage.setParameter(String.valueOf(selectOrder.getId()));
|
|
|
+ sendMessage.setUserName(AuthUtil.getUserName());
|
|
|
+ sendMessage.setUserId(AuthUtil.getUserId());
|
|
|
+ sendMessage.setMessageType(1);
|
|
|
+ sendMessage.setTenantId(AuthUtil.getTenantId());
|
|
|
+ sendMessage.setCreateUser(AuthUtil.getUserId());
|
|
|
+ sendMessage.setCreateTime(new Date());
|
|
|
+ sendMessage.setPageLabel(selectOrder.getPageLabel());
|
|
|
+ sendMessage.setPageStatus(selectOrder.getPageStatus());
|
|
|
+ if (true) {
|
|
|
+ sendMessage.setUrl("/exportTrade/salesContract/index");
|
|
|
+ sendMessage.setToUserId(selectOrder.getCreateUser());
|
|
|
+ sendMessage.setToUserName(selectOrder.getCreateUserName());
|
|
|
+ sendMessage.setMessageBody("您的销售订单" + selectOrder.getSysNo() + "已撤销排产,请查看");
|
|
|
+
|
|
|
+ selectOrder.setProductionScheduling("待采购");
|
|
|
+ selectOrder.setOrderStatus("待采购");
|
|
|
+ selectOrder.setProductionSchedulingDate(null);
|
|
|
+
|
|
|
+ R save = messageClient.save(sendMessage);
|
|
|
+ if (!save.isSuccess()) {
|
|
|
+ throw new SecurityException("发送消息失败");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (true) {
|
|
|
+ sendMessage.setUrl("/exportTrade/invoice/index");
|
|
|
+ sendMessage.setToUserId(selectOrder.getDocumenterId());
|
|
|
+ sendMessage.setToUserName(selectOrder.getDocumenterName());
|
|
|
+
|
|
|
+ sendMessage.setMessageBody("您的销售订单" + selectOrder.getSysNo() + "已撤销排产,请查看");
|
|
|
+
|
|
|
+ R save = messageClient.save(sendMessage);
|
|
|
+ if (!save.isSuccess()) {
|
|
|
+ throw new SecurityException("发送消息失败");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ baseMapper.updateById(selectOrder);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return R.data(detail);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
public R documentQuantityStatistics(Order order) {
|
|
|
|
|
|
List<Map<String, Object>> mapList = new ArrayList<>();
|