Browse Source

Merge branch 'master' of http://git.dayaedu.com/yonge/mec

zouxuan 5 năm trước cách đây
mục cha
commit
9ada713dd2
24 tập tin đã thay đổi với 1292 bổ sung56 xóa
  1. 10 1
      mec-education/src/main/java/com/ym/mec/education/base/BaseResponse.java
  2. 44 0
      mec-education/src/main/java/com/ym/mec/education/controller/ClassGroupController.java
  3. 5 26
      mec-education/src/main/java/com/ym/mec/education/controller/MusicGroupController.java
  4. 11 10
      mec-education/src/main/java/com/ym/mec/education/controller/StudentAttendanceController.java
  5. 36 0
      mec-education/src/main/java/com/ym/mec/education/enums/ClassGroupStudentStatusEnum.java
  6. 36 0
      mec-education/src/main/java/com/ym/mec/education/enums/ClassGroupTypeEnum.java
  7. 1 1
      mec-education/src/main/java/com/ym/mec/education/mapper/ClassGroupStudentMapperMapper.java
  8. 1 1
      mec-education/src/main/java/com/ym/mec/education/mapper/CourseScheduleMapper.java
  9. 18 0
      mec-education/src/main/java/com/ym/mec/education/req/ClassGroupReq.java
  10. 0 1
      mec-education/src/main/java/com/ym/mec/education/req/MusicGroupReq.java
  11. 15 0
      mec-education/src/main/java/com/ym/mec/education/resp/ClassGroupResp.java
  12. 27 4
      mec-education/src/main/java/com/ym/mec/education/resp/MusicGroupResp.java
  13. 37 0
      mec-education/src/main/java/com/ym/mec/education/resp/StudentAttendanceResq.java
  14. 4 0
      mec-education/src/main/java/com/ym/mec/education/service/IClassGroupService.java
  15. 1 1
      mec-education/src/main/java/com/ym/mec/education/service/IClassGroupStudentMapperService.java
  16. 1 1
      mec-education/src/main/java/com/ym/mec/education/service/ICourseScheduleService.java
  17. 2 1
      mec-education/src/main/java/com/ym/mec/education/service/IMusicGroupService.java
  18. 4 0
      mec-education/src/main/java/com/ym/mec/education/service/IStudentAttendanceService.java
  19. 44 0
      mec-education/src/main/java/com/ym/mec/education/service/impl/ClassGroupServiceImpl.java
  20. 1 1
      mec-education/src/main/java/com/ym/mec/education/service/impl/ClassGroupStudentMapperServiceImpl.java
  21. 1 1
      mec-education/src/main/java/com/ym/mec/education/service/impl/CourseScheduleServiceImpl.java
  22. 57 6
      mec-education/src/main/java/com/ym/mec/education/service/impl/MusicGroupServiceImpl.java
  23. 62 1
      mec-education/src/main/java/com/ym/mec/education/service/impl/StudentAttendanceServiceImpl.java
  24. 874 0
      mec-util/src/main/java/com/ym/mec/util/date/DateUtil.java

+ 10 - 1
mec-education/src/main/java/com/ym/mec/education/base/BaseResponse.java

@@ -1,5 +1,6 @@
 package com.ym.mec.education.base;
 
+import com.ym.mec.education.enums.ReturnCodeEnum;
 import javax.persistence.MappedSuperclass;
 import java.io.Serializable;
 
@@ -28,4 +29,12 @@ public class BaseResponse<T> extends Response implements Serializable {
     public String toString() {
         return "BaseResponse(super=" + super.toString() + ", dataInfo=" + this.getDataInfo() + ")";
     }
-}
+
+    public static BaseResponse success(Object dataInfo) {
+        BaseResponse baseResponse = new BaseResponse<>();
+        baseResponse.setReturnCode(ReturnCodeEnum.CODE_200.getCode());
+        baseResponse.setMessage(ReturnCodeEnum.CODE_200.getValue());
+        baseResponse.setDataInfo(dataInfo);
+        return baseResponse;
+    }
+}

+ 44 - 0
mec-education/src/main/java/com/ym/mec/education/controller/ClassGroupController.java

@@ -0,0 +1,44 @@
+package com.ym.mec.education.controller;
+
+import com.ym.mec.education.base.BaseResponse;
+import com.ym.mec.education.enums.ReturnCodeEnum;
+import com.ym.mec.education.req.ClassGroupReq;
+import com.ym.mec.education.service.IClassGroupService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Objects;
+
+/**
+ * @program: mec
+ * @description: 班级
+ * @author: xw
+ * @create: 2019-09-26 14:03
+ */
+@RestController
+@RequestMapping("api/ClassGroup")
+@Api(tags = "班级")
+@Slf4j
+public class ClassGroupController {
+
+    @Autowired
+    private IClassGroupService classGroupService;
+
+    @PostMapping("/info")
+    @ApiOperation("班级详情")
+    public BaseResponse getInfo(@RequestBody ClassGroupReq classGroupReq) {
+        if (Objects.nonNull(classGroupReq.getClassGroupId())) {
+            BaseResponse baseResponse = new BaseResponse();
+            baseResponse.setReturnCode(ReturnCodeEnum.CODE_206.getCode());
+            baseResponse.setMessage(ReturnCodeEnum.CODE_206.getValue());
+            return baseResponse;
+        }
+        return classGroupService.getInfo(classGroupReq);
+    }
+}

+ 5 - 26
mec-education/src/main/java/com/ym/mec/education/controller/MusicGroupController.java

@@ -1,34 +1,16 @@
 package com.ym.mec.education.controller;
 
-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.google.common.collect.Lists;
 import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
 import com.ym.mec.education.base.BaseResponse;
 import com.ym.mec.education.base.PageResponse;
-import com.ym.mec.education.entity.ClassGroup;
-import com.ym.mec.education.entity.ClassGroupTeacherMapper;
-import com.ym.mec.education.entity.CourseScheduleTeacherSalary;
-import com.ym.mec.education.entity.MusicGroup;
 import com.ym.mec.education.enums.ReturnCodeEnum;
+import com.ym.mec.education.req.ClassGroupReq;
 import com.ym.mec.education.req.MusicGroupReq;
-import com.ym.mec.education.resp.MusicGroupResp;
-import com.ym.mec.education.service.IClassGroupService;
-import com.ym.mec.education.service.IClassGroupTeacherMapperService;
-import com.ym.mec.education.service.ICourseScheduleTeacherSalaryService;
 import com.ym.mec.education.service.IMusicGroupService;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
 
 /**
  * @author : chengp
@@ -75,7 +57,7 @@ public class MusicGroupController {
      * @return
      */
     @GetMapping(value = "/groupDetail")
-    public BaseResponse groupDetail(@RequestBody Integer groupId) {
+    public BaseResponse groupDetail(@RequestParam("groupId") Integer groupId) {
 
         BaseResponse baseResponse = new BaseResponse();
         if (groupId == null) {
@@ -87,13 +69,10 @@ public class MusicGroupController {
         return musicGroupService.groupDetail(groupId);
 
     }
-    @GetMapping(value = "/classGroupList")
-    public PageResponse classGroupList(@RequestBody Integer groupId){
-
-
-
+    @PostMapping(value = "/classGroupList")
+    public PageResponse classGroupList(@RequestBody ClassGroupReq req){
 
-        return null;
+        return musicGroupService.classGroupList(req);
 
     }
 

+ 11 - 10
mec-education/src/main/java/com/ym/mec/education/controller/StudentAttendanceController.java

@@ -1,8 +1,14 @@
 package com.ym.mec.education.controller;
 
+import com.ym.mec.education.base.PageResponse;
+import com.ym.mec.education.req.StudentAttendanceReq;
 import com.ym.mec.education.service.IStudentAttendanceService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
@@ -14,22 +20,17 @@ import org.springframework.web.bind.annotation.RestController;
  */
 @RestController
 @RequestMapping("api/studentAttendance")
+@Api(tags = "学生考勤")
 @Slf4j
 public class StudentAttendanceController {
 
     @Autowired
     private IStudentAttendanceService studentAttendanceService;
 
-    /*@PostMapping("/page")
+    @PostMapping("/page")
+    @ApiOperation("点名记录列表")
     public PageResponse page(@RequestBody StudentAttendanceReq studentAttendanceReq) {
-        Page<StudentAttendance> page = new Page(studentAttendanceReq.getPageNo(), studentAttendanceReq.getPageSize());
-        QueryWrapper<StudentAttendance> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(Objects.nonNull(studentAttendanceReq.getMusicGroupId()),
-                StudentAttendance::getMusicGroupId, studentAttendanceReq.getMusicGroupId())
-                .eq(Objects.nonNull(studentAttendanceReq.getClassGroupId()),
-                        StudentAttendance::getClassGroupId, studentAttendanceReq.getClassGroupId());
-        IPage<StudentAttendance> pageResult = studentAttendanceService.page(page, queryWrapper);
-        return PageResponse.success(pageResult);
-    }*/
+        return studentAttendanceService.getPage(studentAttendanceReq);
+    }
 
 }

+ 36 - 0
mec-education/src/main/java/com/ym/mec/education/enums/ClassGroupStudentStatusEnum.java

@@ -0,0 +1,36 @@
+package com.ym.mec.education.enums;
+
+import com.ym.mec.common.enums.BaseEnum;
+
+/**
+ * 班级类型(普通班级、合奏班级)
+ */
+public enum ClassGroupStudentStatusEnum implements BaseEnum<String, ClassGroupStudentStatusEnum> {
+	NORMAL("NORMAL", "在读"), LEAVE("LEAVE", "请假"), QUIT("QUIT", "退学");
+
+	private String code;
+
+	private String msg;
+
+	ClassGroupStudentStatusEnum(String code, String msg) {
+		this.code = code;
+		this.msg = msg;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+
+	public String getMsg() {
+		return msg;
+	}
+
+	public void setMsg(String msg) {
+		this.msg = msg;
+	}
+
+	@Override
+	public String getCode() {
+		return this.code;
+	}
+}

+ 36 - 0
mec-education/src/main/java/com/ym/mec/education/enums/ClassGroupTypeEnum.java

@@ -0,0 +1,36 @@
+package com.ym.mec.education.enums;
+
+import com.ym.mec.common.enums.BaseEnum;
+
+/**
+ * 班级类型
+ */
+public enum ClassGroupTypeEnum implements BaseEnum<String, ClassGroupTypeEnum> {
+	NORMAL("NORMAL", "普通班级"), MIX("MIX", "合奏班级"), HIGH("HIGH", "提高班"), VIP("VIP", "vip课"), DEMO("demo", "试听课");
+
+	private String code;
+
+	private String msg;
+
+	ClassGroupTypeEnum(String code, String msg) {
+		this.code = code;
+		this.msg = msg;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+
+	public String getMsg() {
+		return msg;
+	}
+
+	public void setMsg(String msg) {
+		this.msg = msg;
+	}
+
+	@Override
+	public String getCode() {
+		return this.code;
+	}
+}

+ 1 - 1
mec-education/src/main/java/com/ym/mec/education/mapper/ClassGroupStudentMapperMapper.java

@@ -1,6 +1,6 @@
 package com.ym.mec.education.mapper;
 
-import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ym.mec.education.entity.ClassGroupStudentMapper;
 
 /**

+ 1 - 1
mec-education/src/main/java/com/ym/mec/education/mapper/CourseScheduleMapper.java

@@ -1,7 +1,7 @@
 package com.ym.mec.education.mapper;
 
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ym.mec.education.entity.CourseSchedule;
-import com.baomidou.mybatisplus.mapper.BaseMapper;
 
 /**
  * <p>

+ 18 - 0
mec-education/src/main/java/com/ym/mec/education/req/ClassGroupReq.java

@@ -0,0 +1,18 @@
+package com.ym.mec.education.req;
+
+import com.ym.mec.education.base.BaseQuery;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author : chengp
+ * @version V1.0
+ * @Description: TODO
+ * @date Date : 2019年09月26日 15:43
+ */
+@Data
+@ApiModel(description = "班级入参")
+public class ClassGroupReq extends BaseQuery implements Serializable {
+    private Integer groupId;
+}

+ 0 - 1
mec-education/src/main/java/com/ym/mec/education/req/MusicGroupReq.java

@@ -2,7 +2,6 @@ package com.ym.mec.education.req;
 
 import com.ym.mec.education.base.BaseQuery;
 import lombok.Data;
-import java.io.Serializable;
 
 /**
  * @version V1.0

+ 15 - 0
mec-education/src/main/java/com/ym/mec/education/resp/ClassGroupResp.java

@@ -1,5 +1,7 @@
 package com.ym.mec.education.resp;
 
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.ToString;
 
@@ -16,6 +18,7 @@ import java.util.List;
 
 @Data
 @ToString
+@ApiModel(description = "班级出参")
 public class ClassGroupResp implements Serializable {
     private Integer id;
     private Integer musicGroupId;
@@ -59,4 +62,16 @@ public class ClassGroupResp implements Serializable {
 
     private List<String> secdTehNameList;
 
+    @ApiModelProperty(value = "授课老师",required = true)
+    private String teacher;
+
+    @ApiModelProperty(value = "授课老师",required = true)
+    private String assistant;
+
+    @ApiModelProperty(value = "课程进度",required = true)
+    private String courseProgress;
+
+    @ApiModelProperty(value = "班级名称",required = true)
+    private String classGroupName;
+
 }

+ 27 - 4
mec-education/src/main/java/com/ym/mec/education/resp/MusicGroupResp.java

@@ -93,12 +93,35 @@ public class MusicGroupResp implements Serializable {
      */
     private Date parentMeetingTime;
 
-    private Integer studentNum;
+    /**
+     * 学生数
+     */
+    private Integer studentNum = 0 ;
+
+    /**
+     * 老师数量
+     */
+    private Integer teacherNum = 0;
 
-    private Integer teacherNum;
 
-    private BigDecimal payments;
+    /**
+     * 合排
+     */
+    private Integer mergeClassNum = 0;
 
-    private BigDecimal income;
+    /**
+     * 单技能
+     */
+    private Integer unitClassNum = 0;
+
+    /**
+     * 在读
+     */
+    private Integer liveStudNum = 0;
+
+    /**
+     * 退学
+     */
+    private Integer delStudNum = 0;
 
 }

+ 37 - 0
mec-education/src/main/java/com/ym/mec/education/resp/StudentAttendanceResq.java

@@ -0,0 +1,37 @@
+package com.ym.mec.education.resp;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @program: mec
+ * @description: 考勤出参
+ * @author: xw
+ * @create: 2019-09-26 15:24
+ */
+@Data
+@ApiModel(description = "考勤出参")
+@Accessors(chain = true)
+public class StudentAttendanceResq implements Serializable {
+
+    @ApiModelProperty(value = "上课日期",required = true)
+    @DateTimeFormat(pattern = "MM月dd日")
+    private Date classDate;
+
+    @ApiModelProperty(value = "上课时间",required = true)
+    private String classTime;
+
+    @ApiModelProperty(value = "班级名称",required = true)
+    private String classGroupName;
+
+    @ApiModelProperty(value = "到课比",required = true)
+    private String attendanceRate;
+
+    @ApiModelProperty(value = "请假人数",required = true)
+    private Integer leaveNum;
+}

+ 4 - 0
mec-education/src/main/java/com/ym/mec/education/service/IClassGroupService.java

@@ -1,7 +1,10 @@
 package com.ym.mec.education.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ym.mec.education.base.BaseResponse;
 import com.ym.mec.education.entity.ClassGroup;
+import com.ym.mec.education.req.ClassGroupReq;
+import com.ym.mec.education.resp.ClassGroupResp;
 
 /**
  * <p>
@@ -13,4 +16,5 @@ import com.ym.mec.education.entity.ClassGroup;
  */
 public interface IClassGroupService extends IService<ClassGroup> {
 
+    BaseResponse<ClassGroupResp> getInfo(ClassGroupReq classGroupReq);
 }

+ 1 - 1
mec-education/src/main/java/com/ym/mec/education/service/IClassGroupStudentMapperService.java

@@ -1,6 +1,6 @@
 package com.ym.mec.education.service;
 
-import com.baomidou.mybatisplus.service.IService;
+import com.baomidou.mybatisplus.extension.service.IService;
 import com.ym.mec.education.entity.ClassGroupStudentMapper;
 
 /**

+ 1 - 1
mec-education/src/main/java/com/ym/mec/education/service/ICourseScheduleService.java

@@ -1,7 +1,7 @@
 package com.ym.mec.education.service;
 
+import com.baomidou.mybatisplus.extension.service.IService;
 import com.ym.mec.education.entity.CourseSchedule;
-import com.baomidou.mybatisplus.service.IService;
 
 /**
  * <p>

+ 2 - 1
mec-education/src/main/java/com/ym/mec/education/service/IMusicGroupService.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.ym.mec.education.base.BaseResponse;
 import com.ym.mec.education.base.PageResponse;
 import com.ym.mec.education.entity.MusicGroup;
+import com.ym.mec.education.req.ClassGroupReq;
 import com.ym.mec.education.req.MusicGroupReq;
 
 /**
@@ -21,5 +22,5 @@ public interface IMusicGroupService extends IService<MusicGroup> {
 
     BaseResponse groupDetail(Integer groupId);
 
-    PageResponse classGroupList(Integer groupId);
+    PageResponse classGroupList(ClassGroupReq req);
 }

+ 4 - 0
mec-education/src/main/java/com/ym/mec/education/service/IStudentAttendanceService.java

@@ -1,7 +1,9 @@
 package com.ym.mec.education.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ym.mec.education.base.PageResponse;
 import com.ym.mec.education.entity.StudentAttendance;
+import com.ym.mec.education.req.StudentAttendanceReq;
 
 /**
  * <p>
@@ -13,4 +15,6 @@ import com.ym.mec.education.entity.StudentAttendance;
  */
 public interface IStudentAttendanceService extends IService<StudentAttendance> {
 
+    PageResponse getPage(StudentAttendanceReq studentAttendanceReq);
+
 }

+ 44 - 0
mec-education/src/main/java/com/ym/mec/education/service/impl/ClassGroupServiceImpl.java

@@ -1,10 +1,23 @@
 package com.ym.mec.education.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ym.mec.education.base.BaseResponse;
 import com.ym.mec.education.entity.ClassGroup;
+import com.ym.mec.education.entity.ClassGroupTeacherMapper;
+import com.ym.mec.education.enums.ReturnCodeEnum;
 import com.ym.mec.education.mapper.ClassGroupMapper;
+import com.ym.mec.education.req.ClassGroupReq;
+import com.ym.mec.education.resp.ClassGroupResp;
 import com.ym.mec.education.service.IClassGroupService;
+import com.ym.mec.education.service.IClassGroupTeacherMapperService;
+import com.ym.mec.education.service.ISysUserService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+import java.util.Objects;
 
 /**
  * <p>
@@ -17,4 +30,35 @@ import org.springframework.stereotype.Service;
 @Service
 public class ClassGroupServiceImpl extends ServiceImpl<ClassGroupMapper, ClassGroup> implements IClassGroupService {
 
+    @Autowired
+    private IClassGroupTeacherMapperService classGroupTeacherMapperService;
+    @Autowired
+    private ISysUserService userService;
+
+    @Override
+    public BaseResponse<ClassGroupResp> getInfo(ClassGroupReq classGroupReq) {
+        BaseResponse<ClassGroupResp> baseResponse = new BaseResponse<>();
+        ClassGroup classGroup = getById(classGroupReq.getClassGroupId());
+        if (Objects.isNull(classGroup)) {
+            baseResponse.setReturnCode(ReturnCodeEnum.CODE_207.getCode());
+            baseResponse.setMessage(ReturnCodeEnum.CODE_207.getValue());
+            return baseResponse;
+        }
+        QueryWrapper<ClassGroupTeacherMapper> teacherMapperQueryWrapper = new QueryWrapper<>();
+        teacherMapperQueryWrapper.lambda().eq(true, ClassGroupTeacherMapper::getClassGroupId, classGroupReq.getClassGroupId());
+        ClassGroupResp classGroupResp = new ClassGroupResp();
+        List<ClassGroupTeacherMapper> teacherMapperList = classGroupTeacherMapperService.list(teacherMapperQueryWrapper);
+        if (!CollectionUtils.isEmpty(teacherMapperList)) {
+            teacherMapperList.stream().filter(item -> "TEACHING".equals(item.getTeacherRole())).findFirst().
+                    ifPresent(classGroupTeacherMapper -> classGroupResp.
+                            setTeacher(userService.getById(classGroupTeacherMapper.getUserId()).getUsername()));
+            teacherMapperList.stream().filter(item -> "BISHOP".equals(item.getTeacherRole())).findFirst().
+                    ifPresent(classGroupTeacherMapper -> classGroupResp.
+                            setAssistant(userService.getById(classGroupTeacherMapper.getUserId()).getUsername()));
+        }
+        classGroupResp.setStudentNum(classGroup.getStudentNum());
+        classGroupResp.setCourseProgress(classGroup.getCurrentClassTimes() + "/" + classGroup.getTotalClassTimes());
+        classGroupResp.setClassGroupName(classGroup.getName());
+        return BaseResponse.success(classGroupResp);
+    }
 }

+ 1 - 1
mec-education/src/main/java/com/ym/mec/education/service/impl/ClassGroupStudentMapperServiceImpl.java

@@ -1,6 +1,6 @@
 package com.ym.mec.education.service.impl;
 
-import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ym.mec.education.entity.ClassGroupStudentMapper;
 import com.ym.mec.education.mapper.ClassGroupStudentMapperMapper;
 import com.ym.mec.education.service.IClassGroupStudentMapperService;

+ 1 - 1
mec-education/src/main/java/com/ym/mec/education/service/impl/CourseScheduleServiceImpl.java

@@ -1,9 +1,9 @@
 package com.ym.mec.education.service.impl;
 
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ym.mec.education.entity.CourseSchedule;
 import com.ym.mec.education.mapper.CourseScheduleMapper;
 import com.ym.mec.education.service.ICourseScheduleService;
-import com.baomidou.mybatisplus.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
 
 /**

+ 57 - 6
mec-education/src/main/java/com/ym/mec/education/service/impl/MusicGroupServiceImpl.java

@@ -8,21 +8,25 @@ import com.google.common.collect.Lists;
 import com.ym.mec.education.base.BaseResponse;
 import com.ym.mec.education.base.PageResponse;
 import com.ym.mec.education.entity.*;
+import com.ym.mec.education.enums.ClassGroupStudentStatusEnum;
+import com.ym.mec.education.enums.ClassGroupTypeEnum;
 import com.ym.mec.education.enums.ReturnCodeEnum;
 import com.ym.mec.education.enums.TeachTypeEnum;
 import com.ym.mec.education.mapper.MusicGroupMapper;
+import com.ym.mec.education.req.ClassGroupReq;
 import com.ym.mec.education.req.MusicGroupReq;
 import com.ym.mec.education.resp.ClassGroupResp;
 import com.ym.mec.education.resp.MusicGroupResp;
 import com.ym.mec.education.service.*;
-import io.swagger.models.auth.In;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 /**
@@ -50,11 +54,20 @@ public class MusicGroupServiceImpl extends ServiceImpl<MusicGroupMapper, MusicGr
 
     @Autowired
     private ISysUserService sysUserService;
+
+    @Autowired
+    private IClassGroupStudentMapperService classGroupStudentMapperService;
+
+
     @Override
     public PageResponse groupList(MusicGroupReq req) {
         PageResponse response = new PageResponse();
-        IPage page = new Page();
+        IPage page = new Page(req.getPageNo()==null? 0: req.getPageNo(),req.getPageSize() == null ? 10:req.getPageSize());
         QueryWrapper<MusicGroup> queryWrapper = new QueryWrapper<>();
+        if(req != null && !StringUtils.isEmpty(req.getName())){
+            queryWrapper.eq("name_",req.getName());
+        }
+
         IPage<MusicGroup> queryPage = this.page(page, queryWrapper);
         if (queryPage.getRecords() == null && queryPage.getRecords().isEmpty()) {
             response.setReturnCode(ReturnCodeEnum.CODE_206.getCode());
@@ -125,23 +138,61 @@ public class MusicGroupServiceImpl extends ServiceImpl<MusicGroupMapper, MusicGr
         if (!CollectionUtils.isEmpty(classGroups)) {
             int studNum = classGroups.stream().mapToInt(ClassGroup::getStudentNum).sum();
             musicGroupResp.setStudentNum(studNum);
+
+            Long mergeNum = classGroups.stream().filter(e -> ClassGroupTypeEnum.MIX.getCode().equalsIgnoreCase(e.getType())).count();
+
+            Long unitClassNum = classGroups.stream().filter(e -> ClassGroupTypeEnum.NORMAL.getCode().equalsIgnoreCase(e.getType())).count();
+            musicGroupResp.setMergeClassNum(Optional.ofNullable(mergeNum).orElse(0L).intValue());
+            musicGroupResp.setUnitClassNum(Optional.ofNullable(unitClassNum).orElse(0L).intValue());
+
+
+            List<Integer> classId = classGroups.stream().map(e ->e.getId()).collect(Collectors.toList());
+            QueryWrapper<ClassGroupStudentMapper> queryWrapper2 = new QueryWrapper<>();
+            queryWrapper2.in("class_group_id_", classId);
+
+            List<ClassGroupStudentMapper> classGroupStudentMappers = classGroupStudentMapperService.list(queryWrapper2);
+
+            if(!CollectionUtils.isEmpty(classGroupStudentMappers)){
+
+                Long liveNum = classGroups.stream().filter(e -> ClassGroupStudentStatusEnum.NORMAL.getCode().equalsIgnoreCase(e.getType())).count();
+
+                Long delNum = classGroups.stream().filter(e -> ClassGroupStudentStatusEnum.QUIT.getCode().equalsIgnoreCase(e.getType())).count();
+                musicGroupResp.setLiveStudNum(Optional.ofNullable(liveNum).orElse(0L).intValue());
+                musicGroupResp.setDelStudNum(Optional.ofNullable(delNum).orElse(0L).intValue());
+
+            }
         }
+        //老师
+        SysUser  sysUser1 = sysUserService.getById(musicGroup.getTeamTeacherId());
 
+        SysUser  sysUser2 = sysUserService.getById(musicGroup.getTeamTeacherId());
+        if(sysUser1 != null){
+            musicGroupResp.setTeamTeacherName(sysUser1.getUsername());
+        }
+        if(sysUser2 != null){
+            musicGroupResp.setEduTeacherName(sysUser2.getUsername());
+        }
+        baseResponse.setDataInfo(musicGroupResp);
+        baseResponse.setReturnCode(ReturnCodeEnum.CODE_200.getCode());
+        baseResponse.setMessage(ReturnCodeEnum.CODE_200.getValue());
         return baseResponse;
     }
 
     /**
      * 班级列表
-     * @param groupId
+     * @param
      * @return
      */
     @Override
-    public PageResponse classGroupList(Integer groupId) {
+    public PageResponse classGroupList(ClassGroupReq req) {
 
         PageResponse response = new PageResponse();
-        IPage page = new Page();
+        IPage page = new Page(req.getPageNo()==null? 0: req.getPageNo(),req.getPageSize() == null ? 10:req.getPageSize());
         QueryWrapper<ClassGroup> queryWrapper1 = new QueryWrapper<>();
-        queryWrapper1.eq("music_group_id_", groupId);
+        if(req != null && req.getGroupId() != null){
+            queryWrapper1.eq("music_group_id_", req.getGroupId());
+        }
+
         IPage<ClassGroup> classGroupPage = classGroupService.page(page,queryWrapper1);
         int count = classGroupService.count(queryWrapper1);
         if (classGroupPage.getRecords() == null && classGroupPage.getRecords().isEmpty()) {

+ 62 - 1
mec-education/src/main/java/com/ym/mec/education/service/impl/StudentAttendanceServiceImpl.java

@@ -1,10 +1,25 @@
 package com.ym.mec.education.service.impl;
 
+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.google.common.collect.Lists;
+import com.ym.mec.education.base.PageResponse;
+import com.ym.mec.education.entity.ClassGroup;
+import com.ym.mec.education.entity.CourseSchedule;
 import com.ym.mec.education.entity.StudentAttendance;
 import com.ym.mec.education.mapper.StudentAttendanceMapper;
+import com.ym.mec.education.req.StudentAttendanceReq;
+import com.ym.mec.education.resp.StudentAttendanceResq;
+import com.ym.mec.education.service.IClassGroupService;
+import com.ym.mec.education.service.ICourseScheduleService;
 import com.ym.mec.education.service.IStudentAttendanceService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import java.util.List;
+import java.util.Objects;
 
 /**
  * <p>
@@ -14,7 +29,53 @@ import org.springframework.stereotype.Service;
  * @author lemeng
  * @since 2019-09-25
  */
-@Service
+@Service("iStudentAttendanceService")
 public class StudentAttendanceServiceImpl extends ServiceImpl<StudentAttendanceMapper, StudentAttendance> implements IStudentAttendanceService {
 
+    @Autowired
+    private ICourseScheduleService courseScheduleService;
+    @Autowired
+    private IClassGroupService groupService;
+
+    @Override
+    public PageResponse getPage(StudentAttendanceReq studentAttendanceReq) {
+        Page<StudentAttendance> pageParam = new Page(studentAttendanceReq.getPageNo(), studentAttendanceReq.getPageSize());
+        QueryWrapper<StudentAttendance> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(Objects.nonNull(studentAttendanceReq.getMusicGroupId()),
+                StudentAttendance::getMusicGroupId, studentAttendanceReq.getMusicGroupId())
+                .eq(Objects.nonNull(studentAttendanceReq.getClassGroupId()),
+                        StudentAttendance::getClassGroupId, studentAttendanceReq.getClassGroupId());
+        IPage<StudentAttendance> page = page(pageParam, queryWrapper);
+        IPage<StudentAttendanceResq> pageResult = new Page<>();
+        BeanUtils.copyProperties(page, pageResult);
+        List<StudentAttendanceResq> list = Lists.newArrayList();
+        QueryWrapper<StudentAttendance> leaveWrapper = new QueryWrapper<>();
+        QueryWrapper<StudentAttendance> normalWrapper = new QueryWrapper<>();
+        //总人数
+        Integer totalCount = count();
+        //请假
+        leaveWrapper.lambda().eq(true, StudentAttendance::getMusicGroupId, studentAttendanceReq.getMusicGroupId())
+                .eq(true, StudentAttendance::getClassGroupId, studentAttendanceReq.getClassGroupId())
+                .eq(true, StudentAttendance::getStatus, "LEAVE");
+        Integer leaveCount = count(leaveWrapper);
+        //正常
+        normalWrapper.lambda().eq(true, StudentAttendance::getMusicGroupId, studentAttendanceReq.getMusicGroupId())
+                .eq(true, StudentAttendance::getClassGroupId, studentAttendanceReq.getClassGroupId())
+                .eq(true, StudentAttendance::getStatus, "NORMAL");
+        Integer normalCount = count(normalWrapper);
+        page.getRecords().forEach(item ->{
+            StudentAttendanceResq studentAttendanceResq = new StudentAttendanceResq();
+            QueryWrapper<CourseSchedule> courseScheduleQueryWrapper = new QueryWrapper<>();
+            courseScheduleQueryWrapper.lambda().eq(true, CourseSchedule::getClassGroupId, studentAttendanceReq.getClassGroupId());
+            CourseSchedule courseSchedule = courseScheduleService.getOne(courseScheduleQueryWrapper);
+            ClassGroup classGroup = groupService.getById(studentAttendanceReq.getClassGroupId());
+            studentAttendanceResq.setClassDate(courseSchedule.getClassDate())
+                    .setClassTime(courseSchedule.getStartClassTime() + "-" + courseSchedule.getEndClassTime())
+                    .setClassGroupName(classGroup.getName())
+                    .setLeaveNum(leaveCount).setAttendanceRate(normalCount + "/" + totalCount);
+            list.add(studentAttendanceResq);
+        });
+        pageResult.setRecords(list);
+        return PageResponse.success(pageResult);
+    }
 }

+ 874 - 0
mec-util/src/main/java/com/ym/mec/util/date/DateUtil.java

@@ -0,0 +1,874 @@
+package com.ym.mec.util.date;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.Locale;
+import java.util.TimeZone;
+
+import org.apache.commons.lang.StringUtils;
+
+/**
+ * 与日期、时间操作有关的工具类。
+ * <p>
+ * <strong>注意:某些方法会将输入时间转换成格林威治时间,时区默认为东八区。可以通过方法 <code>DateUtil#setTimeZone</code>改变默认时区。 </strong>
+ * </p>
+ */
+public class DateUtil {
+
+	public static final String DEFAULT_PATTERN = "yyyy-MM-dd";
+
+	/**
+	 * 默认使用的Locale。默认Locale为 US
+	 */
+	public static final Locale DEFAULT_LOCALE = Locale.US;
+	// ~ 静态属性及初始化 /////////////////////////////////////////////
+
+	/** 默认的时区,一般是使用东八区。即比标准的格林威治时间快8个小时。 */
+	public static TimeZone TIME_ZONE = TimeZone.getDefault();
+
+	/**
+	 * ISO8601基本日期格式 yyyyMMdd ,如:20021225 代表2002年12月25日。
+	 */
+	public static final String ISO_DATE_FORMAT = "yyyyMMdd";
+
+	/**
+	 * ISO8601扩展日期格式 yyyy-MM-dd ,如:2002-12-25 代表2002年12月25日。
+	 */
+	public static final String ISO_EXPANDED_DATE_FORMAT = "yyyy-MM-dd";
+
+	/**
+	 * ISO8601基本时间格式 HHmmssSSSzzz ,如:143212333-0500 代表西5区,14点32分12秒333毫秒 24小时制
+	 */
+	public static final String ISO_TIME_FORMAT = "HHmmssSSSzzz";
+
+	/**
+	 * ISO8601基本时间格式 HH:mm:ss,SSSzzz ,如:14:32:12,333-0500 代表西5区,14点32分12秒333毫秒 24小时制
+	 */
+	public static final String ISO_EXPANDED_TIME_FORMAT = "HH:mm:ss,SSSzzz";
+
+	/**
+	 * ISO8601基本日期格式 yyyyMMddTHHmmssSSSzzz ,如:20021225T143212333-0500 代表西5区 2002年12月25日 14点32分12秒333毫秒
+	 */
+	public static final String ISO_DATE_TIME_FORMAT = "yyyyMMdd'T'HHmmssSSSzzz";
+
+	/**
+	 * ISO8601基本日期格式 yyyy-MM-ddTHH:mm:ss,SSSzzz ,如:2002-12-25T14:32:12,333-0500 代表西5区 2002年12月25日 14点32分12秒333毫秒
+	 */
+	public static final String ISO_EXPANDED_DATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss,SSSzzz";
+
+	/**
+	 * 基本时间格式 HHmmss ,如:143212 代表14点32分12秒 24小时制
+	 */
+	public static final String TIME_FORMAT = "HHmmss";
+
+	/**
+	 * 基本时间格式 HH:mm:ss ,如:14:32:12 代表14点32分12秒 24小时制
+	 */
+	public static final String EXPANDED_TIME_FORMAT = "HH:mm:ss";
+
+	/**
+	 * 日期格式 yyyyMMdd HHmmss ,如:20021225 143212 代表 2002年12月25日 14点32分12秒
+	 */
+	public static final String DATE_TIME_FORMAT = "yyyyMMdd HHmmss";
+
+	/**
+	 * 日期格式 yyyy-MM-dd HH:mm:ss ,如:2002-12-25 14:32:12 代表 2002年12月25日 14点32分12秒
+	 */
+	public static final String EXPANDED_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
+
+	/**
+	 * 西方国家的日期格式 MMM dd, yyyy ,如:February 3, 1982 代表1982年2月3日
+	 */
+	public static final String ENGLISH_DATE = "MMM dd, yyyy";
+
+	/**
+	 * 西方国家的时间格式 MMM dd, yyyy H:mm:ss.SSS ,如:February 3, 1982 12:12:12.005 代表1982年2月3日 12点12分12秒5毫秒
+	 */
+	public static final String ENGLISH_DATE_TIME = "MMM dd, yyyy H:mm:ss.SSS";
+
+	/**
+	 * 美国日期格式 yyyy.MM.dd G 'at' HH:mm:ss z ,如:2001.07.04 AD at 12:08:56 PDT 代表2001年7月4日 12点8分56秒
+	 */
+	public static final String US_DATE_TIME_1 = "yyyy.MM.dd G 'at' HH:mm:ss z";
+
+	/**
+	 * 美国日期格式 yyyyy.MMMMM.dd GGG hh:mm aaa ,如:02001.July.04 AD 12:08 PM 代表2001年7月4日 12点8分
+	 */
+	public static final String US_DATE_TIME_2 = "yyyyy.MMMMM.dd GGG hh:mm aaa";
+
+	/**
+	 * 美国日期格式 EEE, d MMM yyyy HH:mm:ss Z ,如:Wed, 4 Jul 2001 12:08:56 -0700 代表2001年7月4日 12点8分56秒 星期三
+	 */
+	public static final String US_DATE_TIME_3 = "EEE, d MMM yyyy HH:mm:ss Z";
+
+	// 第1年1月1日 (格里高利历)
+	public static final int JAN_1_1_JULIAN_DAY = 1721426;
+
+	// 1970年1月1日 (格里高利历)
+	public static final int EPOCH_JULIAN_DAY = 2440588;
+
+	public static final int EPOCH_YEAR = 1970;
+
+	// 一周、一天、一小时、一分钟、一秒,换算成毫秒的全局变量。
+	public static final int ONE_SECOND = 1000;
+
+	public static final int ONE_MINUTE = 60 * ONE_SECOND;
+
+	public static final int ONE_HOUR = 60 * ONE_MINUTE;
+
+	public static final long ONE_DAY = 24 * ONE_HOUR;
+
+	public static final long ONE_WEEK = 7 * ONE_DAY;
+
+	// ~ 方法 ////////////////////////////////////////////////////////////////
+
+	/**
+	 * 设置系统默认的<code>java.util.TimeZone</code>
+	 * 
+	 * @param timeZone <code>java.util.TimeZone</code>
+	 */
+	public static void setTimeZone(TimeZone timeZone) {
+		TIME_ZONE = timeZone;
+	}
+
+	public static Date toDateTime(String isoDateString) {
+		return stringToDate(isoDateString, EXPANDED_DATE_TIME_FORMAT);
+	}
+
+	public static Date toDate(String isoDateString) {
+		return stringToDate(isoDateString, ISO_EXPANDED_DATE_FORMAT);
+	}
+
+	public static Date stringToDate(String isoDateString) {
+		return stringToDate(isoDateString, EXPANDED_DATE_TIME_FORMAT);
+	}
+
+	public static Date stringToDate(String isoDateString, String pattern) {
+		if (StringUtils.isBlank(pattern)) {
+			return null;
+			// throw new IllegalArgumentException("匹配模式不能为空!");
+		}
+
+		return stringToDate(isoDateString, new SimpleDateFormat(pattern));
+	}
+
+	public static Date stringToDate(String isoDateString, SimpleDateFormat simpleDateFormat) {
+		if (StringUtils.isBlank(isoDateString)) {
+			// throw new IllegalArgumentException("日期字符串不能为空!");
+			return null;
+		}
+		try {
+			return simpleDateFormat.parse(isoDateString);
+		} catch (ParseException e) {
+			// throw new RuntimeException(e);
+		}
+		return null;
+	}
+
+	public static String getDateTime(Date date) {
+		return format(date, EXPANDED_DATE_TIME_FORMAT);
+	}
+
+	public static String getDate(Date date) {
+		return format(date, ISO_EXPANDED_DATE_FORMAT);
+	}
+
+	public static String getDATEFORMAT(Date date) {
+		return format(date, ISO_DATE_FORMAT);
+	}
+
+	public static String format(Date date, String pattern) {
+		return format(date, new SimpleDateFormat(pattern));
+	}
+
+	/**
+	 * 将<code>java.util.Date</code>按照给定的模式转换成日期字符串。
+	 * 
+	 * @param date <code>java.util.Date</code>
+	 * @param formatter 给定的模式
+	 * @return 转换后的日期字符串
+	 */
+	public static String getDate(Date date, SimpleDateFormat formatter) {
+		if (date == null || formatter == null) {
+			return null;
+			// throw new RuntimeException("日期和模式不能为空!");
+		}
+		formatter.setTimeZone(TIME_ZONE);
+		return formatter.format(date);
+	}
+
+	/**
+	 * 将<code>java.util.Date</code>按照给定的模式转换成日期字符串。
+	 * 
+	 * @param date <code>java.util.Date</code>
+	 * @param formatter 给定的模式
+	 * @return 转换后的日期字符串
+	 */
+	public static String format(Date date, SimpleDateFormat formatter) {
+		return getDate(date, formatter);
+	}
+
+	// 获取年份
+	public static String getYear(Date date) {
+		return format(date, ISO_EXPANDED_DATE_FORMAT).split("-")[0];
+	}
+
+	// 获取月份
+	public static String getMonth(Date date) {
+		return format(date, ISO_EXPANDED_DATE_FORMAT).split("-")[1];
+	}
+
+	// 获取日期
+	public static String getDay(Date date) {
+		return format(date, ISO_EXPANDED_DATE_FORMAT).split("-")[2];
+	}
+
+	// 获取时分秒
+	public static String getTime(Date date) {
+		return format(date, EXPANDED_DATE_TIME_FORMAT).split(" ")[1];
+	}
+
+	/**
+	 * 确定给定的年份是否为闰年。
+	 * 
+	 * <pre>
+	 * </pre>
+	 * 
+	 * @param date <code>java.util.Date</code>
+	 * @return True 如果是闰年
+	 */
+	public static boolean isLeapYear(Date date) {
+		if (date == null) {
+			throw new RuntimeException("输入日期不能为空!");
+		}
+		GregorianCalendar cal = new GregorianCalendar();
+		cal.setTime(date);
+
+		return cal.isLeapYear(cal.get(Calendar.YEAR));
+	}
+
+	public static int getHour(Date date) {
+		if (date == null) {
+			return -1;
+		}
+
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(date);
+		return calendar.get(Calendar.HOUR_OF_DAY);
+	}
+
+	public static int geMinute(Date date) {
+		if (date == null) {
+			return -1;
+		}
+
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(date);
+		return calendar.get(Calendar.MINUTE);
+	}
+
+	/**
+	 * 根据日历的规则,为给定的日历字段添加或减去指定的时间量。
+	 * 
+	 * @param date <code>java.util.Date</code>
+	 * @param field 给定的日历字段
+	 * @param amount 数量
+	 * @return 运算后的 <code>java.util.Date</code>
+	 */
+	public static Date add(Date date, int field, int amount) {
+		if (date == null) {
+			throw new RuntimeException("日期不能为空!");
+		}
+		Calendar cal = GregorianCalendar.getInstance(TIME_ZONE);
+		cal.setTime(date);
+		cal.add(field, amount);
+
+		return cal.getTime();
+	}
+
+	/**
+	 * 增加或减少指定数量的年份。
+	 * 
+	 * @param date <code>java.util.Date</code>
+	 * @param amount 数量
+	 * @return 运算后的 <code>java.util.Date</code>
+	 */
+	public static Date addYears(Date date, int amount) {
+		return add(date, Calendar.YEAR, amount);
+	}
+
+	/**
+	 * 增加或减少指定数量的月份。
+	 * 
+	 * @param date <code>java.util.Date</code>
+	 * @param amount 数量
+	 * @return 运算后的 <code>java.util.Date</code>
+	 */
+	public static Date addMonths(Date date, int amount) {
+		return add(date, Calendar.MONTH, amount);
+	}
+
+	/**
+	 * 修改周,时间按周的量增加或减少。
+	 * 
+	 * @param date <code>java.util.Date</code>
+	 * @param amount 数量
+	 * @return 运算后的 <code>java.util.Date</code>
+	 */
+	public static Date addWeeks(Date date, int amount) {
+		return add(date, Calendar.WEEK_OF_YEAR, amount);
+	}
+
+	/**
+	 * 增加或减少指定数量的日数。
+	 * 
+	 * @param date <code>java.util.Date</code>
+	 * @param amount 数量
+	 * @return 运算后的 <code>java.util.Date</code>
+	 */
+	public static Date addDays(Date date, int amount) {
+		return add(date, Calendar.DAY_OF_MONTH, amount);
+	}
+
+	/**
+	 * 增加或减少指定数量的小时数。
+	 * 
+	 * @param date <code>java.util.Date</code>
+	 * @param amount 数量
+	 * @return 运算后的 <code>java.util.Date</code>
+	 */
+	public static Date addHours(Date date, int amount) {
+		return add(date, Calendar.HOUR_OF_DAY, amount);
+	}
+
+	/**
+	 * 增加或减少指定数量的分钟数。
+	 * 
+	 * @param date <code>java.util.Date</code>
+	 * @param amount 数量
+	 * @return 运算后的 <code>java.util.Date</code>
+	 */
+	public static Date addMinutes(Date date, int amount) {
+		return add(date, Calendar.MINUTE, amount);
+	}
+
+	/**
+	 * 增加或减少指定数量的秒钟数。
+	 * 
+	 * @param date <code>java.util.Date</code>
+	 * @param amount 数量
+	 * @return 运算后的 <code>java.util.Date</code>
+	 */
+	public static Date addSeconds(Date date, int amount) {
+		return add(date, Calendar.SECOND, amount);
+	}
+
+	/**
+	 * 增加或减少指定数量的毫秒数。
+	 * 
+	 * @param date <code>java.util.Date</code>
+	 * @param amount 数量
+	 * @return 运算后的 <code>java.util.Date</code>
+	 */
+	public static Date addMilliseconds(Date date, int amount) {
+		return add(date, Calendar.MILLISECOND, amount);
+	}
+
+	/**
+	 * 在给定的日历字段上添加或减去(上/下)单个时间单元,不更改更大的字段。
+	 * 
+	 * @param date <code>java.util.Date</code>
+	 * @param field 给定的日历字段
+	 * @param up 添加或减去(上/下)
+	 * @return 运算后的 <code>java.util.Date</code>
+	 */
+	public static Date roll(Date date, int field, boolean up) {
+		Calendar cal = GregorianCalendar.getInstance(TIME_ZONE);
+		cal.setTime(date);
+		cal.roll(field, up);
+
+		return cal.getTime();
+	}
+
+	/**
+	 * 向指定日历字段添加指定(有符号的)时间量,不更改更大的字段。
+	 * 
+	 * @param date <code>java.util.Date</code>
+	 * @param field 给定的日历字段
+	 * @param amount 数量
+	 * @return 运算后的 <code>java.util.Date</code>
+	 */
+	public static Date roll(Date date, int field, int amount) {
+		Calendar cal = GregorianCalendar.getInstance(TIME_ZONE);
+		cal.setTime(date);
+		cal.roll(field, amount);
+
+		return cal.getTime();
+	}
+
+	/**
+	 * 将毫秒时间戳转换成格里高利历的日数。日数是只从格里高利历第1年1月1日算起的日数。
+	 * 
+	 * @param millis 给定的毫秒时间戳
+	 * @return 格里高利历的日数
+	 */
+	public static int millisToJulianDay(long millis) {
+		return EPOCH_JULIAN_DAY - JAN_1_1_JULIAN_DAY + (int) (millis / ONE_DAY);
+	}
+
+	/**
+	 * 将<code>java.util.Date</code>转换成格里高利历的日数。 日数是只从格里高利历第1年1月1日算起的日数。
+	 * 
+	 * @param date <code>java.util.Date</code>
+	 * @return 格里高利历的日数
+	 */
+	public static int dateToJulianDay(Date date) {
+		return millisToJulianDay(date.getTime());
+	}
+
+	/**
+	 * 计算两个日期之间相差的秒钟数。如果第一个日期在第二个日期之前,则返回正,反之返回负。
+	 * 
+	 * @param early 第一个日期
+	 * @param late 第二个日期
+	 * @return 两个日期之间相差的秒钟数
+	 */
+	public static int secondsBetween(Date early, Date late) {
+		return (int) ((late.getTime() / ONE_SECOND) - (early.getTime() / ONE_SECOND));
+	}
+
+	/**
+	 * 计算两个日期之间相差的分钟数。如果第一个日期在第二个日期之前,则返回正,反之返回负。
+	 * 
+	 * @param early 第一个日期
+	 * @param late 第二个日期
+	 * @return 两个日期之间相差的分钟数
+	 */
+	public static int minutesBetween(Date early, Date late) {
+		Calendar c1 = Calendar.getInstance();
+		Calendar c2 = Calendar.getInstance();
+		c1.setTime(early);
+		c2.setTime(late);
+
+		return (int) ((late.getTime() / ONE_MINUTE) - (early.getTime() / ONE_MINUTE));
+	}
+
+	/**
+	 * 计算两个日期之间相差的小时数。如果第一个日期在第二个日期之前,则返回正,反之返回负。
+	 * 
+	 * @param early 第一个日期
+	 * @param late 第二个日期
+	 * @return 两个日期之间相差的小时数
+	 */
+	public static int hoursBetween(Date early, Date late) {
+		return (int) ((late.getTime() / ONE_HOUR) - (early.getTime() / ONE_HOUR));
+	}
+
+	/**
+	 * 计算两个日期之间相差的天数。如果第一个日期在第二个日期之前,则返回正,反之返回负。
+	 * 
+	 * @param early 第一个日期
+	 * @param late 第二个日期
+	 * @return 两个日期之间相差的天数
+	 */
+	public static int daysBetween(Date early, Date late) {
+		Calendar c1 = Calendar.getInstance();
+		Calendar c2 = Calendar.getInstance();
+		c1.setTime(early);
+		c2.setTime(late);
+		return dateToJulianDay(c2.getTime()) - dateToJulianDay(c1.getTime());
+	}
+
+	/**
+	 * 计算两个日期之间相差的月数。如果第一个日期在第二个日期之前,则返回正,反之返回负。
+	 * 
+	 * @param early 第一个日期
+	 * @param late 第二个日期
+	 * @return 两个日期之间相差的月数
+	 */
+	public static int monthsBetween(Date early, Date late) {
+		Calendar c1 = Calendar.getInstance();
+		Calendar c2 = Calendar.getInstance();
+		c1.setTime(early);
+		c2.setTime(late);
+		return ((c2.get(Calendar.YEAR) * 12) + c2.get(Calendar.MONTH)) - ((c1.get(Calendar.YEAR) * 12) + c1.get(Calendar.MONTH));
+	}
+
+	/**
+	 * 计算两个日期之间相差的年数。如果第一个日期在第二个日期之前,则返回正,反之返回负。
+	 * 
+	 * @param early 第一个日期
+	 * @param late 第二个日期
+	 * @return 两个日期之间相差的年数
+	 */
+	public static int yearsBetween(Date early, Date late) {
+		Calendar c1 = Calendar.getInstance();
+		Calendar c2 = Calendar.getInstance();
+		c1.setTime(early);
+		c2.setTime(late);
+		return c2.get(Calendar.YEAR) - c1.get(Calendar.YEAR);
+	}
+
+	/**
+	 * 将格里高利历日数转换成 <code>java.sql.Date</code>
+	 * 
+	 * @param julian 格里高利历日数
+	 * @return <code>java.sql.Date</code>
+	 */
+	public static java.sql.Date julianDayToSqlDate(long julian) {
+		return new java.sql.Date(julianDayToMillis(julian));
+	}
+
+	/**
+	 * 将格里高利历日数转换成 <code>java.util.Date</code>
+	 * 
+	 * @param julian 格里高利历日数
+	 * @return <code>java.util.Date</code>
+	 */
+	public static Date julianDayToDate(long julian) {
+		return new Date(julianDayToMillis(julian));
+	}
+
+	/**
+	 * 将格里高利历日数转换成毫秒时间戳。
+	 * 
+	 * @param julian 格里高利历日数
+	 * @return 毫秒时间戳
+	 */
+	public static long julianDayToMillis(long julian) {
+		return (julian - EPOCH_JULIAN_DAY + JAN_1_1_JULIAN_DAY) * ONE_DAY;
+	}
+
+	/**
+	 * 将日历转换成儒略历日期。算法参见: <a href="http://quasar.as.utexas.edu/BillInfo/JulianDatesG.html">Julian Day Calculations
+	 * (Gregorian Calendar)</a>, 由 Bill Jeffrys 提供。
+	 * 
+	 * @param c 日历实例
+	 * @return 儒略历日期
+	 */
+	public static float toJulian(Calendar c) {
+		int Y = c.get(Calendar.YEAR);
+		int M = c.get(Calendar.MONTH);
+		int D = c.get(Calendar.DATE);
+		int A = Y / 100;
+		int B = A / 4;
+		int C = 2 - A + B;
+		float E = (int) (365.25f * (Y + 4716));
+		float F = (int) (30.6001f * (M + 1));
+		float JD = (C + D + E + F) - 1524.5f;
+
+		return JD;
+	}
+
+	/**
+	 * 将日期转换成儒略历日期。算法参见: <a href="http://quasar.as.utexas.edu/BillInfo/JulianDatesG.html">Julian Day Calculations
+	 * (Gregorian Calendar)</a>, 由 Bill Jeffrys 提供。
+	 * 
+	 * @param date 日期
+	 * @return 儒略历日期
+	 */
+	public static float toJulian(Date date) {
+		Calendar c = Calendar.getInstance();
+		c.setTime(date);
+
+		return toJulian(c);
+	}
+
+	protected static float normalizedJulian(float JD) {
+		float f = Math.round(JD + 0.5f) - 0.5f;
+
+		return f;
+	}
+
+	/**
+	 * 给定此 <code>java.util.Date</code> 的时间值,返回指定日历字段可能拥有的最大值。
+	 * 
+	 * @param date <code>java.util.Date</code>
+	 * @param field 日历字段
+	 * @return 对于此 <code>java.util.Date</code> 的时间值而言,给定日历字段的最大值
+	 */
+	public static Date getActualMaximum(Date date, int field) {
+		Calendar c = Calendar.getInstance();
+		c.setTime(date);
+		c.set(field, c.getActualMaximum(field));
+
+		return c.getTime();
+	}
+
+	/**
+	 * 给定此 <code>java.util.Date</code> 的时间值,返回指定日历字段可能拥有的最小值。
+	 * 
+	 * @param date <code>java.util.Date</code>
+	 * @param field 日历字段
+	 * @return 对于此 <code>java.util.Date</code> 的时间值而言,给定日历字段的最小值
+	 */
+	public static Date getActualMinimum(Date date, int field) {
+		Calendar c = Calendar.getInstance();
+		c.setTime(date);
+		c.set(field, c.getActualMinimum(field));
+
+		return c.getTime();
+	}
+
+	/**
+	 * 截取日期,只保留年、月、日部分。
+	 * 
+	 * @param date <code>java.util.Date</code>
+	 * @return 截取后的<code>java.util.Date</code>
+	 */
+	public static Date trunc(Date date) {
+		if (date != null) {
+			Calendar c1 = Calendar.getInstance();
+			c1.setTime(date);
+			Calendar c2 = (Calendar) c1.clone();
+			c1.clear();
+			c1.set(Calendar.YEAR, c2.get(Calendar.YEAR));
+			c1.set(Calendar.MONTH, c2.get(Calendar.MONTH));
+			c1.set(Calendar.DAY_OF_MONTH, c2.get(Calendar.DAY_OF_MONTH));
+			return c1.getTime();
+		}
+		return null;
+	}
+
+	/**
+	 * 返回当天的最后一秒
+	 * 
+	 * @param date <code>java.util.Date</code>
+	 * @return 截取后的<code>java.util.Date</code>
+	 */
+	public static Date dayEnd(Date date) {
+		Calendar c1 = Calendar.getInstance();
+		c1.setTime(date);
+		Calendar c2 = (Calendar) c1.clone();
+		c1.clear();
+		c1.set(Calendar.YEAR, c2.get(Calendar.YEAR));
+		c1.set(Calendar.MONTH, c2.get(Calendar.MONTH));
+		c1.set(Calendar.DAY_OF_MONTH, c2.get(Calendar.DAY_OF_MONTH));
+		// 23:59:59
+		c1.set(Calendar.HOUR_OF_DAY, 23);
+		c1.set(Calendar.MINUTE, 59);
+		c1.set(Calendar.SECOND, 59);
+		return c1.getTime();
+	}
+
+	/**
+	 * 判断两个日期是否是同一天,精确到天。
+	 * 
+	 * @param date1 <code>java.util.Date</code>
+	 * @param date2 <code>java.util.Date</code>
+	 * @return true 如果两个日期是同一天
+	 */
+	public static boolean isSameDay(Date date1, Date date2) {
+		if (date1 == null || date2 == null) {
+			throw new RuntimeException("日期不能为空!");
+		}
+		Calendar cal1 = Calendar.getInstance();
+		cal1.setTime(date1);
+		Calendar cal2 = Calendar.getInstance();
+		cal2.setTime(date2);
+		return isSameDay(cal1, cal2);
+	}
+
+	/**
+	 * 判断两个日期是否是同一天,精确到天。
+	 * 
+	 * @param cal1 <code>java.util.Calendar</code>
+	 * @param cal2 <code>java.util.Calendar</code>
+	 * @return true 如果两个日期是同一天
+	 */
+	public static boolean isSameDay(Calendar cal1, Calendar cal2) {
+		if (cal1 == null || cal2 == null) {
+			throw new RuntimeException("日期不能为空!");
+		}
+		return (cal1.get(Calendar.ERA) == cal2.get(Calendar.ERA) && cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) && cal1.get(Calendar.DAY_OF_YEAR) == cal2
+				.get(Calendar.DAY_OF_YEAR));
+	}
+
+	/**
+	 * 判断两个时间是否完全相等,精确到毫秒。
+	 * 
+	 * @param date1 <code>java.util.Date</code>
+	 * @param date2 <code>java.util.Date</code>
+	 * @return true 如果两个时间完全相等
+	 */
+	public static boolean isSameLocalTime(Date date1, Date date2) {
+		if (date1 == null || date2 == null) {
+			throw new RuntimeException("日期不能为空!");
+		}
+		Calendar cal1 = Calendar.getInstance();
+		cal1.setTime(date1);
+		Calendar cal2 = Calendar.getInstance();
+		cal2.setTime(date2);
+		return isSameLocalTime(cal1, cal2);
+	}
+
+	/**
+	 * 判断两个时间是否完全相等,精确到毫秒。
+	 * 
+	 * @param cal1 <code>java.util.Calendar</code>
+	 * @param cal2 <code>java.util.Calendar</code>
+	 * @return true 如果两个时间完全相等
+	 */
+	public static boolean isSameLocalTime(Calendar cal1, Calendar cal2) {
+		if (cal1 == null || cal2 == null) {
+			throw new RuntimeException("日期不能为空!");
+		}
+		return (cal1.get(Calendar.MILLISECOND) == cal2.get(Calendar.MILLISECOND) && cal1.get(Calendar.SECOND) == cal2.get(Calendar.SECOND)
+				&& cal1.get(Calendar.MINUTE) == cal2.get(Calendar.MINUTE) && cal1.get(Calendar.HOUR) == cal2.get(Calendar.HOUR)
+				&& cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR) && cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR)
+				&& cal1.get(Calendar.ERA) == cal2.get(Calendar.ERA) && cal1.getClass() == cal2.getClass());
+	}
+
+	public static String formatHuman(Date date) {
+		if (date != null) {
+			Long seconds = (System.currentTimeMillis() - date.getTime()) / 1000;
+
+			if (seconds <= 0) {
+				return "刚刚";
+			}
+
+			if (seconds < 60) {
+				return seconds + "秒前";
+			}
+
+			Long min = seconds / 60;
+			if (min < 60) {
+				return min + "分钟前";
+			}
+
+			Long hour = seconds / 3600;
+			if (hour < 12) {
+				return hour + "小时前";
+			}
+
+			return format(date, "yyyy-MM-dd HH:mm:ss");
+		} else {
+			return "";
+		}
+
+	}
+
+	public static String formatHumanShort(Date date) {
+
+		Long seconds = (System.currentTimeMillis() - date.getTime()) / 1000;
+
+		if (seconds <= 0) {
+			return "刚刚";
+		}
+
+		if (seconds < 60) {
+			return seconds + "秒前";
+		}
+
+		Long min = seconds / 60;
+		if (min < 60) {
+			return min + "分钟前";
+		}
+
+		Long hour = seconds / 3600;
+		if (hour < 12) {
+			return hour + "小时前";
+		}
+
+		return format(date, "yyyy-MM-dd");
+	}
+
+	/**
+	 * 解析毫秒时间格式
+	 * 
+	 * @param millis
+	 * @return
+	 */
+	public static Date parseMillis(Long millis) {
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTimeInMillis(millis);
+		return calendar.getTime();
+	}
+
+	/**
+	 * 返回date所在月的第一天
+	 * 
+	 * @return
+	 */
+	public static Date getFirstDayOfMonth(Date date) {
+		String str = DateUtil.getYear(date) + "-" + DateUtil.getMonth(date) + "-01";
+		return DateUtil.stringToDate(str, DateUtil.ISO_EXPANDED_DATE_FORMAT);
+	}
+
+	// 取最近的时间
+	public static Date getMaxDate(Date lastDate, Date newDate) {
+		if (lastDate != null && newDate != null) {
+			if (newDate.after(lastDate)) {
+				return newDate;
+			} else {
+				return lastDate;
+			}
+		} else if (lastDate != null) {
+			return lastDate;
+		} else {
+			return newDate;
+		}
+	}
+
+	// 取最老的时间
+	public static Date getMinDate(Date lastDate, Date newDate) {
+		if (lastDate != null && newDate != null) {
+			if (newDate.before(lastDate)) {
+				return newDate;
+			} else {
+				return lastDate;
+			}
+		} else if (lastDate != null) {
+			return lastDate;
+		} else {
+			return newDate;
+		}
+	}
+
+	/**
+	 * 将字符串转换为指定格式的日期
+	 * 
+	 * @param dateStr
+	 * @param pattern
+	 * @return
+	 */
+	public static Date strToDate(String dateStr, String pattern) {
+		Date date = null;
+		try {
+			SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern, DEFAULT_LOCALE);
+			date = simpleDateFormat.parse(dateStr);
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return date; // null if parse faile
+	}
+
+	/**
+	 * 时间转字符串
+	 * @param date
+	 * @return
+	 */
+	public static String dateToString(Date date) {
+		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+		return df.format(date);
+	}
+
+	/**
+	 * 时间转字符串
+	 * @param date
+	 * @return
+	 */
+	public static String dateToString(Date date, SimpleDateFormat df) {
+		return df.format(date);
+	}
+
+	public static void main(String[] args) throws ParseException {
+		DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+		// DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		System.out.println(daysBetween(df.parse("2017-07-20 10:07:42"), df.parse(df.format(new Date()))));
+	}
+}