| | |
| | | } |
| | | } |
| | | map.put("errorMsg", collect); |
| | | map.put("missingExportItems", getMissingTemplateExportValues(orderId)); |
| | | map.put("missingExportItems", getMissingTemplateExportValues(orderId, laboratory)); |
| | | map.put("unInsOrderCount", 0L); |
| | | return map; |
| | | } |
| | |
| | | |
| | | JSONObject values = JSON.parseObject(JSON.toJSONString(dto.getValues() == null |
| | | ? Collections.emptyMap() : dto.getValues())); |
| | | // 检验期间页面展示的是标准维护中的最新模板,保存校验必须使用同一份模板, |
| | | // 避免模板新增“导出值”批注后仍按下单时的旧快照误报未配置。 |
| | | String currentTemplateThing = getCurrentTemplateThing(snapshot); |
| | | List<String> exportValueCoordinates = getExportValueCoordinates(currentTemplateThing).values().stream() |
| | | // 保存时必须使用页面当前展示的模板:待检、在检阶段展示标准维护中的实时模板, |
| | | // 复核、驳回阶段展示订单快照;否则模板在检验途中被修改后会取错导出值单元格。 |
| | | boolean useSnapshot = useSnapshotTemplate(dto.getOrderId(), getCurrentUserLaboratory(dto.getOrderId())); |
| | | String pageTemplateThing = getPageTemplateThing(snapshot, useSnapshot); |
| | | List<String> exportValueCoordinates = getExportValueCoordinates(pageTemplateThing).values().stream() |
| | | .flatMap(Collection::stream) |
| | | .distinct() |
| | | .collect(Collectors.toList()); |
| | |
| | | } |
| | | |
| | | /** |
| | | * 检验保存、提交校验读取标准维护中的实时模板;模板已被删除或内容为空时才回退订单快照。 |
| | | * 检验完成后的展示和报告仍由订单快照负责,不会随标准模板后续修改而变化。 |
| | | * 读取标准维护中的实时模板;模板已被删除或内容为空时才回退订单快照。 |
| | | * 仅用于检验室仍处于待检、在检阶段(页面展示实时模板)的保存与校验。 |
| | | */ |
| | | private String getCurrentTemplateThing(InsOrderStandardTemplate snapshot) { |
| | | if (snapshot != null && snapshot.getTemplateId() != null) { |
| | |
| | | } |
| | | |
| | | /** |
| | | * 检验单页面在检验室进入复核及之后状态时展示订单快照,导出值的保存和提交校验必须与页面 |
| | | * 使用同一份模板;否则标准模板在检验途中被修改后,历史单据会按新坐标读取快照数据而误报为空。 |
| | | */ |
| | | private String getPageTemplateThing(InsOrderStandardTemplate snapshot, boolean useSnapshot) { |
| | | if (useSnapshot && snapshot != null && StrUtil.isNotBlank(snapshot.getThing())) { |
| | | return snapshot.getThing(); |
| | | } |
| | | return getCurrentTemplateThing(snapshot); |
| | | } |
| | | |
| | | /** |
| | | * 与检验单页面 getTemplateThing 的判定保持一致:检验室状态进入复核(2)及之后时使用订单快照。 |
| | | * 指派记录里的实验室名称可能和状态行不一致(如“全部”),此时退回按订单整体状态判定。 |
| | | */ |
| | | private boolean useSnapshotTemplate(Integer orderId, String laboratory) { |
| | | if (StringUtils.isNotBlank(laboratory)) { |
| | | InsOrderState state = insOrderStateMapper.selectOne(Wrappers.<InsOrderState>lambdaQuery() |
| | | .eq(InsOrderState::getInsOrderId, orderId) |
| | | .eq(InsOrderState::getLaboratory, laboratory) |
| | | .last("limit 1")); |
| | | if (state != null) { |
| | | return state.getInsState() != null && state.getInsState() >= 2; |
| | | } |
| | | } |
| | | return insOrderStateMapper.selectList(Wrappers.<InsOrderState>lambdaQuery() |
| | | .eq(InsOrderState::getInsOrderId, orderId)) |
| | | .stream() |
| | | .anyMatch(state -> state.getInsState() != null && state.getInsState() >= 2); |
| | | } |
| | | |
| | | /** |
| | | * 取当前登录人在该订单上最近一条指派记录所属的检验室;未指派账号返回 null,由状态判定兜底。 |
| | | */ |
| | | private String getCurrentUserLaboratory(Integer orderId) { |
| | | Integer userId = SecurityUtils.getUserId().intValue(); |
| | | InsSampleUser sampleUser = insSampleUserMapper.selectOne(Wrappers.<InsSampleUser>lambdaQuery() |
| | | .eq(InsSampleUser::getInsSampleId, orderId) |
| | | .eq(InsSampleUser::getUserId, userId) |
| | | .orderByDesc(InsSampleUser::getId) |
| | | .last("limit 1")); |
| | | return sampleUser == null ? null : sampleUser.getSonLaboratory(); |
| | | } |
| | | |
| | | /** |
| | | * 直绑模板订单只校验每个“导出值”批注所在区域右侧紧邻单元格,不使用检验项状态或 last_value 判定。 |
| | | */ |
| | | private List<String> getMissingTemplateExportValues(Integer orderId) { |
| | | private List<String> getMissingTemplateExportValues(Integer orderId, String laboratory) { |
| | | List<InsOrderStandardTemplate> snapshots = insOrderStandardTemplateService.list( |
| | | Wrappers.<InsOrderStandardTemplate>lambdaQuery() |
| | | .eq(InsOrderStandardTemplate::getInsOrderId, orderId) |
| | |
| | | missing.add("当前订单未找到原始记录模板快照"); |
| | | return missing; |
| | | } |
| | | boolean useSnapshot = useSnapshotTemplate(orderId, laboratory); |
| | | for (InsOrderStandardTemplate snapshot : snapshots) { |
| | | Integer templateId = snapshot.getTemplateId(); |
| | | List<String> coordinates = getExportValueCoordinates(getCurrentTemplateThing(snapshot)).values().stream() |
| | | List<String> coordinates = getExportValueCoordinates(getPageTemplateThing(snapshot, useSnapshot)).values().stream() |
| | | .flatMap(Collection::stream) |
| | | .distinct() |
| | | .collect(Collectors.toList()); |
| | |
| | | boolean directTemplateOrder = isDirectTemplateOrder(orderId); |
| | | List<InsProduct> insProducts; |
| | | if (directTemplateOrder) { |
| | | List<String> missingExportValues = getMissingTemplateExportValues(orderId); |
| | | List<String> missingExportValues = getMissingTemplateExportValues(orderId, laboratory); |
| | | if (!missingExportValues.isEmpty()) { |
| | | throw new ErrorException("模板中的导出值不能为空:\n" + String.join("\n", missingExportValues)); |
| | | } |
| | |
| | | |
| | | |
| | | } else { |
| | | //复核不通过将把复核的负责人去掉 |
| | | Integer id = insSampleUserMapper.selectOne(Wrappers.<InsSampleUser>lambdaQuery().eq(InsSampleUser::getInsSampleId, orderId).orderByDesc(InsSampleUser::getId).last("limit 1")).getId(); |
| | | insSampleUserMapper.deleteById(id); |
| | | // 复核不通过只去掉本检验室本次提交的复核负责人;按复核人状态和检验室定位, |
| | | // 避免误删其他检验室的记录或检验人员记录。 |
| | | InsSampleUser reviewerRow = insSampleUserMapper.selectOne(Wrappers.<InsSampleUser>lambdaQuery() |
| | | .eq(InsSampleUser::getInsSampleId, orderId) |
| | | .eq(InsSampleUser::getState, 1) |
| | | .eq(InsSampleUser::getSonLaboratory, laboratory) |
| | | .orderByDesc(InsSampleUser::getId) |
| | | .last("limit 1")); |
| | | if (reviewerRow != null) { |
| | | insSampleUserMapper.deleteById(reviewerRow.getId()); |
| | | } |
| | | |
| | | // 当前审核人 |
| | | Integer currentUserId = SecurityUtils.getUserId().intValue(); |