global without sharing class AssetTurnoverBatch implements Database.Batchable<sObject> {
	public static Integer FIELDMAX = 62;
    private final List<Id> TEST_ID = null;
    private BatchIF_Log__c iflog;
	
	global AssetTurnoverBatch(List<Id> testId) {
		TEST_ID = testId;
        System.debug('TEST_ID=' + TEST_ID);
        iflog = new BatchIF_Log__c();
        iflog.Type__c = 'PushNotification';
        iflog.Log__c  = 'AssetTurnoverBatch start\n';
        iflog.ErrorLog__c = '';
        insert iflog;
	}
	
	global AssetTurnoverBatch(){
		iflog = new BatchIF_Log__c();
        iflog.Type__c = 'PushNotification';
        iflog.Log__c  = 'AssetTurnoverBatch start\n';
        iflog.ErrorLog__c = '';
        insert iflog;
	}
  /**
    *查询样机借出明细的信息
  */
	global Database.QueryLocator start(Database.BatchableContext BC) {
		SS_Batch_Column_Mapping__c ladMapping = SS_Batch_Column_Mapping__c.getValues('loaner_application_detail__c');
        Set<String> apiTempSet = new Set<String>();
        apiTempSet.add('Id');
        for (Integer i = 1; i <= FIELDMAX; i++) {
            String lpadI = ('00' + i).right(3);
            String fromColumn = 'From_Column_' + lpadI + '__c';
            String apiStr = String.valueOf(ladMapping.get(fromColumn));
            if (String.isBlank(apiStr) == false && apiTempSet.contains(apiStr) == false) {
                apiTempSet.add(apiStr);
            }
        }
        String soql = 'Select ' + String.join(new List<String>(apiTempSet), ',') + ' from ' + ladMapping.Name;
        if (TEST_ID <> null) {
            soql += ' where Id IN: TEST_ID';
        } 
        System.debug('soql=' + soql);
        return Database.getQueryLocator(soql);
	}
  /**
    *样机周转表生成
  */
  global void execute(Database.BatchableContext BC, List<loaner_application_detail__c> ladList) {
		List<loaner_report__c> lrList = new List<loaner_report__c>();
		SS_Batch_Column_Mapping__c ladMapping = SS_Batch_Column_Mapping__c.getValues('loaner_application_detail__c');
   		//将样机借用申请明细的字段的值复制到周转表中。
   		for(loaner_application_detail__c lad : ladList){
   			Boolean insflag = false;
   			loaner_report__c lr = new loaner_report__c();
   			for(Integer i = 1; i <= FIELDMAX; i++){
   				String lpadI = ('00' + i).right(3);
	            String fromColumn = 'From_Column_' + lpadI + '__c';
	            String apiStr = String.valueOf(ladMapping.get(fromColumn));
	            if (String.isBlank(apiStr) == false) {
	                String ssColumn = 'SS_Column_' + lpadI + '__c';
                    String ssApiStr = String.valueOf(ladMapping.get(ssColumn));
            		try{
            			lr.put(ssApiStr, lad.get(apiStr));
            		}catch(Exception e){
            			iflog.ErrorLog__c = 'ERROR ' + String.valueOf(ladMapping.get('SS_TableName__c')) + ' [' + apiStr + '] => [' + ssApiStr + ']' + e.getMessage() + '\n';
            		}
            	}
   			}
   			System.debug(lr);
   			lrList.add(lr);
   		}
     
   		for(loaner_report__c lr : lrList){
   			Integer thisMonth = Date.today().month() == 1 ? 12 : Date.today().month() -1;
   			Integer lronMonth = null;
   			Integer lroutMonth = null;

   			Integer thisYear =  Date.today().month() == 1 ? Date.today().year() -1 : Date.today().year();
   			Integer lronYear = null;
   			Integer lroutYear = null;


   			if(lr.Detail_Received_loaner_Date__c != null){
   				lronMonth = lr.Detail_Received_loaner_Date__c.month();
   				lronYear = lr.Detail_Received_loaner_Date__c.year();
   			}
   			if(lr.Detail_Shipment_Request_Date__c != null){
   				lroutMonth = lr.Detail_Shipment_Request_Date__c.month();
   				lroutYear = lr.Detail_Shipment_Request_Date__c.year();
   			}
   			
   			System.debug('thisYear : ' + thisYear + '\tlronYear : ' + lronYear + '\tlroutYear : ' + lroutYear);
   			System.debug('thisMonth : ' + thisMonth + '\tlronMonth : ' + lronMonth + '\tlroutMonth : ' + lroutMonth);
        //获取本月天数,月份,年份
   			lr.DayOfTheMonth__c = Date.daysInMonth(thisYear, thisMonth);
   			lr.Month__c = thisMonth;
   			lr.Year__c =  String.valueOf(thisYear);
   			lr.StatisticsTime__c = Date.newInstance(thisYear, thisMonth, 1);
   			System.debug('dayInMonth : ' + lr.DayOfTheMonth__c);
   			//判断本月借出天数
   			if(thisMonth == lronMonth && thisYear == lronYear){
   				if(thisMonth != lroutMonth ){
            System.debug('1');
   					lr.loan_days__c = Date.newInstance(thisYear, thisMonth, 1).daysBetween(lr.Detail_Received_loaner_Date__c) + 1;
            lr.OutTime__c = Datetime.newInstance(thisYear, thisMonth, 1, 0, 0, 0);
   				}else{
            System.debug('666');
   					lr.loan_days__c = lr.Detail_Shipment_Request_Date__c.daysBetween(lr.Detail_Received_loaner_Date__c) + 1;
   				}
   			}else if(lronMonth == null){
   				if(thisMonth == lroutMonth && thisYear == lroutYear){
   					lr.loan_days__c = lr.Detail_Shipment_Request_Date__c.daysBetween(Date.newInstance(thisYear, thisMonth, Date.daysInMonth(thisYear, thisMonth))) + 1;
   				  lr.inTime__c = Datetime.newInstance(thisYear,thisMonth+1,1,0,0,0);
          }else if(lroutMonth > thisMonth && thisYear == lroutYear){
   					lr.loan_days__c = 0;
            System.debug('2');
            lr.inTime__c = null;
            lr.OutTime__c = null;
   				}else if(lroutMonth == null){
   					lr.loan_days__c = 0;
            System.debug('3');
            lr.inTime__c = null;
            lr.OutTime__c = null;
   				}else{
   					lr.loan_days__c = lr.DayOfTheMonth__c;
            lr.OutTime__c = Datetime.newInstance(thisYear, thisMonth, 1, 0, 0, 0);
            lr.inTime__c = Datetime.newInstance(thisYear,thisMonth+1,1,0,0,0);
   				}
   			}else{
   				if(lroutMonth == thisMonth && lroutYear == thisYear && lronMonth > thisMonth){
   					lr.loan_days__c = lr.Detail_Shipment_Request_Date__c.daysBetween(Date.newInstance(thisYear, thisMonth, Date.daysInMonth(thisYear, thisMonth))) + 1;
   				  lr.inTime__c = Datetime.newInstance(thisYear, thisMonth+1, 1, 0, 0, 0);
          }else{
            System.debug('4');
   					lr.loan_days__c = 0;
            lr.inTime__c = null;
            lr.OutTime__c = null;
   				}
   			}
   		}

   		System.debug(lrList);
      this.aa();
   		try{
   			insert lrList;
   		}catch(Exception e){
   			System.debug(e);
   		}
	}
	
	global void finish(Database.BatchableContext BC) {
		
	}

	


































































  public void aa(){
    Integer i = 1;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
  }
}