13246659623 2 days ago
parent
commit
83286236eb
19 changed files with 3795 additions and 0 deletions
  1. 1091 0
      code/nckd-cosmic-debug/src/main/java/fi/cas/opplugin/PayBillToolUtil.java
  2. 64 0
      code/nckd-cosmic-debug/src/main/java/fi/cas/opplugin/PayToZFQZOP.java
  3. 145 0
      code/nckd-cosmic-debug/src/main/java/fi/cas/opplugin/PaymentProcessOpPlugin.java
  4. 77 0
      code/nckd-cosmic-debug/src/main/java/fi/cas/opplugin/TxServiceGatewayProxy.java
  5. 141 0
      code/nckd-cosmic-debug/src/main/java/fi/cas/opplugin/TxServiceGatewaySoapBindingStub.java
  6. 8 0
      code/nckd-cosmic-debug/src/main/java/fi/cas/opplugin/TxServiceGateway_PortType.java
  7. 14 0
      code/nckd-cosmic-debug/src/main/java/fi/cas/opplugin/TxServiceGateway_Service.java
  8. 138 0
      code/nckd-cosmic-debug/src/main/java/fi/cas/opplugin/TxServiceGateway_ServiceLocator.java
  9. 1119 0
      code/nckd-cosmic-debug/src/main/java/fi/cas/opplugin/TypeUtils.java
  10. 148 0
      code/nckd-cosmic-debug/src/main/java/fi/cas/opplugin/Utils.java
  11. 137 0
      code/nckd-cosmic-debug/src/main/java/fi/cas/task/AgentpaybillQueryStatusTast.java
  12. 95 0
      code/nckd-cosmic-debug/src/main/java/fi/cas/task/PayQueryStatusTast.java
  13. 39 0
      code/nckd-cosmic-debug/src/main/java/fi/cas/task/PayUpadteStatusTask.java
  14. 33 0
      code/nckd-cosmic-debug/src/main/java/fi/em/opplugin/AgentpaybillOpPlugin.java
  15. 56 0
      code/nckd-cosmic-debug/src/main/java/fi/er/webService/AccountSynReturnModel.java
  16. 55 0
      code/nckd-cosmic-debug/src/main/java/fi/er/webService/BankSynReturnModel.java
  17. 26 0
      code/nckd-cosmic-debug/src/main/java/fi/er/webService/CustomApiResultForMy.java
  18. 274 0
      code/nckd-cosmic-debug/src/main/java/fi/er/webService/SaveAccountApi.java
  19. 135 0
      code/nckd-cosmic-debug/src/main/java/fi/er/webService/SaveBankApi.java

+ 1091 - 0
code/nckd-cosmic-debug/src/main/java/fi/cas/opplugin/PayBillToolUtil.java

@@ -0,0 +1,1091 @@
+package fi.cas.opplugin;
+import com.google.gson.Gson;
+import com.kingdee.bos.Context;
+import com.kingdee.bos.json.JSONUtils;
+import com.kingdee.bos.json.Kson;
+import json.JSON;
+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;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+
+import java.io.*;
+import java.math.RoundingMode;
+import java.net.Socket;
+import java.sql.Timestamp;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import kd.bos.servicehelper.operation.OperationServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import org.json.JSONArray;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.json.JSONObject;
+import org.json.XML;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+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";
+
+
+
+    /**
+     * 对账接口
+     * @return
+     */
+    public static String payDayCheckRequest(String begindzrq,String enddzrq) {
+        try {
+            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
+            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
+            Document doc = dBuilder.newDocument();
+
+            Element rootElement = doc.createElement("Message");
+            doc.appendChild(rootElement);
+
+            Element body = doc.createElement("Body");
+            rootElement.appendChild(body);
+
+            createElement(doc, body, "transcode", "BTSMO013");
+            createElement(doc, body, "channelcode", "JF");//发起渠道
+            createElement(doc, body, "checkstadate", begindzrq);//对账开始日期
+            createElement(doc, body, "checkenddate", enddzrq);//对账结束日期
+
+            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;
+        }
+    }
+
+
+
+
+
+
+
+
+
+
+
+    /**
+     * 代发单付款请求拼接
+     * @return
+     */
+    public static String createSingleAgentPaymentRequest_1(DynamicObject info) {
+        try {
+            JSONObject param = new JSONObject();
+            headJson(param);
+
+            JSONObject data = new JSONObject();
+
+            //单据状态
+            if("C".equals(info.get("billstatus"))){
+                data.put("FBillStatus","12");
+            }
+
+            //EAS付款单据号
+            String bbh=info.get("nckd_bbh")+"";//版本号
+            data.put("ERP_INS_ID",info.getPkValue()+"-"+bbh);
+            //EAS付款单据号
+            data.put("ERP_PAYNO",info.get("billno")+"-"+bbh);
+
+            //录入人
+            data.put("CREATOR",info.get("creator.name").toString());
+
+            //录入时间
+            data.put("CREATE_TIME",TypeUtils.date2String(new Date(((Timestamp)info.get("modifytime")).getTime()),TypeUtils.DEFAULT_DATE_FORMAT) );
+
+            //摘要
+            data.put("REMARK",info.get("description")+"-"+info.get("billno"));
+
+            data.put("IS_TRANSFER","0");
+
+            //付款单位--->公司编号
+            if(info.get("org")!=null){//付款单位--->公司编号
+                String companyNumber = TypeUtils.nullToString(info.get("org.number"));
+                data.put("PAY_CLT_NO",companyNumber);
+            }
+
+            DynamicObject payeracctbankEntity = BusinessDataServiceHelper.loadSingleFromCache(info.getDynamicObject("payeracctbank").getPkValue(), "am_accountbank");
+            String payeracc = payeracctbankEntity.getString("bankaccountnumber");
+            String payername = payeracctbankEntity.getString("acctname");
+
+            //付款方账号 ---> 付款账户基础资料银行账号
+            data.put("PAY_ACNT_NO",payeracc);
+
+            //付款银行 ---> 金融机构行号编码
+            data.put("PAY_CNAPS",payeracctbankEntity.get("bank.number")+"");
+
+            data.put("PAY_DATE",TypeUtils.date2String(new Date(),TypeUtils.DEFAULT_DATE_FORMAT));//付款日期
+
+            //付款金额
+
+            data.put("AMOUNT",info.getBigDecimal("payamount").setScale(2, RoundingMode.DOWN).toString());
+            //币别
+            if("CNY".equals(info.get("currency.number"))){
+                data.put("CURRENCY","BB01");
+            }
+
+            //对公
+            if(!info.getBoolean("ispersonpay")){
+                data.put("IS_PERSON","0");
+            }else{
+                data.put("IS_PERSON","1");
+            }
+
+            //加急
+            if(info.getBoolean("urgentflag")){
+                data.put("URGENT_FLAG","1");
+            }else{
+                data.put("URGENT_FLAG","0");
+            }
+
+            //用途
+            data.put("PURPOSE","用途:"+info.get("nckd_usage"));
+
+            //费用类型
+            data.put("BUSS_TYPE",JSONObject.NULL);
+
+            //付款类型,工资  997
+            if("997".equals(info.get("paymenttype.number"))){
+                data.put("PAY_FLAG",2);
+            }else{
+                data.put("PAY_FLAG","1");
+            }
+
+            //明细条数
+            data.put("PAY_NUM",info.getString("count"));
+
+
+            //明细数据
+            JSONArray OP_ACNT_LIST = new JSONArray();
+
+            // 获取分录数据
+            DynamicObjectCollection entryList = info.getDynamicObjectCollection("entry");
+
+            for (int i = 0; i <entryList.size() ; i++) {
+                DynamicObject entry = entryList.get(i);
+                JSONObject entrydata = new JSONObject();
+                //明细id
+                entrydata.put("ERP_PVT_ID", entry.getPkValue()+"");
+                //收款方账号
+                entrydata.put("RECE_ACC_NO", entry.get("payeeacctbank")+"");
+                //收款方户名
+                entrydata.put("RECE_ACC_NAME", entry.get("payeename")+"");
+                //收款行行号
+                entrydata.put("RECE_CNAPS",entry.get("payeebanknumber")+"");
+                //付款金额,待补充
+                entrydata.put("AMOUNT", entry.getBigDecimal("e_amount").setScale(2, RoundingMode.DOWN).toString());
+                //明细用途
+                entrydata.put("PURPOSE","用途:"+info.get("nckd_usage"));
+
+                OP_ACNT_LIST.put(entrydata);
+            }
+            data.put("OP_ACNT_LIST",OP_ACNT_LIST);
+
+
+            //无用字段
+            data.put("CLT_NO",JSONObject.NULL);
+            data.put("PAY_ACNT_NAME",JSONObject.NULL);
+            data.put("PAY_BANK",JSONObject.NULL);
+            data.put("CASHAMOUNT",JSONObject.NULL);
+            data.put("BILLAMOUNT",JSONObject.NULL);
+            data.put("RECE_ACC_NO",JSONObject.NULL);
+            data.put("RECE_ACC_NAME",JSONObject.NULL);
+            data.put("RECE_OPBANK_NAME",JSONObject.NULL);
+            data.put("RECE_OPBANK_NAME",JSONObject.NULL);
+            data.put("RECE_BANK_NO",JSONObject.NULL);
+            data.put("RECE_CNAPS",JSONObject.NULL);
+            data.put("REG_NO",JSONObject.NULL);
+            data.put("TERM",JSONObject.NULL);
+
+
+            param.put("data",data);
+            param.put("txDateTime",Utils.getData(new Date(), "yyyyMMddHHmmss"));
+            param.put("batchNo",TypeUtils.nullToString(info.get("billno"))+"-"+TypeUtils.nullToString(info.get("nckd_bbh"))+"-"+Utils.getData(new Date(), "yyyyMMddHHmmss"));
+            param.put("code","NSTC-T003");
+
+            return param.toString();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+
+    public static void agentPaymentXMLBody_Msg(DynamicObject agentpayBillEntity,Document doc,Element body) {
+
+        DynamicObject payeracctbankEntity = BusinessDataServiceHelper.loadSingleFromCache(agentpayBillEntity.getDynamicObject("payeracctbank").getPkValue(), "am_accountbank");
+        String payeracc = payeracctbankEntity.getString("bankaccountnumber");
+        String payername = payeracctbankEntity.getString("acctname");
+        String jgh = payeracctbankEntity.getString("nckd_jgh");
+        if("".equals(jgh)){
+            jgh = "791100";
+        }
+
+        String filename=agentpayBillEntity.getString("nckd_filename");
+        if("".equals(filename)){
+            filename = agentpayBillEntity.getString("billNo");
+        }
+        filename=jgh+filename;//机构号
+        createElement(doc, body, "FileName",filename );//文件名称
+        createElement(doc, body, "FileType","01" );//文件类型
+
+        //付款账号
+
+        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");//收费标志
+
+        createElement(doc, body, "RichNbr", payeracc);
+        createElement(doc, body, "FundType", "7");
+        createElement(doc, body, "RichName", payername);
+
+
+        createElement(doc, body, "QryBrnNbr", jgh);
+
+    }
+
+    public static void agentPaymentXMLBody_Entry(DynamicObject agentpayBillEntity,Document doc,Element body) {
+        // 获取分录数据
+        DynamicObjectCollection entryList = agentpayBillEntity.getDynamicObjectCollection("entry");
+
+        for (int i = 0; i <entryList.size() ; i++) {
+            DynamicObject entry = entryList.get(i);
+            Element achrapaydtl_i = doc.createElement("achrpaydtl_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("entryunmatchamount").setScale(2, RoundingMode.DOWN).toString());//支付金额
+            createElement(doc, achrapaydtl_i, "CurContentSeq", i+1+"");//展示条数
+            createElement(doc, achrapaydtl_i, "RowCnt", "10000");//展示条数
+        }
+    }
+
+
+    public static void agentPaymentXMLBody_Entry_chongfa(DynamicObject agentpayBillEntity,Document doc,Element body) {
+        // 获取分录数据
+        DynamicObjectCollection entryList = agentpayBillEntity.getDynamicObjectCollection("entry");
+
+        for (int i = 0; i <entryList.size() ; i++) {
+            DynamicObject entry = entryList.get(i);
+            if("true".equals(entry.get("e_issuccess")+"")){
+                continue;
+            }
+            Element achrapaydtl_i = doc.createElement("achrpaydtl_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("entryunmatchamount").setScale(2, RoundingMode.DOWN).toString());//支付金额
+            createElement(doc, achrapaydtl_i, "CurContentSeq", i+1+"");//展示条数
+            createElement(doc, achrapaydtl_i, "RowCnt", "10000");//展示条数
+        }
+    }
+
+
+
+    public static void agentPaymentXMLBody_EntryQuery(DynamicObject agentpayBillEntity,String filename,Document doc,Element body,String CurContentSeq) {
+
+        createElement(doc, body, "IdenNbr", "");//证件号
+        createElement(doc, body, "InRichNbr","");//收款户口号
+        createElement(doc, body, "PayAmt", "");//支付金额
+
+        createElement(doc, body, "QryFileName",filename );//文件名称
+
+        if(CurContentSeq==null||"".equals(CurContentSeq)){
+
+        }else{
+            createElement(doc, body, "CurContentSeq",CurContentSeq);//xuhao
+        }
+        createElement(doc, body, "RowCnt", "100");//展示条数
+
+        createElement(doc, body, "GoHead","Y" );//文件名称
+
+
+    }
+
+
+    /***
+     * 拼接json对象
+     */
+    public static JSONObject getServiceBean_youhua( DynamicObject info) {
+        JSONObject data =  new JSONObject();
+
+        //单据状态
+        if("C".equals(info.get("billstatus"))){
+            data.put("FBillStatus","12");
+        }
+
+
+
+
+
+        //录入人
+        data.put("CREATOR",info.get("creator.name").toString());
+
+        //录入时间
+        data.put("CREATE_TIME",TypeUtils.date2String(new Date(((Timestamp)info.get("modifytime")).getTime()),TypeUtils.DEFAULT_DATE_FORMAT) );
+        //摘要
+        data.put("REMARK",info.get("description")+"-"+info.get("billno"));
+
+
+        String entrance = info.get("entrance")+"";//是否资金调度,待补充
+        if("SYN".equals(entrance)||"SPAN".equals(entrance)){
+            data.put("IS_TRANSFER","1");
+        }else{
+            data.put("IS_TRANSFER","0");
+        }
+        data.put("IS_TRANSFER","0");
+
+
+        String bbh=info.get("nckd_bbh")+"";//版本号
+        data.put("ERP_INS_ID",info.getPkValue()+"-"+bbh);
+        //EAS付款单据号
+        data.put("ERP_PAYNO",info.get("billno")+"-"+bbh);
+
+        //付款日期
+        data.put("PAY_DATE",TypeUtils.date2String(new Date(),TypeUtils.DEFAULT_DATE_FORMAT));
+        //对公
+        if(!info.getBoolean("ispersonpay")){
+            data.put("IS_PERSON","0");
+        }else{
+            data.put("IS_PERSON","1");
+        }
+
+        //加急
+        if(info.get("priority")!=null){
+            if("prior".equals(info.get("priority"))){//优先
+                data.put("URGENT_FLAG","1");
+            }else{
+                data.put("URGENT_FLAG","0");
+            }
+        }
+        data.put("PURPOSE","用途:"+info.get("nckd_usage"));
+        //费用类型,取分录第一条费用项目编码
+        DynamicObjectCollection entrycoll = info.getDynamicObjectCollection("entry");
+        if(entrycoll.size()>0){
+            if(entrycoll.get(0).get("e_expenseitem.number")==null){
+                data.put("BUSS_TYPE","");
+            }else{
+                data.put("BUSS_TYPE",entrycoll.get(0).get("e_expenseitem.number")+"");
+            }
+        }
+
+
+
+        DynamicObject skyhinfo =  BusinessDataServiceHelper.loadSingleFromCache(info.getDynamicObject("payeebank").getPkValue(), "bd_bebank");
+
+        //收款方开户行 名称
+        data.put("RECE_OPBANK_NAME",skyhinfo.get("name").toString());//收款方开户行 名称
+
+        //收款方开户行 CNAPS号 ,行号
+        data.put("RECE_CNAPS",skyhinfo.get("number")+"");
+
+        //收款方户名
+        data.put("RECE_ACC_NAME",info.get("recaccbankname")+"");
+        //收款方账号
+        data.put("RECE_ACC_NO",info.get("payeebanknum")+"");
+
+        //付款单位--->公司编号
+        if(info.get("org")!=null){//付款单位--->公司编号
+            String companyNumber = TypeUtils.nullToString(info.get("org.number"));
+            data.put("PAY_CLT_NO",companyNumber);
+        }
+
+
+        //付款账号
+        DynamicObject payeracctbankEntity = BusinessDataServiceHelper.loadSingle(info.getDynamicObject("payeracctbank").getPkValue(), "am_accountbank");
+        String payeracc = payeracctbankEntity.getString("bankaccountnumber");
+        String payername = payeracctbankEntity.getString("acctname");
+
+        //付款方账号 ---> 付款账户基础资料银行账号
+        data.put("PAY_ACNT_NO",payeracc);
+
+        //付款银行 ---> 金融机构行号编码,是不是就是金融机构编码
+        data.put("PAY_CNAPS",payeracctbankEntity.get("bank.number")+"");
+
+        data.put("AMOUNT",info.getBigDecimal("actpayamt").setScale(2, RoundingMode.DOWN));
+        //币别
+
+        if("CNY".equals(info.get("currency.number"))){
+            data.put("CURRENCY","BB01");
+        }
+
+        //无用字段
+        data.put("CLT_NO",JSONObject.NULL);
+        data.put("PAY_ACNT_NAME",JSONObject.NULL);
+        data.put("PAY_BANK",JSONObject.NULL);
+        data.put("CASHAMOUNT",JSONObject.NULL);
+        data.put("BILLAMOUNT",JSONObject.NULL);
+        data.put("RECE_BANK_NO",JSONObject.NULL);
+        data.put("REG_NO",JSONObject.NULL);
+        data.put("TERM",JSONObject.NULL);
+        data.put("PAY_FLAG",JSONObject.NULL);
+        data.put("PAY_NUM","0");
+        data.put("OP_ACNT_LIST",JSONObject.NULL);
+
+
+        //应付票据逻辑,不需要付息方式了
+//        if ("012".equals(info.get("settletype.number"))) { // 012 应付票据(银行承兑汇票)
+//            DynamicObject payInterest =info.getDynamicObject("payInterest");
+//            if (payInterest != null) {
+//                paymentBill.setPAY_INTEREST(payInterest.get("number")+"");
+//            }
+//        }
+        return data;
+    }
+
+
+    public static String createSinglePaymentRequest(DynamicObject payBillEntity,String JKNO) {
+        try {
+            JSONObject param = new JSONObject();
+            headJson(param);
+            JSONObject datainfo=getServiceBean_youhua( payBillEntity);
+            param.put("data",datainfo);
+            param.put("txDateTime",Utils.getData(new Date(), "yyyyMMddHHmmss"));
+            param.put("batchNo",TypeUtils.nullToString(payBillEntity.get("billno"))+"-"+TypeUtils.nullToString(payBillEntity.get("nckd_bbh"))+"-"+Utils.getData(new Date(), "yyyyMMddHHmmss"));
+            param.put("code",JKNO);
+            String text = param.toString();
+            return text;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+    public static void headJson(JSONObject param){
+        param.put("nodeId","client.001");
+        param.put("channelId","EAS");
+        param.put("clientId","001");
+        param.put("clientName","金蝶");
+    }
+
+
+    private static void createElement(Document doc, Element parent, String name, String value) {
+        Element element = doc.createElement(name);
+        element.appendChild(doc.createTextNode(value));
+        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","=","paytoJHX")});
+        String url =  jkpzxx.getString("nckd_servername");
+
+        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");
+            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;
+            }
+            /***
+             * 审批时校验,如果资金银企行号包含,则提交九恒星,否则不提交。待补充
+             */
+
+
+            //构建支付数据导入请求xml
+            String qjjson =  createSingleAgentPaymentRequest_1(payBillEntity);
+            if(qjjson==null){
+                isZFQZ = false;
+                errMsg.append("单据号:").append(billNum).append("无法拼出正确的json请求~\r\n");
+            }
+
+            if(!isZFQZ){
+                continue;
+            }
+            log.info("单据号:"+billNum+"传入参数"+qjjson);
+            if("".equals(url)){
+                url="http://172.16.150.71:7081/FDLKF_OUTER/webservice/TxServiceGateway";
+            }
+
+            JSONObject cbsReturnJson =httpjhxService(url,qjjson);
+            log.info("单据号:"+billNum+"返回参数"+cbsReturnJson.toString());
+            //存入日志表
+            saveAgentlog(payBillEntity,qjjson,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(!"000000".equals(cbsReturnJson.get("resultCode"))){
+                isSuccess = false;
+                cbsReturnJson.get("resultCode");
+                String resultMsg = cbsReturnJson.get("resultMsg")+"";
+
+                if(resultMsg.indexOf("单据是非驳回状态")>=0||resultMsg.indexOf("付款指令重复")>=0){//指令重复,说明已经传过去了,改状态为支付中,查询结果
+                    isSuccess = true;
+                    errMsg.append("单据号:").append(billNum).append("付款指令重复,说明已推送到资金系统!");
+                    payBillEntity.set("nckd_fkcs", fkcs+1);//付款次数+1
+                    payBillEntity.set("nckd_sbyy","指令重复,已推送到资金系统");//返回信息
+                    payBillEntity.set("nckd_paystatus",2);//支付中
+                }else{ //如果不是驳回或重发,失败
+                    errMsg.append("单据号:").append(billNum).append(",推送资金系统失败,");
+                    errMsg.append("错误号:").append(cbsReturnJson.get("resultCode"));
+                    errMsg.append(",错误原因:").append(resultMsg);
+                    errMsg.append("\r\n");
+                    payBillEntity.set("nckd_fkcs", fkcs+1);//付款次数+1
+                    payBillEntity.set("nckd_paystatus",4);//传输失败
+                    payBillEntity.set("nckd_sbyy",cbsReturnJson.get("resultMsg")+"");//错误信息
+                    SaveServiceHelper.update(new DynamicObject[]{payBillEntity});
+                }
+            }else if("000000".equals(cbsReturnJson.get("resultCode"))){//已受理,改为支付中
+                String resultMsg = cbsReturnJson.get("resultMsg")+"";
+                if("SUCCESS".equals(resultMsg)){
+                    isSuccess = true;
+                    errMsg.append("单据号:").append(billNum).append(",推送资金系统成功!");
+                    payBillEntity.set("nckd_fkcs", fkcs+1);//付款次数+1
+                    payBillEntity.set("nckd_sbyy","传输成功");//返回信息
+                    payBillEntity.set("nckd_paystatus",2);//支付中
+                }
+            }
+            if (isSuccess) {
+                SaveServiceHelper.update(new DynamicObject[]{payBillEntity});
+            }
+        }
+        return errMsg.toString();
+    }
+
+
+
+
+
+
+
+
+
+
+
+    /**
+     * 支付单同步
+     * @params billEntities
+     * @returns 返回报错信息
+     *
+     */
+    public static String payBillForCBSSync(DynamicObject[] billEntities) {
+        StringBuffer errMsg = new StringBuffer();
+        //获取接口链接等信息
+        DynamicObject jkpzxx = BusinessDataServiceHelper.loadSingle("nckd_jkpzxx",new QFilter[]{new QFilter("number","=","paytoJHX")});
+
+        String url =  jkpzxx.get("nckd_servername")+"";
+        for (DynamicObject dataEntity : billEntities) {
+            boolean isSuccess = false;
+            boolean isZFQZ = true;
+            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");
+
+
+            //查询流水,如果存在流水,则不能支付
+            String billno =  payBillEntity.get("billno")+"";
+//            QFilter orgFilter = new QFilter("nckd_reserve80", "like", "%"+billno+"%");
+//            DynamicObject fkclinfo = BusinessDataServiceHelper.loadSingle("bei_transdetail","",new QFilter[]{orgFilter});
+
+
+            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;
+            }
+            //流水判断 待补充
+//            if(fkclinfo!=null && isZFQZ) {
+//                errMsg.append("单据号:").append(billNum).append(",已存在支付流水,为防止重复付款,无法提交。请联系运维核查数据\r\n");
+//                isZFQZ = false;
+//            }
+
+            //是否资金调度逻辑,用新增入口
+            boolean IS_TRANSFER=false;//判断是否资金调度
+            String entrance = payBillEntity.get("entrance")+"";
+            if("SYN".equals(entrance)||"SPAN".equals(entrance)){
+                IS_TRANSFER = true;
+            }
+//            if(IS_TRANSFER){
+//                isZFQZ = false;
+//                errMsg.append("单据号:").append(billNum).append(",跨主体调拨或者同名转账~\r\n");
+//            }
+
+            /***
+             * 根据付款单结算方式,结算方式类似承兑的调用资金的票据接口,结算方式为其他的调用资金的对外付款接口
+             */
+            String JKNO="";
+            String settletype = payBillEntity.get("settletype.number")+"";
+            if(settletype!=null&&!"".equals(settletype)){
+                if(settletype.equals("BILL")){//票据
+                    JKNO="NSTC-T002";
+                }else{
+                    JKNO="NSTC-T001";
+                }
+            }else{
+                isZFQZ = false;
+                errMsg.append("单据号:").append(billNum).append(",结算方式为空~\r\n");
+            }
+
+
+
+            //付款单审批时校验未上线银行基础数据资料表,待补充
+            /***
+             * 审批时校验,如果资金银企行号包含,则提交九恒星,否则不提交。
+             */
+
+
+
+
+            String qjjson="";
+            if(isZFQZ) {
+                //构建请求对象
+                qjjson = createSinglePaymentRequest(payBillEntity, JKNO);
+                if (qjjson == null) {
+                    isZFQZ = false;
+                    errMsg.append("单据号:").append(billNum).append(",无法拼出正确的json请求~\r\n");
+                }
+            }
+
+            if(!isZFQZ){
+                continue;
+            }
+            //qjjson = "{\"code\":\"NSTC-T001\",\"batchNo\":\"PV-202504-000041-0-20250427106427\",\"nodeId\":\"client.001\",\"channelId\":\"EAS\",\"clientId\":\"001\",\"clientName\":\"金蝶\",\"txDateTime\":\"20250425175615\",\"data\":{\"ERP_INS_ID\":\""+billNum+"-"+bbh+"\",\"PAY_CLT_NO\":\"A004\",\"CLT_NO\":null,\"PAY_ACNT_NO\":\"824581178610001\",\"PAY_ACNT_NAME\":null,\"PAY_BANK\":null,\"PAY_CNAPS\":\"308421022063\",\"PAY_DATE\":\"2025-04-25\",\"AMOUNT\":3234,\"CASHAMOUNT\":null,\"BILLAMOUNT\":null,\"CURRENCY\":\"BB01\",\"BUSS_TYPE\":null,\"RECE_ACC_NO\":\"1\",\"RECE_ACC_NAME\":\"1\",\"RECE_OPBANK_NAME\":\"非税缴款\",\"RECE_BANK_NO\":null,\"RECE_CNAPS\":\"001100000001\",\"REG_NO\":null,\"IS_PERSON\":\"0\",\"URGENT_FLAG\":\"0\",\"PURPOSE\":\"用途\",\"REMARK\":\"缴款码(XXX)\",\"CREATOR\":\"张清全\",\"CREATE_TIME\":\"2025-04-25\",\"ERP_PAYNO\":\"PV-202504-000041-0\",\"TERM\":null,\"IS_TRANSFER\":\"0\",\"PAY_FLAG\":null,\"FBillStatus\":12,\"PAY_NUM\":0,\"OP_ACNT_LIST\":null}}";
+            log.info("单据号:"+billNum+"传入参数"+qjjson);
+            if("".equals(url)){
+                url="http://172.16.150.71:7081/FDLKF_OUTER/webservice/TxServiceGateway";
+            }
+
+
+
+            JSONObject cbsReturnJson =httpjhxService(url,qjjson);
+            log.info("单据号:"+billNum+"返回参数"+cbsReturnJson.toString());
+            //存入日志表
+            savelog(payBillEntity,qjjson,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(!"000000".equals(cbsReturnJson.get("resultCode"))){
+                isSuccess = false;
+                cbsReturnJson.get("resultCode");
+                String resultMsg = cbsReturnJson.get("resultMsg")+"";
+
+                if(resultMsg.indexOf("单据是非驳回状态")>=0||resultMsg.indexOf("付款指令重复")>=0){//指令重复,说明已经传过去了,改状态为支付中,查询结果
+                    isSuccess = true;
+                    errMsg.append("单据号:").append(billNum).append("付款指令重复,说明已推送到资金系统!");
+                    payBillEntity.set("nckd_fkcs", fkcs+1);//付款次数+1
+                    payBillEntity.set("nckd_sbyy","指令重复,已推送到资金系统");//返回信息
+                    payBillEntity.set("nckd_paystatus",2);//支付中
+                }else{ //如果不是驳回或重发,失败
+                    errMsg.append("单据号:").append(billNum).append(",推送资金系统失败,");
+                    errMsg.append("错误号:").append(cbsReturnJson.get("resultCode"));
+                    errMsg.append(",错误原因:").append(resultMsg);
+                    errMsg.append("\r\n");
+                    payBillEntity.set("nckd_fkcs", fkcs+1);//付款次数+1
+                    payBillEntity.set("nckd_paystatus",4);//传输失败
+                    payBillEntity.set("nckd_sbyy",cbsReturnJson.get("resultMsg")+"");//错误信息
+                    SaveServiceHelper.update(new DynamicObject[]{payBillEntity});
+                }
+            }else if("000000".equals(cbsReturnJson.get("resultCode"))){//已受理,改为支付中
+                String resultMsg = cbsReturnJson.get("resultMsg")+"";
+                if("SUCCESS".equals(resultMsg)){
+                    isSuccess = true;
+                    errMsg.append("单据号:").append(billNum).append(",推送资金系统成功!");
+                    payBillEntity.set("nckd_fkcs", fkcs+1);//付款次数+1
+                    payBillEntity.set("nckd_sbyy","传输成功");//返回信息
+                    payBillEntity.set("nckd_paystatus",2);//支付中
+                }
+            }
+
+            if (isSuccess) {
+                SaveServiceHelper.update(new DynamicObject[]{payBillEntity});
+            }
+        }
+        return errMsg.toString();
+    }
+
+
+    public static void saveAgentlog(DynamicObject payBillEntity,String qqbw,String fhbw,String type){
+        try {
+            DynamicObject logInfo = new DynamicObject( EntityMetadataCache.getDataEntityType("nckd_dfjkdyrz"));
+            String channelserno = payBillEntity.getString("billno");
+            logInfo.set("number",channelserno);
+            if("1".equals(type)){
+                logInfo.set("name",payBillEntity.get("billno")+"支付数据传输日志");
+            }else if("6".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 savePayDayChecklog(String qqbw,String fhbw){
+        try {
+            DynamicObject logInfo = new DynamicObject( EntityMetadataCache.getDataEntityType("nckd_paydaycheck"));
+            Calendar currentdate = Calendar.getInstance();
+            String enddzrq = TypeUtils.date2String(currentdate.getTime(),"yyyy-MM-dd HH:mm:ss");
+
+            logInfo.set("number",enddzrq);
+            logInfo.set("name",enddzrq+"付款日结查询日志");
+            logInfo.set("status","A");
+            logInfo.set("enable","1");
+            logInfo.set("nckd_qqbw_tag",qqbw);
+            logInfo.set("nckd_fhbw_tag",fhbw);
+            OperationServiceHelper.executeOperate("save","nckd_paydaycheck",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"));
+            String channelserno = payBillEntity.get("billno")+"-"+payBillEntity.getInt("nckd_bbh");
+            logInfo.set("number",channelserno);
+            logInfo.set("name",payBillEntity.get("billno")+"付款日志");
+            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","1");
+            OperationServiceHelper.executeOperate("save","nckd_zfjkdyrz",new DynamicObject[]{logInfo});
+
+        }catch (Exception e){
+            log.info("保存日志报错"+e.getMessage());
+
+        }
+
+
+    }
+
+
+    public static void saveupdatelog(DynamicObject payBillEntity,String qqbw,String fhbw){
+        try {
+            DynamicObject logInfo = new DynamicObject( EntityMetadataCache.getDataEntityType("nckd_zfcxjkrz"));
+            String channelserno = payBillEntity.get("billno")+"-"+payBillEntity.getInt("nckd_bbh");
+            logInfo.set("number",channelserno);
+            logInfo.set("name",payBillEntity.get("billno")+"查询状态日志");
+            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","1");
+            OperationServiceHelper.executeOperate("save","nckd_zfcxjkrz",new DynamicObject[]{logInfo});
+
+        }catch (Exception e){
+            log.info("保存日志报错"+e.getMessage());
+
+        }
+
+
+    }
+
+    public static JSONObject httpjhxService(String url,String qjjson){
+        String result ="";
+        try {
+            Date d1 = new Date();
+            TxServiceGatewayProxy txServiceGatewayProxy=new TxServiceGatewayProxy("",url);
+             result = txServiceGatewayProxy.send(qjjson);
+
+            Date d2 = new Date();
+
+            long diffs = Math.abs(d2.getTime()-d1.getTime())/1000;
+            JSONObject jsonObject=new JSONObject(result);
+            if(jsonObject!=null){
+                if("{}".equals(jsonObject.toString())||"".equals(result)){
+                    if(diffs>60){//超时
+
+                        jsonObject.put("resultCode","JFXXXXC");
+                        jsonObject.put("resultMsg","超时");
+
+                    }
+
+                }
+                jsonObject.put("请求时间",TypeUtils.date2String(d1,TypeUtils.DEFAULT_TIMESTAMP_FORMAT));
+                jsonObject.put("返回时间",TypeUtils.date2String(d2,TypeUtils.DEFAULT_TIMESTAMP_FORMAT));
+                jsonObject.put("响应时长",diffs+"");
+            }
+            return  jsonObject;
+        } catch (IOException e) {
+            e.printStackTrace();
+            log.info(e.getMessage());
+        }
+        return null;
+    }
+
+
+
+
+
+
+
+    public static JSONObject JHXServiceQuery(String url,String bodyjson){
+        try {
+            Date d1 = new Date();
+            TxServiceGatewayProxy txServiceGatewayProxy=new TxServiceGatewayProxy("",url);
+            String result=txServiceGatewayProxy.send(bodyjson);
+
+            Date d2 = new Date();
+
+            long diffs = Math.abs(d2.getTime()-d1.getTime())/1000;
+
+            JSONObject jsonObject =new JSONObject(result);
+            if(jsonObject!=null||"".equals(result)||result==null){
+                if("{}".equals(jsonObject.toString())){
+                    if(diffs>60){//超时
+
+                        jsonObject.put("resultCode","JFXXXXC");
+                        jsonObject.put("resultMsg","超时");
+                    }
+
+                }
+                jsonObject.put("请求时间",TypeUtils.date2String(d1,TypeUtils.DEFAULT_TIMESTAMP_FORMAT));
+                jsonObject.put("返回时间",TypeUtils.date2String(d2,TypeUtils.DEFAULT_TIMESTAMP_FORMAT));
+                jsonObject.put("响应时长",diffs+"");
+            }
+
+            return  jsonObject;
+        } catch (IOException e) {
+            e.printStackTrace();
+            log.info(e.getMessage());
+        }
+        return null;
+    }
+
+
+    public static JSONObject socketServiceAgent(String serverName,String port,String xmlData,String transcode){
+        try {
+            Date d1 = new Date();
+
+            Socket client = new Socket(serverName,TypeUtils.nullToInt(port));
+            int messageLength = xmlData.getBytes("GBK").length;
+            String header = String.format("%08d", messageLength);
+            String fullMessage = header + xmlData;
+            OutputStream outToServer = client.getOutputStream();
+
+            PrintWriter out = new PrintWriter(new OutputStreamWriter(outToServer, "GBK"), true);
+            out.println(fullMessage);
+
+            InputStream inFromServer = client.getInputStream();
+            BufferedReader in = new BufferedReader(new InputStreamReader(inFromServer, "GBK"));
+            StringBuilder responseBuilder = new StringBuilder();
+            String line;
+            while ((line = in.readLine()) != null) {
+                responseBuilder.append(line);
+            }
+            String responseJson = responseBuilder.toString();
+            if(responseJson.indexOf("<?xml")>0){
+                int index = responseJson.indexOf("<?xml");
+                responseJson = responseJson.substring(index);
+            }
+            Date d2 = new Date();
+
+            long diffs = Math.abs(d2.getTime()-d1.getTime())/1000;
+
+            JSONObject jsonObject = XML.toJSONObject(responseJson);
+
+            if(jsonObject!=null){
+                if("{}".equals(jsonObject.toString())){
+                    if(diffs>50){//超时
+                        JSONObject Message = new JSONObject();
+
+                        JSONObject HeadInfo = new JSONObject();
+                        HeadInfo.put("errorcode","JFXXXXC");
+                        HeadInfo.put("errormsg","超时");
+                        Message.put("HeadInfo",HeadInfo);
+                        jsonObject.put("Message",Message);
+
+                    }
+
+                }
+                jsonObject.put("请求时间",TypeUtils.date2String(d1,TypeUtils.DEFAULT_TIMESTAMP_FORMAT));
+                jsonObject.put("返回时间",TypeUtils.date2String(d2,TypeUtils.DEFAULT_TIMESTAMP_FORMAT));
+                jsonObject.put("响应时长",diffs+"");
+            }
+
+            client.close();
+            return  jsonObject;
+        } catch (IOException e) {
+            e.printStackTrace();
+            log.info(e.getMessage());
+        }
+        return null;
+    }
+}

+ 64 - 0
code/nckd-cosmic-debug/src/main/java/fi/cas/opplugin/PayToZFQZOP.java

@@ -0,0 +1,64 @@
+package fi.cas.opplugin;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.AddValidatorsEventArgs;
+import kd.bos.entity.plugin.args.AfterOperationArgs;
+import kd.bos.entity.plugin.args.BeforeOperationArgs;
+import com.alibaba.druid.util.StringUtils;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+
+
+public class PayToZFQZOP  extends AbstractOperationServicePlugIn {
+    private static final String ENTITY_NAME = "cas_paybill";
+
+    @Override
+    public void onAddValidators(AddValidatorsEventArgs e) {
+        super.onAddValidators(e);
+
+
+    }
+
+    @Override
+    public void beforeExecuteOperationTransaction(BeforeOperationArgs e) {
+
+        String errMsg = "";
+
+        //获取选中行
+        DynamicObject[] billEntities = e.getDataEntities();
+        String operationKey = e.getOperationKey();
+
+
+        //获取操作按钮操作编码
+        if (StringUtils.equals( "paytojhx",operationKey)){
+            for (DynamicObject dataEntity : billEntities) {
+                DynamicObject payBillEntity = BusinessDataServiceHelper.loadSingle(dataEntity.getPkValue(), ENTITY_NAME);
+
+                String paystatus = payBillEntity.getString("nckd_paystatus");
+                int bbh = payBillEntity.getInt("nckd_bbh");
+                int fkcs = payBillEntity.getInt("nckd_fkcs");
+                String billstatusString = payBillEntity.getString("billstatus");
+                if ("C".equals(billstatusString)&&("4".equals(paystatus)||"5".equals(paystatus))&&bbh>=0 && bbh==fkcs-1) {//状态为传输失败或驳回,(驳回必须走调整才能支付)
+                    //状态为已审批,支付状态为失败,版本号>0,版本号=付款次数-1。符合付款条件,修改状态和版本号先
+                    payBillEntity.set("nckd_paystatus", "1");//支付状态改回未支付
+                    payBillEntity.set("nckd_bbh",bbh+1);
+                    SaveServiceHelper.update(payBillEntity);
+                }
+            }
+            errMsg =  PayBillToolUtil.payBillForCBSSync(billEntities);
+        }
+        if(!errMsg.isEmpty()) {
+            //将成功错误信息返回到前端
+            e.setCancelMessage(errMsg);
+            e.setCancel(true);
+        }
+    }
+
+
+    @Override
+    public void afterExecuteOperationTransaction(AfterOperationArgs e) {
+        super.afterExecuteOperationTransaction(e);
+
+    }
+}

+ 145 - 0
code/nckd-cosmic-debug/src/main/java/fi/cas/opplugin/PaymentProcessOpPlugin.java

@@ -0,0 +1,145 @@
+package fi.cas.opplugin;
+
+import com.alibaba.druid.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.args.BeginOperationTransactionArgs;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.HashMap;
+
+//付款处理单付款反写
+public class PaymentProcessOpPlugin extends AbstractOperationServicePlugIn {
+    private static String nckd_cas_arbill_gz_l = "ar_finarbill"; //应收挂帐单标识
+    private static String nckd_er_prepaybill_ext = "er_prepaybill"; //预付借款单标识
+    private static String nckd_er_publicreimbur_ext = "er_publicreimbursebill"; //报销单标识
+    private static String er_contractbill = "er_contractbill"; //合同台账单标识
+    private static String nckd_ap_finapbill_gz = "ap_finapbill"; //应付挂账单标识
+    @Override
+    public void beginOperationTransaction(BeginOperationTransactionArgs e) {
+        //获取付款处理单据信息
+        DynamicObject[] dynamicObjects = e.getDataEntities();
+        for (int i = 0; i < dynamicObjects.length; i++) {
+            //当前单头数据包
+            DynamicObject info = BusinessDataServiceHelper.loadSingle(dynamicObjects[i].getPkValue(), dynamicObjects[i].getDynamicObjectType().getName());
+            //付款金额
+            BigDecimal actpayamt = info.getBigDecimal("actpayamt");
+            //单据编号
+            String billno = info.getString("billno");
+            //付款处理id
+            long id = info.getLong("id");
+            //付款日期
+            Date paydate = info.getDate("paydate");
+            //获取源单id
+            Long sourcebillid = info.getLong("sourcebillid");
+            //存储源单分录id和付款处理分录实付金额
+            HashMap<Long,BigDecimal> amountMap = new HashMap<>();
+            //循环付款明细分录
+            for (DynamicObject entryentity : info.getDynamicObjectCollection("entry")) {
+                //取当前循环付款明细分录的实付金额
+                BigDecimal expenseamount = entryentity.getBigDecimal("e_actamt");
+                //取当前循环付款明细分录的源单分录id
+                Long sourcebillentryid = entryentity.getLong("e_sourcebillentryid");
+                amountMap.put(sourcebillentryid,expenseamount);
+            }
+            //查询应收挂账单
+            QFilter gzFilter = new QFilter("id", QCP.equals,sourcebillid);
+            DynamicObject[] gzDynamicObjects = BusinessDataServiceHelper.load(nckd_cas_arbill_gz_l,"id",new QFilter[] {gzFilter});
+
+            //查询报销单
+            QFilter bxFilter = new QFilter("id", QCP.equals,sourcebillid);
+            DynamicObject[] bxDynamicObjects = BusinessDataServiceHelper.load(nckd_er_publicreimbur_ext,"id",new QFilter[] {bxFilter});
+            //应收方向的回写
+            if (gzDynamicObjects.length > 0) {
+                //循环数组获取结算状态,已结算金额,未结算金额
+                for (int c=0;c<gzDynamicObjects.length;c++) {
+                    //应收挂帐单头数据包
+                    DynamicObject gzInfo = BusinessDataServiceHelper.loadSingle(gzDynamicObjects[c].getPkValue(), gzDynamicObjects[c].getDynamicObjectType().getName());
+                    //获取预付借款单id
+                    String yfjkId = gzInfo.getString("sourcebillid");
+                    if (!StringUtils.isEmpty(yfjkId)) {
+                        //存储预付借款单分录id和付款处理分录实付金额
+                        HashMap<Long,BigDecimal> yfjkMap = new HashMap<>();
+                        //循环应收挂帐单付款明细分录
+                        for (DynamicObject entryentity : gzInfo.getDynamicObjectCollection("entry")) {
+                            //获取分录实付金额
+                            BigDecimal nckd_amountfield5 = amountMap.get(entryentity.getLong("id")) == null ? BigDecimal.ZERO:amountMap.get(entryentity.getLong("id"));
+                            //获取未结算金额
+                            BigDecimal nckd_amountfield7 = entryentity.getBigDecimal("nckd_amountfield7");
+                            nckd_amountfield7 = nckd_amountfield7.subtract(nckd_amountfield5);
+                            //反写分录已付金额,未付金额
+                            entryentity.set("nckd_amountfield5",nckd_amountfield5);
+                            entryentity.set("nckd_amountfield7",nckd_amountfield7);
+                            Long yfjkSourceBillEntryId = entryentity.getLong("e_srcentryid");
+                            yfjkMap.put(yfjkSourceBillEntryId,nckd_amountfield5);
+                        }
+                        SaveServiceHelper.save(new DynamicObject[]{gzInfo});
+
+                        //查询预付借款单
+                        Long prebillId = Long.valueOf(yfjkId);
+                        QFilter nckd_yfjkFilter = new QFilter("id", QCP.equals,prebillId);
+                        DynamicObject[] yfjkDynamicObjects = BusinessDataServiceHelper.load(nckd_er_prepaybill_ext,"id",new QFilter[] {nckd_yfjkFilter});
+                        //循环数组获取结算状态,已结算金额,未结算金额
+                        for (int d=0;d<yfjkDynamicObjects.length;d++) {
+                            BigDecimal nckd_amountfield5 = BigDecimal.ZERO;
+                            BigDecimal nckd_amountfield6 = BigDecimal.ZERO;
+                            //预付借款单头数据包
+                            DynamicObject yfjkInfo = BusinessDataServiceHelper.loadSingle(yfjkDynamicObjects[d].getPkValue(), yfjkDynamicObjects[d].getDynamicObjectType().getName());
+                            //循环预付借款单预付借款信息分录
+                            for (DynamicObject entryentity : yfjkInfo.getDynamicObjectCollection("expenseentryentity")) {
+                                //获取分录实付金额
+                                BigDecimal nckd_amountfield4 = yfjkMap.get(entryentity.getLong("id")) == null ? BigDecimal.ZERO:yfjkMap.get(entryentity.getLong("id"));
+                                //获取未结算金额
+                                BigDecimal nckd_amountfield3 = entryentity.getBigDecimal("nckd_amountfield3");
+                                nckd_amountfield3 = nckd_amountfield3.subtract(nckd_amountfield4);
+                                //反写分录已结算金额,未结算金额
+                                entryentity.set("nckd_amountfield4",nckd_amountfield4);
+                                entryentity.set("nckd_amountfield3",nckd_amountfield3);
+                                nckd_amountfield5 = nckd_amountfield5.add(nckd_amountfield4);
+                                nckd_amountfield6 = nckd_amountfield6.add(nckd_amountfield3);
+                            }
+                            yfjkInfo.set("nckd_amountfield5", nckd_amountfield5);
+                            yfjkInfo.set("nckd_amountfield6", nckd_amountfield6);
+                            yfjkInfo.set("billstatus", "G");
+                            SaveServiceHelper.save(new DynamicObject[]{yfjkInfo});
+                        }
+                    }
+                }
+            }//应付方向的回写
+            else if (bxDynamicObjects.length > 0) {
+                //循环数组获取结算状态,已结算金额,未结算金额
+                for (int c=0;c<bxDynamicObjects.length;c++) {
+                    //报销单头数据包
+                    DynamicObject bxInfo = BusinessDataServiceHelper.loadSingle(bxDynamicObjects[c].getPkValue(), bxDynamicObjects[c].getDynamicObjectType().getName());
+                    String nckd_sourcebillid = bxInfo.getString("nckd_sourcebillid");
+                    //报账类型等于工程报账回写合同台账单
+                    if (!StringUtils.isEmpty(nckd_sourcebillid)) {
+                        //获取合同台账单id
+                        Long contractbillId = Long.parseLong(nckd_sourcebillid);
+                        //查询合同台账单
+                        QFilter htFilter = new QFilter("id", QCP.equals,contractbillId);
+                        DynamicObject[] htDynamicObjects = BusinessDataServiceHelper.load(er_contractbill,"id",new QFilter[] {htFilter});
+                        for (int j=0;j<htDynamicObjects.length;j++) {
+                            //合同台账单头数据包
+                            DynamicObject htInfo = BusinessDataServiceHelper.loadSingle(htDynamicObjects[j].getPkValue(), htDynamicObjects[j].getDynamicObjectType().getName());
+                            //反写付款明细
+                            DynamicObjectCollection entryEntity = htInfo.getDynamicObjectCollection("nckd_payentry");
+                            DynamicObject entry1 = entryEntity.addNew();
+                            entry1.set("nckd_pay_billno1", billno);//付款处理单据编号
+                            entry1.set("nckd_pay_id1", id);//付款处理单据id
+                            entry1.set("nckd_amountfield1", actpayamt);//付款金额
+                            entry1.set("nckd_timefield2", paydate);//付款日期
+                            SaveServiceHelper.save(new DynamicObject[]{htInfo});
+                        }
+                    }
+                }
+            }
+        }
+    }
+}

+ 77 - 0
code/nckd-cosmic-debug/src/main/java/fi/cas/opplugin/TxServiceGatewayProxy.java

@@ -0,0 +1,77 @@
+package fi.cas.opplugin;
+import java.rmi.RemoteException;
+import javax.xml.rpc.ServiceException;
+import javax.xml.rpc.Stub;
+
+public class TxServiceGatewayProxy implements TxServiceGateway_PortType {
+    private String _endpoint = null;
+    private TxServiceGateway_PortType txServiceGateway_PortType = null;
+
+    public TxServiceGatewayProxy() {
+        _initTxServiceGatewayProxy();
+    }
+
+    public TxServiceGatewayProxy(String endpoint) {
+        this._endpoint = endpoint;
+        _initTxServiceGatewayProxy();
+    }
+
+    public TxServiceGatewayProxy(String endpoint,String url) {
+        _initTxServiceGatewayProxy(url);
+    }
+
+    private void _initTxServiceGatewayProxy(String url) {
+        try {
+            this.txServiceGateway_PortType = new TxServiceGateway_ServiceLocator(url)
+                    .getTxServiceGatewayPort();
+            if (this.txServiceGateway_PortType != null)
+                if (this._endpoint != null)
+                    ((Stub) this.txServiceGateway_PortType)._setProperty(
+                            "javax.xml.rpc.service.endpoint.address",
+                            this._endpoint);
+                else
+                    this._endpoint = ((String) ((Stub) this.txServiceGateway_PortType)
+                            ._getProperty("javax.xml.rpc.service.endpoint.address"));
+        } catch (ServiceException localServiceException) {
+        }
+    }
+
+    private void _initTxServiceGatewayProxy() {
+        try {
+            this.txServiceGateway_PortType = new TxServiceGateway_ServiceLocator()
+                    .getTxServiceGatewayPort();
+            if (this.txServiceGateway_PortType != null)
+                if (this._endpoint != null)
+                    ((Stub) this.txServiceGateway_PortType)._setProperty(
+                            "javax.xml.rpc.service.endpoint.address",
+                            this._endpoint);
+                else
+                    this._endpoint = ((String) ((Stub) this.txServiceGateway_PortType)
+                            ._getProperty("javax.xml.rpc.service.endpoint.address"));
+        } catch (ServiceException localServiceException) {
+        }
+    }
+
+    public String getEndpoint() {
+        return this._endpoint;
+    }
+
+    public void setEndpoint(String endpoint) {
+        this._endpoint = endpoint;
+        if (this.txServiceGateway_PortType != null)
+            ((Stub) this.txServiceGateway_PortType)._setProperty(
+                    "javax.xml.rpc.service.endpoint.address", this._endpoint);
+    }
+
+    public TxServiceGateway_PortType getTxServiceGateway_PortType() {
+        if (this.txServiceGateway_PortType == null)
+            _initTxServiceGatewayProxy();
+        return this.txServiceGateway_PortType;
+    }
+
+    public String send(String message) throws RemoteException {
+        if (this.txServiceGateway_PortType == null)
+            _initTxServiceGatewayProxy();
+        return this.txServiceGateway_PortType.send(message);
+    }
+}

+ 141 - 0
code/nckd-cosmic-debug/src/main/java/fi/cas/opplugin/TxServiceGatewaySoapBindingStub.java

@@ -0,0 +1,141 @@
+package fi.cas.opplugin;
+
+import java.net.URL;
+import java.rmi.RemoteException;
+import java.util.Enumeration;
+import java.util.Properties;
+import java.util.Vector;
+import javax.xml.namespace.QName;
+import org.apache.axis.AxisFault;
+import org.apache.axis.NoEndPointException;
+import org.apache.axis.client.Call;
+import org.apache.axis.client.Stub;
+import org.apache.axis.constants.Style;
+import org.apache.axis.constants.Use;
+import org.apache.axis.description.OperationDesc;
+import org.apache.axis.description.ParameterDesc;
+import org.apache.axis.soap.SOAPConstants;
+import org.apache.axis.utils.JavaUtils;
+
+public class TxServiceGatewaySoapBindingStub extends Stub implements
+        TxServiceGateway_PortType {
+    private Vector cachedSerClasses;
+    private Vector cachedSerQNames;
+    private Vector cachedSerFactories;
+    private Vector cachedDeserFactories;
+    static OperationDesc[] _operations = new OperationDesc[1];
+
+    static {
+        _initOperationDesc1();
+    }
+
+    private static void _initOperationDesc1() {
+        OperationDesc oper = new OperationDesc();
+        oper.setName("send");
+        ParameterDesc param = new ParameterDesc(new QName("", "message"), (byte)1,
+                new QName("http://www.w3.org/2001/XMLSchema", "string"),
+                String.class, false, false);
+        param.setOmittable(true);
+        oper.addParameter(param);
+        oper.setReturnType(new QName("http://www.w3.org/2001/XMLSchema",
+                "string"));
+        oper.setReturnClass(String.class);
+        oper.setReturnQName(new QName("", "returnMessage"));
+        oper.setStyle(Style.WRAPPED);
+        oper.setUse(Use.LITERAL);
+        _operations[0] = oper;
+    }
+
+    public TxServiceGatewaySoapBindingStub() throws AxisFault {
+        this(null);
+    }
+
+    public TxServiceGatewaySoapBindingStub(URL endpointURL,
+                                           javax.xml.rpc.Service service) throws AxisFault {
+        this(service);
+        this.cachedEndpoint = endpointURL;
+    }
+
+    public TxServiceGatewaySoapBindingStub(javax.xml.rpc.Service service)
+            throws AxisFault {
+        this.cachedSerClasses = new Vector();
+        this.cachedSerQNames = new Vector();
+        this.cachedSerFactories = new Vector();
+        this.cachedDeserFactories = new Vector();
+
+        if (service == null)
+            this.service = new org.apache.axis.client.Service();
+        else {
+            this.service = service;
+        }
+        ((org.apache.axis.client.Service) this.service)
+                .setTypeMappingVersion("1.2");
+    }
+
+    protected Call createCall() throws RemoteException {
+        try {
+            Call _call = super._createCall();
+            if (this.maintainSessionSet) {
+                _call.setMaintainSession(this.maintainSession);
+            }
+            if (this.cachedUsername != null) {
+                _call.setUsername(this.cachedUsername);
+            }
+            if (this.cachedPassword != null) {
+                _call.setPassword(this.cachedPassword);
+            }
+            if (this.cachedEndpoint != null) {
+                _call.setTargetEndpointAddress(this.cachedEndpoint);
+            }
+            if (this.cachedTimeout != null) {
+                _call.setTimeout(this.cachedTimeout);
+            }
+            if (this.cachedPortName != null) {
+                _call.setPortName(this.cachedPortName);
+            }
+            Enumeration keys = this.cachedProperties.keys();
+            while (keys.hasMoreElements()) {
+                String key = (String) keys.nextElement();
+                _call.setProperty(key, this.cachedProperties.get(key));
+            }
+            return _call;
+        } catch (Throwable _t) {
+            throw new AxisFault("Failure trying to get the Call object", _t);
+        }
+    }
+
+    public String send(String message) throws RemoteException {
+        if (this.cachedEndpoint == null) {
+            throw new NoEndPointException();
+        }
+        Call _call = createCall();
+        _call.setOperation(_operations[0]);
+        _call.setUseSOAPAction(true);
+        _call.setSOAPActionURI("");
+        _call.setEncodingStyle(null);
+        _call.setProperty("sendXsiTypes", Boolean.FALSE);
+        _call.setProperty("sendMultiRefs", Boolean.FALSE);
+        _call.setSOAPVersion(SOAPConstants.SOAP11_CONSTANTS);
+        _call.setOperationName(new QName("http://webservice.fdlk.nstc.com",
+                "send"));
+
+        setRequestHeaders(_call);
+        setAttachments(_call);
+        try {
+            Object _resp = _call.invoke(new Object[] { message });
+
+            if (_resp instanceof RemoteException) {
+                throw ((RemoteException) _resp);
+            }
+
+            extractAttachments(_call);
+            try {
+                return ((String) _resp);
+            } catch (Exception _exception) {
+                return ((String) JavaUtils.convert(_resp, String.class));
+            }
+        } catch (AxisFault axisFaultException) {
+            throw axisFaultException;
+        }
+    }
+}

+ 8 - 0
code/nckd-cosmic-debug/src/main/java/fi/cas/opplugin/TxServiceGateway_PortType.java

@@ -0,0 +1,8 @@
+package fi.cas.opplugin;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+public abstract interface TxServiceGateway_PortType extends Remote {
+    public abstract String send(String paramString) throws RemoteException;
+}

+ 14 - 0
code/nckd-cosmic-debug/src/main/java/fi/cas/opplugin/TxServiceGateway_Service.java

@@ -0,0 +1,14 @@
+package fi.cas.opplugin;
+import java.net.URL;
+import javax.xml.rpc.Service;
+import javax.xml.rpc.ServiceException;
+
+public abstract interface TxServiceGateway_Service extends Service {
+    public abstract String getTxServiceGatewayPortAddress();
+
+    public abstract TxServiceGateway_PortType getTxServiceGatewayPort()
+            throws ServiceException;
+
+    public abstract TxServiceGateway_PortType getTxServiceGatewayPort(
+            URL paramURL) throws ServiceException;
+}

+ 138 - 0
code/nckd-cosmic-debug/src/main/java/fi/cas/opplugin/TxServiceGateway_ServiceLocator.java

@@ -0,0 +1,138 @@
+package fi.cas.opplugin;
+
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.rmi.Remote;
+import java.util.HashSet;
+import java.util.Iterator;
+import javax.xml.namespace.QName;
+import javax.xml.rpc.ServiceException;
+import org.apache.axis.AxisFault;
+import org.apache.axis.EngineConfiguration;
+import org.apache.axis.client.Service;
+import org.apache.axis.client.Stub;
+
+public class TxServiceGateway_ServiceLocator extends Service implements
+        TxServiceGateway_Service {
+    private String TxServiceGatewayPort_address = "";
+
+    private String TxServiceGatewayPortWSDDServiceName = "TxServiceGatewayPort";
+
+    private HashSet ports = null;
+
+    public TxServiceGateway_ServiceLocator() {
+    }
+    public TxServiceGateway_ServiceLocator(String url) {
+        TxServiceGatewayPort_address = url;
+    }
+    public TxServiceGateway_ServiceLocator(EngineConfiguration config) {
+        super(config);
+    }
+
+    public TxServiceGateway_ServiceLocator(String wsdlLoc, QName sName)
+            throws ServiceException {
+        super(wsdlLoc, sName);
+    }
+
+    public String getTxServiceGatewayPortAddress() {
+        return this.TxServiceGatewayPort_address;
+    }
+
+    public String getTxServiceGatewayPortWSDDServiceName() {
+        return this.TxServiceGatewayPortWSDDServiceName;
+    }
+
+    public void setTxServiceGatewayPortWSDDServiceName(String name) {
+        this.TxServiceGatewayPortWSDDServiceName = name;
+    }
+
+    public TxServiceGateway_PortType getTxServiceGatewayPort()
+            throws ServiceException {
+        URL endpoint;
+        try {
+            endpoint = new URL(this.TxServiceGatewayPort_address);
+        } catch (MalformedURLException e) {
+            throw new ServiceException(e);
+        }
+        return getTxServiceGatewayPort(endpoint);
+    }
+
+    public TxServiceGateway_PortType getTxServiceGatewayPort(URL portAddress)
+            throws ServiceException {
+        try {
+            TxServiceGatewaySoapBindingStub _stub = new TxServiceGatewaySoapBindingStub(
+                    portAddress, this);
+            _stub.setPortName(getTxServiceGatewayPortWSDDServiceName());
+            return _stub;
+        } catch (AxisFault e) {
+        }
+        return null;
+    }
+
+    public void setTxServiceGatewayPortEndpointAddress(String address) {
+        this.TxServiceGatewayPort_address = address;
+    }
+
+    public Remote getPort(Class serviceEndpointInterface)
+            throws ServiceException {
+        try {
+            if (TxServiceGateway_PortType.class
+                    .isAssignableFrom(serviceEndpointInterface)) {
+                TxServiceGatewaySoapBindingStub _stub = new TxServiceGatewaySoapBindingStub(
+                        new URL(this.TxServiceGatewayPort_address), this);
+                _stub.setPortName(getTxServiceGatewayPortWSDDServiceName());
+                return _stub;
+            }
+        } catch (Throwable t) {
+            throw new ServiceException(t);
+        }
+        throw new ServiceException(
+                "There is no stub implementation for the interface:  "
+                        + ((serviceEndpointInterface == null) ? "null"
+                        : serviceEndpointInterface.getName()));
+    }
+
+    public Remote getPort(QName portName, Class serviceEndpointInterface)
+            throws ServiceException {
+        if (portName == null) {
+            return getPort(serviceEndpointInterface);
+        }
+        String inputPortName = portName.getLocalPart();
+        if ("TxServiceGatewayPort".equals(inputPortName)) {
+            return getTxServiceGatewayPort();
+        }
+
+        Remote _stub = getPort(serviceEndpointInterface);
+        ((Stub) _stub).setPortName(portName);
+        return _stub;
+    }
+
+    public QName getServiceName() {
+        return new QName("http://webservice.fdlk.nstc.com", "TxServiceGateway");
+    }
+
+    public Iterator getPorts() {
+        if (this.ports == null) {
+            this.ports = new HashSet();
+            this.ports.add(new QName("http://webservice.fdlk.nstc.com",
+                    "TxServiceGatewayPort"));
+        }
+        return this.ports.iterator();
+    }
+
+    public void setEndpointAddress(String portName, String address)
+            throws ServiceException {
+        if ("TxServiceGatewayPort".equals(portName)) {
+            setTxServiceGatewayPortEndpointAddress(address);
+        } else {
+            throw new ServiceException(
+                    " Cannot set Endpoint Address for Unknown Port" + portName);
+        }
+    }
+
+    public void setEndpointAddress(QName portName, String address)
+            throws ServiceException {
+        setEndpointAddress(portName.getLocalPart(), address);
+    }
+}

+ 1119 - 0
code/nckd-cosmic-debug/src/main/java/fi/cas/opplugin/TypeUtils.java

@@ -0,0 +1,1119 @@
+package fi.cas.opplugin;
+
+
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
+import java.text.NumberFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+public class TypeUtils {
+
+
+    public static double StringToDouble(Object obj){
+        return obj==null?0.0:Double.parseDouble(obj.toString());
+    }
+
+
+
+    public static final String NODE_PATH_SPERATOR="/";
+    /**
+     * HOUR_UNIT这个常量表示单位:人时
+     *
+     * @see #HOUR_UNIT :人时
+     * @see #DAY_UNIT :人天
+     * @see #WEEK_UNIT :人周
+     * @see #MONTH_UNIT :人月
+     */
+    public final static int HOUR_UNIT = 1;
+    /**
+     * DAY_UNIT这个常量表示单位:人天
+     *
+     * @see #HOUR_UNIT :人时
+     * @see #DAY_UNIT :人天
+     * @see #WEEK_UNIT :人周
+     * @see #MONTH_UNIT :人月
+     */
+    public final static int DAY_UNIT = 2;
+    /**
+     * WEEK_UNIT这个常量表示单位:人周
+     *
+     * @see #HOUR_UNIT :人时
+     * @see #DAY_UNIT :人天
+     * @see #WEEK_UNIT :人周
+     * @see #MONTH_UNIT :人月
+     */
+    public final static int WEEK_UNIT = 3;
+    /**
+     * MONTH_UNIT这个常量表示单位:人月
+     *
+     * @see #HOUR_UNIT :人时
+     * @see #DAY_UNIT :人天
+     * @see #WEEK_UNIT :人周
+     * @see #MONTH_UNIT :人月
+     */
+    public final static int MONTH_UNIT = 4;
+
+    /**
+     * 这个常量表示分组方式:按任务分组
+     *
+     * @see #BY_TASK:按任务分组
+     * @see #BY_RESOURCE:按资源分组
+     * @see #BY_RESOURCE_TYPE:按资源类型分组
+     * @see #BY_PROJECT:按项目分组
+     * @see #BY_NON_PROJECT_TYPE:按非项目类型分组
+     * @see #BY_EXPENSE_TYPE:按费用类型分组
+     * @see #BY_BENEFIT_TYPE:按收益类型分组
+     * @see #BY_PHASE:按阶段分组
+     * @see #BY_REPORT_BY:按报告分组
+     * @see #BY_OUTLINE:按一级大纲任务分组
+     * @see #BY_TYPE:按类型分组
+     */
+    public final static int BY_TASK = 1;
+    /**
+     * 这个常量表示分组方式:按资源分组
+     *
+     * @see #BY_TASK:按任务分组
+     * @see #BY_RESOURCE:按资源分组
+     * @see #BY_RESOURCE_TYPE:按资源类型分组
+     * @see #BY_PROJECT:按项目分组
+     * @see #BY_NON_PROJECT_TYPE:按非项目类型分组
+     * @see #BY_EXPENSE_TYPE:按费用类型分组
+     * @see #BY_BENEFIT_TYPE:按收益类型分组
+     * @see #BY_PHASE:按阶段分组
+     * @see #BY_REPORT_BY:按报告分组
+     * @see #BY_OUTLINE:按一级大纲任务分组
+     * @see #BY_TYPE:按类型分组
+     */
+    public final static int BY_RESOURCE = 2;
+    /**
+     * 这个常量表示分组方式:按资源类型分组
+     *
+     * @see #BY_TASK:按任务分组
+     * @see #BY_RESOURCE:按资源分组
+     * @see #BY_RESOURCE_TYPE:按资源类型分组
+     * @see #BY_PROJECT:按项目分组
+     * @see #BY_NON_PROJECT_TYPE:按非项目类型分组
+     * @see #BY_EXPENSE_TYPE:按费用类型分组
+     * @see #BY_BENEFIT_TYPE:按收益类型分组
+     * @see #BY_PHASE:按阶段分组
+     * @see #BY_REPORT_BY:按报告分组
+     * @see #BY_OUTLINE:按一级大纲任务分组
+     * @see #BY_TYPE:按类型分组
+     */
+    public final static int BY_RESOURCE_TYPE = 3;
+    /**
+     * 这个常量表示分组方式:按项目类型分组
+     *
+     * @see #BY_TASK:按任务分组
+     * @see #BY_RESOURCE:按资源分组
+     * @see #BY_RESOURCE_TYPE:按资源类型分组
+     * @see #BY_PROJECT:按项目分组
+     * @see #BY_NON_PROJECT_TYPE:按非项目类型分组
+     * @see #BY_EXPENSE_TYPE:按费用类型分组
+     * @see #BY_BENEFIT_TYPE:按收益类型分组
+     * @see #BY_PHASE:按阶段分组
+     * @see #BY_REPORT_BY:按报告分组
+     * @see #BY_OUTLINE:按一级大纲任务分组
+     * @see #BY_TYPE:按类型分组
+     */
+    public final static int BY_PROJECT = 4;
+    /**
+     * 这个常量表示分组方式:按非项目类型分组
+     *
+     * @see #BY_TASK:按任务分组
+     * @see #BY_RESOURCE:按资源分组
+     * @see #BY_RESOURCE_TYPE:按资源类型分组
+     * @see #BY_PROJECT:按项目分组
+     * @see #BY_NON_PROJECT_TYPE:按非项目类型分组
+     * @see #BY_EXPENSE_TYPE:按费用类型分组
+     * @see #BY_BENEFIT_TYPE:按收益类型分组
+     * @see #BY_PHASE:按阶段分组
+     * @see #BY_REPORT_BY:按报告分组
+     * @see #BY_OUTLINE:按一级大纲任务分组
+     * @see #BY_TYPE:按类型分组
+     */
+    public final static int BY_NON_PROJECT_TYPE = 5;
+    /**
+     * 这个常量表示分组方式:按费用类型分组
+     *
+     * @see #BY_TASK:按任务分组
+     * @see #BY_RESOURCE:按资源分组
+     * @see #BY_RESOURCE_TYPE:按资源类型分组
+     * @see #BY_PROJECT:按项目分组
+     * @see #BY_NON_PROJECT_TYPE:按非项目类型分组
+     * @see #BY_EXPENSE_TYPE:按费用类型分组
+     * @see #BY_BENEFIT_TYPE:按收益类型分组
+     * @see #BY_PHASE:按阶段分组
+     * @see #BY_REPORT_BY:按报告分组
+     * @see #BY_OUTLINE:按一级大纲任务分组
+     * @see #BY_TYPE:按类型分组
+     */
+    public final static int BY_EXPENSE_TYPE = 6;
+    /**
+     * 这个常量表示分组方式:按收益类型分组
+     *
+     * @see #BY_TASK:按任务分组
+     * @see #BY_RESOURCE:按资源分组
+     * @see #BY_RESOURCE_TYPE:按资源类型分组
+     * @see #BY_PROJECT:按项目分组
+     * @see #BY_NON_PROJECT_TYPE:按非项目类型分组
+     * @see #BY_EXPENSE_TYPE:按费用类型分组
+     * @see #BY_BENEFIT_TYPE:按收益类型分组
+     * @see #BY_PHASE:按阶段分组
+     * @see #BY_REPORT_BY:按报告分组
+     * @see #BY_OUTLINE:按一级大纲任务分组
+     * @see #BY_TYPE:按类型分组
+     */
+    public final static int BY_BENEFIT_TYPE = 7;
+    /**
+     * 这个常量表示分组方式:按阶段分组
+     *
+     * @see #BY_TASK:按任务分组
+     * @see #BY_RESOURCE:按资源分组
+     * @see #BY_RESOURCE_TYPE:按资源类型分组
+     * @see #BY_PROJECT:按项目分组
+     * @see #BY_NON_PROJECT_TYPE:按非项目类型分组
+     * @see #BY_EXPENSE_TYPE:按费用类型分组
+     * @see #BY_BENEFIT_TYPE:按收益类型分组
+     * @see #BY_PHASE:按阶段分组
+     * @see #BY_REPORT_BY:按报告分组
+     * @see #BY_OUTLINE:按一级大纲任务分组
+     * @see #BY_TYPE:按类型分组
+     */
+    public final static int BY_PHASE = 8;
+    /**
+     * 这个常量表示分组方式:按报告分组
+     *
+     * @see #BY_TASK:按任务分组
+     * @see #BY_RESOURCE:按资源分组
+     * @see #BY_RESOURCE_TYPE:按资源类型分组
+     * @see #BY_PROJECT:按项目分组
+     * @see #BY_NON_PROJECT_TYPE:按非项目类型分组
+     * @see #BY_EXPENSE_TYPE:按费用类型分组
+     * @see #BY_BENEFIT_TYPE:按收益类型分组
+     * @see #BY_PHASE:按阶段分组
+     * @see #BY_REPORT_BY:按报告分组
+     * @see #BY_OUTLINE:按一级大纲任务分组
+     * @see #BY_TYPE:按类型分组
+     */
+    public final static int BY_REPORT_BY = 9;
+    /**
+     * 这个常量表示分组方式:按一级大纲任务分组
+     *
+     * @see #BY_TASK:按任务分组
+     * @see #BY_RESOURCE:按资源分组
+     * @see #BY_RESOURCE_TYPE:按资源类型分组
+     * @see #BY_PROJECT:按项目分组
+     * @see #BY_NON_PROJECT_TYPE:按非项目类型分组
+     * @see #BY_EXPENSE_TYPE:按费用类型分组
+     * @see #BY_BENEFIT_TYPE:按收益类型分组
+     * @see #BY_PHASE:按阶段分组
+     * @see #BY_REPORT_BY:按报告分组
+     * @see #BY_OUTLINE:按一级大纲任务分组
+     * @see #BY_TYPE:按类型分组
+     */
+    public final static int BY_OUTLINE = 10;// 一级大纲任务分组
+    /**
+     * 这个常量表示分组方式:按类型分组
+     *
+     * @see #BY_TASK:按任务分组
+     * @see #BY_RESOURCE:按资源分组
+     * @see #BY_RESOURCE_TYPE:按资源类型分组
+     * @see #BY_PROJECT:按项目分组
+     * @see #BY_NON_PROJECT_TYPE:按非项目类型分组
+     * @see #BY_EXPENSE_TYPE:按费用类型分组
+     * @see #BY_BENEFIT_TYPE:按收益类型分组
+     * @see #BY_PHASE:按阶段分组
+     * @see #BY_REPORT_BY:按报告分组
+     * @see #BY_OUTLINE:按一级大纲任务分组
+     * @see #BY_TYPE:按类型分组
+     */
+    public final static int BY_TYPE = 11;// 一级大纲任务分组
+    public final static int BY_PRODUCT = 12;// 工作产品
+
+    /**
+     * 这个常量表示信号灯:无信号灯
+     *
+     * @see #NONE:无信号灯
+     * @see #GREEN:绿灯
+     * @see #YELLOW:黄灯
+     * @see #RED:红灯
+     * @see #COMPLETED:已经完成
+     */
+    public final static int NONE = 1;
+    /**
+     * 这个常量表示信号灯:绿灯
+     *
+     * @see #NONE:无信号灯
+     * @see #GREEN:绿灯
+     * @see #YELLOW:黄灯
+     * @see #RED:红灯
+     * @see #COMPLETED:已经完成
+     */
+    public final static int GREEN = 2;
+    /**
+     * 这个常量表示信号灯:黄灯
+     *
+     * @see #NONE:无信号灯
+     * @see #GREEN:绿灯
+     * @see #YELLOW:黄灯
+     * @see #RED:红灯
+     * @see #COMPLETED:已经完成
+     */
+    public final static int YELLOW = 3;
+    /**
+     * 这个常量表示信号灯:红灯
+     *
+     * @see #NONE:无信号灯
+     * @see #GREEN:绿灯
+     * @see #YELLOW:黄灯
+     * @see #RED:红灯
+     * @see #COMPLETED:已经完成
+     */
+    public final static int RED = 4;
+
+    /**
+     * 这个常量表示信号灯:待我确认
+     *
+     * @see #NONE:无信号灯
+     * @see #GREEN:绿灯
+     * @see #YELLOW:黄灯
+     * @see #RED:红灯
+     * @see #PURPLE:紫色
+     * @see #LIGHT_BLUE:深蓝
+     * @see #COMPLETED:已经完成
+     */
+    public final static int PURPLE = 5;
+
+    /**
+     * 这个常量表示信号灯:被退回
+     *
+     * @see #NONE:无信号灯
+     * @see #GREEN:绿灯
+     * @see #YELLOW:黄灯
+     * @see #RED:红灯
+     * @see #COMPLETED:已经完成
+     */
+    public final static int LIGHT_BLUE = 6;
+    /**
+     * 这个常量表示信号灯:已经完成
+     *
+     * @see #NONE:无信号灯
+     * @see #GREEN:绿灯
+     * @see #YELLOW:黄灯
+     * @see #RED:红灯
+     * @see #COMPLETED:已经完成
+     */
+    public final static int COMPLETED = -1;
+    /**
+     * 这个常量是取得long数据类型的系统当前时间
+     */
+    private static long current = System.currentTimeMillis();
+
+    /**
+     * 这个获取根据时间或许系统唯一的ID
+     */
+    public static synchronized long getUniqueID() {
+        return current++;
+    }
+
+    /**
+     * 这个方法是将一个可能为<code>null</code>或者为<code>"null"</code>(忽略大小写)的
+     * <code>String</code>转换为非空的<code>String</code>.<br/>
+     * 即如果当参数<code>inString</code>为<code>null</code>时,返回值就为<code>""</code>
+     * ,如果不为空则返回inString.trim()值.
+     *
+     * @param inString
+     *            为一个可能为<code>null</code>或者为<code>"null"</code>(忽略大小写)的
+     *            <code>String</code>类型数据
+     * @return 如果当参数<code>inString</code>为<code>null</code>时,返回值就为
+     *         <code>""</code>,如果不为空则返回inString.trim()值.
+     */
+    public static String nullToString(String inString) {
+        return ((inString == null || "null".equalsIgnoreCase(inString.trim())) ? "" : inString.trim());
+    }
+
+    /**
+     * 这个方法是将一个可能为<code>null</code>或者为<code>"null"</code>(忽略大小写)的
+     * <code>String</code>数据类型<code>inString</code>, 如果转换为给定的默认值
+     * <code>defaultString</code>为<code>null</code>或者为<code>"null"</code>
+     * (忽略大小写),返回默认值,否则返回inString.trim()值.
+     *
+     * @param inString
+     *            为一个可能为<code>null</code>或者为<code>"null"</code>(忽略大小写)的
+     *            <code>String</code>类型数据.
+     * @param defaultString
+     *            为<code>String</code>类型的数据,它用于当<code>inString</code>
+     *            为空时,就将它作为返回值.
+     * @return 如果当参数<code>inString</code>为<code>null</code>时,返回值就为给定的默认值
+     *         <code>defaultString</code>,如果不为空则返回inString.trim()值.
+     */
+    public static String nullToString(String inString, String defaultString) {
+        return ((inString == null || "null".equalsIgnoreCase(inString.trim())) ? defaultString : inString.trim());
+    }
+
+    /**
+     * 这个方法是将一个可能为<code>null</code>或者为<code>"null"</code>(忽略大小写)的
+     * <code>Object</code>类型的数据转换为非空的<code>String</code>.<br/>
+     * 即如果当参数<code>inObject</code>为空时,返回值就为<code>""</code>
+     * ,如果不为空则返回inObject.toString()值.
+     *
+     * @param inObject
+     *            为一个可能为<code>null</code>或者为<code>"null"</code>(忽略大小写)的
+     *            <code>Object</code>类型数据
+     * @return 如果当参数<code>inObject</code>为空时,返回值就为<code>""</code>
+     *         ,如果不为空则返回inObject.trim()值.
+     */
+    public static String nullToString(Object inObject) {
+        return ((inObject == null || "null".equalsIgnoreCase(inObject.toString().trim())) ? "" : inObject.toString());
+    }
+
+    /**
+     * 将给定的字符串数组用分隔符加起来.<br/>
+     * 例如:<code>ss={"11","22","33"} split="," </code>其返回结果为
+     * <code>"11,22,33"</code>
+     *
+     * @param ss
+     *            为要拼的字符串数组
+     * @param split
+     *            为分隔符
+     * @return 用分隔符拼接好后的结果
+     */
+    public static String joinString(String[] ss, String split) {
+        StringBuffer sb = new StringBuffer();
+        if (ss != null && ss.length > 0) {
+            for (String s : ss) {
+                if (sb.length() > 0) {
+                    sb.append(split);
+                }
+                sb.append(s);
+            }
+        }
+        return sb.toString();
+    }
+
+    /**
+     * 将给定的<code>Object inObject</code>,如果非空或者非<code>"null"</code>
+     * ,返回UTF编码格式的inObject.toString()值,否则返回<code>""</code>.<br/>
+     *
+     * @param inObject
+     *            为一个可能为<code>null</code>或者为<code>"null"</code>(忽略大小写)的
+     *            <code>Object</code>类型数据
+     * @return inObject 的UTF编码格式的String值.
+     */
+    public static String getUTFString(Object inObject) {
+        try {
+            return ((inObject == null || "null".equalsIgnoreCase(inObject.toString().trim())) ? "" : new String(
+                    inObject.toString().getBytes("ISO8859-1")));
+        } catch (Exception e) {
+        }
+        return "";
+    }
+
+    /**
+     * 将给定的<code>Object inObject</code>,如果<code>inObject</code>
+     * 可以转换为数值,则返回转换后的int值,否则返回<code>0</code>.<br/>
+     *
+     * @param inObject
+     *            为一个<code>Object</code>类型数据
+     * @return 如果<code>inObject</code>可以转换为数值,则返回转换后的int值,否则返回int类型值
+     *         <code>0</code>.
+     */
+    public static int nullToInt(Object inObject) {
+        int iRet = 0;
+        if (inObject != null) {
+            try {
+                Double temp = new Double(inObject.toString());
+                iRet = temp.intValue();
+            } catch (Exception e) {
+                iRet = 0;
+            }
+        }
+        return iRet;
+    }
+
+
+
+    /**
+     * 将给定的<code>destStr</code>目标字符串,以新字符串<code>newStr</code>替换每一个旧字符串
+     * <code>oldStr</code>.<br/>
+     *
+     * @param destStr
+     *            为目标字符串
+     * @param oldStr
+     *            为需要被替换的旧字符串
+     * @param newStr
+     *            为要去替换的新字符串
+     * @return 返回替换好了的字符串,如果目标字符串为<code>null</code>,则返回<code>""</code>.
+     *
+     */
+    public static String strReplace(String destStr, String oldStr, String newStr) {
+        if (destStr == null){
+            return "";
+        }
+        String tmpStr = destStr;
+        int foundPos = tmpStr.indexOf(oldStr);
+        while (foundPos >= 0) {
+            tmpStr = tmpStr.substring(0, foundPos) + newStr
+                    + tmpStr.substring(foundPos + oldStr.length(), tmpStr.length());
+            foundPos = tmpStr.indexOf(oldStr, foundPos + newStr.length());
+        }
+        return tmpStr;
+    }
+
+
+
+
+
+
+
+    /**
+     * 将数据转换为html的数据格式.<br/>
+     * 例如:<code>obj="aa\r\nbb\rcc\n"</code> 替换为
+     * <code>"aa&lt;br&gt;bb&lt;br&gt;cc&lt;br&gt;"</code>
+     *
+     * @param obj
+     *            要转换的数据
+     * @return 转换完成的数据
+     */
+    public static String htmlEncoder4Print(Object obj) {
+        String sRet = htmlEncoder(obj);
+        sRet = strReplace(sRet, "\r\n", "<br>");
+        sRet = strReplace(sRet, "\r", "<br>");
+        sRet = strReplace(sRet, "\n", "<br>");
+        return sRet;
+    }
+
+    /**
+     * 将数据中的特殊字符转化为普通字符.<br/>
+     * 比如说我们可能需要将这一段代码<code>"aa&lt;br&gt;bb&lt;br&gt;cc&lt;br&gt;"</code>
+     * 显示在一个输入框内, 或者显示在页面上,我们就可以调用这个方法将那些特殊字符(&lt; &gt; &#039; &quot; )进行转换.
+     *
+     * @param obj
+     *            要转换的数据
+     * @return 转换完成的数据
+     */
+    public static String htmlEncoder(Object obj) {
+        if (obj == null){
+            return ("");
+        }
+        String value = obj.toString();
+
+        char content[] = new char[value.length()];
+        value.getChars(0, value.length(), content, 0);
+        StringBuffer result = new StringBuffer(content.length + 50);
+        for (int i = 0; i < content.length; i++) {
+            switch (content[i]) {
+                case '<':
+                    result.append("&lt;");
+                    break;
+                case '>':
+                    result.append("&gt;");
+                    break;
+                case '\'':
+                    result.append("&#039;");
+                    break;
+                // case '&':
+                // result.append("&amp;");
+                // break;
+                case '"':
+                    result.append("&quot;");
+                    break;
+                default:
+                    result.append(content[i]);
+            }
+        }
+        return (result.toString());
+    }
+
+
+
+
+
+
+
+
+
+
+
+
+    /**
+     * 这个常量表示时间格式:yyyy-MM-dd
+     *
+     * @see #DEFAULT_DATE_FORMAT:yyyy-MM-dd
+     * @see #DEFAULT_TIMESTAMP_FORMAT:yyyy-MM-dd HH:mm:ss
+     * @see #DEFAULT_TIME_FORMAT:yyyy-MM-dd HH:mm
+     * @see #DEFAULT_HOUR_FORMAT:yyyy-MM-dd hha
+     */
+    public static String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
+    /**
+     * 这个常量表示时间格式:yyyy-MM-dd HH:mm:ss
+     *
+     * @see #DEFAULT_DATE_FORMAT:yyyy-MM-dd
+     * @see #DEFAULT_TIMESTAMP_FORMAT:yyyy-MM-dd HH:mm:ss
+     * @see #DEFAULT_TIME_FORMAT:yyyy-MM-dd HH:mm
+     * @see #DEFAULT_HOUR_FORMAT:yyyy-MM-dd hha
+     */
+    public static String DEFAULT_TIMESTAMP_FORMAT = "yyyy-MM-dd HH:mm:ss";
+    /**
+     * 这个常量表示时间格式:yyyy-MM-dd HH:mm
+     *
+     * @see #DEFAULT_DATE_FORMAT:yyyy-MM-dd
+     * @see #DEFAULT_TIMESTAMP_FORMAT:yyyy-MM-dd HH:mm:ss
+     * @see #DEFAULT_TIME_FORMAT:yyyy-MM-dd HH:mm
+     * @see #DEFAULT_HOUR_FORMAT:yyyy-MM-dd hha
+     */
+    public static String DEFAULT_TIME_FORMAT = "yyyy-MM-dd HH:mm";
+    /**
+     * 这个常量表示时间格式:yyyy-MM-dd hha
+     *
+     * @see #DEFAULT_DATE_FORMAT:yyyy-MM-dd
+     * @see #DEFAULT_TIMESTAMP_FORMAT:yyyy-MM-dd HH:mm:ss
+     * @see #DEFAULT_TIME_FORMAT:yyyy-MM-dd HH:mm
+     * @see #DEFAULT_HOUR_FORMAT:yyyy-MM-dd hha
+     */
+    public static String DEFAULT_HOUR_FORMAT = "yyyy-MM-dd hha";
+
+    // public static Date getCurrentDay() {
+    // Calendar c = Calendar.getInstance();
+    // clearCalendar(c);
+    // return new java.sql.Timestamp(c.getTimeInMillis());
+    // }
+
+    // public static Date getLastSaturday() {
+    // Calendar c = Calendar.getInstance();
+    // clearCalendar(c);
+    // c.add(Calendar.DATE, -c.get(Calendar.DAY_OF_WEEK));
+    // return new java.sql.Timestamp(c.getTimeInMillis());
+    // }
+
+    /**
+     * 这个方法是设置<code>Calendar</code>的年月日三个属性,时分秒和毫秒默认为0
+     *
+     * @param c
+     *            -要设置的Calendar
+     * @param year
+     *            -参数年
+     * @param month
+     *            -参数月
+     * @param day
+     *            -参数日
+     * @return 设置好后的Calendar
+     */
+    public static Calendar setCalendar(Calendar c, int year, int month, int day) {
+        c.set(Calendar.YEAR, year);
+        c.set(Calendar.MONTH, month);
+        c.set(Calendar.DAY_OF_MONTH, day);
+        c.set(Calendar.HOUR_OF_DAY, 0);
+        c.set(Calendar.MINUTE, 0);
+        c.set(Calendar.SECOND, 0);
+        c.set(Calendar.MILLISECOND, 0);
+        return c;
+    }
+
+    /**
+     * 这个方法是设置<code>Calendar</code>的Time属性,时分秒和毫秒默认为0
+     *
+     * @param c
+     *            -要设置的Calendar
+     * @param date
+     *            -参数要设置的时间
+     * @return 设置好后的Calendar
+     */
+    public static Calendar setCalendar(Calendar c, Date date) {
+        c.setTime(date);
+        c.set(Calendar.HOUR_OF_DAY, 0);
+        c.set(Calendar.MINUTE, 0);
+        c.set(Calendar.SECOND, 0);
+        c.set(Calendar.MILLISECOND, 0);
+        return c;
+    }
+
+    /**
+     * 将日期类型转换为<code>String</code>类型
+     *
+     * @param dateValue
+     *            要转换的日期
+     * @param dateFormat
+     *            要转换的格式
+     * @return 转换后的结果
+     * @see #DEFAULT_DATE_FORMAT:yyyy-MM-dd
+     * @see #DEFAULT_TIMESTAMP_FORMAT:yyyy-MM-dd HH:mm:ss
+     * @see #DEFAULT_TIME_FORMAT:yyyy-MM-dd HH:mm
+     * @see #DEFAULT_HOUR_FORMAT:yyyy-MM-dd hha
+     */
+    public static String date2String(Date dateValue, String dateFormat) {
+        String sResult = "";
+        if (dateValue != null) {
+            SimpleDateFormat formatter = new SimpleDateFormat(dateFormat);
+            sResult = formatter.format(dateValue);
+        }
+        return sResult;
+    }
+
+    /**
+     * 将Date数据转换成默认日期格式或者默认时间格式的字符串
+     *
+     * @param dateValue
+     *            要转换的Date
+     * @param dateFormat
+     *            如果为0则为默认时间格式(yyyy-MM-dd HH:mm),否则为默认日期(yyyy-MM-dd)
+     * @return 转换后的字符串
+     * @see #DEFAULT_DATE_FORMAT:yyyy-MM-dd
+     * @see #DEFAULT_TIME_FORMAT:yyyy-MM-dd HH:mm
+     */
+    public static String date2String(Date dateValue, int dateFormat) {
+        String f = DEFAULT_DATE_FORMAT;
+        if (dateFormat == 0) {
+            f = DEFAULT_TIME_FORMAT;
+        }
+        return date2String(dateValue, f);
+    }
+
+    /**
+     * 将Date类型的数据转换为默认时间格式(yyyy-MM-dd HH:mm)的字符串
+     *
+     * @param dateValue
+     *            要转换的Date
+     * @return 转换后的字符串
+     */
+    public static String date2String(Date dateValue) {
+        return date2String(dateValue, DEFAULT_TIME_FORMAT);
+    }
+
+    /**
+     * 这个方法将给定的字符串转换为默认的日期类型(yyyy-MM-dd)
+     *
+     * @param sDate
+     *            要转换成日期的字符串
+     * @return 转换完成的字符串
+     * @throws ParseException
+     *             字符串不能转换成日期格式时,出现转换异常
+     * @see #DEFAULT_DATE_FORMAT:yyyy-MM-dd
+     */
+    public static Date string2Date(String sDate) throws ParseException {
+        return string2Date(sDate, DEFAULT_DATE_FORMAT);
+    }
+
+    /**
+     * 这个方法将给定的字符串转换为指定的日期类型
+     *
+     * @param sDate
+     *            要转换成日期的字符串
+     * @param dateFormat
+     *            目标格式
+     * @return 转换后的日期
+     * @throws ParseException
+     *             转换时出现的异常,很可能是sDate格式不正确
+     * @see #DEFAULT_DATE_FORMAT:yyyy-MM-dd
+     * @see #DEFAULT_TIMESTAMP_FORMAT:yyyy-MM-dd HH:mm:ss
+     * @see #DEFAULT_TIME_FORMAT:yyyy-MM-dd HH:mm
+     * @see #DEFAULT_HOUR_FORMAT:yyyy-MM-dd hha
+     */
+    public static Date string2Date(String sDate, String dateFormat) throws ParseException {
+        Date tmp = null;
+        if (sDate != null && !"".equals(sDate)) {
+            SimpleDateFormat formatter = new SimpleDateFormat(dateFormat);
+            formatter.setLenient(true);
+            tmp = formatter.parse(sDate);
+        }
+        return tmp;
+    }
+
+    /**
+     * 将String数据转换成默认日期格式或者默认时间格式的时间或者日期格式
+     *
+     * @param sDate
+     *            要转换的String
+     * @param dateFormat
+     *            如果为0则为默认时间格式(yyyy-MM-dd HH:mm),否则为默认日期(yyyy-MM-dd)
+     * @return 转换后的日期
+     * @see #DEFAULT_DATE_FORMAT:yyyy-MM-dd
+     * @see #DEFAULT_TIME_FORMAT:yyyy-MM-dd HH:mm
+     */
+    public static Date string2Date(String sDate, int dateFormat) throws ParseException {
+        String f = DEFAULT_DATE_FORMAT;
+        if (dateFormat == 0) {
+            f = DEFAULT_TIME_FORMAT;
+        }
+        return string2Date(sDate, f);
+    }
+
+    /**
+     * 将Sting转换成int,如果s的值为null,"null",""则返回默认值0
+     *
+     * @param s
+     *            要转换的String
+     * @return 转换完成的int结果
+     */
+    public static int getIntFromString(String s) {
+        int iRet = 0;
+        if (s != null && !"".equals(s) && !"null".equals(s)) {
+            iRet = Integer.parseInt(s);
+        }
+        return iRet;
+    }
+
+    /**
+     * 将Sting转换成long,如果s的值为null,""则返回默认值0
+     *
+     * @param s
+     *            要转换的String
+     * @return 转换完成的long结果
+     */
+    public static long getLongFromString(String s) {
+        long iRet = 0;
+        if (s != null && !"".equals(s)) {
+            iRet = Long.parseLong(s);
+        }
+        return iRet;
+    }
+
+    /**
+     * 将Sting转换成Integer,如果s的值为null,"null",""则返回null
+     *
+     * @param s
+     *            要转换的String
+     * @return 转换完成的Integer结果
+     */
+    public static Integer getInteger(String s) {
+        if (s == null || "".equals(s)) {
+            return null;
+        }
+        return new Integer(s);
+    }
+
+    /**
+     * 默认的Decimal格式,保留两位小数
+     */
+    private static String FORMAT_PATTERN_DEFAULT = "#0.00";
+
+    /**
+     * 获取指定格式的数值,并以String数据类型返回,如果input是null或者"",返回""
+     *
+     * @param input
+     *            要转换的字符串
+     * @param pattern
+     *            要转换的格式
+     * @return 返回指定格式的String类型的数值(四舍五入)
+     */
+    public static String formatNumber(String input, String pattern) {
+        if (input == null ||"" .equals(input.trim())) {
+            return "";
+        }
+        DecimalFormat format = new DecimalFormat();
+        format.applyLocalizedPattern(pattern);
+        double d = Double.parseDouble(input);
+        return format.format(d);
+    }
+
+
+
+    /**
+     * 获取默认格式的String类型的数值
+     *
+     * @param input
+     *            要转换的String
+     * @return 转换后的数据(四舍五入)
+     */
+    public static String formatNumber(String input) {
+        return formatNumber(input, FORMAT_PATTERN_DEFAULT);
+    }
+
+
+
+    /**
+     * Format given double value to a string with specific precision. Known bug:
+     * If the significant digit count of input double value is greater than 17,
+     * the formatted value will be incorrect For example: 11111111111111111.0000
+     * will be formated to 11111111111111112.0, Double.toString(double) method
+     * will return 1.1111111111111112E16, this is the cause. Note: Don't call
+     * String.valueOf(double) to convert it to a string, which will format the
+     * number as computer science notation format when the value is larger than
+     * 10^7.
+     *
+     * @param d
+     * @return
+     */
+    public static String formatNumber(double d, int scale) {
+        DecimalFormat df = new DecimalFormat(FORMAT_PATTERN_DEFAULT);
+        df.setMaximumFractionDigits(scale);
+        return df.format(d);
+    }
+
+    /**
+     * Format given double value to a string with default precision of 2.
+     *
+     * @param d
+     * @return
+     */
+    public static String formatNumber(double d) {
+        DecimalFormat df = new DecimalFormat(FORMAT_PATTERN_DEFAULT);
+        df.setMaximumFractionDigits(2);
+        return df.format(d);
+    }
+
+    /**
+     * 默认的DECIMAL的数据格式
+     *
+     */
+    public static String DEFAULT_DECIMAL_FORMAT = "##############0.00";
+    /**
+     * 默认的WORKTIME的数据格式
+     *
+     */
+    public static String DEFAULT_WORKTIME_FORMAT = "##############0.0";
+    /**
+     * 默认的PERCENT的数据格式
+     *
+     */
+    public static String DEFAULT_PERCENT_FORMAT = "##############0";
+
+    /**
+     * percent的DecimalFormat格式
+     *
+     * @see decimalFormatter "##############0.00"
+     * @see workTimeFormatter "##############0.0"
+     * @see percentFormatter "##############0"
+     */
+
+    /**
+     * 将给定的double类型的数据,根据默认DecimalFormat格式转化成对应的String类型数值
+     *
+     * @param d
+     *            要转换的double类型数值
+     * @return 转换后的String数值
+     */
+    public static String double2String(double d) {
+        DecimalFormat decimalFormatter = new DecimalFormat(DEFAULT_DECIMAL_FORMAT);
+        return decimalFormatter.format(d).toString();
+    }
+
+    /**
+     * 将给定的double类型的数据,根据percentFormatter格式转化成对应的String类型数值
+     *
+     * @param d
+     *            要转换的double类型数值
+     * @return 转换后的String数值
+     */
+    public static String percent2String(double d) {
+        DecimalFormat percentFormatter = new DecimalFormat(DEFAULT_WORKTIME_FORMAT);
+        return percentFormatter.format(d).toString();
+    }
+
+    /**
+     * 将给定的double类型的数据,根据workTimeFormatter格式转化成对应的String类型数值
+     *
+     * @param d
+     *            要转换的double类型数值
+     * @return 转换后的String数值
+     * @see  "##############0.0"
+     */
+    public static String worktime2String(double d) {
+        DecimalFormat workTimeFormatter = new DecimalFormat(DEFAULT_WORKTIME_FORMAT);
+        return workTimeFormatter.format(d).toString();
+    }
+
+    /**
+     * 将给定的double类型的数据, 根据workTimeFormatter格式转化成对应的String类型数值,
+     * 如果sDouble为""或者为null,则返回默认值0.0
+     *
+     *            要转换的double类型数值
+     * @return 转换后的double数值
+     * @see  "##############0.0"
+     */
+    public static double string2Worktime(String sDouble) {
+        try {
+            if (sDouble != null && !"".equals(sDouble)) {
+                DecimalFormat workTimeFormatter = new DecimalFormat(DEFAULT_WORKTIME_FORMAT);
+                return workTimeFormatter.parse(sDouble).doubleValue();
+            }
+        } catch (Exception e) {
+        }
+        return 0.0;
+    }
+
+    /**
+     * 将给定的double类型的数据, 根据decimalFormatter格式转化成对应的String类型数值,
+     * 如果sDouble为""或者为null,则返回默认值0.00
+     *
+     *            要转换的double类型数值
+     * @return 转换后的double数值
+     * @see  "##############0.00"
+     */
+    public static double string2Double(String sDouble) {
+        try {
+            if (sDouble != null && !"".equals(sDouble)) {
+                DecimalFormat decimalFormatter = new DecimalFormat(DEFAULT_DECIMAL_FORMAT);
+                return decimalFormatter.parse(sDouble).doubleValue();
+            }
+        } catch (Exception e) {
+        }
+        return 0.00;
+    }
+
+    /**
+     * 需要转移
+     *
+     * @param s
+     * @return
+     * @throws Exception
+     */
+    public static String getLimitText(int limit, Object s) throws Exception {
+        String result = "";
+        String value = TypeUtils.nullToString(s);
+        if (limit == 0 || value.length() <= limit) {
+            result = value;
+        } else {
+            result = value.substring(0, limit) + "...";
+        }
+        return result;
+    }
+
+    /**
+     * 将Java的字符串转换成可执行的Javascript代码
+     *
+     * @param s
+     *            要转换的Java代码
+     * @return 转换后生成可执行的Javascript代码
+     */
+    public static String javaString2JavascriptString(String s) {
+        if (s == null) {
+            return null;
+        }
+        s = s.replace("\\", "\\\\");
+        s = s.replace("'", "\\'");
+        s = s.replace("\"", "\\\"");
+        return s;
+    }
+
+
+
+
+
+
+
+    /**
+     * 把double四舍五入到小数点后n位
+     *
+     * @param value
+     *            要转换的double类型的数值
+     * @param afterPoint
+     *            保留多少位小数点
+     * @return 转换后的值
+     */
+    public static double round(double value, int afterPoint) {
+        BigDecimal bd = new BigDecimal(value);
+        BigDecimal bd1 = bd.setScale(afterPoint, BigDecimal.ROUND_HALF_UP);
+        return bd1.doubleValue();
+    }
+
+    /**
+     * 把double四舍五入到小数点后n位,返回String
+     *
+     * @param value
+     *            要转换的double类型的数值
+     * @param afterPoint
+     *            保留多少位小数点
+     * @return 转换后的String类型的数值
+     */
+    public static String roundToString(double value, int afterPoint) {
+        BigDecimal bd = new BigDecimal(value);
+        BigDecimal bd1 = bd.setScale(afterPoint, BigDecimal.ROUND_HALF_UP);
+        NumberFormat formatter = NumberFormat.getNumberInstance();
+        formatter.setMinimumFractionDigits(afterPoint);
+        formatter.setMaximumFractionDigits(afterPoint);
+        String rtnValue = formatter.format(bd1.doubleValue());
+        return rtnValue;
+    }
+
+    /**
+     * 省略年,按MM-dd方式显示
+     *
+     * @param date
+     *            要处理的日期
+     * @return 处理后的日期(MM-dd)格式
+     */
+    public static String noShowYear(Date date) {
+        SimpleDateFormat format = new SimpleDateFormat("MM-dd");
+        return format.format(date);
+    }
+
+
+
+
+    /**
+     * 根据int类型的月份,获取资源文件中的月份key值
+     *
+     * @param month
+     *            int类型的月份值
+     * @return 对应资源文件中的月份key值
+     */
+    private static String getMonthKey(int month) {
+        String key = null;
+        switch (month) {
+            case 0:
+                key = "JAN";
+                break;
+            case 1:
+                key = "FEB";
+                break;
+            case 2:
+                key = "MAR";
+                break;
+            case 3:
+                key = "APR";
+                break;
+            case 4:
+                key = "MAY";
+                break;
+            case 5:
+                key = "JUN";
+                break;
+            case 6:
+                key = "JUL";
+                break;
+            case 7:
+                key = "AUG";
+                break;
+            case 8:
+                key = "SEP";
+                break;
+            case 9:
+                key = "OCT";
+                break;
+            case 10:
+                key = "NOV";
+                break;
+            case 11:
+                key = "DEC";
+                break;
+        }
+        return key;
+    }
+
+    /**
+     * 通过季度,得到以逗号分隔的月份字符串 例: " (0,1,2)"," (3,4,5)"," (6,7,8)"," (9,10,11)".
+     *
+     * @param quarter
+     *            int类型的季度值,可取1,2,3,4这四个值,表示一,二,三,四季度
+     * @return 返回月份的字符串.
+     */
+    public static String getInMonthStringByQuarter(int quarter) {
+        switch (quarter) {
+            case (1):
+                return " (0,1,2)";
+            case (2):
+                return " (3,4,5)";
+            case (3):
+                return " (6,7,8)";
+            case (4):
+                return " (9,10,11)";
+        }
+        return null;
+    }
+
+}

+ 148 - 0
code/nckd-cosmic-debug/src/main/java/fi/cas/opplugin/Utils.java

@@ -0,0 +1,148 @@
+package fi.cas.opplugin;
+import com.google.gson.Gson;
+import com.kingdee.bos.json.Kson;
+
+import java.awt.Component;
+import java.awt.Rectangle;
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+
+
+public class Utils {
+
+    public static BigDecimal zero = new BigDecimal("0.00");
+    /**
+     * 日期格式化
+     * @param date
+     * @param format
+     * @return
+     */
+    public static Date formatDate(String date, String format) {
+        SimpleDateFormat dt = new SimpleDateFormat(format);
+        try {
+            return dt.parse(date);
+        } catch (ParseException e) {
+        }
+        return null;
+    }
+
+    /**
+     * 日期格式化
+     * @param date
+     * @param format
+     * @return
+     */
+    public static String getData(Date date, String format) {
+        SimpleDateFormat dt = new SimpleDateFormat(format);
+        return dt.format(date);
+    }
+
+    public static BigDecimal toBigDecimal(Object obj)
+    {
+        if(obj == null)
+            return BigDecimal.ZERO;
+        if(obj instanceof BigDecimal)
+            return (BigDecimal)obj;
+        if(obj instanceof Integer)
+            return new BigDecimal(((Integer)obj).toString());
+        if(obj instanceof Long)
+            return new BigDecimal(((Long)obj).toString());
+        if(obj instanceof Double)
+            return new BigDecimal(((Double)obj).doubleValue());
+        if(obj.toString() == null)
+            return BigDecimal.ZERO;
+        String str = obj.toString().trim();
+        if(str.toLowerCase().indexOf("e") > -1)
+            try
+            {
+                return new BigDecimal(str);
+            }
+            catch(NumberFormatException e)
+            {
+                return BigDecimal.ZERO;
+            }
+        if(str.matches("^[+-]?\\d+[\\.\\d]?\\d*+$"))
+            return new BigDecimal(str);
+        else
+            return BigDecimal.ZERO;
+    }
+
+    // 加
+    public static BigDecimal add(Object a, Object b,int scale) {
+
+        if (a == null)
+            a = zero;
+
+        if (b == null)
+            b = zero;
+
+        if (a instanceof BigDecimal && b instanceof BigDecimal) {
+            BigDecimal aVal = (BigDecimal) a;
+            BigDecimal bVal = (BigDecimal) b;
+            return aVal.add(bVal).setScale(scale, BigDecimal.ROUND_HALF_UP);
+        }
+
+        return zero;
+    }
+
+    // 减
+    public static BigDecimal sub(Object a, Object b,int scale) {
+
+        if (a == null)
+            a = zero;
+
+        if (b == null)
+            b = zero;
+
+        if (a instanceof BigDecimal && b instanceof BigDecimal) {
+            BigDecimal aVal = (BigDecimal) a;
+            BigDecimal bVal = (BigDecimal) b;
+            return aVal.subtract(bVal).setScale(scale, BigDecimal.ROUND_HALF_UP);
+        }
+
+        return zero;
+    }
+
+
+
+    public static String convertObjectToJson(Object object)  {
+        if (object == null) {
+            return "\"\"";
+        }
+        String result = null;
+        try {
+            result = Kson.getGson().toJson(object);
+        } finally {
+        }
+
+        if (result == null) {
+            return "\"\"";
+        }
+
+        if ((object instanceof String) && (result.startsWith("\""))
+                && (result.endsWith("\""))) {
+            result = result.substring(1, result.length() - 1);
+        }
+
+        result = processJsonResult(result);
+
+        return result;
+    }
+    public static String processJsonResult(String result) {
+        if (result == null) {
+            return null;
+        }
+
+        result = result.replace("${quote_2312415321232}", "\"");
+        result = result.replace("\"${leftbracket_2312415321232}", "{");
+        result = result.replace("${leftbracket_2312415321232}", "{");
+        result = result.replace("${rightbracket_2312415321232}\"", "}");
+        result = result.replace("${rightbracket_2312415321232}", "}");
+        return result;
+    }
+
+
+}

+ 137 - 0
code/nckd-cosmic-debug/src/main/java/fi/cas/task/AgentpaybillQueryStatusTast.java

@@ -0,0 +1,137 @@
+package fi.cas.task;
+
+import com.alibaba.druid.support.logging.Log;
+import com.alibaba.druid.support.logging.LogFactory;
+import fi.cas.opplugin.PayBillToolUtil;
+import fi.cas.opplugin.TypeUtils;
+import fi.cas.opplugin.Utils;
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.exception.KDException;
+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.bos.servicehelper.operation.SaveServiceHelper;
+import org.json.JSONArray;
+import org.json.JSONObject;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+public class AgentpaybillQueryStatusTast extends AbstractTask {
+    private static final Log log = LogFactory.getLog(AgentpaybillQueryStatusTast.class);
+    @Override
+    public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
+        //获取要查询的数据。状态为已审批,支付状态为支付中,或支付失败。理论上只需要查支付中
+        QFilter filter = new QFilter("billstatus", QCP.equals, "C");
+        Set<String> paystatusSet = new HashSet<>();
+        paystatusSet.add("2");
+        paystatusSet.add("6");
+        filter.and("nckd_paystatus", QCP.in, "2");
+        filter.and("nckd_fkcs", QCP.large_than, 0);
+        Map<Object, DynamicObject> payinfos  = BusinessDataServiceHelper.loadFromCache("cas_agentpaybill", new QFilter[] {filter});
+        DynamicObject jkpzxx = BusinessDataServiceHelper.loadSingle("nckd_jkpzxx",new QFilter[]{new QFilter("number","=","paytoJHX")});
+        String url =  jkpzxx.getString("nckd_servername");
+
+
+        for (DynamicObject dataEntity : payinfos.values()) {
+            //调用接口查询付款状态
+            JSONObject param = new JSONObject();
+            PayBillToolUtil.headJson(param);
+            JSONObject data = new JSONObject();
+            data.put("ERP_INS_ID",dataEntity.getPkValue()+"-"+dataEntity.get("nckd_bbh"));
+            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();
+            String billNum = dataEntity.getString("billno");
+            log.info("单据号:"+billNum+"传入参数"+param.toString());
+            JSONObject cbsReturnJson =PayBillToolUtil.JHXServiceQuery(url,bodyjson);//待补充,超时返回参数待修改,整体待重构
+            log.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.saveupdatelog(dataEntity,bodyjson,cbsReturnJson.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);//返回信息
+                    }
+                }
+            }
+        }
+    }
+}

+ 95 - 0
code/nckd-cosmic-debug/src/main/java/fi/cas/task/PayQueryStatusTast.java

@@ -0,0 +1,95 @@
+package fi.cas.task;
+
+import com.alibaba.druid.support.logging.Log;
+import com.alibaba.druid.support.logging.LogFactory;
+import fi.cas.opplugin.*;
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.exception.KDException;
+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.bos.servicehelper.operation.SaveServiceHelper;
+import org.json.JSONObject;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+public class PayQueryStatusTast extends AbstractTask {
+    private static final Log log = LogFactory.getLog(PayQueryStatusTast.class);
+    @Override
+    public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
+        //获取要查询的数据。状态为已审批,支付状态为支付中,或支付失败。理论上只需要查支付中
+        QFilter filter = new QFilter("billstatus", QCP.equals, "C");
+        Set<String> paystatusSet = new HashSet<>();
+        paystatusSet.add("2");
+        paystatusSet.add("6");
+        filter.and("nckd_paystatus", QCP.in, "2");
+        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});
+        DynamicObject jkpzxx = BusinessDataServiceHelper.loadSingle("nckd_jkpzxx",new QFilter[]{new QFilter("number","=","paytoJHX")});
+        String url =  jkpzxx.getString("nckd_servername");
+
+
+        for (DynamicObject dataEntity : payinfos) {
+            //调用接口查询付款状态
+            JSONObject param = new JSONObject();
+            PayBillToolUtil.headJson(param);
+            JSONObject data = new JSONObject();
+            data.put("ERP_INS_ID",dataEntity.getPkValue()+"-"+dataEntity.get("nckd_bbh"));
+            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();
+            String billNum = dataEntity.getString("billno");
+            log.info("单据号:"+billNum+"传入参数"+param.toString());
+            JSONObject cbsReturnJson =PayBillToolUtil.JHXServiceQuery(url,bodyjson);//待补充,超时返回参数待修改,整体待重构
+            log.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());
+                        }
+                    }
+                }
+            }
+        }
+    }
+}

+ 39 - 0
code/nckd-cosmic-debug/src/main/java/fi/cas/task/PayUpadteStatusTask.java

@@ -0,0 +1,39 @@
+package fi.cas.task;
+
+import com.alibaba.druid.support.logging.Log;
+import com.alibaba.druid.support.logging.LogFactory;
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.exception.KDException;
+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.bos.servicehelper.operation.OperationServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+
+import java.util.Map;
+
+public class PayUpadteStatusTask  extends AbstractTask {
+    private static final Log log = LogFactory.getLog(PayUpadteStatusTask.class);
+    public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
+        //获取要查询的数据。状态为已审批,支付状态为支付成功。
+        QFilter filter = new QFilter("billstatus", QCP.equals, "C");
+        filter.and("nckd_paystatus", QCP.equals, 3);
+        filter.and("nckd_fkcs", QCP.large_equals, 0);
+        DynamicObject[] payinfos = BusinessDataServiceHelper.load("cas_paybill","billno", new QFilter[] {filter});
+        if(payinfos.length>0){
+            for (int i = 0; i <payinfos.length ; i++) {
+                DynamicObject payinfo = BusinessDataServiceHelper.loadSingle(payinfos[i].getPkValue(),"cas_paybill");
+                try {
+                    OperationServiceHelper.executeOperate("pay","cas_paybill",new DynamicObject[]{payinfo}, OperateOption.create());
+                }catch (Exception e){
+                    log.info("付款变更状态报错:"+payinfo.get("billno"));
+                }
+            }
+
+
+        }
+    }
+}

+ 33 - 0
code/nckd-cosmic-debug/src/main/java/fi/em/opplugin/AgentpaybillOpPlugin.java

@@ -0,0 +1,33 @@
+package fi.em.opplugin;
+
+import fi.cas.opplugin.PayBillToolUtil;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.args.BeforeOperationArgs;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+
+/**
+ * @description:代发处理单,传给九恒星
+ */
+public class AgentpaybillOpPlugin extends AbstractOperationServicePlugIn {
+
+
+
+
+    @Override
+    public void beforeExecuteOperationTransaction(BeforeOperationArgs e) {
+        DynamicObject[] dynamicObjects = e.getDataEntities();
+        String operationKey = e.getOperationKey();
+        //关闭付款则将支付状态更改为支付关闭状态
+        if ("sendtojhx".equals(operationKey)){
+            String errMsg = "";
+            errMsg =  PayBillToolUtil.agentpayBillForCBSSync(dynamicObjects);
+            if(!errMsg.isEmpty()) {
+                //将成功错误信息返回到前端
+                e.setCancelMessage(errMsg);
+                e.setCancel(true);
+            }
+        }
+    }
+
+}

+ 56 - 0
code/nckd-cosmic-debug/src/main/java/fi/er/webService/AccountSynReturnModel.java

@@ -0,0 +1,56 @@
+package fi.er.webService;
+
+import kd.bos.openapi.common.custom.annotation.ApiParam;
+
+import java.io.Serializable;
+
+/**
+ * 银行账户同步 自定义API 返回参数 class
+ * @author @author ww
+ */
+public class AccountSynReturnModel implements Serializable {
+
+    @ApiParam(value = "银行账号", position = 1)
+    String number;
+
+    @ApiParam(value = "账户名称", position = 2)
+    String name;
+
+    @ApiParam(value = "错误代码", position = 3)
+    String code;
+
+    @ApiParam(value = "错误信息", position = 4)
+    String message;
+
+    public String getNumber() {
+        return number;
+    }
+
+    public void setNumber(String number) {
+        this.number = number;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+}

+ 55 - 0
code/nckd-cosmic-debug/src/main/java/fi/er/webService/BankSynReturnModel.java

@@ -0,0 +1,55 @@
+package fi.er.webService;
+
+import kd.bos.openapi.common.custom.annotation.ApiParam;
+
+import java.io.Serializable;
+/**
+ * 行名行号同步 自定义API 返回参数 class
+ * @author @author ww
+ */
+public class BankSynReturnModel implements Serializable {
+
+    @ApiParam(value = "行号", position = 1)
+    String number;
+
+    @ApiParam(value = "行名称", position = 2)
+    String name;
+
+    @ApiParam(value = "错误代码", position = 3)
+    String code;
+
+    @ApiParam(value = "错误信息", position = 4)
+    String message;
+
+    public String getNumber() {
+        return number;
+    }
+
+    public void setNumber(String number) {
+        this.number = number;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+}

+ 26 - 0
code/nckd-cosmic-debug/src/main/java/fi/er/webService/CustomApiResultForMy.java

@@ -0,0 +1,26 @@
+package fi.er.webService;
+
+import kd.bos.openapi.common.result.CustomApiResult;
+
+/**
+ * @author @author ww
+ */
+public class CustomApiResultForMy<T> extends CustomApiResult {
+
+
+    public static <T> CustomApiResultForMy<T> success2(T data) {
+        CustomApiResultForMy<T> result = new CustomApiResultForMy();
+        result.setStatus(true);
+        result.setData(data);
+        return result;
+    }
+
+    public static <T> CustomApiResultForMy<T> fail(T data) {
+        CustomApiResultForMy<T> result = new CustomApiResultForMy();
+        result.setData(data);
+        result.setStatus(false);
+        result.setErrorCode("500");
+        result.setMessage("失败");
+        return result;
+    }
+}

+ 274 - 0
code/nckd-cosmic-debug/src/main/java/fi/er/webService/SaveAccountApi.java

@@ -0,0 +1,274 @@
+package fi.er.webService;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import fi.cas.opplugin.TypeUtils;
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.openapi.common.custom.annotation.ApiController;
+import kd.bos.openapi.common.custom.annotation.ApiMapping;
+import kd.bos.openapi.common.custom.annotation.ApiParam;
+import kd.bos.openapi.common.custom.annotation.ApiPostMapping;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author zf
+ * 接收九恒星银行账户,并生成金融机构
+ */
+@ApiController(value = "account", desc = "自定义API 银行账户同步")
+@ApiMapping(value = "SaveAccountApi")
+public class SaveAccountApi implements Serializable {
+    protected static final Long DEFAULT_ORG_ID = 100000L;
+
+    /**
+     * @description 行名行号同步接口
+     * @param data
+     * @return CustomApiResult
+     */
+    @ApiPostMapping(value = "/save", desc = "同步银行账户")
+    public CustomApiResultForMy<List<AccountSynReturnModel>> saveAccount (@ApiParam(value = "九恒星银行账户") JSONArray data) {
+        StringBuilder resultString = new StringBuilder();
+        List<AccountSynReturnModel> returnList = new ArrayList<>();
+        Boolean result = true;
+
+        DynamicObject rmbinfo = BusinessDataServiceHelper.loadSingleFromCache(1L,"bd_currency");
+        //默认的国家
+        DynamicObject defaultgj = BusinessDataServiceHelper.loadSingleFromCache("1000001", "bd_country");
+
+        RequestContext rc = RequestContext.get();
+        DynamicObject user = BusinessDataServiceHelper.loadSingleFromCache(rc.getCurrUserId(), "bos_user");
+        DynamicObject defaultOrg = BusinessDataServiceHelper.loadSingle(DEFAULT_ORG_ID, "bos_org");
+        //默认金融机构类别
+        DynamicObject defaultjrjgtypeinfo = BusinessDataServiceHelper.loadSingleFromCache(615763944224700416L,"bd_finorgtype");
+
+        //默认银行类别
+        QFilter typecodeFilter = new QFilter("type_code.number","=","BC-9999");
+        DynamicObject defaulttypecodeinfo =BusinessDataServiceHelper.loadSingleFromCache("bd_bankcgsetting",new QFilter[]{typecodeFilter});
+
+
+        //循环传入的数据
+        for (int i = 0; i < data.size(); i++) {
+            JSONObject eobject = data.getJSONObject(i);
+            AccountSynReturnModel contractSynReturnModel = syncAccount(eobject,rmbinfo,defaultjrjgtypeinfo,defaultgj,defaulttypecodeinfo,defaultOrg,user);
+            if ("500".equals(contractSynReturnModel.getCode())){
+                result = false;
+            }
+            returnList.add(contractSynReturnModel);
+        }
+        return result == true
+                ? CustomApiResultForMy.success2(returnList)
+                : CustomApiResultForMy.fail(returnList);
+    }
+
+
+    /**
+     * @description 保存行名行号
+     * @param jsonObject
+     */
+    private AccountSynReturnModel syncAccount(JSONObject jsonObject,DynamicObject rmbinfo, DynamicObject defaultjrjgtypeinfo,DynamicObject defaultgj,DynamicObject defaulttypecodeinfo, DynamicObject defaultOrg,DynamicObject user) {
+        AccountSynReturnModel contractSynReturnModel = new AccountSynReturnModel();
+        Date curDate = new Date();
+        String number = jsonObject.get("accountnumber")+"";
+        String name = jsonObject.get("accountname")+"";
+        if ("".equals(number)||"".equals(name)) {
+            contractSynReturnModel.setCode("500");
+            contractSynReturnModel.setMessage("账户名和银行账号不能为空");
+            return contractSynReturnModel;
+        }
+
+        contractSynReturnModel.setNumber(number);
+        contractSynReturnModel.setName(name);
+
+        //查询是否存在,存在则返回。不存在更新
+        QFilter qFilter = new QFilter("number","=",number);
+        DynamicObject accountinfo =  BusinessDataServiceHelper.loadSingle("bd_accountbanks",new QFilter[]{qFilter});
+        if(accountinfo!=null){
+            //已存在
+            contractSynReturnModel.setCode("500");
+            contractSynReturnModel.setMessage("该银行账号已存在");
+            return contractSynReturnModel;
+        }
+        String orgname = jsonObject.get("org")+"";
+        if ("".equals(orgname)) {
+            contractSynReturnModel.setCode("500");
+            contractSynReturnModel.setMessage("法人主体不能为空");
+            return contractSynReturnModel;
+        }
+        //查询组织是否存在
+        QFilter orgqFilter = new QFilter("name","=",orgname);
+        DynamicObject orginfo =BusinessDataServiceHelper.loadSingleFromCache("bos_org",new QFilter[]{orgqFilter});
+        if(orginfo==null){
+            contractSynReturnModel.setCode("500");
+            contractSynReturnModel.setMessage("没有找到名称为:"+orgname+"的组织");
+            return contractSynReturnModel;
+        }
+
+        //账户类型
+        String acctstyle = jsonObject.get("acctstyle")+"";
+        if ("".equals(acctstyle)) {
+            contractSynReturnModel.setCode("500");
+            contractSynReturnModel.setMessage("账户类型不能为空");
+            return contractSynReturnModel;
+        }
+        //opendate开户日期
+        String opendate = jsonObject.get("opendate")+"";
+        if ("".equals(opendate)) {
+            contractSynReturnModel.setCode("500");
+            contractSynReturnModel.setMessage("开户日期不能为空");
+            return contractSynReturnModel;
+        }
+
+
+        //开户行行号
+        String banknumber = jsonObject.get("banknumber")+"";
+        if ("".equals(banknumber)) {
+            contractSynReturnModel.setCode("500");
+            contractSynReturnModel.setMessage("开户行行号不能为空");
+            return contractSynReturnModel;
+        }
+        //查询行名行号
+        QFilter bankqFilter = new QFilter("number","=",banknumber);
+        DynamicObject bankinfo =BusinessDataServiceHelper.loadSingleFromCache("bd_bebank",new QFilter[]{bankqFilter});
+        if (bankinfo==null) {
+            contractSynReturnModel.setCode("500");
+            contractSynReturnModel.setMessage("开户行行号"+banknumber+"不存在");
+            return contractSynReturnModel;
+        }
+        //通过开户行行号找到金融机构,没有就新增一个
+        QFilter jrjgqFilter = new QFilter("bebank.number","=",banknumber);
+        DynamicObject jrjginfo =BusinessDataServiceHelper.loadSingleFromCache("bd_finorginfo",new QFilter[]{jrjgqFilter});
+        if (jrjginfo==null) {
+            jrjginfo = BusinessDataServiceHelper.newDynamicObject("bd_finorginfo");
+            jrjginfo.set("finorgtype",defaultjrjgtypeinfo);
+            jrjginfo.set("number",banknumber);
+            jrjginfo.set("bebank",bankinfo);
+            jrjginfo.set("name",bankinfo.get("name")+"");
+            //根据行号前3位找到银行类别,找不到就其他
+            String typecode = banknumber.substring(0,3);
+            QFilter typecodeFilter = new QFilter("type_code.number","=",typecode);
+            DynamicObject typecodeinfo =BusinessDataServiceHelper.loadSingleFromCache("bd_bankcgsetting",new QFilter[]{typecodeFilter});
+            if(typecodeinfo==null){
+                jrjginfo.set("bank_cate",defaulttypecodeinfo);
+            }else{
+                jrjginfo.set("bank_cate",typecodeinfo);
+            }
+            //国家
+            jrjginfo.set("country",defaultgj);
+            //联行号
+            jrjginfo.set("union_number",banknumber);
+
+
+            jrjginfo.set("creator", user);
+            jrjginfo.set("createtime", curDate);
+            jrjginfo.set("enable",1);
+            jrjginfo.set("status","C");
+            //执行保存
+            StringBuilder err = new StringBuilder();
+            OperationResult result = SaveServiceHelper.saveOperate("bd_finorginfo", new DynamicObject[]{jrjginfo}, OperateOption.create());
+            if (result.getSuccessPkIds().size() > 0) {
+                jrjginfo.set("id",result.getSuccessPkIds().get(0));
+            }else{
+                for (int k = 0; k < result.getAllErrorOrValidateInfo().size(); k++) {
+                    String message = result.getAllErrorOrValidateInfo().get(k).getMessage();
+                    err.append("/").append(message);
+                }
+                contractSynReturnModel.setCode("500");
+                contractSynReturnModel.setMessage("金融机构保存失败:"+err.toString());
+                return contractSynReturnModel;
+            }
+        }
+
+
+
+
+        accountinfo =BusinessDataServiceHelper.newDynamicObject("bd_accountbanks");
+        accountinfo.set("company",orginfo);
+        accountinfo.set("openorg",orginfo);
+        accountinfo.set("finorgtype","0");
+        //开户行,即金融机构
+        accountinfo.set("bank",jrjginfo);
+        accountinfo.set("bankaccountnumber",number);
+        accountinfo.set("name",name);
+
+        //币别,多选基础资料
+        DynamicObjectCollection currencyinfos = accountinfo.getDynamicObjectCollection("currency");
+        DynamicObject bibiecollinfo = currencyinfos.addNew();
+        bibiecollinfo.set("fbasedataid",rmbinfo);
+        //默认币种
+        accountinfo.set("defaultcurrency",rmbinfo);
+
+        //acctstyle 账户类型
+        String acctstylestr = "normal";
+        if("基本存款账户".equals(acctstyle)){
+            acctstylestr = "basic";
+        }else if("临时存款账户".equals(acctstyle)){
+            acctstylestr = "temp";
+        }else if("专用存款账户".equals(acctstyle)){
+            acctstylestr = "spcl";
+        }else if("经常项目外汇账户".equals(acctstyle)){
+            acctstylestr = "fgn_curr";
+        }else if("资本项目外汇账户".equals(acctstyle)){
+            acctstylestr = "fng_fin";
+        }
+        accountinfo.set("acctstyle",acctstylestr);
+
+        accountinfo.set("accttype","in_out");
+        accountinfo.set("acctproperty",BusinessDataServiceHelper.loadSingleFromCache(2190699485795992576L,"bd_acctpurpose"));
+
+        try {
+            accountinfo.set("opendate", TypeUtils.string2Date(opendate,TypeUtils.DEFAULT_DATE_FORMAT));
+        }catch (Exception e){
+            contractSynReturnModel.setCode("500");
+            contractSynReturnModel.setMessage("开户日期"+opendate+"格式不对:应为yyyy-MM-dd");
+            return contractSynReturnModel;
+        }
+        accountinfo.set("acctstatus","normal");
+        accountinfo.set("elecpaymentlevel","WL01");
+        accountinfo.set("manager",user);
+
+
+        accountinfo.set("enable",1);
+        accountinfo.set("status","C");
+
+
+
+        accountinfo.set("creator", user);
+        accountinfo.set("createorg", defaultOrg);
+        accountinfo.set("org", defaultOrg);
+        accountinfo.set("createtime", curDate);
+
+        //执行保存
+        OperationResult result = SaveServiceHelper.saveOperate("bd_accountbanks", new DynamicObject[]{accountinfo}, OperateOption.create());
+
+        StringBuilder err = new StringBuilder();
+        if (result.getSuccessPkIds().size() > 0) {
+            if (result.isSuccess()) {
+                contractSynReturnModel.setCode("200");
+                contractSynReturnModel.setMessage("保存成功");
+                return contractSynReturnModel;
+            } else {
+                for (int k = 0; k < result.getAllErrorOrValidateInfo().size(); k++) {
+                    String message = result.getAllErrorOrValidateInfo().get(k).getMessage();
+                    err.append("/").append(message);
+                }
+                contractSynReturnModel.setCode("500");
+                contractSynReturnModel.setMessage(err.toString());
+                return contractSynReturnModel;
+            }
+        }else{
+            contractSynReturnModel.setCode("500");
+            contractSynReturnModel.setMessage("保存失败");
+            return contractSynReturnModel;
+        }
+    }
+}

+ 135 - 0
code/nckd-cosmic-debug/src/main/java/fi/er/webService/SaveBankApi.java

@@ -0,0 +1,135 @@
+package fi.er.webService;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.openapi.common.custom.annotation.ApiController;
+import kd.bos.openapi.common.custom.annotation.ApiMapping;
+import kd.bos.openapi.common.custom.annotation.ApiParam;
+import kd.bos.openapi.common.custom.annotation.ApiPostMapping;
+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.StringUtils;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author zf
+ * 接收九恒星行名行号
+ */
+@ApiController(value = "bank", desc = "自定义API 行名行号同步")
+@ApiMapping(value = "saveBankApi")
+public class SaveBankApi implements Serializable {
+    protected static final Long DEFAULT_ORG_ID = 100000L;
+
+    /**
+     * @description 行名行号同步接口
+     * @param data
+     * @return CustomApiResult
+     */
+    @ApiPostMapping(value = "/save", desc = "同步行名行号")
+    public CustomApiResultForMy<List<BankSynReturnModel>> saveBank (@ApiParam(value = "九恒星行名行号") JSONArray data) {
+        StringBuilder resultString = new StringBuilder();
+        List<BankSynReturnModel> returnList = new ArrayList<>();
+        Boolean result = true;
+
+        //默认的国家
+        DynamicObject defaultgj = BusinessDataServiceHelper.loadSingle("1000001", "bd_country");
+
+
+        RequestContext rc = RequestContext.get();
+        DynamicObject user = BusinessDataServiceHelper.loadSingleFromCache(rc.getCurrUserId(), "bos_user");
+
+        //循环传入的数据
+        for (int i = 0; i < data.size(); i++) {
+            JSONObject eobject = data.getJSONObject(i);
+            BankSynReturnModel contractSynReturnModel = syncBank(eobject,defaultgj,user);
+            if ("500".equals(contractSynReturnModel.getCode())){
+                result = false;
+            }
+            returnList.add(contractSynReturnModel);
+        }
+        return result == true
+                ? CustomApiResultForMy.success2(returnList)
+                : CustomApiResultForMy.fail(returnList);
+    }
+
+
+    /**
+     * @description 保存行名行号
+     * @param jsonObject
+     */
+    private BankSynReturnModel syncBank(JSONObject jsonObject,DynamicObject defaultgj ,DynamicObject user) {
+        BankSynReturnModel contractSynReturnModel = new BankSynReturnModel();
+        String number = jsonObject.get("banknumber")+"";
+        String name = jsonObject.get("bankname")+"";
+        if ("".equals(number)||"".equals(name)) {
+            contractSynReturnModel.setCode("500");
+            contractSynReturnModel.setMessage("名称和编码不能为空");
+            return contractSynReturnModel;
+        }
+
+        contractSynReturnModel.setNumber(number);
+        contractSynReturnModel.setName(name);
+
+        //查询是否存在,存在则返回。不存在更新
+        QFilter qFilter = new QFilter("number","=",number);
+        DynamicObject bebankinfo =  BusinessDataServiceHelper.loadSingle("bd_bebank",new QFilter[]{qFilter});
+        if(bebankinfo!=null){
+            //已存在
+            contractSynReturnModel.setCode("500");
+            contractSynReturnModel.setMessage("该行号已存在");
+            return contractSynReturnModel;
+        }
+
+        bebankinfo =BusinessDataServiceHelper.newDynamicObject("bd_bebank");
+        bebankinfo.set("number",number);
+        bebankinfo.set("name",name);
+        bebankinfo.set("country",defaultgj);
+        bebankinfo.set("union_number",number);
+        bebankinfo.set("provincetxt",jsonObject.get("province")+"");//省份
+        bebankinfo.set("citytxt",jsonObject.get("city")+"");//城市
+        bebankinfo.set("enable",1);
+        bebankinfo.set("status","C");
+
+
+        Date curDate = new Date();
+        bebankinfo.set("creator", user);
+        bebankinfo.set("createtime", curDate);
+
+        //执行保存
+        OperationResult result = SaveServiceHelper.saveOperate("bd_bebank", new DynamicObject[]{bebankinfo}, OperateOption.create());
+
+        StringBuilder err = new StringBuilder();
+        if (result.getSuccessPkIds().size() > 0) {
+            if (result.isSuccess()) {
+                contractSynReturnModel.setCode("200");
+                contractSynReturnModel.setMessage("保存成功");
+                return contractSynReturnModel;
+            } else {
+                for (int k = 0; k < result.getAllErrorOrValidateInfo().size(); k++) {
+                    String message = result.getAllErrorOrValidateInfo().get(k).getMessage();
+                    err.append("/").append(message);
+                }
+                contractSynReturnModel.setCode("500");
+                contractSynReturnModel.setMessage(err.toString());
+                return contractSynReturnModel;
+            }
+        }else{
+            contractSynReturnModel.setCode("500");
+            contractSynReturnModel.setMessage("保存失败");
+            return contractSynReturnModel;
+        }
+    }
+}