lazhaoqian 4 rokov pred
rodič
commit
bba686ed89

+ 5 - 0
blade-service-api/blade-deliver-goods-api/src/main/java/org/springblade/deliver/goods/entity/Delivery.java

@@ -324,4 +324,9 @@ public class Delivery implements Serializable {
 
 	@TableField(exist = false)
 	private String createEndTime;
+	/**
+	 * 发货单操作类型
+	 */
+	@TableField(exist = false)
+	private int deliveryType;
 }

+ 32 - 0
blade-service-api/blade-deliver-goods-api/src/main/java/org/springblade/deliver/goods/enums/DeliveryEnum.java

@@ -0,0 +1,32 @@
+package org.springblade.deliver.goods.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Objects;
+
+@Getter
+@AllArgsConstructor
+public enum  DeliveryEnum {
+	/**
+	 * 发货
+	 */
+	DELIVER(1),
+
+	/**
+	 * 撤销发货
+	 */
+	REPEAL(2),
+
+	;
+	private final Integer type;
+
+	public static DeliveryEnum fromType(Integer delivery) {
+		for (DeliveryEnum type : DeliveryEnum.values()) {
+			if (Objects.equals(type.getType(), delivery)) {
+				return type;
+			}
+		}
+		throw new IllegalArgumentException("order status not exist");
+	}
+}

+ 3 - 1
blade-service-api/blade-purchase-sales-api/src/main/java/org/springblade/purchase/sales/feign/IOrderItemsClient.java

@@ -20,9 +20,11 @@ public interface IOrderItemsClient {
 	 * 修改订单明细发货数量
 	 * @param orderItemsId 订单明细id
 	 * @param actualQuantity 发货数量
+	 * @param    deliveryType 操作类型 发货、撤销发货
 	 * @return
 	 */
 	@GetMapping(ACTUAL_QUANTITY)
 	R updateActualQuantity(@RequestParam("orderItemsId") Long orderItemsId,
-						   @RequestParam("actualQuantity")BigDecimal actualQuantity);
+						   @RequestParam("actualQuantity")BigDecimal actualQuantity,
+						   @RequestParam("deliveryType")int deliveryType);
 }

+ 15 - 1
blade-service/blade-deliver-goods/src/main/java/org/springblade/deliver/goods/controller/DeliveryController.java

@@ -34,6 +34,7 @@ import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.deliver.goods.enums.DeliveryEnum;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
 import org.springframework.web.bind.annotation.*;
@@ -127,7 +128,7 @@ public class DeliveryController extends BladeController {
 	}
 
 	/**
-	 * 新增 国内发货通知单
+	 * 确认发货通知单
 	 */
 	@PostMapping("/save")
 	@ApiOperationSupport(order = 4)
@@ -135,6 +136,19 @@ public class DeliveryController extends BladeController {
 	public R save(@Valid @RequestBody Delivery delivery) {
 		delivery.setBillType(OrderTypeEnum.SHIP.getType());
 		delivery.setTradeType(OrderTypeEnum.DOMESTIC.getType());
+		delivery.setDeliveryType(DeliveryEnum.DELIVER.getType());
+		return deliveryService.submit(delivery);
+	}
+	/**
+	 * 撤销发货通知单
+	 */
+	@PostMapping("/repeal")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "新增", notes = "传入delivery")
+	public R repeal(@Valid @RequestBody Delivery delivery) {
+		delivery.setBillType(OrderTypeEnum.SHIP.getType());
+		delivery.setTradeType(OrderTypeEnum.DOMESTIC.getType());
+		delivery.setDeliveryType(DeliveryEnum.REPEAL.getType());
 		return deliveryService.submit(delivery);
 	}
 

+ 63 - 12
blade-service/blade-deliver-goods/src/main/java/org/springblade/deliver/goods/service/impl/DeliveryItemsServiceImpl.java

@@ -29,6 +29,7 @@ import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.deliver.goods.entity.Delivery;
 import org.springblade.deliver.goods.entity.DeliveryItems;
+import org.springblade.deliver.goods.enums.DeliveryEnum;
 import org.springblade.deliver.goods.vo.DeliveryItemsVO;
 import org.springblade.deliver.goods.mapper.DeliveryItemsMapper;
 import org.springblade.deliver.goods.service.IDeliveryItemsService;
@@ -114,9 +115,10 @@ public class DeliveryItemsServiceImpl extends ServiceImpl<DeliveryItemsMapper, D
 	 * 提交发货信息
 	 * @param pId
 	 * @param deliveryItemsList
+	 * @param type 操作类型  发货 1 撤销发货 2
 	 * @return
 	 */
-	public List<DeliveryItems> affirmDeliveryItemsList(Long pId,Delivery delivery,List<DeliveryItems> deliveryItemsList){
+	public List<DeliveryItems> affirmDeliveryItemsList(Long pId,Delivery delivery,List<DeliveryItems> deliveryItemsList,int type){
 		for (DeliveryItems deliveryItems : deliveryItemsList) {
 			deliveryItems.setPid(pId);//父级ID
 			deliveryItems.setTenantId(SecureUtil.getTenantId());//租户id
@@ -130,15 +132,17 @@ public class DeliveryItemsServiceImpl extends ServiceImpl<DeliveryItemsMapper, D
 				baseMapper.updateById(deliveryItems);
 			}
 			StockGoodsVO stock = this.getStock(delivery.getTradeType(), delivery.getCorpId(), delivery.getStorageId(), deliveryItems);
-			if (stock != null){
+			if (stock != null && delivery.getDeliveryType() == DeliveryEnum.DELIVER.getType()){//发货
 				//更新库存账
 				this.deliverGoods(delivery.getTradeType(),stock.getId(),deliveryItems);
+			}else if (stock != null && delivery.getDeliveryType() == DeliveryEnum.REPEAL.getType()){ //撤销发货
+
 			}else {
 				//新增库存账
 				throw  new RuntimeException("库存为空");
 			}
 			// todo 更新订单明细中发货数量  采购和销售可能需要调不同接口
-			R actualQuantity = orderItemsClient.updateActualQuantity(deliveryItems.getSrcId(), deliveryItems.getActualQuantity());
+			R actualQuantity = orderItemsClient.updateActualQuantity(deliveryItems.getSrcId(), deliveryItems.getActualQuantity(),delivery.getDeliveryType());
 			if (!actualQuantity.isSuccess()){
 				throw new RuntimeException("更新订单发货数量出错," + actualQuantity.getMsg());
 			}
@@ -189,35 +193,35 @@ public class DeliveryItemsServiceImpl extends ServiceImpl<DeliveryItemsMapper, D
 		StockGoods stockGoods = stockById.getData();
 		//判断出库数量和结余数量的大小
 		if (stockGoods.getBalanceQuantity().compareTo(deliveryItems.getActualQuantity()) < 0){
-			throw  new RuntimeException("当前结余数量为:"+stockGoods.getBalanceQuantity() +"小于出库数量,出库数量为:" +deliveryItems.getActualQuantity());
+			throw  new RuntimeException("当前结余数量为:"+stockGoods.getBalanceQuantity() +"小于发货数量,发货数量为:" +deliveryItems.getActualQuantity());
 		}
 		if (stockGoods.getLockingQuantity().compareTo(deliveryItems.getActualQuantity()) < 0){
-			throw  new RuntimeException("当前可用数量为:"+stockGoods.getLockingQuantity() +"小于出库数量,出库数量为:" +deliveryItems.getActualQuantity());
+			throw  new RuntimeException("当前可用数量为:"+stockGoods.getLockingQuantity() +"小于发货数量,发货数量为:" +deliveryItems.getActualQuantity());
 		}
 		stockGoods.setOutQuantity(stockGoods.getOutQuantity().add( deliveryItems.getActualQuantity()));//出库数量 加
-		stockGoods.setLockingQuantity(stockGoods.getLockingQuantity().subtract(deliveryItems.getActualQuantity()));//锁定数量 减
+		//stockGoods.setLockingQuantity(stockGoods.getLockingQuantity().subtract(deliveryItems.getActualQuantity()));//锁定数量 减
 		stockGoods.setBalanceQuantity(stockGoods.getBalanceQuantity().subtract(deliveryItems.getActualQuantity()));//结余数量 减
 		stockGoods.setSurplusRouteQuantity(stockGoods.getSurplusRouteQuantity().subtract(deliveryItems.getActualQuantity()));//可用数量 减
 		if (tradeType.equals(OrderTypeEnum.IMPORT.getType())){
 			//判断出库发票重量和结余发票重量
 			if (stockGoods.getBalanceWeight().compareTo(deliveryItems.getInvoiceWeight()) < 0){
-				throw  new RuntimeException("当前结余发票重量为:"+stockGoods.getBalanceWeight() +"小于出库发票重量,出库发票重量为:" +deliveryItems.getInvoiceWeight());
+				throw  new RuntimeException("当前结余发票重量为:"+stockGoods.getBalanceWeight() +"小于发货发票重量,发货发票重量为:" +deliveryItems.getInvoiceWeight());
 			}
 			if (stockGoods.getLockingWeight().compareTo(deliveryItems.getInvoiceWeight()) < 0){
-				throw  new RuntimeException("当前结余发票重量为:"+stockGoods.getLockingWeight() +"小于出库发票重量,出库发票重量为:" +deliveryItems.getInvoiceWeight());
+				throw  new RuntimeException("当前结余发票重量为:"+stockGoods.getLockingWeight() +"小于发货发票重量,发货发票重量为:" +deliveryItems.getInvoiceWeight());
 			}
 			stockGoods.setOutWeight(stockGoods.getOutWeight().add(deliveryItems.getInvoiceWeight()));//出库发票重量
-			stockGoods.setLockingWeight(stockGoods.getLockingWeight().subtract(deliveryItems.getInvoiceWeight()));//锁定发票重量
+			//stockGoods.setLockingWeight(stockGoods.getLockingWeight().subtract(deliveryItems.getInvoiceWeight()));//锁定发票重量
 			stockGoods.setBalanceWeight(stockGoods.getBalanceWeight().subtract(deliveryItems.getInvoiceWeight()));//结余发票重量
 			//判断出库码单重量和结余码单重量
 			if (stockGoods.getBalanceVolumn().compareTo(deliveryItems.getBillWeight()) < 0){
-				throw  new RuntimeException("当前结余码单重量为:"+stockGoods.getBalanceVolumn() +"小于出库码单重量,出库码单重量为:" +deliveryItems.getBillWeight());
+				throw  new RuntimeException("当前结余码单重量为:"+stockGoods.getBalanceVolumn() +"小于发货码单重量,发货码单重量为:" +deliveryItems.getBillWeight());
 			}
 			if (stockGoods.getLockingVolumn().compareTo(deliveryItems.getBillWeight()) < 0){
-				throw  new RuntimeException("当前结余码单重量为:"+stockGoods.getLockingVolumn() +"小于出库码单重量,出库码单重量为:" +deliveryItems.getBillWeight());
+				throw  new RuntimeException("当前结余码单重量为:"+stockGoods.getLockingVolumn() +"小于发货码单重量,发货码单重量为:" +deliveryItems.getBillWeight());
 			}
 			stockGoods.setOutVolumn(stockGoods.getOutVolumn().add(deliveryItems.getBillWeight()));//出库码单重量
-			stockGoods.setLockingVolumn(stockGoods.getLockingVolumn().subtract(deliveryItems.getBillWeight()));//锁定码单重量
+			//stockGoods.setLockingVolumn(stockGoods.getLockingVolumn().subtract(deliveryItems.getBillWeight()));//锁定码单重量
 			stockGoods.setBalanceVolumn(stockGoods.getBalanceVolumn().subtract(deliveryItems.getBillWeight()));//结余码单重量
 		}
 		stockGoods.setUpdateTime(new Date());
@@ -228,6 +232,53 @@ public class DeliveryItemsServiceImpl extends ServiceImpl<DeliveryItemsMapper, D
 		}
 	}
 	/**
+	 * 撤销发货
+	 * @param tradeType 单据类型 进口、出口、国内
+	 * @param stockId 库存账id
+	 * @param deliveryItems 货物明细信息
+	 */
+	public void revocationDeliverGoods(String tradeType,Long stockId,DeliveryItems deliveryItems){
+		//查询库存账
+		R<StockGoods> stockById = stockGoodsClient.getStockById(stockId);
+		if (!stockById.isSuccess()){
+			throw  new RuntimeException("查询库存账出错");
+		}
+		if (stockById.getData() == null){
+			throw  new RuntimeException("库存账不存在");
+		}
+		StockGoods stockGoods = stockById.getData();
+		//判断出库数量和结余数量的大小
+		if (stockGoods.getOutQuantity().compareTo(deliveryItems.getActualQuantity()) < 0){
+			throw  new RuntimeException("当前可减少出库数量为:"+stockGoods.getOutQuantity() +"小于发货数量,发货数量为:" +deliveryItems.getActualQuantity());
+		}
+		stockGoods.setOutQuantity(stockGoods.getOutQuantity().subtract( deliveryItems.getActualQuantity()));//出库数量 加
+		//stockGoods.setLockingQuantity(stockGoods.getLockingQuantity().add(deliveryItems.getActualQuantity()));//锁定数量 减
+		stockGoods.setBalanceQuantity(stockGoods.getBalanceQuantity().add(deliveryItems.getActualQuantity()));//结余数量 减
+		stockGoods.setSurplusRouteQuantity(stockGoods.getSurplusRouteQuantity().add(deliveryItems.getActualQuantity()));//可用数量 减
+		if (tradeType.equals(OrderTypeEnum.IMPORT.getType())){
+			//判断出库发票重量和结余发票重量
+			if (stockGoods.getOutWeight().compareTo(deliveryItems.getInvoiceWeight()) < 0){
+				throw  new RuntimeException("当前出库发票重量为:"+stockGoods.getOutWeight() +"小于发货发票重量,发货发票重量为:" +deliveryItems.getInvoiceWeight());
+			}
+			stockGoods.setOutWeight(stockGoods.getOutWeight().subtract(deliveryItems.getInvoiceWeight()));//出库发票重量
+			//stockGoods.setLockingWeight(stockGoods.getLockingWeight().add(deliveryItems.getInvoiceWeight()));//锁定发票重量
+			stockGoods.setBalanceWeight(stockGoods.getBalanceWeight().add(deliveryItems.getInvoiceWeight()));//结余发票重量
+			//判断出库码单重量和结余码单重量
+			if (stockGoods.getOutVolumn().compareTo(deliveryItems.getBillWeight()) < 0){
+				throw  new RuntimeException("当前出库码单重量为:"+stockGoods.getOutVolumn() +"小于发货码单重量,发货码单重量为:" +deliveryItems.getBillWeight());
+			}
+			stockGoods.setOutVolumn(stockGoods.getOutVolumn().subtract(deliveryItems.getBillWeight()));//出库码单重量
+			//stockGoods.setLockingVolumn(stockGoods.getLockingVolumn().add(deliveryItems.getBillWeight()));//锁定码单重量
+			stockGoods.setBalanceVolumn(stockGoods.getBalanceVolumn().add(deliveryItems.getBillWeight()));//结余码单重量
+		}
+		stockGoods.setUpdateTime(new Date());
+		stockGoods.setUpdateUser(SecureUtil.getUserId());
+		R updateStock = stockGoodsClient.updateStock(stockGoods);
+		if (!updateStock.isSuccess()){
+			throw new RuntimeException("更新库存总账失败");
+		}
+	}
+	/**
 	 * 收货单新增库存账
 	 * @param tradeType 单据类型 进口、出口、国内
 	 * @param stockId 库存账id

+ 10 - 1
blade-service/blade-deliver-goods/src/main/java/org/springblade/deliver/goods/service/impl/DeliveryServiceImpl.java

@@ -33,6 +33,7 @@ import org.springblade.deliver.goods.entity.Delivery;
 import org.springblade.deliver.goods.entity.DeliveryFees;
 import org.springblade.deliver.goods.entity.DeliveryFiles;
 import org.springblade.deliver.goods.entity.DeliveryItems;
+import org.springblade.deliver.goods.enums.DeliveryEnum;
 import org.springblade.deliver.goods.mapper.DeliveryItemsMapper;
 import org.springblade.deliver.goods.service.IDeliveryItemsService;
 import org.springblade.deliver.goods.vo.DeliveryVO;
@@ -178,15 +179,23 @@ public class DeliveryServiceImpl extends ServiceImpl<DeliveryMapper, Delivery> i
 			delivery.setCreateUser(SecureUtil.getUserId());
 			delivery.setCreateTime(new Date());
 			delivery.setTenantId(SecureUtil.getTenantId());
+			delivery.setDeliveryStatus("已发货");
 			baseMapper.insert(delivery);
 		}else {
+			Delivery deliverys = baseMapper.selectById(delivery.getId());//查询原始单据
+			if (delivery.getDeliveryType() == DeliveryEnum.DELIVER.getType() && delivery.getDeliveryStatus().equals("已发货")){//发货
+				throw  new RuntimeException("已发货请勿重复发货");
+			}else if (delivery.getDeliveryType() == DeliveryEnum.REPEAL.getType() && !delivery.getDeliveryStatus().equals("已发货"))//撤销发货
+			{
+				throw  new RuntimeException("已撤销发货请勿重复撤销发货");
+			}
 			delivery.setUpdateUser(SecureUtil.getUserId());
 			delivery.setUpdateTime(new Date());
 			baseMapper.updateById(delivery);
 		}
 		//保存发货明细信息
 		if (CollectionUtils.isNotEmpty(delivery.getDeliveryItemsList())){
-			List<DeliveryItems> deliveryItemsList = deliveryItemsService.affirmDeliveryItemsList(delivery.getId(),delivery, delivery.getDeliveryItemsList());
+			List<DeliveryItems> deliveryItemsList = deliveryItemsService.affirmDeliveryItemsList(delivery.getId(),delivery, delivery.getDeliveryItemsList(),delivery.getDeliveryType());
 			delivery.setDeliveryItemsList(deliveryItemsList);
 		}
 		//保存发货费用信息

+ 6 - 0
blade-service/blade-purchase-sales/pom.xml

@@ -55,6 +55,12 @@
             <version>2.8.2.RELEASE</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-deliver-goods-api</artifactId>
+            <version>2.8.2.RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
 </project>

+ 11 - 2
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/feign/OrderItemsClient.java

@@ -3,6 +3,7 @@ package org.springblade.purchase.sales.feign;
 import lombok.AllArgsConstructor;
 import org.springblade.core.tenant.annotation.NonDS;
 import org.springblade.core.tool.api.R;
+import org.springblade.deliver.goods.enums.DeliveryEnum;
 import org.springblade.purchase.sales.entity.OrderItems;
 import org.springblade.purchase.sales.service.IOrderItemsService;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -22,18 +23,26 @@ public class OrderItemsClient implements IOrderItemsClient{
 	 * 修改订单明细发货数量
 	 * @param orderItemsId 订单明细id
 	 * @param actualQuantity 发货数量
+	 * @param deliveryType 操作类型发货 撤销发货
 	 * @return
 	 */
 	@Override
 	@GetMapping(ACTUAL_QUANTITY)
-	public R updateActualQuantity(Long orderItemsId, BigDecimal actualQuantity) {
+	public R updateActualQuantity(Long orderItemsId, BigDecimal actualQuantity,int deliveryType) {
 		OrderItems orderItems = orderItemsService.getById(orderItemsId);
 		if (orderItems == null){
 			throw new RuntimeException("找不到订单明细");
 		}
 		OrderItems items = new OrderItems();
 		items.setId(orderItemsId);
-		items.setActualQuantity(orderItems.getActualQuantity().add(actualQuantity));
+		if (deliveryType == DeliveryEnum.DELIVER.getType()){ //发货
+			items.setActualQuantity(orderItems.getActualQuantity().add(actualQuantity));
+		}else if (deliveryType == DeliveryEnum.REPEAL.getType()){ //撤销发货
+			if (orderItems.getActualQuantity().compareTo(actualQuantity) <0){
+				throw  new RuntimeException("当前可撤销发货数量为"+orderItems.getActualQuantity());
+			}
+			items.setActualQuantity(orderItems.getActualQuantity().subtract(actualQuantity));
+		}
 		return R.data(orderItemsService.updateById(items));
 	}
 }