@RestResource(urlMapping = '/NFM609/*') global with sharing class NFM609Rest { public static final String LOG_TYPE = 'NFM609'; global class GeData { public String CICstaff; //CIC所属人 public String complaintID; //业务单号 public String[] QuestionList; //询问内容 public String InquireContent; //询问内容(数据不保存) public String InquirePlatform; //询问方式 public String InquireProduct; //询问产品 public String InquirerDate; //询问日期 public String InquirerType; //询问方 public String[] AnswerList; //回答内容 public String answerContent; //回答内容(数据不保存) public String answerDate; //回答日期 public String attachmentName; //附件名称 public String attachmentfile; //附件 public String dealMethod; //应对方法 public String faultJudgment; //故障判断 public String field; //所属领域 public String mngCd; //投诉人管理编码 public String province; //管辖部门 public String questionType; //问题分类 public String remarks; //备注 public String status; //状态 public String trackType; //跟踪 public String unifiedUserID; //投诉人统一ID } @HttpPost global static void doPost() { //取得接口传输内容 String strData = RestContext.request.requestBody.toString(); List < GeData > ges = (List < GeData > ) JSON.deserializeStrict(strData, List < GeData > .class); if (ges == null) { return; } BatchIF_Log__c iflog = new BatchIF_Log__c(); iflog.Type__c = LOG_TYPE; iflog.ErrorLog__c = ''; iflog.Log__c = 'callout start\n'; BatchIF_Log__c rowData = NFMUtil.makeRowData(iflog, LOG_TYPE, ges); insert rowdata; if (String.isBlank(rowData.Log__c) == false) { executefuture(rowData.Id); } //恢复JSON RestResponse res = RestContext.response; res.addHeader('Content-Type', 'application/json'); res.statusCode = 200; String jsonResponse = '{"status":"Success","Message":"成功"}'; res.responseBody = Blob.valueOf(jsonResponse); return; } @future(callout = true) global static void executefuture(String rowData_Id) { main(rowData_Id); } global static void main(String rowData_Id) { BatchIF_Log__c rowData = [Select Id, Name, Log__c, ErrorLog__c, Log2__c, Log3__c, Log4__c, Log5__c, Log6__c, Log7__c, Log8__c, Log9__c, Log10__c, Log11__c, Log12__c, MessageGroupNumber__c, retry_cnt__c from BatchIF_Log__c where RowDataFlg__c = true and Id =: rowData_Id]; String logstr = 'start\n'; BatchIF_Log__c iflog = new BatchIF_Log__c(); iflog.Type__c = LOG_TYPE; iflog.MessageGroupNumber__c = rowData.MessageGroupNumber__c; iflog.Log__c = logstr; iflog.ErrorLog__c = ''; insert iflog; String rowDataStr = NFMUtil.getRowDataStr(rowData); List < GeData > itemMasterList = (List < GeData > ) JSON.deserialize(rowDataStr, List < GeData > .class); logstr += '数据总数为:' + itemMasterList.size() + '\n'; if (itemMasterList == null || itemMasterList.size() == 0) { return; } Savepoint sp = Database.setSavepoint(); try { List < String > cicstaffList = new List < String > (); //存放cic所属人 List < String > inquireList = new List < String > (); //存放询问产品 List < String > mngCdList = new List < String > (); Map < String, GeData > geDataMap = new Map < String, GeData > (); //遍历给oldcicIdList存放id,给map赋值 for (GeData ged: itemMasterList) { String dataComplete = verify(ged); if (!String.isBlank(dataComplete)) { logstr += dataComplete; continue; } geDataMap.put(ged.complaintID, ged); //key是接口拿到的id,value是GeData一整条数据 cicstaffList.add(ged.CICstaff); inquireList.add(ged.InquireProduct); if (String.isNotBlank(ged.mngCd)) { mngCdList.add(ged.mngCd); } } if (geDataMap.size() > 0) { // 获取CIC Map < String, Case > caseMap = getCaseMap(geDataMap); // 获取 启用的用户 Map < String, Id > cicstaffmap = getCaseOwnerMap(cicstaffList); // 获取产品 Map < String, Id > inquireMap = getProductMap(inquireList); // 获取联系人以及联系人对应的客户 Map < String, Contact > accountIdMap = getContactMap(mngCdList); List < Case > upsertList = new List < Case > (); Map < String, List < String >> answerMap = new Map < String, List < String >> (); Boolean attachmentDownloadFlg = false; String complaintIDStr = '业务单号 [ \n'; for (String complaintID: geDataMap.keySet()) { GeData ged = geDataMap.get(complaintID); if (!cicstaffmap.containsKey(ged.CICstaff)) { logstr += ged.CICstaff + '员工编码不存在或对应用户无效,此条数据跳过'; continue; } Case cas = caseMap.containsKey(complaintID) ? caseMap.get(complaintID) : new Case(); //new Case(); //询问产品 if (inquireMap.containsKey(ged.InquireProduct)) { cas.prod__c = inquireMap.get(ged.InquireProduct); } else { cas.Other_company_product__c = ged.InquireProduct; } if (accountIdMap.containsKey(ged.mngCd)) { Contact con = accountIdMap.get(ged.mngCd); cas.ContactId = con.Id; cas.Account__c = getAccountId(con); } cas.Ownerid = cicstaffmap.get(ged.CICstaff); //CIC所属人 cas.inquiry_detail__c =ged.InquireContent; //询问内容 //'内容太长,详情请见 CIC问答内容 相关内容'; //ged.InquireContent; //询问内容 cas.complaintID__c = ged.complaintID; //业务单号 cas.Origin = '客户端'; //(个案来源)(20220106修改) cas.Received_call_day__c = NFMUtil.parseStr2Date(ged.InquirerDate); //询问日期(收到电话日) cas.Contact_staff__c = ged.InquirerType; //询问方 cas.answer_detail_content__c = ged.answerContent; //回答内容 '内容太长,详情请见 CIC问答内容 相关内容'; // cas.answer_day__c = NFMUtil.parseStr2Date(ged.answerDate); //回答日期 cas.Process_method__c = ged.dealMethod; //对应方法 cas.solutuion__c = ged.faultJudgment; //故障判断 cas.Question_Area_new__c = ged.field; //所属领域 cas.Province__c = ged.province; //管辖部门 cas.inquiry_type__c = ged.questionType; //问题类别 cas.Text_attachement__c = ged.remarks; //备注 cas.Status = ged.status; //状态 cas.Follow_category__c = ged.trackType; //跟踪 cas.RecordTypeId = '01210000000QsYpAAK'; cas.AttachmentLink__c = ged.attachmentfile; String attachmentName = ged.attachmentName; cas.AttachmentName__c = attachmentName; if (String.isNotBlank(ged.attachmentfile)) { cas.AttachmentDownload__c = true; attachmentDownloadFlg = true; if (String.isBlank(attachmentName) || (String.isNotBlank(attachmentName) && !attachmentName.contains('.zip'))){ cas.AttachmentName__c = '附件.zip'; } } upsertList.add(cas); if ('投诉'.equals(ged.questionType)) { //问答时 AnswerList放全部, 投诉时 需合并 QuestionList ged.AnswerList.addAll(ged.QuestionList); } complaintIDStr += complaintID + '\n'; answerMap.put(complaintID, ged.AnswerList); } if (upsertList.size() > 0) { upsert upsertList; logstr += complaintIDStr + ' ]\n保存成功\n'; if (attachmentDownloadFlg) { NFM609Schedule.assignOneMinute('Case'); } } } logstr += 'END'; rowData.retry_cnt__c = 0; } catch (Exception ex) { //发生错误时 Database.rollback(sp); logstr += '\n' + ex.getMessage(); iflog.ErrorLog__c = ex.getMessage() + '\n' + ex.getStackTraceString() + '\n' + iflog.ErrorLog__c; rowData = NFMUtil.LogAutoSend(rowData, ex, null); } finally { update rowData; iflog.Log__c = logstr; update iflog; } } private static String verify(GeData ged) { String result = ''; String complaintID = ''; if (ged == null) { result += 'DataError: is null!\n'; } else { if (String.isBlank(ged.complaintID)) { result += 'DataError: 业务单号 [ complaintID ] is null!\n'; } else { complaintID = '业务单号 [ ' + ged.complaintID + ' ]\n'; } if (String.isBlank(ged.CICstaff)) { result += 'DataError: CIC所属人 [ CICstaff ] is null!\n'; } if (String.isBlank(ged.questionType)) { result += 'DataError: 问题类别 [ questionType ] is null!\n'; } if (String.isBlank(ged.InquireProduct)) { result += 'DataError: 询问产品 [ InquireProduct ] is null!\n'; } if (ged.AnswerList == null) { result += 'DataError: 回答内容 [ AnswerList ] is null!\n'; } if (String.isNotBlank(complaintID) && String.isNotBlank(result)) { result += complaintID + result; } } return result; } // 查找 CIC(个案) private static Map < String, Case > getCaseMap(Map < String, GeData > geDataMap) { List < Case > caseList = [SELECT Id, complaintID__c FROM Case WHERE complaintID__c IN: geDataMap.keySet()]; Map < String, Case > caseMap = new Map < String, Case > (); for (Case cas: caseList) { caseMap.put(cas.complaintID__c, cas); } return caseMap; } // 查找 启用的用户 private static Map < String, Id > getCaseOwnerMap(List < String > cicstaffList) { List < User > userList = [SELECT id, Employee_No__c FROM User WHERE Employee_No__c IN: cicstaffList and IsActive = true]; Map < String, Id > cicstaffmap = new Map < String, Id > (); for (User u: userList) { cicstaffmap.put(u.Employee_No__c, u.Id); } return cicstaffmap; } // 获取客户Id private static String getAccountId(Contact con) { String result = null; // 医院/经销商 if (String.isBlank(con.Account.ParentId)) { result = con.AccountId; } else if (String.isNotBlank(con.Account.Parent.ParentId)) { //科室 result = con.Account.Parent.ParentId; } else { //战略科室 result = con.Account.ParentId; } return result; } // 查找 联系人 public static Map < String, Contact > getContactMap(List < String > mngCdList) { Map < String, Contact > accountIdMap = new Map < String, Contact > (); if (mngCdList.size() > 0) { String contactId = null; List < Contact > contactList = [ SELECT Id, AccountId, Account.Name, Account.ParentId, Account.Parent.ParentId, CManageCode__c, Employee_No_manual__c FROM Contact WHERE CManageCode__c IN: mngCdList OR Employee_No_manual__c IN: mngCdList ]; for (Contact con: contactList) { if (String.isNotBlank(con.Employee_No_manual__c)) { accountIdMap.put(con.Employee_No_manual__c, con); } accountIdMap.put(con.CManageCode__c, con); } } return accountIdMap; } // 根据产品型号 查找最晚创建的产品 private static Map < String, Id > getProductMap(List < String > inquireList) { List < Product2 > productList = [SELECT Id, Asset_Model_No__c, createdDate FROM product2 WHERE Asset_Model_No__c IN: inquireList ORDER BY Asset_Model_No__c, createdDate]; Map < String, Id > inquireMap = new Map < String, Id > (); for (Product2 pro: productList) { inquireMap.put(pro.Asset_Model_No__c, pro.Id); } return inquireMap; } }