feat: 仓库简易打印、工作站标签打印、生产订单打印工序修复

- 仓库管理(mom-frontend-vue2): 新增简易标签打印,不依赖MinIO,使用前端qrcode+window.print
- 工作站(erp-frontend-vue): 新增WorkstationLabelPrint组件,支持批量打印工作站标签
- 生产订单: handlePrint改用getProcessTasksByWorkorder,从工艺路线获取工序数据,解决无pro_task时打印无数据问题

Made-with: Cursor
This commit is contained in:
panchengyong
2026-03-14 12:53:47 +08:00
parent 0961b9e407
commit e73ba25a8f
9 changed files with 507 additions and 10 deletions

View File

@@ -34,6 +34,8 @@ import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
@@ -117,7 +119,29 @@ public class ProWorkorderController extends BaseController
@GetMapping(value = "/{workorderId}")
public AjaxResult getInfo(@PathVariable("workorderId") Long workorderId)
{
return AjaxResult.success(proWorkorderService.selectProWorkorderByWorkorderId(workorderId));
ProWorkorder wo = proWorkorderService.selectProWorkorderByWorkorderId(workorderId);
if (wo != null) {
wo.setProductionLine(wo.getAttr1());
if (wo.getAttr2() != null && !wo.getAttr2().isEmpty()) {
try {
wo.setProcessTime(Integer.parseInt(wo.getAttr2()));
} catch (NumberFormatException ignored) {
wo.setProcessTime(null);
}
}
}
return AjaxResult.success(wo);
}
/**
* 获取工单工序列表(基于工艺路线,不依赖 pro_task
* 用于打印等场景,即使未排产也能显示工序信息
*/
@GetMapping(value = "/{workorderId}/processTasks")
public AjaxResult getProcessTasksByWorkorder(@PathVariable("workorderId") Long workorderId)
{
List<ProTask> tasks = proTaskService.selectProTaskProcessViewByWorkorder(workorderId);
return AjaxResult.success(tasks);
}
/**
@@ -128,6 +152,11 @@ public class ProWorkorderController extends BaseController
@PostMapping
public AjaxResult add(@RequestBody ProWorkorder proWorkorder)
{
syncAttrFromForm(proWorkorder);
// 跟单编号为空时自动生成XSDD-yyyyMMddHHmmss
if (StringUtils.isEmpty(proWorkorder.getPpNumber())) {
proWorkorder.setPpNumber("XSDD-" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
}
// 工单编码自动生成(使用统一编码引擎)
if(StringUtils.isEmpty(proWorkorder.getWorkorderCode())){
proWorkorder.setWorkorderCode(autoCodeUtil.genSerialCode(UserConstants.SCGD_CODE, ""));
@@ -162,6 +191,11 @@ public class ProWorkorderController extends BaseController
@PutMapping
public AjaxResult edit(@RequestBody ProWorkorder proWorkorder)
{
syncAttrFromForm(proWorkorder);
// 跟单编号为空时自动生成XSDD-yyyyMMddHHmmss
if (StringUtils.isEmpty(proWorkorder.getPpNumber())) {
proWorkorder.setPpNumber("XSDD-" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
}
if(UserConstants.NOT_UNIQUE.equals(proWorkorderService.checkWorkorderCodeUnique(proWorkorder))){
return AjaxResult.error("生产工单编号已存在!");
}
@@ -206,6 +240,16 @@ public class ProWorkorderController extends BaseController
return toAjax(proWorkorderService.deleteProWorkorderByWorkorderIds(workorderIds));
}
/** 将表单字段 productionLine、processTime 同步到 attr1、attr2 以便持久化 */
private void syncAttrFromForm(ProWorkorder proWorkorder) {
if (proWorkorder.getProductionLine() != null) {
proWorkorder.setAttr1(proWorkorder.getProductionLine());
}
if (proWorkorder.getProcessTime() != null) {
proWorkorder.setAttr2(String.valueOf(proWorkorder.getProcessTime()));
}
}
/**
* 根据生产工单中的产品生成BOM物料行
* @param workorderId