package org.jeecg.modules.mes.service.impl; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.exception.JeecgBootException; import org.jeecg.modules.base.entity.Factory; import org.jeecg.modules.base.entity.LineSideWarehouse; import org.jeecg.modules.base.entity.Shift; import org.jeecg.modules.base.service.IFactoryService; import org.jeecg.modules.base.service.ILineSideWarehouseService; import org.jeecg.modules.base.service.IShiftService; import org.jeecg.modules.lsw.entity.LswMaterial; import org.jeecg.modules.lsw.entity.LswMaterialInbound; import org.jeecg.modules.lsw.enums.MaterialCategory; import org.jeecg.modules.lsw.service.ILswMaterialInboundService; import org.jeecg.modules.lsw.service.ILswMaterialService; import org.jeecg.modules.mes.entity.MesProductionWorkOrder; import org.jeecg.modules.mes.entity.MesWorkReporting; import org.jeecg.modules.mes.mapper.MesWorkReportingMapper; import org.jeecg.modules.mes.service.IMesProductionWorkOrderService; import org.jeecg.modules.mes.service.IMesWorkReportingService; import org.jeecg.modules.mes.utils.CommonUtils; import org.jeecg.modules.system.service.ISysBusinessCodeRuleService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Date; import java.util.List; import java.util.Objects; import java.util.Optional; /** * @Description: 工单报工 * @Author: jeecg-boot * @Date: 2025-07-04 * @Version: V1.0 */ @Service public class MesWorkReportingServiceImpl extends ServiceImpl implements IMesWorkReportingService { @Autowired private IMesProductionWorkOrderService mesProductionWorkOrderService; @Autowired private ILswMaterialService lswMaterialService; @Autowired private IFactoryService factoryService; @Autowired private IShiftService shiftService; @Autowired private ILineSideWarehouseService lineSideWarehouseService; @Autowired private ILswMaterialInboundService lswMaterialInboundService; @Autowired private ISysBusinessCodeRuleService sysBusinessCodeRuleService; @Override public List queryWorkReportingByWorkOrderId(String workOrderId) { return baseMapper.queryWorkReportingByWorkOrderId(workOrderId); } @Override public List queryWorkReportingByOrderId(String orderId) { return baseMapper.queryWorkReportingByOrderId(orderId); } @Override public void addReporting(MesWorkReporting mesWorkReporting) { MesProductionWorkOrder workOrder = mesProductionWorkOrderService.getById(mesWorkReporting.getWorkOrderId()); if (workOrder == null) { throw new JeecgBootException("工单不存在!"); } LswMaterial material = lswMaterialService.list(new LambdaQueryWrapper() .eq(LswMaterial::getMaterialNumber, workOrder.getMaterialNumber()) .eq(LswMaterial::getDelFlag, CommonConstant.DEL_FLAG_0)).stream() .findAny().orElse(null); if (material == null) { throw new JeecgBootException("物料不存在!"); } MaterialCategory materialCategory = MaterialCategory.fromName(material.getMaterialCategory()); if (materialCategory == null) { throw new JeecgBootException("未知的物料类型!"); } //生产批次号 String batchNumber = sysBusinessCodeRuleService.generateBusinessCodeSeq("WorkReportingBatchNumber"); mesWorkReporting.setBatchNumber(batchNumber); LineSideWarehouse lineSideWarehouse = lineSideWarehouseService.list(new LambdaQueryWrapper() .eq(LineSideWarehouse::getFactoryId, mesWorkReporting.getFactoryId()) .eq(LineSideWarehouse::getDelFlag, CommonConstant.DEL_FLAG_0)) .stream().findAny().orElse(null); if (lineSideWarehouse == null) { throw new JeecgBootException("线边仓库不存在!"); } mesWorkReporting.setWarehouseId(lineSideWarehouse.getId()); mesWorkReporting.setReporter(Objects.requireNonNull(CommonUtils.getCurrentUser()).getUsername()); mesWorkReporting.setReportTime(new Date()); String date = DateUtil.format(new Date(), "yyMMdd"); switch (materialCategory) { case FINISHED: //成品报工逻辑 String palletNumber4 = sysBusinessCodeRuleService.generateBusinessCodeSeq("WorkReportingPalletNumber4"); String finishedPalletNumber = material.getMaterialNumber() + date + palletNumber4; mesWorkReporting.setPalletNumber(finishedPalletNumber); //todo 扣减内法兰(对应机加内法兰线边库)、外法兰(对应机加外法兰线边库)、小内圈(对应装配线边库)库存,调用SAP投料接口 //todo 调用SAP工序报工 //todo 打印成品托标签、检验标识卡、移库单、完工检验工单;判断生产订单是否需要关闭(合格数量 = 订单数量) break; case HALF: case RAW: //半成品报工逻辑 Factory factory = factoryService.getById(mesWorkReporting.getFactoryId()); Shift shift = shiftService.getById(workOrder.getShiftId()); String palletNumber6 = sysBusinessCodeRuleService.generateBusinessCodeSeq("WorkReportingPalletNumber6"); //拼接半成品报工托号 String halfPalletNumber = factory.getFactoryCode() + material.getMaterialNumber() + date + shift.getShiftCode() + palletNumber6; mesWorkReporting.setPalletNumber(halfPalletNumber); //todo 扣减对应线边库(外法兰毛坯、内法兰毛坯)库存后,调用SAP投料接口 //todo 调用SAP工序报工 break; case PARTS: break; } save(mesWorkReporting); //线边库入库逻辑 LswMaterialInbound lswMaterialInbound = new LswMaterialInbound() .setFactoryId(mesWorkReporting.getFactoryId()) .setMaterialNumber(material.getMaterialNumber()) .setMaterialName(material.getMaterialName()) .setBatchNumber(batchNumber) .setQuantity(mesWorkReporting.getQuantity()) .setWarehouseId(lineSideWarehouse.getId()); lswMaterialInboundService.save(lswMaterialInbound); } }