diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/BomMaterialDTO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/BomMaterialDTO.java index f4a066c9..2e737819 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/BomMaterialDTO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/BomMaterialDTO.java @@ -5,7 +5,6 @@ import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.experimental.Accessors; -import org.ttzero.excel.annotation.ExcelColumn; import java.math.BigDecimal; import java.util.List; @@ -76,4 +75,9 @@ public class BomMaterialDTO { */ @NotEmpty private List children; + + /** + * 物料单位 + */ + private String materialUnit; } diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/MaterialCodeItemAddQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/MaterialCodeItemAddQO.java index a37acc48..bde62beb 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/MaterialCodeItemAddQO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/MaterialCodeItemAddQO.java @@ -33,12 +33,6 @@ public class MaterialCodeItemAddQO { @NotNull private BigDecimal num; - /** - * 实发数量 - */ - @NotNull - private BigDecimal actualNum; - /** * 单位 */ @@ -62,15 +56,4 @@ public class MaterialCodeItemAddQO { */ @NotBlank private String productionOrderNumber; - - /** - * 箱号 - */ - @NotBlank - private String boxNo; - - /** - * 最小包装量 - */ - private BigDecimal minPackagingNum; } diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/MaterialCodeItemUpdateQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/MaterialCodeItemUpdateQO.java index 9f46a6eb..279eb3c3 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/MaterialCodeItemUpdateQO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/MaterialCodeItemUpdateQO.java @@ -24,12 +24,6 @@ public class MaterialCodeItemUpdateQO { @NotNull private BigDecimal num; - /** - * 实发数量 - */ - @NotNull - private BigDecimal actualNum; - /** * 单位 */ @@ -54,14 +48,4 @@ public class MaterialCodeItemUpdateQO { @NotBlank private String productionOrderNumber; - /** - * 箱号 - */ - @NotBlank - private String boxNo; - - /** - * 最小包装量 - */ - private BigDecimal minPackagingNum; } diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/ShipmentPackingMaterialInfoQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/ShipmentPackingMaterialInfoQO.java new file mode 100644 index 00000000..637d4b46 --- /dev/null +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/ShipmentPackingMaterialInfoQO.java @@ -0,0 +1,15 @@ +package com.nflg.wms.common.pojo.qo; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class ShipmentPackingMaterialInfoQO { + @NotNull + private Long materialQRId; + + @NotNull + private BigDecimal actualNum; +} diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/ShipmentPackingQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/ShipmentPackingQO.java index f1b98b8d..b3bff3cf 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/ShipmentPackingQO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/ShipmentPackingQO.java @@ -19,5 +19,5 @@ public class ShipmentPackingQO { * 物料二维码ID列表 */ @NotEmpty - private List materialQRIds; + private List materialInfos; } diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/ShipmentUnPackingMaterialInfoQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/ShipmentUnPackingMaterialInfoQO.java new file mode 100644 index 00000000..2419fa0c --- /dev/null +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/ShipmentUnPackingMaterialInfoQO.java @@ -0,0 +1,15 @@ +package com.nflg.wms.common.pojo.qo; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class ShipmentUnPackingMaterialInfoQO { + @NotNull + private Long materialQRId; + + @NotNull + private BigDecimal actualNum; +} diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/ShipmentUnpackingQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/ShipmentUnpackingQO.java index 9fe8a0ef..60e1f603 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/ShipmentUnpackingQO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/ShipmentUnpackingQO.java @@ -15,9 +15,9 @@ public class ShipmentUnpackingQO { private Long packagingCodeId; /** - * 要添加的物料二维码ID列表 + * 要添加的物料信息列表 */ - private List materialQRIdsForAdd; + private List materialInfosForAdd; // /** // * 要删除的物料二维码ID列表 diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/ShipmentMaterialCodeItemVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/ShipmentMaterialCodeItemVO.java index 7f82121a..ce9454b0 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/ShipmentMaterialCodeItemVO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/ShipmentMaterialCodeItemVO.java @@ -55,11 +55,6 @@ public class ShipmentMaterialCodeItemVO { */ private String boxNo; - /** - * 最小包装量 - */ - private BigDecimal minPackagingNum; - /** * 状态,0:未装箱;1:已装箱;5:已安装 */ diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/ShipmentMaterialCodeQRVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/ShipmentMaterialCodeQRVO.java index e3c1ff97..862eb69b 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/ShipmentMaterialCodeQRVO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/ShipmentMaterialCodeQRVO.java @@ -11,6 +11,8 @@ public class ShipmentMaterialCodeQRVO { private Long id; + private Long itemId; + /** * 序号 */ @@ -90,4 +92,9 @@ public class ShipmentMaterialCodeQRVO { */ private String orderDate; + /** + * 剩余数量 + */ + private BigDecimal leftNum; + } diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsShipmentMaterialCodeItem.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsShipmentMaterialCodeItem.java index 33bc2dba..52e72de4 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsShipmentMaterialCodeItem.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsShipmentMaterialCodeItem.java @@ -12,6 +12,7 @@ import lombok.experimental.Accessors; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; +import java.util.Objects; /** *

@@ -79,26 +80,11 @@ public class WmsShipmentMaterialCodeItem implements Serializable { */ private String boxNo; - /** - * 最小包装量 - */ - private BigDecimal minPackagingNum; - /** * 状态,0:未装箱;1:装箱中;2:已装箱; */ private Integer status; - /** - * 打包箱数量 - */ - private Integer packingNum; - - /** - * 剩余打包箱数量 - */ - private Integer packingLeft; - /** * 创建人 */ @@ -123,6 +109,18 @@ public class WmsShipmentMaterialCodeItem implements Serializable { private String key; public String getKey() { - return this.materialNo + "|" + this.productionOrderNumber + "|" + this.boxNo; + return this.materialNo + "|" + this.productionOrderNumber + "|" + this.parentMaterialDescribe; + } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + WmsShipmentMaterialCodeItem that = (WmsShipmentMaterialCodeItem) o; + return Objects.equals(materialCodeId, that.materialCodeId) && Objects.equals(materialNo, that.materialNo) && Objects.equals(parentMaterialDescribe, that.parentMaterialDescribe) && Objects.equals(productionOrderNumber, that.productionOrderNumber); + } + + @Override + public int hashCode() { + return Objects.hash(materialCodeId, materialNo, parentMaterialDescribe, productionOrderNumber); } } diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/WmsShipmentMaterialCodeItemMapper.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/WmsShipmentMaterialCodeItemMapper.java index 9ff1427e..f790cbd7 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/WmsShipmentMaterialCodeItemMapper.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/WmsShipmentMaterialCodeItemMapper.java @@ -20,8 +20,6 @@ public interface WmsShipmentMaterialCodeItemMapper extends BaseMapper getByCodeId(Long codeId); - void updatePackingNum(Set ids); - List getListByMaterialNos(Set materialNos); List getListByItemIds(List ids); diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsShipmentMaterialCodeItemService.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsShipmentMaterialCodeItemService.java index 602f11d1..fb032e90 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsShipmentMaterialCodeItemService.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsShipmentMaterialCodeItemService.java @@ -1,11 +1,13 @@ package com.nflg.wms.repository.service; +import com.baomidou.mybatisplus.extension.service.IService; import com.nflg.wms.common.pojo.vo.MaterialItemPrintVO; import com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeItemVO; import com.nflg.wms.repository.entity.WmsShipmentMaterialCodeItem; -import com.baomidou.mybatisplus.extension.service.IService; +import java.math.BigDecimal; import java.util.List; +import java.util.Map; import java.util.Set; /** @@ -20,9 +22,11 @@ public interface IWmsShipmentMaterialCodeItemService extends IService getByCodeId(Long codeId); - void updatePackingNum(Set ids); - List getListByMaterialNos(Set materialNos); List getListByItemIds(List ids); + + void updateStatusAndBoxNoAndActualNum(List items, Integer status, String boxNo, BigDecimal actualNum, Map id2ActualNumMap); + + List getSameMaterialItems(Long materialCodeId, String materialNo, String parentMaterialDescribe, String productionOrderNumber); } diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsShipmentMaterialCodeItemQrServiceImpl.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsShipmentMaterialCodeItemQrServiceImpl.java index bd15e710..417be08c 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsShipmentMaterialCodeItemQrServiceImpl.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsShipmentMaterialCodeItemQrServiceImpl.java @@ -1,13 +1,17 @@ package com.nflg.wms.repository.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeQRVO; +import com.nflg.wms.repository.entity.WmsShipmentMaterialCodeItem; import com.nflg.wms.repository.entity.WmsShipmentMaterialCodeItemQr; import com.nflg.wms.repository.mapper.WmsShipmentMaterialCodeItemQrMapper; import com.nflg.wms.repository.mapper.dto.GetQRCodeByMaterialNoAndDeviceNoAndProductionOrderNumberAndStatusParamsDTO; import com.nflg.wms.repository.service.IWmsShipmentMaterialCodeItemQrService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.nflg.wms.repository.service.IWmsShipmentMaterialCodeItemService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.math.BigDecimal; import java.util.List; import java.util.Set; @@ -22,6 +26,9 @@ import java.util.Set; @Service public class WmsShipmentMaterialCodeItemQrServiceImpl extends ServiceImpl implements IWmsShipmentMaterialCodeItemQrService { + @Autowired + private IWmsShipmentMaterialCodeItemService wmsShipmentMaterialCodeItemService; + @Override public String getQRCodeByMaterialNoAndDeviceNoAndProductionOrderNumberAndStatus(GetQRCodeByMaterialNoAndDeviceNoAndProductionOrderNumberAndStatusParamsDTO params) { return baseMapper.getQRCodeByMaterialNoAndDeviceNoAndProductionOrderNumberAndStatus(params); @@ -29,7 +36,13 @@ public class WmsShipmentMaterialCodeItemQrServiceImpl extends ServiceImpl sameMaterialItems = + wmsShipmentMaterialCodeItemService.getSameMaterialItems(item.getMaterialCodeId(), item.getMaterialNo(), item.getParentMaterialDescribe(), item.getProductionOrderNumber()); + BigDecimal totalActualNum = sameMaterialItems.stream().map(WmsShipmentMaterialCodeItem::getActualNum).reduce(BigDecimal.ZERO, BigDecimal::add); + info.setLeftNum(item.getNum().subtract(totalActualNum)); + return info; } @Override diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsShipmentMaterialCodeItemServiceImpl.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsShipmentMaterialCodeItemServiceImpl.java index 818a8141..51a5dab8 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsShipmentMaterialCodeItemServiceImpl.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsShipmentMaterialCodeItemServiceImpl.java @@ -1,14 +1,19 @@ package com.nflg.wms.repository.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.nflg.wms.common.pojo.vo.MaterialItemPrintVO; import com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeItemVO; +import com.nflg.wms.common.util.UserUtil; import com.nflg.wms.repository.entity.WmsShipmentMaterialCodeItem; import com.nflg.wms.repository.mapper.WmsShipmentMaterialCodeItemMapper; import com.nflg.wms.repository.service.IWmsShipmentMaterialCodeItemService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; +import java.time.LocalDateTime; import java.util.List; +import java.util.Map; import java.util.Set; /** @@ -27,11 +32,6 @@ public class WmsShipmentMaterialCodeItemServiceImpl extends ServiceImpl ids) { - baseMapper.updatePackingNum(ids); - } - @Override public List getListByMaterialNos(Set materialNos) { return baseMapper.getListByMaterialNos(materialNos); @@ -41,4 +41,27 @@ public class WmsShipmentMaterialCodeItemServiceImpl extends ServiceImpl getListByItemIds(List ids) { return baseMapper.getListByItemIds(ids); } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateStatusAndBoxNoAndActualNum(List items, Integer status, String boxNo, BigDecimal actualNum, Map id2ActualNumMap) { + for (WmsShipmentMaterialCodeItem item : items) { + item.setStatus(status); + item.setBoxNo(boxNo); + item.setActualNum(actualNum != null ? actualNum : id2ActualNumMap.get(item.getId())); + item.setUpdateBy(UserUtil.getUserName()); + item.setUpdateTime(LocalDateTime.now()); + } + this.updateBatchById(items); + } + + @Override + public List getSameMaterialItems(Long materialCodeId, String materialNo, String parentMaterialDescribe, String productionOrderNumber) { + return lambdaQuery() + .eq(WmsShipmentMaterialCodeItem::getMaterialCodeId, materialCodeId) + .eq(WmsShipmentMaterialCodeItem::getMaterialNo, materialNo) + .eq(WmsShipmentMaterialCodeItem::getParentMaterialDescribe, parentMaterialDescribe) + .eq(WmsShipmentMaterialCodeItem::getProductionOrderNumber, productionOrderNumber) + .list(); + } } diff --git a/nflg-wms-repository/src/main/resources/mapper/WmsShipmentMaterialCodeItemMapper.xml b/nflg-wms-repository/src/main/resources/mapper/WmsShipmentMaterialCodeItemMapper.xml index 76e4110a..3737f121 100644 --- a/nflg-wms-repository/src/main/resources/mapper/WmsShipmentMaterialCodeItemMapper.xml +++ b/nflg-wms-repository/src/main/resources/mapper/WmsShipmentMaterialCodeItemMapper.xml @@ -6,26 +6,6 @@ select * from wms_shipment_material_code_item where material_code_id = #{codeId} - - WITH updated_data AS ( - SELECT - "id", - packing_num, - (packing_num - (SELECT COUNT(1) FROM wms_shipment_material_code_item_qr WHERE item_id = - wms_shipment_material_code_item."id" AND status = 1)) as new_packing_left - FROM wms_shipment_material_code_item - ) - UPDATE wms_shipment_material_code_item t - SET - packing_left = u.new_packing_left, - status = CASE WHEN u.new_packing_left = 0 THEN 2 WHEN u.new_packing_left=u.packing_num THEN 0 ELSE 1 END - FROM updated_data u - WHERE t."id" = u."id" and t."id" IN - - #{id} - - - SELECT ROW_NUMBER() OVER () AS "index",it."id",qr.no,cit.material_no,cit.material_describe,cit.num - ,qr.num as actualNum,cit.unit,d.device_no,d.customer_name + ,cit.actual_num as actualNum,cit.unit,d.device_no,d.customer_name FROM wms_shipment_packaging_code_item it INNER JOIN wms_shipment_material_code_item_qr qr ON it.material_code_item_qr_id=qr."id" INNER JOIN wms_shipment_material_code_item cit ON qr.item_id=cit."id" diff --git a/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/MaterialCodeController.java b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/MaterialCodeController.java index d4e71ff3..3fad717d 100644 --- a/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/MaterialCodeController.java +++ b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/MaterialCodeController.java @@ -16,7 +16,6 @@ import com.nflg.wms.common.pojo.vo.MaterialPdfVO; import com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeItemVO; import com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeQRVO; import com.nflg.wms.common.util.EecExcelUtil; -import com.nflg.wms.common.util.NumberUtil; import com.nflg.wms.common.util.UserUtil; import com.nflg.wms.common.util.VUtil; import com.nflg.wms.repository.entity.*; @@ -187,7 +186,7 @@ public class MaterialCodeController extends BaseController { response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode("物料清单导入模板.xlsx", StandardCharsets.UTF_8)); new Workbook() - .addSheet(new TemplateSheet(new ClassPathResource("template/物料码打印导出模板.xlsx").getInputStream()) + .addSheet(new TemplateSheet(new ClassPathResource("template/物料码打印导入模板.xlsx").getInputStream()) ).writeTo(response.getOutputStream()); } @@ -252,34 +251,31 @@ public class MaterialCodeController extends BaseController { item.setMaterialNo(row.getString(1)); item.setMaterialDescribe(row.getString(2)); item.setNum(row.getDecimal(3)); - item.setActualNum(row.getDecimal(4)); - item.setMinPackagingNum(item.getActualNum()); - item.setUnit(row.getString(5)); - item.setProjectType(row.getString(6)); - item.setParentMaterialDescribe(row.getString(7)); - item.setProductionOrderNumber(row.getString(8)); - item.setBoxNo(row.getString(9)); + item.setActualNum(BigDecimal.ZERO); + item.setUnit(row.getString(4)); + item.setProjectType(row.getString(5)); + item.setParentMaterialDescribe(row.getString(6)); + item.setProductionOrderNumber(row.getString(7)); item.setCreateBy(UserUtil.getUserName()); item.setCreateTime(LocalDateTime.now()); - item.setPackingNum(NumberUtil.calculateLabelNum(item.getNum(), item.getMinPackagingNum())); - item.setPackingLeft(item.getPackingNum()); + items.add(item); qrs.add(new WmsShipmentMaterialCodeItemQr() .setItemId(item.getId()) .setNo(KeyUtil.nextFCode()) - .setNum(item.getMinPackagingNum()) + .setNum(item.getNum()) .setCreateBy(UserUtil.getUserName()) .setCreateTime(LocalDateTime.now()) ); } }); -// Set repeats = items.stream().collect(Collectors.groupingBy(WmsShipmentMaterialCodeItem::getKey)) -// .values() -// .stream().filter(list -> list.size() > 1) -// .map(list -> list.get(0).getMaterialNo()) -// .collect(Collectors.toSet()); -// VUtil.trueThrowBusinessError(CollectionUtil.isNotEmpty(repeats)) -// .throwMessage("以下物料重复:" + StrUtil.join(",", repeats)); + Set repeats = items.stream().collect(Collectors.groupingBy(WmsShipmentMaterialCodeItem::getKey)) + .values() + .stream().filter(list -> list.size() > 1) + .map(list -> list.get(0).getMaterialNo()) + .collect(Collectors.toSet()); + VUtil.trueThrowBusinessError(CollectionUtil.isNotEmpty(repeats)) + .throwMessage("以下物料重复:" + StrUtil.join(",", repeats)); materialCodeService.save(materialCode); materialCodeItemService.saveBatch(items); materialCodeItemQrService.saveBatch(qrs); @@ -293,38 +289,21 @@ public class MaterialCodeController extends BaseController { @Transactional @PostMapping("item/add") public ApiResult addItem(@Valid @RequestBody MaterialCodeItemAddQO qo) { - VUtil.trueThrowBusinessError(materialCodeItemService.lambdaQuery() - .eq(WmsShipmentMaterialCodeItem::getMaterialCodeId, qo.getMaterialCodeId()) - .eq(WmsShipmentMaterialCodeItem::getProductionOrderNumber, qo.getProductionOrderNumber()) - .eq(WmsShipmentMaterialCodeItem::getMaterialNo, qo.getMaterialNo()) - .exists()).throwMessage("物料已存在"); + List sameMaterialItems = + materialCodeItemService.getSameMaterialItems(qo.getMaterialCodeId(), qo.getMaterialNo(), qo.getParentMaterialDescribe(), qo.getProductionOrderNumber()); + VUtil.trueThrowBusinessError(CollectionUtil.isNotEmpty(sameMaterialItems)).throwMessage("物料已存在"); WmsShipmentMaterialCodeItem item = Convert.convert(WmsShipmentMaterialCodeItem.class, qo); - if (Objects.isNull(qo.getMinPackagingNum())) { - item.setMinPackagingNum(qo.getNum()); - } else { - VUtil.trueThrowBusinessError(qo.getMinPackagingNum().compareTo(qo.getNum()) > 0) - .throwMessage("最小包装数量不能大于数量"); - item.setMinPackagingNum(qo.getMinPackagingNum()); - } item.setId(IdUtil.getSnowflakeNextId()); item.setCreateBy(UserUtil.getUserName()); item.setCreateTime(LocalDateTime.now()); -// BigDecimal result = item.getNum().divide(item.getMinPackagingNum(), 3, RoundingMode.HALF_UP); -// BigDecimal decimalValue = result.remainder(BigDecimal.ONE); -// item.setPackingNum(decimalValue.compareTo(BigDecimal.ZERO) > 0 ? result.intValue() + 1 : result.intValue()); - item.setPackingNum(NumberUtil.calculateLabelNum(item.getNum(), item.getMinPackagingNum())); - item.setPackingLeft(item.getPackingNum()); -// int count = decimalValue.compareTo(BigDecimal.ZERO) > 0 ? result.intValue() + 1 : result.intValue(); - for (int i = 1; i <= item.getPackingNum(); i++) { - materialCodeItemQrService.save(new WmsShipmentMaterialCodeItemQr() - .setItemId(item.getId()) - .setNo(KeyUtil.nextFCode()) -// .setNum(i == count && decimalValue.compareTo(BigDecimal.ZERO) > 0 ? decimalValue : item.getMinPackagingNum()) - .setNum(NumberUtil.getPackageNum(item.getNum(), item.getMinPackagingNum(), item.getPackingNum(), i)) - .setCreateBy(UserUtil.getUserName()) - .setCreateTime(LocalDateTime.now()) - ); - } + item.setActualNum(BigDecimal.ZERO); + materialCodeItemQrService.save(new WmsShipmentMaterialCodeItemQr() + .setItemId(item.getId()) + .setNo(KeyUtil.nextFCode()) + .setNum(item.getNum()) + .setCreateBy(UserUtil.getUserName()) + .setCreateTime(LocalDateTime.now()) + ); materialCodeItemService.save(item); materialCodeService.lambdaUpdate() .set(WmsShipmentMaterialCode::getStatus, 1) @@ -342,37 +321,26 @@ public class MaterialCodeController extends BaseController { public ApiResult updateItem(@Valid @RequestBody MaterialCodeItemUpdateQO qo) { WmsShipmentMaterialCodeItem item = materialCodeItemService.getById(qo.getId()); VUtil.trueThrowBusinessError(Objects.isNull(item)).throwMessage("清单明细不存在"); - if (Objects.isNull(qo.getMinPackagingNum())) { - qo.setMinPackagingNum(qo.getNum()); - } else { - VUtil.trueThrowBusinessError(qo.getMinPackagingNum().compareTo(qo.getNum()) > 0) - .throwMessage("最小包装数量不能大于数量"); - qo.setMinPackagingNum(qo.getNum()); - } VUtil.trueThrowBusinessError(item.getStatus() > 0) .throwMessage("已装箱,不能修改"); + + + List sameMaterialItems = + materialCodeItemService.getSameMaterialItems(item.getMaterialCodeId(), item.getMaterialNo(), item.getParentMaterialDescribe(), item.getProductionOrderNumber()); + VUtil.trueThrowBusinessError(sameMaterialItems.size() > 1) + .throwMessage("存在多行物料编码、生产订单号、上级物料描述三个字段相同的情况,不允许修改"); + item = Convert.convert(WmsShipmentMaterialCodeItem.class, qo); + item.setUpdateBy(UserUtil.getUserName()); item.setUpdateTime(LocalDateTime.now()); materialCodeItemService.updateById(item); materialCodeItemQrService.lambdaUpdate() + .set(WmsShipmentMaterialCodeItemQr::getNum, item.getNum()) + .set(WmsShipmentMaterialCodeItemQr::getUpdateBy, UserUtil.getUserName()) + .set(WmsShipmentMaterialCodeItemQr::getUpdateTime, LocalDateTime.now()) .eq(WmsShipmentMaterialCodeItemQr::getItemId, item.getId()) - .remove(); -// BigDecimal result = item.getNum().divide(item.getMinPackagingNum(), 3, RoundingMode.HALF_UP); -// BigDecimal decimalValue = result.remainder(BigDecimal.ONE); -// item.setPackingNum(decimalValue.compareTo(BigDecimal.ZERO) > 0 ? result.intValue() + 1 : result.intValue()); - item.setPackingNum(NumberUtil.calculateLabelNum(item.getNum(), item.getMinPackagingNum())); - item.setPackingLeft(item.getPackingNum()); -// int count = decimalValue.compareTo(BigDecimal.ZERO) > 0 ? result.intValue() + 1 : result.intValue(); - for (int i = 1; i <= item.getPackingNum(); i++) { - materialCodeItemQrService.save(new WmsShipmentMaterialCodeItemQr() - .setItemId(item.getId()) - .setNo(KeyUtil.nextFCode()) - .setNum(NumberUtil.getPackageNum(item.getNum(), item.getMinPackagingNum(), item.getPackingNum(), i)) - .setCreateBy(UserUtil.getUserName()) - .setCreateTime(LocalDateTime.now()) - ); - } + .update(); return ApiResult.success(); } @@ -390,6 +358,9 @@ public class MaterialCodeController extends BaseController { .stream() .map(WmsShipmentMaterialCodeItem::getId) .collect(Collectors.toSet()); + + VUtil.trueThrowBusinessError(deleteIds.size() < ids.size()).throwMessage("已装箱的不可删除"); + if (CollectionUtil.isNotEmpty(deleteIds)) { materialCodeItemService.lambdaUpdate() .in(WmsShipmentMaterialCodeItem::getId, deleteIds) @@ -412,8 +383,7 @@ public class MaterialCodeController extends BaseController { public ApiResult importItemFromExcel(@RequestParam Long materialCodeId, @RequestParam Boolean cover, @RequestParam("file") MultipartFile file) throws IOException { WmsShipmentMaterialCode materialCode = materialCodeService.getById(materialCodeId); VUtil.trueThrowBusinessError(Objects.isNull(materialCode)).throwMessage("清单不存在"); - List dbItems = materialCodeItemService.lambdaQuery() - .select(WmsShipmentMaterialCodeItem::getId, WmsShipmentMaterialCodeItem::getMaterialNo, WmsShipmentMaterialCodeItem::getStatus) + List allDbItems = materialCodeItemService.lambdaQuery() .eq(WmsShipmentMaterialCodeItem::getMaterialCodeId, materialCodeId) .list(); List qrsForAdd = new ArrayList<>(); @@ -422,6 +392,7 @@ public class MaterialCodeController extends BaseController { List itemsForAdd = new ArrayList<>(); List itemsForUpdate = new ArrayList<>(); List repeats = new ArrayList<>(); + List dbExists = new ArrayList<>(); reader.sheet(0).rows().forEach(row -> { log.debug("第{}行:{}", row.getRowNum(), row); if (row.getRowNum() > 4 && StrUtil.isNotBlank(row.getString(1))) { @@ -431,74 +402,77 @@ public class MaterialCodeController extends BaseController { item.setMaterialNo(row.getString(1)); item.setMaterialDescribe(row.getString(2)); item.setNum(row.getDecimal(3)); - item.setActualNum(row.getDecimal(4)); - item.setMinPackagingNum(item.getActualNum()); - item.setUnit(row.getString(5)); - item.setProjectType(row.getString(6)); - item.setParentMaterialDescribe(row.getString(7)); - item.setProductionOrderNumber(row.getString(8)); - item.setBoxNo(row.getString(9)); - item.setPackingNum(1); - item.setPackingLeft(1); + item.setActualNum(BigDecimal.ZERO); + item.setUnit(row.getString(4)); + item.setProjectType(row.getString(5)); + item.setParentMaterialDescribe(row.getString(6)); + item.setProductionOrderNumber(row.getString(7)); if (itemsForAdd.stream().anyMatch(it -> it.getKey().equals(item.getKey()))) { repeats.add(item.getMaterialNo()); } else { + List dbItems = allDbItems.stream() + .filter(it -> it.getKey().equals(item.getKey())) + .collect(Collectors.toList()); if (!cover) { - item.setCreateBy(UserUtil.getUserName()); - item.setCreateTime(LocalDateTime.now()); - itemsForAdd.add(item); - qrsForAdd.add(new WmsShipmentMaterialCodeItemQr() - .setItemId(item.getId()) - .setNo(KeyUtil.nextFCode()) - .setNum(item.getMinPackagingNum()) - .setCreateBy(UserUtil.getUserName()) - .setCreateTime(LocalDateTime.now()) - ); - } else { - WmsShipmentMaterialCodeItem dbItem = dbItems.stream() - .filter(it -> it.getKey().equals(item.getKey())) - .findFirst() - .orElse(null); - if (Objects.isNull(dbItem)) { + if (CollectionUtil.isNotEmpty(dbItems)) { + dbExists.add(dbItems.get(0).getMaterialNo()); + } else { item.setCreateBy(UserUtil.getUserName()); item.setCreateTime(LocalDateTime.now()); itemsForAdd.add(item); qrsForAdd.add(new WmsShipmentMaterialCodeItemQr() .setItemId(item.getId()) .setNo(KeyUtil.nextFCode()) - .setNum(item.getMinPackagingNum()) + .setNum(item.getNum()) .setCreateBy(UserUtil.getUserName()) .setCreateTime(LocalDateTime.now()) ); - } else if (dbItem.getStatus() == 0) { - item.setId(dbItem.getId()); - item.setUpdateBy(UserUtil.getUserName()); - item.setUpdateTime(LocalDateTime.now()); - itemsForUpdate.add(item); - List iqrs = materialCodeItemQrService.lambdaQuery() - .eq(WmsShipmentMaterialCodeItemQr::getItemId, item.getId()) - .list(); - if (iqrs.size() > 1) { - materialCodeItemQrService.lambdaUpdate() + } + } else { + if (CollectionUtil.isEmpty(dbItems)) { + item.setCreateBy(UserUtil.getUserName()); + item.setCreateTime(LocalDateTime.now()); + itemsForAdd.add(item); + qrsForAdd.add(new WmsShipmentMaterialCodeItemQr() + .setItemId(item.getId()) + .setNo(KeyUtil.nextFCode()) + .setNum(item.getNum()) + .setCreateBy(UserUtil.getUserName()) + .setCreateTime(LocalDateTime.now()) + ); + } else { + if (dbItems.size() > 1) { + dbExists.add(dbItems.get(0).getMaterialNo()); + } else if (dbItems.get(0).getStatus() == 0) { + item.setId(dbItems.get(0).getId()); + item.setUpdateBy(UserUtil.getUserName()); + item.setUpdateTime(LocalDateTime.now()); + itemsForUpdate.add(item); + List iqrs = materialCodeItemQrService.lambdaQuery() .eq(WmsShipmentMaterialCodeItemQr::getItemId, item.getId()) - .remove(); - } - if (iqrs.size() == 1) { - qrsForUpdate.add( - new WmsShipmentMaterialCodeItemQr() - .setId(iqrs.get(0).getId()) - .setNum(item.getMinPackagingNum()) - .setCreateBy(UserUtil.getUserName()) - .setCreateTime(LocalDateTime.now()) - ); - } else { - qrsForAdd.add(new WmsShipmentMaterialCodeItemQr() - .setItemId(item.getId()) - .setNo(KeyUtil.nextFCode()) - .setNum(item.getMinPackagingNum()) - .setCreateBy(UserUtil.getUserName()) - .setCreateTime(LocalDateTime.now()) - ); + .list(); + if (iqrs.size() > 1) { + materialCodeItemQrService.lambdaUpdate() + .eq(WmsShipmentMaterialCodeItemQr::getItemId, item.getId()) + .remove(); + } + if (iqrs.size() == 1) { + qrsForUpdate.add( + new WmsShipmentMaterialCodeItemQr() + .setId(iqrs.get(0).getId()) + .setNum(item.getNum()) + .setCreateBy(UserUtil.getUserName()) + .setCreateTime(LocalDateTime.now()) + ); + } else { + qrsForAdd.add(new WmsShipmentMaterialCodeItemQr() + .setItemId(item.getId()) + .setNo(KeyUtil.nextFCode()) + .setNum(item.getNum()) + .setCreateBy(UserUtil.getUserName()) + .setCreateTime(LocalDateTime.now()) + ); + } } } } @@ -507,6 +481,10 @@ public class MaterialCodeController extends BaseController { }); VUtil.trueThrowBusinessError(CollectionUtil.isNotEmpty(repeats)) .throwMessage("以下物料重复:" + StrUtil.join(",", repeats)); + + VUtil.trueThrowBusinessError(CollectionUtil.isNotEmpty(dbExists)) + .throwMessage(!cover ? "以下物料已存在:" + StrUtil.join(",", dbExists) + : "存在多行物料编码、生产订单号、上级物料描述三个字段相同的情况,不允许修改: " + dbExists); if (CollectionUtil.isNotEmpty(itemsForAdd)) { materialCodeItemService.saveBatch(itemsForAdd); materialCodeService.lambdaUpdate() diff --git a/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/PackagingCodeController.java b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/PackagingCodeController.java index 298b1dce..e01d6fdb 100644 --- a/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/PackagingCodeController.java +++ b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/PackagingCodeController.java @@ -1,45 +1,40 @@ package com.nflg.wms.shipment.controller; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.convert.Convert; -import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.google.common.collect.Lists; import com.nflg.wms.common.pojo.ApiResult; import com.nflg.wms.common.pojo.PageData; -import com.nflg.wms.common.pojo.dto.DeliverNormalOrderItemDTO; import com.nflg.wms.common.pojo.qo.*; import com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeQRVO; import com.nflg.wms.common.pojo.vo.ShipmentPackagingCodeVO; +import com.nflg.wms.common.util.NumberUtil; import com.nflg.wms.common.util.UserUtil; import com.nflg.wms.common.util.VUtil; -import com.nflg.wms.repository.entity.DictionaryItem; -import com.nflg.wms.repository.entity.WmsShipmentMaterialCodeItemQr; -import com.nflg.wms.repository.entity.WmsShipmentPackagingCode; -import com.nflg.wms.repository.entity.WmsShipmentPackagingCodeItem; +import com.nflg.wms.repository.entity.*; import com.nflg.wms.repository.service.*; import com.nflg.wms.shipment.service.BasdeSerialNumberControllerService; -import com.nflg.wms.shipment.util.HtmlToImageUtil; -import com.nflg.wms.shipment.util.KeyUtil; -import com.nflg.wms.shipment.util.PdfGeneratorUtil; -import com.nflg.wms.shipment.util.QRCodeUtil; -import com.nflg.wms.shipment.util.ThymeleafUtil; +import com.nflg.wms.shipment.util.*; import com.nflg.wms.starter.BaseController; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; +import org.springframework.core.io.ClassPathResource; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; -import org.springframework.core.io.ClassPathResource; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import java.io.ByteArrayOutputStream; +import java.math.BigDecimal; import java.net.URL; import java.time.LocalDateTime; import java.util.*; @@ -186,10 +181,25 @@ public class PackagingCodeController extends BaseController { WmsShipmentPackagingCode info = packagingCodeService.getById(qo.getPackagingCodeId()); VUtil.trueThrowBusinessError(Objects.isNull(info)).throwMessage("包装箱不存在"); VUtil.trueThrowBusinessError(info.getStatus() == 2).throwMessage("该箱已发车"); - List items = materialCodeItemQrService.listByIds(qo.getMaterialQRIds()); - VUtil.trueThrowBusinessError(items.size() != qo.getMaterialQRIds().size()).throwMessage("数据有变动,请重新扫码"); - items.removeIf(item -> item.getStatus() == 1); - if (CollectionUtil.isNotEmpty(items)) { + List materialQRIds = qo.getMaterialInfos().stream().map(ShipmentPackingMaterialInfoQO::getMaterialQRId).collect(Collectors.toList()); + List itemQrs = materialCodeItemQrService.listByIds(materialQRIds); + VUtil.trueThrowBusinessError(itemQrs.size() != materialQRIds.size()).throwMessage("数据有变动,请重新扫码"); + itemQrs.removeIf(item -> item.getStatus() == 1); + Set itemIdSet = itemQrs.stream().map(WmsShipmentMaterialCodeItemQr::getItemId).collect(Collectors.toSet()); + List items = materialCodeItemService.listByIds(itemIdSet); + + Map qrId2ItemIdMap = itemQrs.stream().collect(Collectors.toMap(WmsShipmentMaterialCodeItemQr::getId, WmsShipmentMaterialCodeItemQr::getItemId, (oldValue, newValue) -> newValue)); + Map itemId2ActualNumMap = new HashMap<>(); + for (ShipmentPackingMaterialInfoQO materialInfoQO : qo.getMaterialInfos()) { + Long qrId = materialInfoQO.getMaterialQRId(); + Long itemId = qrId2ItemIdMap.get(qrId); + itemId2ActualNumMap.put(itemId, materialInfoQO.getActualNum()); + } + + // 校验实际数量 + Map materialCodeItem2NewActualNumMap = checkActualNum(itemId2ActualNumMap, items); + + if (CollectionUtil.isNotEmpty(itemQrs)) { if (info.getStatus() == 0) { packagingCodeService.lambdaUpdate() .set(WmsShipmentPackagingCode::getStatus, 1) @@ -199,25 +209,81 @@ public class PackagingCodeController extends BaseController { .eq(WmsShipmentPackagingCode::getStatus, 0) .update(); } - items.forEach(item -> { + itemQrs.forEach(item -> { item.setStatus(1); item.setUpdateBy(UserUtil.getUserName()); item.setUpdateTime(LocalDateTime.now()); }); packagingCodeItemService.saveBatch( - items.stream().map(it -> new WmsShipmentPackagingCodeItem() + itemQrs.stream().map(it -> new WmsShipmentPackagingCodeItem() .setPackagingCodeId(qo.getPackagingCodeId()) .setMaterialCodeItemQrId(it.getId()) .setCreateBy(UserUtil.getUserName()) .setCreateTime(LocalDateTime.now()) ).toList() ); - materialCodeItemQrService.updateBatchById(items); - materialCodeItemService.updatePackingNum(items.stream().map(WmsShipmentMaterialCodeItemQr::getItemId).collect(Collectors.toSet())); + materialCodeItemQrService.updateBatchById(itemQrs); + materialCodeItemService.updateStatusAndBoxNoAndActualNum(items, 2, info.getNo(), null, itemId2ActualNumMap); + + addMaterialCodeItemIfNumBigThenActualNum(materialCodeItem2NewActualNumMap); } return ApiResult.success(); } + private void addMaterialCodeItemIfNumBigThenActualNum(Map materialCodeItem2NewActualNumMap) { + if (CollectionUtil.isNotEmpty(materialCodeItem2NewActualNumMap)) { + for (WmsShipmentMaterialCodeItem item : materialCodeItem2NewActualNumMap.keySet()) { + if (item.getNum().compareTo(materialCodeItem2NewActualNumMap.get(item)) > 0) { + + List sameMaterialItems = + materialCodeItemService.getSameMaterialItems(item.getMaterialCodeId(), item.getMaterialNo(), item.getParentMaterialDescribe(), item.getProductionOrderNumber()); + + for (WmsShipmentMaterialCodeItem m : sameMaterialItems) { + if (!m.getId().equals(item.getId()) && m.getStatus() == 0) { + return; + } + } + + WmsShipmentMaterialCodeItem newMaterialCodeItem = new WmsShipmentMaterialCodeItem(); + BeanUtil.copyProperties(item, newMaterialCodeItem); + + newMaterialCodeItem.setId(IdUtil.getSnowflakeNextId()); + newMaterialCodeItem.setActualNum(BigDecimal.ZERO); + newMaterialCodeItem.setBoxNo(null); + newMaterialCodeItem.setStatus(0); + newMaterialCodeItem.setCreateBy(UserUtil.getUserName()); + newMaterialCodeItem.setCreateTime(LocalDateTime.now()); + + materialCodeItemQrService.save(new WmsShipmentMaterialCodeItemQr() + .setItemId(newMaterialCodeItem.getId()) + .setNo(KeyUtil.next()) + .setNum(newMaterialCodeItem.getNum()) + .setCreateBy(UserUtil.getUserName()) + .setCreateTime(LocalDateTime.now()) + ); + materialCodeItemService.save(newMaterialCodeItem); + } + } + } + } + + private Map checkActualNum(Map itemId2ActualNumMap, List items) { + Map materialCodeItem2NewActualNumMap = new HashMap<>(); + for (WmsShipmentMaterialCodeItem item : items) { + + List sameMaterialItems = + materialCodeItemService.getSameMaterialItems(item.getMaterialCodeId(), item.getMaterialNo(), item.getParentMaterialDescribe(), item.getProductionOrderNumber()); + BigDecimal totalActualNum = sameMaterialItems.stream().map(WmsShipmentMaterialCodeItem::getActualNum).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal actualNum = itemId2ActualNumMap.get(item.getId()); + BigDecimal newActualNum = totalActualNum.add(actualNum); + if (item.getNum().compareTo(newActualNum) <= 0) { + VUtil.trueThrowBusinessError(true).throwMessage(String.format("物料%s数量不足,剩余数量:%s", item.getMaterialNo(), NumberUtil.format(item.getNum().subtract(totalActualNum)))); + } + materialCodeItem2NewActualNumMap.put(item, newActualNum); + } + return materialCodeItem2NewActualNumMap; + } + /** * 装箱打包(PC使用) */ @@ -229,12 +295,12 @@ public class PackagingCodeController extends BaseController { .filter(Objects::nonNull) .map(ShipmentMaterialCodeQRVO::getId) .toList(); - List items = materialCodeItemQrService.lambdaQuery() + List itemQrs = materialCodeItemQrService.lambdaQuery() .in(WmsShipmentMaterialCodeItemQr::getId, ids) .list(); - VUtil.trueThrowBusinessError(items.size() != ids.size()).throwMessage("数据有变动,请重新扫码"); - items.removeIf(item -> item.getStatus() == 1); - if (CollectionUtil.isEmpty(items)) { + VUtil.trueThrowBusinessError(itemQrs.size() != ids.size()).throwMessage("数据有变动,请重新扫码"); + itemQrs.removeIf(item -> item.getStatus() == 1); + if (CollectionUtil.isEmpty(itemQrs)) { return ApiResult.success(); } WmsShipmentPackagingCode info = packagingCodeService.getById(shipmentPCPackingQO.getPackagingCodeId()); @@ -249,24 +315,29 @@ public class PackagingCodeController extends BaseController { .eq(WmsShipmentPackagingCode::getStatus, 0) .update(); } - items.forEach(item -> { + itemQrs.forEach(item -> { item.setStatus(1); item.setUpdateBy(UserUtil.getUserName()); item.setUpdateTime(LocalDateTime.now()); }); packagingCodeItemService.saveBatch( - items.stream().map(it -> new WmsShipmentPackagingCodeItem() + itemQrs.stream().map(it -> new WmsShipmentPackagingCodeItem() .setPackagingCodeId(shipmentPCPackingQO.getPackagingCodeId()) .setMaterialCodeItemQrId(it.getId()) .setCreateBy(UserUtil.getUserName()) .setCreateTime(LocalDateTime.now()) ).toList() ); - materialCodeItemQrService.updateBatchById(items); - materialCodeItemService.updatePackingNum(items.stream() - .map(WmsShipmentMaterialCodeItemQr::getItemId) - .collect(Collectors.toSet()) - ); + materialCodeItemQrService.updateBatchById(itemQrs); + + Set itemIdSet = itemQrs.stream().map(WmsShipmentMaterialCodeItemQr::getItemId).collect(Collectors.toSet()); + List items = materialCodeItemService.listByIds(itemIdSet); + + Map itemId2ActualNumMap = items.stream() + .collect(Collectors.toMap(WmsShipmentMaterialCodeItem::getId, WmsShipmentMaterialCodeItem::getNum)); + materialCodeItemService.updateStatusAndBoxNoAndActualNum(items, 2, info.getNo(),null, itemId2ActualNumMap); + + return ApiResult.success(); } @@ -306,7 +377,9 @@ public class PackagingCodeController extends BaseController { .eq(WmsShipmentMaterialCodeItemQr::getStatus, 1) .in(WmsShipmentMaterialCodeItemQr::getId, item.getMaterialCodeItemQrId()) .update(); - materialCodeItemService.updatePackingNum(Collections.singleton(qr.getItemId())); + + WmsShipmentMaterialCodeItem materialCodeItem = materialCodeItemService.getById(qr.getItemId()); + materialCodeItemService.updateStatusAndBoxNoAndActualNum(Lists.newArrayList(materialCodeItem), 0, "", BigDecimal.ZERO, null); packagingCodeService.updateStatus(item.getPackagingCodeId()); } } @@ -314,7 +387,7 @@ public class PackagingCodeController extends BaseController { } /** - * 拆箱&添加物料(PDA使用) + * 拆箱下,添加物料(PDA使用) */ @Transactional @PostMapping("unpack") @@ -322,11 +395,28 @@ public class PackagingCodeController extends BaseController { WmsShipmentPackagingCode info = packagingCodeService.getById(qo.getPackagingCodeId()); VUtil.trueThrowBusinessError(Objects.isNull(info)).throwMessage("包装箱不存在"); VUtil.trueThrowBusinessError(info.getStatus() >= 2).throwMessage("该箱已装车"); - if (CollectionUtil.isNotEmpty(qo.getMaterialQRIdsForAdd())) { + + List materialQRIds = qo.getMaterialInfosForAdd().stream().map(ShipmentUnPackingMaterialInfoQO::getMaterialQRId).collect(Collectors.toList()); + + if (CollectionUtil.isNotEmpty(materialQRIds)) { List qrs = materialCodeItemQrService.lambdaQuery() .eq(WmsShipmentMaterialCodeItemQr::getStatus, 0) - .in(WmsShipmentMaterialCodeItemQr::getId, qo.getMaterialQRIdsForAdd()) + .in(WmsShipmentMaterialCodeItemQr::getId, materialQRIds) .list(); + + Set itemIdSet = qrs.stream().map(WmsShipmentMaterialCodeItemQr::getItemId).collect(Collectors.toSet()); + List items = materialCodeItemService.listByIds(itemIdSet); + + Map qrId2ItemIdMap = qrs.stream().collect(Collectors.toMap(WmsShipmentMaterialCodeItemQr::getId, WmsShipmentMaterialCodeItemQr::getItemId, (oldValue, newValue) -> newValue)); + Map itemId2ActualNumMap = new HashMap<>(); + for (ShipmentUnPackingMaterialInfoQO materialInfoQO : qo.getMaterialInfosForAdd()) { + Long qrId = materialInfoQO.getMaterialQRId(); + Long itemId = qrId2ItemIdMap.get(qrId); + itemId2ActualNumMap.put(itemId, materialInfoQO.getActualNum()); + } + // 校验实际数量 + Map materialCodeItem2NewActualNumMap = checkActualNum(itemId2ActualNumMap, items); + if (CollectionUtil.isNotEmpty(qrs)) { if (info.getStatus() == 0) { packagingCodeService.lambdaUpdate() @@ -351,35 +441,11 @@ public class PackagingCodeController extends BaseController { ).toList() ); materialCodeItemQrService.updateBatchById(qrs); - materialCodeItemService.updatePackingNum(qrs.stream().map(WmsShipmentMaterialCodeItemQr::getItemId).collect(Collectors.toSet())); + + materialCodeItemService.updateStatusAndBoxNoAndActualNum(items, 2, info.getNo(), null, itemId2ActualNumMap); + addMaterialCodeItemIfNumBigThenActualNum(materialCodeItem2NewActualNumMap); } } -// if (CollectionUtil.isNotEmpty(qo.getMaterialQRIdsForDel())) { -// List items = packagingCodeItemService.lambdaQuery() -// .eq(WmsShipmentPackagingCodeItem::getPackagingCodeId, qo.getPackagingCodeId()) -// .in(WmsShipmentPackagingCodeItem::getId, qo.getMaterialQRIdsForDel()) -// .list(); -// if (CollectionUtil.isNotEmpty(items)) { -// packagingCodeItemService.lambdaUpdate() -// .eq(WmsShipmentPackagingCodeItem::getPackagingCodeId, qo.getPackagingCodeId()) -// .in(WmsShipmentPackagingCodeItem::getId, qo.getMaterialQRIdsForDel()) -// .remove(); -// List qrs = materialCodeItemQrService.lambdaQuery() -// .eq(WmsShipmentMaterialCodeItemQr::getStatus, 1) -// .in(WmsShipmentMaterialCodeItemQr::getId, items.stream().map(WmsShipmentPackagingCodeItem::getMaterialCodeItemQrId).toList()) -// .list(); -// if (CollectionUtil.isNotEmpty(qrs)) { -// materialCodeItemQrService.lambdaUpdate() -// .set(WmsShipmentMaterialCodeItemQr::getStatus, 0) -// .set(WmsShipmentMaterialCodeItemQr::getUpdateBy, UserUtil.getUserName()) -// .set(WmsShipmentMaterialCodeItemQr::getUpdateTime, LocalDateTime.now()) -// .eq(WmsShipmentMaterialCodeItemQr::getStatus, 1) -// .in(WmsShipmentMaterialCodeItemQr::getId, items.stream().map(WmsShipmentPackagingCodeItem::getMaterialCodeItemQrId).toList()) -// .update(); -// materialCodeItemService.updatePackingNum(qrs.stream().map(WmsShipmentMaterialCodeItemQr::getItemId).collect(Collectors.toSet())); -// } -// } -// } packagingCodeService.updateStatus(qo.getPackagingCodeId()); return ApiResult.success(); } diff --git a/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/pojo/vo/MaterialCodeItemVO.java b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/pojo/vo/MaterialCodeItemVO.java index ba20f7b9..62637598 100644 --- a/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/pojo/vo/MaterialCodeItemVO.java +++ b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/pojo/vo/MaterialCodeItemVO.java @@ -59,26 +59,11 @@ public class MaterialCodeItemVO { */ private String boxNo; - /** - * 最小包装量 - */ - private BigDecimal minPackagingNum; - /** * 状态,0:未装箱;1:装箱中;2:已装箱; */ private Integer status; - /** - * 打包箱数量 - */ - private Integer packingNum; - - /** - * 剩余打包箱数量 - */ - private Integer packingLeft; - /** * 创建人 */ diff --git a/nflg-wms-shipment/src/main/resources/template/物料码打印导入模板.xlsx b/nflg-wms-shipment/src/main/resources/template/物料码打印导入模板.xlsx new file mode 100644 index 00000000..2f07d259 Binary files /dev/null and b/nflg-wms-shipment/src/main/resources/template/物料码打印导入模板.xlsx differ