ソースを参照

Merge branch 'saas' of http://git.dayaedu.com/yonge/mec into feature_HW_20230331

 Conflicts:
	mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
	mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
zouxuan 2 年 前
コミット
28d776ad5d
52 ファイル変更943 行追加933 行削除
  1. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ChargeTypeSubjectMapperDao.java
  2. 17 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  3. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentCalenderDao.java
  4. 8 44
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentStudentCourseDetailDao.java
  5. 1 5
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/OperatingReportCloudDao.java
  6. 4 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/OperatingReportNewDao.java
  7. 16 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentMusicCourseFeeDao.java
  8. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPaymentOrderDetailDao.java
  9. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java
  10. 3 48
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupPaymentCalenderDetailDto.java
  11. 14 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/OperatingReportNewDto1.java
  12. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ChargeTypeSubjectMapper.java
  13. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseSchedule.java
  14. 2 64
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupPaymentCalenderBase.java
  15. 9 102
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupPaymentCalenderCourseSettings.java
  16. 9 218
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupPaymentCalenderDetail.java
  17. 4 50
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupPaymentCalenderMember.java
  18. 50 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentMusicCourseFee.java
  19. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java
  20. 1 2
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentCalenderDetailService.java
  21. 33 0
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentStudentCourseDetailService.java
  22. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/OperatingReportCloudService.java
  23. 26 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentMusicCourseFeeService.java
  24. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  25. 3 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CloudTeacherOrderServiceImpl.java
  26. 49 57
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  27. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStudentPaymentServiceImpl.java
  28. 27 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MemberFeeSettingServiceImpl.java
  29. 5 14
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderCourseSettingsServiceImpl.java
  30. 55 126
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderDetailServiceImpl.java
  31. 55 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java
  32. 250 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentStudentCourseDetailServiceImpl.java
  33. 10 46
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  34. 26 39
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/OperatingReportCloudServiceImpl.java
  35. 26 8
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/OperatingReportNewServiceImpl.java
  36. 68 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentMusicCourseFeeServiceImpl.java
  37. 47 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderDetailServiceImpl.java
  38. 0 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentRouteOrderServiceImpl.java
  39. 5 0
      mec-biz/src/main/resources/config/mybatis/ChargeTypeSubjectMapperMapper.xml
  40. 15 10
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  41. 1 1
      mec-biz/src/main/resources/config/mybatis/MemberFeeSettingMapper.xml
  42. 8 2
      mec-biz/src/main/resources/config/mybatis/MusicGroupOrganizationCourseSettingsDetailMapper.xml
  43. 8 5
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderCourseSettingsMapper.xml
  44. 3 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderMapper.xml
  45. 6 2
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderMemberMapper.xml
  46. 10 37
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentStudentCourseDetailMapper.xml
  47. 0 7
      mec-biz/src/main/resources/config/mybatis/OperatingReportCloudMapper.xml
  48. 6 17
      mec-biz/src/main/resources/config/mybatis/OperatingReportNewMapper.xml
  49. 24 0
      mec-biz/src/main/resources/config/mybatis/StudentMusicCourseFeeMapper.xml
  50. 3 2
      mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderDetailMapper.xml
  51. 3 0
      mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml
  52. 5 0
      mec-util/src/main/java/com/ym/mec/util/date/DateUtil.java

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ChargeTypeSubjectMapperDao.java

@@ -29,4 +29,8 @@ public interface ChargeTypeSubjectMapperDao extends BaseDAO<Long, ChargeTypeSubj
     ChargeTypeSubjectMapper getSubjectDiscount(@Param("courseViewType") CourseViewTypeEnum courseViewType, @Param("subjectId") Integer subjectId);
 
     ChargeTypeSubjectMapper getSubjectsDiscount(@Param("courseViewType") CourseViewTypeEnum courseViewType, @Param("subjectIds") String subjectIds);
+
+    ChargeTypeSubjectMapper findByViewTypeANdSubject(@Param("courseViewType") CourseViewTypeEnum courseViewType,
+                                                     @Param("subjectId") Integer subjectId,
+                                                     @Param("tenantId") Integer tenantId);
 }

+ 17 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java

@@ -1966,6 +1966,23 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
     void batchUpdateDelFlag(@Param("courseIds") String courseIds);
 
     /**
+    * @description: 标记当月的乐团课为已结算
+     * @param currentMonth
+    * @return void
+    * @author zx
+    * @date 2023/3/29 14:51
+    */
+    void makeSettlementReport(@Param("currentMonth") String currentMonth);
+
+
+    /**
+     * @describe 判断指定课程是否已经结算
+     * @param courseScheduleId: 课程编号
+     * @return boolean
+     */
+    int checkCourseIsSettlementReport(@Param("courseScheduleId") Long courseScheduleId);
+
+    /**
      * 老师端练习列表
      *
      * @param queryInfo

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentCalenderDao.java

@@ -327,4 +327,6 @@ public interface MusicGroupPaymentCalenderDao extends BaseDAO<Long, MusicGroupPa
     * @date 2022/3/17 11:18
     */
     List<Map<Long, Integer>> findCooperationByIds(@Param("calenderIds") List<Long> calenderIds);
+
+    void updatePaymentNum(@Param("calenderId") Long calenderId, @Param("actualNum") Integer actualNum, @Param("expectNum") Integer expectNum);
 }

+ 8 - 44
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentStudentCourseDetailDao.java

@@ -1,15 +1,13 @@
 package com.ym.mec.biz.dal.dao;
 
-import java.math.BigDecimal;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.ibatis.annotations.Param;
-
 import com.ym.mec.biz.dal.dto.StudentSubTotalCourseTimesDto;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentStudentCourseDetail;
 import com.ym.mec.common.dal.BaseDAO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
 
 public interface MusicGroupPaymentStudentCourseDetailDao extends BaseDAO<Long, MusicGroupPaymentStudentCourseDetail> {
 
@@ -60,31 +58,6 @@ public interface MusicGroupPaymentStudentCourseDetailDao extends BaseDAO<Long, M
     int batchInsert(List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetailList);
 
     /**
-     * 删除用户购买乐团课程记录
-     *
-     * @param userId
-     * @param musicGroupId
-     * @return
-     */
-    int deleteByUserIdAndMusicGroupId(@Param("userId") Integer userId, @Param("musicGroupId") String musicGroupId);
-
-    /**
-     * 根据缴费编号删除信息
-     *
-     * @param musicGroupPaymentCalenderId
-     * @return
-     */
-    int deleteByMusicGroupPaymentCalenderId(Long musicGroupPaymentCalenderId);
-
-    /**
-     * 删除信息
-     *
-     * @param musicGroupPaymentCalenderDetailIdList
-     * @return
-     */
-    int deleteByMusicGroupPaymentCalenderDetailId(List<Long> musicGroupPaymentCalenderDetailIdList);
-
-    /**
      * 查询对象
      *
      * @param musicGroupPaymentCalenderDetailIdList
@@ -104,18 +77,7 @@ public interface MusicGroupPaymentStudentCourseDetailDao extends BaseDAO<Long, M
 
     List<StudentSubTotalCourseTimesDto> pageStudentSubTotalCourseTimes(Map<String, Object> params);
 
-    List<MusicGroupPaymentStudentCourseDetail> findByCalenderAndUserId(@Param("calenderId") Long calenderId, @Param("userId") Integer userId);
-
-    /**
-     * 更新学员实际缴费金额
-     *
-     * @param courseType
-     * @param musicGroupPaymentCalenderIds
-     * @param courseCurrentPrice
-     */
-    void updateByCourseType(@Param("courseType") String courseType,
-                            @Param("musicGroupPaymentCalenderIds") String musicGroupPaymentCalenderIds,
-                            @Param("courseCurrentPrice") BigDecimal courseCurrentPrice);
+    List<MusicGroupPaymentStudentCourseDetail> findByCalenderAndUserId(@Param("calenderId") String calenderId, @Param("userId") Integer userId);
 
     /**
      * @param musicGroupId
@@ -137,5 +99,7 @@ public interface MusicGroupPaymentStudentCourseDetailDao extends BaseDAO<Long, M
      */
     int clearRemainCourseMinutesByMusicGroupId(String musicGroupId);
 
-    void deleteByUserIdAndCalenderId(@Param("userId") Integer userId, @Param("calenderIds") List<Long> calenderIds);
+    void delByIds(@Param("courseDetailIds") List<Long> courseDetailIds);
+
+    List<MusicGroupPaymentStudentCourseDetail> findByUserIdAndMusicGroupId(@Param("userId") Integer userId, @Param("musicGroupId") String musicGroupId);
 }

+ 1 - 5
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/OperatingReportCloudDao.java

@@ -1,15 +1,11 @@
 package com.ym.mec.biz.dal.dao;
 
-import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.biz.dal.entity.OperatingReportCloud;
+import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 
-import java.util.List;
-
 public interface OperatingReportCloudDao extends BaseDAO<Integer, OperatingReportCloud> {
 
-    void batchInsert(@Param("operatingReportClouds") List<OperatingReportCloud> operatingReportClouds);
-
     /**
     * @description: 根据缴费项目编号查询
      * @param calenderId

+ 4 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/OperatingReportNewDao.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.dal.dao;
 
+import com.ym.mec.biz.dal.dto.OperatingReportNewDto1;
 import com.ym.mec.biz.dal.entity.OperatingReportNew;
 import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
@@ -16,10 +17,10 @@ public interface OperatingReportNewDao extends BaseDAO<Integer, OperatingReportN
     List<OperatingReportNew> sumSellAmount(String month);
 
     //云教练赠送课程服务收入
-    List<Map<Integer,BigDecimal>> sumCloudCourseAmount(@Param("firstDay") String firstDay, @Param("lastDay") String lastDay);
+//    List<Map<Integer,BigDecimal>> sumCloudCourseAmount(@Param("firstDay") String firstDay, @Param("lastDay") String lastDay);
 
     //付费课程收入
-    List<Map<Integer,BigDecimal>> sumCourseAmount(@Param("firstDay") String firstDay, @Param("lastDay") String lastDay);
+    List<Map<Integer,BigDecimal>> sumCourseAmount(@Param("firstDay") String firstDay, @Param("lastDay") String lastDay, @Param("currentYear") String currentYear);
 
     //个人云教练服务收入
     List<Map<Integer,BigDecimal>> sumPersonalCloudAmount(@Param("month") String month, @Param("firstDay") String firstDay, @Param("lastDay") String lastDay);
@@ -46,7 +47,7 @@ public interface OperatingReportNewDao extends BaseDAO<Integer, OperatingReportN
     List<Map<Integer,BigDecimal>> sumGroupAmount(@Param("month") String month);
 
     //云教练赠课预收
-    List<Map<Integer,BigDecimal>> sumCloudCoursePreAmount(@Param("lastDay") String lastDay);
+//    List<Map<Integer,BigDecimal>> sumCloudCoursePreAmount(@Param("lastDay") String lastDay);
 
     //付费课程预收
     List<Map<Integer,BigDecimal>> sumCoursePreAmount(@Param("lastDay") String lastDay);

+ 16 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentMusicCourseFeeDao.java

@@ -0,0 +1,16 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ym.mec.biz.dal.entity.StudentMusicCourseFee;
+import org.apache.ibatis.annotations.Param;
+
+import java.math.BigDecimal;
+
+public interface StudentMusicCourseFeeDao extends BaseMapper<StudentMusicCourseFee> {
+
+    void addExpectPrice(@Param("id") Integer id, @Param("expectPrice") BigDecimal expectPrice);
+
+    void cutExpectPrice(@Param("id") Integer id, @Param("expectPrice") BigDecimal expectPrice);
+
+    void addActualPrice(@Param("id") Integer id, @Param("actualPrice") BigDecimal actualPrice);
+}

+ 2 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPaymentOrderDetailDao.java

@@ -139,7 +139,8 @@ public interface StudentPaymentOrderDetailDao extends BaseDAO<Long, StudentPayme
      * @date 2020/12/7 0007
      */
     List<StudentPaymentOrderDetail> getWithUserAndOrderType(@Param("userId") Integer userId,
-                                                            @Param("orderType") OrderTypeEnum orderType);
+                                                            @Param("musicGroupId") String musicGroupId,
+                                                            @Param("orderDetailType") OrderDetailTypeEnum orderDetailType);
 
     List<StudentPaymentOrderDetail> getWithIds(@Param("paymentOrderIds") List<Long> paymentOrderIds);
 

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java

@@ -757,4 +757,6 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
     * @date 2022/10/9 18:11
     */
     List<Map<Integer, String>> queryStudentEduMap(Integer userId);
+
+    void updateCourseFee(@Param("id") Long id, @Param("musicalFee") BigDecimal musicalFee);
 }

+ 3 - 48
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupPaymentCalenderDetailDto.java

@@ -1,8 +1,11 @@
 package com.ym.mec.biz.dal.dto;
 
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail;
+import lombok.Data;
+
 import java.math.BigDecimal;
 
+@Data
 public class MusicGroupPaymentCalenderDetailDto extends MusicGroupPaymentCalenderDetail {
     //辅件
     private BigDecimal accessoriesAmount = BigDecimal.ZERO;
@@ -16,52 +19,4 @@ public class MusicGroupPaymentCalenderDetailDto extends MusicGroupPaymentCalende
     private BigDecimal activityAmount = BigDecimal.ZERO;
     //课程
     private BigDecimal courseAmount = BigDecimal.ZERO;
-
-    public BigDecimal getCourseAmount() {
-        return courseAmount;
-    }
-
-    public void setCourseAmount(BigDecimal courseAmount) {
-        this.courseAmount = courseAmount;
-    }
-
-    public BigDecimal getAccessoriesAmount() {
-        return accessoriesAmount;
-    }
-
-    public void setAccessoriesAmount(BigDecimal accessoriesAmount) {
-        this.accessoriesAmount = accessoriesAmount;
-    }
-
-    public BigDecimal getCloudAmount() {
-        return cloudAmount;
-    }
-
-    public void setCloudAmount(BigDecimal cloudAmount) {
-        this.cloudAmount = cloudAmount;
-    }
-
-    public BigDecimal getMusicalAmount() {
-        return musicalAmount;
-    }
-
-    public void setMusicalAmount(BigDecimal musicalAmount) {
-        this.musicalAmount = musicalAmount;
-    }
-
-    public BigDecimal getMaintenanceAmount() {
-        return maintenanceAmount;
-    }
-
-    public void setMaintenanceAmount(BigDecimal maintenanceAmount) {
-        this.maintenanceAmount = maintenanceAmount;
-    }
-
-    public BigDecimal getActivityAmount() {
-        return activityAmount;
-    }
-
-    public void setActivityAmount(BigDecimal activityAmount) {
-        this.activityAmount = activityAmount;
-    }
 }

+ 14 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/OperatingReportNewDto1.java

@@ -0,0 +1,14 @@
+package com.ym.mec.biz.dal.dto;
+
+import lombok.Data;
+
+@Data
+public class OperatingReportNewDto1{
+    private String musicGroupId;
+
+    private Integer userId;
+
+    private String courseType;
+
+    private Integer signClassTime;
+}

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ChargeTypeSubjectMapper.java

@@ -40,7 +40,7 @@ public class ChargeTypeSubjectMapper extends BaseEntity {
 	private BigDecimal depositFee;
 
 	/**  */
-	@ApiModelProperty(value = "课程费用(比例)",required = false)
+	@ApiModelProperty(value = "乐器收入",required = false)
 	private BigDecimal fee;
 	
 	@ApiModelProperty(value = "商品折扣率",required = false)

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseSchedule.java

@@ -158,6 +158,9 @@ public class CourseSchedule  extends BaseEntity{
 
 	private Integer isSettlement = 0;
 
+	//是否结算经营报表
+	private Boolean settlementReportFlag = false;
+
 	private String classGroupType;
 
 	private java.util.Date coursesExpireDate;
@@ -204,6 +207,14 @@ public class CourseSchedule  extends BaseEntity{
 	//当前课程是否是转换课
 	private Boolean convertFlag = false;
 
+	public Boolean getSettlementReportFlag() {
+		return settlementReportFlag;
+	}
+
+	public void setSettlementReportFlag(Boolean settlementReportFlag) {
+		this.settlementReportFlag = settlementReportFlag;
+	}
+
 	public Boolean getConvertFlag() {
 		return convertFlag;
 	}

+ 2 - 64
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupPaymentCalenderBase.java

@@ -2,10 +2,12 @@ package com.ym.mec.biz.dal.entity;
 
 import com.ym.mec.common.entity.BaseEntity;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 import java.math.BigDecimal;
 import java.util.Date;
 
+@Data
 public class MusicGroupPaymentCalenderBase extends BaseEntity {
     private long id;
 
@@ -27,68 +29,4 @@ public class MusicGroupPaymentCalenderBase extends BaseEntity {
     private Date createTime;
 
     private Date updateTime;
-
-    public long getId() {
-        return id;
-    }
-
-    public void setId(long id) {
-        this.id = id;
-    }
-
-    public BigDecimal getOriginalAmount() {
-        return originalAmount;
-    }
-
-    public void setOriginalAmount(BigDecimal originalAmount) {
-        this.originalAmount = originalAmount;
-    }
-
-    public Long getCalenderId() {
-        return calenderId;
-    }
-
-    public void setCalenderId(Long calenderId) {
-        this.calenderId = calenderId;
-    }
-
-    public Date getCreateTime() {
-        return createTime;
-    }
-
-    public void setCreateTime(Date createTime) {
-        this.createTime = createTime;
-    }
-
-    public Date getUpdateTime() {
-        return updateTime;
-    }
-
-    public void setUpdateTime(Date updateTime) {
-        this.updateTime = updateTime;
-    }
-
-    public Boolean getOptionalFlag() {
-        return optionalFlag;
-    }
-
-    public void setOptionalFlag(Boolean optionalFlag) {
-        this.optionalFlag = optionalFlag;
-    }
-
-    public BigDecimal getNum() {
-        return num;
-    }
-
-    public void setNum(BigDecimal num) {
-        this.num = num;
-    }
-
-    public BigDecimal getActualAmount() {
-        return actualAmount;
-    }
-
-    public void setActualAmount(BigDecimal actualAmount) {
-        this.actualAmount = actualAmount;
-    }
 }

+ 9 - 102
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupPaymentCalenderCourseSettings.java

@@ -1,25 +1,22 @@
 package com.ym.mec.biz.dal.entity;
 
+import com.ym.mec.common.entity.BaseEntity;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
-import com.ym.mec.biz.dal.entity.CourseSchedule.CourseScheduleType;
-import com.ym.mec.common.entity.BaseEntity;
-
 import java.math.BigDecimal;
 
 /**
  * 对应数据库表(music_group_payment_calender_course_settings):
  */
+@Data
 public class MusicGroupPaymentCalenderCourseSettings extends BaseEntity {
 
-	/**  */
 	private Integer id;
 	
-	/**  */
 	private Long musicGroupPaymentCalenderId;
 
-	/**  */
 	private String name;
 	
 	@ApiModelProperty(value = "课程类型", required = false)
@@ -33,114 +30,24 @@ public class MusicGroupPaymentCalenderCourseSettings extends BaseEntity {
 	
 	@ApiModelProperty(value = "课程原价", required = false)
 	private java.math.BigDecimal courseOriginalPrice;
-	
+
 	@ApiModelProperty(value = "课程现价", required = false)
 	private java.math.BigDecimal courseCurrentPrice;
+
+	@ApiModelProperty(value = "乐器、云教练溢出课程费用", required = false)
+	private java.math.BigDecimal overflowCoursePrice = BigDecimal.ZERO;
 	
 	@ApiModelProperty(value = "是否学生可选", required = false)
 	private boolean isStudentOptional = true;
-	
+
+
 	/**  */
 	private java.util.Date createTime;
 	
 	/**  */
 	private java.util.Date updateTime;
-
-	public void setStudentOptional(boolean studentOptional) {
-		isStudentOptional = studentOptional;
-	}
-
-	public String getName() {
-		return name;
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	public void setId(Integer id){
-		this.id = id;
-	}
-	
-	public Integer getId(){
-		return this.id;
-	}
-			
-	public void setMusicGroupPaymentCalenderId(Long musicGroupPaymentCalenderId){
-		this.musicGroupPaymentCalenderId = musicGroupPaymentCalenderId;
-	}
-	
-	public Long getMusicGroupPaymentCalenderId(){
-		return this.musicGroupPaymentCalenderId;
-	}
-			
-	public void setCourseType(CourseScheduleType courseType){
-		this.courseType = courseType;
-	}
-	
-	public CourseScheduleType getCourseType() {
-		return this.courseType;
-	}
-
-	public Integer getCourseTotalMinuties() {
-		return courseTotalMinuties;
-	}
-
-	public void setCourseTotalMinuties(Integer courseTotalMinuties) {
-		this.courseTotalMinuties = courseTotalMinuties;
-	}
-			
-	public void setUnitPrice(java.math.BigDecimal unitPrice){
-		this.unitPrice = unitPrice;
-	}
-	
-	public java.math.BigDecimal getUnitPrice(){
-		return this.unitPrice;
-	}
-			
-	public void setCourseOriginalPrice(java.math.BigDecimal courseOriginalPrice){
-		this.courseOriginalPrice = courseOriginalPrice;
-	}
-	
-	public java.math.BigDecimal getCourseOriginalPrice(){
-		return this.courseOriginalPrice;
-	}
-			
-	public void setCourseCurrentPrice(java.math.BigDecimal courseCurrentPrice){
-		this.courseCurrentPrice = courseCurrentPrice;
-	}
-	
-	public java.math.BigDecimal getCourseCurrentPrice(){
-		return this.courseCurrentPrice;
-	}
-			
-	public void setIsStudentOptional(boolean isStudentOptional){
-		this.isStudentOptional = isStudentOptional;
-	}
-	
-	public boolean getIsStudentOptional(){
-		return this.isStudentOptional;
-	}
-			
-	public void setCreateTime(java.util.Date createTime){
-		this.createTime = createTime;
-	}
-	
-	public java.util.Date getCreateTime(){
-		return this.createTime;
-	}
-			
-	public void setUpdateTime(java.util.Date updateTime){
-		this.updateTime = updateTime;
-	}
-	
-	public java.util.Date getUpdateTime(){
-		return this.updateTime;
-	}
-			
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);
 	}
-
 }

+ 9 - 218
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupPaymentCalenderDetail.java

@@ -1,21 +1,19 @@
 package com.ym.mec.biz.dal.entity;
 
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
-
+import com.ym.mec.common.entity.BaseEntity;
 import io.swagger.annotations.ApiModelProperty;
-
+import lombok.Data;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
-import com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus;
-import com.ym.mec.common.entity.BaseEntity;
-
 import java.math.BigDecimal;
-import java.util.Date;
 
 /**
  * 对应数据库表(music_group_payment_calender_detail):
  */
+@Data
 public class MusicGroupPaymentCalenderDetail extends BaseEntity {
 
 	/**  */
@@ -28,15 +26,16 @@ public class MusicGroupPaymentCalenderDetail extends BaseEntity {
 	private Integer userId;
 
 	/** 废弃字段,如果需要查看金额,请前往订单详情 */
-	private java.math.BigDecimal expectAmount;
+	//经营报表乐器收入
+	private java.math.BigDecimal expectAmount = BigDecimal.ZERO;
 
 	/** 废弃字段,如果需要查看金额,请前往订单详情 */
-	//经营报表需要,重新定义该字段
+	//经营报表云教练收入
 	private java.math.BigDecimal expectMemberAmount = BigDecimal.ZERO;
 	
 	/** 废弃字段,如果需要查看金额,请前往订单详情 */
-	//经营报表需要,重新定义该字段,记录云教练缴费课程预收(经营报表当月,根据缴费项目锁排课程总成本)
-	private java.math.BigDecimal actualAmount;
+	//经营报表溢出的课程费用
+	private java.math.BigDecimal actualAmount = BigDecimal.ZERO;
 	
 	/**  */
 	private PaymentStatus paymentStatus;
@@ -89,216 +88,8 @@ public class MusicGroupPaymentCalenderDetail extends BaseEntity {
 	
 	private SysUser responsible = new SysUser();
 
-	public BigDecimal getExpectMemberAmount() {
-		return expectMemberAmount;
-	}
-
-	public void setExpectMemberAmount(BigDecimal expectMemberAmount) {
-		this.expectMemberAmount = expectMemberAmount;
-	}
-
-	public MusicGroupPaymentCalender.PaymentType getPaymentType() {
-		return paymentType;
-	}
-
-	public void setPaymentType(MusicGroupPaymentCalender.PaymentType paymentType) {
-		this.paymentType = paymentType;
-	}
-
-	public Date getStartPaymentDateMgpc() {
-		return startPaymentDateMgpc;
-	}
-
-	public void setStartPaymentDateMgpc(Date startPaymentDateMgpc) {
-		this.startPaymentDateMgpc = startPaymentDateMgpc;
-	}
-
-	public Date getDeadlinePaymentDateMgpc() {
-		return deadlinePaymentDateMgpc;
-	}
-
-	public void setDeadlinePaymentDateMgpc(Date deadlinePaymentDateMgpc) {
-		this.deadlinePaymentDateMgpc = deadlinePaymentDateMgpc;
-	}
-
-	public YesOrNoEnum getOpenFlag() {
-		return openFlag;
-	}
-
-	public void setOpenFlag(YesOrNoEnum openFlag) {
-		this.openFlag = openFlag;
-	}
-
 	private StudentRegistration studentRegistration = new StudentRegistration();
 
-	public String getMusicGroupId() {
-		return musicGroupId;
-	}
-
-	public void setMusicGroupId(String musicGroupId) {
-		this.musicGroupId = musicGroupId;
-	}
-
-	public Date getStartPaymentDate() {
-		return startPaymentDate;
-	}
-
-	public void setStartPaymentDate(Date startPaymentDate) {
-		this.startPaymentDate = startPaymentDate;
-	}
-
-	public Date getDeadlinePaymentDate() {
-		return deadlinePaymentDate;
-	}
-
-	public void setDeadlinePaymentDate(Date deadlinePaymentDate) {
-		this.deadlinePaymentDate = deadlinePaymentDate;
-	}
-
-	public Integer getOpen() {
-		return open;
-	}
-
-	public void setOpen(Integer open) {
-		this.open = open;
-	}
-
-	public StudentRegistration getStudentRegistration() {
-		return studentRegistration;
-	}
-
-	public void setStudentRegistration(StudentRegistration studentRegistration) {
-		this.studentRegistration = studentRegistration;
-	}
-
-	public SysUser getSysUser() {
-		return sysUser;
-	}
-
-	public void setSysUser(SysUser sysUser) {
-		this.sysUser = sysUser;
-	}
-
-	public void setId(Long id){
-		this.id = id;
-	}
-	
-	public Long getId(){
-		return this.id;
-	}
-			
-	public void setMusicGroupPaymentCalenderId(Long musicGroupPaymentCalenderId){
-		this.musicGroupPaymentCalenderId = musicGroupPaymentCalenderId;
-	}
-	
-	public Long getMusicGroupPaymentCalenderId(){
-		return this.musicGroupPaymentCalenderId;
-	}
-
-	public Long getPaymentOrderId() {
-		return paymentOrderId;
-	}
-
-	public void setPaymentOrderId(Long paymentOrderId) {
-		this.paymentOrderId = paymentOrderId;
-	}
-
-	public void setUserId(Integer userId){
-		this.userId = userId;
-	}
-	
-	public Integer getUserId(){
-		return this.userId;
-	}
-			
-	public void setExpectAmount(java.math.BigDecimal expectAmount){
-		this.expectAmount = expectAmount;
-	}
-	
-	public java.math.BigDecimal getExpectAmount(){
-		return this.expectAmount;
-	}
-			
-	public void setActualAmount(java.math.BigDecimal actualAmount){
-		this.actualAmount = actualAmount;
-	}
-	
-	public java.math.BigDecimal getActualAmount(){
-		return this.actualAmount;
-	}
-			
-	public void setPaymentStatus(PaymentStatus paymentStatus){
-		this.paymentStatus = paymentStatus;
-	}
-	
-	public PaymentStatus getPaymentStatus(){
-		return this.paymentStatus;
-	}
-			
-	public void setUserStatus(String userStatus){
-		this.userStatus = userStatus;
-	}
-	
-	public String getUserStatus(){
-		return this.userStatus;
-	}
-			
-	public void setPayTime(java.util.Date payTime){
-		this.payTime = payTime;
-	}
-	
-	public java.util.Date getPayTime(){
-		return this.payTime;
-	}
-			
-	public void setUpdateTime(java.util.Date updateTime){
-		this.updateTime = updateTime;
-	}
-	
-	public java.util.Date getUpdateTime(){
-		return this.updateTime;
-	}
-			
-	public void setCreateTime(java.util.Date createTime){
-		this.createTime = createTime;
-	}
-	
-	public java.util.Date getCreateTime(){
-		return this.createTime;
-	}
-
-	public Integer getUseInCourse() {
-		return useInCourse;
-	}
-
-	public void setUseInCourse(Integer useInCourse) {
-		this.useInCourse = useInCourse;
-	}
-
-	public Integer getResponsibleUserId() {
-		return responsibleUserId;
-	}
-
-	public void setResponsibleUserId(Integer responsibleUserId) {
-		this.responsibleUserId = responsibleUserId;
-	}
-
-	public String getResponsibleRecord() {
-		return responsibleRecord;
-	}
-
-	public void setResponsibleRecord(String responsibleRecord) {
-		this.responsibleRecord = responsibleRecord;
-	}
-
-	public SysUser getResponsible() {
-		return responsible;
-	}
-
-	public void setResponsible(SysUser responsible) {
-		this.responsible = responsible;
-	}
-
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

+ 4 - 50
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupPaymentCalenderMember.java

@@ -2,9 +2,11 @@ package com.ym.mec.biz.dal.entity;
 
 import com.ym.mec.biz.dal.enums.PeriodEnum;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 import java.math.BigDecimal;
 
+@Data
 public class MusicGroupPaymentCalenderMember extends MusicGroupPaymentCalenderBase{
     @ApiModelProperty(value = "会员名称", required = false)
     private String name;
@@ -20,54 +22,6 @@ public class MusicGroupPaymentCalenderMember extends MusicGroupPaymentCalenderBa
     @ApiModelProperty(value = "自动激活团练宝标识", required = false)
     private Boolean autoActivationFlag = false;
 
-    @ApiModelProperty(value = "团练宝收入,actualAmount减去收入以及其他费用,剩下的就是课程费用", required = false)
-    private BigDecimal income;
-
-    public BigDecimal getIncome() {
-        return income;
-    }
-
-    public void setIncome(BigDecimal income) {
-        this.income = income;
-    }
-
-    public Boolean getAutoActivationFlag() {
-        return autoActivationFlag;
-    }
-
-    public void setAutoActivationFlag(Boolean autoActivationFlag) {
-        this.autoActivationFlag = autoActivationFlag;
-    }
-
-    public Integer getOrganId() {
-        return organId;
-    }
-
-    public void setOrganId(Integer organId) {
-        this.organId = organId;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public PeriodEnum getPeriod() {
-        return period;
-    }
-
-    public void setPeriod(PeriodEnum period) {
-        this.period = period;
-    }
-
-    public Integer getMemberRankSettingId() {
-        return memberRankSettingId;
-    }
-
-    public void setMemberRankSettingId(Integer memberRankSettingId) {
-        this.memberRankSettingId = memberRankSettingId;
-    }
+    @ApiModelProperty(value = "团练宝收入实际收入,用于结算经营报表,actualAmount减去收入以及其他费用,剩下的就是课程费用", required = false)
+    private BigDecimal income = BigDecimal.ZERO;
 }

+ 50 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentMusicCourseFee.java

@@ -0,0 +1,50 @@
+package com.ym.mec.biz.dal.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.ym.mec.common.entity.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 对应数据库表(student_music_course_fee):
+ */
+@Data
+public class StudentMusicCourseFee{
+
+	@TableId(value = "id_", type = IdType.AUTO)
+	private Integer id;
+
+	@TableField("user_id_")
+	@ApiModelProperty(value = "学员编号",required = false)
+	private Integer userId;
+
+	@TableField("organ_id_")
+	@ApiModelProperty(value = "分部编号",required = false)
+	private Integer organId;
+
+	@TableField("music_group_id_")
+	@ApiModelProperty(value = "乐团编号",required = false)
+	private String musicGroupId;
+
+	@TableField("expect_price_")
+	@ApiModelProperty(value = "预计总课费",required = false)
+	private BigDecimal expectPrice = BigDecimal.ZERO;
+
+	@TableField("actual_price_")
+	@ApiModelProperty(value = "实收总课费",required = false)
+	private BigDecimal actualPrice = BigDecimal.ZERO;
+
+	@TableField("receivable_price_")
+	@ApiModelProperty(value = "应收",required = false)
+	private BigDecimal receivablePrice = BigDecimal.ZERO;
+
+	@TableField("create_time_")
+	private String createTime;
+
+	@TableField("update_time_")
+	private String updateTime;
+}

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java

@@ -303,6 +303,8 @@ public interface CourseScheduleService extends BaseService<Long, CourseSchedule>
 	 */
 	boolean checkSingleCourseConflict(CourseSchedule courseSchedule, List<CourseSchedule> adjustCourses, Map<String, List<CourseSchedule>> result);
 
+	void checkCourseIsSettlement(CourseSchedule courseSchedule);
+
 	/**
 	 * @describe 课程时间校正,将冲突课程的时间校正到当天空闲时间段
 	 * @author Joburgess

+ 1 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentCalenderDetailService.java

@@ -97,10 +97,9 @@ public interface MusicGroupPaymentCalenderDetailService extends BaseService<Long
     /**
     * @description: 生成缴费项目学员详情
      * @param studentPaymentOrder
- * @param studentRegistration
     * @return void
     * @author zx
     * @date 2021/12/30 15:16
     */
-    void addCalenderDetail(StudentPaymentOrder studentPaymentOrder,StudentRegistration studentRegistration);
+    MusicGroupPaymentCalenderDetail addCalenderDetail(StudentPaymentOrder studentPaymentOrder);
 }

+ 33 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentStudentCourseDetailService.java

@@ -1,8 +1,41 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderCourseSettings;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentStudentCourseDetail;
 import com.ym.mec.common.service.BaseService;
 
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
 public interface MusicGroupPaymentStudentCourseDetailService extends BaseService<Long, MusicGroupPaymentStudentCourseDetail> {
 
+    /**
+    * @description: 新增学员可排课时长
+     * @param userIdList
+     * @param calender
+     * @param userCalenderDetailMap
+    * @return void
+    * @author zx
+    * @date 2023/3/23 11:07
+    */
+    void batchInsert(Set<Integer> userIdList,
+                     MusicGroupPaymentCalender calender,
+                     Map<Integer, Long> userCalenderDetailMap);
+
+    void batchInsert(Integer userId,
+                     MusicGroupPaymentCalender musicGroupPaymentCalender,
+                     Long calenderDetailId,
+                     Long paymentOrderId);
+
+    List<MusicGroupPaymentStudentCourseDetail> queryByMusicGroupPaymentStudentCourseDetailId(List<Long> musicGroupPaymentCalenderDetailIdList);
+
+    void deleteByMusicGroupPaymentCalenderDetailId(List<Long> musicGroupPaymentCalenderDetailIdList);
+
+    void deleteByMusicGroupPaymentCalenderId(String calenderId,Integer userId);
+
+    void deleteByUserIdAndMusicGroupId(Integer userId, String musicGroupId);
+
+    void clearRemainCourseMinutesByMusicGroupId(String musicGroupId);
 }

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/OperatingReportCloudService.java

@@ -22,7 +22,7 @@ public interface OperatingReportCloudService extends BaseService<Integer, Operat
     * @author zx
     * @date 2022/9/6 10:09
     */
-    void updateSet(MusicGroupPaymentCalender musicGroupPaymentCalender, Long orderId);
+    void updateSet(MusicGroupPaymentCalender musicGroupPaymentCalender, BigDecimal amount);
 
     /**
     * @description: 乐团排课、活动排课,计算课程预收

+ 26 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentMusicCourseFeeService.java

@@ -0,0 +1,26 @@
+package com.ym.mec.biz.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ym.mec.biz.dal.dao.StudentMusicCourseFeeDao;
+import com.ym.mec.biz.dal.entity.StudentMusicCourseFee;
+
+import java.math.BigDecimal;
+
+
+/**
+* @description: 学员乐团课程费用汇总
+* @author zx
+* @date 2023/3/22 16:39
+*/
+public interface StudentMusicCourseFeeService extends IService<StudentMusicCourseFee> {
+
+    StudentMusicCourseFeeDao getDao();
+
+    void addActualPrice(Integer userId, String musicGroupId, BigDecimal actualPrice);
+
+    void addExpectPrice(Integer userId, String musicGroupId, BigDecimal expectPrice);
+
+    void cutExpectPrice(Integer userId, String musicGroupId, BigDecimal expectPrice);
+}
+
+

+ 2 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java

@@ -1216,7 +1216,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             for (MusicGroupPaymentCalenderCourseSettings musicGroupPaymentCalenderCourseSettings : musicGroupPaymentCalenderCourseSettingsList) {
                 unitPriceMap.put(
                         musicGroupPaymentCalenderCourseSettings.getCourseType(),
-                        musicGroupPaymentCalenderCourseSettings.getCourseCurrentPrice().divide(
+                        musicGroupPaymentCalenderCourseSettings.getOverflowCoursePrice().divide(
                                 new BigDecimal(musicGroupPaymentCalenderCourseSettings.getCourseTotalMinuties()), CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_DOWN));
 
                 originUnitPriceMap.put(
@@ -4167,7 +4167,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                             throw new BizException("请先设置分部课程类型单价");
                         }
                         if (defaultUnitPrice.getUnitPrice().multiply(new BigDecimal(courseSettings.getCourseTotalMinuties())).setScale(0, BigDecimal.ROUND_HALF_UP)
-                                .compareTo(courseSettings.getCourseCurrentPrice()) != 0) {
+                                .compareTo(courseSettings.getOverflowCoursePrice()) != 0) {
                             status = AUDITING;
                             break;
                         }

+ 3 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CloudTeacherOrderServiceImpl.java

@@ -288,12 +288,13 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
         cloudTeacherOrder.setAmount(cloudTeacherFee);
         cloudTeacherOrder.setStudentId(order.getUserId());
         cloudTeacherOrder.setStatus(1);
-        MusicGroupPaymentCalender calender = musicGroupPaymentCalenderDao.get(order.getCalenderId());
+        cloudTeacherOrder.setOperatingAmount(calenderMember.getIncome().compareTo(BigDecimal.ZERO) == 0?cloudTeacherFee:calenderMember.getIncome());
+        /*MusicGroupPaymentCalender calender = musicGroupPaymentCalenderDao.get(order.getCalenderId());
         if(calender.getCloudTeacherPaymentFlag()){
             cloudTeacherOrder.setOperatingAmount(BigDecimal.ZERO);
         }else {
             cloudTeacherOrder.setOperatingAmount(cloudTeacherFee);
-        }
+        }*/
         //保存云教练订单
         this.save(cloudTeacherOrder,calenderMember.getAutoActivationFlag());
     }

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

@@ -39,7 +39,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.TransactionStatus;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
@@ -58,11 +57,8 @@ import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import static com.ym.mec.biz.dal.entity.CourseSchedule.CourseScheduleType.MIX;
 import static com.ym.mec.biz.dal.entity.CourseSchedule.CourseScheduleType.MUSIC_NETWORK;
-import static com.ym.mec.biz.dal.enums.ClassGroupTypeEnum.HIGH_ONLINE;
 import static com.ym.mec.biz.dal.enums.GroupType.*;
-import static com.ym.mec.biz.dal.enums.MusicGroupStatusEnum.PROGRESS;
 import static com.ym.mec.biz.dal.enums.PracticeGroupType.FREE;
 import static com.ym.mec.biz.dal.enums.PracticeGroupType.TRIAL;
 import static com.ym.mec.biz.dal.enums.SysUserRoleEnum.ORGAN_MANAGER;
@@ -1670,30 +1666,22 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 					CourseSchedule currentCourseSchedule = courseSchedules.get(courseStartDates.size() - 1);
 					int singleClassMinutes = DateUtil.minutesBetween(currentCourseSchedule.getStartClassTime(), currentCourseSchedule.getEndClassTime());
 					Date courseEndTime = DateUtil.addMinutes(courseStartTime, singleClassMinutes);
-					int settlementNum = courseScheduleTeacherSalaryDao.checkCourseIsSettlement(courseSchedules.get(courseStartDates.size() - 1).getId().intValue());
-					if (settlementNum > 0) {
-						throw new BizException("{}[{}]{}-{}课程已结算",
-								courseSchedules.get(courseStartDates.size() - 1).getName(),
-								courseSchedules.get(courseStartDates.size() - 1).getId(),
-								DateUtil.dateToString(courseSchedules.get(courseStartDates.size() - 1).getStartClassTime(),
-										DateUtil.ISO_EXPANDED_DATE_TIME_FORMAT),
-								DateUtil.dateToString(courseSchedules.get(courseStartDates.size() - 1).getEndClassTime(),
-										DateUtil.ISO_EXPANDED_DATE_TIME_FORMAT));
-					}
-					int num = studentAttendanceDao.countStudentAttendenceNum(courseSchedules.get(courseStartDates.size() - 1).getId().intValue());
+					//校验课程是否结算
+					this.checkCourseIsSettlement(currentCourseSchedule);
+					int num = studentAttendanceDao.countStudentAttendenceNum(currentCourseSchedule.getId().intValue());
 					if (num > 0) {
 						throw new BizException("{}[{}]{}-{}课程已点名",
-								courseSchedules.get(courseStartDates.size() - 1).getName(),
-								courseSchedules.get(courseStartDates.size() - 1).getId(),
-								DateUtil.dateToString(courseSchedules.get(courseStartDates.size() - 1).getStartClassTime(),
+								currentCourseSchedule.getName(),
+								currentCourseSchedule.getId(),
+								DateUtil.dateToString(currentCourseSchedule.getStartClassTime(),
 										DateUtil.EXPANDED_DATE_TIME_FORMAT),
-								DateUtil.dateToString(courseSchedules.get(courseStartDates.size() - 1).getEndClassTime(),
+								DateUtil.dateToString(currentCourseSchedule.getEndClassTime(),
 										DateUtil.EXPANDED_DATE_TIME_FORMAT));
 					}
-					courseSchedules.get(courseStartDates.size() - 1).setStatus(CourseStatusEnum.NOT_START);
-					courseSchedules.get(courseStartDates.size() - 1).setClassDate(courseStartTime);
-					courseSchedules.get(courseStartDates.size() - 1).setStartClassTime(courseStartTime);
-					courseSchedules.get(courseStartDates.size() - 1).setEndClassTime(courseEndTime);
+					currentCourseSchedule.setStatus(CourseStatusEnum.NOT_START);
+					currentCourseSchedule.setClassDate(courseStartTime);
+					currentCourseSchedule.setStartClassTime(courseStartTime);
+					currentCourseSchedule.setEndClassTime(courseEndTime);
 				}
 				if (courseStartDates.size() == adjustCourseScheduleIds.size()) {
 					break;
@@ -1714,6 +1702,23 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 	}
 
 	@Override
+	public void checkCourseIsSettlement(CourseSchedule courseSchedule) {
+		int settlementNum = courseScheduleTeacherSalaryDao.checkCourseIsSettlement(courseSchedule.getId().intValue());
+		if(settlementNum <= 0){
+			settlementNum = courseScheduleDao.checkCourseIsSettlementReport(courseSchedule.getId());
+		}
+		if (settlementNum > 0) {
+			throw new BizException("{}[{}]{}-{}课程已结算",
+					courseSchedule.getName(),
+					courseSchedule.getId(),
+					DateUtil.dateToString(courseSchedule.getStartClassTime(),
+							DateUtil.ISO_EXPANDED_DATE_TIME_FORMAT),
+					DateUtil.dateToString(courseSchedule.getEndClassTime(),
+							DateUtil.ISO_EXPANDED_DATE_TIME_FORMAT));
+		}
+	}
+
+	@Override
 	public boolean courseTimeRevise(CourseSchedule courseSchedule, List<CourseSchedule> sameDayCourses) {
 		int singleClassMinutes = DateUtil.minutesBetween(courseSchedule.getStartClassTime(), courseSchedule.getEndClassTime());
 		sameDayCourses.sort(Comparator.comparing(CourseSchedule::getStartClassTime));
@@ -2443,30 +2448,23 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
                         throw new BizException("单节课时不允许跨天");
                     }
                     courseStartDates.add(DateUtil.stringToDate(dateYmdStr, DateUtil.EXPANDED_DATE_TIME_FORMAT));
-                    int settlementNum = courseScheduleTeacherSalaryDao.checkCourseIsSettlement(courseSchedules.get(courseStartDates.size() - 1).getId().intValue());
-                    if (settlementNum > 0) {
-                        throw new BizException("{}[{}]{}-{}课程已结算",
-                                courseSchedules.get(courseStartDates.size() - 1).getName(),
-                                courseSchedules.get(courseStartDates.size() - 1).getId(),
-                                DateUtil.dateToString(courseSchedules.get(courseStartDates.size() - 1).getStartClassTime(),
-                                        DateUtil.ISO_EXPANDED_DATE_TIME_FORMAT),
-                                DateUtil.dateToString(courseSchedules.get(courseStartDates.size() - 1).getEndClassTime(),
-                                        DateUtil.ISO_EXPANDED_DATE_TIME_FORMAT));
-                    }
-                    int num = studentAttendanceDao.countStudentAttendenceNum(courseSchedules.get(courseStartDates.size() - 1).getId().intValue());
+					CourseSchedule courseSchedule = courseSchedules.get(courseStartDates.size() - 1);
+					//校验课程是否结算
+					this.checkCourseIsSettlement(courseSchedule);
+                    int num = studentAttendanceDao.countStudentAttendenceNum(courseSchedule.getId().intValue());
                     if (num > 0) {
                         throw new BizException("{}[{}]{}-{}课程已点名",
-                                courseSchedules.get(courseStartDates.size() - 1).getName(),
-                                courseSchedules.get(courseStartDates.size() - 1).getId(),
-                                DateUtil.dateToString(courseSchedules.get(courseStartDates.size() - 1).getStartClassTime(),
+								courseSchedule.getName(),
+								courseSchedule.getId(),
+                                DateUtil.dateToString(courseSchedule.getStartClassTime(),
                                         DateUtil.EXPANDED_DATE_TIME_FORMAT),
-                                DateUtil.dateToString(courseSchedules.get(courseStartDates.size() - 1).getEndClassTime(),
+                                DateUtil.dateToString(courseSchedule.getEndClassTime(),
                                         DateUtil.EXPANDED_DATE_TIME_FORMAT));
                     }
-                    courseSchedules.get(courseStartDates.size() - 1).setStatus(CourseStatusEnum.NOT_START);
-                    courseSchedules.get(courseStartDates.size() - 1).setClassDate(courseStartTime);
-                    courseSchedules.get(courseStartDates.size() - 1).setStartClassTime(courseStartTime);
-                    courseSchedules.get(courseStartDates.size() - 1).setEndClassTime(courseEndTime);
+                    courseSchedule.setStatus(CourseStatusEnum.NOT_START);
+                    courseSchedule.setClassDate(courseStartTime);
+                    courseSchedule.setStartClassTime(courseStartTime);
+                    courseSchedule.setEndClassTime(courseEndTime);
 
 					Integer allowOnlineToOffline = 0;
 					if(Objects.nonNull(vipGroupActivity)){
@@ -2480,9 +2478,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 					}
 
 					if (Objects.nonNull(vipGroupCourseAdjustInfo.getTeachMode())) {
-                    	boolean onlineToOffline = courseSchedules.get(courseStartDates.size() - 1).getTeachMode().equals(TeachModeEnum.ONLINE)
+                    	boolean onlineToOffline = courseSchedule.getTeachMode().equals(TeachModeEnum.ONLINE)
 								&&vipGroupCourseAdjustInfo.getTeachMode().equals(TeachModeEnum.OFFLINE);
-						boolean offlineToOnline = courseSchedules.get(courseStartDates.size() - 1).getTeachMode().equals(TeachModeEnum.OFFLINE)
+						boolean offlineToOnline = courseSchedule.getTeachMode().equals(TeachModeEnum.OFFLINE)
 								&&vipGroupCourseAdjustInfo.getTeachMode().equals(TeachModeEnum.ONLINE);
                         if(onlineToOffline && Objects.nonNull(vipGroupActivity) && (allowOnlineToOffline == 0 || allowOnlineToOffline == 3)){
                             throw new BizException("此VIP课活动不支持线上课调整为线下课");
@@ -2493,13 +2491,13 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 						if(onlineToOffline&&Objects.isNull(vipGroupCourseAdjustInfo.getSchoolId())){
 							throw new BizException("请选择教学点");
 						}
-                        courseSchedules.get(courseStartDates.size() - 1).setTeachMode(vipGroupCourseAdjustInfo.getTeachMode());
+						courseSchedule.setTeachMode(vipGroupCourseAdjustInfo.getTeachMode());
                         if (vipGroupCourseAdjustInfo.getTeachMode().equals(TeachModeEnum.OFFLINE)) {
                             if(Objects.nonNull(vipGroupCourseAdjustInfo.getSchoolId())){
-                                courseSchedules.get(courseStartDates.size() - 1).setSchoolId(vipGroupCourseAdjustInfo.getSchoolId());
+								courseSchedule.setSchoolId(vipGroupCourseAdjustInfo.getSchoolId());
                             }
                         } else {
-                            courseSchedules.get(courseStartDates.size() - 1).setSchoolId(null);
+							courseSchedule.setSchoolId(null);
                         }
                     }
                 }
@@ -3111,16 +3109,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			newCourseSchedule.setValidStartTime(oldCourseSchedule.getValidStartTime());
 
             //课程是否已结算
-            int settlementNum = courseScheduleTeacherSalaryDao.checkCourseIsSettlement(oldCourseSchedule.getId().intValue());
-            if (settlementNum > 0) {
-                throw new BizException("{}[{}]{}-{}课程已结算",
-                        oldCourseSchedule.getName(),
-                        oldCourseSchedule.getId(),
-                        DateUtil.dateToString(oldCourseSchedule.getStartClassTime(),
-                                DateUtil.EXPANDED_DATE_TIME_FORMAT),
-                        DateUtil.dateToString(oldCourseSchedule.getEndClassTime(),
-                                DateUtil.EXPANDED_DATE_TIME_FORMAT));
-            }
+			this.checkCourseIsSettlement(oldCourseSchedule);
 
 			if (newCourseSchedule.getGroupType() != GroupType.COMM) {
 				// 学生已点名不能调整(请假可以调整)
@@ -4010,6 +3999,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         }
 
         int settlementTimes = courseScheduleTeacherSalaryDao.checkCourseIsSettlement(courseScheduleComplaints.getCourseScheduleId().intValue());
+		if(settlementTimes <= 0){
+			settlementTimes = courseScheduleDao.checkCourseIsSettlementReport(courseScheduleComplaints.getCourseScheduleId());
+		}
         if (settlementTimes > 0) {
             throw new BizException("该课程已结算");
         }

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStudentPaymentServiceImpl.java

@@ -341,7 +341,7 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 				BigDecimal unitMinuteOriginalPrice = courseSetting.getCourseOriginalPrice().divide(new BigDecimal(courseSetting.getCourseTotalMinuties()), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
 
 				//课程每分钟现价
-				BigDecimal unitMinuteCurrentPrice = courseSetting.getCourseCurrentPrice().divide(new BigDecimal(courseSetting.getCourseTotalMinuties()), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
+				BigDecimal unitMinuteCurrentPrice = courseSetting.getOverflowCoursePrice().divide(new BigDecimal(courseSetting.getCourseTotalMinuties()), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
 
 				//默认课程时长
 				int courseDuration = Integer.parseInt(jsonObject.get(courseSchedule.getType().getCode()).toString());

+ 27 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MemberFeeSettingServiceImpl.java

@@ -122,4 +122,31 @@ public class MemberFeeSettingServiceImpl extends BaseServiceImpl<Integer, Member
         return amount;
     }
 
+    public static BigDecimal getIncome (PeriodEnum periodEnum, MemberFeeSetting memberFee) {
+        BigDecimal amount;
+        switch (periodEnum) {
+            case DAY:
+                amount = memberFee.getIncomeDayFee();
+                break;
+            case MONTH:
+                amount = memberFee.getIncomeMonthFee();
+                break;
+            case QUARTERLY:
+                amount = memberFee.getIncomeQuarterlyFee();
+                break;
+            case YEAR_HALF:
+                amount = memberFee.getIncomeHalfYearFee();
+                break;
+            case YEAR:
+                amount = memberFee.getIncomeYearFee();
+                break;
+            default:
+                throw new BizException("请选择正确的会员有效期");
+        }
+        if (Objects.isNull(amount)) {
+            throw new BizException("未设置云教练经营报表确认收入");
+        }
+        return amount;
+    }
+
 }

+ 5 - 14
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderCourseSettingsServiceImpl.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.service.impl;
 
 import com.ym.mec.biz.dal.dao.MusicGroupOrganizationCourseSettingsDetailDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderCourseSettingsDao;
 import com.ym.mec.biz.dal.dao.MusicGroupPaymentStudentCourseDetailDao;
 import com.ym.mec.biz.dal.dao.OrganizationCourseUnitPriceSettingsDao;
 import com.ym.mec.biz.dal.dto.MusicGroupPaymentBaseCalender;
@@ -8,26 +9,18 @@ import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.CalenderBaseServiceEnum;
 import com.ym.mec.biz.service.MusicGroupOrganizationCourseSettingsService;
 import com.ym.mec.biz.service.MusicGroupPaymentCalenderBaseService;
-import com.ym.mec.common.controller.BaseController;
-import com.ym.mec.common.exception.BizException;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpStatus;
-import org.springframework.stereotype.Service;
-
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderCourseSettingsDao;
 import com.ym.mec.biz.service.MusicGroupPaymentCalenderCourseSettingsService;
 import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
-import org.springframework.transaction.interceptor.TransactionAspectSupport;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
 import java.util.*;
-import java.util.function.BiFunction;
-import java.util.function.BinaryOperator;
 import java.util.stream.Collectors;
 
-import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PayUserType.SCHOOL;
 import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentCalenderStatusEnum.AUDITING;
 import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentType.MUSIC_APPLY;
 import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentType.MUSIC_RENEW;
@@ -90,13 +83,11 @@ public class MusicGroupPaymentCalenderCourseSettingsServiceImpl extends BaseServ
     public void batchInsert(MusicGroupPaymentCalender musicGroupPaymentCalender) {
 		List<MusicGroupPaymentCalenderCourseSettings> musicGroupPaymentCalenderCourseSettingss = musicGroupPaymentCalender.getMusicGroupPaymentCalenderCourseSettingsList();
 		if (musicGroupPaymentCalenderCourseSettingss != null && musicGroupPaymentCalenderCourseSettingss.size() > 0) {
-//			if (musicGroupPaymentCalender.getPayUserType() == SCHOOL) {
-//				musicGroupPaymentCalenderCourseSettingss.forEach(e->e.setCourseCurrentPrice(BigDecimal.ZERO));
-//			}
 			MusicGroupOrganizationCourseSettings courseSettings = musicGroupOrganizationCourseSettingsService.get(musicGroupPaymentCalender
 					.getMusicGroupOrganizationCourseSettingId());
 			for (MusicGroupPaymentCalenderCourseSettings musicGroupPaymentCalenderCourseSettings : musicGroupPaymentCalenderCourseSettingss) {
 				musicGroupPaymentCalenderCourseSettings.setMusicGroupPaymentCalenderId(musicGroupPaymentCalender.getId());
+				musicGroupPaymentCalenderCourseSettings.setOverflowCoursePrice(musicGroupPaymentCalenderCourseSettings.getOverflowCoursePrice().add(musicGroupPaymentCalenderCourseSettings.getCourseCurrentPrice()));
 				if (courseSettings != null) {
 					musicGroupPaymentCalenderCourseSettings.setName(courseSettings.getName());
 				}

+ 55 - 126
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderDetailServiceImpl.java

@@ -8,6 +8,7 @@ import com.ym.mec.biz.dal.dto.SimpleUserDto;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentCalenderStatusEnum;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus;
+import com.ym.mec.biz.dal.enums.CourseViewTypeEnum;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.enums.OrderDetailTypeEnum;
 import com.ym.mec.biz.dal.page.ArrearageStudentsQueryInfo;
@@ -46,9 +47,7 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
     @Autowired
     private MusicGroupPaymentCalenderService musicGroupPaymentCalenderService;
     @Autowired
-    private MusicGroupPaymentCalenderCourseSettingsDao musicGroupPaymentCalenderCourseSettingsDao;
-    @Autowired
-    private MusicGroupPaymentStudentCourseDetailDao musicGroupPaymentStudentCourseDetailDao;
+    private MusicGroupPaymentStudentCourseDetailService musicGroupPaymentStudentCourseDetailService;
     @Autowired
     private MusicGroupDao musicGroupDao;
     @Autowired
@@ -70,11 +69,11 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
     @Autowired
     private StudentPaymentOrderDao studentPaymentOrderDao;
     @Autowired
-    private StudentDao studentDao;
-    @Autowired
     private VipGroupActivityDao vipGroupActivityDao;
     @Autowired
     private OperatingReportCloudService operatingReportCloudService;
+    @Autowired
+    private MemberFeeSettingService memberFeeSettingService;
 
     @Override
     public BaseDAO<Long, MusicGroupPaymentCalenderDetail> getDAO() {
@@ -215,15 +214,11 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
             throw new BizException("操作失败:包含已存在的学员");
         }
 
-        List<MusicGroupPaymentCalenderCourseSettings> courseSettingsList = musicGroupPaymentCalenderCourseSettingsDao.getWithPaymentCalender(musicGroupPaymentCalenderId);
-
         Date date = new Date();
         MusicGroupPaymentCalenderDetail musicGroupPaymentCalenderDetail = null;
-        Map<Integer, Long> userMap = new HashMap<>();
+        Map<Integer, Long> userCalenderDetailMap = new HashMap<>();
         Map<Integer, Integer> activityuserMap = new HashMap<>();
         List<MusicGroupPaymentCalenderDetail> musicGroupPaymentCalenderDetailList = new ArrayList<>();
-        //创建缴费明细
-        MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
 
         List<MusicGroupPaymentCalenderActivity> calenderActivities = musicGroupPaymentCalenderActivityService.findByCalenderId(musicGroupPaymentCalenderId);
         Map<Integer, VipGroupActivity> collect = new HashMap<>();
@@ -248,12 +243,16 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
             musicGroupPaymentCalenderDetail.setStartPaymentDate(musicGroupPaymentCalender.getStartPaymentDate());
             musicGroupPaymentCalenderDetail.setDeadlinePaymentDate(musicGroupPaymentCalender.getDeadlinePaymentDate());
             musicGroupPaymentCalenderDetail.setResponsibleUserId(musicGroupPaymentCalender.getOperator());
+            musicGroupPaymentCalenderDetail.setMusicGroupId(musicGroupPaymentCalender.getMusicGroupId());
+            //设置云教练、课程收入
+            this.setCourseIncome(calenderMember,musicGroupPaymentCalenderDetail);
+            Integer organId = musicGroupPaymentCalender.getOrganId();
             musicGroupPaymentCalenderDetailList.add(musicGroupPaymentCalenderDetail);
             if (musicGroupPaymentCalender.getCurrentTotalAmount().compareTo(BigDecimal.ZERO) == 0 || musicGroupPaymentCalender.getPayUserType() == SCHOOL) {
                 // 添加会员
                 if (calenderMember != null) {
                     CloudTeacherOrder cloudTeacherOrder = new CloudTeacherOrder();
-                    cloudTeacherOrder.setOrganId(musicGroup.getOrganId());
+                    cloudTeacherOrder.setOrganId(organId);
                     cloudTeacherOrder.setType(calenderMember.getPeriod());
                     cloudTeacherOrder.setAmount(BigDecimal.ZERO);
                     cloudTeacherOrder.setStudentId(studentId);
@@ -277,7 +276,7 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
                         activityUserMapper.setSubNoCoursePrice(BigDecimal.ZERO);
                         activityUserMapper.setActivityId(calenderActivity.getActivityId());
                         activityUserMapper.setUserId(studentId);
-                        activityUserMapper.setOrganId(musicGroup.getOrganId());
+                        activityUserMapper.setOrganId(organId);
                         if(musicGroupPaymentCalender.getPayUserType() == SCHOOL){
                             activityUserMapper.setAddMemo("学校缴费新增学员");
                         }else {
@@ -300,7 +299,7 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
 
         if (musicGroupPaymentCalenderDetailList.size() > 0) {
             musicGroupPaymentCalenderDetailDao.batchInsert(musicGroupPaymentCalenderDetailList);
-            musicGroupPaymentCalenderDetailList.stream().forEach(e -> userMap.put(e.getUserId(), e.getId()));
+            musicGroupPaymentCalenderDetailList.stream().forEach(e -> userCalenderDetailMap.put(e.getUserId(), e.getId()));
         }
         //更新预计缴费人数
         musicGroupPaymentCalender.setExpectNum(musicGroupPaymentCalender.getExpectNum() + userIdList.size());
@@ -309,43 +308,9 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
             musicGroupPaymentCalender.setActualNum(musicGroupPaymentCalender.getActualNum() + userIdList.size());
         }
         musicGroupPaymentCalenderService.update(musicGroupPaymentCalender);
-
         //创建学生课排课分钟数
-        if (courseSettingsList != null && courseSettingsList.size() > 0) {
-            List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetailList = new ArrayList<>();
-            MusicGroupPaymentStudentCourseDetail musicGroupPaymentStudentCourseDetail = null;
-            for (Integer studentId : userIdList) {
-                for (MusicGroupPaymentCalenderCourseSettings courseSettings : courseSettingsList) {
-                    if (courseSettings.getCourseTotalMinuties() == null || courseSettings.getCourseTotalMinuties() == 0) {
-                        continue;
-                    }
-                    musicGroupPaymentStudentCourseDetail = new MusicGroupPaymentStudentCourseDetail();
-                    musicGroupPaymentStudentCourseDetail.setMusicGroupId(musicGroupId);
-                    musicGroupPaymentStudentCourseDetail.setCourseType(courseSettings.getCourseType());
-                    musicGroupPaymentStudentCourseDetail.setCreateTime(date);
-                    musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalenderId);
-                    musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderDetailId(userMap.get(studentId));
-                    musicGroupPaymentStudentCourseDetail.setTotalCourseMinutes(courseSettings.getCourseTotalMinuties());
-                    musicGroupPaymentStudentCourseDetail.setSubCourseMinutes(courseSettings.getCourseTotalMinuties());
-                    musicGroupPaymentStudentCourseDetail.setCourseOriginalPrice(courseSettings.getCourseOriginalPrice());
-                    musicGroupPaymentStudentCourseDetail.setCourseCurrentPrice(courseSettings.getCourseCurrentPrice());
-                    musicGroupPaymentStudentCourseDetail.setSubCourseOriginalPrice(courseSettings.getCourseOriginalPrice());
-                    musicGroupPaymentStudentCourseDetail.setSubCourseCurrentPrice(courseSettings.getCourseCurrentPrice());
-                    if(musicGroupPaymentCalender.getPayUserType() == SCHOOL){
-                        musicGroupPaymentStudentCourseDetail.setCourseCurrentPrice(BigDecimal.ZERO);
-                        musicGroupPaymentStudentCourseDetail.setSubCourseCurrentPrice(BigDecimal.ZERO);
-                    }
-                    musicGroupPaymentStudentCourseDetail.setUpdateTime(date);
-                    musicGroupPaymentStudentCourseDetail.setUsedCourseMinutes(0);
-                    musicGroupPaymentStudentCourseDetail.setUserId(studentId);
-                    musicGroupPaymentStudentCourseDetail.setCloudTeacherPaymentFlag(musicGroupPaymentCalender.getCloudTeacherPaymentFlag());
-                    musicGroupPaymentStudentCourseDetailList.add(musicGroupPaymentStudentCourseDetail);
-                }
-            }
-            if (musicGroupPaymentStudentCourseDetailList.size() > 0) {
-                musicGroupPaymentStudentCourseDetailDao.batchInsert(musicGroupPaymentStudentCourseDetailList);
-            }
-        }
+        musicGroupPaymentStudentCourseDetailService.batchInsert(userIdList,musicGroupPaymentCalender,userCalenderDetailMap);
+
         //给学员推送缴费通知
         if (musicGroupPaymentCalender.getPayUserType() == STUDENT && musicGroupPaymentCalender.getStatus() == PaymentCalenderStatusEnum.OPEN) {
             musicGroupPaymentCalenderService.pushWaitRenewMessage(musicGroupPaymentCalender.getId(),
@@ -353,6 +318,24 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
         }
     }
 
+    public void setCourseIncome(MusicGroupPaymentCalenderMember calenderMember, MusicGroupPaymentCalenderDetail calenderDetail){
+        if(Objects.nonNull(calenderMember)){
+            MusicGroup musicGroup = musicGroupDao.get(calenderDetail.getMusicGroupId());
+            if(musicGroup.getCourseViewType() == CourseViewTypeEnum.MEMBER_FEE){
+                //获取云教练溢出费用
+                BigDecimal courseIncome = memberFeeSettingService.getAmount(musicGroup.getOrganId(), 1, calenderMember.getPeriod(),
+                        calenderMember.getNum(), MemberFeeSettingServiceImpl::getIncome);
+                if(calenderMember.getActualAmount().compareTo(courseIncome) > 0){
+                    calenderDetail.setExpectMemberAmount(courseIncome);
+                    calenderDetail.setActualAmount(calenderMember.getActualAmount().subtract(courseIncome));
+                }
+            }else {
+                calenderDetail.setExpectMemberAmount(calenderMember.getActualAmount());
+                calenderDetail.setActualAmount(BigDecimal.ZERO);
+            }
+        }
+    }
+
     @Override
     public List<FeeStudentDto> queryFeeStudents(String musicGroupId, String search, Integer subjectId) {
         return musicGroupStudentFeeDao.queryFeeStudents(musicGroupId, search, subjectId);
@@ -383,7 +366,8 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
             musicGroupPaymentCalenderDetailIdList.add(Long.parseLong(s));
         }
         //是否已排课
-        List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetailList = musicGroupPaymentStudentCourseDetailDao.queryByMusicGroupPaymentStudentCourseDetailId(musicGroupPaymentCalenderDetailIdList);
+        List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetailList =
+                musicGroupPaymentStudentCourseDetailService.queryByMusicGroupPaymentStudentCourseDetailId(musicGroupPaymentCalenderDetailIdList);
         count = musicGroupPaymentStudentCourseDetailList.stream().filter(e -> e.getUsedCourseMinutes() > 0).count();
         if (count > 0) {
             throw new BizException("删除失败:存在已排课的学员");
@@ -391,11 +375,10 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
 
         int currentNum = musicGroupPaymentCalender.getExpectNum() - details.size();
         musicGroupPaymentCalender.setExpectNum(currentNum < 0 ? 0 : currentNum);
-        musicGroupPaymentCalender.setUpdateTime(new Date());
         musicGroupPaymentCalenderDao.update(musicGroupPaymentCalender);
 
         musicGroupPaymentCalenderDetailDao.batchDel(musicGroupPaymentCalenderDetailIds);
-        musicGroupPaymentStudentCourseDetailDao.deleteByMusicGroupPaymentCalenderDetailId(musicGroupPaymentCalenderDetailIdList);
+        musicGroupPaymentStudentCourseDetailService.deleteByMusicGroupPaymentCalenderDetailId(musicGroupPaymentCalenderDetailIdList);
     }
 
     @Override
@@ -499,105 +482,51 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void addCalenderDetail(StudentPaymentOrder studentPaymentOrder, StudentRegistration studentRegistration) {
-        Date nowDate = new Date();
-        Integer tenantId = studentPaymentOrder.getTenantId();
+    public MusicGroupPaymentCalenderDetail addCalenderDetail(StudentPaymentOrder studentPaymentOrder) {
         //缴费详情 calender detail
-        MusicGroupPaymentCalender musicGroupPaymentCalender = musicGroupPaymentCalenderService.get(studentPaymentOrder.getCalenderId());
-        Long currentPaymentCalenderId = studentPaymentOrder.getCalenderId();
+        Long calenderId = studentPaymentOrder.getCalenderId();
+        MusicGroupPaymentCalender musicGroupPaymentCalender = musicGroupPaymentCalenderService.get(calenderId);
         //查询缴费项目关联的订单
-        List<StudentPaymentOrder> orderList = studentPaymentOrderDao.findByCalenderId(currentPaymentCalenderId, studentPaymentOrder.getUserId());
+        List<StudentPaymentOrder> orderList = studentPaymentOrderDao.findByCalenderId(calenderId, studentPaymentOrder.getUserId());
         if (orderList.size() == 1) {
-            // 更新实际缴费人数
-            if (musicGroupPaymentCalender.getActualNum() == null) {
-                musicGroupPaymentCalender.setActualNum(1);
-            } else {
-                musicGroupPaymentCalender.setActualNum(musicGroupPaymentCalender.getActualNum() + 1);
-            }
+            // 更新缴费人数
+            Integer expectNum = 0;
             if (musicGroupPaymentCalender.getPaymentType() == MusicGroupPaymentCalender.PaymentType.MUSIC_APPLY) {
-                if (musicGroupPaymentCalender.getExpectNum() == null) {
-                    musicGroupPaymentCalender.setExpectNum(1);
-                } else {
-                    musicGroupPaymentCalender.setExpectNum(musicGroupPaymentCalender.getExpectNum() + 1);
-                }
+                expectNum = 1;
             }
-            musicGroupPaymentCalender.setUpdateTime(nowDate);
-            musicGroupPaymentCalenderDao.update(musicGroupPaymentCalender);
+            musicGroupPaymentCalenderDao.updatePaymentNum(studentPaymentOrder.getCalenderId(),1,expectNum);
         }
-        MusicGroupPaymentCalenderDetail musicGroupPaymentCalenderDetail = musicGroupPaymentCalenderDetailDao.findByCalenderIdAndUserId(currentPaymentCalenderId, studentPaymentOrder.getUserId());
+        Date date = new Date();
+        MusicGroupPaymentCalenderDetail musicGroupPaymentCalenderDetail = musicGroupPaymentCalenderDetailDao.findByCalenderIdAndUserId(calenderId, studentPaymentOrder.getUserId());
+        //只有报名订单,缴费详情才会是null
         if (musicGroupPaymentCalenderDetail == null) {
             musicGroupPaymentCalenderDetail = new MusicGroupPaymentCalenderDetail();
-            musicGroupPaymentCalenderDetail.setTenantId(tenantId);
+            musicGroupPaymentCalenderDetail.setTenantId(studentPaymentOrder.getTenantId());
             musicGroupPaymentCalenderDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalender.getId());
             musicGroupPaymentCalenderDetail.setUserId(studentPaymentOrder.getUserId());
             musicGroupPaymentCalenderDetail.setResponsibleUserId(musicGroupPaymentCalender.getOperator());
             musicGroupPaymentCalenderDetail.setPaymentStatus(PAID_COMPLETED);
-            musicGroupPaymentCalenderDetail.setPayTime(nowDate);
+            musicGroupPaymentCalenderDetail.setPayTime(date);
             musicGroupPaymentCalenderDetail.setPaymentOrderId(studentPaymentOrder.getId());
             musicGroupPaymentCalenderDetail.setUseInCourse(0);
             musicGroupPaymentCalenderDetail.setOpen(1);
             musicGroupPaymentCalenderDetail.setUserStatus(null);
             musicGroupPaymentCalenderDetail.setDeadlinePaymentDate(musicGroupPaymentCalender.getDeadlinePaymentDate());
             musicGroupPaymentCalenderDetail.setStartPaymentDate(musicGroupPaymentCalender.getStartPaymentDate());
-            musicGroupPaymentCalenderDetail.setCreateTime(nowDate);
-            musicGroupPaymentCalenderDetail.setUpdateTime(nowDate);
             musicGroupPaymentCalenderDetailDao.insert(musicGroupPaymentCalenderDetail);
         } else {
             musicGroupPaymentCalenderDetail.setPaymentStatus(PAID_COMPLETED);
-            musicGroupPaymentCalenderDetail.setPayTime(nowDate);
+            musicGroupPaymentCalenderDetail.setPayTime(date);
             musicGroupPaymentCalenderDetail.setPaymentOrderId(studentPaymentOrder.getId());
             musicGroupPaymentCalenderDetailDao.update(musicGroupPaymentCalenderDetail);
         }
-
         //保存、更新云教练缴费项目预收
-        operatingReportCloudService.updateSet(musicGroupPaymentCalender,studentPaymentOrder.getId());
-
-        Boolean cloudTeacherPaymentFlag = false;
-        if(musicGroupPaymentCalender.getCloudTeacherPaymentFlag()){
-            List<MusicGroupPaymentCalenderCourseSettings> courseSettings = musicGroupPaymentCalenderCourseSettingsDao.queryCalenderCourseSettings(musicGroupPaymentCalender.getId());
-            BigDecimal reduce = courseSettings.stream().map(e -> e.getCourseCurrentPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
-            cloudTeacherPaymentFlag = reduce.compareTo(BigDecimal.ZERO) == 0;
-        }
+        operatingReportCloudService.updateSet(musicGroupPaymentCalender,musicGroupPaymentCalenderDetail.getExpectMemberAmount());
         //续费项目加学员时就生成了课程时长,报名项目在缴费成功后才需要添加课程时长
-        if (musicGroupPaymentCalender.getPaymentType() == MusicGroupPaymentCalender.PaymentType.MUSIC_APPLY) {
-            List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetails = new ArrayList<>();
-            List<String> orderDetailTypes = studentPaymentOrderDetailDao.getOrderDetailType(studentPaymentOrder.getId());
-            List<MusicGroupPaymentCalenderCourseSettings> courseSettingsList = musicGroupPaymentCalenderCourseSettingsDao
-                    .getWithPaymentCalender(musicGroupPaymentCalender.getId());
-            for (MusicGroupPaymentCalenderCourseSettings courseSetting : courseSettingsList) {
-                if (musicGroupPaymentCalender.getPayUserType().equals(MusicGroupPaymentCalender.PayUserType.STUDENT)
-                        && !orderDetailTypes.contains(courseSetting.getCourseType().getCode())) {
-                    continue;
-                }
-                if (courseSetting.getCourseTotalMinuties() == null || courseSetting.getCourseTotalMinuties() == 0) {
-                    continue;
-                }
-                MusicGroupPaymentStudentCourseDetail musicGroupPaymentStudentCourseDetail = new MusicGroupPaymentStudentCourseDetail();
-                musicGroupPaymentStudentCourseDetail.setMusicGroupId(musicGroupPaymentCalender.getMusicGroupId());
-                musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalender.getId());
-                musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderDetailId(musicGroupPaymentCalenderDetail.getId());
-                musicGroupPaymentStudentCourseDetail.setUserId(studentPaymentOrder.getUserId());
-                musicGroupPaymentStudentCourseDetail.setCourseType(courseSetting.getCourseType());
-                musicGroupPaymentStudentCourseDetail.setTotalCourseMinutes(courseSetting.getCourseTotalMinuties());
-                musicGroupPaymentStudentCourseDetail.setSubCourseMinutes(courseSetting.getCourseTotalMinuties());
-                musicGroupPaymentStudentCourseDetail.setCourseOriginalPrice(courseSetting.getCourseOriginalPrice());
-                musicGroupPaymentStudentCourseDetail.setCourseCurrentPrice(courseSetting.getCourseCurrentPrice());
-                musicGroupPaymentStudentCourseDetail.setSubCourseOriginalPrice(courseSetting.getCourseOriginalPrice());
-                musicGroupPaymentStudentCourseDetail.setSubCourseCurrentPrice(courseSetting.getCourseCurrentPrice());
-                if(musicGroupPaymentCalender.getPayUserType() == SCHOOL){
-                    musicGroupPaymentStudentCourseDetail.setCourseCurrentPrice(BigDecimal.ZERO);
-                    musicGroupPaymentStudentCourseDetail.setSubCourseCurrentPrice(BigDecimal.ZERO);
-                }
-                musicGroupPaymentStudentCourseDetail.setUsedCourseMinutes(0);
-                musicGroupPaymentStudentCourseDetail.setCreateTime(nowDate);
-                musicGroupPaymentStudentCourseDetail.setUpdateTime(nowDate);
-                musicGroupPaymentStudentCourseDetail.setTenantId(tenantId);
-                musicGroupPaymentStudentCourseDetail.setCloudTeacherPaymentFlag(cloudTeacherPaymentFlag);
-                musicGroupPaymentStudentCourseDetails.add(musicGroupPaymentStudentCourseDetail);
-            }
-            if (musicGroupPaymentStudentCourseDetails.size() > 0) {
-                musicGroupPaymentStudentCourseDetailDao.batchInsert(musicGroupPaymentStudentCourseDetails);
-            }
-        }
+        musicGroupPaymentStudentCourseDetailService.batchInsert(studentPaymentOrder.getUserId(),
+                musicGroupPaymentCalender,
+                musicGroupPaymentCalenderDetail.getId(),
+                studentPaymentOrder.getId());
+        return musicGroupPaymentCalenderDetail;
     }
 }

+ 55 - 6
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java

@@ -27,7 +27,6 @@ import com.ym.mec.common.service.IdGeneratorService;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
-
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
@@ -62,7 +61,7 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
     @Autowired
     private MusicGroupPaymentCalenderCourseSettingsServiceImpl musicGroupPaymentCalenderCourseSettingsService;
     @Autowired
-    private MusicGroupPaymentStudentCourseDetailDao musicGroupPaymentStudentCourseDetailDao;
+    private MusicGroupPaymentStudentCourseDetailService musicGroupPaymentStudentCourseDetailService;
     @Autowired
     private MusicGroupSchoolTermCourseDetailDao musicGroupSchoolTermCourseDetailDao;
     @Autowired
@@ -127,6 +126,10 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
     private ImGroupService imGroupService;
     @Autowired
     private ImGroupMemberService imGroupMemberService;
+    @Autowired
+    private MemberFeeSettingService memberFeeSettingService;
+    @Autowired
+    private StudentMusicCourseFeeService studentMusicCourseFeeService;
 
     @Override
     public BaseDAO<Long, MusicGroupPaymentCalender> getDAO() {
@@ -399,8 +402,24 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
             musicGroupPaymentCalenderActivityService.batchInsert(musicGroupPaymentBaseCalender, calenderId);
         }
         //保存课程费用列表
-        musicGroupPaymentCalender.setMusicGroupPaymentCalenderCourseSettingsList(musicGroupPaymentBaseCalender.getMusicGroupPaymentCalenderCourseSettingsList());
-        musicGroupPaymentCalenderCourseSettingsService.batchInsert(musicGroupPaymentCalender);
+        List<MusicGroupPaymentCalenderCourseSettings> courseSettingsList = musicGroupPaymentBaseCalender.getMusicGroupPaymentCalenderCourseSettingsList();
+        if(CollectionUtils.isNotEmpty(courseSettingsList)){
+            //是否会员团
+            if(musicGroup.getCourseViewType() == CourseViewTypeEnum.MEMBER_FEE && Objects.nonNull(calenderMember)){
+                //获取云教练溢出费用
+                BigDecimal courseIncome = memberFeeSettingService.getAmount(musicGroup.getOrganId(), 1, calenderMember.getPeriod(),
+                        calenderMember.getNum(), MemberFeeSettingServiceImpl::getIncome);
+                calenderMember.setIncome(courseIncome);
+                musicGroupPaymentCalenderMemberService.update(calenderMember);
+                //获取云教练溢出费用
+                BigDecimal currentFee = memberFeeSettingService.getAmount(musicGroup.getOrganId(), 1, calenderMember.getPeriod(),
+                        calenderMember.getNum(), MemberFeeSettingServiceImpl::getCurrentFee);
+                //平摊金额
+                distributeTotalAmount(courseSettingsList,currentFee.subtract(courseIncome));
+            }
+            musicGroupPaymentCalender.setMusicGroupPaymentCalenderCourseSettingsList(courseSettingsList);
+            musicGroupPaymentCalenderCourseSettingsService.batchInsert(musicGroupPaymentCalender);
+        }
 
         // 如果是报名,需要修改乐团状态
         if (musicGroupPaymentCalender.getPaymentType() == MUSIC_APPLY) {
@@ -422,9 +441,15 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
             addStudent(musicGroupPaymentCalender, musicGroup);
             //将0元未缴费学员缴费状态更新为已缴费
             this.updateNoPaymentAndZeroPaymentStatus(musicGroupPaymentCalender, true);
+            List<MusicGroupPaymentCalenderCourseSettings> settingsList = musicGroupPaymentBaseCalender.getMusicGroupPaymentCalenderCourseSettingsList();
             // 学生加到班级
             classGroupService.addStudentToClassGroupAndCourseArranging(calenderAddStudent.getStudentIds(), calenderAddStudent.getClassGroupIds(),
-                    batchNo, musicGroupPaymentBaseCalender.getMusicGroupPaymentCalenderCourseSettingsList(), musicGroup);
+                    batchNo, settingsList, musicGroup);
+            //记录经营报表学员课程费用
+//            if(CollectionUtils.isNotEmpty(settingsList)){
+//                BigDecimal coursePrice = settingsList.stream().map(e -> e.getCourseCurrentPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
+//                studentMusicCourseFeeService.addExpectPrice(calenderAddStudent.getStudentIds(),musicGroupId,coursePrice);
+//            }
             ExecutorService executor = Executors.newFixedThreadPool(5);
             CompletableFuture.runAsync(() -> {
                 imUserFriendService.refreshGroupImUserFriend(musicGroupId, GroupType.MUSIC);
@@ -436,6 +461,30 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
         return BaseController.succeed(map);
     }
 
+    public static void distributeTotalAmount(List<MusicGroupPaymentCalenderCourseSettings> settings, BigDecimal totalAmount) {
+        if(CollectionUtils.isEmpty(settings) || BigDecimal.ZERO.compareTo(totalAmount) == 0){
+            return;
+        }
+        BigDecimal remainingAmount = totalAmount;
+        int lastIndex = settings.size() - 1;
+        BigDecimal totalUnitPrice = settings.stream().map(e -> e.getUnitPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        // 分摊总金额
+        for (int i = 0; i < lastIndex; i++) {
+            MusicGroupPaymentCalenderCourseSettings setting = settings.get(i);
+            BigDecimal ratio = setting.getUnitPrice().divide(totalUnitPrice, 10, BigDecimal.ROUND_HALF_UP);
+            BigDecimal itemAmount = totalAmount.multiply(ratio).setScale(2, BigDecimal.ROUND_HALF_UP);
+            setting.setOverflowCoursePrice(itemAmount.add(setting.getOverflowCoursePrice()));
+            remainingAmount = remainingAmount.subtract(itemAmount);
+        }
+
+        // 将剩余的金额放在最后一个Item对象中
+        MusicGroupPaymentCalenderCourseSettings lastItem = settings.get(lastIndex);
+        lastItem.setOverflowCoursePrice(lastItem.getOverflowCoursePrice().add(remainingAmount));
+    }
+
+
+
     //校验缴费项目进行中加学员
     public void checkAddStudent(CalenderAddStudent calenderAddStudent, MusicGroup musicGroup) {
         //获取缴费状态在审核中或者已拒绝的缴费项目的学员
@@ -1325,7 +1374,7 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 
         musicGroupPaymentCalenderDao.delete(id);
         musicGroupPaymentCalenderDetailDao.deleteByCalenderId(id);
-        musicGroupPaymentStudentCourseDetailDao.deleteByMusicGroupPaymentCalenderId(id);
+        musicGroupPaymentStudentCourseDetailService.deleteByMusicGroupPaymentCalenderId(id.toString(),null);
         musicGroupPaymentCalenderActivityService.delByCalenderId(id);
         musicGroupPaymentCalenderMemberService.deleteByCalenderId(id);
         musicGroupPaymentCalenderRepairService.deleteByCalenderId(id);

+ 250 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentStudentCourseDetailServiceImpl.java

@@ -1,21 +1,269 @@
 package com.ym.mec.biz.service.impl;
 
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentStudentCourseDetailDao;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentStudentCourseDetail;
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.StudentApplyInstrumentDto;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.enums.CourseViewTypeEnum;
+import com.ym.mec.biz.dal.enums.OrderDetailTypeEnum;
 import com.ym.mec.biz.service.MusicGroupPaymentStudentCourseDetailService;
+import com.ym.mec.biz.service.StudentMusicCourseFeeService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PayUserType.SCHOOL;
+import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PayUserType.STUDENT;
 
 @Service
 public class MusicGroupPaymentStudentCourseDetailServiceImpl extends BaseServiceImpl<Long, MusicGroupPaymentStudentCourseDetail>  implements MusicGroupPaymentStudentCourseDetailService {
 	
 	@Autowired
 	private MusicGroupPaymentStudentCourseDetailDao musicGroupPaymentStudentCourseDetailDao;
+	@Autowired
+	private MusicGroupPaymentCalenderCourseSettingsDao musicGroupPaymentCalenderCourseSettingsDao;
+	@Autowired
+	private StudentMusicCourseFeeService studentMusicCourseFeeService;
+	@Autowired
+	private StudentPaymentOrderDetailDao studentPaymentOrderDetailDao;
+	@Autowired
+	private MusicGroupDao musicGroupDao;
+	@Autowired
+	private StudentRegistrationDao studentRegistrationDao;
+	@Autowired
+	private ChargeTypeSubjectMapperDao chargeTypeSubjectMapperDao;
+	@Autowired
+	private StudentCourseFeeDetailDao studentCourseFeeDetailDao;
 
 	@Override
 	public BaseDAO<Long, MusicGroupPaymentStudentCourseDetail> getDAO() {
 		return musicGroupPaymentStudentCourseDetailDao;
 	}
+
+    @Override
+	@Transactional(rollbackFor = Exception.class)
+    public void batchInsert(Set<Integer> userIdList,
+							MusicGroupPaymentCalender calender,
+							Map<Integer, Long> userCalenderDetailMap) {
+		List<MusicGroupPaymentCalenderCourseSettings> courseSettingsList = musicGroupPaymentCalenderCourseSettingsDao.getWithPaymentCalender(calender.getId());
+		//创建学生课排课分钟数
+		if (courseSettingsList != null && courseSettingsList.size() > 0) {
+			List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetailList = new ArrayList<>();
+			MusicGroupPaymentStudentCourseDetail musicGroupPaymentStudentCourseDetail = null;
+			Long calenderId = calender.getId();
+			String musicGroupId = calender.getMusicGroupId();
+			MusicGroupPaymentCalender.PayUserType payUserType = calender.getPayUserType();
+			Boolean cloudTeacherPaymentFlag = calender.getCloudTeacherPaymentFlag();
+			for (Integer studentId : userIdList) {
+				BigDecimal reduce = BigDecimal.ZERO;
+
+				for (MusicGroupPaymentCalenderCourseSettings courseSettings : courseSettingsList) {
+					if (courseSettings.getCourseTotalMinuties() == null || courseSettings.getCourseTotalMinuties() == 0) {
+						continue;
+					}
+					musicGroupPaymentStudentCourseDetail = new MusicGroupPaymentStudentCourseDetail();
+					musicGroupPaymentStudentCourseDetail.setMusicGroupId(musicGroupId);
+					musicGroupPaymentStudentCourseDetail.setCourseType(courseSettings.getCourseType());
+					musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderId(calenderId);
+					musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderDetailId(userCalenderDetailMap.get(studentId));
+					musicGroupPaymentStudentCourseDetail.setTotalCourseMinutes(courseSettings.getCourseTotalMinuties());
+					musicGroupPaymentStudentCourseDetail.setSubCourseMinutes(courseSettings.getCourseTotalMinuties());
+					musicGroupPaymentStudentCourseDetail.setCourseOriginalPrice(courseSettings.getCourseOriginalPrice());
+					musicGroupPaymentStudentCourseDetail.setCourseCurrentPrice(courseSettings.getOverflowCoursePrice());
+					musicGroupPaymentStudentCourseDetail.setSubCourseOriginalPrice(courseSettings.getCourseOriginalPrice());
+					musicGroupPaymentStudentCourseDetail.setSubCourseCurrentPrice(courseSettings.getOverflowCoursePrice());
+					if(payUserType == SCHOOL){
+						musicGroupPaymentStudentCourseDetail.setCourseCurrentPrice(BigDecimal.ZERO);
+						musicGroupPaymentStudentCourseDetail.setSubCourseCurrentPrice(BigDecimal.ZERO);
+					}
+					musicGroupPaymentStudentCourseDetail.setUsedCourseMinutes(0);
+					musicGroupPaymentStudentCourseDetail.setUserId(studentId);
+					musicGroupPaymentStudentCourseDetail.setCloudTeacherPaymentFlag(cloudTeacherPaymentFlag);
+					musicGroupPaymentStudentCourseDetailList.add(musicGroupPaymentStudentCourseDetail);
+					reduce = reduce.add(musicGroupPaymentStudentCourseDetail.getCourseCurrentPrice());
+				}
+//				if(reduce.compareTo(BigDecimal.ZERO) > 0){
+					//汇总学员乐团课费,如果有溢出的乐器费用、云教练费用,也一并汇总,用于计算经营报表
+//					studentMusicCourseFeeService.addExpectPrice(studentId,musicGroupId,reduce);
+//				}
+			}
+			if (musicGroupPaymentStudentCourseDetailList.size() > 0) {
+				musicGroupPaymentStudentCourseDetailDao.batchInsert(musicGroupPaymentStudentCourseDetailList);
+			}
+		}
+    }
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void batchInsert(Integer userId, MusicGroupPaymentCalender musicGroupPaymentCalender, Long calenderDetailId, Long paymentOrderId) {
+		//续费项目加学员时就生成了课程时长,报名项目在缴费成功后才需要添加课程时长
+		if (musicGroupPaymentCalender.getPaymentType() == MusicGroupPaymentCalender.PaymentType.MUSIC_APPLY) {
+			List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetails = new ArrayList<>();
+			List<String> orderDetailTypes = studentPaymentOrderDetailDao.getOrderDetailType(paymentOrderId);
+			List<MusicGroupPaymentCalenderCourseSettings> courseSettingsList = musicGroupPaymentCalenderCourseSettingsDao
+					.getWithPaymentCalender(musicGroupPaymentCalender.getId());
+			Boolean cloudTeacherPaymentFlag = musicGroupPaymentCalender.getCloudTeacherPaymentFlag();
+			String musicGroupId = musicGroupPaymentCalender.getMusicGroupId();
+			MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
+			//免费团,并且购买乐器
+			BigDecimal musicalFee = BigDecimal.ZERO;
+			if(musicGroup.getCourseViewType() == CourseViewTypeEnum.FREE){
+				StudentPaymentOrderDetail orderMusical = studentPaymentOrderDetailDao.findApplyOrderMusical(paymentOrderId);
+				if(Objects.nonNull(orderMusical)){
+					//如果是免费团,那么要处理乐器溢出的课程费用
+					CourseViewTypeEnum courseViewType = musicGroup.getCourseViewType();
+					StudentRegistration studentRegistration = studentRegistrationDao.queryByUserIdAndMusicGroupId(userId, musicGroupId);
+					Integer subjectId = studentRegistration.getActualSubjectId();
+					ChargeTypeSubjectMapper chargeType = chargeTypeSubjectMapperDao.findByViewTypeANdSubject(courseViewType,subjectId,musicGroup.getTenantId());
+					if(Objects.nonNull(chargeType) && chargeType.getFee() != null && orderMusical.getPrice().compareTo(BigDecimal.ZERO) > 0
+							&& chargeType.getFee().compareTo(orderMusical.getPrice()) < 0){
+						musicalFee = orderMusical.getPrice().subtract(chargeType.getFee());
+						//累加充值金额
+						studentRegistrationDao.updateCourseFee(studentRegistration.getId(),musicalFee);
+						//添加日志
+						StudentCourseFeeDetail studentCourseFeeDetail = new StudentCourseFeeDetail();
+						studentCourseFeeDetail.setTenantId(musicGroup.getTenantId());
+						studentCourseFeeDetail.setStudentRegistrationId(studentRegistration.getId());
+						studentCourseFeeDetail.setAmount(musicalFee);
+						studentCourseFeeDetail.setSurplusCourseFee(studentRegistration.getSurplusCourseFee().add(musicalFee));
+						studentCourseFeeDetail.setMemo("免费团,购买乐器赠送课费");
+						studentCourseFeeDetail.setOperator(userId);
+						studentCourseFeeDetailDao.insert(studentCourseFeeDetail);
+						List<MusicGroupPaymentStudentCourseDetail> courseDetails = musicGroupPaymentStudentCourseDetailDao.findByCalenderAndUserId(musicGroupPaymentCalender.getId().toString(), userId);
+						if(CollectionUtils.isNotEmpty(courseDetails)){
+							distributeTotalAmount(courseDetails,musicalFee);
+							musicGroupPaymentStudentCourseDetailDao.batchUpdate(courseDetails);
+						}
+					}
+				}
+			}
+			for (MusicGroupPaymentCalenderCourseSettings courseSetting : courseSettingsList) {
+				if (musicGroupPaymentCalender.getPayUserType().equals(MusicGroupPaymentCalender.PayUserType.STUDENT)
+						&& !orderDetailTypes.contains(courseSetting.getCourseType().getCode())) {
+					continue;
+				}
+				if (courseSetting.getCourseTotalMinuties() == null || courseSetting.getCourseTotalMinuties() == 0) {
+					continue;
+				}
+				MusicGroupPaymentStudentCourseDetail musicGroupPaymentStudentCourseDetail = new MusicGroupPaymentStudentCourseDetail();
+				musicGroupPaymentStudentCourseDetail.setMusicGroupId(musicGroupPaymentCalender.getMusicGroupId());
+				musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalender.getId());
+				musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderDetailId(calenderDetailId);
+				musicGroupPaymentStudentCourseDetail.setUserId(userId);
+				musicGroupPaymentStudentCourseDetail.setCourseType(courseSetting.getCourseType());
+				musicGroupPaymentStudentCourseDetail.setTotalCourseMinutes(courseSetting.getCourseTotalMinuties());
+				musicGroupPaymentStudentCourseDetail.setSubCourseMinutes(courseSetting.getCourseTotalMinuties());
+				musicGroupPaymentStudentCourseDetail.setCourseOriginalPrice(courseSetting.getCourseOriginalPrice());
+				musicGroupPaymentStudentCourseDetail.setCourseCurrentPrice(courseSetting.getOverflowCoursePrice().add(musicalFee));
+				musicGroupPaymentStudentCourseDetail.setSubCourseOriginalPrice(courseSetting.getCourseOriginalPrice());
+				musicGroupPaymentStudentCourseDetail.setSubCourseCurrentPrice(courseSetting.getOverflowCoursePrice().add(musicalFee));
+				if(musicGroupPaymentCalender.getPayUserType() == SCHOOL){
+					musicGroupPaymentStudentCourseDetail.setCourseCurrentPrice(BigDecimal.ZERO);
+					musicGroupPaymentStudentCourseDetail.setSubCourseCurrentPrice(BigDecimal.ZERO);
+				}
+				musicGroupPaymentStudentCourseDetail.setUsedCourseMinutes(0);
+				musicGroupPaymentStudentCourseDetail.setCloudTeacherPaymentFlag(cloudTeacherPaymentFlag);
+				musicGroupPaymentStudentCourseDetails.add(musicGroupPaymentStudentCourseDetail);
+			}
+			if (musicGroupPaymentStudentCourseDetails.size() > 0) {
+				if(musicGroupPaymentCalender.getPayUserType() == STUDENT && musicGroup.getCourseViewType() == CourseViewTypeEnum.FREE) {
+					List<StudentPaymentOrderDetail> instrumentDtos = studentPaymentOrderDetailDao.getWithUserAndOrderType(userId, musicGroupId, OrderDetailTypeEnum.MUSICAL);
+					//是否买过乐器
+					if(CollectionUtils.isNotEmpty(instrumentDtos)){
+						StudentPaymentOrderDetail orderMusical = instrumentDtos.get(0);
+						//如果是免费团,那么要处理乐器溢出的课程费用
+						CourseViewTypeEnum courseViewType = musicGroup.getCourseViewType();
+						StudentRegistration studentRegistration = studentRegistrationDao.queryByUserIdAndMusicGroupId(userId, musicGroupId);
+						Integer subjectId = studentRegistration.getActualSubjectId();
+						ChargeTypeSubjectMapper chargeType = chargeTypeSubjectMapperDao.findByViewTypeANdSubject(courseViewType,subjectId,musicGroup.getTenantId());
+						if(Objects.nonNull(chargeType) && chargeType.getFee() != null && orderMusical.getPrice().compareTo(BigDecimal.ZERO) > 0
+								&& chargeType.getFee().compareTo(orderMusical.getPrice()) < 0){
+							musicalFee = orderMusical.getPrice().subtract(chargeType.getFee());
+							distributeTotalAmount(musicGroupPaymentStudentCourseDetails,musicalFee);
+						}
+					}
+				}
+				musicGroupPaymentStudentCourseDetailDao.batchInsert(musicGroupPaymentStudentCourseDetails);
+			}
+		}
+	}
+
+	public static void distributeTotalAmount(List<MusicGroupPaymentStudentCourseDetail> courseDetails, BigDecimal totalAmount) {
+		if(CollectionUtils.isEmpty(courseDetails) || BigDecimal.ZERO.compareTo(totalAmount) == 0){
+			return;
+		}
+		BigDecimal remainingAmount = totalAmount;
+		int lastIndex = courseDetails.size() - 1;
+		BigDecimal totalUnitPrice = courseDetails.stream().map(e -> e.getCourseOriginalPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
+
+		// 分摊总金额
+		for (int i = 0; i < lastIndex; i++) {
+			MusicGroupPaymentStudentCourseDetail courseDetail = courseDetails.get(i);
+			BigDecimal ratio = courseDetail.getCourseOriginalPrice().divide(totalUnitPrice, 10, BigDecimal.ROUND_HALF_UP);
+			BigDecimal itemAmount = totalAmount.multiply(ratio).setScale(2, BigDecimal.ROUND_HALF_UP);
+			courseDetail.setCourseCurrentPrice(itemAmount.add(courseDetail.getCourseCurrentPrice()));
+			courseDetail.setSubCourseCurrentPrice(courseDetail.getCourseCurrentPrice());
+			remainingAmount = remainingAmount.subtract(itemAmount);
+		}
+
+		// 将剩余的金额放在最后一个Item对象中
+		MusicGroupPaymentStudentCourseDetail lastItem = courseDetails.get(lastIndex);
+		lastItem.setCourseCurrentPrice(lastItem.getCourseCurrentPrice().add(remainingAmount));
+		lastItem.setSubCourseCurrentPrice(lastItem.getCourseCurrentPrice());
+	}
+
+	@Override
+	public List<MusicGroupPaymentStudentCourseDetail> queryByMusicGroupPaymentStudentCourseDetailId(List<Long> musicGroupPaymentCalenderDetailIdList) {
+		return musicGroupPaymentStudentCourseDetailDao.queryByMusicGroupPaymentStudentCourseDetailId(musicGroupPaymentCalenderDetailIdList);
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void deleteByMusicGroupPaymentCalenderDetailId(List<Long> musicGroupPaymentCalenderDetailIdList) {
+		this.delByDetails(musicGroupPaymentStudentCourseDetailDao.queryByMusicGroupPaymentStudentCourseDetailId(musicGroupPaymentCalenderDetailIdList));
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void deleteByMusicGroupPaymentCalenderId(String calenderId,Integer userId) {
+		this.delByDetails(musicGroupPaymentStudentCourseDetailDao.findByCalenderAndUserId(calenderId, userId));
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void deleteByUserIdAndMusicGroupId(Integer userId, String musicGroupId) {
+		this.delByDetails(musicGroupPaymentStudentCourseDetailDao.findByUserIdAndMusicGroupId(userId, musicGroupId));
+	}
+
+    @Override
+	@Transactional(rollbackFor = Exception.class)
+    public void clearRemainCourseMinutesByMusicGroupId(String musicGroupId) {
+		musicGroupPaymentStudentCourseDetailDao.clearRemainCourseMinutesByMusicGroupId(musicGroupId);
+    }
+
+    void delByDetails(List<MusicGroupPaymentStudentCourseDetail> courseDetails){
+		if(CollectionUtils.isNotEmpty(courseDetails)){
+			List<Long> courseDetailIds = courseDetails.stream().map(e -> e.getId()).collect(Collectors.toList());
+			musicGroupPaymentStudentCourseDetailDao.delByIds(courseDetailIds);
+			//汇总学员乐团课费,如果有溢出的乐器费用、云教练费用,也一并汇总,用于计算经营报表
+			/*courseDetails = courseDetails.stream().filter(e -> e.getCourseCurrentPrice().compareTo(BigDecimal.ZERO) > 0).collect(Collectors.toList());
+			if(CollectionUtils.isNotEmpty(courseDetails)){
+				Map<Integer, List<MusicGroupPaymentStudentCourseDetail>> userMap = courseDetails.stream().collect(Collectors.groupingBy(e -> e.getUserId()));
+				for (Integer userId : userMap.keySet()) {
+					List<MusicGroupPaymentStudentCourseDetail> studentCourseDetails = userMap.get(userId);
+					Map<String, BigDecimal> priceMap = studentCourseDetails.stream().collect(Collectors.groupingBy(e -> e.getMusicGroupId(),
+							Collectors.collectingAndThen(Collectors.toList(), v -> v.stream().map(e -> e.getCourseCurrentPrice()).reduce(BigDecimal.ZERO, BigDecimal::add))));
+					for (String musicGroupId : priceMap.keySet()) {
+						studentMusicCourseFeeService.cutExpectPrice(userId,musicGroupId,priceMap.get(musicGroupId));
+					}
+				}
+			}*/
+		}
+	}
 }

+ 10 - 46
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -168,7 +168,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Autowired
     private MusicGroupPaymentCalenderCourseSettingsDao musicGroupPaymentCalenderCourseSettingsDao;
     @Autowired
-    private MusicGroupPaymentStudentCourseDetailDao musicGroupPaymentStudentCourseDetailDao;
+    private MusicGroupPaymentStudentCourseDetailService musicGroupPaymentStudentCourseDetailService;
     @Autowired
     private SubjectChangeDao subjectChangeDao;
     @Autowired
@@ -410,12 +410,6 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
 			MusicGroupPaymentCalenderDetail musicGroupPaymentCalenderDetail = null;
 			List<MusicGroupPaymentCalenderDetail> insertMusicGroupPaymentCalenderDetailList = new ArrayList<MusicGroupPaymentCalenderDetail>();
-
-			List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetails = new ArrayList<>();
-
-			List<MusicGroupPaymentCalenderCourseSettings> courseSettingsList = musicGroupPaymentCalenderCourseSettingsDao
-					.getWithPaymentCalender(musicGroupPaymentCalender.getId());
-
 			for (StudentImportDto si : studentBasicList) {
 				musicGroupPaymentCalenderDetail = new MusicGroupPaymentCalenderDetail();
 				musicGroupPaymentCalenderDetail.setTenantId(tenantId);
@@ -430,45 +424,15 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 				musicGroupPaymentCalenderDetail.setUserStatus(null);
 				musicGroupPaymentCalenderDetail.setDeadlinePaymentDate(musicGroupPaymentCalender.getDeadlinePaymentDate());
 				musicGroupPaymentCalenderDetail.setStartPaymentDate(musicGroupPaymentCalender.getStartPaymentDate());
-				musicGroupPaymentCalenderDetail.setCreateTime(nowDate);
-				musicGroupPaymentCalenderDetail.setUpdateTime(nowDate);
-
 				insertMusicGroupPaymentCalenderDetailList.add(musicGroupPaymentCalenderDetail);
-
-				for (MusicGroupPaymentCalenderCourseSettings courseSetting : courseSettingsList) {
-					if (courseSetting.getCourseTotalMinuties() == null || courseSetting.getCourseTotalMinuties() == 0) {
-						continue;
-					}
-					MusicGroupPaymentStudentCourseDetail musicGroupPaymentStudentCourseDetail = new MusicGroupPaymentStudentCourseDetail();
-					musicGroupPaymentStudentCourseDetail.setMusicGroupId(musicGroupPaymentCalender.getMusicGroupId());
-					musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalender.getId());
-					//musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderDetailId(musicGroupPaymentCalenderDetail.getId());
-					musicGroupPaymentStudentCourseDetail.setUserId(si.getUserId());
-					musicGroupPaymentStudentCourseDetail.setCourseType(courseSetting.getCourseType());
-					musicGroupPaymentStudentCourseDetail.setTotalCourseMinutes(courseSetting.getCourseTotalMinuties());
-					musicGroupPaymentStudentCourseDetail.setSubCourseMinutes(courseSetting.getCourseTotalMinuties());
-					musicGroupPaymentStudentCourseDetail.setCourseOriginalPrice(courseSetting.getCourseOriginalPrice());
-					musicGroupPaymentStudentCourseDetail.setCourseCurrentPrice(courseSetting.getCourseCurrentPrice());
-					musicGroupPaymentStudentCourseDetail.setSubCourseOriginalPrice(courseSetting.getCourseOriginalPrice());
-					musicGroupPaymentStudentCourseDetail.setSubCourseCurrentPrice(courseSetting.getCourseCurrentPrice());
-					musicGroupPaymentStudentCourseDetail.setUsedCourseMinutes(0);
-					musicGroupPaymentStudentCourseDetail.setCreateTime(nowDate);
-					musicGroupPaymentStudentCourseDetail.setUpdateTime(nowDate);
-					musicGroupPaymentStudentCourseDetail.setTenantId(tenantId);
-					musicGroupPaymentStudentCourseDetails.add(musicGroupPaymentStudentCourseDetail);
-				}
 			}
 			if (insertMusicGroupPaymentCalenderDetailList.size() > 0) {
 				musicGroupPaymentCalenderDetailDao.batchInsert(insertMusicGroupPaymentCalenderDetailList);
-
-				Map<Integer,Long> musicGroupPaymentCalenderDetailIdMap =  insertMusicGroupPaymentCalenderDetailList.stream().collect(Collectors.toMap(MusicGroupPaymentCalenderDetail :: getUserId, MusicGroupPaymentCalenderDetail :: getId));
-
-				if (musicGroupPaymentStudentCourseDetails.size() > 0) {
-					for(MusicGroupPaymentStudentCourseDetail cd : musicGroupPaymentStudentCourseDetails){
-						cd.setMusicGroupPaymentCalenderDetailId(musicGroupPaymentCalenderDetailIdMap.get(cd.getUserId()));
-					}
-					musicGroupPaymentStudentCourseDetailDao.batchInsert(musicGroupPaymentStudentCourseDetails);
-				}
+                //创建学生课排课分钟数
+                Map<Integer, Long> userCalenderDetailMap = new HashMap<>(insertMusicGroupPaymentCalenderDetailList.size());
+                insertMusicGroupPaymentCalenderDetailList.stream().forEach(e -> userCalenderDetailMap.put(e.getUserId(), e.getId()));
+                Set<Integer> userIdList = studentBasicList.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
+                musicGroupPaymentStudentCourseDetailService.batchInsert(userIdList,musicGroupPaymentCalender,userCalenderDetailMap);
 			}
 		}
 
@@ -2337,7 +2301,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             List<MusicGroupPaymentCalender> paymentCalenders = musicGroupPaymentCalenderDao.findByMusicGroupId(musicGroupId);
             if(CollectionUtils.isNotEmpty(paymentCalenders)){
                 List<Long> calenderIds = paymentCalenders.stream().map(e -> e.getId()).collect(Collectors.toList());
-                musicGroupPaymentStudentCourseDetailDao.deleteByUserIdAndCalenderId(userId, calenderIds);
+                musicGroupPaymentStudentCourseDetailService.deleteByMusicGroupPaymentCalenderId(StringUtils.join(calenderIds,","),userId);
             }
 
             BigDecimal amount = new BigDecimal(0);
@@ -2603,7 +2567,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             musicGroupPaymentCalenderDetailDao.delete(mgpcd.getId());
         }
         //删除用户购买的课程记录
-        musicGroupPaymentStudentCourseDetailDao.deleteByUserIdAndMusicGroupId(userId, musicGroupId);
+        musicGroupPaymentStudentCourseDetailService.deleteByUserIdAndMusicGroupId(userId, musicGroupId);
 
         BigDecimal amount = new BigDecimal(0);
 
@@ -2824,7 +2788,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             musicGroupPaymentCalenderDetailDao.delete(mgpcd.getId());
         }
         //删除用户购买的课程记录
-        musicGroupPaymentStudentCourseDetailDao.deleteByUserIdAndMusicGroupId(userId, musicGroupId);
+        musicGroupPaymentStudentCourseDetailService.deleteByUserIdAndMusicGroupId(userId, musicGroupId);
 
         List<StudentPaymentOrder> studentPaymentOrderList = new ArrayList<StudentPaymentOrder>();
 
@@ -3755,7 +3719,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         }*/
         
         //清除剩余未排课时长
-        musicGroupPaymentStudentCourseDetailDao.clearRemainCourseMinutesByMusicGroupId(musicGroupId);
+        musicGroupPaymentStudentCourseDetailService.clearRemainCourseMinutesByMusicGroupId(musicGroupId);
 
         //统计变更学员数
         groupEventSource.musicGroupStudentChangeEvent(closeMusicGroupDto.getMusicGroupId(), StudentMusicGroupStatusEnum.QUIT, null);

+ 26 - 39
mec-biz/src/main/java/com/ym/mec/biz/service/impl/OperatingReportCloudServiceImpl.java

@@ -1,16 +1,15 @@
 package com.ym.mec.biz.service.impl;
 
-import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDao;
+import com.ym.mec.biz.dal.dao.OperatingReportCloudDao;
+import com.ym.mec.biz.dal.dao.OrganCourseTypeOriginalCostDao;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
 import com.ym.mec.biz.dal.entity.OperatingReportCloud;
-import com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail;
-import com.ym.mec.biz.dal.enums.OrderDetailTypeEnum;
 import com.ym.mec.biz.service.CloudTeacherFreeCourseService;
 import com.ym.mec.biz.service.OperatingReportCloudService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
-import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -31,10 +30,6 @@ public class OperatingReportCloudServiceImpl extends BaseServiceImpl<Integer, Op
 	@Autowired
 	private CloudTeacherFreeCourseService cloudTeacherFreeCourseService;
 	@Autowired
-	private StudentPaymentOrderDetailDao studentPaymentOrderDetailDao;
-	@Autowired
-	private StudentPaymentOrderDao studentPaymentOrderDao;
-	@Autowired
 	private MusicGroupPaymentCalenderDao musicGroupPaymentCalenderDao;
 
 	@Override
@@ -49,39 +44,31 @@ public class OperatingReportCloudServiceImpl extends BaseServiceImpl<Integer, Op
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public void updateSet(MusicGroupPaymentCalender calender, Long orderId) {
-		if(!calender.getCloudTeacherPaymentFlag()){
-			return;
-		}
-		BigDecimal amount = BigDecimal.ZERO;
-		//查询云教练价格
-		List<StudentPaymentOrderDetail> orderDetail = studentPaymentOrderDetailDao.findApplyOrderGoods(orderId);
-		if(CollectionUtils.isNotEmpty(orderDetail)){
-			amount = orderDetail.stream().filter(e->e.getType() == OrderDetailTypeEnum.CLOUD_TEACHER || e.getType() == OrderDetailTypeEnum.CLOUD_TEACHER_PLUS)
-					.map(e->e.getPrice()).reduce(BigDecimal.ZERO,BigDecimal::add);
-		}else {
-			amount = studentPaymentOrderDao.get(orderId).getActualAmount();
-		}
-		if(calender.getPaymentType() == MusicGroupPaymentCalender.PaymentType.ADD_STUDENT){
-			this.saveMonthOperating(calender,amount);
-			return;
-		}
-		//找出非当月结算的缴费项目预算,如果为空则创建。如果已结算则创建当月结转的云教练预收、否则修改云教练预算
-		//获取云教练信息
-		OperatingReportCloud reportCloud = operatingReportCloudDao.findByCalenderId(calender.getId());
-		if(Objects.isNull(reportCloud)){
-			reportCloud = new OperatingReportCloud();
-			reportCloud.setCalenderId(calender.getId());
-			reportCloud.setCloudPrice(amount);
-			reportCloud.setOrganId(calender.getOrganId());
-			operatingReportCloudDao.insert(reportCloud);
-		}else {
-			if(reportCloud.getSettlementFlag()){
+	public void updateSet(MusicGroupPaymentCalender calender, BigDecimal amount) {
+		//是否有云教练收入需要结转
+		if(BigDecimal.ZERO.compareTo(amount) < 0){
+			//如果是学员缴费,直接结转到本月
+			if(calender.getPaymentType() == MusicGroupPaymentCalender.PaymentType.ADD_STUDENT){
 				this.saveMonthOperating(calender,amount);
 			}else {
-				reportCloud.setCloudPrice(reportCloud.getCloudPrice().add(amount));
-				reportCloud.setUpdateTime(new Date());
-				operatingReportCloudDao.update(reportCloud);
+				//找出非当月结算的缴费项目预算,如果为空则创建。如果已结算则创建当月结转的云教练预收、否则修改云教练预算
+				//获取云教练信息
+				OperatingReportCloud reportCloud = operatingReportCloudDao.findByCalenderId(calender.getId());
+				if(Objects.isNull(reportCloud)){
+					reportCloud = new OperatingReportCloud();
+					reportCloud.setCalenderId(calender.getId());
+					reportCloud.setCloudPrice(amount);
+					reportCloud.setOrganId(calender.getOrganId());
+					operatingReportCloudDao.insert(reportCloud);
+				}else {
+					if(reportCloud.getSettlementFlag()){
+						this.saveMonthOperating(calender,amount);
+					}else {
+						reportCloud.setCloudPrice(reportCloud.getCloudPrice().add(amount));
+						reportCloud.setUpdateTime(new Date());
+						operatingReportCloudDao.update(reportCloud);
+					}
+				}
 			}
 		}
 	}

+ 26 - 8
mec-biz/src/main/java/com/ym/mec/biz/service/impl/OperatingReportNewServiceImpl.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service.impl;
 
+import com.ym.mec.biz.dal.dao.CourseScheduleDao;
 import com.ym.mec.biz.dal.dao.OperatingReportCloudDao;
 import com.ym.mec.biz.dal.dao.OperatingReportNewDao;
 import com.ym.mec.biz.dal.dao.VipGroupCategoryDao;
@@ -30,6 +31,8 @@ public class OperatingReportNewServiceImpl extends BaseServiceImpl<Integer, Oper
 	private VipGroupCategoryDao vipGroupCategoryDao;
 	@Autowired
 	private OperatingReportCloudDao operatingReportCloudDao;
+	@Autowired
+	private CourseScheduleDao courseScheduleDao;
 
 	@Override
 	public BaseDAO<Integer, OperatingReportNew> getDAO() {
@@ -47,6 +50,7 @@ public class OperatingReportNewServiceImpl extends BaseServiceImpl<Integer, Oper
 		String firstDayOfMonth = DateUtil.dateToString(DateUtil.getFirstDayOfMonth(month),DateUtil.ISO_EXPANDED_DATE_FORMAT);
 		String lastDayOfMonth = DateUtil.dateToString(DateUtil.getLastDayOfMonth(month),DateUtil.ISO_EXPANDED_DATE_FORMAT);
 		String currentMonth = DateUtil.dateToString(DateUtil.getLastDayOfMonth(month),DateUtil.ISO_YEAR_MONTH_FORMAT);
+		String currentYear = DateUtil.dateToString(DateUtil.getLastDayOfMonth(month),DateUtil.ISO_YEAR_FORMAT);
 		operatingReportNewDao.deleteByMonth(currentMonth);
 		List<OperatingReportNew> operatingList = operatingReportNewDao.initOperatingReport(currentMonth);
 		//更新团体云教练计费时间()
@@ -61,12 +65,24 @@ public class OperatingReportNewServiceImpl extends BaseServiceImpl<Integer, Oper
 		//服务收入
 		//导入的服务收入  (全部记录为课程收入)
 		Map<Integer, BigDecimal> collect24 = MapUtil.convertIntegerMap(operatingReportNewDao.sumImportServerOrderAmount(currentMonth));
+		//1、调整student_registration表surplus_course_fee_字段,原有逻辑是用于保存学员已缴费,但是未排课的总乐团课程费用。在课程结束后按课程预计金额分摊到课程实际收入。
+		// 现在需要新增逻辑,记录免费团溢出的乐器课费、以及云教练团溢出的课费。用于在课程结束后计算实际课费,涉及到乐团缴费项目、支付回调
+
+		//2、music_group_payment_calender_course_settings表新增字段,用于记录 云教练、乐器溢出的课程费用,在排课时用于计算预计课费、涉及到降费项目创建、报名支付回调
+
+		//3、course_schedule表新增字段 标记课程是否结算经营报表,用于年底确认经营报表收入、或者已结束调整到未开始,涉及到所有的排课、调整、合班、合课逻辑
+
+		//4、课程调整逻辑修改、已结算经营报表的课程不允许调整(需要合业务部门确认)。如果可以调整,需要在course_schedule_student_payment 表新增结算金额,用于记录已结算的金额,在下次结算时去单独计算。
+
+		//5、初始化历史云教练缴费数据,按课程数量和课费总额比例计算,已排课的初始化预计金额、已缴费的初始化实际金额、以及部分排课数据初始化
+
+		//6、云教练按月计算收入,只计算配置金额,溢出的部分分配给课程
 		//云教练赠送课程实际收入
-		Map<Integer, BigDecimal> collect1 = MapUtil.convertIntegerMap(operatingReportNewDao.sumCloudCourseAmount(firstDayOfMonth,lastDayOfMonth));
+//		Map<Integer, BigDecimal> collect1 = MapUtil.convertIntegerMap(operatingReportNewDao.sumCloudCourseAmount(firstDayOfMonth,lastDayOfMonth));
 		//亏损的云教练算到当月实际收入
-		Map<Integer, BigDecimal> collect22 = MapUtil.convertIntegerMap(operatingReportNewDao.sumLossCloudAmount(currentMonth));
+//		Map<Integer, BigDecimal> collect22 = MapUtil.convertIntegerMap(operatingReportNewDao.sumLossCloudAmount(currentMonth));
 		//付费课程实际收入
-		Map<Integer, BigDecimal> collect2 = MapUtil.convertIntegerMap(operatingReportNewDao.sumCourseAmount(firstDayOfMonth,lastDayOfMonth));
+		Map<Integer, BigDecimal> collect2 = MapUtil.convertIntegerMap(operatingReportNewDao.sumCourseAmount(firstDayOfMonth,lastDayOfMonth,currentYear));
 
 		//个人云教练当月收入
 		Map<Integer, BigDecimal> collect3 = MapUtil.convertIntegerMap(operatingReportNewDao.sumPersonalCloudAmount(currentMonth,firstDayOfMonth,lastDayOfMonth));
@@ -99,7 +115,7 @@ public class OperatingReportNewServiceImpl extends BaseServiceImpl<Integer, Oper
 
 		//课程预收
 		//云教练赠课预收
-		Map<Integer, BigDecimal> collect11 = MapUtil.convertIntegerMap(operatingReportNewDao.sumCloudCoursePreAmount(lastDayOfMonth));
+//		Map<Integer, BigDecimal> collect11 = MapUtil.convertIntegerMap(operatingReportNewDao.sumCloudCoursePreAmount(lastDayOfMonth));
 		//云教练赠送,未排课排课资格预收
 		//获取categoryId
 		VipGroupCategory category = vipGroupCategoryDao.getTheory();
@@ -139,14 +155,14 @@ public class OperatingReportNewServiceImpl extends BaseServiceImpl<Integer, Oper
 				operatingReportNew.setSaleCost(reportNew.getSaleCost());
 			}
 
-			operatingReportNew.setCourseAmount(getAmount(collect1.get(organId)));
-			operatingReportNew.setCourseAmount(operatingReportNew.getCourseAmount().add(getAmount(collect2.get(organId))));
+			operatingReportNew.setCourseAmount(getAmount(collect2.get(organId)));
+//			operatingReportNew.setCourseAmount(operatingReportNew.getCourseAmount().add(getAmount(collect2.get(organId))));
 			operatingReportNew.setCourseAmount(operatingReportNew.getCourseAmount().add(getAmount(collect24.get(organId))));
 
 			operatingReportNew.setCloudAmount(getAmount(collect3.get(organId)));
 			operatingReportNew.setCloudAmount(operatingReportNew.getCloudAmount().add(getAmount(collect4.get(organId))));
 			operatingReportNew.setCloudAmount(operatingReportNew.getCloudAmount().add(getAmount(collect5.get(organId))));
-			operatingReportNew.setCloudAmount(operatingReportNew.getCloudAmount().add(getAmount(collect22.get(organId))));
+//			operatingReportNew.setCloudAmount(operatingReportNew.getCloudAmount().add(getAmount(collect22.get(organId))));
 
 			operatingReportNew.setMaintenanceAmount(getAmount(collect26.get(organId)));
 			operatingReportNew.setBusinessRefund(getAmount(collect6.get(organId)));
@@ -164,7 +180,7 @@ public class OperatingReportNewServiceImpl extends BaseServiceImpl<Integer, Oper
 					add(getAmount(collect10.get(organId))).
 					add(getAmount(collect27.get(organId))).
 					add(getAmount(collect25.get(organId))));
-			operatingReportNew.setCoursePrepaidFee(getAmount(collect11.get(organId)).add(getAmount(collect12.get(organId))).
+			operatingReportNew.setCoursePrepaidFee(getAmount(collect12.get(organId)).
 					add(getAmount(collect20.get(organId))).add(getAmount(collect21.get(organId))).add(getAmount(collect23.get(organId))));
 			operatingReportNew.setSalePrepaidFee(getAmount(collect13.get(organId)));
 			operatingReportNew.setOtherPrepaidFee(getAmount(collect14.get(organId)));
@@ -181,6 +197,8 @@ public class OperatingReportNewServiceImpl extends BaseServiceImpl<Integer, Oper
 			operatingReportNew.setQuasiDiscretionaryProfit(operatingReportNew.getTotalIncome().subtract(operatingReportNew.getTotalCost()));
 		}
 		operatingReportNewDao.batchInsert(operatingList);
+		//将本月乐团课标记为已结算
+		courseScheduleDao.makeSettlementReport(currentMonth);
 	}
 	private BigDecimal getAmount(BigDecimal amount){
 		if(amount == null){

+ 68 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentMusicCourseFeeServiceImpl.java

@@ -0,0 +1,68 @@
+package com.ym.mec.biz.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ym.mec.biz.dal.dao.StudentMusicCourseFeeDao;
+import com.ym.mec.biz.dal.entity.StudentMusicCourseFee;
+import com.ym.mec.biz.service.StudentMusicCourseFeeService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.Objects;
+
+
+@Service("studentMusicCourseFeeService")
+public class StudentMusicCourseFeeServiceImpl extends ServiceImpl<StudentMusicCourseFeeDao, StudentMusicCourseFee> implements StudentMusicCourseFeeService {
+
+    @Override
+    public StudentMusicCourseFeeDao getDao() {
+        return this.baseMapper;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void addActualPrice(Integer userId, String musicGroupId, BigDecimal actualPrice) {
+        StudentMusicCourseFee one = this.lambdaQuery().eq(StudentMusicCourseFee::getMusicGroupId, musicGroupId)
+                .eq(StudentMusicCourseFee::getUserId, userId).one();
+        this.baseMapper.addActualPrice(one.getId(),actualPrice);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void addExpectPrice(Integer userId, String musicGroupId, BigDecimal expectPrice) {
+        StudentMusicCourseFee one = this.lambdaQuery().eq(StudentMusicCourseFee::getMusicGroupId, musicGroupId)
+                .eq(StudentMusicCourseFee::getUserId, userId).one();
+        if(Objects.isNull(one)){
+            one = new StudentMusicCourseFee();
+            one.setExpectPrice(expectPrice);
+            one.setMusicGroupId(musicGroupId);
+            one.setUserId(userId);
+            this.save(one);
+        }else {
+            this.baseMapper.addExpectPrice(one.getId(),expectPrice);
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void cutExpectPrice(Integer userId, String musicGroupId, BigDecimal expectPrice) {
+        StudentMusicCourseFee one = this.lambdaQuery().eq(StudentMusicCourseFee::getMusicGroupId, musicGroupId)
+                .eq(StudentMusicCourseFee::getUserId, userId).one();
+        if(Objects.isNull(one)){
+            one = new StudentMusicCourseFee();
+            one.setMusicGroupId(musicGroupId);
+            one.setUserId(userId);
+            this.save(one);
+        }else {
+            this.baseMapper.cutExpectPrice(one.getId(),expectPrice);
+        }
+    }
+
+    @Override
+    public boolean updateById(StudentMusicCourseFee entity) {
+        this.lambdaQuery().eq(StudentMusicCourseFee::getMusicGroupId,entity.getMusicGroupId())
+                .eq(StudentMusicCourseFee::getUserId,entity.getUserId()).one();
+        return super.save(entity);
+    }
+}
+

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

@@ -61,6 +61,14 @@ public class StudentPaymentOrderDetailServiceImpl extends BaseServiceImpl<Long,
     private StudentPaymentOrderService studentPaymentOrderService;
     @Autowired
     private MusicGroupPaymentCalenderDetailService musicGroupPaymentCalenderDetailService;
+    @Autowired
+    private ChargeTypeSubjectMapperDao chargeTypeSubjectMapperDao;
+    @Autowired
+    private StudentMusicCourseFeeService studentMusicCourseFeeService;
+    @Autowired
+    private MemberFeeSettingService memberFeeSettingService;
+    @Autowired
+    private MusicGroupPaymentCalenderMemberDao musicGroupPaymentCalenderMemberDao;
 
     @Override
     public BaseDAO<Long, StudentPaymentOrderDetail> getDAO() {
@@ -137,6 +145,7 @@ public class StudentPaymentOrderDetailServiceImpl extends BaseServiceImpl<Long,
         return studentPaymentOrderDetailList;
     }
 
+
     @Override
     public List<StudentPaymentOrderDetail> findApplyOrderSuccess(String musicGroupId, DealStatusEnum status, Integer deliveryStatus) {
         return studentPaymentOrderDetailDao.findApplyOrderSuccess(musicGroupId, status, deliveryStatus);
@@ -619,7 +628,11 @@ public class StudentPaymentOrderDetailServiceImpl extends BaseServiceImpl<Long,
 
     public void addOrderDetailTo(StudentPaymentOrder studentPaymentOrder, MusicGroup musicGroup, StudentRegistration studentRegistration) {
         //SurplusCourseFee
-        List<StudentPaymentOrderDetail> allDetails = this.findByOrderId(studentPaymentOrder.getId());
+        Integer userId = studentPaymentOrder.getUserId();
+        Long orderId = studentPaymentOrder.getId();
+        String musicGroupId = musicGroup.getId();
+        Integer tenantId = studentPaymentOrder.getTenantId();
+        List<StudentPaymentOrderDetail> allDetails = this.findByOrderId(orderId);
         BigDecimal courseFee = allDetails.stream().filter(o -> !(o.getType() == MUSICAL)
                         && !(o.getType() == VIP)
                         && !(o.getType() == PRACTICE)
@@ -632,7 +645,7 @@ public class StudentPaymentOrderDetailServiceImpl extends BaseServiceImpl<Long,
                 .reduce(BigDecimal.ZERO, BigDecimal::add);
         
         if (studentRegistration.getTemporaryCourseFee() != null) {
-            studentRegistration.setTemporaryCourseFee(new BigDecimal(0));
+            studentRegistration.setTemporaryCourseFee(BigDecimal.ZERO);
         }
         studentRegistration.setPaymentStatus(YES);
         studentRegistration.setMusicGroupStatus(StudentMusicGroupStatusEnum.NORMAL);
@@ -644,19 +657,26 @@ public class StudentPaymentOrderDetailServiceImpl extends BaseServiceImpl<Long,
             studentRegistration.setSurplusCourseFee(studentRegistration.getSurplusCourseFee().add(courseFee));
             //添加日志
             StudentCourseFeeDetail studentCourseFeeDetail = new StudentCourseFeeDetail();
-            studentCourseFeeDetail.setTenantId(studentPaymentOrder.getTenantId());
+            studentCourseFeeDetail.setTenantId(tenantId);
             studentCourseFeeDetail.setStudentRegistrationId(studentRegistration.getId());
             studentCourseFeeDetail.setAmount(courseFee);
             studentCourseFeeDetail.setSurplusCourseFee(studentRegistration.getSurplusCourseFee());
             studentCourseFeeDetail.setMemo("乐团缴费充值");
-            studentCourseFeeDetail.setOperator(studentPaymentOrder.getUserId());
+            studentCourseFeeDetail.setOperator(userId);
             studentCourseFeeDetailDao.insert(studentCourseFeeDetail);
+            //记录用户实际课费
+//            studentMusicCourseFeeService.addActualPrice(userId,musicGroupId,courseFee);
         }
+        List<OrderDetailTypeEnum> detailTypeEnums = allDetails.stream().map(StudentPaymentOrderDetail::getType).collect(Collectors.toList());
+        //学生云教练处理
+        if (detailTypeEnums.contains(CLOUD_TEACHER) && studentPaymentOrder.getType() == OrderTypeEnum.APPLY) {
+            studentRegistration.setHasCloudTeacher(1);
+        }
+        studentRegistrationDao.update(studentRegistration);
 
         //缴费项目详情
-        musicGroupPaymentCalenderDetailService.addCalenderDetail(studentPaymentOrder, studentRegistration);
+        MusicGroupPaymentCalenderDetail paymentCalenderDetail = musicGroupPaymentCalenderDetailService.addCalenderDetail(studentPaymentOrder);
 
-        List<OrderDetailTypeEnum> detailTypeEnums = allDetails.stream().map(StudentPaymentOrderDetail::getType).collect(Collectors.toList());
         //销售订单详情
         if (allDetails.size() > 0 && (detailTypeEnums.contains(MUSICAL) || detailTypeEnums.contains(ACCESSORIES) || detailTypeEnums.contains(TEACHING))) {
             BigDecimal couponRemitFee = studentPaymentOrder.getCouponRemitFee();
@@ -703,13 +723,33 @@ public class StudentPaymentOrderDetailServiceImpl extends BaseServiceImpl<Long,
         if (detailTypeEnums.contains(CLOUD_TEACHER)) {
             if(studentPaymentOrder.getType() == OrderTypeEnum.APPLY){
                 studentRegistration.setHasCloudTeacher(1);
+                //如果是报名订单,要处理云教练费用、以及溢出课费
+            }
+            if(musicGroup.getCourseViewType() == CourseViewTypeEnum.MEMBER_FEE){
+                //获取云教练溢出费用
+                MusicGroupPaymentCalenderMember calenderMember = musicGroupPaymentCalenderMemberDao.findByCalenderId(paymentCalenderDetail.getMusicGroupPaymentCalenderId());
+                BigDecimal courseIncome = memberFeeSettingService.getAmount(musicGroup.getOrganId(), 1, calenderMember.getPeriod(),
+                        calenderMember.getNum(), MemberFeeSettingServiceImpl::getIncome);
+                if(calenderMember.getActualAmount().compareTo(courseIncome) > 0){
+                    BigDecimal subtract = calenderMember.getActualAmount().subtract(courseIncome);
+                    //累加充值金额
+                    studentRegistrationDao.updateCourseFee(studentRegistration.getId(),subtract);
+                    //添加日志
+                    StudentCourseFeeDetail studentCourseFeeDetail = new StudentCourseFeeDetail();
+                    studentCourseFeeDetail.setTenantId(tenantId);
+                    studentCourseFeeDetail.setStudentRegistrationId(studentRegistration.getId());
+                    studentCourseFeeDetail.setAmount(subtract);
+                    studentCourseFeeDetail.setSurplusCourseFee(studentRegistration.getSurplusCourseFee().add(subtract));
+                    studentCourseFeeDetail.setMemo("会员团,购买云教练赠送课费");
+                    studentCourseFeeDetail.setOperator(userId);
+                    studentCourseFeeDetailDao.insert(studentCourseFeeDetail);
+                }
             }
             BigDecimal cloudTeacherFee = allDetails.stream().filter(o -> o.getType() == CLOUD_TEACHER)
                     .map(o -> o.getPrice().subtract(o.getRemitFee() == null ? BigDecimal.ZERO : o.getRemitFee()))
                     .reduce(BigDecimal.ZERO, BigDecimal::add);
             cloudTeacherOrderService.addOrderDetail2CloudTeacher(studentPaymentOrder, cloudTeacherFee);
         }
-        studentRegistrationDao.update(studentRegistration);
     }
 
     @Override

+ 0 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentRouteOrderServiceImpl.java

@@ -321,7 +321,6 @@ public class StudentPaymentRouteOrderServiceImpl extends BaseServiceImpl<Long, S
                     for (MusicGroupPaymentCalenderDetail calenderDetail : calenderDetails) {
                         calenderDetail.setPaymentStatus(MusicGroupStudentFee.PaymentStatus.PAID_COMPLETED);
                         calenderDetail.setPayTime(nowDate);
-                        calenderDetail.setUpdateTime(nowDate);
                     }
                     if (calenderDetails.size() > 0) {
                         musicGroupPaymentCalenderDetailDao.batchUpdate(calenderDetails);

+ 5 - 0
mec-biz/src/main/resources/config/mybatis/ChargeTypeSubjectMapperMapper.xml

@@ -168,4 +168,9 @@
         WHERE course_view_type_ = #{courseViewType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
           AND FIND_IN_SET(subject_id_, #{subjectIds})
     </select>
+    <select id="findByViewTypeANdSubject" resultMap="ChargeTypeSubjectMapper">
+        select * from charge_type_subject_mapper
+        where course_view_type_ = #{courseViewType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+        and subject_id_ = #{subjectId} and tenant_id_ = #{tenantId} LIMIT 1
+    </select>
 </mapper>

+ 15 - 10
mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -43,6 +43,7 @@
         <result column="tenant_id_" property="tenantId"/>
         <result column="evaluate_flag_" property="evaluateFlag"/>
         <result column="convert_flag_" property="convertFlag"/>
+        <result column="settlement_report_flag_" property="settlementReportFlag"/>
     </resultMap>
 
     <resultMap type="com.ym.mec.biz.dal.dto.Mapper" id="Mapper">
@@ -214,14 +215,14 @@
             keyProperty="id">
         INSERT INTO course_schedule
         (id_,group_type_,music_group_id_,class_group_id_,status_,subsidy_,class_date_,start_class_time_,end_class_time_,
-        teacher_id_,actual_teacher_id_,create_time_,update_time_,type_,name_,teach_mode_,student_num_,leave_student_num_,
+        teacher_id_,actual_teacher_id_,type_,name_,teach_mode_,student_num_,leave_student_num_,
         schoole_id_,is_lock_,note_,teaching_content_,organ_id_,member_flag_,pre_course_flag_,valid_end_time_,valid_start_time_,tenant_id_)
         VALUE
         <foreach collection="list" item="course" separator=",">
             (#{course.id},#{course.groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{course.musicGroupId},
             #{course.classGroupId},#{course.status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             #{course.subsidy},#{course.classDate},#{course.startClassTime},#{course.endClassTime},#{course.teacherId},
-            #{course.teacherId},now(),now(),#{course.type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+            #{course.teacherId},#{course.type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             #{course.name},#{course.teachMode,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{course.studentNum},
             #{course.leaveStudentNum},#{course.schoolId},#{course.isLock},#{course.note},#{course.teachingContent},
             #{course.organId},#{course.memberFlag},#{course.preCourseFlag},#{course.validEndTime},#{course.validStartTime},#{course.tenantId})
@@ -232,14 +233,14 @@
             keyProperty="id">
         INSERT INTO course_schedule
         (id_,group_type_,music_group_id_,class_group_id_,status_,subsidy_,class_date_,start_class_time_,end_class_time_,
-        teacher_id_,actual_teacher_id_,create_time_,update_time_,type_,name_,teach_mode_,student_num_,leave_student_num_,
+        teacher_id_,actual_teacher_id_,type_,name_,teach_mode_,student_num_,leave_student_num_,
         schoole_id_,is_lock_,note_,teaching_content_,organ_id_,member_flag_,pre_course_flag_,valid_end_time_,valid_start_time_,tenant_id_)
         VALUE
         <foreach collection="list" item="course" separator=",">
             (#{course.id},#{course.groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{course.musicGroupId},
             #{course.classGroupId},#{course.status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             #{course.subsidy},#{course.classDate},#{course.startClassTime},#{course.endClassTime},#{course.teacherId},
-            #{course.actualTeacherId},now(),now(),#{course.type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+            #{course.actualTeacherId},#{course.type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             #{course.name},#{course.teachMode,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{course.studentNum},
             #{course.leaveStudentNum},#{course.schoolId},#{course.isLock},#{course.note},#{course.teachingContent},
             #{course.organId},#{course.memberFlag},#{course.preCourseFlag},#{course.validEndTime},#{course.validStartTime},#{course.tenantId})
@@ -322,7 +323,6 @@
             <if test="isLock != null">
                 is_lock_ = #{isLock},
             </if>
-            update_time_ = NOW()
         </set>
         WHERE id_ = #{id} and tenant_id_ = #{tenantId}
     </update>
@@ -346,8 +346,7 @@
 
     <update id="logicDeleteCourseSchedulesByMusicGroupID">
         update course_schedule
-        set del_flag_    = '1',
-            update_time_ = NOW()
+        set del_flag_    = '1'
         WHERE music_group_id_ = #{musicGroupID}
           AND group_type_ = 'MUSIC'
           and status_ = 'NOT_START'
@@ -355,8 +354,7 @@
 
     <update id="resumeCourseScheduleByMusicGroupId">
         update course_schedule
-        set del_flag_    = '0',
-            update_time_ = NOW()
+        set del_flag_    = '0'
         WHERE music_group_id_ = #{musicGroupID}
           AND group_type_ = 'MUSIC'
           and status_ = 'NOT_START'
@@ -3224,6 +3222,9 @@
     <update id="batchUpdateDelFlag">
         UPDATE course_schedule SET del_flag_ = 0,update_time_ = NOW() WHERE FIND_IN_SET(id_,#{courseIds})
     </update>
+    <update id="makeSettlementReport">
+        update course_schedule set settlement_report_flag_ = 1 where DATE_FORMAT(class_date_,'%Y-%m') = #{currentMonth}
+    </update>
 
     <select id="getStudentCourseScheduleNum" resultMap="com.ym.mec.biz.dal.dao.PracticeGroupDao.courseGroupExport">
         SELECT COUNT(*) total_class_times_,cssp.user_id_ student_id_
@@ -4125,6 +4126,10 @@
 		select distinct cs.music_group_id_ from course_schedule cs where cs.group_type_ = #{groupType} and cs.status_ = 'OVER'
     </select>
 
+    <select id="checkCourseIsSettlementReport" resultType="int">
+        SELECT COUNT(*) FROM course_schedule where settlement_report_flag_ = 1 and id_ = #{courseScheduleId}
+    </select>
+
     <select id="queryTeacherServeHomeworkDetailV2"
             resultType="com.ym.mec.biz.dal.dto.CourseHomeworkWrapper$CourseHomeworkList">
         SELECT
@@ -4186,7 +4191,7 @@
             limit #{param.offset},#{param.rows}
         </if>
     </select>
-    
+
     <select id="countTeacherServeHomeworkDetailV2" resultType="int">
         SELECT
         count(1)

+ 1 - 1
mec-biz/src/main/resources/config/mybatis/MemberFeeSettingMapper.xml

@@ -25,7 +25,7 @@
 		<result column="current_year_fee_" property="currentYearFee" />
 		<result column="group_purchase_year_fee_" property="groupPurchaseYearFee" />
 		<result column="original_year_fee_" property="originalYearFee" />
-		<result column="income_year_fee" property="incomeYearFee" />
+		<result column="income_year_fee_" property="incomeYearFee" />
 		<result column="tenant_id_" property="tenantId" />
 	</resultMap>
 

+ 8 - 2
mec-biz/src/main/resources/config/mybatis/MusicGroupOrganizationCourseSettingsDetailMapper.xml

@@ -115,7 +115,13 @@
     </delete>
 
     <select id="queryByMusicGroupOrganizationCourseSettingsId" resultMap="MusicGroupOrganizationCourseSettingsDetail">
-        SELECT * FROM music_group_organization_course_settings_detail
-        where music_group_organization_course_settings_id_ = #{musicGroupOrganizationCourseSettingsId}
+        SELECT mgocsd.id_, mgocsd.music_group_organization_course_settings_id_, mgocsd.course_type_, mgocsd.course_total_minuties_,
+               mgocsd.course_original_price_, mgocsd.course_current_price_, mgocsd.is_student_optional_, mgocsd.create_time_,
+               mgocsd.update_time_, mgocsd.tenant_id_,ocups.unit_price_ FROM music_group_organization_course_settings_detail mgocsd
+                                                                                 left join music_group_organization_course_settings mgocs ON mgocsd.music_group_organization_course_settings_id_ = mgocs.id_
+                                                                                 left join organization_course_unit_price_settings ocups ON ocups.course_view_type_ = mgocs.course_view_type_ AND ocups.course_type_ = mgocsd.course_type_
+        where mgocsd.music_group_organization_course_settings_id_ = #{musicGroupOrganizationCourseSettingsId}
+          AND ocups.course_view_type_ = mgocs.course_view_type_ AND ocups.course_type_ = mgocsd.course_type_ AND mgocsd.music_group_organization_course_settings_id_ = mgocs.id_
+          AND mgocs.organ_id_ = ocups.organ_id_
     </select>
 </mapper>

+ 8 - 5
mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderCourseSettingsMapper.xml

@@ -14,6 +14,7 @@
 		<result column="unit_price_" property="unitPrice" />
 		<result column="course_original_price_" property="courseOriginalPrice" />
 		<result column="course_current_price_" property="courseCurrentPrice" />
+		<result column="overflow_course_price_" property="overflowCoursePrice" />
 		<result column="is_student_optional_" property="isStudentOptional" />
 		<result column="name_" property="name" />
 		<result column="create_time_" property="createTime" />
@@ -37,21 +38,21 @@
 		useGeneratedKeys="true" keyColumn="id" keyProperty="id">
 		INSERT INTO music_group_payment_calender_course_settings
 		(music_group_payment_calender_id_,course_type_,course_total_minuties_,unit_price_,course_original_price_,
-		course_current_price_,is_student_optional_,create_time_,update_time_,name_,tenant_id_)
+		course_current_price_,is_student_optional_,name_,tenant_id_,overflow_course_price_)
 		VALUES(#{musicGroupPaymentCalenderId},#{courseType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{courseTotalMinuties},
-		#{unitPrice},#{courseOriginalPrice},#{courseCurrentPrice},#{isStudentOptional},#{createTime},#{updateTime},#{name},#{tenantId})
+		#{unitPrice},#{courseOriginalPrice},#{courseCurrentPrice},#{isStudentOptional},#{name},#{tenantId},#{overflowCoursePrice})
 	</insert>
 	
 	<insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="true" keyColumn="id"
             keyProperty="id">
 		INSERT INTO music_group_payment_calender_course_settings
 		(music_group_payment_calender_id_,course_type_,course_total_minuties_,unit_price_,course_original_price_,
-		course_current_price_,is_student_optional_,create_time_,update_time_,name_,tenant_id_)
+		course_current_price_,is_student_optional_,name_,tenant_id_,overflow_course_price_)
 		VALUES
 		<foreach collection="list" item="item" separator=",">
 		(#{item.musicGroupPaymentCalenderId},#{item.courseType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
 		#{item.courseTotalMinuties},#{item.unitPrice},#{item.courseOriginalPrice},#{item.courseCurrentPrice},
-		#{item.isStudentOptional},NOW(),NOW(),#{item.name},#{item.tenantId})
+		#{item.isStudentOptional},#{item.name},#{item.tenantId},#{item.overflowCoursePrice})
 		</foreach>
 	</insert>
 
@@ -60,6 +61,9 @@
 		parameterType="com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderCourseSettings">
 		UPDATE music_group_payment_calender_course_settings
 		<set>
+			<if test="overflowCoursePrice != null and overflowCoursePrice != ''">
+				overflow_course_price_ = #{overflowCoursePrice},
+			</if>
 			<if test="name != null and name != ''">
 				name_ = #{name},
 			</if>
@@ -84,7 +88,6 @@
 			<if test="courseTotalMinuties != null">
 				course_total_minuties_ = #{courseTotalMinuties},
 			</if>
-				update_time_ = NOW()
 		</set>
 		WHERE id_ = #{id} and tenant_id_ = #{tenantId}
 	</update>

+ 3 - 0
mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderMapper.xml

@@ -276,6 +276,9 @@
         WHERE user_id_ = #{userId} AND payment_status_ = 'NON_PAYMENT')
         AND expect_num_ > 0 AND music_group_id_ = #{musicGroupId}
     </update>
+    <update id="updatePaymentNum">
+        UPDATE music_group_payment_calender SET expect_num_ = expect_num_ + #{expectNum},actual_num_ = actual_num_ + #{actualNum} WHERE id_ = #{calenderId}
+    </update>
     <select id="findStudentNoPaymentCalender" resultType="java.lang.Long">
         SELECT DISTINCT mgpc.id_ FROM music_group_payment_calender mgpc
         WHERE mgpc.student_ids_ = #{userId} AND mgpc.payment_type_ = 'ADD_STUDENT'

+ 6 - 2
mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderMemberMapper.xml

@@ -16,6 +16,7 @@
 		<result column="optional_flag_" property="optionalFlag" />
 		<result column="actual_amount_" property="actualAmount" />
 		<result column="original_amount_" property="originalAmount" />
+		<result column="income_" property="income" />
 		<result column="create_time_" property="createTime" />
 		<result column="update_time_" property="updateTime" />
         <result column="tenant_id_" property="tenantId"/>
@@ -35,9 +36,9 @@
 	<!-- 向数据库增加一条记录 -->
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderMember" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
 		INSERT INTO music_group_payment_calender_member (calender_id_,name_,num_,period_,
-		member_rank_setting_id_,optional_flag_,actual_amount_,original_amount_,create_time_,update_time_,tenant_id_,auto_activation_flag_)
+		member_rank_setting_id_,optional_flag_,actual_amount_,original_amount_,create_time_,update_time_,tenant_id_,auto_activation_flag_,income_)
 		VALUES(#{calenderId},#{name},#{num},#{period,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{memberRankSettingId},#{optionalFlag},#{actualAmount},
-		       #{originalAmount},NOW(),NOW(),#{tenantId},#{autoActivationFlag})
+		       #{originalAmount},NOW(),NOW(),#{tenantId},#{autoActivationFlag},#{income})
 	</insert>
 	
 	<!-- 根据主键查询一条记录 -->
@@ -67,6 +68,9 @@
 		<if test="originalAmount != null">
 		original_amount_ = #{originalAmount},
 		</if>
+		<if test="income != null">
+			income_ = #{income},
+		</if>
 		<if test="name != null">
 		name_ = #{name},
 		</if>

+ 10 - 37
mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentStudentCourseDetailMapper.xml

@@ -160,13 +160,6 @@
             WHERE id_ = #{paymentCourseDetail.id} and tenant_id_ = #{paymentCourseDetail.tenantId}
         </foreach>
     </update>
-    <update id="updateByCourseType">
-        UPDATE music_group_payment_student_course_detail
-        SET course_current_price_ = #{courseCurrentPrice},
-            update_time_          = NOW()
-        WHERE course_type_ = #{courseType}
-          AND FIND_IN_SET(music_group_payment_calender_detail_id_, #{musicGroupPaymentCalenderIds})
-    </update>
 
     <!-- 根据主键删除一条记录 -->
     <delete id="delete">
@@ -175,23 +168,6 @@
         WHERE id_ = #{id}
     </delete>
 
-    <!-- 根据主键删除一条记录 -->
-    <delete id="deleteByMusicGroupPaymentCalenderId">
-        DELETE
-        FROM music_group_payment_student_course_detail
-        WHERE music_group_payment_calender_id_ = #{musicGroupPaymentCalenderId}
-    </delete>
-
-    <delete id="deleteByMusicGroupPaymentCalenderDetailId">
-        DELETE FROM music_group_payment_student_course_detail
-        <where>
-            music_group_payment_calender_detail_id_ IN
-            <foreach item="item" collection="list" separator="," open="(" close=")" index="">
-                #{item}
-            </foreach>
-        </where>
-    </delete>
-
     <!-- 分页查询 -->
     <select id="queryByMusicGroupPaymentStudentCourseDetailId" resultMap="MusicGroupPaymentStudentCourseDetail"
             parameterType="map">
@@ -266,22 +242,20 @@
         GROUP BY mgpscd.user_id_,mgpscd.course_type_
         HAVING SUM(mgpscd.sub_course_minutes_) > 0
     </select>
-
-    <delete id="deleteByUserIdAndMusicGroupId">
-        DELETE
-        FROM music_group_payment_student_course_detail
+    <select id="findByUserIdAndMusicGroupId" resultMap="MusicGroupPaymentStudentCourseDetail">
+        SELECT * FROM music_group_payment_student_course_detail
         WHERE user_id_ = #{userId}
           AND music_group_payment_calender_id_ IN (
             SELECT id_
             FROM music_group_payment_calender
             WHERE music_group_id_ = #{musicGroupId}
         )
-    </delete>
-    <delete id="deleteByUserIdAndCalenderId">
-        DELETE
-        FROM music_group_payment_student_course_detail
-        WHERE user_id_ = #{userId} AND music_group_payment_calender_id_ IN
-        <foreach collection="calenderIds" open="(" close=")" item="id" separator=",">
+    </select>
+
+    <delete id="delByIds">
+        DELETE FROM music_group_payment_student_course_detail
+        WHERE id_ IN
+        <foreach collection="courseDetailIds" open="(" close=")" item="id" separator=",">
             #{id}
         </foreach>
     </delete>
@@ -369,7 +343,7 @@
     </select>
 
     <select id="findByCalenderAndUserId" resultMap="MusicGroupPaymentStudentCourseDetail">
-        SELECT * FROM music_group_payment_student_course_detail WHERE music_group_payment_calender_id_ = #{calenderId}
+        SELECT * FROM music_group_payment_student_course_detail WHERE FIND_IN_SET(music_group_payment_calender_id_,#{calenderId})
         <if test="userId != null">
             AND user_id_ = #{userId}
         </if>
@@ -390,7 +364,6 @@
     </select>
 
     <update id="clearRemainCourseMinutesByMusicGroupId">
-    	update music_group_payment_student_course_detail
-		set sub_course_minutes_ = 0 WHERE sub_course_minutes_ > 0 and music_group_id_ = #{musicGroupId}
+    	update music_group_payment_student_course_detail set sub_course_minutes_ = 0 WHERE sub_course_minutes_ > 0 and music_group_id_ = #{musicGroupId}
     </update>
 </mapper>

+ 0 - 7
mec-biz/src/main/resources/config/mybatis/OperatingReportCloudMapper.xml

@@ -35,12 +35,6 @@
 		INSERT INTO operating_report_cloud (organ_id_,calender_id_,start_date_,end_date_,cloud_price_,course_price_,settlement_flag_,month_flag_,create_time_,update_time_)
 		VALUES(#{organId},#{calenderId},#{startDate},#{endDate},#{cloudPrice},#{coursePrice},#{settlementFlag},#{monthFlag},NOW(),NOW())
 	</insert>
-	<insert id="batchInsert">
-		INSERT INTO operating_report_cloud (organ_id_,calender_id_,month_flag_,create_time_,update_time_) VALUES
-		<foreach collection="operatingReportClouds" separator="," item="item">
-			(#{item.organId},#{item.calenderId},#{item.monthFlag},NOW(),NOW())
-		</foreach>
-	</insert>
 
 	<!-- 根据主键查询一条记录 -->
 	<update id="update" parameterType="com.ym.mec.biz.dal.entity.OperatingReportCloud">
@@ -67,7 +61,6 @@
 	</update>
     <update id="settlementCalender">
 		UPDATE operating_report_cloud orc
-		LEFT JOIN cloud_teacher_free_course ctf ON ctf.calender_id_ = orc.calender_id_
 		SET orc.settlement_flag_ = 1
 		WHERE orc.month_flag_ = 0 AND orc.settlement_flag_ = 0 AND DATE_FORMAT(orc.start_date_,'%Y-%m') = #{month};
 	</update>

+ 6 - 17
mec-biz/src/main/resources/config/mybatis/OperatingReportNewMapper.xml

@@ -129,8 +129,9 @@
 		update operating_report_cloud orc
 		left join (
 		select orc.calender_id_,MIN(cs.class_date_) start_date_ from operating_report_cloud orc
-		LEFT JOIN cloud_teacher_free_course ctf ON ctf.calender_id_ = orc.calender_id_
-		LEFT JOIN course_schedule cs ON cs.id_ = ctf.course_id_
+		left join music_group_payment_calender mgpc ON mgpc.id_ = orc.calender_id_
+		left join course_schedule_student_payment cssp ON cssp.batch_no_ = mgpc.batch_no_
+		left join course_schedule cs ON cs.id_ = cssp.course_schedule_id_
 		where orc.month_flag_ = false AND orc.settlement_flag_ = false AND orc.start_date_ IS NULL
 		AND cs.class_date_ &lt;= #{lastDay}
 		group by orc.calender_id_) mc ON orc.calender_id_ = mc.calender_id_
@@ -186,24 +187,19 @@
 		      (DATE_FORMAT(spo.pay_time_,'%Y-%m') = #{month} AND (mg.musical_instruments_provide_status_ IS NULL OR mg.musical_instruments_provide_status_ = 1))
 		group by so.organ_id_
 	</select>
-	<select id="sumCloudCourseAmount" resultType="java.util.Map">
-		SELECT cs.organ_id_ 'key',SUM(ctf.cost_) 'value' FROM cloud_teacher_free_course ctf
-		LEFT JOIN course_schedule cs ON cs.id_ = ctf.course_id_
-		where cs.del_flag_ = 0 AND cs.is_lock_ = 0 AND cs.pre_course_flag_ = 0 AND (cs.new_course_id_ IS NULL OR cs.new_course_id_ = cs.id_)
-		AND cs.class_date_ BETWEEN #{firstDay} AND #{lastDay} group by cs.organ_id_;
-	</select>
 	<select id="sumCourseAmount" resultType="java.util.Map">
 		SELECT cs.organ_id_ 'key',SUM(cssp.actual_price_) 'value' FROM course_schedule cs
 		LEFT JOIN course_schedule_student_payment cssp ON cssp.course_schedule_id_ = cs.id_
 		where cs.del_flag_ = 0 AND cs.is_lock_ = 0 AND cs.pre_course_flag_ = 0 AND (cs.new_course_id_ IS NULL OR cs.new_course_id_ = cs.id_)
-		AND cssp.actual_price_ > 0 AND cs.class_date_ BETWEEN #{firstDay} AND #{lastDay} group by cs.organ_id_;
+		AND cssp.actual_price_ > 0 AND cs.class_date_ BETWEEN #{firstDay} AND #{lastDay}
+		AND DATE_FORMAT(cs.create_time_,'%Y') = #{currentYear} AND cs.settlement_report_flag_ = 0 group by cs.organ_id_;
 	</select>
 	<select id="sumPersonalCloudAmount" resultType="java.util.Map">
 		select cto.organ_id_ 'key',TRUNCATE(SUM(operating_amount_ / (TIMESTAMPDIFF(DAY,cto.start_time_,cto.end_time_) + 1) *
 		(TIMESTAMPDIFF(DAY,CASE WHEN start_time_ &lt; #{firstDay} THEN #{firstDay} ELSE DATE_FORMAT(start_time_,'%Y-%m-%d') END,
 		CASE WHEN DATE_FORMAT(end_time_,'%Y-%m') > #{month} THEN #{lastDay} ELSE DATE_FORMAT(end_time_,'%Y-%m-%d') END) + 1)),2) 'value'
 		from cloud_teacher_order cto
-		where operating_amount_ > 0 AND #{month} BETWEEN DATE_FORMAT(start_time_,'%Y-%m')
+		where operating_amount_ > 0 AND #{month} BETWEEN DATE_FORMAT(start_time_,'%Y-%m') AND cto.settlement_report_flag_ = 0 AND cto.status_ = 2
 		AND DATE_FORMAT(end_time_,'%Y-%m') group by cto.organ_id_;
 	</select>
 	<select id="sumGroupCloudAmount" resultType="java.util.Map">
@@ -240,13 +236,6 @@
 		from operating_report_cloud orc
 		where orc.cloud_price_ > 0 AND orc.month_flag_ = true AND DATE_FORMAT(orc.create_time_,'%Y-%m') = #{month} group by orc.organ_id_;
 	</select>
-	<select id="sumCloudCoursePreAmount" resultType="java.util.Map">
-		SELECT cs.organ_id_ 'key',SUM(ctf.cost_) 'value' FROM cloud_teacher_free_course ctf
-		LEFT JOIN course_schedule cs ON cs.id_ = ctf.course_id_
-		where cs.del_flag_ = 0 AND cs.is_lock_ = 0 AND cs.pre_course_flag_ = 0
-		AND (cs.new_course_id_ IS NULL OR cs.new_course_id_ = cs.id_) AND cs.class_date_ > #{lastDay}
-		group by cs.organ_id_;
-	</select>
 	<select id="sumCoursePreAmount" resultType="java.util.Map">
 		SELECT cs.organ_id_ 'key',SUM(cssp.actual_price_) 'value' FROM course_schedule cs
 		LEFT JOIN course_schedule_student_payment cssp ON cssp.course_schedule_id_ = cs.id_

+ 24 - 0
mec-biz/src/main/resources/config/mybatis/StudentMusicCourseFeeMapper.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ym.mec.biz.dal.dao.StudentMusicCourseFeeDao">
+    <resultMap id="BaseResultMap" type="com.ym.mec.biz.dal.entity.StudentMusicCourseFee">
+        <id column="id_" property="id"/>
+        <id column="organ_id_" property="organId"/>
+        <id column="music_group_id_" property="musicGroupId"/>
+        <id column="expect_price_" property="expectPrice"/>
+        <id column="actual_price_" property="actualPrice"/>
+        <id column="receivable_price_" property="receivablePrice"/>
+        <id column="create_time_" property="createTime"/>
+        <id column="update_time_" property="updateTime"/>
+    </resultMap>
+    <insert id="addExpectPrice">
+        update student_music_course_fee set expect_price_ = expect_price_ + #{expectPrice} where id_ = #{id}
+    </insert>
+
+    <insert id="cutExpectPrice">
+        update student_music_course_fee set expect_price_ = expect_price_ - #{expectPrice} where id_ = #{id}
+    </insert>
+    <insert id="addActualPrice">
+        update student_music_course_fee set actual_price_ = actual_price_ + #{actualPrice} where id_ = #{id}
+    </insert>
+</mapper>

+ 3 - 2
mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderDetailMapper.xml

@@ -373,9 +373,10 @@
     <select id="getWithUserAndOrderType" resultMap="StudentPaymentOrderDetail">
         SELECT spod.* FROM student_payment_order_detail spod
         LEFT JOIN student_payment_order spo ON spo.id_=spod.payment_order_id_
-        WHERE spo.user_id_= #{userId}
-        AND spod.type_ = #{orderType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+        WHERE spo.user_id_= #{userId} AND spo.music_group_id_ = #{musicGroupId}
+        AND spod.type_ = #{orderDetailType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
         AND spo.status_='SUCCESS'
+        AND spo.type_ = 'APPLY'
     </select>
 
     <select id="getOrderDetailByOrderId" resultMap="StudentPaymentOrderDetail">

+ 3 - 0
mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml

@@ -1362,6 +1362,9 @@
             AND music_group_id_ = #{musicGroupId}
         </if>
     </update>
+    <update id="updateCourseFee">
+        UPDATE student_registration SET surplus_course_fee_ = surplus_course_fee_ + #{musicalFee} WHERE id_ = #{id}
+    </update>
 
     <select id="countPayingNum" resultType="map">
         SELECT COUNT(DISTINCT user_id_) `value`, actual_subject_id_ `key`

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

@@ -51,6 +51,11 @@ public class DateUtil {
 	/**
 	 * ISO8601扩展日期格式 yyyy-MM-dd ,如:2002-12-25 代表2002年12月25日。
 	 */
+	public static final String ISO_YEAR_FORMAT = "yyyy";
+
+	/**
+	 * ISO8601扩展日期格式 yyyy-MM-dd ,如:2002-12-25 代表2002年12月25日。
+	 */
 	public static final String ISO_YEAR_MONTH_FORMAT = "yyyy-MM";
 
 	/**