Commit 81445f50 by lijingjing

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

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