puzhibing
2024-03-06 a2ca8c0889a39ebd83195d5d2ebe8e2ed20b16d5
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
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
package com.dsh.course.service.impl;
 
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dsh.course.entity.*;
import com.dsh.course.feignclient.model.RecordAppoint;
import com.dsh.course.feignclient.other.StoreClient;
import com.dsh.course.feignclient.other.model.Store;
import com.dsh.course.mapper.*;
import com.dsh.course.model.DeductionClassHour;
import com.dsh.course.model.DeductionClassHourList;
import com.dsh.course.service.CourseCounsumService;
import com.dsh.course.service.ICoursePackageOrderStudentService;
import com.dsh.course.service.ICoursePackageSchedulingService;
import com.dsh.course.service.TCoursePackageService;
import com.dsh.course.util.DateTimeHelper;
import com.dsh.course.util.DateUtil;
import com.dsh.course.util.ToolUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
import javax.annotation.Resource;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
 
/**
 * @author zhibing.pu
 * @Date 2023/11/25 14:06
 */
@Service
public class CoursePackageOrderStudentServiceImpl extends ServiceImpl<CoursePackageOrderStudentMapper, CoursePackageOrderStudent> implements ICoursePackageOrderStudentService {
 
 
    @Resource
    private CoursePackageStudentMapper cpsMapper;
 
    @Resource
    private CancelledClassesMapper cacMapper;
 
    @Autowired
    private ICoursePackageSchedulingService coursePackageSchedulingService;
 
    @Autowired
    private CourseCounsumService courseCounsumService;
 
    @Resource
    private TCoursePackageMapper tcpmapper;
 
    @Resource
    private StoreClient stoClient;
 
    @Autowired
    private TCoursePackageService coursePackageService;
 
    @Resource
    private CoursePackageStudentMapper coursePackageStudentMapper;
 
 
 
    @Override
    public List<RecordAppoint> obtainStuClassDetails(Integer stuId, Integer appUserId, Integer pageNum) {
        List<RecordAppoint> recordVoList = new ArrayList<>();
        List<CoursePackageOrderStudent> tCoursePackagePayments = this.baseMapper.selectList(new QueryWrapper<CoursePackageOrderStudent>()
                .eq("studentId", stuId)
                .eq("appUserId", appUserId)
                .eq("status", 1)
                .orderByDesc("insertTime"));
 
 
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), 23, 59, 59);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        List<CoursePackageScheduling> list = coursePackageSchedulingService.list(new QueryWrapper<CoursePackageScheduling>()
                        .eq("appUserId", appUserId)
                        .eq("studentId", stuId)
                        .orderByAsc("classDate")
        );
        List<Long> ids = list.stream().map(CoursePackageScheduling::getId).collect(Collectors.toList());
 
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd");
        SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm");
        if (list.size() > 0) {
            int pageSize = 10; // 每页记录数
            Page<CoursePackageStudent> page = new Page<>(pageNum, pageSize);
            IPage<CoursePackageStudent> coursePackageStudentPage = cpsMapper.selectPage(page, new QueryWrapper<CoursePackageStudent>()
                    .in("coursePackageSchedulingId", ids)
                    .eq("reservationStatus", 1));
            List<CoursePackageStudent> coursePackageStudent1 = coursePackageStudentPage.getRecords();
 
 
            if (ToolUtil.isNotEmpty(coursePackageStudent1) && coursePackageStudent1.size() > 0) {
                TCoursePackage coursePackage = new TCoursePackage();
                Integer coursePackageId = -1;
                for (CoursePackageStudent coursePackageStudent : coursePackageStudent1) {
                    RecordAppoint recordVo = new RecordAppoint();
                    recordVo.setCoursePackageId(coursePackageStudent.getCoursePackageId());
 
                    if (!coursePackageStudent.getCoursePackageId().equals(coursePackageId)) {
                        coursePackage = tcpmapper.selectById(coursePackageStudent.getCoursePackageId());
                        coursePackageId = coursePackageStudent.getCoursePackageId();
                    }
 
                    recordVo.setSid(Arrays.asList(coursePackage.getStoreId()));
                    List<Integer> rid = stoClient.querySiteId(coursePackage.getStoreId());
                    recordVo.setRid(rid);
                    recordVo.setUserId(appUserId);
                    recordVo.setSiteId(coursePackage.getSiteId());
                    List<Integer> ids1 = getIds(coursePackage.getSiteId());
                    recordVo.setIds(ids1);
 
                    recordVo.setCoursePackageName(coursePackage.getName());
                    for (CoursePackageOrderStudent tCoursePackagePayment : tCoursePackagePayments) {
                        if (Objects.equals(coursePackageStudent.getCoursePackageId(), tCoursePackagePayment.getCoursePackageId())) {
                            recordVo.setCourseHours(tCoursePackagePayment.getTotalClassHours());
                        }
                    }
 
 
                    CoursePackageScheduling coursePackageScheduling = coursePackageSchedulingService.getById(coursePackageStudent.getCoursePackageSchedulingId());
                    if (coursePackageScheduling == null) {
                        continue;
                    }
                    String dateString1 = sdf.format(coursePackageScheduling.getClassDate());
                    String dateString2 = sdf.format(coursePackageScheduling.getEndDate());
 
 
                    recordVo.setTimeFrame(dateString1 + "-" + dateString2.substring(11));
 
                    Store store = stoClient.queryStoreById(coursePackage.getStoreId());
                    recordVo.setStoreNameAddr(store.getName() + store.getAddress());
                    recordVo.setCourseStuRecordId(coursePackageStudent.getId());
                    String classWeeks = coursePackage.getClassWeeks();
                    String[] split = classWeeks.split(";");
                    List<String> integerList = Arrays.asList(split);
                    String weekOfDate = DateTimeHelper.getWeekOfDate(new Date());
                    String dat = simpleDateFormat.format(coursePackageScheduling.getClassDate()) + " " + dateString1.substring(11);
                    String ed = simpleDateFormat.format(coursePackageScheduling.getEndDate()) + " " + dateString2.substring(11);
 
                    Date start = null;
                    Date end = null;
                    try {
                        start = format.parse(dat);
                        end = format.parse(ed);
                    } catch (ParseException e) {
                        throw new RuntimeException(e);
                    }
 
                    CancelledClasses cancelledClasses = cacMapper.selectOne(new QueryWrapper<CancelledClasses>()
                            .eq("coursePackageSchedulingId", coursePackageScheduling.getId()).last("limit 1"));
 
 
                    if (new Date().after(start)&&new Date().before(end)){
                        recordVo.setStatus(2);
                    }
                    //待上课
                    if (start.after(new Date())) {
                        recordVo.setStatus(1);
                    }
                    //已取消
                    if (coursePackageScheduling.getStatus() == 4) {
                        recordVo.setStatus(4);
                    }
                    //已请假
                    if (coursePackageStudent.getSignInOrNot() == 2) {
                        recordVo.setStatus(5);
                    }
                    //已完成
                    if (ToolUtil.isNotEmpty(cancelledClasses)) {
                        recordVo.setStatus(3);
                        // 消课 到课状态0 旷课
                        if (coursePackageStudent.getSignInOrNot() == 0) {
                            recordVo.setStatus(6);
                        }
                    }
                    recordVoList.add(recordVo);
                }
 
            } else {
            }
 
        }
 
        return recordVoList;
    }
 
 
 
    public List<Integer> getIds(Integer siteId) {
        HttpRequest httpRequest = HttpRequest.get("https://try.daowepark.com/v7/user_api/general/get_space_area?space_id=" + siteId);
        HttpResponse execute = httpRequest.execute();
        String body = execute.body();
        JSONObject jsonObject = JSONObject.parseObject(body);
        Object data = jsonObject.get("data");
        JSONArray array = JSONArray.parseArray(data.toString());
        List<Integer> ids = new ArrayList<>();
        for (Object o : array) {
            JSONObject jsonObject1 = JSONObject.parseObject(o.toString());
            Object id = jsonObject1.get("id");
            Integer integer = Integer.valueOf(id.toString());
            ids.add(integer);
        }
        return ids;
 
    }
 
 
    /**
     * 扣除学员课时
     * @param deductionClassHourList
     * @return
     */
    @Override
    public DeductionClassHourList deductionClassHour(DeductionClassHourList deductionClassHourList) {
        try {
            List<DeductionClassHour> list = deductionClassHourList.getDeductionClassHourList();
            for (DeductionClassHour deductionClassHour : list) {
                CoursePackageOrderStudent coursePackageOrderStudent = this.getById(deductionClassHour.getId());
                Integer laveClassHours = coursePackageOrderStudent.getLaveClassHours();
                coursePackageOrderStudent.setLaveClassHours(coursePackageOrderStudent.getLaveClassHours() - deductionClassHour.getClassHour());
 
                //计算需要删除几个排课记录
                TCoursePackage coursePackage = coursePackageService.getById(coursePackageOrderStudent.getCoursePackageId());
                Integer codeTime = coursePackage.getCodeTime();
                //未上的排课数据
                List<CoursePackageScheduling> packageSchedulings = coursePackageSchedulingService.list(new QueryWrapper<CoursePackageScheduling>().eq("studentId", coursePackageOrderStudent.getStudentId())
                        .eq("type", 1).eq("coursePackageId", coursePackageOrderStudent.getCoursePackageId()).eq("status", 1).orderByDesc("classDate"));
                //排课使用的总课时
                int classHour = packageSchedulings.size() * codeTime;
                //未排课的课时
                int notClass = laveClassHours - classHour;
 
                //判断是否需要删除排课数据
                if(notClass < deductionClassHour.getClassHour()){
                    int clss = deductionClassHour.getClassHour() - notClass;
                    int n = clss % codeTime;
                    int l = 0;
                    //不整除的情况,需要多删除一节排课,回加差额课时。
                    if(n != 0){
                        n += 1;
                        l = (codeTime * n) - clss;
                    }
                    coursePackageOrderStudent.setLaveClassHours(coursePackageOrderStudent.getLaveClassHours() + l);
 
                    //删除已排的课程
                    List<CoursePackageScheduling> coursePackageSchedulings = packageSchedulings.subList(0, n);
                    List<Long> collect = coursePackageSchedulings.stream().map(CoursePackageScheduling::getId).collect(Collectors.toList());
                    coursePackageSchedulingService.removeByIds(collect);
                    coursePackageStudentMapper.delete(new QueryWrapper<CoursePackageStudent>().in("coursePackageSchedulingId", collect));
 
                    deductionClassHour.setScheduledCourses(n);
                }
 
                this.updateById(coursePackageOrderStudent);
 
                CourseCounsum courseCounsum = new CourseCounsum();
                courseCounsum.setPaymentId(coursePackageOrderStudent.getId());
                courseCounsum.setChangeType(0);
                courseCounsum.setNum(deductionClassHour.getClassHour());
                courseCounsum.setInsertTime(new Date());
                courseCounsum.setReason("社区世界杯报名");
                courseCounsum.setAppUserId(coursePackageOrderStudent.getAppUserId());
                courseCounsumService.save(courseCounsum);
            }
            return deductionClassHourList;
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
 
 
    /**
     * 回退课时和回退排课数据
     * @param deductionClassHourList
     */
    @Override
    public void backspaceClassHour(DeductionClassHourList deductionClassHourList) {
        List<DeductionClassHour> list = deductionClassHourList.getDeductionClassHourList();
        for (DeductionClassHour deductionClassHour : list) {
            CoursePackageOrderStudent coursePackageOrderStudent = this.getById(deductionClassHour.getId());
            Integer laveClassHours = coursePackageOrderStudent.getLaveClassHours();
            coursePackageOrderStudent.setLaveClassHours(coursePackageOrderStudent.getLaveClassHours() + deductionClassHour.getClassHour());
            this.updateById(coursePackageOrderStudent);
 
            CourseCounsum courseCounsum = new CourseCounsum();
            courseCounsum.setPaymentId(coursePackageOrderStudent.getId());
            courseCounsum.setChangeType(0);
            courseCounsum.setNum(deductionClassHour.getClassHour());
            courseCounsum.setInsertTime(new Date());
            courseCounsum.setReason("社区世界杯报名");
            courseCounsum.setAppUserId(coursePackageOrderStudent.getAppUserId());
            courseCounsumService.save(courseCounsum);
 
 
            //需要排课的节数
            Integer scheduledCourses = deductionClassHour.getScheduledCourses();
            TCoursePackage coursePackage = coursePackageService.getById(coursePackageOrderStudent.getCoursePackageId());
            Integer codeTime = coursePackage.getCodeTime();
            CoursePackageScheduling one = coursePackageSchedulingService.getOne(new QueryWrapper<CoursePackageScheduling>().eq("studentId", coursePackageOrderStudent.getStudentId())
                    .eq("type", 1).eq("coursePackageId", coursePackageOrderStudent.getCoursePackageId()).eq("status", 1)
                    .orderByDesc("classDate").last(" limit 0, 1"));
 
            //上课星期
            String classWeeks = coursePackage.getClassWeeks();
            List<Integer> week = week(classWeeks);
            //新排课的开始日期
            Calendar start = Calendar.getInstance();
            String classStartTime = coursePackage.getClassStartTime();
            String classEndTime = coursePackage.getClassEndTime();
            String[] split = classStartTime.split(",");
            String[] split1 = classEndTime.split(",");
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            //计算剩余课时最大排课节数
            int num = laveClassHours / codeTime;
            //比较除哪个最小以哪个来确定排课节数
            num = num > scheduledCourses ? scheduledCourses : num;
 
            //先检查当前是都还有需要排课的
            if(null != one){
                Date classDate = one.getClassDate();
 
                Calendar calendar = Calendar.getInstance();
                calendar.setTime(classDate);
                String s = sdf.format(calendar.getTime());
 
                for (int j = 0; j < split.length; j++) {
                    Date parse = null;
                    Date parse1 = null;
                    try {
                        parse = format.parse(s + " " + split[j]);
                        parse1 = format.parse(s + " " + split1[j]);
                    } catch (ParseException e) {
                        throw new RuntimeException(e);
                    }
                    if(classDate.getTime() <= parse.getTime()){
                        continue;
                    }
 
                    //开始组装排课数据
                    CoursePackageScheduling packageScheduling = new CoursePackageScheduling();
                    packageScheduling.setType(1);
                    packageScheduling.setAppUserId(coursePackageOrderStudent.getAppUserId());
                    packageScheduling.setStudentId(coursePackageOrderStudent.getStudentId());
                    packageScheduling.setCoursePackageId(coursePackage.getId());
                    packageScheduling.setClassDate(parse);
                    packageScheduling.setEndDate(parse1);
                    packageScheduling.setStatus(1);
                    coursePackageSchedulingService.save(packageScheduling);
 
                    CoursePackageStudent student1 = new CoursePackageStudent();
                    student1.setAppUserId(coursePackageOrderStudent.getAppUserId());
                    student1.setStudentId(coursePackageOrderStudent.getStudentId());
                    student1.setCoursePackageId(coursePackage.getId());
                    student1.setCoursePackagePaymentId(coursePackageOrderStudent.getId());
                    student1.setCoursePackageSchedulingId(packageScheduling.getId());
                    student1.setSignInOrNot(1);
                    student1.setReservationStatus(1);
                    student1.setInsertTime(new Date());
                    student1.setType(1);
                    coursePackageStudentMapper.insert(student1);
 
                    num--;
                    if(num == 0){
                        return;
                    }
                }
 
                calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) + 1);
                start = calendar;
            }
 
            if(num == 0){
                return;
            }
 
            //继续排后面的数据
            while (true) {
                String s = sdf.format(start.getTime());
 
                //判断当天是否在排课星期内
                int day = start.get(Calendar.DAY_OF_WEEK);
                day = day - 1 == 0 ? 7 : day - 1;
                if (!week.contains(day)) {
                    start.set(Calendar.DAY_OF_YEAR, start.get(Calendar.DAY_OF_YEAR) + 1);
                    continue;
                }
 
                for (int j = 0; j < split.length; j++) {
                    //开始组装排课数据
                    CoursePackageScheduling packageScheduling = new CoursePackageScheduling();
                    packageScheduling.setType(1);
                    packageScheduling.setAppUserId(coursePackageOrderStudent.getAppUserId());
                    packageScheduling.setStudentId(coursePackageOrderStudent.getStudentId());
                    packageScheduling.setCoursePackageId(coursePackage.getId());
                    try {
                        Date parse = format.parse(s + " " + split[j]);
                        Date parse1 = format.parse(s + " " + split1[j]);
                        packageScheduling.setClassDate(parse);
                        packageScheduling.setEndDate(parse1);
                        packageScheduling.setStatus(1);
                        coursePackageSchedulingService.save(packageScheduling);
 
                        CoursePackageStudent student1 = new CoursePackageStudent();
                        student1.setAppUserId(coursePackageOrderStudent.getAppUserId());
                        student1.setStudentId(coursePackageOrderStudent.getStudentId());
                        student1.setCoursePackageId(coursePackage.getId());
                        student1.setCoursePackagePaymentId(coursePackageOrderStudent.getId());
                        student1.setCoursePackageSchedulingId(packageScheduling.getId());
                        student1.setSignInOrNot(1);
                        student1.setReservationStatus(1);
                        student1.setInsertTime(new Date());
                        student1.setType(1);
                        coursePackageStudentMapper.insert(student1);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    num--;
                    if(num == 0){
                        return;
                    }
                }
                start.set(Calendar.DAY_OF_YEAR, start.get(Calendar.DAY_OF_YEAR) + 1);
            }
 
        }
 
    }
 
 
 
    private List<Integer> week(String week) {
        String[] split = week.split(";");
        ArrayList<Integer> integers = new ArrayList<>();
        for (String s : split) {
            switch (s) {
                case "周一":
                    integers.add(1);
                    break;
                case "周二":
                    integers.add(2);
                    break;
                case "周三":
                    integers.add(3);
                    break;
                case "周四":
                    integers.add(4);
                    break;
                case "周五":
                    integers.add(5);
                    break;
                case "周六":
                    integers.add(6);
                    break;
                case "周日":
                    integers.add(7);
                    break;
            }
        }
        return integers;
    }
}