From 8ad863082097ffdcab4a8e7f426d344a1fe6f892 Mon Sep 17 00:00:00 2001
From: 吴羡 <16976746+Xian-TT3@user.noreply.gitee.com>
Date: 星期六, 07 十一月 2026 00:27:02 +0800
Subject: [PATCH] 修复人员管理接口校验与导出,完善设备保养计划与文件受控功能
---
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java | 240 ++++++++++++++++++++++++++++++++++++++++++------------------
1 files changed, 168 insertions(+), 72 deletions(-)
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java
index 797cc86..a141ab0 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java
@@ -45,6 +45,7 @@
import com.ruoyi.inspect.pojo.*;
import com.ruoyi.inspect.service.*;
import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.inspect.util.ReportResultTableRenderPolicy;
import com.ruoyi.inspect.util.PreserveReportPicturePlaceholderHandler;
import com.ruoyi.inspect.util.ReportSignaturePictureUtils;
import com.ruoyi.inspect.vo.InsOrderPlanTaskSwitchVo;
@@ -368,7 +369,7 @@
}
}
map.put("errorMsg", collect);
- map.put("missingExportItems", getMissingTemplateExportValues(orderId));
+ map.put("missingExportItems", getMissingTemplateExportValues(orderId, laboratory));
map.put("unInsOrderCount", 0L);
return map;
}
@@ -605,11 +606,9 @@
}
- // 娣诲姞璁惧璁板綍
- threadPoolTaskExecutor.execute(() -> {
- // 娣诲姞璁惧浣跨敤璁板綍
- addDeviceRecord(insSample, userId);
- });
+ // 鍘熷璁板綍淇濆瓨鍚庯紝鎸夊綋鍓嶆ā鏉块�夌敤鐨勮澶囩敓鎴愪娇鐢ㄨ褰�
+ syncDeviceRecordsFromTemplate(saveInsContextDto.getOrderId(), saveInsContextDto.getSampleId(),
+ saveInsContextDto.getCurrentTable(), userId);
}
/**
@@ -652,10 +651,11 @@
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());
@@ -691,6 +691,9 @@
.and(w -> w.isNull(InsProduct::getLastValue).or().eq(InsProduct::getLastValue, "")));
sample.setInsState(unfinished == 0 ? 2 : 1);
insSampleMapper.updateById(sample);
+
+ // 鍘熷璁板綍淇濆瓨鍚庯紝鎸夊綋鍓嶆ā鏉块�夌敤鐨勮澶囩敓鎴愪娇鐢ㄨ褰�
+ syncDeviceRecordsFromTemplate(dto.getOrderId(), dto.getSampleId(), dto.getTemplateId(), userId);
}
/**
@@ -892,8 +895,8 @@
}
/**
- * 妫�楠屼繚瀛樸�佹彁浜ゆ牎楠岃鍙栨爣鍑嗙淮鎶や腑鐨勫疄鏃舵ā鏉匡紱妯℃澘宸茶鍒犻櫎鎴栧唴瀹逛负绌烘椂鎵嶅洖閫�璁㈠崟蹇収銆�
- * 妫�楠屽畬鎴愬悗鐨勫睍绀哄拰鎶ュ憡浠嶇敱璁㈠崟蹇収璐熻矗锛屼笉浼氶殢鏍囧噯妯℃澘鍚庣画淇敼鑰屽彉鍖栥��
+ * 璇诲彇鏍囧噯缁存姢涓殑瀹炴椂妯℃澘锛涙ā鏉垮凡琚垹闄ゆ垨鍐呭涓虹┖鏃舵墠鍥為��璁㈠崟蹇収銆�
+ * 浠呯敤浜庢楠屽浠嶅浜庡緟妫�銆佸湪妫�闃舵锛堥〉闈㈠睍绀哄疄鏃舵ā鏉匡級鐨勪繚瀛樹笌鏍¢獙銆�
*/
private String getCurrentTemplateThing(InsOrderStandardTemplate snapshot) {
if (snapshot != null && snapshot.getTemplateId() != null) {
@@ -906,9 +909,53 @@
}
/**
+ * 妫�楠屽崟椤甸潰鍦ㄦ楠屽杩涘叆澶嶆牳鍙婁箣鍚庣姸鎬佹椂灞曠ず璁㈠崟蹇収锛屽鍑哄�肩殑淇濆瓨鍜屾彁浜ゆ牎楠屽繀椤讳笌椤甸潰
+ * 浣跨敤鍚屼竴浠芥ā鏉匡紱鍚﹀垯鏍囧噯妯℃澘鍦ㄦ楠岄�斾腑琚慨鏀瑰悗锛屽巻鍙插崟鎹細鎸夋柊鍧愭爣璇诲彇蹇収鏁版嵁鑰岃鎶ヤ负绌恒��
+ */
+ 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)
@@ -918,9 +965,10 @@
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());
@@ -985,60 +1033,98 @@
}
}
- private synchronized void addDeviceRecord(InsSample insSample, Integer userId) {
- InsOrder order = insOrderMapper.selectById(insSample.getInsOrderId());
+ /**
+ * 鍘熷璁板綍淇濆瓨鍚庯紝鎸夊綋鍓嶆ā鏉块�夌敤鐨勮澶囩敓鎴愬緟濉啓鐨勪娇鐢ㄨ褰曘��
+ * 鍚屼竴璁㈠崟銆佹牱鍝併�佽澶囧彧鐢熸垚涓�鏉★紱娓╂箍搴﹀拰浣跨敤鏃ユ湡鍙栧師濮嬭褰曞揩鐓э紝
+ * 鏃堕棿榛樿 10:00-19:30锛涘凡缁忔墜宸ュ~鍐欒繃鐨勮褰曚笉浼氳瑕嗙洊銆�
+ */
+ private synchronized void syncDeviceRecordsFromTemplate(Integer orderId, Integer sampleId,
+ Integer templateId, Integer userId) {
+ if (orderId == null || sampleId == null || templateId == null) {
+ return;
+ }
+ InsOrder order = insOrderMapper.selectById(orderId);
+ InsSample sample = insSampleMapper.selectById(sampleId);
+ if (order == null || sample == null) {
+ return;
+ }
+ List<Integer> deviceIds = insOrderTemplateDeviceMapper
+ .selectDeviceIdsByOrderAndTemplate(orderId, templateId);
+ if (CollectionUtils.isEmpty(deviceIds)) {
+ return;
+ }
+ InsOrderStandardTemplate snapshot = insOrderStandardTemplateService.getOne(
+ Wrappers.<InsOrderStandardTemplate>lambdaQuery()
+ .eq(InsOrderStandardTemplate::getInsOrderId, orderId)
+ .eq(InsOrderStandardTemplate::getTemplateId, templateId)
+ .last("limit 1"));
+ String temperature = snapshot == null || StringUtils.isBlank(snapshot.getTemperature())
+ ? order.getTemperature() : snapshot.getTemperature();
+ String humidity = snapshot == null || StringUtils.isBlank(snapshot.getHumidity())
+ ? order.getHumidity() : snapshot.getHumidity();
+ // 鍘熷璁板綍娌℃湁妫�娴嬫棩鏈熸椂鐣欑┖锛屼笉榛樿褰撳ぉ
+ LocalDateTime useStartDate = null;
+ LocalDateTime useEndDate = null;
+ if (snapshot != null && snapshot.getDetectionTime() != null) {
+ useStartDate = snapshot.getDetectionTime().atTime(10, 0);
+ LocalDate endDate = snapshot.getDetectionEndTime() != null
+ ? snapshot.getDetectionEndTime() : snapshot.getDetectionTime();
+ useEndDate = endDate.atTime(19, 30);
+ }
User user = userMapper.selectById(userId);
- // 鏌ヨ璁惧浣跨敤璁板綍鏌ヨ璇ヨ鍗曠殑浣跨敤璁板綍
- List<InsOrderDeviceRecordDto> deviceRecordDtoList = insOrderDeviceRecordMapper.selectDeviceNumber(insSample.getInsOrderId());
- Set<String> recordCodeset = deviceRecordDtoList.stream().map(InsOrderDeviceRecordDto::getManagementNumber).collect(Collectors.toSet());
-
- // 鑾峰彇璁㈠崟璁惧缂栧彿
- List<InsProductResult> resultList = insProductResultMapper.selectResultByOrderId(insSample.getInsOrderId());
- Set<String> deviceCodeSet = new HashSet<>();
- for (InsProductResult result : resultList) {
- // 娣诲姞璁惧缂栧彿
- List<JSONObject> jsonObjects = JSON.parseArray(result.getEquipValue(), JSONObject.class);
- for (JSONObject jsonObject : jsonObjects) {
- if (!"".equals(jsonObject.get("v") + "")) {
- List<String> v = StrUtil.split(jsonObject.get("v") + "", "锛�");
- deviceCodeSet.addAll(v);
- }
+ String usePerson = user == null ? "" : user.getName();
+ String sampleCode = StringUtils.isNotBlank(sample.getSampleCode())
+ ? sample.getSampleCode() : order.getEntrustCode();
+ for (Integer deviceId : deviceIds) {
+ if (deviceId == null) {
+ continue;
}
+ InsOrderDeviceRecord existing = insOrderDeviceRecordMapper.selectOne(
+ Wrappers.<InsOrderDeviceRecord>lambdaQuery()
+ .eq(InsOrderDeviceRecord::getInsOrderId, orderId)
+ .eq(InsOrderDeviceRecord::getDeviceId, deviceId)
+ .eq(InsOrderDeviceRecord::getSampleCode, sampleCode)
+ .last("limit 1"));
+ if (existing != null) {
+ // 鍙ˉ鑷姩鐢熸垚浣嗗皻鏈~鍐欑殑璁板綍
+ if (existing.getUseStartDate() != null) {
+ continue;
+ }
+ InsOrderDeviceRecord update = new InsOrderDeviceRecord();
+ update.setId(existing.getId());
+ if (StringUtils.isBlank(existing.getTemperature())) {
+ update.setTemperature(temperature);
+ }
+ if (StringUtils.isBlank(existing.getHumidity())) {
+ update.setHumidity(humidity);
+ }
+ if (useStartDate != null) {
+ update.setUseStartDate(useStartDate);
+ update.setUseEndDate(useEndDate);
+ }
+ if (existing.getUsePersonId() == null) {
+ update.setUsePersonId(userId);
+ }
+ if (StringUtils.isBlank(existing.getUsePerson())) {
+ update.setUsePerson(usePerson);
+ }
+ insOrderDeviceRecordMapper.updateById(update);
+ continue;
+ }
+ InsOrderDeviceRecord record = new InsOrderDeviceRecord();
+ record.setInsOrderId(orderId);
+ record.setDeviceId(deviceId);
+ record.setSampleCode(sampleCode);
+ record.setTemperature(temperature);
+ record.setHumidity(humidity);
+ record.setUseStartDate(useStartDate);
+ record.setUseEndDate(useEndDate);
+ record.setUseBefore(1);
+ record.setUseAfter(1);
+ record.setUsePersonId(userId);
+ record.setUsePerson(usePerson);
+ insOrderDeviceRecordMapper.insert(record);
}
- // 1.鍒ゆ柇鏄惁鏈夋病鏈夋坊鍔犵殑浣跨敤璁板綍
- Set<String> orderDeviceNumbers = getDeviceDifference(deviceCodeSet, recordCodeset);
- // 娣诲姞浣跨敤璁板綍, 鏍规嵁缂栧彿鏌ヨ璁惧id
- if (CollectionUtils.isNotEmpty(orderDeviceNumbers)) {
- List<Integer> orderDeviceIds = insOrderDeviceRecordMapper.selectDeviceIdsByNumbers(orderDeviceNumbers);
- List<InsOrderDeviceRecord> collect = orderDeviceIds.stream().map(deviceId -> {
- InsOrderDeviceRecord insOrderDeviceRecord = new InsOrderDeviceRecord();
- insOrderDeviceRecord.setInsOrderId(insSample.getInsOrderId());
- insOrderDeviceRecord.setDeviceId(deviceId);
- insOrderDeviceRecord.setSampleCode(order.getEntrustCode());
- insOrderDeviceRecord.setUseBefore(1);
- insOrderDeviceRecord.setUseAfter(1);
- insOrderDeviceRecord.setUsePerson(user.getName());
- insOrderDeviceRecord.setUsePersonId(user.getId());
- return insOrderDeviceRecord;
- }).collect(Collectors.toList());
-
- insOrderDeviceRecordService.saveBatch(collect);
-
- }
-
- // 2.鍒ゆ柇鏄惁鍙栨秷浜嗚澶囦娇鐢�
- Set<String> repoprNumbers = getDeviceDifference(recordCodeset, deviceCodeSet);
- if (CollectionUtils.isNotEmpty(repoprNumbers)) {
- List<Integer> reportDeviceIds = insOrderDeviceRecordMapper.selectDeviceIdsByNumbers(repoprNumbers);
- insOrderDeviceRecordMapper.delete(Wrappers.<InsOrderDeviceRecord>lambdaQuery()
- .in(InsOrderDeviceRecord::getDeviceId, reportDeviceIds)
- .eq(InsOrderDeviceRecord::getInsOrderId, insSample.getInsOrderId()));
- }
- }
-
- private static Set<String> getDeviceDifference(Set<String> number1, Set<String> number2) {
- return number1.stream().filter(s1 -> number2.stream().noneMatch(s2 -> s1.equals(s2)))
- .collect(Collectors.toSet());
}
@@ -1276,7 +1362,7 @@
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));
}
@@ -1816,11 +1902,13 @@
}
// 妫�楠屼汉鍛樻彁浜ゅ鏍告椂涓嶇敓鎴愭姤鍛婏紱鍏ㄩ儴璇曢獙瀹ゅ鏍搁�氳繃鍚庣敓鎴愭姤鍛娿��
- if (report == null || StringUtils.isBlank(report.getUrl())) {
+ boolean returnedFromReport = report != null && Objects.equals(report.getIsPass(), 0);
+ if (report == null || StringUtils.isBlank(report.getUrl()) || returnedFromReport) {
this.generateReport(orderId, DETECTION_REPORT, writeUserId);
}
// 鐩寸粦妯℃澘璁㈠崟鍚屾椂鐢熸垚妫�楠屾姤鍛婏紝涓や唤鏂囦欢鍏辩敤鍚屼竴鏉″鎵硅褰曘��
- if (directTemplateOrder && (report == null || StringUtils.isBlank(report.getInspectionUrl()))) {
+ if (directTemplateOrder && (report == null || StringUtils.isBlank(report.getInspectionUrl())
+ || returnedFromReport)) {
this.generateReport(orderId, INSPECTION_REPORT, writeUserId);
}
report = insReportMapper.selectOne(Wrappers.<InsReport>lambdaQuery()
@@ -1888,9 +1976,17 @@
} else {
- //澶嶆牳涓嶉�氳繃灏嗘妸澶嶆牳鐨勮礋璐d汉鍘绘帀
- Integer id = insSampleUserMapper.selectOne(Wrappers.<InsSampleUser>lambdaQuery().eq(InsSampleUser::getInsSampleId, orderId).orderByDesc(InsSampleUser::getId).last("limit 1")).getId();
- insSampleUserMapper.deleteById(id);
+ // 澶嶆牳涓嶉�氳繃鍙幓鎺夋湰妫�楠屽鏈鎻愪氦鐨勫鏍歌礋璐d汉锛涙寜澶嶆牳浜虹姸鎬佸拰妫�楠屽瀹氫綅锛�
+ // 閬垮厤璇垹鍏朵粬妫�楠屽鐨勮褰曟垨妫�楠屼汉鍛樿褰曘��
+ 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();
@@ -3700,7 +3796,7 @@
}
Configure configure = Configure.builder()
.bind("deviceList", new HackLoopTableRenderPolicy())
- .bind("r", new HackLoopTableRenderPolicy(true))
+ .bind("r", new ReportResultTableRenderPolicy())
.setValidErrorHandler(new PreserveReportPicturePlaceholderHandler())
.useSpringEL(true)
.build();
--
Gitblit v1.9.3