Commit 81445f50 by lijingjing

修改样品下检测项目为空的可能性处理逻辑;

parent 24732be7
package com.patzn.cloud.service.lims.hmhj.common;
import com.baomidou.mybatisplus.toolkit.CollectionUtils;
import com.patzn.cloud.commons.api.RestAssert;
import com.patzn.cloud.service.hmhj.enums.*;
import com.patzn.cloud.service.lims.common.consts.Symbol;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* 委托流程控制(状态控制)
*
* @author Meazty
*/
public class EntrustFlowUtils {
private static final Logger logger = LoggerFactory.getLogger(EntrustFlowUtils.class);
private static final int FLOW_TEST = 7;
private static final int FLOW_ALLOT = 6;
private static final int FLOW_RECEIVE = 5;
public static final String SEQ = Symbol.FORWARD;
public static List<String> getFlowStatusList(String statusPath) {
......@@ -22,15 +34,24 @@ public class EntrustFlowUtils {
}
public static EntrustFlowEnum getPrevFlowStatus(String name, String statusPath) {
if (StringUtils.isBlank(name)) {
if (StringUtils.isBlank(name) || StringUtils.isBlank(statusPath)) {
return null;
}
List<String> list = getFlowStatusList(statusPath);
if (CollectionUtils.isEmpty(list)) {
return null;
}
int index = list.indexOf(name);
RestAssert.fail(-1 == index,
String.format("状态路径【%s】中不存在【%s】节点!",
statusPathName(list),
EntrustFlowEnum.convert(name).getDisplay()
)
);
if (0 == index) {
return null;
}
......@@ -39,11 +60,11 @@ public class EntrustFlowUtils {
public static EntrustStatusEnum getPrevStatus(String name, String statusPath) {
EntrustFlowEnum prevFlowEnum = getPrevFlowStatus(name, statusPath);
return null == prevFlowEnum ? null : getStatus(prevFlowEnum.getValue().intValue());
return null == prevFlowEnum ? null : getStatus(prevFlowEnum.getValue());
}
public static EntrustStatusEnum getStatus(EntrustFlowEnum flowEnum) {
return null == flowEnum ? null : getStatus(flowEnum.getValue().intValue());
return null == flowEnum ? null : getStatus(flowEnum.getValue());
}
public static EntrustFlowEnum getNextFlowStatus(String name, String statusPath) {
......@@ -56,22 +77,34 @@ public class EntrustFlowUtils {
}
int index = list.indexOf(name);
RestAssert.fail(-1 == index,
String.format("状态路径【%s】中不存在【%s】节点!",
statusPathName(list),
EntrustFlowEnum.convert(name).getDisplay()
)
);
if (list.size() - 1 == index) {
return null;
}
return EntrustFlowEnum.convert(list.get(index + 1));
}
/**
* @param name 节点名称
* @param statusPath 状态路径
* @return EntrustStatusEnum
*/
public static EntrustStatusEnum getNextStatus(String name, String statusPath) {
EntrustFlowEnum flowEnum = getNextFlowStatus(name, statusPath);
return null == flowEnum ? null : getStatus(flowEnum.getValue().intValue());
return null == flowEnum ? null : getStatus(flowEnum.getValue());
}
/**
* 根据流程状态值获取委托状态
*
* @param flowValue
* @return
* @param flowValue 流程节点值
* @return EntrustStatusEnum
*/
public static EntrustStatusEnum getStatus(int flowValue) {
EntrustStatusEnum statusEnum = null;
......@@ -103,23 +136,23 @@ public class EntrustFlowUtils {
case 15:
statusEnum = EntrustStatusEnum.QUALITY_CHECK;
break;
default:
}
return statusEnum;
}
public static boolean isContains(String statusPath, String flowStatus) {
public static boolean contains(String flowStatus, String statusPath) {
if (StringUtils.isBlank(statusPath) || StringUtils.isBlank(flowStatus)) {
return false;
}
List<String> flowList = Arrays.asList(statusPath.split(SEQ));
return flowList.stream().anyMatch(t -> t.equals(flowStatus));
return Arrays.asList(statusPath.split(SEQ)).contains(flowStatus);
}
public static EntrustSampleStatusEnum getSampleStatus(EntrustFlowEnum flowEnum) {
if (null == flowEnum) {
return null;
}
int flowStatus = flowEnum.getValue().intValue();
int flowStatus = flowEnum.getValue();
EntrustSampleStatusEnum sampleStatusEnum = null;
switch (flowStatus) {
case 1:
......@@ -157,6 +190,7 @@ public class EntrustFlowUtils {
case 15:
sampleStatusEnum = EntrustSampleStatusEnum.END;
break;
default:
}
return sampleStatusEnum;
}
......@@ -165,13 +199,13 @@ public class EntrustFlowUtils {
if (null == flowEnum) {
return null;
}
int flowStatus = flowEnum.getValue().intValue();
int flowStatus = flowEnum.getValue();
EntrustSampleItemStatusEnum itemStatusEnum;
if (flowStatus > 7) {
if (flowStatus > FLOW_TEST) {
itemStatusEnum = EntrustSampleItemStatusEnum.END;
} else if (flowStatus > 6) {
} else if (flowStatus > FLOW_ALLOT) {
itemStatusEnum = EntrustSampleItemStatusEnum.TEST;
} else if (flowStatus > 5) {
} else if (flowStatus > FLOW_RECEIVE) {
itemStatusEnum = EntrustSampleItemStatusEnum.ALLOT;
} else {
itemStatusEnum = EntrustSampleItemStatusEnum.DRAFT;
......@@ -202,4 +236,26 @@ public class EntrustFlowUtils {
}
return null;
}
public static String statusPathName(List<String> list) {
if (CollectionUtils.isEmpty(list)) {
return "";
}
return list.stream().map(t -> {
try {
EntrustFlowEnum flowEnum = EntrustFlowEnum.convert(t);
return flowEnum.getDisplay();
} catch (Exception e) {
logger.error("类型转换错误");
}
return t;
}).collect(Collectors.joining(SEQ));
}
public static String statusPathName(String statusPath) {
if (StringUtils.isBlank(statusPath)) {
return "";
}
return statusPathName(Arrays.asList(statusPath.split(SEQ)));
}
}
......@@ -25,5 +25,5 @@ public class HttpConst {
/**
* GmHu6SqGdmmtY6Aup5kp1jlWenQz+vzQ6TBN6x/3dOwfNULkTNLx2/QA9Vhq1F7LEEXP6UKzFCxt99srTFd59DjGOgmrDnvVOYBgtSYbSTD2JNeRRD8AKe/v3TW9rWFtOMfGHtTkh6AxbovaSXa99tI5HUInT2wi2xwkdo9DKOQ=
*/
public static final String ERP_TOKEN = "GmHu6SqGdmmtY6Aup5kp1jlWenQz+vzQ6TBN6x/3dOwfNULkTNLx2/QA9Vhq1F7LEEXP6UKzFCxt99srTFd59DjGOgmrDnvVOYBgtSYbSTD2JNeRRD8AKe/v3TW9rWFtOMfGHtTkh6AxbovaSXa99tI5HUInT2wi2xwkdo9DKOQ=";
public static final String ERP_TOKEN = "HbMhpXBu5y7kdg26WpdEVZcx9FFqBCawe1NYr4eb3LsiYu6EOAFyh9QuE/mEtQBwzi9kZHEhMUieOp54C2CQ0UG92O0nLWSO4+V2BtWS4YeuRttZAQc3Av1NxairBQeK5eOxG+4Wn2vn/Rs+mBrCZNco39ad85hHtUwqGhjE4+k=";
}
......@@ -11,6 +11,7 @@ import com.patzn.cloud.service.hmhj.dto.StatsQueryDTO;
import com.patzn.cloud.service.hmhj.entity.Entrust;
import com.patzn.cloud.service.hmhj.entity.EntrustSample;
import com.patzn.cloud.service.hmhj.enums.EntrustFlowEnum;
import com.patzn.cloud.service.hmhj.enums.EntrustSampleStatusEnum;
import com.patzn.cloud.service.hmhj.vo.*;
import javax.servlet.http.HttpServletResponse;
......@@ -138,4 +139,6 @@ public interface IEntrustSampleService extends IBaseService<EntrustSample> {
boolean isRepeatSampleCode(EntrustSample sample);
boolean deletePhysicalByEntrustIds(List<Long> ids);
boolean updateStatus(EntrustSampleStatusEnum sampleStatus, List<Long> sampleIds);
}
......@@ -604,20 +604,30 @@ public class EntrustReportServiceImpl extends BaseServiceImpl<EntrustReportMappe
@Transactional(rollbackFor = Exception.class)
protected boolean doExecuteSubmit(Long[] ids, EntrustFlowEnum fromFlowStatus, EntrustFlowEnum toFlowStatus, Account account) {
Entrust entrust = handleConditionGetEntrust(ids);
String statusPath = entrust.getStatusPath(), flowStatus = entrust.getFlowStatus();
List<Long> sampleIds = getSampleIds(ids);
RestAssert.fail(null == sampleIds || sampleIds.isEmpty(), "报告样品信息为空");
// 判断配置了路径可能出现错的情况
if (fromFlowStatus == EntrustFlowEnum.REPORT_ALLOW &&
(toFlowStatus == EntrustFlowEnum.REPORT_ISSUE || toFlowStatus == EntrustFlowEnum.REPORT_SEND || toFlowStatus == EntrustFlowEnum.QUALITY_INSPECT)) {
judgeStatusPath(entrust, toFlowStatus);
// 处理状态路径
// 对于状态路径,配置优先于正常处理逻辑
logger.error("流程总节点:{}", statusPath);
logger.error("当前流程节点:{}", flowStatus);
// 若起始节点不一致,当以传递过来的节点为准
if (!Objects.equals(flowStatus, fromFlowStatus.getName())) {
flowStatus = fromFlowStatus.getName();
entrust.setFlowStatus(flowStatus);
}
// 是否可以进入下一步流程,一旦为空,直接正常流程处理
EntrustFlowEnum flowStatus = EntrustFlowUtils.getNextFlowStatus(entrust.getFlowStatus(), entrust.getStatusPath());
// 报告的审核状态不再走submitToNextNode
if (null != flowStatus && flowStatus.getValue() > fromFlowStatus.getValue()) {
toFlowStatus = flowStatus;
if (flowStatus == EntrustFlowEnum.QUALITY_JUDGE) {
// 当终止节点不一致,当以状态路径配置的下一节点为准
if (StringUtils.isNotBlank(statusPath)) {
EntrustFlowEnum nextFlowStatus = EntrustFlowUtils.getNextFlowStatus(flowStatus, statusPath);
RestAssert.fail(null == nextFlowStatus, "配置的状态路径没有下一步!");
RestAssert.fail(nextFlowStatus.getValue() < fromFlowStatus.getValue(),
String.format("起始流程节点配置存在问题:从【%s】,至【%s】", fromFlowStatus.getDisplay(), nextFlowStatus.getDisplay()));
toFlowStatus = nextFlowStatus;
// 质量判定才触发此逻辑
if (toFlowStatus == EntrustFlowEnum.QUALITY_JUDGE) {
entrustService.submitToNextNode(entrust, account);
}
}
......@@ -980,16 +990,23 @@ public class EntrustReportServiceImpl extends BaseServiceImpl<EntrustReportMappe
private boolean doExecuteBack(Long[] ids, EntrustFlowEnum fromFlowStatus, EntrustFlowEnum toFlowStatus, String reason, Account account) {
Entrust entrust = handleConditionGetEntrust(ids);
String flowStatus = entrust.getFlowStatus(), statusPath = entrust.getStatusPath();
// 是否可以进入上一步流程
EntrustFlowEnum flowStatus = EntrustFlowUtils.getPrevFlowStatus(entrust.getFlowStatus(), entrust.getStatusPath());
EntrustFlowEnum prevFlowStatus = null;
// 退回时,如果不存在路径中,默认使用的当前要退回的节点,有些不是很符合逻辑
if (StringUtils.isNotBlank(statusPath) && EntrustFlowUtils.contains(flowStatus, statusPath)) {
prevFlowStatus = EntrustFlowUtils.getPrevFlowStatus(flowStatus, statusPath);
}
List<Long> sampleIds = getSampleIds(ids);
RestAssert.fail(CollectionUtils.isEmpty(sampleIds), "报告样品信息为空");
// 过滤掉空白样和标样
List<EntrustSample> entrustSamples = entrustSampleService.getNormalByEntrustId(entrust.getId());
if (null != flowStatus) {
toFlowStatus = flowStatus;
if (null != prevFlowStatus) {
toFlowStatus = prevFlowStatus;
// 若驳回的状态不在报告状态范围内
if (flowStatus.getValue() < 8) {
if (prevFlowStatus.getValue() < 8) {
// 对应样品状态
EntrustSampleStatusEnum sampleStatusEnum = EntrustFlowUtils.getSampleStatus(toFlowStatus);
......@@ -1109,7 +1126,7 @@ public class EntrustReportServiceImpl extends BaseServiceImpl<EntrustReportMappe
RestAssert.fail(null == entrust, "委托信息为空");
String statusPath = entrust.getStatusPath(), flowStatus = entrust.getFlowStatus();
// 为空,或者路径中不包含当前流程状态
if (!EntrustFlowUtils.isContains(statusPath, flowStatus)) {
if (!EntrustFlowUtils.contains(flowStatus, statusPath)) {
return;
}
EntrustFlowEnum nextFlowStatus = EntrustFlowUtils.getNextFlowStatus(flowStatus, statusPath);
......@@ -1154,10 +1171,11 @@ public class EntrustReportServiceImpl extends BaseServiceImpl<EntrustReportMappe
List<Long> sampleIds = relSamples.stream().map(EntrustReportRelSample::getSampleId).collect(Collectors.toList());
EntrustSampleStatusEnum sampleStatus = EntrustFlowUtils.getSampleStatus(flowEnum);
if (CollectionUtils.isNotEmpty(sampleIds)) {
EntrustSample sample = new EntrustSample();
sample.setStatus(sampleStatus);
sample.setProgress(sampleStatus);
entrustSampleService.update(sample, Condition.create().in("id", sampleIds));
// EntrustSample sample = new EntrustSample();
// sample.setStatus(sampleStatus);
// sample.setProgress(sampleStatus);
// entrustSampleService.update(sample, Condition.create().in("id", sampleIds));
entrustSampleService.updateStatus(sampleStatus, sampleIds);
// 获取检测项目状态
EntrustSampleItemStatusEnum itemStatusEnum = EntrustFlowUtils.getItemStatus(flowEnum);
// 更新检测项目状态 - 只有在胡乱配置状态路径的时候才触发,一般走不到这一步
......
......@@ -623,7 +623,12 @@ public class EntrustSampleServiceImpl extends BaseServiceImpl<EntrustSampleMappe
@Override
public List<EntrustSample> getNormalByEntrustId(Long entrustId) {
return list(Condition.create().eq("entrust_id", entrustId).eq("type", 0));
return list(Condition.create()
.eq("entrust_id", entrustId)
.eq("type", 0)
// 限定正常的样品中必须有检测项目
.exists("select 1 from entrust_sample_item i where i.deleted = 0 and i.entrust_sample_id = entrust_sample.id")
);
}
@Override
......@@ -2261,6 +2266,32 @@ public class EntrustSampleServiceImpl extends BaseServiceImpl<EntrustSampleMappe
return baseMapper.deletePhysicalByEntrustIds(ids) > 0;
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean updateStatus(EntrustSampleStatusEnum sampleStatus, List<Long> sampleIds) {
// 对于空值不处理
if (CollectionUtils.isEmpty(sampleIds) || null == sampleStatus) {
return false;
}
EntrustSample sample = getById(sampleIds.get(0));
RestAssert.fail(null == sample, "更新样品状态时,查询样品为空!");
// 查询不正常的样品,非标样
List<EntrustSample> unNormalSamples = list(Condition.create()
.eq("entrust_id", sample.getEntrustId())
.eq("type", 0)
.notIn("id", sampleIds)
.notExists("select 1 from entrust_sample_item i where i.deleted = 0 and i.entrust_sample_id = entrust_sample.id")
);
if (CollectionUtils.isNotEmpty(unNormalSamples)) {
sampleIds.addAll(unNormalSamples.stream().map(EntrustSample::getId).collect(Collectors.toList()));
}
EntrustSample entrustSample = new EntrustSample();
entrustSample.setStatus(sampleStatus).setProgress(sampleStatus);
return update(entrustSample, Condition.create().in("id", sampleIds));
}
private List<EntrustSampleItemIndex> getIndexList(Long sampleId) {
if (null == sampleId) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment