feat(controller): 新增钢构件订单管理功能

- 实现钢构件订单的搜索、保存、删除等基础操作
- 添加托盘生成功能和订单托盘详情查询接口
- 集成SAP订单搜索功能和供应商信息关联
- 实现订单导出功能包括PDF和Excel格式
- 添加二维码生成和物料扫描记录功能
- 实现打包流程和送货单创建功能
- 添加零件标签、托盘标签、齐套标签导出功能
- 集成条码扫描和库存管理相关服务
This commit is contained in:
曹鹏飞 2026-03-31 09:59:16 +08:00
parent 194e3c8a75
commit 3fccb47858
9 changed files with 89 additions and 21 deletions

View File

@ -53,6 +53,7 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import org.ttzero.excel.entity.ListMapSheet; import org.ttzero.excel.entity.ListMapSheet;
import org.ttzero.excel.entity.ListSheet;
import org.ttzero.excel.entity.Workbook; import org.ttzero.excel.entity.Workbook;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
@ -132,6 +133,7 @@ public class StructuralPackageOrderController extends BaseController {
/** /**
* 搜索SAP订单 * 搜索SAP订单
*
* @param request 请求参数 * @param request 请求参数
*/ */
@PostMapping("searchSAPOrder") @PostMapping("searchSAPOrder")
@ -349,6 +351,7 @@ public class StructuralPackageOrderController extends BaseController {
/** /**
* 搜索 * 搜索
*
* @param request 请求参数 * @param request 请求参数
*/ */
@PostMapping("search") @PostMapping("search")
@ -358,6 +361,7 @@ public class StructuralPackageOrderController extends BaseController {
/** /**
* 根据单据号获取列表 * 根据单据号获取列表
*
* @param orderNo 单据号 * @param orderNo 单据号
*/ */
@GetMapping("getList") @GetMapping("getList")
@ -367,6 +371,7 @@ public class StructuralPackageOrderController extends BaseController {
/** /**
* 获取订单托盘详情 * 获取订单托盘详情
*
* @param id 订单id * @param id 订单id
*/ */
@GetMapping("getTrayInfo") @GetMapping("getTrayInfo")
@ -399,6 +404,7 @@ public class StructuralPackageOrderController extends BaseController {
/** /**
* 删除 * 删除
*
* @param ids 要删除的id列表 * @param ids 要删除的id列表
*/ */
@PostMapping("delete") @PostMapping("delete")
@ -409,6 +415,7 @@ public class StructuralPackageOrderController extends BaseController {
/** /**
* 根据订单状态搜索 * 根据订单状态搜索
*
* @param request 请求参数 * @param request 请求参数
*/ */
@PostMapping("searchByState") @PostMapping("searchByState")
@ -418,6 +425,7 @@ public class StructuralPackageOrderController extends BaseController {
/** /**
* 导出选中的id列表 * 导出选中的id列表
*
* @param ids id列表 * @param ids id列表
*/ */
@PostMapping("exportByIds") @PostMapping("exportByIds")
@ -428,6 +436,7 @@ public class StructuralPackageOrderController extends BaseController {
/** /**
* 导出搜索结果 * 导出搜索结果
*
* @param request 搜索参数 * @param request 搜索参数
*/ */
@PostMapping("exportSearchByState") @PostMapping("exportSearchByState")
@ -441,6 +450,7 @@ public class StructuralPackageOrderController extends BaseController {
/** /**
* 获取托盘零件列表 * 获取托盘零件列表
*
* @param id 托盘id * @param id 托盘id
*/ */
@GetMapping("getItems") @GetMapping("getItems")
@ -450,6 +460,7 @@ public class StructuralPackageOrderController extends BaseController {
/** /**
* 导出托盘零件列表 * 导出托盘零件列表
*
* @param id 托盘id * @param id 托盘id
*/ */
@PostMapping("exportItems") @PostMapping("exportItems")
@ -460,6 +471,7 @@ public class StructuralPackageOrderController extends BaseController {
/** /**
* 导出老鼠图PDF * 导出老鼠图PDF
*
* @param id 托盘id * @param id 托盘id
*/ */
@GetMapping("exportPdf") @GetMapping("exportPdf")
@ -502,6 +514,7 @@ public class StructuralPackageOrderController extends BaseController {
/** /**
* 导出零件标签PDF * 导出零件标签PDF
*
* @param id 托盘id * @param id 托盘id
*/ */
@GetMapping("exportItemPdf") @GetMapping("exportItemPdf")
@ -537,6 +550,7 @@ public class StructuralPackageOrderController extends BaseController {
/** /**
* 导出零件标签图片ZIP * 导出零件标签图片ZIP
*
* @param id 托盘id * @param id 托盘id
*/ */
@GetMapping(value = "exportItemImageZip", produces = "application/zip") @GetMapping(value = "exportItemImageZip", produces = "application/zip")
@ -586,6 +600,7 @@ public class StructuralPackageOrderController extends BaseController {
/** /**
* 导出托盘标签PDF * 导出托盘标签PDF
*
* @param id 托盘id * @param id 托盘id
*/ */
@GetMapping("exportTrayPdf") @GetMapping("exportTrayPdf")
@ -602,6 +617,7 @@ public class StructuralPackageOrderController extends BaseController {
/** /**
* 导出托盘标签图片 * 导出托盘标签图片
*
* @param id 托盘id * @param id 托盘id
*/ */
@GetMapping(value = "exportTrayImage", produces = MediaType.IMAGE_PNG_VALUE) @GetMapping(value = "exportTrayImage", produces = MediaType.IMAGE_PNG_VALUE)
@ -621,6 +637,7 @@ public class StructuralPackageOrderController extends BaseController {
/** /**
* 导出齐套标签PDF * 导出齐套标签PDF
*
* @param id 托盘id * @param id 托盘id
*/ */
@GetMapping("exportQiTaoPdf") @GetMapping("exportQiTaoPdf")
@ -639,6 +656,7 @@ public class StructuralPackageOrderController extends BaseController {
/** /**
* 导出齐套标签图片 * 导出齐套标签图片
*
* @param id 托盘id * @param id 托盘id
*/ */
@GetMapping(value = "exportQiTaoImage", produces = MediaType.IMAGE_PNG_VALUE) @GetMapping(value = "exportQiTaoImage", produces = MediaType.IMAGE_PNG_VALUE)
@ -672,6 +690,7 @@ public class StructuralPackageOrderController extends BaseController {
/** /**
* 打包托盘PDA使用 * 打包托盘PDA使用
*
* @param request 请求参数 * @param request 请求参数
*/ */
@Transactional @Transactional
@ -729,6 +748,7 @@ public class StructuralPackageOrderController extends BaseController {
/** /**
* 保存物料二维码扫描记录 * 保存物料二维码扫描记录
*
* @param qrCodes 二维码列表 * @param qrCodes 二维码列表
* @param type 类型 * @param type 类型
*/ */
@ -755,6 +775,7 @@ public class StructuralPackageOrderController extends BaseController {
/** /**
* 退回到未打包 * 退回到未打包
*
* @param id 托盘id * @param id 托盘id
*/ */
@GetMapping("backToUnpackaged") @GetMapping("backToUnpackaged")
@ -776,6 +797,7 @@ public class StructuralPackageOrderController extends BaseController {
/** /**
* 创建送货单 * 创建送货单
*
* @param ids 托盘id * @param ids 托盘id
*/ */
@Transactional @Transactional
@ -809,6 +831,7 @@ public class StructuralPackageOrderController extends BaseController {
/** /**
* 搜索送货单 * 搜索送货单
*
* @param request 查询参数 * @param request 查询参数
*/ */
@PostMapping("searchDeliverOrder") @PostMapping("searchDeliverOrder")
@ -818,6 +841,7 @@ public class StructuralPackageOrderController extends BaseController {
/** /**
* 获取送货单详情信息 * 获取送货单详情信息
*
* @param id 送货单ID * @param id 送货单ID
*/ */
@GetMapping("getDeliverOrderInfo") @GetMapping("getDeliverOrderInfo")
@ -827,6 +851,7 @@ public class StructuralPackageOrderController extends BaseController {
/** /**
* 导出送货单 * 导出送货单
*
* @param id 送货单id * @param id 送货单id
*/ */
@GetMapping("exportDeliverOrder") @GetMapping("exportDeliverOrder")
@ -873,6 +898,7 @@ public class StructuralPackageOrderController extends BaseController {
/** /**
* 根据送货单号查询订单信息PDA使用 * 根据送货单号查询订单信息PDA使用
*
* @param orderNo 送货单号 * @param orderNo 送货单号
*/ */
@GetMapping("getInfoByDeliverOrderNo") @GetMapping("getInfoByDeliverOrderNo")
@ -915,6 +941,7 @@ public class StructuralPackageOrderController extends BaseController {
/** /**
* 线下收货 * 线下收货
*
* @param itemIds 零件项id列表 * @param itemIds 零件项id列表
*/ */
@Transactional @Transactional
@ -943,6 +970,7 @@ public class StructuralPackageOrderController extends BaseController {
/** /**
* 收货PDA使用 * 收货PDA使用
*
* @param request 请求参数 * @param request 请求参数
*/ */
@Transactional @Transactional
@ -1145,12 +1173,12 @@ public class StructuralPackageOrderController extends BaseController {
*/ */
@PostMapping("exportTemplate") @PostMapping("exportTemplate")
public void exportTemplate(HttpServletResponse response) throws IOException { public void exportTemplate(HttpServletResponse response) throws IOException {
Map<String, Object> datas = new LinkedHashMap<>(); Map<String, String> datas = new LinkedHashMap<>();
datas.put("供应商编码*", "必填"); datas.put("供应商编码*", "必填");
datas.put("机型*", "必填"); datas.put("机型*", "必填");
datas.put("机台序号*", "必填"); datas.put("机台序号*", "必填");
datas.put("钢构包物料*", "必填"); datas.put("钢构包物料*", "必填");
datas.put("期望交期", "不填为今天格式2025/10/05"); datas.put("期望交期", "不填为今天格式2025-03-05");
datas.put("采购订单号*", "必填"); datas.put("采购订单号*", "必填");
datas.put("行项目*", "0010"); datas.put("行项目*", "0010");
datas.put("数量*", "必填"); datas.put("数量*", "必填");
@ -1163,12 +1191,12 @@ public class StructuralPackageOrderController extends BaseController {
*/ */
@PostMapping("importOrder") @PostMapping("importOrder")
public ApiResult importOrder(MultipartFile file) throws IOException { public ApiResult importOrder(MultipartFile file) throws IOException {
List<Map<String, Object>> datas = EecExcelUtil.handlerExcel(file.getInputStream()); List<StructuralPackageOrderExportDTO> datas = EecExcelUtil.getExcelContext(file.getInputStream(), StructuralPackageOrderExportDTO.class);
List<StructuralPackageOrderImportDTO> list = new ArrayList<>(); List<StructuralPackageOrderImportDTO> list = new ArrayList<>();
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
datas.forEach(data -> { datas.forEach(data -> {
sb.setLength(0); sb.setLength(0);
String supplierCode = StrUtil.trim(data.get("供应商编码*").toString()); String supplierCode = StrUtil.trim(data.getSupplierCode()); //StrUtil.trim(data.get("供应商编码*").toString());
Long supplierId = null; Long supplierId = null;
if (StrUtil.isBlank(supplierCode)) { if (StrUtil.isBlank(supplierCode)) {
sb.append("供应商编码不能为空;"); sb.append("供应商编码不能为空;");
@ -1180,7 +1208,7 @@ public class StructuralPackageOrderController extends BaseController {
supplierId = supplier.getId(); supplierId = supplier.getId();
} }
} }
String modelNo = StrUtil.trim(data.get("机型*").toString()); String modelNo = StrUtil.trim(data.getModelNo()); //StrUtil.trim(data.get("机型*").toString());
Long modelId = null; Long modelId = null;
if (StrUtil.isBlank(modelNo)) { if (StrUtil.isBlank(modelNo)) {
sb.append("机型不能为空;"); sb.append("机型不能为空;");
@ -1195,7 +1223,7 @@ public class StructuralPackageOrderController extends BaseController {
modelId = model.getId(); modelId = model.getId();
} }
} }
String workbenchNo = StrUtil.trim(data.get("机台序号*").toString()); String workbenchNo = StrUtil.trim(data.getWorkbenchNo()); //StrUtil.trim(data.get("机台序号*").toString());
Long workbenchId = null; Long workbenchId = null;
if (StrUtil.isBlank(workbenchNo)) { if (StrUtil.isBlank(workbenchNo)) {
sb.append("机台序号不能为空;"); sb.append("机台序号不能为空;");
@ -1210,7 +1238,7 @@ public class StructuralPackageOrderController extends BaseController {
workbenchId = workbench.getId(); workbenchId = workbench.getId();
} }
} }
String materialNo = StrUtil.trim(data.get("钢构包物料*").toString()); String materialNo = StrUtil.trim(data.getMaterialNo()); //StrUtil.trim(data.get("钢构包物料*").toString());
PackageVO packageVO = null; PackageVO packageVO = null;
if (StrUtil.isBlank(materialNo)) { if (StrUtil.isBlank(materialNo)) {
sb.append("钢构包物料不能为空;"); sb.append("钢构包物料不能为空;");
@ -1220,13 +1248,13 @@ public class StructuralPackageOrderController extends BaseController {
sb.append("钢构包物料无效;"); sb.append("钢构包物料无效;");
} }
} }
String expectDeliveryDate = StrUtil.trim(data.get("期望交期").toString()); String expectDeliveryDate = StrUtil.trim(data.getExpectDeliveryDate()); //StrUtil.trim(data.get("期望交期").toString());
if (StrUtil.isBlank(expectDeliveryDate)) { if (StrUtil.isBlank(expectDeliveryDate)) {
expectDeliveryDate = DateTimeUtil.format(LocalDate.now(), "yyyy/MM/dd"); expectDeliveryDate = DateTimeUtil.format(LocalDate.now(), "yyyy-MM-dd");
} else if (!DateTimeUtil.isValidDate(expectDeliveryDate)) { } else if (!DateTimeUtil.isValidDate(expectDeliveryDate)) {
sb.append("期望交期无效;"); sb.append("期望交期格式不正确应为2026-03-30;");
} }
String snum = StrUtil.trim(data.get("数量*").toString()); String snum = StrUtil.trim(data.getNum()); //StrUtil.trim(data.get("数量*").toString());
BigDecimal num = null; BigDecimal num = null;
if (StrUtil.isBlank(snum)) { if (StrUtil.isBlank(snum)) {
sb.append("数量不能为空;"); sb.append("数量不能为空;");
@ -1238,8 +1266,8 @@ public class StructuralPackageOrderController extends BaseController {
sb.append("数量必须大于0;"); sb.append("数量必须大于0;");
} }
} }
String poNum = StrUtil.trim(data.get("采购订单号*").toString()); String poNum = StrUtil.trim(data.getPoNum()); //StrUtil.trim(data.get("采购订单号*").toString());
String rowNo = StrUtil.trim(data.get("行项目*").toString()); String rowNo = StrUtil.trim(data.getRowNo()); // StrUtil.trim(data.get("行项目*").toString());
BigDecimal transportNum = num; BigDecimal transportNum = num;
if (StrUtil.isBlank(poNum)) { if (StrUtil.isBlank(poNum)) {
sb.append("采购订单号不能为空;"); sb.append("采购订单号不能为空;");
@ -1290,13 +1318,13 @@ public class StructuralPackageOrderController extends BaseController {
.setTransportNum(transportNum) .setTransportNum(transportNum)
); );
} else { } else {
data.put("错误信息", sb.toString()); data.setError(sb.toString());
} }
}); });
if (list.size() != datas.size()) { if (list.size() != datas.size()) {
try (ByteArrayOutputStream osOut = new ByteArrayOutputStream()) { try (ByteArrayOutputStream osOut = new ByteArrayOutputStream()) {
new Workbook() new Workbook()
.addSheet(new ListMapSheet<>(datas)) .addSheet(new ListSheet<>(datas))
.writeTo(osOut); .writeTo(osOut);
try (ByteArrayInputStream isIn = new ByteArrayInputStream(osOut.toByteArray())) { try (ByteArrayInputStream isIn = new ByteArrayInputStream(osOut.toByteArray())) {
return ApiResult.error(STATE.DataNoCheckPass, "导入文件失败", fileUploadService.upload("temp/" + DateTimeUtil.format(LocalDate.now(), "yyyyMMdd") + "/" + IdUtil.fastUUID() + ".xlsx", isIn, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")); return ApiResult.error(STATE.DataNoCheckPass, "导入文件失败", fileUploadService.upload("temp/" + DateTimeUtil.format(LocalDate.now(), "yyyyMMdd") + "/" + IdUtil.fastUUID() + ".xlsx", isIn, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"));
@ -1315,6 +1343,7 @@ public class StructuralPackageOrderController extends BaseController {
/** /**
* 添加备注 * 添加备注
*
* @param request 请求参数 * @param request 请求参数
*/ */
@PostMapping("itemRemark") @PostMapping("itemRemark")

View File

@ -0,0 +1,35 @@
package com.nflg.wms.admin.pojo.dto;
import lombok.Data;
import org.ttzero.excel.annotation.ExcelColumn;
@Data
public class StructuralPackageOrderExportDTO {
@ExcelColumn(value = "供应商编码*")
private String supplierCode;
@ExcelColumn(value = "机型*")
private String modelNo;
@ExcelColumn(value = "机台序号*")
private String workbenchNo;
@ExcelColumn(value = "钢构包物料*")
private String materialNo;
@ExcelColumn(value = "期望交期")
private String expectDeliveryDate;
@ExcelColumn(value = "采购订单号*")
private String poNum;
@ExcelColumn(value = "行项目*")
private String rowNo;
@ExcelColumn(value = "数量*")
private String num;
@ExcelColumn(value = "错误信息")
private String error;
}

View File

@ -3,7 +3,7 @@
<head> <head>
<meta charset="UTF-8"/> <meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/> <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>成本中心领料单</title> <title th:text="${base.title}">成本中心领料单</title>
<style> <style>
@page { @page {
size: A4 landscape; /* 横向 A4 */ size: A4 landscape; /* 横向 A4 */

View File

@ -3,7 +3,7 @@
<head> <head>
<meta charset="UTF-8"/> <meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/> <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>成品订单入库单</title> <title th:text="${base.title}">成品订单入库单</title>
<style> <style>
@page { @page {
size: A4 landscape; /* 横向 A4 */ size: A4 landscape; /* 横向 A4 */

View File

@ -3,7 +3,7 @@
<head> <head>
<meta charset="UTF-8"/> <meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/> <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>生产补料单</title> <title th:text="${base.title}">生产补料单</title>
<style> <style>
@page { @page {
size: A4 landscape; /* 横向 A4 */ size: A4 landscape; /* 横向 A4 */

View File

@ -3,7 +3,7 @@
<head> <head>
<meta charset="UTF-8"/> <meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/> <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>生产退料单</title> <title th:text="${base.title}">生产退料单</title>
<style> <style>
@page { @page {
size: A4 landscape; /* 横向 A4 */ size: A4 landscape; /* 横向 A4 */

View File

@ -3,7 +3,7 @@
<head> <head>
<meta charset="UTF-8"/> <meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/> <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>生产领料出库单</title> <title th:text="${base.title}">生产领料出库单</title>
<style> <style>
@page { @page {
size: A4 landscape; /* 横向 A4 */ size: A4 landscape; /* 横向 A4 */

View File

@ -3,7 +3,7 @@
<head> <head>
<meta charset="UTF-8"/> <meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/> <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>成品发货领料单</title> <title th:text="${base.title}">成品发货领料单</title>
<style> <style>
@media print { @media print {
@page { @page {

View File

@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List; import java.util.List;
import java.util.Objects;
/** /**
* <p> * <p>
@ -26,6 +27,9 @@ public class WmsComponentPackingServiceImpl extends ServiceImpl<WmsComponentPack
@Override @Override
public IPage<ComponentPackingVO> search(ComponentPackingQO request) { public IPage<ComponentPackingVO> search(ComponentPackingQO request) {
if (Objects.nonNull(request.getStartDate())){
request.setStartDate(request.getStartDate().minusDays(1));
}
return baseMapper.search(request, new Page<>(request.getPage(), request.getPageSize())); return baseMapper.search(request, new Page<>(request.getPage(), request.getPageSize()));
} }