feat(检验任务主画面): 完成时,判断所有检验项目的检验结果并纪录超规值

refs: #14407
This commit is contained in:
YiLiLin 2023-08-08 11:33:27 +08:00
parent 49f86304f2
commit 5bc2c047fa
3 changed files with 180 additions and 117 deletions

View File

@ -3,8 +3,6 @@ package com.foreverwin.iep.qms.service.impl;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.foreverwin.iep.common.utils.ListUtils;
@ -17,6 +15,7 @@ import com.foreverwin.iep.qms.dto.QmsInspecResultNccodeDTO;
import com.foreverwin.iep.qms.entity.*;
import com.foreverwin.iep.qms.mapper.QmsInspecDetailMapper;
import com.foreverwin.iep.qms.service.*;
import com.foreverwin.iep.qms.utils.Area;
import com.foreverwin.mom.common.core.util.I18nUtil;
import com.foreverwin.mom.common.data.tenant.TenantContextHolder;
import com.foreverwin.mom.common.security.util.SecurityUtils;
@ -28,7 +27,6 @@ import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
/**
@ -53,8 +51,7 @@ public class QmsInspecDetailServiceImpl extends ServiceImpl<QmsInspecDetailMappe
private final NcBasisMapper ncBasisMapper;
private static final String percent = "%";
private static final String OK = "1";
private static final String NG = "0";
private static String user;
private static LocalDateTime now;
@ -67,7 +64,7 @@ public class QmsInspecDetailServiceImpl extends ServiceImpl<QmsInspecDetailMappe
public QmsInspecDetailDTO getDetailResult(String inspecDetailBo) {
QmsInspecDetailDTO inspecDetail = baseMapper.selectDetail(inspecDetailBo);
String itemType = inspecDetail.getItemType();
Map<String, String> area = area(inspecDetail.getAreaInfo());
Map<String, String> area = Area.formatter(inspecDetail.getAreaInfo());
BigDecimal sampleSize = inspecDetail.getSampleSize();
BigDecimal dieQty = inspecDetail.getDieQty();
@ -149,9 +146,7 @@ public class QmsInspecDetailServiceImpl extends ServiceImpl<QmsInspecDetailMappe
QmsInspecDetailDTO inspecDetail = baseMapper.selectDetail(inspecDetailBo);
String inspecJobBo = inspecDetail.getInspecJobBo();
String itemType = inspecDetail.getItemType();
BigDecimal max = inspecDetail.getMaxValue();
BigDecimal min = inspecDetail.getMinValue();
Map<String, String> areaMap = area(inspecDetail.getAreaInfo());
Map<String, String> areaMap = Area.formatter(inspecDetail.getAreaInfo());
remove(inspecDetailBo);
updateJobStatus(inspecJobBo);
@ -165,7 +160,7 @@ public class QmsInspecDetailServiceImpl extends ServiceImpl<QmsInspecDetailMappe
inspecResult.setContent(dto.getContentResult().getContent());
qmsInspecResultService.save(inspecResult);
updateResult(inspecDetailBo, OK);
updateDetail(inspecDetailBo);
return;
}
@ -173,9 +168,6 @@ public class QmsInspecDetailServiceImpl extends ServiceImpl<QmsInspecDetailMappe
// 計量
saveSn(inspecDetailBo, resultList);
AtomicBoolean flag = new AtomicBoolean(true);
List<String> oocRemarkList = new ArrayList<>();
List<QmsInspecResult> inspecResultList = new ArrayList<>();
List<QmsInspecResultNccode> inspecResultNcList = new ArrayList<>();
resultList.forEach(objectMap -> {
@ -199,65 +191,27 @@ public class QmsInspecDetailServiceImpl extends ServiceImpl<QmsInspecDetailMappe
inspecResult.setResult(result);
inspecResultList.add(inspecResult);
switch (itemType) {
case "0":
Object ncValue = objectMap.get(String.format("%s$%s", value, "NC"));
if (ObjectUtil.isNotNull(ncValue)) {
List<Map<String, String>> resultNcList = (List<Map<String, String>>) ncValue;
if (!ListUtils.isEmpty(resultNcList)) {
Map<String, Integer> count = new HashMap<>();
resultNcList.forEach(resultNc -> {
String ncCode = resultNc.get("ncCode");
if ("0".equals(itemType)) {
Object ncValue = objectMap.get(String.format("%s$%s", value, "NC"));
if (ObjectUtil.isNotNull(ncValue)) {
List<Map<String, String>> resultNcList = (List<Map<String, String>>) ncValue;
if (!ListUtils.isEmpty(resultNcList)) {
resultNcList.forEach(resultNc -> {
String ncCode = resultNc.get("ncCode");
QmsInspecResultNccode inspecResultNc = new QmsInspecResultNccodeDTO();
inspecResultNc.setSid(SidUtils.genSid());
inspecResultNc.setInspecResultSid(inspecResult.getSid());
inspecResultNc.setNcBasisBo(NcBasis.genHandle(site, ncCode));
inspecResultNcList.add(inspecResultNc);
Integer qty = count.getOrDefault(ncCode, 0);
count.put(ncCode, qty + 1);
});
count.forEach((nc, qty) -> {
oocRemarkList.add(String.format("%s:%%nc.description%%, %%nc.judge.qty%% %s", nc, qty));
});
flag.set(false);
}
QmsInspecResultNccode inspecResultNc = new QmsInspecResultNccodeDTO();
inspecResultNc.setSid(SidUtils.genSid());
inspecResultNc.setInspecResultSid(inspecResult.getSid());
inspecResultNc.setNcBasisBo(NcBasis.genHandle(site, ncCode));
inspecResultNcList.add(inspecResultNc);
});
}
break;
case "1":
int spec = 0;
if (ObjectUtil.isNotNull(min) && min.compareTo(result) > 0) {
spec = 1;
}
if (ObjectUtil.isNotNull(max) && max.compareTo(result) < 0) {
spec = 2;
}
if (spec > 0) {
String remark = String.format("OOS: %s", result.stripTrailingZeros().toPlainString());
switch (spec) {
case 1:
remark = String.format("%s %%out.of.spec.min%% %s", remark, min.stripTrailingZeros()
.toPlainString());
break;
case 2:
remark = String.format("%s %%out.of.spec.max%% %s", remark, max.stripTrailingZeros()
.toPlainString());
break;
}
oocRemarkList.add(remark);
flag.set(false);
}
break;
}
}
});
});
String result = flag.get() ? OK : NG;
updateResult(inspecDetailBo, result, String.join("|", oocRemarkList));
updateDetail(inspecDetailBo);
qmsInspecResultService.saveBatch(inspecResultList);
qmsInspecResultNccodeService.saveBatch(inspecResultNcList);
}
@ -293,16 +247,10 @@ public class QmsInspecDetailServiceImpl extends ServiceImpl<QmsInspecDetailMappe
.eq(QmsInspecJob::getHandle, inspecJobBo));
}
private void updateResult(String inspecDetailBo, String result) {
updateResult(inspecDetailBo, result, null);
}
private void updateResult(String inspecDetailBo, String result, String oocRemark) {
private void updateDetail(String inspecDetailBo) {
update(Wrappers.lambdaUpdate(QmsInspecDetail.class)
.set(QmsInspecDetail::getInspecUser, user)
.set(QmsInspecDetail::getInspecDateTime, now)
.set(QmsInspecDetail::getResult, result)
.set(StrUtil.isNotBlank(oocRemark), QmsInspecDetail::getOocRemark, oocRemark)
.eq(QmsInspecDetail::getHandle, inspecDetailBo));
}
@ -350,20 +298,6 @@ public class QmsInspecDetailServiceImpl extends ServiceImpl<QmsInspecDetailMappe
qmsInspecSnService.saveBatch(inspecSnList);
}
private Map<String, String> area(String areaInfo) {
if (StrUtil.isBlank(areaInfo)) {
areaInfo = "{}";
}
JSONObject object = JSONObject.parseObject(areaInfo);
if (object.isEmpty()) {
object.put("1", "");
areaInfo = object.toJSONString();
}
return JSONObject.parseObject(areaInfo, new TypeReference<Map<String, String>>() {
});
}
private void init() {
user = SecurityUtils.getUserName();
now = LocalDateTime.now();

View File

@ -2,7 +2,6 @@ package com.foreverwin.iep.qms.service.impl;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@ -21,11 +20,9 @@ import com.foreverwin.iep.common.spc.QcDataSync;
import com.foreverwin.iep.common.utils.HandleBoProcessor;
import com.foreverwin.iep.common.utils.ListUtils;
import com.foreverwin.iep.common.utils.SidUtils;
import com.foreverwin.iep.prd.entity.NcBasis;
import com.foreverwin.iep.prd.entity.Operation;
import com.foreverwin.iep.prd.entity.ReasonCode;
import com.foreverwin.iep.prd.entity.RouterStep;
import com.foreverwin.iep.prd.mapper.NcBasisMapper;
import com.foreverwin.iep.production.dto.GenerateNextNumberRequest;
import com.foreverwin.iep.production.dto.GenerateNextNumberResponse;
import com.foreverwin.iep.production.dto.NextNumberRetrieveRequest;
@ -41,6 +38,7 @@ import com.foreverwin.iep.qms.dto.*;
import com.foreverwin.iep.qms.entity.*;
import com.foreverwin.iep.qms.mapper.QmsInspecJobMapper;
import com.foreverwin.iep.qms.service.*;
import com.foreverwin.iep.qms.utils.Area;
import com.foreverwin.iep.smd.entity.Resrce;
import com.foreverwin.iep.sys.entity.SystemTransactionLog;
import com.foreverwin.iep.sys.feign.RemoteSystemTransactionLogService;
@ -65,6 +63,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
/**
@ -94,6 +93,9 @@ public class QmsInspecJobServiceImpl extends ServiceImpl<QmsInspecJobMapper, Qms
private final RemoteParamService remoteParamService;
private final RemoteSystemTransactionLogService remoteSystemTransactionLogService;
private static final String OK = "1";
private static final String NG = "0";
@Override
public IPage<Item> getItem(FrontPage page, String item) {
String site = TenantContextHolder.getTenantId();
@ -276,6 +278,7 @@ public class QmsInspecJobServiceImpl extends ServiceImpl<QmsInspecJobMapper, Qms
.set(QmsInspecJob::getCompleteUser, user)
.set(QmsInspecJob::getCompleteDateTime, LocalDateTime.now())
.eq(QmsInspecJob::getHandle, inspecJobBo));
updateDetail(qmsInspecJob);
toSpc(qmsInspecJob);
break;
case "judge":
@ -364,7 +367,7 @@ public class QmsInspecJobServiceImpl extends ServiceImpl<QmsInspecJobMapper, Qms
String url = remoteParamService.getByKey("SPC_RESTFUL_URL", SecurityConstants.FROM_IN).getData();
QmsQcPlan qcPlan = qmsQcPlanService.getById(job.getQcPlanBo());
if(StrUtil.isNotBlank(url) && "1".equals(qcPlan.getToSpc())){
if (StrUtil.isNotBlank(url) && "1".equals(qcPlan.getToSpc())) {
//itemType, targetId, qcItem. row
Map<String, Map<String, Map<String, List<QmsInspecResult>>>> map = new HashMap<>();
@ -381,20 +384,21 @@ public class QmsInspecJobServiceImpl extends ServiceImpl<QmsInspecJobMapper, Qms
List<QmsInspecResult> resultList = qmsInspecResultService.list(Wrappers.<QmsInspecResult>query()
.eq("inspec_detail_bo", detail.getHandle())
.orderByAsc("CONVERT(seq,SIGNED), series, area"));
if("0".equals(detail.getItemType())){
if ("0".equals(detail.getItemType())) {
//计数
qcItemSampleSizeMap.put(detail.getQcItem(), detail.getSampleSize());
if(!map.containsKey("0")){
if (!map.containsKey("0")) {
Map<String, Map<String, List<QmsInspecResult>>> targetMap = new HashMap<>();
targetMap.put(HandleBoProcessor.trimHandle(job.getTargetBo()), new HashMap<>());
map.put("0", targetMap);
}
map.get("0").get(HandleBoProcessor.trimHandle(job.getTargetBo())).put(detail.getQcItem(), resultList);
map.get("0").get(HandleBoProcessor.trimHandle(job.getTargetBo()))
.put(detail.getQcItem(), resultList);
}else if("1".equals(detail.getItemType())){
} else if ("1".equals(detail.getItemType())) {
//计量
if(!map.containsKey("1")){
if (!map.containsKey("1")) {
Map<String, Map<String, List<QmsInspecResult>>> targetMap = new HashMap<>();
map.put("1", targetMap);
}
@ -404,17 +408,18 @@ public class QmsInspecJobServiceImpl extends ServiceImpl<QmsInspecJobMapper, Qms
.orderByAsc("CONVERT(seq,SIGNED)"));
boolean haveSn = StrUtil.isNotBlank(snList.get(0).getSn());
if(haveSn){
snList.forEach(qmsInspecSn ->{
if (haveSn) {
snList.forEach(qmsInspecSn -> {
String sn = qmsInspecSn.getSn();
if(!map.get("1").containsKey(sn)){
if (!map.get("1").containsKey(sn)) {
map.get("1").put(sn, new HashMap<>());
}
map.get("1").get(sn).put(detail.getQcItem(), resultList.stream()
.filter(qmsInspecResult -> qmsInspecSn.getSeq().equals(qmsInspecResult.getSeq()))
.collect(Collectors.toList()));
.filter(qmsInspecResult -> qmsInspecSn.getSeq()
.equals(qmsInspecResult.getSeq()))
.collect(Collectors.toList()));
});
}else {
} else {
if(!map.get("1").containsKey(HandleBoProcessor.trimHandle(job.getTargetBo()))){
map.get("1").put(HandleBoProcessor.trimHandle(job.getTargetBo()), new HashMap<>());
}
@ -429,8 +434,8 @@ public class QmsInspecJobServiceImpl extends ServiceImpl<QmsInspecJobMapper, Qms
request.setUrl(url);
request.setRequests(new ArrayList<>());
for(String itemType : map.keySet()){
for(String targetId : map.get(itemType).keySet()){
for (String itemType : map.keySet()) {
for (String targetId : map.get(itemType).keySet()) {
SpcExecuteRequest spcExecuteRequest = new SpcExecuteRequest();
spcExecuteRequest.setQcPlan(qcPlan.getQcPlan());
spcExecuteRequest.setRevision(qcPlan.getRevision());
@ -439,7 +444,7 @@ public class QmsInspecJobServiceImpl extends ServiceImpl<QmsInspecJobMapper, Qms
spcExecuteRequest.setOperation(HandleBoProcessor.trimHandle(job.getOperationBo()));
spcExecuteRequest.setTargetId(targetId);
spcExecuteRequest.setQcItems(new ArrayList<>());
for(String qcItemS : map.get(itemType).get(targetId).keySet()){
for (String qcItemS : map.get(itemType).get(targetId).keySet()) {
QmsQcItem qmsQcItem = qmsQcItemService.getOne(site, qcItemS);
QcItem qcItem = new QcItem();
qcItem.setQcItem(qcItemS);
@ -449,7 +454,7 @@ public class QmsInspecJobServiceImpl extends ServiceImpl<QmsInspecJobMapper, Qms
qcItem.setSampleSize("0".equals(itemType) ? qcItemSampleSizeMap.get(qcItemS) : qmsQcItem.getSampleSize());
qcItem.setFactors(new ArrayList<>());
detailFactorMap.get(qcItemS).forEach(qmsInspecFactorDTO->{
detailFactorMap.get(qcItemS).forEach(qmsInspecFactorDTO -> {
com.foreverwin.iep.common.model.spc.dc.Factor factor = new com.foreverwin.iep.common.model.spc.dc.Factor();
factor.setFactor(qmsInspecFactorDTO.getFactor());
factor.setValue(qmsInspecFactorDTO.getValue());
@ -472,9 +477,9 @@ public class QmsInspecJobServiceImpl extends ServiceImpl<QmsInspecJobMapper, Qms
nc.setNcCode(qmsInspecResultNccode.getNcCode());
nc.setNcType(qmsInspecResultNccode.getType());
result.getNcList().add(nc);
if("0".equals(qmsInspecResultNccode.getType())){
if ("0".equals(qmsInspecResultNccode.getType())) {
qcItem.setScrapQty(qcItem.getScrapQty().add(BigDecimal.ONE));
}else {
} else {
qcItem.setDefectQty(qcItem.getDefectQty().add(BigDecimal.ONE));
}
});
@ -489,7 +494,7 @@ public class QmsInspecJobServiceImpl extends ServiceImpl<QmsInspecJobMapper, Qms
HttpResponse response = QcDataSync.execute(request);
saveSystemTransactionLog(job.getJobNo(), response);
if(response.getStatusCode() != 200){
if (response.getStatusCode() != 200) {
throw BusinessException.build(I18nUtil.getI18nText("qms.spc.sync.msg", response.getResponse()));
}
@ -502,10 +507,10 @@ public class QmsInspecJobServiceImpl extends ServiceImpl<QmsInspecJobMapper, Qms
if ("1".equals(detail.getResult())) {
String[] snMsgList = resultMark.split("SN: ");
boolean isOK = true;
for(String snMsg : snMsgList){
if(StrUtil.isNotBlank(snMsg)){
for (String snMsg : snMsgList) {
if (StrUtil.isNotBlank(snMsg)) {
String[] resultSplit = snMsg.split("\\|");
if(!"OK".equals(resultSplit[1])){
if (!"OK".equals(resultSplit[1])) {
isOK = false;
break;
}
@ -523,7 +528,7 @@ public class QmsInspecJobServiceImpl extends ServiceImpl<QmsInspecJobMapper, Qms
}
}
private void saveSystemTransactionLog(String jobNo, HttpResponse response){
private void saveSystemTransactionLog(String jobNo, HttpResponse response) {
SystemTransactionLog log = new SystemTransactionLog();
log.setSid(SidUtils.genSid());
log.setFromSystem("IEP");
@ -536,21 +541,21 @@ public class QmsInspecJobServiceImpl extends ServiceImpl<QmsInspecJobMapper, Qms
if (response != null) {
log.setRequest(response.getRequest());
if(StrUtil.isBlank(response.getResponse())){
if (StrUtil.isBlank(response.getResponse())) {
log.setResponse("N/A");
}else {
} else {
log.setResponse(response.getResponse());
}
if (response.getStatusCode() == 200) {
log.setResult("Success");
log.setMessage("作业成功");
}else {
} else {
log.setResult("Fail");
log.setMessage(response.getResponse());
}
remoteSystemTransactionLogService.save(log);
if("Fail".equals(log.getResult())){
if ("Fail".equals(log.getResult())) {
throw BusinessException.build(I18nUtil.getI18nText("qms.spc.sync.msg", response.getResponse()));
}
}
@ -685,4 +690,104 @@ public class QmsInspecJobServiceImpl extends ServiceImpl<QmsInspecJobMapper, Qms
abnMaster.setDetails(abnDetails);
remoteAbnService.create(abnMaster);
}
private void updateDetail(QmsInspecJob qmsInspecJob) {
String jobBo = qmsInspecJob.getHandle();
List<QmsInspecDetailDTO> details = qmsInspecDetailService.selectAll(jobBo);
details.forEach(detail -> {
String detailBo = detail.getHandle();
String itemType = detail.getItemType();
BigDecimal max = detail.getMaxValue();
BigDecimal min = detail.getMinValue();
Map<String, String> areaMap = Area.formatter(detail.getAreaInfo());
QmsInspecDetailDTO inspecDetail = qmsInspecDetailService.getDetailResult(detailBo);
List<Map<String, Object>> resultList = inspecDetail.getResultList();
AtomicBoolean flag = new AtomicBoolean(true);
List<String> oocRemarkList = new ArrayList<>();
switch (itemType) {
default:
resultList.forEach(objectMap -> areaMap.forEach((k, v) -> {
String value = v;
if (StrUtil.isBlank(value)) {
value = k;
}
BigDecimal result = new BigDecimal((String) objectMap.get(value));
switch (itemType) {
case "0":
// 計數
Object ncValue = objectMap.get(String.format("%s$%s", value, "NC"));
if (ObjectUtil.isNotNull(ncValue)) {
List<Map<String, String>> resultNcList = (List<Map<String, String>>) ncValue;
if (!ListUtils.isEmpty(resultNcList)) {
Map<String, Integer> count = new HashMap<>();
resultNcList.forEach(resultNc -> {
String ncCode = resultNc.get("ncCode");
Integer qty = count.getOrDefault(ncCode, 0);
count.put(ncCode, qty + 1);
});
count.forEach((nc, qty) -> {
oocRemarkList.add(String.format("%s:%%nc.description%%, %%nc.judge.qty%% %s", nc, qty));
});
flag.set(false);
}
}
break;
case "1":
// 計量
int spec = 0;
if (ObjectUtil.isNotNull(min) && min.compareTo(result) > 0) {
spec = 1;
}
if (ObjectUtil.isNotNull(max) && max.compareTo(result) < 0) {
spec = 2;
}
if (spec > 0) {
String remark = String.format("OOS: %s", result.stripTrailingZeros()
.toPlainString());
switch (spec) {
case 1:
remark = String.format("%s %%out.of.spec.min%% %s", remark, min.stripTrailingZeros()
.toPlainString());
break;
case 2:
remark = String.format("%s %%out.of.spec.max%% %s", remark, max.stripTrailingZeros()
.toPlainString());
break;
}
oocRemarkList.add(remark);
flag.set(false);
}
break;
}
}));
String result = flag.get() ? OK : NG;
updateDetailResult(detailBo, result, String.join("|", oocRemarkList));
break;
case "2":
// 內文
updateDetailResult(detailBo);
break;
}
});
}
private void updateDetailResult(String inspecDetailBo) {
updateDetailResult(inspecDetailBo, OK, null);
}
private void updateDetailResult(String inspecDetailBo, String result, String oocRemark) {
qmsInspecDetailService.update(Wrappers.lambdaUpdate(QmsInspecDetail.class)
.set(QmsInspecDetail::getResult, result)
.set(StrUtil.isNotBlank(oocRemark), QmsInspecDetail::getOocRemark, oocRemark)
.eq(QmsInspecDetail::getHandle, inspecDetailBo));
}
}

View File

@ -0,0 +1,24 @@
package com.foreverwin.iep.qms.utils;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import java.util.Map;
public class Area {
public static Map<String, String> formatter(String areaInfo) {
if (StrUtil.isBlank(areaInfo)) {
areaInfo = "{}";
}
JSONObject object = JSONObject.parseObject(areaInfo);
if (object.isEmpty()) {
object.put("1", "");
areaInfo = object.toJSONString();
}
return JSONObject.parseObject(areaInfo, new TypeReference<Map<String, String>>() {
});
}
}