瀏覽代碼

Merge remote-tracking branch 'origin/master'

Joburgess 5 年之前
父節點
當前提交
90fea0d752
共有 22 個文件被更改,包括 819 次插入534 次删除
  1. 21 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/EmployeeDao.java
  2. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupDao.java
  3. 31 25
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/PracticeGroupDao.java
  4. 5 4
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPaymentOrderDao.java
  5. 9 4
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/VipGroupDao.java
  6. 112 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/OrderByTypeExportDto.java
  7. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/VipBuyResultDto.java
  8. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/OrderTypeEnum.java
  9. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/EndCourseScheduleQueryInfo.java
  10. 15 0
      mec-biz/src/main/java/com/ym/mec/biz/service/EmployeeService.java
  11. 7 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  12. 16 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/EmployeeServiceImpl.java
  13. 16 4
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  14. 21 0
      mec-biz/src/main/resources/config/mybatis/EmployeeMapper.xml
  15. 9 5
      mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml
  16. 10 0
      mec-biz/src/main/resources/config/mybatis/PracticeGroupMapper.xml
  17. 28 2
      mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml
  18. 386 367
      mec-biz/src/main/resources/config/mybatis/VipGroupMapper.xml
  19. 0 5
      mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java
  20. 7 107
      mec-util/src/main/java/com/ym/mec/util/excel/POIUtil.java
  21. 15 0
      mec-web/src/main/java/com/ym/mec/web/controller/EmployeeController.java
  22. 86 2
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java

+ 21 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/EmployeeDao.java

@@ -96,4 +96,25 @@ public interface EmployeeDao extends BaseDAO<Integer, Employee> {
      * @return java.util.List<com.ym.mec.biz.dal.dto.SimpleUserDto>
      */
     List<SimpleUserDto> findByIds(@Param("userIds") List<Integer> userIds);
+
+    /**
+     * 是否有课程组关联的教务老师
+     * @param employeeId
+     * @return
+     */
+    Integer hasCourseGroupRelation(Integer employeeId);
+
+    /**
+     * 修改知道老师的教务老师关联
+     * @param currentUserId
+     * @param targetUserId
+     */
+    void updateEducationTeacherId(@Param("currentUserId") Integer currentUserId, @Param("targetUserId") Integer targetUserId);
+
+    /**
+     *是否有未上的课
+     * @param employeeId
+     * @return
+     */
+    Integer hasCourseSchedule(Integer employeeId);
 }

+ 3 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupDao.java

@@ -245,7 +245,9 @@ public interface MusicGroupDao extends BaseDAO<String, MusicGroup> {
 
     List<MusicGroupRegisterDto> getMusicGroupRegister(@Param("musicGroupStatusList") List<MusicGroupStatusEnum> musicGroupStatusList, @Param("organIds") String organIds);
 
-    List<RegisterSubjectDto> getRegisterSubjectNum(@Param("musicGroupIds") List<String> musicGroupIds, @Param("studentMusicGroupStatus") StudentMusicGroupStatusEnum studentMusicGroupStatus);
+    List<RegisterSubjectDto> getRegisterSubjectNum(@Param("musicGroupIds") List<String> musicGroupIds,
+                                                   @Param("studentMusicGroupStatus") StudentMusicGroupStatusEnum studentMusicGroupStatus,
+                                                   @Param("payStatus") Integer payStatus);
 
     List<MusicGroupRegisterDto> getMusicGroupRegisterOrder(@Param("musicGroupIds") List<String> musicGroupIds);
 

+ 31 - 25
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/PracticeGroupDao.java

@@ -99,11 +99,11 @@ public interface PracticeGroupDao extends com.ym.mec.common.dal.BaseDAO<Long, Pr
                                         @Param("groupId") Long groupId);
 
     /**
+     * @param studentId:
+     * @return int
      * @describe 统计指定学员购买收费网管课的数量
      * @author Joburgess
      * @date 2020/4/24
-     * @param studentId:
-     * @return int
      */
     int checkStudentExitChargePractice(@Param("studentId") Integer studentId);
 
@@ -239,28 +239,30 @@ public interface PracticeGroupDao extends com.ym.mec.common.dal.BaseDAO<Long, Pr
 
     /**
      * 获取导出网管课信息
+     *
      * @param organIds
      * @return
      */
     List<CourseGroupExportDto> getPracticeGroupExport(@Param("organIds") String organIds);
 
     /**
+     * @return java.util.List<com.ym.mec.biz.dal.dto.SimpleUserDto>
      * @describe 获取转化失败的学员-之前有免费网管课,但是之后没有线上课的学员
      * @author Joburgess
      * @date 2020/4/23
-     * @return java.util.List<com.ym.mec.biz.dal.dto.SimpleUserDto>
      */
     List<SimpleUserDto> findConvertDefeatStudents(Map<String, Object> params);
+
     int countConvertDefeatStudents(Map<String, Object> params);
 
     /**
+     * @param studentOrganId: 学生分部编号
+     * @param subjectId:      声部编号
+     * @param studentId:      学生编号
+     * @return java.util.List<com.ym.mec.biz.dal.dto.SimpleUserDto>
      * @describe 获取可以指派试听课的老师列表
      * @author Joburgess
      * @date 2020/4/23
-     * @param studentOrganId: 学生分部编号
-     * @param subjectId: 声部编号
-     * @param studentId: 学生编号
-     * @return java.util.List<com.ym.mec.biz.dal.dto.SimpleUserDto>
      */
     List<SimpleUserDto> findEnableAssignTeachers(@Param("studentOrganId") Integer studentOrganId,
                                                  @Param("subjectId") Integer subjectId,
@@ -269,86 +271,90 @@ public interface PracticeGroupDao extends com.ym.mec.common.dal.BaseDAO<Long, Pr
 
     /**
      * 修改网管课备注
+     *
      * @param groupId
      * @param memo
      */
     void updateMemo(@Param("groupId") Long groupId, @Param("memo") String memo);
 
     /**
+     * @param studentId:
+     * @return java.lang.Integer
      * @describe 获取学生最后一节网管课对应的声部
      * @author Joburgess
      * @date 2020/4/23
-     * @param studentId:
-     * @return java.lang.Integer
      */
     Integer findLastPracticeSubject(@Param("studentId") Integer studentId);
 
     /**
+     * @param studentId:
+     * @return java.util.List<com.ym.mec.biz.dal.entity.PracticeGroup>
      * @describe 获取学生的网管试听课
      * @author Joburgess
      * @date 2020/4/24
-     * @param studentId:
-     * @return java.util.List<com.ym.mec.biz.dal.entity.PracticeGroup>
      */
     List<PracticeGroup> findStudentTrialPractices(@Param("studentId") Integer studentId);
+
     int countStudentTrialPractices(@Param("studentId") Integer studentId);
 
     /**
+     * @param studentId:
+     * @return int
      * @describe 统计学生进行中的试听课数量
      * @author Joburgess
      * @date 2020.04.28
-     * @param studentId:
-     * @return int
      */
     int countStudentIngTrialPractices(@Param("studentId") Integer studentId);
 
     /**
-     * @describe 获取老师
-     * @author Joburgess
-     * @date 2020/4/24
      * @param studentId:
      * @param teacherId:
      * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
+     * @describe 获取老师
+     * @author Joburgess
+     * @date 2020/4/24
      */
     List<CourseSchedule> findStudentAndTeacherTrialPractices(@Param("studentId") Integer studentId,
                                                              @Param("teacherId") Integer teacherId);
 
     /**
-     * @describe 统计指定老师和学生是否存在关联的试听课
-     * @author Joburgess
-     * @date 2020/4/24
      * @param studentId:
      * @param teacherId:
      * @return int
+     * @describe 统计指定老师和学生是否存在关联的试听课
+     * @author Joburgess
+     * @date 2020/4/24
      */
     int countStudentAndTeacherTrialPractices(@Param("studentId") Integer studentId,
                                              @Param("teacherId") Integer teacherId);
 
     /**
+     * @return java.util.List<com.ym.mec.biz.dal.entity.PracticeGroup>
      * @describe 获取需要提醒续费网管课的用户列表
      * @author Joburgess
      * @date 2020.05.29
-     * @return java.util.List<com.ym.mec.biz.dal.entity.PracticeGroup>
      */
     List<Integer> getNeedRemindPracticeUsers();
 
     /**
+     * @param studentIds:
+     * @return java.util.List<java.util.Map < java.lang.Integer, java.lang.String>>
      * @describe 获取用户和需要提醒的网管课map
      * @author Joburgess
      * @date 2020.05.29
-     * @param studentIds:
-     * @return java.util.List<java.util.Map<java.lang.Integer,java.lang.String>>
      */
     List<Map<Integer, String>> getUserNeedRemindPracticeIdMap(@Param("studentIds") List<Integer> studentIds);
 
     /**
-     * @describe 批量修改网管课续费提醒状态
-     * @author Joburgess
-     * @date 2020.05.29
      * @param practiceIds:
      * @param remindStatus:
      * @return int
+     * @describe 批量修改网管课续费提醒状态
+     * @author Joburgess
+     * @date 2020.05.29
      */
     int batchUpdatePracticeRemindStatus(@Param("practiceIds") List<Integer> practiceIds,
                                         @Param("remindStatus") Integer remindStatus);
+
+    List<PracticeCourseDto> getPracticeGroupByIds(@Param("practiceIds") List<Long> practiceIds);
 }

+ 5 - 4
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPaymentOrderDao.java

@@ -1,9 +1,6 @@
 package com.ym.mec.biz.dal.dao;
 
-import com.ym.mec.biz.dal.dto.OrderStatisDto;
-import com.ym.mec.biz.dal.dto.SporadicChargeInfoDto;
-import com.ym.mec.biz.dal.dto.StudentPaymentOrderExportDto;
-import com.ym.mec.biz.dal.dto.UserGoodsDto;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.Goods;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
@@ -305,4 +302,8 @@ public interface StudentPaymentOrderDao extends BaseDAO<Long, StudentPaymentOrde
 
      */
     Integer findOrganPayOrderNum(@Param("organId") Integer organId);
+
+    List<OrderByTypeExportDto> getOrderByMonthAndType(@Param("organIds") String organIds,
+                                                      @Param("orderTypeList") List<OrderTypeEnum> orderTypeList,
+                                                      @Param("startTime") Date startTime, @Param("endTime") Date endTime);
 }

+ 9 - 4
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/VipGroupDao.java

@@ -322,28 +322,33 @@ public interface VipGroupDao extends BaseDAO<Long, VipGroup> {
     List<VipGroup> queryNormalStatusList();
 
     int countUserRepeatVipGroupInCourseStartEndTime(@Param("userId") Integer userId,
-                                                    @Param("courseStartDate")Date courseStartDate,
+                                                    @Param("courseStartDate") Date courseStartDate,
                                                     @Param("courseEndDate") Date courseEndDate);
 
     VipGroup findVipGroupInfo(@Param("id") Integer id, @Param("classGroupId") Integer classGroupId);
 
     /**
      * 获取用户所在vip名
+     *
      * @param userIds
      * @return
      */
-    List<Map<Integer,String>> queryUserVipNames(@Param("userIds") Set<Integer> userIds);
+    List<Map<Integer, String>> queryUserVipNames(@Param("userIds") Set<Integer> userIds);
 
     /**
      * 获取用户所在vip状态
+     *
      * @param userIds
      * @return
      */
-    List<Map<Integer,String>> queryUserVipStatus(@Param("userIds") Set<Integer> userIds);
-    
+    List<Map<Integer, String>> queryUserVipStatus(@Param("userIds") Set<Integer> userIds);
+
     /**
      * 临时用
+     *
      * @return
      */
     List<VipCourseStudentInfoDto> queryVipCourseStudentInfo();
+
+    List<VipBuyResultDto> getGroupTeachers(@Param("groupIds") List<Long> groupIds);
 }

+ 112 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/OrderByTypeExportDto.java

@@ -0,0 +1,112 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.entity.Teacher;
+import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.dal.enums.OrderTypeEnum;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+public class OrderByTypeExportDto {
+
+    private String organName;
+
+    private Integer studentId;
+
+    private String studentName;
+
+    private String teacherName;
+
+    private String eduTeacherName;
+
+    private OrderTypeEnum orderType;
+
+    private BigDecimal actualAmount;
+
+    private Long musicGroupId;
+
+    private GroupType groupType;
+
+    private Date createTime;
+
+
+    public String getOrganName() {
+        return organName;
+    }
+
+    public void setOrganName(String organName) {
+        this.organName = organName;
+    }
+
+    public Integer getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Integer studentId) {
+        this.studentId = studentId;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public String getEduTeacherName() {
+        return eduTeacherName;
+    }
+
+    public void setEduTeacherName(String eduTeacherName) {
+        this.eduTeacherName = eduTeacherName;
+    }
+
+    public OrderTypeEnum getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(OrderTypeEnum orderType) {
+        this.orderType = orderType;
+    }
+
+    public BigDecimal getActualAmount() {
+        return actualAmount;
+    }
+
+    public void setActualAmount(BigDecimal actualAmount) {
+        this.actualAmount = actualAmount;
+    }
+
+    public Long getMusicGroupId() {
+        return musicGroupId;
+    }
+
+    public void setMusicGroupId(Long musicGroupId) {
+        this.musicGroupId = musicGroupId;
+    }
+
+    public GroupType getGroupType() {
+        return groupType;
+    }
+
+    public void setGroupType(GroupType groupType) {
+        this.groupType = groupType;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+}

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/VipBuyResultDto.java

@@ -14,6 +14,8 @@ public class VipBuyResultDto {
 
     private String teacherName;
 
+    private String eduTeacherName;
+
     private Integer classTimes;
 
     private Date startClassTime;
@@ -67,4 +69,12 @@ public class VipBuyResultDto {
     public void setEndClassTime(Date endClassTime) {
         this.endClassTime = endClassTime;
     }
+
+    public String getEduTeacherName() {
+        return eduTeacherName;
+    }
+
+    public void setEduTeacherName(String eduTeacherName) {
+        this.eduTeacherName = eduTeacherName;
+    }
 }

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/OrderTypeEnum.java

@@ -10,7 +10,7 @@ public enum OrderTypeEnum implements BaseEnum<String, OrderTypeEnum> {
 	RENEW("RENEW", "续费"),
 	SPORADIC("SPORADIC", "零星收费"),
 	OTHER("OTHER", "其他"),
-	SMALL_CLASS_TO_BUY("SMALL_CLASS_TO_BUY", "小课购买"),
+	SMALL_CLASS_TO_BUY("SMALL_CLASS_TO_BUY", "VIP购买"),
 	PRACTICE_GROUP_BUY("PRACTICE_GROUP_BUY", "网管课购买"),
 	PRACTICE_GROUP_RENEW("PRACTICE_GROUP_RENEW", "网管课续费"),
 	COURSE_GROUP_BUY("COURSE_GROUP_BUY","对外课程购买"),

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/EndCourseScheduleQueryInfo.java

@@ -27,6 +27,9 @@ public class EndCourseScheduleQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "班级编号")
     private Integer classGroupId;
 
+    @ApiModelProperty(value = "是否点名")
+    private Integer isCallNames;
+
     @ApiModelProperty(value = "学生编号")
     private String studentIdList;
 
@@ -59,6 +62,14 @@ public class EndCourseScheduleQueryInfo extends QueryInfo {
 
     private boolean isExport = false;
 
+    public Integer getIsCallNames() {
+        return isCallNames;
+    }
+
+    public void setIsCallNames(Integer isCallNames) {
+        this.isCallNames = isCallNames;
+    }
+
     public boolean getIsExport() {
         return isExport;
     }

+ 15 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/EmployeeService.java

@@ -7,6 +7,7 @@ import com.ym.mec.biz.dal.page.EmployeeQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
 
+import java.util.HashMap;
 import java.util.List;
 
 public interface EmployeeService extends BaseService<Integer, Employee> {
@@ -53,4 +54,18 @@ public interface EmployeeService extends BaseService<Integer, Employee> {
      * @return java.util.List<com.ym.mec.biz.dal.dto.SimpleUserDto>
      */
     List<SimpleUserDto> findByRole(String roleIds,String organIds);
+
+    /**
+     * 是否有课程组关联的教务老师
+     * @param employeeId
+     * @return
+     */
+    HashMap<String, Integer> hasCourseGroupRelation(Integer employeeId);
+
+    /**
+     * 修改指定老师所有教务老师关联
+     * @param currentUserId
+     * @param targetUserId
+     */
+    void updateEducationTeacherId(Integer currentUserId, Integer targetUserId);
 }

+ 7 - 7
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -3726,7 +3726,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             List<Long> courseScheduleIds = results.stream().map(CourseScheduleEndDto::getId).collect(Collectors.toList());
 //            List<TeacherAttendance> teacherAttendances = teacherAttendanceDao.findTeacherIdByCourseSchedule(courseScheduleIds);
 //            Map<Long, List<TeacherAttendance>> courseTeacherAttendanceMap = teacherAttendances.stream().collect(Collectors.groupingBy(TeacherAttendance::getCourseScheduleId));
-            Map<Integer, Long> studentNumCourseMap = MapUtil.convertIntegerMap(studentAttendanceDao.countStudentAttendancesByCourses(courseScheduleIds));
+//            Map<Integer, Long> studentNumCourseMap = MapUtil.convertIntegerMap(studentAttendanceDao.countStudentAttendancesByCourses(courseScheduleIds));
             Map<Long, String> studentIdMap = MapUtil.convertIntegerMap(courseScheduleStudentPaymentDao.getStudentIdMap(courseScheduleIds));
             List<Integer> teacherIds=results.stream().filter(t->Objects.nonNull(t.getActualTeacherId())).map(CourseSchedule::getActualTeacherId).collect(Collectors.toList());
 
@@ -3755,12 +3755,12 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 					result.setSignOutTime(teacherAttendance.getSignOutTime());
 					result.setRemark(teacherAttendance.getRemark());
 				}*/
-				Long studentNum = studentNumCourseMap.get(result.getId());
-				if (Objects.nonNull(studentNum)) {
-					result.setIsCallNames(studentNum > 0 ? YesOrNoEnum.YES : YesOrNoEnum.NO);
-				} else {
-					result.setIsCallNames(YesOrNoEnum.NO);
-				}
+//				Long studentNum = studentNumCourseMap.get(result.getId());
+//				if (Objects.nonNull(studentNum)) {
+//					result.setIsCallNames(studentNum > 0 ? YesOrNoEnum.YES : YesOrNoEnum.NO);
+//				} else {
+//					result.setIsCallNames(YesOrNoEnum.NO);
+//				}
 				result.setSettlementTime(coursesSettlementTimeMap.get(result.getId()));
 			}
         }

+ 16 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/EmployeeServiceImpl.java

@@ -160,6 +160,7 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee>  imp
 				employeeDao.updateUserDemissionDate(employeeId);
 				break;
 			case REINSTATE:
+				//离职,如果有关联课程组教务老师,
 				employeeDao.updateUserDemissionDate(employeeId);
 				break;
 		}
@@ -169,4 +170,19 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee>  imp
 	public List<SimpleUserDto> findByRole(String roleIds, String organIds) {
 		return employeeDao.findByRole(roleIds,organIds);
 	}
+
+	@Override
+	public HashMap<String, Integer> hasCourseGroupRelation(Integer employeeId) {
+		Integer hasCourseGroupRelation = employeeDao.hasCourseGroupRelation(employeeId);
+		Integer hasCourseSchedule = employeeDao.hasCourseSchedule(employeeId);
+		HashMap<String, Integer> map = new HashMap<>(2);
+		map.put("hasCourseGroupRelation",hasCourseGroupRelation);
+		map.put("hasCourseSchedule",hasCourseSchedule);
+		return map;
+	}
+
+	@Override
+	public void updateEducationTeacherId(Integer currentUserId, Integer targetUserId) {
+		employeeDao.updateEducationTeacherId(currentUserId,targetUserId);
+	}
 }

+ 16 - 4
mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -46,6 +46,7 @@
         <result column="course_end_time_" property="endClassTime"/>
         <result column="settlement_time_" property="settlementTime"/>
         <result column="organ_name_" property="organName"/>
+        <result column="isCallNames" property="isCallNames" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
     </resultMap>
 
     <resultMap type="com.ym.mec.biz.dal.dto.CourseScheduleDto" id="courseScheduleDto" extends="CourseSchedule">
@@ -2293,27 +2294,31 @@
         cs.type_,
         cs.schoole_id_,
         s.name_ schoole_name_,
-        o.name_ organ_name_
+        o.name_ organ_name_,
+        CASE WHEN COUNT(sa.id_) > 0 THEN 1 ELSE 0 END isCallNames
         FROM
         course_schedule cs
         LEFT JOIN school s ON cs.schoole_id_=s.id_
         LEFT JOIN organization o ON cs.organ_id_=o.id_
+        LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cs.id_
         <include refid="endFindCourseSchedulesCondition"/>
+        GROUP BY cs.id_
         ORDER BY course_start_time_,cs.id_
         <include refid="global.limit"/>
     </select>
 
     <select id="endCountCourseSchedules" resultType="int">
         SELECT
-        COUNT(cs.id_)
+        COUNT(DISTINCT cs.id_)
         FROM
         course_schedule cs
+        LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cs.id_
         <include refid="endFindCourseSchedulesCondition"/>
     </select>
     <select id="findCourseIdsByStudent" resultType="int">
         SELECT cssp.course_schedule_id_
         FROM course_schedule_student_payment cssp
-                 LEFT JOIN sys_user su ON cssp.user_id_ = su.id_
+        LEFT JOIN sys_user su ON cssp.user_id_ = su.id_
         WHERE su.username_ LIKE CONCAT('%', #{search}, '%')
            OR su.id_ = #{search}
     </select>
@@ -2386,6 +2391,12 @@
         <include refid="queryVipCourseScheduleIds"/>
     </select>
     <sql id="queryVipCourseScheduleIds">
+        <if test="isCallNames != null and isCallNames == 1">
+            AND sa.id_ IS NOT NULL
+        </if>
+        <if test="isCallNames != null and isCallNames == 0">
+            AND sa.id_ IS NULL
+        </if>
         <if test="startTime!=null and endTime==null">
             AND cs.class_date_ &gt; DATE_FORMAT(#{startTime},"%Y-%m-%d")
         </if>
@@ -3161,7 +3172,8 @@
     <select id="queryHasReatClass" resultType="java.util.Map">
         SELECT cgtm.class_group_id_ 'key',CASE WHEN COUNT(cs.id_) > 0 THEN 1 ELSE 0 END 'value'
         FROM class_group_teacher_mapper cgtm
-        LEFT JOIN course_schedule cs ON cs.class_group_id_ = cgtm.class_group_id_ AND CONCAT(cs.class_date_,' ',cs.start_class_time_) > NOW() AND cs.del_flag_ = 0
+        LEFT JOIN course_schedule cs ON cs.class_group_id_ = cgtm.class_group_id_
+        AND CONCAT(cs.class_date_,' ',cs.start_class_time_) > NOW() AND cs.del_flag_ = 0
         WHERE cgtm.user_id_ = #{teacherId} AND cgtm.group_type_ = 'MUSIC' AND cgtm.class_group_id_ IN
         <foreach collection="classGroupIds" item="classGroupId" separator="," open="(" close=")">
             #{classGroupId}

+ 21 - 0
mec-biz/src/main/resources/config/mybatis/EmployeeMapper.xml

@@ -148,6 +148,12 @@
         UPDATE sys_user SET lock_flag_ = #{status} WHERE id_=#{userID}
     </update>
 
+    <update id="updateEducationTeacherId">
+        UPDATE music_group SET educational_teacher_id_ = #{targetUserId} WHERE educational_teacher_id_ = #{currentUserId} AND status_ != 'CANCELED';
+        UPDATE vip_group SET educational_teacher_id_ = #{targetUserId} WHERE educational_teacher_id_ = #{currentUserId} AND group_status_ IN (0,1,5,2,6);
+        UPDATE practice_group SET educational_teacher_id_ = #{targetUserId} WHERE educational_teacher_id_ = #{currentUserId} AND group_status_ NOT IN ('FINISH');
+    </update>
+
     <!-- 根据主键删除一条记录 -->
     <delete id="delete">
 		DELETE FROM employee WHERE user_id_ = #{userId} 
@@ -267,4 +273,19 @@
             #{userId}
         </foreach>
     </select>
+    <select id="hasCourseGroupRelation" resultType="java.lang.Integer">
+        SELECT SUM(a.num) FROM
+        (SELECT COUNT(vg.id_) num FROM vip_group vg WHERE vg.educational_teacher_id_  = #{employeeId} AND vg.group_status_ IN (0,1,5,2,6)
+        UNION ALL
+        SELECT COUNT(mg.id_) num FROM music_group mg WHERE mg.educational_teacher_id_ = #{employeeId} AND mg.status_ != 'CANCELED'
+        UNION ALL
+        SELECT COUNT(pg.id_) num FROM practice_group pg WHERE pg.educational_teacher_id_ = #{employeeId} AND pg.group_status_ NOT IN ('FINISH'))a
+    </select>
+    <select id="hasCourseSchedule" resultType="java.lang.Integer">
+        SELECT COUNT(DISTINCT cs.id_)
+        FROM course_schedule_teacher_salary csts
+        LEFT JOIN course_schedule cs ON cs.id_ = csts.course_schedule_id_
+        AND CONCAT(cs.class_date_,' ',cs.start_class_time_) > NOW() AND cs.del_flag_ = 0
+        WHERE csts.user_id_ = #{employeeId}
+    </select>
 </mapper>

+ 9 - 5
mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml

@@ -508,8 +508,8 @@
     <select id="getMusicGroupRegister" resultType="com.ym.mec.biz.dal.dto.MusicGroupRegisterDto">
         SELECT mg.id_ musicGroupId ,o.name_ organName, mg.name_ musicGroupName, mg.status_ musicGroupStatus,
         COUNT(sr.id_) registerNum,SUM(IF(sr.music_group_status_='NORMAL',1,0)) normalNum
-        FROM student_registration sr
-        LEFT JOIN music_group mg ON mg.id_ = sr.music_group_id_
+        FROM music_group mg
+        LEFT JOIN student_registration sr ON mg.id_ = sr.music_group_id_
         LEFT JOIN organization o on o.id_ = mg.organ_id_
         <where>
             <if test="musicGroupStatusList != null">
@@ -523,7 +523,8 @@
                 AND FIND_IN_SET (mg.organ_id_,#{organIds})
             </if>
         </where>
-        GROUP BY sr.music_group_id_
+        GROUP BY mg.id_
+        ORDER BY mg.create_time_ ASC
     </select>
 
     <select id="getRegisterSubjectNum" resultType="com.ym.mec.biz.dal.dto.RegisterSubjectDto">
@@ -535,9 +536,12 @@
             #{musicGroupId}
         </foreach>
         <if test="studentMusicGroupStatus != null">
-            AND sr.music_group_status_ = #{studentMusicGroupStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+            AND sr.music_group_status_ =
+            #{studentMusicGroupStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+        </if>
+        <if test="payStatus != null">
+            AND sr.payment_status_ = #{payStatus}
         </if>
-        AND sr.payment_status_ = 2
         GROUP BY sr.music_group_id_,sr.actual_subject_id_
     </select>
 

+ 10 - 0
mec-biz/src/main/resources/config/mybatis/PracticeGroupMapper.xml

@@ -695,4 +695,14 @@
                 #{studentId}
             </foreach>
     </select>
+
+    <select id="getPracticeGroupByIds" resultMap="PracticeCourseDto">
+        SELECT pg.id_,t.real_name_,et.real_name_ edu_teacher_name_ FROM practice_group pg
+        LEFT JOIN sys_user t ON pg.user_id_ = t.id_
+        LEFT JOIN sys_user et ON et.id_ = pg.educational_teacher_id_
+        WHERE pg.id_ IN
+        <foreach collection="practiceIds" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+    </select>
 </mapper>

+ 28 - 2
mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml

@@ -654,11 +654,37 @@
 
     <!-- 查找支付成功和支付中订单 -->
     <select id="findOrganPayOrderNum" resultType="int">
-        <![CDATA[
         SELECT COUNT(*)
         FROM student_payment_order
         WHERE organ_id_ = #{organId}
           AND status_ IN ('SUCCESS', 'ING')
-        ]]>
+    </select>
+
+    <!-- 获取每月用户的对应类型订单订单 -->
+    <select id="getOrderByMonthAndType" resultType="com.ym.mec.biz.dal.dto.OrderByTypeExportDto">
+        SELECT o.name_ organName, spo.user_id_ studentId,su.username_ studentName,spo.type_ orderType,
+        spo.actual_amount_ actualAmount,spo.music_group_id_ musicGroupId,spo.group_type_ groupType,spo.create_time_
+        createTime
+        FROM student_payment_order spo
+        LEFT JOIN sys_user su on spo.user_id_ = su.id_
+        LEFT JOIN organization o ON o.id_ = spo.id_
+        WHERE spo.status_ = 'SUCCESS'
+        <if test="organIds != null">
+            AND FIND_IN_SET (spo.organ_id_,#{organIds})
+        </if>
+        <if test="orderTypeList != null">
+            AND spo.type_ IN
+            <foreach collection="orderTypeList" item="orderType" open="(" close=")"
+                     separator=",">
+                #{orderType}
+            </foreach>
+        </if>
+        <if test="startTime != null">
+            AND spo.create_time_ >= #{startTime}
+        </if>
+        <if test="endTime != null"><![CDATA[
+        AND spo.create_time_ <= #{endTime}
+        ]]></if>
+        AND spo.actual_amount_ > 0
     </select>
 </mapper>

文件差異過大導致無法顯示
+ 386 - 367
mec-biz/src/main/resources/config/mybatis/VipGroupMapper.xml


+ 0 - 5
mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java

@@ -1,7 +1,6 @@
 package com.ym.service.Impl;
 
 import com.alibaba.fastjson.JSONObject;
-import com.sun.org.apache.xpath.internal.operations.Bool;
 import com.ym.common.ApiException;
 import com.ym.common.DisplayEnum;
 import com.ym.common.ErrorEnum;
@@ -15,7 +14,6 @@ import com.ym.job.ScheduleManager;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
-import com.ym.mec.biz.dal.dto.BasicUserDto;
 import com.ym.mec.biz.dal.dto.RongyunBasicUserDto;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.StudentAttendance;
@@ -24,11 +22,9 @@ import com.ym.mec.biz.dal.entity.TeacherAttendance;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.SignStatusEnum;
 import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
-import com.ym.mec.biz.dal.enums.TeachModeEnum;
 import com.ym.mec.biz.service.StudentAttendanceService;
 import com.ym.mec.biz.service.SysConfigService;
 import com.ym.mec.biz.service.TeacherAttendanceService;
-import com.ym.mec.common.entity.ImPlayMidiMessage;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.im.IMHelper;
 import com.ym.mec.im.message.*;
@@ -42,7 +38,6 @@ import com.ym.utils.CodeUtil;
 import com.ym.utils.DateTimeUtils;
 import com.ym.utils.IdentifierUtils;
 import com.ym.whiteboard.WhiteBoardHelper;
-import io.rong.models.message.GroupMessage;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;

+ 7 - 107
mec-util/src/main/java/com/ym/mec/util/excel/POIUtil.java

@@ -6,8 +6,6 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
-import java.security.cert.CertificateException;
-import java.security.cert.X509Certificate;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
@@ -17,30 +15,21 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 
-import org.apache.commons.beanutils.ConvertUtils;
 import org.apache.commons.beanutils.NestedNullException;
 import org.apache.commons.beanutils.PropertyUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.NameValuePair;
-import org.apache.http.client.entity.UrlEncodedFormEntity;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
-import org.apache.http.impl.client.BasicCookieStore;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.message.BasicNameValuePair;
-import org.apache.http.ssl.SSLContextBuilder;
-import org.apache.http.ssl.TrustStrategy;
-import org.apache.http.util.EntityUtils;
 import org.apache.poi.hssf.usermodel.HSSFCell;
 import org.apache.poi.hssf.usermodel.HSSFCellStyle;
 import org.apache.poi.hssf.usermodel.HSSFFont;
 import org.apache.poi.hssf.usermodel.HSSFRow;
 import org.apache.poi.hssf.usermodel.HSSFSheet;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.Font;
+import org.apache.poi.ss.usermodel.IndexedColors;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.xssf.streaming.SXSSFWorkbook;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.slf4j.Logger;
@@ -539,95 +528,6 @@ public class POIUtil {
 		return result;
 	}
 
-	public static void main(String[] args) {
-		File file = new File("e:/reward.xlsx");
-		String sheetName = "reward";
-		Map<String, List<Map<String, Object>>> map = null;
-		try {
-			map = POIUtil.importExcel(file, 1);
-		} catch (IOException e) {
-			e.printStackTrace();
-			return;
-		}
-		if (map != null) {
-			// Map<String, Object> loginParam = new HashMap<String, Object>();
-
-			SSLContextBuilder builder = new SSLContextBuilder();
-			try {
-				builder.loadTrustMaterial(null, new TrustStrategy() {
-
-					@Override
-					public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
-						return true;
-					}
-				});
-			} catch (Exception e) {
-				e.printStackTrace();
-				return;
-			}
-
-			HttpPost httpPost = null;
-			CloseableHttpClient httpClient = null;
-			try {
-				SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(builder.build());
-				httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).setDefaultCookieStore(new BasicCookieStore()).build();
-				// 登陆
-				httpPost = new HttpPost("https://ehjinrong.com/manage/admin/login.do?userName=sadmin&password=Hello@ehjr&captcha=411049");
-
-				HttpResponse httpResponse = httpClient.execute(httpPost);
-				HttpEntity httpEntity = httpResponse.getEntity();
-				String str = EntityUtils.toString(httpEntity);
-				System.out.println("--------" + str);
-				EntityUtils.consume(httpEntity);
-
-				// 发放奖励
-				for (Map<String, Object> row : map.get(sheetName)) {
-					try {
-						Long arg0 = Long.parseLong(row.get("user_id_").toString());
-						double arg1 = Double.parseDouble(row.get("reward").toString());
-						//String arg2 = row.get("tender_id_").toString();
-
-						Map<String, Object> parameterMap = new HashMap<String, Object>();
-						parameterMap.put("userId", arg0);
-						parameterMap.put("amount", arg1);
-						parameterMap.put("memo", "结清");
-
-						List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
-						if (parameterMap != null) {
-							for (Entry<String, Object> entry : parameterMap.entrySet()) {
-								String name = entry.getKey();
-								String value = ConvertUtils.convert(entry.getValue());
-								if (StringUtils.isNotEmpty(name)) {
-									nameValuePairs.add(new BasicNameValuePair(name, value));
-								}
-							}
-						}
-						httpPost = new HttpPost("https://ehjinrong.com/manage/sysAccount/fundAllocate.do");
-						httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8"));
-						httpResponse = httpClient.execute(httpPost);
-						httpEntity = httpResponse.getEntity();
-						EntityUtils.toString(httpEntity);
-						EntityUtils.consume(httpEntity);
-
-						System.out.println("  userId:" + arg0 + "  reward:" + arg1);
-					} catch (Exception e) {
-						e.printStackTrace();
-					}
-				}
-			} catch (Exception e) {
-				e.printStackTrace();
-			} finally {
-				httpPost.releaseConnection();
-				try {
-					httpClient.close();
-				} catch (IOException e) {
-					e.printStackTrace();
-				}
-			}
-
-		}
-	}
-
 	/**
 	 * 创建excel文档
 	 *

+ 15 - 0
mec-web/src/main/java/com/ym/mec/web/controller/EmployeeController.java

@@ -74,6 +74,21 @@ public class EmployeeController extends BaseController {
         return succeed();
     }
 
+    @ApiOperation(value = "当前用户是否有课程组教务老师关联")
+    @PostMapping("/hasCourseGroupRelation")
+    @PreAuthorize("@pcs.hasPermissions('employee/hasCourseGroupRelation')")
+    public Object hasCourseGroupRelation(Integer employeeId){
+        return succeed(employeeService.hasCourseGroupRelation(employeeId));
+    }
+
+    @ApiOperation(value = "修改指定的教务老师关联")
+    @PostMapping("/updateEducationTeacherId")
+    @PreAuthorize("@pcs.hasPermissions('employee/updateEducationTeacherId')")
+    public Object updateEducationTeacherId(Integer currentUserId,Integer targetUserId){
+        employeeService.updateEducationTeacherId(currentUserId,targetUserId);
+        return succeed();
+    }
+
     @ApiOperation(value = "新增员工")
     @PostMapping("/add")
     @PreAuthorize("@pcs.hasPermissions('employee/add')")

+ 86 - 2
mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java

@@ -94,6 +94,8 @@ public class ExportController extends BaseController {
     private CooperationOrganService cooperationOrganService;
     @Autowired
     private StudentPaymentRouteOrderDao studentPaymentRouteOrderDao;
+    @Autowired
+    private StudentPaymentOrderDao studentPaymentOrderDao;
 
     @Autowired
     private TeacherService teacherService;
@@ -1720,7 +1722,7 @@ public class ExportController extends BaseController {
         }
         List<String> musicGroupIds = musicGroupRegisters.stream().map(MusicGroupRegisterDto::getMusicGroupId).collect(Collectors.toList());
 
-        List<RegisterSubjectDto> registerSubjects = musicGroupDao.getRegisterSubjectNum(musicGroupIds,null);
+        List<RegisterSubjectDto> registerSubjects = musicGroupDao.getRegisterSubjectNum(musicGroupIds,null,2);
         List<MusicGroupRegisterDto> musicGroupRegisterOrders = musicGroupDao.getMusicGroupRegisterOrder(musicGroupIds);
         List<MusicGroupRegisterDto> musicGroupRegisterTotalMoneys = musicGroupDao.getMusicGroupRegisterTotalMoney(musicGroupIds);
 
@@ -2050,7 +2052,7 @@ public class ExportController extends BaseController {
         }
         List<String> musicGroupIds = musicGroupRegisters.stream().map(MusicGroupRegisterDto::getMusicGroupId).collect(Collectors.toList());
 
-        List<RegisterSubjectDto> registerSubjects = musicGroupDao.getRegisterSubjectNum(musicGroupIds,StudentMusicGroupStatusEnum.NORMAL);
+        List<RegisterSubjectDto> registerSubjects = musicGroupDao.getRegisterSubjectNum(musicGroupIds,StudentMusicGroupStatusEnum.NORMAL,null);
 
         HashSet<Integer> added = new HashSet<>();
         List<String> header = new ArrayList<>();
@@ -2117,4 +2119,86 @@ public class ExportController extends BaseController {
             }
         }
     }
+
+    @ApiOperation(value = "回款统计")
+    @RequestMapping("export/studentOrder")
+    @PreAuthorize("@pcs.hasPermissions('export/studentOrder')")
+    public void studentOrder(String organIds,Date date, HttpServletResponse response) throws IOException {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (!sysUser.getIsSuperAdmin()) {
+            Employee employee = employeeDao.get(sysUser.getId());
+            if (StringUtils.isBlank(organIds)) {
+                organIds = employee.getOrganIdList();
+            }
+        }
+        Date startTime = DateUtil.getFirstDayOfMonth(date);
+        Date EndTime = DateUtil.getLastSecondWithDay(DateUtil.getLastDayOfMonth(date));
+
+        List<OrderTypeEnum> orderTypeList = new  ArrayList<>();
+        orderTypeList.add(OrderTypeEnum.SPORADIC);
+        orderTypeList.add(OrderTypeEnum.PRACTICE_GROUP_BUY);
+        orderTypeList.add(OrderTypeEnum.PRACTICE_GROUP_RENEW);
+        orderTypeList.add(OrderTypeEnum.SMALL_CLASS_TO_BUY);
+        List<OrderByTypeExportDto> orders = studentPaymentOrderDao.getOrderByMonthAndType(organIds, orderTypeList,startTime,EndTime);
+
+        if (orders.size() <= 0) {
+            response.setStatus(200);
+            response.setContentType("Content-Type: application/json;charset=UTF-8");
+            response.getOutputStream().write("{\"data\": null, \"code\": 500, \"status\": false, \"msg\": \"没有可导出的记录\"}".getBytes());
+            response.flushBuffer();
+            return;
+        }
+        List<Long> vipGroupIds = orders.stream().filter(e -> e.getGroupType().equals(GroupType.VIP)).map(OrderByTypeExportDto::getMusicGroupId).collect(Collectors.toList());
+        List<Long> practiceGroupIds = orders.stream().filter(e -> e.getGroupType().equals(GroupType.PRACTICE)).map(OrderByTypeExportDto::getMusicGroupId).collect(Collectors.toList());
+
+        List<VipBuyResultDto> vipGroupTeachers = new ArrayList<>();
+        List<PracticeCourseDto> practiceGroupsTeacher = new ArrayList<>();
+        if(vipGroupIds.size() > 0){
+            vipGroupTeachers = vipGroupDao.getGroupTeachers(vipGroupIds);
+        }
+
+        if(practiceGroupIds.size() >0){
+            practiceGroupsTeacher = practiceGroupDao.getPracticeGroupByIds(practiceGroupIds);
+        }
+
+        for (OrderByTypeExportDto order : orders) {
+            for (VipBuyResultDto vipGroupTeacher : vipGroupTeachers) {
+                if(order.getGroupType().equals(GroupType.VIP) && order.getMusicGroupId().equals(vipGroupTeacher.getVipGroupId().longValue())){
+                    order.setTeacherName(vipGroupTeacher.getTeacherName());
+                    order.setEduTeacherName(vipGroupTeacher.getEduTeacherName());
+                }
+            }
+            for (PracticeCourseDto practiceCourseDto : practiceGroupsTeacher) {
+                if(order.getGroupType().equals(GroupType.PRACTICE) && order.getMusicGroupId().equals(practiceCourseDto.getId())){
+                    order.setTeacherName(practiceCourseDto.getTeacherName());
+                    order.setEduTeacherName(practiceCourseDto.getEduTeacherName());
+                }
+            }
+
+        }
+
+        OutputStream outputStream = response.getOutputStream();
+        try {
+            String[] header = {"学员编号", "学员姓名", "指导老师", "教务老师", "订单日期", "交易类型", "实际金额"};
+            String[] body = {"studentId", "studentName", "teacherName", "eduTeacherName", "createTime", "orderType.msg", "actualAmount"};
+
+            HSSFWorkbook workbook = POIUtil.exportExcel(header, body, orders);
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attachment;filename=lender-" + DateUtil.getDate(new Date()) + ".xls");
+            response.flushBuffer();
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+            outputStream.flush();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
 }

部分文件因文件數量過多而無法顯示