|
@@ -1,365 +0,0 @@
|
|
|
-package tmc.bei.task;
|
|
|
-
|
|
|
-import fi.cas.opplugin.TypeUtils;
|
|
|
-import kd.bos.context.RequestContext;
|
|
|
-import kd.bos.dataentity.OperateOption;
|
|
|
-import kd.bos.dataentity.entity.DynamicObject;
|
|
|
-import kd.bos.entity.operate.result.OperationResult;
|
|
|
-import kd.bos.exception.KDException;
|
|
|
-import kd.bos.logging.Log;
|
|
|
-import kd.bos.logging.LogFactory;
|
|
|
-import kd.bos.login.utils.DemoSMSSender;
|
|
|
-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 org.apache.commons.lang3.StringUtils;
|
|
|
-import org.json.JSONArray;
|
|
|
-import org.json.JSONObject;
|
|
|
-import org.json.XML;
|
|
|
-import org.w3c.dom.Document;
|
|
|
-import org.w3c.dom.Element;
|
|
|
-
|
|
|
-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;
|
|
|
-import java.io.*;
|
|
|
-import java.math.BigDecimal;
|
|
|
-import java.net.Socket;
|
|
|
-import java.text.ParseException;
|
|
|
-import java.text.SimpleDateFormat;
|
|
|
-import java.util.*;
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- * 自动获取资金流水调度任务插件
|
|
|
- * 2024-09-27 wangj
|
|
|
- * 主要功能:调用前置机接口获取第三方系统资金流水写入交易明细
|
|
|
- */
|
|
|
-public class synTransdetailTask extends AbstractTask {
|
|
|
- protected static final Log log = LogFactory.getLog(DemoSMSSender.class);
|
|
|
- @Override
|
|
|
- public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
|
|
|
-
|
|
|
- String type = (String) map.get("type");
|
|
|
- String queryDate = getDateByType(type);
|
|
|
-
|
|
|
- DynamicObject jkpzxx = BusinessDataServiceHelper.loadSingle("nckd_jkpzxx",new QFilter[]{new QFilter("number","=","paytozfqz")});
|
|
|
- String servername = jkpzxx.getString("nckd_servername");
|
|
|
- String port = jkpzxx.getString("nckd_port");
|
|
|
-
|
|
|
- QFilter qFilter_enable = new QFilter("enable", QCP.equals,"1");
|
|
|
- QFilter qFilter_status = new QFilter("status", QCP.equals, "C");
|
|
|
- QFilter qFilter_acctstatus = new QFilter("acctstatus", QCP.equals, "normal");
|
|
|
- DynamicObject[] accountBanks = BusinessDataServiceHelper.load("am_accountbank",
|
|
|
- "id,bankaccountnumber,openorg,bank",new QFilter[]{qFilter_enable,qFilter_status,qFilter_acctstatus});
|
|
|
- for(DynamicObject accountBank : accountBanks){
|
|
|
- String bankaccountnumber = accountBank.getString("bankaccountnumber");
|
|
|
-
|
|
|
- String bodyxml = createMessageRequest(queryDate,bankaccountnumber);
|
|
|
- log.info("银行账号:"+bankaccountnumber+"请求xml:"+bodyxml);
|
|
|
- log.info("银行账号:"+bankaccountnumber+"开始调用接口");
|
|
|
-
|
|
|
- JSONObject cbsReturnJson = socketService(servername,port,bodyxml);
|
|
|
- log.info("银行账号:"+bankaccountnumber+"调用接口返回结果:"+cbsReturnJson.toString());
|
|
|
- if(cbsReturnJson!=null && cbsReturnJson.length()>0) {
|
|
|
- JSONObject reMessage = cbsReturnJson.getJSONObject("Message");
|
|
|
- JSONObject reHeadInfo = reMessage.getJSONObject("HeadInfo");
|
|
|
- if (reHeadInfo.getString("errorcode").contains("000000")) {
|
|
|
-
|
|
|
- JSONObject reBodyInfo = reMessage.getJSONObject("BodyInfo");
|
|
|
- log.info("银行账号:"+bankaccountnumber+"发送前置机响应成功,前置机接口发送成功");
|
|
|
-
|
|
|
- try {
|
|
|
- writeTransdetail(reBodyInfo,bankaccountnumber);
|
|
|
- } catch (Exception e) {
|
|
|
- throw new RuntimeException(e);
|
|
|
- }
|
|
|
- log.info("银行账号:"+bankaccountnumber+"写入交易明细成功");
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- } else {
|
|
|
- log.info("银行账号:"+bankaccountnumber+"发送前置机响应失败:"+reHeadInfo.getString("errormsg"));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private void writeTransdetail(JSONObject reBodyInfo, String bankaccountnumber) throws ParseException {
|
|
|
-
|
|
|
- QFilter qFilter_bankaccountnumber = new QFilter("bankaccountnumber",QCP.equals,bankaccountnumber);
|
|
|
- DynamicObject[] bd_accountbanks = BusinessDataServiceHelper.load(
|
|
|
- "bd_accountbanks","id,number,name,openorg.number,openorg.name,bank.number,bank.name",
|
|
|
- new QFilter[]{qFilter_bankaccountnumber});
|
|
|
- DynamicObject bd_accountbank = null;
|
|
|
- if(bd_accountbanks!=null && bd_accountbanks.length>0){
|
|
|
- bd_accountbank = bd_accountbanks[0];
|
|
|
- }
|
|
|
-
|
|
|
- List<String> detailids = new ArrayList<String>();
|
|
|
- JSONArray actrsview_rich = reBodyInfo.getJSONArray("actrsview_rich");
|
|
|
- for(int i=0;i<actrsview_rich.length();i++){
|
|
|
- JSONObject actrsview_rich_obj = actrsview_rich.getJSONObject(i);
|
|
|
- String TransNbr = String.valueOf(actrsview_rich_obj.getLong("TransNbr"));
|
|
|
- detailids.add(TransNbr);
|
|
|
- }
|
|
|
- log.info("预计写入交易明细:"+actrsview_rich.length()+"条");
|
|
|
-
|
|
|
- QFilter qFilter_detailid = new QFilter("detailid",QCP.in,detailids);
|
|
|
- DynamicObject[] bills = BusinessDataServiceHelper.load("bei_transdetail","id,detailid",new QFilter[]{qFilter_detailid});
|
|
|
- Map tempdetailid = new HashMap();
|
|
|
- int isHaveBillSize = 0;
|
|
|
- for(DynamicObject bill : bills){
|
|
|
- String detailid = bill.getString("detailid");
|
|
|
- tempdetailid.put(detailid,detailid);
|
|
|
- isHaveBillSize ++;
|
|
|
- }
|
|
|
- log.info("已存在交易明细:"+isHaveBillSize+"条");
|
|
|
-
|
|
|
- Map currencyMap = getCurrencyMap();
|
|
|
-
|
|
|
- int size = actrsview_rich.length() - isHaveBillSize;
|
|
|
- log.info("最终写入交易明细:"+size+"条");
|
|
|
- DynamicObject[] datalist = new DynamicObject[size];
|
|
|
- for(int i=0;i<actrsview_rich.length();i++){
|
|
|
- JSONObject actrsview_rich_obj = actrsview_rich.getJSONObject(i);
|
|
|
- String transSet = String.valueOf(actrsview_rich_obj.getLong("TransSet"));
|
|
|
- if(null == tempdetailid || null == tempdetailid.get(transSet)){
|
|
|
- DynamicObject bill = createBill(actrsview_rich_obj,bd_accountbank,currencyMap);
|
|
|
- datalist[i] = bill;
|
|
|
- }
|
|
|
- }
|
|
|
- if(datalist.length>0){
|
|
|
- log.info("拼装完成,开始保存");
|
|
|
- OperationResult result = OperationServiceHelper.executeOperate("save","zb_ps_pricemgconfig",datalist, OperateOption.create());
|
|
|
- log.info("保存结束:"+result.getMessage());
|
|
|
- }
|
|
|
- log.info("写入交易明细完成");
|
|
|
- }
|
|
|
-
|
|
|
- private DynamicObject createBill(JSONObject actrsview_rich_obj, DynamicObject bd_accountbank, Map currencyMap) throws ParseException {
|
|
|
- DynamicObject bill = BusinessDataServiceHelper.newDynamicObject("bei_betransdetail_imp");
|
|
|
-
|
|
|
-
|
|
|
- if(bd_accountbank!=null){
|
|
|
-
|
|
|
- DynamicObject company = bd_accountbank.getDynamicObject("openorg");
|
|
|
- bill.set("company",company.getPkValue());
|
|
|
-
|
|
|
- bill.set("accountbank",bd_accountbank.getPkValue());
|
|
|
-
|
|
|
- DynamicObject bank = bd_accountbank.getDynamicObject("bank");
|
|
|
- bill.set("bank",bank.getPkValue());
|
|
|
- }
|
|
|
-
|
|
|
- bill.set("billstatus","A");
|
|
|
-
|
|
|
- String currency = String.valueOf(actrsview_rich_obj.getInt("CcyNbr"));
|
|
|
- bill.set("currency",currencyMap.get(currency));
|
|
|
-
|
|
|
- SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
- String entryDate = String.valueOf(actrsview_rich_obj.getInt("EntryDate"));
|
|
|
- String bizdate = entryDate.substring(0,4)+"-"+entryDate.substring(4,6)+"-"+entryDate.substring(6,8);
|
|
|
- bill.set("bizdate",sdf1.format(bizdate));
|
|
|
-
|
|
|
- SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
- String entryTime = String.valueOf(actrsview_rich_obj.getInt("EntryTime"));
|
|
|
- String biztime = transTime(bizdate,entryTime);
|
|
|
- bill.set("biztime",sdf2.parse(biztime));
|
|
|
-
|
|
|
- String description = "";
|
|
|
- if(StringUtils.isNotBlank(actrsview_rich_obj.getString("BankText"))){
|
|
|
-
|
|
|
- description = actrsview_rich_obj.getString("BankText")+";";
|
|
|
- }
|
|
|
- if(StringUtils.isNotBlank(actrsview_rich_obj.getString("CltText"))){
|
|
|
-
|
|
|
- description = description + actrsview_rich_obj.getString("CltText")+";";
|
|
|
- }
|
|
|
- if(StringUtils.isNotBlank(actrsview_rich_obj.getString("ElecText"))){
|
|
|
-
|
|
|
- description = description + actrsview_rich_obj.getString("ElecText")+";";
|
|
|
- }
|
|
|
- if(StringUtils.isNotBlank(actrsview_rich_obj.getString("StmVar"))){
|
|
|
-
|
|
|
- description = description + actrsview_rich_obj.getString("StmVar")+";";
|
|
|
- }
|
|
|
- bill.set("description",description);
|
|
|
-
|
|
|
- BigDecimal transAmt = actrsview_rich_obj.getBigDecimal("TransAmt");
|
|
|
- String transDir = actrsview_rich_obj.getString("TransDir");
|
|
|
- if("C".equals(transDir)){
|
|
|
- bill.set("creditamount",transAmt);
|
|
|
- }else if("D".equals(transDir)){
|
|
|
- bill.set("debitamount",transAmt);
|
|
|
- }
|
|
|
-
|
|
|
- BigDecimal transbalance = actrsview_rich_obj.getBigDecimal("OnlBal");
|
|
|
- bill.set("transbalance",transbalance);
|
|
|
-
|
|
|
- String oppunit = actrsview_rich_obj.getString("YourRichName");
|
|
|
- bill.set("oppunit",oppunit);
|
|
|
-
|
|
|
- String oppbanknumber = actrsview_rich_obj.getString("YourRichNbr");
|
|
|
- bill.set("oppbanknumber",oppbanknumber);
|
|
|
-
|
|
|
- String oppbank = actrsview_rich_obj.getString("CltText");
|
|
|
- bill.set("oppbank",oppbank);
|
|
|
-
|
|
|
- bill.set("biztype","1");
|
|
|
-
|
|
|
- String detailid = String.valueOf(actrsview_rich_obj.getLong("TransNbr"));
|
|
|
- bill.set("detailid",detailid);
|
|
|
-
|
|
|
- String bizrefno = String.valueOf(actrsview_rich_obj.getLong("TraceNbr"));
|
|
|
- bill.set("bizrefno",bizrefno);
|
|
|
-
|
|
|
- bill.set("datasource","hxsys");
|
|
|
-
|
|
|
- bill.set("receredtype","0");
|
|
|
-
|
|
|
-
|
|
|
- return bill;
|
|
|
- }
|
|
|
-
|
|
|
- private Map getCurrencyMap() {
|
|
|
- Map currMap = new HashMap();
|
|
|
- QFilter qFilter_enable = new QFilter("enable",QCP.equals,"1");
|
|
|
- DynamicObject[] currCol = BusinessDataServiceHelper.load(
|
|
|
- "bd_currency","id,number,nckd_hxxtno",new QFilter[]{qFilter_enable});
|
|
|
- for(DynamicObject currObj : currCol){
|
|
|
- if(StringUtils.isNotBlank(currObj.getString("nckd_hxxtno"))){
|
|
|
- currMap.put(currObj.getString("nckd_hxxtno"),currObj);
|
|
|
- }
|
|
|
- }
|
|
|
- return currMap;
|
|
|
- }
|
|
|
-
|
|
|
- private String transTime(String entryDate, String entryTime) {
|
|
|
- String time = "";
|
|
|
- switch (entryTime.length()){
|
|
|
- case 1:time="00:00:0"+entryTime;break;
|
|
|
- case 2:time="00:00:"+entryTime;break;
|
|
|
- case 3:time="00:0"+entryTime.substring(0,1)+":"+entryTime.substring(1);break;
|
|
|
- case 4:time="00:"+entryTime.substring(0,2)+":"+entryTime.substring(2);break;
|
|
|
- case 5:time="0"+entryTime.substring(0,1)+":"+entryTime.substring(1,3)+":"+entryTime.substring(3);break;
|
|
|
- case 6:time=entryTime.substring(0,2)+":"+entryTime.substring(2,4)+":"+entryTime.substring(4);break;
|
|
|
- }
|
|
|
-
|
|
|
- return entryDate+" "+time;
|
|
|
- }
|
|
|
-
|
|
|
- private String createMessageRequest(String queryDate, String bankaccountnumber) {
|
|
|
- try {
|
|
|
- DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
|
|
|
- DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
|
|
|
- Document doc = dBuilder.newDocument();
|
|
|
-
|
|
|
- Element rootElement = doc.createElement("Message");
|
|
|
- doc.appendChild(rootElement);
|
|
|
-
|
|
|
- Element head = doc.createElement("HeadInfo");
|
|
|
- rootElement.appendChild(head);
|
|
|
-
|
|
|
- createElement(doc, head, "transcode", "ACRCTRSQ");
|
|
|
- createElement(doc, head, "channelcode", "JF");
|
|
|
- Calendar currentdate = Calendar.getInstance();
|
|
|
- createElement(doc, head, "channeldate", TypeUtils.date2String(currentdate.getTime(),"yyyyMMdd"));
|
|
|
- String channelserno = TypeUtils.date2String(currentdate.getTime(),"yyyyMMdd HHmmss");
|
|
|
- createElement(doc, head, "channelserno", channelserno);
|
|
|
- createElement(doc, head, "channeltime", currentdate.get(Calendar.HOUR)+""+currentdate.get(Calendar.MINUTE)+""+currentdate.get(Calendar.SECOND));
|
|
|
- createElement(doc, head, "brno", "");
|
|
|
- createElement(doc, head, "tellerno", "");
|
|
|
- createElement(doc, head, "terminalno", "");
|
|
|
- createElement(doc, head, "reserve", "");
|
|
|
-
|
|
|
- Element body = doc.createElement("BodyInfo");
|
|
|
- rootElement.appendChild(body);
|
|
|
-
|
|
|
- createElement(doc, body, "RichNbr", bankaccountnumber);
|
|
|
- createElement(doc, body, "QryRichType", "1");
|
|
|
- createElement(doc, body, "TransTypeFlag", "N");
|
|
|
- createElement(doc, body, "BgnDate", queryDate);
|
|
|
- createElement(doc, body, "EndDate", queryDate);
|
|
|
- createElement(doc, body, "QryDir", "D");
|
|
|
- createElement(doc, body, "MinAmt", "0");
|
|
|
- createElement(doc, body, "MaxAmt", "999999999999.99");
|
|
|
- createElement(doc, body, "YourType", "N");
|
|
|
- createElement(doc, body, "RowCnt", "20000");
|
|
|
- createElement(doc, body, "TotalFlag", "0");
|
|
|
-
|
|
|
- TransformerFactory transformerFactory = TransformerFactory.newInstance();
|
|
|
- Transformer transformer = transformerFactory.newTransformer();
|
|
|
- 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);
|
|
|
- int length = writer.toString().length();
|
|
|
- String xmlStr = "00000" +String.valueOf(length)+writer.toString();
|
|
|
- return xmlStr;
|
|
|
- }catch (Exception e) {
|
|
|
- log.info("拼接请求报文异常:"+e.getMessage());
|
|
|
- e.printStackTrace();
|
|
|
- return null;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- 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);
|
|
|
- }
|
|
|
-
|
|
|
- private String getDateByType(String type) {
|
|
|
- String date = "";
|
|
|
- Calendar now = Calendar.getInstance();
|
|
|
- SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
|
|
|
- if("now".equals(type)){
|
|
|
- date = sdf.format(now.getTime());
|
|
|
- }else if("before".equals(type)){
|
|
|
- now.add(Calendar.DAY_OF_MONTH,-1);
|
|
|
- date = sdf.format(now.getTime());
|
|
|
- }else{
|
|
|
- date = type;
|
|
|
- }
|
|
|
- return date;
|
|
|
- }
|
|
|
-
|
|
|
- public static JSONObject socketService(String serverName,String port,String xmlData){
|
|
|
- try {
|
|
|
- Socket client = new Socket(serverName, TypeUtils.nullToInt(port));
|
|
|
- OutputStream outToServer = client.getOutputStream();
|
|
|
- PrintWriter out = new PrintWriter(new OutputStreamWriter(outToServer, "GBK"), true);
|
|
|
- out.println(xmlData);
|
|
|
-
|
|
|
- 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);
|
|
|
- }
|
|
|
- JSONObject jsonObject = XML.toJSONObject(responseJson);
|
|
|
- client.close();
|
|
|
- return jsonObject;
|
|
|
- } catch (IOException e) {
|
|
|
- e.printStackTrace();
|
|
|
- log.info("短信发送失败:"+e.getMessage());
|
|
|
- }
|
|
|
- return null;
|
|
|
- }
|
|
|
-}
|