|
|
|
@ -7,7 +7,7 @@ import cn.iocoder.yudao.framework.common.util.number.MoneyUtils;
|
|
|
|
import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
|
|
|
|
import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
|
|
|
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
|
|
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
|
|
|
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
|
|
|
|
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
|
|
|
|
import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductRespVO;
|
|
|
|
import cn.iocoder.yudao.module.erp.controller.admin.autocode.util.AutoCodeUtil;
|
|
|
|
import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.check.ErpStockCheckAuditReqVO;
|
|
|
|
import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.check.ErpStockCheckAuditReqVO;
|
|
|
|
import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.check.ErpStockCheckGenerateByLocationReqVO;
|
|
|
|
import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.check.ErpStockCheckGenerateByLocationReqVO;
|
|
|
|
import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.check.ErpStockCheckGenerateByProductReqVO;
|
|
|
|
import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.check.ErpStockCheckGenerateByProductReqVO;
|
|
|
|
@ -37,6 +37,9 @@ import cn.iocoder.yudao.module.erp.service.warehousearea.WarehouseAreaService;
|
|
|
|
import cn.iocoder.yudao.module.system.api.permission.PermissionApi;
|
|
|
|
import cn.iocoder.yudao.module.system.api.permission.PermissionApi;
|
|
|
|
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
|
|
|
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
|
|
|
import cn.iocoder.yudao.module.system.enums.permission.RoleCodeEnum;
|
|
|
|
import cn.iocoder.yudao.module.system.enums.permission.RoleCodeEnum;
|
|
|
|
|
|
|
|
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
|
|
|
|
|
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
import org.springframework.validation.annotation.Validated;
|
|
|
|
import org.springframework.validation.annotation.Validated;
|
|
|
|
@ -56,23 +59,7 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.
|
|
|
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
|
|
|
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
|
|
|
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.diffList;
|
|
|
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.diffList;
|
|
|
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.getSumValue;
|
|
|
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.getSumValue;
|
|
|
|
import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.STOCK_CHECK_APPROVE_FAIL;
|
|
|
|
import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.*;
|
|
|
|
import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.STOCK_CHECK_AUDIT_FAIL_RESULT;
|
|
|
|
|
|
|
|
import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.STOCK_CHECK_AUDIT_FAIL_STATUS;
|
|
|
|
|
|
|
|
import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.STOCK_CHECK_AUDIT_FAIL_USER;
|
|
|
|
|
|
|
|
import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.STOCK_CHECK_DELETE_FAIL_APPROVE;
|
|
|
|
|
|
|
|
import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.STOCK_CHECK_DELETE_FAIL_PROCESS;
|
|
|
|
|
|
|
|
import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.STOCK_CHECK_NOT_EXISTS;
|
|
|
|
|
|
|
|
import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.STOCK_CHECK_NO_EXISTS;
|
|
|
|
|
|
|
|
import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.STOCK_CHECK_SOURCE_TYPE_NOT_EXISTS;
|
|
|
|
|
|
|
|
import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.STOCK_CHECK_PROCESS_FAIL;
|
|
|
|
|
|
|
|
import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.STOCK_CHECK_SUBMIT_FAIL_AUDIT_USER_EMPTY;
|
|
|
|
|
|
|
|
import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.STOCK_CHECK_SUBMIT_FAIL_STATUS;
|
|
|
|
|
|
|
|
import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.STOCK_CHECK_SUBMIT_FAIL_USER;
|
|
|
|
|
|
|
|
import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.STOCK_CHECK_UPDATE_FAIL_APPROVE;
|
|
|
|
|
|
|
|
import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.STOCK_CHECK_UPDATE_FAIL_PROCESS;
|
|
|
|
|
|
|
|
import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.WAREHOUSE_AREA_NOT_EXISTS;
|
|
|
|
|
|
|
|
import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.WAREHOUSE_LOCATION_WAREHOUSE_AREA_NOT_MATCH;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Service
|
|
|
|
@Service
|
|
|
|
@Validated
|
|
|
|
@Validated
|
|
|
|
@ -100,19 +87,34 @@ public class ErpStockCheckServiceImpl implements ErpStockCheckService {
|
|
|
|
private AdminUserApi adminUserApi;
|
|
|
|
private AdminUserApi adminUserApi;
|
|
|
|
@Resource
|
|
|
|
@Resource
|
|
|
|
private PermissionApi permissionApi;
|
|
|
|
private PermissionApi permissionApi;
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
|
|
|
private AutoCodeUtil autoCodeUtil;
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
|
public Long createStockCheck(ErpStockCheckSaveReqVO createReqVO) {
|
|
|
|
public Long createStockCheck(ErpStockCheckSaveReqVO createReqVO) {
|
|
|
|
|
|
|
|
String code = createReqVO.getCode();
|
|
|
|
|
|
|
|
|
|
|
|
validateSourceType(createReqVO.getSourceType());
|
|
|
|
validateSourceType(createReqVO.getSourceType());
|
|
|
|
List<ErpStockCheckItemDO> stockCheckItems = validateStockCheckItems(createReqVO.getItems());
|
|
|
|
List<ErpStockCheckItemDO> stockCheckItems = validateStockCheckItems(createReqVO.getItems());
|
|
|
|
String no = noRedisDAO.generate(ErpNoRedisDAO.STOCK_CHECK_NO_PREFIX);
|
|
|
|
// String no = noRedisDAO.generate(ErpNoRedisDAO.STOCK_CHECK_NO_PREFIX);
|
|
|
|
if (stockCheckMapper.selectByNo(no) != null) {
|
|
|
|
// if (stockCheckMapper.selectByNo(no) != null) {
|
|
|
|
throw exception(STOCK_CHECK_NO_EXISTS);
|
|
|
|
// throw exception(STOCK_CHECK_NO_EXISTS);
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
boolean autoGeneratedCode = StringUtils.isBlank(code);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (autoGeneratedCode) {
|
|
|
|
|
|
|
|
code = autoCodeUtil.genSerialCode("INVENTORY_EXECUTION_CODE", null);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
if (stockCheckMapper.selectOne(Wrappers.<ErpStockCheckDO>lambdaQuery()
|
|
|
|
|
|
|
|
.eq(ErpStockCheckDO::getNo, code)) != null) {
|
|
|
|
|
|
|
|
throw exception(STOCK_CODE_EXISTS);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
String finalCode = code;
|
|
|
|
|
|
|
|
|
|
|
|
ErpStockCheckDO stockCheck = BeanUtils.toBean(createReqVO, ErpStockCheckDO.class, in -> in
|
|
|
|
ErpStockCheckDO stockCheck = BeanUtils.toBean(createReqVO, ErpStockCheckDO.class, in -> in
|
|
|
|
.setNo(no)
|
|
|
|
.setNo(finalCode)
|
|
|
|
.setStatus(ErpAuditStatus.DRAFT.getStatus())
|
|
|
|
.setStatus(ErpAuditStatus.DRAFT.getStatus())
|
|
|
|
.setTotalCount(getSumValue(stockCheckItems, ErpStockCheckItemDO::getCount, BigDecimal::add, BigDecimal.ZERO))
|
|
|
|
.setTotalCount(getSumValue(stockCheckItems, ErpStockCheckItemDO::getCount, BigDecimal::add, BigDecimal.ZERO))
|
|
|
|
.setTotalPrice(getSumValue(stockCheckItems, ErpStockCheckItemDO::getTotalPrice, BigDecimal::add, BigDecimal.ZERO)));
|
|
|
|
.setTotalPrice(getSumValue(stockCheckItems, ErpStockCheckItemDO::getTotalPrice, BigDecimal::add, BigDecimal.ZERO)));
|
|
|
|
@ -292,10 +294,9 @@ public class ErpStockCheckServiceImpl implements ErpStockCheckService {
|
|
|
|
if (reqVO == null || !reqVO.validSelection()) {
|
|
|
|
if (reqVO == null || !reqVO.validSelection()) {
|
|
|
|
return Collections.emptyList();
|
|
|
|
return Collections.emptyList();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
List<ErpStockDO> stockList = stockMapper.selectListByWarehouseIdsAndAreaIds(reqVO.getWarehouseIds(), reqVO.getAreaIds());
|
|
|
|
boolean nonZeroOnly = Boolean.FALSE.equals(reqVO.getAllowEmpty());
|
|
|
|
if (Boolean.FALSE.equals(reqVO.getAllowEmpty())) {
|
|
|
|
List<ErpStockDO> stockList = stockMapper.selectListByWarehouseIdsAndAreaIds(
|
|
|
|
stockList = filterNonZeroStocks(stockList);
|
|
|
|
reqVO.getWarehouseIds(), reqVO.getAreaIds(), nonZeroOnly);
|
|
|
|
}
|
|
|
|
|
|
|
|
return buildPreviewItems(stockList);
|
|
|
|
return buildPreviewItems(stockList);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ -304,10 +305,8 @@ public class ErpStockCheckServiceImpl implements ErpStockCheckService {
|
|
|
|
if (reqVO == null || CollUtil.isEmpty(reqVO.getProductIds())) {
|
|
|
|
if (reqVO == null || CollUtil.isEmpty(reqVO.getProductIds())) {
|
|
|
|
return Collections.emptyList();
|
|
|
|
return Collections.emptyList();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
List<ErpStockDO> stockList = stockMapper.selectListByProductIds(reqVO.getProductIds());
|
|
|
|
boolean nonZeroOnly = Boolean.FALSE.equals(reqVO.getAllowEmpty());
|
|
|
|
if (Boolean.FALSE.equals(reqVO.getAllowEmpty())) {
|
|
|
|
List<ErpStockDO> stockList = stockMapper.selectListByProductIds(reqVO.getProductIds(), nonZeroOnly);
|
|
|
|
stockList = filterNonZeroStocks(stockList);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return buildPreviewItems(stockList);
|
|
|
|
return buildPreviewItems(stockList);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ -328,7 +327,8 @@ public class ErpStockCheckServiceImpl implements ErpStockCheckService {
|
|
|
|
if (CollUtil.isEmpty(stockList)) {
|
|
|
|
if (CollUtil.isEmpty(stockList)) {
|
|
|
|
return Collections.emptyList();
|
|
|
|
return Collections.emptyList();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Map<Long, ErpProductDO> productMap = productService.getProductMap(convertSet(stockList, ErpStockDO::getProductId));
|
|
|
|
Collection<Long> productIds = convertSet(stockList, ErpStockDO::getProductId);
|
|
|
|
|
|
|
|
Map<Long, ErpProductDO> productMap = productService.getProductMap(productIds);
|
|
|
|
Map<Long, ErpWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(convertSet(stockList, ErpStockDO::getWarehouseId));
|
|
|
|
Map<Long, ErpWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(convertSet(stockList, ErpStockDO::getWarehouseId));
|
|
|
|
Map<Long, WarehouseAreaDO> areaMap = warehouseAreaService.getWarehouseAreaMap(convertSet(stockList, ErpStockDO::getAreaId));
|
|
|
|
Map<Long, WarehouseAreaDO> areaMap = warehouseAreaService.getWarehouseAreaMap(convertSet(stockList, ErpStockDO::getAreaId));
|
|
|
|
List<ErpStockCheckRespVO.Item> result = new ArrayList<>();
|
|
|
|
List<ErpStockCheckRespVO.Item> result = new ArrayList<>();
|
|
|
|
@ -339,7 +339,7 @@ public class ErpStockCheckServiceImpl implements ErpStockCheckService {
|
|
|
|
item.setAreaName(stock.getAreaName());
|
|
|
|
item.setAreaName(stock.getAreaName());
|
|
|
|
item.setProductId(stock.getProductId());
|
|
|
|
item.setProductId(stock.getProductId());
|
|
|
|
item.setStockCount(stock.getCount() != null ? stock.getCount() : BigDecimal.ZERO);
|
|
|
|
item.setStockCount(stock.getCount() != null ? stock.getCount() : BigDecimal.ZERO);
|
|
|
|
item.setActualCount(stock.getCount() != null ? stock.getCount() : BigDecimal.ZERO);
|
|
|
|
item.setActualCount(null);
|
|
|
|
item.setCount(BigDecimal.ZERO);
|
|
|
|
item.setCount(BigDecimal.ZERO);
|
|
|
|
MapUtils.findAndThen(warehouseMap, stock.getWarehouseId(), warehouse -> item.setWarehouseName(warehouse.getName()));
|
|
|
|
MapUtils.findAndThen(warehouseMap, stock.getWarehouseId(), warehouse -> item.setWarehouseName(warehouse.getName()));
|
|
|
|
if (item.getAreaName() == null) {
|
|
|
|
if (item.getAreaName() == null) {
|
|
|
|
@ -347,13 +347,10 @@ public class ErpStockCheckServiceImpl implements ErpStockCheckService {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ErpProductDO productDO = productMap.get(stock.getProductId());
|
|
|
|
ErpProductDO productDO = productMap.get(stock.getProductId());
|
|
|
|
item.setProductPrice(resolveProductPrice(productDO));
|
|
|
|
item.setProductPrice(resolveProductPrice(productDO));
|
|
|
|
|
|
|
|
item.setProductUnitName(stock.getUnitName());
|
|
|
|
if (productDO != null) {
|
|
|
|
if (productDO != null) {
|
|
|
|
item.setProductName(productDO.getName());
|
|
|
|
item.setProductName(productDO.getName());
|
|
|
|
item.setProductBarCode(productDO.getBarCode());
|
|
|
|
item.setProductBarCode(productDO.getBarCode());
|
|
|
|
ErpProductRespVO productVO = productService.getProduct(productDO.getId());
|
|
|
|
|
|
|
|
if (productVO != null) {
|
|
|
|
|
|
|
|
item.setProductUnitName(productVO.getUnitName());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
result.add(item);
|
|
|
|
result.add(item);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -434,8 +431,8 @@ public class ErpStockCheckServiceImpl implements ErpStockCheckService {
|
|
|
|
ErpProductDO productDO = productMap.get(item.getProductId());
|
|
|
|
ErpProductDO productDO = productMap.get(item.getProductId());
|
|
|
|
WarehouseAreaDO area = item.getAreaId() != null ? areaMap.get(item.getAreaId()) : null;
|
|
|
|
WarehouseAreaDO area = item.getAreaId() != null ? areaMap.get(item.getAreaId()) : null;
|
|
|
|
BigDecimal stockCount = item.getStockCount() != null ? item.getStockCount() : BigDecimal.ZERO;
|
|
|
|
BigDecimal stockCount = item.getStockCount() != null ? item.getStockCount() : BigDecimal.ZERO;
|
|
|
|
BigDecimal actualCount = item.getActualCount() != null ? item.getActualCount() : BigDecimal.ZERO;
|
|
|
|
BigDecimal actualCount = item.getActualCount();
|
|
|
|
BigDecimal count = actualCount.subtract(stockCount);
|
|
|
|
BigDecimal count = actualCount != null ? actualCount.subtract(stockCount) : null;
|
|
|
|
BigDecimal productPrice = item.getProductPrice() != null ? item.getProductPrice() : resolveProductPrice(productDO);
|
|
|
|
BigDecimal productPrice = item.getProductPrice() != null ? item.getProductPrice() : resolveProductPrice(productDO);
|
|
|
|
return ErpStockCheckItemDO.builder()
|
|
|
|
return ErpStockCheckItemDO.builder()
|
|
|
|
.id(item.getId())
|
|
|
|
.id(item.getId())
|
|
|
|
@ -448,7 +445,7 @@ public class ErpStockCheckServiceImpl implements ErpStockCheckService {
|
|
|
|
.stockCount(stockCount)
|
|
|
|
.stockCount(stockCount)
|
|
|
|
.actualCount(actualCount)
|
|
|
|
.actualCount(actualCount)
|
|
|
|
.count(count)
|
|
|
|
.count(count)
|
|
|
|
.totalPrice(MoneyUtils.priceMultiply(productPrice, count))
|
|
|
|
.totalPrice(count != null ? MoneyUtils.priceMultiply(productPrice, count) : null)
|
|
|
|
.remark(item.getRemark())
|
|
|
|
.remark(item.getRemark())
|
|
|
|
.build();
|
|
|
|
.build();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|