From e0bbd21f56757c35dc067eaa8bc67057b65fead4 Mon Sep 17 00:00:00 2001
From: sinake <sinake1@qq.com>
Date: 星期三, 21 十月 2026 15:02:28 +0800
Subject: [PATCH] 新增发票管理

---
 ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceReimbursementServiceImpl.java |   86 +++++++++++++++++++++++++++---------------
 1 files changed, 55 insertions(+), 31 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 bbb0cb4..1be0321 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;
             }
 
@@ -476,27 +476,27 @@
                         FlowLevel = 0;
                     }
                 }
-                SysUser sysUser = sysUserService.selectUserByUserName(serviceReimbursement.getUserno());
-                //瀹℃壒鏈�氳繃锛氬崟鎹俊鎭� + 鍑哄樊淇℃伅 + 瀹℃壒浜�/瀹℃壒鏃堕棿/鎰忚锛堟剰瑙� = "瀹℃壒鏈�氳繃銆�" + 椹冲洖鎰忚锛�
-                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(FundNotifyMessageBuilder.TITLE);
-                    dingTalkReqVo.setNumber(sysUser.getPhonenumber());
-                    dingTalkReqVo.setContents(contentList);
-                    dingTalkService.sendNotification(dingTalkReqVo);
-                } catch (Exception e) {
-                    log.error("宸梾---瀹℃壒鏈�氳繃閽夐拤閫氱煡澶辫触锛宨d={}", serviceReimbursement.getId(), e);
-                }
+            }
+            SysUser sysUser = sysUserService.selectUserByUserName(serviceReimbursement.getUserno());
+            //瀹℃壒鏈�氳繃锛氬崟鎹俊鎭� + 鍑哄樊淇℃伅 + 瀹℃壒浜�/瀹℃壒鏃堕棿/鎰忚锛堟剰瑙� = "瀹℃壒鏈�氳繃銆�" + 椹冲洖鎰忚锛�
+            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(checkFundVO.getFlowconclusion()+"",
+                            checkFundVO.getFlowcontent()));
+            try {
+                DingTalkReqVo dingTalkReqVo = new DingTalkReqVo();
+                dingTalkReqVo.setTitle(FundNotifyMessageBuilder.TITLE);
+                dingTalkReqVo.setNumber(sysUser.getPhonenumber());
+                dingTalkReqVo.setContents(contentList);
+                dingTalkService.sendNotification(dingTalkReqVo);
+            } catch (Exception e) {
+                log.error("宸梾---瀹℃壒鏈�氳繃閽夐拤閫氱煡澶辫触锛宨d={}", serviceReimbursement.getId(), e);
             }
 
             serviceReimbursement.setRecordstatus(RecordStatus);
@@ -537,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;
@@ -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璇︽儏
@@ -956,7 +972,7 @@
         Map<String, Object> map = new HashMap<String, Object>();
         map.put("userName", "opo");
         map.put("password", "4126407a-9821-4874-be41-6568abd6dbe5");
-        map.put("loginName", "OPO绯荤粺瀹℃壒");
+        map.put("loginName", "OPO绯荤粺");
 
         JSONObject jsonObj = new JSONObject(map);
 
@@ -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