Forráskód Böngészése

Merge branch 'master' of http://111.75.220.136:10030/turborao/jyyy

Tyx 1 napja
szülő
commit
977ce365a6

+ 2 - 2
code/base/nckd-jimin-base-helper/src/main/java/nckd/base/helper/DefaultPreviewCusServiceImpl.java

@@ -115,7 +115,7 @@ public class DefaultPreviewCusServiceImpl  implements PreviewService {
         Map result;
         logger.info("testpreviewWPS..." + path + ", " + ext);
 
-        if (YunHomeService.isNotNeedDeal(ext) && !"pdf".equals(ext) && !"txt".equals(ext)) {
+        if (YunHomeService.isNotNeedDeal(ext)) {
             logger.info("testpreviewWPS...10001001");
 
             Map<String, String> headerMap = new HashMap();
@@ -208,7 +208,7 @@ public class DefaultPreviewCusServiceImpl  implements PreviewService {
         logger.info("testpreviewFromCacheWPS...");
 
         String ext = fileName.substring(fileName.lastIndexOf(46) + 1);
-        if (YunHomeService.isNotNeedDeal(ext) && !"pdf".equals(ext) && !"txt".equals(ext)) {
+        if (YunHomeService.isNotNeedDeal(ext)) {
             logger.info("testpreviewFromCacheWPS...10001001");
 
             InputStream in = DecodeFileFactory.getDecodeService().getDecodeFileStream(cacheIn);

+ 44 - 0
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/fi/cas/form/AgentPayBillListPlugin.java

@@ -0,0 +1,44 @@
+package fi.cas.form;
+
+import com.alibaba.druid.util.StringUtils;
+import kd.bos.entity.operate.result.IOperateInfo;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.list.plugin.AbstractListPlugin;
+import java.util.List;
+
+/**
+ * 代发处理列表
+ * @author wanghaiwu_kd
+ * @date 2025/06/13
+ */
+public class AgentPayBillListPlugin extends AbstractListPlugin {
+    public void afterDoOperation(AfterDoOperationEventArgs afterDoOperationEventArgs) {
+        super.afterDoOperation(afterDoOperationEventArgs);
+
+        if(StringUtils.equals("nckd_synpaystatus",afterDoOperationEventArgs.getOperateKey())){
+            OperationResult operationResult = afterDoOperationEventArgs.getOperationResult();
+            operationResult.setShowMessage(false);
+            String message = operationResult.getMessage();
+
+            List<IOperateInfo> errorInfos = operationResult.getAllErrorOrValidateInfo();
+            boolean isSuccess = operationResult.isSuccess();
+            if(errorInfos.size()> 0){
+                operationResult.setSuccess(false);
+                StringBuffer msg = new StringBuffer();
+                for (IOperateInfo errInfo: errorInfos) {
+                    msg.append(errInfo.getMessage()).append("\r\n");
+                }
+                message = message + "\r\n" + msg.toString();
+            }
+
+            if(StringUtils.isEmpty(message)){
+                this.getView().showTipNotification("资金支付状态同步完成!");
+            } else {
+                this.getView().showTipNotification(message);
+            }
+
+            this.getView().invokeOperation("refresh");
+        }
+    }
+}

+ 44 - 0
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/fi/cas/form/PaymentBillListPlugin.java

@@ -0,0 +1,44 @@
+package fi.cas.form;
+
+import com.alibaba.druid.util.StringUtils;
+import kd.bos.entity.operate.result.IOperateInfo;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.list.plugin.AbstractListPlugin;
+import java.util.List;
+
+/**
+ * 付款处理列表
+ * @author wanghaiwu_kd
+ * @date 2025/06/13
+ */
+public class PaymentBillListPlugin extends AbstractListPlugin {
+    public void afterDoOperation(AfterDoOperationEventArgs afterDoOperationEventArgs) {
+        super.afterDoOperation(afterDoOperationEventArgs);
+
+        if(StringUtils.equals("nckd_synpaystatus",afterDoOperationEventArgs.getOperateKey())){
+            OperationResult operationResult = afterDoOperationEventArgs.getOperationResult();
+            operationResult.setShowMessage(false);
+            String message = operationResult.getMessage();
+
+            List<IOperateInfo> errorInfos = operationResult.getAllErrorOrValidateInfo();
+            boolean isSuccess = operationResult.isSuccess();
+            if(errorInfos.size()> 0){
+                operationResult.setSuccess(false);
+                StringBuffer msg = new StringBuffer();
+                for (IOperateInfo errInfo: errorInfos) {
+                    msg.append(errInfo.getMessage()).append("\r\n");
+                }
+                message = message + "\r\n" + msg.toString();
+            }
+
+            if(StringUtils.isEmpty(message)){
+                this.getView().showTipNotification("资金支付状态同步完成!");
+            } else {
+                this.getView().showTipNotification(message);
+            }
+
+            this.getView().invokeOperation("refresh");
+        }
+    }
+}

+ 275 - 0
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/fi/cas/opplugin/AgentPaySynPayStatusOpPlugin.java

@@ -0,0 +1,275 @@
+package fi.cas.opplugin;
+
+import com.kingdee.util.StringUtils;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
+import kd.bos.entity.plugin.args.*;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import java.io.IOException;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 代发单
+ * @author wanghaiwu_kd
+ * @date 2025/06/13
+ */
+public class AgentPaySynPayStatusOpPlugin extends AbstractOperationServicePlugIn {
+    private static final Log logger = LogFactory.getLog(AgentPaySynPayStatusOpPlugin.class);
+
+    @Override
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        super.onPreparePropertys(e);
+
+        List<String> fieldKeys = e.getFieldKeys();
+
+        fieldKeys.add("billno");
+        fieldKeys.add("billstatus");
+        fieldKeys.add("nckd_paystatus");
+        fieldKeys.add("nckd_sbyy");
+        fieldKeys.add("nckd_fqqdrq");
+        fieldKeys.add("nckd_fkcs");
+        fieldKeys.add("nckd_bbh");
+    }
+
+    @Override
+    public void beforeExecuteOperationTransaction(BeforeOperationArgs args) {
+        super.beforeExecuteOperationTransaction(args);
+
+        String operationKey = args.getOperationKey();
+        DynamicObject[] agentPayBillObjs = args.getDataEntities();
+        logger.info("开始执行操作:{},实体:{}", operationKey, agentPayBillObjs);
+
+
+        StringBuilder errMsg = new StringBuilder();
+
+        //支付状态同步
+        if ("nckd_synpaystatus".equals(operationKey)) {
+            DynamicObject jkpzxx = BusinessDataServiceHelper.loadSingle("nckd_jkpzxx",new QFilter[]{new QFilter("number","=","paytoJHX")});
+            String url =  jkpzxx.getString("nckd_servername");
+            boolean isESBApi = jkpzxx.getBoolean("nckd_isesb");
+
+            for (DynamicObject dataEntity : agentPayBillObjs) {
+                String billNum = dataEntity.getString("billno");
+                String billStatus = dataEntity.getString("billstatus");
+                String payStatus = dataEntity.getString("nckd_paystatus");
+                int fkcs = dataEntity.getInt("nckd_fkcs");
+
+                if(!"C".equals(billStatus) || !"2".equals(payStatus) || fkcs <= 0){
+                    logger.info("付款单同步失败,不符合查询条件。实体:{}", dataEntity);
+
+                    errMsg.append("单据(" + billNum + ")不符合同步条件").append("\r\n");
+                    continue;
+                }
+
+                //调用接口查询付款状态
+                JSONObject param = new JSONObject();
+                PayBillToolUtil.headJson(param);
+                JSONObject data = new JSONObject();
+                data.put("ERP_INS_ID",dataEntity.getPkValue()+"");
+
+                param.put("data",data);
+                param.put("txDateTime",Utils.getData(new Date(), "yyyyMMddHHmmss"));
+                param.put("batchNo",TypeUtils.nullToString(dataEntity.get("billno"))+"-"+TypeUtils.nullToString(dataEntity.get("nckd_bbh"))+"-"+Utils.getData(new Date(), "yyyyMMddHHmmss"));
+                param.put("code","NSTC-Q001");
+
+                String bodyjson=param.toString();
+                logger.info("单据号:"+billNum+"传入参数"+param.toString());
+
+
+                Map<String, String> tokenMap = PayBillToolUtil.getNtscToken();
+
+                if(tokenMap == null){
+                    logger.info("单据号:" + billNum + "查询失败: 获取token失败");
+
+                    errMsg.append("单据(" + billNum + ")查询失败: 获取token失败").append("\r\n");
+                    continue;
+                }
+
+                if(!"0".equals(tokenMap.get("code"))){
+                    logger.info("单据号:" + billNum + "查询失败:获取token失败, " + tokenMap.get("msg"));
+
+                    errMsg.append("单据(" + billNum + ")查询失败: 获取token失败").append("\r\n");
+                    continue;
+                }
+
+                String token = tokenMap.get("msg");
+
+                //改成调用轻舟的方式
+                Map<String, String> header = new HashMap<>();
+                header.put("Content-Type", "application/json; charset=UTF-8");
+                header.put("Authorization", "Bearer " + token);
+
+                //如果是esb接口,需要包一层参数
+                if(isESBApi) {
+                    bodyjson = PayBillToolUtil.buildEsbApiBodyJSON(new JSONObject(bodyjson));
+                }
+
+                String apiResult = "";
+                try {
+                    logger.info("代发查询接口调用参数:" + bodyjson);
+
+                    apiResult = HttpUtils.postjson(url, header, bodyjson);
+                } catch (IOException e) {
+                    logger.info("单据号:" + billNum + "查询失败:" + e.getMessage());
+
+                    errMsg.append("单据(" + billNum + ")查询失败:" + e.getMessage()).append("\r\n");
+                    continue;
+                }
+
+                if(StringUtils.isEmpty(apiResult)){
+                    logger.info("单据号:" + billNum + "查询结果为空");
+
+                    errMsg.append("单据(" + billNum + ")查询结果为空").append("\r\n");
+                    continue;
+                }
+
+                logger.info("单据号:" + billNum + "返回参数" + apiResult);
+
+//            JSONObject cbsReturnJson = new JSONObject(apiResult);
+
+                JSONObject esbReturnJson = new JSONObject(apiResult);
+                if(esbReturnJson.get("responseData") == null){
+                    logger.info("单据号:" + billNum + ", 未正常返回responseData参数");
+
+                    errMsg.append("单据(" + billNum + "), 未正常返回responseData参数").append("\r\n");
+                    return;
+                }
+
+                JSONArray esbJSONArray = esbReturnJson.getJSONArray("responseData");
+                if(esbJSONArray == null || esbJSONArray.length() == 0){
+                    logger.info("单据号:" + billNum + ", 未正常返回responseData参数");
+
+                    errMsg.append("单据(" + billNum + "), 未正常返回responseData参数").append("\r\n");
+                    return;
+                }
+
+                JSONObject cbsReturnJson = esbJSONArray.getJSONObject(0);
+                /************************************************************/
+
+                logger.info("单据号:"+billNum+"返回参数"+cbsReturnJson.toString());
+                if(cbsReturnJson==null||cbsReturnJson.get("data")==null){
+                }else{
+                    String errcode = cbsReturnJson.get("resultCode")+"";
+                    JSONObject bodyinfo = cbsReturnJson.getJSONObject("data");
+                    if(bodyinfo!=null){
+                        boolean isupdate = false;
+                        if ("000000".equals(errcode)) {//已查询到,不代表支付成功
+                            String zfstatus = bodyinfo.getString("RET_CODE");//0:付款成功  -1:付款失败 -2:流程中 -3:驳回 -4:部分成功
+                            String errormsg =bodyinfo.getString("ERROR_MSG");
+                            if("-2".equals(zfstatus)){//流程中
+                                //判断原因是否有变化
+                                String sbyy =  dataEntity.getString("nckd_sbyy");
+                                if(errormsg == null || "".equals(errormsg)){//空不更新
+
+                                }else if(errormsg.equals(sbyy)){//相等不更新
+
+                                }else{
+                                    dataEntity.set("nckd_sbyy",errormsg);//错误信息更新
+                                    isupdate = true;
+                                }
+
+                            }else if("0".equals(zfstatus)){//成功
+                                dataEntity.set("nckd_paystatus",3);
+                                dataEntity.set("nckd_sbyy","支付成功");//错误信息更新
+                                //分录信息
+                                DynamicObjectCollection coll = dataEntity.getDynamicObjectCollection("entry");
+                                for (int i = 0; i <coll.size() ; i++) {
+                                    coll.get(i).set("e_issuccess",true);//分录是否成功
+                                    coll.get(i).set("bankreturnmsg","成功");//返回信息
+                                }
+                                isupdate = true;
+                            }else if("-1".equals(zfstatus)){//失败
+                                dataEntity.set("nckd_paystatus",6);//支付失败
+                                dataEntity.set("nckd_sbyy",errormsg);//错误信息更新
+                                updateEntrys(dataEntity,bodyinfo);
+                                isupdate = true;
+                            }else if("-3".equals(zfstatus)){//驳回
+                                dataEntity.set("nckd_paystatus",5);//驳回
+                                dataEntity.set("nckd_sbyy",errormsg);//错误信息更新
+                                updateEntrys(dataEntity,bodyinfo);
+                                isupdate = true;
+                            }else if("-4".equals(zfstatus)){//部分成功
+                                dataEntity.set("nckd_paystatus",7);//部分成功
+                                dataEntity.set("nckd_sbyy",errormsg);//错误信息更新
+                                updateEntrys(dataEntity,bodyinfo);
+                                isupdate = true;
+                            }
+                            if(isupdate){
+                                SaveServiceHelper.update(new DynamicObject[]{dataEntity});
+                                //存入日志表
+                                PayBillToolUtil.saveAgentlog(dataEntity, bodyjson, cbsReturnJson.toString(), "6");
+
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+
+        if (errMsg.length() > 0) {
+            ////将错误信息返回到前端
+            args.setCancelMessage(errMsg.toString());
+            args.setCancel(true);
+
+            System.out.println("AgentPaySynPayStatusOpPlugin 错误信息:" + errMsg.toString());
+        }
+
+    }
+
+    //更新分录
+    public void updateEntrys(DynamicObject dataEntity,JSONObject bodyinfo){
+        DynamicObjectCollection coll = dataEntity.getDynamicObjectCollection("entry");
+        JSONArray ITEM_LIST =  bodyinfo.getJSONArray("ITEM_LIST");
+        for (int i = 0; i < ITEM_LIST.length(); i++) {
+            JSONObject iteminfo =(JSONObject)ITEM_LIST.get(i);
+            String itempk = iteminfo.get("ERP_PVT_ID")+"";
+            String error_msg = iteminfo.get("ERROR_MSG")+"";
+            String result_code = iteminfo.get("RESULT_CODE")+"";
+            for (int j = 0; j <coll.size() ; j++) {
+                String itempkvalue =  coll.get(j).getPkValue()+"";
+                if(itempk.equals(itempkvalue)){
+                    if("0".equals(result_code)){
+                        coll.get(j).set("e_issuccess",true);
+                        coll.get(j).set("bankreturnmsg","成功");//返回信息
+                    }else{
+                        coll.get(j).set("e_issuccess",false);
+                        coll.get(j).set("bankreturnmsg",error_msg);//返回信息
+                    }
+                }
+            }
+        }
+    }
+
+    @Override
+    public void beginOperationTransaction(BeginOperationTransactionArgs e) {
+        super.beginOperationTransaction(e);
+    }
+
+    @Override
+    public void rollbackOperation(RollbackOperationArgs e) {
+        super.rollbackOperation(e);
+    }
+
+    @Override
+    public void endOperationTransaction(EndOperationTransactionArgs e) {
+        super.endOperationTransaction(e);
+    }
+
+    @Override
+    public void afterExecuteOperationTransaction(AfterOperationArgs e) {
+        super.afterExecuteOperationTransaction(e);
+    }
+}

+ 242 - 0
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/fi/cas/opplugin/PaymentSynPayStatusOpPlugin.java

@@ -0,0 +1,242 @@
+package fi.cas.opplugin;
+
+import com.kingdee.util.StringUtils;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
+import kd.bos.entity.plugin.args.*;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import java.io.IOException;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 付款处理,同步资金系统付款状态
+ * @author wanghaiwu_kd
+ * @date 2025/06/12
+ */
+public class PaymentSynPayStatusOpPlugin extends AbstractOperationServicePlugIn {
+    private static final Log logger = LogFactory.getLog(PaymentSynPayStatusOpPlugin.class);
+
+    @Override
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        super.onPreparePropertys(e);
+
+        List<String> fieldKeys = e.getFieldKeys();
+
+        fieldKeys.add("billno");
+        fieldKeys.add("billstatus");
+        fieldKeys.add("nckd_paystatus");
+        fieldKeys.add("nckd_sbyy");
+        fieldKeys.add("nckd_fqqdrq");
+        fieldKeys.add("nckd_fkcs");
+        fieldKeys.add("nckd_bbh");
+    }
+
+    @Override
+    public void beforeExecuteOperationTransaction(BeforeOperationArgs args) {
+        super.beforeExecuteOperationTransaction(args);
+
+        String operationKey = args.getOperationKey();
+        DynamicObject[] payBillObjs = args.getDataEntities();
+        logger.info("开始执行操作:{},实体:{}",operationKey, payBillObjs);
+
+
+        StringBuilder errMsg = new StringBuilder();
+
+        //支付状态同步
+        if("nckd_synpaystatus".equals(operationKey)){
+            DynamicObject jkpzxx = BusinessDataServiceHelper.loadSingle("nckd_jkpzxx",new QFilter[]{new QFilter("number","=","paytoJHX")});
+            String url =  jkpzxx.getString("nckd_servername");
+            boolean isESBApi = jkpzxx.getBoolean("nckd_isesb");
+
+            for (DynamicObject dataEntity : payBillObjs) {
+                String billNum = dataEntity.getString("billno");
+                String billStatus = dataEntity.getString("billstatus");
+                String payStatus = dataEntity.getString("nckd_paystatus");
+                int fkcs = dataEntity.getInt("nckd_fkcs");
+
+                if(!"C".equals(billStatus) || !"2".equals(payStatus) || fkcs <= 0){
+                    logger.info("付款单同步失败,不符合查询条件。实体:{}", dataEntity);
+
+                    errMsg.append("单据(" + billNum + ")不符合同步条件").append("\r\n");
+                    continue;
+                }
+
+                //调用接口查询付款状态
+                JSONObject param = new JSONObject();
+                PayBillToolUtil.headJson(param);
+                JSONObject data = new JSONObject();
+                data.put("ERP_INS_ID",dataEntity.getPkValue()+"");
+
+                param.put("data",data);
+                param.put("txDateTime",Utils.getData(new Date(), "yyyyMMddHHmmss"));
+                param.put("batchNo",TypeUtils.nullToString(dataEntity.get("billno"))+"-"+TypeUtils.nullToString(dataEntity.get("nckd_bbh"))+"-"+Utils.getData(new Date(), "yyyyMMddHHmmss"));
+                param.put("code","JY-NSTC-Q001");
+
+                String bodyjson = param.toString();
+
+
+                logger.info("单据号:"+billNum+"传入参数"+param.toString());
+
+
+                /***************************************add by wanghaiwu 20225/05/24*************************************************************/
+                //改成调用restful ebs api的方式
+//            Map<String, String> header = new HashMap<>();
+//            header.put("Content-Type", "application/json; charset=UTF-8");
+
+                Map<String, String> tokenMap = PayBillToolUtil.getNtscToken();
+
+                if(tokenMap == null){
+                    logger.info("单据号:" + billNum + "查询失败: 获取token失败");
+
+                    errMsg.append("单据(" + billNum + ")查询失败: 获取token失败").append("\r\n");
+                    continue;
+                }
+
+                if(!"0".equals(tokenMap.get("code"))){
+                    logger.info("单据号:" + billNum + "查询失败:获取token失败, " + tokenMap.get("msg"));
+
+                    errMsg.append("单据(" + billNum + ")查询失败: 获取token失败").append("\r\n");
+
+                    continue;
+                }
+
+                String token = tokenMap.get("msg");
+
+                //改成调用轻舟的方式
+                Map<String, String> header = new HashMap<>();
+                header.put("Content-Type", "application/json; charset=UTF-8");
+                header.put("Authorization", "Bearer " + token);
+
+                //如果是esb接口,需要包一层参数
+                if(isESBApi) {
+                    bodyjson = PayBillToolUtil.buildEsbApiBodyJSON(new JSONObject(bodyjson));
+                }
+
+                String apiResult = "";
+                try {
+                    logger.info("付款查询接口调用参数:" + bodyjson);
+
+                    apiResult = HttpUtils.postjson(url, header, bodyjson);
+                } catch (IOException e) {
+                    logger.info("单据号:" + billNum + "查询失败:" + e.getMessage());
+                    errMsg.append("单据(" + billNum + ")查询失败:" + e.getMessage()).append("\r\n");
+                    continue;
+                }
+
+                if(StringUtils.isEmpty(apiResult)){
+                    logger.info("单据号:" + billNum + "查询结果为空");
+
+                    errMsg.append("单据(" + billNum + ")查询结果为空").append("\r\n");
+                    continue;
+                }
+
+                logger.info("单据号:" + billNum + "返回参数" + apiResult);
+
+//            JSONObject cbsReturnJson = new JSONObject(apiResult);
+
+                JSONObject esbReturnJson = new JSONObject(apiResult);
+                if(esbReturnJson.get("responseData") == null){
+                    logger.info("单据号:" + billNum + ", 未正常返回responseData参数");
+
+                    errMsg.append("单据(" + billNum + "), 未正常返回responseData参数").append("\r\n");
+                    return;
+                }
+
+                JSONArray esbJSONArray = esbReturnJson.getJSONArray("responseData");
+                if(esbJSONArray == null || esbJSONArray.length() == 0){
+                    logger.info("单据号:" + billNum + ", 未正常返回responseData参数");
+
+                    errMsg.append("单据(" + billNum + "), 未正常返回responseData参数").append("\r\n");
+                    return;
+                }
+
+                JSONObject cbsReturnJson = esbJSONArray.getJSONObject(0);
+                /************************************************************/
+
+
+                logger.info("单据号:"+billNum+"返回参数"+cbsReturnJson.toString());
+
+                if(cbsReturnJson==null||cbsReturnJson.get("data")==null){
+                } else{
+                    String errcode = cbsReturnJson.get("resultCode")+"";
+                    JSONObject bodyinfo = cbsReturnJson.getJSONObject("data");
+                    if(bodyinfo!=null){
+                        boolean isupdate = false;
+                        if ("000000".equals(errcode)) {//已查询到,不代表支付成功
+                            String zfstatus = bodyinfo.getString("RET_CODE");//0:付款成功  1:付款失败 2:流程中 3:驳回 4:部分成功
+                            String errormsg =bodyinfo.getString("ERROR_MSG");
+                            if("-2".equals(zfstatus)){//流程中
+                                //判断原因是否有变化
+                                String sbyy =  dataEntity.getString("nckd_sbyy");
+                                if(errormsg == null || "".equals(errormsg)){//空不更新
+
+                                }else if(errormsg.equals(sbyy)){//相等不更新
+
+                                }else{
+                                    dataEntity.set("nckd_sbyy",errormsg);//错误信息更新
+                                    isupdate = true;
+                                }
+                            }else if("0".equals(zfstatus)){//成功
+                                dataEntity.set("nckd_paystatus",3);
+                                dataEntity.set("nckd_sbyy","支付成功");//错误信息更新
+                                isupdate = true;
+                            }else if("-1".equals(zfstatus)){//失败
+                                dataEntity.set("nckd_paystatus",6);//支付失败
+                                dataEntity.set("nckd_sbyy",errormsg);//错误信息更新
+                                isupdate = true;
+                            }else if("-3".equals(zfstatus)){//驳回
+                                dataEntity.set("nckd_paystatus",5);//驳回
+                                dataEntity.set("nckd_sbyy",errormsg);//错误信息更新
+                                isupdate = true;
+                            }
+                            if(isupdate){
+                                SaveServiceHelper.update(new DynamicObject[]{dataEntity});
+                                PayBillToolUtil.saveupdatelog(dataEntity,bodyjson,cbsReturnJson.toString());
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+
+        if(errMsg.length() > 0) {
+            ////将错误信息返回到前端
+            args.setCancelMessage(errMsg.toString());
+            args.setCancel(true);
+
+            System.out.println("PaymentSynPayStatusOpPlugin 错误信息:" + errMsg.toString());
+        }
+
+    }
+
+    @Override
+    public void beginOperationTransaction(BeginOperationTransactionArgs e) {
+        super.beginOperationTransaction(e);
+    }
+
+    @Override
+    public void rollbackOperation(RollbackOperationArgs e) {
+        super.rollbackOperation(e);
+    }
+
+    @Override
+    public void endOperationTransaction(EndOperationTransactionArgs e) {
+        super.endOperationTransaction(e);
+    }
+
+    @Override
+    public void afterExecuteOperationTransaction(AfterOperationArgs e) {
+        super.afterExecuteOperationTransaction(e);
+    }
+}

+ 2 - 0
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/fi/cas/task/AgentpaybillQueryStatusTast.java

@@ -89,6 +89,8 @@ public class AgentpaybillQueryStatusTast extends AbstractTask {
 
             String apiResult = "";
             try {
+                log.info("代发查询接口调用参数:" + bodyjson);
+
                 apiResult = HttpUtils.postjson(url, header, bodyjson);
             } catch (IOException e) {
                 log.info("单据号:" + billNum + "查询失败:" + e.getMessage());

+ 2 - 0
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/fi/cas/task/PayQueryStatusTast.java

@@ -86,6 +86,8 @@ public class PayQueryStatusTast extends AbstractTask {
 
             String apiResult = "";
             try {
+                log.info("付款查询接口调用参数:" + bodyjson);
+
                 apiResult = HttpUtils.postjson(url, header, bodyjson);
             } catch (IOException e) {
                 log.info("单据号:" + billNum + "查询失败:" + e.getMessage());

+ 30 - 4
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/mservice/SyncSapFIUtils.java

@@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSONObject;
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.entity.DynamicObjectCollection;
 import kd.bos.exception.KDBizException;
+import kd.bos.ext.fi.plugin.ArApConvert.util.EmptyUtils;
 import kd.bos.logging.Log;
 import kd.bos.logging.LogFactory;
 import kd.bos.orm.query.QCP;
@@ -30,7 +31,7 @@ public class SyncSapFIUtils {
      * @return SAP系统的响应结果,以字符串形式返回
      * @throws KDBizException 如果请求失败,抛出业务异常
      */
-    public static String postDataToSAP( String jsonData)
+    public static String postDataToSAP(String urlType, String jsonData)
     {
         try {
             Map<String, String> mapentity = CommonHelperUtils.getCommonParams("SAP");
@@ -38,11 +39,22 @@ public class SyncSapFIUtils {
                 return null;
             }
             String param_voucher_url = mapentity.get("voucher_url");
+            String param_voucher_archive_url = mapentity.get("voucher_archive_url");
             String param_username = mapentity.get("username");
             String param_password = mapentity.get("password");
 
+            String post_url = null;
+            switch (urlType) {
+                case "voucher":
+                    post_url = param_voucher_url;break;
+                case "voucherArchive":
+                    post_url = param_voucher_archive_url;break;
+                default:
+                    break;
+            }
+
             if( StringUtils.isEmpty(param_username) || StringUtils.isEmpty(param_password)
-                    || StringUtils.isEmpty(param_voucher_url) ){
+                    || StringUtils.isEmpty(post_url) ){
                 return null;
             }
 
@@ -51,7 +63,7 @@ public class SyncSapFIUtils {
             header.put("Content-Type", "application/json; charset=UTF-8");
             header.put("Authorization", "Basic " + encoded);
 
-            String result = KHttpClientUtils.postjson(param_voucher_url, header, jsonData);
+            String result = KHttpClientUtils.postjson(post_url, header, jsonData);
             return result;
         } catch (Exception e) {
             throw new KDBizException("请求SAP接口失败:" + e.getMessage());
@@ -331,7 +343,21 @@ public class SyncSapFIUtils {
         return "0";
     }
 
-
+    public static String getVoucherArchiveData(String companyCode,String year)
+    {
+        JSONObject json = new JSONObject();
+        json.put("BUKRS", EmptyUtils.isNotEmpty(companyCode) ? companyCode : "");
+        json.put("GJAHR", year);
+        json.put("BELNR", "");
+        JSONObject itemMap = new JSONObject();
+        itemMap.put("BUKRS", "");
+        itemMap.put("GJAHR", "");
+        itemMap.put("BELNR", "");
+        JSONObject etMap = new JSONObject();
+        etMap.put("item", itemMap);
+        json.put("ET_ITEM", etMap);
+        return json.toString();
+    }
 
     public static String getVoucherFieldForQuery() {
         StringBuilder sb = new StringBuilder();

+ 72 - 1
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/mservice/impl/SynSapFIServiceImpl.java

@@ -92,7 +92,7 @@ public class SynSapFIServiceImpl implements SynSapService {
             //System.out.println("凭证 info:" + voucherInfo);
             logger.info("同步SAP凭证 info:" + voucherInfo);
             logger.info("同步SAP凭证 post:" + jsonData);
-            String response = SyncSapFIUtils.postDataToSAP(jsonData);
+            String response = SyncSapFIUtils.postDataToSAP("voucher",jsonData);
             logger.info("同步SAP凭证 return:" + response);
             if (StringUtils.isEmpty(response)) {
                 err.append("同步失败,SAP凭证:" + voucherInfo);
@@ -155,4 +155,75 @@ public class SynSapFIServiceImpl implements SynSapService {
         return result;
     }
 
+    /**
+     * 同步凭证档案号
+     *
+     * @param companyCode
+     * @return
+     */
+
+    public Map<String, String> synVoucherArchiveForSap(String companyCode,String year ) {
+        Map<String, String> result = new HashMap<>();
+        logger.info("同步SAP凭证归档号");
+        String data = SyncSapFIUtils.getVoucherArchiveData(companyCode,year);
+        logger.info("同步SAP凭证归档号,参数:" + data);
+        String response = SyncSapFIUtils.postDataToSAP("voucherArchive", data);
+        if (StringUtils.isEmpty(response)) {
+            result.put("code", "300");
+            result.put("msg", "同步SAP凭证归档号,同步失败");
+            return result;
+        }
+        JSONObject rData = JSONObject.parseObject(response);
+        String etype = rData.getString("E_TYPE");
+
+        if (!"S".equals(etype)) {
+            result.put("code", "301");
+            result.put("msg", "同步SAP凭证归档号,E_TYPE:" + etype + ",错误信息:" + rData.getString("E_MESSGE"));
+            return result;
+        }
+
+        JSONObject rEtItem = rData.getJSONObject("ET_ITEM");
+        if (rEtItem == null) {
+            result.put("code", "302");
+            result.put("msg", "同步SAP凭证归档号,ET_ITEM参数为空");
+            return result;
+        }
+
+        JSONArray rItemArray = rEtItem.getJSONArray("item");
+        if (rItemArray == null) {
+            result.put("code", "303");
+            result.put("msg", "同步SAP凭证归档号,item参数为空");
+            return result;
+        }
+
+        Map<String,String> voucherNumberMap = new HashMap<String, String>();
+        List<String> voucherNumberList  = new ArrayList<String>();
+        for (int i = 0; i < rItemArray.size(); ++i) {
+            JSONObject item = rItemArray.getJSONObject(i);
+            String number = item.getString("BELNR");
+            String ArchiveNumber = item.getString("XBLNR_ALT");  //归档号
+            if(StringUtils.isNotEmpty(ArchiveNumber)) {
+                voucherNumberMap.put(number, ArchiveNumber);
+                voucherNumberList.add(number);
+            }
+        }
+        QFilter filter = new QFilter("nckd_xblnr", QCP.in, voucherNumberList);
+        DynamicObject[] voucherDyns = BusinessDataServiceHelper.load("gl_voucher",  "id,nckd_xblnr,nckd_xrlnr_alt", new QFilter[]{filter});
+
+        ArrayList<DynamicObject> voucherList = new ArrayList<>();
+        for (DynamicObject voucherDyn : voucherDyns) {
+            voucherDyn.set("nckd_xrlnr_alt", voucherNumberMap.get(voucherDyn.getString("nckd_xblnr")));
+        }
+        if (voucherList.size() > 0) {
+            DynamicObject[] saveDynamicObject = voucherList.toArray(new DynamicObject[voucherList.size()]);
+            Object[] save = SaveServiceHelper.save(saveDynamicObject);
+            int length = save.length;
+            logger.info("同步[凭证归档号]完成,本次新增数量:{}" , length);
+            result.put("code", "200");
+            result.put("msg", "同步SAP凭证归档号,执行成功,本次同步数量" + length);
+        }
+
+        return result;
+    }
+
 }

+ 17 - 11
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/plugin/workflow/TaskApproverWorkflowPlugin.java

@@ -10,6 +10,7 @@ import kd.bos.orm.query.QCP;
 import kd.bos.orm.query.QFilter;
 import kd.bos.servicehelper.BusinessDataServiceHelper;
 import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.bos.util.CollectionUtils;
 import kd.bos.workflow.api.AgentExecution;
 import kd.bos.workflow.api.AgentTask;
 import kd.bos.workflow.engine.extitf.IWorkflowPlugin;
@@ -32,7 +33,14 @@ public class TaskApproverWorkflowPlugin implements IWorkflowPlugin {
         //获取当前节点实际审批人ID
         Long assigneeId = currentTask.getAssigneeId();
         BizLog.log("工作流当前审批人:" + assigneeId);
-        updateBillTaskApprover(businessKey,entityNumber, Collections.singletonList(assigneeId));
+
+        // 携带参数说明来源共享审核节点
+        if(e.getCurrentWFPluginParams().containsKey("istaskapprove")){
+            updateBillTaskApprover(businessKey,entityNumber, null);
+        }else{
+            updateBillTaskApprover(businessKey,entityNumber, Collections.singletonList(assigneeId));
+        }
+
     }
 
     /**
@@ -48,17 +56,15 @@ public class TaskApproverWorkflowPlugin implements IWorkflowPlugin {
         }
 
         DynamicObject billInfo = BusinessDataServiceHelper.loadSingle(billId, formId, String.join(",",ErReimBurseBillConstant.KEY_NCKD_TASKAPPROVER,"billno"));
-
-        // 按完成时间倒叙,取最晚的一条 如果共享被驳回,再次审核通过时反写
-        DynamicObject[] taskTaskhistories = BusinessDataServiceHelper.load("task_taskhistory", "billnumber,id,apprevalmessage,personid,tasktypeid,state", new QFilter[]{
-                new QFilter("billnumber", QCP.equals,billInfo.getString("billno"))
-        },"completetime desc");
-        BizLog.log("taskTaskhistories length:" + taskTaskhistories.length);
-        // 优先取共享审核人
-        if(taskTaskhistories.length > 0){
-            billInfo.set(ErReimBurseBillConstant.KEY_NCKD_TASKAPPROVER,taskTaskhistories[0].getDynamicObject("personid"));
-        }else{
+        if(CollectionUtils.isNotEmpty(currentApprover) && currentApprover.get(0) != 0L){
             billInfo.set(ErReimBurseBillConstant.KEY_NCKD_TASKAPPROVER,currentApprover.get(0));
+        }else{
+            // 按完成时间倒叙,取最晚的一条 如果共享被驳回,再次审核通过时反写
+            DynamicObject[] taskTaskhistories = BusinessDataServiceHelper.load("task_taskhistory", "billnumber,id,apprevalmessage,personid,tasktypeid,state", new QFilter[]{
+                    new QFilter("billnumber", QCP.equals,billInfo.getString("billno"))
+            },"completetime desc");
+            BizLog.log("taskTaskhistories length:" + taskTaskhistories.length);
+            billInfo.set(ErReimBurseBillConstant.KEY_NCKD_TASKAPPROVER,taskTaskhistories[0].getDynamicObject("personid"));
         }
         SaveServiceHelper.save(new DynamicObject[]{ billInfo });
     }

+ 55 - 0
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/task/SynVoucherArchiveTask.java

@@ -0,0 +1,55 @@
+package nckd.jimin.jyyy.fi.task;
+
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.entity.DynamicObject;
+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.executor.AbstractTask;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.sdk.plugin.Plugin;
+import nckd.jimin.jyyy.fi.mservice.impl.SynSapFIServiceImpl;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * 后台任务插件
+ */
+public class SynVoucherArchiveTask extends AbstractTask implements Plugin {
+
+    private static final Log logger = LogFactory.getLog(SynVoucherArchiveTask.class);
+    public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
+        SynSapFIServiceImpl synSapService = new SynSapFIServiceImpl();
+        //属性核算组织=是
+        QFilter qFilter = new QFilter("fisaccounting", QCP.equals, "1");
+        //使用状态=启用
+        qFilter.and(new QFilter("enable", QCP.equals, "1"));
+        //数据状态=已审核
+        qFilter.and(new QFilter("status", QCP.equals, "C"));
+        //属性核算组织=是
+        qFilter.and(new QFilter("fisaccounting", QCP.equals, "1"));
+        DynamicObject[] orgLst = BusinessDataServiceHelper.load("bos_org", "id, number", qFilter.toArray());
+
+        logger.info("------同步SAP凭证归档----------");
+
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
+        String currentYear = sdf.format(new Date());
+
+        for (DynamicObject org : orgLst) {
+
+            String orgNumber = org.getString("number");
+            logger.info("------同步SAP凭证归档 " + orgNumber + "----------");
+            Map<String, String> result = synSapService.synVoucherArchiveForSap(orgNumber,  currentYear);
+
+            if (!result.get("code").equals("200")) {
+                logger.info("同步SAP凭证归档失败, " + "组织编码:" + orgNumber + ",错误:" + result.get("msg"));
+            } else {
+                logger.info("同步SAP凭证归档成功, " + "组织编码:" + orgNumber + ",信息:" + result.get("msg"));
+            }
+        }
+    }
+}