From 51786b723d0a91d11476776d9ce50af7994dc4bd Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期三, 23 九月 2026 15:58:53 +0800
Subject: [PATCH] feat(inspect): 完善检验订单状态管理和样品接收流程
---
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java | 524 +++++++++++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 460 insertions(+), 64 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 952b412..e1bc8a1 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
@@ -17,19 +17,27 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.dto.InventoryDetailDTO;
+import com.ruoyi.basic.dto.StandardTreeTemplateBindingVo;
+import com.ruoyi.basic.dto.TemplateInspectionItemDto;
import com.ruoyi.basic.mapper.IfsInventoryQuantityMapper;
import com.ruoyi.basic.mapper.StandardProductListMapper;
import com.ruoyi.basic.mapper.StructureItemParameterMapper;
import com.ruoyi.basic.pojo.IfsInventoryQuantity;
import com.ruoyi.basic.pojo.StandardProductList;
+import com.ruoyi.basic.pojo.StandardMethod;
import com.ruoyi.basic.pojo.StructureItemParameter;
import com.ruoyi.basic.pojo.StructureTestObject;
+import com.ruoyi.basic.pojo.StandardTree;
+import com.ruoyi.basic.pojo.StandardTemplate;
+import com.ruoyi.basic.service.StandardTemplateService;
+import com.ruoyi.basic.service.StandardMethodService;
+import com.ruoyi.basic.service.StandardTreeService;
+import com.ruoyi.basic.utils.StandardTreePathParser;
import com.ruoyi.common.constant.InsOrderTypeConstants;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.enums.OrderType;
import com.ruoyi.common.numgen.NumberGenerator;
-import com.ruoyi.common.utils.LimsDateUtil;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.api.IfsApiUtils;
@@ -43,10 +51,13 @@
import com.ruoyi.inspect.service.InsSampleService;
import com.ruoyi.inspect.vo.IfsOrderVO;
import com.ruoyi.inspect.vo.InsOrderPrintingVo;
+import com.ruoyi.inspect.vo.OrderTemplateSummaryVo;
+import com.ruoyi.inspect.vo.TemplateConditionVo;
import com.ruoyi.system.mapper.UserMapper;
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;
@@ -74,6 +85,8 @@
public class InsOrderServiceImpl extends ServiceImpl<InsOrderMapper, InsOrder>
implements InsOrderService {
+ private static final String DIRECT_TEMPLATE_LABORATORY = "鏂拌仛";
+
private InsOrderMapper insOrderMapper;
private InsSampleService insSampleService;
private InsSampleMapper insSampleMapper;
@@ -90,6 +103,13 @@
private SpotCheckQuarterItemMapper spotCheckQuarterItemMapper;
private StandardProductListMapper standardProductListMapper;
private StructureItemParameterMapper structureItemParameterMapper;
+ private StandardTreeService standardTreeService;
+ private StandardMethodService standardMethodService;
+ private StandardTemplateService standardTemplateService;
+ private InsOrderStandardTemplateMapper insOrderStandardTemplateMapper;
+ private InsOrderTemplateDeviceMapper insOrderTemplateDeviceMapper;
+ private InsSampleReceiptMapper insSampleReceiptMapper;
+ private ApplicationEventPublisher applicationEventPublisher;
@@ -103,7 +123,10 @@
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;
+ return insOrderMapper.selectInsOrderPage(page, QueryWrappers.queryWrappers(sampleOrderDto), laboratory,
+ isOrderAll, receiptSubmitted);
}
@@ -122,36 +145,56 @@
insOrderMapper.updateById(insOrder);
List<InsSample> insSamples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery().eq(InsSample::getInsOrderId, orderId));
List<Integer> ids = insSamples.stream().map(InsSample::getId).collect(Collectors.toList());
- List<InsProduct> insProducts = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
- .in(InsProduct::getInsSampleId, ids)
- .eq(InsProduct::getState, 1)
- .select(InsProduct::getSonLaboratory).groupBy(InsProduct::getSonLaboratory));
+ List<InsProduct> insProducts = ids.isEmpty()
+ ? Collections.emptyList()
+ : insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
+ .in(InsProduct::getInsSampleId, ids)
+ .eq(InsProduct::getState, 1)
+ .select(InsProduct::getSonLaboratory).groupBy(InsProduct::getSonLaboratory));
+
+ InsOrder order = insOrderMapper.selectById(orderId);
+ boolean directTemplateOrder = isDirectTemplateOrder(order, insSamples);
+ Set<String> taskLaboratories = directTemplateOrder
+ ? Collections.singleton(DIRECT_TEMPLATE_LABORATORY)
+ : insProducts.stream()
+ .map(InsProduct::getSonLaboratory)
+ .filter(StringUtils::isNotBlank)
+ .collect(Collectors.toCollection(LinkedHashSet::new));
+ if (!directTemplateOrder && taskLaboratories.size() != insProducts.size()) {
+ throw new ErrorException("璇ユ楠屽崟鏈夋湭缁存姢瀹為獙瀹ょ殑妫�楠岄」鐩�");
+ }
// 鎵归噺娣诲姞妫�楠屼换鍔$姸鎬佽〃
- List<InsOrderState> insOrderStateList = insProducts.stream().map(insProduct -> {
+ List<InsOrderState> insOrderStateList = taskLaboratories.stream()
+ .filter(laboratory -> insOrderStateService.count(Wrappers.<InsOrderState>lambdaQuery()
+ .eq(InsOrderState::getInsOrderId, orderId)
+ .eq(InsOrderState::getLaboratory, laboratory)) == 0)
+ .map(laboratory -> {
InsOrderState insOrderState = new InsOrderState();
insOrderState.setInsOrderId(orderId);
- try {
- insOrderState.setLaboratory(insProduct.getSonLaboratory());
- } catch (NullPointerException e) {
- throw new ErrorException("璇ユ楠屽崟鏈夋湭缁存姢瀹為獙瀹ょ殑妫�楠岄」鐩�");
- }
+ insOrderState.setLaboratory(laboratory);
insOrderState.setInsState(0);
return insOrderState;
}).collect(Collectors.toList());
- insOrderStateService.saveBatch(insOrderStateList);
+ if (!insOrderStateList.isEmpty()) {
+ insOrderStateService.saveBatch(insOrderStateList);
+ }
if (userId != null) {
- InsSampleUser insSampleUser = new InsSampleUser();
- insSampleUser.setState(0);
- insSampleUser.setUserId(userId);
- insSampleUser.setInsSampleId(orderId);
- insSampleUser.setSonLaboratory(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);
+ }
}
// 鍒ゆ柇璁㈠崟鏈夋病鏈夌粦瀹氭娊鏍疯鍒�
- InsOrder order = insOrderMapper.selectById(orderId);
if (order.getQuarterItemId() != null) {
// 闇�瑕佹坊鍔犱笅鍙戞椂闂村埌鎶芥牱鏃堕棿, 鍙栨牱浜哄憳灏辨槸妫�娴嬩汉
SpotCheckQuarterItem spotCheckQuarterItem = spotCheckQuarterItemMapper.selectById(order.getQuarterItemId());
@@ -162,6 +205,22 @@
}
return 1;
+ }
+
+ private boolean isDirectTemplateOrder(InsOrder order, List<InsSample> samples) {
+ if (order == null || CollectionUtils.isEmpty(samples)) {
+ return false;
+ }
+ Long snapshotCount = insOrderStandardTemplateMapper.selectCount(
+ Wrappers.<InsOrderStandardTemplate>lambdaQuery()
+ .eq(InsOrderStandardTemplate::getInsOrderId, order.getId()));
+ return snapshotCount > 0 && samples.stream().anyMatch(sample ->
+ sample.getStandardMethodListId() == null
+ && StringUtils.isBlank(sample.getFactory())
+ && StringUtils.isBlank(sample.getSampleType())
+ && StringUtils.isBlank(sample.getModel())
+ && StringUtils.isBlank(order.getFactory())
+ && StringUtils.isBlank(order.getSampleType()));
}
@@ -315,6 +374,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())) {
// 濮旀墭浜哄氨鏄姤妫�浜�, 鐢熶骇鍗曚綅灏辨槸渚涘簲鍟嗗崟浣�
@@ -354,9 +422,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)){
@@ -407,6 +473,198 @@
}
/**
+ * 鏂拌仛鏍囧噯搴撶洿缁戞ā鏉跨殑涓嬪崟娴佺▼锛氫竴涓鍗曘�佷竴涓牱鍝侊紝妫�楠岃褰曞畬鍏ㄧ敱妯℃澘鏍囪鐢熸垚銆�
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ 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.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())
+ || 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();
+
+ InsOrder order = dto.getInsOrder();
+ order.setId(null);
+ // 鏂拌仛涓嬪崟鍏嶅鏍革細鐩存帴鍙楃悊锛屼笅鍗曞嵆娴佽浆鍒版牱鍝佹帴鏀�
+ order.setState(1);
+ order.setExamineTime(LocalDateTime.now());
+ order.setIsExemption(0);
+ 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.insert(order);
+
+ InsSample sample = new InsSample();
+ sample.setInsOrderId(order.getId());
+ sample.setSampleCode(sampleCode);
+ sample.setFactory(null);
+ sample.setLaboratory(standard.getLaboratory());
+ sample.setSampleType(null);
+ sample.setSample(standardCode);
+ sample.setModel(null);
+ sample.setQuantity(1);
+ sample.setStandardMethodListId(null);
+ insSampleMapper.insert(sample);
+
+ int productSort = 0;
+ for (TemplateInspectionItemDto item : templateItems) {
+ InsProduct product = new InsProduct();
+ product.setInsSampleId(sample.getId());
+ product.setInspectionItem(item.getInspectionItem());
+ product.setInspectionItemClass("");
+ product.setInspectionItemSubclass("");
+ product.setFactory(null);
+ product.setLaboratory(standard.getLaboratory());
+ product.setSampleType(null);
+ product.setSample(standardCode);
+ product.setModel(null);
+ product.setTemplateId(item.getTemplateId());
+ product.setTemplateRowIndex(item.getTemplateRowIndex());
+ product.setSonLaboratory(DIRECT_TEMPLATE_LABORATORY);
+ product.setState(1);
+ product.setSort(productSort++);
+ insProductMapper.insert(product);
+ }
+ 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,
+ Map<Integer, StandardTreeTemplateBindingVo> bindingMap) {
+ for (OrderTemplateSelectionDto selection : selections) {
+ StandardTemplate template = standardTemplateService.getById(selection.getTemplateId());
+ if (template == null) {
+ throw new ErrorException("鍘熷璁板綍妯℃澘涓嶅瓨鍦�");
+ }
+ InsOrderStandardTemplate snapshot = new InsOrderStandardTemplate();
+ snapshot.setInsOrderId(orderId);
+ snapshot.setTemplateId(template.getId());
+ snapshot.setName(template.getName());
+ snapshot.setNumber(template.getNumber());
+ snapshot.setRemark(template.getRemark());
+ 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);
+ }
+ }
+ }
+
+ /**
* 娣诲姞妫�楠岄」
* @param sampleId
* @param productList
@@ -447,9 +705,33 @@
list = insSampleMapper.selectSampleProductListByOrderId2(id);
}
Map<String, Object> map1 = insSampleMapper.selectInsOrder(id);
+ List<InsSample> orderSamples = insSampleMapper.selectList(
+ Wrappers.<InsSample>lambdaQuery()
+ .eq(InsSample::getInsOrderId, id)
+ .select(InsSample::getSampleCode)
+ .orderByAsc(InsSample::getId));
+ List<OrderTemplateSummaryVo> templateList = insOrderStandardTemplateMapper.selectList(
+ Wrappers.<InsOrderStandardTemplate>lambdaQuery()
+ .eq(InsOrderStandardTemplate::getInsOrderId, id)
+ .orderByAsc(InsOrderStandardTemplate::getSort,
+ InsOrderStandardTemplate::getId))
+ .stream()
+ .map(template -> {
+ OrderTemplateSummaryVo summary = new OrderTemplateSummaryVo();
+ summary.setTemplateId(template.getTemplateId());
+ summary.setName(template.getName());
+ summary.setNumber(template.getNumber());
+ summary.setRemark(template.getRemark());
+ summary.setSort(template.getSort());
+ return summary;
+ })
+ .collect(Collectors.toList());
map.put("insOrder", insOrder);
map.put("sampleProduct", list);
+ // 鏍峰搧缂栧彿鐩存帴浠庢牱鍝佽〃璇诲彇锛屼笉渚濊禆妫�楠岄」鐩叧鑱旀煡璇㈡槸鍚︽湁缁撴灉銆�
+ map.put("sampleCode", orderSamples.isEmpty() ? null : orderSamples.get(0).getSampleCode());
map.put("insOrderTemplate", map1);
+ map.put("templateList", templateList);
return map;
}
@@ -459,29 +741,16 @@
* @return
*/
@Override
+ @Transactional(rollbackFor = Exception.class)
public int upInsOrderOfState(InsOrder insOrder) {
insOrder.setExamineTime(LocalDateTime.now());
if (insOrder.getState() == 1) {
- //瀹℃牳閫氳繃鎵嶄細鐢熸垚濮旀墭缂栧彿
- // todo: 妫�楠岀被鍨嬬紪鍙�
+ //濮旀墭缂栧彿宸插湪涓嬪崟鏃剁敓鎴愬苟鏍¢獙鍞竴鎬э紝瀹℃牳鏃跺鐢紱鍘嗗彶/瀛e害妫�楠岃鍗曞厹搴曠敓鎴愩��
InsOrder order = this.getById(insOrder.getId());
- String code = "";
- switch (order.getOrderType()) {
- case InsOrderTypeConstants.SPOT_CHECK:
- code = "C";
- break;
- case InsOrderTypeConstants.CUSTOMER_ORDERED:
- code = "W";
- break;
- case InsOrderTypeConstants.ENTER_THE_FACTORY:
- case InsOrderTypeConstants.QUARTERLY_TEST:
- code = "Y";
- break;
- }
- // 鐢熸垚缂栧彿
- String no = numberGenerator.generateNumberWithPrefix(3,
- "JCZX/ZB-" + code + LimsDateUtil.resetDate(LocalDateTime.now()),
- 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()
@@ -497,11 +766,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())) {
// 濡傛灉鍙湁涓�涓牱鍝佸氨涓嶉渶瑕佹嫾鎺ユ暟瀛�
@@ -517,7 +787,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
@@ -525,6 +836,39 @@
Map<String, Object> map = new HashMap<>();
// InsOrder insOrder = insOrderMapper.selectById(id);
IfsOrderVO ifsOrderVO = insOrderMapper.selectOrderInfoById(id);
+ Map<Integer, List<Integer>> templateDeviceIds = insOrderTemplateDeviceMapper.selectList(
+ Wrappers.<InsOrderTemplateDevice>lambdaQuery()
+ .eq(InsOrderTemplateDevice::getInsOrderId, id)
+ .orderByAsc(InsOrderTemplateDevice::getSort,
+ InsOrderTemplateDevice::getId))
+ .stream().collect(Collectors.groupingBy(
+ InsOrderTemplateDevice::getTemplateId,
+ LinkedHashMap::new,
+ Collectors.mapping(InsOrderTemplateDevice::getDeviceId, Collectors.toList())));
+ List<TemplateConditionVo> templateConditions = insOrderStandardTemplateMapper.selectList(
+ Wrappers.<InsOrderStandardTemplate>lambdaQuery()
+ .eq(InsOrderStandardTemplate::getInsOrderId, id)
+ .select(InsOrderStandardTemplate::getTemplateId,
+ InsOrderStandardTemplate::getTemperature,
+ InsOrderStandardTemplate::getHumidity,
+ InsOrderStandardTemplate::getDetectionTime,
+ InsOrderStandardTemplate::getDetectionPlace,
+ InsOrderStandardTemplate::getInsResult)
+ .orderByAsc(InsOrderStandardTemplate::getSort,
+ InsOrderStandardTemplate::getId))
+ .stream().map(snapshot -> {
+ 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());
+ condition.setDeviceIds(templateDeviceIds.getOrDefault(
+ snapshot.getTemplateId(), Collections.emptyList()));
+ return condition;
+ }).collect(Collectors.toList());
+ ifsOrderVO.setTemplateConditions(templateConditions);
List<SampleProductDto> list = insSampleMapper.getInsOrderAndSample(id, laboratory);
map.put("insOrder", ifsOrderVO);
map.put("sampleProduct", list);
@@ -648,13 +992,6 @@
if(isSplitOrder){
ifsInventoryQuantity.setIsSplitOrder(1);
}
- //todo:涓嶆竻妤氱敤閫旓紝鏆傛椂灞忚斀鎺�
- // 鏌ヨ浜т笟閾炬娴嬫暟鎹�
-// String industryChainAttrFields = IndustryChainUtils.getIndustryChainAttrFields(ifsInventoryQuantity.getOrderNo(),
-// ifsInventoryQuantity.getLineNo(),
-// ifsInventoryQuantity.getReleaseNo());
-// ifsInventoryQuantity.setIndustryChain(industryChainAttrFields);
-
ifsInventoryQuantityMapper.insert(ifsInventoryQuantity);
}
}
@@ -802,6 +1139,9 @@
ifsInventoryQuantity.setIsCopper(1);
ifsInventoryQuantity.setIsQuarter(0);
ifsInventoryQuantity.setInspectStatus(0);
+ //閾滄潗鏂欎笅鍗曢粯璁ゅ��
+ ifsInventoryQuantity.setOrderType(OrderType.RAW.getValue());
+ ifsInventoryQuantity.setMaterialProp("01Cu");
ifsInventoryQuantity.setQtyArrived(insOrder.getQtyArrived());
ifsInventoryQuantity.setBuyUnitMeas(insOrder.getBuyUnitMeas());
@@ -811,13 +1151,11 @@
ifsInventoryQuantityMapper.insert(ifsInventoryQuantity);
-
insOrder.setIfsInventoryId(ifsInventoryQuantity.getId());
insOrder.setState(1);
-
upInsOrderOfState(insOrder);
- upInsOrder(insOrder.getId(), null, appointed != null ? appointed.toString() : null, SecurityUtils.getUserId().intValue(), "鍘熸潗鏂�");
+ // 瀹℃牳閫氳繃鍚庝粎杩涘叆鏍峰搧鎺ユ敹锛涚敱鏍峰搧鎺ユ敹椤甸潰閫夋嫨涓绘楠屼汉鍚庡啀鍒涘缓妫�楠屼换鍔°��
return insOrder.getId();
}
@@ -880,6 +1218,19 @@
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean updateInsOrder(InsOrderUpdateDto insOrderUpdateDto) {
+ InsOrder currentOrder = insOrderMapper.selectById(insOrderUpdateDto.getInsOrder().getId());
+ if (currentOrder == null || !Objects.equals(currentOrder.getState(), 2)) {
+ throw new ErrorException("鍙湁閫�鍥炵殑妫�楠屽崟鍙互淇敼");
+ }
+ boolean hasSelectedProduct = CollectionUtils.isNotEmpty(insOrderUpdateDto.getSampleProduct())
+ && insOrderUpdateDto.getSampleProduct().stream()
+ .filter(sample -> CollectionUtils.isNotEmpty(sample.getInsProduct()))
+ .flatMap(sample -> sample.getInsProduct().stream())
+ .anyMatch(product -> Objects.equals(product.getState(), 1));
+ if (!hasSelectedProduct) {
+ throw new ErrorException("璇疯嚦灏戦�夋嫨涓�涓楠岄」");
+ }
+
// 淇敼璁㈠崟
insOrderUpdateDto.getInsOrder().setState(0);
insOrderUpdateDto.getInsOrder().setTell("");
@@ -887,11 +1238,50 @@
// 淇敼妫�楠岄」
for (SampleProductDto sampleProductDto : insOrderUpdateDto.getSampleProduct()) {
+ Long sampleCount = insSampleMapper.selectCount(Wrappers.<InsSample>lambdaQuery()
+ .eq(InsSample::getId, sampleProductDto.getId())
+ .eq(InsSample::getInsOrderId, insOrderUpdateDto.getInsOrder().getId()));
+ if (sampleCount == 0) {
+ throw new ErrorException("妫�楠屾牱鍝佹暟鎹紓甯�");
+ }
+
insSampleService.update(Wrappers.<InsSample>lambdaUpdate()
.eq(InsSample::getId, sampleProductDto.getId())
.set(InsSample::getSpecialStandardMethod, sampleProductDto.getSpecialStandardMethod()));
- insProductService.updateBatchById(sampleProductDto.getInsProduct());
+ List<InsProduct> products = sampleProductDto.getInsProduct();
+ if (CollectionUtils.isEmpty(products)) {
+ continue;
+ }
+
+ Set<Integer> productIds = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
+ .eq(InsProduct::getInsSampleId, sampleProductDto.getId()))
+ .stream()
+ .map(InsProduct::getId)
+ .collect(Collectors.toSet());
+ if (products.stream().anyMatch(product -> product.getId() != null && !productIds.contains(product.getId()))) {
+ throw new ErrorException("妫�楠岄」鏁版嵁寮傚父");
+ }
+
+ List<Integer> removedIds = products.stream()
+ .filter(product -> product.getId() != null && !Objects.equals(product.getState(), 1))
+ .map(InsProduct::getId)
+ .collect(Collectors.toList());
+ if (CollectionUtils.isNotEmpty(removedIds)) {
+ insProductService.removeByIds(removedIds);
+ }
+
+ List<InsProduct> existingProducts = products.stream()
+ .filter(product -> product.getId() != null && Objects.equals(product.getState(), 1))
+ .collect(Collectors.toList());
+ if (CollectionUtils.isNotEmpty(existingProducts)) {
+ insProductService.updateBatchById(existingProducts);
+ }
+
+ List<InsProduct> newProducts = products.stream()
+ .filter(product -> product.getId() == null && Objects.equals(product.getState(), 1))
+ .collect(Collectors.toList());
+ addInsProductMethod(sampleProductDto.getId(), newProducts);
}
return true;
@@ -923,11 +1313,18 @@
InsProduct insProduct = insProductMapper.selectOne(Wrappers.<InsProduct>lambdaQuery()
.eq(InsProduct::getInsSampleId, insSampleId)
.last("limit 1"));
- String tree = insProduct.getFactory() + " - " +
- insProduct.getLaboratory() + " - " +
- insProduct.getSampleType() + " - " +
- insProduct.getSample() + " - " +
- insProduct.getModel();
+ String tree;
+ if (insProduct.getSampleType() == null && insProduct.getModel() == null
+ && StringUtils.isNotBlank(insProduct.getLaboratory())
+ && StringUtils.isNotBlank(insProduct.getSample())) {
+ tree = StandardTreePathParser.canonical(insProduct.getLaboratory(), insProduct.getSample());
+ } else {
+ tree = insProduct.getFactory() + " - " +
+ insProduct.getLaboratory() + " - " +
+ insProduct.getSampleType() + " - " +
+ insProduct.getSample() + " - " +
+ insProduct.getModel();
+ }
// 鏌ヨ鏍囧噯鏍�
List<StandardProductList> standardProductLists = standardProductListMapper.selectList(Wrappers.<StandardProductList>lambdaQuery()
.eq(StandardProductList::getStandardMethodListId, insProduct.getStandardMethodListId())
@@ -1222,8 +1619,7 @@
// 妫�楠屽悗绉诲簱
//1301:鍘熸潗鏂欏悎鏍煎簱锛孋P-02-001:鎴愬搧搴�
if(StringUtils.equals(inventoryQuantity.getOrderType(), OrderType.RAW.getValue())){
- //濡傛灉璁㈠崟涓哄師鏉愭枡鐨勬媶鍒嗚鍗曪紝鍒欑Щ鍒板璐師鏉愭枡搴撲綅W03
- toLocation = one.getIsSplitOrder().equals(1)?"W03":"1301";
+ toLocation = "1301";
}else if(StringUtils.equals(inventoryQuantity.getOrderType(), OrderType.WG.getValue())){
toLocation = "CP-02-001";
}else{
--
Gitblit v1.9.3