fix:取消产品单位必填限制

main
HuangHuiKang 1 day ago
parent eec264a453
commit 4eeaf5204d

@ -32,8 +32,7 @@ public class ProductSaveReqVO {
@NotNull(message = "产品分类编号不能为空") @NotNull(message = "产品分类编号不能为空")
private Long categoryId; private Long categoryId;
@Schema(description = "单位编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "8869") @Schema(description = "单位编号", example = "8869")
@NotNull(message = "单位编号不能为空")
private Long unitId; private Long unitId;
@Schema(description = "采购单位编号", example = "8890") @Schema(description = "采购单位编号", example = "8890")

@ -354,7 +354,7 @@ public class ErpProductServiceImpl implements ErpProductService {
} }
private void validateProductUnitRelation(Long unitId, Long purchaseUnitId, BigDecimal purchaseUnitConvertQuantity) { private void validateProductUnitRelation(Long unitId, Long purchaseUnitId, BigDecimal purchaseUnitConvertQuantity) {
if (unitId == null || productUnitService.getProductUnit(unitId) == null) { if (unitId != null && productUnitService.getProductUnit(unitId) == null) {
throw exception(PRODUCT_UNIT_NOT_EXISTS); throw exception(PRODUCT_UNIT_NOT_EXISTS);
} }
if (purchaseUnitId == null) { if (purchaseUnitId == null) {

@ -24,9 +24,7 @@ import cn.iocoder.yudao.module.erp.dal.mysql.stock.ErpStockMoveMapper;
import cn.iocoder.yudao.module.erp.dal.redis.no.ErpNoRedisDAO; import cn.iocoder.yudao.module.erp.dal.redis.no.ErpNoRedisDAO;
import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus; import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus;
import cn.iocoder.yudao.module.erp.enums.stock.ErpStockMoveApproveActionEnum; import cn.iocoder.yudao.module.erp.enums.stock.ErpStockMoveApproveActionEnum;
import cn.iocoder.yudao.module.erp.enums.stock.ErpStockRecordBizTypeEnum;
import cn.iocoder.yudao.module.erp.service.product.ErpProductService; import cn.iocoder.yudao.module.erp.service.product.ErpProductService;
import cn.iocoder.yudao.module.erp.service.stock.bo.ErpStockRecordCreateReqBO;
import cn.iocoder.yudao.module.erp.service.warehousearea.WarehouseAreaService; import cn.iocoder.yudao.module.erp.service.warehousearea.WarehouseAreaService;
import cn.iocoder.yudao.module.infra.api.config.ConfigApi; import cn.iocoder.yudao.module.infra.api.config.ConfigApi;
import cn.iocoder.yudao.module.system.api.permission.PermissionApi; import cn.iocoder.yudao.module.system.api.permission.PermissionApi;
@ -79,7 +77,7 @@ public class ErpStockMoveServiceImpl implements ErpStockMoveService {
@Resource @Resource
private ErpWarehouseService warehouseService; private ErpWarehouseService warehouseService;
@Resource @Resource
private ErpStockRecordService stockRecordService; private ErpStockService stockService;
@Resource @Resource
private WarehouseAreaService warehouseAreaService; private WarehouseAreaService warehouseAreaService;
@Resource @Resource
@ -163,7 +161,7 @@ public class ErpStockMoveServiceImpl implements ErpStockMoveService {
throw exception(approve ? STOCK_MOVE_APPROVE_FAIL : STOCK_MOVE_PROCESS_FAIL); throw exception(approve ? STOCK_MOVE_APPROVE_FAIL : STOCK_MOVE_PROCESS_FAIL);
} }
List<ErpStockMoveItemDO> stockMoveItems = stockMoveItemMapper.selectListByMoveId(id); List<ErpStockMoveItemDO> stockMoveItems = stockMoveItemMapper.selectListByMoveId(id);
operateStockMoveEffect(stockMove, stockMoveItems, approve); operateStockMoveEffect(stockMoveItems, approve);
} }
@Override @Override
@ -208,7 +206,7 @@ public class ErpStockMoveServiceImpl implements ErpStockMoveService {
throw exception(STOCK_MOVE_AUDIT_FAIL_STATUS); throw exception(STOCK_MOVE_AUDIT_FAIL_STATUS);
} }
List<ErpStockMoveItemDO> stockMoveItems = stockMoveItemMapper.selectListByMoveId(stockMove.getId()); List<ErpStockMoveItemDO> stockMoveItems = stockMoveItemMapper.selectListByMoveId(stockMove.getId());
operateStockMoveEffect(stockMove, stockMoveItems, true); operateStockMoveEffect(stockMoveItems, true);
createApproveRecord(stockMove.getId(), ErpStockMoveApproveActionEnum.AUTO_APPROVE, fromStatus, createApproveRecord(stockMove.getId(), ErpStockMoveApproveActionEnum.AUTO_APPROVE, fromStatus,
ErpAuditStatus.APPROVE.getStatus(), NumberUtils.parseLong(stockMove.getCreator()), ErpAuditStatus.APPROVE.getStatus(), NumberUtils.parseLong(stockMove.getCreator()),
auditReqVO.getRemark() != null ? auditReqVO.getRemark() : "无需审核,审核时自动调拨"); auditReqVO.getRemark() != null ? auditReqVO.getRemark() : "无需审核,审核时自动调拨");
@ -230,31 +228,22 @@ public class ErpStockMoveServiceImpl implements ErpStockMoveService {
} }
List<ErpStockMoveItemDO> stockMoveItems = stockMoveItemMapper.selectListByMoveId(stockMove.getId()); List<ErpStockMoveItemDO> stockMoveItems = stockMoveItemMapper.selectListByMoveId(stockMove.getId());
if (ErpAuditStatus.APPROVE.getStatus().equals(auditReqVO.getStatus())) { if (ErpAuditStatus.APPROVE.getStatus().equals(auditReqVO.getStatus())) {
operateStockMoveEffect(stockMove, stockMoveItems, true); operateStockMoveEffect(stockMoveItems, true);
} }
createApproveRecord(stockMove.getId(), ErpAuditStatus.APPROVE.getStatus().equals(auditReqVO.getStatus()) createApproveRecord(stockMove.getId(), ErpAuditStatus.APPROVE.getStatus().equals(auditReqVO.getStatus())
? ErpStockMoveApproveActionEnum.APPROVE : ErpStockMoveApproveActionEnum.REJECT, ? ErpStockMoveApproveActionEnum.APPROVE : ErpStockMoveApproveActionEnum.REJECT,
fromStatus, auditReqVO.getStatus(), NumberUtils.parseLong(stockMove.getCreator()), auditReqVO.getRemark()); fromStatus, auditReqVO.getStatus(), NumberUtils.parseLong(stockMove.getCreator()), auditReqVO.getRemark());
} }
private void operateStockMoveEffect(ErpStockMoveDO stockMove, List<ErpStockMoveItemDO> stockMoveItems, boolean approve) { private void operateStockMoveEffect(List<ErpStockMoveItemDO> stockMoveItems, boolean approve) {
Integer fromBizType = approve ? ErpStockRecordBizTypeEnum.MOVE_OUT.getType()
: ErpStockRecordBizTypeEnum.MOVE_OUT_CANCEL.getType();
Integer toBizType = approve ? ErpStockRecordBizTypeEnum.MOVE_IN.getType()
: ErpStockRecordBizTypeEnum.MOVE_IN_CANCEL.getType();
stockMoveItems.forEach(stockMoveItem -> { stockMoveItems.forEach(stockMoveItem -> {
BigDecimal fromCount = approve ? stockMoveItem.getCount().negate() : stockMoveItem.getCount(); BigDecimal fromCount = approve ? stockMoveItem.getCount().negate() : stockMoveItem.getCount();
BigDecimal toCount = approve ? stockMoveItem.getCount() : stockMoveItem.getCount().negate(); BigDecimal toCount = approve ? stockMoveItem.getCount() : stockMoveItem.getCount().negate();
ErpProductRespVO productDO = productService.getProduct(stockMoveItem.getProductId()); ErpProductRespVO productDO = productService.getProduct(stockMoveItem.getProductId());
stockService.updateStockCountIncrement(productDO.getCategoryId(), stockMoveItem.getProductId(),
stockRecordService.createStockRecord(new ErpStockRecordCreateReqBO( stockMoveItem.getFromWarehouseId(), stockMoveItem.getFromAreaId(), stockMoveItem.getFromAreaName(), fromCount);
stockMoveItem.getProductId(), productDO.getCategoryId(), productDO.getCategoryType(), stockService.updateStockCountIncrement(productDO.getCategoryId(), stockMoveItem.getProductId(),
stockMoveItem.getFromWarehouseId(), stockMoveItem.getFromAreaId(), stockMoveItem.getFromAreaName(), fromCount, stockMoveItem.getToWarehouseId(), stockMoveItem.getToAreaId(), stockMoveItem.getToAreaName(), toCount);
fromBizType, stockMoveItem.getMoveId(), stockMoveItem.getId(), stockMove.getNo(),stockMove.getMoveTime()));
stockRecordService.createStockRecord(new ErpStockRecordCreateReqBO(
stockMoveItem.getProductId(), productDO.getCategoryId(), productDO.getCategoryType(),
stockMoveItem.getToWarehouseId(), stockMoveItem.getToAreaId(), stockMoveItem.getToAreaName(), toCount,
toBizType, stockMoveItem.getMoveId(), stockMoveItem.getId(), stockMove.getNo(),stockMove.getMoveTime()));
}); });
} }

@ -158,7 +158,7 @@ public class ErpStockServiceImpl implements ErpStockService {
stock.setAreaName(areaName); stock.setAreaName(areaName);
stockMapper.updateById(new ErpStockDO().setId(stock.getId()).setAreaName(areaName)); stockMapper.updateById(new ErpStockDO().setId(stock.getId()).setAreaName(areaName));
} }
if (product != null && isStockSnapshotMissing(stock)) { if (product != null && isStockSnapshotMissing(stock, product, defaultPackagingScheme)) {
fillStockSnapshot(stock, product, defaultPackagingScheme); fillStockSnapshot(stock, product, defaultPackagingScheme);
stockMapper.updateById(buildStockSnapshotUpdate(stock)); stockMapper.updateById(buildStockSnapshotUpdate(stock));
} }
@ -299,7 +299,7 @@ public class ErpStockServiceImpl implements ErpStockService {
String unitName = resolveStockUnitName(stockList, productMap); String unitName = resolveStockUnitName(stockList, productMap);
card.setSkuCount(countDistinctProduct(stockList)); card.setSkuCount(countDistinctProduct(stockList));
card.setTotalCount(totalCount); card.setTotalCount(totalCount);
card.setUnitName(unitName); card.setUnitName(nullToEmpty(unitName));
card.setStockDisplay(formatNumber(totalCount) + nullToEmpty(unitName)); card.setStockDisplay(formatNumber(totalCount) + nullToEmpty(unitName));
card.setPackagingStocks(buildStockPackagingStocks(stockList, productMap)); card.setPackagingStocks(buildStockPackagingStocks(stockList, productMap));
card.setTodayFinishedInDisplay(formatNumber(BigDecimal.ZERO) + nullToEmpty(unitName)); card.setTodayFinishedInDisplay(formatNumber(BigDecimal.ZERO) + nullToEmpty(unitName));
@ -313,7 +313,7 @@ public class ErpStockServiceImpl implements ErpStockService {
String unitName = resolveInItemUnitName(itemList, productMap); String unitName = resolveInItemUnitName(itemList, productMap);
card.setSkuCount(itemList.stream().map(ErpStockInItemDO::getProductId).distinct().count()); card.setSkuCount(itemList.stream().map(ErpStockInItemDO::getProductId).distinct().count());
card.setTotalCount(totalCount); card.setTotalCount(totalCount);
card.setUnitName(unitName); card.setUnitName(nullToEmpty(unitName));
card.setStockDisplay(formatNumber(totalCount) + nullToEmpty(unitName)); card.setStockDisplay(formatNumber(totalCount) + nullToEmpty(unitName));
card.setPackagingStocks(buildInItemPackagingStocks(itemList, productMap)); card.setPackagingStocks(buildInItemPackagingStocks(itemList, productMap));
return card; return card;
@ -326,14 +326,14 @@ public class ErpStockServiceImpl implements ErpStockService {
String unitName = resolveOutItemUnitName(itemList, productMap); String unitName = resolveOutItemUnitName(itemList, productMap);
card.setSkuCount(itemList.stream().map(ErpStockOutItemDO::getProductId).distinct().count()); card.setSkuCount(itemList.stream().map(ErpStockOutItemDO::getProductId).distinct().count());
card.setTotalCount(totalCount); card.setTotalCount(totalCount);
card.setUnitName(unitName); card.setUnitName(nullToEmpty(unitName));
card.setStockDisplay(formatNumber(totalCount) + nullToEmpty(unitName)); card.setStockDisplay(formatNumber(totalCount) + nullToEmpty(unitName));
card.setPackagingStocks(buildOutItemPackagingStocks(itemList, productMap)); card.setPackagingStocks(buildOutItemPackagingStocks(itemList, productMap));
return card; return card;
} }
private String buildUnitKey(Long unitId, String unitName) { private String buildUnitKey(Long unitId, String unitName) {
return String.valueOf(unitId) + "_" + String.valueOf(unitName); return String.valueOf(unitId != null ? unitId : "") + "_" + nullToEmpty(unitName);
} }
private ErpStockStatisticsRespVO.UnitGroupedStockCard buildInItemUnitGroupedStockCard(List<ErpStockInItemDO> itemList, private ErpStockStatisticsRespVO.UnitGroupedStockCard buildInItemUnitGroupedStockCard(List<ErpStockInItemDO> itemList,
@ -387,7 +387,7 @@ public class ErpStockServiceImpl implements ErpStockService {
private ErpStockStatisticsRespVO.UnitStock buildUnitStock(Long unitId, String unitName, BigDecimal count) { private ErpStockStatisticsRespVO.UnitStock buildUnitStock(Long unitId, String unitName, BigDecimal count) {
ErpStockStatisticsRespVO.UnitStock unitStock = new ErpStockStatisticsRespVO.UnitStock(); ErpStockStatisticsRespVO.UnitStock unitStock = new ErpStockStatisticsRespVO.UnitStock();
unitStock.setUnitId(unitId); unitStock.setUnitId(unitId);
unitStock.setUnitName(unitName); unitStock.setUnitName(nullToEmpty(unitName));
unitStock.setCount(count); unitStock.setCount(count);
unitStock.setStockDisplay(formatNumber(count) + nullToEmpty(unitName)); unitStock.setStockDisplay(formatNumber(count) + nullToEmpty(unitName));
return unitStock; return unitStock;
@ -511,7 +511,7 @@ public class ErpStockServiceImpl implements ErpStockService {
detail.setPackagingSchemeId(packagingSchemeId); detail.setPackagingSchemeId(packagingSchemeId);
detail.setPackagingSchemeName(packagingSchemeName); detail.setPackagingSchemeName(packagingSchemeName);
detail.setTotalCount(totalCount); detail.setTotalCount(totalCount);
detail.setUnitName(unitName); detail.setUnitName(nullToEmpty(unitName));
detail.setStockDisplay(formatNumber(totalCount) + nullToEmpty(unitName)); detail.setStockDisplay(formatNumber(totalCount) + nullToEmpty(unitName));
detail.setPackagingDisplay(formatProductQuantity(calculateProductQuantity(totalCount, palletTotalQuantity, packageQuantity))); detail.setPackagingDisplay(formatProductQuantity(calculateProductQuantity(totalCount, palletTotalQuantity, packageQuantity)));
detail.setPackageQuantity(packageQuantity); detail.setPackageQuantity(packageQuantity);
@ -639,10 +639,10 @@ public class ErpStockServiceImpl implements ErpStockService {
if (!keepZero) { if (!keepZero) {
return; return;
} }
display.append("0").append(unitName); display.append("0").append(nullToEmpty(unitName));
return; return;
} }
display.append(formatNumber(quantity)).append(unitName); display.append(formatNumber(quantity)).append(nullToEmpty(unitName));
} }
private BigDecimal defaultZero(BigDecimal value) { private BigDecimal defaultZero(BigDecimal value) {
@ -686,17 +686,18 @@ public class ErpStockServiceImpl implements ErpStockService {
.orElse(null); .orElse(null);
} }
private boolean isStockSnapshotMissing(ErpStockDO stock) { private boolean isStockSnapshotMissing(ErpStockDO stock, ErpProductRespVO product,
return stock.getUnitId() == null ProductPackagingSchemeRespVO defaultPackagingScheme) {
|| stock.getUnitName() == null return (product.getUnitId() != null && stock.getUnitId() == null)
|| stock.getPurchaseUnitId() == null || (product.getUnitName() != null && stock.getUnitName() == null)
|| stock.getPurchaseUnitName() == null || (product.getPurchaseUnitId() != null && stock.getPurchaseUnitId() == null)
|| stock.getPurchaseUnitConvertQuantity() == null || (product.getPurchaseUnitName() != null && stock.getPurchaseUnitName() == null)
|| stock.getDefaultPackagingSchemeId() == null || (product.getPurchaseUnitConvertQuantity() != null && stock.getPurchaseUnitConvertQuantity() == null)
|| stock.getDefaultPackagingSchemeName() == null || (defaultPackagingScheme != null && stock.getDefaultPackagingSchemeId() == null)
|| stock.getPackageQuantity() == null || (defaultPackagingScheme != null && stock.getDefaultPackagingSchemeName() == null)
|| stock.getPalletPackageQuantity() == null || (defaultPackagingScheme != null && stock.getPackageQuantity() == null)
|| stock.getPalletTotalQuantity() == null; || (defaultPackagingScheme != null && stock.getPalletPackageQuantity() == null)
|| (defaultPackagingScheme != null && stock.getPalletTotalQuantity() == null);
} }
private ErpStockDO buildStockSnapshotUpdate(ErpStockDO stock) { private ErpStockDO buildStockSnapshotUpdate(ErpStockDO stock) {

@ -240,7 +240,7 @@ public class ErpWarehouseSummaryServiceImpl implements ErpWarehouseSummaryServic
BigDecimal safeCount = safeCount(count); BigDecimal safeCount = safeCount(count);
if (purchaseUnitConvertQuantity == null || purchaseUnitConvertQuantity.compareTo(BigDecimal.ZERO) <= 0 if (purchaseUnitConvertQuantity == null || purchaseUnitConvertQuantity.compareTo(BigDecimal.ZERO) <= 0
|| purchaseUnitName == null || unitName == null) { || purchaseUnitName == null || unitName == null) {
return formatNumber(safeCount) + (unitName != null ? unitName : "个"); return formatNumber(safeCount) + nullToEmpty(unitName);
} }
BigDecimal purchaseCount = safeCount.divideToIntegralValue(purchaseUnitConvertQuantity); BigDecimal purchaseCount = safeCount.divideToIntegralValue(purchaseUnitConvertQuantity);
BigDecimal unitCount = safeCount.remainder(purchaseUnitConvertQuantity); BigDecimal unitCount = safeCount.remainder(purchaseUnitConvertQuantity);
@ -254,6 +254,10 @@ public class ErpWarehouseSummaryServiceImpl implements ErpWarehouseSummaryServic
return display.toString(); return display.toString();
} }
private String nullToEmpty(String value) {
return value != null ? value : "";
}
private String formatNumber(BigDecimal value) { private String formatNumber(BigDecimal value) {
return value == null ? "0" : value.stripTrailingZeros().toPlainString(); return value == null ? "0" : value.stripTrailingZeros().toPlainString();
} }

Loading…
Cancel
Save