@RestResource(urlMapping='/NFM403/*')
global with sharing class NFM403Rest {

    //11111111111111111
    // global class GeDatasRest {
    //  public GeDatas GeDatas;
    // }

    global class GeDatas {
        // public NFMUtil.Monitoring Monitoring;
        public GeData[] GeData;
    }

// 对象名  RSA_master_data
    global class GeData {
        public String RSS_CODE;
        public String RSS_CODE_DESC;
        public String RSS_CODE_FULL_DESC;
        public String PRODUCT_LINES;
        public String IS_INTAKE_ESTIMATION;
        public String IS_PAE;
        public String IS_INACTIVE;
        public String REVISION;
        public String COMMENT;
        public String LAST_MODIFIED_DATE; //DateTime
        public String RSS_CODE_PRODUCT_LINES; //主键（唯一）
        //public String PARENT_RSS_CODE;
        //public String PRODUCT_LINE_DESC;
    }



    @HttpPost
    global static void execute() {

        // 取得接口传输内容
        String strData = RestContext.request.requestBody.toString();
        GeDatas ges = (GeDatas) JSON.deserializeStrict(strData, GeDatas.class);

        // // 取得接口传输内容
        // String strData = RestContext.request.requestBody.toString();
        // system.debug('strData等于'+strData);
        // GeDatasRest ges = (GeDatasRest) JSON.deserializeStrict(strData, GeDatasRest.class);

        if (ges == null ) {
            return;
        }

        NFMUtil.Monitoring Monitoring = new NFMUtil.Monitoring();
        Datetime nowDT = Datetime.now();
        String nowStr = nowDT.format('yyyyMMddHHmmss');
        // if (Monitoring == null) {
            Monitoring.Tag='MSGH';
            Monitoring.Sender='SPO';
            Monitoring.Receiver='SFDC';
            Monitoring.MessageType='NFM403';
            Monitoring.MessageGroupNumber=nowStr+ges.GeData.size();
            Monitoring.NumberOfRecord=''+ges.GeData.size();
            Monitoring.TransmissionDateTime=nowStr;
            Monitoring.Text='';
            // return;
        // }

        BatchIF_Log__c rowData = NFMUtil.saveRowData(Monitoring, 'NFM403', ges.GeData);
        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, retry_cnt__c, 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 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 = 'NFM403';
        iflog.MessageGroupNumber__c = rowData.MessageGroupNumber__c;
        iflog.Log__c = logstr;
        iflog.ErrorLog__c = '';
        insert iflog;

        String rowDataStr = NFMUtil.getRowDataStr(rowData);
        List<GeData> geDataList = (List<GeData>) JSON.deserialize(rowDataStr, List<GeData>.class);

        if (geDataList == null || geDataList.size() == 0) {
            return;
        }

        // 传入数据去重
        Map<String,GeData> RSAmasterdataMap=new Map<String,GeData>();
        for (GeData geData : geDataList) {
            RSAmasterdataMap.put(geData.RSS_CODE_PRODUCT_LINES, geData);
        }

        // 数据回滚
        Savepoint sp = Database.setSavepoint();
        
        try {
            // 接收的数据存到数据表 RSA_master_data__c 里
            List<RSA_master_data__c> getDataList=new List<RSA_master_data__c>();

            for (String cOMMENT : RSAmasterdataMap.keySet()) {
                GeData geData = RSAmasterdataMap.get(cOMMENT);

                RSA_master_data__c insertGetDate=new RSA_master_data__c();
                insertGetDate.RSS_CODE_PRODUCT_LINES__c=geData.RSS_CODE_PRODUCT_LINES;
                insertGetDate.COMMENT__C=geData.COMMENT;
                insertGetDate.IS_INACTIVE__C=geData.IS_INACTIVE;
                insertGetDate.IS_PAE__c=geData.IS_PAE;
                insertGetDate.IS_INTAKE_ESTIMATION__C=geData.IS_INTAKE_ESTIMATION;
                insertGetDate.LAST_MODIFIED_DATE__C=Datetime.valueOf(geData.LAST_MODIFIED_DATE);
                insertGetDate.PRODUCT_LINES__C=geData.PRODUCT_LINES;
                insertGetDate.REVISION__C=geData.REVISION;
                insertGetDate.RSS_CODE__C=geData.RSS_CODE;
                insertGetDate.RSS_CODE_DESC__C=geData.RSS_CODE_DESC;
                insertGetDate.RSS_CODE_FULL_DESC__C=geData.RSS_CODE_FULL_DESC;
                //insertGetDate.PARENT_RSS_CODE__C=geData.PARENT_RSS_CODE;
                //insertGetDate.PRODUCT_LINE_DESC__c=geData.PRODUCT_LINE_DESC;
                getDataList.add(insertGetDate);
            }
            // upsert
            if (getDataList.size() > 0) {
                upsert getDataList RSA_master_data__r.RSS_CODE_PRODUCT_LINES__c;
            }
            logstr += '\nend';
            rowData.retry_cnt__c=0;
        } catch(Exception ex) {
            // エラーが発生した場合
            Database.rollback(sp);
            System.debug(Logginglevel.ERROR, 'NFM403_' + rowData.MessageGroupNumber__c + ':' + ex.getMessage());
            System.debug(Logginglevel.ERROR, 'NFM403_' + 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();
            }
            system.debug('retry_cnt__c等于'+rowData.retry_cnt__c);
            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;
    }
}