diff --git a/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesProductionRecordService.java b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesProductionRecordService.java index 4dd4f6f..715cc85 100644 --- a/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesProductionRecordService.java +++ b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesProductionRecordService.java @@ -30,4 +30,9 @@ public interface IMesProductionRecordService extends IBaseMesService queryProductAccount(MesProductAccountModel productAccountModel, Pager pager); + @ApiOperation(value = "线边库存报表") + List queryProductAccount(MesProductAccountModel productAccountModel); + + @ApiOperation(value = "线边库存报表") + List transferAccount(List list,MesProductAccountModel productAccountModel); } diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/busi/TestController.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/busi/TestController.java index 86bd0d5..1dd91c9 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/busi/TestController.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/busi/TestController.java @@ -1,6 +1,7 @@ package cn.estsh.i3plus.ext.mes.apiservice.controller.busi; import cn.estsh.i3plus.ext.mes.apiservice.schedulejob.MesAccountJob; +import cn.estsh.i3plus.ext.mes.apiservice.schedulejob.MesGenerateAccountJob; import cn.estsh.i3plus.ext.mes.apiservice.schedulejob.MesWorkOrderUpdateQtyJob; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; @@ -19,6 +20,9 @@ public class TestController { @Autowired private MesAccountJob mesAccountJob; + @Autowired + private MesGenerateAccountJob mesGenerateAccountJob; + @GetMapping("/reportOrder") @ApiOperation(value = "报工") public void reportOrder() { @@ -30,4 +34,10 @@ public class TestController { public void mesAccount() { mesAccountJob.executeMesJob(null, null); } + + @GetMapping("/generateMesAccount") + @ApiOperation(value = "generateMesAccount") + public void generateMesAccount() { + mesGenerateAccountJob.executeMesJob(null, null); + } } diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/report/MesBusiReportController.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/report/MesBusiReportController.java index 90e3967..4e1857d 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/report/MesBusiReportController.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/report/MesBusiReportController.java @@ -9,6 +9,7 @@ import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn; import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord; import cn.estsh.i3plus.pojo.mes.model.MesProductionRecordModel; import cn.estsh.i3plus.pojo.mes.model.report.MesProductAccountModel; +import cn.estsh.i3plus.pojo.mes.model.report.MesProductAccountResModel; import cn.estsh.impp.framework.base.controller.MesBaseController; import cn.estsh.impp.framework.boot.exception.ImppBusiException; import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; @@ -21,6 +22,8 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + /** * @Description : Mes业务报表 * @Reference : @@ -103,8 +106,16 @@ public class MesBusiReportController extends MesBaseController { try { ValidatorBean.beginValid(productAccountModel) .notNull("equipmentCode", productAccountModel.getEquipmentCode()); + /*productAccountModel.setStartTime("2024-09-12 08:00:00"); + productAccountModel.setEndTime("2024-09-13 08:00:00"); + productAccountModel.setEquipmentCode("760BFoaming"); + productAccountModel.setPartNo("Z0020667");*/ + + List mesProductAccountResModels = mesProductionRecordService.queryProductAccount(productAccountModel); + + List mesProductAccountResModelsRes = mesProductionRecordService.transferAccount(mesProductAccountResModels,productAccountModel); - return ResultBean.success("查询成功").setListPager(mesProductionRecordService.queryProductAccount(productAccountModel, pager)); + return ResultBean.success("查询成功").setResultList(mesProductAccountResModelsRes); } catch (ImppBusiException e) { return ResultBean.fail(e); } catch (Exception e) { diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/report/MesProductAccountController.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/report/MesProductAccountController.java new file mode 100644 index 0000000..3995b0d --- /dev/null +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/report/MesProductAccountController.java @@ -0,0 +1,12 @@ +package cn.estsh.i3plus.ext.mes.apiservice.controller.report; + +import cn.estsh.i3plus.ext.mes.pojo.constant.MesCommonConstant; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Api("Mes业务报表") +@RestController +@RequestMapping(MesCommonConstant.MES_YANFEN + "/") +public class MesProductAccountController { +} diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/schedulejob/MesAccountJob.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/schedulejob/MesAccountJob.java index b4f7e06..d0764a2 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/schedulejob/MesAccountJob.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/schedulejob/MesAccountJob.java @@ -2,6 +2,8 @@ package cn.estsh.i3plus.ext.mes.apiservice.schedulejob; import cn.estsh.i3plus.mes.apiservice.schedulejob.BaseMesScheduleJob; +import cn.estsh.i3plus.mes.apiservice.util.DateUtil; +import cn.estsh.i3plus.platform.common.tool.TimeTool; import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; @@ -23,10 +25,14 @@ import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import java.util.ArrayList; +import java.util.Date; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; +import static cn.estsh.i3plus.mes.apiservice.util.DateUtil.FORMAT_HH_MM; +import static cn.estsh.i3plus.mes.apiservice.util.DateUtil.FORMAT_YYYY_MM_DD; + /** * @author castle, 暂时没有客供品移库 * @version 1.0 @@ -74,9 +80,14 @@ public class MesAccountJob extends BaseMesScheduleJob { if (null == userName) { userName = "JOB"; } - List list = Stream.of("760BFoaming").collect(Collectors.toList()); + Date yesterday = TimeTool.getDateBefore(new Date(), 1); + //String startDateTime = FORMAT_YYYY_MM_DD.format(yesterday) + " " + " 07:50:00"; + //String endDateTime = TimeTool.getToday() + " 08:00:00"; + String startDateTime = "2024-09-15 07:50:00"; + String endDateTime = "2024-09-16 08:00:00"; + // List list = Stream.of("760BFoaming").collect(Collectors.toList()); DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); - DdlPreparedPack.getInPackList(list, "equipmentCode", ddlPackBean); + //DdlPreparedPack.getInPackList(list, "equipmentCode", ddlPackBean); DdlPreparedPack.getNumEqualPack(10, "equipmentType", ddlPackBean); List equipments = mesEquipmentRepository.findByHqlWhere(ddlPackBean); @@ -89,8 +100,8 @@ public class MesAccountJob extends BaseMesScheduleJob { DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); DdlPreparedPack.getStringEqualPack(equipment.getEquipmentCode(), "equipmentCode", packBean); - DdlPreparedPack.getStringSmallerNotEqualPack("2024-09-13 08:00:00", "createDatetime", packBean); - DdlPreparedPack.getStringBiggerPack("2024-09-12 08:00:00", "createDatetime", packBean); + DdlPreparedPack.getStringSmallerNotEqualPack(endDateTime, "createDatetime", packBean); + DdlPreparedPack.getStringBiggerPack(startDateTime, "createDatetime", packBean); DdlPreparedPack.getOrderBy("createDatetime", CommonEnumUtil.ASC_OR_DESC.ASC.getValue(), packBean); List recordLogs = mesProductRecordLogRepository.findByHqlWhere(packBean); diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/schedulejob/MesGenerateAccountJob.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/schedulejob/MesGenerateAccountJob.java index f7f840d..2fd1566 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/schedulejob/MesGenerateAccountJob.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/schedulejob/MesGenerateAccountJob.java @@ -1,14 +1,18 @@ package cn.estsh.i3plus.ext.mes.apiservice.schedulejob; +import cn.estsh.i3plus.ext.mes.api.base.IMesProductionRecordService; import cn.estsh.i3plus.mes.apiservice.schedulejob.BaseMesScheduleJob; import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; import cn.estsh.i3plus.pojo.mes.bean.*; +import cn.estsh.i3plus.pojo.mes.model.report.MesProductAccountModel; +import cn.estsh.i3plus.pojo.mes.model.report.MesProductAccountResModel; import cn.estsh.i3plus.pojo.mes.repository.*; import cn.estsh.impp.framework.boot.init.ApplicationProperties; import cn.hutool.json.JSONObject; +import com.google.common.base.Objects; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.commons.beanutils.BeanUtils; @@ -18,6 +22,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; import java.util.ArrayList; import java.util.List; @@ -50,6 +55,9 @@ public class MesGenerateAccountJob extends BaseMesScheduleJob { @Autowired private MesMouldMultiCavityRepository mesMouldMultiCavityRepository; + @Autowired + private IMesProductionRecordService mesProductionRecordService; + public MesGenerateAccountJob() { super(MesGenerateAccountJob.class, "生成对账数据job"); } @@ -71,90 +79,222 @@ public class MesGenerateAccountJob extends BaseMesScheduleJob { if (null == userName) { userName = "JOB"; } - List list = Stream.of("HT1400", "50THotPress").collect(Collectors.toList()); - DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); - DdlPreparedPack.getInPackList(list, "equipmentCode", ddlPackBean); - - List equipments = mesEquipmentRepository.findByHqlWhere(ddlPackBean); - if (CollectionUtils.isEmpty(equipments)) { - return; + /** + * 760B_A58_ReMaoHan 只有finish信号 + * 760BFoaming + * 760B_LaserCutting + * ZhenKong + */ + List equimentList = Stream.of("760B_A58_ReMaoHan","760BFoaming","760B_LaserCutting","ZhenKong").collect(Collectors.toList()); + MesProductAccountModel productAccountModel = new MesProductAccountModel(); + productAccountModel.setStartTime("2024-09-12 08:00:00"); + productAccountModel.setEndTime("2024-09-13 08:00:00"); + productAccountModel.setEquipmentCode("HT2400APrinter_MixUA"); + productAccountModel.setPartNo("Y0556325-01"); + List mesProductAccountResModels = mesProductionRecordService.queryProductAccount(productAccountModel); + if (!CollectionUtils.isEmpty(mesProductAccountResModels)) { + mesProductAccountResModels = mesProductAccountResModels.stream().filter(mesProductAccountResModel -> mesProductAccountResModel.getDetailCount().compareTo(mesProductAccountResModel.getProductCount())> 0) .collect(Collectors.toList()); } - for (MesEquipment equipment : equipments) { - if (equipment.getEquipmentName().contains("HT")) { - // 插入加工记录 + if (!CollectionUtils.isEmpty(mesProductAccountResModels)) { + for (MesProductAccountResModel mesProductAccountResModel : mesProductAccountResModels) { DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); - DdlPreparedPack.getStringEqualPack(equipment.getEquipmentCode(), "equipmentCode", packBean); - DdlPreparedPack.getStringBiggerNotEqualPack("2024-09-12 00:00:00", "createDatetime", packBean); - - List productionRecords = mesProductionRecordRepository.findByHqlWhere(packBean); - List mesProductRecordLogs = new ArrayList<>(); - if (!CollectionUtils.isEmpty(productionRecords)) { - for (MesProductionRecord productionRecord : productionRecords) { - MesProductRecordLog mesProductRecordLog = new MesProductRecordLog(); - try { - BeanUtils.copyProperties(productionRecord, mesProductRecordLog); - mesProductRecordLog.setType("加工记录"); - mesProductRecordLogs.add(mesProductRecordLog); - } catch (Exception e) { - e.printStackTrace(); - } - } + DdlPreparedPack.getStringEqualPack(mesProductAccountResModel.getEquipmentCode(), "equipmentCode", packBean); + + DdlPreparedPack.getStringSmallerNotEqualPack(productAccountModel.getEndTime(), "createDatetime", packBean); + DdlPreparedPack.getStringBiggerPack(productAccountModel.getStartTime(), "createDatetime", packBean); + DdlPreparedPack.getStringEqualPack(mesProductAccountResModel.getPartNo(), "partNo", packBean); + DdlPreparedPack.getOrderBy("createDatetime", CommonEnumUtil.ASC_OR_DESC.ASC.getValue(), packBean); + List recordLogs = mesProductRecordLogRepository.findByHqlWhere(packBean); + if (mesProductAccountResModel.getEquipmentCode().contains("HT")) { + // 1 判断2个 shotcount之间有没有加工记录,如果没有,就需要看 设备是不是192,然后看是否是网络原因 + + String reason = handleHT(recordLogs); + mesProductAccountResModel.setErrorReason(reason); + } else if (equimentList.contains(mesProductAccountResModel.getEquipmentCode())) { + // 1 判断2个 shotcount之间有没有加工记录,如果没有,就需要看 设备是不是192,然后看是否是网络原因 + String reason =handleNotHT(recordLogs); + mesProductAccountResModel.setErrorReason(reason); + } else { + String reason =handleNotHTAndHasRelease(recordLogs); + mesProductAccountResModel.setErrorReason(reason); } - // 插入opc logdetail数据 - DdlPackBean mesEquipmentLogDetailBean = DdlPackBean.getDdlPackBean(organizeCode); - - DdlPreparedPack.getStringEqualPack(equipment.getEquipmentCode(), "equipmentCode", mesEquipmentLogDetailBean); - DdlPreparedPack.getStringLikeEqualPack("ShotCounter", "equipVariableName", mesEquipmentLogDetailBean); - DdlPreparedPack.getStringBiggerNotEqualPack("2024-09-12 00:00:00", "createDatetime", mesEquipmentLogDetailBean); - - List equipmentLogDetails = mesEquipmentLogDetailRepository.findByHqlWhere(mesEquipmentLogDetailBean); - if (!CollectionUtils.isEmpty(equipmentLogDetails)) { - for (MesEquipmentLogDetail mesEquipmentLogDetail : equipmentLogDetails) { - MesProductRecordLog mesProductRecordLog = new MesProductRecordLog(); - try { - BeanUtils.copyProperties(mesEquipmentLogDetail, mesProductRecordLog); - mesProductRecordLog.setType("设备日志信息"); - mesProductRecordLogs.add(mesProductRecordLog); - } catch (Exception e) { - e.printStackTrace(); - } + } + } + } + + private String handleNotHT(List recordLogs) { + int result = 0; + String startTime = ""; + String endTime = ""; + int errorCount = 0; + String reason = ""; + String reasonOffline = "【%s】到【%s】,客户端下线,导致【%s】个完成信号丢失"; + String reasonQuality = "【%s】到【%s】设备信号质量有问题,导致【%s】个完成信号丢失"; + String reasonBypass = "【%s】到【%s】设备信号Bypass,【%s】个完成信号丢失"; + boolean bypassFlag = false; + + List finishList = Stream.of("Product_finish","PART_OK","Part_Finish","Product_OK").collect(Collectors.toList()); + + for (MesProductRecordLog recordLog : recordLogs) { + if (Objects.equal(recordLog.getCategoryLevelTwo(), "BYPASS")) { + if (Objects.equal(recordLog.getEquipVariableValue(), "True")) { + if (StringUtils.isEmpty(startTime)) { + startTime = recordLog.getCreateDatetime(); + } + endTime = recordLog.getCreateDatetime(); + // 每次都取反,第一次是打开,那第二次就是关闭了 + bypassFlag = true; + continue; + } else { + if (bypassFlag) { + bypassFlag = false; + errorCount = 0; + continue; } } - // 更新磨具号数据得到的partNo - DdlPackBean mesEquipmentDetailBean = DdlPackBean.getDdlPackBean(organizeCode); - - DdlPreparedPack.getStringEqualPack(equipment.getEquipmentCode(), "equipmentCode", mesEquipmentDetailBean); - DdlPreparedPack.getStringLikeEqualPack("InjDataSeries", "equipVariableName", mesEquipmentDetailBean); - DdlPreparedPack.getStringSmallerNotEqualPack("2024-09-12 00:00:00", "createDatetime", mesEquipmentDetailBean); - DdlPreparedPack.getOrderBy("createDatetime", CommonEnumUtil.ASC_OR_DESC.DESC.getValue(), mesEquipmentDetailBean); - - List equipmentLogDetailList = mesEquipmentLogDetailRepository.findByHqlTopWhere(mesEquipmentLogDetailBean, 20); - if (!CollectionUtils.isEmpty(equipmentLogDetailList)) { - for (MesEquipmentLogDetail mesEquipmentLogDetail : equipmentLogDetails) { - MesProductRecordLog mesProductRecordLog = new MesProductRecordLog(); - try { - BeanUtils.copyProperties(mesEquipmentLogDetail, mesProductRecordLog); - mesProductRecordLog.setType("模具号"); - - DdlPackBean mouldMultipackBean = DdlPackBean.getDdlPackBean(organizeCode); - DdlPreparedPack.getStringEqualPack(mesEquipmentLogDetail.getEquipVariableValue(),"mouldNo", mouldMultipackBean); - List mesMouldMultiCavities = mesMouldMultiCavityRepository.findByHqlWhere(mouldMultipackBean); - - mesProductRecordLogs.add(mesProductRecordLog); - } catch (Exception e) { - e.printStackTrace(); - } + } + if (bypassFlag && recordLog.getType().equals("record")) { + errorCount ++; + reason = String.format(reasonBypass,startTime, endTime, errorCount +""); + continue; + } + + + if (result == 0) { + if (!finishList.contains(recordLog.getCategoryLevelTwo()) || !Objects.equal(recordLog.getEquipVariableValue(), "True")) { + continue; + } + result ++; + } else { + if (finishList.contains(recordLog.getCategoryLevelTwo()) && Objects.equal(recordLog.getEquipVariableValue(), "True")) { + if (StringUtils.isEmpty(startTime)) { + startTime = recordLog.getCreateDatetime(); } + errorCount ++; + endTime = recordLog.getCreateDatetime(); + if (Objects.equal(recordLog.getQuality(), "192")) { + reason += String.format(reasonOffline,startTime, endTime, errorCount +""); + } else { + reason += String.format(reasonQuality,startTime, endTime, errorCount +""); + } + } + if (recordLog.getType().equals("record")) { + result --; } + } + } + return reason; + } + + private String handleNotHTAndHasRelease(List recordLogs) { + int result = 0; + String startTime = ""; + String endTime = ""; + int errorCount = 0; + String reason = ""; + String reasonOffline = "【%s】到【%s】,客户端下线,导致【%s】个完成信号丢失"; + String reasonQuality = "【%s】到【%s】设备信号质量有问题,导致【%s】个完成信号丢失"; + String reasonBypass = "【%s】到【%s】设备信号Bypass,【%s】个完成信号丢失"; + String releaseBypass = "【%s】到【%s】设备信号没有个release就给了完成新号,导致【%s】个完成信号丢失"; + + + + boolean bypassFlag = false; + boolean releaseFlag = false; - mesProductRecordLogRepository.saveAll(mesProductRecordLogs); + List finishList = Stream.of("Product_finish","PART_OK","Part_Finish","Product_OK").collect(Collectors.toList()); + for (MesProductRecordLog recordLog : recordLogs) { + if (Objects.equal(recordLog.getCategoryLevelTwo(), "BYPASS") && Objects.equal(recordLog.getEquipVariableValue(), "True")) { + if (StringUtils.isEmpty(startTime)) { + startTime = recordLog.getCreateDatetime(); + } + endTime = recordLog.getCreateDatetime(); + // 每次都取反,第一次是打开,那第二次就是关闭了 + bypassFlag = !bypassFlag; + if (!bypassFlag) { + errorCount = 0; + } + continue; + } + if (bypassFlag && recordLog.getType().equals("record")) { + errorCount ++; + reason = String.format(reasonBypass,startTime, endTime, errorCount +""); + continue; + } + + if (result == 0) { + if (Objects.equal(recordLog.getCategoryLevelTwo(), "Work_Allow") && Objects.equal(recordLog.getEquipVariableValue(), "True")) { + releaseFlag = true; + continue; + } + if (!finishList.contains(recordLog.getCategoryLevelTwo()) || !Objects.equal(recordLog.getEquipVariableValue(), "True")) { + continue; + } + result ++; + } else { + if (finishList.contains(recordLog.getCategoryLevelTwo()) && Objects.equal(recordLog.getEquipVariableValue(), "True")) { + if (StringUtils.isEmpty(startTime)) { + startTime = recordLog.getCreateDatetime(); + } + errorCount ++; + endTime = recordLog.getCreateDatetime(); + if (!releaseFlag) { + reason = String.format(releaseBypass,startTime, endTime, errorCount +""); + } else { + if (Objects.equal(recordLog.getQuality(), "192")) { + reason = String.format(reasonOffline,startTime, endTime, errorCount +""); + } else { + reason = String.format(reasonQuality,startTime, endTime, errorCount +""); + } + } + } + if (recordLog.getType().equals("record")) { + result --; + } } } - // + return reason; + } + + private String handleHT(List recordLogs) { + int result = 0; + String startTime = ""; + String endTime = ""; + int errorCount = 0; + String reason = ""; + String reasonOffline = "【%s】到【%s】,客户端下线,导致【%s】个完成信号丢失"; + String reasonQuality = "【%s】到【%s】设备信号质量有问题,导致【%s】个完成信号丢失"; + for (MesProductRecordLog recordLog : recordLogs) { + if (result == 0) { + if (!Objects.equal(recordLog.getCategoryLevelTwo(),"shot_counter") ) { + continue; + } + if (recordLog.getEquipVariableValue().compareTo("0") > 0) { + result ++; + } + } else { + if (Objects.equal(recordLog.getCategoryLevelTwo(),"shot_counter") && recordLog.getEquipVariableValue().compareTo("0") > 0) { + if (StringUtils.isEmpty(startTime)) { + startTime = recordLog.getCreateDatetime(); + } + errorCount ++; + endTime = recordLog.getCreateDatetime(); + if (Objects.equal(recordLog.getQuality(), "192")) { + reason = String.format(reasonOffline,startTime, endTime, errorCount +""); + } else { + reason = String.format(reasonQuality,startTime, endTime, errorCount +""); + } + } + if (recordLog.getType().equals("record")) { + result --; + } + } + } + return reason; } } diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesProductionRecordServiceImpl.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesProductionRecordServiceImpl.java index 784d26c..0b014c8 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesProductionRecordServiceImpl.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesProductionRecordServiceImpl.java @@ -5,6 +5,7 @@ import cn.estsh.i3plus.ext.mes.apiservice.dao.IMesProdRuleNosortCfgDao; import cn.estsh.i3plus.ext.mes.apiservice.utils.BeanUtil; import cn.estsh.i3plus.ext.mes.apiservice.utils.MesException; import cn.estsh.i3plus.ext.mes.pojo.model.MesLoadingListDetailModel; +import cn.estsh.i3plus.ext.mes.pojo.model.MesShippingOrderManagementDetailModel; import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; import cn.estsh.i3plus.pojo.base.bean.ListPager; import cn.estsh.i3plus.pojo.base.common.Pager; @@ -14,15 +15,19 @@ import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; import cn.estsh.i3plus.pojo.base.util.StringUtil; import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleNosortCfg; import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn; +import cn.estsh.i3plus.pojo.mes.bean.MesProductRecordLog; import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord; import cn.estsh.i3plus.pojo.mes.bean.shipping.MesLoadingListDetail; import cn.estsh.i3plus.pojo.mes.model.MesProductionRecordModel; import cn.estsh.i3plus.pojo.mes.model.report.MesProductAccountModel; import cn.estsh.i3plus.pojo.mes.model.report.MesProductAccountResModel; import cn.estsh.i3plus.pojo.mes.repository.MesProduceSnRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesProductRecordLogRepository; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import com.google.common.base.Objects; import lombok.extern.slf4j.Slf4j; import org.hibernate.SQLQuery; +import org.hibernate.query.internal.NativeQueryImpl; import org.hibernate.transform.Transformers; import org.mvel2.util.Make; import org.springframework.beans.BeanUtils; @@ -38,6 +43,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * @Description : 设备加工记录表 @@ -58,6 +64,9 @@ public class MesProductionRecordServiceImpl extends BaseMesService findMesProductionRecord(String organizeCode, String sn) { DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); @@ -115,14 +124,20 @@ public class MesProductionRecordServiceImpl extends BaseMesService queryProductAccount(MesProductAccountModel productAccountModel, Pager pager) { - String sqlStr = "SELECT\n" + - "\tmpr.part_no,\n" + - "\tmpr.equipment_code,\n" + - "\tme.equipment_name,\n" + - "\tme.work_cell_code,\n" + - "\tme.work_center_code,\n" + - "\tmpr.product_count,\n" + - "\tmpr.detail_count\n" + + List resList = new ArrayList<>(); + + String sqlStr = "select mpr.part_no,mpr.equipment_code,mpr.equipment_name,mpr.work_cell_code,mpr.work_center_code," + + "mpr.product_count,mpr.detail_count,error_reason from (\n" + + "\n" + + "SELECT\n" + + "\tmpr.part_no ,\n" + + "\tmpr.equipment_code ,\n" + + "\tme.equipment_name ,\n" + + "\tme.work_cell_code ,\n" + + "\tme.work_center_code ,\n" + + "\tmpr.product_count ,\n" + + "\tmpr.detail_count , \n" + + "\t null error_reason\n" + "\t\n" + "FROM\n" + "\t(\n" + @@ -158,16 +173,17 @@ public class MesProductionRecordServiceImpl extends BaseMesService results = query.getResultList();*/ + List results = query.getResultList(); + for (Object result : results) { + Object[] cells = (Object[]) result; + MesProductAccountResModel model = new MesProductAccountResModel(); + model.setPartNo(StringUtils.isEmpty(cells[0]) ? "" : String.valueOf(cells[0])); + model.setEquipmentCode(StringUtils.isEmpty(cells[1]) ? "" : String.valueOf(cells[1])); + model.setWorkCellCode(StringUtils.isEmpty(cells[3]) ? "" : String.valueOf(cells[3])); + model.setWorkCenterCode(StringUtils.isEmpty(cells[4]) ? "" : String.valueOf(cells[4])); + model.setProductCount(StringUtils.isEmpty(cells[5]) ? "" : String.valueOf(cells[5])); + model.setDetailCount(StringUtils.isEmpty(cells[6]) ? "" : String.valueOf(cells[6])); + model.setErrorReason(StringUtils.isEmpty(cells[7]) ? "" : String.valueOf(cells[7])); + + resList.add(model); + } + + //query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(MesProductAccountResModel.class)); + //List results = query.getResultList(); + + + + return new ListPager<>(resList,pager); + } + + @Override + public List queryProductAccount(MesProductAccountModel productAccountModel) { + List resList = new ArrayList<>(); + + String sqlStr = "select mpr.part_no,mpr.equipment_code,mpr.equipment_name,mpr.work_cell_code,mpr.work_center_code," + + "mpr.product_count,mpr.detail_count,error_reason from (\n" + + "\n" + + "SELECT\n" + + "\tmpr.part_no ,\n" + + "\tmpr.equipment_code ,\n" + + "\tme.equipment_name ,\n" + + "\tme.work_cell_code ,\n" + + "\tme.work_center_code ,\n" + + "\tmpr.product_count ,\n" + + "\tmpr.detail_count , \n" + + "\t null error_reason\n" + + "\t\n" + + "FROM\n" + + "\t(\n" + + "\tSELECT\n" + + "\t\tequipment_code,\n" + + "\t\tpart_no,\n" + + "\t\tsum( CASE WHEN type = 'record' THEN 1 ELSE 0 END ) product_count,\n" + + "\t\tsum( CASE WHEN type = 'logdetail' and CATEGORY_LEVEL_TWO ='shot_counter' and EQUIP_VARIABLE_VALUE > 0 THEN 1 ELSE 0 END ) detail_count \n" + + "\tFROM\n" + + "\t\tmes_product_record_log \n" + + "\tWHERE\n" + + "\t\tequipment_code LIKE '%HT%' \n"; + + if (!StringUtils.isEmpty(productAccountModel.getEquipmentCode())) { + sqlStr += " and equipment_code = :equipmentCode "; + } if (!StringUtils.isEmpty(productAccountModel.getPartNo())) { + sqlStr += " and part_no like '%' :partNo '%' "; + } if (!StringUtils.isEmpty(productAccountModel.getStartTime())) { + sqlStr += " and create_date_time >= :startTime "; + } if (!StringUtils.isEmpty(productAccountModel.getEndTime())) { + sqlStr += " and create_date_time < :endTime "; + } + + + sqlStr += + "\t\tAND part_no IS NOT NULL \n" + + "\tGROUP BY\n" + + "\t\tequipment_code,\n" + + "\t\tpart_no \n" + + "\t) mpr\n" + + "\tLEFT JOIN mes_wc_equipment me ON mpr.equipment_code = me.equipment_code \n" + + "\n" + + "\n" + + "UNION\n" + + "SELECT\n" + + "\tmprnc.out_part_no part_no,\n" + + "\tmprnc.equipment_code ,\n" + + "\tme.equipment_name ,\n" + + "\tme.work_cell_code ,\n" + + "\tme.work_center_code ,\n" + + "\teqcount.product_count ,\n" + + "\teqcount.detail_count , \n" + + "\t null error_reason \n" + + "FROM\n" + + "\tmes_prod_rule_nosort_cfg mprnc\n" + + "\tLEFT JOIN mes_wc_equipment me ON mprnc.equipment_code = me.equipment_code and me.is_deleted = 2 and me.is_valid = 1 \n" + + "\tLEFT JOIN (\n" + + "\tSELECT\n" + + "\t\tequipment_code,\n" + + "\t\tpart_no,\n" + + "\t\tsum( CASE WHEN type = 'record' THEN 1 ELSE 0 END ) product_count,\n" + + "\t\tsum(\n" + + "\t\tCASE\n" + + "\t\t\t\t\n" + + "\t\t\t\tWHEN type = 'logdetail' \n" + + "\t\t\t\tAND CATEGORY_LEVEL_TWO IN ( 'Product_finish', 'PART_OK', 'Part_Finish', 'Product_OK' ) \n" + + "\t\t\t\tAND EQUIP_VARIABLE_VALUE = 'True' THEN\n" + + "\t\t\t\t\t1 ELSE 0 \n" + + "\t\t\t\tEND \n" + + "\t\t\t\t) detail_count \n" + + "\t\t\tFROM\n" + + "\t\t\t\tmes_product_record_log \n" + + "\t\t\tWHERE 1 = 1 \n"; + if (!StringUtils.isEmpty(productAccountModel.getEquipmentCode())) { + sqlStr += "\t\t\t and equipment_code = :equipmentCode \n"; + } if (!StringUtils.isEmpty(productAccountModel.getPartNo())) { + sqlStr += "\t\t\t and part_no= :partNo \n"; + } if (!StringUtils.isEmpty(productAccountModel.getStartTime())) { + sqlStr += "\t\t\t and create_date_time >= :startTime \n"; + } if (!StringUtils.isEmpty(productAccountModel.getEndTime())) { + sqlStr += "\t\t\t and create_date_time < :endTime \n"; + } + sqlStr += + "\t\t\t and \n" + + "\t\t\t\tpart_no IS NOT NULL \n" + + "\t\t\tGROUP BY\n" + + "\t\t\t\tequipment_code,\n" + + "\t\t\t\tpart_no \n" + + "\t\t\t) eqcount ON mprnc.equipment_code = eqcount.equipment_code \n" + + "\t AND mprnc.out_part_no = eqcount.part_no where 1=1 "; + if (!StringUtils.isEmpty(productAccountModel.getEquipmentCode())) { + sqlStr += "and mprnc.equipment_code= :equipmentCode "; + } + sqlStr += "\tand eqcount.product_count is not null and eqcount.detail_count is not null ) mpr \n" + + "\t\n" + + "\tleft join mes_equipment me\n" + + "\ton mpr.equipment_code = me.equipment_code\n" + + "\n" + + "where mpr.product_count != 0 and mpr.detail_count != 0\n" + + "and me.equipment_type = 10"; Query query = entityManager.createNativeQuery(sqlStr); @@ -222,11 +391,29 @@ public class MesProductionRecordServiceImpl extends BaseMesService list = query.getResultList(); + /* query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(MesProductAccountResModel.class)); + List results = query.getResultList();*/ + List results = query.getResultList(); + for (Object result : results) { + Object[] cells = (Object[]) result; + MesProductAccountResModel model = new MesProductAccountResModel(); + model.setPartNo(StringUtils.isEmpty(cells[0]) ? "" : String.valueOf(cells[0])); + model.setEquipmentCode(StringUtils.isEmpty(cells[1]) ? "" : String.valueOf(cells[1])); + model.setWorkCellCode(StringUtils.isEmpty(cells[3]) ? "" : String.valueOf(cells[3])); + model.setWorkCenterCode(StringUtils.isEmpty(cells[4]) ? "" : String.valueOf(cells[4])); + model.setProductCount(StringUtils.isEmpty(cells[5]) ? "" : String.valueOf(cells[5])); + model.setDetailCount(StringUtils.isEmpty(cells[6]) ? "" : String.valueOf(cells[6])); + model.setErrorReason(StringUtils.isEmpty(cells[7]) ? "" : String.valueOf(cells[7])); + + resList.add(model); + } + + //query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(MesProductAccountResModel.class)); + //List results = query.getResultList(); - return new ListPager<>(list,pager); + return resList; } private List getMesProduceSnList(MesProductionRecordModel mesProductionRecordModel) { @@ -339,4 +526,227 @@ public class MesProductionRecordServiceImpl extends BaseMesService transferAccount(List mesProductAccountResModels, MesProductAccountModel productAccountModel) { + /** + * 760B_A58_ReMaoHan 只有finish信号 + * 760BFoaming + * 760B_LaserCutting + * ZhenKong + */ + List equimentList = Stream.of("760B_A58_ReMaoHan","760BFoaming","760B_LaserCutting","ZhenKong").collect(Collectors.toList()); + + if (!CollectionUtils.isEmpty(mesProductAccountResModels)) { + mesProductAccountResModels = mesProductAccountResModels.stream().filter(mesProductAccountResModel ->{ + int size = mesProductAccountResModel.getPartNo().split(",").length; + int productCount = Integer.valueOf(mesProductAccountResModel.getProductCount()); + int detailCount = Integer.valueOf(mesProductAccountResModel.getDetailCount()); + if (detailCount * size > productCount) { + return true; + } + return false; + } ) .collect(Collectors.toList()); + } + if (!CollectionUtils.isEmpty(mesProductAccountResModels)) { + for (MesProductAccountResModel mesProductAccountResModel : mesProductAccountResModels) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean("CK01"); + DdlPreparedPack.getStringEqualPack(mesProductAccountResModel.getEquipmentCode(), "equipmentCode", packBean); + + DdlPreparedPack.getStringSmallerNotEqualPack(productAccountModel.getEndTime(), "createDatetime", packBean); + DdlPreparedPack.getStringBiggerPack(productAccountModel.getStartTime(), "createDatetime", packBean); + DdlPreparedPack.getStringEqualPack(mesProductAccountResModel.getPartNo(), "partNo", packBean); + + DdlPreparedPack.getOrderBy("createDatetime", CommonEnumUtil.ASC_OR_DESC.ASC.getValue(), packBean); + List recordLogs = mesProductRecordLogRepository.findByHqlWhere(packBean); + if (mesProductAccountResModel.getEquipmentCode().contains("HT")) { + // 1 判断2个 shotcount之间有没有加工记录,如果没有,就需要看 设备是不是192,然后看是否是网络原因 + + String reason = handleHT(recordLogs); + mesProductAccountResModel.setErrorReason(reason); + } else if (equimentList.contains(mesProductAccountResModel.getEquipmentCode())) { + // 1 判断2个 shotcount之间有没有加工记录,如果没有,就需要看 设备是不是192,然后看是否是网络原因 + String reason =handleNotHT(recordLogs); + mesProductAccountResModel.setErrorReason(reason); + } else { + String reason =handleNotHTAndHasRelease(recordLogs); + mesProductAccountResModel.setErrorReason(reason); + } + } + } + return mesProductAccountResModels; + } + + private String handleNotHT(List recordLogs) { + int result = 0; + String startTime = ""; + String endTime = ""; + int errorCount = 0; + String reason = ""; + String reasonOffline = "【%s】到【%s】,客户端下线,导致【%s】个完成信号丢失"; + String reasonQuality = "【%s】到【%s】设备信号质量有问题,导致【%s】个完成信号丢失"; + String reasonBypass = "【%s】到【%s】设备信号Bypass,【%s】个完成信号丢失"; + boolean bypassFlag = false; + + List finishList = Stream.of("Product_finish","PART_OK","Part_Finish","Product_OK").collect(Collectors.toList()); + + for (MesProductRecordLog recordLog : recordLogs) { + if (Objects.equal(recordLog.getCategoryLevelTwo(), "BYPASS")) { + if (Objects.equal(recordLog.getEquipVariableValue(), "True")) { + if (StringUtils.isEmpty(startTime)) { + startTime = recordLog.getCreateDatetime(); + } + endTime = recordLog.getCreateDatetime(); + // 每次都取反,第一次是打开,那第二次就是关闭了 + bypassFlag = true; + continue; + } else { + if (bypassFlag) { + bypassFlag = false; + errorCount = 0; + continue; + } + } + } + if (bypassFlag && recordLog.getType().equals("record")) { + errorCount ++; + reason = String.format(reasonBypass,startTime, endTime, errorCount +""); + continue; + } + + + if (result == 0) { + if (!finishList.contains(recordLog.getCategoryLevelTwo()) || !Objects.equal(recordLog.getEquipVariableValue(), "True")) { + continue; + } + result ++; + } else { + if (finishList.contains(recordLog.getCategoryLevelTwo()) && Objects.equal(recordLog.getEquipVariableValue(), "True")) { + if (StringUtils.isEmpty(startTime)) { + startTime = recordLog.getCreateDatetime(); + } + errorCount ++; + endTime = recordLog.getCreateDatetime(); + if (Objects.equal(recordLog.getQuality(), "192")) { + reason = String.format(reasonOffline,startTime, endTime, errorCount +""); + } else { + reason = String.format(reasonQuality,startTime, endTime, errorCount +""); + } + } + if (recordLog.getType().equals("record")) { + result --; + } + } + } + return reason; + } + + private String handleNotHTAndHasRelease(List recordLogs) { + int result = 0; + String startTime = ""; + String endTime = ""; + int errorCount = 0; + String reason = ""; + String reasonOffline = "【%s】到【%s】,客户端下线,导致【%s】个完成信号丢失"; + String reasonQuality = "【%s】到【%s】设备信号质量有问题,导致【%s】个完成信号丢失"; + String reasonBypass = "【%s】到【%s】设备信号Bypass,【%s】个完成信号丢失"; + String releaseBypass = "【%s】到【%s】设备信号没有个release就给了完成新号,导致【%s】个完成信号丢失"; + + + + boolean bypassFlag = false; + boolean releaseFlag = false; + + List finishList = Stream.of("Product_finish","PART_OK","Part_Finish","Product_OK").collect(Collectors.toList()); + + for (MesProductRecordLog recordLog : recordLogs) { + if (Objects.equal(recordLog.getCategoryLevelTwo(), "BYPASS") && Objects.equal(recordLog.getEquipVariableValue(), "True")) { + if (StringUtils.isEmpty(startTime)) { + startTime = recordLog.getCreateDatetime(); + } + endTime = recordLog.getCreateDatetime(); + // 每次都取反,第一次是打开,那第二次就是关闭了 + bypassFlag = !bypassFlag; + if (!bypassFlag) { + errorCount = 0; + } + continue; + } + if (bypassFlag && recordLog.getType().equals("record")) { + errorCount ++; + reason = String.format(reasonBypass,startTime, endTime, errorCount +""); + continue; + } + + if (result == 0) { + if (Objects.equal(recordLog.getCategoryLevelTwo(), "Work_Allow") && Objects.equal(recordLog.getEquipVariableValue(), "True")) { + releaseFlag = true; + continue; + } + if (!finishList.contains(recordLog.getCategoryLevelTwo()) || !Objects.equal(recordLog.getEquipVariableValue(), "True")) { + continue; + } + result ++; + + } else { + if (finishList.contains(recordLog.getCategoryLevelTwo()) && Objects.equal(recordLog.getEquipVariableValue(), "True")) { + if (StringUtils.isEmpty(startTime)) { + startTime = recordLog.getCreateDatetime(); + } + errorCount ++; + endTime = recordLog.getCreateDatetime(); + if (!releaseFlag) { + reason = String.format(releaseBypass,startTime, endTime, errorCount +""); + } else { + if (Objects.equal(recordLog.getQuality(), "192")) { + reason = String.format(reasonOffline,startTime, endTime, errorCount +""); + } else { + reason = String.format(reasonQuality,startTime, endTime, errorCount +""); + } + } + } + if (recordLog.getType().equals("record")) { + result --; + } + } + } + return reason; + } + + private String handleHT(List recordLogs) { + int result = 0; + String startTime = ""; + String endTime = ""; + int errorCount = 0; + String reason = ""; + String reasonOffline = "【%s】到【%s】,客户端下线,导致【%s】个完成信号丢失"; + String reasonQuality = "【%s】到【%s】设备信号质量有问题,导致【%s】个完成信号丢失"; + + for (MesProductRecordLog recordLog : recordLogs) { + if (result == 0) { + if (!Objects.equal(recordLog.getCategoryLevelTwo(),"shot_counter") ) { + continue; + } + if (recordLog.getEquipVariableValue().compareTo("0") > 0) { + result ++; + } + } else { + if (Objects.equal(recordLog.getCategoryLevelTwo(),"shot_counter") && recordLog.getEquipVariableValue().compareTo("0") > 0) { + if (StringUtils.isEmpty(startTime)) { + startTime = recordLog.getCreateDatetime(); + } + errorCount ++; + endTime = recordLog.getCreateDatetime(); + if (Objects.equal(recordLog.getQuality(), "192")) { + reason = String.format(reasonOffline,startTime, endTime, errorCount +""); + } else { + reason = String.format(reasonQuality,startTime, endTime, errorCount +""); + } + } + if (recordLog.getType().equals("record")) { + result --; + } + } + } + return reason; + } }