From a19fd2396876e21fdc2ba2f4d5e60755f116132d Mon Sep 17 00:00:00 2001
From: sinake <sinake1@qq.com>
Date: 星期二, 13 十月 2026 17:00:41 +0800
Subject: [PATCH] 发送钉钉修改

---
 ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceReimbursementServiceImpl.java |  165 +++++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 135 insertions(+), 30 deletions(-)

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 9b3fd1c..3e34532 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
@@ -17,6 +17,8 @@
 import com.ruoyi.common.utils.HttpClientKit;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.bean.DtoConversionUtils;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.project.common.FundNotifyMessageBuilder;
 import com.ruoyi.project.common.IdGeneratorUtils;
 import com.ruoyi.project.domain.*;
 import com.ruoyi.project.domain.dto.ServiceReimbursementDto;
@@ -27,6 +29,7 @@
 import com.ruoyi.project.service.*;
 import com.ruoyi.system.mapper.SysUserMapper;
 import com.ruoyi.system.mapper.SysUserRoleMapper;
+import com.ruoyi.system.service.ISysConfigService;
 import com.ruoyi.system.service.ISysPostService;
 import com.ruoyi.system.service.ISysUserService;
 import lombok.extern.slf4j.Slf4j;
@@ -117,6 +120,35 @@
     @Value("${spring.profiles.active}")
     private String active;
 
+    @Autowired
+    private ISysConfigService sysConfigService;
+
+    /**
+     * 瀹℃壒鍗曟槸鍚︿笂浼犲尰闄㈠崗鍙嬶紙鑷磋繙锛夌郴缁燂細0=涓嶄笂浼狅紙娴嬭瘯鐜锛夛紝1=涓婁紶锛堟寮忕幆澧冿級銆�
+     *
+     * <p>2026-10-09 鏂板锛氬師鏉ョ敤 {@code spring.profiles.active == druid} 鏉ュ垽鏂槸鍚︽帹閫侊紝
+     * 瀵艰嚧娴嬭瘯鐜涓庢寮忕幆澧冩棤娉曢�氳繃鍙傛暟鍖哄垎銆傛敼涓虹郴缁熷弬鏁版帶鍒讹紝鐜鍚勮嚜閰嶇疆銆�
+     */
+    private static final String CFG_UPLOAD_OA = "sys.approval.upload.oa";
+
+    /** 鍙傛暟缂虹渷鍊硷細涓婁紶锛堜繚鎸佹寮忕幆澧冨師鏈夎涓猴級 */
+    private static final boolean DEFAULT_UPLOAD_OA = true;
+
+    /** 瀹℃壒鍗曟槸鍚﹂渶瑕佷笂浼犲尰闄㈠崗鍙嬶紙鑷磋繙锛夌郴缁� */
+    private boolean isUploadOaEnabled() {
+        String value = null;
+        try {
+            value = sysConfigService.selectConfigByKey(CFG_UPLOAD_OA);
+        } catch (Exception e) {
+            log.warn("璇诲彇鍙傛暟 {} 澶辫触锛屾寜榛樿鍊� {} 澶勭悊", CFG_UPLOAD_OA, DEFAULT_UPLOAD_OA, e);
+        }
+        if (value == null || value.trim().isEmpty()) {
+            return DEFAULT_UPLOAD_OA;
+        }
+        String v = value.trim();
+        return "1".equals(v) || "true".equalsIgnoreCase(v) || "y".equalsIgnoreCase(v) || "on".equalsIgnoreCase(v);
+    }
+
 
     /**
      * 鏌ヨ鎶ラ攢鐢宠鍒楄〃
@@ -165,6 +197,7 @@
             wrappers.between(ServiceReimbursement::getCreateTime ,serviceReimbursement.getStarttime(),serviceReimbursement.getEndtime());
         }*/
 
+        wrappers.orderByDesc(ServiceReimbursement::getApplyTime);
         return this.list(wrappers);
     }
 
@@ -258,14 +291,14 @@
             log.info("涓婁紶OA鏂囦欢鏂规硶鐨勫叆鍙�:{}", serviceReimbursementdetailShareds.get(i));
             try {
                 //濡傛灉鏄湰鍦扮幆澧冿紝灏变笉璋冭繖涓簡
-                if (!active.equals("druid")) uploadOAFileAndUpdateDb(serviceReimbursementdetailShareds.get(i));
+                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;
             }
 
@@ -332,6 +365,7 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Map<String, String> checkFund(LoginUser loginUser, CheckFundVO checkFundVO) {
         Map<String, String> allMap = new HashMap<>();
 
@@ -396,8 +430,9 @@
                     if (newSwitch == 1) {
                         aBoolean1 = sendData(serviceReimbursement);
                         if (!aBoolean1) {
-                            allMap.put("500", "鍙戦�佸け璐�");
-                            return allMap;
+                            // 鎺ㄩ�佸尰闄㈠崗鍙嬬郴缁熷け璐ワ細鏁翠釜瀹℃壒涓嶇敓鏁堬紙浜嬪姟鍥炴粴锛夛紝鍏佽涓嬫閲嶆柊瀹℃壒
+                            log.error("宸梾瀹℃壒鍗曚笂浼犲尰闄㈠崗鍙嬬郴缁熷け璐ワ紝瀹℃壒涓嶇敓鏁堬紝id={}锛岃閲嶆柊瀹℃壒", serviceReimbursement.getId());
+                            throw new ServiceException("鍖婚櫌鍗忓弸绯荤粺鎺ユ敹澶辫触锛屾湰娆″鎵规湭鐢熸晥锛岃绋嶅悗閲嶆柊瀹℃壒");
                         }
                     }
                     //淇濆瓨瀹℃壒娴佺▼琛�
@@ -426,7 +461,7 @@
                     serviceReimbursement.setFinancechecher(user.getNickName());
                 }
 
-            } else {
+            } //else {
                 CheckFlag = 2;
 
                 if (CheckFlag == 2) {
@@ -442,24 +477,27 @@
                     }
                 }
                 SysUser sysUser = sysUserService.selectUserByUserName(serviceReimbursement.getUserno());
-                ArrayList<ConcurrentHashMap<String, Object>> contentList = new ArrayList<>();
-                ConcurrentHashMap map = new ConcurrentHashMap();
-                map.put("瀹℃壒浜猴細", loginUser.getUser().getUserName());
-                map.put("瀹℃壒鏃堕棿锛�", new Date());
-                map.put("鎰忚锛�", "涓嶉�氳繃");
-                if (StringUtils.isNotBlank(checkFundVO.getFlowcontent()))
-                    map.put("鎰忚锛�", checkFundVO.getFlowcontent());
-                contentList.add(map);
+                //瀹℃壒鏈�氳繃锛氬崟鎹俊鎭� + 鍑哄樊淇℃伅 + 瀹℃壒浜�/瀹℃壒鏃堕棿/鎰忚锛堟剰瑙� = "瀹℃壒鏈�氳繃銆�" + 椹冲洖鎰忚锛�
+                List<ConcurrentHashMap<String, Object>> contentList = FundNotifyMessageBuilder.newRows();
+                FundNotifyMessageBuilder.addBillInfo(contentList, "0", serviceReimbursement.getUsername(),
+                        serviceReimbursement.getAmountrequested(), null,
+                        FundNotifyMessageBuilder.billNo(serviceReimbursement.getBh(),
+                                serviceReimbursement.getId()));
+                FundNotifyMessageBuilder.addTravelInfo(contentList, serviceReimbursement.getTravelers(),
+                        serviceReimbursement.getReason());
+                FundNotifyMessageBuilder.addAuditResult(contentList, loginUser.getUser().getNickName(), new Date(),
+                        FundNotifyMessageBuilder.opinion(FundNotifyMessageBuilder.CONCLUSION_REJECT,
+                                checkFundVO.getFlowcontent()));
                 try {
                     DingTalkReqVo dingTalkReqVo = new DingTalkReqVo();
-                    dingTalkReqVo.setTitle("璐㈠姟绯荤粺椹冲洖淇℃伅");
+                    dingTalkReqVo.setTitle(FundNotifyMessageBuilder.TITLE);
                     dingTalkReqVo.setNumber(sysUser.getPhonenumber());
                     dingTalkReqVo.setContents(contentList);
                     dingTalkService.sendNotification(dingTalkReqVo);
-                }catch (Exception e){
-                    log.error("宸梾---璐㈠姟绯荤粺椹冲洖淇℃伅鎶ラ敊浜�", e);
+                } catch (Exception e) {
+                    log.error("宸梾---瀹℃壒鏈�氳繃閽夐拤閫氱煡澶辫触锛宨d={}", serviceReimbursement.getId(), e);
                 }
-            }
+            //}
 
             serviceReimbursement.setRecordstatus(RecordStatus);
             serviceReimbursement.setFlowlevel(Long.valueOf(FlowLevel.toString()));
@@ -499,14 +537,22 @@
 
             }
             //鍔炲叕瀹や富浠诲鎵归�氳繃涔嬪悗锛屽氨闇�瑕佹妸鈥滃姙鍏涓讳换鈥濈殑鍚嶅瓧濉笂
-            SysUser sysUser = null;
+            //SysUser sysUser = null;
             if (StringUtils.isNotEmpty(user.getUserName())) {
                 sysUser = sysUserMapper.selectUserByUserName(user.getUserName());
                 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;
@@ -514,8 +560,9 @@
                     log.info("宸梾newSwitch杩斿洖鐨勫�间负:{}", newSwitch);
                     aBoolean1 = sendData(serviceReimbursement);
                     if (!aBoolean1) {
-                        allMap.put("500", "鍙戦�佸け璐�");
-                        return allMap;
+                        // 鎺ㄩ�佸尰闄㈠崗鍙嬬郴缁熷け璐ワ細鏁翠釜瀹℃壒涓嶇敓鏁堬紙浜嬪姟鍥炴粴锛夛紝鍏佽涓嬫閲嶆柊瀹℃壒
+                        log.error("宸梾瀹℃壒鍗曚笂浼犲尰闄㈠崗鍙嬬郴缁熷け璐ワ紝瀹℃壒涓嶇敓鏁堬紝id={}锛岃閲嶆柊瀹℃壒", serviceReimbursement.getId());
+                        throw new ServiceException("鍖婚櫌鍗忓弸绯荤粺鎺ユ敹澶辫触锛屾湰娆″鎵规湭鐢熸晥锛岃绋嶅悗閲嶆柊瀹℃壒");
                     }
                 }
             }
@@ -584,11 +631,42 @@
         return "鏈壘鍒板鎵硅褰�";
     }
 
+    /**
+     * 瀹℃壒鍗曚笂浼犲尰闄㈠崗鍙嬶紙鑷磋繙锛夌郴缁熴��
+     *
+     * <p>2026-10-09锛氬灞傚寘涓�灞傚厹搴曪紝淇濊瘉**浠讳綍寮傚父閮戒笉浼氬悜澶栨姏**锛堝師鏉� strRes 涓� null 鏃�
+     * 浼氬湪 parseObject 鍚庡彇 code 瑙﹀彂 NPE锛屾妸鏁翠釜瀹℃壒璇锋眰鎵撴垚 500锛夈��
+     * 杩斿洖 false 琛ㄧず鎺ㄩ�佸け璐ワ紝璋冪敤鏂规寜"瀹℃壒涓嶇敓鏁堛�佸厑璁镐笅娆¢噸鏂板鎵�"澶勭悊銆�
+     */
     public Boolean sendData(ServiceReimbursement serviceReimbursement) {
+        if (!isUploadOaEnabled()) {
+            // 涓婁紶寮�鍏冲叧闂紙濡傛祴璇曠幆澧冿級锛氳烦杩囦笂浼犲苟瑙嗕负鎴愬姛锛岀粷涓嶈兘鍥犳闃绘柇瀹℃壒
+            log.info("瀹℃壒鍗曚笂浼犲尰闄㈠崗鍙嬬郴缁熷凡鍏抽棴锛坰ys.approval.upload.oa != 1锛夛紝璺宠繃涓婁紶骞惰涓烘垚鍔燂紝id={}",
+                    serviceReimbursement == null ? null : serviceReimbursement.getId());
+            return true;
+        }
+        try {
+            return doSendData(serviceReimbursement);
+        } catch (Throwable t) {
+            log.error("宸梾瀹℃壒鍗曚笂浼犲尰闄㈠崗鍙嬬郴缁熷紓甯革紝瀹℃壒涓嶇敓鏁堬紝id={}",
+                    serviceReimbursement == null ? null : serviceReimbursement.getId(), t);
+            return false;
+        }
+    }
+
+    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璇︽儏
@@ -630,7 +708,7 @@
         data.put("summaryId", serviceReimbursement1.getSummaryId() == null ? "" : serviceReimbursement1.getSummaryId());
         map.put("data", data);
         String strRes = null;
-        if (!active.equals("druid")) {
+        if (isUploadOaEnabled()) {
             //濡傛灉鏄湰鍦扮幆澧冿紝灏变笉璋冭繖涓簡
             String token = getToken();
             JSONObject json1 = JSONObject.parseObject(token);
@@ -661,9 +739,28 @@
             }
         }
         log.error("-----Reimbursement-------------strRes鐨勫�间负锛歿}", strRes);
-        JSONObject jsonObject = JSONObject.parseObject(strRes);
+        if (strRes == null || strRes.trim().isEmpty()) {
+            // 鍖婚櫌鍗忓弸绯荤粺鏃犺繑鍥烇紙瓒呮椂/寮傚父/鏈厤缃級锛氭帹閫佸け璐ワ紝鐢辫皟鐢ㄦ柟鍥炴粴鏁翠釜瀹℃壒
+            log.error("宸梾瀹℃壒鍗曚笂浼犲尰闄㈠崗鍙嬬郴缁熷け璐ワ細鎺ュ彛鏃犺繑鍥炲唴瀹癸紝id={}", serviceReimbursement.getId());
+            return false;
+        }
+        JSONObject jsonObject = null;
+        try {
+            jsonObject = JSONObject.parseObject(strRes);
+        } catch (Exception e) {
+            log.error("宸梾瀹℃壒鍗曚笂浼犲尰闄㈠崗鍙嬬郴缁熷け璐ワ細杩斿洖鍐呭鏃犳硶瑙f瀽锛宨d={}锛宻trRes={}",
+                    serviceReimbursement.getId(), strRes, e);
+            return false;
+        }
+        if (jsonObject == null) {
+            log.error("宸梾瀹℃壒鍗曚笂浼犲尰闄㈠崗鍙嬬郴缁熷け璐ワ細杩斿洖鍐呭涓虹┖锛宨d={}锛宻trRes={}",
+                    serviceReimbursement.getId(), strRes);
+            return false;
+        }
         String code = jsonObject.getString("code");
-        if (!code.equals("0")) {
+        if (code == null || !"0".equals(code)) {
+            log.error("宸梾瀹℃壒鍗曚笂浼犲尰闄㈠崗鍙嬬郴缁熷け璐ワ細code={}锛宨d={}锛宻trRes={}",
+                    code, serviceReimbursement.getId(), strRes);
             return false;
         }
 
@@ -893,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