产线看板-“异常停线时间”部分需求未明确

tags/yfai-mes-ext-v1.0
logic.fang 11 months ago
parent aa6c6f58b3
commit dfa12c6df5

@ -13,6 +13,7 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@ -33,7 +34,7 @@ public class MesWorkCenterBoardController {
@ApiOperation(value = "查询产线状态", notes = "查询产线状态")
@PostMapping("/query-work-center-status")
public ResultBean queryWorkCenterStatus(MesWorkCenterBoardConditionModel conditionModel){
public ResultBean queryWorkCenterStatus(@RequestBody MesWorkCenterBoardConditionModel conditionModel){
try {
ValidatorBean.beginValid(conditionModel)
.notNull("workCenterCodeList", conditionModel.getWorkCenterCodeList())
@ -51,7 +52,7 @@ public class MesWorkCenterBoardController {
@ApiOperation(value = "查询产线生产完成率", notes = "查询产线生产完成率")
@PostMapping("/query-work-center-production-completion-rate")
public ResultBean queryWorkCenterProductionCompletionRate(MesWorkCenterBoardConditionModel conditionModel){
public ResultBean queryWorkCenterProductionCompletionRate(@RequestBody MesWorkCenterBoardConditionModel conditionModel){
try {
ValidatorBean.beginValid(conditionModel)
.notNull("workCenterCodeList", conditionModel.getWorkCenterCodeList())
@ -69,7 +70,7 @@ public class MesWorkCenterBoardController {
@ApiOperation(value = "查询产线工单完成情况", notes = "查询产线工单完成情况")
@PostMapping("/query-work-center-work-order-completion-status")
public ResultBean queryWorkCenterWorkOrderCompletionStatus(MesWorkCenterBoardConditionModel conditionModel){
public ResultBean queryWorkCenterWorkOrderCompletionStatus(@RequestBody MesWorkCenterBoardConditionModel conditionModel){
try {
ValidatorBean.beginValid(conditionModel)
.notNull("workCenterCodeList", conditionModel.getWorkCenterCodeList())
@ -87,7 +88,7 @@ public class MesWorkCenterBoardController {
@ApiOperation(value = "查询单位小时完工数", notes = "查询单位小时完工数")
@PostMapping("/query-unit-hour-completion-rate")
public ResultBean queryUnitHourCompletionRate(MesWorkCenterBoardConditionModel conditionModel){
public ResultBean queryUnitHourCompletionRate(@RequestBody MesWorkCenterBoardConditionModel conditionModel){
try {
ValidatorBean.beginValid(conditionModel)
.notNull("workCenterCodeList", conditionModel.getWorkCenterCodeList())
@ -105,7 +106,7 @@ public class MesWorkCenterBoardController {
@ApiOperation(value = "查询产线一次下线合格率", notes = "查询产线一次下线合格率")
@PostMapping("/query-work-center-first-time-offline-qualification-rate")
public ResultBean queryWorkCenterFirstTimeOfflineQualificationRate(MesWorkCenterBoardConditionModel conditionModel){
public ResultBean queryWorkCenterFirstTimeOfflineQualificationRate(@RequestBody MesWorkCenterBoardConditionModel conditionModel){
try {
ValidatorBean.beginValid(conditionModel)
.notNull("workCenterCodeList", conditionModel.getWorkCenterCodeList())
@ -123,7 +124,7 @@ public class MesWorkCenterBoardController {
@ApiOperation(value = "查询点检结果", notes = "查询点检结果")
@PostMapping("/query-inspection-results")
public ResultBean queryInspectionResults(MesWorkCenterBoardConditionModel conditionModel){
public ResultBean queryInspectionResults(@RequestBody MesWorkCenterBoardConditionModel conditionModel){
try {
ValidatorBean.beginValid(conditionModel)
.notNull("workCenterCodeList", conditionModel.getWorkCenterCodeList())
@ -141,7 +142,7 @@ public class MesWorkCenterBoardController {
@ApiOperation(value = "查询异常停线时间", notes = "查询异常停线时间")
@PostMapping("/query-abnormal-downtime")
public ResultBean queryAbnormalDowntime(MesWorkCenterBoardConditionModel conditionModel){
public ResultBean queryAbnormalDowntime(@RequestBody MesWorkCenterBoardConditionModel conditionModel){
try {
ValidatorBean.beginValid(conditionModel)
.notNull("workCenterCodeList", conditionModel.getWorkCenterCodeList())

@ -0,0 +1,46 @@
package cn.estsh.i3plus.ext.mes.apiservice.dao.board;
import cn.estsh.i3plus.ext.mes.pojo.model.board.MesWorkCenterBoardResultModel;
import cn.estsh.i3plus.pojo.mes.bean.MesShift;
import java.util.List;
/**
* @Description : -
* @Reference :
* @Author : logic
* @CreateDate : 2024/6/24 18:22
* @Modify:
**/
public interface IMesYfBoardDao {
/**
* 线
* @param workCenterCodeList 线
* @param organizeCode
* @param nowDateTime
* @return 线
*/
List<MesShift> queryMesShift(List<String> workCenterCodeList, String organizeCode, String nowDateTime);
/**
* 线
* @param workCenterCode 线
* @param organizeCode
* @param startTime
* @param endTime
* @return
*/
List<MesWorkCenterBoardResultModel> queryMesProductOffLineModel(String workCenterCode, String organizeCode, String startTime, String endTime);
/**
* 线
* @param workCenterCode 线
* @param organizeCode
* @param startTime
* @param endTime
* @return
*/
List<MesWorkCenterBoardResultModel> queryCompletedSnInfo(String workCenterCode, String organizeCode, String startTime, String endTime);
}

@ -0,0 +1,127 @@
package cn.estsh.i3plus.ext.mes.apiservice.daoimpl.board;
import cn.estsh.i3plus.ext.mes.apiservice.dao.board.IMesYfBoardDao;
import cn.estsh.i3plus.ext.mes.pojo.model.board.MesWorkCenterBoardResultModel;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesShift;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.util.List;
import java.util.stream.Collectors;
/**
* @Description : -
* @Reference :
* @Author : logic
* @CreateDate : 2024/6/24 18:22
* @Modify:
**/
@Service
public class MesYfBoardDaoImpl implements IMesYfBoardDao {
@Autowired
private EntityManager entityManager;
@Override
public List<MesShift> queryMesShift(List<String> workCenterCodeList, String organizeCode, String nowDateTime) {
StringBuffer queryShiftSql = new StringBuffer();
queryShiftSql.append("from MesShift " +
"where isValid = :isValid " +
"and isDeleted = :isDeleted " +
"and organizeCode = :organizeCode " +
"and workCenterCode in (:workCenterCodeList) " +
"and beginDate <= :nowDateTime " +
"and endDate >= :nowDateTime ");
Query shiftQuery = entityManager.createQuery(queryShiftSql.toString(), MesShift.class);
shiftQuery.setParameter("isValid", CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
shiftQuery.setParameter("isDeleted", CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
shiftQuery.setParameter("organizeCode", organizeCode);
shiftQuery.setParameter("workCenterCodeList", workCenterCodeList);
shiftQuery.setParameter("nowDateTime", nowDateTime);
return shiftQuery.getResultList();
}
@Override
public List<MesWorkCenterBoardResultModel> queryMesProductOffLineModel(String workCenterCode, String organizeCode,
String startTime, String endTime) {
StringBuffer queryMesProductOffLineSql = new StringBuffer();
queryMesProductOffLineSql.append("select distinct new " + MesWorkCenterBoardResultModel.class.getName() +
"(serialNumber, " +
"createDatetime) " +
"from MesProductOffLine " +
"where isValid = :isValid " +
"and isDeleted = :isDeleted " +
"and organizeCode = :organizeCode " +
"and workCenterCode = :workCenterCode " +
"and createDatetime >= :startTime " +
"and createDatetime <= :endTime ");
Query shiftQuery = entityManager.createQuery(queryMesProductOffLineSql.toString(), MesWorkCenterBoardResultModel.class);
shiftQuery.setParameter("isValid", CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
shiftQuery.setParameter("isDeleted", CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
shiftQuery.setParameter("organizeCode", organizeCode);
shiftQuery.setParameter("workCenterCode", workCenterCode);
shiftQuery.setParameter("startTime", startTime);
shiftQuery.setParameter("endTime", endTime);
return shiftQuery.getResultList();
}
@Override
public List<MesWorkCenterBoardResultModel> queryCompletedSnInfo(String workCenterCode, String organizeCode, String startTime, String endTime) {
//先查询生产加工表中指定时间区间、指定产线已加工完成的数据
StringBuffer queryMesProductionRecordSql = new StringBuffer();
queryMesProductionRecordSql.append("select distinct new " + MesWorkCenterBoardResultModel.class.getName() +
"(serialNumber, " +
"createDatetime) " +
"from MesProductionRecord " +
"where isValid = :isValid " +
"and isDeleted = :isDeleted " +
"and organizeCode = :organizeCode " +
"and workCenterCode = :workCenterCode " +
"and isComplete = :isComplete " +
"and createDatetime >= :startTime " +
"and createDatetime <= :endTime ");
Query mesProductionRecordQuery = entityManager.createQuery(queryMesProductionRecordSql.toString(), MesWorkCenterBoardResultModel.class);
mesProductionRecordQuery.setParameter("isValid", CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
mesProductionRecordQuery.setParameter("isDeleted", CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
mesProductionRecordQuery.setParameter("organizeCode", organizeCode);
mesProductionRecordQuery.setParameter("workCenterCode", workCenterCode);
mesProductionRecordQuery.setParameter("isComplete", CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
mesProductionRecordQuery.setParameter("startTime", startTime);
mesProductionRecordQuery.setParameter("endTime", endTime);
List<MesWorkCenterBoardResultModel> productionRecordQueryResultList = mesProductionRecordQuery.getResultList();
if (!CollectionUtils.isEmpty(productionRecordQueryResultList)) {
//取出所有过程条码
List<String> serialNumberList = productionRecordQueryResultList.
stream().map(MesWorkCenterBoardResultModel::getSerialNumber).collect(Collectors.toList());
StringBuffer queryMesProduceSnSql = new StringBuffer();
queryMesProduceSnSql.append("select distinct serialNumber " +
"from MesProduceSn " +
"where isValid = :isValid " +
"and isDeleted = :isDeleted " +
"and organizeCode = :organizeCode " +
"and qcStatus = :qcStatus " +
"and serialNumber in ( :serialNumberList )");
Query mesProduceSnQuery = entityManager.createQuery(queryMesProduceSnSql.toString());
mesProduceSnQuery.setParameter("isValid", CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
mesProduceSnQuery.setParameter("isDeleted", CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
mesProduceSnQuery.setParameter("organizeCode", organizeCode);
mesProduceSnQuery.setParameter("qcStatus", MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue());
mesProduceSnQuery.setParameter("serialNumberList", serialNumberList);
List<String> resultList = mesProduceSnQuery.getResultList();
for (MesWorkCenterBoardResultModel resultModel : productionRecordQueryResultList) {
if (resultList.contains(resultModel.getSerialNumber())) {
resultModel.setQcStatus(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue());
}else {
resultModel.setQcStatus(MesExtEnumUtil.PRODUCE_QC_STATUS.SUSPICIOUS.getValue());
}
}
}
return productionRecordQueryResultList;
}
}

@ -1,11 +1,26 @@
package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.board;
import cn.estsh.i3plus.ext.mes.api.busi.board.IMesYfBoardService;
import cn.estsh.i3plus.ext.mes.apiservice.dao.board.IMesYfBoardDao;
import cn.estsh.i3plus.ext.mes.pojo.model.board.MesWorkCenterBoardConditionModel;
import cn.estsh.i3plus.ext.mes.pojo.model.board.MesWorkCenterBoardResultModel;
import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum;
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.repository.*;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
/**
* @Description : -
@ -17,42 +32,425 @@ import java.util.List;
@Service
public class IMesYfBoardServiceImpl implements IMesYfBoardService {
@Autowired
private IMesYfBoardDao mesYfBoardDao;
@Autowired
private MesDowntimeRecordRepository mesDowntimeRecordRepository;
@Autowired
private MesWorkOrderRepository mesWorkOrderRepository;
@Autowired
private MesWorkCenterRepository mesWorkCenterRepository;
@Autowired
private MesEquipmentSpotCheckRepository mesEquipmentSpotCheckRepository;
@Autowired
private MesSpotCheckOrderRepository mesSpotCheckOrderRepository;
private static final String START_TIME = "START_TIME";
private static final String END_TIME = "END_TIME";
private static final Integer NUM = 12;
/**
* 线
*/
@Override
public List<MesWorkCenterBoardResultModel> queryWorkCenterStatus(MesWorkCenterBoardConditionModel conditionModel) {
return null;
List<MesWorkCenterBoardResultModel> resultModelList = new ArrayList<>();
List<String> workCenterCodeList = conditionModel.getWorkCenterCodeList();
//获取查询时间区间
Map<String, Map<String, String>> timeZoneMap = getTimeZoneMap(workCenterCodeList,
conditionModel.getTimeRangeIdentification(), conditionModel.getOrganizeCode());
//查询当前时间区间内中的选中产线最新的的开停机记录
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(conditionModel.getOrganizeCode());
for (String workCenterCode : timeZoneMap.keySet()) {
DdlPreparedPack.getStringEqualPack(workCenterCode, "workCenterCode", ddlPackBean);
DdlPreparedPack.timeBuilder(timeZoneMap.get(workCenterCode).get(START_TIME),
timeZoneMap.get(workCenterCode).get(END_TIME), "createDatetime", ddlPackBean, true);
DdlPreparedPack.getOrderByPack(
new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{"createDatetime"}, ddlPackBean);
int queryCount = mesDowntimeRecordRepository.findByHqlWhereCount(ddlPackBean);
//封装页面展示数据
MesWorkCenterBoardResultModel resultModel = new MesWorkCenterBoardResultModel();
resultModel.setWorkCenterCode(workCenterCode);
if (queryCount == 0) {
resultModel.setWorkCenterCodeStatus(MesExtEnumUtil.BOARD_WORK_CENTER_STATUS.NORMAL.getValue());
}else {
resultModel.setWorkCenterCodeStatus(MesExtEnumUtil.BOARD_WORK_CENTER_STATUS.ABNORMAL.getValue());
}
resultModelList.add(resultModel);
}
return resultModelList;
}
@Override
public MesWorkCenterBoardResultModel queryWorkCenterProductionCompletionRate(MesWorkCenterBoardConditionModel conditionModel) {
return null;
Double workCenterCompletedQuantity = 0D;
Double workCenterPlannedQuantity = 0D;
//获取查询时间区间
Map<String, Map<String, String>> timeZoneMap = getTimeZoneMap(conditionModel.getWorkCenterCodeList(),
conditionModel.getTimeRangeIdentification(), conditionModel.getOrganizeCode());
//查询工单
List<MesWorkOrder> mesWorkOrderList = queryMesWorkOrder(timeZoneMap, conditionModel);
//封装汇总数据
MesWorkCenterBoardResultModel resultModel = new MesWorkCenterBoardResultModel();
for (MesWorkOrder mesWorkOrder : mesWorkOrderList) {
workCenterCompletedQuantity = workCenterCompletedQuantity + mesWorkOrder.getCompleteQty();
workCenterPlannedQuantity = workCenterPlannedQuantity + mesWorkOrder.getQty();
}
resultModel.setWorkCenterCompletedQuantity(workCenterCompletedQuantity);
resultModel.setWorkCenterPlannedQuantity(workCenterPlannedQuantity);
if (workCenterCompletedQuantity == 0 || workCenterPlannedQuantity == 0) {
resultModel.setWorkCenterCompletionRate(0D);
}else {
resultModel.setWorkCenterCompletionRate(workCenterCompletedQuantity * 100 / workCenterPlannedQuantity);
}
return resultModel;
}
@Override
public List<MesWorkCenterBoardResultModel> queryWorkCenterWorkOrderCompletionStatus(MesWorkCenterBoardConditionModel conditionModel) {
return null;
List<MesWorkCenterBoardResultModel> resultModelList = new ArrayList<>();
//获取查询时间区间
Map<String, Map<String, String>> timeZoneMap = getTimeZoneMap(conditionModel.getWorkCenterCodeList(),
conditionModel.getTimeRangeIdentification(), conditionModel.getOrganizeCode());
//查询工单
List<MesWorkOrder> mesWorkOrderList = queryMesWorkOrder(timeZoneMap, conditionModel);
//封装汇总数据
for (MesWorkOrder mesWorkOrder : mesWorkOrderList) {
MesWorkCenterBoardResultModel resultModel = new MesWorkCenterBoardResultModel();
resultModel.setWorkOrderNo(mesWorkOrder.getWorkOrderNo());
resultModel.setPartNo(mesWorkOrder.getPartNo());
resultModel.setPartDescription(mesWorkOrder.getPartName());
resultModel.setWorkOrderCompletedQuantity(mesWorkOrder.getCompleteQty());
resultModel.setWorkOrderPlannedQuantity(mesWorkOrder.getQty());
if (resultModel.getWorkOrderCompletedQuantity() == 0 || resultModel.getWorkOrderPlannedQuantity() == 0) {
resultModel.setWorkOrderFirstPassRate(0D);
}else {
resultModel.setWorkOrderFirstPassRate(resultModel.getWorkOrderCompletedQuantity() * 100 / resultModel.getWorkOrderPlannedQuantity());
}
resultModelList.add(resultModel);
}
return resultModelList;
}
@Override
public List<MesWorkCenterBoardResultModel> queryUnitHourCompletionRate(MesWorkCenterBoardConditionModel conditionModel) {
return null;
List<MesWorkCenterBoardResultModel> resultModelList = new ArrayList<>();
//查询当前产线设置的目标值
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(conditionModel.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(conditionModel.getWorkCenterCodeList().get(0), "workCenterCode", ddlPackBean);
MesWorkCenter mesWorkCenter = mesWorkCenterRepository.getByProperty(ddlPackBean);
if (Objects.isNull(mesWorkCenter) || StringUtils.isEmpty(mesWorkCenter.getJph())) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION_DATA_NOT_EXIT.getCode())
.setErrorDetail(conditionModel.getWorkCenterCodeList().get(0) + " 产线未维护有效的产线JPH信息")
.build();
}
//获取并汇总当前产线在当前时间前12个小时的每个小时时间段内工单的完成数
Map<String, Map<String, String>> timeZoneMap = getLastHoursTimeZoneMap(NUM);
//查询当前产线12小时内的生产汇报完成的数据
List<MesWorkCenterBoardResultModel> mesProductOffLineQueryResultList = mesYfBoardDao.queryMesProductOffLineModel(
conditionModel.getWorkCenterCodeList().get(0),
conditionModel.getOrganizeCode(),
timeZoneMap.get(START_TIME).get(START_TIME),
timeZoneMap.get(END_TIME).get(END_TIME));
for (String timeZone : timeZoneMap.keySet()) {
MesWorkCenterBoardResultModel resultModel = new MesWorkCenterBoardResultModel();
if (START_TIME.equals(timeZone) || END_TIME.equals(timeZone)) {
continue;
}
//横坐标赋值
resultModel.setUnitHourCompletionRateTimePeriod(timeZone);
//目标值
resultModel.setUnitHourCompletionRateTargetValue(Double.valueOf(mesWorkCenter.getJph()));
if (CollectionUtils.isEmpty(mesProductOffLineQueryResultList)) {
resultModel.setUnitHourCompletionRate(0);
}else {
//筛选生产汇报数据中在当前时间区段中的产品条码数
List<MesWorkCenterBoardResultModel> nowResultList = mesProductOffLineQueryResultList.stream().filter(model -> (
StringUtils.compare(model.getCreateDateTime(), timeZoneMap.get(timeZone).get(START_TIME)) > 0
&& StringUtils.compare(timeZoneMap.get(timeZone).get(END_TIME), model.getCreateDateTime()) > 0
)).collect(Collectors.toList());
resultModel.setUnitHourCompletionRate(nowResultList.size());
}
resultModelList.add(resultModel);
}
return resultModelList;
}
@Override
public List<MesWorkCenterBoardResultModel> queryWorkCenterFirstTimeOfflineQualificationRate(MesWorkCenterBoardConditionModel conditionModel) {
return null;
//获取并汇总当前时间前12个小时的每个小时时间段内数据最高100
//合格数 / 加工完成(包含已汇报,即工单的完成数;以及待汇报的)
List<MesWorkCenterBoardResultModel> resultModelList = new ArrayList<>();
Map<String, Map<String, String>> timeZoneMap = getLastHoursTimeZoneMap(NUM);
//查询当前产线在指定时间段内加工完成的条码数据
List<MesWorkCenterBoardResultModel> mesProductOffLineQueryResultList = mesYfBoardDao.queryCompletedSnInfo(
conditionModel.getWorkCenterCodeList().get(0),
conditionModel.getOrganizeCode(),
timeZoneMap.get(START_TIME).get(START_TIME),
timeZoneMap.get(END_TIME).get(END_TIME));
//依次汇总每个时间段的数据
for (String timeZone : timeZoneMap.keySet()) {
MesWorkCenterBoardResultModel resultModel = new MesWorkCenterBoardResultModel();
if (START_TIME.equals(timeZone) || END_TIME.equals(timeZone)) {
continue;
}
//横坐标赋值
resultModel.setWorkCenterFirstTimeOfflineQualificationRateTimePeriod(timeZone);
//筛选当前时间段的生产加工记录
List<MesWorkCenterBoardResultModel> nowResultList = mesProductOffLineQueryResultList.stream().filter(model -> (
StringUtils.compare(model.getCreateDateTime(), timeZoneMap.get(timeZone).get(START_TIME)) > 0
&& StringUtils.compare(timeZoneMap.get(timeZone).get(END_TIME), model.getCreateDateTime()) > 0
)).collect(Collectors.toList());
Map<Integer, List<MesWorkCenterBoardResultModel>> resultModelByQcStatusMap = nowResultList.stream().
collect(Collectors.groupingBy(MesWorkCenterBoardResultModel::getQcStatus));
if (CollectionUtils.isEmpty(nowResultList)
|| !resultModelByQcStatusMap.containsKey(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue())) {
//当前时间段没有生产加工记录或者没有合格的生产加工条码
resultModel.setWorkCenterFirstTimeOfflineQualificationRate(0D);
}else {
double workCenterFirstTimeOfflineQualificationRate = (
resultModelByQcStatusMap.get(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue()).size() * 100
/ nowResultList.size());
//最大值只允许100
if (workCenterFirstTimeOfflineQualificationRate > 100) {
workCenterFirstTimeOfflineQualificationRate = 100;
}
resultModel.setWorkCenterFirstTimeOfflineQualificationRate(workCenterFirstTimeOfflineQualificationRate);
}
resultModelList.add(resultModel);
}
return resultModelList;
}
@Override
public List<MesWorkCenterBoardResultModel> queryInspectionResults(MesWorkCenterBoardConditionModel conditionModel) {
return null;
String workCenterCode = conditionModel.getWorkCenterCodeList().get(0);
List<MesWorkCenterBoardResultModel> resultModelList = new ArrayList<>();
//查询当前产线配置的点检类型
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(conditionModel.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(workCenterCode, "workCenterCode", ddlPackBean);
List<MesEquipmentSpotCheck> mesEquipmentSpotCheckList = mesEquipmentSpotCheckRepository.findByHqlWhere(ddlPackBean);
Set<Integer> spotCheckOrderTypeSet = mesEquipmentSpotCheckList.
stream().map(MesEquipmentSpotCheck::getSpotCheckOrderType).collect(Collectors.toSet());
//获取查询时间区间
Map<String, Map<String, String>> timeZoneMap = getTimeZoneMap(conditionModel.getWorkCenterCodeList(),
conditionModel.getTimeRangeIdentification(), conditionModel.getOrganizeCode());
//查询当前产线在指定时间区间内的点检单记录并按照点检类型进行分组
ddlPackBean = DdlPackBean.getDdlPackBean(conditionModel.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(workCenterCode, "workCenterCode", ddlPackBean);
DdlPreparedPack.timeBuilder(timeZoneMap.get(workCenterCode).get(START_TIME),
timeZoneMap.get(workCenterCode).get(END_TIME), "createDatetime", ddlPackBean, true);
List<MesSpotCheckOrder> mesSpotCheckOrderList = mesSpotCheckOrderRepository.findByHqlWhere(ddlPackBean);
Map<Integer, List<MesSpotCheckOrder>> mesSpotCheckOrderByTypeMap = mesSpotCheckOrderList.
stream().collect(Collectors.groupingBy(MesSpotCheckOrder::getSpotCheckOrderType));
//遍历“点检类型”枚举
for (MesExtEnumUtil.EQUIPMENT_CHECK_ORDER_TYPE typeEnum : MesExtEnumUtil.EQUIPMENT_CHECK_ORDER_TYPE.values()) {
if (typeEnum.getValue() == 6) {
//不添加工装点检
continue;
}
MesWorkCenterBoardResultModel resultModel = new MesWorkCenterBoardResultModel();
//截取前两位作为标题
resultModel.setInspectionItems(typeEnum.getDescription().substring(0, 2));
//判断点检结果
if (spotCheckOrderTypeSet.contains(typeEnum.getValue())) {
//配置该种点检类型
if (mesSpotCheckOrderByTypeMap.containsKey(typeEnum.getValue())) {
//存在该种点检类型的点检单数据
List<MesSpotCheckOrder> mesSpotCheckOrders = mesSpotCheckOrderByTypeMap.get(typeEnum.getValue());
//按修改时间降序
mesSpotCheckOrders.sort(Comparator.comparing(MesSpotCheckOrder::getModifyDatetime).reversed());
if (MesExtEnumUtil.SPOT_CHECK_ORDER_RESULT_TYPE.OK.getValue() == mesSpotCheckOrders.get(0).getSpotCheckOrderResult()) {
//最新的点检单结果为 OK
//结果设置为“正常”
resultModel.setInspectionResults(MesExtEnumUtil.INSPECTION_RESULTS.NORMAL.getValue());
}else if (MesExtEnumUtil.SPOT_CHECK_ORDER_RESULT_TYPE.NOK.getValue() == mesSpotCheckOrders.get(0).getSpotCheckOrderResult()) {
//最新的点检单结果为 NOK
//结果设置为“异常”
resultModel.setInspectionResults(MesExtEnumUtil.INSPECTION_RESULTS.ABNORMAL.getValue());
}
}else {
//不存在该种点检类型的点检单数据
//结果设置为“未做”
resultModel.setInspectionResults(MesExtEnumUtil.INSPECTION_RESULTS.NOT_DONE.getValue());
}
}else {
//未配置该种点检类型
//结果设置为“不涉及”
resultModel.setInspectionResults(MesExtEnumUtil.INSPECTION_RESULTS.NOT_INVOLVED.getValue());
}
resultModelList.add(resultModel);
}
return resultModelList;
}
@Override
public MesWorkCenterBoardResultModel queryAbnormalDowntime(MesWorkCenterBoardConditionModel conditionModel) {
return null;
MesWorkCenterBoardResultModel resultModel = new MesWorkCenterBoardResultModel();
//获取查询时间区间
Map<String, Map<String, String>> timeZoneMap = getTimeZoneMap(conditionModel.getWorkCenterCodeList(),
conditionModel.getTimeRangeIdentification(), conditionModel.getOrganizeCode());
resultModel.setAbnormalDowntime("00:45");
return resultModel;
}
/**
*
* @param timeRangeIdentification
* @return
*/
private Map<String, Map<String, String>> getTimeZoneMap(List<String> workCenterCodeList, Integer timeRangeIdentification, String organizeCode) {
Map<String, Map<String, String>> timeZoneMap = new HashMap<>();
String startTime;
String endTime;
DateTimeFormatter dayFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd ");
DateTimeFormatter dayTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//当前时间
LocalDateTime nowTime = LocalDateTime.now();
//当前年月日
String nowDay = dayFormatter.format(nowTime);
//当前年月日 时分秒
String nowDayTime = dayTimeFormatter.format(nowTime);
//判断当前查询的时间段(当班或者当日)
if (MesExtEnumUtil.TIME_RANGE_IDENTIFICATION.ON_DUTY.getValue() == timeRangeIdentification) {
//当班
//先查询用户指定的产线在当前时间节点有效的班次信息
List<MesShift> mesShiftList = mesYfBoardDao.queryMesShift(workCenterCodeList, organizeCode, nowDayTime);
if (CollectionUtils.isEmpty(mesShiftList)) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION_DATA_NOT_EXIT.getCode())
.setErrorDetail(workCenterCodeList.toString() + " 产线未维护有效的班次信息!")
.build();
}
Map<String, List<MesShift>> shiftByWorkCenterCodeMap = mesShiftList.stream().collect(Collectors.groupingBy(MesShift::getWorkCenterCode));
//依次处理每个产线对应的班次数据,获取与当前时间相符的班次
Map<String, MesShift> passShiftByWorkCenterCodeMap = new HashMap<>();
for (String workCenterCode : workCenterCodeList) {
if (shiftByWorkCenterCodeMap.containsKey(workCenterCode)) {
List<MesShift> mesShifts = shiftByWorkCenterCodeMap.get(workCenterCode);
for (MesShift mesShift : mesShifts) {
//上班时间
String workTime = nowDay + mesShift.getStartTime();
//下班时间
String closingTime;
if (StringUtils.compare(mesShift.getStartTime(), mesShift.getEndTime()) > 0) {
//跨天班次,下班时间的日期需要加一
closingTime = dayFormatter.format(nowTime.plusDays(1)) + mesShift.getEndTime();
}else {
//当天班次
closingTime = nowDay + mesShift.getEndTime();
}
if (StringUtils.compare(nowDayTime, workTime) > 0 && StringUtils.compare(closingTime, nowDayTime) > 0) {
//当前时间点在当前班次的上下班区间内
mesShift.setStartTime(workTime);
mesShift.setEndTime(closingTime);
passShiftByWorkCenterCodeMap.put(workCenterCode, mesShift);
}
}
}else {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION_DATA_NOT_EXIT.getCode())
.setErrorDetail(workCenterCode + " 产线未维护有效的班次信息!")
.build();
}
}
//获取最终的班次时间区间
for (String workCenterCode : passShiftByWorkCenterCodeMap.keySet()) {
MesShift mesShift = passShiftByWorkCenterCodeMap.get(workCenterCode);
Map<String, String> map = new HashMap<>();
map.put(START_TIME, mesShift.getStartTime());
map.put(END_TIME, mesShift.getEndTime());
timeZoneMap.put(workCenterCode, map);
}
}else if (MesExtEnumUtil.TIME_RANGE_IDENTIFICATION.ON_THE_SAME_DAY.getValue() == timeRangeIdentification) {
Map<String, String> timeMap = new HashMap<>();
//当日
startTime = nowDay + "00:00:00";
endTime = nowDay + "23:59:59";
timeMap.put(START_TIME, startTime);
timeMap.put(END_TIME, endTime);
for (String workCenterCode : workCenterCodeList) {
timeZoneMap.put(workCenterCode, timeMap);
}
}else {
//显示维度格式有误,直接报错
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorCode(ImppExceptionEnum.PARAMETER_EXCEPTION.getCode())
.setErrorDetail("显示维护传参有误!")
.build();
}
return timeZoneMap;
}
/**
*
* @param timeZoneMap
* @param conditionModel
* @return
*/
private List<MesWorkOrder> queryMesWorkOrder(Map<String, Map<String, String>> timeZoneMap, MesWorkCenterBoardConditionModel conditionModel) {
String workCenterCode = conditionModel.getWorkCenterCodeList().get(0);
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(conditionModel.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(workCenterCode, "workCenterCode", ddlPackBean);
//计划开始时间
DdlPreparedPack.timeBuilder(timeZoneMap.get(workCenterCode).get(START_TIME),
timeZoneMap.get(workCenterCode).get(END_TIME), "planStartTime", ddlPackBean, true);
return mesWorkOrderRepository.findByHqlWhere(ddlPackBean);
}
/**
*
* @param designatedQuantity
* @return
*/
private Map<String, Map<String, String>> getLastHoursTimeZoneMap(Integer designatedQuantity) {
Map<String, Map<String, String>> timeZoneMap = new TreeMap<>();
DateTimeFormatter hourFormatter = DateTimeFormatter.ofPattern("HH");
DateTimeFormatter dayFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd ");
LocalDateTime nowTime = LocalDateTime.now();
String nowDay = dayFormatter.format(nowTime);
String startTime;
String endTime;
String key;
for (int i = 0; i < designatedQuantity; i++) {
Map<String, String> zoneMap = new HashMap<>();
if (i == 0) {
//第一个区段获取当前时间所在的小时区间
startTime = hourFormatter.format(nowTime.minusHours(i)) + ":00";
endTime = hourFormatter.format(nowTime.plusHours(1)) + ":00";
}else {
startTime = hourFormatter.format(nowTime.minusHours(i)) + ":00";
endTime = hourFormatter.format(nowTime.minusHours(i - 1)) + ":00";
}
key = startTime + "-" + endTime;
zoneMap.put(START_TIME, nowDay + startTime + ":00");
zoneMap.put(END_TIME, nowDay + endTime + ":00");
timeZoneMap.put(key, zoneMap);
Map<String, String> map = new HashMap<>();
if (i == 0) {
//将第一个时间段作为本段查询时间区间的结束(因为是递减)
map.put(END_TIME, nowDay + startTime + ":00");
timeZoneMap.put(END_TIME, map);
}
if (i == designatedQuantity - 1) {
//将最后一个时间段作为本段查询时间区间的开始(因为是递减)
map.put(START_TIME, nowDay + endTime + ":00");
timeZoneMap.put(START_TIME, map);
}
}
return timeZoneMap;
}
}

@ -28,10 +28,10 @@ public class MesWorkCenterBoardResultModel {
* 线
*/
@ApiParam(value = "产线完成数")
private Integer workCenterCompletedQuantity;
private Double workCenterCompletedQuantity;
@ApiParam(value = "产线计划数")
private Integer workCenterPlannedQuantity;
private Double workCenterPlannedQuantity;
@ApiParam(value = "产线完成率")
private Double workCenterCompletionRate;
@ -49,10 +49,10 @@ public class MesWorkCenterBoardResultModel {
private String partDescription;
@ApiParam(value = "工单完成数")
private Integer workOrderCompletedQuantity;
private Double workOrderCompletedQuantity;
@ApiParam(value = "工单计划数")
private Integer workOrderPlannedQuantity;
private Double workOrderPlannedQuantity;
@ApiParam(value = "工单一次合格率")
private Double workOrderFirstPassRate;
@ -91,6 +91,26 @@ public class MesWorkCenterBoardResultModel {
* 线
*/
@ApiParam(value = "异常停机时间")
private Double abnormalDowntime;
private String abnormalDowntime;
/**
* sql
*/
@ApiParam(value = "过程条码")
private String serialNumber;
@ApiParam(value = "创建时间")
private String createDateTime;
@ApiParam(value = "质量状态")
private Integer qcStatus;
public MesWorkCenterBoardResultModel() {
}
public MesWorkCenterBoardResultModel(String serialNumber, String createDateTime) {
this.serialNumber = serialNumber;
this.createDateTime = createDateTime;
}
}

Loading…
Cancel
Save