diff --git a/cclqms-java/src/main/java/com/gaotao/modules/api/controller/QcInspectionTaskApiController.java b/cclqms-java/src/main/java/com/gaotao/modules/api/controller/QcInspectionTaskApiController.java new file mode 100644 index 0000000..7b2a807 --- /dev/null +++ b/cclqms-java/src/main/java/com/gaotao/modules/api/controller/QcInspectionTaskApiController.java @@ -0,0 +1,74 @@ +package com.gaotao.modules.api.controller; + +import com.gaotao.modules.api.dto.AutogenerateInspectionTaskRequestDto; +import com.gaotao.modules.api.dto.AutogenerateInspectionTaskResponseDto; +import com.gaotao.modules.pms.data.QcFAIRecordData; +import com.gaotao.modules.pms.service.QcService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import jakarta.validation.Valid; +import java.util.Map; + +/** + * 检验任务对外开放接口 + * 供其它系统调用自动生成检验任务(GetAutogenerateinspectiontasks) + */ +@Slf4j +@Api(tags = "QC检验任务开放接口") +@RestController +@RequestMapping("/api/qc") +public class QcInspectionTaskApiController { + + @Autowired + private QcService qcService; + + /** + * 自动生成检验任务 + * + * @param request 请求参数 + * @return 响应结果(含检验单号) + */ + @ApiOperation(value = "自动生成检验任务", notes = "其它系统调用,自动生成 IQC/IPQC/FQC/OQC/SQC 等检验任务") + @PostMapping(value = "/autogenerateInspectionTasks", + consumes = MediaType.APPLICATION_JSON_VALUE, + produces = MediaType.APPLICATION_JSON_VALUE) + public AutogenerateInspectionTaskResponseDto autogenerateInspectionTasks( + @Valid @RequestBody AutogenerateInspectionTaskRequestDto request) { + try { + log.info("收到自动生成检验任务请求,inspectionType: {}, site: {}, buNo: {}, partNo: {}, orderNo: {}", + request.getInspectionType(), request.getSite(), request.getBuNo(), + request.getPartNo(), request.getOrderNo()); + QcFAIRecordData data = new QcFAIRecordData(); + BeanUtils.copyProperties(request, data); + if (StringUtils.isBlank(data.getBu()) + && StringUtils.isNotBlank(request.getSite()) + && StringUtils.isNotBlank(request.getBuNo())) { + data.setBu(request.getSite() + "_" + request.getBuNo()); + } + + Map result = qcService.autogenerateInspectionTasksApi(data, request.getInspectionType()); + String inspectionNo = data.getInspectionNo(); + if (StringUtils.isBlank(inspectionNo) && result != null && result.get("inspectionNo") != null) { + inspectionNo = String.valueOf(result.get("inspectionNo")); + } + + log.info("自动生成检验任务完成,inspectionType: {}, inspectionNo: {}", + request.getInspectionType(), inspectionNo); + return AutogenerateInspectionTaskResponseDto.success(inspectionNo, result); + } catch (RuntimeException e) { + log.error("自动生成检验任务业务异常", e); + return AutogenerateInspectionTaskResponseDto.failure("处理失败: " + e.getMessage()); + } catch (Exception e) { + log.error("自动生成检验任务未预期异常", e); + return AutogenerateInspectionTaskResponseDto.failure("系统内部错误,请联系管理员"); + } + } +} diff --git a/cclqms-java/src/main/java/com/gaotao/modules/api/dto/AutogenerateInspectionTaskRequestDto.java b/cclqms-java/src/main/java/com/gaotao/modules/api/dto/AutogenerateInspectionTaskRequestDto.java new file mode 100644 index 0000000..9b236fb --- /dev/null +++ b/cclqms-java/src/main/java/com/gaotao/modules/api/dto/AutogenerateInspectionTaskRequestDto.java @@ -0,0 +1,154 @@ +package com.gaotao.modules.api.dto; + +import lombok.Data; + +import jakarta.validation.constraints.NotBlank; +import java.math.BigDecimal; + +/** + * 自动生成检验任务对外开放接口请求DTO + */ +@Data +public class AutogenerateInspectionTaskRequestDto { + + /** + * 检验类型:IQC / IPQC / FQC / OQC / SQC 等 + */ + @NotBlank(message = "检验类型不能为空") + private String inspectionType; + + /** + * 工厂编码(可与 buNo 分开传,也可通过 bu=site_buNo 合并传) + */ + private String site; + + /** + * 部门/事业部编码 + */ + private String buNo; + + /** + * site_buNo 合并字段,如 1001_01 + */ + private String bu; + + /** + * 标签条码 / 卷号 + */ + private String rollNo; + + /** + * 批次号 + */ + private String batchNo; + + /** + * 工单号(或订单号) + */ + private String orderNo; + + /** + * 派工单号 / 工序序号 + */ + private String seqNo; + + /** + * 采购订单号(优先于 orderNo) + */ + private String poOrderNo; + + /** + * 采购订单行号(优先于 seqNo) + */ + private String poItemNo; + + /** + * 下达号 + */ + private String releaseNo; + + /** + * 行号 + */ + private String lineNo; + + /** + * 工序名称 + */ + private String operationDesc; + + /** + * 机台号 + */ + private String resourceId; + + /** + * 物料编码 + */ + private String partNo; + + /** + * IPQC 细分类型编码(如巡检编码),会与 IPQC 前缀组合 + */ + private String inspectionTypeNo; + + /** + * 送检数量 + */ + private BigDecimal rollQty; + + /** + * 工单数量 / 批量 + */ + private String lotsize; + + /** + * 创建人账号(无登录态时建议传入) + */ + private String createBy; + + /** + * 用户名(可作为 createBy / inspectorBy 兜底) + */ + private String userName; + + /** + * 检验员 / 送检人账号 + */ + private String inspectorBy; + + /** + * 供应商编码 + */ + private String supplierNo; + + /** + * 客户编码 + */ + private String customerNo; + + /** + * 模板编码,默认 * + */ + private String templateId; + + /** + * 特殊要求 + */ + private String specialRequirements; + + /** + * 任务来源 + */ + private String taskSource; + + /** + * 关联单据号(如 FQC 检验单号) + */ + private String documentNo; + + /** + * 语言:CN / EN + */ + private String languageCode; +} diff --git a/cclqms-java/src/main/java/com/gaotao/modules/api/dto/AutogenerateInspectionTaskResponseDto.java b/cclqms-java/src/main/java/com/gaotao/modules/api/dto/AutogenerateInspectionTaskResponseDto.java new file mode 100644 index 0000000..f622b89 --- /dev/null +++ b/cclqms-java/src/main/java/com/gaotao/modules/api/dto/AutogenerateInspectionTaskResponseDto.java @@ -0,0 +1,60 @@ +package com.gaotao.modules.api.dto; + +import lombok.Data; + +import java.util.Map; + +/** + * 自动生成检验任务对外开放接口响应DTO + */ +@Data +public class AutogenerateInspectionTaskResponseDto { + + /** + * 返回编码(0成功/1失败) + */ + private String code; + + /** + * 返回消息 + */ + private String msg; + + /** + * 生成的检验单号 + */ + private String inspectionNo; + + /** + * 存储过程原始返回数据 + */ + private Map data; + + public static AutogenerateInspectionTaskResponseDto success() { + AutogenerateInspectionTaskResponseDto response = new AutogenerateInspectionTaskResponseDto(); + response.setCode("0"); + response.setMsg("创建检验任务成功"); + return response; + } + + public static AutogenerateInspectionTaskResponseDto success(String message) { + AutogenerateInspectionTaskResponseDto response = new AutogenerateInspectionTaskResponseDto(); + response.setCode("0"); + response.setMsg(message); + return response; + } + + public static AutogenerateInspectionTaskResponseDto success(String inspectionNo, Map data) { + AutogenerateInspectionTaskResponseDto response = success(); + response.setInspectionNo(inspectionNo); + response.setData(data); + return response; + } + + public static AutogenerateInspectionTaskResponseDto failure(String message) { + AutogenerateInspectionTaskResponseDto response = new AutogenerateInspectionTaskResponseDto(); + response.setCode("1"); + response.setMsg(message); + return response; + } +} diff --git a/cclqms-java/src/main/java/com/gaotao/modules/pms/service/Impl/QcServiceImpl.java b/cclqms-java/src/main/java/com/gaotao/modules/pms/service/Impl/QcServiceImpl.java index d061b99..df07afe 100644 --- a/cclqms-java/src/main/java/com/gaotao/modules/pms/service/Impl/QcServiceImpl.java +++ b/cclqms-java/src/main/java/com/gaotao/modules/pms/service/Impl/QcServiceImpl.java @@ -5414,6 +5414,104 @@ public class QcServiceImpl implements QcService { } } + /** + * 对外开放:调用存储过程 GetAutogenerateinspectiontasks 自动生成检验任务 + */ + @Override + @Transactional + public Map autogenerateInspectionTasksApi(QcFAIRecordData data, String inspectionTypeKey) { + if (data == null) { + throw new RuntimeException(pmsI18nHelper.text("pms.error.param.required", null, "请求参数不能为空!")); + } + if (StringUtils.isBlank(inspectionTypeKey)) { + throw new RuntimeException(pmsI18nHelper.text("pms.error.inspectionType.required", null, "检验类型不能为空!")); + } + if (data.getBu() != null && data.getBu().split("_").length >= 2) { + data.setSite(data.getBu().split("_")[0]); + data.setBuNo(data.getBu().split("_")[1]); + } else if (StringUtils.isBlank(data.getSite()) || StringUtils.isBlank(data.getBuNo())) { + throw new RuntimeException(pmsI18nHelper.text("pms.error.siteBu.invalid", null, "工厂和部门有误!")); + } + + String createBy = ""; + try { + SysUserEntity sysUserEntity = (SysUserEntity) SecurityUtils.getSubject().getPrincipal(); + if (sysUserEntity != null && sysUserEntity.getUsername() != null) { + createBy = sysUserEntity.getUsername(); + } + } catch (Exception ignored) { + // 对外开放 API 可能无登录态,忽略 + } + if (StringUtils.isBlank(createBy)) { + createBy = StringUtils.isNotBlank(data.getCreateBy()) ? data.getCreateBy() + : (StringUtils.isNotBlank(data.getUserName()) ? data.getUserName() : ""); + } + String inspectorBy = StringUtils.isNotBlank(data.getInspectorBy()) ? data.getInspectorBy() + : (StringUtils.isNotBlank(data.getUserName()) ? data.getUserName() + : (StringUtils.isNotBlank(data.getCreateBy()) ? data.getCreateBy() : createBy)); + + String inspectionType = resolveAutogenerateInspectionType(inspectionTypeKey, data.getInspectionTypeNo()); + String orderNo = StringUtils.isNotBlank(data.getPoOrderNo()) ? data.getPoOrderNo() + : (data.getOrderNo() == null ? "" : data.getOrderNo()); + String seqNo = StringUtils.isNotBlank(data.getPoItemNo()) ? data.getPoItemNo() + : (data.getSeqNo() == null ? "" : data.getSeqNo()); + String supplierId = StringUtils.isNotBlank(data.getSupplierNo()) ? data.getSupplierNo() : ""; + String customerId = StringUtils.isNotBlank(data.getCustomerNo()) ? data.getCustomerNo() : ""; + String templateId = StringUtils.isNotBlank(data.getTemplateId()) ? data.getTemplateId() : "*"; + String orderQty = data.getLotsize() != null ? String.valueOf(data.getLotsize()) + : (data.getRollQty() == null ? "0" : String.valueOf(data.getRollQty())); + + List params = new ArrayList<>(); + params.add(data.getSite()); + params.add(data.getBuNo()); + params.add(data.getRollNo() == null ? "" : data.getRollNo()); + params.add(data.getBatchNo() == null ? "" : data.getBatchNo()); + params.add(orderNo); + params.add(seqNo); + params.add(data.getReleaseNo() == null ? "" : data.getReleaseNo()); + params.add(data.getLineNo() == null ? "" : data.getLineNo()); + params.add(data.getOperationDesc() == null ? "" : data.getOperationDesc()); + params.add(data.getResourceId() == null ? "" : data.getResourceId()); + params.add(data.getPartNo() == null ? "" : data.getPartNo()); + params.add(inspectionType); + params.add(data.getRollQty() == null ? "0" : String.valueOf(data.getRollQty())); + params.add(orderQty); + params.add(createBy); + params.add(inspectorBy); + params.add(supplierId); + params.add(customerId); + params.add(templateId); + params.add(data.getSpecialRequirements() == null ? "" : data.getSpecialRequirements()); + if (data.getTaskSource() != null && data.getTaskSource().equals("FQC导入")) { + params.add("任务新增"); + } else { + params.add(data.getTaskSource() == null ? "" : data.getTaskSource()); + } + params.add(pmsI18nHelper.resolveProcedureLanguageCode(data.getLanguageCode())); + params.add(data.getDocumentNo() == null ? "" : data.getDocumentNo()); + + logger.info("autogenerateInspectionTasksApi params:{}", params); + + List> resultList = procedureDao.getProcedureData("GetAutogenerateinspectiontasks", params); + if (resultList == null || resultList.isEmpty()) { + throw new RuntimeException(pmsI18nHelper.text("pms.error.inspection.create.failed", null, "创建检验任务失败!")); + } + Map result = resultList.get(0); + String code = result.get("resultCode") != null ? String.valueOf(result.get("resultCode")) + : (result.get("code") != null ? String.valueOf(result.get("code")) : "200"); + String msg = result.get("resultMsg") != null ? String.valueOf(result.get("resultMsg")) + : (result.get("message") != null ? String.valueOf(result.get("message")) : ""); + if ("400".equalsIgnoreCase(code) || (StringUtils.isNotBlank(msg) && msg.contains("未获取到检验数据"))) { + throw new RuntimeException(msg); + } + String inspectionNo = extractInspectionNoFromProcedureResult(result); + if (StringUtils.isNotBlank(inspectionNo)) { + data.setInspectionNo(inspectionNo); + result.put("inspectionNo", inspectionNo); + } + return result; + } + private void updateReleaseNoLineNoAfterAdd(QcFAIRecordData data, String inspectionTypeKey, Map result) { if (StringUtils.isBlank(data.getReleaseNo()) && StringUtils.isBlank(data.getLineNo())) { return; diff --git a/cclqms-java/src/main/java/com/gaotao/modules/pms/service/QcService.java b/cclqms-java/src/main/java/com/gaotao/modules/pms/service/QcService.java index f2f8c41..cf1fcf3 100644 --- a/cclqms-java/src/main/java/com/gaotao/modules/pms/service/QcService.java +++ b/cclqms-java/src/main/java/com/gaotao/modules/pms/service/QcService.java @@ -412,4 +412,13 @@ public interface QcService { R saveEquipmentFolderLocationList(QCEquipmentFolderLocation inData); void deleteEquipmentFolderLocationList(List inData); + + /** + * 对外开放:调用存储过程 GetAutogenerateinspectiontasks 自动生成检验任务。 + * + * @param data 检验任务参数 + * @param inspectionTypeKey 检验类型:IQC / IPQC / FQC / OQC / SQC 等 + * @return 存储过程返回结果(含 resultCode、resultMsg、inspectionNo 等) + */ + Map autogenerateInspectionTasksApi(QcFAIRecordData data, String inspectionTypeKey); }