高章伟
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
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
/*
 *  这个batch的运行是为了给下月所有工作日创建空日报一览
 *  创建空日报条件为:
 *  (1) 职种为 销售推广、 销售市场 或 销售服务 且 职位 为一般 、 高级 或 主管 的用户;
 *   (2)  只就工作日创建空日报。
 *   batch运行参数:
 *  1)如果什么都不输,就创建符合条件的日报
 *  2)如果参数为 1 个string, 则认为其为用户ID,则创建该用户符合条件的日报
 *  3)如果参数为 List<string>, 则认为其为用户ID 的List,则创建这些用户符合条件的日报
 *  4)如果参数为两个Date, 则创建 所有符合条件的用户,以第一个日期开始,第二个日期前一天为结束,创建空日报
 */
 
 
global class createEmptyDailyReportBatch implements Database.Batchable<sObject> , Database.Stateful {
  String userID;
  Date StartDate;
  Date endDate;
  list<String> userIDList;
  global List<String> emailMessages = new List<String>();
  global Integer totalCount = 0; // 总件数
  global Integer failedCount = 0;
    // Boolean ebFlag = false;
  global createEmptyDailyReportBatch() {
    // ebFlag = true;
  }
  //判定只要有参数就是手动执行,生成空日报
  //yuxiaolin 2020/11/4 start
  global createEmptyDailyReportBatch(Integer eb) {
    
  }
  //yuxiaolin 2020/11/4 end
  global createEmptyDailyReportBatch(Date StartDate, Date endDate) {
    this.StartDate = StartDate;
    this.endDate = endDate;
  }
  global createEmptyDailyReportBatch(String userID) {
    this.userID = userID;
  }
  global createEmptyDailyReportBatch(List<String> userIDList) {
    this.userIDList = userIDList;
  }
    global createEmptyDailyReportBatch(List<String> userIDList,Date StartDate, Date endDate) {
    this.userIDList = userIDList;
        this.StartDate = StartDate;
    this.endDate = endDate;
  }
  global Database.QueryLocator start(Database.BatchableContext BC) {
    /*  string query = 'select id from user where IsActive = true and ' +
               '(Job_Category__c = \'销售推广\' or Job_Category__c = \'销售市场\' or Job_Category__c = \'销售服务\') and ' +
               '(Post__c = \'一般\' or Post__c = \'高级\' or Post__c = \'主管\') and ' +
               'ProfileId not in ( \'00e10000000tiVV\', \'00e10000000NawV\', ' +
               ' \'00e10000000tiSh\' , \'00e1000000121A3\'  , \'00e10000000NbA3\' '
               + ' , \'00e10000000NbC9\' , \'00e10000000tk6N\' )  ';
               */
    //WLIG-BUR5Y4 yuxiaolin 2020/10/27 start
    string query = 'select id from user where IsActive = true and ' +
                   '(Job_Category__c = \'销售推广\' or Job_Category__c = \'销售市场\' or Job_Category__c = \'销售服务\') and ' +
                   '((Post__c = \'一般\' or Post__c = \'高级\' or Post__c = \'主管\') or ((Post__c = \'经理\' or Post__c  = \'部长\' or Post__c  = \'副部长\'or Post__c  = \'副经理\') and (Salesdepartment__c = \'5.华东\' or Salesdepartment__c = \'6.华南\'))) and ' +
                   'ProfileId not in ( \'00e10000000tiVV\', \'00e10000000NawV\', ' +
                   ' \'00e10000000tiSh\' , \'00e1000000121A3\'  , \'00e10000000NbA3\' '
                   + ' , \'00e10000000NbC9\' , \'00e10000000tk6N\' )  ';
     //WLIG-BUR5Y4 yuxiaolin 2020/10/27  end 
    if (!System.Test.isrunningTest()) {
      query += ' and id != \'00510000005sEEM\' ';
    }
 
    if (!string.isblank(userID)) {
      query += ' and id = :userID ';
    }
 
    if (userIDList != null) {
      query += ' and id in: userIDList ';
    }
    system.debug('id');
    return Database.getQueryLocator(query);
  }
  global void execute(Database.BatchableContext BC, List<User> userList) {
    date NextfirstDate = Date.today().toStartOfMonth().addMonths(1);
    date Next2firstDate = Date.today().toStartOfMonth().addMonths(2);
    totalCount ++;
    Savepoint sp = Database.setSavepoint();
    try {
      if (StartDate != null && endDate != null) {
        NextfirstDate = StartDate;
        Next2firstDate = endDate;
      }
 
      List<id> UserIdList = new list<ID>();
      for (User tempUser : userList) {
        UserIdList.add(tempUser.id);
      }
      List<Daily_Report__c> existDRList =
          [select id, Daily_Report_Key__c   from Daily_Report__c
           where Reporter__c in: UserIdList and
           Reported_Date__c >= :NextfirstDate and
           Reported_Date__c < : Next2firstDate
          ];
 
      map<String, Daily_Report__c> ExistDRmap = new map<String, Daily_Report__c>();
 
      for (Daily_Report__c tempDR : existDRList) {
        ExistDRmap.put(tempDR.Daily_Report_Key__c
                       , tempDR);
      }
      list<Date> NextMonthWorkDateList = getNextMonthWorkDay(StartDate, endDate);
      List<Daily_Report__c> insertedDRList = new List<Daily_Report__c>();
      for (ID tempID : UserIdList) {
        for (Date tempDate : NextMonthWorkDateList ) {
          if (!ExistDRmap.containsKey( tempDate.format().ReplaceAll('/', '-')
                                       + ('' + tempID).substring(0, 15) )
             ) {
            insertedDRList.add(createDR(tempID, tempDate));
          }
        }
      }
      if (insertedDRList.size() > 0) {
        insert insertedDRList;
      }
      if (System.Test.isrunningTest()) {
        throw new ControllerUtil.myException('test。');
      }
    } catch (Exception e) {
      Database.rollback(sp);
      emailMessages.add(e.getMessage());
      System.debug(emailMessages);
      failedCount += userList.size();
      System.debug(failedCount);
 
    }
 
 
 
  }
  public static List<Date> getNextMonthWorkDay(date NextfirstDate, date Next2firstDate ) {
    List<Date> tempDateList = new List<Date>();
    if (NextfirstDate == null) {
      NextfirstDate = Date.today().toStartOfMonth().addMonths(1);
    } if (Next2firstDate == null) {
      Next2firstDate = Date.today().toStartOfMonth().addMonths(2);
    }
    List<OlympusCalendar__c> workday =
        [
            select Id, Date__c, IsWorkDay__c
            from OlympusCalendar__c
            where Date__c >= :NextfirstDate and
            Date__c < : Next2firstDate
            and IsWorkDay__c = 1
                               order by Date__c];
    for (OlympusCalendar__c tempOlyDate : workday) {
      tempDateList.add(tempOlyDate.Date__c);
    }
 
    return tempDateList;
 
  }
  private Daily_Report__c createDR( id userId, Date reportDate) {
 
    Daily_Report__c report = new Daily_Report__c();
    report.Reporter__c = userId;
    report.Status__c = '作成中';
    report.Daily_Report_Data_Type__c = '通常';
    report.Reported_Date__c = reportDate;
    report.Working_Time_From__c =
        Datetime.newInstance(reportDate.year(),
                             reportDate.month(),
                             reportDate.day(), 8, 45, 0);
    report.Working_Time_To__c =
        Datetime.newInstance(reportDate.year(),
                             reportDate.month(),
                             reportDate.day(),
                             17, 30, 0);
    report.OwnerId = userId;
    return report;
  }
  global void finish(Database.BatchableContext BC) {
    sendFieldEmail();
    // if(!test.isRunningTest() && ebFlag == true){
    //  Database.executebatch(new CreatePassiveTaskBatch(), 10);
    // }
  }
  private void sendFieldEmail() {
    PretechBatchEmailUtil be = new PretechBatchEmailUtil();
    String[] toList = new String[] {UserInfo.getUserEmail()};
    String title = '创建下月空日报失败';
    String[] ccList = new String[] {};
    if(System.Test.isRunningTest()){
      be.successMail('', 1);
    }
    if (emailMessages.size() > 0) {
      be.failedMail(toList, ccList, title,
                    String.join(this.emailMessages, '\n'),
                    totalCount, totalCount - failedCount, failedCount);
      be.send();
    }
        
 
  }
}