From 3728fa293e1faf4bf4f9bf41105b84ddb43dc82e Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期一, 02 十一月 2026 16:53:02 +0800
Subject: [PATCH] feat(order-rates): 新增筛选条件下全部订单费用汇总接口
---
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsReportServiceImpl.java | 691 +++++++++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 591 insertions(+), 100 deletions(-)
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsReportServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsReportServiceImpl.java
index c980068..b7cfbbc 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsReportServiceImpl.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsReportServiceImpl.java
@@ -1,6 +1,5 @@
package com.ruoyi.inspect.service.impl;
-import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
@@ -19,6 +18,8 @@
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.data.PictureRenderData;
+import com.deepoove.poi.data.PictureType;
import com.deepoove.poi.data.Pictures;
import com.itextpdf.text.BadElementException;
import com.itextpdf.text.DocumentException;
@@ -26,12 +27,16 @@
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.ruoyi.basic.mapper.IfsInventoryQuantityMapper;
+import com.ruoyi.basic.mapper.SealConfigMapper;
import com.ruoyi.basic.pojo.IfsInventoryQuantity;
+import com.ruoyi.basic.pojo.SealConfig;
import com.ruoyi.basic.vo.IfsInventoryQuantityVO;
import com.ruoyi.common.config.WechatProperty;
import com.ruoyi.common.constant.InsOrderTypeConstants;
import com.ruoyi.common.constant.MenuJumpPathConstants;
import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.common.core.domain.entity.InformationNotification;
import com.ruoyi.common.utils.DateImageUtil;
import com.ruoyi.common.utils.QueryWrappers;
@@ -46,10 +51,15 @@
import com.ruoyi.inspect.service.InsOrderService;
import com.ruoyi.inspect.service.InsReportService;
import com.ruoyi.inspect.service.RawMaterialOrderService;
+import com.ruoyi.inspect.service.SealUsageLedgerService;
import com.ruoyi.inspect.util.PreserveReportPicturePlaceholderHandler;
+import com.ruoyi.inspect.util.ReportSealLayoutUtil;
import com.ruoyi.inspect.util.ReportSignaturePictureUtils;
import com.ruoyi.system.mapper.UserMapper;
+import com.ruoyi.system.service.ISysMenuService;
import com.ruoyi.system.service.InformationNotificationService;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.xwpf.usermodel.*;
import org.springframework.beans.factory.annotation.Autowired;
@@ -61,9 +71,7 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
-import jakarta.annotation.Resource;
import javax.imageio.ImageIO;
-import jakarta.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URLEncoder;
@@ -96,17 +104,28 @@
private static final int DETECTION_REPORT = 0;
private static final int INSPECTION_REPORT = 1;
+ private static final String RETURN_TO_INSPECTION_TASK = "INSPECTION_TASK";
+ private static final String RETURN_TO_REPORT_REVIEW = "REPORT_REVIEW";
+ private static final int RETURNED_STATUS = 2;
@Resource
private UserMapper userMapper;
@Resource
private InsReportMapper insReportMapper;
@Resource
+ private InsReportEditSessionMapper insReportEditSessionMapper;
+ @Resource
+ private InsReportReturnRecordMapper insReportReturnRecordMapper;
+ @Resource
+ private SealUsageLedgerService sealUsageLedgerService;
+ @Resource
private InsOrderStateMapper insOrderStateMapper;
@Resource
private InsProductMapper insProductMapper;
@Resource
private InformationNotificationService informationNotificationService;
+ @Resource
+ private ISysMenuService menuService;
@Value("${wordUrl}")
private String wordUrl;
@Value("${file.path}")
@@ -116,6 +135,8 @@
private InsOrderMapper insOrderMapper;
@Resource
private IfsInventoryQuantityMapper ifsInventoryQuantityMapper;
+ @Resource
+ private SealConfigMapper sealConfigMapper;
@Resource
private InsUnqualifiedHandlerMapper insUnqualifiedHandlerMapper;
@Resource
@@ -192,6 +213,7 @@
if (userId == null) {
throw new ErrorException("缂哄皯瀹℃牳浜�");
}
+ ensureReportPreparationPermission(userId, "瀹℃牳浜�");
insReport.setExamineUserId(userId);//瀹℃牳浜�
insReport.setWriteTime(LocalDateTime.now());//鎻愪氦鏃堕棿
//鑾峰彇鎻愪氦浜虹殑绛惧悕鍦板潃
@@ -220,8 +242,6 @@
info.setViewStatus(false);
info.setJumpPath(MenuJumpPathConstants.REPORT_PREPARATION);
informationNotificationService.addInformationNotification(info);
- String primaryReportUrl = getPrimaryReportUrl(insReport);
-
// 鍒ゆ柇鏄惁鏄師鏉愭枡 闇�瑕佹浛鎹�****鎴愪緵搴斿晢
IfsInventoryQuantity one = ifsInventoryQuantityMapper.selectOne(new LambdaQueryWrapper<IfsInventoryQuantity>()
.eq(IfsInventoryQuantity::getId, order.getIfsInventoryId()));
@@ -242,9 +262,7 @@
}};
writeMarksToReportFiles(insReport, writeMarks);
- // 淇敼涓存椂pdf
- String tempUrlPdf = wordToPdfTemp(primaryReportUrl.replace("/word", wordUrl));
- insReport.setTempUrlPdf("/word/" + tempUrlPdf);
+ refreshTemporaryPreviews(insReport);
insReportMapper.updateById(insReport);
@@ -257,6 +275,33 @@
.set(InsReport::getIsExamine, null));
return 1;
+ }
+
+ /**
+ * 鎸囧畾瀹℃牳浜�/鎵瑰噯浜烘椂锛岀‘璁ゅ鏂圭櫥褰曞悗鑳界湅鍒般�屾姤鍛婄紪鍒躲�嶉〉闈紝
+ * 閬垮厤鎸囧畾鍚庣櫥褰曞彧鍓╅椤点�佹棤娉曠户缁鎵广��
+ */
+ private void ensureReportPreparationPermission(Integer userId, String userLabel) {
+ List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId.longValue());
+ if (!containsReportPreparation(menus)) {
+ throw new ErrorException("鎵�閫�" + userLabel + "娌℃湁銆屼笟鍔$鐞� 鈫� 鎶ュ憡缂栧埗銆嶉〉闈㈡潈闄愶紝璇峰厛鍦ㄣ�岀郴缁熺鐞� 鈫� 鐢ㄦ埛绠$悊銆嶄负鍏跺垎閰嶅搴旇鑹�");
+ }
+ }
+
+ private boolean containsReportPreparation(List<SysMenu> menus) {
+ if (CollectionUtils.isEmpty(menus)) {
+ return false;
+ }
+ for (SysMenu menu : menus) {
+ if (Long.valueOf(1129L).equals(menu.getMenuId())
+ || "reportPreparation".equals(menu.getPath())) {
+ return true;
+ }
+ if (containsReportPreparation(menu.getChildren())) {
+ return true;
+ }
+ }
+ return false;
}
//瀹℃牳
@@ -314,6 +359,7 @@
if (userId == null) {
throw new ErrorException("缂哄皯鎵瑰噯浜�");
}
+ ensureReportPreparationPermission(userId, "鎵瑰噯浜�");
if (Objects.equals(insReport.getExamineUserId(), userId)) {
throw new ErrorException("瀹℃牳浜哄拰鎵瑰噯浜轰笉鑳戒负鍚屼竴浜猴紝璇烽噸鏂伴�夋嫨鎵瑰噯浜�");
}
@@ -344,16 +390,13 @@
info.setViewStatus(false);
info.setJumpPath(MenuJumpPathConstants.REPORT_PREPARATION);
informationNotificationService.addInformationNotification(info);
- String primaryReportUrl = getPrimaryReportUrl(insReport);
Map<String, Object> examineMarks = new HashMap<String, Object>() {{
put("examineUrl", ReportSignaturePictureUtils.create(imgUrl, signatureUrl));
put("examineDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(null)).create());
}};
writeMarksToReportFiles(insReport, examineMarks);
- // 淇敼涓存椂pdf
- String tempUrlPdf = wordToPdfTemp(primaryReportUrl.replace("/word", wordUrl));
- insReport.setTempUrlPdf("/word/" + tempUrlPdf);
+ refreshTemporaryPreviews(insReport);
// 鍙戦�佷紒涓氬井淇¢�氱煡(閫氱煡鎵瑰噯浜哄鎵�)
threadPoolTaskExecutor.execute(() -> {
@@ -377,11 +420,11 @@
message += "\n鎵规鍙�: " + ifsInventoryQuantity.getUpdateBatchNo();
}
//鍙戦�佷紒涓氬井淇℃秷鎭�氱煡 鎻愪氦澶嶆牳
- try {
- WxCpUtils.inform(sendUserAccount, message, null);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
+// try {
+// WxCpUtils.inform(sendUserAccount, message, null);
+// } catch (Exception e) {
+// throw new RuntimeException(e);
+// }
});
insReportMapper.updateById(insReport);
@@ -397,8 +440,23 @@
//鎵瑰噯
@Override
@Transactional(rollbackFor = Exception.class)
- public int ratifyReport(Integer id, Integer isRatify, String ratifyTell) {
- InsReport insReport = insReportMapper.selectById(id);
+ public int ratifyReport(Integer id, Integer isRatify, String ratifyTell, String sealIds,
+ Integer maSealId, Integer reportSealId, Integer seamSealId) {
+ if (id == null || (isRatify == null || (isRatify != 0 && isRatify != 1))) {
+ throw new ErrorException("鎵瑰噯鍙傛暟涓嶆纭�");
+ }
+ InsReport insReport = insReportMapper.selectOne(Wrappers.<InsReport>lambdaQuery()
+ .eq(InsReport::getId, id)
+ .last("FOR UPDATE"));
+ if (insReport == null) {
+ throw new ErrorException("鎶ュ憡涓嶅瓨鍦�");
+ }
+ if (Objects.equals(insReport.getIsRatify(), 1)) {
+ throw new ErrorException("鎶ュ憡宸叉壒鍑嗭紝璇峰嬁閲嶅鎿嶄綔");
+ }
+ if (!Objects.equals(insReport.getState(), 1) || !Objects.equals(insReport.getIsExamine(), 1)) {
+ throw new ErrorException("鎶ュ憡灏氭湭瀹℃牳閫氳繃锛屼笉鑳芥壒鍑�");
+ }
if (Objects.equals(insReport.getExamineUserId(), SecurityUtils.getUserId().intValue())) {
throw new ErrorException("瀹℃牳浜哄拰鎵瑰噯浜轰笉鑳戒负鍚屼竴浜猴紝璇烽噸鏂伴�夋嫨鎵瑰噯浜�");
}
@@ -452,10 +510,21 @@
}
});
- //濡傛灉鎵瑰噯涓嶉�氳繃 鐩存帴閫�鍥炲埌鎻愪氦浜洪偅杈瑰幓
- insReport.setState(0);
- insReport.setIsExamine(0);
- return insReportMapper.updateById(insReport);
+ // 鎵瑰噯涓嶉�氳繃鐩存帴閫�鍥炴姤鍛婂鏍革紝鐢卞師瀹℃牳浜轰慨鏀瑰悗閲嶆柊瀹℃牳銆佹壒鍑嗐��
+ recordReportReturn(insReport, "REPORT_APPROVAL", RETURN_TO_REPORT_REVIEW,
+ StringUtils.isBlank(ratifyTell) ? "鎵瑰噯涓嶉�氳繃" : ratifyTell, insReport.getRatifyTime());
+ insReport.setState(1);
+ insReport.setExamineTell(ratifyTell);
+ int affected = insReportMapper.updateById(insReport);
+ if (affected != 1) {
+ throw new ErrorException("鎶ュ憡閫�鍥炲鏍稿け璐�");
+ }
+ insReportMapper.update(null, Wrappers.<InsReport>lambdaUpdate()
+ .eq(InsReport::getId, id)
+ .set(InsReport::getIsExamine, RETURNED_STATUS)
+ .set(InsReport::getExamineTime, insReport.getRatifyTime()));
+ expireReportEditSessions(id);
+ return affected;
}
//鑾峰彇鎵瑰噯浜虹殑绛惧悕鍦板潃
String signatureUrl;
@@ -471,33 +540,65 @@
InsOrder order = insOrderMapper.selectById(insOrderId);
boolean isRawMater = order.getTypeSource() != null && order.getTypeSource().equals(1);
- //鑾峰彇鍦烘墍鐨勬姤鍛婁笓鐢ㄧ珷
- String sealUrl;
- String laboratory = insOrderMapper.selectById(insReport.getInsOrderId()).getLaboratory();
- try {
- String type = "";
- if (isRawMater && order.getOrderType().equals(InsOrderTypeConstants.ENTER_THE_FACTORY)) {
- type = "杩涘巶鎶ュ憡";
- } else {
- type = "濮旀墭鎶ュ憡";
- }
- sealUrl = insReportMapper.getLaboratoryByName(laboratory, type);
- } catch (Exception e) {
- throw new ErrorException(laboratory + "鎵句笉鍒版姤鍛婁笓鐢ㄧ珷");
+ // 鏂扮増鎸夌敤閫旈�夋嫨锛歁A绔犮�佹姤鍛婄珷锛堟ā鏉� seal1/seal2锛夈�丳DF楠戠紳绔犮��
+ // 鍏煎鏃у墠绔細鍙紶 sealIds 鏃讹紝绗竴鏋氱珷缁х画浣滀负鎶ュ憡绔犲拰楠戠紳绔狅紝MA绔犵暀绌恒��
+ SealConfig maSeal;
+ SealConfig reportSeal;
+ SealConfig seamSeal;
+ boolean positionMode = maSealId != null || reportSealId != null || seamSealId != null;
+ if (positionMode) {
+ maSeal = resolveSeal(maSealId);
+ reportSeal = resolveSeal(reportSealId);
+ seamSeal = resolveSeal(seamSealId);
+ } else {
+ SealConfig legacySeal = resolveSeals(sealIds).get(0);
+ maSeal = null;
+ reportSeal = legacySeal;
+ seamSeal = legacySeal;
}
- if (StringUtils.isBlank(sealUrl)) {
- throw new ErrorException(laboratory + "鎵句笉鍒版姤鍛婁笓鐢ㄧ珷");
+
+ LinkedHashMap<Integer, SealConfig> chosenById = new LinkedHashMap<>();
+ Arrays.asList(maSeal, reportSeal, seamSeal).stream()
+ .filter(Objects::nonNull)
+ .forEach(seal -> chosenById.put(seal.getId(), seal));
+ List<SealConfig> chosenSeals = new ArrayList<>(chosenById.values());
+ if (chosenSeals.isEmpty()) {
+ throw new ErrorException("璇疯嚦灏戦�夋嫨涓�绉嶆姤鍛婂嵃绔�");
}
+
+ insReport.setSealIds(chosenSeals.stream().map(s -> String.valueOf(s.getId())).collect(Collectors.joining(",")));
+ insReport.setSealNames(chosenSeals.stream().map(SealConfig::getName).collect(Collectors.joining(",")));
+ insReport.setMaSealId(maSeal == null ? null : maSeal.getId());
+ insReport.setMaSealName(maSeal == null ? null : maSeal.getName());
+ insReport.setReportSealId(reportSeal == null ? null : reportSeal.getId());
+ insReport.setReportSealName(reportSeal == null ? null : reportSeal.getName());
+ insReport.setSeamSealId(seamSeal == null ? null : seamSeal.getId());
+ insReport.setSeamSealName(seamSeal == null ? null : seamSeal.getName());
+ prepareApprovalCopies(insReport);
String primaryReportUrl = getPrimaryReportUrl(insReport);
String finalUrl = primaryReportUrl.replace("/word", wordUrl);
- Map<String, Object> ratifyMarks = new HashMap<String, Object>() {{
- put("ratifyUrl", ReportSignaturePictureUtils.create(imgUrl, signatureUrl));
- put("ratifyDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(null)).create());
- put("seal1", Pictures.ofLocal(imgUrl + "/" + sealUrl).create());
- put("seal2", Pictures.ofLocal(imgUrl + "/" + sealUrl).create());
- }};
- writeMarksToReportFiles(insReport, ratifyMarks);
+ Map<String, Object> ratifyMarks = new HashMap<>();
+ ratifyMarks.put("ratifyUrl", ReportSignaturePictureUtils.create(imgUrl, signatureUrl));
+ ratifyMarks.put("ratifyDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(null)).create());
+ if (reportSeal != null) {
+ ratifyMarks.put("seal1", createSealPicture(reportSeal.getAddress()));
+ ratifyMarks.put("seal2", createSealPicture(reportSeal.getAddress()));
+ }
+ writeApprovalMarksToReportFiles(insReport, ratifyMarks);
+
+ // 鍗扮珷蹇呴』浣跨敤娴姩瀹氫綅锛屽惁鍒欒鍐呭浘鐗囦細鎾戦珮娈佃惤/琛ㄦ牸骞舵敼鍙樺師鎶ュ憡鍒嗛〉銆�
+ for (String reportUrl : getApprovalReportUrls(insReport)) {
+ try {
+ ReportSealLayoutUtil.apply(
+ reportUrl.replace("/word", wordUrl),
+ reportSeal == null ? null : Paths.get(imgUrl, reportSeal.getAddress()).toString(),
+ maSeal == null ? null : Paths.get(imgUrl, maSeal.getAddress()).toString());
+ } catch (Exception e) {
+ log.error("鎶ュ憡鍗扮珷娴姩瀹氫綅澶辫触: {}", reportUrl, e);
+ throw new ErrorException("鎶ュ憡鐩栫珷澶辫触锛岃妫�鏌ュ嵃绔犲浘鐗囧拰鎶ュ憡鏂囦欢");
+ }
+ }
// 淇敼涓存椂pdf
insReport.setTempUrlPdf(primaryReportUrl.replace(".docx", ".pdf"));
@@ -508,7 +609,9 @@
insOrderMapper.updateById(insOrder);
for (String reportUrl : getApprovalReportUrls(insReport)) {
- wordToPdf(reportUrl.replace("/word", wordUrl), sealUrl,
+ wordToPdf(reportUrl.replace("/word", wordUrl),
+ null,
+ seamSeal == null ? null : seamSeal.getAddress(),
isRawMater && order.getOrderType().equals(InsOrderTypeConstants.ENTER_THE_FACTORY));
}
@@ -536,13 +639,105 @@
});
}
- return insReportMapper.updateById(insReport);
+ int affected = insReportMapper.updateById(insReport);
+ if (affected != 1) {
+ throw new ErrorException("鎶ュ憡鎵瑰噯鐘舵�佷繚瀛樺け璐�");
+ }
+ sealUsageLedgerService.recordApprovedReport(insReport);
+ return affected;
+ }
+
+ /**
+ * 瑙f瀽鎵瑰噯鏃堕�夋嫨鐨勫嵃绔狅紙閫楀彿鍒嗛殧鐨勫嵃绔爄d锛夈��
+ * 鏈紶鎴栧叏閮ㄦ棤鏁堟椂鍥為��鍒扮涓�涓惎鐢ㄥ嵃绔狅紙榛樿鈥�1鍙风珷鈥濓級銆�
+ */
+ private List<SealConfig> resolveSeals(String sealIds) {
+ List<SealConfig> chosen = new ArrayList<>();
+ if (StringUtils.isNotBlank(sealIds)) {
+ List<Integer> ids = new ArrayList<>();
+ for (String s : sealIds.split(",")) {
+ if (StringUtils.isNotBlank(s)) {
+ ids.add(Integer.valueOf(s.trim()));
+ }
+ }
+ if (!ids.isEmpty()) {
+ Map<Integer, SealConfig> byId = sealConfigMapper.selectBatchIds(ids).stream()
+ .collect(Collectors.toMap(SealConfig::getId, x -> x));
+ for (Integer sid : ids) {
+ SealConfig seal = byId.get(sid);
+ if (seal != null && Objects.equals(seal.getStatus(), 1)
+ && StringUtils.isNotBlank(seal.getAddress())) {
+ chosen.add(seal);
+ }
+ }
+ }
+ }
+ if (chosen.isEmpty()) {
+ List<SealConfig> enabled = sealConfigMapper.selectList(Wrappers.<SealConfig>lambdaQuery()
+ .eq(SealConfig::getStatus, 1).orderByAsc(SealConfig::getCode));
+ if (!enabled.isEmpty()) {
+ chosen.add(enabled.get(0));
+ }
+ }
+ if (chosen.isEmpty()) {
+ throw new ErrorException("鏈壘鍒板彲鐢ㄥ嵃绔狅紝璇峰厛鍦ㄥ嵃绔犵鐞嗕腑缁存姢骞跺惎鐢ㄥ嵃绔�");
+ }
+ return chosen;
+ }
+
+ private SealConfig resolveSeal(Integer sealId) {
+ if (sealId == null) {
+ return null;
+ }
+ SealConfig seal = sealConfigMapper.selectById(sealId);
+ if (seal == null) {
+ throw new ErrorException("鎵�閫夊嵃绔犱笉瀛樺湪锛岃閲嶆柊閫夋嫨");
+ }
+ if (!Objects.equals(seal.getStatus(), 1)) {
+ throw new ErrorException("鍗扮珷鈥�" + seal.getName() + "鈥濆凡鍋滅敤锛岃閲嶆柊閫夋嫨");
+ }
+ if (StringUtils.isBlank(seal.getAddress())) {
+ throw new ErrorException("鍗扮珷鈥�" + seal.getName() + "鈥濇湭涓婁紶鍥剧墖锛岃閲嶆柊閫夋嫨");
+ }
+ return seal;
+ }
+
+ /**
+ * 鎸夊浘鐗囧唴瀹硅瘑鍒嵃绔犳牸寮忥紝鍏煎鍘嗗彶鏁版嵁涓墿灞曞悕琚繚瀛樹负鈥淿png鈥濈瓑闈炴爣鍑嗘枃浠跺悕鐨勬儏鍐点��
+ */
+ private PictureRenderData createSealPicture(String sealUrl) {
+ Path sealPath = Paths.get(imgUrl, sealUrl);
+ if (!Files.isRegularFile(sealPath)) {
+ throw new ErrorException("鍗扮珷鍥剧墖鏂囦欢涓嶅瓨鍦紝璇烽噸鏂颁笂浼犲嵃绔犲浘鐗�");
+ }
+ try {
+ byte[] imageBytes = Files.readAllBytes(sealPath);
+ PictureType pictureType = PictureType.suggestFileType(imageBytes);
+ return Pictures.ofBytes(imageBytes, pictureType).create();
+ } catch (Exception e) {
+ log.error("璇诲彇鍗扮珷鍥剧墖澶辫触: {}", sealPath, e);
+ throw new ErrorException("鍗扮珷鍥剧墖鏃犳硶璇嗗埆锛岃閲嶆柊涓婁紶 jpg 鎴� png 鍥剧墖");
+ }
}
@Override
public int wordInsertUrl(Map<String, Object> map, String url) {
Configure configure = Configure.builder()
.setValidErrorHandler(new PreserveReportPicturePlaceholderHandler())
+ .build();
+ XWPFTemplate template = XWPFTemplate.compile(url, configure).render(map);
+ try {
+ template.writeAndClose(Files.newOutputStream(Paths.get(url)));
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ return 1;
+ }
+
+ private int wordInsertApprovalMarks(Map<String, Object> map, String url) {
+ Configure configure = Configure.builder()
+ .setValidErrorHandler(new PreserveReportPicturePlaceholderHandler(
+ new HashSet<>(Arrays.asList("seal1", "seal2"))))
.build();
XWPFTemplate template = XWPFTemplate.compile(url, configure).render(map);
try {
@@ -568,9 +763,70 @@
.collect(Collectors.toList());
}
+ /** 鎵瑰噯绔犲彧鍐欏叆鍓湰锛屼繚鐣欐棤鎵瑰噯绔犵殑瀹℃牳绋跨敤浜庢壒鍑嗗悗閫�鍥炰慨鏀广�� */
+ private void prepareApprovalCopies(InsReport report) {
+ String primarySource = getPrimaryReportUrl(report);
+ String inspectionSource = report.getInspectionUrl();
+ report.setReviewUrl(primarySource);
+ report.setReviewInspectionUrl(inspectionSource);
+ report.setUrlS(copyReportForApproval(primarySource));
+ if (StringUtils.isNotBlank(inspectionSource)) {
+ report.setInspectionUrl(copyReportForApproval(inspectionSource));
+ }
+ }
+
+ private String copyReportForApproval(String sourceUrl) {
+ try {
+ Path source = Paths.get(sourceUrl.replace("/word", wordUrl));
+ if (!Files.exists(source)) {
+ throw new ErrorException("寰呮壒鍑嗘姤鍛婃枃浠朵笉瀛樺湪");
+ }
+ String fileName = "approved-" + UUID.randomUUID() + ".docx";
+ Path target = Paths.get(wordUrl, fileName);
+ Files.createDirectories(target.getParent());
+ Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
+ return "/word/" + fileName;
+ } catch (ErrorException e) {
+ throw e;
+ } catch (Exception e) {
+ log.error("鍒涘缓鎶ュ憡鎵瑰噯鍓湰澶辫触: {}", sourceUrl, e);
+ throw new ErrorException("鍒涘缓鎶ュ憡鎵瑰噯鍓湰澶辫触");
+ }
+ }
+
+ private void refreshTemporaryPreviews(InsReport report) {
+ String primaryPdf = wordToPdfTemp(getPrimaryReportUrl(report).replace("/word", wordUrl));
+ if (StringUtils.isBlank(primaryPdf)) {
+ throw new ErrorException("妫�娴嬫姤鍛婇瑙堢敓鎴愬け璐�");
+ }
+ report.setTempUrlPdf("/word/" + primaryPdf);
+ if (StringUtils.isNotBlank(report.getInspectionUrl())) {
+ String inspectionPdf = wordToPdfTemp(report.getInspectionUrl().replace("/word", wordUrl));
+ if (StringUtils.isBlank(inspectionPdf)) {
+ throw new ErrorException("妫�楠屾姤鍛婇瑙堢敓鎴愬け璐�");
+ }
+ report.setInspectionTempUrlPdf("/word/" + inspectionPdf);
+ }
+ }
+
+ @Override
+ public String prepareEditedReportPreview(String absoluteDocxPath) {
+ String pdfName = wordToPdfTemp(absoluteDocxPath);
+ if (StringUtils.isBlank(pdfName)) {
+ throw new ErrorException("鎶ュ憡棰勮鐢熸垚澶辫触");
+ }
+ return "/word/" + pdfName;
+ }
+
private void writeMarksToReportFiles(InsReport report, Map<String, Object> marks) {
for (String reportUrl : getApprovalReportUrls(report)) {
wordInsertUrl(marks, reportUrl.replace("/word", wordUrl));
+ }
+ }
+
+ private void writeApprovalMarksToReportFiles(InsReport report, Map<String, Object> marks) {
+ for (String reportUrl : getApprovalReportUrls(report)) {
+ wordInsertApprovalMarks(marks, reportUrl.replace("/word", wordUrl));
}
}
@@ -638,7 +894,12 @@
throw new ErrorException("鎶ュ憡鏂囦欢涓嶅瓨鍦紝璇疯仈绯荤鐞嗗憳");
}
try {
- String filename = file.getFileName().toString();
+ // 鐗╃悊鏂囦欢鍙兘鏄� reviewed/edited UUID锛涘鐢ㄦ埛濮嬬粓浣跨敤涓氬姟鎶ュ憡缂栧彿銆�
+ String reportNumber = StringUtils.isBlank(report.getCode()) ? "鎶ュ憡" : report.getCode();
+ reportNumber = reportNumber.replaceAll("[\\\\/:*?\"<>|\\p{Cntrl}]", "-").trim();
+ String suffix = StringUtils.isNotBlank(report.getInspectionUrl())
+ ? (Objects.equals(reportType, INSPECTION_REPORT) ? "-妫�楠屾姤鍛�" : "-妫�娴嬫姤鍛�") : "";
+ String filename = reportNumber + suffix + ".docx";
String encodedName = URLEncoder.encode(filename, "UTF-8").replace("+", "%20");
response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + encodedName);
@@ -658,6 +919,82 @@
log.error("涓嬭浇鎶ュ憡澶辫触锛宺eportId={}", id, e);
throw new ErrorException("鎶ュ憡涓嬭浇澶辫触");
}
+ }
+
+ @Override
+ public void preview(Integer id, Integer reportType, Integer createOrderUser, HttpServletResponse response) {
+ int type = reportType == null ? DETECTION_REPORT : reportType;
+ if (id == null || (type != DETECTION_REPORT && type != INSPECTION_REPORT)) {
+ throw new ErrorException("鎶ュ憡鎴栨姤鍛婄被鍨嬩笉姝g‘");
+ }
+ InsReport report = insReportMapper.selectDownloadableReport(id, createOrderUser);
+ if (report == null) {
+ throw new ErrorException("鎶ュ憡涓嶅瓨鍦ㄣ�佸皻鏈敓鎴愭垨鏃犳潈鏌ョ湅");
+ }
+ String sourceUrl = type == INSPECTION_REPORT ? report.getInspectionUrl() : getPrimaryReportUrl(report);
+ if (StringUtils.isBlank(sourceUrl)) {
+ throw new ErrorException("鎶ュ憡鏂囦欢灏氭湭鐢熸垚");
+ }
+ try {
+ Path source = resolvePreviewFile(sourceUrl);
+ Path pdf;
+ if (Objects.equals(report.getIsRatify(), 1)) {
+ // 宸叉壒鍑嗘姤鍛婂繀椤讳娇鐢ㄦ壒鍑嗘椂鐢熸垚鐨� PDF锛屼繚鐣� PDF 涓撶敤鐨� MA 绔犲拰楠戠紳绔犮��
+ // inspectionTempUrlPdf 鍙兘浠嶆寚鍚戝鏍搁樁娈电殑涓存椂绋匡紝涓嶈兘浣滀负鏈夌珷鎶ュ憡杩斿洖銆�
+ pdf = resolvePreviewFile(sourceUrl.replaceFirst("(?i)\\.docx?$", ".pdf"));
+ if (pdf == null) {
+ throw new ErrorException("鏈夌珷鎶ュ憡 PDF 涓嶅瓨鍦紝璇烽噸鏂版壒鍑嗙敓鎴�");
+ }
+ } else {
+ pdf = resolvePreviewFile(type == INSPECTION_REPORT
+ ? report.getInspectionTempUrlPdf() : report.getTempUrlPdf());
+ if (source == null) throw new ErrorException("Word 鎶ュ憡鏂囦欢涓嶅瓨鍦�");
+ if (pdf == null || Files.getLastModifiedTime(pdf).compareTo(Files.getLastModifiedTime(source)) < 0) {
+ // 缂哄皯棰勮鎴� Word 鏇存柊鍚庡啀杞崲锛涘悓涓�鐗堟湰閲嶅鏌ョ湅澶嶇敤缂撳瓨锛屼笉鏀瑰鎵规暟鎹��
+ Path directory = Paths.get(wordUrl).toAbsolutePath().normalize().resolve("preview");
+ Files.createDirectories(directory);
+ String version = source + ":" + Files.size(source) + ":" + Files.getLastModifiedTime(source);
+ String name = UUID.nameUUIDFromBytes(version.getBytes(java.nio.charset.StandardCharsets.UTF_8)) + ".pdf";
+ pdf = directory.resolve(name);
+ if (!Files.isRegularFile(pdf)) {
+ Path temporary = Files.createTempFile(directory, "report-", ".pdf");
+ try {
+ if (wordToPdf(source.toString(), temporary.toString()) == null) {
+ throw new ErrorException("鎶ュ憡杞� PDF 澶辫触锛岃鑱旂郴绠$悊鍛�");
+ }
+ Files.move(temporary, pdf, StandardCopyOption.REPLACE_EXISTING);
+ } finally {
+ Files.deleteIfExists(temporary);
+ }
+ }
+ }
+ }
+ String filename = (StringUtils.isBlank(report.getCode()) ? "鎶ュ憡" : report.getCode())
+ .replaceAll("[\\\\/:*?\"<>|\\p{Cntrl}]", "-")
+ + (type == INSPECTION_REPORT ? "-妫�楠屾姤鍛�.pdf" : "-妫�娴嬫姤鍛�.pdf");
+ response.setContentType("application/pdf");
+ response.setHeader("Content-Disposition", "inline; filename*=UTF-8''"
+ + URLEncoder.encode(filename, "UTF-8").replace("+", "%20"));
+ response.setHeader("Cache-Control", "no-store");
+ response.setContentLengthLong(Files.size(pdf));
+ Files.copy(pdf, response.getOutputStream());
+ } catch (IOException e) {
+ log.error("鎶ュ憡棰勮澶辫触锛宺eportId={}", id, e);
+ throw new ErrorException("鎶ュ憡棰勮澶辫触锛岃鑱旂郴绠$悊鍛�");
+ }
+ }
+
+ /** 鍙鍙栨姤鍛婄洰褰曞唴鐨勬枃浠讹紝缂哄け鏂囦欢浜ょ敱璋冪敤鏂瑰鐞嗐�� */
+ private Path resolvePreviewFile(String url) throws IOException {
+ if (StringUtils.isBlank(url)) return null;
+ String path = url.replace('\\', '/');
+ if (!path.startsWith("/word/")) throw new ErrorException("鎶ュ憡鏂囦欢鍦板潃涓嶆纭�");
+ Path root = Paths.get(wordUrl).toAbsolutePath().normalize();
+ Path file = root.resolve(path.substring("/word/".length())).normalize();
+ if (!file.startsWith(root)) throw new ErrorException("鎶ュ憡鏂囦欢鍦板潃涓嶆纭�");
+ if (!Files.isRegularFile(file)) return null;
+ if (!file.toRealPath().startsWith(root.toRealPath())) throw new ErrorException("鎶ュ憡鏂囦欢鍦板潃涓嶆纭�");
+ return file;
}
//鎵归噺涓婁紶
@@ -775,16 +1112,17 @@
}
@Override
- public void wordToPdf(String path, String sealUrl, boolean isRawMater) {
+ public void wordToPdf(String path, String maSealUrl, String seamSealUrl, boolean isRawMater) {
try {
- wordToPdf(path, path.replace(".docx", ".pdf"), sealUrl, isRawMater);
+ wordToPdf(path, path.replace(".docx", ".pdf"), maSealUrl, seamSealUrl, isRawMater);
} catch (Exception e) {
throw new ErrorException("杞崲澶辫触");
}
}
- public String wordToPdf(String wordPath, String pdfPath, String sealUrl, boolean isRawMater) {
+ public String wordToPdf(String wordPath, String pdfPath, String maSealUrl,
+ String seamSealUrl, boolean isRawMater) {
FileOutputStream os = null;
try {
//鍑瘉 涓嶇劧鍒囨崲鍚庢湁姘村嵃
@@ -795,27 +1133,31 @@
log.info("License楠岃瘉涓嶉�氳繃...");
return null;
}
- //鐢熸垚涓�涓┖鐨凱DF鏂囦欢
- File file;
- //鍒ゆ柇鏄惁鏄繘鍘傛姤鍛�
- if (!isRawMater) {
- file = new File(pdfPath.replace(".pdf", "-1.pdf"));
- } else {
- file = new File(pdfPath.replace(".pdf", ".pdf"));
- }
+ String effectiveSeamSealUrl = isRawMater ? null : seamSealUrl;
+ boolean addPdfMarks = StringUtils.isNotBlank(maSealUrl)
+ || StringUtils.isNotBlank(effectiveSeamSealUrl);
+ String sourcePdfPath = addPdfMarks ? pdfPath.replace(".pdf", "-stamp-source.pdf") : pdfPath;
+ File file = new File(sourcePdfPath);
os = new FileOutputStream(file);
//瑕佽浆鎹㈢殑word鏂囦欢
com.aspose.words.Document doc = new com.aspose.words.Document(wordPath);
doc.save(os, SaveFormat.PDF);
+ os.close();
+ os = null;
- //娣诲姞楠戠紳绔�
- if (!isRawMater) {
- stamperCheckMarkPDF(pdfPath.replace(".pdf", "-1.pdf"), pdfPath, imgUrl + "/" + sealUrl);
+ // MA绔犲浐瀹氬湪绗�1椤靛乏涓婅锛涢獞缂濈珷鎸夐〉鍒囩墖鍥哄畾鍦ㄥ彸渚т腑閮ㄣ��
+ if (addPdfMarks) {
+ stamperReportMarksPDF(
+ sourcePdfPath,
+ pdfPath,
+ StringUtils.isBlank(maSealUrl) ? null : Paths.get(imgUrl, maSealUrl).toString(),
+ StringUtils.isBlank(effectiveSeamSealUrl)
+ ? null : Paths.get(imgUrl, effectiveSeamSealUrl).toString());
}
-
-
+ return new File(pdfPath).getName();
} catch (Exception e) {
- e.printStackTrace();
+ log.error("鐢熸垚鐩栫珷PDF澶辫触: {}", wordPath, e);
+ throw new ErrorException("鎶ュ憡杞琍DF鎴栫洊绔犲け璐�");
} finally {
if (os != null) {
try {
@@ -825,7 +1167,6 @@
}
}
}
- return null;
}
/**
@@ -850,7 +1191,8 @@
subImg = img.getSubimage(i * sw, 0, sw, h);
}
ByteArrayOutputStream out = new ByteArrayOutputStream();
- ImageIO.write(subImg, Path.substring(Path.lastIndexOf('.') + 1), out);
+ // 缁熶竴缂栫爜涓� PNG锛屽吋瀹瑰巻鍙测�淿png鈥濈瓑娌℃湁鏍囧噯鎵╁睍鍚嶇殑鍥剧墖鏂囦欢銆�
+ ImageIO.write(subImg, "png", out);
nImage[i] = com.itextpdf.text.Image.getInstance(out.toByteArray());
}
@@ -858,33 +1200,46 @@
}
/**
- * 鐩栭獞缂濈珷
+ * 鎸夊弬鑰冩姤鍛婄洊 PDF 鏍囧織绔狅細MA绔犱綅浜庣1椤靛乏涓婅锛岄獞缂濈珷浣嶄簬姣忛〉鍙充晶涓儴銆�
*
* @param infilePath 鍘烶DF璺緞
* @param outFilePath 杈撳嚭PDF璺緞
*/
- public static void stamperCheckMarkPDF(String infilePath, String outFilePath, String picPath) throws IOException, DocumentException {
+ public static void stamperReportMarksPDF(String infilePath, String outFilePath,
+ String maPicPath, String seamPicPath)
+ throws IOException, DocumentException {
PdfReader reader = new PdfReader(infilePath);//閫夋嫨闇�瑕佸嵃绔犵殑pdf
PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(outFilePath));//鍔犲畬鍗扮珷鍚庣殑pdf
-
- com.itextpdf.text.Rectangle pageSize = reader.getPageSize(1);//鑾峰緱绗竴椤�
- float height = pageSize.getHeight();
- float width = pageSize.getWidth();
-
int nums = reader.getNumberOfPages();
- com.itextpdf.text.Image[] nImage = slicingImages(picPath, nums);//鐢熸垚楠戠紳绔犲垏鍓插浘鐗�
+ boolean hasMaSeal = maPicPath != null && !maPicPath.trim().isEmpty();
+ boolean hasSeamSeal = seamPicPath != null && !seamPicPath.trim().isEmpty();
+ com.itextpdf.text.Image[] seamImages = hasSeamSeal ? slicingImages(seamPicPath, nums) : null;
for (int n = 1; n <= nums; n++) {
+ com.itextpdf.text.Rectangle pageSize = reader.getPageSize(n);
+ float height = pageSize.getHeight();
+ float width = pageSize.getWidth();
PdfContentByte over = stamp.getOverContent(n);//璁剧疆鍦ㄧ鍑犻〉鎵撳嵃鍗扮珷
- com.itextpdf.text.Image img = nImage[n - 1];//閫夋嫨鍥剧墖
- float newHeight = 100f;
- float newWidth = img.getWidth() / (img.getHeight() / 100);
- img.scaleAbsolute(newWidth, newHeight);//鎺у埗鍥剧墖澶у皬
- img.setAbsolutePosition(width - newWidth, height / 2 - newHeight / 2);//鎺у埗鍥剧墖浣嶇疆
- over.addImage(img);
+
+ if (n == 1 && hasMaSeal) {
+ com.itextpdf.text.Image maImage = com.itextpdf.text.Image.getInstance(maPicPath);
+ maImage.scaleToFit(100f, 90f);
+ maImage.setAbsolutePosition(30f, height - maImage.getScaledHeight() - 30f);
+ over.addImage(maImage);
+ }
+
+ if (hasSeamSeal) {
+ com.itextpdf.text.Image seamImage = seamImages[n - 1];
+ float newHeight = 100f;
+ float newWidth = seamImage.getWidth() / (seamImage.getHeight() / newHeight);
+ seamImage.scaleAbsolute(newWidth, newHeight);
+ seamImage.setAbsolutePosition(width - newWidth, height / 2 - newHeight / 2);
+ over.addImage(seamImage);
+ }
}
stamp.close();
+ reader.close();
}
@Override
@@ -1009,36 +1364,172 @@
return unqualifiedCount;
}
- /**
- * 閫�鍥炲埌妫�楠屼换鍔�
- * @param id
- * @return
- */
@Override
@Transactional(rollbackFor = Exception.class)
- public boolean sendBackTask(Integer id) {
- InsReport report = insReportMapper.selectById(id);
- // 鏍规嵁璁㈠崟鏌ヨ璇曢獙瀹�
- String laboratory = insOrderMapper.selectLaboratoryByOrderId(report.getInsOrderId());
+ public boolean sendBackTask(Integer id, String target, String reason) {
+ if (id == null || (!RETURN_TO_INSPECTION_TASK.equals(target)
+ && !RETURN_TO_REPORT_REVIEW.equals(target))) {
+ throw new ErrorException("閫�鍥炲弬鏁颁笉姝g‘");
+ }
+ if (StringUtils.isBlank(reason)) {
+ throw new ErrorException("璇疯緭鍏ラ��鍥炲師鍥�");
+ }
- // 淇敼璁㈠崟鐘舵��
+ InsReport report = insReportMapper.selectOne(Wrappers.<InsReport>lambdaQuery()
+ .eq(InsReport::getId, id)
+ .last("FOR UPDATE"));
+ if (report == null || report.getInsOrderId() == null) {
+ throw new ErrorException("鎶ュ憡涓嶅瓨鍦ㄦ垨鏈叧鑱旀楠屽崟");
+ }
+ if (!Objects.equals(report.getIsPass(), 1)) {
+ throw new ErrorException("鎶ュ憡宸查��鍑烘姤鍛婃祦绋嬶紝璇峰嬁閲嶅閫�鍥�");
+ }
+
+ LocalDateTime returnTime = LocalDateTime.now();
+ recordReportReturn(report, target, reason, returnTime);
+
+ if (RETURN_TO_REPORT_REVIEW.equals(target)) {
+ if (!Objects.equals(report.getIsRatify(), 1)) {
+ throw new ErrorException("鍙湁宸叉壒鍑嗘姤鍛婂彲浠ラ��鍥炲埌鎶ュ憡瀹℃牳");
+ }
+ String reviewUrl = report.getReviewUrl();
+ String reviewInspectionUrl = report.getReviewInspectionUrl();
+ if (StringUtils.isBlank(reviewUrl)) {
+ reviewUrl = prepareLegacyApprovedReportForReview(report,
+ StringUtils.isNotBlank(report.getUrlS()) ? report.getUrlS() : report.getUrl());
+ if (StringUtils.isNotBlank(report.getInspectionUrl())) {
+ reviewInspectionUrl = prepareLegacyApprovedReportForReview(report, report.getInspectionUrl());
+ }
+ }
+ int affected = insReportMapper.update(null, Wrappers.<InsReport>lambdaUpdate()
+ .eq(InsReport::getId, id)
+ .eq(InsReport::getIsRatify, 1)
+ .set(InsReport::getState, 1)
+ .set(InsReport::getIsExamine, RETURNED_STATUS)
+ .set(InsReport::getExamineTime, returnTime)
+ .set(InsReport::getExamineTell, reason)
+ .set(InsReport::getIsRatify, RETURNED_STATUS)
+ .set(InsReport::getRatifyTime, returnTime)
+ .set(InsReport::getRatifyTell, reason)
+ .set(InsReport::getUrlS, Objects.equals(reviewUrl, report.getUrl()) ? null : reviewUrl)
+ .set(StringUtils.isNotBlank(reviewInspectionUrl), InsReport::getInspectionUrl,
+ reviewInspectionUrl)
+ .set(InsReport::getReviewUrl, null)
+ .set(InsReport::getReviewInspectionUrl, null)
+ .set(InsReport::getTempUrlPdf, null)
+ .set(InsReport::getInspectionTempUrlPdf, null));
+ if (affected != 1) {
+ throw new ErrorException("鎶ュ憡鐘舵�佸凡鍙樺寲锛岃鍒锋柊鍚庨噸璇�");
+ }
+ expireReportEditSessions(id);
+ return true;
+ }
+
+ if (!Objects.equals(report.getState(), 1) && !Objects.equals(report.getIsRatify(), 1)) {
+ throw new ErrorException("褰撳墠鎶ュ憡涓嶅湪瀹℃牳鎴栧凡鎵瑰噯鐘舵�侊紝涓嶈兘閫�鍥炴楠屼换鍔�");
+ }
+
+ InsOrder order = insOrderMapper.selectById(report.getInsOrderId());
+ if (order == null) {
+ throw new ErrorException("鎶ュ憡鍏宠仈鐨勬楠屽崟涓嶅瓨鍦�");
+ }
+ boolean hadApproval = report.getIsRatify() != null;
+
+ // 鎭㈠璁㈠崟涓荤姸鎬侊紝鍚﹀垯妫�楠屼换鍔℃煡璇㈣姹� io.state=1 鏃朵粛鏃犳硶鎵惧埌璇ヤ换鍔°��
+ insOrderMapper.update(null, Wrappers.<InsOrder>lambdaUpdate()
+ .eq(InsOrder::getId, report.getInsOrderId())
+ .set(InsOrder::getState, 1)
+ .set(InsOrder::getInsState, 4));
+
+ // 鏁翠唤鎶ュ憡鐢辫鍗曚笅鍚勮瘯楠屽鍏卞悓褰㈡垚锛岄��鍥炲悗鍚勬楠屽鍧囧洖鍒板彲淇敼銆侀噸鏂版彁浜ゅ鏍哥殑鐘舵�併��
insOrderStateMapper.update(null, Wrappers.<InsOrderState>lambdaUpdate()
.eq(InsOrderState::getInsOrderId, report.getInsOrderId())
- .eq(InsOrderState::getLaboratory, laboratory)
- .set(InsOrderState::getInsState, 4));
+ .set(InsOrderState::getInsState, 4)
+ .set(InsOrderState::getVerifyUser, null)
+ .set(InsOrderState::getVerifyTell, reason));
- Integer insSampleId = insSampleUserMapper.selectOne(Wrappers.<InsSampleUser>lambdaQuery()
+ // 鍙挙閿�澶嶆牳浜轰换鍔★紝淇濈暀鍚勬楠屽鍘熸楠屼汉锛岄伩鍏嶉��鍥炲悗浠诲姟鏃犱汉鍙銆�
+ insSampleUserMapper.delete(Wrappers.<InsSampleUser>lambdaQuery()
.eq(InsSampleUser::getInsSampleId, report.getInsOrderId())
- .orderByDesc(InsSampleUser::getId)
- .last("limit 1")).getId();
- insSampleUserMapper.deleteById(insSampleId);
+ .eq(InsSampleUser::getState, 1));
- // 淇敼鎶ュ憡琛屼负鏈樉绀�
+ // 鎶ュ憡鏆傛椂閫�鍑虹紪鍒跺垪琛ㄣ�傚師濮嬫暟鎹鏍搁�氳繃鍚庯紝鐜版湁娴佺▼浼氭仮澶嶆姤鍛婂苟閲嶆柊鎻愪氦瀹℃牳銆�
insReportMapper.update(null, Wrappers.<InsReport>lambdaUpdate()
.eq(InsReport::getId, id)
- .set(InsReport::getIsPass, 0));
+ .set(InsReport::getIsPass, 0)
+ .set(InsReport::getState, 0)
+ .set(InsReport::getIsExamine, RETURNED_STATUS)
+ .set(InsReport::getExamineTime, returnTime)
+ .set(InsReport::getExamineTell, reason)
+ .set(InsReport::getIsRatify, hadApproval ? RETURNED_STATUS : null)
+ .set(InsReport::getRatifyTime, hadApproval ? returnTime : null)
+ .set(InsReport::getRatifyTell, reason)
+ .set(InsReport::getUrlS, null)
+ .set(InsReport::getReviewUrl, null)
+ .set(InsReport::getReviewInspectionUrl, null)
+ .set(InsReport::getTempUrlPdf, null)
+ .set(InsReport::getInspectionTempUrlPdf, null));
- return false;
+ expireReportEditSessions(id);
+ return true;
+ }
+
+ private String prepareLegacyApprovedReportForReview(InsReport report, String approvedUrl) {
+ if (StringUtils.isBlank(approvedUrl)) {
+ throw new ErrorException("鍘嗗彶鎵瑰噯鎶ュ憡鏂囦欢涓嶅瓨鍦紝鏃犳硶閫�鍥炴姤鍛婂鏍�");
+ }
+ try {
+ Path source = Paths.get(approvedUrl.replace("/word", wordUrl));
+ String fileName = "returned-" + UUID.randomUUID() + ".docx";
+ Path target = Paths.get(wordUrl, fileName);
+ Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
+
+ ReportSealLayoutUtil.restoreForReview(target.toString());
+ return "/word/" + fileName;
+ } catch (Exception e) {
+ log.error("鍘嗗彶鎵瑰噯鎶ュ憡鎭㈠瀹℃牳绋垮け璐�: {}", approvedUrl, e);
+ throw new ErrorException("鍘嗗彶鎵瑰噯鎶ュ憡鏃犳硶娓呴櫎鏃ф壒鍑嗕俊鎭紝璇烽��鍥炴楠屼换鍔¢噸鏂扮敓鎴�");
+ }
+ }
+
+ private void recordReportReturn(InsReport report, String target, String reason,
+ LocalDateTime returnTime) {
+ recordReportReturn(report,
+ Objects.equals(report.getIsRatify(), 1) ? "APPROVED" : "REPORT_REVIEW",
+ target, reason, returnTime);
+ }
+
+ private void recordReportReturn(InsReport report, String fromStage, String target, String reason,
+ LocalDateTime returnTime) {
+ InsReportReturnRecord record = new InsReportReturnRecord();
+ record.setReportId(report.getId());
+ record.setInsOrderId(report.getInsOrderId());
+ record.setFromStage(fromStage);
+ record.setTargetStage(target);
+ record.setReturnReason(reason.trim());
+ record.setState(report.getState());
+ record.setIsExamine(report.getIsExamine());
+ record.setExamineTime(report.getExamineTime());
+ record.setIsRatify(report.getIsRatify());
+ record.setRatifyTime(report.getRatifyTime());
+ record.setReportUrl(StringUtils.isNotBlank(report.getUrlS()) ? report.getUrlS() : report.getUrl());
+ record.setInspectionUrl(report.getInspectionUrl());
+ record.setTempUrlPdf(report.getTempUrlPdf());
+ record.setInspectionTempUrlPdf(report.getInspectionTempUrlPdf());
+ record.setOperatorId(SecurityUtils.getUserId().intValue());
+ record.setCreateTime(returnTime);
+ if (insReportReturnRecordMapper.insert(record) != 1) {
+ throw new ErrorException("鎶ュ憡閫�鍥炶褰曚繚瀛樺け璐�");
+ }
+ }
+
+ private void expireReportEditSessions(Integer reportId) {
+ insReportEditSessionMapper.update(null, Wrappers.<InsReportEditSession>lambdaUpdate()
+ .eq(InsReportEditSession::getReportId, reportId)
+ .in(InsReportEditSession::getStatus, "EDITING", "SAVED", "FAILED", "SAVE_REQUESTED")
+ .set(InsReportEditSession::getStatus, "EXPIRED")
+ .set(InsReportEditSession::getMessage, "鎶ュ憡宸查��鍥�")
+ .set(InsReportEditSession::getUpdateTime, LocalDateTime.now()));
}
/**
--
Gitblit v1.9.3