|
|
@@ -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("保存库存总账出错");
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|