Browse Source

20230411 18:53

wangzhuo 2 years ago
parent
commit
806e35ccb3

+ 1 - 0
blade-service-api/blade-purchase-sales-api/src/main/java/org/springblade/purchase/sales/entity/Order.java

@@ -1275,6 +1275,7 @@ public class Order implements Serializable {
 	 * 排产日期(福达)
 	 */
 	@ApiModelProperty(value = "排产日期")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private Date productionSchedulingDate;
 
 	/**

+ 14 - 0
blade-service-api/blade-purchase-sales-api/src/main/java/org/springblade/purchase/sales/entity/OrderItems.java

@@ -105,6 +105,7 @@ public class OrderItems implements Serializable {
 	 */
 	@ApiModelProperty(value = "采购金额")
 	private BigDecimal purchaseAmount;
+
 	/**
 	 * 入库数量
 	 */
@@ -125,6 +126,19 @@ public class OrderItems implements Serializable {
 	 */
 	@ApiModelProperty(value = "单价")
 	private BigDecimal price;
+
+	/**
+	 * 真实特价
+	 */
+	@ApiModelProperty(value = "真实特价")
+	private BigDecimal realSpecialOffer;
+
+	/**
+	 * 采购返利价
+	 */
+	@ApiModelProperty(value = "采购返利价")
+	private BigDecimal purchaseRebatePrice;
+
 	/**
 	 * 金额(合同金额)
 	 */

+ 2 - 1
blade-service/blade-mocha-item/src/main/java/org/springblade/mocha/mapper/PriceItemMapper.xml

@@ -47,7 +47,8 @@
     <select id="getPurchasePrice" resultType="map">
         select
         DISTINCT
-	    IFNULL(purchase_price,0) AS purchasePrice
+	    IFNULL(purchase_price,0) AS purchasePrice,
+	    IFNULL(purchase_rebate_price,0) AS purchaseRebatePrice
 	    from basic_price_item where is_deleted = 0
         and tenant_id = #{tenantId}
         and code = #{code}

+ 18 - 2
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/export/ExportOrderController.java

@@ -1316,8 +1316,7 @@ public class ExportOrderController extends BladeController {
 			.eq(Order::getTenantId, AuthUtil.getTenantId())
 			.eq(Order::getBillType, OrderTypeEnum.SALES.getType())
 			.eq(Order::getTradeType, OrderTypeEnum.EXPORT.getType())
-			.isNotNull(Order::getProductionScheduling)
-			.ne(Order::getProductionScheduling,"货备齐");
+			.apply("storage_quantity > purchase_quantity");//销售数量大于采购数量
 		List<Order> orderList = orderService.list(lambdaQueryWrapper);
 		return R.data(orderList);
 	}
@@ -1552,6 +1551,23 @@ public class ExportOrderController extends BladeController {
 	}
 
 	/**
+	 * 撤销排产
+	 *
+	 * @param order
+	 * @return
+	 */
+	@PostMapping("/cancelPurchaseStatus")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "撤销排产", notes = "传入主订单id,明细ids")
+	@RepeatSubmit
+	public R cancelPurchaseStatus(@Valid @RequestBody Order order) {
+		if (order.getId() == null) {
+			return R.fail(500, "参数缺失");
+		}
+		return orderService.cancelPurchaseStatus(order);
+	}
+
+	/**
 	 * 单据数量统计
 	 *
 	 * @param order

+ 2 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/IOrderService.java

@@ -506,6 +506,8 @@ public interface IOrderService extends IService<Order> {
 
     R purchaseStatusUpdate(Order order);
 
+	R cancelPurchaseStatus(Order order);
+
     R documentQuantityStatistics(Order order);
 
 	R quickBillingWX(Order order);

+ 148 - 8
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/impl/OrderServiceImpl.java

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