1483 发货管理-PDA-装箱菜单下逻辑修改,扫码记录可删除,数量可编辑

This commit is contained in:
10002617 2026-05-09 09:24:18 +08:00
parent 5bcf86c22f
commit 1d086bd2cc
21 changed files with 345 additions and 297 deletions

View File

@ -5,7 +5,6 @@ import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.Data; import lombok.Data;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import org.ttzero.excel.annotation.ExcelColumn;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.List; import java.util.List;
@ -76,4 +75,9 @@ public class BomMaterialDTO {
*/ */
@NotEmpty @NotEmpty
private List<BomMaterialDTO> children; private List<BomMaterialDTO> children;
/**
* 物料单位
*/
private String materialUnit;
} }

View File

@ -33,12 +33,6 @@ public class MaterialCodeItemAddQO {
@NotNull @NotNull
private BigDecimal num; private BigDecimal num;
/**
* 实发数量
*/
@NotNull
private BigDecimal actualNum;
/** /**
* 单位 * 单位
*/ */
@ -62,15 +56,4 @@ public class MaterialCodeItemAddQO {
*/ */
@NotBlank @NotBlank
private String productionOrderNumber; private String productionOrderNumber;
/**
* 箱号
*/
@NotBlank
private String boxNo;
/**
* 最小包装量
*/
private BigDecimal minPackagingNum;
} }

View File

@ -24,12 +24,6 @@ public class MaterialCodeItemUpdateQO {
@NotNull @NotNull
private BigDecimal num; private BigDecimal num;
/**
* 实发数量
*/
@NotNull
private BigDecimal actualNum;
/** /**
* 单位 * 单位
*/ */
@ -54,14 +48,4 @@ public class MaterialCodeItemUpdateQO {
@NotBlank @NotBlank
private String productionOrderNumber; private String productionOrderNumber;
/**
* 箱号
*/
@NotBlank
private String boxNo;
/**
* 最小包装量
*/
private BigDecimal minPackagingNum;
} }

View File

@ -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;
}

View File

@ -19,5 +19,5 @@ public class ShipmentPackingQO {
* 物料二维码ID列表 * 物料二维码ID列表
*/ */
@NotEmpty @NotEmpty
private List<Long> materialQRIds; private List<ShipmentPackingMaterialInfoQO> materialInfos;
} }

View File

@ -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;
}

View File

@ -15,9 +15,9 @@ public class ShipmentUnpackingQO {
private Long packagingCodeId; private Long packagingCodeId;
/** /**
* 要添加的物料二维码ID列表 * 要添加的物料信息列表
*/ */
private List<Long> materialQRIdsForAdd; private List<ShipmentUnPackingMaterialInfoQO> materialInfosForAdd;
// /** // /**
// * 要删除的物料二维码ID列表 // * 要删除的物料二维码ID列表

View File

@ -55,11 +55,6 @@ public class ShipmentMaterialCodeItemVO {
*/ */
private String boxNo; private String boxNo;
/**
* 最小包装量
*/
private BigDecimal minPackagingNum;
/** /**
* 状态0未装箱1已装箱5已安装 * 状态0未装箱1已装箱5已安装
*/ */

View File

@ -11,6 +11,8 @@ public class ShipmentMaterialCodeQRVO {
private Long id; private Long id;
private Long itemId;
/** /**
* 序号 * 序号
*/ */
@ -90,4 +92,9 @@ public class ShipmentMaterialCodeQRVO {
*/ */
private String orderDate; private String orderDate;
/**
* 剩余数量
*/
private BigDecimal leftNum;
} }

View File

@ -12,6 +12,7 @@ import lombok.experimental.Accessors;
import java.io.Serializable; import java.io.Serializable;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Objects;
/** /**
* <p> * <p>
@ -79,26 +80,11 @@ public class WmsShipmentMaterialCodeItem implements Serializable {
*/ */
private String boxNo; private String boxNo;
/**
* 最小包装量
*/
private BigDecimal minPackagingNum;
/** /**
* 状态0未装箱1装箱中2已装箱 * 状态0未装箱1装箱中2已装箱
*/ */
private Integer status; private Integer status;
/**
* 打包箱数量
*/
private Integer packingNum;
/**
* 剩余打包箱数量
*/
private Integer packingLeft;
/** /**
* 创建人 * 创建人
*/ */
@ -123,6 +109,18 @@ public class WmsShipmentMaterialCodeItem implements Serializable {
private String key; private String key;
public String getKey() { 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);
} }
} }

View File

@ -20,8 +20,6 @@ public interface WmsShipmentMaterialCodeItemMapper extends BaseMapper<WmsShipmen
List<ShipmentMaterialCodeItemVO> getByCodeId(Long codeId); List<ShipmentMaterialCodeItemVO> getByCodeId(Long codeId);
void updatePackingNum(Set<Long> ids);
List<MaterialItemPrintVO> getListByMaterialNos(Set<String> materialNos); List<MaterialItemPrintVO> getListByMaterialNos(Set<String> materialNos);
List<MaterialItemPrintVO> getListByItemIds(List<Long> ids); List<MaterialItemPrintVO> getListByItemIds(List<Long> ids);

View File

@ -1,11 +1,13 @@
package com.nflg.wms.repository.service; 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.MaterialItemPrintVO;
import com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeItemVO; import com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeItemVO;
import com.nflg.wms.repository.entity.WmsShipmentMaterialCodeItem; 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.List;
import java.util.Map;
import java.util.Set; import java.util.Set;
/** /**
@ -20,9 +22,11 @@ public interface IWmsShipmentMaterialCodeItemService extends IService<WmsShipmen
List<ShipmentMaterialCodeItemVO> getByCodeId(Long codeId); List<ShipmentMaterialCodeItemVO> getByCodeId(Long codeId);
void updatePackingNum(Set<Long> ids);
List<MaterialItemPrintVO> getListByMaterialNos(Set<String> materialNos); List<MaterialItemPrintVO> getListByMaterialNos(Set<String> materialNos);
List<MaterialItemPrintVO> getListByItemIds(List<Long> ids); List<MaterialItemPrintVO> getListByItemIds(List<Long> ids);
void updateStatusAndBoxNoAndActualNum(List<WmsShipmentMaterialCodeItem> items, Integer status, String boxNo, BigDecimal actualNum, Map<Long, BigDecimal> id2ActualNumMap);
List<WmsShipmentMaterialCodeItem> getSameMaterialItems(Long materialCodeId, String materialNo, String parentMaterialDescribe, String productionOrderNumber);
} }

View File

@ -1,13 +1,17 @@
package com.nflg.wms.repository.service.impl; 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.common.pojo.vo.ShipmentMaterialCodeQRVO;
import com.nflg.wms.repository.entity.WmsShipmentMaterialCodeItem;
import com.nflg.wms.repository.entity.WmsShipmentMaterialCodeItemQr; import com.nflg.wms.repository.entity.WmsShipmentMaterialCodeItemQr;
import com.nflg.wms.repository.mapper.WmsShipmentMaterialCodeItemQrMapper; import com.nflg.wms.repository.mapper.WmsShipmentMaterialCodeItemQrMapper;
import com.nflg.wms.repository.mapper.dto.GetQRCodeByMaterialNoAndDeviceNoAndProductionOrderNumberAndStatusParamsDTO; import com.nflg.wms.repository.mapper.dto.GetQRCodeByMaterialNoAndDeviceNoAndProductionOrderNumberAndStatusParamsDTO;
import com.nflg.wms.repository.service.IWmsShipmentMaterialCodeItemQrService; 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 org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
@ -22,6 +26,9 @@ import java.util.Set;
@Service @Service
public class WmsShipmentMaterialCodeItemQrServiceImpl extends ServiceImpl<WmsShipmentMaterialCodeItemQrMapper, WmsShipmentMaterialCodeItemQr> implements IWmsShipmentMaterialCodeItemQrService { public class WmsShipmentMaterialCodeItemQrServiceImpl extends ServiceImpl<WmsShipmentMaterialCodeItemQrMapper, WmsShipmentMaterialCodeItemQr> implements IWmsShipmentMaterialCodeItemQrService {
@Autowired
private IWmsShipmentMaterialCodeItemService wmsShipmentMaterialCodeItemService;
@Override @Override
public String getQRCodeByMaterialNoAndDeviceNoAndProductionOrderNumberAndStatus(GetQRCodeByMaterialNoAndDeviceNoAndProductionOrderNumberAndStatusParamsDTO params) { public String getQRCodeByMaterialNoAndDeviceNoAndProductionOrderNumberAndStatus(GetQRCodeByMaterialNoAndDeviceNoAndProductionOrderNumberAndStatusParamsDTO params) {
return baseMapper.getQRCodeByMaterialNoAndDeviceNoAndProductionOrderNumberAndStatus(params); return baseMapper.getQRCodeByMaterialNoAndDeviceNoAndProductionOrderNumberAndStatus(params);
@ -29,7 +36,13 @@ public class WmsShipmentMaterialCodeItemQrServiceImpl extends ServiceImpl<WmsShi
@Override @Override
public ShipmentMaterialCodeQRVO getInfoByQRCode(String code) { public ShipmentMaterialCodeQRVO getInfoByQRCode(String code) {
return baseMapper.getInfoByQRCode(code); ShipmentMaterialCodeQRVO info = baseMapper.getInfoByQRCode(code);
WmsShipmentMaterialCodeItem item = wmsShipmentMaterialCodeItemService.getById(info.getItemId());
List<WmsShipmentMaterialCodeItem> 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 @Override

View File

@ -1,14 +1,19 @@
package com.nflg.wms.repository.service.impl; 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.MaterialItemPrintVO;
import com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeItemVO; 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.entity.WmsShipmentMaterialCodeItem;
import com.nflg.wms.repository.mapper.WmsShipmentMaterialCodeItemMapper; import com.nflg.wms.repository.mapper.WmsShipmentMaterialCodeItemMapper;
import com.nflg.wms.repository.service.IWmsShipmentMaterialCodeItemService; import com.nflg.wms.repository.service.IWmsShipmentMaterialCodeItemService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service; 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.List;
import java.util.Map;
import java.util.Set; import java.util.Set;
/** /**
@ -27,11 +32,6 @@ public class WmsShipmentMaterialCodeItemServiceImpl extends ServiceImpl<WmsShipm
return baseMapper.getByCodeId(codeId); return baseMapper.getByCodeId(codeId);
} }
@Override
public void updatePackingNum(Set<Long> ids) {
baseMapper.updatePackingNum(ids);
}
@Override @Override
public List<MaterialItemPrintVO> getListByMaterialNos(Set<String> materialNos) { public List<MaterialItemPrintVO> getListByMaterialNos(Set<String> materialNos) {
return baseMapper.getListByMaterialNos(materialNos); return baseMapper.getListByMaterialNos(materialNos);
@ -41,4 +41,27 @@ public class WmsShipmentMaterialCodeItemServiceImpl extends ServiceImpl<WmsShipm
public List<MaterialItemPrintVO> getListByItemIds(List<Long> ids) { public List<MaterialItemPrintVO> getListByItemIds(List<Long> ids) {
return baseMapper.getListByItemIds(ids); return baseMapper.getListByItemIds(ids);
} }
@Override
@Transactional(rollbackFor = Exception.class)
public void updateStatusAndBoxNoAndActualNum(List<WmsShipmentMaterialCodeItem> items, Integer status, String boxNo, BigDecimal actualNum, Map<Long, BigDecimal> 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<WmsShipmentMaterialCodeItem> 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();
}
} }

View File

@ -6,26 +6,6 @@
select * from wms_shipment_material_code_item where material_code_id = #{codeId} select * from wms_shipment_material_code_item where material_code_id = #{codeId}
</select> </select>
<update id="updatePackingNum">
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
<foreach item="id" collection="ids" separator="," open="(" close=")">
#{id}
</foreach>
</update>
<select id="getListByMaterialNos" resultType="com.nflg.wms.common.pojo.vo.MaterialItemPrintVO"> <select id="getListByMaterialNos" resultType="com.nflg.wms.common.pojo.vo.MaterialItemPrintVO">
SELECT it.id, it.material_no, it.material_describe, it.num, it.actual_num, it.unit, SELECT it.id, it.material_no, it.material_describe, it.num, it.actual_num, it.unit,
it.project_type, it.production_order_number, it.box_no, it.project_type, it.production_order_number, it.box_no,

View File

@ -15,7 +15,7 @@
</select> </select>
<select id="getInfoByQRCode" resultType="com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeQRVO"> <select id="getInfoByQRCode" resultType="com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeQRVO">
SELECT qr.id,qr.no,it.material_no,it.material_describe,qr.num,it.unit,qr.status,mc.device_no,mc.customer_name SELECT qr.id,qr.item_id,qr.no,it.material_no,it.material_describe,qr.num,it.unit,qr.status,mc.device_no,mc.customer_name
FROM wms_shipment_material_code_item_qr qr FROM wms_shipment_material_code_item_qr qr
INNER JOIN wms_shipment_material_code_item it ON qr.item_id=it."id" INNER JOIN wms_shipment_material_code_item it ON qr.item_id=it."id"
INNER JOIN wms_shipment_material_code mc ON mc."id"=it.material_code_id INNER JOIN wms_shipment_material_code mc ON mc."id"=it.material_code_id

View File

@ -4,7 +4,7 @@
<select id="getPackList" resultType="com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeQRVO"> <select id="getPackList" resultType="com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeQRVO">
SELECT ROW_NUMBER() OVER () AS "index",it."id",qr.no,cit.material_no,cit.material_describe,cit.num 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 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_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" INNER JOIN wms_shipment_material_code_item cit ON qr.item_id=cit."id"

View File

@ -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.ShipmentMaterialCodeItemVO;
import com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeQRVO; import com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeQRVO;
import com.nflg.wms.common.util.EecExcelUtil; 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.UserUtil;
import com.nflg.wms.common.util.VUtil; import com.nflg.wms.common.util.VUtil;
import com.nflg.wms.repository.entity.*; import com.nflg.wms.repository.entity.*;
@ -187,7 +186,7 @@ public class MaterialCodeController extends BaseController {
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode("物料清单导入模板.xlsx", StandardCharsets.UTF_8)); response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode("物料清单导入模板.xlsx", StandardCharsets.UTF_8));
new Workbook() new Workbook()
.addSheet(new TemplateSheet(new ClassPathResource("template/物料码打印导模板.xlsx").getInputStream()) .addSheet(new TemplateSheet(new ClassPathResource("template/物料码打印导模板.xlsx").getInputStream())
).writeTo(response.getOutputStream()); ).writeTo(response.getOutputStream());
} }
@ -252,34 +251,31 @@ public class MaterialCodeController extends BaseController {
item.setMaterialNo(row.getString(1)); item.setMaterialNo(row.getString(1));
item.setMaterialDescribe(row.getString(2)); item.setMaterialDescribe(row.getString(2));
item.setNum(row.getDecimal(3)); item.setNum(row.getDecimal(3));
item.setActualNum(row.getDecimal(4)); item.setActualNum(BigDecimal.ZERO);
item.setMinPackagingNum(item.getActualNum()); item.setUnit(row.getString(4));
item.setUnit(row.getString(5)); item.setProjectType(row.getString(5));
item.setProjectType(row.getString(6)); item.setParentMaterialDescribe(row.getString(6));
item.setParentMaterialDescribe(row.getString(7)); item.setProductionOrderNumber(row.getString(7));
item.setProductionOrderNumber(row.getString(8));
item.setBoxNo(row.getString(9));
item.setCreateBy(UserUtil.getUserName()); item.setCreateBy(UserUtil.getUserName());
item.setCreateTime(LocalDateTime.now()); item.setCreateTime(LocalDateTime.now());
item.setPackingNum(NumberUtil.calculateLabelNum(item.getNum(), item.getMinPackagingNum()));
item.setPackingLeft(item.getPackingNum());
items.add(item); items.add(item);
qrs.add(new WmsShipmentMaterialCodeItemQr() qrs.add(new WmsShipmentMaterialCodeItemQr()
.setItemId(item.getId()) .setItemId(item.getId())
.setNo(KeyUtil.nextFCode()) .setNo(KeyUtil.nextFCode())
.setNum(item.getMinPackagingNum()) .setNum(item.getNum())
.setCreateBy(UserUtil.getUserName()) .setCreateBy(UserUtil.getUserName())
.setCreateTime(LocalDateTime.now()) .setCreateTime(LocalDateTime.now())
); );
} }
}); });
// Set<String> repeats = items.stream().collect(Collectors.groupingBy(WmsShipmentMaterialCodeItem::getKey)) Set<String> repeats = items.stream().collect(Collectors.groupingBy(WmsShipmentMaterialCodeItem::getKey))
// .values() .values()
// .stream().filter(list -> list.size() > 1) .stream().filter(list -> list.size() > 1)
// .map(list -> list.get(0).getMaterialNo()) .map(list -> list.get(0).getMaterialNo())
// .collect(Collectors.toSet()); .collect(Collectors.toSet());
// VUtil.trueThrowBusinessError(CollectionUtil.isNotEmpty(repeats)) VUtil.trueThrowBusinessError(CollectionUtil.isNotEmpty(repeats))
// .throwMessage("以下物料重复:" + StrUtil.join(",", repeats)); .throwMessage("以下物料重复:" + StrUtil.join(",", repeats));
materialCodeService.save(materialCode); materialCodeService.save(materialCode);
materialCodeItemService.saveBatch(items); materialCodeItemService.saveBatch(items);
materialCodeItemQrService.saveBatch(qrs); materialCodeItemQrService.saveBatch(qrs);
@ -293,38 +289,21 @@ public class MaterialCodeController extends BaseController {
@Transactional @Transactional
@PostMapping("item/add") @PostMapping("item/add")
public ApiResult<Void> addItem(@Valid @RequestBody MaterialCodeItemAddQO qo) { public ApiResult<Void> addItem(@Valid @RequestBody MaterialCodeItemAddQO qo) {
VUtil.trueThrowBusinessError(materialCodeItemService.lambdaQuery() List<WmsShipmentMaterialCodeItem> sameMaterialItems =
.eq(WmsShipmentMaterialCodeItem::getMaterialCodeId, qo.getMaterialCodeId()) materialCodeItemService.getSameMaterialItems(qo.getMaterialCodeId(), qo.getMaterialNo(), qo.getParentMaterialDescribe(), qo.getProductionOrderNumber());
.eq(WmsShipmentMaterialCodeItem::getProductionOrderNumber, qo.getProductionOrderNumber()) VUtil.trueThrowBusinessError(CollectionUtil.isNotEmpty(sameMaterialItems)).throwMessage("物料已存在");
.eq(WmsShipmentMaterialCodeItem::getMaterialNo, qo.getMaterialNo())
.exists()).throwMessage("物料已存在");
WmsShipmentMaterialCodeItem item = Convert.convert(WmsShipmentMaterialCodeItem.class, qo); 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.setId(IdUtil.getSnowflakeNextId());
item.setCreateBy(UserUtil.getUserName()); item.setCreateBy(UserUtil.getUserName());
item.setCreateTime(LocalDateTime.now()); item.setCreateTime(LocalDateTime.now());
// BigDecimal result = item.getNum().divide(item.getMinPackagingNum(), 3, RoundingMode.HALF_UP); item.setActualNum(BigDecimal.ZERO);
// 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() materialCodeItemQrService.save(new WmsShipmentMaterialCodeItemQr()
.setItemId(item.getId()) .setItemId(item.getId())
.setNo(KeyUtil.nextFCode()) .setNo(KeyUtil.nextFCode())
// .setNum(i == count && decimalValue.compareTo(BigDecimal.ZERO) > 0 ? decimalValue : item.getMinPackagingNum()) .setNum(item.getNum())
.setNum(NumberUtil.getPackageNum(item.getNum(), item.getMinPackagingNum(), item.getPackingNum(), i))
.setCreateBy(UserUtil.getUserName()) .setCreateBy(UserUtil.getUserName())
.setCreateTime(LocalDateTime.now()) .setCreateTime(LocalDateTime.now())
); );
}
materialCodeItemService.save(item); materialCodeItemService.save(item);
materialCodeService.lambdaUpdate() materialCodeService.lambdaUpdate()
.set(WmsShipmentMaterialCode::getStatus, 1) .set(WmsShipmentMaterialCode::getStatus, 1)
@ -342,37 +321,26 @@ public class MaterialCodeController extends BaseController {
public ApiResult<Void> updateItem(@Valid @RequestBody MaterialCodeItemUpdateQO qo) { public ApiResult<Void> updateItem(@Valid @RequestBody MaterialCodeItemUpdateQO qo) {
WmsShipmentMaterialCodeItem item = materialCodeItemService.getById(qo.getId()); WmsShipmentMaterialCodeItem item = materialCodeItemService.getById(qo.getId());
VUtil.trueThrowBusinessError(Objects.isNull(item)).throwMessage("清单明细不存在"); 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) VUtil.trueThrowBusinessError(item.getStatus() > 0)
.throwMessage("已装箱,不能修改"); .throwMessage("已装箱,不能修改");
List<WmsShipmentMaterialCodeItem> sameMaterialItems =
materialCodeItemService.getSameMaterialItems(item.getMaterialCodeId(), item.getMaterialNo(), item.getParentMaterialDescribe(), item.getProductionOrderNumber());
VUtil.trueThrowBusinessError(sameMaterialItems.size() > 1)
.throwMessage("存在多行物料编码、生产订单号、上级物料描述三个字段相同的情况,不允许修改");
item = Convert.convert(WmsShipmentMaterialCodeItem.class, qo); item = Convert.convert(WmsShipmentMaterialCodeItem.class, qo);
item.setUpdateBy(UserUtil.getUserName()); item.setUpdateBy(UserUtil.getUserName());
item.setUpdateTime(LocalDateTime.now()); item.setUpdateTime(LocalDateTime.now());
materialCodeItemService.updateById(item); materialCodeItemService.updateById(item);
materialCodeItemQrService.lambdaUpdate() materialCodeItemQrService.lambdaUpdate()
.set(WmsShipmentMaterialCodeItemQr::getNum, item.getNum())
.set(WmsShipmentMaterialCodeItemQr::getUpdateBy, UserUtil.getUserName())
.set(WmsShipmentMaterialCodeItemQr::getUpdateTime, LocalDateTime.now())
.eq(WmsShipmentMaterialCodeItemQr::getItemId, item.getId()) .eq(WmsShipmentMaterialCodeItemQr::getItemId, item.getId())
.remove(); .update();
// 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())
);
}
return ApiResult.success(); return ApiResult.success();
} }
@ -390,6 +358,9 @@ public class MaterialCodeController extends BaseController {
.stream() .stream()
.map(WmsShipmentMaterialCodeItem::getId) .map(WmsShipmentMaterialCodeItem::getId)
.collect(Collectors.toSet()); .collect(Collectors.toSet());
VUtil.trueThrowBusinessError(deleteIds.size() < ids.size()).throwMessage("已装箱的不可删除");
if (CollectionUtil.isNotEmpty(deleteIds)) { if (CollectionUtil.isNotEmpty(deleteIds)) {
materialCodeItemService.lambdaUpdate() materialCodeItemService.lambdaUpdate()
.in(WmsShipmentMaterialCodeItem::getId, deleteIds) .in(WmsShipmentMaterialCodeItem::getId, deleteIds)
@ -412,8 +383,7 @@ public class MaterialCodeController extends BaseController {
public ApiResult<Void> importItemFromExcel(@RequestParam Long materialCodeId, @RequestParam Boolean cover, @RequestParam("file") MultipartFile file) throws IOException { public ApiResult<Void> importItemFromExcel(@RequestParam Long materialCodeId, @RequestParam Boolean cover, @RequestParam("file") MultipartFile file) throws IOException {
WmsShipmentMaterialCode materialCode = materialCodeService.getById(materialCodeId); WmsShipmentMaterialCode materialCode = materialCodeService.getById(materialCodeId);
VUtil.trueThrowBusinessError(Objects.isNull(materialCode)).throwMessage("清单不存在"); VUtil.trueThrowBusinessError(Objects.isNull(materialCode)).throwMessage("清单不存在");
List<WmsShipmentMaterialCodeItem> dbItems = materialCodeItemService.lambdaQuery() List<WmsShipmentMaterialCodeItem> allDbItems = materialCodeItemService.lambdaQuery()
.select(WmsShipmentMaterialCodeItem::getId, WmsShipmentMaterialCodeItem::getMaterialNo, WmsShipmentMaterialCodeItem::getStatus)
.eq(WmsShipmentMaterialCodeItem::getMaterialCodeId, materialCodeId) .eq(WmsShipmentMaterialCodeItem::getMaterialCodeId, materialCodeId)
.list(); .list();
List<WmsShipmentMaterialCodeItemQr> qrsForAdd = new ArrayList<>(); List<WmsShipmentMaterialCodeItemQr> qrsForAdd = new ArrayList<>();
@ -422,6 +392,7 @@ public class MaterialCodeController extends BaseController {
List<WmsShipmentMaterialCodeItem> itemsForAdd = new ArrayList<>(); List<WmsShipmentMaterialCodeItem> itemsForAdd = new ArrayList<>();
List<WmsShipmentMaterialCodeItem> itemsForUpdate = new ArrayList<>(); List<WmsShipmentMaterialCodeItem> itemsForUpdate = new ArrayList<>();
List<String> repeats = new ArrayList<>(); List<String> repeats = new ArrayList<>();
List<String> dbExists = new ArrayList<>();
reader.sheet(0).rows().forEach(row -> { reader.sheet(0).rows().forEach(row -> {
log.debug("第{}行:{}", row.getRowNum(), row); log.debug("第{}行:{}", row.getRowNum(), row);
if (row.getRowNum() > 4 && StrUtil.isNotBlank(row.getString(1))) { if (row.getRowNum() > 4 && StrUtil.isNotBlank(row.getString(1))) {
@ -431,47 +402,49 @@ public class MaterialCodeController extends BaseController {
item.setMaterialNo(row.getString(1)); item.setMaterialNo(row.getString(1));
item.setMaterialDescribe(row.getString(2)); item.setMaterialDescribe(row.getString(2));
item.setNum(row.getDecimal(3)); item.setNum(row.getDecimal(3));
item.setActualNum(row.getDecimal(4)); item.setActualNum(BigDecimal.ZERO);
item.setMinPackagingNum(item.getActualNum()); item.setUnit(row.getString(4));
item.setUnit(row.getString(5)); item.setProjectType(row.getString(5));
item.setProjectType(row.getString(6)); item.setParentMaterialDescribe(row.getString(6));
item.setParentMaterialDescribe(row.getString(7)); item.setProductionOrderNumber(row.getString(7));
item.setProductionOrderNumber(row.getString(8));
item.setBoxNo(row.getString(9));
item.setPackingNum(1);
item.setPackingLeft(1);
if (itemsForAdd.stream().anyMatch(it -> it.getKey().equals(item.getKey()))) { if (itemsForAdd.stream().anyMatch(it -> it.getKey().equals(item.getKey()))) {
repeats.add(item.getMaterialNo()); repeats.add(item.getMaterialNo());
} else { } else {
List<WmsShipmentMaterialCodeItem> dbItems = allDbItems.stream()
.filter(it -> it.getKey().equals(item.getKey()))
.collect(Collectors.toList());
if (!cover) { if (!cover) {
if (CollectionUtil.isNotEmpty(dbItems)) {
dbExists.add(dbItems.get(0).getMaterialNo());
} else {
item.setCreateBy(UserUtil.getUserName()); item.setCreateBy(UserUtil.getUserName());
item.setCreateTime(LocalDateTime.now()); item.setCreateTime(LocalDateTime.now());
itemsForAdd.add(item); itemsForAdd.add(item);
qrsForAdd.add(new WmsShipmentMaterialCodeItemQr() qrsForAdd.add(new WmsShipmentMaterialCodeItemQr()
.setItemId(item.getId()) .setItemId(item.getId())
.setNo(KeyUtil.nextFCode()) .setNo(KeyUtil.nextFCode())
.setNum(item.getMinPackagingNum()) .setNum(item.getNum())
.setCreateBy(UserUtil.getUserName())
.setCreateTime(LocalDateTime.now())
);
}
} 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()) .setCreateBy(UserUtil.getUserName())
.setCreateTime(LocalDateTime.now()) .setCreateTime(LocalDateTime.now())
); );
} else { } else {
WmsShipmentMaterialCodeItem dbItem = dbItems.stream() if (dbItems.size() > 1) {
.filter(it -> it.getKey().equals(item.getKey())) dbExists.add(dbItems.get(0).getMaterialNo());
.findFirst() } else if (dbItems.get(0).getStatus() == 0) {
.orElse(null); item.setId(dbItems.get(0).getId());
if (Objects.isNull(dbItem)) {
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 if (dbItem.getStatus() == 0) {
item.setId(dbItem.getId());
item.setUpdateBy(UserUtil.getUserName()); item.setUpdateBy(UserUtil.getUserName());
item.setUpdateTime(LocalDateTime.now()); item.setUpdateTime(LocalDateTime.now());
itemsForUpdate.add(item); itemsForUpdate.add(item);
@ -487,7 +460,7 @@ public class MaterialCodeController extends BaseController {
qrsForUpdate.add( qrsForUpdate.add(
new WmsShipmentMaterialCodeItemQr() new WmsShipmentMaterialCodeItemQr()
.setId(iqrs.get(0).getId()) .setId(iqrs.get(0).getId())
.setNum(item.getMinPackagingNum()) .setNum(item.getNum())
.setCreateBy(UserUtil.getUserName()) .setCreateBy(UserUtil.getUserName())
.setCreateTime(LocalDateTime.now()) .setCreateTime(LocalDateTime.now())
); );
@ -495,7 +468,7 @@ public class MaterialCodeController extends BaseController {
qrsForAdd.add(new WmsShipmentMaterialCodeItemQr() qrsForAdd.add(new WmsShipmentMaterialCodeItemQr()
.setItemId(item.getId()) .setItemId(item.getId())
.setNo(KeyUtil.nextFCode()) .setNo(KeyUtil.nextFCode())
.setNum(item.getMinPackagingNum()) .setNum(item.getNum())
.setCreateBy(UserUtil.getUserName()) .setCreateBy(UserUtil.getUserName())
.setCreateTime(LocalDateTime.now()) .setCreateTime(LocalDateTime.now())
); );
@ -504,9 +477,14 @@ public class MaterialCodeController extends BaseController {
} }
} }
} }
}
}); });
VUtil.trueThrowBusinessError(CollectionUtil.isNotEmpty(repeats)) VUtil.trueThrowBusinessError(CollectionUtil.isNotEmpty(repeats))
.throwMessage("以下物料重复:" + StrUtil.join(",", repeats)); .throwMessage("以下物料重复:" + StrUtil.join(",", repeats));
VUtil.trueThrowBusinessError(CollectionUtil.isNotEmpty(dbExists))
.throwMessage(!cover ? "以下物料已存在:" + StrUtil.join(",", dbExists)
: "存在多行物料编码、生产订单号、上级物料描述三个字段相同的情况,不允许修改: " + dbExists);
if (CollectionUtil.isNotEmpty(itemsForAdd)) { if (CollectionUtil.isNotEmpty(itemsForAdd)) {
materialCodeItemService.saveBatch(itemsForAdd); materialCodeItemService.saveBatch(itemsForAdd);
materialCodeService.lambdaUpdate() materialCodeService.lambdaUpdate()

View File

@ -1,45 +1,40 @@
package com.nflg.wms.shipment.controller; package com.nflg.wms.shipment.controller;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert; 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 cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 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.ApiResult;
import com.nflg.wms.common.pojo.PageData; 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.qo.*;
import com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeQRVO; import com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeQRVO;
import com.nflg.wms.common.pojo.vo.ShipmentPackagingCodeVO; 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.UserUtil;
import com.nflg.wms.common.util.VUtil; import com.nflg.wms.common.util.VUtil;
import com.nflg.wms.repository.entity.DictionaryItem; import com.nflg.wms.repository.entity.*;
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.service.*; import com.nflg.wms.repository.service.*;
import com.nflg.wms.shipment.service.BasdeSerialNumberControllerService; import com.nflg.wms.shipment.service.BasdeSerialNumberControllerService;
import com.nflg.wms.shipment.util.HtmlToImageUtil; import com.nflg.wms.shipment.util.*;
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.starter.BaseController; import com.nflg.wms.starter.BaseController;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import jakarta.validation.constraints.NotEmpty; 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.HttpHeaders;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.core.io.ClassPathResource;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.math.BigDecimal;
import java.net.URL; import java.net.URL;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; import java.util.*;
@ -186,10 +181,25 @@ public class PackagingCodeController extends BaseController {
WmsShipmentPackagingCode info = packagingCodeService.getById(qo.getPackagingCodeId()); WmsShipmentPackagingCode info = packagingCodeService.getById(qo.getPackagingCodeId());
VUtil.trueThrowBusinessError(Objects.isNull(info)).throwMessage("包装箱不存在"); VUtil.trueThrowBusinessError(Objects.isNull(info)).throwMessage("包装箱不存在");
VUtil.trueThrowBusinessError(info.getStatus() == 2).throwMessage("该箱已发车"); VUtil.trueThrowBusinessError(info.getStatus() == 2).throwMessage("该箱已发车");
List<WmsShipmentMaterialCodeItemQr> items = materialCodeItemQrService.listByIds(qo.getMaterialQRIds()); List<Long> materialQRIds = qo.getMaterialInfos().stream().map(ShipmentPackingMaterialInfoQO::getMaterialQRId).collect(Collectors.toList());
VUtil.trueThrowBusinessError(items.size() != qo.getMaterialQRIds().size()).throwMessage("数据有变动,请重新扫码"); List<WmsShipmentMaterialCodeItemQr> itemQrs = materialCodeItemQrService.listByIds(materialQRIds);
items.removeIf(item -> item.getStatus() == 1); VUtil.trueThrowBusinessError(itemQrs.size() != materialQRIds.size()).throwMessage("数据有变动,请重新扫码");
if (CollectionUtil.isNotEmpty(items)) { itemQrs.removeIf(item -> item.getStatus() == 1);
Set<Long> itemIdSet = itemQrs.stream().map(WmsShipmentMaterialCodeItemQr::getItemId).collect(Collectors.toSet());
List<WmsShipmentMaterialCodeItem> items = materialCodeItemService.listByIds(itemIdSet);
Map<Long, Long> qrId2ItemIdMap = itemQrs.stream().collect(Collectors.toMap(WmsShipmentMaterialCodeItemQr::getId, WmsShipmentMaterialCodeItemQr::getItemId, (oldValue, newValue) -> newValue));
Map<Long, BigDecimal> itemId2ActualNumMap = new HashMap<>();
for (ShipmentPackingMaterialInfoQO materialInfoQO : qo.getMaterialInfos()) {
Long qrId = materialInfoQO.getMaterialQRId();
Long itemId = qrId2ItemIdMap.get(qrId);
itemId2ActualNumMap.put(itemId, materialInfoQO.getActualNum());
}
// 校验实际数量
Map<WmsShipmentMaterialCodeItem, BigDecimal> materialCodeItem2NewActualNumMap = checkActualNum(itemId2ActualNumMap, items);
if (CollectionUtil.isNotEmpty(itemQrs)) {
if (info.getStatus() == 0) { if (info.getStatus() == 0) {
packagingCodeService.lambdaUpdate() packagingCodeService.lambdaUpdate()
.set(WmsShipmentPackagingCode::getStatus, 1) .set(WmsShipmentPackagingCode::getStatus, 1)
@ -199,25 +209,81 @@ public class PackagingCodeController extends BaseController {
.eq(WmsShipmentPackagingCode::getStatus, 0) .eq(WmsShipmentPackagingCode::getStatus, 0)
.update(); .update();
} }
items.forEach(item -> { itemQrs.forEach(item -> {
item.setStatus(1); item.setStatus(1);
item.setUpdateBy(UserUtil.getUserName()); item.setUpdateBy(UserUtil.getUserName());
item.setUpdateTime(LocalDateTime.now()); item.setUpdateTime(LocalDateTime.now());
}); });
packagingCodeItemService.saveBatch( packagingCodeItemService.saveBatch(
items.stream().map(it -> new WmsShipmentPackagingCodeItem() itemQrs.stream().map(it -> new WmsShipmentPackagingCodeItem()
.setPackagingCodeId(qo.getPackagingCodeId()) .setPackagingCodeId(qo.getPackagingCodeId())
.setMaterialCodeItemQrId(it.getId()) .setMaterialCodeItemQrId(it.getId())
.setCreateBy(UserUtil.getUserName()) .setCreateBy(UserUtil.getUserName())
.setCreateTime(LocalDateTime.now()) .setCreateTime(LocalDateTime.now())
).toList() ).toList()
); );
materialCodeItemQrService.updateBatchById(items); materialCodeItemQrService.updateBatchById(itemQrs);
materialCodeItemService.updatePackingNum(items.stream().map(WmsShipmentMaterialCodeItemQr::getItemId).collect(Collectors.toSet())); materialCodeItemService.updateStatusAndBoxNoAndActualNum(items, 2, info.getNo(), null, itemId2ActualNumMap);
addMaterialCodeItemIfNumBigThenActualNum(materialCodeItem2NewActualNumMap);
} }
return ApiResult.success(); return ApiResult.success();
} }
private void addMaterialCodeItemIfNumBigThenActualNum(Map<WmsShipmentMaterialCodeItem, BigDecimal> materialCodeItem2NewActualNumMap) {
if (CollectionUtil.isNotEmpty(materialCodeItem2NewActualNumMap)) {
for (WmsShipmentMaterialCodeItem item : materialCodeItem2NewActualNumMap.keySet()) {
if (item.getNum().compareTo(materialCodeItem2NewActualNumMap.get(item)) > 0) {
List<WmsShipmentMaterialCodeItem> 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<WmsShipmentMaterialCodeItem, BigDecimal> checkActualNum(Map<Long, BigDecimal> itemId2ActualNumMap, List<WmsShipmentMaterialCodeItem> items) {
Map<WmsShipmentMaterialCodeItem, BigDecimal> materialCodeItem2NewActualNumMap = new HashMap<>();
for (WmsShipmentMaterialCodeItem item : items) {
List<WmsShipmentMaterialCodeItem> 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使用 * 装箱打包PC使用
*/ */
@ -229,12 +295,12 @@ public class PackagingCodeController extends BaseController {
.filter(Objects::nonNull) .filter(Objects::nonNull)
.map(ShipmentMaterialCodeQRVO::getId) .map(ShipmentMaterialCodeQRVO::getId)
.toList(); .toList();
List<WmsShipmentMaterialCodeItemQr> items = materialCodeItemQrService.lambdaQuery() List<WmsShipmentMaterialCodeItemQr> itemQrs = materialCodeItemQrService.lambdaQuery()
.in(WmsShipmentMaterialCodeItemQr::getId, ids) .in(WmsShipmentMaterialCodeItemQr::getId, ids)
.list(); .list();
VUtil.trueThrowBusinessError(items.size() != ids.size()).throwMessage("数据有变动,请重新扫码"); VUtil.trueThrowBusinessError(itemQrs.size() != ids.size()).throwMessage("数据有变动,请重新扫码");
items.removeIf(item -> item.getStatus() == 1); itemQrs.removeIf(item -> item.getStatus() == 1);
if (CollectionUtil.isEmpty(items)) { if (CollectionUtil.isEmpty(itemQrs)) {
return ApiResult.success(); return ApiResult.success();
} }
WmsShipmentPackagingCode info = packagingCodeService.getById(shipmentPCPackingQO.getPackagingCodeId()); WmsShipmentPackagingCode info = packagingCodeService.getById(shipmentPCPackingQO.getPackagingCodeId());
@ -249,24 +315,29 @@ public class PackagingCodeController extends BaseController {
.eq(WmsShipmentPackagingCode::getStatus, 0) .eq(WmsShipmentPackagingCode::getStatus, 0)
.update(); .update();
} }
items.forEach(item -> { itemQrs.forEach(item -> {
item.setStatus(1); item.setStatus(1);
item.setUpdateBy(UserUtil.getUserName()); item.setUpdateBy(UserUtil.getUserName());
item.setUpdateTime(LocalDateTime.now()); item.setUpdateTime(LocalDateTime.now());
}); });
packagingCodeItemService.saveBatch( packagingCodeItemService.saveBatch(
items.stream().map(it -> new WmsShipmentPackagingCodeItem() itemQrs.stream().map(it -> new WmsShipmentPackagingCodeItem()
.setPackagingCodeId(shipmentPCPackingQO.getPackagingCodeId()) .setPackagingCodeId(shipmentPCPackingQO.getPackagingCodeId())
.setMaterialCodeItemQrId(it.getId()) .setMaterialCodeItemQrId(it.getId())
.setCreateBy(UserUtil.getUserName()) .setCreateBy(UserUtil.getUserName())
.setCreateTime(LocalDateTime.now()) .setCreateTime(LocalDateTime.now())
).toList() ).toList()
); );
materialCodeItemQrService.updateBatchById(items); materialCodeItemQrService.updateBatchById(itemQrs);
materialCodeItemService.updatePackingNum(items.stream()
.map(WmsShipmentMaterialCodeItemQr::getItemId) Set<Long> itemIdSet = itemQrs.stream().map(WmsShipmentMaterialCodeItemQr::getItemId).collect(Collectors.toSet());
.collect(Collectors.toSet()) List<WmsShipmentMaterialCodeItem> items = materialCodeItemService.listByIds(itemIdSet);
);
Map<Long, BigDecimal> itemId2ActualNumMap = items.stream()
.collect(Collectors.toMap(WmsShipmentMaterialCodeItem::getId, WmsShipmentMaterialCodeItem::getNum));
materialCodeItemService.updateStatusAndBoxNoAndActualNum(items, 2, info.getNo(),null, itemId2ActualNumMap);
return ApiResult.success(); return ApiResult.success();
} }
@ -306,7 +377,9 @@ public class PackagingCodeController extends BaseController {
.eq(WmsShipmentMaterialCodeItemQr::getStatus, 1) .eq(WmsShipmentMaterialCodeItemQr::getStatus, 1)
.in(WmsShipmentMaterialCodeItemQr::getId, item.getMaterialCodeItemQrId()) .in(WmsShipmentMaterialCodeItemQr::getId, item.getMaterialCodeItemQrId())
.update(); .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()); packagingCodeService.updateStatus(item.getPackagingCodeId());
} }
} }
@ -314,7 +387,7 @@ public class PackagingCodeController extends BaseController {
} }
/** /**
* 拆箱&添加物料PDA使用 * 拆箱添加物料PDA使用
*/ */
@Transactional @Transactional
@PostMapping("unpack") @PostMapping("unpack")
@ -322,11 +395,28 @@ public class PackagingCodeController extends BaseController {
WmsShipmentPackagingCode info = packagingCodeService.getById(qo.getPackagingCodeId()); WmsShipmentPackagingCode info = packagingCodeService.getById(qo.getPackagingCodeId());
VUtil.trueThrowBusinessError(Objects.isNull(info)).throwMessage("包装箱不存在"); VUtil.trueThrowBusinessError(Objects.isNull(info)).throwMessage("包装箱不存在");
VUtil.trueThrowBusinessError(info.getStatus() >= 2).throwMessage("该箱已装车"); VUtil.trueThrowBusinessError(info.getStatus() >= 2).throwMessage("该箱已装车");
if (CollectionUtil.isNotEmpty(qo.getMaterialQRIdsForAdd())) {
List<Long> materialQRIds = qo.getMaterialInfosForAdd().stream().map(ShipmentUnPackingMaterialInfoQO::getMaterialQRId).collect(Collectors.toList());
if (CollectionUtil.isNotEmpty(materialQRIds)) {
List<WmsShipmentMaterialCodeItemQr> qrs = materialCodeItemQrService.lambdaQuery() List<WmsShipmentMaterialCodeItemQr> qrs = materialCodeItemQrService.lambdaQuery()
.eq(WmsShipmentMaterialCodeItemQr::getStatus, 0) .eq(WmsShipmentMaterialCodeItemQr::getStatus, 0)
.in(WmsShipmentMaterialCodeItemQr::getId, qo.getMaterialQRIdsForAdd()) .in(WmsShipmentMaterialCodeItemQr::getId, materialQRIds)
.list(); .list();
Set<Long> itemIdSet = qrs.stream().map(WmsShipmentMaterialCodeItemQr::getItemId).collect(Collectors.toSet());
List<WmsShipmentMaterialCodeItem> items = materialCodeItemService.listByIds(itemIdSet);
Map<Long, Long> qrId2ItemIdMap = qrs.stream().collect(Collectors.toMap(WmsShipmentMaterialCodeItemQr::getId, WmsShipmentMaterialCodeItemQr::getItemId, (oldValue, newValue) -> newValue));
Map<Long, BigDecimal> itemId2ActualNumMap = new HashMap<>();
for (ShipmentUnPackingMaterialInfoQO materialInfoQO : qo.getMaterialInfosForAdd()) {
Long qrId = materialInfoQO.getMaterialQRId();
Long itemId = qrId2ItemIdMap.get(qrId);
itemId2ActualNumMap.put(itemId, materialInfoQO.getActualNum());
}
// 校验实际数量
Map<WmsShipmentMaterialCodeItem, BigDecimal> materialCodeItem2NewActualNumMap = checkActualNum(itemId2ActualNumMap, items);
if (CollectionUtil.isNotEmpty(qrs)) { if (CollectionUtil.isNotEmpty(qrs)) {
if (info.getStatus() == 0) { if (info.getStatus() == 0) {
packagingCodeService.lambdaUpdate() packagingCodeService.lambdaUpdate()
@ -351,35 +441,11 @@ public class PackagingCodeController extends BaseController {
).toList() ).toList()
); );
materialCodeItemQrService.updateBatchById(qrs); 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<WmsShipmentPackagingCodeItem> 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<WmsShipmentMaterialCodeItemQr> 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()); packagingCodeService.updateStatus(qo.getPackagingCodeId());
return ApiResult.success(); return ApiResult.success();
} }

View File

@ -59,26 +59,11 @@ public class MaterialCodeItemVO {
*/ */
private String boxNo; private String boxNo;
/**
* 最小包装量
*/
private BigDecimal minPackagingNum;
/** /**
* 状态0未装箱1装箱中2已装箱 * 状态0未装箱1装箱中2已装箱
*/ */
private Integer status; private Integer status;
/**
* 打包箱数量
*/
private Integer packingNum;
/**
* 剩余打包箱数量
*/
private Integer packingLeft;
/** /**
* 创建人 * 创建人
*/ */