嘉兴工程不良实绩报表

tags/yfai-mes-ext-v1.0
yxw 2 years ago
parent c325059b52
commit 6e577ee102

@ -0,0 +1,22 @@
package cn.estsh.i3plus.ext.mes.api.busi.jx;
import cn.estsh.i3plus.ext.mes.pojo.model.BadStatisticsReportParamModel;
import cn.estsh.i3plus.ext.mes.pojo.model.jx.JxProjectBadPerformanceReportModel;
import io.swagger.annotations.ApiOperation;
/**
* @Author: wangjie
* @CreateDate: 2021/01/19 15:06
* @Description:
**/
public interface IJxBadStatisticsReportFormService {
/**
*
* @param model
* @return
*/
@ApiOperation(value = "工程不良实绩报表", notes = "工程不良实绩报表")
JxProjectBadPerformanceReportModel queryProjectBadPerformance(BadStatisticsReportParamModel model);
}

@ -1,7 +1,9 @@
package cn.estsh.i3plus.ext.mes.apiservice.controller.busi.jx;
import cn.estsh.i3plus.ext.mes.api.busi.jx.IJxBadStatisticsReportFormService;
import cn.estsh.i3plus.ext.mes.api.busi.jx.IJxProductReportService;
import cn.estsh.i3plus.ext.mes.pojo.bean.MesProdBindRecordExt;
import cn.estsh.i3plus.ext.mes.pojo.model.BadStatisticsReportParamModel;
import cn.estsh.i3plus.ext.mes.pojo.util.MesExtConstWords;
import cn.estsh.i3plus.pojo.base.bean.ListPager;
import cn.estsh.i3plus.pojo.base.common.Pager;
@ -11,6 +13,7 @@ import cn.estsh.impp.framework.boot.auth.AuthUtil;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
import cn.estsh.impp.framework.boot.util.ResultBean;
import cn.estsh.impp.framework.boot.util.ValidatorBean;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
@ -32,6 +35,9 @@ public class JxReportController extends MesBaseController {
@Autowired
private IJxProductReportService productReportService;
@Autowired
private IJxBadStatisticsReportFormService badStatisticsReportFormService;
@GetMapping(value = "/mes-prod-bind-record/query")
@ApiOperation(value = "按条件分页查询MES物料绑定记录数据")
public ResultBean queryMesProdBindRecord(MesProdBindRecordExt prodBindRecordExt, Pager pager) {
@ -47,4 +53,20 @@ public class JxReportController extends MesBaseController {
}
}
@GetMapping(value = "/project-bad-performance/query")
@ApiOperation(value = "工程不良实绩报表")
public ResultBean queryProjectBadPerformance(BadStatisticsReportParamModel model) {
try {
ValidatorBean.beginValid(model)
.notNull(MesExtConstWords.DIMENSION, model.getDimension());
model.setOrganizeCode(AuthUtil.getOrganize().getOrganizeCode());
return ResultBean.success("查询成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode())
.setResultObject(badStatisticsReportFormService.queryProjectBadPerformance(model));
} catch (ImppBusiException busExcep) {
return ResultBean.fail(busExcep);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
}

@ -731,9 +731,9 @@ public class ProjectContainersComputeChartDao implements IProjectContainersCompu
" o1.produce_qty AS produceQty, " +
" b.part_no AS partNo, " +
" b.part_name_rdd AS partNameRdd, " +
" re.repair_judge AS repairJudge, " +
" count( re.repair_judge ) AS rJuCounts, " +
" count( re.repair_judge ) / o1.produce_qty AS reRate " +
" re.repair_judge_code AS repairJudge, " +
" count( re.repair_judge_code ) AS rJuCounts, " +
" count( re.repair_judge_code ) / o1.produce_qty AS reRate " +
" FROM " +
" mes_bad_cell_detail AS b " +
" LEFT JOIN mes_repair_record r ON r.defect_record_id = b.id " +
@ -773,7 +773,7 @@ public class ProjectContainersComputeChartDao implements IProjectContainersCompu
hql.append(" AND b.part_no = :partNo " );
}
if (!StringUtils.isEmpty(paramModel.getRepairJudge())) {
hql.append(" AND re.repair_judge = :repairJudge " );
hql.append(" AND re.repair_judge_code = :repairJudge " );
}
hql.append(

@ -157,6 +157,7 @@ public class JxOqcProjectService implements IJxOqcProjectService {
oqcProject.setOqcNoType(model.getOqcNoType());
oqcProject.setCheckItem(model.getCheckItem());
oqcProject.setStandard(model.getStandard());
oqcProject.setStandardValue(model.getStandardValue());
oqcProject.setUpLimit(model.getUpLimit());
oqcProject.setDownLimit(model.getDownLimit());
oqcProject.setCheckType(model.getCheckType());

@ -102,6 +102,7 @@ public class SxBadStatisticsReportFormService implements ISxBadStatisticsReportF
String[] keyArr = key.split(MesExtConstWords.AND);
ProjectBadPerformanceReportModel result = new ProjectBadPerformanceReportModel();
result.setWorkTime(keyArr[0]);
result.setWorkCenterCode(keyArr[1]);

@ -0,0 +1,262 @@
package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.busi.jx;
import cn.estsh.i3plus.ext.mes.api.base.jx.IJxRepairJudgeTypeService;
import cn.estsh.i3plus.ext.mes.api.busi.ISxBadStatisticsReportFormService;
import cn.estsh.i3plus.ext.mes.api.busi.jx.IJxBadStatisticsReportFormService;
import cn.estsh.i3plus.ext.mes.apiservice.dao.ISxRepairRecordDao;
import cn.estsh.i3plus.ext.mes.pojo.bean.MesBadCell;
import cn.estsh.i3plus.ext.mes.pojo.bean.MesBadCellDetail;
import cn.estsh.i3plus.ext.mes.pojo.bean.MesOutPutStatistics;
import cn.estsh.i3plus.ext.mes.pojo.bean.MesRepairRecordExt;
import cn.estsh.i3plus.ext.mes.pojo.model.BadStatisticsReportModel;
import cn.estsh.i3plus.ext.mes.pojo.model.BadStatisticsReportParamModel;
import cn.estsh.i3plus.ext.mes.pojo.model.ProjectBadPerformanceReportModel;
import cn.estsh.i3plus.ext.mes.pojo.model.SxRepairRecordReportModel;
import cn.estsh.i3plus.ext.mes.pojo.model.jx.JxOqcCheckStatisticsReportModel;
import cn.estsh.i3plus.ext.mes.pojo.model.jx.JxProjectBadPerformanceReportModel;
import cn.estsh.i3plus.ext.mes.pojo.model.jx.SxDynamicAttributeModel;
import cn.estsh.i3plus.ext.mes.pojo.repository.MesBadCellDetailRepository;
import cn.estsh.i3plus.ext.mes.pojo.repository.MesBadCellRepository;
import cn.estsh.i3plus.ext.mes.pojo.repository.MesOutPutStatisticsRepository;
import cn.estsh.i3plus.ext.mes.pojo.repository.MesRepairRecordExtRepository;
import cn.estsh.i3plus.ext.mes.pojo.util.MesExtConstWords;
import cn.estsh.i3plus.ext.mes.pojo.util.MesExtEnumUtil;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum;
import cn.estsh.i3plus.platform.common.tool.MathOperation;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.bean.ListPager;
import cn.estsh.i3plus.pojo.base.common.Pager;
import cn.estsh.i3plus.pojo.base.common.PagerHelper;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.impp.framework.boot.auth.AuthUtil;
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author wangjie
* @version 1.0
* @date 2021/1/13 9:28
**/
@Slf4j
@Service
public class JxBadStatisticsReportFormService implements IJxBadStatisticsReportFormService {
@Autowired
private MesOutPutStatisticsRepository outPutStatisticsRepository;
@Autowired
private MesRepairRecordExtRepository repairRecordExtRepository;
@Autowired
private IJxRepairJudgeTypeService repairJudgeTypeService;
@Override
public JxProjectBadPerformanceReportModel queryProjectBadPerformance(BadStatisticsReportParamModel model) {
JxProjectBadPerformanceReportModel result = null;
DdlPackBean packBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(model.getWorkCenterCode(), MesExtConstWords.WORK_CENTER_CODE, packBean);
if (!StringUtils.isEmpty(model.getWorkTimeStart()) || !StringUtils.isEmpty(model.getWorkTimeEnd())) {
DdlPreparedPack.timeBuilder(model.getWorkTimeStart(), model.getWorkTimeEnd(), MesExtConstWords.WORK_TIME, packBean, false);
}
List<MesRepairRecordExt> repairRecordExtList = repairRecordExtRepository.findByHqlWhere(packBean);
if (CollectionUtils.isEmpty(repairRecordExtList)) {
log.info("工程不良实绩未查询到维修数据,维度[{}]", MesExtEnumUtil.REPORT_DIMENSION_DAY_OR_MONTH.valueOfDescription(model.getDimension()));
return result;
}
result = new JxProjectBadPerformanceReportModel();
log.info("工程不良实绩已查询到维修数据,维度[{}]", MesExtEnumUtil.REPORT_DIMENSION_DAY_OR_MONTH.valueOfDescription(model.getDimension()));
packRepairRecordWorkTime(repairRecordExtList, model);
Map<String, List<MesRepairRecordExt>> repairRecordMap = packRepairRecordMap(repairRecordExtList);
List<MesOutPutStatistics> outPutStatisticsList = outPutStatisticsRepository.findByHqlWhere(packBean);
Map<String, List<MesOutPutStatistics>> outPutStatisticsMap = null;
if (!CollectionUtils.isEmpty(outPutStatisticsList)) {
log.info("工程不良实绩已查询到产量数据,维度[{}]", MesExtEnumUtil.REPORT_DIMENSION_DAY_OR_MONTH.valueOfDescription(model.getDimension()));
packOutPutStatisticsWorkTime(outPutStatisticsList, model);
outPutStatisticsMap = packOutPutStatisticsMapForProjectBadPerformance(outPutStatisticsList);
} else {
log.info("工程不良实绩未查询到产量数据,维度[{}]", MesExtEnumUtil.REPORT_DIMENSION_DAY_OR_MONTH.valueOfDescription(model.getDimension()));
}
// 维修判定map
Map<String, String> repairJudgeMap = repairJudgeTypeService.queryRepairJudgeMap(model.getOrganizeCode());
packBaseAttributeList4ProjectBadStatistics(result, repairJudgeMap);
List<Map<String, Object>> resultMapList = new ArrayList<>();
for (String key : repairRecordMap.keySet()) {
if (StringUtils.isEmpty(key)) {
continue;
}
List<MesRepairRecordExt> itemList = repairRecordMap.get(key);
if (CollectionUtils.isEmpty(itemList)) {
continue;
}
String[] keyArr = key.split(MesExtConstWords.AND);
//ProjectBadPerformanceReportModel result = new ProjectBadPerformanceReportModel();
Map<String, Object> resultMap = new HashMap<>();
resultMap.put(MesExtConstWords.WORK_TIME, keyArr[0]);
resultMap.put(MesExtConstWords.WORK_CENTER_CODE, keyArr[1]);
//result.setWorkTime(keyArr[0]);
//result.setWorkCenterCode(keyArr[1]);
List<MesOutPutStatistics> itemOutPutStatisticsList = CollectionUtils.isEmpty(outPutStatisticsMap) ? null : outPutStatisticsMap.get(key);
//总产量
//result.setQty(getQty(itemOutPutStatisticsList));
resultMap.put(MesExtConstWords.QTY, getQty(itemOutPutStatisticsList));
//误判数
//result.setMisjudgeQty(getBadQtyByType(itemList, MesExtEnumUtil.REPAIR_JUDGE.MISJUDGE.getValue()));
if (!CollectionUtils.isEmpty(repairJudgeMap)) {
for (Map.Entry<String, String> entry : repairJudgeMap.entrySet()) {
resultMap.put(entry.getKey(), getBadQtyByType(itemList, entry.getKey()));
resultMap.put(entry.getKey() + "Rate", getRateDecimalOne((Double)resultMap.get(entry.getKey()), (Double)resultMap.get(MesExtConstWords.QTY)));
}
}
////误判率
//result.setMisjudgeRate(getRateDecimalOne(result.getMisjudgeQty(), result.getQty()));
////部品不良数
//result.setPartsBadQty(getBadQtyByType(itemList, MesExtEnumUtil.REPAIR_JUDGE.PARTS_BAD.getValue()));
////部品不良率
//result.setPartsBadRate(getRateDecimalOne(result.getPartsBadQty(), result.getQty()));
////作业不良数
//result.setTaskBadQty(getBadQtyByType(itemList, MesExtEnumUtil.REPAIR_JUDGE.TASK_BAD.getValue()));
//作业不良率
//result.setTaskBadRate(getRateDecimalOne(result.getTaskBadQty(), result.getQty()));
//总不良率
resultMap.put(MesExtConstWords.AMOUNT_BAD_RATE, getRateDecimalOne(CollectionUtils.isEmpty(itemList) ? new Double(0) : new Double(itemList.size()), (Double)resultMap.get(MesExtConstWords.QTY)));
//result.setAmountBadRate(getRateDecimalOne(CollectionUtils.isEmpty(itemList) ? new Double(0) : new Double(itemList.size()), result.getQty()));
resultMapList.add(resultMap);
//resultList.add(result);
}
log.info("工程不良实绩报表数据开始重新排序,维度[{}]", MesExtEnumUtil.REPORT_DIMENSION_DAY_OR_MONTH.valueOfDescription(model.getDimension()));
if (!CollectionUtils.isEmpty(resultMapList)) {
resultMapList = sortProjectBadPerformanceResult(resultMapList);
log.info("不良统计报表数据重新排序成功,维度[{}]", MesExtEnumUtil.REPORT_DIMENSION_DAY_OR_MONTH.valueOfDescription(model.getDimension()));
}
result.setDataList(resultMapList);
return result;
}
private void packBaseAttributeList4ProjectBadStatistics(JxProjectBadPerformanceReportModel model, Map<String, String> repairJudgeMap) {
model.addAttribute(new SxDynamicAttributeModel("生产日期", MesExtConstWords.WORK_TIME))
.addAttribute(new SxDynamicAttributeModel("产线代码", MesExtConstWords.WORK_CENTER_CODE))
.addAttribute(new SxDynamicAttributeModel("总产量", MesExtConstWords.QTY));
if (!CollectionUtils.isEmpty(repairJudgeMap)) {
for (Map.Entry<String, String> entry : repairJudgeMap.entrySet()) {
model.addAttribute(new SxDynamicAttributeModel(entry.getValue(), entry.getKey()));
model.addAttribute(new SxDynamicAttributeModel(entry.getValue() + "率", entry.getKey()+ "Rate"));
}
}
model.addAttribute(new SxDynamicAttributeModel("总不良率", MesExtConstWords.AMOUNT_BAD_RATE));
}
private List<Map<String, Object>> sortProjectBadPerformanceResult(List<Map<String, Object>> resultMapList) {
//Collections.sort(resultMapList, new Comparator<Map<String, Object>>() {
// @Override
// public int compare(Map<String, Object> map1, Map<String, Object> map2) {
// String workTime1 = (String) map1.get(MesExtConstWords.WORK_TIME);
// String workTime2w = (String) map2.get(MesExtConstWords.WORK_TIME);
// int result = workTime1.compareTo(workTime2w);
// if (result == 0) {
// String workCenterCode1 = (String) map1.get(MesExtConstWords.WORK_CENTER_CODE);
// String workCenterCode2 = (String) map2.get(MesExtConstWords.WORK_CENTER_CODE);
// return workCenterCode1.compareTo(workCenterCode2);
// }
// return result;
// }
//});
return resultMapList.stream().sorted(
Comparator.comparing(m -> new StringJoiner(MesExtConstWords.AND).add((String) m.get(MesExtConstWords.WORK_TIME)).add((String)m.get(MesExtConstWords.WORK_CENTER_CODE)).toString())
).collect(Collectors.toList());
}
private Double getBadQtyByType(List<MesRepairRecordExt> itemList, String type) {
List<MesRepairRecordExt> list = CollectionUtils.isEmpty(itemList) ? null :
itemList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getRepairJudgeCode()) && o.getRepairJudgeCode().compareTo(type) == 0)).collect(Collectors.toList());
return CollectionUtils.isEmpty(list) ? new Double(0) : new Double(list.size());
}
private Map<String, List<MesRepairRecordExt>> packRepairRecordMap(List<MesRepairRecordExt> repairRecordExtList) {
return repairRecordExtList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getWorkTime()) && !StringUtils.isEmpty(o.getWorkCenterCode())))
.collect(Collectors.groupingBy(o -> (new StringJoiner(MesExtConstWords.AND).add(o.getWorkTime()).add(o.getWorkCenterCode()).toString())));
}
private void packRepairRecordWorkTime(List<MesRepairRecordExt> repairRecordExtList, BadStatisticsReportParamModel model) {
if (MesExtEnumUtil.REPORT_DIMENSION_DAY_OR_MONTH.MONTH.getValue() == model.getDimension()) {
repairRecordExtList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getWorkTime()))).forEach(o -> {
o.setWorkTime(o.getWorkTime().substring(0, 7));
});
}
}
private void packOutPutStatisticsWorkTime(List<MesOutPutStatistics> outPutStatisticsList, BadStatisticsReportParamModel model) {
if (MesExtEnumUtil.REPORT_DIMENSION_DAY_OR_MONTH.MONTH.getValue() == model.getDimension()) {
outPutStatisticsList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getWorkTime()))).forEach(o -> {
o.setWorkTime(o.getWorkTime().substring(0, 7));
});
}
}
private Map<String, List<MesOutPutStatistics>> packOutPutStatisticsMapForProjectBadPerformance(List<MesOutPutStatistics> outPutStatisticsList) {
return outPutStatisticsList.stream().filter(o -> (null != o &&
!StringUtils.isEmpty(o.getWorkTime()) && !StringUtils.isEmpty(o.getWorkCenterCode())))
.collect(Collectors.groupingBy(o -> (new StringJoiner(MesExtConstWords.AND).add(o.getWorkTime()).add(o.getWorkCenterCode()).toString())));
}
private Double getQty(List<MesOutPutStatistics> itemOutPutStatisticsList) {
return CollectionUtils.isEmpty(itemOutPutStatisticsList) ? new Double(0) :
itemOutPutStatisticsList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getQty()))).mapToDouble(MesOutPutStatistics::getQty).sum();
}
private String getRateDecimalOne(Double d1, Double d2) {
if (StringUtils.isEmpty(d2) || MathOperation.compareTo(d2, new Double(0)) == 0) {
return null;
}
return MathOperation.div(MathOperation.mul(d1, 100), d2, 1) + MesExtConstWords.PERCENT;
}
private List<BadStatisticsReportModel> sortBadStatisticsResult(List<BadStatisticsReportModel> resultList, Integer dimension) {
switch (MesExtEnumUtil.BAD_STATISTICS_REPORT_DIMENSION.getByValue(dimension)) {
case CELL:
resultList = resultList.stream().sorted(Comparator.comparing(BadStatisticsReportModel::getWorkTime)
.thenComparing(BadStatisticsReportModel::getShiftCode)
.thenComparing(BadStatisticsReportModel::getWorkCenterCode)
.thenComparing(BadStatisticsReportModel::getWorkCellCode)
.thenComparing(BadStatisticsReportModel::getPartNo)).collect(Collectors.toList());
break;
case CENTER:
default:
resultList = resultList.stream().sorted(Comparator.comparing(BadStatisticsReportModel::getWorkTime)
.thenComparing(BadStatisticsReportModel::getShiftCode)
.thenComparing(BadStatisticsReportModel::getWorkCenterCode)
.thenComparing(BadStatisticsReportModel::getPartNo)).collect(Collectors.toList());
break;
}
return resultList;
}
}

@ -1,10 +1,14 @@
package cn.estsh.i3plus.ext.mes.pojo.model;
import cn.estsh.i3plus.ext.mes.pojo.model.jx.SxDynamicAttributeModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @author wangjie
@ -47,4 +51,10 @@ public class ProjectBadPerformanceReportModel implements Serializable {
@ApiParam("总不良率")
private String amountBadRate;
@ApiParam("table动态列名")
private List<SxDynamicAttributeModel> attributeList = new ArrayList<>();
@ApiParam("table数据")
private List<Map<String, Object>> dataList;
}

@ -0,0 +1,34 @@
package cn.estsh.i3plus.ext.mes.pojo.model.jx;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @author wangjie
* @version 1.0
* @date 2021/1/15 15:32
**/
@Data
@ApiModel("嘉兴工程不良实绩报表Model")
public class JxProjectBadPerformanceReportModel implements Serializable {
private static final long serialVersionUID = 4014662051649634949L;
@ApiParam("table动态列名")
private List<SxDynamicAttributeModel> attributeList = new ArrayList<>();
@ApiParam("table数据")
private List<Map<String, Object>> dataList;
public JxProjectBadPerformanceReportModel addAttribute(SxDynamicAttributeModel attribute) {
this.attributeList.add(attribute);
return this;
}
}

@ -888,4 +888,7 @@ public class MesExtConstWords {
//维修判定名称
public static final String REPAIR_JUDGE_NAME = "repairJudgeName";
//总不良率
public static final String AMOUNT_BAD_RATE = "amountBadRate";
}

Loading…
Cancel
Save