From 68b49efb4da346edb42a5d8ebb39af47207402bd Mon Sep 17 00:00:00 2001
From: yxh <172933527@qq.com>
Date: 星期一, 12 十月 2026 11:14:13 +0800
Subject: [PATCH] 修改了报销校验

---
 ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceFundServiceImpl.java |  263 +++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 207 insertions(+), 56 deletions(-)

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 0434b71..296e3ec 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
@@ -16,17 +16,21 @@
 import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.core.domain.model.LoginUser;
 import com.ruoyi.common.enums.ApplyTypeEnum;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.common.utils.HttpClientKit;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.bean.DtoConversionUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.project.common.FundNotifyMessageBuilder;
+import com.ruoyi.project.common.IdGeneratorUtils;
 import com.ruoyi.project.domain.*;
 import com.ruoyi.project.domain.vo.*;
 import com.ruoyi.project.mapper.*;
 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.ISysUserService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
@@ -60,6 +64,10 @@
 public class ServiceFundServiceImpl extends ServiceImpl<ServiceFundMapper, ServiceFund> implements IServiceFundService {
     @Autowired
     ServiceFundMapper serviceFundMapper;
+
+    /** 涓撳鍔冲姟璐� 9 鏉¤垂鐢ㄦ帶鍒惰鍒欐牎楠岋紙鍚屼竴妗堜緥绱锛� */
+    @Autowired
+    private ExpertFeeValidateService expertFeeValidateService;
 
     @Autowired
     private DingTalkService dingTalkService;
@@ -136,6 +144,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);
+    }
+
     /**
      * 鑷磋繙绯荤粺娴佺▼閫�鍥�
      *
@@ -198,6 +235,12 @@
         String phone = null;
         String applytype = null;
         Long flowlevel = null;
+        //閽夐拤閫氱煡鐢ㄧ殑鍗曟嵁淇℃伅
+        Double amount = null;
+        String donorName = null;
+        String billNo = null;
+        String travelers = null;
+        String reason = null;
         if (serviceProcessVO.getApplytype().equals("0")) {
             ServiceReimbursement serviceReimbursement = new ServiceReimbursement();
             serviceReimbursement.setId(StringUtils.isNotEmpty(serviceProcessVO.getBackCode()) ? Long.valueOf(serviceProcessVO.getBackCode()) : null);
@@ -212,6 +255,11 @@
             phone = serviceReimbursementList.get(0).getPhone();
             flowlevel = serviceReimbursementList.get(0).getFlowlevel();
             applytype = "0";
+            amount = serviceReimbursementList.get(0).getAmountrequested();
+            billNo = FundNotifyMessageBuilder.billNo(serviceReimbursementList.get(0).getBh(),
+                    serviceReimbursementList.get(0).getId());
+            travelers = serviceReimbursementList.get(0).getTravelers();
+            reason = serviceReimbursementList.get(0).getReason();
         } else {
             ServiceFund serviceFund = new ServiceFund();
             serviceFund.setId(StringUtils.isNotEmpty(serviceProcessVO.getBackCode()) ? Long.valueOf(serviceProcessVO.getBackCode()) : null);
@@ -225,6 +273,10 @@
             phone = serviceFunds.get(0).getPhone();
             flowlevel = serviceFunds.get(0).getFlowlevel();
             applytype = serviceFunds.get(0).getApplytype();
+            amount = serviceFunds.get(0).getPretaxcost();
+            donorName = serviceFunds.get(0).getDonorname();
+            billNo = FundNotifyMessageBuilder.billNo(serviceFunds.get(0).getBh(),
+                    serviceFunds.get(0).getId());
         }
 
 //        //灏嗘搷浣滀繚瀛樺埌fundflow琛ㄤ腑
@@ -247,7 +299,16 @@
 
 
         SysUser sysUser = sysUserService.selectUserByUserName(userNo);
-        sendMeg(serviceProcessVO, phone);
+
+        //閽夐拤閫氱煡鍐呭锛氬崟鎹俊鎭紙绫诲瀷/鎶ラ攢浜�/閲戦/妗堜緥/缂栧彿锛�+ 瀹℃壒浜�/瀹℃壒鏃堕棿/鎰忚
+        List<ConcurrentHashMap<String, Object>> notifyRows = FundNotifyMessageBuilder.newRows();
+        FundNotifyMessageBuilder.addBillInfo(notifyRows, applytype, userName, amount, donorName, billNo);
+        FundNotifyMessageBuilder.addTravelInfo(notifyRows, travelers, reason);
+        FundNotifyMessageBuilder.addAuditResult(notifyRows, serviceProcessVO.getCheckusername(),
+                serviceProcessVO.getCheckTime(),
+                FundNotifyMessageBuilder.opinion(serviceProcessVO.getFlowconclusion(),
+                        serviceProcessVO.getFlowcontent()));
+        sendMeg(serviceProcessVO, phone, notifyRows);
         //鍙戦�佷俊鎭繚瀛�
         ServiceSystemmessage serviceSystemmessage = new ServiceSystemmessage();
         serviceSystemmessage.setFundtype(1);
@@ -259,7 +320,7 @@
         serviceSystemmessage.setUpdateBy(sysUser.getNickName());
         serviceSystemmessage.setIsread(0);
         serviceSystemmessage.setMessagetype(1);
-        serviceSystemmessage.setMessagetitle("璐㈠姟绯荤粺淇℃伅");
+        serviceSystemmessage.setMessagetitle("OPO绯荤粺瀹℃壒");
         serviceSystemmessage.setMessagecontent(serviceProcessVO.getFlowcontent());
         iServiceSystemmessageService.save(serviceSystemmessage);
 
@@ -373,6 +434,7 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Map<String, String> checkFund(CheckFundVO checkFundVO, LoginUser loginUser) {
         ServiceFund serviceFund = getById(checkFundVO.getFundid());
         Map<String, String> map = new HashMap<>();
@@ -380,6 +442,19 @@
         if (serviceFund == null) {
             map.put(HttpStatus.NO_CONTENT + "", "璐圭敤缂栧彿涓嶆纭�");
             return map;
+        }
+
+        // 涓撳鍔冲姟璐癸細瀹℃牳鈥滈�氳繃鈥濆墠鏍¢獙 9 鏉¤垂鐢ㄦ帶鍒惰鍒欙紙鍚屼竴妗堜緥绱锛夛紱涓嶉�氳繃鍒欎笉闃绘柇
+        if (checkFundVO.getFlowconclusion() != null && checkFundVO.getFlowconclusion() == 1) {
+            ExpertFeeCheckResult expertFeeResult = expertFeeValidateService.validateBeforeCheck(checkFundVO.getFundid());
+            if (expertFeeResult.hasError()) {
+                map.put(HttpStatus.ERROR + "", expertFeeResult.errorMessage());
+                return map;
+            }
+            if (expertFeeResult.hasWarning()) {
+                // 瑙勫垯 5銆�6 浠呮彁绀猴紝涓嶉樆鏂鏍�
+                log.warn("涓撳鍔冲姟璐瑰鏍告牎楠屾彁绀猴細fundId={}锛寋}", checkFundVO.getFundid(), expertFeeResult.warningMessage());
+            }
         }
 
         Integer TotalLevel = 0;
@@ -408,6 +483,11 @@
         Integer RecordStatus = serviceFund.getRecordstatus();
         Integer FlowLevel = serviceFund.getFlowlevel().intValue();
         Integer OriginalFlowLevel = FlowLevel;
+        //瀹℃壒缁撹蹇呭~锛氬師瀹炵幇鐩存帴 == 1 鎷嗙锛屾帴鍙h鐩磋皟浼� null 浼� NPE 500
+        if (checkFundVO.getFlowconclusion() == null) {
+            map.put(HttpStatus.ERROR + "", "瀹℃壒缁撹涓嶈兘涓虹┖");
+            return map;
+        }
         if (checkFundVO.getFlowconclusion() == 1) {
             CheckFlag = 1;
             if (TotalLevel == 0) {
@@ -436,8 +516,9 @@
                 if (newSwitch == 1) {
                     aBoolean1 = sendData(serviceFund);
                     if (!aBoolean1) {
-                        map.put("500", "鍙戦�佸け璐�");
-                        return map;
+                        // 鎺ㄩ�佸尰闄㈠崗鍙嬬郴缁熷け璐ワ細鏁翠釜瀹℃壒涓嶇敓鏁堬紙浜嬪姟鍥炴粴锛夛紝鍏佽涓嬫閲嶆柊瀹℃壒
+                        log.error("璐圭敤瀹℃壒鍗曚笂浼犲尰闄㈠崗鍙嬬郴缁熷け璐ワ紝瀹℃壒涓嶇敓鏁堬紝fundId={}锛岃閲嶆柊瀹℃壒", serviceFund.getId());
+                        throw new ServiceException("鍖婚櫌鍗忓弸绯荤粺鎺ユ敹澶辫触锛屾湰娆″鎵规湭鐢熸晥锛岃绋嶅悗閲嶆柊瀹℃壒");
                     }
                 }
                 //淇濆瓨瀹℃壒娴佺▼琛�
@@ -480,18 +561,23 @@
             }
 
             SysUser sysUser = sysUserService.selectUserByUserName(serviceFund.getUserno());
-            ArrayList<ConcurrentHashMap<String, Object>> contentList = new ArrayList<>();
-            ConcurrentHashMap cmap = new ConcurrentHashMap();
-            cmap.put("瀹℃壒浜猴細", loginUser.getUser().getUserName());
-            cmap.put("瀹℃壒鏃堕棿锛�", new Date());
-            cmap.put("鎰忚锛�", "涓嶉�氳繃");
-            if (StringUtils.isNotBlank(checkFundVO.getFlowcontent())) cmap.put("鎰忚锛�", checkFundVO.getFlowcontent());
-            contentList.add(cmap);
-            DingTalkReqVo dingTalkReqVo = new DingTalkReqVo();
-            dingTalkReqVo.setTitle("璐㈠姟绯荤粺椹冲洖淇℃伅");
-            dingTalkReqVo.setNumber(sysUser.getPhonenumber());
-            dingTalkReqVo.setContents(contentList);
-            dingTalkService.sendNotification(dingTalkReqVo);
+            //瀹℃壒鏈�氳繃锛氬崟鎹俊鎭� + 瀹℃壒浜�/瀹℃壒鏃堕棿/鎰忚锛堟剰瑙� = "瀹℃壒鏈�氳繃銆�" + 椹冲洖鎰忚锛�
+            List<ConcurrentHashMap<String, Object>> contentList = FundNotifyMessageBuilder.newRows();
+            FundNotifyMessageBuilder.addBillInfo(contentList, serviceFund.getApplytype(),
+                    serviceFund.getUsername(), serviceFund.getPretaxcost(), serviceFund.getDonorname(),
+                    FundNotifyMessageBuilder.billNo(serviceFund.getBh(), serviceFund.getId()));
+            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("璐圭敤---瀹℃壒鏈�氳繃閽夐拤閫氱煡澶辫触锛宖undId={}", serviceFund.getId(), e);
+            }
         }
 
         serviceFund.setRecordstatus(RecordStatus);
@@ -517,18 +603,25 @@
         Boolean aBoolean = serviceFundflowService.saveData(serviceFundflow);
         log.info("sserviceFund淇濆瓨鐨勭殑鍊兼槸-------- :{}", aBoolean);
 
-        //053瀹℃壒閫氳繃涔嬪悗锛屽氨闇�瑕佹妸鈥滃姙鍏涓讳换鈥濈殑鍚嶅瓧濉笂
-        if (checkFundVO.getFlowconclusion() == 1 && user.getUserName().equals("053")) {
+        //鍔炲叕瀹ゅ鎵归�氳繃涔嬪悗锛屽氨闇�瑕佹妸鈥滃姙鍏涓讳换鈥濈殑鍚嶅瓧濉笂
+        SysUser sysUsers = null;
+        if (StringUtils.isNotEmpty(user.getUserName())) {
+            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());
             serviceFund.setUploadStates(1);
             //鏁版嵁鍙戦��
             Boolean aBoolean1 = null;
             if (newSwitch == 1) {
+                log.info("璐圭敤newSwitch杩斿洖鐨勫�间负:{}", newSwitch);
                 //鎼炰竴涓紑鍏筹紝鍒奖鍝嶈�佹祦绋�
                 aBoolean1 = sendData(serviceFund);
                 if (!aBoolean1) {
-                    map.put("500", "鍙戦�佸け璐�");
-                    return map;
+                    // 鎺ㄩ�佸尰闄㈠崗鍙嬬郴缁熷け璐ワ細鏁翠釜瀹℃壒涓嶇敓鏁堬紙浜嬪姟鍥炴粴锛夛紝鍏佽涓嬫閲嶆柊瀹℃壒
+                    log.error("璐圭敤瀹℃壒鍗曚笂浼犲尰闄㈠崗鍙嬬郴缁熷け璐ワ紝瀹℃壒涓嶇敓鏁堬紝fundId={}锛岃閲嶆柊瀹℃壒", serviceFund.getId());
+                    throw new ServiceException("鍖婚櫌鍗忓弸绯荤粺鎺ユ敹澶辫触锛屾湰娆″鎵规湭鐢熸晥锛岃绋嶅悗閲嶆柊瀹℃壒");
                 }
             }
         }
@@ -592,7 +685,30 @@
 
     }
 
+    /**
+     * 瀹℃壒鍗曚笂浼犲尰闄㈠崗鍙嬶紙鑷磋繙锛夌郴缁熴��
+     *
+     * <p>2026-10-09锛氬灞傚寘涓�灞傚厹搴曪紝淇濊瘉**浠讳綍寮傚父閮戒笉浼氬悜澶栨姏**锛堝師鏉� strRes 涓� null 鏃�
+     * 浼氬湪 parseObject 鍚庡彇 code 瑙﹀彂 NPE锛屾妸鏁翠釜瀹℃壒璇锋眰鎵撴垚 500锛夈��
+     * 杩斿洖 false 琛ㄧず鎺ㄩ�佸け璐ワ紝璋冪敤鏂规寜"瀹℃壒涓嶇敓鏁堛�佸厑璁镐笅娆¢噸鏂板鎵�"澶勭悊銆�
+     */
     public Boolean sendData(ServiceFund serviceFund) {
+        if (!isUploadOaEnabled()) {
+            // 涓婁紶寮�鍏冲叧闂紙濡傛祴璇曠幆澧冿級锛氳烦杩囦笂浼犲苟瑙嗕负鎴愬姛锛岀粷涓嶈兘鍥犳闃绘柇瀹℃壒
+            log.info("瀹℃壒鍗曚笂浼犲尰闄㈠崗鍙嬬郴缁熷凡鍏抽棴锛坰ys.approval.upload.oa != 1锛夛紝璺宠繃涓婁紶骞惰涓烘垚鍔燂紝fundId={}",
+                    serviceFund == null ? null : serviceFund.getId());
+            return true;
+        }
+        try {
+            return doSendData(serviceFund);
+        } catch (Throwable t) {
+            log.error("璐圭敤瀹℃壒鍗曚笂浼犲尰闄㈠崗鍙嬬郴缁熷紓甯革紝瀹℃壒涓嶇敓鏁堬紝fundId={}",
+                    serviceFund == null ? null : serviceFund.getId(), t);
+            return false;
+        }
+    }
+
+    private Boolean doSendData(ServiceFund serviceFund) {
         // fund鍜宖unddetail鐨勬暟鎹幏鍙�
         addFundSharedInfo(serviceFund.getId());
         List<ServiceFundShared> fundShareInfos = serviceFundSharedMapper.getFundShareInfoById(serviceFund.getId());
@@ -633,7 +749,7 @@
 
         map.put("data", data);
         String strRes = null;
-        if (!active.equals("druid")) {
+        if (isUploadOaEnabled()) {
             //濡傛灉鏄湰鍦扮幆澧冿紝灏变笉璋冭繖涓簡
             String token = getToken();
             JSONObject json1 = JSONObject.parseObject(token);
@@ -673,16 +789,33 @@
             }
         }
         log.error("------------------strRes鐨勫�间负锛歿}", strRes);
-        JSONObject jsonObject = JSONObject.parseObject(strRes);
+        if (strRes == null || strRes.trim().isEmpty()) {
+            // 鍖婚櫌鍗忓弸绯荤粺鏃犺繑鍥烇紙瓒呮椂/寮傚父/鏈厤缃級锛氭帹閫佸け璐ワ紝鐢辫皟鐢ㄦ柟鍥炴粴鏁翠釜瀹℃壒
+            log.error("璐圭敤瀹℃壒鍗曚笂浼犲尰闄㈠崗鍙嬬郴缁熷け璐ワ細鎺ュ彛鏃犺繑鍥炲唴瀹癸紝fundId={}", serviceFund.getId());
+            return false;
+        }
+        JSONObject jsonObject = null;
+        try {
+            jsonObject = JSONObject.parseObject(strRes);
+        } catch (Exception e) {
+            log.error("璐圭敤瀹℃壒鍗曚笂浼犲尰闄㈠崗鍙嬬郴缁熷け璐ワ細杩斿洖鍐呭鏃犳硶瑙f瀽锛宖undId={}锛宻trRes={}",
+                    serviceFund.getId(), strRes, e);
+            return false;
+        }
+        if (jsonObject == null) {
+            log.error("璐圭敤瀹℃壒鍗曚笂浼犲尰闄㈠崗鍙嬬郴缁熷け璐ワ細杩斿洖鍐呭涓虹┖锛宖undId={}锛宻trRes={}",
+                    serviceFund.getId(), strRes);
+            return false;
+        }
         String code = jsonObject.getString("code");
-        if (!code.equals("0")) {
+        if (code == null || !"0".equals(code)) {
+            log.error("璐圭敤瀹℃壒鍗曚笂浼犲尰闄㈠崗鍙嬬郴缁熷け璐ワ細code={}锛宖undId={}锛宻trRes={}",
+                    code, serviceFund.getId(), strRes);
             return false;
         }
 
         return true;
     }
-
-    private static final AtomicLong COUNTER = new AtomicLong(System.currentTimeMillis());
 
     private Map<String, List<Map<String, Object>>> formson_0832(List<ServiceFunddetailShared> serviceFunddetailSharedList) {
         Map<String, List<Map<String, Object>>> allMap = new HashMap<>();
@@ -703,7 +836,7 @@
             map.put("鏀剁泭浜哄灞炴垨涓撳", serviceFunddetailShared.getBeneficiaryname());
             map.put("绋庡悗閲戦", serviceFunddetailShared.getTaxedamount());
             map.put("浣滃簾鏈�缁堥噾棰�", null);
-            Long fpuuid = COUNTER.incrementAndGet();
+            Long fpuuid = IdGeneratorUtils.nextId();
             map.put("鍙戠エ闄勪欢", "");
             if (StringUtils.isNotEmpty(invoicefiles)) {
                 map.put("鍙戠エ闄勪欢", fpuuid);
@@ -711,7 +844,7 @@
             map.put("鍙戠エ璇嗗埆", null);
             map.put("璇嗗埆浜�", null);
             map.put("绋庨", serviceFunddetailShared.getTaxamount());
-            long qtuuid = COUNTER.incrementAndGet();
+            long qtuuid = IdGeneratorUtils.nextId();
             map.put("鍏朵粬闄勪欢", "");
             if (StringUtils.isNotEmpty(annexfiles)) {
                 map.put("鍏朵粬闄勪欢", qtuuid);
@@ -774,16 +907,17 @@
         formmain_0831.put("璐㈠姟瀹℃壒", null);
         formmain_0831.put("璐㈠姟閮ㄨ礋璐d汉瀹℃壒", getLastApprovalInfo(serviceFundflows, serviceFund.getFinancedirector()));
 
-//        formmain_0831.put("鍔炲叕瀹や富浠诲鎵�", "鍔炲叕瀹や富浠诲鎵�", "瀹℃壒浜猴細鍛ㄨ偛鎴� & 瀹℃壒鏃堕棿锛�" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " & 瀹℃壒缁撴灉锛氶�氳繃");
+//        formmain_0831.put("鍔炲叕瀹や富浠诲鎵�", "鍔炲叕瀹や富浠诲鎵�", "瀹℃壒浜猴細鍚村織寮� & 瀹℃壒鏃堕棿锛�" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " & 瀹℃壒缁撴灉锛氶�氳繃");
         if (serviceFund.getBackflowlevel() == 3)
-            formmain_0831.put("鍔炲叕瀹や富浠诲鎵�", "瀹℃壒浜猴細鍛ㄨ偛鎴� & 瀹℃壒鏃堕棿锛�" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " & 瀹℃壒缁撴灉锛氶�氳繃");
-        else formmain_0831.put("鍔炲叕瀹や富浠诲鎵�", getLastApprovalInfo(serviceFundflows, "鍛ㄨ偛鎴�"));
+            formmain_0831.put("鍔炲叕瀹や富浠诲鎵�", "瀹℃壒浜猴細鍚村織寮� & 瀹℃壒鏃堕棿锛�" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " & 瀹℃壒缁撴灉锛氶�氳繃");
+        else formmain_0831.put("鍔炲叕瀹や富浠诲鎵�", getLastApprovalInfo(serviceFundflows, "鍚村織寮�"));
 
         formmain_0831.put("涓氬姟鍓櫌闀垮鎵�", serviceFund.getBusvicepresident());
         formmain_0831.put("璐㈠姟鍓櫌闀垮鎵�", serviceFund.getFinvicepresident());
         formmain_0831.put("涓績璐熻矗浜哄鎵�", serviceFund.getOpochecker());
         formmain_0831.put("鏀粯鏂瑰紡", serviceFund.getZffs());
-        formmain_0831.put("缁勯暱", getLastApprovalInfo(serviceFundflows, serviceFund.getManagername()));
+        String lastApprovalInfo = getLastApprovalInfo(serviceFundflows, serviceFund.getManagername());
+        formmain_0831.put("缁勯暱", lastApprovalInfo.contains("鍚村織寮�") ? null : lastApprovalInfo);
         formmain_0831.put("瀹℃壒浜哄憳", StringUtils.isEmpty(getLastApprovalInfo(serviceFundflows, serviceFund.getFinancechecher())) ? "闄堟厱鍗�" : getLastApprovalInfo(serviceFundflows, serviceFund.getFinancechecher()));
         formmain_0831.put("鏀粯鏃ユ湡", serviceFund.getRiqi());
         formmain_0831.put("璇嗗埆浜�-浣滃簾", null);
@@ -875,7 +1009,7 @@
             serviceFunddetailShareds.get(i).setId(null);
             //鏁版嵁鍙戦�佺粰璐㈠姟
             try {
-                if (!active.equals("druid")) uploadOAFileAndUpdateDb(serviceFunddetailShareds.get(i));
+                if (isUploadOaEnabled()) uploadOAFileAndUpdateDb(serviceFunddetailShareds.get(i));
             } catch (Exception e) {
                 e.printStackTrace();
                 log.error("Exception涓叆鍙傜殑ID涓猴細{},寮傚父淇℃伅涓� 锛� {}", id, e.getMessage());
@@ -1411,8 +1545,23 @@
     }
 
     @Override
+    public ExpertFeeCheckResult validateExpertFee(ServiceFundVO serviceFundVO) {
+        return expertFeeValidateService.validateBeforeSave(serviceFundVO);
+    }
+
+    @Override
     @Transactional(rollbackFor = Exception.class)
     public Long addOrUpdateNew(ServiceFundVO serviceFundVO) {
+        // 涓撳鍔冲姟璐癸細淇濆瓨鍓嶆牎楠� 9 鏉¤垂鐢ㄦ帶鍒惰鍒欙紙鍚屼竴妗堜緥绱锛�
+        ExpertFeeCheckResult expertFeeResult = expertFeeValidateService.validateBeforeSave(serviceFundVO);
+        if (expertFeeResult.hasError()) {
+            throw new BaseException(expertFeeResult.errorMessage());
+        }
+        if (expertFeeResult.hasWarning()) {
+            // 瑙勫垯 5銆�6 浠呮彁绀猴紝涓嶉樆鏂繚瀛橈紱鍓嶇鍗曠嫭鍙栫敤鎻愮ず鏂囨
+            log.warn("涓撳鍔冲姟璐逛繚瀛樻牎楠屾彁绀猴細{}", expertFeeResult.warningMessage());
+        }
+
         Long id = null;
         //灏嗘暟鎹繚瀛樺埌fund琛�
         serviceFundVO.setUploadStates(0);
@@ -1474,10 +1623,9 @@
             return null;
         }
 
-        //鎬荤◣鍓�
-        Double pretaxcosts = 0.00;
-        //鎬荤◣鍚�
-        Double taxedcosts = 0.00;
+        //鎬荤◣鍓嶃�佹�荤◣鍚庯紙閲戦绱姞鐢� BigDecimal锛岄伩鍏嶆诞鐐瑰熬宸級
+        BigDecimal pretaxcosts = BigDecimal.ZERO;
+        BigDecimal taxedcosts = BigDecimal.ZERO;
         for (ServiceFunddetailVO serviceFunddetailVO : serviceFunddetails) {
             serviceFunddetailVO.setFundid(id);
 
@@ -1486,13 +1634,18 @@
             if (!performance.isEmpty()) {
                 Double amount = performance.get("amount");
                 Double taxedamount = performance.get("taxedamount");
-                pretaxcosts = pretaxcosts + amount;
-                taxedcosts = taxedcosts + taxedamount;
+                if (amount != null) {
+                    pretaxcosts = pretaxcosts.add(BigDecimal.valueOf(amount));
+                }
+                if (taxedamount != null) {
+                    taxedcosts = taxedcosts.add(BigDecimal.valueOf(taxedamount));
+                }
             }
-            serviceFundVO.setPretaxcost(pretaxcosts);
-            serviceFundVO.setTaxedcost(taxedcosts);
-            updateById(serviceFundVO);
         }
+        // 鍚堣鍦ㄥ惊鐜粨鏉熷悗缁熶竴鍥炲啓锛屽師鏉ュ啓鍦ㄥ惊鐜唴浼氭瘡琛岄兘 UPDATE 涓�娆★紝涓斾腑闂村�艰鍙嶅瑕嗙洊
+        serviceFundVO.setPretaxcost(pretaxcosts.doubleValue());
+        serviceFundVO.setTaxedcost(taxedcosts.doubleValue());
+        updateById(serviceFundVO);
         Map map = new HashMap();
         map.put("fundId", id);
         return map;
@@ -1690,7 +1843,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);
 
@@ -1809,7 +1962,8 @@
     }
 
 
-    public void sendMeg(ServiceProcessVO serviceProcessVO, String phone) {
+    public void sendMeg(ServiceProcessVO serviceProcessVO, String phone,
+                        List<ConcurrentHashMap<String, Object>> contentList) {
         //璁板綍鎿嶄綔璁板綍
         ServiceFundflow serviceFundflow = new ServiceFundflow();
 
@@ -1827,18 +1981,15 @@
         serviceFundflow.setApplytype(serviceProcessVO.getApplytype());
         serviceFundflow.setFundid(StringUtils.isNotEmpty(serviceProcessVO.getBackCode()) ? Long.valueOf(serviceProcessVO.getBackCode()) : null);
         fundflowService.save(serviceFundflow);
-
-        ArrayList<ConcurrentHashMap<String, Object>> contentList = new ArrayList<>();
-        ConcurrentHashMap map = new ConcurrentHashMap();
-        map.put("瀹℃壒浜猴細", serviceProcessVO.getCheckusername());
-        map.put("瀹℃壒鏃堕棿锛�", serviceProcessVO.getCheckTime());
-        map.put("鎰忚锛�", serviceProcessVO.getFlowcontent());
-        contentList.add(map);
-        DingTalkReqVo dingTalkReqVo = new DingTalkReqVo();
-        dingTalkReqVo.setTitle("璐㈠姟绯荤粺淇℃伅");
-        dingTalkReqVo.setNumber(phone);
-        dingTalkReqVo.setContents(contentList);
-        log.info("閽夐拤鍙戦�佹秷鎭�:{}", dingTalkReqVo);
-        dingTalkService.sendNotification(dingTalkReqVo);
+        try {
+            DingTalkReqVo dingTalkReqVo = new DingTalkReqVo();
+            dingTalkReqVo.setTitle(FundNotifyMessageBuilder.TITLE);
+            dingTalkReqVo.setNumber(phone);
+            dingTalkReqVo.setContents(contentList);
+            log.info("閽夐拤鍙戦�佹秷鎭�:{}", dingTalkReqVo);
+            dingTalkService.sendNotification(dingTalkReqVo);
+        } catch (Exception e) {
+            log.error("鎶ラ攢瀹℃壒閽夐拤娑堟伅鍙戦�佸け璐ワ紝涓嶅奖鍝嶄富娴佺▼", e);
+        }
     }
 }

--
Gitblit v1.9.3