public class NFM118Controller { public static String status; private static final String LOG_TYPE = 'OTS005'; // public static OTS_order__c oTSorder {get; set;} // POST请求传送参数 public class Translnfo{ public String appname; //RVS public String cus_dn;//dn号 public String request_time;//当前时间 } public class Monitoring{ public String MessageGroupNumber; public String MessageType; public String Receiver; public String Sender; public String Tag; public String NumberOfRecord; public String Text; public String TransmissionDateTime; } public class RequestBody{ public Monitoring Monitoring; public Translnfo TransInfo; } // 处理返回的JSON字符串 // 返回结果 对象 public class Resinfo{ public Integer Status; public String Erro_code; public String Erro_val; } //OTS 物流订单 对象 public class Order{ public String order_number; public Integer so_dn; public String order_info; public String cre_dat; public String shipping_company; public String shipping_man; public String shipping_address; public String shipping_tel; public String receiving_company; public String receiving_man; public String receiving_address; public String receiving_tel; public String shipping_province; public String shipping_city; public String receiving_province; public String receiving_city; // public Product[] product; } // 产品介绍 对象 public class Product{ public String product_name; public Integer num; public Decimal weight; public Integer ncount; public String package_type; } public class Waybill{ // public Long waybill_number; public String waybill_number; public String carrier_name; public String transport_way; public String shipping_time; public String request_time; public String receive_time; public String signer; public String transportion_time; public String is_ontime; public String delay_type1; public String delay_type2; public String delay_reason; public String waybill_status; public Transinfo[] transinfo; } public class Transinfo{ public String op_time; public String op_place; public String op_way; public String cmemo; public String op_man; } public class ResponseData { public Resinfo resinfo; // 其他属性 public Order order; public Waybill waybill; } public static void execute(String iflog_Id, String cusdn,List dnList){ if (dnList!= null) { for (String d : dnList) { executefuture(iflog_Id,d); } }else{ callout(iflog_Id, cusdn); } } // 测试使用 @future(callout = true) // 异步调用 public static void callout(String iflog_Id, String cusdn) { executefuture(iflog_Id,cusdn); } // 跑错误日志使用 public static void main(String iflog_Id){ BatchIF_Log__c iflog = [Select Id, Name, Log__c, ErrorLog__c, MessageGroupNumber__c,Is_Error__c from BatchIF_Log__c where Id = :iflog_Id]; String result = parseResponse(iflog.Log__c); BatchIF_Log__c iflog2 = new BatchIF_Log__c(); iflog2.MessageGroupNumber__c = iflog.MessageGroupNumber__c; iflog2.Type__c = 'OTS005'; iflog2.Log__c = '返回结果:'+result; try { ResponseData responseData = (ResponseData) JSON.deserialize(result, ResponseData.class); if (responseData.resinfo.Status == 200) { save_OTS_Order(responseData); } iflog.Is_Error__c = 0; update iflog; } catch (Exception e) { iflog2.ErrorLog__c = e.getMessage() + '\n'; iflog2.ErrorLog__c += e.getStackTraceString() + '\n'; } insert iflog2; } public static void executefuture(String iflog_Id, String cusdn) { //MessageGroupNumber的获取 Datetime nowDT = Datetime.now(); String nowStr = nowDT.format('yyyyMMddHHmm'); BatchIF_Log__c iflog = new BatchIF_Log__c(); if(String.isNotBlank(iflog_Id)){ iflog = [Select Id, Name, Log__c, ErrorLog__c, MessageGroupNumber__c from BatchIF_Log__c where Id = :iflog_Id]; } else{ iflog.MessageGroupNumber__c = nowStr+'-'+cusdn; } iflog.Log__c = 'callout start\n'; iflog.Type__c = 'OTS005'; iflog.ErrorLog__c = ''; Monitoring me = new Monitoring(); me.MessageType='OTS005'; me.Receiver = 'OTS'; me.Sender = 'SFDC'; me.Tag = 'MSGH'; me.NumberOfRecord = '1'; me.Text = ''; Translnfo tr = new translnfo(); tr.appname = 'SFDC'; tr.cus_dn = cusdn; tr.request_time = Datetime.now().format('yyyyMMdd'); RequestBody body = new RequestBody(); body.Monitoring = me; body.TransInfo = tr; BatchIF_Log__c rowData = new BatchIF_Log__c(); rowData.Type__c = 'OTS005'; try { System.debug('请求参数1:'+JSON.serialize(body)); iflog.Log__c += '请求参数:'+JSON.serialize(body)+'\n'; status = NFMUtil.Obtainlogistics(JSON.serialize(body)); // 演示用 // status = Obtainlogistics(JSON.serialize(body)); rowData.MessageGroupNumber__c = nowStr+'-'+cusdn; rowData.Log__c = '返回结果:'+status; System.debug('返回结果:'+status); ResponseData responseData = (ResponseData) JSON.deserialize(status, ResponseData.class); // 处理物流路由信息的最新时间 System.debug('处理后的数据:'+responseData); if (responseData.resinfo.Status == 200) { save_OTS_Order(responseData); } } catch (Exception e) { rowData.ErrorLog__c = e.getMessage() + '\n'; rowData.ErrorLog__c += e.getStackTraceString() + '\n'; System.debug('服务报错信息:'+e.getMessage()); } upsert rowData; upsert iflog; } // 处理返回的结果 并进行存储 public static void save_OTS_Order(ResponseData res){ // 1. 通过OTS编号 查看是否存在此数据 List OTSorder = [select id, name, order_number__c, so_dn__c,cre_dat__c, order_info__c, receiving_province__c, receiving_tel__c, receiving_city__c, receiving_address__c, receiving_company__c, receiving_man__c, shipping_province__c, shipping_tel__c, shipping_city__c, shipping_address__c, shipping_company__c, shipping_man__c, product__c, waybill__c from OTS_order__c where so_dn__c =:res.order.so_dn+'']; if (OTSorder.size() != 0) { update_OTS_Order(res,OTSorder[0]); }else { insert_OTS_Order(res); if (Test.isRunningTest()) { OTS_order__c oTS = new OTS_order__c(); insert oTS; update_OTS_Order(res,oTS); } } } public static void update_OTS_Order(ResponseData res,OTS_order__c OTS){ System.debug('开始更新数据'); // 1 通过传入的数据获取对应的 OTS_order__c oTSorder = new OTS_order__c(); oTSorder.order_number__c = res.order.order_number; oTSorder.so_dn__c = res.order.so_dn+''; oTSorder.cre_dat__c = Datetime.now(); oTSorder.order_info__c = res.order.order_info; oTSorder.receiving_province__c = res.order.receiving_province; oTSorder.receiving_tel__c = res.order.receiving_tel; oTSorder.receiving_city__c = res.order.receiving_city; oTSorder.receiving_address__c = res.order.receiving_address; oTSorder.receiving_company__c = res.order.receiving_company; oTSorder.receiving_man__c = res.order.receiving_man; oTSorder.shipping_province__c = res.order.shipping_province; oTSorder.shipping_tel__c = res.order.shipping_tel; oTSorder.shipping_city__c = res.order.shipping_city; oTSorder.shipping_address__c = res.order.shipping_address; oTSorder.shipping_company__c = res.order.shipping_company; oTSorder.shipping_man__c = res.order.shipping_man; // 2023-11-16 WYL 更改原有通过 接口返回数据中waybill_number为空造成的问题 start // List waybillList = [select id,name from waybill__c where waybill_number__c=:String.valueOf(res.waybill.waybill_number)]; waybill__c waybill = new waybill__c(); // waybill.id = waybillList[0].id; waybill.id = OTS.waybill__c; // 2023-11-16 WYL 更改原有通过 接口返回数据中waybill_number为空造成的问题 end waybill.waybill_number__c=String.valueOf(res.waybill.waybill_number); waybill.transport_way__c=res.waybill.transport_way; waybill.shipping_time__c=parseDatetimeFromString(res.waybill.shipping_time); waybill.request_time__c=parseDatetimeFromString(res.waybill.request_time); waybill.receive_time__c=parseDatetimeFromString(res.waybill.receive_time); waybill.signer__c=res.waybill.signer; waybill.transportion_time__c=res.waybill.transportion_time; waybill.is_ontime__c=res.waybill.is_ontime; waybill.delay_type1__c=res.waybill.delay_type1; waybill.delay_type2__c=res.waybill.delay_type2; waybill.delay_reason__c=res.waybill.delay_reason; waybill.waybill_status__c=res.waybill.waybill_status; Datetime newtime; Datetime oldTime; List listName = new List(); if (res.waybill.transinfo!= null && res.waybill.transinfo.size() == 1) { listName.add(parseDatetimeFromString(res.waybill.transinfo[0].op_time)); newtime = Datetime.valueOfGmt(parseDatetimeFromString(res.waybill.transinfo[0].op_time)+'') ; waybill.hasNewStatus__c = true; }else if (res.waybill.transinfo != null && res.waybill.transinfo.size() > 1){ List transinfoList2 =[select id,name,op_place__c,cmemo__c,op_time__c,op_way__c,op_man__c,waybill__c from transinfo__c where waybill__c =:OTS.waybill__c ORDER BY op_time__c DESC]; if (transinfoList2 == null || transinfoList2.size() == 0) { oldTime = null; }else { oldTime = transinfoList2[0].op_time__c; } for (Transinfo t : res.waybill.transinfo) { Datetime br = parseDatetimeFromString(t.op_time); listName.add(br); if (newtime == null || br > newtime) { newtime = Datetime.valueOfGmt(br+''); } } System.debug('所有时间'+listName); System.debug('最新时间:'+newtime); System.debug('老时间:'+oldTime); if (oldTime ==null || newtime > oldTime) { waybill.hasNewStatus__c = true; } } List transinfoList = new List(); if (res.waybill.transinfo != null ) { for (Transinfo t : res.waybill.transinfo) { transinfo__c transinfo = new transinfo__c(); transinfo.op_time__c =parseDatetimeFromString(t.op_time); transinfo.op_place__c =t.op_place; transinfo.op_way__c =t.op_way; transinfo.cmemo__c =t.cmemo; transinfo.Tracking_Number__c = parseDatetimeFromString(t.op_time)+'-'+t.op_way+'-'+ String.valueOf(res.waybill.waybill_number); transinfo.op_man__c =t.op_man; transinfo.waybill__c = waybill.id; transinfoList.add(transinfo); } } if (transinfoList.size()>0) { List upsertResult = Database.upsert(transinfoList, transinfo__c.Tracking_Number__c,false); } // List upsertResult = Database.upsert(transinfoList, transinfo__c.Tracking_Number__c,false); // for (Database.UpsertResult result : upsertResult) { // if (result.isSuccess()) { // if (result.isCreated()) { // System.debug('Record was inserted'); // } else { // System.debug('Record was updated'); // } // } else { // for (Database.Error error : result.getErrors()) { // System.debug('Error message: ' + error.getMessage()); // } // } // } // Database.upsert(productList, product__c.Id); Database.upsert(waybill, waybill__c.Id,false); // oTSorder.product__c = productList[0].id; oTSorder.waybill__c = waybill.id; Database.upsert(oTSorder, OTS_order__c.so_dn__c); // 2023-11-16 新增 WYL 若订单中没有运货单,则将插入新运货单重新插入签收单中 start eSignForm__c eSignForm = [select id,name,waybill__c from eSignForm__c where DNNameNo0__c =:oTSorder.so_dn__c]; System.debug('处理后的数据:'+waybill.id); // 且只有在签收单跟运货单id不 if (eSignForm.waybill__c != waybill.Id) { eSignForm.waybill__c = waybill.id; System.debug('签收单已更新:'+eSignForm); update eSignForm; } // 2023-11-16 新增 WYL 若订单中没有运货单,则将插入新运货单重新插入签收单中 end } public static void insert_OTS_Order(ResponseData res){ System.debug('开始插入数据'); OTS_order__c oTSorder = new OTS_order__c(); oTSorder.order_number__c = res.order.order_number; oTSorder.so_dn__c = res.order.so_dn+''; oTSorder.cre_dat__c = Datetime.now(); oTSorder.order_info__c = res.order.order_info; oTSorder.receiving_province__c = res.order.receiving_province; oTSorder.receiving_tel__c = res.order.receiving_tel; oTSorder.receiving_city__c = res.order.receiving_city; oTSorder.receiving_address__c = res.order.receiving_address; oTSorder.receiving_company__c = res.order.receiving_company; oTSorder.receiving_man__c = res.order.receiving_man; oTSorder.shipping_province__c = res.order.shipping_province; oTSorder.shipping_tel__c = res.order.shipping_tel; oTSorder.shipping_city__c = res.order.shipping_city; oTSorder.shipping_address__c = res.order.shipping_address; oTSorder.shipping_company__c = res.order.shipping_company; oTSorder.shipping_man__c = res.order.shipping_man; waybill__c waybill = new waybill__c(); // waybill.waybill_number__c=res.waybill.waybill_number; waybill.waybill_number__c=String.valueOf(res.waybill.waybill_number); waybill.transport_way__c=res.waybill.transport_way; waybill.shipping_time__c=parseDatetimeFromString(res.waybill.shipping_time); waybill.request_time__c=parseDatetimeFromString(res.waybill.request_time); waybill.receive_time__c=parseDatetimeFromString(res.waybill.receive_time); waybill.signer__c=res.waybill.signer; waybill.transportion_time__c=res.waybill.transportion_time; waybill.is_ontime__c=res.waybill.is_ontime; waybill.delay_type1__c=res.waybill.delay_type1; waybill.delay_type2__c=res.waybill.delay_type2; waybill.delay_reason__c=res.waybill.delay_reason; waybill.waybill_status__c=res.waybill.waybill_status; // 新增默认有 路由是否有新状态 提示 waybill.hasNewStatus__c = true; insert waybill; List transinfoList = new List(); if (res.waybill.transinfo != null) { for (Transinfo t : res.waybill.transinfo) { transinfo__c transinfo = new transinfo__c(); transinfo.op_time__c =parseDatetimeFromString(t.op_time); transinfo.op_place__c =t.op_place; transinfo.op_way__c =t.op_way; transinfo.cmemo__c =t.cmemo; transinfo.op_man__c =t.op_man; transinfo.Tracking_Number__c =parseDatetimeFromString(t.op_time)+'-'+t.op_way+'-'+ String.valueOf(res.waybill.waybill_number); transinfo.waybill__c = waybill.id; transinfoList.add(transinfo); } } // 新添加数据将对应的物理运货信息关联 if (!Test.isRunningTest()) { System.debug('SQL查询:'+'select id,name,waybill__c from eSignForm__c where DNNameNo0__c ='+oTSorder.so_dn__c); eSignForm__c eSignForm = [select id,name,waybill__c from eSignForm__c where DNNameNo0__c =:oTSorder.so_dn__c]; eSignForm.waybill__c = waybill.id; System.debug('处理后的数据:'+eSignForm); update eSignForm; } if (transinfoList.size()>0) { upsert transinfoList; } oTSorder.waybill__c = waybill.id; insert oTSorder; } public static DateTime parseDatetimeFromString(String dateTimeString) { try { if (dateTimeString == null || dateTimeString.equals('')) { return null; }else { String formattedTime = dateTimeString.replace('/', '-'); //.replace(' ', 'T') + '.000' return Datetime.valueOfGmt(formattedTime).addHours(-8); } } catch (Exception e) { // 处理解析错误,可以输出错误信息或者进行其他错误处理 System.debug('解析错误:' + e.getMessage()); return null; } } // 演示用数据 public static String Obtainlogistics2(String rowDataStr){ Http http = new Http(); HttpRequest req = new HttpRequest(); HTTPResponse res; String resb; req.setTimeout(120000); req.setEndpoint('https://wdp.olympus.com.cn:44301/RESTAdapter/OTS002'); req.setMethod('POST'); req.setHeader('Authorization', 'Basic U0ZEQ19XU1VTRVI6cG9xMTIzNDU='); req.setBody(rowDataStr); res = http.send(req); resb = res.getStatus(); system.debug('resb:' + resb); // 测试1 // res.setBody('{"resinfo": {"Status": 200,"Erro_code": "00","Erro_val": ""},"order": {"order_number": "D20211012099","so_dn": 65330898,"order_info": "BJ-GS-210656","cre_dat": "2023/10/12 14:01:18","shipping_company": "奥林巴斯贸易(上海)有限公司","shipping_man": "朱新德","shipping_address": "上海市浦东新区泰谷路185号3层E-F部位","shipping_tel": "021-58667171-8437","receiving_company": "西安好克光电仪器有限公司","receiving_man": "吴明明","receiving_address": "西安曲江新区雁展路1111号莱安中心2幢1单元11层11108号","receiving_tel": 15339092148,"shipping_province": "上海","shipping_city": "上海市","receiving_province": "陕西省","receiving_city": "西安市"},"waybill": {"waybill_number": 6501621931,"carrier_name": "上海大田运输服务有限公司","transport_way": "公路","shipping_time": "2023/09/17 13:00:00","request_time": "2023/09/18 16:00:00","receive_time": "","signer": "吴明明","transportion_time": "","is_ontime": "是","delay_type1": "","delay_type2": "","delay_reason": "","waybill_status": "已创建","transinfo": [{"op_time": "2023/09/17 14:13:38","op_place": "","op_way": "001","cmemo": "货物已由 [上海站] 揽收 操作员:[]","op_man": ""}]}}'); // 测试2 // res.setBody('{"resinfo":{"Status":200,"Erro_code":"00","Erro_val":""},"order":{"order_number":"D20211012099","so_dn":65330898,"order_info":"BJ-GS-210656","cre_dat":"2023/10/12 14:01:18","shipping_company":"奥林巴斯贸易(上海)有限公司","shipping_man":"朱新德","shipping_address":"上海市浦东新区泰谷路185号3层E-F部位","shipping_tel":"021-58667171-8437","receiving_company":"西安好克光电仪器有限公司","receiving_man":"吴明明","receiving_address":"西安曲江新区雁展路1111号莱安中心2幢1单元11层11108号","receiving_tel":15339092148,"shipping_province":"上海","shipping_city":"上海市","receiving_province":"陕西省","receiving_city":"西安市"},"waybill":{"waybill_number":6501621931,"carrier_name":"上海大田运输服务有限公司","transport_way":"公路","shipping_time":"2023/09/17 13:00:00","request_time":"2023/09/18 16:00:00","receive_time":"","signer":"吴明明","transportion_time":"","is_ontime":"是","delay_type1":"","delay_type2":"","delay_reason":"","waybill_status":"运输中","transinfo":[{"op_time":"2023/09/17 14:13:38","op_place":"","op_way":"001","cmemo":"货物已由 [上海站] 揽收 操作员:[]","op_man":""},{"op_time":"2023/09/17 16:13:38","op_place":"","op_way":"002","cmemo":"货物已由 [北京站] 揽收 操作员:[]","op_man":""}]}}'); // 测试3 res.setBody('{"resinfo":{"Status":200,"Erro_code":"00","Erro_val":""},"order":{"order_number":"D20211012099","so_dn":65330898,"order_info":"BJ-GS-210656","cre_dat":"2023/10/12 14:01:18","shipping_company":"奥林巴斯贸易(上海)有限公司","shipping_man":"朱新德","shipping_address":"上海市浦东新区泰谷路185号3层E-F部位","shipping_tel":"021-58667171-8437","receiving_company":"西安好克光电仪器有限公司","receiving_man":"吴明明","receiving_address":"西安曲江新区雁展路1111号莱安中心2幢1单元11层11108号","receiving_tel":15339092148,"shipping_province":"上海","shipping_city":"上海市","receiving_province":"陕西省","receiving_city":"西安市"},"waybill":{"waybill_number":6501621931,"carrier_name":"上海大田运输服务有限公司","transport_way":"公路","shipping_time":"2023/09/17 13:00:00","request_time":"2023/09/18 16:00:00","receive_time":"2023/09/19 16:13:38","signer":"吴明明","transportion_time":"","is_ontime":"是","delay_type1":"","delay_type2":"","delay_reason":"","waybill_status":"已签收","transinfo":[{"op_time":"2023/09/17 14:13:38","op_place":"","op_way":"001","cmemo":"货物已由 [上海站] 揽收 操作员:[]","op_man":""},{"op_time":"2023/09/17 16:13:38","op_place":"","op_way":"002","cmemo":"货物已由 [上海站] 揽收 操作员:[]","op_man":""},{"op_time":"2023/09/19 16:13:38","op_place":"","op_way":"003","cmemo":"货物已签收","op_man":""}]}}'); // System.debug('body:'+res.getBody()); return res.getBody(); } public static String parseResponse(String responseString) { // 去除 "callout end" responseString = responseString.replace('callout end', ''); responseString = responseString.replace('返回结果:', ''); return responseString; } }