From 82ce59218139d9fefeae7b9e5fbc88b499ff023f Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期四, 08 十月 2026 13:35:06 +0800
Subject: [PATCH] feat(inspect): 新增新聚检验订单编辑功能并优化报告生成流程 - 新增 updateNewJuInsOrder 接口支持新聚检验订单修改 - 增加文件上传大小限制至200MB,请求大小限制至400MB - 在设备信息中新增出厂编号字段显示 - 优化温湿度处理逻辑,报告中仅显示温度信息 - 新增印章管理功能,支持MA标志章、报告章和骑缝章配置 - 完善检验报告生成流程,增加多种报告类型常量定义 - 优化附件上传功能,增加空值检查和返回值处理 - 调整委托编号生成逻辑,完善新聚订单可编辑性判断 - 更新CNAS流程中报告编号使用正式报告编号替代委托编号
---
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java | 394 +++++++++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 362 insertions(+), 32 deletions(-)
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java
index be9fcb1..e999547 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java
@@ -57,6 +57,7 @@
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
+import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;
@@ -107,6 +108,8 @@
private StandardTemplateService standardTemplateService;
private InsOrderStandardTemplateMapper insOrderStandardTemplateMapper;
private InsOrderTemplateDeviceMapper insOrderTemplateDeviceMapper;
+ private InsSampleReceiptMapper insSampleReceiptMapper;
+ private ApplicationEventPublisher applicationEventPublisher;
@@ -120,7 +123,34 @@
isOrderAll = "1";
sampleOrderDto.setState(null);
}
- return insOrderMapper.selectInsOrderPage(page, QueryWrappers.queryWrappers(sampleOrderDto), laboratory, isOrderAll);
+ // 妫�楠屼腑锛氭柊鑱氫笅鍗曞厤瀹℃牳鍗冲彈鐞嗭紝闇�鏍峰搧鎺ユ敹鎻愪氦鍚庯紙ins_sample_receipt.status=1锛夋墠灞曠ず
+ String receiptSubmitted = sampleOrderDto.getState() != null && sampleOrderDto.getState() == 1 ? "1" : null;
+ IPage<SampleOrderDto> result = insOrderMapper.selectInsOrderPage(page,
+ QueryWrappers.queryWrappers(sampleOrderDto), laboratory, isOrderAll, receiptSubmitted);
+ List<Integer> candidateIds = result.getRecords().stream()
+ .filter(row -> Integer.valueOf(-1).equals(row.getTypeSource())
+ && Integer.valueOf(1).equals(row.getState()))
+ .map(SampleOrderDto::getId)
+ .collect(Collectors.toList());
+ if (!candidateIds.isEmpty()) {
+ Set<Integer> receivedIds = insSampleReceiptMapper.selectList(Wrappers.<InsSampleReceipt>lambdaQuery()
+ .in(InsSampleReceipt::getInsOrderId, candidateIds)
+ .eq(InsSampleReceipt::getStatus, 1)
+ .select(InsSampleReceipt::getInsOrderId)).stream()
+ .map(InsSampleReceipt::getInsOrderId).collect(Collectors.toSet());
+ Set<Integer> taskIds = insOrderStateService.list(Wrappers.<InsOrderState>lambdaQuery()
+ .in(InsOrderState::getInsOrderId, candidateIds)
+ .select(InsOrderState::getInsOrderId)).stream()
+ .map(InsOrderState::getInsOrderId).collect(Collectors.toSet());
+ Set<Integer> assignedIds = insSampleUserMapper.selectList(Wrappers.<InsSampleUser>lambdaQuery()
+ .in(InsSampleUser::getInsSampleId, candidateIds)
+ .select(InsSampleUser::getInsSampleId)).stream()
+ .map(InsSampleUser::getInsSampleId).collect(Collectors.toSet());
+ result.getRecords().forEach(row -> row.setEditable(
+ candidateIds.contains(row.getId()) && !receivedIds.contains(row.getId())
+ && !taskIds.contains(row.getId()) && !assignedIds.contains(row.getId())));
+ }
+ return result;
}
@@ -175,13 +205,17 @@
}
if (userId != null) {
- InsSampleUser insSampleUser = new InsSampleUser();
- insSampleUser.setState(0);
- insSampleUser.setUserId(userId);
- insSampleUser.setInsSampleId(orderId);
- insSampleUser.setSonLaboratory(directTemplateOrder
- ? DIRECT_TEMPLATE_LABORATORY : sonLaboratory);
- insSampleUserMapper.insert(insSampleUser);
+ Set<String> assignedLaboratories = StringUtils.isBlank(sonLaboratory)
+ ? taskLaboratories
+ : Collections.singleton(sonLaboratory);
+ for (String laboratory : assignedLaboratories) {
+ InsSampleUser insSampleUser = new InsSampleUser();
+ insSampleUser.setState(0);
+ insSampleUser.setUserId(userId);
+ insSampleUser.setInsSampleId(orderId);
+ insSampleUser.setSonLaboratory(laboratory);
+ insSampleUserMapper.insert(insSampleUser);
+ }
}
// 鍒ゆ柇璁㈠崟鏈夋病鏈夌粦瀹氭娊鏍疯鍒�
@@ -364,6 +398,15 @@
}
}
});
+ // 涓嬪崟鏃剁敓鎴愬鎵樼紪鍙峰苟鏍¢獙鍞竴鎬э紱瀛e害妫�楠屽鐢ㄨ繘鍘傛楠岀紪鍙凤紝鐣欏緟瀹℃牳澶勭悊銆�
+ if (!InsOrderTypeConstants.QUARTERLY_TEST.equals(insOrder.getOrderType())) {
+ String entrustCode = buildEntrustCode(insOrder, Collections.emptyList());
+ assertEntrustCodeUnique(entrustCode, insOrder.getId());
+ insOrder.setEntrustCode(entrustCode);
+ insOrderMapper.update(null, Wrappers.<InsOrder>lambdaUpdate()
+ .eq(InsOrder::getId, insOrder.getId())
+ .set(InsOrder::getEntrustCode, entrustCode));
+ }
//鍘熸潗鏂欎笅鍗曟垨澶栬喘鎴愬搧涓嬪崟
if (Objects.nonNull(insOrder.getTypeSource())&&Objects.nonNull(insOrder.getIfsInventoryId())) {
// 濮旀墭浜哄氨鏄姤妫�浜�, 鐢熶骇鍗曚綅灏辨槸渚涘簲鍟嗗崟浣�
@@ -403,9 +446,7 @@
// 瀹℃牳妫�楠屽崟
upInsOrderOfState(insOrder);
- // 鍒嗛厤妫�楠屼汉
- String sonLaboratory = insOrder.getTypeSource().equals(1)?"鍘熸潗鏂�":"鎴愬搧瀹為獙瀹�";
- upInsOrder(insOrder.getId(), null, appointed != null ? appointed.toString() : null, SecurityUtils.getUserId().intValue(), sonLaboratory);
+ // 瀹℃牳閫氳繃鍚庝粎杩涘叆鏍峰搧鎺ユ敹锛涚敱鏍峰搧鎺ユ敹椤甸潰閫夋嫨涓绘楠屼汉鍚庡啀鍒涘缓妫�楠屼换鍔°��
//鏄惁涓哄師鏉愭枡涓嬪崟
if(insOrder.getTypeSource().equals(1)){
@@ -463,6 +504,31 @@
public int addNewJuInsOrder(InsPlaceOrderDto dto) {
if (dto == null || dto.getInsOrder() == null || dto.getStandardTreeId() == null) {
throw new ErrorException("涓嬪崟淇℃伅鎴栨爣鍑嗕笉鑳戒负绌�");
+ }
+ String sampleCode = StringUtils.trim(dto.getSampleCode());
+ if (StringUtils.isBlank(sampleCode) || sampleCode.length() < 2) {
+ throw new ErrorException("鏍峰搧缂栧彿涓嶈兘涓虹┖涓斾笉鑳藉皯浜�2浣�");
+ }
+ // 濮旀墭瑕佹眰瀛楁鏍¢獙锛氬洓缁勫崟閫夊繀閫夛紝鍒嗗寘/蹇�掕仈鍔ㄥ繀濉�
+ InsOrder reqOrder = dto.getInsOrder();
+ if (reqOrder.getSampleDate() == null) {
+ throw new ErrorException("閫佹牱鏃ユ湡涓嶈兘涓虹┖");
+ }
+ if (reqOrder.getSubcontractType() == null || reqOrder.getSampleDisposal() == null
+ || reqOrder.getResultEvaluation() == null || reqOrder.getReportDelivery() == null) {
+ throw new ErrorException("璇烽�夋嫨鍒嗗寘鍐呭銆佹牱鍝佸缃�佸缁撴灉璇勪环鍜屾姤鍛婁氦浠樻柟寮�");
+ }
+ if (Integer.valueOf(1).equals(reqOrder.getSubcontractType())
+ && StringUtils.isBlank(reqOrder.getSubcontractCompany())) {
+ throw new ErrorException("鍒嗗寘鍐呭涓烘湁鏃讹紝鍒嗗寘鍗曚綅淇℃伅涓嶈兘涓虹┖");
+ }
+ if (Integer.valueOf(2).equals(reqOrder.getReportDelivery())) {
+ if (StringUtils.isBlank(reqOrder.getReportAddress())) {
+ throw new ErrorException("鎶ュ憡浜や粯鏂瑰紡涓哄揩閫掓椂锛屾姤鍛婂瘎閫佸湴鍧�涓嶈兘涓虹┖");
+ }
+ if (StringUtils.isBlank(reqOrder.getReportReceiver())) {
+ throw new ErrorException("鎶ュ憡浜や粯鏂瑰紡涓哄揩閫掓椂锛屾敹浠朵汉鍙婄數璇濅笉鑳戒负绌�");
+ }
}
StandardTree standard = standardTreeService.getById(dto.getStandardTreeId());
if (standard == null || StringUtils.isBlank(standard.getSample())
@@ -524,7 +590,9 @@
InsOrder order = dto.getInsOrder();
order.setId(null);
- order.setState(0);
+ // 鏂拌仛涓嬪崟鍏嶅鏍革細鐩存帴鍙楃悊锛屼笅鍗曞嵆娴佽浆鍒版牱鍝佹帴鏀�
+ order.setState(1);
+ order.setExamineTime(LocalDateTime.now());
order.setIsExemption(0);
order.setFactory(null);
order.setLaboratory(standard.getLaboratory());
@@ -536,11 +604,19 @@
// 鏂拌仛璁㈠崟鐨勭幆澧冩潯浠剁敱妫�楠屼换鍔″~鍐欙紝閬垮厤涓嬪崟妯℃澘鎴栨祻瑙堝櫒缂撳瓨甯﹀叆鏃у�笺��
order.setTemperature(null);
order.setHumidity(null);
+ // 鏈懡涓仈鍔ㄦ潯浠舵椂娓呯┖瀵瑰簲鏂囨湰瀛楁锛岄伩鍏嶆ā鏉垮揩鐓ф垨娴忚鍣ㄧ紦瀛樺甫鍏ユ棫鍊笺��
+ if (!Integer.valueOf(1).equals(order.getSubcontractType())) {
+ order.setSubcontractCompany(null);
+ }
+ if (!Integer.valueOf(2).equals(order.getReportDelivery())) {
+ order.setReportAddress(null);
+ order.setReportReceiver(null);
+ }
insOrderMapper.insert(order);
InsSample sample = new InsSample();
sample.setInsOrderId(order.getId());
- sample.setSampleCode(dto.getSampleCode());
+ sample.setSampleCode(sampleCode);
sample.setFactory(null);
sample.setLaboratory(standard.getLaboratory());
sample.setSampleType(null);
@@ -569,11 +645,187 @@
product.setSort(productSort++);
insProductMapper.insert(product);
}
- saveTemplateSnapshots(order.getId(), selections);
+ saveTemplateSnapshots(order.getId(), selections, bindingMap);
+
+ // 涓嬪崟鏃剁敓鎴愬鎵樼紪鍙峰苟鏍¢獙鍞竴鎬э紝閲嶅鍒欐彁绀猴紝閬垮厤鐣欏埌瀹℃牳鎵嶆姤閿欍��
+ String entrustCode = buildEntrustCode(order, Collections.singletonList(sample));
+ assertEntrustCodeUnique(entrustCode, order.getId());
+ insOrderMapper.update(null, Wrappers.<InsOrder>lambdaUpdate()
+ .eq(InsOrder::getId, order.getId())
+ .set(InsOrder::getEntrustCode, entrustCode));
+ // 鍏嶅鏍稿悗鐢变笅鍗曠敓鎴愬緟鎺ユ敹鐨勬牱鍝佹帴鏀惰褰曪紝涓绘楠屼汉浠嶅湪鏍峰搧鎺ユ敹椤甸潰閫夋嫨鍚庢墠鍒涘缓妫�楠屼换鍔�
+ insSampleReceiptMapper.insertIgnore(order.getId(), sample.getId());
+ // 鍚屼簨鍔″唴鍙戝竷涓嬪崟浜嬩欢锛岀敱 cnas-process 鑷姩鐢熸垚妫�楠屽鎵樺崟锛涚洃鍚櫒寮傚父浼氳繛甯︿笅鍗曞洖婊�
+ applicationEventPublisher.publishEvent(new com.ruoyi.inspect.event.NewJuOrderPlacedEvent(order.getId()));
return order.getId();
}
- private void saveTemplateSnapshots(Integer orderId, List<OrderTemplateSelectionDto> selections) {
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public int updateNewJuInsOrder(InsPlaceOrderDto dto) {
+ if (dto == null || dto.getOrderId() == null || dto.getInsOrder() == null || dto.getStandardTreeId() == null) {
+ throw new ErrorException("涓嬪崟淇℃伅鎴栨爣鍑嗕笉鑳戒负绌�");
+ }
+ InsOrder currentOrder = insOrderMapper.selectById(dto.getOrderId());
+ if (currentOrder == null) {
+ throw new ErrorException("妫�楠屽崟涓嶅瓨鍦�");
+ }
+ if (!Integer.valueOf(1).equals(currentOrder.getState()) || !Integer.valueOf(-1).equals(currentOrder.getTypeSource())) {
+ throw new ErrorException("褰撳墠濮旀墭涓嶅厑璁哥紪杈�");
+ }
+ assertNewJuOrderEditable(dto.getOrderId());
+
+ String sampleCode = StringUtils.trim(dto.getSampleCode());
+ if (StringUtils.isBlank(sampleCode) || sampleCode.length() < 2) {
+ throw new ErrorException("鏍峰搧缂栧彿涓嶈兘涓虹┖涓斾笉鑳藉皯浜�2浣�");
+ }
+ InsOrder order = dto.getInsOrder();
+ if (order.getSampleDate() == null) {
+ throw new ErrorException("閫佹牱鏃ユ湡涓嶈兘涓虹┖");
+ }
+ if (order.getSubcontractType() == null || order.getSampleDisposal() == null
+ || order.getResultEvaluation() == null || order.getReportDelivery() == null) {
+ throw new ErrorException("璇烽�夋嫨鍒嗗寘鍐呭銆佹牱鍝佸缃�佸缁撴灉璇勪环鍜屾姤鍛婁氦浠樻柟寮�");
+ }
+ if (Integer.valueOf(1).equals(order.getSubcontractType()) && StringUtils.isBlank(order.getSubcontractCompany())) {
+ throw new ErrorException("鍒嗗寘鍐呭涓烘湁鏃讹紝鍒嗗寘鍗曚綅淇℃伅涓嶈兘涓虹┖");
+ }
+ if (Integer.valueOf(2).equals(order.getReportDelivery())
+ && (StringUtils.isBlank(order.getReportAddress()) || StringUtils.isBlank(order.getReportReceiver()))) {
+ throw new ErrorException("鎶ュ憡浜や粯鏂瑰紡涓哄揩閫掓椂锛岃濉啓鎶ュ憡瀵勯�佸湴鍧�鍜屾敹浠朵汉鍙婄數璇�");
+ }
+
+ StandardTree standard = standardTreeService.getById(dto.getStandardTreeId());
+ if (standard == null || StringUtils.isBlank(standard.getSample())
+ || standard.getSampleType() != null || standard.getModel() != null) {
+ throw new ErrorException("璇烽�夋嫨鏍囧噯搴撲簩绾ф爣鍑�");
+ }
+ List<StandardTreeTemplateBindingVo> bindings = standardTreeService.selectTemplateBindings(dto.getStandardTreeId());
+ if (bindings.isEmpty()) {
+ throw new ErrorException("璇ユ爣鍑嗗皻鏈粦瀹氬彲鐢ㄧ殑鍘熷璁板綍妯℃澘");
+ }
+ Map<Integer, StandardTreeTemplateBindingVo> bindingMap = bindings.stream()
+ .collect(Collectors.toMap(StandardTreeTemplateBindingVo::getTemplateId, binding -> binding, (first, ignored) -> first));
+ List<OrderTemplateSelectionDto> selections = dto.getTemplateList();
+ if (selections == null) {
+ selections = bindings.stream().map(binding -> {
+ OrderTemplateSelectionDto selection = new OrderTemplateSelectionDto();
+ selection.setTemplateId(binding.getTemplateId());
+ selection.setSort(binding.getSort());
+ return selection;
+ }).collect(Collectors.toList());
+ }
+ if (selections.isEmpty()) {
+ throw new ErrorException("璇疯嚦灏戜繚鐣欎竴涓師濮嬭褰曟ā鏉�");
+ }
+ Set<Integer> selectedTemplateIds = new HashSet<>();
+ for (int index = 0; index < selections.size(); index++) {
+ OrderTemplateSelectionDto selection = selections.get(index);
+ if (selection == null || selection.getTemplateId() == null || !bindingMap.containsKey(selection.getTemplateId())) {
+ throw new ErrorException("鎵�閫夊師濮嬭褰曟ā鏉夸笉灞炰簬褰撳墠鏍囧噯");
+ }
+ if (!selectedTemplateIds.add(selection.getTemplateId())) {
+ throw new ErrorException("鍘熷璁板綍妯℃澘涓嶈兘閲嶅閫夋嫨");
+ }
+ if (selection.getSort() == null) {
+ selection.setSort(index);
+ }
+ }
+ selections.sort(Comparator.comparing(OrderTemplateSelectionDto::getSort)
+ .thenComparing(OrderTemplateSelectionDto::getTemplateId));
+ Map<Integer, Integer> templateSortMap = selections.stream().collect(Collectors.toMap(
+ OrderTemplateSelectionDto::getTemplateId, OrderTemplateSelectionDto::getSort));
+ List<TemplateInspectionItemDto> templateItems = standardTreeService.selectTemplateInspectionItems(dto.getStandardTreeId()).stream()
+ .filter(item -> selectedTemplateIds.contains(item.getTemplateId()))
+ .sorted(Comparator.comparing((TemplateInspectionItemDto item) -> templateSortMap.get(item.getTemplateId()))
+ .thenComparing(item -> item.getTemplateRowIndex() == null ? Integer.MAX_VALUE : item.getTemplateRowIndex()))
+ .collect(Collectors.toList());
+ StandardMethod standardMethod = standardMethodService.getById(standard.getStandardMethodId());
+ if (standardMethod == null || StringUtils.isBlank(standardMethod.getCode())) {
+ throw new ErrorException("鏍囧噯缂栧彿涓嶅瓨鍦�");
+ }
+ String standardCode = standardMethod.getCode().trim();
+
+ order.setId(currentOrder.getId());
+ order.setState(currentOrder.getState());
+ order.setInsState(currentOrder.getInsState());
+ order.setExamineTime(currentOrder.getExamineTime());
+ order.setSendTime(currentOrder.getSendTime());
+ order.setIsExemption(currentOrder.getIsExemption());
+ order.setFactory(null);
+ order.setLaboratory(standard.getLaboratory());
+ order.setSampleType(null);
+ order.setSample(standardCode);
+ order.setPrepareUserEn(null);
+ order.setPrepareCode(null);
+ order.setRemarkEn(null);
+ order.setTemperature(null);
+ order.setHumidity(null);
+ if (!Integer.valueOf(1).equals(order.getSubcontractType())) {
+ order.setSubcontractCompany(null);
+ }
+ if (!Integer.valueOf(2).equals(order.getReportDelivery())) {
+ order.setReportAddress(null);
+ order.setReportReceiver(null);
+ }
+ insOrderMapper.updateById(order);
+
+ List<InsSample> samples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery()
+ .eq(InsSample::getInsOrderId, currentOrder.getId()).orderByAsc(InsSample::getId));
+ if (samples.size() != 1) {
+ throw new ErrorException("妫�楠屾牱鍝佹暟鎹紓甯�");
+ }
+ InsSample sample = samples.get(0);
+ sample.setSampleCode(sampleCode);
+ sample.setLaboratory(standard.getLaboratory());
+ sample.setSampleType(null);
+ sample.setSample(standardCode);
+ sample.setModel(null);
+ insSampleMapper.updateById(sample);
+ insProductMapper.delete(Wrappers.<InsProduct>lambdaQuery().eq(InsProduct::getInsSampleId, sample.getId()));
+ insOrderStandardTemplateMapper.delete(Wrappers.<InsOrderStandardTemplate>lambdaQuery()
+ .eq(InsOrderStandardTemplate::getInsOrderId, currentOrder.getId()));
+ insOrderTemplateDeviceMapper.delete(Wrappers.<InsOrderTemplateDevice>lambdaQuery()
+ .eq(InsOrderTemplateDevice::getInsOrderId, currentOrder.getId()));
+ int productSort = 0;
+ for (TemplateInspectionItemDto item : templateItems) {
+ InsProduct product = new InsProduct();
+ product.setInsSampleId(sample.getId());
+ product.setInspectionItem(item.getInspectionItem());
+ product.setInspectionItemClass("");
+ product.setInspectionItemSubclass("");
+ product.setLaboratory(standard.getLaboratory());
+ product.setSample(standardCode);
+ product.setTemplateId(item.getTemplateId());
+ product.setTemplateRowIndex(item.getTemplateRowIndex());
+ product.setSonLaboratory(DIRECT_TEMPLATE_LABORATORY);
+ product.setState(1);
+ product.setSort(productSort++);
+ insProductMapper.insert(product);
+ }
+ saveTemplateSnapshots(currentOrder.getId(), selections, bindingMap);
+ String entrustCode = buildEntrustCode(order, Collections.singletonList(sample));
+ assertEntrustCodeUnique(entrustCode, currentOrder.getId());
+ insOrderMapper.update(null, Wrappers.<InsOrder>lambdaUpdate().eq(InsOrder::getId, currentOrder.getId())
+ .set(InsOrder::getEntrustCode, entrustCode));
+ applicationEventPublisher.publishEvent(new com.ruoyi.inspect.event.NewJuOrderPlacedEvent(currentOrder.getId()));
+ return currentOrder.getId();
+ }
+
+ private void assertNewJuOrderEditable(Integer orderId) {
+ Long receiptCount = insSampleReceiptMapper.selectCount(Wrappers.<InsSampleReceipt>lambdaQuery()
+ .eq(InsSampleReceipt::getInsOrderId, orderId).eq(InsSampleReceipt::getStatus, 1));
+ Long taskCount = insOrderStateService.count(Wrappers.<InsOrderState>lambdaQuery()
+ .eq(InsOrderState::getInsOrderId, orderId));
+ Long userCount = insSampleUserMapper.selectCount(Wrappers.<InsSampleUser>lambdaQuery()
+ .eq(InsSampleUser::getInsSampleId, orderId));
+ if (receiptCount > 0 || taskCount > 0 || userCount > 0) {
+ throw new ErrorException("璇ュ鎵樺凡杩涘叆妫�楠岋紝涓嶈兘缂栬緫");
+ }
+ }
+
+ private void saveTemplateSnapshots(Integer orderId, List<OrderTemplateSelectionDto> selections,
+ Map<Integer, StandardTreeTemplateBindingVo> bindingMap) {
for (OrderTemplateSelectionDto selection : selections) {
StandardTemplate template = standardTemplateService.getById(selection.getTemplateId());
if (template == null) {
@@ -588,6 +840,18 @@
snapshot.setThing(template.getThing());
snapshot.setSort(selection.getSort());
insOrderStandardTemplateMapper.insert(snapshot);
+
+ StandardTreeTemplateBindingVo binding = bindingMap.get(selection.getTemplateId());
+ List<Integer> deviceIds = binding == null || binding.getDeviceIds() == null
+ ? Collections.emptyList() : binding.getDeviceIds();
+ for (int index = 0; index < deviceIds.size(); index++) {
+ InsOrderTemplateDevice relation = new InsOrderTemplateDevice();
+ relation.setInsOrderId(orderId);
+ relation.setTemplateId(selection.getTemplateId());
+ relation.setDeviceId(deviceIds.get(index));
+ relation.setSort(index);
+ insOrderTemplateDeviceMapper.insert(relation);
+ }
}
}
@@ -659,6 +923,36 @@
map.put("sampleCode", orderSamples.isEmpty() ? null : orderSamples.get(0).getSampleCode());
map.put("insOrderTemplate", map1);
map.put("templateList", templateList);
+ Set<Integer> orderTemplateIds = templateList.stream()
+ .map(OrderTemplateSummaryVo::getTemplateId).collect(Collectors.toSet());
+ List<Integer> methodIds = standardMethodService.list(Wrappers.<StandardMethod>lambdaQuery()
+ .eq(StandardMethod::getCode, insOrder.getSample())
+ .select(StandardMethod::getId)).stream()
+ .map(StandardMethod::getId).collect(Collectors.toList());
+ if (!methodIds.isEmpty() && !orderTemplateIds.isEmpty()) {
+ List<StandardTree> candidates = standardTreeService.list(Wrappers.<StandardTree>lambdaQuery()
+ .in(StandardTree::getStandardMethodId, methodIds)
+ .isNull(StandardTree::getSampleType)
+ .isNull(StandardTree::getModel));
+ Map<StandardTree, Set<Integer>> matches = candidates.stream()
+ .filter(tree -> StringUtils.isNotBlank(tree.getSample())
+ && Objects.equals(tree.getLaboratory(), insOrder.getLaboratory()))
+ .collect(Collectors.toMap(tree -> tree,
+ tree -> standardTreeService.selectTemplateBindings(tree.getId()).stream()
+ .map(StandardTreeTemplateBindingVo::getTemplateId)
+ .collect(Collectors.toSet())));
+ matches.entrySet().removeIf(entry -> !entry.getValue().containsAll(orderTemplateIds));
+ if (matches.size() == 1) {
+ map.put("standardTreeId", matches.keySet().iterator().next().getId());
+ } else if (matches.size() > 1) {
+ List<StandardTree> exactMatches = matches.entrySet().stream()
+ .filter(entry -> entry.getValue().equals(orderTemplateIds))
+ .map(Map.Entry::getKey).collect(Collectors.toList());
+ if (exactMatches.size() == 1) {
+ map.put("standardTreeId", exactMatches.get(0).getId());
+ }
+ }
+ }
return map;
}
@@ -668,20 +962,16 @@
* @return
*/
@Override
+ @Transactional(rollbackFor = Exception.class)
public int upInsOrderOfState(InsOrder insOrder) {
insOrder.setExamineTime(LocalDateTime.now());
if (insOrder.getState() == 1) {
- //瀹℃牳閫氳繃鎵嶄細鐢熸垚濮旀墭缂栧彿
+ //濮旀墭缂栧彿宸插湪涓嬪崟鏃剁敓鎴愬苟鏍¢獙鍞竴鎬э紝瀹℃牳鏃跺鐢紱鍘嗗彶/瀛e害妫�楠岃鍗曞厹搴曠敓鎴愩��
InsOrder order = this.getById(insOrder.getId());
- // 濮旀墭缂栧彿鎸夐�佹牱鏃ユ湡鐙珛娴佹按锛屼緥濡傦細LMSY-20260909-01銆�
- // 鍘嗗彶/澶栭儴璁㈠崟鏈~鍐欓�佹牱鏃ユ湡鏃跺洖閫�鍒板綋澶╋紝閬垮厤褰卞搷鍘熸湁娴佺▼銆�
- LocalDate entrustDate = order.getSampleDate() == null ? LocalDate.now() : order.getSampleDate();
- String entrustCodePrefix = "LMSY-"
- + entrustDate.format(DateTimeFormatter.BASIC_ISO_DATE)
- + "-";
- String no = numberGenerator.generateNumberWithPrefix(2,
- entrustCodePrefix,
- InsOrder::getEntrustCode);
+ List<InsSample> insSamples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery()
+ .eq(InsSample::getInsOrderId, insOrder.getId())
+ .orderByAsc(InsSample::getId));
+ String no = order.getEntrustCode();
// 鍒ゆ柇鏄惁鏄搴︽楠�, 鏄搴︽楠屽彇娑堝師鏉愭枡瀛e害妫�楠屼笅鍗�
if (InsOrderTypeConstants.QUARTERLY_TEST.equals(order.getOrderType())) {
ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
@@ -697,11 +987,12 @@
no = order1.getEntrustCode();
}
}
+ if (StringUtils.isBlank(no)) {
+ no = buildEntrustCode(order, insSamples);
+ }
+ assertEntrustCodeUnique(no, order.getId());
int count = 1;
- // 鏌ヨ鏍峰搧琛�
- List<InsSample> insSamples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery()
- .eq(InsSample::getInsOrderId, insOrder.getId()));
for (InsSample insSample : insSamples) {
if (StringUtils.isBlank(insSample.getSampleCode())) {
// 濡傛灉鍙湁涓�涓牱鍝佸氨涓嶉渶瑕佹嫾鎺ユ暟瀛�
@@ -717,7 +1008,48 @@
insOrder.setEntrustCode(no);
}
- return insOrderMapper.updateById(insOrder);
+ int updated = insOrderMapper.updateById(insOrder);
+ if (updated > 0 && Integer.valueOf(1).equals(insOrder.getState())) {
+ List<InsSample> samples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery()
+ .eq(InsSample::getInsOrderId, insOrder.getId())
+ .orderByAsc(InsSample::getId));
+ if (samples.size() != 1) {
+ throw new ErrorException("濮旀墭鍗曞繀椤讳笖鍙兘鍖呭惈涓�涓牱鍝侊紝涓嶈兘杩涘叆鏍峰搧鎺ユ敹娴佺▼");
+ }
+ insSampleReceiptMapper.insertIgnore(insOrder.getId(), samples.get(0).getId());
+ }
+ return updated;
+ }
+
+ /**
+ * 濮旀墭缂栧彿鍏ㄥ眬鍞竴锛岀敓鎴愮紪鍙峰拰鍚庣画鎻愪氦鍓嶅潎闇�鎺掗櫎褰撳墠璁㈠崟鍚庢牎楠屻��
+ */
+ private void assertEntrustCodeUnique(String entrustCode, Integer currentOrderId) {
+ Long count = insOrderMapper.selectCount(Wrappers.<InsOrder>lambdaQuery()
+ .eq(InsOrder::getEntrustCode, entrustCode)
+ .ne(currentOrderId != null, InsOrder::getId, currentOrderId));
+ if (count > 0) {
+ throw new ErrorException("鏍峰搧/濮旀墭鍗曞凡瀛樺湪锛岃纭鏍峰搧缂栧彿");
+ }
+ }
+
+ /**
+ * 鐢熸垚濮旀墭缂栧彿锛氭柊鑱氱洿缁戞ā鏉胯鍗曟湯涓や綅鍙栨牱鍝佺紪鍙锋湯涓や綅锛屽叾浣欐寜閫佹牱鏃ユ湡鐢熸垚搴忓彿銆�
+ */
+ private String buildEntrustCode(InsOrder order, List<InsSample> insSamples) {
+ LocalDate entrustDate = order.getSampleDate() == null ? LocalDate.now() : order.getSampleDate();
+ String entrustCodePrefix = "LMSY-"
+ + entrustDate.format(DateTimeFormatter.BASIC_ISO_DATE)
+ + "-";
+ if (isDirectTemplateOrder(order, insSamples)) {
+ String sampleCode = insSamples.get(0).getSampleCode();
+ if (StringUtils.isBlank(sampleCode) || sampleCode.trim().length() < 2) {
+ throw new ErrorException("鏍峰搧缂栧彿涓嶈兘涓虹┖涓斾笉鑳藉皯浜�2浣�");
+ }
+ sampleCode = sampleCode.trim();
+ return entrustCodePrefix + sampleCode.substring(sampleCode.length() - 2);
+ }
+ return numberGenerator.generateNumberWithPrefix(2, entrustCodePrefix, InsOrder::getEntrustCode);
}
@Override
@@ -739,7 +1071,6 @@
.eq(InsOrderStandardTemplate::getInsOrderId, id)
.select(InsOrderStandardTemplate::getTemplateId,
InsOrderStandardTemplate::getTemperature,
- InsOrderStandardTemplate::getHumidity,
InsOrderStandardTemplate::getDetectionTime,
InsOrderStandardTemplate::getDetectionPlace,
InsOrderStandardTemplate::getInsResult)
@@ -749,7 +1080,6 @@
TemplateConditionVo condition = new TemplateConditionVo();
condition.setTemplateId(snapshot.getTemplateId());
condition.setTemperature(snapshot.getTemperature());
- condition.setHumidity(snapshot.getHumidity());
condition.setDetectionTime(snapshot.getDetectionTime());
condition.setDetectionPlace(snapshot.getDetectionPlace());
condition.setInsResult(snapshot.getInsResult());
@@ -1044,7 +1374,7 @@
insOrder.setState(1);
upInsOrderOfState(insOrder);
- upInsOrder(insOrder.getId(), null, appointed != null ? appointed.toString() : null, SecurityUtils.getUserId().intValue(), "鍘熸潗鏂�");
+ // 瀹℃牳閫氳繃鍚庝粎杩涘叆鏍峰搧鎺ユ敹锛涚敱鏍峰搧鎺ユ敹椤甸潰閫夋嫨涓绘楠屼汉鍚庡啀鍒涘缓妫�楠屼换鍔°��
return insOrder.getId();
}
--
Gitblit v1.9.3