Browse Source

add 导出回款统计

周箭河 5 years ago
parent
commit
0c224fd47e

+ 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","对外课程购买"),

+ 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>

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

@@ -654,11 +654,36 @@
 
     <!-- 查找支付成功和支付中订单 -->
     <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>
     </select>
 </mapper>

File diff suppressed because it is too large
+ 386 - 367
mec-biz/src/main/resources/config/mybatis/VipGroupMapper.xml


+ 84 - 0
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;
@@ -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.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.getMusicGroupId().equals(vipGroupTeacher.getVipGroupId().longValue())){
+                    order.setTeacherName(vipGroupTeacher.getTeacherName());
+                    order.setEduTeacherName(vipGroupTeacher.getEduTeacherName());
+                }
+            }
+            for (PracticeCourseDto practiceCourseDto : practiceGroupsTeacher) {
+                if(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();
+                }
+            }
+        }
+    }
 }

Some files were not shown because too many files changed in this diff