diff --git a/ruoyi-api/hwmom-api-pda/src/main/java/org/dromara/pda/api/RemotePdaMesApiService.java b/ruoyi-api/hwmom-api-pda/src/main/java/org/dromara/pda/api/RemotePdaMesApiService.java index 5629ce1..bcd14d5 100644 --- a/ruoyi-api/hwmom-api-pda/src/main/java/org/dromara/pda/api/RemotePdaMesApiService.java +++ b/ruoyi-api/hwmom-api-pda/src/main/java/org/dromara/pda/api/RemotePdaMesApiService.java @@ -1,7 +1,10 @@ package org.dromara.pda.api; +import org.dromara.common.core.exception.base.BaseException; import org.dromara.common.core.exception.user.UserException; import org.dromara.pda.api.model.BaseMaterial; +import org.dromara.pda.api.model.ProdQmsPlanDetail; +import org.dromara.pda.api.model.bo.GenerateInspectionTaskBo; import java.util.List; import java.util.Map; @@ -15,4 +18,13 @@ public interface RemotePdaMesApiService { * @throws UserException */ BaseMaterial remoteQueryByMaterialCode(String materialCode , String tenantId) throws UserException; + + /** + * 获取生产计划信息 + * @param bo + * @return + * @throws BaseException + */ + ProdQmsPlanDetail remoteGetProductionPlanDetail(GenerateInspectionTaskBo bo) throws BaseException; + } diff --git a/ruoyi-api/hwmom-api-pda/src/main/java/org/dromara/pda/api/model/ProdQmsPlanDetail.java b/ruoyi-api/hwmom-api-pda/src/main/java/org/dromara/pda/api/model/ProdQmsPlanDetail.java new file mode 100644 index 0000000..e99bd0e --- /dev/null +++ b/ruoyi-api/hwmom-api-pda/src/main/java/org/dromara/pda/api/model/ProdQmsPlanDetail.java @@ -0,0 +1,208 @@ +package org.dromara.pda.api.model; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 生产信息对象 prod_product_plan_detail + * + * @author Yinq + * @date 2025-03-05 + */ +@Data +public class ProdQmsPlanDetail implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键标识 + */ + private Long planDetailId; + + /** + * 明细编号 + */ + private String planDetailCode; + + /** + * 生产计划ID + */ + private Long planId; + + /** + * 计划编号 + */ + private String planCode; + + /** + * 操作人员ID;多个人,分隔 + */ + private String userId; + + /** + * 操作人员名称;多个人,分隔 + */ + private String userName; + + /** + * 班次ID + */ + private Long shiftId; + + /** + * 班组ID + */ + private Long classTeamId; + + /** + * 完成数量 + */ + private BigDecimal completeAmount; + + /** + * 单位ID + */ + private Long unitId; + + /** + * 单位名称 + */ + private String unitName; + + /** + * 实际开始时间 + */ + private Date realBeginTime; + + /** + * 实际完成时间 + */ + private Date realEndTime; + + /** + * 附件信息 + */ + private String attachId; + + /** + * 物料条码 + */ + private String materialBarcode; + + /** + * 流转条码;条形码 + */ + private String returnBarcode; + + /** + * 车次(顺序) + */ + private Long trainNumber; + + /** + * 工装ID;托盘ID;台车ID + */ + private Long toolingId; + + /** + * 胶囊ID + */ + private Long capsuleId; + + /** + * 接班ID + */ + private Long shiftChangeId; + + /** + * 半制品明细ID + */ + private Long sfpDetailId; + + /** + * 成型明细ID + */ + private Long formingDetailId; + + /** + * 硫化明细ID + */ + private Long vulDetailId; + + /** + * 明细状态(1未开始 2已开始 3已完成 9异常完成) + */ + private String planDetailStatus; + + /** + * 首件标识(1是 0否) + */ + private String firstFlag; + + /** + * 报警胎标识(1是 0否) + */ + private String alarmFlag; + + /** + * 补录标识(1是 0否) + */ + private String suppleFlag; + + /** + * 备注 + */ + private String remark; + + /** + * 余料数量 + */ + private BigDecimal remainingAmount; + + /** + * 删除标识(1是 0否) + */ + private String delFlag; + + /** + * 工装名称 + */ + private String toolingName; + + private String shiftName; + + private String teamName; + + /** + * 物料ID + */ + private Long materialId; + + /** + * 物料编码 + */ + private String materialCode; + + /** + * 物料名称 + */ + private String materialName; + + /** + * 工序名称 + */ + private String processName; + + /** + * 机台名称 + */ + private String releaseName; + + +} diff --git a/ruoyi-api/hwmom-api-pda/src/main/java/org/dromara/pda/api/model/bo/GenerateInspectionTaskBo.java b/ruoyi-api/hwmom-api-pda/src/main/java/org/dromara/pda/api/model/bo/GenerateInspectionTaskBo.java new file mode 100644 index 0000000..13d994c --- /dev/null +++ b/ruoyi-api/hwmom-api-pda/src/main/java/org/dromara/pda/api/model/bo/GenerateInspectionTaskBo.java @@ -0,0 +1,12 @@ +package org.dromara.pda.api.model.bo; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class GenerateInspectionTaskBo implements Serializable { + private String tenantId; + private Long planDetailId; + private Long processId; +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ProcessWorkshopUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ProcessWorkshopUtils.java new file mode 100644 index 0000000..8bf3db9 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ProcessWorkshopUtils.java @@ -0,0 +1,36 @@ +package org.dromara.common.core.utils; + +import cn.hutool.extra.spring.SpringUtil; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.boot.autoconfigure.thread.Threading; +import org.springframework.context.ApplicationContext; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +/** + * 工具类 + * + * @author Lion Li + */ +public final class ProcessWorkshopUtils { + + + /** + * 工序ID转换车间ID + * @param processId + * @return + */ + public static Long Conversion(Long processId) { + if (processId == null) { + return null; + } + if (processId == 17L) { + return 3L; + } else if (processId == 18L) { + return 4L; + } else { + return 2L; + } + } + +} diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/dubbo/RemoteQmsApiServiceImpl.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/dubbo/RemoteQmsApiServiceImpl.java index de7b20a..db1cfbc 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/dubbo/RemoteQmsApiServiceImpl.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/dubbo/RemoteQmsApiServiceImpl.java @@ -3,11 +3,24 @@ package org.dromara.mes.dubbo; import cn.hutool.core.util.ObjectUtil; import lombok.RequiredArgsConstructor; import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.exception.base.BaseException; import org.dromara.common.core.exception.user.UserException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.ProcessWorkshopUtils; +import org.dromara.common.core.utils.StringUtils; import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.mes.domain.ProdProductPlanDetail; +import org.dromara.mes.domain.bo.ProdPlanInfoBo; +import org.dromara.mes.domain.vo.ProdPlanInfoVo; +import org.dromara.mes.domain.vo.ProdProductPlanDetailVo; import org.dromara.mes.mapper.BaseMaterialInfoMapper; +import org.dromara.mes.service.IProdPlanInfoService; +import org.dromara.mes.service.IProdProductPlanDetailService; import org.dromara.pda.api.RemotePdaMesApiService; import org.dromara.pda.api.model.BaseMaterial; +import org.dromara.pda.api.model.ProdQmsPlanDetail; +import org.dromara.pda.api.model.bo.GenerateInspectionTaskBo; +import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import java.util.List; @@ -20,6 +33,10 @@ public class RemoteQmsApiServiceImpl implements RemotePdaMesApiService { private final BaseMaterialInfoMapper baseMaterialInfoMapper ; + private final IProdPlanInfoService prodPlanInfoService; + + private final IProdProductPlanDetailService productPlanDetailService ; + @Override @@ -40,4 +57,32 @@ public class RemoteQmsApiServiceImpl implements RemotePdaMesApiService { }); } + @Override + public ProdQmsPlanDetail remoteGetProductionPlanDetail(GenerateInspectionTaskBo bo) throws BaseException { + ProdQmsPlanDetail planDetail = new ProdQmsPlanDetail(); + Long planDetailId = bo.getPlanDetailId(); + Long processId = bo.getProcessId(); + Long workshopId = ProcessWorkshopUtils.Conversion(processId); + ProdProductPlanDetailVo prodProductPlanDetailVo = productPlanDetailService.queryById(planDetailId, workshopId); + ProdProductPlanDetail detail = MapstructUtils.convert(prodProductPlanDetailVo, ProdProductPlanDetail.class); + if (StringUtils.isNull(detail)){ + return planDetail; + } + BeanUtils.copyProperties(detail, planDetail); + ProdPlanInfoBo planInfoBo = new ProdPlanInfoBo(); + planInfoBo.setPlanId(prodProductPlanDetailVo.getPlanId()); + planInfoBo.setWorkshopId(workshopId); + List prodPlanInfoVos = prodPlanInfoService.queryList(planInfoBo); + if (prodPlanInfoVos.isEmpty()){ + return planDetail; + } + ProdPlanInfoVo prodPlanInfoVo = prodPlanInfoVos.get(0); + planDetail.setMaterialId(prodPlanInfoVo.getMaterialId()); + planDetail.setMaterialCode(prodPlanInfoVo.getMaterialCode()); + planDetail.setMaterialName(prodPlanInfoVo.getMaterialName()); + planDetail.setProcessName(prodPlanInfoVo.getProcessName()); + planDetail.setReleaseName(prodPlanInfoVo.getReleaseName()); + return planDetail; + } + } diff --git a/ruoyi-modules/hwmom-qms/src/main/java/org/dromara/qms/controller/QcPDAController.java b/ruoyi-modules/hwmom-qms/src/main/java/org/dromara/qms/controller/QcPDAController.java index 077e676..7bb0b52 100644 --- a/ruoyi-modules/hwmom-qms/src/main/java/org/dromara/qms/controller/QcPDAController.java +++ b/ruoyi-modules/hwmom-qms/src/main/java/org/dromara/qms/controller/QcPDAController.java @@ -4,6 +4,7 @@ package org.dromara.qms.controller; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.pda.api.model.bo.GenerateInspectionTaskBo; import org.dromara.qms.service.*; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -50,7 +51,8 @@ public class QcPDAController { //不合格品评审记录 private final IQcUnqualifiedRecordService qcUnqualifiedRecordService; - + //PDA业务Service + private final IQcPDAService qcPDAService; /** * 查询不合格品评审记录(PDA查询页面) @@ -77,5 +79,18 @@ public class QcPDAController { "3".equals(reviewResult); // 流转 } - + /** + * 通过planDetailId和processId生成质检任务 + * @param bo + * @return + */ + @PostMapping("/generateInspectionTask") + public R generateInspectionTask(@RequestBody @Valid GenerateInspectionTaskBo bo) { + Boolean result = qcPDAService.generateInspectionTask(bo); + if (result != null && result) { + return R.ok(true); + } else { + return R.fail("生成质检任务失败"); + } + } } diff --git a/ruoyi-modules/hwmom-qms/src/main/java/org/dromara/qms/service/IQcPDAService.java b/ruoyi-modules/hwmom-qms/src/main/java/org/dromara/qms/service/IQcPDAService.java new file mode 100644 index 0000000..1c2bee8 --- /dev/null +++ b/ruoyi-modules/hwmom-qms/src/main/java/org/dromara/qms/service/IQcPDAService.java @@ -0,0 +1,20 @@ +package org.dromara.qms.service; + + +import org.dromara.pda.api.model.bo.GenerateInspectionTaskBo; + +/** + * PDA接口Service接口 + * + * @author YinQ + * @date 2025-07-24 + */ +public interface IQcPDAService { + + /** + * 通过planDetailId和processId生成质检任务 + */ + Boolean generateInspectionTask(GenerateInspectionTaskBo bo); + + +} diff --git a/ruoyi-modules/hwmom-qms/src/main/java/org/dromara/qms/service/impl/QcPDAServiceImpl.java b/ruoyi-modules/hwmom-qms/src/main/java/org/dromara/qms/service/impl/QcPDAServiceImpl.java new file mode 100644 index 0000000..e13d01d --- /dev/null +++ b/ruoyi-modules/hwmom-qms/src/main/java/org/dromara/qms/service/impl/QcPDAServiceImpl.java @@ -0,0 +1,93 @@ +package org.dromara.qms.service.impl; + +import lombok.RequiredArgsConstructor; + +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.pda.api.RemotePdaMesApiService; +import org.dromara.pda.api.model.ProdQmsPlanDetail; +import org.dromara.pda.api.model.bo.GenerateInspectionTaskBo; +import org.dromara.qms.domain.bo.QcInspectionTemplateBo; +import org.dromara.qms.domain.vo.QcInspectionTemplateVo; +import org.dromara.qms.service.IQcInspectionTemplateService; +import org.dromara.qms.service.IQcPDAService; +import org.dromara.qms.service.IQcTemplateItemService; +import org.dromara.system.api.RemoteCodeRuleService; +import org.springframework.stereotype.Service; +import org.dromara.qms.service.IQcInspectionMainService; +import org.dromara.qms.domain.bo.QcInspectionMainBo; +import org.dromara.common.core.domain.R; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * PDA接口Service业务层处理 + * + * @author YinQ + * @date 2025-07-24 + */ +@RequiredArgsConstructor +@Service +@DubboService +public class QcPDAServiceImpl implements IQcPDAService { + + private final IQcInspectionMainService qcInspectionMainService; + + private final IQcInspectionTemplateService qcInspectionTemplateService; + + private final IQcTemplateItemService qcTemplateItemService; + + @DubboReference + private final RemotePdaMesApiService remotePdaMesApiService; + + @DubboReference + private final RemoteCodeRuleService remoteCodeRuleService; + + + /** + * 通过planDetailId和processId生成质检任务 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean generateInspectionTask(GenerateInspectionTaskBo bo) { + ProdQmsPlanDetail planDetail = remotePdaMesApiService.remoteGetProductionPlanDetail(bo); + if (StringUtils.isNull(planDetail)) { + throw new ServiceException("获取生产计划失败"); + } + String inspectionNo = remoteCodeRuleService.selectCodeRuleCode("3"); + if (StringUtils.isNull(inspectionNo)) { + throw new ServiceException("获取质检编号失败"); + } + String materialCode = planDetail.getMaterialCode(); + + QcInspectionTemplateBo templateBo = new QcInspectionTemplateBo(); + templateBo.setMaterialCode(materialCode); + List templateVos = qcInspectionTemplateService.queryList(templateBo); + if (templateVos.size() != 1) { + throw new ServiceException("此物料无可用检测模板!"); + } + QcInspectionTemplateVo templateVo = templateVos.get(0); + QcInspectionMainBo inspectionBo = new QcInspectionMainBo(); + inspectionBo.setInspectionNo(inspectionNo); + inspectionBo.setPlanDetailId(planDetail.getPlanDetailId()); + inspectionBo.setTemplateId(templateVo.getTemplateId()); + inspectionBo.setTemplateName(templateVo.getTemplateName()); + inspectionBo.setInspectionType(templateVo.getQcInspectionType()); + inspectionBo.setMaterialCode(planDetail.getMaterialCode()); + inspectionBo.setMaterialName(planDetail.getMaterialName()); + inspectionBo.setProcessName(planDetail.getProcessName()); + inspectionBo.setStationName(planDetail.getReleaseName()); + inspectionBo.setInspectionQty(planDetail.getCompleteAmount()); + inspectionBo.setShift(planDetail.getShiftName()); + inspectionBo.setTeam(planDetail.getTeamName()); + inspectionBo.setProductionOrder(planDetail.getPlanCode()); + inspectionBo.setBarcode(planDetail.getReturnBarcode()); + inspectionBo.setStatus(0L); + qcInspectionMainService.insertByBo(inspectionBo); + + return true; + } +}