对账单信息

tags/yfai-mes-ext-v2.0
xiangwei.zhang 8 months ago
parent d8d0c0721a
commit 111b90fcb3

@ -30,4 +30,9 @@ public interface IMesProductionRecordService extends IBaseMesService<MesProducti
@ApiOperation(value = "线边库存报表")
ListPager<MesProductAccountResModel> queryProductAccount(MesProductAccountModel productAccountModel, Pager pager);
@ApiOperation(value = "线边库存报表")
List<MesProductAccountResModel> queryProductAccount(MesProductAccountModel productAccountModel);
@ApiOperation(value = "线边库存报表")
List<MesProductAccountResModel> transferAccount(List<MesProductAccountResModel> list,MesProductAccountModel productAccountModel);
}

@ -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);
}
}

@ -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<MesProductAccountResModel> mesProductAccountResModels = mesProductionRecordService.queryProductAccount(productAccountModel);
List<MesProductAccountResModel> 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) {

@ -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 {
}

@ -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<String> 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<String> 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<MesEquipment> 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<MesProductRecordLog> recordLogs = mesProductRecordLogRepository.findByHqlWhere(packBean);

@ -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<String> list = Stream.of("HT1400", "50THotPress").collect(Collectors.toList());
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getInPackList(list, "equipmentCode", ddlPackBean);
List<MesEquipment> equipments = mesEquipmentRepository.findByHqlWhere(ddlPackBean);
if (CollectionUtils.isEmpty(equipments)) {
return;
/**
* 760B_A58_ReMaoHan finish
* 760BFoaming
* 760B_LaserCutting
* ZhenKong
*/
List<String> 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<MesProductAccountResModel> 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<MesProductionRecord> productionRecords = mesProductionRecordRepository.findByHqlWhere(packBean);
List<MesProductRecordLog> 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<MesProductRecordLog> 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<MesEquipmentLogDetail> 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<MesProductRecordLog> 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<String> 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<MesEquipmentLogDetail> 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<MesMouldMultiCavity> 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<MesProductRecordLog> 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<String> 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<MesProductRecordLog> 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;
}
}

@ -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<MesProduction
@Autowired
private MesProduceSnRepository mesProduceSnRepository;
@Autowired
private MesProductRecordLogRepository mesProductRecordLogRepository;
@Override
public List<MesProductionRecord> findMesProductionRecord(String organizeCode, String sn) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
@ -115,14 +124,20 @@ public class MesProductionRecordServiceImpl extends BaseMesService<MesProduction
@Override
public ListPager<MesProductAccountResModel> 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<MesProductAccountResModel> 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<MesProduction
"\n" +
"UNION\n" +
"SELECT\n" +
"\tmprnc.out_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" +
"\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 \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" +
@ -205,7 +221,160 @@ public class MesProductionRecordServiceImpl extends BaseMesService<MesProduction
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";
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);
if (!StringUtils.isEmpty(productAccountModel.getEquipmentCode())) {
query.setParameter("equipmentCode", productAccountModel.getEquipmentCode());
}
if (!StringUtils.isEmpty(productAccountModel.getPartNo())) {
query.setParameter("partNo", productAccountModel.getPartNo());
}
if (!StringUtils.isEmpty(productAccountModel.getStartTime())) {
query.setParameter("startTime", productAccountModel.getStartTime());
}
if (!StringUtils.isEmpty(productAccountModel.getEndTime())) {
query.setParameter("endTime", productAccountModel.getEndTime());
}
/* query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(MesProductAccountResModel.class));
List<MesProductAccountResModel> 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<MesProductAccountResModel> results = query.getResultList();
return new ListPager<>(resList,pager);
}
@Override
public List<MesProductAccountResModel> queryProductAccount(MesProductAccountModel productAccountModel) {
List<MesProductAccountResModel> 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<MesProduction
query.setParameter("endTime", productAccountModel.getEndTime());
}
List<MesProductAccountResModel> list = query.getResultList();
/* query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(MesProductAccountResModel.class));
List<MesProductAccountResModel> 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<MesProductAccountResModel> results = query.getResultList();
return new ListPager<>(list,pager);
return resList;
}
private List<MesProduceSn> getMesProduceSnList(MesProductionRecordModel mesProductionRecordModel) {
@ -339,4 +526,227 @@ public class MesProductionRecordServiceImpl extends BaseMesService<MesProduction
}
@Override
public List<MesProductAccountResModel> transferAccount(List<MesProductAccountResModel> mesProductAccountResModels, MesProductAccountModel productAccountModel) {
/**
* 760B_A58_ReMaoHan finish
* 760BFoaming
* 760B_LaserCutting
* ZhenKong
*/
List<String> 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<MesProductRecordLog> 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<MesProductRecordLog> 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<String> 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<MesProductRecordLog> 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<String> 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<MesProductRecordLog> 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;
}
}

Loading…
Cancel
Save