高章伟
2023-03-03 d8dc84a3d56df839895f1c417a4d9cbee763d262
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
public without sharing class NFM612Controller {
 
    private static final String LOG_TYPE = 'NFM612S';
    // private static final String API = '/admin/api/scd/save';
    private static final String API = '/admin/api/repair/save1111111';
    public class NFM612 {
        public Gedatas Gedatas;
    }
    public class Gedatas {
        public applyRepairInfo[] applyRepairInfo;
        public problem[] problem;
    }
    public class applyRepairInfo {
        public String ReportRepairNo;
        public String ReportRepairNo2;
    }
    public class problem {
        public String dateReceiptQuestions; //投诉知悉日(Complaint Aware Date)
        public String ifDeadHurt; //是否有死亡、伤害、感染
        public String problemOccurred; //问题发生时间情况
        public String problemOccurredSelect; //问题发生时间情况 其他
        public String reportAdverseEvents; //医院有没有向政府机关报告不良事件或疑似不良事件
        public String whatProject; //做的是哪个项目
        public String operationOrExaminationName; //手术/检查名称
        public String breakORFallOff; //是否有发生断裂或脱落
        public String useFailProductFinish; //是否用该产品完成了手术/检查
        public String supportingProducts; //配套使用产品
        public String afterFailureInformation; //发现故障后,医院对患者的处理情况
        public String delay15Min; //发现故障现象后,有延误15分钟以上的手术实施的情况发生吗
        public String informationFrom; //信息是从医院的谁那里得到的
        public String failureQInHospital; //在医院,故障发生的频率是多少
        public String delayReportReason; //超时报告的理由
        public String isProductFaultRelated; //是否与这次产品故障相关
    }
    @future(callout = true)
    public static void callout(String iflog_Id, List < String > repairOrderIdList) {
        //BatchIF_Log__c iflog = [Select Id, Name, Log__c, ErrorLog__c from BatchIF_Log__c where Id = :iflog_Id];
        String sql = 'Select Id, Name, Log__c, ErrorLog__c from BatchIF_Log__c where Id = \'' + iflog_Id + '\'';
        List < BatchIF_Log__c > iflogs = DataBase.query(sql);
        if (iflogs == null || iflogs.size() == 0) {
            executefuture(null, repairOrderIdList);
        } else {
            executefuture(iflogs.get(0), repairOrderIdList);
        }
 
    }
 
    public static void executefuture(BatchIF_Log__c iflog, List < String > repairOrderIdList) {
        Datetime nowDT = Datetime.now();
        String nowStr = nowDT.format('yyyyMMddHHmmss');
        if (iflog != null) {
            iflog.ErrorLog__c = '';
        } else {
            iflog = new BatchIF_Log__c();
            iflog.Type__c = LOG_TYPE;
            iflog.ErrorLog__c = '';
            iflog.Log__c = 'callout start \n';
            iflog.MessageGroupNumber__c = nowStr;
        }
        BatchIF_Log__c rowData = null;
        List<RepairSubOrder__c> repSoList = new List<RepairSubOrder__c>();
        repSoList = [SELECT Id,
                            Name,
                            RepairOrderNo__c,
                            DateReceiptQuestions__c,
                            IfDeadHurt__c,
                            ProblemOccurred__c,
                            ProblemOccurredSelect__c,
                            ReportAdverseEvents__c,
                            WhatProject__c,
                            OperationOrExaminationName__c,
                            BreakORFallOff__c,
                            UseFailProductFinish__c,
                            SupportingProducts__c,
                            AfterFailureInformation__c,
                            Delay15Min__c,
                            InformationFrom__c,
                            FailureQInHospital__c,
                            DelayReportReason__c,
                            IsProductFaultRelated__c
                            FROM RepairSubOrder__c WHERE Id IN :repairOrderIdList];
        String logstr = iflog.Log__c + ' ' + 'NumberOfRecord=' + repSoList.size() + '\n';
        try{
            Gedatas geds = new Gedatas();
            geds.applyRepairInfo = new List<applyRepairInfo>();
            geds.problem = new List<problem>();
            List < Id > repSoIdList = new List < Id > ();
            for (RepairSubOrder__c repSo: repSoList) {
                repSoIdList.add(repSo.Id);
            }
            for (RepairSubOrder__c repSo : repSoList) {
                applyRepairInfo info = new applyRepairInfo();
                problem pro = new problem();
                info.ReportRepairNo = repSo.RepairOrderNo__c;
                info.ReportRepairNo2 = repSo.Name;
                pro.dateReceiptQuestions = repSo.DateReceiptQuestions__c;
                pro.ifDeadHurt = repSo.IfDeadHurt__c;
                pro.problemOccurred = repSo.ProblemOccurred__c;
                pro.problemOccurredSelect = repSo.ProblemOccurredSelect__c;
                pro.reportAdverseEvents = repSo.ReportAdverseEvents__c;
                pro.whatProject = repSo.WhatProject__c;
                pro.operationOrExaminationName = repSo.OperationOrExaminationName__c;
                pro.breakORFallOff = repSo.BreakORFallOff__c;
                pro.useFailProductFinish = repSo.UseFailProductFinish__c;
                pro.supportingProducts = repSo.SupportingProducts__c;
                pro.afterFailureInformation = repSo.AfterFailureInformation__c;
                pro.delay15Min = repSo.Delay15Min__c;
                pro.informationFrom = repSo.InformationFrom__c;
                pro.failureQInHospital = repSo.FailureQInHospital__c;
                pro.delayReportReason = repSo.DelayReportReason__c;
                pro.isProductFaultRelated = repSo.IsProductFaultRelated__c;
                geds.applyRepairInfo.add(info);
                geds.problem.add(pro);
 
            }
            System.debug(geds);
            logstr+= 'end';
            if (geds.applyRepairInfo.size() > 0 || geds.problem.size() > 0) {
                NFM612 nfm612 = new NFM612();
                nfm612.Gedatas = geds;
                rowData = NFMUtil.makeRowData(iflog, LOG_TYPE, nfm612);
                execute(rowData,iflog);
            }
        } catch (Exception e) {
            // 发生错误时
            System.debug(Logginglevel.ERROR, LOG_TYPE + iflog.Name + ':' + e.getMessage());
            System.debug(Logginglevel.ERROR, LOG_TYPE + iflog.Name + ':' + e.getStackTraceString());
            logstr += e.getMessage();
            iflog.ErrorLog__c += e.getMessage() + '\n';
            iflog.ErrorLog__c += e.getStackTraceString() + '\n';
            iflog.Log__c = 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) 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);
 
        String logstr = rowDataSFDC.Name + ' start\n';
        if (iflog == null) {
            iflog = new BatchIF_Log__c();
            iflog.Type__c = LOG_TYPE;
            iflog.MessageGroupNumber__c = rowDataSFDC.MessageGroupNumber__c;
            iflog.Log__c = logstr;
            iflog.ErrorLog__c = '';
 
        } else {
            iflog.Type__c = LOG_TYPE;
            iflog.MessageGroupNumber__c = rowDataSFDC.MessageGroupNumber__c;
            logstr = iflog.Log__c;
        }
 
        try {
            String data = NFMUtil.getRowDataStr(rowDataSFDC);
            String status = NFMUtil.sendToAWS(data, API);
            System.debug('NFM612SLog--status->' + status);
 
            if ('OK'.equals(status)) {
                logstr += status + '\n';
                rowDataSFDC.retry_cnt__c = 0;
            } else {
                if (rowDataSFDC.retry_cnt__c == null) rowDataSFDC.retry_cnt__c = 0;
                if (rowDataSFDC.retry_cnt__c < batch_retry_max_cnt) {
                    rowDataSFDC.retry_cnt__c++;
                    // LogAutoSendSchedule.logId = rowDataSFDC.Id;
                    LogAutoSendSchedule.assignOneMinute();
                }
                if (rowDataSFDC.retry_cnt__c >= batch_retry_max_cnt) {
                    rowDataSFDC.ErrorLog__c = 'status:' + status +
                                          '\n错误次数已经超过自动送信设定的最大次数,请手动送信';
                }
            }
 
        } catch (Exception ex) {
            // TODO IOException
            // 错误发生时
            logstr += ex.getMessage();
            iflog.ErrorLog__c += ex.getMessage() + '\n';
            iflog.ErrorLog__c += ex.getStackTraceString() + '\n';
            if(!Test.isRunningTest()){
                // rowDataSFDC = NFMUtil.LogAutoSend(rowDataSFDC, ex, null);    //2022-06-24   zyh   注释:重发逻辑修改
                //2022-06-24   zyh   update   start
                if (rowDataSFDC.retry_cnt__c == null) rowDataSFDC.retry_cnt__c = 0;
                if (rowDataSFDC.retry_cnt__c < batch_retry_max_cnt){
                    rowDataSFDC.retry_cnt__c++;
                    // LogAutoSendSchedule.logId = rowDataSFDC.Id;
                    LogAutoSendSchedule.assignOneMinute();
                }
                if (rowDataSFDC.retry_cnt__c >= batch_retry_max_cnt){
                    rowDataSFDC.ErrorLog__c = ex.getMessage() + '\n' + ex.getStackTraceString() + '\n' + rowDataSFDC.ErrorLog__c+'错误次数已经超过自动送信设定的最大次数,请手动送信';
                }
                //2022-06-24   zyh   update   end
            }
        }
        iflog.Log__c = logstr;
        upsert iflog;
        upsert rowDataSFDC;
    }
}