@RestResource(urlMapping = '/NFM612/*') global with sharing class NFM612Rest { //add to AWS 回复 start sushanhu 20220225 static Boolean SFStatus=true; static String SFMessage=''; //add to AWS 回复 end sushanhu 20220225 public static final String LOG_TYPE = 'NFM612'; global class GeData { public RepairOderInfo repairOderInfo; public ApplyRepairInfo applyRepairInfo; } //报修单信息 public class RepairOderInfo { public String repairOrderNo; //报修单号 public String repairOrderNo2; //报修单子单号 public String hospitalCd; //报修医院编码 public String strategicDepartmenCd; //战略科室编码 public String departmentCd; //报修科室编码 public String repairApplyPerson; //报修人用户编码 public String repairApplicantName; //报修人姓名 public String repairApplicantNameEncrypted; //报修人姓名密文 add20220214 public String repairApplyPersonTel; //报修人联系人电话 public String repairApplyPersonTelEncrypted;//保修人联系电话 密文 add 20220214 public String DataId;//aws 存储凭证 add 20220214 public String repairApplyType; // 报修人岗位 public String equipmentCategory; //设备大类 public String assetType; //设备类型 public String equipmentCd; //机身编码(医院) public String faultDate; //故障发生日 public String repairOrderTime; //报修时间 public String faultType; //故障类型 public String problemDesc; //问题描述 public String problemPhotoName; //问题照片 public String problemPhotofile; //照片附件 public String repairSubOrderType; //报修单类型 public String responseResultType; //应对结果类型 public String receiverType; //受理人类型 public String receiverId; //受理人用户编号 public String receiverDate; //受理日 public String plannedVisitDay; //计划上门日 //public String actualVisitTimeFirst;//实际上门日 public String startTimeFirst; //开始时间 public String endTimeFirst; //结束时间 public String faultDescriptionFirst; //故障描述 public String actualVisitTimeSecond; //二次上门日 public String startTimeSecond; //二次上门开始时间 public String endTimeSecond; //二次上门结束时间 public String faultDescriptionSecond; //二次故障描述 public String actualVisitTimeThird; //三次上门日 public String startTimeThird; //三次上门开始时间 public String endTimeThird; //三次上门结束时间 public String faultDescriptionThird; //三次故障描述 public String applicantType; //申请修理人类型 public String applicantId; //申请修理人编号 public String applyDate; //申请时间 public String repairOrderNo2FSEID; //报修子单所属FSE的ID // 2022/4/6 zhangyuheng update start public String RepairFinishDate; //修理品处理完成日 public String ApplicanterPhone; //处理人电话 public String CancelDate; //受理人取消报修日 // 2022/4/6 zhangyuheng update end // 上线前 报修子单与修理上的相关字段都删除 public String responseResultsFirst; //上门应对结果(暂时注掉) public String responseResultsSecond; //二次上门应对结果(暂时注掉) public String responseResultsThird; //三次上门应对结果(暂时注掉) public String cancellerType; //取消人类型 public String cancellerId; //取消人用户编号 public String cancelleRepairDate; //取消报修日 public String cancelReportReason; //取消报修原因 } //设备信息 public class ApplyRepairInfo { public String equipmentModel; //设备型号 public String equipmentCd; //机身编码(工程师) public String responseResultDesc; //应对描述 public String processResult; //处理结果 } @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":' + gedata + '}'; // String jsonResponse = '{"status": "Success", "Message":"成功"}'; // res.responseBody = Blob.valueOf(jsonResponse); //updata response toAWS 20220225 sushanhu start NFMUtil.NFMResponse result = NFMUtil.getNFMResponse(); result.SFStatus=SFStatus; result.SFMessage=SFMessage; String jsonResponse =JSON.serialize(result); system.debug('result---'+jsonResponse); res.responseBody = blob.valueOf(jsonResponse); //updata response toAWS 20220225 sushanhu end 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 = ''; String rowDataStr = NFMUtil.getRowDataStr(rowData); List < GeData > itemMasterList = (List < GeData > ) JSON.deserialize(rowDataStr, List < GeData > .class); if (itemMasterList == null || itemMasterList.size() == 0) { return; } Savepoint sp = Database.setSavepoint(); try { List < RepairSubOrder__c > repairList = new List < RepairSubOrder__c > (); Map < String, GeData > gedMap = new Map < String, GeData > (); List < String > managementCodeList = new List < String > (); //存放科室编码 List < String > rpersonList = new List < String > (); //存放报修人用户编码 List < String > canIdList = new List < String > (); //存放取消人用户编号 List < String > repairNoList = new List < String > (); //存放报修子单号 for (GeData ged: itemMasterList) { String dataComplete = verify(ged); if (!String.isBlank(dataComplete)) { logstr += dataComplete; continue; } gedMap.put(ged.repairOderInfo.repairOrderNo2, ged); managementCodeList.add(ged.repairOderInfo.departmentCd); // 报修人用户编码 if (String.isNotBlank(ged.repairOderInfo.repairApplyPerson)) { rpersonList.add(ged.repairOderInfo.repairApplyPerson); } //申请修理人编号 if (String.isNotBlank(ged.repairOderInfo.applicantId)) { // canIdList.add(ged.repairOderInfo.applicantId); rpersonList.add(ged.repairOderInfo.applicantId); } // 受理人用户编号(经销商用户、社内用户) if (String.isNotBlank(ged.repairOderInfo.receiverId)) { rpersonList.add(ged.repairOderInfo.receiverId); // canIdList.add(ged.repairOderInfo.receiverId); } canIdList.add(ged.repairOderInfo.repairOrderNo2FSEID); } if (gedMap.size() > 0) { // 根据科室编码获取科室、战略科室、医院 Map < String, Account > accountMap = getAccountMap(managementCodeList); //存放报修人用户编码,id Map < String, Id > personMap = getContactMap(rpersonList); //存放取消人用户编码,受理人id.申请修理人编号,报修子单所属FSE的ID,id Map < String, User > canidMap = getUserMap(canIdList); // 附件下载标记 Boolean attachmentDownloadFlg = false; String repairOrderNo2Str = '报修子单No [ \n'; for (String repairOrderNo2: gedMap.keySet()) { GeData ged = gedMap.get(repairOrderNo2); if (!accountMap.containsKey(ged.repairOderInfo.departmentCd)) { logstr += ged.repairOderInfo.departmentCd + '该科室不存在,此条数据跳过!'; continue; } if (String.isNotBlank(ged.repairOderInfo.repairApplyPerson) && !personMap.containsKey(ged.repairOderInfo.repairApplyPerson)) { logstr += ged.repairOderInfo.repairApplyPerson + '报修人用户编码不存在,此条数据跳过'; continue; } if (!personMap.containsKey(ged.repairOderInfo.receiverId)) { logstr += ged.repairOderInfo.receiverId + '受理人用户编号不存在,此条数据跳过'; continue; } if ('申请修理'.equals(ged.applyRepairInfo.processResult) && !personMap.containsKey(ged.repairOderInfo.applicantId)) { logstr += ged.repairOderInfo.applicantId + '申请修理人编号不存在,此条数据跳过'; continue; } if (!canidMap.containsKey(ged.repairOderInfo.repairOrderNo2FSEID)) { logstr += ged.repairOderInfo.repairOrderNo2FSEID + '报修子单所属FSE的ID不存在,此条数据跳过'; continue; } RepairSubOrder__c repair = new RepairSubOrder__c(); repair.RepairOrderNo__c = ged.repairOderInfo.repairOrderNo; //报修单号 repair.RepairSubOrderNo__c = ged.repairOderInfo.repairOrderNo2; //报修单子单号 repair.Name = ged.repairOderInfo.repairOrderNo2; //报修单名称 Account dep = accountMap.get(ged.repairOderInfo.departmentCd); repair.Hospital__c = dep.Parent.ParentId; //报修医院编码 repair.StrategicDepartment__c = dep.ParentId; //战略科室 repair.Department__c = dep.Id; //报修科室编码 repair.RepairApplicant__c = personMap.get(ged.repairOderInfo.repairApplyPerson); //报修人用户编码 repair.RepairApplicantName__c = ged.repairOderInfo.repairApplicantName; //报修人姓名 repair.RepairApplicantTel__c = ged.repairOderInfo.repairApplyPersonTel; //报修人联系电话 repair.RepairSubOrderPost__c = ged.repairOderInfo.repairApplyType; //报修人岗位 repair.EquipmentCategory__c = ged.repairOderInfo.equipmentCategory; //设备大类 repair.AssetType__c = ged.repairOderInfo.assetType; //设备类型 repair.AssetCode__c = ged.repairOderInfo.equipmentCd; //机身编码 repair.FaultTime__c = NFMUtil.parseStr2DateTime(ged.repairOderInfo.faultDate); //故障发生日 repair.RepairTime__c = NFMUtil.parseStr2DateTime(ged.repairOderInfo.repairOrderTime); //报修时间 repair.FaultType__c = ged.repairOderInfo.faultType; //故障类型 repair.ProblemDescription__c = ged.repairOderInfo.problemDesc; //问题描述 repair.RepairSubOrderType__c = ged.repairOderInfo.repairSubOrderType; //报修单类型 repair.ResponseResultType__c = ged.repairOderInfo.responseResultType; //应对结果类型 repair.ReceiverType__c = ged.repairOderInfo.receiverType; //受理人类型 // repair.ReceiverFSE__c = canidMap.get(ged.repairOderInfo.receiverId).Id; //受理人(FSE) repair.Receiver__c = personMap.get(ged.repairOderInfo.receiverId); //受理人 repair.ReceiverTime__c = NFMUtil.parseStr2DateTime(ged.repairOderInfo.receiverDate); //受理日 repair.PlannedVisitDay__c = NFMUtil.parseStr2DateTime(ged.repairOderInfo.plannedVisitDay); //计划上门日 repair.StartTimeFirst__c = NFMUtil.parseStr2DateTime(ged.repairOderInfo.startTimeFirst); //开始时间 repair.EndTimeFirst__c = NFMUtil.parseStr2DateTime(ged.repairOderInfo.endTimeThird); //结束时间 repair.FaultDescriptionFirst__c = ged.repairOderInfo.faultDescriptionFirst; //故障描述 repair.ActualVisitTimeSecond__c = NFMUtil.parseStr2DateTime(ged.repairOderInfo.actualVisitTimeSecond); //二次上门日--->二次计划上门日 repair.StartTimeSecond__c = NFMUtil.parseStr2DateTime(ged.repairOderInfo.startTimeSecond); //二次上门开始时间--->二次上门日 repair.EndTimeSecond__c = NFMUtil.parseStr2DateTime(ged.repairOderInfo.endTimeSecond); //二次上门结束时间 repair.FaultDescriptionSecond__c = ged.repairOderInfo.faultDescriptionSecond; //二次故障描述 repair.ActualVisitTimeThird__c = NFMUtil.parseStr2DateTime(ged.repairOderInfo.actualVisitTimeThird); //三次上门日--->三次计划上门日 repair.StartTimeThird__c = NFMUtil.parseStr2DateTime(ged.repairOderInfo.startTimeThird); //三次上门开始时间--->三次上门日 repair.EndTimeThird__c = NFMUtil.parseStr2DateTime(ged.repairOderInfo.endTimeThird); //三次上门结束时间 repair.FaultDescriptionThird__c = ged.repairOderInfo.faultDescriptionThird; //三次故障描述 repair.ApplicantType__c = ged.repairOderInfo.applicantType; //申请修理人类型 repair.RepairApplicantName_Encrypted__c =ged.repairOderInfo.repairApplicantNameEncrypted; //报修人姓名密文 add 20220214 repair.RepairApplicantTel_Encrypted__c = ged.repairOderInfo.repairApplyPersonTelEncrypted;//保修人联系电话密文 add 20220214 repair.AWS_Data_Id__c =ged.repairOderInfo.DataId;//AWS 存储凭证 add 20220214 // repair.Applicant__c = canidMap.get(ged.repairOderInfo.applicantId).Id; //申请修理人编号 repair.Applicanter__c = personMap.get(ged.repairOderInfo.applicantId);//申请修理人编号 repair.ApplicationTime__c = NFMUtil.parseStr2DateTime(ged.repairOderInfo.applyDate); //申请时间 repair.Ownerid = canidMap.get(ged.repairOderInfo.repairOrderNo2FSEID).Id; //报修子单所属FSE的ID repair.AssetModel__c = ged.applyRepairInfo.equipmentModel; //设备型号 repair.AirframeCodeEngineer__c = ged.applyRepairInfo.equipmentCd; //机身编码(工程师) repair.ResponseResultDesc__c = ged.applyRepairInfo.responseResultDesc; //应对描述--->问题描述(工程师) repair.ProcessResult__c = ged.applyRepairInfo.processResult; //处理结果 // 2022/4/6 zhangyuheng update start repair.RepairFinishDate__c = NFMUtil.parseStr2Date(ged.repairOderInfo.RepairFinishDate) ; //修理品处理完成日 repair.ApplicanterPhone__c = ged.repairOderInfo.ApplicanterPhone; //处理人电话 repair.CancelleRepairTime__c = NFMUtil.parseStr2Date(ged.repairOderInfo.CancelDate); //受理人取消报修日 // 2022/4/6 zhangyuheng update end if ('问题已解决'.equals(ged.applyRepairInfo.processResult)) { // repair.Status__c = '关闭'; repair.Status__c = '已完成'; // 2022/4/6 zhangyuheng } else { repair.Status__c = '待处理'; } // 附件信息 repair.AttachmentLink__c = ged.repairOderInfo.problemPhotofile; String attachmentName = ged.repairOderInfo.problemPhotoName; if (ged.repairOderInfo != null && String.isNotBlank(ged.repairOderInfo.problemPhotofile)) { repair.AttachmentDownload__c = true; attachmentDownloadFlg = true; if (String.isBlank(attachmentName) || (String.isNotBlank(attachmentName) && !attachmentName.contains('.zip'))){ attachmentName = '附件.zip'; } } repair.AttachmentName__c = attachmentName; repairOrderNo2Str += repairOrderNo2 + '\n'; repairList.add(repair); repairNoList.add(ged.repairOderInfo.repairOrderNo2); } // 2022/4/6 zhangyuheng update start List repairList1 = [SELECT Id FROM RepairSubOrder__c WHERE RepairSubOrderNo__c in: repairNoList]; if (repairList1.size() > 0) { logstr += repairOrderNo2Str + ']-已存在'; } // if (repairList.size() > 0) {==== 2022/4/6 zhangyuheng注释掉 else { // 2022/4/6 zhangyuheng update end insert repairList; repairOrderNo2Str += ' ]\n'; logstr += repairOrderNo2Str + '新增完成, 新增总数数为:' + repairList.size() + '\n'; if (attachmentDownloadFlg) { NFM609Schedule.assignOneMinute('RepairSubOrder__c'); } } } logstr += 'End\n'; rowData.retry_cnt__c = 0; } catch (Exception ex) { Integer batch_retry_max_cnt = Integer.valueOf(System.Label.batch_retry_max_cnt); // エラーが発生した場合 Database.rollback(sp); logstr += '\n' + ex.getMessage(); iflog.ErrorLog__c = ex.getMessage() + '\n' + ex.getStackTraceString() + '\n' + iflog.ErrorLog__c; if (!Test.isRunningTest()) { rowData = NFMUtil.LogAutoSend(rowData, ex, null); } } update rowData; iflog.Log__c = logstr; insert iflog; } /** * [getAccountMap description] 根据科室编码查找科室,与科室对应的战略科室和医院 * @param managementCodeList [可数的管理编码] * @return [科室信息] */ private static Map < String, Account > getAccountMap(List < String > managementCodeList) { List < Account > accountList = [SELECT id, Management_Code__c, ParentId, Parent.ParentId FROM Account WHERE Management_Code__c IN: managementCodeList ]; Map < String, Account > hosMap = new Map < String, Account > (); for (Account ac: accountList) { hosMap.put(ac.Management_Code__c, ac); } return hosMap; } /** * [获取系统里的联系人] * @param rpersonList [报修人/申请人/受理人的管理人员编号或对应用户的员工编码] * @return [联系人信息] */ private static Map < String, Id > getContactMap(List < String > rpersonList) { List < Contact > couList = [ SELECT id, CManageCode__c,Employee_No_manual__c FROM Contact WHERE CManageCode__c IN: rpersonList OR Employee_No_manual__c IN:rpersonList]; Map < String, Id > contactMap = new Map < String, Id > (); for (Contact con: couList) { contactMap.put(con.CManageCode__c, con.Id); if (String.isNotBlank(con.Employee_No_manual__c)) { contactMap.put(con.Employee_No_manual__c, con.Id); } } return contactMap; } /** * [获取系统里的用户] * @param canIdList [description] * @return [description] */ private static Map < String, User > getUserMap(List < String > canIdList) { List < User > userList = [SELECT id, Employee_No__c, Contact.CManageCode__c,IsActive,Contact.Employee_No_manual__c FROM User WHERE Employee_No__c IN: canIdList OR Contact.CManageCode__c IN: canIdList OR Contact.Employee_No_manual__c IN:canIdList ]; Map < String, User > result = new Map < String, User > (); for (User u: userList) { if (String.isNotBlank(u.Contact.CManageCode__c)) { result.put(u.Contact.CManageCode__c, u); } if (String.isNotBlank(u.Contact.Employee_No_manual__c)) { result.put(u.Contact.Employee_No_manual__c, u); } result.put(u.Employee_No__c, u); } return result; } private static String verify(GeData ged) { String result = ''; String repairOrderNo2 = ''; if (ged.repairOderInfo == null) { result += ' DataError: repairOderInfo is null!\n'; } else { if (ged.repairOderInfo.repairOrderNo == null) { result += ' DataError: 报修单 [ repairOrderNo ] is null!\n'; } if (ged.repairOderInfo.repairOrderNo2 == null) { result += ' DataError: 报修子单 [ repairOrderNo2 ] is null!\n'; } else { repairOrderNo2 = '报修子单 [ ' + ged.repairOderInfo.repairOrderNo2 + ' ]\n'; } if (ged.repairOderInfo.departmentCd == null) { result += ' DataError: 报修科室编码 [ departmentCd ] is null!\n'; } if (ged.repairOderInfo.faultDate == null) { result += ' DataError: 故障发生日 [ faultDate ] is null!\n'; } if (ged.repairOderInfo.repairOrderTime == null) { result += ' DataError: 报修时间 [ repairOrderTime ] is null!\n'; } if (ged.repairOderInfo.faultType == null) { result += ' DataError: 故障类型 [ faultType ] is null!\n'; } if (ged.repairOderInfo.repairSubOrderType == null) { result += ' DataError: 报修单类型 [ repairSubOrderType ] is null!\n'; } if (String.isBlank(ged.repairOderInfo.receiverType)) { result += ' DataError: 受理人类型 [ receiverType ] is null!\n'; } if (String.isBlank(ged.repairOderInfo.receiverId)) { result += ' DataError: 受理人用户编号 [ receiverId ] is null!\n'; } if (String.isBlank(ged.repairOderInfo.receiverDate)) { result += ' DataError: 受理日 [ receiverDate ] is null!\n'; } if (ged.repairOderInfo.repairOrderNo2FSEID == null) { result += ' DataError: 报修子单所属FSE的ID [ repairOrderNo2FSEID ] is null!\n'; } } if (ged.applyRepairInfo == null) { result += ' DataError: applyRepairInfo is null!\n'; } else { if (String.isBlank(ged.applyRepairInfo.equipmentModel)) { result += ' DataError: 设备型号 [ equipmentModel ] is null!\n'; } if (String.isBlank(ged.applyRepairInfo.processResult)) { result += ' DataError: 处理结果 [ processResult ] is null!\n'; } else { if ('申请修理'.equals(ged.applyRepairInfo.processResult)) { if (String.isBlank(ged.repairOderInfo.applicantId)) { result += ' DataError: 申请修理人编号 [ applicantId ] is null!\n'; } if (String.isBlank(ged.repairOderInfo.applyDate)) { result += ' DataError: 申请时间 [ applyDate ] is null!\n'; } } } } if (String.isNotBlank(repairOrderNo2) && String.isNotBlank(result)) { result = repairOrderNo2 + result; } return result; } }