Merge remote-tracking branch 'origin/master-hlq20260506ganggoubao'

# Conflicts:
#	nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/StructuralPackageOrderController.java
This commit is contained in:
10001392 2026-05-29 11:01:21 +08:00
commit 1c472cd0a7
26 changed files with 1368 additions and 163 deletions

View File

@ -2,30 +2,32 @@ package com.nflg.wms.admin.service;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.Pair;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.nflg.wms.admin.pojo.dto.PdfPageDTO;
import com.nflg.wms.admin.pojo.dto.ZWM3A17DTO;
import com.nflg.wms.admin.pojo.dto.ZWM3A17Item1DTO;
import com.nflg.wms.admin.util.PdfGeneratorUtil;
import com.nflg.wms.admin.util.QRCodeUtil;
import com.nflg.wms.admin.util.ThymeleafUtil;
import com.nflg.wms.common.constant.Constant;
import com.nflg.wms.common.constant.STATE;
import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.dto.*;
import com.nflg.wms.common.pojo.dto.BomMaterialDTO;
import com.nflg.wms.common.pojo.dto.PackageMaterialDTO;
import com.nflg.wms.common.pojo.dto.PackageMaterialExcelExportDTO;
import com.nflg.wms.common.pojo.dto.PackageMaterialExcelImportDTO;
import com.nflg.wms.common.pojo.qo.*;
import com.nflg.wms.common.pojo.vo.PackageVO;
import com.nflg.wms.common.util.DateTimeUtil;
import com.nflg.wms.common.util.EecExcelUtil;
import com.nflg.wms.common.util.UserUtil;
import com.nflg.wms.common.util.VUtil;
import com.nflg.wms.repository.entity.*;
import com.nflg.wms.repository.entity.WmsInTaskItem;
import com.nflg.wms.repository.entity.WmsMaterial;
import com.nflg.wms.repository.entity.WmsModel;
import com.nflg.wms.repository.entity.WmsStructuralPackage;
import com.nflg.wms.repository.service.*;
import com.nflg.wms.starter.service.BomMaterialService;
import com.nflg.wms.starter.service.FileUploadService;
@ -184,8 +186,8 @@ public class StructuralPackageControllerService {
.addSheet(new ListSheet<>(List.of(new PackageMaterialExcelExportDTO()
.setNo("(必填)零件编码")
.setName("(必填)零件名称")
.setStation("(必填)工位序号")
.setTray("(必填)托盘序号")
// .setStation("(必填)工位序号")
// .setTray("(必填)托盘序号")
.setWeight(BigDecimal.ZERO)
.setNum(BigDecimal.ZERO)
.setVersion("(必填)图纸版本"))))
@ -200,8 +202,8 @@ public class StructuralPackageControllerService {
datas.add(new PackageMaterialExcelExportDTO()
.setNo("(必填)零件编码")
.setName("(必填)零件名称")
.setStation("(必填)工位序号")
.setTray("(必填)托盘序号")
// .setStation("(必填)工位序号")
// .setTray("(必填)托盘序号")
.setWeight(BigDecimal.ZERO)
.setNum(BigDecimal.ZERO)
.setVersion("(必填)图纸版本"));
@ -250,16 +252,16 @@ public class StructuralPackageControllerService {
} else {
materialDTO.setName(dto.getName());
}
if (StrUtil.isBlank(dto.getStation())) {
/*if (StrUtil.isBlank(dto.getStation())) {
sb.append("工位序号不能为空;");
} else {
} else {*/
materialDTO.setStation(dto.getStation());
}
/*}
if (StrUtil.isBlank(dto.getTray())) {
sb.append("托盘序号不能为空;");
} else {
} else {*/
materialDTO.setTray(dto.getTray());
}
// }
if (StrUtil.isBlank(dto.getNum())) {
sb.append("数量不能为空;");
} else if (!NumberUtils.isCreatable(dto.getNum())) {
@ -353,8 +355,12 @@ public class StructuralPackageControllerService {
&& packageService.lambdaQuery().eq(WmsStructuralPackage::getNo, packageInfo.getNo()).exists())
.throwMessage("修改日志不能为空");
break;
case 6:
BigDecimal trayNum = row.getDecimal(1);
packageInfo.setTrayNum(trayNum);
break;
default:
if (row.getRowNum() > 7) {
if (row.getRowNum() > 8) {
String mno = StrUtil.trim(row.getString(0));
if (StrUtil.isBlank(mno)) {
// sb.append(StrUtil.format("第{}行零件编码不能为空;", row.getRowNum()));
@ -370,15 +376,14 @@ public class StructuralPackageControllerService {
dto.setName(material1.getDescribe());
dto.setDrawingNo(material1.getDrawingNo());
dto.setImage(material1.getImage());
String v = row.getString(6);
String v = row.getString(5);
if (StrUtil.isNotBlank(v)) {
dto.setVersion(v);
} else {
dto.setVersion(material1.getVersion());
}
dto.setStation(row.getString(2));
dto.setTray(row.getString(3));
String num = row.getString(4);
String num = row.getString(3);
if (StrUtil.isBlank(num)) {
sb.append(StrUtil.format("第{}行数量不能为空;", row.getRowNum()));
} else if (!NumberUtils.isCreatable(num)) {
@ -386,13 +391,13 @@ public class StructuralPackageControllerService {
} else {
dto.setNum(new BigDecimal(num));
}
num = row.getString(5);
if (StrUtil.isBlank(num)) {
String singleWeight = row.getString(4);
if (StrUtil.isBlank(singleWeight)) {
sb.append(StrUtil.format("第{}行重量不能为空;", row.getRowNum()));
} else if (!NumberUtils.isCreatable(num)) {
} else if (!NumberUtils.isCreatable(singleWeight)) {
sb.append(StrUtil.format("第{}行重量无效;", row.getRowNum()));
} else {
dto.setWeight(new BigDecimal(num));
dto.setWeight(new BigDecimal(singleWeight));
}
dto.setCreateBy(UserUtil.getUserName());
dto.setCreateTime(DateTimeUtil.format(LocalDate.now(), "yyyy-MM-dd"));

View File

@ -49,8 +49,7 @@ public class NoUtil {
return new StructuralPackageMaterialQRCodeContentDTO()
.setUniqNo(c1s.size() == 1 ? qrCode : CollectionUtil.get(c1s, 0))
.setMaterialNo(c1s.size() == 1 ? CollectionUtil.get(c1s, 0) : CollectionUtil.get(c1s, 1))
.setTrayNo(CollectionUtil.get(contents, 1))
.setNum(new BigDecimal(CollectionUtil.get(contents, 2)))
.setNum(new BigDecimal(CollectionUtil.get(contents, 1)))
.setContent(qrCode);
}
}

View File

@ -109,7 +109,8 @@
<tr>
<td>订单号:<span th:text="${info.externalOrderNo}">12255665451615</span></td>
<td>行号:<span th:text="${info.rowNo}">1111</span></td>
<td>托盘号:<span th:text="${info.trayNo}">1111</span></td>
<!-- 托盘号已移除,保留空单元格 -->
<td></td>
<td colspan="2">供应商:<span th:text="${info.supplierName}">1111</span></td>
<td rowspan="3" class="cell-img" style="width: 130px;">
<img alt="" style="width: 100px;" th:src="${info.qrCode}" src="../img/logo1.png"/>
@ -149,4 +150,4 @@
</div>
</div>
</body>
</html>
</html>

View File

@ -0,0 +1,52 @@
package com.nflg.wms.common.pojo.qo;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serializable;
/**
* 差异项QO
*/
@Data
public class DiffItemQO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 物料编号
*/
@NotBlank(message = "物料编号不能为空")
private String materialNo;
/**
* 物料描述
*/
@NotBlank(message = "物料描述不能为空")
private String materialDesc;
/**
* 出货数量
*/
@NotNull(message = "出货数量不能为空")
private Integer shipmentNum;
/**
* 已装数量
*/
@NotNull(message = "已装数量不能为空")
private Integer actualQty;
/**
* 差异数量
*/
@NotNull(message = "差异数量不能为空")
private Integer diffQty;
/**
* 差异原因描述必填
*/
@NotBlank(message = "差异原因不能为空")
private String remark;
}

View File

@ -1,5 +1,6 @@
package com.nflg.wms.common.pojo.qo;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
@ -14,6 +15,12 @@ public class GenerateTrayQO {
@NotNull
private Long packageId;
/**
* 供应商代码6位数字
*/
@NotBlank
private String supplierCode;
/**
* 数量
*/

View File

@ -0,0 +1,34 @@
package com.nflg.wms.common.pojo.qo;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serializable;
/**
* 物料汇总QO按物料编号统计
*/
@Data
public class MaterialSummaryQO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 物料编号
*/
@NotBlank(message = "物料编号不能为空")
private String materialNo;
/**
* 物料描述
*/
@NotBlank(message = "物料描述不能为空")
private String materialDesc;
/**
* 所有托盘该物料的总数量
*/
@NotNull(message = "物料总数量不能为空")
private Integer totalQty;
}

View File

@ -0,0 +1,38 @@
package com.nflg.wms.common.pojo.qo;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* 钢构件打包提交QO
*/
@Data
public class PackTraySubmitQO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 订单ID
*/
@NotNull(message = "订单ID不能为空")
private Long orderId;
/**
* 托盘列表
*/
@NotEmpty(message = "托盘列表不能为空")
@Valid
private List<TraySubmitQO> trays;
/**
* 物料汇总列表按物料编号统计的总数量
*/
@NotEmpty(message = "物料汇总列表不能为空")
@Valid
private List<MaterialSummaryQO> materialSummary;
}

View File

@ -0,0 +1,38 @@
package com.nflg.wms.common.pojo.qo;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* 钢构件打包提交带差异原因QO
*/
@Data
public class PackTraySubmitWithDiffQO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 订单ID
*/
@NotNull(message = "订单ID不能为空")
private Long orderId;
/**
* 托盘列表
*/
@NotEmpty(message = "托盘列表不能为空")
@Valid
private List<TraySubmitQO> trays;
/**
* 差异列表
*/
@NotEmpty(message = "差异列表不能为空")
@Valid
private List<DiffItemQO> diffList;
}

View File

@ -0,0 +1,40 @@
package com.nflg.wms.common.pojo.qo;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* 托盘物料QO
*/
@Data
public class TrayMaterialQO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 物料编号
*/
@NotBlank(message = "物料编号不能为空")
private String materialNo;
/**
* 物料描述
*/
@NotBlank(message = "物料描述不能为空")
private String materialDesc;
/**
* 二维码列表该物料的所有条码
*/
private List<String> qrCodes;
/**
* 该物料的总数量
*/
@NotNull(message = "物料数量不能为空")
private Integer totalQty;
}

View File

@ -0,0 +1,38 @@
package com.nflg.wms.common.pojo.qo;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* 托盘提交QO
*/
@Data
public class TraySubmitQO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 托盘号
*/
@NotBlank(message = "托盘号不能为空")
private String trayNo;
/**
* 订单ID
*/
@NotNull(message = "订单ID不能为空")
private Long orderId;
/**
* 托盘内物料明细
*/
@NotEmpty(message = "物料明细不能为空")
@Valid
private List<TrayMaterialQO> items;
}

View File

@ -0,0 +1,25 @@
package com.nflg.wms.common.pojo.qo;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.math.BigDecimal;
/**
* 修改钢构包订单托盘数量请求对象
*/
@Data
public class UpdatePackageTrayNumQO {
/**
* 钢构包订单ID
*/
@NotNull(message = "钢构包订单ID不能为空")
private Long orderId;
/**
* 托盘数量
*/
@NotNull(message = "托盘数量不能为空")
private BigDecimal trayNum;
}

View File

@ -5,6 +5,7 @@ import lombok.Data;
import lombok.experimental.Accessors;
import org.ttzero.excel.annotation.ExcelColumn;
import java.math.BigDecimal;
import java.util.Objects;
@Data
@ -63,6 +64,11 @@ public class DeliverStructuralPackageOrderExtendVO extends DeliverStructuralPack
*/
private Short totalNum;
/**
* 托盘数量
*/
private BigDecimal trayNum;
public String getStateDesc() {
if (Objects.isNull(state)) {
return "";

View File

@ -8,6 +8,11 @@ import java.util.List;
@Data
public class DeliverStructuralPackageOrderTrayVO {
/**
* 订单ID
*/
private Long orderId;
/**
* 供应商代码
*/

View File

@ -0,0 +1,43 @@
package com.nflg.wms.common.pojo.vo;
import lombok.Data;
import java.io.Serializable;
/**
* 差异项VO
*/
@Data
public class DiffItemVO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 物料编号
*/
private String materialNo;
/**
* 物料描述
*/
private String materialDesc;
/**
* 出货数量
*/
private Integer shipmentNum;
/**
* 已装数量
*/
private Integer actualQty;
/**
* 差异数量
*/
private Integer diffQty;
/**
* 差异原因描述必填
*/
private String remark;
}

View File

@ -0,0 +1,29 @@
package com.nflg.wms.common.pojo.vo;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* 打包提交返回结果VO
*/
@Data
public class PackTraySubmitResultVO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 是否有差异
*/
private Boolean hasDiff;
/**
* 差异列表如果有差异
*/
private List<DiffItemVO> diffList;
/**
* 提示信息
*/
private String message;
}

View File

@ -0,0 +1,29 @@
package com.nflg.wms.common.pojo.vo;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* 钢构件打包提交带差异原因VO
*/
@Data
public class PackTraySubmitWithDiffVO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 订单ID
*/
private Long orderId;
/**
* 托盘列表
*/
private List<TrayItemVO2> trays;
/**
* 差异列表
*/
private List<DiffItemVO> diffList;
}

View File

@ -58,6 +58,11 @@ public class PackageVO {
*/
private BigDecimal weight;
/**
* 托盘数量
*/
private BigDecimal trayNum;
/**
* 种类
*/

View File

@ -0,0 +1,30 @@
package com.nflg.wms.common.pojo.vo;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* 托盘项VO
*/
@Data
public class TrayItemVO2 implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 托盘号
*/
private String trayNo;
/**
* 订单ID
*/
private Long orderId;
/**
* 托盘内物料明细
*/
private List<TrayMaterialVO> items;
}

View File

@ -0,0 +1,34 @@
package com.nflg.wms.common.pojo.vo;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* 托盘物料VO
*/
@Data
public class TrayMaterialVO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 物料编号
*/
private String materialNo;
/**
* 物料描述
*/
private String materialDesc;
/**
* 二维码列表该物料的所有条码
*/
private List<String> qrCodes;
/**
* 该物料的总数量
*/
private Integer totalQty;
}

View File

@ -20,4 +20,9 @@ public interface WmsStructuralPackageOrderTrayItemMapper extends BaseMapper<WmsS
List<DeliverStructuralPackageOrderTrayItemVO> getListByTrayId(Long id);
List<DeliverStructuralPackageOrderTrayItemSimpleVO> getSimpleListByTrayNo(String trayNo);
/**
* 根据订单ID获取物料项列表不依赖托盘关联
*/
List<DeliverStructuralPackageOrderTrayItemVO> getListByOrderId(Long orderId);
}

View File

@ -31,4 +31,9 @@ public interface IWmsStructuralPackageOrderTrayItemService extends IService<WmsS
List<DeliverStructuralPackageOrderTrayItemSimpleVO> getSimpleListByTrayNo(@Valid @NotBlank String trayNo);
List<WmsStructuralPackageOrderTrayItem> getListByTrayId(Long id);
/**
* 根据订单ID获取物料项列表不依赖托盘关联
*/
List<DeliverStructuralPackageOrderTrayItemVO> getListVOByOrderId(@Valid @NotNull Long orderId);
}

View File

@ -54,4 +54,9 @@ public class WmsStructuralPackageOrderTrayItemServiceImpl extends ServiceImpl<Wm
public List<WmsStructuralPackageOrderTrayItem> getListByTrayId(Long id) {
return lambdaQuery().eq(WmsStructuralPackageOrderTrayItem::getTrayId, id).list();
}
@Override
public List<DeliverStructuralPackageOrderTrayItemVO> getListVOByOrderId(Long orderId) {
return baseMapper.getListByOrderId(orderId);
}
}

View File

@ -21,4 +21,16 @@
where ot.no=#{trayNo}
order by oti.id
</select>
<select id="getListByOrderId" resultType="com.nflg.wms.common.pojo.vo.DeliverStructuralPackageOrderTrayItemVO">
SELECT ROW_NUMBER() OVER (ORDER BY oti.id) AS "index",m.image,m.drawing_no,oti.*,ot."no" as "tray_no",ot."state",
sp."no" as "package_no",sp."name" as "package_desc"
FROM wms_structural_package_order o
INNER JOIN wms_structural_package_order_tray_item oti ON o."id"=oti.order_id
LEFT JOIN wms_structural_package_order_tray ot ON oti.tray_id=ot."id"
LEFT JOIN wms_structural_package sp ON o.package_id=sp."id"
LEFT JOIN wms_material m ON oti.material_no=m."no" and oti."version"=m."version"
where o.id=#{orderId}
order by oti.id
</select>
</mapper>

View File

@ -3,17 +3,19 @@
<mapper namespace="com.nflg.wms.repository.mapper.WmsStructuralPackageOrderTrayMapper">
<select id="searchByState" resultType="com.nflg.wms.common.pojo.vo.DeliverStructuralPackageOrderExtendVO">
SELECT ROW_NUMBER() OVER (ORDER BY o.id desc) AS "index",ot.id,o.*,m.no||wb."no" AS "workbench_code"
SELECT ROW_NUMBER() OVER (ORDER BY o.id desc) AS "index",o.*,m.no||wb."no" AS "workbench_code"
,us.supplier_code,us.supplier_name,sp.order_no AS "package_order_no",sp."no" AS "package_no"
,sp."name" AS "package_desc",m."no" AS "model_no",ot.no as "tray_no",ot.tray,ot.station,ot.state,spdom.deliver_id
,sp."name" AS "package_desc",(SELECT COUNT(*) FROM wms_structural_package_order_tray ot WHERE ot.order_id=o.id) AS "trayNum",m."no" AS "model_no",'' as "tray_no",null as "tray",spdom.deliver_id
FROM wms_structural_package_order o
LEFT JOIN wms_workbench wb ON o.workbench_id=wb."id"
LEFT JOIN user_supplier us ON o.supplier_id=us.id
LEFT JOIN wms_structural_package sp ON o.package_id=sp."id"
LEFT JOIN wms_model m on o.model_id=m."id"
inner join wms_structural_package_order_tray ot on o.id=ot.order_id
left join wms_structural_package_deliver_order_map spdom on o.id=spdom.order_id
where ot.state=#{request.state}
where 1=1
<if test="request.state!=null">
and exists (select 1 from wms_structural_package_order_tray ot where ot.order_id=o.id and ot.state=#{request.state})
</if>
<if test="request.orderNo!=null and request.orderNo!=''">
and o.order_no=#{request.orderNo}
</if>
@ -27,7 +29,7 @@
and o.external_order_no=#{request.externalOrderNo}
</if>
<if test="request.trayNo!=null and request.trayNo!=''">
and ot.no=#{request.trayNo}
and exists (select 1 from wms_structural_package_order_tray ot where ot.order_id=o.id and ot.no=#{request.trayNo})
</if>
<if test="request.startDate!=null">
and o.create_time>= #{request.startDate}
@ -81,7 +83,7 @@
</select>
<select id="getInfoByNo" resultType="com.nflg.wms.common.pojo.vo.DeliverStructuralPackageOrderTrayVO">
SELECT o.external_order_no,o.row_no,sp."no" AS "package_no",sp."name" AS "package_desc",ot.num,us.supplier_name
SELECT ot.order_id,o.external_order_no,o.row_no,sp."no" AS "package_no",sp."name" AS "package_desc",ot.num,us.supplier_name
,us.supplier_code,ot.state
FROM wms_structural_package_order o
LEFT JOIN wms_workbench wb ON o.workbench_id=wb."id"