|
@@ -1,49 +1,48 @@
|
|
|
package com.hys.app.service.erp.impl;
|
|
|
|
|
|
+import cn.hutool.core.bean.BeanUtil;
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
import cn.hutool.core.io.IoUtil;
|
|
|
import cn.hutool.poi.excel.ExcelUtil;
|
|
|
import cn.hutool.poi.excel.ExcelWriter;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import com.hys.app.converter.erp.StockTransferConverter;
|
|
|
import com.hys.app.converter.erp.StockTransferProductConverter;
|
|
|
-import com.hys.app.framework.context.user.AdminUserContext;
|
|
|
import com.hys.app.framework.database.WebPage;
|
|
|
-import com.hys.app.framework.exception.ServiceException;
|
|
|
import com.hys.app.framework.database.mybatisplus.base.BaseServiceImpl;
|
|
|
+import com.hys.app.framework.exception.ServiceException;
|
|
|
import com.hys.app.framework.rabbitmq.MessageSender;
|
|
|
import com.hys.app.framework.rabbitmq.MqMessage;
|
|
|
+import com.hys.app.framework.util.BeanUtils;
|
|
|
import com.hys.app.framework.util.DateUtil;
|
|
|
import com.hys.app.framework.util.PageConvert;
|
|
|
import com.hys.app.mapper.erp.StockTransferMapper;
|
|
|
import com.hys.app.model.base.rabbitmq.AmqpExchange;
|
|
|
+import com.hys.app.model.erp.dos.ProductStockDO;
|
|
|
import com.hys.app.model.erp.dos.StockTransferDO;
|
|
|
import com.hys.app.model.erp.dos.StockTransferProductDO;
|
|
|
-import com.hys.app.model.erp.dos.WarehouseDO;
|
|
|
import com.hys.app.model.erp.dos.WarehouseEntryBatchDO;
|
|
|
import com.hys.app.model.erp.dto.*;
|
|
|
import com.hys.app.model.erp.enums.*;
|
|
|
-import com.hys.app.model.erp.vo.StockTransferAllowable;
|
|
|
-import com.hys.app.model.erp.vo.StockTransferStatistics;
|
|
|
-import com.hys.app.model.erp.vo.StockTransferVO;
|
|
|
+import com.hys.app.model.erp.vo.*;
|
|
|
import com.hys.app.model.system.dos.AdminUser;
|
|
|
-import com.hys.app.model.system.dos.DeptDO;
|
|
|
-import com.hys.app.model.system.dto.DataPermissionDTO;
|
|
|
import com.hys.app.service.erp.*;
|
|
|
import com.hys.app.service.system.AdminUserManager;
|
|
|
import com.hys.app.service.system.DeptManager;
|
|
|
-import com.hys.app.service.system.RoleManager;
|
|
|
-import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import lombok.AllArgsConstructor;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import javax.servlet.ServletOutputStream;
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
import java.io.IOException;
|
|
|
-import java.util.*;
|
|
|
-
|
|
|
-import static com.hys.app.framework.util.CollectionUtils.convertList;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.LinkedHashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* 库存调拨业务层实现
|
|
@@ -52,159 +51,155 @@ import static com.hys.app.framework.util.CollectionUtils.convertList;
|
|
|
* @since 2023-12-12 11:59:06
|
|
|
*/
|
|
|
@Service
|
|
|
+@AllArgsConstructor
|
|
|
public class StockTransferManagerImpl extends BaseServiceImpl<StockTransferMapper, StockTransferDO> implements StockTransferManager {
|
|
|
|
|
|
- @Autowired
|
|
|
private StockTransferConverter converter;
|
|
|
-
|
|
|
- @Autowired
|
|
|
private StockTransferProductConverter itemConverter;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private WarehouseEntryBatchManager warehouseEntryBatchManager;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private WarehouseManager warehouseManager;
|
|
|
-
|
|
|
- @Autowired
|
|
|
private NoGenerateManager noGenerateManager;
|
|
|
-
|
|
|
- @Autowired
|
|
|
private StockTransferProductManager stockTransferProductManager;
|
|
|
-
|
|
|
- @Autowired
|
|
|
private ProductStockManager productStockManager;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private DeptManager deptManager;
|
|
|
-
|
|
|
- @Autowired
|
|
|
private StockTransferMapper stockTransferMapper;
|
|
|
-
|
|
|
- @Autowired
|
|
|
private MessageSender messageSender;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private RoleManager roleManager;
|
|
|
-
|
|
|
- @Autowired
|
|
|
private AdminUserManager adminUserManager;
|
|
|
-
|
|
|
- @Autowired
|
|
|
private WarehouseEntryBatchManager batchManager;
|
|
|
+ private GoodsManager goodsManager;
|
|
|
+ private ProductManager productManager;
|
|
|
|
|
|
@Override
|
|
|
public WebPage<StockTransferVO> list(StockTransferQueryParams queryParams) {
|
|
|
- // 按部门做数据过滤
|
|
|
- DataPermissionDTO dataPermission = roleManager.getDataPermission(AdminUserContext.getAdminUserId());
|
|
|
- if(!dataPermission.getAll()){
|
|
|
- queryParams.setDeptIdList(dataPermission.getDeptIds());
|
|
|
- }
|
|
|
-
|
|
|
WebPage<StockTransferDO> webPage = baseMapper.selectPage(queryParams);
|
|
|
-
|
|
|
- return converter.combination(webPage, dataPermission);
|
|
|
+ return converter.convert(webPage);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public void add(StockTransferDTO stockTransferDTO) {
|
|
|
- // 校验传参
|
|
|
- check(stockTransferDTO);
|
|
|
-
|
|
|
- // 保存调拨单
|
|
|
- StockTransferDO transferDO = converter.combination(stockTransferDTO);
|
|
|
- transferDO.setSn(noGenerateManager.generate(NoBusinessTypeEnum.StockTransfer, transferDO.getOutDeptId()));
|
|
|
- transferDO.setStatus(StockTransferStatusEnum.NotSubmit);
|
|
|
- save(transferDO);
|
|
|
-
|
|
|
- // 保存调拨单明细
|
|
|
- List<StockTransferProductDO> productList = itemConverter.combination(stockTransferDTO.getProductList(), stockTransferDTO.getBatchMap(), transferDO.getId());
|
|
|
- stockTransferProductManager.saveBatch(productList);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- @Transactional(rollbackFor = Exception.class)
|
|
|
- public void edit(StockTransferDTO stockTransferDTO) {
|
|
|
- StockTransferDO oldDO = getById(stockTransferDTO.getId());
|
|
|
- if (!new StockTransferAllowable(oldDO).getEdit()) {
|
|
|
- throw new ServiceException("当前状态不允许编辑");
|
|
|
+ stockTransferDTO.isSameWarehouse();
|
|
|
+
|
|
|
+ List<Long> collect = stockTransferDTO.getProductList().stream().map(StockTransferProductDTO::getProductId).collect(Collectors.toList());
|
|
|
+ //需要调出的仓库商品库存
|
|
|
+ List<ProductStockDO> listOut = productStockManager.list(new LambdaQueryWrapper<ProductStockDO>()
|
|
|
+ .eq(ProductStockDO::getWarehouseId, stockTransferDTO.getOutWarehouseId())
|
|
|
+ .in(ProductStockDO::getProductId, collect));
|
|
|
+ List<ProductStockDO> listIn = productStockManager.list(new LambdaQueryWrapper<ProductStockDO>()
|
|
|
+ .eq(ProductStockDO::getWarehouseId, stockTransferDTO.getInWarehouseId())
|
|
|
+ .in(ProductStockDO::getProductId, collect));
|
|
|
+
|
|
|
+ for (ProductStockDO aDoOut : listOut) {
|
|
|
+ Integer num = stockTransferDTO.getProductList().stream().filter(item -> item.getProductId().equals(aDoOut.getProductId())).findFirst().get().getNum();
|
|
|
+ if (aDoOut.getUsableStock() < num) {
|
|
|
+ throw new ServiceException(num + "的库存数量少于调拨出的库存数量");
|
|
|
+ }
|
|
|
+ //扣减调拨仓库的库存数量
|
|
|
+ aDoOut.setUsableStock(aDoOut.getUsableStock() - num);
|
|
|
+ aDoOut.setActualStock(aDoOut.getActualStock() - num);
|
|
|
+ //增加调入仓库的库存数量
|
|
|
+ for (ProductStockDO aDo : listIn) {
|
|
|
+ if (aDo.getProductId().equals(aDoOut.getProductId())) {
|
|
|
+ aDo.setUsableStock(aDo.getUsableStock() + num);
|
|
|
+ aDo.setActualStock(aDo.getActualStock() + num);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
-
|
|
|
- // 校验传参
|
|
|
- check(stockTransferDTO);
|
|
|
-
|
|
|
+ listOut.addAll(listIn);
|
|
|
+ productStockManager.updateBatchById(listOut);
|
|
|
// 保存调拨单
|
|
|
- StockTransferDO transferDO = converter.combination(stockTransferDTO);
|
|
|
- updateById(transferDO);
|
|
|
-
|
|
|
+ StockTransferDO aDo = BeanUtil.copyProperties(stockTransferDTO, StockTransferDO.class);
|
|
|
+ aDo.setSn(noGenerateManager.generate(NoBusinessTypeEnum.StockTransfer, 78L));
|
|
|
+ save(aDo);
|
|
|
// 保存调拨单明细
|
|
|
- List<StockTransferProductDO> productList = itemConverter.combination(stockTransferDTO.getProductList(), stockTransferDTO.getBatchMap(), transferDO.getId());
|
|
|
- stockTransferProductManager.deleteByStockTransferId(Collections.singletonList(stockTransferDTO.getId()));
|
|
|
- stockTransferProductManager.saveBatch(productList);
|
|
|
+ List<StockTransferProductDO> doList = BeanUtils.toBean(stockTransferDTO.getProductList(), StockTransferProductDO.class);
|
|
|
+ doList.forEach(item -> item.setStockTransferId(aDo.getId()));
|
|
|
+ stockTransferProductManager.saveBatch(doList);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public StockTransferVO getDetail(String id) {
|
|
|
+ public StockTransferVO getDetail(Long id) {
|
|
|
StockTransferVO stockTransferVO = converter.convert(getById(id));
|
|
|
List<StockTransferProductDO> productList = stockTransferProductManager.listByStockTransferId(id);
|
|
|
- stockTransferVO.setProductList(itemConverter.convert(productList));
|
|
|
+ List<StockTransferProductVO> convert = itemConverter.convert(productList);
|
|
|
+ convert.forEach(item -> {
|
|
|
+ ProductVO productVO = BeanUtil.copyProperties(productManager.getById(item.getProductId()), ProductVO.class);
|
|
|
+ item.setProductVO(productVO);
|
|
|
+ item.setGoodsVO(BeanUtil.copyProperties(goodsManager.getById(productVO.getGoodsId()), GoodsVO.class));
|
|
|
+ });
|
|
|
+ stockTransferVO.setProductList(convert);
|
|
|
return stockTransferVO;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
- public void delete(List<String> ids) {
|
|
|
- List<StockTransferDO> stockTransferList = listByIds(ids);
|
|
|
- for (StockTransferDO stockTransferDO : stockTransferList) {
|
|
|
- if (!new StockTransferAllowable(stockTransferDO).getDelete()) {
|
|
|
- throw new ServiceException(stockTransferDO.getSn() + "不能进行删除操作");
|
|
|
+ public void withdraw(Long id) {
|
|
|
+ StockTransferDO transferDO = getById(id);
|
|
|
+ if (TransferTypeEnum.ROLLBACK_HANDLE.equals(transferDO.getStatus())){
|
|
|
+ throw new ServiceException("该数据已经回滚,请勿重复操作");
|
|
|
+ }
|
|
|
+ transferDO.setStatus(TransferTypeEnum.ROLLBACK_HANDLE);
|
|
|
+ updateById(transferDO);
|
|
|
+ //库存回滚
|
|
|
+ List<StockTransferProductDO> productList = stockTransferProductManager.listByStockTransferId(id);
|
|
|
+ List<Long> collect = productList.stream().map(StockTransferProductDO::getProductId).collect(Collectors.toList());
|
|
|
+ //需要调出的仓库商品库存
|
|
|
+ List<ProductStockDO> listOut = productStockManager.list(new LambdaQueryWrapper<ProductStockDO>()
|
|
|
+ .eq(ProductStockDO::getWarehouseId, transferDO.getOutWarehouseId())
|
|
|
+ .in(ProductStockDO::getProductId, collect));
|
|
|
+ List<ProductStockDO> listIn = productStockManager.list(new LambdaQueryWrapper<ProductStockDO>()
|
|
|
+ .eq(ProductStockDO::getWarehouseId, transferDO.getInWarehouseId())
|
|
|
+ .in(ProductStockDO::getProductId, collect));
|
|
|
+
|
|
|
+ for (ProductStockDO aDo : listIn) {
|
|
|
+ Integer num = productList.stream().filter(item -> item.getProductId().equals(aDo.getProductId())).findFirst().get().getNum();
|
|
|
+ if (aDo.getUsableStock() < num) {
|
|
|
+ throw new ServiceException(num + "的库存数量少于调拨出的库存数量,不足以支持回滚数量");
|
|
|
+ }
|
|
|
+ //扣减调拨仓库的库存数量
|
|
|
+ aDo.setUsableStock(aDo.getUsableStock() + num);
|
|
|
+ aDo.setActualStock(aDo.getActualStock() + num);
|
|
|
+ for (ProductStockDO stockDO : listOut) {
|
|
|
+ stockDO.setUsableStock(stockDO.getUsableStock() + num);
|
|
|
+ stockDO.setActualStock(stockDO.getActualStock() + num);
|
|
|
}
|
|
|
}
|
|
|
- removeBatchByIds(ids);
|
|
|
- stockTransferProductManager.deleteByStockTransferId(ids);
|
|
|
+ listOut.addAll(listIn);
|
|
|
+ productStockManager.updateBatchById(listOut);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
@Override
|
|
|
- public void submit(String id) {
|
|
|
- // 校验
|
|
|
- StockTransferDO oldDO = getById(id);
|
|
|
- if (!new StockTransferAllowable(oldDO).getSubmit()) {
|
|
|
- throw new ServiceException("当前状态不允许提交");
|
|
|
- }
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void edit(StockTransferDTO stockTransferDTO) {
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void delete(List<Long> ids) {
|
|
|
|
|
|
- lambdaUpdate()
|
|
|
- .set(StockTransferDO::getStatus, StockTransferStatusEnum.Submit)
|
|
|
- .eq(StockTransferDO::getId, id)
|
|
|
- .update();
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void withdraw(Long id) {
|
|
|
+ public void submit(Long id) {
|
|
|
// 校验
|
|
|
StockTransferDO oldDO = getById(id);
|
|
|
- if (!new StockTransferAllowable(oldDO).getWithdraw()) {
|
|
|
- throw new ServiceException("当前状态不允许撤销");
|
|
|
- }
|
|
|
+
|
|
|
|
|
|
lambdaUpdate()
|
|
|
- .set(StockTransferDO::getStatus, StockTransferStatusEnum.NotSubmit)
|
|
|
+ .set(StockTransferDO::getStatus, StockTransferStatusEnum.Submit)
|
|
|
.eq(StockTransferDO::getId, id)
|
|
|
.update();
|
|
|
}
|
|
|
|
|
|
+
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public void confirm(List<String> ids, Long handleById) {
|
|
|
List<StockTransferDO> stockTransferList = listByIds(ids);
|
|
|
for (StockTransferDO stockTransferDO : stockTransferList) {
|
|
|
- if (!new StockTransferAllowable(stockTransferDO).getConfirm()) {
|
|
|
- throw new ServiceException(stockTransferDO.getSn() + "不能进行确认操作");
|
|
|
- }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
AdminUser adminUser = adminUserManager.getModel(handleById);
|
|
|
- if(adminUser == null){
|
|
|
+ if (adminUser == null) {
|
|
|
throw new ServiceException("经手人不存在");
|
|
|
}
|
|
|
|
|
@@ -239,13 +234,11 @@ public class StockTransferManagerImpl extends BaseServiceImpl<StockTransferMappe
|
|
|
public void reject(List<String> ids, Long handleById) {
|
|
|
List<StockTransferDO> stockTransferList = listByIds(ids);
|
|
|
for (StockTransferDO stockTransferDO : stockTransferList) {
|
|
|
- if (!new StockTransferAllowable(stockTransferDO).getConfirm()) {
|
|
|
- throw new ServiceException(stockTransferDO.getSn() + "不能进行退回操作");
|
|
|
- }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
AdminUser adminUser = adminUserManager.getModel(handleById);
|
|
|
- if(adminUser == null){
|
|
|
+ if (adminUser == null) {
|
|
|
throw new ServiceException("经手人不存在");
|
|
|
}
|
|
|
|
|
@@ -258,65 +251,6 @@ public class StockTransferManagerImpl extends BaseServiceImpl<StockTransferMappe
|
|
|
.update();
|
|
|
}
|
|
|
|
|
|
- private void check(StockTransferDTO stockTransferDTO) {
|
|
|
- DeptDO outDeptDO = deptManager.getById(stockTransferDTO.getOutDeptId());
|
|
|
- if (outDeptDO == null) {
|
|
|
- throw new ServiceException("调出方部门不存在");
|
|
|
- }
|
|
|
-
|
|
|
- DeptDO inDeptDO = deptManager.getById(stockTransferDTO.getInDeptId());
|
|
|
- if (inDeptDO == null) {
|
|
|
- throw new ServiceException("调入方部门不存在");
|
|
|
- }
|
|
|
-
|
|
|
- WarehouseDO outWarehouseDO = warehouseManager.getById(stockTransferDTO.getOutWarehouseId());
|
|
|
-// if (!outWarehouseDO.getDeptId().equals(stockTransferDTO.getOutDeptId())) {
|
|
|
-// throw new ServiceException("调出方部门不存在该仓库");
|
|
|
-// }
|
|
|
- WarehouseDO inWarehouseDO = warehouseManager.getById(stockTransferDTO.getInWarehouseId());
|
|
|
-// if (!inWarehouseDO.getDeptId().equals(stockTransferDTO.getInDeptId())) {
|
|
|
-// throw new ServiceException("调入方部门不存在该仓库");
|
|
|
-// }
|
|
|
-
|
|
|
- AdminUser outHandledBy = adminUserManager.getModel(stockTransferDTO.getOutHandledById());
|
|
|
- if (outHandledBy == null) {
|
|
|
- throw new ServiceException("调出方经手人不存在");
|
|
|
- }
|
|
|
- AdminUser inHandledBy = null;
|
|
|
- if(stockTransferDTO.getInHandledById() != null){
|
|
|
- inHandledBy = adminUserManager.getModel(stockTransferDTO.getInHandledById());
|
|
|
- if (inHandledBy == null) {
|
|
|
- throw new ServiceException("调入方经手人不存在");
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- // 校验入库批次
|
|
|
- List<Long> batchIds = convertList(stockTransferDTO.getProductList(), StockTransferProductDTO::getWarehouseEntryBatchId);
|
|
|
- Map<Long, WarehouseEntryBatchDO> batchMap = warehouseEntryBatchManager.listAndConvertMap(batchIds, WarehouseEntryBatchDO::getId);
|
|
|
- for (StockTransferProductDTO transferProductDTO : stockTransferDTO.getProductList()) {
|
|
|
- WarehouseEntryBatchDO batchDO = batchMap.get(transferProductDTO.getWarehouseEntryBatchId());
|
|
|
- if (batchDO == null) {
|
|
|
- throw new ServiceException("批次:" + transferProductDTO.getWarehouseEntryBatchId() + "不存在");
|
|
|
- }
|
|
|
- if (!batchDO.getWarehouseId().equals(stockTransferDTO.getOutWarehouseId())) {
|
|
|
- throw new ServiceException("批次:" + batchDO.getSn() + "和调出方仓库不一致");
|
|
|
- }
|
|
|
- if (batchDO.getRemainNum() < transferProductDTO.getNum()) {
|
|
|
- throw new ServiceException("批次:" + batchDO.getSn() + "库存不足");
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 填充批次数据
|
|
|
- stockTransferDTO.setBatchMap(batchMap);
|
|
|
- stockTransferDTO.setOutDeptDO(outDeptDO);
|
|
|
- stockTransferDTO.setInDeptDO(inDeptDO);
|
|
|
- stockTransferDTO.setOutWarehouseDO(outWarehouseDO);
|
|
|
- stockTransferDTO.setInWarehouseDO(inWarehouseDO);
|
|
|
- stockTransferDTO.setOutHandleBy(outHandledBy);
|
|
|
- stockTransferDTO.setInHandleBy(inHandledBy);
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* 查询库存调拨统计分页列表数据
|
|
|
*
|