/**
|
* 调用地址
|
* UpdateContractAimAmountHandler.SetAwaitToSendAWS
|
*/
|
public without sharing class NFM601Controller {
|
public static String logstr = '';
|
public static String status;
|
private static final String LOG_TYPE = 'NFM601';
|
public class NFM601 {
|
public GeDatas GeDatas;
|
}
|
public class GeDatas {
|
public NFMUtil.MonitoringToComPlat Monitoring;
|
public GeData[] GeData;
|
}
|
public class GeData {
|
public String ManageCode; //管理编码 SFDC的管理编码(医院/科室/经销商
|
public String ManageCode2; //智慧医疗编码 标识为经销商时,本字段不需要传输;SFDC新建医院或科室时本字段值为空;
|
public String Name; //名称
|
public String Identification; //标识 1:医院;2:科室;3:经销商
|
public String SalesBusinessDivision; //销售本部
|
public String State; //省(文本)
|
public String City; //市
|
public Boolean Status; //状态
|
// 医院
|
public String Alias1; //别名1
|
public String Alias2; //别名2
|
public String Abbreviation; //简称 (SFDC需新加字段)
|
public String Phone; //电话
|
public String ZIPCode; //邮编
|
public String Address; //地址
|
public String OCSMCategory; //OCSM分类
|
public String HospitalLevel; //政府等级
|
// 科室
|
public String DepartmentClass; //科室类别
|
public String HospitalCode; //关联医院
|
// 经销商
|
public String QuolifiedValidityDate; //三证资质最早有效期
|
public String ContractEndDate; //最晚合同有效期
|
}
|
|
|
|
//正常调用
|
@future(callout = true)
|
public static void callout(String iflog_Id, List < String > accountIdList) {
|
executefuture(iflog_Id, accountIdList);
|
}
|
//Batch调用
|
public static void executefuture(String iflog_Id, List < String > accountIdList) {
|
BatchIF_Log__c iflog = null;
|
Datetime nowDT = Datetime.now();
|
String nowStr = nowDT.format('yyyyMMddHHmmss');
|
|
if (String.isNotBlank(iflog_Id)) {
|
List < BatchIF_Log__c > iflogList = [Select Id, Name, Log__c, ErrorLog__c from BatchIF_Log__c where Id =: iflog_Id];
|
if (iflogList.size() > 0) {
|
iflog = iflogList.get(0);
|
iflog.ErrorLog__c = '';
|
} else {
|
iflog = new BatchIF_Log__c();
|
iflog.MessageGroupNumber__c = nowStr;
|
}
|
} else {
|
iflog = new BatchIF_Log__c();
|
iflog.MessageGroupNumber__c = nowStr;
|
}
|
|
|
NFMUtil.MonitoringToComPlat me = new NFMUtil.MonitoringToComPlat();
|
me.Tag = 'MSGH';
|
me.Sender = 'SFDC';
|
me.Receiver = '智慧医疗/服务新系统';
|
me.MessageType = LOG_TYPE;
|
me.MessageGroupNumber = nowStr; //iflog.Name;
|
if (String.isNotBlank(iflog.Name)) {
|
me.MessageGroupNumber = iflog.Name;
|
}
|
// me.NumberOfRecord = '' + qisIds.size();
|
me.TransmissionDateTime = nowStr;
|
me.Text = '';
|
String randomstr = NFMUtil.randomUUID(16);
|
Long timestamp = DateTime.now().getTime();
|
String timestampStr = String.valueOf(timestamp);
|
String getToken = NFMUtil.getToken(randomstr, timestamp);
|
me.API_RANDOM_STR = randomstr;
|
me.API_TIME = timestampStr;
|
me.API_TOKEN = getToken;
|
me.sign = NFMUtil.getSignMD5();
|
me.timestamp = timestampStr;
|
me.appKey = NFMUtil.appKeyLMS;
|
|
|
|
BatchIF_Log__c rowData = null;
|
|
//省
|
List < Address_Level__c > address_LevelList = [select Id, Name, Level1_Code__c from Address_Level__c];
|
Map < String, Address_Level__c > regionNameMap = new Map < String, Address_Level__c > ();
|
for (Address_Level__c level1: address_LevelList) {
|
regionNameMap.put(level1.Id, level1);
|
}
|
//市
|
List < Address_Level2__c > address_Level2List = [select Id, Name, Level2_Code__c from Address_Level2__c];
|
Map < String, Address_Level2__c > cityMap = new Map < String, Address_Level2__c > ();
|
for (Address_Level2__c level2: address_Level2List) {
|
cityMap.put(level2.Id, level2);
|
}
|
List < Account > accountList =
|
[
|
SELECT Id,
|
Name, //名称
|
Department_Name__c,
|
Parent.Name,
|
Management_Code__c, //管理编码
|
Salesdepartment_HP__c, //销售本部(医院)
|
Salesdepartment_Dept__c, //销售本部(科室)
|
Salesdepartment_DeptClass__c, //销售本部(科室分类)
|
State_Master__c, //省
|
State_Master__r.Name, //
|
State_Master__r.Level1_Code__c, //
|
City_Master__c, //市
|
City_Master__r.Name, //
|
City_Master__r.Level2_Code__c, //
|
Is_Active_Formula__c, //有效/无效(公式)
|
Address__c, //地址
|
OCM_Category__c, //OCSM分类(医院)
|
Phone, //电话
|
RecordType_DeveloperName__c, //客户记录类型_DeveloperName
|
Site, //别名1
|
Alias_Name2__c, //别名2
|
Ban_On_Use_Date__c, //禁用日期
|
Ban_On_Use_DateDD__c, //DD有效期至
|
Postal_Code__c, //邮政编码
|
RecordType.Name, //记录类型名称
|
RecordTypeId, //记录类型Id
|
Department_RecordType_Name__c, //科室分类名
|
Parent.Parent.Management_Code__c, //医院的 管理编码
|
Grade__c, //政府等级
|
PlatformCode__c, //智慧医疗编码
|
Abbreviation__c, //简称
|
Parent.Parent.State_Master__r.Level1_Code__c,
|
Parent.Parent.City_Master__r.Level2_Code__c,
|
Parent.ParentId, //医院Id
|
Parent.Parent.RecordTypeId //记录类型
|
FROM Account
|
WHERE(Id IN: accountIdList OR Parent.ParentId IN: accountIdList)
|
AND RecordTypeId != '01210000000QjCNAA0'
|
AND(Is_Active_Formula__c = '有效'
|
OR Is_Active_Formula__c = '无效')
|
ORDER BY Parent.ParentId, ParentId, Id
|
];
|
//数据拼装
|
GeDatas gds = new GeDatas();
|
gds.GeData = new List < GeData > ();
|
iflog.Log__c= iflog.Log__c == null? '':iflog.Log__c;
|
try {
|
// 获取经销商Id
|
Set < Id > agencySet = new Set < Id > ();
|
Map < Id, String > getLicenceEarliestMap = new Map < Id, String > ();
|
Map < Id, String > getAgencyContractLatestMap = new Map < Id, String > ();
|
for (Account acc: accountList) {
|
if ('01210000000Qem1AAC'.equals(acc.RecordTypeId)) {
|
agencySet.add(acc.Id);
|
}
|
}
|
if (agencySet.size() > 0) {
|
//查找 三证资质最早有效期(经销商)
|
getLicenceEarliestMap = getLicenceEarliestDate(agencySet);
|
//查找 最晚合同有效期(契约)(经销商)
|
getAgencyContractLatestMap = getAgencyContractLatestDate(agencySet);
|
}
|
for (Account acc: accountList) {
|
String level1_Code = acc.State_Master__r.Level1_Code__c;
|
String level2_Code = acc.City_Master__r.Level2_Code__c;
|
if (String.isNotBlank(acc.Parent.ParentId)) {
|
level1_Code = acc.Parent.Parent.State_Master__r.Level1_Code__c;
|
level2_Code = acc.Parent.Parent.City_Master__r.Level2_Code__c;
|
}
|
|
|
GeData gd = new GeData();
|
|
gd.ManageCode = acc.Management_Code__c; //管理编码 SFDC的管理编码(医院/科室/经销商)
|
gd.ManageCode2 = ''; //智慧医疗编码 标识为经销商时,本字段不需要传输;SFDC新建医院或科室时本字段值为空;
|
|
gd.Name = acc.Name; //名称
|
gd.Identification = ''; //标识 1:医院;2:科室;3:经销商
|
gd.SalesBusinessDivision = ''; //销售本部(经销商没有)
|
gd.State = String.isBlank(level1_Code) ? '' : level1_Code; //省(文本)
|
gd.City = String.isBlank(level2_Code) ? '' : level2_Code; //市
|
gd.Status = '有效'.equals(acc.Is_Active_Formula__c) ? true : false; //状态
|
|
// 医院
|
gd.Alias1 = ''; //别名1
|
gd.Alias2 = ''; //别名2
|
gd.Abbreviation = ''; //简称 (SFDC需新加字段)
|
gd.Phone = ''; //电话
|
gd.ZIPCode = ''; //邮编
|
gd.Address = ''; //地址
|
gd.OCSMCategory = ''; //OCSM分类
|
gd.HospitalLevel = ''; //政府等级
|
// 科室
|
gd.DepartmentClass = ''; //科室类别
|
gd.HospitalCode = ''; //关联医院
|
|
// 经销商
|
gd.QuolifiedValidityDate = ''; //三证资质最早有效期
|
gd.ContractEndDate = ''; //最晚合同有效期
|
|
|
String manageCode2 = String.isBlank(acc.PlatformCode__c) ? '' : acc.PlatformCode__c; //智慧医疗编码
|
// 医院
|
if ('01210000000QemGAAS'.equals(acc.RecordTypeId)) {
|
iflog.Log__c += '医院 ManageCode [ ' +gd.ManageCode + ' ]\n';
|
|
gd.Identification = '1';
|
gd.SalesBusinessDivision = acc.Salesdepartment_HP__c; //销售本部(医院)
|
gd.Alias1 = String.isBlank(acc.Site) ? '' : acc.Site; //别名1
|
gd.Alias2 = String.isBlank(acc.Alias_Name2__c) ? '' : acc.Alias_Name2__c; //别名2
|
gd.Abbreviation = String.isBlank(acc.Abbreviation__c) ? '' : acc.Abbreviation__c; //简称
|
gd.Phone = String.isBlank(acc.Phone) ? '' : acc.Phone; //电话
|
gd.ZIPCode = String.isBlank(acc.Postal_Code__c) ? '000000' : acc.Postal_Code__c; //邮编
|
gd.Address = String.isBlank(acc.Address__c) ? '' : acc.Address__c; //地址
|
gd.ManageCode2 = manageCode2; //智慧医疗编码
|
gd.OCSMCategory = acc.OCM_Category__c; //OCSM分类(医院)
|
gd.HospitalLevel = acc.Grade__c; //政府等级
|
}
|
|
// 经销商
|
if ('01210000000Qem1AAC'.equals(acc.RecordTypeId)) {
|
iflog.Log__c += '经销商 ManageCode [ ' +gd.ManageCode + ' ]\n';
|
|
gd.Identification = '3';
|
String quolifiedValidityDate = getLicenceEarliestMap.get(acc.Id) == null ? '00000000' : getLicenceEarliestMap.get(acc.Id);
|
gd.QuolifiedValidityDate = quolifiedValidityDate; //三证资质最早有效期
|
String contractEndDate = getAgencyContractLatestMap.get(acc.Id) == null ? '00000000' : getAgencyContractLatestMap.get(acc.Id);
|
gd.ContractEndDate = contractEndDate; //最晚合同有效期
|
}
|
// 科室
|
if ('01210000000QemGAAS'.equals(acc.Parent.Parent.RecordTypeId)) {
|
iflog.Log__c += '科室 ManageCode [ ' +gd.ManageCode + ' ]\n';
|
|
gd.Name = acc.Parent.Name +' ' +acc.Department_Name__c;
|
|
gd.DepartmentClass = ''; //科室类别
|
String departmentClass = acc.Department_RecordType_Name__c;
|
if (String.isNotBlank(departmentClass) && departmentClass.contains('.')) {
|
gd.DepartmentClass = departmentClass.substring(2, departmentClass.length());
|
}
|
gd.Identification = '2';
|
gd.SalesBusinessDivision = acc.Salesdepartment_Dept__c; //销售本部(科室)
|
gd.HospitalCode = acc.Parent.Parent.Management_Code__c; //关联医院
|
gd.ManageCode2 = manageCode2; //智慧医疗编码
|
}
|
|
if (String.isNotBlank(gd.Identification)) {
|
gds.GeData.add(gd);
|
}
|
}
|
|
if (gds.GeData.size() > 0) {
|
me.NumberOfRecord = '' + gds.GeData.size();
|
gds.Monitoring = me;
|
iflog.Log__c += '\nNumberOfRecord=' + gds.GeData.size() + ' ';
|
|
|
NFMUtil.Monitoring Monitoring = new NFMUtil.Monitoring();
|
Monitoring.Tag = gds.Monitoring.Tag;
|
Monitoring.Sender = gds.Monitoring.Sender;
|
Monitoring.Receiver = gds.Monitoring.Receiver;
|
Monitoring.MessageType = gds.Monitoring.MessageType;
|
Monitoring.MessageGroupNumber = gds.Monitoring.MessageGroupNumber;
|
Monitoring.NumberOfRecord = gds.Monitoring.NumberOfRecord;
|
Monitoring.TransmissionDateTime = gds.Monitoring.TransmissionDateTime;
|
Monitoring.Text = '';
|
|
NFM601 nfm601 = new NFM601();
|
NFM601.GeDatas = new GeDatas();
|
NFM601.GeDatas = gds;
|
|
rowData = NFMUtil.makeRowData(Monitoring, LOG_TYPE, nfm601);
|
execute(rowData, iflog);
|
}
|
|
} catch (Exception ex) {
|
// エラーが発生した場合
|
logstr += ex.getMessage();
|
iflog.ErrorLog__c += ex.getMessage() + '\n';
|
iflog.ErrorLog__c += ex.getStackTraceString() + '\n';
|
}
|
if (rowData != null) {
|
upsert rowData;
|
}
|
iflog.Log__c = logstr;
|
upsert iflog;
|
|
}
|
|
/**
|
* 接口发送失败 根据BatchLogId进行手动发送
|
* @Author XHL
|
* @DateTime 2021-07-22
|
* @param rowDataId [BatchLogId]
|
*/
|
public static void ManualExecute(String rowDataId) {
|
List < BatchIF_Log__c > row = [select id, name, MessageGroupNumber__c, retry_cnt__c,
|
RowDataFlg__c, ErrorLog__c, Type__c,
|
Log__c, Log2__c, Log3__c, Log4__c, Log5__c, Log6__c,
|
Log7__c, Log8__c, Log9__c, Log10__c, Log11__c, Log12__c
|
from BatchIF_Log__c
|
where id =: rowDataId
|
];
|
if (row.size() > 0) NFM601Controller.execute(row[0], null);
|
}
|
/**
|
* 逻辑正常执行发送
|
* @Author XHL
|
* @DateTime 2021-07-22
|
* @param rowDataSFDC [BatchLogId]
|
* @param iflog [执行情况记录]
|
*/
|
public static void execute(BatchIF_Log__c rowDataSFDC, BatchIF_Log__c iflog) {
|
Integer batch_retry_max_cnt = Integer.valueOf(System.Label.batch_retry_max_cnt);
|
|
logstr += rowDataSFDC.MessageGroupNumber__c + ' start\n';
|
Boolean needUpdateIflog = false;
|
if (iflog == null) {
|
needUpdateIflog = true;
|
iflog = new BatchIF_Log__c();
|
iflog.Type__c = LOG_TYPE;
|
iflog.MessageGroupNumber__c = rowDataSFDC.MessageGroupNumber__c;
|
iflog.Log__c = logstr;
|
iflog.ErrorLog__c = '';
|
|
} else {
|
needUpdateIflog = true;
|
iflog.Type__c = LOG_TYPE;
|
iflog.MessageGroupNumber__c = rowDataSFDC.MessageGroupNumber__c;
|
logstr = iflog.Log__c;
|
}
|
|
try {
|
String data = NFMUtil.getRowDataStr(rowDataSFDC);
|
System.debug('data--------0>'+data);
|
|
String jsonReplace = JsonReplace(data);
|
if (String.isNotBlank(jsonReplace)) {
|
data = jsonReplace;
|
}
|
System.debug('data--------1>'+data);
|
status = NFMUtil.sendToSapRet(data, NFMUtil.NFM601_ENDPOINT);
|
if ('Accepted'.equals(status)) {
|
logstr += status + '\n';
|
rowDataSFDC.retry_cnt__c = 0;
|
logstr += 'end';
|
} else {
|
// 异常重发
|
rowDataSFDC = NFMUtil.LogAutoSend(rowDataSFDC, null, status);
|
}
|
System.debug('NFM601Log--status->' + status);
|
} catch (Exception ex) {
|
// TODO IOException
|
|
// 异常重发
|
// Callout from triggers are currently not supported.
|
if (!String.valueOf(ex.getMessage()).contains('Callout from triggers')) {
|
logstr += ex.getMessage();
|
iflog.ErrorLog__c += ex.getMessage() + '\n';
|
iflog.ErrorLog__c += ex.getStackTraceString() + '\n';
|
}
|
rowDataSFDC = NFMUtil.LogAutoSend(rowDataSFDC, ex, null);
|
}
|
iflog.Log__c = logstr;
|
if (needUpdateIflog) {
|
upsert iflog;
|
upsert rowDataSFDC;
|
}
|
|
|
}
|
|
//查找 三证资质最早有效期(经销商)
|
public static Map < Id, String > getLicenceEarliestDate(Set < Id > agencySet) {
|
Map < Id, String > result = new Map < Id, String > ();
|
|
List < License_Information__c > getLicenceList = [
|
SELECT Id, ValidFrom__c, LicenseAndAccount__c
|
FROM License_Information__c
|
WHERE LicenseAndAccount__c In: agencySet AND ValidFrom__c != null
|
ORDER BY LicenseAndAccount__c, ValidFrom__c desc
|
];
|
if (getLicenceList.size() > 0) {
|
for (License_Information__c li: getLicenceList) {
|
Id accountId = li.LicenseAndAccount__c;
|
String validFromStr = NFMUtil.formatDate2Str(li.ValidFrom__c);
|
result.put(accountId, validFromStr);
|
}
|
}
|
|
return result;
|
}
|
//查找 最晚合同有效期(契约)
|
public static Map < Id, String > getAgencyContractLatestDate(Set < Id > agencySet) {
|
Map < Id, String > result = new Map < Id, String > ();
|
|
List < Account > getAgencyContractList = [
|
SELECT Id, Name, Contract_End_Date__c, Agent_Ref__c
|
FROM Account
|
WHERE Agent_Ref__c IN: agencySet AND Contract_End_Date__c != null AND RecordTypeId = '01210000000QjCNAA0'
|
ORDER BY Agent_Ref__c, Contract_End_Date__c
|
];
|
if (getAgencyContractList.size() > 0) {
|
for (Account acc: getAgencyContractList) {
|
Id accountId = acc.Agent_Ref__c;
|
String contractEndDateStr = NFMUtil.formatDate2Str(acc.Contract_End_Date__c);
|
result.put(accountId, contractEndDateStr);
|
}
|
}
|
return result;
|
}
|
/**
|
* [因LMS系统timestamp有6分钟时效性,为了可以在系统宕机后,批量发送,用当前时间替换BatchLog日志里的timestamp的值]
|
* @param data [json字符串]
|
* @return [json字符串]
|
*/
|
public static String JsonReplace(String data){
|
|
List<String> jsonList = data.split(',');
|
System.debug('jsonList---->'+jsonList);
|
String jsonStr00 = '';
|
Integer num = 1;
|
String timestamp = String.valueOf(DateTime.now().getTime());
|
for(String str:data.split(',')){
|
if (str.contains('timestamp')) {
|
system.debug('str--->'+str);
|
str = '\"timestamp\"'+':'+'\"'+ timestamp +'\"';
|
}
|
jsonStr00 += str;
|
if (num++ != data.length()) {
|
jsonStr00 += ',';
|
}
|
|
}
|
String result = jsonStr00.substring(0,jsonStr00.length()-1);
|
System.debug('jsonStr00--->'+jsonStr00.substring(0,jsonStr00.length()-1));
|
return result;
|
}
|
}
|