Преглед изворни кода

库存总账新增修改库存账

lazhaoqian пре 4 година
родитељ
комит
841a571bc4

+ 18 - 3
blade-service-api/blade-stock-api/src/main/java/org/springblade/stock/feign/IStockGoodsClient.java

@@ -18,10 +18,11 @@ import java.util.List;
 )
 public interface IStockGoodsClient {
 	String API_PREFIX = "/client";
-	String SELECT_STOKE = API_PREFIX + "select-stock";
-	String SAVE_STOCK = API_PREFIX + "save-stock" ;
+	String SELECT_STOKE = API_PREFIX + "/select-stock";
+	String SAVE_STOCK = API_PREFIX + "/save-stock" ;
 	String GET_STOCK = API_PREFIX + "/get_stock";
 	String UPDATE_STOCK = API_PREFIX + "/updateStock";
+	String GET_STOCK_BY_ID = API_PREFIX + "/getStockByID";
 
 	/**
 	 * 查询库存总账 是否存在
@@ -30,6 +31,9 @@ public interface IStockGoodsClient {
 	 * @param goodId 商品id
 	 * @param itemType 产品规格型号
 	 * @param lotNo 批次号
+	 * @param cntrNo 箱号
+	 * @param billNo 提单号
+	 * @param contractNumber 合同号
 	 * @return
 	 */
 	@GetMapping(SELECT_STOKE)
@@ -37,7 +41,10 @@ public interface IStockGoodsClient {
 								@RequestParam("storageId")Long storageId,
 								@RequestParam("goodId")Long goodId,
 								@RequestParam("itemType")String itemType,
-								@RequestParam("lotNo")String lotNo);
+								@RequestParam("lotNo")String lotNo,
+								@RequestParam("cntrNo")String cntrNo,
+								@RequestParam("billNo")String billNo,
+								@RequestParam("contractNumber")String contractNumber);
 
 	/**
 	 * 新增库存总账
@@ -61,4 +68,12 @@ public interface IStockGoodsClient {
 	 */
 	@PostMapping(UPDATE_STOCK)
 	R updateStock(@RequestBody StockGoods stockGoods);
+
+	/**
+	 * 根据库存账id获取库存id
+	 * @param id
+	 * @return
+	 */
+	@GetMapping(GET_STOCK_BY_ID)
+	R<StockGoods> getStockById(@RequestParam("id") Long id);
 }

+ 6 - 0
blade-service/blade-deliver-goods/pom.xml

@@ -48,6 +48,12 @@
             <groupId>org.springblade</groupId>
             <artifactId>blade-starter-transaction</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-stock-api</artifactId>
+            <version>2.8.2.RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
 </project>

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

@@ -133,7 +133,9 @@ public class DeliveryController extends BladeController {
 	@ApiOperationSupport(order = 4)
 	@ApiOperation(value = "新增", notes = "传入delivery")
 	public R save(@Valid @RequestBody Delivery delivery) {
-		return R.status(deliveryService.save(delivery));
+		delivery.setBillType(OrderTypeEnum.SHIP.getType());
+		delivery.setTradeType(OrderTypeEnum.DOMESTIC.getType());
+		return deliveryService.submit(delivery);
 	}
 
 	/**

+ 6 - 0
blade-service/blade-deliver-goods/src/main/java/org/springblade/deliver/goods/service/IDeliveryService.java

@@ -52,5 +52,11 @@ public interface IDeliveryService extends IService<Delivery> {
 	 * @return
 	 */
 	Delivery getDeliveryMessage(Delivery delivery);
+	/**
+	 * 提交发货明细
+	 * @param delivery
+	 * @return
+	 */
+	R submit(Delivery delivery);
 
 }

+ 187 - 1
blade-service/blade-deliver-goods/src/main/java/org/springblade/deliver/goods/service/impl/DeliveryItemsServiceImpl.java

@@ -19,6 +19,8 @@ package org.springblade.deliver.goods.service.impl;
 import com.alibaba.druid.sql.ast.expr.SQLCaseExpr;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.trade.purchase.order.enums.OrderTypeEnum;
 import lombok.AllArgsConstructor;
 import org.springblade.client.entity.GoodsDesc;
 import org.springblade.client.feign.IGoodsDescClient;
@@ -31,9 +33,13 @@ import org.springblade.deliver.goods.vo.DeliveryItemsVO;
 import org.springblade.deliver.goods.mapper.DeliveryItemsMapper;
 import org.springblade.deliver.goods.service.IDeliveryItemsService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.stock.entity.StockGoods;
+import org.springblade.stock.feign.IStockGoodsClient;
+import org.springblade.stock.vo.StockGoodsVO;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 
@@ -48,13 +54,14 @@ import java.util.List;
 public class DeliveryItemsServiceImpl extends ServiceImpl<DeliveryItemsMapper, DeliveryItems> implements IDeliveryItemsService {
 
 	private IGoodsDescClient goodsDescClient;//获取商品信息
+	private IStockGoodsClient stockGoodsClient;//查询库存账对外访问接口
 	@Override
 	public IPage<DeliveryItemsVO> selectDeliveryItemsPage(IPage<DeliveryItemsVO> page, DeliveryItemsVO deliveryItems) {
 		return page.setRecords(baseMapper.selectDeliveryItemsPage(page, deliveryItems));
 	}
 
 	/**
-	 * 保存发货费用信息
+	 * 保存发货信息
 	 * @param pId
 	 * @param deliveryItemsList
 	 * @return
@@ -101,4 +108,183 @@ public class DeliveryItemsServiceImpl extends ServiceImpl<DeliveryItemsMapper, D
 		return deliveryItemsList;
 	}
 
+	/**
+	 * 提交发货信息
+	 * @param pId
+	 * @param deliveryItemsList
+	 * @return
+	 */
+	public List<DeliveryItems> affirmDeliveryItemsList(Long pId,Delivery delivery,List<DeliveryItems> deliveryItemsList){
+		for (DeliveryItems deliveryItems : deliveryItemsList) {
+			deliveryItems.setPid(pId);//父级ID
+			deliveryItems.setTenantId(SecureUtil.getTenantId());//租户id
+			if (deliveryItems.getId() == null){
+				deliveryItems.setCreateUser(SecureUtil.getUserId());
+				deliveryItems.setCreateTime(new Date());
+				baseMapper.insert(deliveryItems);
+			}else {
+				deliveryItems.setUpdateTime(new Date());
+				deliveryItems.setUpdateUser(SecureUtil.getUserId());
+				baseMapper.updateById(deliveryItems);
+			}
+			StockGoodsVO stock = this.getStock(delivery.getTradeType(), delivery.getCorpId(), delivery.getStorageId(), deliveryItems);
+			if (stock != null){
+				//更新库存账
+				this.deliverGoods(delivery.getTradeType(),stock.getId(),deliveryItems);
+			}else {
+				//新增库存账
+				this.saveStock(delivery.getTradeType(),delivery.getCorpId(),delivery.getStorageId(),deliveryItems);
+			}
+		}
+		return deliveryItemsList;
+	}
+	/**
+	 * 查询库存账
+	 * @param tradeType 单据类型 进口、出口、国内
+	 * @param corpId 销售公司/客户/工厂
+	 * @param storageId 仓库id
+	 * @param deliveryItems 明细信息
+	 */
+	public StockGoodsVO getStock(String tradeType,Long corpId,Long storageId,DeliveryItems deliveryItems){
+		String itemType = deliveryItems.getSpecificationAndModel();//产品型号
+		String lotNo = deliveryItems.getContractNumber();//批次号
+		String cntrNo = null;//箱号
+		String billNo = null;//提单号
+		String contractNumber = null;//合同号
+		//国内贸易和出口贸易查询同一个库存账接口,进口查询另一个接口需要合同号、提单号、箱号
+		if (tradeType.equals(OrderTypeEnum.IMPORT.getType())){
+			cntrNo = deliveryItems.getCntrNo();//箱号
+			billNo = deliveryItems.getBillNo();//提单号
+			contractNumber = deliveryItems.getContractNumber();//合同号
+		}
+		R<StockGoodsVO> goodsVOR = stockGoodsClient.selectStock(corpId, storageId, deliveryItems.getItemId(), itemType, lotNo, cntrNo, billNo, contractNumber);
+		if (goodsVOR.isSuccess()){
+			return goodsVOR.getData();
+		}
+		return null;
+	}
+
+	/**
+	 * 发货减少库存账
+	 * @param tradeType 单据类型 进口、出口、国内
+	 * @param stockId 库存账id
+	 * @param deliveryItems 货物明细信息
+	 */
+	public void deliverGoods(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.getBalanceQuantity().compareTo(deliveryItems.getActualQuantity()) < 0){
+			throw  new RuntimeException("当前结余数量为:"+stockGoods.getBalanceQuantity() +"小于出库数量,出库数量为:" +deliveryItems.getActualQuantity());
+		}
+		stockGoods.setOutQuantity(stockGoods.getOutQuantity().add( deliveryItems.getActualQuantity()));//出库数量
+		stockGoods.setLockingQuantity(new BigDecimal(0.00));//锁定数量
+		stockGoods.setBalanceQuantity(stockGoods.getBalanceQuantity().subtract(deliveryItems.getActualQuantity()));//结余数量
+		stockGoods.setEnRouteQuantity(stockGoods.getEnRouteQuantity().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());
+			}
+			stockGoods.setOutWeight(stockGoods.getOutWeight().add(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());
+			}
+			stockGoods.setOutVolumn(stockGoods.getOutVolumn().add(deliveryItems.getBillWeight()));//出库码单重量
+			stockGoods.setLockingVolumn(stockGoods.getLockingVolumn().subtract(deliveryItems.getBillWeight()));//锁定码单重量
+			stockGoods.setBalanceVolumn(stockGoods.getBalanceVolumn().subtract(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
+	 * @param deliveryItems 货物明细信息
+	 */
+	public void receiving(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();
+		stockGoods.setInQuantity(stockGoods.getInQuantity().add(deliveryItems.getActualQuantity()));//入库数量
+		stockGoods.setLockingQuantity(stockGoods.getLockingQuantity().add(deliveryItems.getActualQuantity()));//锁定数量
+		stockGoods.setBalanceQuantity(stockGoods.getBalanceQuantity().add(deliveryItems.getActualQuantity()));//结余数量
+		stockGoods.setEnRouteQuantity(stockGoods.getEnRouteQuantity().add(deliveryItems.getActualQuantity()));//在途数量
+		stockGoods.setSurplusRouteQuantity(stockGoods.getSurplusRouteQuantity().add(deliveryItems.getActualQuantity()));//可用数量
+		if (tradeType.equals(OrderTypeEnum.IMPORT.getType())){
+			stockGoods.setInWeight(stockGoods.getInWeight().add(deliveryItems.getInvoiceWeight()));//入库发票重量
+			stockGoods.setLockingWeight(stockGoods.getLockingWeight().add(deliveryItems.getInvoiceWeight()));//锁定发票重量
+			stockGoods.setBalanceWeight(stockGoods.getBalanceWeight().add(deliveryItems.getInvoiceWeight()));//结余发票重量
+			stockGoods.setInVolumn(stockGoods.getInVolumn().add(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 corpId 销售公司/客户/工厂
+	 * @param storageId 仓库id
+	 * @param deliveryItems 明细信息
+	 */
+	public void saveStock(String tradeType,Long corpId,Long storageId,DeliveryItems deliveryItems){
+		StockGoods stockGoods = new StockGoods();
+		stockGoods.setCorpId(corpId);//客户
+		stockGoods.setStorageId(storageId);//仓库id
+		stockGoods.setGoodsId(deliveryItems.getItemId());//商品id
+		stockGoods.setInDate(new Date());//入库日期
+		stockGoods.setInQuantity(deliveryItems.getActualQuantity());//入库数量
+		stockGoods.setOutQuantity(new BigDecimal(0.00));//出库数量
+		stockGoods.setLockingQuantity(new BigDecimal(0.00));//锁定数量
+		stockGoods.setBalanceQuantity(deliveryItems.getActualQuantity());//结余数量
+		stockGoods.setEnRouteQuantity(deliveryItems.getActualQuantity());//在途数量
+		stockGoods.setSurplusRouteQuantity(deliveryItems.getActualQuantity());//可用数量
+		if (tradeType.equals(OrderTypeEnum.IMPORT.getType())){
+			stockGoods.setInWeight(deliveryItems.getInvoiceWeight());//入库发票重量
+			stockGoods.setOutWeight(new BigDecimal(0.00));//出库发票重量
+			stockGoods.setLockingWeight(deliveryItems.getInvoiceWeight());//锁定发票重量
+			stockGoods.setBalanceWeight(deliveryItems.getInvoiceWeight());//结余发票重量
+			stockGoods.setInVolumn(deliveryItems.getBillWeight());//入库码单重量
+			stockGoods.setOutVolumn(new BigDecimal(0.00));//出库码单重量
+			stockGoods.setLockingVolumn(deliveryItems.getBillWeight());//锁定码单重量
+			stockGoods.setBalanceVolumn(deliveryItems.getBillWeight());//结余码单重量
+		}
+		stockGoods.setCreateUser(SecureUtil.getUserId());
+		stockGoods.setTenantId(SecureUtil.getTenantId());
+		stockGoods.setCreateTime(new Date());
+		R saveStock = stockGoodsClient.saveStock(stockGoods);
+		if (!saveStock.isSuccess()){
+			log.error(saveStock.getMsg());
+			throw  new RuntimeException("保存库存总账出错");
+		}
+	}
 }

+ 37 - 0
blade-service/blade-deliver-goods/src/main/java/org/springblade/deliver/goods/service/impl/DeliveryServiceImpl.java

@@ -155,4 +155,41 @@ public class DeliveryServiceImpl extends ServiceImpl<DeliveryMapper, Delivery> i
 		return selectById;
 	}
 
+	@Override
+	public R submit(Delivery delivery) {
+		if (delivery.getId() == null){
+			R billNo = serialClient.getBillNo(delivery.getBillType());
+			if (billNo.isSuccess() && billNo.getData() != null){
+				delivery.setSysNo((String) billNo.getData());
+			}else {
+				return R.fail(500,"系统编号生成失败");
+			}
+			delivery.setCreateUser(SecureUtil.getUserId());
+			delivery.setCreateTime(new Date());
+			delivery.setTenantId(SecureUtil.getTenantId());
+			baseMapper.insert(delivery);
+		}else {
+			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());
+			delivery.setDeliveryItemsList(deliveryItemsList);
+		}
+		//保存发货费用信息
+		if (CollectionUtils.isNotEmpty(delivery.getDeliveryFeesList())){
+			List<DeliveryFees> deliveryFeesList = deliveryFeesService.saveDeliveryFeesList(delivery.getId(), delivery.getDeliveryFeesList());
+			delivery.setDeliveryFeesList(deliveryFeesList);
+		}
+		//保存发货附件信息
+		if (CollectionUtils.isNotEmpty(delivery.getDeliveryFilesList())){
+			List<DeliveryFiles> deliveryFilesList = deliveryFilesService.saveDeliveryFilesList(delivery.getId(), delivery.getDeliveryFilesList());
+			delivery.setDeliveryFilesList(deliveryFilesList);
+		}
+		return R.data(delivery);
+	}
+
+
 }

+ 15 - 2
blade-service/blade-stock/src/main/java/org/springblade/stock/feign/StockGoodsClient.java

@@ -34,12 +34,15 @@ public class StockGoodsClient implements IStockGoodsClient{
 	 * @param goodId 商品id
 	 * @param itemType 产品规格型号
 	 * @param lotNo 批次号
+	 * @param cntrNo 箱号
+	 * @param billNo 提单号
+	 * @param contractNumber 合同号
 	 * @return
 	 */
 	@Override
 	@GetMapping(SELECT_STOKE)
-	public R<StockGoodsVO> selectStock(Long corpId, Long storageId, Long goodId, String itemType, String lotNo) {
-		return R.data(stockGoodsService.selectStock(corpId,storageId,goodId,itemType,lotNo));
+	public R<StockGoodsVO> selectStock(Long corpId, Long storageId, Long goodId, String itemType, String lotNo,String cntrNo,String billNo,String contractNumber) {
+		return R.data(stockGoodsService.selectStock(corpId,storageId,goodId,itemType,lotNo,cntrNo,billNo,contractNumber));
 	}
 
 	/**
@@ -76,4 +79,14 @@ public class StockGoodsClient implements IStockGoodsClient{
 	public R updateStock(StockGoods stockGoods) {
 		return R.data(stockGoodsService.updateMessage(stockGoods));
 	}
+
+	/**
+	 * 根据库存账id获取库存信息
+	 * @param id
+	 * @return
+	 */
+	@Override
+	public R<StockGoods> getStockById(Long id) {
+		return R.data(stockGoodsService.getById(id));
+	}
 }

+ 4 - 1
blade-service/blade-stock/src/main/java/org/springblade/stock/service/IStockGoodsService.java

@@ -50,9 +50,12 @@ public interface IStockGoodsService extends IService<StockGoods> {
 	 * @param goodId 商品id
 	 * @param itemType 产品规格型号
 	 * @param lotNo 批次号
+	 * @param cntrNo 箱号
+	 * @param billNo 提单号
+	 * @param contractNumber 合同号
 	 * @return
 	 */
-	StockGoodsVO selectStock(Long corpId,Long storageId,Long goodId,String itemType,String lotNo);
+	StockGoodsVO selectStock(Long corpId,Long storageId,Long goodId,String itemType,String lotNo,String cntrNo,String billNo,String contractNumber);
 	/**
 	 * 新增库存总账
 	 */

+ 4 - 1
blade-service/blade-stock/src/main/java/org/springblade/stock/service/impl/StockGoodsServiceImpl.java

@@ -70,10 +70,13 @@ public class StockGoodsServiceImpl extends ServiceImpl<StockGoodsMapper, StockGo
 	 * @param goodId 商品id
 	 * @param itemType 产品规格型号
 	 * @param lotNo 批次号
+	 * @param cntrNo 箱号
+	 * @param billNo 提单号
+	 * @param contractNumber 合同号
 	 * @return
 	 */
 	@Override
-	public StockGoodsVO selectStock(Long corpId,Long storageId,Long goodId,String itemType,String lotNo) {
+	public StockGoodsVO selectStock(Long corpId,Long storageId,Long goodId,String itemType,String lotNo,String cntrNo,String billNo,String contractNumber) {
 		LambdaQueryWrapper<StockGoods> lambdaQueryWrapper = new LambdaQueryWrapper();
 		lambdaQueryWrapper.eq(Func.isNotEmpty(corpId),StockGoods::getCorpId,corpId);//客户id
 		lambdaQueryWrapper.eq(Func.isNotEmpty(storageId),StockGoods::getStorageId,storageId);//仓库id