|
|
|
@ -0,0 +1,341 @@
|
|
|
|
|
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi;
|
|
|
|
|
|
|
|
|
|
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesConfigService;
|
|
|
|
|
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesInputDefectRecordService;
|
|
|
|
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesInputDefectRecordModel;
|
|
|
|
|
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil;
|
|
|
|
|
import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService;
|
|
|
|
|
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
|
|
|
|
|
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;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.bean.*;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.repository.*;
|
|
|
|
|
import cn.estsh.impp.framework.boot.auth.AuthUtil;
|
|
|
|
|
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
|
|
|
|
|
import cn.estsh.impp.framework.boot.util.ResultBean;
|
|
|
|
|
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.HashMap;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @Description :
|
|
|
|
|
* @Reference :
|
|
|
|
|
* @Author :
|
|
|
|
|
* @CreateDate : 2024-05-09 10:54
|
|
|
|
|
* @Modify:
|
|
|
|
|
**/
|
|
|
|
|
|
|
|
|
|
@Service
|
|
|
|
|
@Slf4j
|
|
|
|
|
public class MesInputDefectRecordService implements IMesInputDefectRecordService {
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesProduceSnRepository produceSnRepository;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesPartRepository partRepository;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesPartTypePictureRepository partTypePictureRepository;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesLocationConfigRepository locationConfigRepository;
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesDefectAlarmConfigRepository defectAlarmConfigRepository;
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesPartTypeDefectRepository partTypeDefectRepository;
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesDefectRecordRepository defectRecordRepository;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesDefectRecordService defectRecordService;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesMoveRepository moveRepository;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private IMesConfigService configService;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private ISyncFuncService syncFuncService;
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public MesInputDefectRecordModel queryProduceSn(String serialNumber, Integer sides, String org) {
|
|
|
|
|
|
|
|
|
|
//检查条码
|
|
|
|
|
MesProduceSn produceSn = checkProduceSn(serialNumber, org);
|
|
|
|
|
|
|
|
|
|
//检查物料
|
|
|
|
|
MesPart part = checkPart(produceSn, org);
|
|
|
|
|
|
|
|
|
|
//todo 图片暂时放空
|
|
|
|
|
//检查零件类型与图片对应关系
|
|
|
|
|
MesPartTypePicture partTypePicture = checkPartTypePicture(part, org);
|
|
|
|
|
|
|
|
|
|
//位置
|
|
|
|
|
List<MesLocationConfig> locationConfigList = checkLocationConfig(org);
|
|
|
|
|
List<String> locationCodeList = locationConfigList.stream().map(k -> k.getDefectLocationCode()).collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
//查询零件类型缺陷类型对应关系
|
|
|
|
|
List<MesPartTypeDefect> partTypeDefectList = checkPartTypeDefect(part, org);
|
|
|
|
|
List<String> partTypeDefectCodeList = partTypeDefectList.stream().map(k -> k.getDefectCode()).collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
//查询预警数量
|
|
|
|
|
List<MesDefectAlarmConfig> alarmConfigList = queryDefectAlarmConfigByLocationCodeList(part, sides, locationCodeList, partTypeDefectCodeList, org);
|
|
|
|
|
|
|
|
|
|
//根据不良类型+位置 若有数据,则表示需要标黄
|
|
|
|
|
Map<String, MesDefectAlarmConfig> alarmConfigMap = alarmConfigList.stream().collect(Collectors.toMap(k -> k.getDefectLocationCode(), k -> k));
|
|
|
|
|
|
|
|
|
|
// //位置是否标黄Map,key:位置,value:标黄标识
|
|
|
|
|
// Map<String, Boolean> map = new HashMap<>();
|
|
|
|
|
// alarmConfigMap.forEach((k, v) -> {
|
|
|
|
|
// //若有这个位置则标黄
|
|
|
|
|
// if (!map.containsKey(k)) {
|
|
|
|
|
// map.put(k, true);
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// });
|
|
|
|
|
|
|
|
|
|
locationConfigList.forEach(k -> {
|
|
|
|
|
if (alarmConfigMap.containsKey(k.getDefectLocationCode())) {
|
|
|
|
|
k.setIsflg(true);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
MesInputDefectRecordModel model = new MesInputDefectRecordModel();
|
|
|
|
|
// model.setMap(map);
|
|
|
|
|
model.setPart(part);
|
|
|
|
|
model.setPartTypePicture(partTypePicture);
|
|
|
|
|
model.setLocationConfigList(locationConfigList);
|
|
|
|
|
return model;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public List<MesPartTypeDefect> queryPartTypeDefect(String partNo, String defectLocationCode, boolean flg, Integer sides, String org) {
|
|
|
|
|
|
|
|
|
|
//检查物料
|
|
|
|
|
MesPart part = checkPartByPartNo(partNo, org);
|
|
|
|
|
|
|
|
|
|
//查询零件类型缺陷类型对应关系
|
|
|
|
|
List<MesPartTypeDefect> partTypeDefectList = checkPartTypeDefect(part, org);
|
|
|
|
|
|
|
|
|
|
//flg==true 则是标黄的位置,需要查询位置下具体需要标黄的缺陷类型
|
|
|
|
|
if (!StringUtils.isEmpty(flg) && flg) {
|
|
|
|
|
|
|
|
|
|
List<String> partTypeDefectCodeList = partTypeDefectList.stream().map(k -> k.getDefectCode()).collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
//查询预警数量
|
|
|
|
|
List<MesDefectAlarmConfig> alarmConfigList = queryDefectAlarmConfig(part, sides, defectLocationCode, partTypeDefectCodeList, org);
|
|
|
|
|
|
|
|
|
|
//根据不良类型 合计预警数量
|
|
|
|
|
Map<String, MesDefectAlarmConfig> alarmConfigMap = alarmConfigList.stream().collect(Collectors.toMap(k -> k.getDefectCode(), k -> k));
|
|
|
|
|
|
|
|
|
|
//位置是否标黄Map,key:不良类型,value:标黄标识
|
|
|
|
|
Map<String, Boolean> map = new HashMap<>();
|
|
|
|
|
alarmConfigMap.forEach((k, v) -> {
|
|
|
|
|
//若有这个不良类型则标黄
|
|
|
|
|
if (!map.containsKey(k)) {
|
|
|
|
|
map.put(k, true);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
//找到标黄的缺陷类型 标识置为true
|
|
|
|
|
partTypeDefectList.forEach(k -> {
|
|
|
|
|
if (map.containsKey(k.getDefectCode())) {
|
|
|
|
|
k.setFlg(true);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return partTypeDefectList;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void saveDefectRecord(List<MesDefectRecord> defectRecordList, String org) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DdlPackBean packBean = DdlPackBean.getDdlPackBean(org);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(defectRecordList.get(0).getPartNo(), "partNo", packBean);
|
|
|
|
|
MesPart part = partRepository.getByProperty(packBean);
|
|
|
|
|
|
|
|
|
|
//保存数据
|
|
|
|
|
defectRecordService.saveDefect(org, AuthUtil.getSessionUser().getUserName(), defectRecordList);
|
|
|
|
|
|
|
|
|
|
GenSerialNoModel serialNoModel = new GenSerialNoModel("INPUT_DEFECT_ZRSUM");
|
|
|
|
|
serialNoModel.setPartNo(part.getPartNo());
|
|
|
|
|
ResultBean rb = syncFuncService.syncSerialNo(serialNoModel, AuthUtil.getSessionUser().getUserName(), org, 1);
|
|
|
|
|
String zrsum = "";
|
|
|
|
|
if (null != rb && !CollectionUtils.isEmpty(rb.getResultList())) {
|
|
|
|
|
zrsum = (rb.getResultList().get(0)).toString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MesMove move = new MesMove();
|
|
|
|
|
move.setOrganizeCode(org);
|
|
|
|
|
move.setFactoryCode(org);
|
|
|
|
|
move.setLgort(configService.getCfgValue(org, "LGORT"));
|
|
|
|
|
move.setUmlgo(configService.getCfgValue(org, "UMLGO"));
|
|
|
|
|
move.setMenge(defectRecordList.size());
|
|
|
|
|
move.setMeins(part.getUnit());
|
|
|
|
|
move.setZrsum(zrsum);
|
|
|
|
|
ConvertBean.serviceModelInitialize(move, AuthUtil.getSessionUser().getUserName());
|
|
|
|
|
moveRepository.save(move);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private MesProduceSn checkProduceSn(String serialNumber, String org) {
|
|
|
|
|
//根据扫描的条码查询条码是否存在
|
|
|
|
|
DdlPackBean packBean = DdlPackBean.getDdlPackBean(org);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(serialNumber, "serialNumber", packBean);
|
|
|
|
|
MesProduceSn produceSn = produceSnRepository.getByProperty(packBean);
|
|
|
|
|
|
|
|
|
|
//若不存在则提示条码不存在
|
|
|
|
|
if (StringUtils.isEmpty(produceSn)) {
|
|
|
|
|
throw new ImppBusiException(String.format("【%s】此条码不存在,请检查数据", serialNumber));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//根据条码状态判断 是不是已下线条码
|
|
|
|
|
//若不是已下线的条码则提示 条码状态 请选择已下线的条码
|
|
|
|
|
if (produceSn.getSnStatus() != MesPcnExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue()) {
|
|
|
|
|
throw new ImppBusiException(String.format("【%s】此条码状态为【%s】,请选择【%s】状态的条码", serialNumber, produceSn.getSnStatus(), MesPcnExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//todo
|
|
|
|
|
//是否需要判断条码质量状态
|
|
|
|
|
// if()
|
|
|
|
|
return produceSn;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private MesPart checkPart(MesProduceSn produceSn, String org) {
|
|
|
|
|
|
|
|
|
|
DdlPackBean packBean = DdlPackBean.getDdlPackBean(org);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(produceSn.getPartNo(), "partNo", packBean);
|
|
|
|
|
MesPart part = partRepository.getByProperty(packBean);
|
|
|
|
|
|
|
|
|
|
//若不存在则提示物料信息不存在
|
|
|
|
|
if (StringUtils.isEmpty(part)) {
|
|
|
|
|
throw new ImppBusiException(String.format("【%s】此条码对应【%s】物料号不存在,请检查数据", produceSn.getSerialNumber(), produceSn.getPartNo()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//根据条码查询零件类型(partType)
|
|
|
|
|
if (StringUtils.isEmpty(part.getPartTypeCode())) {
|
|
|
|
|
throw new ImppBusiException(String.format("【%s】此条码对应【%s】物料号未维护零件类型,请检查数据", produceSn.getSerialNumber(), produceSn.getPartNo()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return part;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private MesPart checkPartByPartNo(String partNo, String org) {
|
|
|
|
|
|
|
|
|
|
DdlPackBean packBean = DdlPackBean.getDdlPackBean(org);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(partNo, "partNo", packBean);
|
|
|
|
|
MesPart part = partRepository.getByProperty(packBean);
|
|
|
|
|
|
|
|
|
|
return part;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private MesPartTypePicture checkPartTypePicture(MesPart part, String org) {
|
|
|
|
|
|
|
|
|
|
DdlPackBean packBean = DdlPackBean.getDdlPackBean(org);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(part.getPartTypeCode(), "partTypeCode", packBean);
|
|
|
|
|
MesPartTypePicture partTypePicture = partTypePictureRepository.getByProperty(packBean);
|
|
|
|
|
|
|
|
|
|
//若不存在则提示零件类别不存在
|
|
|
|
|
if (StringUtils.isEmpty(partTypePicture)) {
|
|
|
|
|
throw new ImppBusiException(String.format("【%s】物料号对应的【%s】零件类别不存在,请检查数据", part.getPartNo(), part.getPartTypeCode()));
|
|
|
|
|
}
|
|
|
|
|
//若不存在则提示未维护正面图片
|
|
|
|
|
if (StringUtils.isEmpty(partTypePicture.getFrontPictureName())) {
|
|
|
|
|
throw new ImppBusiException(String.format("【%s】物料号对应的【%s】零件类别未维护正面图片,请检查数据", part.getPartNo(), part.getPartTypeCode()));
|
|
|
|
|
}
|
|
|
|
|
//若不存在则提示未维护反面图片
|
|
|
|
|
if (StringUtils.isEmpty(partTypePicture.getBackPictureName())) {
|
|
|
|
|
throw new ImppBusiException(String.format("【%s】物料号对应的【%s】零件类别未维护反面图片,请检查数据", part.getPartNo(), part.getPartTypeCode()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return partTypePicture;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private List<MesLocationConfig> checkLocationConfig(String org) {
|
|
|
|
|
|
|
|
|
|
DdlPackBean packBean = DdlPackBean.getDdlPackBean(org);
|
|
|
|
|
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.ASC.getValue(), CommonEnumUtil.ASC_OR_DESC.ASC.getValue()}, new String[]{"rowLocation", "columnLocation"}, packBean);
|
|
|
|
|
List<MesLocationConfig> configList = locationConfigRepository.findByHqlWhere(packBean);
|
|
|
|
|
|
|
|
|
|
if (CollectionUtils.isEmpty(configList)) {
|
|
|
|
|
throw new ImppBusiException(String.format("未配置位置,请检查数据"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return configList;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private List<MesPartTypeDefect> checkPartTypeDefect(MesPart part, String org) {
|
|
|
|
|
|
|
|
|
|
DdlPackBean packBean = DdlPackBean.getDdlPackBean(org);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(part.getPartTypeCode(), "partTypeCode", packBean);
|
|
|
|
|
List<MesPartTypeDefect> partTypeDefectList = partTypeDefectRepository.findByHqlWhere(packBean);
|
|
|
|
|
|
|
|
|
|
if (CollectionUtils.isEmpty(partTypeDefectList)) {
|
|
|
|
|
throw new ImppBusiException(String.format("未配置【%s】零件类型缺陷类型对应关系,请检查数据", part.getPartTypeCode()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return partTypeDefectList;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private List<MesDefectAlarmConfig> queryDefectAlarmConfigByLocationCodeList(MesPart part, Integer sides, List<String> locationCodeList, List<String> partTypeDefectCodeList,
|
|
|
|
|
String org) {
|
|
|
|
|
|
|
|
|
|
DdlPackBean packBean = DdlPackBean.getDdlPackBean(org);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(part.getPartNo(), "partNo", packBean);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(part.getPartTypeCode(), "partTypeCode", packBean);
|
|
|
|
|
DdlPreparedPack.getNumEqualPack(sides, "frontAndBackSides", packBean);
|
|
|
|
|
DdlPreparedPack.getInPackList(locationCodeList, "defectLocationCode", packBean);
|
|
|
|
|
DdlPreparedPack.getInPackList(partTypeDefectCodeList, "defectCode", packBean);
|
|
|
|
|
List<MesDefectAlarmConfig> alarmConfigList = defectAlarmConfigRepository.findByHqlWhere(packBean);
|
|
|
|
|
|
|
|
|
|
return alarmConfigList;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private List<MesDefectAlarmConfig> queryDefectAlarmConfig(MesPart part, Integer sides, String locationCode, List<String> partTypeDefectCodeList, String org) {
|
|
|
|
|
|
|
|
|
|
DdlPackBean packBean = DdlPackBean.getDdlPackBean(org);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(part.getPartNo(), "partNo", packBean);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(part.getPartTypeCode(), "partTypeCode", packBean);
|
|
|
|
|
DdlPreparedPack.getNumEqualPack(sides, "frontAndBackSides", packBean);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(locationCode, "defectLocation", packBean);
|
|
|
|
|
DdlPreparedPack.getInPackList(partTypeDefectCodeList, "defectCode", packBean);
|
|
|
|
|
List<MesDefectAlarmConfig> alarmConfigList = defectAlarmConfigRepository.findByHqlWhere(packBean);
|
|
|
|
|
|
|
|
|
|
return alarmConfigList;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void queryDefectRecordByToDaySumQty(Map<String, Boolean> map, MesPart part, Integer sides, String locationCode, String partTypeDefectCode, Integer count,
|
|
|
|
|
String org) {
|
|
|
|
|
|
|
|
|
|
if (map.containsKey(locationCode)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
DdlPackBean packBean = DdlPackBean.getDdlPackBean(org);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(part.getPartNo(), "partNo", packBean);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(part.getPartTypeCode(), "partTypeCode", packBean);
|
|
|
|
|
DdlPreparedPack.getNumEqualPack(sides, "frontAndBackSides", packBean);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(locationCode, "defectLocation", packBean);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(partTypeDefectCode, "defectCode", packBean);
|
|
|
|
|
DdlPreparedPack.timeBuilder(TimeTool.getToday(), TimeTool.getToday(), "createDatetime", packBean, true);
|
|
|
|
|
int defectCount = defectRecordRepository.findByHqlWhereCount(packBean);
|
|
|
|
|
|
|
|
|
|
if (defectCount >= count) {
|
|
|
|
|
map.put(locationCode, true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|