高章伟
2022-02-18 8b5f4c6c281cfa548f92de52c8021e37aa81901e
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
@RestResource(urlMapping='/NFM012/*')
global with sharing class NFM012Rest {
 
    global class DepositRest {
        public Deposit Deposit;
    }
 
    global class Deposit {
        public NFMUtil.Monitoring Monitoring;
        public NFM012Rest.GeneralData[] GeneralData;
    }
 
    global class GeneralData {
        public String EndUserNo;                // DealerNumber
        public String UpdateDate;                // 更新日期
        public Decimal DepositAmount;            // 结余金额
    }
 
    @HttpPost
   global static void execute() {
 
            // 取得接口传输内容
        String strData = RestContext.request.requestBody.toString();
 
        DepositRest drs = (DepositRest) JSON.deserializeStrict(strData, DepositRest.class);
 
        if (drs == null ) {
            return;
        }
        NFMUtil.Monitoring Monitoring = drs.Deposit.Monitoring;
        if (Monitoring == null) {
            return;
        }
        BatchIF_Log__c rowData = NFMUtil.saveRowData(Monitoring, 'NFM012', drs.Deposit.GeneralData);
        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);
        return;
    }
    @future
    global static void executefuture(String rowData_Id) {
        main(rowData_Id);
    }
    global static void main(String rowData_Id) {
        Integer batch_retry_max_cnt = Integer.valueOf(System.Label.batch_retry_max_cnt);
        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 = rowData.MessageGroupNumber__c + ' start\n';
        BatchIF_Log__c iflog = new BatchIF_Log__c();
        iflog.Type__c = 'NFM012';
        iflog.MessageGroupNumber__c = rowData.MessageGroupNumber__c;
        iflog.Log__c = logstr;
        iflog.ErrorLog__c = '';
        insert iflog;
 
        String rowDataStr = NFMUtil.getRowDataStr(rowData);
        List<GeneralData> generalDataList = (List<GeneralData>) JSON.deserialize(rowDataStr, List<GeneralData>.class);
        if (generalDataList == null || generalDataList.size() == 0) {
            return;
        }
 
        Savepoint sp = Database.setSavepoint();
        try {
            // 更新対応配列をセット
            List<Account> accList = new List<Account>();
            Map<String, Account> accUpdateMap = new Map<String, Account>();
            for (GeneralData GeneralData : generalDataList) {
                if (GeneralData.EndUserNo == null || GeneralData.EndUserNo == '') {
                    // 必須項目がない場合、処理と飛ばす
                    iflog.ErrorLog__c += 'EndUserNo is required\n';
                    continue;
                }
 
                // 項目転送のセット
                Account acc = new Account();
                acc.AgentCode_Ext__c = GeneralData.EndUserNo;
                if (accUpdateMap.get(acc.AgentCode_Ext__c) == null) {
                    accList.add(acc);
                    accUpdateMap.put(acc.AgentCode_Ext__c, acc);
                    logstr += GeneralData.EndUserNo + ' ';
                } else {
                    acc = accUpdateMap.get(acc.AgentCode_Ext__c);
                }
                acc.Deposit_Receipt_Completion_Day__c   = NFMUtil.parseStr2Date(GeneralData.UpdateDate);
                acc.Deposit_Receipt_Finished__c         = GeneralData.DepositAmount;
            }
            if (accList.size() > 0) {
                Database.UpsertResult[] srList = Database.upsert(accList, Account.Fields.AgentCode_Ext__c, false);
                // Iterate through each returned result
                for (Integer i = 0; i < srList.size(); i++) {
                    Account acc = accList[i];
                    Database.UpsertResult sr = srList[i];
                    if (sr.isSuccess()) {
                        // Operation was successful, so get the ID of the record that was processed
                        System.debug('Successfully inserted account. Account ID: ' + sr.getId());
                    }
                    else {
                        // Operation failed, so get all errors
                        for(Database.Error err : sr.getErrors()) {
                            //System.debug(err.getStatusCode() + ': ' + err.getMessage());
                            iflog.ErrorLog__c += acc.AgentCode_Ext__c + ', ' + err.getStatusCode() + ': ' + err.getMessage() + '\n';
                        }
                    }
                }
            }
            logstr += '\nend';
            rowData.retry_cnt__c=0;
        } catch(Exception ex) {
            // エラーが発生した場合
            Database.rollback(sp);
            System.debug(Logginglevel.ERROR, 'NFM012_' + rowData.MessageGroupNumber__c + ':' + ex.getMessage());
            System.debug(Logginglevel.ERROR, 'NFM012_' + rowData.MessageGroupNumber__c + ':' + ex.getStackTraceString());
            logstr += '\n' + ex.getMessage();
            iflog.ErrorLog__c = ex.getMessage() + '\n' + ex.getStackTraceString() + '\n' + iflog.ErrorLog__c;
            if (rowData.retry_cnt__c == null) rowData.retry_cnt__c = 0;
            if (rowData.retry_cnt__c < batch_retry_max_cnt){
                 rowData.retry_cnt__c++;
                 LogAutoSendSchedule.assignOneMinute();
            }
            if (rowData.retry_cnt__c >= batch_retry_max_cnt){
                rowData.ErrorLog__c = ex.getMessage() + '\n' + ex.getStackTraceString() + '\n' + rowData.ErrorLog__c+'错误次数已经超过自动收信设定的最大次数,请手动收信';
            }
        }
        update rowData;
        iflog.Log__c = logstr;
        if (iflog.Log__c.length() > 131072) {
            iflog.Log__c = iflog.Log__c.subString(0, 131065) + ' ...';
        }
        if (iflog.ErrorLog__c.length() > 32768) {
            iflog.ErrorLog__c = iflog.ErrorLog__c.subString(0, 32760) + ' ...';
        }
        update iflog;
    }
}