Ver código fonte

<feat>:修改
1、srm对接调整

wanghaiwu 4 semanas atrás
pai
commit
dc49b6e4a4

+ 11 - 0
code/base/nckd-jimin-base-helper/src/main/java/nckd/base/helper/CommonHelperUtils.java

@@ -71,6 +71,17 @@ public class CommonHelperUtils {
         return longformat.parse(dateStr + suffix);
     }
 
+    /**
+     *
+     * @param date
+     * @param pattern
+     * @return
+     */
+    public static String getDateFormatString(Date date, String pattern){
+        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
+        return sdf.format(date);
+    }
+
     /**
      * 格式化BigDecimal对象
      * @param objValue

+ 122 - 56
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/plugin/operate/SRMHelperUtils.java

@@ -17,6 +17,7 @@ import nckd.base.helper.CommonHelperUtils;
 import okhttp3.*;
 import javax.crypto.Cipher;
 import java.io.IOException;
+import java.math.BigDecimal;
 import java.security.KeyFactory;
 import java.security.interfaces.RSAPrivateKey;
 import java.security.spec.PKCS8EncodedKeySpec;
@@ -53,14 +54,6 @@ public class SRMHelperUtils {
         String selectProperties = "id, billno, billstatus, nckd_srmbillno, nckd_srmurl";
         DynamicObject billInfo = BusinessDataServiceHelper.loadSingle(billId, entityName, selectProperties);
 
-        billInfo.set("billstatus", "A");
-
-        SaveServiceHelper.update(new DynamicObject[]{billInfo});
-
-//        if(true) {
-//            return returnMap;
-//        }
-
         //退回
         if("nckd_returnsrm".equals(operatorType)){
             //判断单据状态是否等于暂存
@@ -87,16 +80,22 @@ public class SRMHelperUtils {
                 return returnMap;
             }
 
-            Map<String,String> doReturnMap = doSRMreturnDeal(srmBillNo);
+            Map<String,String> doReturnMap = writeReturnStatus(srmBillNo);
 
             //退回成功后单点到srm
             if (!"0".equals(doReturnMap.get("code"))) {//调接口异常
-//                return doReturnMap;
+                return doReturnMap;
+            } else {//调接口成功后,获取单点登录链接
+                try {
+                    billInfo.set("billstatus", "H");
+                    SaveServiceHelper.update(new DynamicObject[]{billInfo});
+                } catch (Exception e){
+                    returnMap.put("code", "1");
+                    returnMap.put("msg", "单据(" + billInfo.getString("billno") + ")作废失败:" + e.getMessage());
 
-                Map<String,String> ssomap = buildSSOUrl(srmurl);
+                    return returnMap;
+                }
 
-                return ssomap;
-            } else {//调接口成功后,获取单点登录链接
                 Map<String,String> ssomap = buildSSOUrl(srmurl);
 
                 return ssomap;
@@ -114,7 +113,7 @@ public class SRMHelperUtils {
      * @param srmBillNo
      * @return
      */
-    public static Map<String,String> doSRMreturnDeal(String srmBillNo) {
+    public static Map<String,String> writeReturnStatus(String srmBillNo) {
         Map<String,String> returnMap = new HashMap<>();
         //获取token
         Map<String,String> tokenMap = getSRMToken();
@@ -224,6 +223,115 @@ public class SRMHelperUtils {
         }
     }
 
+    /**
+     * 同步付款信息至SRM
+     * @param srmBillNo
+     * @param paymentDate
+     * @param paymentAmount
+     * @return
+     */
+    public static Map<String,String> writeBackPayResulst(String srmBillNo, String paymentDate, BigDecimal paymentAmount) {
+        Map<String,String> returnMap = new HashMap<>();
+        //获取token
+        Map<String,String> tokenMap = getSRMToken();
+        if (!"0".equals(tokenMap.get("code"))) {//未获取到token
+            returnMap.put("code", "1");
+            returnMap.put("msg", tokenMap.get("msg"));
+
+            return returnMap;
+        }
+        String token = tokenMap.get("msg").toString();
+
+        Map<String, String> mapentity = CommonHelperUtils.getCommonParams("SRM");
+        if(mapentity == null ){
+            logger.info("SRMHelperUtils:nckd_entryentity is null");
+
+            returnMap.put("code", "1");
+            returnMap.put("msg", "未配置SRM系统对接参数!");
+            return returnMap;
+        }
+
+        String serverUrlApi = mapentity.get("apiserverurl");
+        String writePayResultApi = mapentity.get("apiwritepayresult");
+        String userName = mapentity.get("username");//用户名(srm提供)
+        String interfaceCode = mapentity.get("interfacecodewritebillstatus");//接口编码(srm提供,不同接口编码不同)
+        String externalSysCode = mapentity.get("externalsyscode");//外部系统(srm提供)
+        String applicationCode = mapentity.get("applicationcode");//应用(srm提供)
+        String applicationGroupCode = mapentity.get("applicationgroupcode");//应用组(srm提供)
+
+        if(StringUtils.isEmpty(serverUrlApi) || StringUtils.isEmpty(writePayResultApi) || StringUtils.isEmpty(userName)
+                || StringUtils.isEmpty(interfaceCode) ||StringUtils.isEmpty(externalSysCode)
+                || StringUtils.isEmpty(applicationCode) || StringUtils.isEmpty(applicationGroupCode)){
+            returnMap.put("code", "1");
+            returnMap.put("msg", "请检查是否配置SRM参数:服务地址、付款结果回写接口、用户名、接口编码、外部系统、应用编码、应用组");
+            return returnMap;
+        }
+
+        String url = serverUrlApi + writePayResultApi;
+        String timestamp = String.valueOf(System.currentTimeMillis());
+
+        JSONObject headerObj = new JSONObject();
+        headerObj.put("applicationCode", applicationCode);
+        headerObj.put("applicationGroupCode", applicationGroupCode);
+        headerObj.put("batchCount", "1");
+        headerObj.put("batchNum", timestamp);
+        headerObj.put("externalSystemCode", externalSysCode);
+        headerObj.put("interfaceCode", interfaceCode);
+        headerObj.put("userName", userName);
+
+        JSONArray bodyArr = new JSONArray();
+        JSONObject bodyObj = new JSONObject();
+
+        bodyObj.put("settleNum", srmBillNo);//SRM单据编号
+        bodyObj.put("paymentType", "PAYMENT");//PAYMENT 付款;PREPAYMENT 预付款
+        bodyObj.put("paymentDate", paymentDate);//付款日期
+        bodyObj.put("paymentAmount",paymentAmount);//付款金额
+
+        bodyArr.add(bodyObj);
+
+        JSONObject body=new JSONObject();
+        body.put("header", headerObj);
+        body.put("body", bodyArr);
+
+        Map<String, String> headerMap = new HashMap<>();
+        headerMap.put("Content-Type", "application/json");
+        headerMap.put("User-Agent", "apifox/1.0.0 (https://www.apifox.cn)");
+        headerMap.put("Authorization", "Bearer " + token);
+
+        try {
+            String response = KHttpClientUtils.postjson(url, headerMap, body.toJSONString());
+
+            if(StringUtils.isEmpty(response)){
+                returnMap.put("code", "1");
+                returnMap.put("msg", "回写付款状态失败, 返回为空");
+
+                return returnMap;
+            }
+
+            JSONObject resultJSON = JSONObject.parseObject(response);
+
+            if (resultJSON !=null && "SUCCESS".equals(resultJSON.get("responseStatus").toString())
+                    &&"SUCCESS".equals(resultJSON.get("executeResult").toString())) {
+                returnMap.put("code","0");
+            } else{
+                returnMap.put("code","1");
+                returnMap.put("msg", "回写付款状态失败" + response);
+            }
+
+            return returnMap;
+        } catch(IOException e){
+            returnMap.put("code", "1");
+            returnMap.put("msg", "获取token失败, " + e.getMessage());
+
+            return returnMap;
+        } catch(Exception e){
+            returnMap.put("code", "1");
+            returnMap.put("msg", "获取token失败, " + e.getMessage());
+
+            return returnMap;
+        }
+    }
+
     /**
      * 构造单点url
      * @param srmUrl
@@ -366,46 +474,4 @@ public class SRMHelperUtils {
             return returnMap;
         }
     }
-
-    /**
-     * http post
-     * @param url
-     * @return
-     * @throws IOException
-     */
-    public static String doHttpClientPost(String url) throws IOException{
-        OkHttpClient client = new OkHttpClient().newBuilder()
-//	    	.connectTimeout(timeout, TimeUnit.SECONDS)
-//            .readTimeout(timeout, TimeUnit.SECONDS)
-//            .writeTimeout(timeout, TimeUnit.SECONDS)
-                .build();
-        MediaType mediaType = MediaType.parse("text/plain");
-        RequestBody body = RequestBody.create(mediaType, "");
-        Request request = new Request.Builder().url(url).method("POST", body).addHeader("User-Agent", "apifox/1.0.0 (https://www.apifox.cn)").build();
-        Response response = client.newCall(request).execute();
-
-        if(response == null){
-            return null;
-        }
-        return response.body().toString();
-    }
-
-    public static String doHttpClientPost(String url, String bodyString, String token) throws IOException{
-//	    	int maxRentry=2;//请求重试次数(本次+ maxRentry),注意:BOS开发的jdk是1.6,我们本地测试用低版本的okhttp-3.2.0.jar和okio-1.9.0.jar,服务器还是用okhttp-3.12.13.jar和okio-1.15.0.jar
-        OkHttpClient client = new OkHttpClient().newBuilder()
-                .connectTimeout(timeout, TimeUnit.SECONDS)
-                .readTimeout(timeout, TimeUnit.SECONDS)
-                .writeTimeout(timeout, TimeUnit.SECONDS)
-//            .addInterceptor(new HttpResponseConnectTimeout.OkhttpInterceptor(maxRentry)) //过滤器,设置最大重试次数
-                .build();
-        MediaType mediaType = MediaType.parse("application/json");
-        RequestBody body = RequestBody.create(mediaType, bodyString);
-        Request request = new Request.Builder().url(url).method("POST", body)
-                .addHeader("User-Agent", "apifox/1.0.0 (https://www.apifox.cn)")
-                .addHeader("Content-Type", "application/json")
-                .addHeader("Authorization", "Bearer " + token).build();
-
-        Response response = client.newCall(request).execute();
-        return response.body().string();
-    }
 }

+ 173 - 0
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/task/WriteBackPayResult2SRMTask.java

@@ -0,0 +1,173 @@
+package nckd.jimin.jyyy.fi.task;
+
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.metadata.dynamicobject.DynamicObjectType;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.exception.KDException;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.schedule.api.StopTask;
+import kd.bos.schedule.executor.AbstractTask;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import nckd.base.helper.CommonHelperUtils;
+import nckd.jimin.jyyy.fi.plugin.operate.SRMHelperUtils;
+import java.math.BigDecimal;
+import java.util.*;
+
+
+/**
+ * 付款状态回写srm调度任务类
+ * @author wanghaiwu_kd
+ * @date 2025/05/15
+ */
+public class WriteBackPayResult2SRMTask extends AbstractTask implements StopTask {
+    private static final Log logger = LogFactory.getLog(WriteBackPayResult2SRMTask.class);
+    @Override
+    public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
+        //对公报销单回写
+        writeBackPublicBill(requestContext, map);
+        //预付单回写
+        writeBackPrepayBill(requestContext, map);
+
+
+
+    }
+
+    private void writeBackPublicBill(RequestContext requestContext, Map<String, Object> map){
+        String entityName = "er_publicreimbursebill";
+        String pattern = "yyyy-MM-dd HH:mm:ss";
+
+        //srm状态,1:SRM已推送;2:已退回SRM;3:已反写SRM;4:反写SRM失败
+        List<String> srmStatusList = Arrays.asList("2", "3");
+
+        QFilter filter = new QFilter("billstatus", QCP.equals, "G");
+        filter.and(new QFilter("nckd_srmstatus", QCP.not_in, srmStatusList));
+        filter.and(new QFilter("nckd_srmbillno", QCP.is_notnull, null));
+        filter.and(new QFilter("nckd_srmbillno", QCP.not_equals2, " "));
+        filter.and(new QFilter("nckd_srmbillno", QCP.not_equals2, ""));
+//        filter.and(new QFilter("billno", QCP.equals, "DGBX-250411-0021"));
+
+        DynamicObjectType type = EntityMetadataCache.getDataEntityType(entityName);
+        //先找到批量的pkid
+        List<Object> list = QueryServiceHelper.queryPrimaryKeys(entityName,  filter.toArray(), null, Integer.MAX_VALUE);
+        //根据pkid找到完整的对象
+        DynamicObject[] billEntities = BusinessDataServiceHelper.load(list.toArray(), type);
+
+        List<DynamicObject> listObj = new ArrayList<>();
+        for (DynamicObject payBillEntity : billEntities) {
+            //srm单据号
+            String billno = payBillEntity.getString("billno");
+            String srmBillNo = payBillEntity.getString("nckd_srmbillno");
+            String paymentDate = "";
+
+            if(payBillEntity.getDate("head_paydate") != null){
+                paymentDate = CommonHelperUtils.getDateFormatString(payBillEntity.getDate("head_paydate"), pattern);
+            }
+
+            BigDecimal paymentAmount = BigDecimal.ZERO;
+            DynamicObjectCollection accountEntrys = payBillEntity.getDynamicObjectCollection("accountentry");
+
+            if(accountEntrys != null && accountEntrys.size() > 0){
+                for(DynamicObject entry : accountEntrys){
+                    paymentAmount.add(entry.getBigDecimal("orireceiveamount"));
+                }
+            }
+
+            StringBuffer errMessage = new StringBuffer();
+            Map<String, String> returnMap = SRMHelperUtils.writeBackPayResulst(srmBillNo, paymentDate, paymentAmount);
+
+            if(returnMap != null){
+                if("1".equals(returnMap.get("code"))){
+                    if(errMessage.length() > 0){
+                        errMessage.append(",");
+                    }
+                    logger.info("对公报销单(" + billno + ", " + srmBillNo + ")回写失败," + returnMap.get("msg"));
+                    payBillEntity.set("nckd_srmstatus", "4");
+                } else {
+                    payBillEntity.set("nckd_srmstatus", "3");
+                }
+
+                listObj.add(payBillEntity);
+                if(listObj.size() == 500) {
+                    SaveServiceHelper.update(listObj.toArray(new DynamicObject[]{}));
+                    listObj.clear();
+                }
+            }
+        }
+        if(listObj.size() > 0) {
+            SaveServiceHelper.update(listObj.toArray(new DynamicObject[]{}));
+        }
+    }
+
+    private void writeBackPrepayBill(RequestContext requestContext, Map<String, Object> map){
+        String entityName = "er_prepaybill";
+        String pattern = "yyyy-MM-dd HH:mm:ss";
+
+        //srm状态,1:SRM已推送;2:已退回SRM;3:已反写SRM;4:反写SRM失败
+        List<String> srmStatusList = Arrays.asList("2", "3");
+
+        QFilter filter = new QFilter("billstatus", QCP.equals, "G");
+        filter.and(new QFilter("nckd_srmstatus", QCP.not_in, srmStatusList));
+        filter.and(new QFilter("nckd_srmbillno", QCP.is_notnull, null));
+        filter.and(new QFilter("nckd_srmbillno", QCP.not_equals2, " "));
+        filter.and(new QFilter("nckd_srmbillno", QCP.not_equals2, ""));
+//        filter.and(new QFilter("billno", QCP.equals, "PV-202410-006562"));
+
+        DynamicObjectType type = EntityMetadataCache.getDataEntityType(entityName);
+        //先找到批量的pkid
+        List<Object> list = QueryServiceHelper.queryPrimaryKeys(entityName,  filter.toArray(), null, Integer.MAX_VALUE);
+        //根据pkid找到完整的对象
+        DynamicObject[] billEntities = BusinessDataServiceHelper.load(list.toArray(), type);
+
+        List<DynamicObject> listObj = new ArrayList<>();
+        for (DynamicObject payBillEntity : billEntities) {
+            //srm单据号
+            String billno = payBillEntity.getString("billno");
+            String srmBillNo = payBillEntity.getString("nckd_srmbillno");
+            String paymentDate = "";
+
+            if(payBillEntity.getDate("head_paydate") != null){
+                paymentDate = CommonHelperUtils.getDateFormatString(payBillEntity.getDate("head_paydate"), pattern);
+            }
+
+            BigDecimal paymentAmount = BigDecimal.ZERO;
+            DynamicObjectCollection accountEntrys = payBillEntity.getDynamicObjectCollection("accountentry");
+
+            if(accountEntrys != null && accountEntrys.size() > 0){
+                for(DynamicObject entry : accountEntrys){
+                    paymentAmount.add(entry.getBigDecimal("orireceiveamount"));
+                }
+            }
+
+            StringBuffer errMessage = new StringBuffer();
+            Map<String, String> returnMap = SRMHelperUtils.writeBackPayResulst(srmBillNo, paymentDate, paymentAmount);
+
+            if(returnMap != null){
+                if("1".equals(returnMap.get("code"))){
+                    if(errMessage.length() > 0){
+                        errMessage.append(",");
+                    }
+                    logger.info("预付单(" + billno + ", " + srmBillNo + ")回写失败," + returnMap.get("msg"));
+                    payBillEntity.set("nckd_srmstatus", "4");
+                } else {
+                    payBillEntity.set("nckd_srmstatus", "3");
+                }
+
+                listObj.add(payBillEntity);
+                if(listObj.size() == 500) {
+                    SaveServiceHelper.update(listObj.toArray(new DynamicObject[]{}));
+                    listObj.clear();
+                }
+            }
+        }
+        if(listObj.size() > 0) {
+            SaveServiceHelper.update(listObj.toArray(new DynamicObject[]{}));
+        }
+    }
+}

+ 2 - 0
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/webapi/SRMSynPayApiPlugin.java

@@ -239,6 +239,7 @@ public class SRMSynPayApiPlugin implements Serializable {
         bizAcctOutBill.set("assettype", "newasset");//资产类型
         bizAcctOutBill.set("abovequota", "0");//超额
         bizAcctOutBill.set("ispush", "false");//合同下推生成
+        bizAcctOutBill.set("nckd_srmstatus", "1");//srm状态,1:SRM已推送;2:已退回SRM;3:已反写SRM;4:反写SRM失败
 
         BigDecimal totalReimburseAmount = BigDecimal.ZERO;//报销金额合计
 
@@ -582,6 +583,7 @@ public class SRMSynPayApiPlugin implements Serializable {
         dailyLoanBill.set("billpayertype", "bd_supplier");//往来类型
         dailyLoanBill.set("detailtype", "biztype_other");//关联业务
         dailyLoanBill.set("ispush", "false");//合同下推生成
+        dailyLoanBill.set("nckd_srmstatus", "1");//srm状态,1:SRM已推送;2:已退回SRM;3:已反写SRM;4:反写SRM失败
 
         BigDecimal totalReimburseAmount = BigDecimal.ZERO;//报销金额合计