From 596834ce4e233130d61888128fe66a0c008543dd Mon Sep 17 00:00:00 2001
From: yxh <172933527@qq.com>
Date: 星期二, 13 十月 2026 09:15:51 +0800
Subject: [PATCH] 修改了报销校验
---
ruoyi-admin/src/main/java/com/ruoyi/web/controller/project/ServiceDocumentfilesController.java | 72 ++++++++++++++++++++++++
ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceFundServiceImpl.java | 35 +++++++++--
ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceReimbursementServiceImpl.java | 40 ++++++++++--
3 files changed, 131 insertions(+), 16 deletions(-)
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/project/ServiceDocumentfilesController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/project/ServiceDocumentfilesController.java
index 349b078..9c7bae0 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/project/ServiceDocumentfilesController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/project/ServiceDocumentfilesController.java
@@ -1,5 +1,6 @@
package com.ruoyi.web.controller.project;
+import java.io.File;
import java.util.Arrays;
import java.util.List;
@@ -23,8 +24,13 @@
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.project.domain.ServiceDocumentfiles;
import com.ruoyi.project.service.IServiceDocumentfilesService;
+import com.ruoyi.common.config.RuoYiConfig;
+import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.framework.config.ServerConfig;
+import org.springframework.mock.web.MockMultipartFile;
+import org.springframework.web.multipart.MultipartFile;
/**
* 鎹愮尞闄勪欢Controller
@@ -40,6 +46,72 @@
@Autowired
private IServiceDocumentfilesService serviceDocumentfilesService;
+ @Autowired
+ private ServerConfig serverConfig;
+
+ /**
+ * 鏀跨瓥鏂囦欢涓婁紶锛�**涓嶉檺鏂囦欢绫诲瀷**锛夈��
+ *
+ * <p>2026-10-09 涓氬姟瑕佹眰锛氭斂绛栨枃浠舵ā鍧楀厑璁镐笂浼�/涓嬭浇浠绘剰鏂囦欢绫诲瀷銆�
+ *
+ * <p>涓轰粈涔堜笉鐩存帴鐢� {@code /common/upload}锛氶�氱敤涓婁紶璧�
+ * {@code FileUploadUtils.upload(baseDir, file)}锛屼細鎸� {@code MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION}
+ * 鐧藉悕鍗曟牎楠屾墿灞曞悕锛岄潪鐧藉悕鍗曠被鍨嬶紙濡� dwg銆�7z銆乷fd銆乪ml 绛夛級浼氳鎷掔粷銆�
+ * 杩欓噷鎶� allowedExtension 鏄惧紡浼� {@code null} 鈥斺�� {@code assertAllowed} 鐨勫垽鏂槸
+ * {@code allowedExtension != null && !isAllowedExtension(...)}锛屼紶 null 鍗宠烦杩囨墿灞曞悕鏍¢獙锛�
+ * 鍚屾椂**浠嶄繚鐣�** 500MB 澶у皬闄愬埗銆佹枃浠跺悕闀垮害闄愬埗涓庡瓨鍌ㄨ矾寰勫畨鍏ㄥ鐞嗐��
+ *
+ * <p>浠呮斂绛栨枃浠舵ā鍧椾娇鐢ㄦ湰鎺ュ彛锛泏@code /common/upload} 涓庡叾浠栨ā鍧楃殑鐧藉悕鍗曚繚鎸佷笉鍙樸��
+ *
+ * @param file 涓婁紶鏂囦欢
+ * @return 涓� {@code /common/upload} 涓�鑷寸殑杩斿洖浣擄紙code/msg/fileName/url锛�
+ */
+ @ApiOperation("鏀跨瓥鏂囦欢涓婁紶锛堜笉闄愭枃浠剁被鍨嬶級")
+ @PostMapping("/upload")
+ public AjaxResult uploadFile(MultipartFile file) {
+ String originalFilename = file == null ? null : file.getOriginalFilename();
+ try {
+ if (file == null || file.isEmpty()) {
+ return AjaxResult.error("涓婁紶鏂囦欢涓虹┖锛岃閲嶆柊閫夋嫨鏂囦欢");
+ }
+ // 涓婁紶鏂囦欢璺緞
+ String filePath = RuoYiConfig.getUploadPath();
+
+ // 鍚屽悕鏂囦欢澶勭悊锛氬姞鏃堕棿鎴抽噸鍛藉悕锛岄伩鍏嶈鐩栧凡涓婁紶鏂囦欢锛堜笌閫氱敤涓婁紶淇濇寔涓�鑷达級
+ String filename = originalFilename == null ? "" : originalFilename.trim();
+ String pathFileName = FileUploadUtils.extractFilename(file);
+ File target = new File(filePath + "/" + pathFileName);
+ if (target.exists()) {
+ int i = filename.lastIndexOf(".");
+ if (i > -1) {
+ String startStr = filename.substring(0, i);
+ String endStr = filename.substring(i);
+ String newFilename = startStr + System.currentTimeMillis() + endStr;
+ file = new MockMultipartFile(newFilename, newFilename, file.getContentType(), file.getBytes());
+ }
+ }
+
+ // allowedExtension 浼� null锛氫笉鍋氭墿灞曞悕鏍¢獙锛屽厑璁镐换鎰忔枃浠剁被鍨�
+ String relativePath = FileUploadUtils.upload(filePath, file, null);
+
+ // 涓庨�氱敤涓婁紶涓�鑷寸殑 url 澶勭悊锛堥儴鍒嗛儴缃蹭笅 8032 闇�瑕佸甫 /prod-api 鍓嶇紑锛�
+ String url = serverConfig.getUrl();
+ if (url != null && url.contains("8032")) {
+ url = url.replace("8032", "8032/prod-api");
+ }
+
+ log.info("鏀跨瓥鏂囦欢涓婁紶鎴愬姛锛氬師濮嬫枃浠跺悕={}锛屽瓨鍌ㄨ矾寰�={}", filename, relativePath);
+ AjaxResult ajax = AjaxResult.success();
+ ajax.put("fileName", relativePath);
+ ajax.put("url", url + relativePath);
+ return ajax;
+ } catch (Exception e) {
+ // 杩斿洖 AjaxResult锛圚TTP 200 + code=500锛夛紝鍓嶇 uploadSccess 鐨� else 鍒嗘敮浼氭妸鍘熷洜寮瑰嚭鏉�
+ log.error("鏀跨瓥鏂囦欢涓婁紶澶辫触锛氬師濮嬫枃浠跺悕={}", originalFilename, e);
+ return AjaxResult.error("涓婁紶澶辫触锛�" + e.getMessage());
+ }
+ }
+
/**
* 鏌ヨ鎹愮尞闄勪欢鍒楄〃
*/
diff --git a/ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceFundServiceImpl.java b/ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceFundServiceImpl.java
index 296e3ec..d4ca8c4 100644
--- a/ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceFundServiceImpl.java
+++ b/ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceFundServiceImpl.java
@@ -609,8 +609,16 @@
sysUsers = sysUserMapper.selectUserByUserName(user.getUserName());
log.info("璐圭敤sysUsers杩斿洖鐨勫�间负:{}", sysUsers);
}
- if (checkFundVO.getFlowconclusion() == 1 && sysUsers != null && sysUsers.getRoles() != null && sysUsers.getRoles().stream().anyMatch(role -> "officedirector".equals(role.getRoleKey()))) {
- serviceFund.setOfficedirector(user.getNickName());
+ // 2026-10-09锛氭帹閫佹潯浠剁敱"褰撳墠瀹℃牳浜烘湁 officedirector 瑙掕壊"鏀逛负"鏈瀹℃壒鍚庡埌杈炬渶鍚庝竴绾�"銆�
+ // 鍘熷啓娉曞湪"鏈�鍚庝竴绾у鏍镐汉娌℃湁璇ヨ鑹�"鏃舵案杩滀笉浼氭帹閫侊紝鑰�"闈炴渶鍚庝竴绾х殑 officedirector"浼氭彁鍓嶆帹閫併��
+ boolean uploadAtLastLevel = checkFundVO.getFlowconclusion() == 1
+ && TotalLevel != null && TotalLevel != 0 && TotalLevel == OriginalFlowLevel + 1;
+ if (uploadAtLastLevel) {
+ // 浠嶅彧鍦ㄨ瑙掕壊瀹℃壒鏃惰褰曞姙鍏涓讳换锛屼繚鎸佸瓧娈佃涔変笉鍙�
+ if (sysUsers != null && sysUsers.getRoles() != null
+ && sysUsers.getRoles().stream().anyMatch(role -> "officedirector".equals(role.getRoleKey()))) {
+ serviceFund.setOfficedirector(user.getNickName());
+ }
serviceFund.setUploadStates(1);
//鏁版嵁鍙戦��
Boolean aBoolean1 = null;
@@ -709,8 +717,12 @@
}
private Boolean doSendData(ServiceFund serviceFund) {
- // fund鍜宖unddetail鐨勬暟鎹幏鍙�
- addFundSharedInfo(serviceFund.getId());
+ // 2026-10-09锛氭帴浣� addFundSharedInfo 鐨勫け璐ヤ俊鍙凤紙闄勪欢涓婁紶澶辫触鏃跺畠浼氬洖婊氬垎浜〃骞惰繑鍥� false锛�
+ Boolean sharedOk = addFundSharedInfo(serviceFund.getId());
+ if (sharedOk == null || !sharedOk) {
+ log.error("璐圭敤鎶ラ攢鍗曚笂浼犲け璐ワ細鍒嗕韩琛�/闄勪欢鐜妭澶辫触锛屽鎵逛笉鐢熸晥锛宖undId={}", serviceFund.getId());
+ return false;
+ }
List<ServiceFundShared> fundShareInfos = serviceFundSharedMapper.getFundShareInfoById(serviceFund.getId());
if (CollectionUtils.isEmpty(fundShareInfos)) return false;
@@ -1011,11 +1023,10 @@
try {
if (isUploadOaEnabled()) uploadOAFileAndUpdateDb(serviceFunddetailShareds.get(i));
} catch (Exception e) {
- e.printStackTrace();
- log.error("Exception涓叆鍙傜殑ID涓猴細{},寮傚父淇℃伅涓� 锛� {}", id, e.getMessage());
+ log.error("璐圭敤闄勪欢涓婁紶鍖婚櫌鍗忓弸绯荤粺澶辫触锛氬崟鎹甶d={}锛堟湰娆℃姤閿�鍗曚笂浼犳暣浣撳け璐ワ紝瀹℃壒涓嶇敓鏁堬級", id, e);
if (id != null) {
Boolean aBoolean = sharedService.delfundsharedInfoById(null, id);
- log.error("fund2鍒嗕韩琛ㄩ噷鐨勬暟鎹槸鍚﹀垹闄ゆ垚鍔燂細{}", aBoolean);
+ log.error("宸插洖婊氬垎浜〃鏁版嵁锛歿}", aBoolean);
}
return false;
}
@@ -1860,10 +1871,18 @@
log.info("filePath鐨勪慨鏀�:{}", filePath);
String url = rbDetailFile.getUrl();
//file鐢ㄧ殑鏄粷瀵逛綅缃�
- String substring = url.substring(url.indexOf("/profile/upload") + "/profile/upload".length());
+ // 2026-10-09锛氶檮浠跺湴鍧�瑙f瀽鍔犲浐锛岄伩鍏� url 寮傚父/鏂囦欢缂哄け鏃舵姏 NPE 瀵艰嚧鐪嬩笉鍒板け璐ュ師鍥�
+ int profileIdx = url == null ? -1 : url.indexOf("/profile/upload");
+ if (profileIdx < 0) {
+ throw new ServiceException("闄勪欢鍦板潃鏍煎紡涓嶆纭紙缂哄皯 /profile/upload锛夛紝鏃犳硶涓婁紶鍗忓弸锛�" + url);
+ }
+ String substring = url.substring(profileIdx + "/profile/upload".length());
// String strFile = rbDetailFile.getUrl().replace(filePath, "/profile/upload");
System.out.println("fund鏈嶅姟鐨刦ilePath + substring: " + filePath + substring);
File filetest = new File(filePath + substring);
+ if (!filetest.exists()) {
+ throw new ServiceException("闄勪欢鏂囦欢鍦ㄦ湇鍔″櫒涓婁笉瀛樺湪锛屾棤娉曚笂浼犲崗鍙嬶細" + filetest.getAbsolutePath());
+ }
String struploadResult = HttpClientKit.sendPostWithFile(filetest, strFUrl);
log.info("绗笁鏂逛紶鍥炵殑鏁版嵁: {}", struploadResult);
diff --git a/ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceReimbursementServiceImpl.java b/ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceReimbursementServiceImpl.java
index bbb0cb4..da7369f 100644
--- a/ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceReimbursementServiceImpl.java
+++ b/ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceReimbursementServiceImpl.java
@@ -293,12 +293,12 @@
//濡傛灉鏄湰鍦扮幆澧冿紝灏变笉璋冭繖涓簡
if (isUploadOaEnabled()) uploadOAFileAndUpdateDb(serviceReimbursementdetailShareds.get(i));
} catch (Exception e) {
- log.error("Exception涓璻eimShare鐨勫叆鍙俰d涓猴細{}", serviceReimbursementShared.getId());
+ log.error("宸梾闄勪欢涓婁紶鍖婚櫌鍗忓弸绯荤粺澶辫触锛氬垎浜玦d={}锛屾槑缁�={}锛堟湰娆℃姤閿�鍗曚笂浼犳暣浣撳け璐ワ紝瀹℃壒涓嶇敓鏁堬級",
+ serviceReimbursementShared.getId(), serviceReimbursementdetailShareds.get(i), e);
if (serviceReimbursementShared.getId() != null) {
Boolean aBoolean = sharedService.delResharedInfoById(serviceReimbursementShared.getId());
- log.error("鏂囦欢涓婁紶澶辫触锛屽皢鍒嗕韩琛ㄦ暟鎹洖婊氾細{}", aBoolean);
+ log.error("宸插洖婊氬垎浜〃鏁版嵁锛歿}", aBoolean);
}
- e.getMessage();
return false;
}
@@ -543,8 +543,16 @@
log.info("宸梾sysUsers杩斿洖鐨勫�间负:{}", sysUser);
}
- if (checkFundVO.getFlowconclusion() == 1 && Objects.nonNull(sysUser) && sysUser.getRoles() != null && sysUser.getRoles().stream().anyMatch(role -> "officedirector".equals(role.getRoleKey()))) {
- serviceReimbursement.setOfficedirector(user.getNickName());
+ // 2026-10-09锛氭帹閫佹潯浠剁敱"褰撳墠瀹℃牳浜烘湁 officedirector 瑙掕壊"鏀逛负"鏈瀹℃壒鍚庡埌杈炬渶鍚庝竴绾�"銆�
+ // 鍘熷啓娉曞湪"鏈�鍚庝竴绾у鏍镐汉娌℃湁璇ヨ鑹�"鏃舵案杩滀笉浼氭帹閫侊紝鑰�"闈炴渶鍚庝竴绾х殑 officedirector"浼氭彁鍓嶆帹閫併��
+ boolean uploadAtLastLevel = checkFundVO.getFlowconclusion() == 1
+ && totalLevel != null && totalLevel != 0 && totalLevel == OriginalFlowLevel + 1;
+ if (uploadAtLastLevel) {
+ // 浠嶅彧鍦ㄨ瑙掕壊瀹℃壒鏃惰褰曞姙鍏涓讳换锛屼繚鎸佸瓧娈佃涔変笉鍙�
+ if (Objects.nonNull(sysUser) && sysUser.getRoles() != null
+ && sysUser.getRoles().stream().anyMatch(role -> "officedirector".equals(role.getRoleKey()))) {
+ serviceReimbursement.setOfficedirector(user.getNickName());
+ }
serviceReimbursement.setUploadStates(1);
Boolean aBoolean1 = null;
@@ -648,9 +656,17 @@
private Boolean doSendData(ServiceReimbursement serviceReimbursement) {
// fund鍜宖unddetail鐨勬暟鎹幏鍙�
- addSharedData(serviceReimbursement.getId());
+ // 2026-10-09锛氭帴浣� addSharedData 鐨勫け璐ヤ俊鍙凤紙闄勪欢涓婁紶澶辫触鏃跺畠浼氬洖婊氬垎浜〃骞惰繑鍥� false锛�
+ Boolean sharedOk = addSharedData(serviceReimbursement.getId());
+ if (sharedOk == null || !sharedOk) {
+ log.error("宸梾鎶ラ攢鍗曚笂浼犲け璐ワ細鍒嗕韩琛�/闄勪欢鐜妭澶辫触锛屽鎵逛笉鐢熸晥锛宨d={}", serviceReimbursement.getId());
+ return false;
+ }
List<ServiceReimbursementShared> serviceReimbursementSharedList = sharedService.getRemShareInfoByRemId(serviceReimbursement.getId());
- if (org.springframework.util.CollectionUtils.isEmpty(serviceReimbursementSharedList)) return false;
+ if (org.springframework.util.CollectionUtils.isEmpty(serviceReimbursementSharedList)) {
+ log.error("宸梾鎶ラ攢鍗曚笂浼犲け璐ワ細鍒嗕韩琛ㄤ负绌猴紙闄勪欢鎴栫粍瑁呯幆鑺傚紓甯革級锛屽鎵逛笉鐢熸晥锛宨d={}", serviceReimbursement.getId());
+ return false;
+ }
log.info("serviceReimbursementSharedList鐨勬暟鎹噺涓猴細{}", serviceReimbursementSharedList.size());
//detail璇︽儏
@@ -974,9 +990,17 @@
log.info("filePath鐨勪慨鏀�:{}", filePath);
String url = rbDetailFile.getUrl();
//file鐢ㄧ殑鏄粷瀵逛綅缃�
- String fileName = url.substring(url.indexOf("/profile/upload") + "/profile/upload".length());
+ // 2026-10-09锛氶檮浠跺湴鍧�瑙f瀽鍔犲浐锛岄伩鍏� url 寮傚父/鏂囦欢缂哄け鏃舵姏 NPE 瀵艰嚧鐪嬩笉鍒板け璐ュ師鍥�
+ int profileIdx = url == null ? -1 : url.indexOf("/profile/upload");
+ if (profileIdx < 0) {
+ throw new ServiceException("闄勪欢鍦板潃鏍煎紡涓嶆纭紙缂哄皯 /profile/upload锛夛紝鏃犳硶涓婁紶鍗忓弸锛�" + url);
+ }
+ String fileName = url.substring(profileIdx + "/profile/upload".length());
String strFile = rbDetailFile.getUrl().replace(filePath, "/profile/upload");
File fileUpload = new File(filePath + fileName);
+ if (!fileUpload.exists()) {
+ throw new ServiceException("闄勪欢鏂囦欢鍦ㄦ湇鍔″櫒涓婁笉瀛樺湪锛屾棤娉曚笂浼犲崗鍙嬶細" + fileUpload.getAbsolutePath());
+ }
log.info("璇锋眰绗笁鏂圭殑鍏ュ弬strFile : {}, strFUrl : {}", strFile, filePath);
String struploadResult = HttpClientKit.sendPostWithFile(fileUpload, strFUrl);
log.info("绗笁鏂逛紶鍥炵殑鏁版嵁: {}", struploadResult);
--
Gitblit v1.9.3