1
0

5 Incheckningar d61d882ae0 ... e850dce3d2

Upphovsman SHA1 Meddelande Datum
  13246659623 e850dce3d2 付款代码 6 månader sedan
  13246659623 89a86f4918 Merge branch 'master' of http://111.75.220.136:10030/13246659623/jxyh 6 månader sedan
  13246659623 b2b92c61df Merge branch 'master' of http://111.75.220.136:10030/13246659623/jxyh 7 månader sedan
  13246659623 d95626828f Merge branch 'master' of http://111.75.220.136:10030/13246659623/jxyh 7 månader sedan
  13246659623 c76fda1cd2 付款代码 7 månader sedan

+ 663 - 1
src/main/java/fi/cas/opplugin/PayBillToolUtil.java

@@ -1,5 +1,6 @@
 package fi.cas.opplugin;
 import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
 import kd.bos.entity.EntityMetadataCache;
 import kd.bos.logging.Log;
 import kd.bos.logging.LogFactory;
@@ -31,7 +32,9 @@ import javax.xml.transform.stream.StreamResult;
 
 public class PayBillToolUtil {
     public static final String ENTITY_NAME = "cas_paybill";
+    public static final String AGENT_ENTITY_NAME = "cas_agentpaybill";
     protected static final Log log = LogFactory.getLog(PayBillToolUtil.class);
+    public static final String CHANNELCODE_PILIANG="JF";
 
     public static String queryPaymentRequest(DynamicObject payBillEntity) {
         try {
@@ -71,6 +74,256 @@ public class PayBillToolUtil {
             return null;
         }
     }
+    /**
+     * 代发单部分成功,关闭支付
+     * @param agentpayBillEntity
+     * @return
+     */
+    public static String createSingleAgentPaymentRequest_4(DynamicObject agentpayBillEntity) {
+        return "";
+    }
+    /**
+     * 代发单全部成功,关闭支付
+     * @param agentpayBillEntity
+     * @return
+     */
+    public static String createSingleAgentPaymentRequest_3(DynamicObject agentpayBillEntity) {
+        try {
+            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
+            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
+            Document doc = dBuilder.newDocument();
+
+            Element rootElement = doc.createElement("Message");
+            doc.appendChild(rootElement);
+
+            agentPaymentXMLHead(agentpayBillEntity,doc,rootElement,"ACHRDATE");
+
+
+            Element body = doc.createElement("BodyInfo");
+            rootElement.appendChild(body);
+
+            agentPaymentXMLBody_Msg(agentpayBillEntity,doc,body);
+
+            TransformerFactory transformerFactory = TransformerFactory.newInstance();
+            Transformer transformer = transformerFactory.newTransformer();
+
+            // 指定编码格式为GBK
+            transformer.setOutputProperty(OutputKeys.ENCODING, "GBK");
+            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+
+
+            DOMSource source = new DOMSource(doc);
+            StringWriter writer = new StringWriter();
+            StreamResult result = new StreamResult(writer);
+            transformer.transform(source, result);
+
+            return writer.toString();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 代发单表头支付信息查询
+     * @param agentpayBillEntity
+     * @return
+     */
+    public static String createSingleAgentPaymentRequest_5(DynamicObject agentpayBillEntity) {
+        try {
+            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
+            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
+            Document doc = dBuilder.newDocument();
+
+            Element rootElement = doc.createElement("Message");
+            doc.appendChild(rootElement);
+
+            agentPaymentXMLHead(agentpayBillEntity,doc,rootElement,"ACHRMSGQ");
+
+
+            Element body = doc.createElement("BodyInfo");
+            rootElement.appendChild(body);
+
+            agentPaymentXMLBody_Msg(agentpayBillEntity,doc,body);
+
+            TransformerFactory transformerFactory = TransformerFactory.newInstance();
+            Transformer transformer = transformerFactory.newTransformer();
+
+            // 指定编码格式为GBK
+            transformer.setOutputProperty(OutputKeys.ENCODING, "GBK");
+            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+
+
+            DOMSource source = new DOMSource(doc);
+            StringWriter writer = new StringWriter();
+            StreamResult result = new StreamResult(writer);
+            transformer.transform(source, result);
+
+            return writer.toString();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+
+    /**
+     * 代发单明细支付信息查询
+     * @param agentpayBillEntity
+     * @return
+     */
+    public static String createSingleAgentPaymentRequest_6(DynamicObject agentpayBillEntity) {
+        return "";
+    }
+
+
+    /**
+     * 代发单重发,只传失败的数据
+     * @param agentpayBillEntity
+     * @return
+     */
+    public static String createSingleAgentPaymentRequest_7(DynamicObject agentpayBillEntity) {
+        return "";
+    }
+
+    /**
+     * 代发单发起支付..待完善
+     * @param agentpayBillEntity
+     * @return
+     */
+    public static String createSingleAgentPaymentRequest_2(DynamicObject agentpayBillEntity) {
+        try {
+            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
+            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
+            Document doc = dBuilder.newDocument();
+
+            Element rootElement = doc.createElement("Message");
+            doc.appendChild(rootElement);
+
+            agentPaymentXMLHead(agentpayBillEntity,doc,rootElement,"ACHRDATD");
+
+
+            Element body = doc.createElement("BodyInfo");
+            rootElement.appendChild(body);
+
+            agentPaymentXMLBody_Msg(agentpayBillEntity,doc,body);
+
+            TransformerFactory transformerFactory = TransformerFactory.newInstance();
+            Transformer transformer = transformerFactory.newTransformer();
+
+            // 指定编码格式为GBK
+            transformer.setOutputProperty(OutputKeys.ENCODING, "GBK");
+            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+
+
+            DOMSource source = new DOMSource(doc);
+            StringWriter writer = new StringWriter();
+            StreamResult result = new StreamResult(writer);
+            transformer.transform(source, result);
+
+            return writer.toString();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+
+    }
+
+
+
+    /**
+     * 代发单付款请求拼接
+     * @param agentpayBillEntity
+     * @return
+     */
+    public static String createSingleAgentPaymentRequest_1(DynamicObject agentpayBillEntity) {
+        try {
+            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
+            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
+            Document doc = dBuilder.newDocument();
+
+            Element rootElement = doc.createElement("Message");
+            doc.appendChild(rootElement);
+
+            agentPaymentXMLHead(agentpayBillEntity,doc,rootElement,"ACHRDATI");
+
+            Element body = doc.createElement("BodyInfo");
+            rootElement.appendChild(body);
+            agentPaymentXMLBody_Msg(agentpayBillEntity,doc,body);
+
+            agentPaymentXMLBody_Entry(agentpayBillEntity,doc,body);
+
+            TransformerFactory transformerFactory = TransformerFactory.newInstance();
+            Transformer transformer = transformerFactory.newTransformer();
+
+            // 指定编码格式为GBK
+            transformer.setOutputProperty(OutputKeys.ENCODING, "GBK");
+            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+
+
+            DOMSource source = new DOMSource(doc);
+            StringWriter writer = new StringWriter();
+            StreamResult result = new StreamResult(writer);
+            transformer.transform(source, result);
+
+            return writer.toString();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+    public static void agentPaymentXMLHead(DynamicObject agentpayBillEntity,Document doc,Element rootElement,String transcode) {
+        Element head = doc.createElement("HeadInfo");
+        rootElement.appendChild(head);
+        createElement(doc, head, "transcode", transcode);
+        createElement(doc, head, "channelcode", CHANNELCODE_PILIANG);//发起渠道
+        Calendar currentdate = Calendar.getInstance();
+        String datacur = TypeUtils.date2String(currentdate.getTime(),"yyyyMMdd");
+        createElement(doc, head, "channeldate", datacur);//发起渠道日期
+        String channelserno = datacur+"-"+currentdate.get(Calendar.HOUR)+""+currentdate.get(Calendar.MINUTE)+""+currentdate.get(Calendar.SECOND);
+        createElement(doc, head, "channelserno", channelserno);//发起渠道流水
+        createElement(doc, head, "channeltime", currentdate.get(Calendar.HOUR)+""+currentdate.get(Calendar.MINUTE)+""+currentdate.get(Calendar.SECOND));
+
+        createElement(doc, head, "brno", "");//交易发起机构,可为空,默认100800
+        createElement(doc, head, "bustype", "");
+        createElement(doc, head, "buskind", "");
+        createElement(doc, head, "reserve", "");
+    }
+
+    public static void agentPaymentXMLBody_Msg(DynamicObject agentpayBillEntity,Document doc,Element body) {
+        createElement(doc, body, "FileName",agentpayBillEntity.getString("nckd_filename") );//文件名称
+        createElement(doc, body, "FileType",agentpayBillEntity.getString("nckd_filetype") );//文件类型
+
+        //付款账号
+        DynamicObject payeracctbankEntity = BusinessDataServiceHelper.loadSingleFromCache(agentpayBillEntity.getDynamicObject("payeracctbank").getPkValue(), "am_accountbank");
+        String payeracc = payeracctbankEntity.getString("bankaccountnumber");
+        String payername = payeracctbankEntity.getString("acctname");
+        createElement(doc, body, "OutRichNbr", payeracc);//出款户口号
+
+        createElement(doc, body, "HrSignnbr", agentpayBillEntity.getString("billno"));//人力流水号
+        createElement(doc, body, "CcyNbr", "156");//币种,写死人名币
+        createElement(doc, body, "CCYTYPE", "0");//币种,写死人名币
+        createElement(doc, body, "TOTALNUM", agentpayBillEntity.getString("count"));//汇总笔数
+        createElement(doc, body, "TOTALAMT", agentpayBillEntity.getBigDecimal("payamount").setScale(2, RoundingMode.DOWN).toString());//汇总金额
+        createElement(doc, body, "FeeFlag", "0");//收费标志
+    }
+
+    public static void agentPaymentXMLBody_Entry(DynamicObject agentpayBillEntity,Document doc,Element body) {
+        // 获取分录数据
+        DynamicObjectCollection entryList = agentpayBillEntity.getDynamicObjectCollection("entry");
+
+        for (DynamicObject entry : entryList) {
+            Element achrapaydtl_i = doc.createElement("achrapaydtl_i"); // 每条数据用一个achrapaydtl_i元素包裹
+            body.appendChild(achrapaydtl_i);
+
+            createElement(doc, achrapaydtl_i, "IdenNbr", entry.getString("nckd_zjh"));//证件号
+            createElement(doc, achrapaydtl_i, "InRichNbr", entry.getString("payeeacctbank"));//收款户口号
+            createElement(doc, achrapaydtl_i, "PayAmt", entry.getBigDecimal("e_amount").setScale(2, RoundingMode.DOWN).toString());//支付金额
+            createElement(doc, achrapaydtl_i, "RowCnt", "10000");//展示条数
+        }
+    }
+
+
     public static String createSinglePaymentRequest(DynamicObject payBillEntity) {
         try {
             DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
@@ -148,6 +401,240 @@ public class PayBillToolUtil {
         parent.appendChild(element);
     }
 
+
+    /**
+     * 代发单支付-开始传输第一步及后续
+     * @params billEntities
+     * @returns 返回报错信息
+     *
+     */
+    public static String agentpayBillForCBSSync(DynamicObject[] billEntities) {
+        StringBuffer errMsg = new StringBuffer();
+        //获取接口链接等信息
+        DynamicObject jkpzxx = BusinessDataServiceHelper.loadSingle("nckd_jkpzxx",new QFilter[]{new QFilter("number","=","paytozfqz")});
+        String servername =  jkpzxx.getString("nckd_servername");
+        String port =  jkpzxx.getString("nckd_port");
+
+        for (DynamicObject dataEntity : billEntities) {
+            boolean isSuccess = false;//第一步是否成功标识
+            boolean isZFQZ = true;
+            Map<String, String> qzObject = new HashMap<>();
+            DynamicObject payBillEntity = BusinessDataServiceHelper.loadSingle(dataEntity.getPkValue(), AGENT_ENTITY_NAME);
+
+
+            /**
+             *   判断是否可以走前置支付
+             *   1、代发单为审核状态
+             *   2、支付状态为未支付
+             */
+            String billNum = payBillEntity.getString("billno");
+            String billstatusString = payBillEntity.getString("billstatus");
+            String paystatus = payBillEntity.getString("nckd_paystatus");
+
+            if (!"C".equals(billstatusString)) {
+                errMsg.append("单据号:").append(billNum).append(",付款单为审核状态,才能提交~\r\n");
+                isZFQZ = false;
+            }
+            if (!"1".equals(paystatus) && !"".equals(paystatus)) {
+                errMsg.append("单据号:").append(billNum).append(",付款单为未支付,才能提交~\r\n");
+                isZFQZ = false;
+            }
+            if(payBillEntity.getDynamicObject("payeracctbank")==null) {
+                errMsg.append("单据号:").append(billNum).append(",付款账户为空~\r\n");
+                isZFQZ = false;
+            }
+
+
+
+            //构建支付数据导入请求xml
+            String bodyxml =  createSingleAgentPaymentRequest_1(payBillEntity);
+            if(bodyxml==null){
+                isZFQZ = false;
+                errMsg.append("单据号:").append(billNum).append(",第一步无法拼出正确的xml请求~\r\n");
+            }
+
+            if(!isZFQZ){
+                continue;
+            }
+            log.info("单据号:"+billNum+"传入参数"+bodyxml);
+            JSONObject cbsReturnJson =socketServiceQuery(servername,port,bodyxml,"ACHRDATI");
+            log.info("单据号:"+billNum+"返回参数"+cbsReturnJson.toString());
+            //存入日志表
+            saveAgentlog(payBillEntity,bodyxml,cbsReturnJson.toString(),"1");
+
+
+            if(cbsReturnJson==null){
+                isSuccess = false;
+                errMsg.append("单据号:").append(billNum).append(",第一步支付数据导入失败,");
+                errMsg.append("错误号:").append("XXXXXXX");
+                errMsg.append(",错误原因:").append("接口无法连通,未获取到返回结果");
+                errMsg.append("\r\n");
+            }else if(cbsReturnJson.get("Message")==null){
+                isSuccess = false;
+                errMsg.append("单据号:").append(billNum).append(",第一步支付数据导入失败,");
+                errMsg.append("错误号:").append("DDDDDD1");
+                errMsg.append(",错误原因:").append("接口已连通,但未获取到返回结果");
+                errMsg.append("\r\n");
+            }else{
+                JSONObject head = cbsReturnJson.getJSONObject("Message").getJSONObject("HeadInfo");
+                if(head==null){
+                    isSuccess = false;
+                    errMsg.append("单据号:").append(billNum).append(",第一步支付数据导入失败,");
+                    errMsg.append("错误号:").append("DDDDDDD2");
+                    errMsg.append(",错误原因:").append("接口已连通,但无法解析返回结果"+cbsReturnJson.toString());
+                    errMsg.append("\r\n");
+                }else{
+                    String errcode =head.getString("errorcode");
+
+                    if ("FIN0000".equals(errcode)) {//已受理,表示传输成功
+                        isSuccess = true;
+                        errMsg.append("单据号:").append(billNum).append(",第一步支付数据导入成功!");
+
+                        //第二步。调用付款接口
+                        String[] returnmsg_2 = agentpayBillFukuan(servername,port,payBillEntity);
+                        errMsg.append(returnmsg_2[1]);
+                        if("2".equals(returnmsg_2[0])){//第二步成功
+                            payBillEntity.set("nckd_hxzt","R");//改核心状态为已登记等待执行结果
+                        }else{//第二步失败
+                            payBillEntity.set("nckd_hxzt","A");//执行失败
+                        }
+                        payBillEntity.set("nckd_paystatus","B");
+                    }else{
+                        errMsg.append("单据号:").append(billNum).append(",第一步支付数据导入失败!"+head.getString("errormsg"));
+
+                    }
+                }
+            }
+
+            if (isSuccess) {
+                SaveServiceHelper.update(new DynamicObject[]{payBillEntity});
+            }
+        }
+        return errMsg.toString();
+    }
+
+    /**
+     * 代发单关闭-第三步
+     * @param servername
+     * @param port
+     * @param payBillEntity
+     * @return
+     */
+    public static String[] agentpayBillGuanBi_auto(String servername,String port,DynamicObject payBillEntity) {
+        StringBuffer errMsg = new StringBuffer();
+        boolean isZFQZ = true;
+        String billNum = payBillEntity.getString("billno");
+        String bodyxml = createSingleAgentPaymentRequest_3(payBillEntity);
+        if(bodyxml==null){
+            isZFQZ = false;
+            errMsg.append("单据号:").append(billNum).append(",无法拼出正确的关闭xml请求~\r\n");
+        }
+        if(!isZFQZ){
+            return new String[]{"-1",errMsg.toString()};
+        }
+        log.info("单据号:"+billNum+"关闭传入参数"+bodyxml);
+        JSONObject cbsReturnJson =socketServiceQuery(servername,port,bodyxml,"XXXX3");
+        log.info("单据号:"+billNum+"关闭返回参数"+cbsReturnJson.toString());
+        saveAgentlog(payBillEntity,bodyxml,cbsReturnJson.toString(),"4");
+        String errmark = "4";
+
+        if(cbsReturnJson==null){
+            errmark = "1";
+            errMsg.append("单据号:").append(billNum).append(",第三步关闭付款失败,");
+            errMsg.append("错误号:").append("XXXXXXX");
+            errMsg.append(",错误原因:").append("接口无法连通,未获取到返回结果");
+            errMsg.append("\r\n");
+        }else if(cbsReturnJson.get("Message")==null){
+            errmark = "1";
+            errMsg.append("单据号:").append(billNum).append(",第三步关闭付款失败,");
+            errMsg.append("错误号:").append("DDDDDD1");
+            errMsg.append(",错误原因:").append("接口已连通,但未获取到返回结果");
+            errMsg.append("\r\n");
+        }else{
+            JSONObject bodyinfo = cbsReturnJson.getJSONObject("Message").getJSONObject("Body");
+            if(bodyinfo==null){
+                errmark = "1";
+                errMsg.append("单据号:").append(billNum).append(",第三步关闭付款失败,");
+                errMsg.append("错误号:").append("DDDDDDD2");
+                errMsg.append(",错误原因:").append("接口已连通,但无法解析返回结果"+cbsReturnJson.toString());
+                errMsg.append("\r\n");
+            }else{
+                String errcode =bodyinfo.getString("errorcode");
+
+                if ("FIN0000".equals(errcode)) {//已受理,表示传输成功
+                    errMsg.append("单据号:").append(billNum).append(",第三步关闭付款成功!");
+
+                    errmark = "3";
+                }
+
+            }
+        }
+        return new String[]{errmark,errMsg.toString()};
+    }
+
+
+    /**
+     * 代发单-第二步
+     * @param servername
+     * @param port
+     * @param payBillEntity
+     * @return
+     */
+    public static String[] agentpayBillFukuan(String servername,String port,DynamicObject payBillEntity) {
+        StringBuffer errMsg = new StringBuffer();
+        boolean isZFQZ = true;
+        String billNum = payBillEntity.getString("billno");
+        String bodyxml = createSingleAgentPaymentRequest_2(payBillEntity);
+        if(bodyxml==null){
+            isZFQZ = false;
+            errMsg.append("单据号:").append(billNum).append(",无法拼出正确的xml请求~\r\n");
+        }
+        if(!isZFQZ){
+            return new String[]{"-1",errMsg.toString()};
+        }
+        log.info("单据号:"+billNum+"传入参数"+bodyxml);
+        JSONObject cbsReturnJson =socketServiceQuery(servername,port,bodyxml,"ACHRDATD");
+        log.info("单据号:"+billNum+"返回参数"+cbsReturnJson.toString());
+        saveAgentlog(payBillEntity,bodyxml,cbsReturnJson.toString(),"2");
+        String errmark = "4";
+
+        if(cbsReturnJson==null){
+            errmark = "1";
+            errMsg.append("单据号:").append(billNum).append(",第二步调用执行失败,");
+            errMsg.append("错误号:").append("XXXXXXX");
+            errMsg.append(",错误原因:").append("接口无法连通,未获取到返回结果");
+            errMsg.append("\r\n");
+        }else if(cbsReturnJson.get("Message")==null){
+            errmark = "1";
+            errMsg.append("单据号:").append(billNum).append(",第二步调用执行失败,");
+            errMsg.append("错误号:").append("DDDDDD1");
+            errMsg.append(",错误原因:").append("接口已连通,但未获取到返回结果");
+            errMsg.append("\r\n");
+        }else{
+            JSONObject head = cbsReturnJson.getJSONObject("Message").getJSONObject("HeadInfo");
+            if(head==null){
+                errmark = "1";
+                errMsg.append("单据号:").append(billNum).append(",第二步调用执行失败,");
+                errMsg.append("错误号:").append("DDDDDDD2");
+                errMsg.append(",错误原因:").append("接口已连通,但无法解析返回结果"+cbsReturnJson.toString());
+                errMsg.append("\r\n");
+            }else{
+                String errcode =head.getString("errorcode");
+
+                if ("FIN0000".equals(errcode)) {//已受理,表示传输成功
+                    errMsg.append("单据号:").append(billNum).append(",第二步调用执行成功!");
+                    errmark = "2";
+                }else{
+                    errMsg.append("单据号:").append(billNum).append(",第二步调用执行失败!"+head.getString("errormsg"));
+                    errmark = "3";
+                }
+
+            }
+        }
+        return new String[]{errmark,errMsg.toString()};
+    }
+
+
     /**
      * 支付单同步
      * @params billEntities
@@ -167,7 +654,6 @@ public class PayBillToolUtil {
             Map<String, String> qzObject = new HashMap<>();
             DynamicObject payBillEntity = BusinessDataServiceHelper.loadSingle(dataEntity.getPkValue(), ENTITY_NAME);
 
-            String cbsUrlBill ="";
 
             /**
              *   判断是否可以走前置支付
@@ -279,6 +765,50 @@ public class PayBillToolUtil {
         return errMsg.toString();
     }
 
+
+    public static void saveAgentlog(DynamicObject payBillEntity,String qqbw,String fhbw,String type){
+        try {
+            DynamicObject logInfo = new DynamicObject( EntityMetadataCache.getDataEntityType("nckd_zfjkdyrz"));
+            String channelserno = payBillEntity.getString("billno");
+            logInfo.set("number",channelserno);
+            if("1".equals(type)){
+                logInfo.set("name",payBillEntity.get("billno")+"支付数据导入日志");
+            }else if("2".equals(type)){
+                logInfo.set("name",payBillEntity.get("billno")+"支付数据执行日志");
+            }else if("3".equals(type)){
+                logInfo.set("name",payBillEntity.get("billno")+"支付数据重发日志");
+            }else if("4".equals(type)){
+                logInfo.set("name",payBillEntity.get("billno")+"支付结束(成功)日志");
+            }else if("5".equals(type)){
+                logInfo.set("name",payBillEntity.get("billno")+"代发单表头支付信息查询日志");
+            }else if("6".equals(type)){
+                logInfo.set("name",payBillEntity.get("billno")+"代发单分录支付信息查询日志");
+            }else if("7".equals(type)){
+                logInfo.set("name",payBillEntity.get("billno")+"支付结束(失败)日志");
+            }
+            logInfo.set("nckd_jklx",type);
+            logInfo.set("status","A");
+            logInfo.set("enable","1");
+            Calendar currentdate = Calendar.getInstance();
+            logInfo.set("nckd_redate",currentdate.getTime());
+            logInfo.set("nckd_billno",payBillEntity.get("billno"));
+            logInfo.set("nckd_payid",payBillEntity.getPkValue()+"");
+            logInfo.set("nckd_qqbw_tag",qqbw);
+            logInfo.set("nckd_fhbw_tag",fhbw);
+            logInfo.set("nckd_redate",new Date());
+
+            logInfo.set("nckd_djlx","2");
+            OperationServiceHelper.executeOperate("save","nckd_zfjkdyrz",new DynamicObject[]{logInfo});
+
+        }catch (Exception e){
+            log.info("保存日志报错"+e.getMessage());
+
+        }
+
+
+    }
+
+
     public static void savelog(DynamicObject payBillEntity,String qqbw,String fhbw){
         try {
             DynamicObject logInfo = new DynamicObject( EntityMetadataCache.getDataEntityType("nckd_zfjkdyrz"));
@@ -370,6 +900,138 @@ public class PayBillToolUtil {
 
 
 
+    /**
+     * 支付单同步
+     * @params billEntities
+     * @returns 返回报错信息
+     *
+     */
+    public static String agentPayBillClose(DynamicObject[] billEntities) {
+        StringBuffer errMsg = new StringBuffer();
+        //获取接口链接等信息
+        DynamicObject jkpzxx = BusinessDataServiceHelper.loadSingle("nckd_jkpzxx",new QFilter[]{new QFilter("number","=","paytozfqz")});
+        String servername =  jkpzxx.getString("nckd_servername");
+        String port =  jkpzxx.getString("nckd_port");
+
+        for (DynamicObject dataEntity : billEntities) {
+            boolean isSuccess = false;
+            boolean isZFQZ = true;
+            Map<String, String> qzObject = new HashMap<>();
+            DynamicObject payBillEntity = BusinessDataServiceHelper.loadSingle(dataEntity.getPkValue(), ENTITY_NAME);
+
+
+            /**
+             *   判断是否可以走前置支付
+             *   1、付款单为审核状态
+             *   2、支付状态为未支付
+             *   3、版本号>=1时,必须等于付款次数
+             */
+            String billNum = payBillEntity.getString("billno");
+            String billstatusString = payBillEntity.getString("billstatus");
+            String paystatus = payBillEntity.getString("nckd_paystatus");
+            int bbh = payBillEntity.getInt("nckd_bbh");
+            int fkcs = payBillEntity.getInt("nckd_fkcs");
+
+            if (!"C".equals(billstatusString)) {
+                errMsg.append("单据号:").append(billNum).append(",付款单为审核状态,才能提交~\r\n");
+                isZFQZ = false;
+            }
+            if (!"1".equals(paystatus) && !"".equals(paystatus)) {
+                errMsg.append("单据号:").append(billNum).append(",付款单为未支付,才能提交~\r\n");
+                isZFQZ = false;
+            }
+            if(bbh>=1 && bbh!=fkcs){
+                errMsg.append("单据号:").append(billNum).append(",付款单未调整,请调整数据,或点击重付~\r\n");
+                isZFQZ = false;
+            }
+            if(payBillEntity.getDynamicObject("payeracctbank")==null) {
+                errMsg.append("单据号:").append(billNum).append(",付款账户为空~\r\n");
+                isZFQZ = false;
+            }
+            if(payBillEntity.getDynamicObject("payeebank")==null) {
+                errMsg.append("单据号:").append(billNum).append(",收款账户为空~\r\n");
+                isZFQZ = false;
+            }
+
+
+            //构建请求xml
+            String bodyxml =  createSinglePaymentRequest(payBillEntity);
+            if(bodyxml==null){
+                isZFQZ = false;
+                errMsg.append("单据号:").append(billNum).append(",无法拼出正确的xml请求~\r\n");
+            }
+
+            if(!isZFQZ){
+                continue;
+            }
+            log.info("单据号:"+billNum+"传入参数"+bodyxml);
+            JSONObject cbsReturnJson =socketService(servername,port,bodyxml);
+            log.info("单据号:"+billNum+"返回参数"+cbsReturnJson.toString());
+            //存入日志表
+            savelog(payBillEntity,bodyxml,cbsReturnJson.toString());
+
+
+            if(cbsReturnJson==null){
+                isSuccess = false;
+                errMsg.append("单据号:").append(billNum).append(",推送支付前置失败,");
+                errMsg.append("错误号:").append("XXXXXXX");
+                errMsg.append(",错误原因:").append("接口无法连通,未获取到返回结果");
+                errMsg.append("\r\n");
+            }else if(cbsReturnJson.get("Message")==null){
+                isSuccess = false;
+                errMsg.append("单据号:").append(billNum).append(",推送支付前置失败,");
+                errMsg.append("错误号:").append("DDDDDD1");
+                errMsg.append(",错误原因:").append("接口已连通,但未获取到返回结果");
+                errMsg.append("\r\n");
+            }else{
+                JSONObject bodyinfo = cbsReturnJson.getJSONObject("Message").getJSONObject("Body");
+                if(bodyinfo==null){
+                    isSuccess = false;
+                    errMsg.append("单据号:").append(billNum).append(",推送支付前置失败,");
+                    errMsg.append("错误号:").append("DDDDDDD2");
+                    errMsg.append(",错误原因:").append("接口已连通,但无法解析返回结果"+cbsReturnJson.toString());
+                    errMsg.append("\r\n");
+                }else{
+                    String errcode =bodyinfo.getString("errorcode");
+
+                    if ("FIN0000".equals(errcode)) {//已受理,不代表支付成功
+                        isSuccess = true;
+                        errMsg.append("单据号:").append(billNum).append(",推送支付前置成功!");
+                        payBillEntity.set("nckd_fkcs", fkcs+1);//付款次数+1
+                        payBillEntity.set("nckd_sbyy",bodyinfo.getString("errormsg"));//错误信息
+                        String zfstatus = bodyinfo.getString("status");
+                        if("S".equals(zfstatus)){//成功
+                            payBillEntity.set("nckd_paystatus",3);
+                        }else if("U".equals(zfstatus)){//在途
+                            payBillEntity.set("nckd_paystatus",2);//支付中
+                        }else if("F".equals(zfstatus)){//失败
+                            payBillEntity.set("nckd_paystatus",4);//支付失败
+                        }
+
+                    } else {//拿到返回结果支付次数就必须加一
+                        isSuccess = false;
+                        errMsg.append("单据号:").append(billNum).append(",推送支付前置失败,");
+                        errMsg.append("错误号:").append(errcode);
+                        errMsg.append(",错误原因:").append(bodyinfo.getString("errormsg"));
+                        errMsg.append("\r\n");
+                        payBillEntity.set("nckd_fkcs", fkcs+1);//付款次数+1
+                        payBillEntity.set("nckd_paystatus",4);//支付失败
+                        payBillEntity.set("nckd_sbyy",bodyinfo.getString("errormsg"));//错误信息
+                        SaveServiceHelper.update(new DynamicObject[]{payBillEntity});
+                    }
+
+                }
+            }
+
+            if (isSuccess) {
+                SaveServiceHelper.update(new DynamicObject[]{payBillEntity});
+            }
+        }
+        return errMsg.toString();
+    }
+
+
+
     public static JSONObject socketServiceQuery(String serverName,String port,String xmlData,String transcode){
         try {
             Socket client = new Socket(serverName,TypeUtils.nullToInt(port));

+ 1 - 2
src/main/java/fi/cas/opplugin/PayToZFQZOP.java

@@ -47,10 +47,9 @@ public class PayToZFQZOP  extends AbstractOperationServicePlugIn {
             errMsg =  PayBillToolUtil.payBillForCBSSync(billEntities);
         }
         if(!errMsg.isEmpty()) {
-            ////将错误信息返回到前端
+            //将成功错误信息返回到前端
             e.setCancelMessage(errMsg);
             e.setCancel(true);
-            System.out.println("PayToZFQZOP 错误信息:" + errMsg.toString());
         }
     }
 

+ 10 - 2
src/main/java/fi/cas/task/PayUpadteStatusTask.java

@@ -22,7 +22,15 @@ public class PayUpadteStatusTask  extends AbstractTask {
         QFilter filter = new QFilter("billstatus", QCP.equals, "C");
         filter.and("nckd_paystatus", QCP.equals, 3);
         filter.and("nckd_fkcs", QCP.large_than, 0);
-        DynamicObject[] payinfos = BusinessDataServiceHelper.load("cas_paybill","billno,billstatus,nckd_paystatus,nckd_sbyy,nckd_fqqdrq,nckd_fkcs,nckd_bbh", new QFilter[] {filter});
-        OperationServiceHelper.executeOperate("pay","cas_paybill",payinfos, OperateOption.create());
+        DynamicObject[] payinfos = BusinessDataServiceHelper.load("cas_paybill","billno", new QFilter[] {filter});
+        if(payinfos.length>0){
+            DynamicObject[] payrealinfo = new DynamicObject[payinfos.length];
+            for (int i = 0; i <payinfos.length ; i++) {
+                DynamicObject payinfo = BusinessDataServiceHelper.loadSingle(payinfos[i].getPkValue(),"cas_paybill");
+                payrealinfo[i] = payinfo;
+            }
+            OperationServiceHelper.executeOperate("pay","cas_paybill",payrealinfo, OperateOption.create());
+
+        }
     }
 }

+ 8 - 8
src/main/java/fi/em/formPlugin/AgentpaybillFormPlugin.java

@@ -22,7 +22,7 @@ import java.util.*;
  */
 public class AgentpaybillFormPlugin extends AbstractListPlugin implements Plugin {
     private static String nckd_cas_agentpaybill="nckd_cas_agentpaybill";//代发处理单标识
-    private static String nckd_paystate="nckd_paystate";//支付状态标识
+    private static String nckd_paystatus="nckd_paystatus";//支付状态标识
     private static String nckd_salarydistribute="nckd_salarydistribute";//薪酬计提发放单标识
 
 
@@ -44,11 +44,11 @@ public class AgentpaybillFormPlugin extends AbstractListPlugin implements Plugin
             //获取源单id
             Long sourcebillid=entryCollection.get(0).getLong("sourcebillid");
             //支付状态
-            String nckd_paystate=dynamicObject.getString("nckd_paystate");
+            String nckd_paystatus=dynamicObject.getString("nckd_paystatus");
             QFilter filter=new QFilter("id",QCP.equals,sourcebillid);
             //获取薪酬计提
-            DynamicObject agentpaybill=BusinessDataServiceHelper.loadSingle(nckd_salarydistribute,"id,nckd_paystate",new QFilter[]{filter});
-            agentpaybill.set("nckd_paystate",nckd_paystate);
+            DynamicObject agentpaybill=BusinessDataServiceHelper.loadSingle(nckd_salarydistribute,"id,nckd_paystatus",new QFilter[]{filter});
+            agentpaybill.set("nckd_paystatus",nckd_paystatus);
             SaveServiceHelper.save(new DynamicObject[] {agentpaybill});
         }
 
@@ -125,7 +125,7 @@ public class AgentpaybillFormPlugin extends AbstractListPlugin implements Plugin
         super.beforePropertyChanged(e);
         String name=e.getProperty().getName();
         //支付状态发生改变
-        if (nckd_paystate.equals(name))
+        if (nckd_paystatus.equals(name))
         {
             //获取当前单据模型
             DynamicObject dynamicObject=this.getModel().getDataEntity(true);
@@ -135,12 +135,12 @@ public class AgentpaybillFormPlugin extends AbstractListPlugin implements Plugin
             //获取源单id
             Long id=entryCollection.get(0).getLong("sourcebillid");
             //当前支付状态
-            String paystate=dynamicObject.getString(nckd_paystate);
+            String paystate=dynamicObject.getString(nckd_paystatus);
             QFilter filter=new QFilter("id",QCP.equals,id);
             DynamicObject agentpaybill=BusinessDataServiceHelper
-                    .loadSingle(nckd_salarydistribute,"id,nckd_paystate",new QFilter[]{filter});
+                    .loadSingle(nckd_salarydistribute,"id,nckd_paystatus",new QFilter[]{filter});
             //反写薪酬计提支付状态
-            agentpaybill.set("nckd_paystate",paystate);
+            agentpaybill.set("nckd_paystatus",paystate);
             //获取代发单代发分录中字段信息
             SaveServiceHelper.save(new DynamicObject[] {agentpaybill});
         }

+ 16 - 21
src/main/java/fi/em/opplugin/AgentpaybillOpPlugin.java

@@ -1,18 +1,11 @@
 package fi.em.opplugin;
 
-import kd.bos.context.RequestContext;
+import fi.cas.opplugin.PayBillToolUtil;
 import kd.bos.dataentity.entity.DynamicObject;
-import kd.bos.entity.ExtendedDataEntity;
 import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
-import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
-import kd.bos.orm.query.QCP;
-import kd.bos.orm.query.QFilter;
-import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.entity.plugin.args.BeforeOperationArgs;
 import kd.bos.servicehelper.operation.SaveServiceHelper;
 
-import java.util.HashSet;
-import java.util.Set;
-
 /**
  * @author cjz
  * @date 2024/8/28 16:22
@@ -29,26 +22,28 @@ public class AgentpaybillOpPlugin extends AbstractOperationServicePlugIn {
 
 
     @Override
-    public void beginOperationTransaction(BeginOperationTransactionArgs args){
-        DynamicObject[] dynamicObjects = args.getDataEntities();
-        String operationKey = args.getOperationKey();
+    public void beforeExecuteOperationTransaction(BeforeOperationArgs e) {
+        DynamicObject[] dynamicObjects = e.getDataEntities();
+        String operationKey = e.getOperationKey();
         //关闭付款则将支付状态更改为支付关闭状态
         if (closepay.equals(operationKey)){
+
+
+
             for (int i=0;i< dynamicObjects.length;i++)
             {
                 //设置支付状态为
-                dynamicObjects[i].set("nckd_paystate","D");
+                dynamicObjects[i].set("nckd_paystatus","D");
             }
             SaveServiceHelper.save(dynamicObjects);
-        }
-        if (payforfront.equals(operationKey))
-        {
-            for (int i=0;i< dynamicObjects.length;i++)
-            {
-                //设置支付状态为支付中
-                dynamicObjects[i].set("nckd_paystate","B");
+        }else if (payforfront.equals(operationKey)){
+            String errMsg = "";
+            errMsg =  PayBillToolUtil.agentpayBillForCBSSync(dynamicObjects);
+            if(!errMsg.isEmpty()) {
+                //将成功错误信息返回到前端
+                e.setCancelMessage(errMsg);
+                e.setCancel(true);
             }
-            SaveServiceHelper.save(dynamicObjects);
         }
     }