瀏覽代碼

Merge remote-tracking branch 'origin/saas' into saas

yanite 3 年之前
父節點
當前提交
3a29946ce3
共有 71 個文件被更改,包括 2302 次插入1625 次删除
  1. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentCalenderActivityDao.java
  2. 0 20
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPaymentOrderDao.java
  3. 27 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysCouponIssueRecordDao.java
  4. 4 6
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TenantAssetsInfoDao.java
  5. 82 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupApplyGoodsDto.java
  6. 51 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/RegisterPayDto.java
  7. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SysCouponCodeDto.java
  8. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentPaymentOrder.java
  9. 33 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysCoupon.java
  10. 29 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysCouponCode.java
  11. 144 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysCouponIssueRecord.java
  12. 58 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/CouponDetailTypeEnum.java
  13. 13 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/SysCouponCodeQueryInfo.java
  14. 64 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/vo/CouponIssueRecordVo.java
  15. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ActivityUserMapperService.java
  16. 1 4
      mec-biz/src/main/java/com/ym/mec/biz/service/CloudTeacherOrderService.java
  17. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentCalenderActivityService.java
  18. 12 11
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentCalenderBaseService.java
  19. 11 4
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentCalenderDetailService.java
  20. 0 2
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentCalenderMemberService.java
  21. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentCalenderService.java
  22. 5 4
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupService.java
  23. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentInstrumentService.java
  24. 7 2
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentOrderDetailService.java
  25. 11 23
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentOrderService.java
  26. 2 20
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentRegistrationService.java
  27. 15 10
      mec-biz/src/main/java/com/ym/mec/biz/service/SysCouponCodeService.java
  28. 27 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysCouponIssueRecordService.java
  29. 8 2
      mec-biz/src/main/java/com/ym/mec/biz/service/SysCouponService.java
  30. 24 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ActivityUserMapperServiceImpl.java
  31. 14 16
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CloudTeacherOrderServiceImpl.java
  32. 1 64
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  33. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MemberRankSettingServiceImpl.java
  34. 14 8
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderActivityServiceImpl.java
  35. 7 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderCourseSettingsServiceImpl.java
  36. 114 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderDetailServiceImpl.java
  37. 12 12
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderMemberServiceImpl.java
  38. 11 9
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderRepairServiceImpl.java
  39. 47 13
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java
  40. 324 426
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  41. 11 27
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupSubjectPlanServiceImpl.java
  42. 1 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupServiceImpl.java
  43. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SellOrderServiceImpl.java
  44. 4 35
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentInstrumentServiceImpl.java
  45. 27 19
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  46. 103 231
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  47. 9 13
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java
  48. 220 181
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysCouponCodeServiceImpl.java
  49. 131 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysCouponIssueRecordServiceImpl.java
  50. 145 97
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysCouponServiceImpl.java
  51. 6 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantAssetsInfoServiceImpl.java
  52. 5 19
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  53. 3 2
      mec-biz/src/main/resources/config/mybatis/ChargeTypeMapper.xml
  54. 2 5
      mec-biz/src/main/resources/config/mybatis/CloudTeacherOrderMapper.xml
  55. 1 1
      mec-biz/src/main/resources/config/mybatis/CourseScheduleModifyLogMapper.xml
  56. 7 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderActivityDao.xml
  57. 7 1
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderMapper.xml
  58. 2 2
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  59. 10 11
      mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderDetailMapper.xml
  60. 3 24
      mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml
  61. 18 4
      mec-biz/src/main/resources/config/mybatis/SysCouponCodeMapper.xml
  62. 76 0
      mec-biz/src/main/resources/config/mybatis/SysCouponIssueRecordMapper.xml
  63. 6 2
      mec-biz/src/main/resources/config/mybatis/SysCouponMapper.xml
  64. 6 2
      mec-common/common-core/src/main/java/com/ym/mec/common/page/PageUtil.java
  65. 31 0
      mec-common/common-core/src/main/java/com/ym/mec/common/page/WrapperUtil.java
  66. 95 159
      mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupController.java
  67. 1 4
      mec-student/src/main/java/com/ym/mec/student/controller/SporadicChargeInfoController.java
  68. 38 33
      mec-student/src/main/java/com/ym/mec/student/controller/SysCouponCodeController.java
  69. 1 1
      mec-web/src/main/java/com/ym/mec/web/controller/MusicGroupController.java
  70. 39 74
      mec-web/src/main/java/com/ym/mec/web/controller/SysCouponController.java
  71. 60 0
      mec-web/src/main/java/com/ym/mec/web/controller/SysCouponIssueRecordController.java

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

@@ -13,4 +13,6 @@ public interface MusicGroupPaymentCalenderActivityDao extends BaseDAO<Long, Musi
     void delByCalenderId(@Param("calenderId") Long calenderId);
 
     List<MusicGroupPaymentCalenderActivity> findByCalenderId(Long calenderId);
+
+    List<MusicGroupPaymentCalenderActivity> findByIds(@Param("activityIdList") List<Long> buyCalenderActivityIdList);
 }

+ 0 - 20
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPaymentOrderDao.java

@@ -30,15 +30,6 @@ public interface StudentPaymentOrderDao extends BaseDAO<Long, StudentPaymentOrde
 
     StudentPaymentOrder lockOrder(@Param("id") Long id);
 
-    /**
-     * 查询商品列表
-     *
-     * @param musicGroupId
-     * @param type
-     * @return
-     */
-    List<Goods> queryApplyGoodsList(@Param("musicGroupId") String musicGroupId, @Param("type") OrderDetailTypeEnum type);
-
     List<StudentPaymentOrder> queryByCondition(@Param("groupType") GroupType groupType, @Param("musicGroupId") String musicGroupId,
                                                @Param("userId") Integer userId, @Param("status") DealStatusEnum status, @Param("type") OrderTypeEnum type);
 
@@ -168,17 +159,6 @@ public interface StudentPaymentOrderDao extends BaseDAO<Long, StudentPaymentOrde
     List<StudentPaymentOrder> findStudentPaymentOrder(@Param("musicGroupId") String musicGroupId);
 
     /**
-     * 获取零星订单
-     *
-     * @param userId
-     * @param sporadicId
-     * @param groupType
-     * @param status
-     * @return
-     */
-    Integer findOrderByGroupType(@Param("userId") Integer userId, @Param("sporadicId") Integer sporadicId, @Param("groupType") String groupType, @Param("status") DealStatusEnum status);
-
-    /**
      * @param userId:
      * @param sporadicId:
      * @param groupType:

+ 27 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysCouponIssueRecordDao.java

@@ -0,0 +1,27 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ym.mec.biz.dal.entity.SysCouponIssueRecord;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 优惠券发放记录(SysCouponIssueRecord)表数据库访问层
+ *
+ * @author hgw
+ * @since 2021-12-29 20:25:21
+ */
+public interface SysCouponIssueRecordDao extends BaseMapper<SysCouponIssueRecord> {
+
+    int insertBatch(@Param("entities") List<SysCouponIssueRecord> entities);
+
+    <T> IPage<T> queryIssueDetail(Page<T> page, @Param("param") Map<String, Object> param);
+
+    <T> IPage<T> queryIssueRecord(Page<T> page, @Param("param") Map<String, Object> param);
+
+}
+

+ 4 - 6
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TenantAssetsInfoDao.java

@@ -2,7 +2,6 @@ package com.ym.mec.biz.dal.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ym.mec.biz.dal.entity.TenantAssetsInfo;
-import io.swagger.models.auth.In;
 import org.apache.ibatis.annotations.Param;
 
 import java.math.BigDecimal;
@@ -18,10 +17,9 @@ public interface TenantAssetsInfoDao extends BaseMapper<TenantAssetsInfo> {
 
     int insertBatch(@Param("entities") List<TenantAssetsInfo> entities);
 
-    int deductAmount(BigDecimal deductAmount, Integer tenantId);
+    int deductAmount(@Param("deductAmount") BigDecimal deductAmount, @Param("tenantId") Integer tenantId);
 
-    int checkDeductAmount(BigDecimal deductAmount, Integer tenantId);
-
-    Integer queryPeopleNum(Integer courseId);
-}
+    int checkDeductAmount(@Param("deductAmount") BigDecimal deductAmount, @Param("tenantId") Integer tenantId);
 
+    Integer queryPeopleNum(@Param("courseId") Integer courseId);
+}

+ 82 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupApplyGoodsDto.java

@@ -0,0 +1,82 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderCourseSettings;
+import com.ym.mec.biz.dal.entity.MusicGroupSubjectGoodsGroup;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+public class MusicGroupApplyGoodsDto {
+    //订单金额
+    BigDecimal orderAmount = BigDecimal.ZERO;
+
+    BigDecimal remitFee = BigDecimal.ZERO; //乐器减免金额
+
+    BigDecimal courseRemitFee = BigDecimal.ZERO; //课程减免费用
+
+    boolean remitCourseRFeeFlag = false; //减免课程费用标识
+
+    private Integer organId;
+
+    //乐器及打包辅件价格
+    List<MusicGroupSubjectGoodsGroup> goodsGroups;
+
+    //乐团课
+    List<MusicGroupPaymentCalenderCourseSettings> newCourses;
+
+    public List<MusicGroupPaymentCalenderCourseSettings> getNewCourses() {
+        return newCourses;
+    }
+
+    public void setNewCourses(List<MusicGroupPaymentCalenderCourseSettings> newCourses) {
+        this.newCourses = newCourses;
+    }
+
+    public List<MusicGroupSubjectGoodsGroup> getGoodsGroups() {
+        return goodsGroups;
+    }
+
+    public void setGoodsGroups(List<MusicGroupSubjectGoodsGroup> goodsGroups) {
+        this.goodsGroups = goodsGroups;
+    }
+
+    public Integer getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(Integer organId) {
+        this.organId = organId;
+    }
+
+    public BigDecimal getOrderAmount() {
+        return orderAmount;
+    }
+
+    public void setOrderAmount(BigDecimal orderAmount) {
+        this.orderAmount = orderAmount;
+    }
+
+    public BigDecimal getRemitFee() {
+        return remitFee;
+    }
+
+    public void setRemitFee(BigDecimal remitFee) {
+        this.remitFee = remitFee;
+    }
+
+    public BigDecimal getCourseRemitFee() {
+        return courseRemitFee;
+    }
+
+    public void setCourseRemitFee(BigDecimal courseRemitFee) {
+        this.courseRemitFee = courseRemitFee;
+    }
+
+    public boolean isRemitCourseRFeeFlag() {
+        return remitCourseRFeeFlag;
+    }
+
+    public void setRemitCourseRFeeFlag(boolean remitCourseRFeeFlag) {
+        this.remitCourseRFeeFlag = remitCourseRFeeFlag;
+    }
+}

+ 51 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/RegisterPayDto.java

@@ -17,12 +17,23 @@ public class RegisterPayDto extends PayParamBasicDto{
     //乐器id->type
     private Map<Long, String> goodsGroups;
 
+    private String batchNo;
+
+    private Integer userId;
+
+    private String musicGroupId;
+
+    private Long calenderId;
+
     @ApiModelProperty(value = "可选课程的key",required = false)
     private List<String> courseKeys;
 
     @ApiModelProperty(value = "新的乐团课程形态",required = false)
     private List<Integer> newCourse;
 
+    @ApiModelProperty(value = "缴费项目关联活动Id",required = false)
+    private List<Long> buyCalenderActivityId;
+
     @ApiModelProperty(value = "购买乐器保养",required = false)
     private Boolean buyMaintenance = false;
 
@@ -32,6 +43,46 @@ public class RegisterPayDto extends PayParamBasicDto{
     @ApiModelProperty(value = "购买云教练+",required = false)
     private Boolean buyCloudTeacherPlus= false;
 
+    public String getBatchNo() {
+        return batchNo;
+    }
+
+    public void setBatchNo(String batchNo) {
+        this.batchNo = batchNo;
+    }
+
+    public Long getCalenderId() {
+        return calenderId;
+    }
+
+    public void setCalenderId(Long calenderId) {
+        this.calenderId = calenderId;
+    }
+
+    public String getMusicGroupId() {
+        return musicGroupId;
+    }
+
+    public void setMusicGroupId(String musicGroupId) {
+        this.musicGroupId = musicGroupId;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public List<Long> getBuyCalenderActivityId() {
+        return buyCalenderActivityId;
+    }
+
+    public void setBuyCalenderActivityId(List<Long> buyCalenderActivityId) {
+        this.buyCalenderActivityId = buyCalenderActivityId;
+    }
+
     public Integer getRegisterId() {
         return registerId;
     }

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SysCouponCodeDto.java

@@ -69,6 +69,9 @@ public class SysCouponCodeDto {
     @ApiModelProperty("使用截止日期")
     private java.util.Date useDeadlineDate;
 
+    @ApiModelProperty("发放类型 0手动领取 1手动发放 2交易获取")
+    private Integer issueType;
+
     public Integer getCouponCodeId() {
         return couponCodeId;
     }
@@ -220,4 +223,12 @@ public class SysCouponCodeDto {
     public void setUseDeadlineDate(Date useDeadlineDate) {
         this.useDeadlineDate = useDeadlineDate;
     }
+
+    public Integer getIssueType() {
+        return issueType;
+    }
+
+    public void setIssueType(Integer issueType) {
+        this.issueType = issueType;
+    }
 }

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

@@ -133,6 +133,17 @@ public class StudentPaymentOrder extends BaseEntity {
 
 	private Integer activityBuyNum = 0;
 
+	@ApiModelProperty(value = "缴费项目编号",required = true)
+	private Long calenderId;
+
+	public Long getCalenderId() {
+		return calenderId;
+	}
+
+	public void setCalenderId(Long calenderId) {
+		this.calenderId = calenderId;
+	}
+
 	public Integer getActivityBuyNum() {
 		return activityBuyNum;
 	}

+ 33 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysCoupon.java

@@ -8,13 +8,18 @@ import io.swagger.annotations.ApiModelProperty;
 
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
+import javax.validation.constraints.Max;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.PositiveOrZero;
+import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
 
 /**
  * 对应数据库表(sys_coupon):
  */
-public class SysCoupon extends BaseEntity {
+public class SysCoupon extends BaseEntity implements Serializable{
 
 	private Integer id;
 
@@ -27,9 +32,19 @@ public class SysCoupon extends BaseEntity {
 	@ApiModelProperty("状态:0停用,1启用")
 	private Integer status;
 
+    @NotNull(message = "请选择一个优惠券发放的类型!")
+    @PositiveOrZero(message = "优惠券发放类型不正确!")
+    @Max(value = 1,message = "优惠券发放类型不正确!")
+    @ApiModelProperty(value = "0手动领取  1手动发放")
+    private Integer issuanceType;
+
 	@ApiModelProperty("券类型:FULL_REDUCTION(满减券),DISCOUNT(折扣券)")
 	private CouponTypeEnum type;
 
+    @NotBlank(message = "优惠券详细分类不能为空!")
+    @ApiModelProperty(value = "详情CouponDetailTypeEnum枚举类")
+    private String typeDetail;
+
 	@ApiModelProperty("面值")
 	private java.math.BigDecimal faceValue;
 
@@ -232,7 +247,23 @@ public class SysCoupon extends BaseEntity {
 		this.updateTime = updateTime;
 	}
 
-	@Override
+    public Integer getIssuanceType() {
+        return issuanceType;
+    }
+
+    public void setIssuanceType(Integer issuanceType) {
+        this.issuanceType = issuanceType;
+    }
+
+    public String getTypeDetail() {
+        return typeDetail;
+    }
+
+    public void setTypeDetail(String typeDetail) {
+        this.typeDetail = typeDetail;
+    }
+
+    @Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);
 	}

+ 29 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysCouponCode.java

@@ -35,7 +35,17 @@ public class SysCouponCode extends BaseEntity {
 	
 	/** 关联的订单号 */
 	private Long paymentOrderId;
-	
+
+    /**
+     * 发放记录id
+     */
+    private Integer issueId;
+
+    /**
+     *0手动领取  1手动发放 2交易获取
+     */
+    private Integer type;
+
 	/**  */
 	private java.util.Date createTime;
 	
@@ -113,8 +123,24 @@ public class SysCouponCode extends BaseEntity {
 	public Long getPaymentOrderId(){
 		return this.paymentOrderId;
 	}
-			
-	public void setCreateTime(java.util.Date createTime){
+
+    public Integer getIssueId() {
+        return issueId;
+    }
+
+    public void setIssueId(Integer issueId) {
+        this.issueId = issueId;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public void setCreateTime(java.util.Date createTime){
 		this.createTime = createTime;
 	}
 	

+ 144 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysCouponIssueRecord.java

@@ -0,0 +1,144 @@
+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 io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 优惠券发放记录(SysCouponIssueRecord)表实体类
+ *
+ * @author hgw
+ * @since 2021-12-29 20:25:21
+ */
+@ApiModel(value = "sys_coupon_issue_record-优惠券发放记录")
+public class SysCouponIssueRecord implements Serializable {
+    @TableId(value = "id_", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键")
+    private Integer id;
+
+    @TableField("tenant_id_")
+    @ApiModelProperty(value = "机构id")
+    private Integer tenantId;
+
+    @TableField("coupon_id_")
+    @ApiModelProperty(value = "优惠券id")
+    private Integer couponId;
+
+    @TableField("coupon_name_")
+    @ApiModelProperty(value = "优惠券名称")
+    private String couponName;
+
+    @TableField("num_")
+    @ApiModelProperty(value = "数量")
+    private Integer num;
+
+    @TableField("ops_")
+    @ApiModelProperty(value = "操作 0发放 1撤回")
+    private Integer ops;
+
+    @TableField("created_by_")
+    @ApiModelProperty(value = "创建人")
+    private Integer createdBy;
+
+    @TableField("created_time_")
+    @ApiModelProperty(value = "创建时间")
+    private Date createdTime;
+
+    @TableField("updated_by_")
+    @ApiModelProperty(value = "更新人")
+    private Integer updatedBy;
+
+    @TableField("updated_time_")
+    @ApiModelProperty(value = "更新时间")
+    private Date updatedTime;
+
+    private static final long serialVersionUID = 1L;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Integer tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public Integer getCouponId() {
+        return couponId;
+    }
+
+    public void setCouponId(Integer couponId) {
+        this.couponId = couponId;
+    }
+
+    public String getCouponName() {
+        return couponName;
+    }
+
+    public void setCouponName(String couponName) {
+        this.couponName = couponName;
+    }
+
+    public Integer getNum() {
+        return num;
+    }
+
+    public void setNum(Integer num) {
+        this.num = num;
+    }
+
+    public Integer getOps() {
+        return ops;
+    }
+
+    public void setOps(Integer ops) {
+        this.ops = ops;
+    }
+
+    public Integer getCreatedBy() {
+        return createdBy;
+    }
+
+    public void setCreatedBy(Integer createdBy) {
+        this.createdBy = createdBy;
+    }
+
+    public Date getCreatedTime() {
+        return createdTime;
+    }
+
+    public void setCreatedTime(Date createdTime) {
+        this.createdTime = createdTime;
+    }
+
+    public Integer getUpdatedBy() {
+        return updatedBy;
+    }
+
+    public void setUpdatedBy(Integer updatedBy) {
+        this.updatedBy = updatedBy;
+    }
+
+    public Date getUpdatedTime() {
+        return updatedTime;
+    }
+
+    public void setUpdatedTime(Date updatedTime) {
+        this.updatedTime = updatedTime;
+    }
+
+}
+

+ 58 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/CouponDetailTypeEnum.java

@@ -0,0 +1,58 @@
+package com.ym.mec.biz.dal.enums;
+
+/**
+ * 优惠券明细类型
+ *
+ * @author hgw
+ * Created by 2021-12-29
+ */
+public enum CouponDetailTypeEnum {
+
+    //商品-其他类型优惠券
+    OTHER("OTHER", "其他"),
+    //乐器
+    MUSICAL("MUSICAL", "乐器"),
+    //乐保
+    MAINTENANCE("MAINTENANCE", "乐保服务"),
+    //辅件
+    ACCESSORIES("ACCESSORIES", "辅件"),
+    //教材
+    TEACHING("TEACHING", "教谱"),
+    //网管课
+    PRACTICE("PRACTICE", "网管课"),
+    //声部课 = 单技课 SINGLE、集训单技课 TRAINING_SINGLE
+    SINGLE("SINGLE,", "声部课"),
+    //合奏课 = 合奏课 MIX、集训合奏课 TRAINING_MIX ,
+    MIX("MIX", "合奏课"),
+    //VIP = vip课 VIP +乐理课 THEORY_COURSE
+    VIP("VIP", "VIP"),
+    //全类都可以使用
+    FULLCOUPON("FULLCOUPON", "全类券");
+
+    private String code;
+
+    private String msg;
+
+    CouponDetailTypeEnum(String code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    public String getCode() {
+        return this.code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+
+}

+ 13 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/SysCouponCodeQueryInfo.java

@@ -18,6 +18,11 @@ public class SysCouponCodeQueryInfo extends QueryInfo {
 
     private Integer usageStatus;
 
+    /**
+     * 0手动领取 1手动发放 2有paymentOrderId属于订单送券,交易获取
+     */
+    private Integer issueType;
+
     public Integer getOrganId() {
         return organId;
     }
@@ -57,4 +62,12 @@ public class SysCouponCodeQueryInfo extends QueryInfo {
     public void setUsageStatus(Integer usageStatus) {
         this.usageStatus = usageStatus;
     }
+
+    public Integer getIssueType() {
+        return issueType;
+    }
+
+    public void setIssueType(Integer issueType) {
+        this.issueType = issueType;
+    }
 }

+ 64 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/vo/CouponIssueRecordVo.java

@@ -0,0 +1,64 @@
+package com.ym.mec.biz.dal.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author hgw
+ * Created by 2021-12-30
+ */
+public class CouponIssueRecordVo implements Serializable {
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createdTime;
+
+    private String couponName;
+
+    private Integer num;
+
+    private String name;
+
+    private Integer ops;
+
+    public Date getCreatedTime() {
+        return createdTime;
+    }
+
+    public void setCreatedTime(Date createdTime) {
+        this.createdTime = createdTime;
+    }
+
+    public String getCouponName() {
+        return couponName;
+    }
+
+    public void setCouponName(String couponName) {
+        this.couponName = couponName;
+    }
+
+    public Integer getNum() {
+        return num;
+    }
+
+    public void setNum(Integer num) {
+        this.num = num;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getOps() {
+        return ops;
+    }
+
+    public void setOps(Integer ops) {
+        this.ops = ops;
+    }
+}

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ActivityUserMapperService.java

@@ -5,6 +5,8 @@ import com.ym.mec.biz.dal.dto.ActivityStudentAdjustDto;
 import com.ym.mec.biz.dal.dto.ActivityStudentDto;
 import com.ym.mec.biz.dal.dto.ActivityUserMapperAddDto;
 import com.ym.mec.biz.dal.entity.ActivityUserMapper;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail;
 import com.ym.mec.biz.dal.page.ActivityStudentQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
@@ -104,4 +106,13 @@ public interface ActivityUserMapperService extends BaseService<Integer, Activity
     */
     void cut(Integer activityUserMapperId, String memo, BigDecimal amount);
 
+    /**
+    * @description: 生成排课资格
+     * @param studentPaymentOrder
+ * @param activity
+    * @return void
+    * @author zx
+    * @date 2021/12/29 17:28
+    */
+    void addOrderDetail2Activity(StudentPaymentOrder studentPaymentOrder, List<StudentPaymentOrderDetail> activity);
 }

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

@@ -24,9 +24,6 @@ public interface CloudTeacherOrderService extends BaseService<Long, CloudTeacher
      */
     PageInfo<CloudTeacherStudent> queryInactive(CloudTeacherOrderQueryInfo cloudTeacherOrderQueryInfo) throws Exception;
 
-    /**
-     * 机构付款指定学生并激活
-     */
 
     /**
      * 将订单详情云教练加入云教练购买列表
@@ -34,7 +31,7 @@ public interface CloudTeacherOrderService extends BaseService<Long, CloudTeacher
      * @param order
      * @return
      */
-    Boolean addOrderDetail2CloudTeacher(StudentPaymentOrder order, BigDecimal cloudTeacherFee);
+    void addOrderDetail2CloudTeacher(StudentPaymentOrder order, BigDecimal cloudTeacherFee);
 
 
     /**

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

@@ -19,4 +19,6 @@ public interface MusicGroupPaymentCalenderActivityService {
     void delByCalenderId(Long calenderId);
 
     List<MusicGroupPaymentCalenderActivity> findByCalenderId(Long calenderId);
+
+    List<MusicGroupPaymentCalenderActivity> findByIds(List<Long> buyCalenderActivityIdList);
 }

+ 12 - 11
mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentCalenderBaseService.java

@@ -4,25 +4,17 @@ import com.ym.mec.biz.dal.dto.MusicGroupPaymentBaseCalender;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderBase;
 import com.ym.mec.biz.dal.enums.CalenderBaseServiceEnum;
+import org.apache.poi.ss.formula.functions.T;
 
 import java.math.BigDecimal;
 import java.util.HashMap;
 import java.util.Map;
 
-public interface MusicGroupPaymentCalenderBaseService {
+public interface MusicGroupPaymentCalenderBaseService<T> {
 
     Map<CalenderBaseServiceEnum,MusicGroupPaymentCalenderBaseService> calenderBaseServiceMap = new HashMap<>();
 
     /**
-    * @description: 缴费项目组件
-     * @param baseCalender
-    * @return void
-    * @author zx
-    * @date 2021/12/21 11:37
-    */
-    void createComponent(MusicGroupPaymentBaseCalender baseCalender);
-
-    /**
     * @description: 校验缴费项目金额,是否需要审核
      * @param baseCalender
     * @return void
@@ -50,11 +42,20 @@ public interface MusicGroupPaymentCalenderBaseService {
     BigDecimal getOriginalAmount(MusicGroupPaymentBaseCalender baseCalender);
 
     /**
+    * @description: 获取缴费项目价格
+     * @param baseCalender
+    * @return java.math.BigDecimal
+    * @author zx
+    * @date 2021/12/29 15:32
+    */
+    BigDecimal getCurrentAmount(T baseCalender);
+
+    /**
     * @description: 缴费项目关联初始化
      * @param bean
     * @return T
     * @author zx
     * @date 2021/12/24 14:31
     */
-    <T> T initBean(T bean);
+    <E> E initBean(E bean);
 }

+ 11 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentCalenderDetailService.java

@@ -9,10 +9,7 @@ import com.ym.mec.biz.dal.dto.FeeStudentDto;
 import com.ym.mec.biz.dal.dto.MusicArrearageStudentDto;
 import com.ym.mec.biz.dal.dto.MusicGroupPaymentCalenderDetailDto;
 import com.ym.mec.biz.dal.dto.SimpleUserDto;
-import com.ym.mec.biz.dal.entity.MusicGroup;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderStudentDetail;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.page.ArrearageStudentsQueryInfo;
 import com.ym.mec.biz.dal.page.MusicCalenderDetailQueryInfo;
 import com.ym.mec.common.page.PageInfo;
@@ -113,4 +110,14 @@ public interface MusicGroupPaymentCalenderDetailService extends BaseService<Long
     void pushWaitRenewMessage(Long calenderId, String studentIds);
 
     PageInfo<MusicGroupPaymentCalenderDetailDto> queryDetailPage(MusicCalenderDetailQueryInfo queryInfo);
+
+    /**
+    * @description: 生成缴费项目学员详情
+     * @param studentPaymentOrder
+ * @param studentRegistration
+    * @return void
+    * @author zx
+    * @date 2021/12/30 15:16
+    */
+    void addCalenderDetail(StudentPaymentOrder studentPaymentOrder, StudentRegistration studentRegistration);
 }

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

@@ -3,8 +3,6 @@ package com.ym.mec.biz.service;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderMember;
 import com.ym.mec.common.service.BaseService;
 
-import java.util.List;
-
 public interface MusicGroupPaymentCalenderMemberService extends BaseService<Long, MusicGroupPaymentCalenderMember> {
 
     void deleteByCalenderId(Long calenderId);

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentCalenderService.java

@@ -33,6 +33,8 @@ public interface MusicGroupPaymentCalenderService extends BaseService<Long, Musi
 	 * @return
 	 */
 	Map<String, Object> getDetail(Long id);
+
+	Map<String, Object> getCalenderDetail(Map<String, Object> result,Long calenderId);
 	
 	/**
 	 * 更新缴费信息
@@ -196,4 +198,22 @@ public interface MusicGroupPaymentCalenderService extends BaseService<Long, Musi
     String merge1(MusicGroupPaymentBaseCalender musicGroupPaymentBaseCalender);
 
     MusicGroupPaymentCalender getMusicGroupRegCalender(String musicGroupId);
+
+    //获取乐保金额
+    BigDecimal getRepairAmount(Long calenderId);
+
+    //获取会员金额
+    BigDecimal getMemberAmount(Long calenderId);
+
+    //获取活动总金额
+	BigDecimal getActivityAmount(List<Long> buyCalenderActivityIdList);
+
+	/**
+	* @description: 获取报名缴费订单
+	 * @param musicGroupId
+	* @return com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender
+	* @author zx
+	* @date 2021/12/30 10:41
+	*/
+	MusicGroupPaymentCalender getApplyCalenderByMusicId(String musicGroupId);
 }

+ 5 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupService.java

@@ -11,6 +11,7 @@ import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.page.MusicGroupQueryInfo;
 import com.ym.mec.biz.dal.page.MusicMemberQueryInfo;
+import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.ImGroupMember;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
@@ -60,14 +61,14 @@ public interface MusicGroupService extends BaseService<String, MusicGroup> {
 	 * @param registerPayDto
 	 * @return
 	 */
-	Map pay(RegisterPayDto registerPayDto) throws Exception;
+	HttpResponseResult pay(RegisterPayDto registerPayDto) throws Exception;
 
 	/**
 	 * 继续缴费
 	 * @param registerPayDto
 	 * @return
 	 */
-	Map rePay(RegisterPayDto registerPayDto) throws Exception;
+//	Map rePay(RegisterPayDto registerPayDto) throws Exception;
 
 	/**
 	 * 获取学生所在乐团详情
@@ -203,7 +204,7 @@ public interface MusicGroupService extends BaseService<String, MusicGroup> {
 	 *  续费
 	 * @return
 	 */
-	Map renew(RenewParamDto renewParamDto) throws Exception;
+	HttpResponseResult renew(RegisterPayDto renewParamDto) throws Exception;
 
 	/**
 	 * 学生支付订单
@@ -364,7 +365,7 @@ public interface MusicGroupService extends BaseService<String, MusicGroup> {
 	 * @param registerIds 学员注册id
 	 * @return 添加学员记录
 	 */
-	List<StudentRegistration> addMusicGroupRegs(String musicGroupId,List<Long> registerIds) throws Exception;
+	HttpResponseResult addMusicGroupRegs(String musicGroupId,List<Long> registerIds) throws Exception;
 
 
 	/**

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

@@ -38,7 +38,7 @@ public interface StudentInstrumentService extends BaseService<Long, StudentInstr
      * @param order
      * @return
      */
-    Boolean addOrderDetail2Instrument(StudentPaymentOrder order);
+    Long addOrderDetail2Instrument(StudentPaymentOrder order, BigDecimal cloudTeacherFee,Integer goodsId);
 
 
     /**

+ 7 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentOrderDetailService.java

@@ -2,8 +2,6 @@ package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.dto.MusicalListDetailDto;
 import com.ym.mec.biz.dal.entity.Goods;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail;
-import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
 import com.ym.mec.common.exception.BizException;
@@ -105,5 +103,12 @@ public interface StudentPaymentOrderDetailService extends BaseService<Long, Stud
      */
     List<StudentPaymentOrderDetail> getOrderGoodsDetail(Long orderId);
 
+    /**
+    * @description: 获取订单详情列表
+     * @param orderId
+    * @return java.util.List<com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail>
+    * @author zx
+    * @date 2021/12/30 15:13
+    */
     List<StudentPaymentOrderDetail> queryOrderDetail(Long orderId);
 }

+ 11 - 23
mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentOrderService.java

@@ -18,6 +18,7 @@ import com.ym.mec.biz.dal.enums.OrderTypeEnum;
 import com.ym.mec.biz.dal.enums.PayStatus;
 import com.ym.mec.biz.dal.page.SporadicOrderQueryInfo;
 import com.ym.mec.biz.dal.page.StudentPaymentOrderQueryInfo;
+import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
 import org.apache.ibatis.annotations.Param;
@@ -29,15 +30,6 @@ public interface StudentPaymentOrderService extends BaseService<Long, StudentPay
     Map createOrder(StudentPaymentOrder studentPaymentOrder, List<StudentPaymentOrderDetail> details, String payReceiver) throws Exception;
 
     /**
-     * 查询商品列表
-     *
-     * @param musicGroupId
-     * @param type
-     * @return
-     */
-    List<Goods> queryApplyGoodsList(String musicGroupId, OrderDetailTypeEnum type);
-
-    /**
      * 查询订单列表
      *
      * @param groupType
@@ -97,17 +89,6 @@ public interface StudentPaymentOrderService extends BaseService<Long, StudentPay
 
     void updateOrder(Map<String, String> rpMap) throws Exception;
 
-    /**
-     * 获取零星订单
-     *
-     * @param userId
-     * @param sporadicId
-     * @param sporadic
-     * @param status
-     * @return
-     */
-    Integer findOrderByGroupType(Integer userId, Integer sporadicId, String sporadic, DealStatusEnum status);
-
     List<StudentPaymentOrderExportDto> ExportQueryPage(Map<String, Object> params);
 
     /**
@@ -119,9 +100,6 @@ public interface StudentPaymentOrderService extends BaseService<Long, StudentPay
     PageInfo<SporadicChargeInfoDto> sporadicQueryPage(SporadicOrderQueryInfo queryInfo);
 
 
-    StudentPaymentOrder getOrderMoneyAmount(StudentPaymentOrderQueryInfo queryInfo);
-
-
     PageInfoOrder<StudentPaymentOrderDto> OrderQueryPage(StudentPaymentOrderQueryInfo queryInfo);
 
 
@@ -205,4 +183,14 @@ public interface StudentPaymentOrderService extends BaseService<Long, StudentPay
                          Long vipGroupId,
                          Long practiceGroupId,
                          Integer teacherId);
+
+    /**
+    * @description: 校验重复支付
+     * @param order
+ * @param repeatPay
+    * @return com.ym.mec.common.entity.HttpResponseResult
+    * @author zx
+    * @date 2021/12/29 14:50
+    */
+    HttpResponseResult checkRepeatPay(StudentPaymentOrder order, Boolean repeatPay) throws Exception;
 }

+ 2 - 20
mec-biz/src/main/java/com/ym/mec/biz/service/StudentRegistrationService.java

@@ -5,15 +5,7 @@ import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 
-import com.ym.mec.biz.dal.dto.NoClassMusicStudentDto;
-import com.ym.mec.biz.dal.dto.PageInfoReg;
-import com.ym.mec.biz.dal.dto.RegisterDto;
-import com.ym.mec.biz.dal.dto.StudentAddDto;
-import com.ym.mec.biz.dal.dto.StudentApplyDetailDto;
-import com.ym.mec.biz.dal.dto.StudentInfo;
-import com.ym.mec.biz.dal.dto.StudentMusicDetailDto;
-import com.ym.mec.biz.dal.dto.StudentMusicGroupDto;
-import com.ym.mec.biz.dal.dto.StudentRegisterInstrumentsDetailDto;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
 import com.ym.mec.biz.dal.page.*;
@@ -105,7 +97,6 @@ public interface StudentRegistrationService extends BaseService<Long, StudentReg
      * @param amount
      * @param orderNo
      * @param paymentChannel
-     * @param courseFee
      * @param goodsGroups
      * @param remitFee
      * @param courseRemitFee
@@ -118,16 +109,7 @@ public interface StudentRegistrationService extends BaseService<Long, StudentReg
      * @throws Exception
      */
     StudentPaymentOrder addOrder(StudentRegistration studentRegistration,
-                                 BigDecimal amount,
-                                 String orderNo,
-                                 String paymentChannel,
-                                 List<MusicGroupSubjectGoodsGroup> goodsGroups,
-                                 BigDecimal remitFee,
-                                 BigDecimal courseRemitFee,
-                                 List<MusicGroupPaymentCalenderCourseSettings> newCourses,
-                                 Boolean buyMaintenance,
-                                 Boolean buyCloudTeacher,
-                                 Boolean buyCloudTeacherPlus,List<Integer> couponIdList) throws Exception;
+                                 StudentPaymentOrder studentPaymentOrder,MusicGroupApplyGoodsDto goodsDto,RegisterPayDto registerPayDto) throws Exception;
 
     /**
      * 查询用户指定乐团的报名信息

+ 15 - 10
mec-biz/src/main/java/com/ym/mec/biz/service/SysCouponCodeService.java

@@ -15,29 +15,31 @@ import java.util.List;
 public interface SysCouponCodeService extends BaseService<Long, SysCouponCode> {
 
     /**
+     * @param userId:         用户编号
+     * @param couponId:       优惠券编号
+     * @param paymentOrderId: 订单编号
+     * @param exchangeNum:    兑换数量
+     * @return boolean
      * @describe 兑换优惠券
      * @author Joburgess
      * @date 2021/9/8 0008
-     * @param userId: 用户编号
-     * @param couponId: 优惠券编号
-     * @param paymentOrderId: 订单编号
-     * @param exchangeNum: 兑换数量
-     * @return boolean
      */
-    boolean exchangeCoupon(Integer userId, Integer couponId, Long paymentOrderId, Integer exchangeNum);
+    boolean exchangeCoupon(Integer userId, Integer couponId, Long paymentOrderId, Integer exchangeNum, int type,Integer issueId);
+
     boolean exchangeCouponTest(Integer userId, Integer couponId, Long paymentOrderId, Integer exchangeNum);
 
     /**
+     * @param queryInfo:
+     * @return com.ym.mec.common.page.PageInfo<com.ym.mec.biz.dal.dto.SysCouponCodeDto>
      * @describe 优惠券领取列表
      * @author Joburgess
      * @date 2021/9/8 0008
-     * @param queryInfo:
-     * @return com.ym.mec.common.page.PageInfo<com.ym.mec.biz.dal.dto.SysCouponCodeDto>
      */
     PageInfo<SysCouponCodeDto> querySysCouponUseList(SysCouponCodeQueryInfo queryInfo);
 
     /**
      * 获取优惠券跑马灯
+     *
      * @param queryInfo
      * @return
      */
@@ -45,6 +47,7 @@ public interface SysCouponCodeService extends BaseService<Long, SysCouponCode> {
 
     /**
      * 获取用户优惠券列表
+     *
      * @param amount
      * @param userId
      * @return
@@ -53,17 +56,19 @@ public interface SysCouponCodeService extends BaseService<Long, SysCouponCode> {
 
     /**
      * 使用优惠券
+     *
      * @param couponIdList
      * @param amount
-     * @param useFlag 是否消耗优惠券
+     * @param useFlag      是否消耗优惠券
      * @return
      */
-    StudentPaymentOrder use(List<Integer> couponIdList, BigDecimal amount,Boolean useFlag);
+    StudentPaymentOrder use(List<Integer> couponIdList, BigDecimal amount, Boolean useFlag);
 
     List<SysCouponCodeDto> findByIdList(List<Integer> couponIdList);
 
     /**
      * 退优惠券
+     *
      * @param couponCodeId
      */
     void quit(String couponCodeId);

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

@@ -0,0 +1,27 @@
+package com.ym.mec.biz.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ym.mec.biz.dal.entity.SysCouponIssueRecord;
+import com.ym.mec.biz.dal.vo.CouponIssueRecordVo;
+import com.ym.mec.common.page.PageInfo;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 优惠券发放记录(SysCouponIssueRecord)表服务接口
+ *
+ * @author hgw
+ * @since 2021-12-29 20:26:11
+ */
+public interface SysCouponIssueRecordService extends IService<SysCouponIssueRecord> {
+
+    void issueCoupon(Map<String, Object> param);
+
+    int revokeCoupon(Integer couponId);
+
+    PageInfo<?> queryIssueDetail(Map<String, Object> param);
+
+    PageInfo<CouponIssueRecordVo> queryIssueRecord(Map<String, Object> param);
+}
+

+ 8 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/SysCouponService.java

@@ -12,12 +12,18 @@ public interface SysCouponService extends BaseService<Integer, SysCoupon> {
     void updateCoupon(SysCoupon sysCoupon);
 
     /**
+     * @param couponId: 优惠券编号
+     * @return void
      * @describe 优惠券低库存警告
      * @author Joburgess
      * @date 2021/9/8 0008
-     * @param couponId: 优惠券编号
-     * @return void
      */
     void stockWarning(Integer couponId, String couponName);
 
+    /**
+     * 新增优惠券
+     *
+     * @param sysCoupon
+     */
+    long add(SysCoupon sysCoupon);
 }

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

@@ -8,6 +8,7 @@ import com.ym.mec.biz.dal.dto.ActivityStudentAdjustDto;
 import com.ym.mec.biz.dal.dto.ActivityStudentDto;
 import com.ym.mec.biz.dal.dto.ActivityUserMapperAddDto;
 import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.enums.OrderDetailTypeEnum;
 import com.ym.mec.biz.dal.enums.ReturnFeeEnum;
 import com.ym.mec.biz.dal.page.ActivityStudentQueryInfo;
 import com.ym.mec.biz.service.ActivityUserMapperService;
@@ -29,8 +30,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
-import static com.ym.mec.biz.dal.enums.GroupType.ACTIVITY;
-import static com.ym.mec.biz.dal.enums.GroupType.SUBJECT_CHANGE;
+import static com.ym.mec.biz.dal.enums.GroupType.*;
 
 @Service
 public class ActivityUserMapperServiceImpl extends BaseServiceImpl<Integer, ActivityUserMapper>  implements ActivityUserMapperService {
@@ -242,4 +242,26 @@ public class ActivityUserMapperServiceImpl extends BaseServiceImpl<Integer, Acti
 		sysUserCashAccountLog.setComment("取消活动排课");
 		sysUserCashAccountLogService.insert(sysUserCashAccountLog);
 	}
+
+    @Override
+    public void addOrderDetail2Activity(StudentPaymentOrder studentPaymentOrder, List<StudentPaymentOrderDetail> activity) {
+		List<ActivityUserMapper> activityUserMapperList = new ArrayList<>();
+		for (StudentPaymentOrderDetail orderDetail : activity) {
+			ActivityUserMapper activityUserMapper = new ActivityUserMapper();
+			activityUserMapper.setTenantId(studentPaymentOrder.getTenantId());
+			activityUserMapper.setActualPrice(orderDetail.getPrice());
+			//这里的studentInstrumentId存的是活动编号
+			activityUserMapper.setActivityId(orderDetail.getStudentInstrumentId().intValue());
+			Student student = studentDao.get(studentPaymentOrder.getUserId());
+			activityUserMapper.setUserId(studentPaymentOrder.getUserId());
+			activityUserMapper.setTeacherId(student.getTeacherId());
+			if(orderDetail.getType() == OrderDetailTypeEnum.VIP){
+				activityUserMapper.setVipFlag(1);
+			}else {
+				activityUserMapper.setPracticeFlag(1);
+			}
+			activityUserMapperList.add(activityUserMapper);
+		}
+		activityUserMapperDao.batchInsert(activityUserMapperList);
+    }
 }

+ 14 - 16
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CloudTeacherOrderServiceImpl.java

@@ -47,7 +47,7 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
     @Autowired
     private StudentService studentService;
     @Autowired
-    private SysConfigDao sysConfigDao;
+    private MusicGroupPaymentCalenderMemberService musicGroupPaymentCalenderMemberService;
     @Autowired
     private TenantConfigService tenantConfigService;
     @Autowired
@@ -298,21 +298,19 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-	public Boolean addOrderDetail2CloudTeacher(StudentPaymentOrder order,BigDecimal cloudTeacherFee) {
-		CloudTeacherOrder cloudTeacherOrder = cloudTeacherOrderDao.queryByOrderId(order.getId());
-
-		if (cloudTeacherOrder == null) {
-			return true;
-		}
-		Date date = new Date();
-
-		cloudTeacherOrder.setAmount(cloudTeacherFee);
-		cloudTeacherOrder.setStatus(1);
-		cloudTeacherOrder.setUpdateTime(date);
-
-		cloudTeacherOrderDao.update(cloudTeacherOrder);
-
-		return true;
+	public void addOrderDetail2CloudTeacher(StudentPaymentOrder order,BigDecimal cloudTeacherFee) {
+        CloudTeacherOrder cloudTeacherOrder = new CloudTeacherOrder();
+        cloudTeacherOrder.setTenantId(order.getTenantId());
+        cloudTeacherOrder.setOrganId(order.getOrganId());
+        cloudTeacherOrder.setOrderId(order.getId());
+        MusicGroupPaymentCalenderMember calenderMember = musicGroupPaymentCalenderMemberService.findByCalenderId(order.getCalenderId());
+        cloudTeacherOrder.setLevel(calenderMember.getMemberRankSettingId());
+        cloudTeacherOrder.setTime(calenderMember.getNum().intValue());
+        cloudTeacherOrder.setType(calenderMember.getPeriod());
+        cloudTeacherOrder.setAmount(cloudTeacherFee);
+        cloudTeacherOrder.setStudentId(order.getUserId());
+        cloudTeacherOrder.setStatus(1);
+		cloudTeacherOrderDao.insert(cloudTeacherOrder);
 	}
 
     @Override

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

@@ -4082,38 +4082,6 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
     public boolean updateCourseScheduleToOverStatus() {
 
         Date date = new Date();
-        //课程已结束,更新“未签到”学生的状态未“旷课”
-		/*List<StudentAttendance> studentAttendanceList = courseScheduleDao.queryUnsignedStudentList();
-		if (studentAttendanceList != null && studentAttendanceList.size() > 0) {
-			// 获取老师的考勤记录
-			Map<Long, TeacherAttendance> teacherAttendanceMap = teacherAttendanceDao
-					.findTeacherIdByCourseSchedule(studentAttendanceList.stream().map(sa -> sa.getCourseScheduleId()).collect(Collectors.toList())).stream()
-					.collect(Collectors.toMap(TeacherAttendance::getCourseScheduleId, ta -> ta));
-			
-			Date updateTime = DateUtil.stringToDate("19700101 000000", DateUtil.DATE_TIME_FORMAT);
-			for (Iterator<StudentAttendance> list = studentAttendanceList.iterator(); list.hasNext();) {
-				StudentAttendance studentAttendance = list.next();
-				TeacherAttendance teacherAttendance = teacherAttendanceMap.get(studentAttendance.getCourseScheduleId());
-				if (teacherAttendance != null && teacherAttendance.getSignOutTime() == null) {
-					list.remove();
-				} else {
-					studentAttendance.setStatus(StudentAttendanceStatusEnum.TRUANT);
-					studentAttendance.setRemark("课程已结束,自动补旷课");
-					if (Objects.isNull(studentAttendance.getCurrentClassTimes())) {
-						studentAttendance.setCurrentClassTimes(1);
-					} else {
-						studentAttendance.setCurrentClassTimes(studentAttendance.getCurrentClassTimes() + 1);
-					}
-					studentAttendance.setCreateTime(date);
-					studentAttendance.setUpdateTime(updateTime);
-				}
-			}
-
-			if (studentAttendanceList != null && studentAttendanceList.size() > 0) {
-				studentAttendanceDao.addStudentAttendances(studentAttendanceList);
-			}
-		}*/
-
         //自动更新课程状态至“已结束”
         List<CourseSchedule> list = courseScheduleDao.queryFinishedWithNoUpdateStatus();
 
@@ -4140,7 +4108,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			try {
 				tenantAssetsInfoService.deductAmount(updateList);
 			}catch (Exception e){
-				LOGGER.error("deductAmount  >>>>>>>>>",e);
+				LOGGER.error("deductAmount  >>>>>>>>>",e.getCause());
 			}
 			List<Long> courseIds = updateList.stream().map(CourseSchedule::getId).collect(Collectors.toList());
 			List<CourseSchedule> beMergeCourses = courseScheduleDao.getBeMergeCourseWithMainCourseIds(courseIds);
@@ -4149,46 +4117,15 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 				courseScheduleDao.batchUpdate(beMergeCourses);
 			}
 		}
-
         // 更新班级已上课次
         if (classGroupIds.size() > 0) {
             classGroupService.batchIncreaseClassTimes(classGroupIds);
-
-            //查询班级信息
-//            List<ClassGroup> classGroupList = classGroupService.findClassGroupByIds(classGroupIds.stream().map(e -> e.toString()).collect(Collectors.joining(",")));
-//
-//            List<String> vipGroupIdList = new ArrayList<String>();
-//            for (ClassGroup classGroup : classGroupList) {
-//                if (classGroup.getGroupType() == GroupType.VIP && classGroup.getCurrentClassTimes() == classGroup.getTotalClassTimes().intValue()) {
-//                    if (!vipGroupIdList.contains(classGroup.getMusicGroupId())) {
-//                        vipGroupIdList.add(classGroup.getMusicGroupId());
-//                    }
-//                }
-//            }
-//            if (vipGroupIdList.size() > 0) {
-//                List<VipGroup> vipGroupList = vipGroupDao.queryByIds(vipGroupIdList.stream().collect(Collectors.joining(",")));
-//                for (VipGroup vipGroup : vipGroupList) {
-//                    if (!vipGroup.getStatus().equals(VipGroupStatusEnum.PAUSE)
-//                            && !vipGroup.getStatus().equals(VipGroupStatusEnum.CANCEL)) {
-//                        vipGroup.setStatus(VipGroupStatusEnum.FINISHED);
-//                    }
-//                    vipGroup.setUpdateTime(date);
-//                }
-//                vipGroupDao.batchUpdate(vipGroupList);
-//            }
         }
-
-        /*if (courseScheduleIdList.size() > 0) {
-            // vip课自动签退
-            teacherAttendanceDao.updateViPSignOutStatus(courseScheduleIdList.stream().map(a -> a.toString()).collect(Collectors.joining(",")));
-        }*/
-
 		try {
 			practiceGroupService.practiceGroupRenewRemind();
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
-
 		return true;
     }
 

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

@@ -439,10 +439,10 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
 		if(activeRemark.equals(202109)){
 			switch (remark){
 				case "2赠1":
-					sysCouponCodeService.exchangeCoupon(cloudTeacherOrder.getStudentId(),couponId,cloudTeacherOrder.getOrderId(),3);
+					sysCouponCodeService.exchangeCoupon(cloudTeacherOrder.getStudentId(),couponId,cloudTeacherOrder.getOrderId(),3,2,null);
 					break;
 				case "3赠2":
-					sysCouponCodeService.exchangeCoupon(cloudTeacherOrder.getStudentId(),couponId,cloudTeacherOrder.getOrderId(),6);
+					sysCouponCodeService.exchangeCoupon(cloudTeacherOrder.getStudentId(),couponId,cloudTeacherOrder.getOrderId(),6,2,null);
 					break;
 			}
 		}

+ 14 - 8
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderActivityServiceImpl.java

@@ -15,6 +15,7 @@ import com.ym.mec.biz.service.MusicGroupPaymentCalenderBaseService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -27,7 +28,7 @@ import java.util.stream.Collectors;
 
 @Service
 public class MusicGroupPaymentCalenderActivityServiceImpl extends BaseServiceImpl<Long, MusicGroupPaymentCalenderActivity>
-        implements MusicGroupPaymentCalenderActivityService, MusicGroupPaymentCalenderBaseService {
+        implements MusicGroupPaymentCalenderActivityService, MusicGroupPaymentCalenderBaseService<MusicGroupPaymentCalenderActivity> {
 
     @Autowired
     private MusicGroupPaymentCalenderActivityDao musicGroupPaymentCalenderActivityDao;
@@ -47,11 +48,6 @@ public class MusicGroupPaymentCalenderActivityServiceImpl extends BaseServiceImp
     }
 
     @Override
-    public void createComponent(MusicGroupPaymentBaseCalender baseCalender) {
-
-    }
-
-    @Override
     public MusicGroupPaymentCalender.PaymentCalenderStatusEnum checkComponentAmount(MusicGroupPaymentBaseCalender baseCalender) {
         return null;
     }
@@ -71,12 +67,17 @@ public class MusicGroupPaymentCalenderActivityServiceImpl extends BaseServiceImp
         if(calenderActivityList != null && calenderActivityList.size() > 0){
             List<Integer> collect = calenderActivityList.stream().map(e -> e.getActivityId()).collect(Collectors.toList());
             List<VipGroupActivity> vipGroupActivities = vipGroupActivityDao.queryByIds(StringUtils.join(collect, ","));
-            return vipGroupActivities.stream().map(e->e.getMarketPrice()).reduce(BigDecimal.ZERO,BigDecimal::add);
+            return vipGroupActivities.stream().map(e->e.getOriginalPrice()).reduce(BigDecimal.ZERO,BigDecimal::add);
         }
         return BigDecimal.ZERO;
     }
 
     @Override
+    public BigDecimal getCurrentAmount(MusicGroupPaymentCalenderActivity baseCalender) {
+        return baseCalender.getActualAmount();
+    }
+
+    @Override
     public <T> T initBean(T bean) {
         if(bean != null){
             List<MusicGroupPaymentCalenderActivity> calenderActivities = (List<MusicGroupPaymentCalenderActivity>) bean;
@@ -88,7 +89,7 @@ public class MusicGroupPaymentCalenderActivityServiceImpl extends BaseServiceImp
             calenderActivities.forEach(e -> {
                 VipGroupActivity activity1 = vipGroupActivityMap.get(e.getActivityId());
                 if(activity1 != null){
-                    e.setOriginalAmount(activity1.getMarketPrice());
+                    e.setOriginalAmount(activity1.getOriginalPrice());
                     e.setActivityName(activity1.getName());
                     e.setNum(new BigDecimal(activity1.getMaxCourseNum()));
                     if(StringUtils.isNotEmpty(activity1.getVipGroupCategoryIdList())){
@@ -120,4 +121,9 @@ public class MusicGroupPaymentCalenderActivityServiceImpl extends BaseServiceImp
     public List<MusicGroupPaymentCalenderActivity> findByCalenderId(Long calenderId) {
         return musicGroupPaymentCalenderActivityDao.findByCalenderId(calenderId);
     }
+
+    @Override
+    public List<MusicGroupPaymentCalenderActivity> findByIds(List<Long> buyCalenderActivityIdList) {
+        return musicGroupPaymentCalenderActivityDao.findByIds(buyCalenderActivityIdList);
+    }
 }

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

@@ -27,7 +27,8 @@ import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentType.MU
 import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentType.MUSIC_RENEW;
 
 @Service
-public class MusicGroupPaymentCalenderCourseSettingsServiceImpl extends BaseServiceImpl<Integer, MusicGroupPaymentCalenderCourseSettings>  implements MusicGroupPaymentCalenderCourseSettingsService, MusicGroupPaymentCalenderBaseService {
+public class MusicGroupPaymentCalenderCourseSettingsServiceImpl extends BaseServiceImpl<Integer, MusicGroupPaymentCalenderCourseSettings>
+		implements MusicGroupPaymentCalenderCourseSettingsService, MusicGroupPaymentCalenderBaseService<MusicGroupPaymentCalenderCourseSettings> {
 	
 	@Autowired
 	private MusicGroupPaymentCalenderCourseSettingsDao musicGroupPaymentCalenderCourseSettingsDao;
@@ -102,11 +103,6 @@ public class MusicGroupPaymentCalenderCourseSettingsServiceImpl extends BaseServ
 		return musicGroupPaymentCalenderCourseSettingsDao.queryCalenderCourseSettingsByBatchNo(batchNo);
 	}
 
-    @Override
-	public void createComponent(MusicGroupPaymentBaseCalender baseCalender) {
-
-	}
-
 	@Override
 	public MusicGroupPaymentCalender.PaymentCalenderStatusEnum checkComponentAmount(MusicGroupPaymentBaseCalender baseCalender) {
 		List<MusicGroupPaymentCalenderCourseSettings> musicGroupPaymentCalenderCourseSettingsList = baseCalender.getMusicGroupPaymentCalenderCourseSettingsList();
@@ -195,6 +191,11 @@ public class MusicGroupPaymentCalenderCourseSettingsServiceImpl extends BaseServ
     }
 
 	@Override
+	public BigDecimal getCurrentAmount(MusicGroupPaymentCalenderCourseSettings baseCalender) {
+		return null;
+	}
+
+	@Override
 	public <T> T initBean(T bean) {
 		return null;
 	}

+ 114 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderDetailServiceImpl.java

@@ -716,4 +716,118 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
 		pageInfo.setRows(dataList);
 		return pageInfo;
     }
+
+    @Override
+	@Transactional(rollbackFor = Exception.class)
+    public void addCalenderDetail(StudentPaymentOrder studentPaymentOrder, StudentRegistration studentRegistration) {
+		Date nowDate = new Date();
+
+		String currentMusicGroupId = studentRegistration.getMusicGroupId();
+
+		//缴费详情 calender detail
+		MusicGroupPaymentCalender musicGroupRegCalender = musicGroupPaymentCalenderService.findByMusicGroupRegCalender(currentMusicGroupId);
+		if (musicGroupRegCalender == null) {
+			throw new BizException("报名缴费信息查询失败");
+		}
+		Integer tenantId = studentPaymentOrder.getTenantId();
+
+		String batchNo = musicGroupRegCalender.getBatchNo();
+		Long currentPaymentCalenderId = musicGroupRegCalender.getId();
+
+		List<MusicGroupPaymentCalender> musicGroupPaymentCalenderList = musicGroupPaymentCalenderDao.findByBatchNo(batchNo);
+
+		for (MusicGroupPaymentCalender musicGroupPaymentCalender : musicGroupPaymentCalenderList) {
+			if (currentPaymentCalenderId.longValue() == musicGroupPaymentCalender.getId()) {
+				// 更新实际缴费人数
+				if (musicGroupPaymentCalender.getActualNum() == null) {
+					musicGroupPaymentCalender.setActualNum(1);
+				} else {
+					musicGroupPaymentCalender.setActualNum(musicGroupPaymentCalender.getActualNum() + 1);
+				}
+			}
+			if (musicGroupPaymentCalender.getExpectNum() == null) {
+				musicGroupPaymentCalender.setExpectNum(1);
+			} else {
+				musicGroupPaymentCalender.setExpectNum(musicGroupPaymentCalender.getExpectNum() + 1);
+			}
+			musicGroupPaymentCalender.setUpdateTime(nowDate);
+		}
+		if (musicGroupPaymentCalenderList.size() > 0) {
+			musicGroupPaymentCalenderDao.batchUpdate(musicGroupPaymentCalenderList);
+		}
+
+		List<String> orderDetailTypes = studentPaymentOrderDetailDao.getOrderDetailType(studentPaymentOrder.getId());
+		List<MusicGroupPaymentCalenderCourseSettings> courseSettings = musicGroupPaymentCalenderCourseSettingsDao.getWithPaymentCalender(musicGroupRegCalender.getId());
+		BigDecimal courseTotalPrice = courseSettings.stream().filter(e -> orderDetailTypes.contains(e.getCourseType().getCode())).map(MusicGroupPaymentCalenderCourseSettings::getCourseCurrentPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+		BigDecimal optionalCourseFee = courseSettings.stream().filter(e -> orderDetailTypes.contains(e.getCourseType().getCode())).map(MusicGroupPaymentCalenderCourseSettings::getCourseCurrentPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+
+		List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetails = new ArrayList<>();
+
+		for (MusicGroupPaymentCalender musicGroupPaymentCalender : musicGroupPaymentCalenderList) {
+			MusicGroupPaymentCalenderDetail musicGroupPaymentCalenderDetail = new MusicGroupPaymentCalenderDetail();
+			musicGroupPaymentCalenderDetail.setTenantId(tenantId);
+			musicGroupPaymentCalenderDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalender.getId());
+			musicGroupPaymentCalenderDetail.setUserId(studentPaymentOrder.getUserId());
+			musicGroupPaymentCalenderDetail.setResponsibleUserId(musicGroupPaymentCalender.getOperator());
+
+			if (currentPaymentCalenderId.longValue() == musicGroupPaymentCalender.getId()) {
+				musicGroupPaymentCalenderDetail.setExpectAmount(courseTotalPrice);
+				if (studentPaymentOrder.getCourseRemitFee() != null && (studentPaymentOrder.getCourseRemitFee().compareTo(BigDecimal.ZERO) > 0)) {
+					musicGroupPaymentCalenderDetail.setActualAmount(optionalCourseFee);
+				} else {
+					musicGroupPaymentCalenderDetail.setActualAmount(courseTotalPrice);
+				}
+				musicGroupPaymentCalenderDetail.setPaymentStatus(PAID_COMPLETED);
+				musicGroupPaymentCalenderDetail.setPayTime(nowDate);
+				musicGroupPaymentCalenderDetail.setPaymentOrderId(studentPaymentOrder.getId());
+				musicGroupPaymentCalenderDetail.setUseInCourse(0);
+				musicGroupPaymentCalenderDetail.setOpen(1);
+			} else {
+				musicGroupPaymentCalenderDetail.setExpectAmount(musicGroupPaymentCalender.getPaymentAmount());
+				musicGroupPaymentCalenderDetail.setPaymentStatus(MusicGroupStudentFee.PaymentStatus.NON_PAYMENT);
+			}
+			if(orderDetailTypes.contains(OrderDetailTypeEnum.CLOUD_TEACHER.name()) || orderDetailTypes.contains(OrderDetailTypeEnum.CLOUD_TEACHER_PLUS.name())){
+				musicGroupPaymentCalenderDetail.setExpectAmount(musicGroupPaymentCalenderDetail.getExpectAmount().add(musicGroupPaymentCalender.getMemberPaymentAmount()));
+				musicGroupPaymentCalenderDetail.setActualAmount(musicGroupPaymentCalenderDetail.getActualAmount().add(musicGroupPaymentCalender.getMemberPaymentAmount()));
+			}
+
+			musicGroupPaymentCalenderDetail.setUserStatus(null);
+			musicGroupPaymentCalenderDetail.setDeadlinePaymentDate(musicGroupPaymentCalender.getDeadlinePaymentDate());
+			musicGroupPaymentCalenderDetail.setStartPaymentDate(musicGroupPaymentCalender.getStartPaymentDate());
+			musicGroupPaymentCalenderDetail.setCreateTime(nowDate);
+			musicGroupPaymentCalenderDetail.setUpdateTime(nowDate);
+
+			musicGroupPaymentCalenderDetailDao.insert(musicGroupPaymentCalenderDetail);
+
+			List<MusicGroupPaymentCalenderCourseSettings> courseSettingsList = musicGroupPaymentCalenderCourseSettingsDao
+					.getWithPaymentCalender(musicGroupPaymentCalender.getId());
+			for (MusicGroupPaymentCalenderCourseSettings courseSetting : courseSettingsList) {
+				if (musicGroupRegCalender.getPayUserType().equals(MusicGroupPaymentCalender.PayUserType.STUDENT)
+						&& !orderDetailTypes.contains(courseSetting.getCourseType().getCode())) {
+					continue;
+				}
+				if (courseSetting.getCourseTotalMinuties() == null || courseSetting.getCourseTotalMinuties() == 0) {
+					continue;
+				}
+				MusicGroupPaymentStudentCourseDetail musicGroupPaymentStudentCourseDetail = new MusicGroupPaymentStudentCourseDetail();
+				musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalender.getId());
+				musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderDetailId(musicGroupPaymentCalenderDetail.getId());
+				musicGroupPaymentStudentCourseDetail.setUserId(studentPaymentOrder.getUserId());
+				musicGroupPaymentStudentCourseDetail.setCourseType(courseSetting.getCourseType());
+				musicGroupPaymentStudentCourseDetail.setTotalCourseMinutes(courseSetting.getCourseTotalMinuties());
+				musicGroupPaymentStudentCourseDetail.setCourseOriginalPrice(courseSetting.getCourseOriginalPrice());
+				musicGroupPaymentStudentCourseDetail.setCourseCurrentPrice(courseSetting.getCourseCurrentPrice());
+				musicGroupPaymentStudentCourseDetail.setUsedCourseMinutes(0);
+				musicGroupPaymentStudentCourseDetail.setCreateTime(nowDate);
+				musicGroupPaymentStudentCourseDetail.setUpdateTime(nowDate);
+				musicGroupPaymentStudentCourseDetail.setTenantId(tenantId);
+
+				musicGroupPaymentStudentCourseDetails.add(musicGroupPaymentStudentCourseDetail);
+			}
+		}
+
+		if (musicGroupPaymentStudentCourseDetails.size() > 0) {
+			musicGroupPaymentStudentCourseDetailDao.batchInsert(musicGroupPaymentStudentCourseDetails);
+		}
+    }
 }

+ 12 - 12
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderMemberServiceImpl.java

@@ -23,7 +23,7 @@ import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentCalende
 
 @Service
 public class MusicGroupPaymentCalenderMemberServiceImpl extends BaseServiceImpl<Long, MusicGroupPaymentCalenderMember>
-        implements MusicGroupPaymentCalenderBaseService, MusicGroupPaymentCalenderMemberService {
+        implements MusicGroupPaymentCalenderBaseService<MusicGroupPaymentCalenderMember>, MusicGroupPaymentCalenderMemberService {
 
     @Autowired
     private MusicGroupPaymentCalenderMemberDao musicGroupPaymentCalenderMemberDao;
@@ -43,11 +43,6 @@ public class MusicGroupPaymentCalenderMemberServiceImpl extends BaseServiceImpl<
     }
 
     @Override
-    public void createComponent(MusicGroupPaymentBaseCalender baseCalender) {
-
-    }
-
-    @Override
     public MusicGroupPaymentCalender.PaymentCalenderStatusEnum checkComponentAmount(MusicGroupPaymentBaseCalender baseCalender) {
         MusicGroupPaymentCalenderMember calenderMember = baseCalender.getCalenderMember();
         if(calenderMember != null){
@@ -93,7 +88,12 @@ public class MusicGroupPaymentCalenderMemberServiceImpl extends BaseServiceImpl<
     }
 
     @Override
-    public <T> T initBean(T bean) {
+    public BigDecimal getCurrentAmount(MusicGroupPaymentCalenderMember baseCalender) {
+        return null;
+    }
+
+    @Override
+    public <E> E initBean(E bean) {
         if(bean != null){
             MusicGroupPaymentCalenderMember calenderMember = (MusicGroupPaymentCalenderMember)bean;
             MemberRankSetting memberRankSetting = memberRankSettingDao.get(calenderMember.getMemberRankSettingId());
@@ -108,15 +108,15 @@ public class MusicGroupPaymentCalenderMemberServiceImpl extends BaseServiceImpl<
     private BigDecimal getGroupPurchaseFee(PeriodEnum periodEnum,MemberFeeSetting memberFee){
         switch (periodEnum){
             case DAY :
-                return memberFee.getGroupPurchaseDayFee();
+                return memberFee.getOriginalDayFee();
             case MONTH :
-                return memberFee.getGroupPurchaseMonthFee();
+                return memberFee.getOriginalMonthFee();
             case QUARTERLY :
-                return memberFee.getGroupPurchaseQuarterlyFee();
+                return memberFee.getOriginalQuarterlyFee();
             case YEAR_HALF :
-                return memberFee.getGroupPurchaseHalfYearFee();
+                return memberFee.getOriginalHalfYearFee();
             case YEAR :
-                return memberFee.getGroupPurchaseYearFee();
+                return memberFee.getOriginalYearFee();
             default:
                 throw new BizException("请选择正确的会员有效期");
         }

+ 11 - 9
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderRepairServiceImpl.java

@@ -15,6 +15,7 @@ import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.common.tenant.TenantContextHolder;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -24,7 +25,8 @@ import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentCalende
 import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentCalenderStatusEnum.NO;
 
 @Service
-public class MusicGroupPaymentCalenderRepairServiceImpl extends BaseServiceImpl<Long, MusicGroupPaymentCalenderRepair> implements MusicGroupPaymentCalenderBaseService, MusicGroupPaymentCalenderRepairService {
+public class MusicGroupPaymentCalenderRepairServiceImpl extends BaseServiceImpl<Long, MusicGroupPaymentCalenderRepair>
+        implements MusicGroupPaymentCalenderBaseService<MusicGroupPaymentCalenderRepair>, MusicGroupPaymentCalenderRepairService {
 
     @Autowired
     private MusicGroupPaymentCalenderRepairDao musicGroupPaymentCalenderRepairDao;
@@ -42,11 +44,6 @@ public class MusicGroupPaymentCalenderRepairServiceImpl extends BaseServiceImpl<
     }
 
     @Override
-    public void createComponent(MusicGroupPaymentBaseCalender baseCalender) {
-
-    }
-
-    @Override
     public MusicGroupPaymentCalender.PaymentCalenderStatusEnum checkComponentAmount(MusicGroupPaymentBaseCalender baseCalender) {
         MusicGroupPaymentCalenderRepair musicRepair = baseCalender.getMusicRepair();
         if(musicRepair != null){
@@ -78,9 +75,9 @@ public class MusicGroupPaymentCalenderRepairServiceImpl extends BaseServiceImpl<
         MusicGroupPaymentCalenderRepair musicRepair = baseCalender.getMusicRepair();
         if(musicRepair != null){
             Integer tenantId = TenantContextHolder.getTenantId();
-            String configValue = sysTenantConfigService.getTenantConfigValue(SysConfigService.ONE_YEAR_MUSICAL_REPAIR_AMOUNT, tenantId);
+            String configValue = sysTenantConfigService.getTenantConfigValue(SysConfigService.ONE_YEAR_MUSICAL_REPAIR_ORIGINAL_AMOUNT, tenantId);
             if(StringUtils.isEmpty(configValue)){
-                throw new BizException("操作失败:请配置乐保零售价");
+                throw new BizException("操作失败:请配置乐保价");
             }
             //获取会员总价
             return new BigDecimal(configValue).multiply(musicRepair.getNum()).setScale(0, BigDecimal.ROUND_HALF_UP);
@@ -89,11 +86,16 @@ public class MusicGroupPaymentCalenderRepairServiceImpl extends BaseServiceImpl<
     }
 
     @Override
-    public <T> T initBean(T bean) {
+    public BigDecimal getCurrentAmount(MusicGroupPaymentCalenderRepair baseCalender) {
         return null;
     }
 
     @Override
+    public <E> E initBean(E bean) {
+        return bean;
+    }
+
+    @Override
     public void deleteByCalenderId(Long calenderId) {
         musicGroupPaymentCalenderRepairDao.deleteByCalenderId(calenderId);
     }

+ 47 - 13
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.service.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.toolkit.support.Property;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.entity.SysUserRole;
@@ -33,6 +34,7 @@ import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.util.*;
 import java.util.Map.Entry;
 import java.util.function.Consumer;
@@ -676,6 +678,18 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 		return batchNo;
 	}
 
+	public Map<String, Object> getCalenderDetail(Map<String, Object> result,Long calenderId){
+		//课程
+		result.put("course", musicGroupPaymentCalenderCourseSettingsService.queryCalenderCourseSettings(calenderId));
+		//乐保
+		result.put("repair",musicGroupPaymentCalenderRepairService.findByCalenderId(calenderId));
+		//会员信息
+		result.put("member",musicGroupPaymentCalenderMemberService.findByCalenderId(calenderId));
+		//活动相关信息
+		result.put("activity",musicGroupPaymentCalenderActivityService.findByCalenderId(calenderId));
+		return result;
+	}
+
 	@Override
 	public Map<String, Object> getDetail(Long id) {
 		Map<String, Object> result = new HashMap<>(9);
@@ -713,17 +727,9 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 				e.printStackTrace();
 			}
 		}
-		//课程
-		result.put("course", musicGroupPaymentCalenderCourseSettingsService.queryCalenderCourseSettings(id));
 		//获取跨团合班学员缴费详情
 		result.put("musicMerger",musicGroupPaymentCalenderStudentDetailDao.findByBatchNo(calender.getBatchNo()));
-		//乐保
-		result.put("repair",musicGroupPaymentCalenderRepairService.findByCalenderId(id));
-		//会员信息
-		result.put("member",musicGroupPaymentCalenderMemberService.findByCalenderId(id));
-		//活动相关信息
-		result.put("activity",musicGroupPaymentCalenderActivityService.findByCalenderId(id));
-		return result;
+		return getCalenderDetail(result,id);
 	}
 
 	@Override
@@ -1679,6 +1685,34 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 		return musicGroupPaymentCalenderDao.getMusicGroupRegCalender(musicGroupId);
     }
 
+    private BigDecimal getActualAmount(MusicGroupPaymentCalenderBase baseCalender){
+		if(baseCalender != null){
+			return baseCalender.getActualAmount();
+		}
+		return BigDecimal.ZERO;
+	}
+
+	@Override
+	public BigDecimal getRepairAmount(Long calenderId) {
+		return getActualAmount(musicGroupPaymentCalenderRepairService.findByCalenderId(calenderId));
+	}
+
+	@Override
+	public BigDecimal getMemberAmount(Long calenderId) {
+		return getActualAmount(musicGroupPaymentCalenderMemberService.findByCalenderId(calenderId));
+	}
+
+	@Override
+	public BigDecimal getActivityAmount(List<Long> buyCalenderActivityIdList) {
+		List<MusicGroupPaymentCalenderActivity> activityList = musicGroupPaymentCalenderActivityService.findByIds(buyCalenderActivityIdList);
+		return activityList.stream().map(e->e.getActualAmount()).reduce(BigDecimal.ZERO,BigDecimal::add);
+	}
+
+    @Override
+    public MusicGroupPaymentCalender getApplyCalenderByMusicId(String musicGroupId) {
+		return musicGroupPaymentCalenderDao.findByMusicGroupRegCalender(musicGroupId);
+    }
+
     @Override
 	@Transactional(rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED)
 	public boolean autoUpdateMusicGroupPaymentCalenderStatus() {
@@ -1816,10 +1850,10 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 		MusicGroupPaymentCalenderDetail calenderDetail = musicGroupPaymentCalenderDetailDao.get(calenderDetailId);
 		MusicGroupPaymentCalender calender = this.get(calenderDetail.getMusicGroupPaymentCalenderId());
 		MusicGroupStudentFee musicGroupStudentFee = musicGroupStudentFeeDao.findByUser(userId, calender.getMusicGroupId());
-		if(calender.getIsGiveMusicNetwork() && musicGroupStudentFee != null){
-			//赠送网管课
-			musicGroupStudentFee.setRemainNetworkClassTimes(musicGroupStudentFee.getRemainNetworkClassTimes() + 1);
-		}
+//		if(calender.getIsGiveMusicNetwork() && musicGroupStudentFee != null){
+//			//赠送网管课
+//			musicGroupStudentFee.setRemainNetworkClassTimes(musicGroupStudentFee.getRemainNetworkClassTimes() + 1);
+//		}
 		//更新学生的缴费记录状态
 		calenderDetail.setPaymentStatus(MusicGroupStudentFee.PaymentStatus.PAID_COMPLETED);
 		calenderDetail.setActualAmount(calenderDetail.getExpectAmount().add(calenderDetail.getExpectMemberAmount()));

+ 324 - 426
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -4,18 +4,13 @@ import static com.ym.mec.biz.dal.entity.ApprovalStatus.PROCESSING;
 import static com.ym.mec.biz.dal.enums.DealStatusEnum.CLOSE;
 import static com.ym.mec.biz.dal.enums.DealStatusEnum.ING;
 import static com.ym.mec.biz.dal.enums.DealStatusEnum.SUCCESS;
-import static com.ym.mec.biz.dal.enums.OrderDetailTypeEnum.ACCESSORIES;
-import static com.ym.mec.biz.dal.enums.OrderDetailTypeEnum.CLOUD_TEACHER;
-import static com.ym.mec.biz.dal.enums.OrderDetailTypeEnum.CLOUD_TEACHER_PLUS;
-import static com.ym.mec.biz.dal.enums.OrderDetailTypeEnum.DEGREE_REGISTRATION;
-import static com.ym.mec.biz.dal.enums.OrderDetailTypeEnum.MAINTENANCE;
-import static com.ym.mec.biz.dal.enums.OrderDetailTypeEnum.MUSICAL;
-import static com.ym.mec.biz.dal.enums.OrderDetailTypeEnum.OTHER;
-import static com.ym.mec.biz.dal.enums.OrderDetailTypeEnum.TEACHING;
+import static com.ym.mec.biz.dal.enums.OrderDetailTypeEnum.*;
+import static com.ym.mec.biz.dal.enums.OrderDetailTypeEnum.VIP;
 import static com.ym.mec.biz.dal.enums.PaymentStatusEnum.YES;
 
 import java.io.IOException;
 import java.math.BigDecimal;
+import java.sql.Connection;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -31,14 +26,17 @@ import java.util.function.Function;
 import java.util.stream.Collectors;
 
 import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.service.*;
+import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.tenant.TenantContextHolder;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
@@ -48,19 +46,6 @@ import com.alibaba.fastjson.TypeReference;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.entity.SysUserRole;
-import com.ym.mec.biz.dal.dto.BasicUserDto;
-import com.ym.mec.biz.dal.dto.CloseMusicGroupDto;
-import com.ym.mec.biz.dal.dto.CourseScheduleTeachersDto;
-import com.ym.mec.biz.dal.dto.HighClassGroupDto;
-import com.ym.mec.biz.dal.dto.MusicCardDto;
-import com.ym.mec.biz.dal.dto.MusicGroupBasicDto;
-import com.ym.mec.biz.dal.dto.RegisterPayDto;
-import com.ym.mec.biz.dal.dto.RenewParamDto;
-import com.ym.mec.biz.dal.dto.SporadicPayDto;
-import com.ym.mec.biz.dal.dto.StudentApplyInstrumentDto;
-import com.ym.mec.biz.dal.dto.SubFeeSettingDto;
-import com.ym.mec.biz.dal.dto.SubjectRegisterDto;
-import com.ym.mec.biz.dal.dto.UpdateExpectedNumDto;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PayUserType;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentCalenderStatusEnum;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentType;
@@ -148,6 +133,8 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Autowired
     private StudentPaymentOrderDetailService studentPaymentOrderDetailService;
     @Autowired
+    private SellOrderService sellOrderService;
+    @Autowired
     private PayService payService;
     @Autowired
     private SysUserFeignService sysUserFeignService;
@@ -176,6 +163,8 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Autowired
     private ClassGroupStudentMapperService classGroupStudentMapperService;
     @Autowired
+    private MusicGroupPaymentCalenderDetailService musicGroupPaymentCalenderDetailService;
+    @Autowired
     private MusicGroupPaymentCalenderDetailDao musicGroupPaymentCalenderDetailDao;
     @Autowired
     private ImGroupMemberService imGroupMemberService;
@@ -205,7 +194,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Autowired
     private StudentPreRegistrationDao studentPreRegistrationDao;
     @Autowired
-    private OrganizationCloudTeacherFeeDao organizationCloudTeacherFeeDao;
+    private ActivityUserMapperService activityUserMapperService;
 
     @Autowired
     private GroupEventSource groupEventSource;
@@ -230,6 +219,8 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
     @Autowired
     private SysCouponCodeService sysCouponCodeService;
+    @Autowired
+    private StudentInstrumentService studentInstrumentService;
 
     private SimpleDateFormat sdf_ymd = new SimpleDateFormat("yyyy-MM-dd");
 
@@ -661,157 +652,263 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
-    public Map pay(RegisterPayDto registerPayDto) throws Exception {
-
-        StudentRegistration studentRegistration = studentRegistrationService.get(registerPayDto.getRegisterId().longValue());
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    public HttpResponseResult renew(RegisterPayDto renewParamDto) throws Exception {
+        Long calenderId = renewParamDto.getCalenderId();
+        Integer userId = renewParamDto.getUserId();
+        MusicGroupPaymentCalender calender = musicGroupPaymentCalenderDao.get(calenderId);
+        StudentRegistration studentRegistration = studentRegistrationService.queryByUserIdAndMusicGroupId(userId, calender.getMusicGroupId());
         if (studentRegistration == null) {
-            throw new BizException("报名信息有误,请核查");
+            throw new BizException("请走报名缴费流程");
         }
-        
-        MusicGroupPaymentCalender musicGroupRegCalender = musicGroupPaymentCalenderDao.findByMusicGroupRegCalender(studentRegistration.getMusicGroupId());
-        if(musicGroupRegCalender == null){
-        	throw new BizException("缴费信息不存在");
+        Integer organId = studentRegistration.getOrganId();
+        MusicGroupPaymentCalenderDetail calenderDetail = musicGroupPaymentCalenderDetailDao.findByCalenderIdAndUserId(calenderId, userId);
+        //关闭之前的订单
+        if (calenderDetail.getPaymentOrderId() != null) {
+            StudentPaymentOrder oldStudentPaymentOrder = studentPaymentOrderDao.get(calenderDetail.getPaymentOrderId());
+            HttpResponseResult result = studentPaymentOrderService.checkRepeatPay(oldStudentPaymentOrder, renewParamDto.getRepeatPay());
+            if(result.getCode() != 200){
+                return result;
+            }
         }
-        MusicGroup musicGroup = musicGroupDao.get(studentRegistration.getMusicGroupId());
-        if(musicGroup == null){
-            throw new BizException("查询乐团信息失败");
+
+        //获取订单总金额
+        MusicGroupApplyGoodsDto goodsDto = getCalenderTotalAmount(renewParamDto,calender);
+
+        String orderNo = idGeneratorService.generatorId("payment") + "";
+
+        Date date = new Date();
+        //使用优惠券
+        StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(renewParamDto.getCouponIdList(),goodsDto.getOrderAmount(),true);
+        studentPaymentOrder.setGroupType(GroupType.MUSIC);
+        studentPaymentOrder.setUserId(userId);
+        studentPaymentOrder.setOrderNo(orderNo);
+        if (calender.getPaymentType() == PaymentType.ADD_STUDENT) {
+            studentPaymentOrder.setType(OrderTypeEnum.ADD_STUDENT);
+        } else {
+            studentPaymentOrder.setType(OrderTypeEnum.RENEW);
         }
-        Integer tenantId = TenantContextHolder.getTenantId();
+        studentPaymentOrder.setStatus(DealStatusEnum.ING);
+        studentPaymentOrder.setMusicGroupId(calender.getMusicGroupId());
+        studentPaymentOrder.setBatchNo(calender.getId() + "");
+        studentPaymentOrder.setCreateTime(date);
+        studentPaymentOrder.setUpdateTime(date);
+        studentPaymentOrder.setVersion(0);
+        studentPaymentOrderService.insert(studentPaymentOrder);
+        // 订单详情
+        studentPaymentOrder = studentRegistrationService.addOrder(studentRegistration,studentPaymentOrder,goodsDto,renewParamDto);
+        BigDecimal actualAmount = studentPaymentOrder.getActualAmount();
 
-        Integer userId = studentRegistration.getUserId();
+        BigDecimal amount = renewParamDto.getAmount(); //前端获取的价格
+        if (amount.compareTo(actualAmount) != 0) {
+            throw new BizException("商品价格不符");
+        }
+        if (amount.compareTo(BigDecimal.ZERO) < 0) {
+            throw new BizException("价格异常");
+        }
+        calenderDetail.setPaymentStatus(PaymentStatus.PROCESSING);
+        calenderDetail.setPaymentOrderId(studentPaymentOrder.getId());
+        musicGroupPaymentCalenderDetailDao.update(calenderDetail);
 
-        BigDecimal amount = registerPayDto.getAmount(); //前端获取的价格
-        BigDecimal orderAmount = new BigDecimal("0");
+        BigDecimal balance = BigDecimal.ZERO;
+        if (renewParamDto.getUseBalancePayment() || amount.doubleValue() == 0) {
+            SysUserCashAccount userCashAccount = sysUserCashAccountService.getLocked(userId);
+            if (userCashAccount == null) {
+                throw new BizException("用户账户找不到");
+            }
+            studentPaymentOrder.setPaymentChannel("BALANCE");
+            if (userCashAccount.getBalance().subtract(amount).doubleValue() >= 0) {
+                // 更新订单信息
+                balance = amount;
+                studentPaymentOrder.setActualAmount(BigDecimal.ZERO);
+                studentPaymentOrder.setBalancePaymentAmount(amount);
+                studentPaymentOrder.setActualAmount(new BigDecimal(0));
+                studentPaymentOrder.setUpdateTime(date);
+                studentPaymentOrder.setOrganId(organId);
+                studentPaymentOrder.setRoutingOrganId(organId);
+                studentPaymentOrderService.update(studentPaymentOrder);
+                sysUserCashAccountService.updateBalance(userId, amount.negate(), PlatformCashAccountDetailTypeEnum.PAY_FEE, "乐团续费");
+                amount = BigDecimal.ZERO;
+            } else {
+                if (userCashAccount.getBalance().doubleValue() > 0) {
+                    balance = userCashAccount.getBalance();
+                    sysUserCashAccountService.updateBalance(userId, balance.negate(), PlatformCashAccountDetailTypeEnum.PAY_FEE, "乐团续费");
+                    amount = amount.subtract(userCashAccount.getBalance());
+                    studentPaymentOrder.setBalancePaymentAmount(userCashAccount.getBalance());
+                    studentPaymentOrder.setActualAmount(studentPaymentOrder.getActualAmount().subtract(userCashAccount.getBalance()));
+                } else {
+                    studentPaymentOrder.setBalancePaymentAmount(new BigDecimal(0));
+                }
+            }
+        }
+        String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
 
-        //获取课程价格
-//        MusicGroupSubjectPlan musicOneSubjectClassPlan = musicGroupSubjectPlanService.getMusicOneSubjectClassPlan(studentRegistration.getMusicGroupId(), studentRegistration.getActualSubjectId());
-//        BigDecimal courseFee = musicOneSubjectClassPlan.getFee() == null ? BigDecimal.ZERO : musicOneSubjectClassPlan.getFee();
-//        orderAmount = orderAmount.add(courseFee);
+        if (amount.compareTo(BigDecimal.ZERO) == 0) {
+            studentPaymentRouteOrderService.addRouteOrder(orderNo, organId, balance);
+            Map<String, String> notifyMap = new HashMap<>(4);
+            notifyMap.put("tradeState", "1");
+            notifyMap.put("merOrderNo", studentPaymentOrder.getOrderNo());
+            notifyMap.put("channelType", "");
+            notifyMap.put("orderNo", "");
+            studentPaymentOrderService.updateOrder(notifyMap);
+            return BaseController.failed(HttpStatus.CREATED, notifyMap, "恭喜您,缴费成功!");
+        }
 
-        BigDecimal remitFee = BigDecimal.ZERO; //乐器减免金额
-        BigDecimal courseRemitFee = BigDecimal.ZERO; //课程减免费用
-        boolean remitCourseRFeeFlag = false; //减免课程费用标识
+        Map<String, Object> payMap = payService.getPayMap(
+                amount,
+                balance,
+                orderNo,
+                baseApiUrl + "/api-student/studentOrder/notify",
+                baseApiUrl + "/api-student/studentOrder/paymentResult?orderNo=" + studentPaymentOrder.getOrderNo(),
+                "续费",
+                "乐团续费",
+                organId,
+                "renew"
+        );
 
-        //乐器及打包辅件
-        List<MusicGroupSubjectGoodsGroup> goodsGroups = new ArrayList<>();
+        studentPaymentOrder.setActualAmount(amount);
+        studentPaymentOrder.setOrganId(organId);
+        studentPaymentOrder.setMerNos((String) payMap.get("routingMerNos"));
+        studentPaymentOrder.setPaymentChannel((String) payMap.get("type"));
+        studentPaymentOrder.setUpdateTime(date);
+        studentPaymentOrderService.update(studentPaymentOrder);
+        return BaseController.succeed(payMap);
+    }
+
+    private MusicGroupApplyGoodsDto getCalenderTotalAmount(RegisterPayDto registerPayDto,MusicGroupPaymentCalender calender){
+        MusicGroupApplyGoodsDto goodsDto = new MusicGroupApplyGoodsDto();
+        //乐器及打包辅件价格
+        List<MusicGroupSubjectGoodsGroup> goodsGroups;
         if (registerPayDto.getGoodsGroups() != null && registerPayDto.getGoodsGroups().size() > 0) {
             String goodsGroupIds = registerPayDto.getGoodsGroups().keySet().stream().map(Object::toString).collect(Collectors.joining(","));
             goodsGroups = musicGroupSubjectGoodsGroupService.findGoodsGroupByIds(goodsGroupIds);
-        }
-        for (MusicGroupSubjectGoodsGroup goodsGroup : goodsGroups) {
-            Map<String, BigDecimal> groupType = JSONObject.parseObject(goodsGroup.getKitGroupPurchaseTypeJson(), new TypeReference<Map<String, BigDecimal>>() {});
-
-            if (goodsGroup.getType().equals(GoodsType.INSTRUMENT)) {
-                String kitGroupPurchaseType = registerPayDto.getGoodsGroups().get(goodsGroup.getId());
-                if (!groupType.containsKey(kitGroupPurchaseType)) {
-                    throw new BizException("乐器提供方式不存在,请核查");
-                }
-                if (!kitGroupPurchaseType.equals("GROUP")) {
-                    goodsGroup.setPrice(kitGroupPurchaseType.equals("FREE") ? new BigDecimal(0) : goodsGroup.getDepositFee());
-                } else {
-                    remitCourseRFeeFlag = goodsGroup.getGroupRemissionCourseFee().equals(1);
+            goodsDto.setGoodsGroups(goodsGroups);
+            for (MusicGroupSubjectGoodsGroup goodsGroup : goodsGroups) {
+                Map<String, BigDecimal> groupType = JSONObject.parseObject(goodsGroup.getKitGroupPurchaseTypeJson(), new TypeReference<Map<String, BigDecimal>>() {});
+
+                if (goodsGroup.getType().equals(GoodsType.INSTRUMENT)) {
+                    String kitGroupPurchaseType = registerPayDto.getGoodsGroups().get(goodsGroup.getId());
+                    if (!groupType.containsKey(kitGroupPurchaseType)) {
+                        throw new BizException("乐器提供方式不存在,请核查");
+                    }
+                    if (!kitGroupPurchaseType.equals("GROUP")) {
+                        goodsGroup.setPrice(kitGroupPurchaseType.equals("FREE") ? new BigDecimal(0) : goodsGroup.getDepositFee());
+                    } else {
+                        //购买乐器是否减免课程费用
+                        goodsDto.setRemitCourseRFeeFlag(goodsGroup.getGroupRemissionCourseFee().equals(1));
+                    }
+                    goodsGroup.setKitGroupPurchaseType(KitGroupPurchaseTypeEnum.valueOf(kitGroupPurchaseType));
+                    goodsDto.setRemitFee(groupType.get(kitGroupPurchaseType) == null ? BigDecimal.ZERO : groupType.get(kitGroupPurchaseType));
                 }
-                goodsGroup.setKitGroupPurchaseType(KitGroupPurchaseTypeEnum.valueOf(kitGroupPurchaseType));
-                remitFee = groupType.get(kitGroupPurchaseType) == null ? BigDecimal.ZERO : groupType.get(kitGroupPurchaseType);
-            }
-            goodsGroup.setGoodsList(goodsService.findGoodsByIds(goodsGroup.getGoodsIdList()));
-            
-            if(goodsGroup.getType().equals(GoodsType.ACCESSORIES)){
-            	if((registerPayDto.getBuyCloudTeacher() || registerPayDto.getBuyCloudTeacherPlus()) && musicGroup.getCourseViewType() == CourseViewTypeEnum.MEMBER_FEE){
-            		goodsGroup.setPrice(BigDecimal.ZERO);
-            		continue;
-            	}
-            }
-            
-            if(musicGroup.getOrganId() == 55 && (registerPayDto.getNewCourse() == null || registerPayDto.getNewCourse().size() == 0) && !(registerPayDto.getBuyCloudTeacher() || registerPayDto.getBuyCloudTeacherPlus())){
-            	//取商品零售价
-                if (StringUtils.isNotBlank(goodsGroup.getGoodsIdList())) {
-                	List<Goods> goodsList = goodsDao.findGoodsByIds(goodsGroup.getGoodsIdList());
-                	for(Goods goods : goodsList){
-                		orderAmount = orderAmount.add(goods.getDiscountPrice());
-                	}
+                goodsGroup.setGoodsList(goodsService.findGoodsByIds(goodsGroup.getGoodsIdList()));
+
+                //齐齐哈尔走特殊规则
+                if(calender.getOrganId() == 55 && (registerPayDto.getNewCourse() == null || registerPayDto.getNewCourse().size() == 0) && !(registerPayDto.getBuyCloudTeacher() || registerPayDto.getBuyCloudTeacherPlus())){
+                    //取商品零售价
+                    if (StringUtils.isNotBlank(goodsGroup.getGoodsIdList())) {
+                        List<Goods> goodsList = goodsDao.findGoodsByIds(goodsGroup.getGoodsIdList());
+                        for(Goods goods : goodsList){
+                            goodsDto.setOrderAmount(goodsDto.getOrderAmount().add(goods.getDiscountPrice()));
+                        }
+                    }
+                }else{
+                    goodsDto.setOrderAmount(goodsDto.getOrderAmount().add(goodsGroup.getPrice()));
                 }
-            }else{
-            	orderAmount = orderAmount.add(goodsGroup.getPrice());
             }
+            goodsDto.setOrderAmount(goodsDto.getOrderAmount().subtract(goodsDto.getRemitFee()));
         }
-        orderAmount = orderAmount.subtract(remitFee);
-
         //新课程形态
-        List<MusicGroupPaymentCalenderCourseSettings> newCourses = new ArrayList<>();
-        if (musicGroupRegCalender.getPayUserType() == PayUserType.STUDENT && registerPayDto.getNewCourse() != null && registerPayDto.getNewCourse().size() > 0) {
+        List<MusicGroupPaymentCalenderCourseSettings> newCourses;
+        if (calender.getPayUserType() == PayUserType.STUDENT && registerPayDto.getNewCourse() != null && registerPayDto.getNewCourse().size() > 0) {
             newCourses = musicGroupPaymentCalenderCourseSettingsDao.getCalenderCourseSettings(registerPayDto.getNewCourse());
             for (MusicGroupPaymentCalenderCourseSettings calenderCourseSetting : newCourses) {
-                if (remitCourseRFeeFlag && !calenderCourseSetting.getIsStudentOptional()) {
-                    courseRemitFee = courseRemitFee.add(calenderCourseSetting.getCourseCurrentPrice());
-                    continue;
+                if (goodsDto.isRemitCourseRFeeFlag()) {
+                    goodsDto.setCourseRemitFee(goodsDto.getCourseRemitFee().add(calenderCourseSetting.getCourseCurrentPrice()));
+                }else {
+                    goodsDto.setOrderAmount(goodsDto.getOrderAmount().add(calenderCourseSetting.getCourseCurrentPrice()));
                 }
-                orderAmount = orderAmount.add(calenderCourseSetting.getCourseCurrentPrice());
             }
+            goodsDto.setNewCourses(newCourses);
+        }
+        //活动价格
+        List<Long> buyCalenderActivityIdList = registerPayDto.getBuyCalenderActivityId();
+        if(buyCalenderActivityIdList != null && buyCalenderActivityIdList.size() > 0){
+            goodsDto.setOrderAmount(goodsDto.getOrderAmount().add(musicGroupPaymentCalenderService.getActivityAmount(buyCalenderActivityIdList)));
         }
-        //乐器保养
+        //乐器保养价格
         if (registerPayDto.getBuyMaintenance()) {
-            String configValue = sysTenantConfigService.getTenantConfigValue(SysConfigService.ONE_YEAR_MUSICAL_REPAIR_AMOUNT, tenantId);
-            if(StringUtils.isEmpty(configValue)){
-                throw new BizException("乐保价格异常,请联系指导老师");
+            goodsDto.setOrderAmount(goodsDto.getOrderAmount().add(musicGroupPaymentCalenderService.getRepairAmount(calender.getId())));
+        }
+        //云教练价格和订单
+        if (registerPayDto.getBuyCloudTeacher()){
+            goodsDto.setOrderAmount(goodsDto.getOrderAmount().add(musicGroupPaymentCalenderService.getMemberAmount(calender.getId())));
+        }
+        //合班缴费
+        List<MusicGroupPaymentCalenderStudentDetail> studentDetails = musicGroupPaymentCalenderStudentDetailDao.findByBatchNoAndUserId(registerPayDto.getBatchNo(), registerPayDto.getUserId());
+        if(studentDetails != null && studentDetails.size() > 0){
+            goodsDto.setOrderAmount(goodsDto.getOrderAmount().add(studentDetails.stream().map(e->e.getCourseCurrentPrice()).reduce(BigDecimal.ZERO,BigDecimal::add)));
+        }
+        return goodsDto;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResponseResult pay(RegisterPayDto registerPayDto) throws Exception {
+        //判断用户是否已存在订单
+        List<StudentPaymentOrder> applyOrderList = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(registerPayDto.getUserId(), registerPayDto.getMusicGroupId(), DealStatusEnum.ING);
+
+        if (applyOrderList != null && applyOrderList.size() > 0) {
+            HttpResponseResult result = studentPaymentOrderService.checkRepeatPay(applyOrderList.get(0), registerPayDto.getRepeatPay());
+            if(result.getCode() != 200){
+                return result;
             }
-            orderAmount = orderAmount.add(new BigDecimal(configValue));
         }
-        
+        StudentRegistration studentRegistration = studentRegistrationService.get(registerPayDto.getRegisterId().longValue());
+        if (studentRegistration == null) {
+            throw new BizException("报名信息有误,请核查");
+        }
+        MusicGroupPaymentCalender musicGroupRegCalender = musicGroupPaymentCalenderDao.findByMusicGroupRegCalender(studentRegistration.getMusicGroupId());
+        if(musicGroupRegCalender == null){
+        	throw new BizException("缴费信息不存在");
+        }
+        registerPayDto.setBatchNo(musicGroupRegCalender.getBatchNo());
+        MusicGroup musicGroup = musicGroupDao.get(studentRegistration.getMusicGroupId());
+        if(musicGroup == null){
+            throw new BizException("查询乐团信息失败");
+        }
+
+        Long calenderId = musicGroupRegCalender.getId();
+        Integer userId = studentRegistration.getUserId();
+
+        //获取缴费项目金额
+        MusicGroupApplyGoodsDto goodsDto = getCalenderTotalAmount(registerPayDto,musicGroupRegCalender);
+
         studentRegistration.setMusicGroupPaymentCalenderId(musicGroupRegCalender.getId());
         studentRegistration.setOrganId(musicGroup.getOrganId());
-        
         studentRegistration.setPayingStatus(1);
 
         Date date = new Date();
 
-        CloudTeacherOrder cloudTeacherOrder = null;
-        //云教练/云教练+
-        if (registerPayDto.getBuyCloudTeacher() || registerPayDto.getBuyCloudTeacherPlus()) {
-            BigDecimal cloudTeacherPrice = BigDecimal.ZERO;
-			if (musicGroupRegCalender.getMemberRankSettingId() != null) {
-				cloudTeacherPrice = musicGroupRegCalender.getMemberPaymentAmount();
-			} else {
-				if (musicGroup.getCloudTeacherType() != null) {
-					OrganizationCloudTeacherFee cloudTeacher = organizationCloudTeacherFeeDao.getByOrganId(studentRegistration.getOrganId());
-					cloudTeacherPrice = musicGroup.getCloudTeacherType() == 0 ? cloudTeacher.getPrice() : cloudTeacher.getPlusPrice();
-				}
-			}
-            
-            orderAmount = orderAmount.add(cloudTeacherPrice);
-            studentRegistration.setHasCloudTeacher(0);
-            
-
-            //创建订单
-            cloudTeacherOrder = new CloudTeacherOrder();
-
-    		cloudTeacherOrder.setType(PeriodEnum.MONTH);//月
-			cloudTeacherOrder.setTime(musicGroupRegCalender.getMemberValidDate() == null ? 6 : musicGroupRegCalender.getMemberValidDate());
-    		
-    		cloudTeacherOrder.setOrganId(musicGroup.getOrganId());
-    		cloudTeacherOrder.setStudentId(studentRegistration.getUserId());
-    		cloudTeacherOrder.setLevel(musicGroupRegCalender.getMemberRankSettingId() == null ? 1 : musicGroupRegCalender.getMemberRankSettingId());
-    		cloudTeacherOrder.setAmount(cloudTeacherPrice);
-    		cloudTeacherOrder.setStatus(0);
-            cloudTeacherOrder.setMusicGroupId(musicGroup.getId());
-        }
         String orderNo = idGeneratorService.generatorId("payment") + "";
 
         String channelType = "";
-        StudentPaymentOrder studentPaymentOrder = studentRegistrationService.addOrder(studentRegistration,
-                orderAmount,
-                orderNo,
-                channelType,
-                goodsGroups,
-                remitFee,
-                courseRemitFee,
-                newCourses,
-                registerPayDto.getBuyMaintenance(),
-                registerPayDto.getBuyCloudTeacher(),
-                registerPayDto.getBuyCloudTeacherPlus(),registerPayDto.getCouponIdList());
-        orderAmount = studentPaymentOrder.getActualAmount();
-        if (amount.compareTo(orderAmount) != 0) {
+        //生成订单、
+        StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(registerPayDto.getCouponIdList(),goodsDto.getOrderAmount(),true);
+        studentPaymentOrder.setUserId(studentRegistration.getUserId());
+        studentPaymentOrder.setGroupType(GroupType.MUSIC);
+        studentPaymentOrder.setOrderNo(orderNo);
+        studentPaymentOrder.setType(OrderTypeEnum.APPLY);
+        studentPaymentOrder.setStatus(DealStatusEnum.ING);
+        studentPaymentOrder.setPaymentChannel(channelType);
+        studentPaymentOrder.setMusicGroupId(studentRegistration.getMusicGroupId());
+        studentPaymentOrder.setCalenderId(calenderId);
+        studentPaymentOrderService.insert(studentPaymentOrder);
+        // 订单详情
+        studentPaymentOrder = studentRegistrationService.addOrder(studentRegistration,studentPaymentOrder,goodsDto,registerPayDto);
+        BigDecimal actualAmount = studentPaymentOrder.getActualAmount();
+
+        BigDecimal amount = registerPayDto.getAmount(); //前端获取的价格
+        if (amount.compareTo(actualAmount) != 0) {
             throw new BizException("商品价格不符");
         }
         if (amount.compareTo(BigDecimal.ZERO) < 0) {
@@ -820,13 +917,6 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         studentPaymentOrder = studentPaymentOrderService.get(studentPaymentOrder.getId());
         boolean canPay = studentPaymentOrder.getClassGroupId() != null && studentPaymentOrder.getClassGroupId().equals(206);
         
-        if(cloudTeacherOrder != null){
-    		cloudTeacherOrder.setOrderId(studentPaymentOrder.getId());
-    		cloudTeacherOrder.setCreateTime(date);
-    		cloudTeacherOrder.setUpdateTime(date);
-    		cloudTeacherOrderService.insert(cloudTeacherOrder);
-        }
-
         BigDecimal balance = BigDecimal.ZERO;
         if (registerPayDto.getUseBalancePayment() && amount.compareTo(BigDecimal.ZERO) > 0) {
             SysUserCashAccount userCashAccount = sysUserCashAccountService.getLocked(userId);
@@ -844,8 +934,8 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         }
         studentPaymentOrder.setBatchNo(musicGroupRegCalender.getId() + "");
         studentPaymentOrder.setPaymentChannel("BALANCE");
-        studentPaymentOrder.setRemitFee(remitFee);
-        studentPaymentOrder.setCourseRemitFee(courseRemitFee);
+        studentPaymentOrder.setRemitFee(goodsDto.getRemitFee());
+        studentPaymentOrder.setCourseRemitFee(goodsDto.getCourseRemitFee());
         studentPaymentOrder.setOrganId(musicGroup.getOrganId());
         studentPaymentOrder.setRoutingOrganId(musicGroup.getOrganId());
         studentPaymentOrder.setUpdateTime(date);
@@ -869,12 +959,11 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             userPhoneMap.put(endTeacher.getId(), endTeacher.getPhone());
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.NO_BUY_CLOUD_TEACHER_MSG,
                     userPhoneMap, null, 0, null, null, musicGroup.getName(), studentRegistration.getName());
-
             if(!canPay){
                 Map<String, String> notifyMap = new HashMap<>();
                 notifyMap.put("hasPaidZero", "205");
                 notifyMap.put("orderNo", studentPaymentOrder.getOrderNo());
-                return notifyMap;
+                return BaseController.failed(HttpStatus.RESET_CONTENT, notifyMap, "报名审核中");
             }
         }
 
@@ -886,7 +975,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             notifyMap.put("channelType", channelType);
             notifyMap.put("orderNo", "");
             studentPaymentOrderService.updateOrder(notifyMap);
-            return notifyMap;
+            return BaseController.failed(HttpStatus.CREATED, notifyMap, "恭喜您,报名成功!");
         }
 
         String orderSubject = "乐团报名";
@@ -913,16 +1002,10 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         studentPaymentOrder.setPaymentChannel((String) payMap.get("type"));
         studentPaymentOrder.setUpdateTime(date);
         studentPaymentOrderService.update(studentPaymentOrder);
-        return payMap;
+        return BaseController.succeed(payMap);
     }
 
-    private BigDecimal getCalenderAmount(Long calenderId,Function<Long,BigDecimal> func){
-        return func.apply(calenderId);
-    }
-
-
-
-    @Override
+    /*@Override
     @Transactional(rollbackFor = Exception.class)
     public Map rePay(RegisterPayDto registerPayDto) throws Exception {
         StudentRegistration studentRegistration = studentRegistrationService.get(registerPayDto.getRegisterId().longValue());
@@ -950,9 +1033,9 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if(payStatus != PayStatus.FAILED){
         	if(payStatus == PayStatus.SUCCESSED){
         		throw new BizException("订单已支付成功,请勿重复支付");
-        	}/*else if(payStatus == PayStatus.PAYING){
+        	}*//*else if(payStatus == PayStatus.PAYING){
         		throw new BizException("订单还在交易中,请稍后重试");
-        	}*/
+        	}*//*
         }
 
     	MusicGroupPaymentCalender musicGroupRegCalender = musicGroupPaymentCalenderDao.findByMusicGroupRegCalender(studentRegistration.getMusicGroupId());
@@ -1090,17 +1173,21 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         String orderNo = idGeneratorService.generatorId("payment") + "";
 
         String channelType = "";
-        StudentPaymentOrder studentPaymentOrder = studentRegistrationService.addOrder(studentRegistration,
-                orderAmount,
-                orderNo,
-                channelType,
-                goodsGroups,
-                remitFee,
+        StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(registerPayDto.getCouponIdList(),amount,true);
+        studentPaymentOrder.setUserId(studentRegistration.getUserId());
+        studentPaymentOrder.setGroupType(GroupType.MUSIC);
+        studentPaymentOrder.setOrderNo(orderNo);
+        studentPaymentOrder.setType(OrderTypeEnum.APPLY);
+        studentPaymentOrder.setStatus(DealStatusEnum.ING);
+        studentPaymentOrder.setPaymentChannel(channelType);
+        studentPaymentOrder.setMusicGroupId(studentRegistration.getMusicGroupId());
+        studentPaymentOrder.setCalenderId(musicGroupRegCalender.getId());
+        studentPaymentOrderService.insert(studentPaymentOrder);
+        //生成订单详情
+        studentPaymentOrder = studentRegistrationService.addOrder(studentRegistration,studentPaymentOrder,goodsGroups,remitFee,
                 courseRemitFee,
                 newCourses,
-                registerPayDto.getBuyMaintenance(),
-                registerPayDto.getBuyCloudTeacher(),
-                registerPayDto.getBuyCloudTeacherPlus(),registerPayDto.getCouponIdList());
+                registerPayDto);
         studentPaymentOrder = studentPaymentOrderService.get(studentPaymentOrder.getId());
         orderAmount = studentPaymentOrder.getActualAmount();
         if (amount.compareTo(orderAmount) != 0) {
@@ -1203,7 +1290,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         studentPaymentOrder.setUpdateTime(date);
         studentPaymentOrderService.update(studentPaymentOrder);
         return payMap;
-    }
+    }*/
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -2967,161 +3054,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
     @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
-    public Map renew(RenewParamDto renewParamDto) throws Exception {
-        Long calenderId = renewParamDto.getCalenderId();
-        Integer userId = renewParamDto.getUserId();
-        MusicGroupPaymentCalender calender = musicGroupPaymentCalenderDao.get(calenderId);
-        if (calender == null) {
-            throw new BizException("缴费项目不存在");
-        }
-        StudentRegistration studentRegistration = studentRegistrationService.queryByUserIdAndMusicGroupId(userId, calender.getMusicGroupId());
-        if (studentRegistration == null) {
-            throw new BizException("请走报名缴费流程");
-        }
-        Integer organId = studentRegistration.getOrganId();
-        MusicGroupPaymentCalenderDetail calenderDetail = musicGroupPaymentCalenderDetailDao.findByCalenderIdAndUserId(calenderId, userId);
-        //关闭之前的订单
-        if (calenderDetail.getPaymentOrderId() != null) {
-            StudentPaymentOrder oldStudentPaymentOrder = studentPaymentOrderDao.get(calenderDetail.getPaymentOrderId());
-            if (oldStudentPaymentOrder != null && oldStudentPaymentOrder.getStatus() == ING) {
-                
-                // 查询订单状态
-                PayStatus payStatus = studentPaymentOrderService.queryPayStatus(oldStudentPaymentOrder.getPaymentChannel(), oldStudentPaymentOrder.getOrderNo(), oldStudentPaymentOrder.getTransNo());
-                if(payStatus != PayStatus.FAILED){
-                	if(payStatus == PayStatus.SUCCESSED){
-                		throw new BizException("订单已支付成功,请勿重复支付");
-                	}/*else if(payStatus == PayStatus.PAYING){
-                		throw new BizException("订单还在交易中,请稍后重试");
-                	}*/
-                }
-                oldStudentPaymentOrder.setStatus(CLOSE);
-                studentPaymentOrderService.update(oldStudentPaymentOrder);
-                if (oldStudentPaymentOrder.getBalancePaymentAmount() != null && oldStudentPaymentOrder.getBalancePaymentAmount().compareTo(BigDecimal.ZERO) > 0) {
-                    sysUserCashAccountService.updateBalance(oldStudentPaymentOrder.getUserId(), oldStudentPaymentOrder.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS, "关闭订单");
-                }
-                sysCouponCodeService.quit(oldStudentPaymentOrder.getCouponCodeId());
-            }
-        }
-        String orderNo = idGeneratorService.generatorId("payment") + "";
-
-        BigDecimal amount = calenderDetail.getExpectAmount().add(calenderDetail.getExpectMemberAmount());
-
-        Date date = new Date();
-        //使用优惠券
-        StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(renewParamDto.getCouponIdList(),amount,true);
-        amount = studentPaymentOrder.getActualAmount();
-        studentPaymentOrder.setGroupType(GroupType.MUSIC);
-        studentPaymentOrder.setUserId(userId);
-        studentPaymentOrder.setOrderNo(orderNo);
-        
-		if (calender.getPaymentType() == PaymentType.ADD_STUDENT) {
-			studentPaymentOrder.setType(OrderTypeEnum.ADD_STUDENT);
-		} else {
-			studentPaymentOrder.setType(OrderTypeEnum.RENEW);
-		}
-        studentPaymentOrder.setStatus(DealStatusEnum.ING);
-        studentPaymentOrder.setMusicGroupId(calender.getMusicGroupId());
-        studentPaymentOrder.setBatchNo(calender.getId() + "");
-        studentPaymentOrder.setCreateTime(date);
-        studentPaymentOrder.setUpdateTime(date);
-        studentPaymentOrder.setVersion(0);
-        studentPaymentOrderService.insert(studentPaymentOrder);
-        calenderDetail.setPaymentStatus(PaymentStatus.PROCESSING);
-        calenderDetail.setPaymentOrderId(studentPaymentOrder.getId());
-        musicGroupPaymentCalenderDetailDao.update(calenderDetail);
-        
-        
-        CloudTeacherOrder cloudTeacherOrder = null;
-
-        //云教练/云教练+
-        if (calender.getMemberRankSettingId() != null) {
-
-            //创建订单
-            cloudTeacherOrder = new CloudTeacherOrder();
-
-    		cloudTeacherOrder.setType(PeriodEnum.MONTH);//月
-			cloudTeacherOrder.setTime(calender.getMemberValidDate());
-    		cloudTeacherOrder.setOrganId(organId);
-    		cloudTeacherOrder.setStudentId(studentRegistration.getUserId());
-    		cloudTeacherOrder.setLevel(calender.getMemberRankSettingId());
-    		cloudTeacherOrder.setAmount(calender.getMemberPaymentAmount());
-    		cloudTeacherOrder.setStatus(0);
-    		cloudTeacherOrder.setOrderId(studentPaymentOrder.getId());
-    		cloudTeacherOrder.setCreateTime(date);
-    		cloudTeacherOrder.setUpdateTime(date);
-            cloudTeacherOrder.setMusicGroupId(calender.getMusicGroupId());
-    		cloudTeacherOrderService.insert(cloudTeacherOrder);
-        }
-
-        BigDecimal balance = BigDecimal.ZERO;
-        if (renewParamDto.getUseBalancePayment() || amount.doubleValue() == 0) {
-            SysUserCashAccount userCashAccount = sysUserCashAccountService.getLocked(userId);
-            if (userCashAccount == null) {
-                throw new BizException("用户账户找不到");
-            }
-            studentPaymentOrder.setPaymentChannel("BALANCE");
-            if (userCashAccount.getBalance().subtract(amount).doubleValue() >= 0) {
-                // 更新订单信息
-                balance = amount;
-                studentPaymentOrder.setActualAmount(BigDecimal.ZERO);
-                studentPaymentOrder.setBalancePaymentAmount(amount);
-                studentPaymentOrder.setActualAmount(new BigDecimal(0));
-                studentPaymentOrder.setUpdateTime(date);
-                studentPaymentOrder.setOrganId(organId);
-                studentPaymentOrder.setRoutingOrganId(organId);
-                studentPaymentOrderService.update(studentPaymentOrder);
-                sysUserCashAccountService.updateBalance(userId, amount.negate(), PlatformCashAccountDetailTypeEnum.PAY_FEE, "乐团续费");
-                amount = BigDecimal.ZERO;
-            } else {
-                if (userCashAccount.getBalance().doubleValue() > 0) {
-                    balance = userCashAccount.getBalance();
-                    sysUserCashAccountService.updateBalance(userId, balance.negate(), PlatformCashAccountDetailTypeEnum.PAY_FEE, "乐团续费");
-                    amount = amount.subtract(userCashAccount.getBalance());
-                    studentPaymentOrder.setBalancePaymentAmount(userCashAccount.getBalance());
-                    studentPaymentOrder.setActualAmount(studentPaymentOrder.getActualAmount().subtract(userCashAccount.getBalance()));
-                } else {
-                    studentPaymentOrder.setBalancePaymentAmount(new BigDecimal(0));
-                }
-            }
-        }
-        String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
-
-        if (amount.compareTo(BigDecimal.ZERO) == 0) {
-            studentPaymentRouteOrderService.addRouteOrder(orderNo, organId, balance);
-            Map<String, String> notifyMap = new HashMap<>(4);
-            notifyMap.put("tradeState", "1");
-            notifyMap.put("merOrderNo", studentPaymentOrder.getOrderNo());
-            notifyMap.put("channelType", "");
-            notifyMap.put("orderNo", "");
-            studentPaymentOrderService.updateOrder(notifyMap);
-            return notifyMap;
-        }
-
-        Map<String, Object> payMap = payService.getPayMap(
-                amount,
-                balance,
-                orderNo,
-                baseApiUrl + "/api-student/studentOrder/notify",
-                baseApiUrl + "/api-student/studentOrder/paymentResult?orderNo=" + studentPaymentOrder.getOrderNo(),
-                "续费",
-                "乐团续费",
-                organId,
-                "renew"
-        );
-
-        studentPaymentOrder.setActualAmount(amount);
-        studentPaymentOrder.setOrganId(organId);
-        studentPaymentOrder.setMerNos((String) payMap.get("routingMerNos"));
-        studentPaymentOrder.setPaymentChannel((String) payMap.get("type"));
-        studentPaymentOrder.setUpdateTime(date);
-        studentPaymentOrderService.update(studentPaymentOrder);
-        return payMap;
-    }
-
-    @Override
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public boolean renewForCallback(StudentPaymentOrder studentPaymentOrder) throws IOException {
-
         int updateNum = studentPaymentOrderService.update(studentPaymentOrder);
         if (updateNum <= 0) {
             throw new BizException("订单更新失败");
@@ -3131,14 +3064,10 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
         Date date = new Date();
         StudentRegistration studentRegistration = studentRegistrationDao.queryByUserIdAndMusicGroupId(userId, musicGroupId);
-        Map<Integer, String> yimei = new HashMap<>(1);
-        Map<Integer, String> push = new HashMap<>(1);
-        push.put(userId, userId.toString());
-        yimei.put(userId, studentRegistration.getParentsPhone());
-
         MusicGroupPaymentCalenderDetail calenderDetail = musicGroupPaymentCalenderDetailDao.findByOrderId(studentPaymentOrder.getId());
         
         if (studentPaymentOrder.getStatus() == SUCCESS) {
+            MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
             //当前乐团报名是否赠送乐团网管课
             MusicGroupStudentFee musicGroupStudentFee = musicGroupPaymentCalenderService.updateCalender(calenderDetail.getId(), studentRegistration.getUserId());
             if (musicGroupStudentFee != null) {
@@ -3155,45 +3084,66 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 studentRegistration.setMusicGroupStatus(StudentMusicGroupStatusEnum.NORMAL);
                 studentRegistration.setMusicGroupPaymentCalenderId(paymentCalender.getId());
                 studentRegistrationDao.update(studentRegistration);
-                
                 //统计变更学员数
                 groupEventSource.musicGroupStudentChangeEvent(studentRegistration.getMusicGroupId(), StudentMusicGroupStatusEnum.NORMAL, new ArrayList<>(Arrays.asList(userId)));
             }
 
-            List<StudentPaymentOrderDetail> paymentOrderDetails = new ArrayList<>();
+            //缴费项目详情
+            musicGroupPaymentCalenderDetailService.addCalenderDetail(studentPaymentOrder, studentRegistration);
+
+            List<StudentPaymentOrderDetail> allDetails = studentPaymentOrderDetailService.getOrderGoodsDetail(studentPaymentOrder.getId());
+            BigDecimal courseFee = allDetails.stream().filter(o -> !(o.getType() == MUSICAL)
+                    && !(o.getType() == VIP)
+                    && !(o.getType() == PRACTICE)
+                    && !(o.getType() == MAINTENANCE)
+                    && !(o.getType() == CLOUD_TEACHER)
+                    && !(o.getType() == CLOUD_TEACHER)
+                    && !(o.getType() == ACCESSORIES))
+                    .map(o -> o.getPrice().subtract(o.getRemitFee() == null ? BigDecimal.ZERO : o.getRemitFee()))
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+            //销售订单详情
+            if (allDetails.size() > 0) {
+                BigDecimal couponRemitFee = studentPaymentOrder.getCouponRemitFee();
+                if(couponRemitFee.compareTo(BigDecimal.ZERO) > 0){
+                    BigDecimal musicFee = allDetails.stream().filter(o -> o.getType()==MUSICAL
+                            || o.getType()==ACCESSORIES || o.getType()==TEACHING)
+                            .map(o -> o.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    BigDecimal expectAmount = studentPaymentOrder.getExpectAmount();
+                    //获取比例
+                    BigDecimal ratioAmount = musicFee.divide(expectAmount, 6, BigDecimal.ROUND_HALF_UP);
+                    //获取分配的减免金额
+                    couponRemitFee = couponRemitFee.multiply(ratioAmount).setScale(2, BigDecimal.ROUND_HALF_UP);
+                }
+                sellOrderService.addOrderDetail2SellOrder(allDetails, studentPaymentOrder, musicGroup,couponRemitFee);
+            }
 
-			// 查询会员订单信息
-			CloudTeacherOrder cloudTeacherOrder = cloudTeacherOrderService.queryByOrderId(studentPaymentOrder.getId());
-			if (cloudTeacherOrder != null) {
-				Student student = studentService.getLocked(userId);
-				if (student == null) {
-					throw new BizException("学员信息不存在");
-				}
-				cloudTeacherOrder.setStatus(1);
-				cloudTeacherOrder.setUpdateTime(date);
-//				if (student.getMemberRankSettingId() == null || date.after(student.getMembershipEndTime())) {
-//					cloudTeacherOrder.setStartTime(date);
-//                    cloudTeacherOrder.setEndTime(studentService.getMembershipEndTime(cloudTeacherOrder.getType(),date, cloudTeacherOrder.getTime()));
-//				} else {
-//					cloudTeacherOrder.setStartTime(DateUtil.addDays(student.getMembershipEndTime(), 1));
-//                    cloudTeacherOrder.setEndTime(studentService.getMembershipEndTime(cloudTeacherOrder.getType(),student.getMembershipEndTime(), cloudTeacherOrder.getTime()));
-//				}
-
-                cloudTeacherOrder.setAmount(calenderDetail.getExpectMemberAmount());
-				cloudTeacherOrderService.update(cloudTeacherOrder);
-				// 添加会员有效时长
-//				studentService.updateMemberRank(cloudTeacherOrder);
-				
-				//添加订单明细
-				StudentPaymentOrderDetail studentPaymentOrderDetail = new StudentPaymentOrderDetail();
-                studentPaymentOrderDetail.setType(OrderDetailTypeEnum.CLOUD_TEACHER);
-                studentPaymentOrderDetail.setPrice(cloudTeacherOrder.getAmount());
-                studentPaymentOrderDetail.setCreateTime(date);
-                studentPaymentOrderDetail.setUpdateTime(date);
-                studentPaymentOrderDetail.setPaymentOrderId(studentPaymentOrder.getId());
-                
-                paymentOrderDetails.add(studentPaymentOrderDetail);
-			}
+            //活动小课包处理
+            List<StudentPaymentOrderDetail> activity = allDetails.stream().filter(o -> o.getType()==PRACTICE || o.getType() == VIP).collect(Collectors.toList());
+            if(activity != null && activity.size() > 0){
+                activityUserMapperService.addOrderDetail2Activity(studentPaymentOrder,activity);
+            }
+
+            //学生乐器与月保处理
+            StudentPaymentOrderDetail repair = allDetails.stream().filter(o -> o.getType()==MAINTENANCE).findFirst().get();
+            if(repair != null){
+                BigDecimal repairFee = allDetails.stream() .filter(o -> o.getType()==MAINTENANCE)
+                        .map(o -> o.getPrice().subtract(o.getRemitFee() == null ? BigDecimal.ZERO : o.getRemitFee()))
+                        .reduce(BigDecimal.ZERO, BigDecimal::add);
+                StudentPaymentOrderDetail musical = allDetails.stream().filter(o -> o.getType()==MUSICAL).findFirst().get();
+                Long studentInstrumentId = studentInstrumentService.addOrderDetail2Instrument(studentPaymentOrder, repairFee, Integer.valueOf(musical.getGoodsIdList()));
+                repair.setStudentInstrumentId(studentInstrumentId);
+                studentPaymentOrderDetailDao.update(repair);
+            }
+
+            //学生云教练处理
+            StudentPaymentOrderDetail cloudTeacher = allDetails.stream().filter(o -> o.getType()==CLOUD_TEACHER).findFirst().get();
+            if(cloudTeacher != null){
+                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);
+            }
 
             //插入交易明细
             SysUserCashAccount cashAccount = sysUserCashAccountService.get(userId);
@@ -3213,50 +3163,6 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             rechargeDetail.setComAmount(studentPaymentOrder.getComAmount());
             rechargeDetail.setPerAmount(studentPaymentOrder.getPerAmount());
             sysUserCashAccountDetailService.insert(rechargeDetail);
-
-            //不包含云教练费用
-            BigDecimal courseFee = BigDecimal.ZERO;
-            //跨团合班没有settings
-            if(paymentCalender.getPaymentType() == PaymentType.SPAN_GROUP_CLASS_ADJUST){
-                List<MusicGroupPaymentCalenderStudentDetail> studentDetails = musicGroupPaymentCalenderStudentDetailDao.findByBatchNoAndUserId(paymentCalender.getBatchNo(), userId);
-                for (MusicGroupPaymentCalenderStudentDetail studentDetail : studentDetails) {
-                    StudentPaymentOrderDetail studentPaymentOrderDetail = new StudentPaymentOrderDetail();
-                    studentPaymentOrderDetail.setType(OrderDetailTypeEnum.valueOf(studentDetail.getCourseType()));
-                    studentPaymentOrderDetail.setPrice(studentDetail.getCourseCurrentPrice());
-                    studentPaymentOrderDetail.setCreateTime(date);
-                    studentPaymentOrderDetail.setUpdateTime(date);
-                    studentPaymentOrderDetail.setPaymentOrderId(studentPaymentOrder.getId());
-                    paymentOrderDetails.add(studentPaymentOrderDetail);
-                    courseFee = courseFee.add(studentDetail.getCourseCurrentPrice());
-                }
-            } else {
-                List<MusicGroupPaymentStudentCourseDetail> studentCourseDetails = musicGroupPaymentStudentCourseDetailDao.findByCalenderAndUserId(calenderDetail.getMusicGroupPaymentCalenderId(), userId);
-                for (MusicGroupPaymentStudentCourseDetail e : studentCourseDetails) {
-                    StudentPaymentOrderDetail studentPaymentOrderDetail = new StudentPaymentOrderDetail();
-                    studentPaymentOrderDetail.setType(OrderDetailTypeEnum.valueOf(e.getCourseType().getCode()));
-                    studentPaymentOrderDetail.setPrice(e.getCourseCurrentPrice());
-                    studentPaymentOrderDetail.setCreateTime(date);
-                    studentPaymentOrderDetail.setUpdateTime(date);
-                    studentPaymentOrderDetail.setPaymentOrderId(studentPaymentOrder.getId());
-                    paymentOrderDetails.add(studentPaymentOrderDetail);
-                    courseFee = courseFee.add(e.getCourseCurrentPrice());
-                }
-            }
-            if (paymentOrderDetails.size() > 0) {
-                studentPaymentOrderDetailService.batchAdd(paymentOrderDetails,studentPaymentOrder.getCouponRemitFee());
-                //获取实际支付课程费用
-                courseFee = paymentOrderDetails.stream().filter(e->e.getType() != MUSICAL && e.getType() != ACCESSORIES
-                        && e.getType() != TEACHING && e.getType() != OTHER && e.getType() != DEGREE_REGISTRATION
-                        && e.getType() != MAINTENANCE && e.getType() != CLOUD_TEACHER && e.getType() != CLOUD_TEACHER_PLUS).map(t -> t.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
-                //获取云教练订单费用
-                if(cloudTeacherOrder != null){
-                    CloudTeacherOrder teacherOrder = cloudTeacherOrderService.get(cloudTeacherOrder.getId());
-                    BigDecimal cloudTeacherFee = paymentOrderDetails.stream().filter(e->e.getType() == CLOUD_TEACHER).map(t -> t.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
-                    teacherOrder.setAmount(cloudTeacherFee);
-                    cloudTeacherOrderService.update(teacherOrder);
-                }
-            }
-
             //缴费
             SysUserCashAccountDetail paymentDetail = new SysUserCashAccountDetail();
             paymentDetail.setAmount(amount.negate());
@@ -3270,7 +3176,6 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             paymentDetail.setUserId(userId);
             paymentDetail.setChannel(studentPaymentOrder.getPaymentChannel());
             sysUserCashAccountDetailService.insert(paymentDetail);
-            MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
 
             studentRegistrationService.updateUserSurplusCourseFee(userId, musicGroupId, courseFee, "乐团续费", userId);
 
@@ -3280,6 +3185,10 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 logger.error("产品协议生成失败", e);
             }
             if (musicGroup.getOwnershipType() != null && musicGroup.getOwnershipType() == CooperationOrgan.OwnershipType.OWN) {
+                Map<Integer, String> yimei = new HashMap<>(1);
+                Map<Integer, String> push = new HashMap<>(1);
+                push.put(userId, userId.toString());
+                yimei.put(userId, studentRegistration.getParentsPhone());
                 // 发送续费结果通知
                 sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SMS_PUSH_MUSIC_GROUP_RENEW_SUCCESS, push, null, 0, "1", "STUDENT",
                         studentRegistration.getName(), studentPaymentOrder.getActualAmount());
@@ -3288,7 +3197,6 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             }
             return true;
         } else {
-
     		//更新学生的缴费记录状态
     		calenderDetail.setPaymentStatus(MusicGroupStudentFee.PaymentStatus.NON_PAYMENT);
     		calenderDetail.setUpdateTime(date);
@@ -3299,17 +3207,6 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                         "乐团续费失败");
             }
         }
-        /*MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
-        if (musicGroup.getOwnershipType() != null && musicGroup.getOwnershipType() == CooperationOrgan.OwnershipType.OWN) {
-            if (studentPaymentOrder.getStatus() == CLOSE || studentPaymentOrder.getStatus() == DealStatusEnum.FAILED) {
-                String baseUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
-                String memo = baseUrl + "/#/renew?musicGroupId=" + musicGroupId;
-                //4?http://mstudev.dayaedu.com/#/renew?musicGroupId=" +musicGroupId
-                sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_MUSIC_GROUP_RENEW_FAILED, push, null, 0, "4?" + memo, "STUDENT",
-                        HttpUtil.getSortUrl(memo));
-                return false;
-            }
-        }*/
         return false;
     }
 
@@ -3897,7 +3794,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public List<StudentRegistration> addMusicGroupRegs(String musicGroupId, List<Long> registerIds) throws Exception {
+    public HttpResponseResult addMusicGroupRegs(String musicGroupId, List<Long> registerIds) throws Exception {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null || sysUser.getId() == null) {
             throw new BizException("获取用户信息失败");
@@ -3976,7 +3873,10 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             registerPayDto.setNewCourse(courseSettings);
             for (StudentRegistration studentRegistration : studentRegistrationList) {
                 registerPayDto.setRegisterId(studentRegistration.getId().intValue());
-                Map payMap = this.pay(registerPayDto);
+                HttpResponseResult result = this.pay(registerPayDto);
+                if(result.getCode() != 200){
+                    return result;
+                }
             }
         }
 
@@ -3984,10 +3884,8 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
         musicGroup.setIsExtraClass(YesOrNoEnum.YES);
         musicGroupDao.update(musicGroup);
-
         musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId, "添加报名学员", sysUser.getId(), ""));
-
-        return studentRegistrationList;
+        return BaseController.succeed(studentRegistrationList);
     }
 
     @Override

+ 11 - 27
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupSubjectPlanServiceImpl.java

@@ -1,42 +1,26 @@
 package com.ym.mec.biz.service.impl;
 
-import java.math.BigDecimal;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.annotation.Resource;
-
-import com.ym.mec.biz.dal.dao.*;
-import com.ym.mec.biz.service.*;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import com.alibaba.fastjson.JSON;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.MusicGroupGoodsAndDiscountDto;
 import com.ym.mec.biz.dal.dto.MusicGroupRegRespDto;
 import com.ym.mec.biz.dal.dto.MusicGroupSubjectGoodsAndInfoDto;
-import com.ym.mec.biz.dal.entity.ChargeTypeSubjectMapper;
-import com.ym.mec.biz.dal.entity.CourseSchedule.CourseScheduleType;
-import com.ym.mec.biz.dal.entity.Goods;
-import com.ym.mec.biz.dal.entity.MusicGroup;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderCourseSettings;
-import com.ym.mec.biz.dal.entity.MusicGroupSubjectGoodsGroup;
-import com.ym.mec.biz.dal.entity.MusicGroupSubjectPlan;
-import com.ym.mec.biz.dal.entity.OrganizationCloudTeacherFee;
-import com.ym.mec.biz.dal.entity.OrganizationCourseUnitPriceSettings;
-import com.ym.mec.biz.dal.entity.Subject;
-import com.ym.mec.biz.dal.enums.CourseViewTypeEnum;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
 import com.ym.mec.biz.dal.enums.GoodsType;
+import com.ym.mec.biz.service.*;
 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.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
 
 @Service
 public class MusicGroupSubjectPlanServiceImpl extends BaseServiceImpl<Integer, MusicGroupSubjectPlan> implements MusicGroupSubjectPlanService {

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

@@ -4532,9 +4532,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
 				PayStatus payStatus = studentPaymentOrderService.queryPayStatus(applyOrder.getPaymentChannel(), applyOrder.getOrderNo(), applyOrder.getTransNo());
 				if(payStatus == PayStatus.SUCCESSED){
 					throw new BizException("订单已支付成功,请勿重复支付");
-				}/*else if(payStatus == PayStatus.PAYING){
-					throw new BizException("订单还在交易中,请稍后重试");
-				}*/
+				}
 				//处理关闭订单
 				applyOrder.setStatus(DealStatusEnum.CLOSE);
 				applyOrder.setMemo("主动关闭订单");
@@ -4546,7 +4544,6 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
 				sysCouponCodeService.quit(applyOrder.getCouponCodeId());
 			}
     		
-    		
         } else if (practiceGroup.getGroupStatus().equals(GroupStatusEnum.NORMAL)) {
             return BaseController.failed(HttpStatus.CREATED, "该订单已经支付成功");
         } else if (practiceGroup.getGroupStatus().equals(GroupStatusEnum.CANCEL)) {

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

@@ -236,6 +236,7 @@ public class SellOrderServiceImpl extends BaseServiceImpl<Integer, SellOrder> im
     @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
     public List<SellOrder> addOrderDetail2SellOrder(List<StudentPaymentOrderDetail> orderDetails,
                                                     StudentPaymentOrder studentPaymentOrder, MusicGroup musicGroup,BigDecimal musicRemitFee) {
+        Integer tenantId = studentPaymentOrder.getTenantId();
         List<SellOrder> sellOrders = new ArrayList<>();
         //总余额支付
         BigDecimal totalBalance = studentPaymentOrder.getBalancePaymentAmount() != null ? studentPaymentOrder.getBalancePaymentAmount() : BigDecimal.ZERO;
@@ -302,6 +303,7 @@ public class SellOrderServiceImpl extends BaseServiceImpl<Integer, SellOrder> im
                     if (sellOrder.getHasRoute()) {
                         continue;
                     }
+                    sellOrder.setTenantId(tenantId);
                     BigDecimal sellOrderExpectAmount = BigDecimal.ZERO;
                     BigDecimal sellOrderBalance = BigDecimal.ZERO;
                     if (complementPrice.compareTo(BigDecimal.ZERO) > 0) {

+ 4 - 35
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentInstrumentServiceImpl.java

@@ -304,47 +304,16 @@ public class StudentInstrumentServiceImpl extends BaseServiceImpl<Long, StudentI
     }
 
     @Override
-    public Boolean addOrderDetail2Instrument(StudentPaymentOrder order) {
-        List<OrderDetailTypeEnum> orderDetailTypes = new ArrayList<>();
-        orderDetailTypes.add(OrderDetailTypeEnum.MAINTENANCE);
-        orderDetailTypes.add(OrderDetailTypeEnum.MUSICAL);
-        List<StudentPaymentOrderDetail> orderDetails = studentPaymentOrderDetailDao.getOrderDetailByType(order.getId(), orderDetailTypes);
-        List<StudentPaymentOrderDetail> orderDetails4Instruments = orderDetails.stream()
-                .filter(e -> e.getType().equals(OrderDetailTypeEnum.MUSICAL))
-                .collect(Collectors.toList());
-        if (orderDetails4Instruments.size() <= 0) {
-            return false;
-        }
-        List<StudentPaymentOrderDetail> orderDetails4Maintenance = orderDetails.stream()
-                .filter(e -> e.getType().equals(OrderDetailTypeEnum.MAINTENANCE)).collect(Collectors.toList());
-
-        StudentPaymentOrderDetail maintenanceDetail = null;
-        int maintenanceStatus = 0;
-        Date startTime = null;
-        Date endTime = null;
-        if (orderDetails4Maintenance.size() > 0) {
-            maintenanceDetail = orderDetails4Maintenance.get(0);
-            //maintenanceStatus = 1;
-            startTime = new Date();
-            endTime = DateUtil.addYears(startTime, 1);
-        }
-
-        Integer goodsId = Integer.valueOf(orderDetails4Instruments.get(0).getGoodsIdList());
+    public Long addOrderDetail2Instrument(StudentPaymentOrder order, BigDecimal cloudTeacherFee,Integer goodsId) {
         StudentInstrument studentInstrument = new StudentInstrument();
         studentInstrument.setStudentId(order.getUserId());
         studentInstrument.setOrganId(order.getOrganId());
         studentInstrument.setGoodsId(goodsId);
-        studentInstrument.setStatus(maintenanceStatus);
+        studentInstrument.setStatus(1);
         studentInstrument.setOrderId(order.getId());
         studentInstrument.setChangeOrderId(order.getId());
-        //studentInstrument.setStartTime(startTime);
-        //studentInstrument.setEndTime(endTime);
-        addStudentInstrument(studentInstrument);
-        if (maintenanceDetail != null) {
-            maintenanceDetail.setStudentInstrumentId(studentInstrument.getId());
-            studentPaymentOrderDetailDao.update(maintenanceDetail);
-        }
-        return true;
+        studentInstrument.setTenantId(order.getTenantId());
+        return addStudentInstrument(studentInstrument).getId();
     }
 
     @Override

+ 27 - 19
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java

@@ -16,12 +16,16 @@ import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.service.*;
 
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.util.excel.POIUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 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.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
@@ -185,11 +189,6 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
 		return payMap;
 	}
 
-	@Override
-    public List<Goods> queryApplyGoodsList(String musicGroupId, OrderDetailTypeEnum type) {
-        return studentPaymentOrderDao.queryApplyGoodsList(musicGroupId, type);
-    }
-
     @Override
     public List<StudentPaymentOrder> queryByCondition(GroupType groupType, String musicGroupId, Integer userId, DealStatusEnum status, OrderTypeEnum type) {
         return studentPaymentOrderDao.queryByCondition(groupType, musicGroupId, userId, status, type);
@@ -374,7 +373,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
             order.setTransNo(rpMap.get("orderNo"));
         }
         order.setPaymentBusinessChannel(rpMap.get("channelType"));
-
+        order.setTenantId(this.get(order.getId()).getTenantId());
         callOrderCallBack(order);
 
         if (status.equals(DealStatusEnum.SUCCESS)
@@ -490,12 +489,6 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         }
     }
 
-    @Override
-    public Integer findOrderByGroupType(Integer userId, Integer sporadicId, String sporadic, DealStatusEnum status) {
-        return studentPaymentOrderDao.findOrderByGroupType(userId, sporadicId, sporadic, status);
-    }
-
-
     private void closeOrders(List<String> orderNoList) throws Exception {
         if (orderNoList.size() == 0) {
             return;
@@ -545,13 +538,6 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     }
 
     @Override
-    public StudentPaymentOrder getOrderMoneyAmount(StudentPaymentOrderQueryInfo queryInfo) {
-        Map<String, Object> params = new HashMap<String, Object>();
-        MapUtil.populateMap(params, queryInfo);
-        return studentPaymentOrderDao.getOrderMoneyAmount(params);
-    }
-
-    @Override
     public PageInfoOrder<StudentPaymentOrderDto> OrderQueryPage(StudentPaymentOrderQueryInfo queryInfo) {
         PageInfoOrder<StudentPaymentOrderDto> pageInfo = new PageInfoOrder<>(queryInfo.getPage(), queryInfo.getRows());
         Map<String, Object> params = new HashMap<String, Object>();
@@ -789,4 +775,26 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         }
         return activityUserMapperId;
     }
+
+    @Override
+    public HttpResponseResult checkRepeatPay(StudentPaymentOrder order, Boolean repeatPay) throws Exception {
+        // 查询订单状态
+        PayStatus payStatus = this.queryPayStatus(order.getPaymentChannel(), order.getOrderNo(), order.getTransNo());
+        if(payStatus == PayStatus.SUCCESSED){
+            throw new BizException("订单已支付成功,请勿重复支付");
+        }
+        if(!repeatPay){
+            return BaseController.failed(HttpStatus.CONTINUE, "您有待支付的订单,是否继续支付");
+        }
+        //处理关闭订单
+        order.setStatus(DealStatusEnum.CLOSE);
+        order.setMemo("关闭订单");
+        if (order.getBalancePaymentAmount() != null && order.getBalancePaymentAmount().compareTo(BigDecimal.ZERO) > 0) {
+            sysUserCashAccountService.updateBalance(order.getUserId(), order.getBalancePaymentAmount(),
+                    PlatformCashAccountDetailTypeEnum.REFUNDS, "订单主动关闭退费");
+        }
+        studentPaymentOrderDao.update(order);
+        sysCouponCodeService.quit(order.getCouponCodeId());
+        return BaseController.succeed();
+    }
 }

+ 103 - 231
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java

@@ -2,6 +2,7 @@ package com.ym.mec.biz.service.impl;
 
 import static com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus.NON_PAYMENT;
 import static com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus.PAID_COMPLETED;
+import static com.ym.mec.biz.dal.enums.OrderDetailTypeEnum.*;
 import static com.ym.mec.biz.dal.enums.PaymentStatusEnum.YES;
 
 import java.io.IOException;
@@ -22,6 +23,7 @@ import javax.annotation.Resource;
 
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.constant.CommonConstants;
@@ -42,34 +44,6 @@ import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.entity.SysUserRole;
 import com.ym.mec.auth.api.enums.CertificateTypeEnum;
-import com.ym.mec.biz.dal.entity.ClassGroup;
-import com.ym.mec.biz.dal.entity.ClassGroupStudentMapper;
-import com.ym.mec.biz.dal.entity.CloudTeacherOrder;
-import com.ym.mec.biz.dal.entity.CooperationOrgan;
-import com.ym.mec.biz.dal.entity.CourseSchedule;
-import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
-import com.ym.mec.biz.dal.entity.Goods;
-import com.ym.mec.biz.dal.entity.MusicGroup;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderCourseSettings;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderStudentDetail;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentStudentCourseDetail;
-import com.ym.mec.biz.dal.entity.MusicGroupStudentFee;
-import com.ym.mec.biz.dal.entity.MusicGroupSubjectGoodsGroup;
-import com.ym.mec.biz.dal.entity.MusicGroupSubjectPlan;
-import com.ym.mec.biz.dal.entity.Organization;
-import com.ym.mec.biz.dal.entity.OrganizationCloudTeacherFee;
-import com.ym.mec.biz.dal.entity.Student;
-import com.ym.mec.biz.dal.entity.StudentCourseFeeDetail;
-import com.ym.mec.biz.dal.entity.StudentInstrument;
-import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
-import com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail;
-import com.ym.mec.biz.dal.entity.StudentRegistration;
-import com.ym.mec.biz.dal.entity.Subject;
-import com.ym.mec.biz.dal.entity.SubjectChange;
-import com.ym.mec.biz.dal.entity.SysUserCashAccount;
-import com.ym.mec.biz.dal.entity.SysUserCashAccountDetail;
 import com.ym.mec.biz.dal.enums.ClassGroupStudentStatusEnum;
 import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
 import com.ym.mec.biz.dal.enums.CourseStatusEnum;
@@ -166,6 +140,8 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
     @Autowired
     private MusicGroupPaymentCalenderDetailDao musicGroupPaymentCalenderDetailDao;
     @Autowired
+    private MusicGroupPaymentCalenderDetailService musicGroupPaymentCalenderDetailService;
+    @Autowired
     private MusicGroupPaymentCalenderDao musicGroupPaymentCalenderDao;
     @Autowired
     private MusicGroupPaymentStudentCourseDetailDao musicGroupPaymentStudentCourseDetailDao;
@@ -188,13 +164,19 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
     @Autowired
     private StudentInstrumentDao studentInstrumentDao;
     @Autowired
-    private OrganizationCloudTeacherFeeDao organizationCloudTeacherFeeDao;
+    private MusicGroupPaymentCalenderStudentDetailDao musicGroupPaymentCalenderStudentDetailDao;
     @Autowired
     private CloudTeacherOrderService cloudTeacherOrderService;
     @Autowired
     private SysCouponCodeService sysCouponCodeService;
     @Autowired
     private SysUserCashAccountLogService sysUserCashAccountLogService;
+    @Autowired
+    private ActivityUserMapperService activityUserMapperService;
+    @Autowired
+    private MusicGroupPaymentCalenderActivityService musicGroupPaymentCalenderActivityService;
+    @Autowired
+    private MusicGroupPaymentCalenderMemberService musicGroupPaymentCalenderMemberService;
 
     @Override
     public BaseDAO<Long, StudentRegistration> getDAO() {
@@ -371,7 +353,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
 			map.put(OrderDetailTypeEnum.MUSICAL.getCode(), BigDecimal.ZERO);
 		}
 
-		if (detailMap.containsKey(OrderDetailTypeEnum.MAINTENANCE)) {
+		if (detailMap.containsKey(MAINTENANCE)) {
 
 			BigDecimal totalAmount = BigDecimal.ZERO;
 
@@ -384,7 +366,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
 			if (studentPaymentOrderDetailList != null && studentPaymentOrderDetailList.size() > 0) {
 
 				Map<Long, StudentPaymentOrderDetail> maintenanceMap = studentPaymentOrderDetailList.stream()
-						.filter(t -> (t.getType() == OrderDetailTypeEnum.MAINTENANCE))
+						.filter(t -> (t.getType() == MAINTENANCE))
 						.collect(Collectors.toMap(t -> t.getStudentInstrumentId(), StudentPaymentOrderDetail -> StudentPaymentOrderDetail));
 
 				List<Long> instrumentIdList = new ArrayList<Long>(maintenanceMap.keySet());
@@ -402,9 +384,9 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
 					}
 				}
 			}
-			map.put(OrderDetailTypeEnum.MAINTENANCE.getCode(), sysUserCashAccountLogService.musicReturnFeeCharges(totalAmount,0));
+			map.put(MAINTENANCE.getCode(), sysUserCashAccountLogService.musicReturnFeeCharges(totalAmount,0));
 		} else {
-			map.put(OrderDetailTypeEnum.MAINTENANCE.getCode(), BigDecimal.ZERO);
+			map.put(MAINTENANCE.getCode(), BigDecimal.ZERO);
 		}
 
 		if (detailMap.containsKey(OrderDetailTypeEnum.ACCESSORIES)) {
@@ -580,32 +562,16 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public StudentPaymentOrder addOrder(StudentRegistration studentRegistration, BigDecimal amount, String orderNo, String paymentChannel,
-                                        List<MusicGroupSubjectGoodsGroup> goodsGroups, BigDecimal remitFee, BigDecimal courseRemitFee,
-                                        List<MusicGroupPaymentCalenderCourseSettings> newCourses, Boolean buyMaintenance, Boolean buyCloudTeacher, Boolean buyCloudTeacherPlus,List<Integer> couponIdList) throws Exception {
+    public StudentPaymentOrder addOrder(StudentRegistration studentRegistration, StudentPaymentOrder studentPaymentOrder,
+                                        MusicGroupApplyGoodsDto goodsDto,RegisterPayDto registerPayDto) throws Exception {
         Date date = new Date();
-        StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(couponIdList,amount,true);
-        studentPaymentOrder.setUserId(studentRegistration.getUserId());
-        studentPaymentOrder.setGroupType(GroupType.MUSIC);
-        studentPaymentOrder.setOrderNo(orderNo);
-        studentPaymentOrder.setType(OrderTypeEnum.APPLY);
-        studentPaymentOrder.setStatus(DealStatusEnum.ING);
-        studentPaymentOrder.setPaymentChannel(paymentChannel);
-        studentPaymentOrder.setMusicGroupId(studentRegistration.getMusicGroupId());
-        studentPaymentOrderService.insert(studentPaymentOrder);
-
         ArrayList<StudentPaymentOrderDetail> studentPaymentOrderDetailList = new ArrayList<>();
-        /*StudentPaymentOrderDetail studentPaymentOrderDetail = new StudentPaymentOrderDetail();
-        studentPaymentOrderDetail.setType(OrderDetailTypeEnum.COURSE);
-        studentPaymentOrderDetail.setPrice(BigDecimal.ZERO);
-        studentPaymentOrderDetail.setRemitFee(BigDecimal.ZERO);
-        studentPaymentOrderDetail.setCreateTime(date);
-        studentPaymentOrderDetail.setUpdateTime(date);
-        studentPaymentOrderDetail.setPaymentOrderId(studentPaymentOrder.getId());
-        studentPaymentOrderDetailList.add(studentPaymentOrderDetail);*/
         Integer tenantId = TenantContextHolder.getTenantId();
         //乐器及打包辅件
         String maintenanceGoodsId = "";
+        List<MusicGroupSubjectGoodsGroup> goodsGroups = goodsDto.getGoodsGroups();
+        List<MusicGroupPaymentCalenderCourseSettings> newCourses = goodsDto.getNewCourses();
+        BigDecimal remitFee = goodsDto.getRemitFee();
         if (goodsGroups != null && goodsGroups.size() > 0) {
             for (MusicGroupSubjectGoodsGroup goodsGroup : goodsGroups) {
                 StudentPaymentOrderDetail studentPaymentOrderDetail4goodsGroup = new StudentPaymentOrderDetail();
@@ -624,7 +590,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
                 
                 BigDecimal goodsPrice = new BigDecimal(0);
                 
-                if(studentRegistration.getOrganId() == 55 && (newCourses == null || newCourses.size() == 0) && !(buyCloudTeacher || buyCloudTeacherPlus)){
+                if(studentRegistration.getOrganId() == 55 && (newCourses == null || newCourses.size() == 0) && !registerPayDto.getBuyCloudTeacher()){
                 	//取商品零售价
                     if (StringUtils.isNotBlank(goodsGroup.getGoodsIdList())) {
                     	List<Goods> goodsList = goodsDao.findGoodsByIds(goodsGroup.getGoodsIdList());
@@ -636,7 +602,6 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
                 	goodsPrice = goodsGroup.getPrice();
                 }
                 studentPaymentOrderDetail4goodsGroup.setPrice(goodsPrice);
-                
                 studentPaymentOrderDetail4goodsGroup.setGoodsIdList(goodsGroup.getGoodsIdList());
                 studentPaymentOrderDetail4goodsGroup.setCreateTime(date);
                 studentPaymentOrderDetail4goodsGroup.setUpdateTime(date);
@@ -651,10 +616,11 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
 
         //新的课程形态
         if (newCourses != null && newCourses.size() > 0) {
+            BigDecimal courseRemitFee = goodsDto.getCourseRemitFee();
             for (MusicGroupPaymentCalenderCourseSettings newCourse : newCourses) {
                 StudentPaymentOrderDetail studentPaymentOrderDetailCourse = new StudentPaymentOrderDetail();
                 studentPaymentOrderDetailCourse.setType(OrderDetailTypeEnum.valueOf(newCourse.getCourseType().getCode()));
-                if (courseRemitFee.compareTo(BigDecimal.ZERO) > 0 && !newCourse.getIsStudentOptional()) {
+                if (courseRemitFee.compareTo(BigDecimal.ZERO) > 0) {
                     studentPaymentOrderDetailCourse.setPrice(BigDecimal.ZERO);
                     studentPaymentOrderDetailCourse.setRemitFee(newCourse.getCourseCurrentPrice());
                 } else {
@@ -667,7 +633,23 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
                 studentPaymentOrderDetailList.add(studentPaymentOrderDetailCourse);
             }
         }
-        if (buyMaintenance) {
+
+        //合班缴费
+        List<MusicGroupPaymentCalenderStudentDetail> studentDetails = musicGroupPaymentCalenderStudentDetailDao.findByBatchNoAndUserId(registerPayDto.getBatchNo(), studentPaymentOrder.getUserId());
+        if(studentDetails != null && studentDetails.size() > 0){
+            for (MusicGroupPaymentCalenderStudentDetail studentDetail : studentDetails) {
+                StudentPaymentOrderDetail studentPaymentOrderDetail = new StudentPaymentOrderDetail();
+                studentPaymentOrderDetail.setType(OrderDetailTypeEnum.valueOf(studentDetail.getCourseType()));
+                studentPaymentOrderDetail.setPrice(studentDetail.getCourseCurrentPrice());
+                studentPaymentOrderDetail.setCreateTime(date);
+                studentPaymentOrderDetail.setUpdateTime(date);
+                studentPaymentOrderDetail.setPaymentOrderId(studentPaymentOrder.getId());
+                studentPaymentOrderDetailList.add(studentPaymentOrderDetail);
+            }
+        }
+
+        //乐保
+        if (registerPayDto.getBuyMaintenance()) {
             if ("".equals(maintenanceGoodsId)) {
                 throw new BizException("有乐器才能购买乐保,请核查");
             }
@@ -677,7 +659,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
             }
             BigDecimal maintenancePrice = new BigDecimal(configValue);
             StudentPaymentOrderDetail maintenanceOrderDetail = new StudentPaymentOrderDetail();
-            maintenanceOrderDetail.setType(OrderDetailTypeEnum.MAINTENANCE);
+            maintenanceOrderDetail.setType(MAINTENANCE);
             maintenanceOrderDetail.setPrice(maintenancePrice);
             maintenanceOrderDetail.setRemitFee(BigDecimal.ZERO);
             maintenanceOrderDetail.setCreateTime(date);
@@ -686,30 +668,33 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
             maintenanceOrderDetail.setIsRenew(0);
             studentPaymentOrderDetailList.add(maintenanceOrderDetail);
         }
-
+        //活动
+        List<Long> buyCalenderActivityId = registerPayDto.getBuyCalenderActivityId();
+        if (buyCalenderActivityId != null && buyCalenderActivityId.size() > 0) {
+            List<MusicGroupPaymentCalenderActivity> calenderActivities = musicGroupPaymentCalenderActivityService.findByIds(buyCalenderActivityId);
+            for (MusicGroupPaymentCalenderActivity calenderActivity : calenderActivities) {
+                StudentPaymentOrderDetail maintenanceOrderDetail = new StudentPaymentOrderDetail();
+                maintenanceOrderDetail.setType("网管课".equals(calenderActivity.getCategoryName())?PRACTICE:VIP);
+                maintenanceOrderDetail.setPrice(calenderActivity.getActualAmount());
+                maintenanceOrderDetail.setRemitFee(BigDecimal.ZERO);
+                maintenanceOrderDetail.setCreateTime(date);
+                maintenanceOrderDetail.setUpdateTime(date);
+                maintenanceOrderDetail.setPaymentOrderId(studentPaymentOrder.getId());
+                maintenanceOrderDetail.setIsRenew(0);
+                //保存的是活动编号
+                maintenanceOrderDetail.setStudentInstrumentId(calenderActivity.getId());
+                studentPaymentOrderDetailList.add(maintenanceOrderDetail);
+            }
+        }
         MusicGroup musicGroup = musicGroupDao.get(studentRegistration.getMusicGroupId());
         
         //云教练/云教练+
-        if (buyCloudTeacher || buyCloudTeacherPlus) {
-        	
-        	BigDecimal cloudTeacherPrice = BigDecimal.ZERO;
-        	
-        	if(musicGroup.getCloudTeacherType() != null){
-        		OrganizationCloudTeacherFee cloudTeacher = organizationCloudTeacherFeeDao.getByOrganId(studentRegistration.getOrganId());
-                cloudTeacherPrice = musicGroup.getCloudTeacherType() == 0 ? cloudTeacher.getPrice() : cloudTeacher.getPlusPrice();
-        	}else {
-        		MusicGroupPaymentCalender musicGroupRegCalender = musicGroupPaymentCalenderDao.getMusicGroupRegCalender(studentRegistration.getMusicGroupId());
-                if(musicGroupRegCalender == null){
-                	throw new BizException("缴费信息不存在");
-                }
-                
-                cloudTeacherPrice = musicGroupRegCalender.getMemberPaymentAmount();
-        	}
-            
+        if (registerPayDto.getBuyCloudTeacher()) {
+            MusicGroupPaymentCalenderMember calenderMember = musicGroupPaymentCalenderMemberService.findByCalenderId(studentPaymentOrder.getCalenderId());
             OrderDetailTypeEnum orderDetailTypeEnum = OrderDetailTypeEnum.CLOUD_TEACHER;
             StudentPaymentOrderDetail cloudTeacherOrderDetail = new StudentPaymentOrderDetail();
             cloudTeacherOrderDetail.setType(orderDetailTypeEnum);
-            cloudTeacherOrderDetail.setPrice(cloudTeacherPrice);
+            cloudTeacherOrderDetail.setPrice(calenderMember.getActualAmount());
             cloudTeacherOrderDetail.setRemitFee(BigDecimal.ZERO);
             cloudTeacherOrderDetail.setCreateTime(date);
             cloudTeacherOrderDetail.setUpdateTime(date);
@@ -731,7 +716,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
 
 			int paidNum = musicOneSubjectClassPlan.getPaidStudentNum() == null ? 0 : musicOneSubjectClassPlan.getPaidStudentNum();
 			int paidZeroNum = musicOneSubjectClassPlan.getPaidZeroNum() == null ? 0 : musicOneSubjectClassPlan.getPaidZeroNum();
-			if ((musicGroup.getCourseViewType().equals(CourseViewTypeEnum.MEMBER_FEE) && !buyCloudTeacher && StringUtils.isBlank(maintenanceGoodsId))) {
+			if ((musicGroup.getCourseViewType().equals(CourseViewTypeEnum.MEMBER_FEE) && !registerPayDto.getBuyCloudTeacher() && StringUtils.isBlank(maintenanceGoodsId))) {
 				if (studentRegistration.getPaymentStatus() != YES) {
 					paidZeroFlag = true;
 				}
@@ -1107,6 +1092,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         if (updateCount <= 0) {
             throw new BizException("订单更新失败");
         }
+        Integer tenantId = studentPaymentOrder.getTenantId();
         Date nowDate = new Date();
 
         //成功报名状态变更
@@ -1121,51 +1107,32 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
                 studentRegistration.setTemporaryCourseFee(new BigDecimal(0));
             }
             studentRegistration.setPaymentStatus(YES);
+            studentRegistration.setMusicGroupStatus(StudentMusicGroupStatusEnum.NORMAL);
             
             if (studentPaymentOrder.getClassGroupId() == null || !studentPaymentOrder.getClassGroupId().equals(206)) {
                 studentRegistration.setPayingStatus(0);
             }
 
-            List<StudentPaymentOrderDetail> orderDetails = studentPaymentOrderDetailService.getOrderGoodsDetail(studentPaymentOrder.getId());
-
-            List<Long> orderIdList = new ArrayList<Long>();
+            List<Long> orderIdList = new ArrayList<>();
             orderIdList.add(studentPaymentOrder.getId());
             List<StudentPaymentOrderDetail> allDetails = studentPaymentOrderDetailDao.getOrderDetailByOrderId(orderIdList);
-            BigDecimal courseFee = allDetails.stream().filter(o -> !o.getType().getCode().equals("MUSICAL"))
-                    .filter(o -> !o.getType().getCode().equals("ACCESSORIES"))
-                    .filter(o -> !o.getType().getCode().equals("MAINTENANCE"))
-                    .filter(o -> !o.getType().getCode().equals("CLOUD_TEACHER"))
-                    .filter(o -> !o.getType().getCode().equals("CLOUD_TEACHER_PLUS"))
+            BigDecimal courseFee = allDetails.stream().filter(o -> !(o.getType() == MUSICAL)
+                    && !(o.getType() == VIP)
+                    && !(o.getType() == PRACTICE)
+                    && !(o.getType() == MAINTENANCE)
+                    && !(o.getType() == CLOUD_TEACHER)
+                    && !(o.getType() == CLOUD_TEACHER)
+                    && !(o.getType() == ACCESSORIES))
                     .map(o -> o.getPrice().subtract(o.getRemitFee() == null ? BigDecimal.ZERO : o.getRemitFee()))
                     .reduce(BigDecimal.ZERO, BigDecimal::add);
             
-            //已购买内容
-            List<OrderDetailTypeEnum> orderTypeList = allDetails.stream().map(t -> t.getType()).collect(Collectors.toList());
-            
-			if (musicGroup.getCourseViewType() == CourseViewTypeEnum.MEMBER_FEE) {
-
-				if(studentRegistration.getNoneNeedCloudTeacher() == 1){
-					studentRegistration.setMusicGroupStatus(StudentMusicGroupStatusEnum.NORMAL);
-				}
-				
-				if (orderTypeList.contains(OrderDetailTypeEnum.CLOUD_TEACHER) || orderTypeList.contains(OrderDetailTypeEnum.CLOUD_TEACHER_PLUS)
-						|| orderTypeList.contains(OrderDetailTypeEnum.MUSICAL)) {
-					studentRegistration.setMusicGroupStatus(StudentMusicGroupStatusEnum.NORMAL);
-					//studentRegistration.setNoneNeedCloudTeacher(1);
-					if (orderTypeList.contains(OrderDetailTypeEnum.CLOUD_TEACHER) || orderTypeList.contains(OrderDetailTypeEnum.CLOUD_TEACHER_PLUS)) {
-						studentRegistration.setHasCloudTeacher(1);
-					}
-				}
-			} else {
-				studentRegistration.setMusicGroupStatus(StudentMusicGroupStatusEnum.NORMAL);
-			}
-
             //累加充值金额
             studentRegistration.setSurplusCourseFee(studentRegistration.getSurplusCourseFee().add(courseFee));
             studentRegistrationDao.update(studentRegistration);
 
             //添加日志
             StudentCourseFeeDetail studentCourseFeeDetail = new StudentCourseFeeDetail();
+            studentCourseFeeDetail.setTenantId(tenantId);
             studentCourseFeeDetail.setStudentRegistrationId(studentRegistration.getId());
             studentCourseFeeDetail.setAmount(courseFee);
             studentCourseFeeDetail.setSurplusCourseFee(studentRegistration.getSurplusCourseFee());
@@ -1190,6 +1157,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
             rechargeDetail.setChannel(studentPaymentOrder.getPaymentChannel());
             rechargeDetail.setComAmount(studentPaymentOrder.getComAmount());
             rechargeDetail.setPerAmount(studentPaymentOrder.getPerAmount());
+            rechargeDetail.setTenantId(tenantId);
             sysUserCashAccountDetailService.insert(rechargeDetail);
 
             //缴费
@@ -1208,14 +1176,16 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
                 rechargeDetail.setComAmount(studentPaymentOrder.getComAmount().negate());
                 rechargeDetail.setPerAmount(studentPaymentOrder.getPerAmount().negate());
             }
+            paymentDetail.setTenantId(tenantId);
             sysUserCashAccountDetailService.insert(paymentDetail);
 
+            List<StudentPaymentOrderDetail> orderDetails = studentPaymentOrderDetailService.getOrderGoodsDetail(studentPaymentOrder.getId());
             //销售订单详情
             if (orderDetails.size() > 0) {
                 BigDecimal couponRemitFee = studentPaymentOrder.getCouponRemitFee();
                 if(couponRemitFee.compareTo(BigDecimal.ZERO) > 0){
-                    BigDecimal musicFee = orderDetails.stream().filter(o -> o.getType().getCode().equals("MUSICAL")
-                            || o.getType().getCode().equals("ACCESSORIES") || o.getType().getCode().equals("TEACHING"))
+                    BigDecimal musicFee = orderDetails.stream().filter(o -> o.getType()==MUSICAL
+                            || o.getType()==ACCESSORIES || o.getType()==TEACHING)
                             .map(o -> o.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
                     BigDecimal expectAmount = studentPaymentOrder.getExpectAmount();
                     //获取比例
@@ -1227,16 +1197,34 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
             }
 
             //课程处理
-            addCalenderDetail(studentPaymentOrder, studentRegistration);
+            musicGroupPaymentCalenderDetailService.addCalenderDetail(studentPaymentOrder, studentRegistration);
+
+            //活动小课包处理
+            List<StudentPaymentOrderDetail> activity = allDetails.stream().filter(o -> o.getType()==PRACTICE || o.getType() == VIP).collect(Collectors.toList());
+            if(activity != null && activity.size() > 0){
+                activityUserMapperService.addOrderDetail2Activity(studentPaymentOrder,activity);
+            }
 
             //学生乐器与月保处理
-            studentInstrumentService.addOrderDetail2Instrument(studentPaymentOrder);
+            StudentPaymentOrderDetail repair = allDetails.stream().filter(o -> o.getType()==MAINTENANCE).findFirst().get();
+            if(repair != null){
+                BigDecimal repairFee = allDetails.stream() .filter(o -> o.getType()==MAINTENANCE)
+                        .map(o -> o.getPrice().subtract(o.getRemitFee() == null ? BigDecimal.ZERO : o.getRemitFee()))
+                        .reduce(BigDecimal.ZERO, BigDecimal::add);
+                StudentPaymentOrderDetail musical = allDetails.stream().filter(o -> o.getType()==MUSICAL).findFirst().get();
+                Long studentInstrumentId = studentInstrumentService.addOrderDetail2Instrument(studentPaymentOrder, repairFee, Integer.valueOf(musical.getGoodsIdList()));
+                repair.setStudentInstrumentId(studentInstrumentId);
+                studentPaymentOrderDetailDao.update(repair);
+            }
 
             //学生云教练处理
-            BigDecimal cloudTeacherFee = allDetails.stream() .filter(o -> o.getType().getCode().equals("CLOUD_TEACHER"))
-                    .map(o -> o.getPrice().subtract(o.getRemitFee() == null ? BigDecimal.ZERO : o.getRemitFee()))
-                    .reduce(BigDecimal.ZERO, BigDecimal::add);
-            cloudTeacherOrderService.addOrderDetail2CloudTeacher(studentPaymentOrder,cloudTeacherFee);
+            StudentPaymentOrderDetail cloudTeacher = allDetails.stream().filter(o -> o.getType()==CLOUD_TEACHER).findFirst().get();
+            if(cloudTeacher != null){
+                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);
+            }
 
             //合并学员处理
             if (studentRegistration.getIsMerge().equals(1) && studentPaymentOrder.getExpectAmount().compareTo(BigDecimal.ZERO) <= 0) {
@@ -1311,116 +1299,6 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
     }
 
 
-    private boolean addCalenderDetail(StudentPaymentOrder studentPaymentOrder, StudentRegistration studentRegistration) {
-        Date nowDate = new Date();
-
-        String currentMusicGroupId = studentRegistration.getMusicGroupId();
-
-        //缴费详情 calender detail
-        MusicGroupPaymentCalender musicGroupRegCalender = musicGroupPaymentCalenderService.findByMusicGroupRegCalender(currentMusicGroupId);
-        if (musicGroupRegCalender == null) {
-            throw new BizException("报名缴费信息查询失败");
-        }
-
-        String batchNo = musicGroupRegCalender.getBatchNo();
-        Long currentPaymentCalenderId = musicGroupRegCalender.getId();
-
-        List<MusicGroupPaymentCalender> musicGroupPaymentCalenderList = musicGroupPaymentCalenderDao.findByBatchNo(batchNo);
-
-        for (MusicGroupPaymentCalender musicGroupPaymentCalender : musicGroupPaymentCalenderList) {
-            if (currentPaymentCalenderId.longValue() == musicGroupPaymentCalender.getId()) {
-                // 更新实际缴费人数
-                if (musicGroupPaymentCalender.getActualNum() == null) {
-                    musicGroupPaymentCalender.setActualNum(1);
-                } else {
-                    musicGroupPaymentCalender.setActualNum(musicGroupPaymentCalender.getActualNum() + 1);
-                }
-            }
-            if (musicGroupPaymentCalender.getExpectNum() == null) {
-                musicGroupPaymentCalender.setExpectNum(1);
-            } else {
-                musicGroupPaymentCalender.setExpectNum(musicGroupPaymentCalender.getExpectNum() + 1);
-            }
-            musicGroupPaymentCalender.setUpdateTime(nowDate);
-        }
-        if (musicGroupPaymentCalenderList.size() > 0) {
-            musicGroupPaymentCalenderDao.batchUpdate(musicGroupPaymentCalenderList);
-        }
-
-        List<String> orderDetailTypes = studentPaymentOrderDetailDao.getOrderDetailType(studentPaymentOrder.getId());
-        List<MusicGroupPaymentCalenderCourseSettings> courseSettings = musicGroupPaymentCalenderCourseSettingsDao.getWithPaymentCalender(musicGroupRegCalender.getId());
-        BigDecimal courseTotalPrice = courseSettings.stream().filter(e -> orderDetailTypes.contains(e.getCourseType().getCode())).map(MusicGroupPaymentCalenderCourseSettings::getCourseCurrentPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
-        BigDecimal optionalCourseFee = courseSettings.stream().filter(MusicGroupPaymentCalenderCourseSettings::getIsStudentOptional).filter(e -> orderDetailTypes.contains(e.getCourseType().getCode())).map(MusicGroupPaymentCalenderCourseSettings::getCourseCurrentPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
-
-        List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetails = new ArrayList<>();
-
-        for (MusicGroupPaymentCalender musicGroupPaymentCalender : musicGroupPaymentCalenderList) {
-            MusicGroupPaymentCalenderDetail musicGroupPaymentCalenderDetail = new MusicGroupPaymentCalenderDetail();
-            musicGroupPaymentCalenderDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalender.getId());
-            musicGroupPaymentCalenderDetail.setUserId(studentPaymentOrder.getUserId());
-            musicGroupPaymentCalenderDetail.setResponsibleUserId(musicGroupPaymentCalender.getOperator());
-
-            if (currentPaymentCalenderId.longValue() == musicGroupPaymentCalender.getId()) {
-                musicGroupPaymentCalenderDetail.setExpectAmount(courseTotalPrice);
-                if (studentPaymentOrder.getCourseRemitFee() != null && (studentPaymentOrder.getCourseRemitFee().compareTo(BigDecimal.ZERO) > 0)) {
-                    musicGroupPaymentCalenderDetail.setActualAmount(optionalCourseFee);
-                } else {
-                    musicGroupPaymentCalenderDetail.setActualAmount(courseTotalPrice);
-                }
-                musicGroupPaymentCalenderDetail.setPaymentStatus(PAID_COMPLETED);
-                musicGroupPaymentCalenderDetail.setPayTime(nowDate);
-                musicGroupPaymentCalenderDetail.setPaymentOrderId(studentPaymentOrder.getId());
-                musicGroupPaymentCalenderDetail.setUseInCourse(0);
-                musicGroupPaymentCalenderDetail.setOpen(1);
-            } else {
-                musicGroupPaymentCalenderDetail.setExpectAmount(musicGroupPaymentCalender.getPaymentAmount());
-                musicGroupPaymentCalenderDetail.setPaymentStatus(MusicGroupStudentFee.PaymentStatus.NON_PAYMENT);
-            }
-            if(orderDetailTypes.contains(OrderDetailTypeEnum.CLOUD_TEACHER.name()) || orderDetailTypes.contains(OrderDetailTypeEnum.CLOUD_TEACHER_PLUS.name())){
-            	musicGroupPaymentCalenderDetail.setExpectAmount(musicGroupPaymentCalenderDetail.getExpectAmount().add(musicGroupPaymentCalender.getMemberPaymentAmount()));
-            	musicGroupPaymentCalenderDetail.setActualAmount(musicGroupPaymentCalenderDetail.getActualAmount().add(musicGroupPaymentCalender.getMemberPaymentAmount()));
-            }
-            
-            musicGroupPaymentCalenderDetail.setUserStatus(null);
-            musicGroupPaymentCalenderDetail.setDeadlinePaymentDate(musicGroupPaymentCalender.getDeadlinePaymentDate());
-            musicGroupPaymentCalenderDetail.setStartPaymentDate(musicGroupPaymentCalender.getStartPaymentDate());
-            musicGroupPaymentCalenderDetail.setCreateTime(nowDate);
-            musicGroupPaymentCalenderDetail.setUpdateTime(nowDate);
-
-            musicGroupPaymentCalenderDetailDao.insert(musicGroupPaymentCalenderDetail);
-
-            List<MusicGroupPaymentCalenderCourseSettings> courseSettingsList = musicGroupPaymentCalenderCourseSettingsDao
-                    .getWithPaymentCalender(musicGroupPaymentCalender.getId());
-            for (MusicGroupPaymentCalenderCourseSettings courseSetting : courseSettingsList) {
-                if (musicGroupRegCalender.getPayUserType().equals(MusicGroupPaymentCalender.PayUserType.STUDENT)
-                        && !orderDetailTypes.contains(courseSetting.getCourseType().getCode())) {
-                    continue;
-                }
-                if (courseSetting.getCourseTotalMinuties() == null || courseSetting.getCourseTotalMinuties() == 0) {
-                    continue;
-                }
-                MusicGroupPaymentStudentCourseDetail musicGroupPaymentStudentCourseDetail = new MusicGroupPaymentStudentCourseDetail();
-                musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalender.getId());
-                musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderDetailId(musicGroupPaymentCalenderDetail.getId());
-                musicGroupPaymentStudentCourseDetail.setUserId(studentPaymentOrder.getUserId());
-                musicGroupPaymentStudentCourseDetail.setCourseType(courseSetting.getCourseType());
-                musicGroupPaymentStudentCourseDetail.setTotalCourseMinutes(courseSetting.getCourseTotalMinuties());
-                musicGroupPaymentStudentCourseDetail.setCourseOriginalPrice(courseSetting.getCourseOriginalPrice());
-                musicGroupPaymentStudentCourseDetail.setCourseCurrentPrice(courseSetting.getCourseCurrentPrice());
-                musicGroupPaymentStudentCourseDetail.setUsedCourseMinutes(0);
-                musicGroupPaymentStudentCourseDetail.setCreateTime(nowDate);
-                musicGroupPaymentStudentCourseDetail.setUpdateTime(nowDate);
-
-                musicGroupPaymentStudentCourseDetails.add(musicGroupPaymentStudentCourseDetail);
-            }
-        }
-
-        if (musicGroupPaymentStudentCourseDetails.size() > 0) {
-            musicGroupPaymentStudentCourseDetailDao.batchInsert(musicGroupPaymentStudentCourseDetails);
-        }
-        return true;
-    }
-
     @Override
     public List<StudentRegistration> findMusicGroupNoClassGroupStudent(String musicGroupId, Integer actualSubjectId) {
         //获取所有声部
@@ -1837,12 +1715,6 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
                 viewMap.remove(musicGroupId);
             }
         });
-//        List<CourseSchedule> musicGroupsHasStartCourseNums = courseScheduleDao.getMusicGroupsHasStartCourseNum(ids);
-//        for (CourseSchedule musicGroupsHasStartCourseNum : musicGroupsHasStartCourseNums) {
-//            if(viewMap.containsKey(musicGroupsHasStartCourseNum.getMusicGroupId())){
-//                viewMap.remove(musicGroupsHasStartCourseNum.getMusicGroupId());
-//            }
-//        }
         return viewMap;
     }
 

+ 9 - 13
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java

@@ -16,11 +16,10 @@ import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.BiFunction;
-import java.util.function.Function;
 import java.util.stream.Collectors;
 
-import com.ym.mec.biz.service.*;
-import com.ym.mec.common.tenant.TenantContextHolder;
+import javax.annotation.PostConstruct;
+
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -28,7 +27,6 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
-import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
@@ -65,30 +63,31 @@ import com.ym.mec.biz.dal.entity.MemberRankSetting;
 import com.ym.mec.biz.dal.entity.Organization;
 import com.ym.mec.biz.dal.entity.Student;
 import com.ym.mec.biz.dal.entity.StudentPreRegistration;
-import com.ym.mec.biz.dal.entity.StudentRegistration;
-import com.ym.mec.biz.dal.entity.SysConfig;
 import com.ym.mec.biz.dal.entity.SysUserCashAccount;
 import com.ym.mec.biz.dal.enums.FivePlusGradeEnum;
 import com.ym.mec.biz.dal.enums.GradeTypeEnum;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.enums.PeriodEnum;
 import com.ym.mec.biz.dal.enums.SixPlusGradeEnum;
-import com.ym.mec.biz.dal.enums.StudentMusicGroupStatusEnum;
 import com.ym.mec.biz.dal.page.CloudTeacherActiveQueryInfo;
 import com.ym.mec.biz.dal.page.OrganCloudStudyStudentDataQueryInfo;
 import com.ym.mec.biz.dal.page.StudentQueryInfo;
+import com.ym.mec.biz.service.OrganizationService;
+import com.ym.mec.biz.service.StudentService;
+import com.ym.mec.biz.service.SysConfigService;
+import com.ym.mec.biz.service.SysMessageService;
+import com.ym.mec.biz.service.SysTenantConfigService;
 import com.ym.mec.common.constant.CommonConstants;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 
-import javax.annotation.PostConstruct;
-
 @Service
 public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implements StudentService {
 
@@ -182,12 +181,9 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
         student.setSchoolName(studentPreRegistration.getSchool());
         student.setCurrentGradeNum(studentPreRegistration.getCurrentGradeNum());
         student.setCurrentClass(studentPreRegistration.getCurrentClass());
+        student.setTenantId(studentPreRegistration.getTeacherRecommandSubjectId());
         studentDao.insert(student);
         
-        if(user.getOrganId() == 59){
-        	updateMemberRank(userId, PeriodEnum.MONTH, 1, 1);
-        }
-        
         return true;
 	}
 

+ 220 - 181
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysCouponCodeServiceImpl.java

@@ -16,8 +16,10 @@ import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.QueryInfo;
+import com.ym.mec.common.page.WrapperUtil;
 import com.ym.mec.common.service.IdGeneratorService;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import org.apache.commons.lang3.StringUtils;
@@ -25,7 +27,6 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
-import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
@@ -33,197 +34,235 @@ import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
 
 @Service
-public class SysCouponCodeServiceImpl extends BaseServiceImpl<Long, SysCouponCode>  implements SysCouponCodeService {
-	
-	@Autowired
-	private SysCouponCodeDao sysCouponCodeDao;
-	@Autowired
-	private SysCouponService sysCouponService;
-	@Autowired
-	private SysCouponDao sysCouponDao;
-	@Autowired
-	private IdGeneratorService idGeneratorService;
-	@Autowired
-	private StudentPaymentOrderDao studentPaymentOrderDao;
-
-	@Override
-	public BaseDAO<Long, SysCouponCode> getDAO() {
-		return sysCouponCodeDao;
-	}
-
-	@Override
-	@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
-	public boolean exchangeCouponTest(Integer userId, Integer couponId, Long paymentOrderId, Integer exchangeNum) {
-		return exchangeCoupon(userId, couponId, paymentOrderId, exchangeNum);
-	}
-
-	@Override
-	@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
-	public boolean exchangeCoupon(Integer userId, Integer couponId, Long paymentOrderId, Integer exchangeNum) {
-		if(Objects.isNull(userId)||Objects.isNull(couponId)||Objects.isNull(paymentOrderId)||Objects.isNull(exchangeNum)){
-			throw new BizException("领取失败");
-		}
-		if(exchangeNum<=0){
-			return true;
-		}
-		SysCoupon sysCoupon = sysCouponDao.lockCoupon(couponId);
-		Date now = new Date();
-		//如果优惠券不存在,或者已停用,或者不在领取有效期内,或者已消耗完,则此优惠券无效
-		boolean invalid = Objects.isNull(sysCoupon)||0==sysCoupon.getStatus()||now.compareTo(sysCoupon.getStartDate())<0||now.compareTo(sysCoupon.getEndDate())>0;
-		invalid = invalid || sysCoupon.getStockCount()!=-1&&sysCoupon.getConsumeNum()>=sysCoupon.getStockCount()&&(sysCoupon.getStockCount()-sysCoupon.getConsumeNum()<exchangeNum);
-		if(invalid){
-			throw new BizException("无效优惠券");
-		}
-		StudentPaymentOrder studentPaymentOrder = studentPaymentOrderDao.get(paymentOrderId);
-		if(Objects.isNull(studentPaymentOrder)){
-			throw new BizException("无效订单");
-		}
-		if(sysCoupon.getLimitExchangeNum()!=-1){
-			int userUserNum = sysCouponCodeDao.countWithUserAndCoupon(userId, couponId);
-			invalid = (userUserNum + exchangeNum)>sysCoupon.getLimitExchangeNum();
-		}
-		//如果用户使用数量超过优惠券限制则领取无效
-		if(invalid){
-			throw new BizException("当前优惠券最多可领取{}次", sysCoupon.getLimitExchangeNum());
-		}
-		SysCouponCode sysCouponCode = new SysCouponCode();
-		sysCouponCode.setUserId(userId);
-		sysCouponCode.setCouponId(couponId);
-		sysCouponCode.setPaymentOrderId(paymentOrderId);
-		sysCouponCode.setUsageStatus(0);
-		switch (sysCoupon.getEffectiveType()){
-			case DAYS:
-				sysCouponCode.setUseStartDate(now);
-				sysCouponCode.setUseDeadlineDate(DateUtil.addDays(now, sysCoupon.getDeadline()));
-				break;
-			case TIME_BUCKET:
-				sysCouponCode.setUseStartDate(sysCoupon.getEffectiveStartTime());
-				sysCouponCode.setUseDeadlineDate(sysCoupon.getEffectiveExpireTime());
-				break;
-			default:
-				throw new BizException("无效优惠券", sysCoupon.getLimitExchangeNum());
-		}
-		List<SysCouponCode> couponCodes = new ArrayList<>();
-		for (int i = 0; i < exchangeNum; i++) {
-			SysCouponCode couponCode = new SysCouponCode();
-			BeanUtils.copyProperties(sysCouponCode, couponCode);
-			couponCode.setCode(String.valueOf(idGeneratorService.generatorId("coupon")));
-			couponCodes.add(couponCode);
-		}
-		sysCouponCodeDao.batchInsert(couponCodes);
-		sysCoupon.setConsumeNum(new AtomicInteger(sysCoupon.getConsumeNum()).addAndGet(exchangeNum));
-		if(sysCoupon.getWarningStatus()==0&&sysCoupon.getStockCount()!=-1&&sysCoupon.getStockCount()-sysCoupon.getConsumeNum()<sysCoupon.getWarningStockNum()){
-			sysCouponService.stockWarning(sysCoupon.getId(), sysCoupon.getName());
-			sysCoupon.setWarningStatus(1);
-		}
-		sysCouponDao.update(sysCoupon);
-		return true;
-	}
-
-	@Override
-	public PageInfo<SysCouponCodeDto> querySysCouponUseList(SysCouponCodeQueryInfo queryInfo) {
-		PageInfo<SysCouponCodeDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
-		Map<String, Object> params = new HashMap<String, Object>();
-		MapUtil.populateMap(params, queryInfo);
-
-		List<SysCouponCodeDto> dataList = new ArrayList<>();
-		int count = sysCouponCodeDao.countSysCouponUseList(params);
-		if (count > 0) {
-			pageInfo.setTotal(count);
-			params.put("offset", pageInfo.getOffset());
-			dataList = sysCouponCodeDao.querySysCouponUseList(params);
-		}
-		pageInfo.setRows(dataList);
-		return pageInfo;
-	}
+public class SysCouponCodeServiceImpl extends BaseServiceImpl<Long, SysCouponCode> implements SysCouponCodeService {
+
+    @Autowired
+    private SysCouponCodeDao sysCouponCodeDao;
+    @Autowired
+    private SysCouponService sysCouponService;
+    @Autowired
+    private SysCouponDao sysCouponDao;
+    @Autowired
+    private IdGeneratorService idGeneratorService;
+    @Autowired
+    private StudentPaymentOrderDao studentPaymentOrderDao;
+
+    @Override
+    public BaseDAO<Long, SysCouponCode> getDAO() {
+        return sysCouponCodeDao;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
+    public boolean exchangeCouponTest(Integer userId, Integer couponId, Long paymentOrderId, Integer exchangeNum) {
+        return exchangeCoupon(userId, couponId, paymentOrderId, exchangeNum, 0, null);
+    }
+
+    /**
+     * 兑换优惠券
+     *
+     * @param userId:         用户编号
+     * @param couponId:       优惠券编号
+     * @param paymentOrderId: 订单编号
+     * @param exchangeNum:    兑换数量
+     * @param type:          2有paymentOrderId属于订单送券,交易获取,0手动领取 1手动发放
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
+    public boolean exchangeCoupon(Integer userId, Integer couponId, Long paymentOrderId, Integer exchangeNum, int type, Integer issueId) {
+        //检查参数
+        SysCouponCode sysCouponCode = checkParam(userId, couponId, paymentOrderId, exchangeNum, type, issueId);
+        //兑换数量0或者比0小直接返回
+        if (exchangeNum <= 0) {
+            return true;
+        }
+        //校验优惠券是否合法
+        SysCoupon sysCoupon = checkCoupon(userId, couponId, exchangeNum);
+        //写入数据
+        opsCoupon(userId, sysCouponCode, couponId, exchangeNum, sysCoupon);
+        return true;
+    }
+
+    private SysCouponCode checkParam(Integer userId, Integer couponId, Long paymentOrderId, Integer exchangeNum, int type, Integer issueId) {
+        SysCouponCode sysCouponCode = new SysCouponCode();
+        if (type == 2 && WrapperUtil.checkObj(userId, couponId, paymentOrderId, exchangeNum)) {
+            StudentPaymentOrder studentPaymentOrder = studentPaymentOrderDao.get(paymentOrderId);
+            if (Objects.isNull(studentPaymentOrder)) {
+                throw new BizException("无效订单");
+            }
+            sysCouponCode.setPaymentOrderId(paymentOrderId);
+        } else if ((type == 0 || type == 1) && WrapperUtil.checkObj(userId, couponId, issueId, exchangeNum)) {
+            sysCouponCode.setIssueId(issueId);
+        } else {
+            throw new BizException("领取失败");
+        }
+        sysCouponCode.setType(type);
+        return sysCouponCode;
+    }
+
+    private SysCoupon checkCoupon(Integer userId, Integer couponId, Integer exchangeNum) {
+        //锁定优惠券
+        SysCoupon sysCoupon = sysCouponDao.lockCoupon(couponId);
+
+        Date now = new Date();
+        //如果优惠券不存在,或者已停用,或者不在领取有效期内,或者已消耗完,则此优惠券无效
+        boolean invalid = Objects.isNull(sysCoupon) || 0 == sysCoupon.getStatus() || now.compareTo(sysCoupon.getStartDate()) < 0 || now.compareTo(sysCoupon.getEndDate()) > 0;
+        invalid = invalid || sysCoupon.getStockCount() != -1 && sysCoupon.getConsumeNum() >= sysCoupon.getStockCount() && (sysCoupon.getStockCount() - sysCoupon.getConsumeNum() < exchangeNum);
+        if (invalid) {
+            throw new BizException("无效优惠券");
+        }
+        //校验兑换的最大次数
+        if (sysCoupon.getLimitExchangeNum() != -1) {
+            int userUserNum = sysCouponCodeDao.countWithUserAndCoupon(userId, couponId);
+            invalid = (userUserNum + exchangeNum) > sysCoupon.getLimitExchangeNum();
+        }
+        //如果用户使用数量超过优惠券限制则领取无效
+        if (invalid) {
+            throw new BizException("当前优惠券最多可领取{}次", sysCoupon.getLimitExchangeNum());
+        }
+        return sysCoupon;
+    }
+
+    private void opsCoupon(Integer userId, SysCouponCode sysCouponCode, Integer couponId, Integer exchangeNum, SysCoupon sysCoupon) {
+        Integer tenantId = TenantContextHolder.getTenantId();
+        Date now = new Date();
+        sysCouponCode.setUserId(userId);
+        sysCouponCode.setCouponId(couponId);
+        sysCouponCode.setUsageStatus(0);
+        sysCouponCode.setTenantId(tenantId);
+        switch (sysCoupon.getEffectiveType()) {
+            case DAYS:
+                sysCouponCode.setUseStartDate(now);
+                sysCouponCode.setUseDeadlineDate(DateUtil.addDays(now, sysCoupon.getDeadline()));
+                break;
+            case TIME_BUCKET:
+                sysCouponCode.setUseStartDate(sysCoupon.getEffectiveStartTime());
+                sysCouponCode.setUseDeadlineDate(sysCoupon.getEffectiveExpireTime());
+                break;
+            default:
+                throw new BizException("无效优惠券", sysCoupon.getLimitExchangeNum());
+        }
+        List<SysCouponCode> couponCodes = new ArrayList<>();
+        for (int i = 0; i < exchangeNum; i++) {
+            SysCouponCode couponCode = new SysCouponCode();
+            BeanUtils.copyProperties(sysCouponCode, couponCode);
+            couponCode.setCode(String.valueOf(idGeneratorService.generatorId("coupon")));
+            couponCode.setTenantId(tenantId);
+            couponCodes.add(couponCode);
+        }
+        sysCouponCodeDao.batchInsert(couponCodes);
+        sysCoupon.setConsumeNum(new AtomicInteger(sysCoupon.getConsumeNum()).addAndGet(exchangeNum));
+        if (sysCoupon.getWarningStatus() == 0 && sysCoupon.getStockCount() != -1 && sysCoupon.getStockCount() - sysCoupon.getConsumeNum() < sysCoupon.getWarningStockNum()) {
+            sysCouponService.stockWarning(sysCoupon.getId(), sysCoupon.getName());
+            sysCoupon.setWarningStatus(1);
+        }
+        sysCouponDao.update(sysCoupon);
+    }
+
+    @Override
+    public PageInfo<SysCouponCodeDto> querySysCouponUseList(SysCouponCodeQueryInfo queryInfo) {
+        PageInfo<SysCouponCodeDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<SysCouponCodeDto> dataList = new ArrayList<>();
+        int count = sysCouponCodeDao.countSysCouponUseList(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = sysCouponCodeDao.querySysCouponUseList(params);
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
 
     @Override
     public PageInfo<HorseRaceLampDto> queryHorseRaceLampDtoList(QueryInfo queryInfo) {
-		PageInfo<HorseRaceLampDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
-		Map<String, Object> params = new HashMap<String, Object>();
-		MapUtil.populateMap(params, queryInfo);
-
-		List<HorseRaceLampDto> dataList = new ArrayList<>();
-		int count = sysCouponCodeDao.countHorseRaceLampDtoList(params);
-		if (count > 0) {
-			pageInfo.setTotal(count);
-			params.put("offset", pageInfo.getOffset());
-			dataList = sysCouponCodeDao.queryHorseRaceLampDtoList(params);
-		}
-		pageInfo.setRows(dataList);
-		return pageInfo;
+        PageInfo<HorseRaceLampDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<HorseRaceLampDto> dataList = new ArrayList<>();
+        int count = sysCouponCodeDao.countHorseRaceLampDtoList(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = sysCouponCodeDao.queryHorseRaceLampDtoList(params);
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
     }
 
     @Override
     public List<SysCouponCode> queryCouponPage(BigDecimal amount, Integer userId) {
 
-		return null;
+        return null;
     }
 
     @Override
-	@Transactional(rollbackFor = Exception.class)
-    public StudentPaymentOrder use(List<Integer> couponIdList, BigDecimal amount,Boolean useFlag) {
-		StudentPaymentOrder studentPaymentOrder = new StudentPaymentOrder();
-		if(couponIdList != null && couponIdList.size() > 0){
-			Date date = new Date();
-			List<SysCouponCodeDto> couponCodeDtoList = sysCouponCodeDao.findByIdList(couponIdList);
-			if(couponIdList.size() != couponCodeDtoList.size()){
-				throw new BizException("操作失败:优惠券数据异常");
-			}
-			BigDecimal fullAmount = BigDecimal.ZERO;
-			BigDecimal faceAmount = BigDecimal.ZERO;
-
-			for (SysCouponCodeDto sysCouponCodeDto : couponCodeDtoList) {
-				if(sysCouponCodeDto.getUsageStatus() == 1){
-					throw new BizException("操作失败:优惠券已使用");
-				}
-				if(sysCouponCodeDto.getUseStartDate().after(date)){
-					throw new BizException("操作失败:不在优惠券使用期限");
-				}
-				if(date.after(sysCouponCodeDto.getUseDeadlineDate())){
-					throw new BizException("操作失败:优惠券已过期");
-				}
-				CouponTypeEnum couponType = sysCouponCodeDto.getCouponType();
-				switch (couponType){
-					case DISCOUNT:
-						throw new BizException("操作失败:暂不支持折扣劵");
-					case FULL_REDUCTION:
-						fullAmount = fullAmount.add(sysCouponCodeDto.getFullAmount());
-						faceAmount = faceAmount.add(sysCouponCodeDto.getFaceValue());
-						break;
-					default:
-						throw new BizException("操作失败:错误的优惠券类型");
-				}
-			}
-			if(amount.compareTo(fullAmount) < 0){
-				throw new BizException("操作失败:当前消费金额不满足优惠券满减条件");
-			}
-			amount = amount.subtract(faceAmount);
-			if (amount.signum() < 0) {
-				amount = BigDecimal.ZERO;
-			}
-			//使用优惠券
-			if(useFlag){
-				sysCouponCodeDao.use(couponIdList);
-			}
-			studentPaymentOrder.setCouponCodeId(StringUtils.join(couponIdList,","));
-			studentPaymentOrder.setCouponRemitFee(faceAmount);
-		}
-		studentPaymentOrder.setExpectAmount(amount);
-		studentPaymentOrder.setActualAmount(amount);
-		return studentPaymentOrder;
+    @Transactional(rollbackFor = Exception.class)
+    public StudentPaymentOrder use(List<Integer> couponIdList, BigDecimal amount, Boolean useFlag) {
+        StudentPaymentOrder studentPaymentOrder = new StudentPaymentOrder();
+        if (couponIdList != null && couponIdList.size() > 0) {
+            Date date = new Date();
+            List<SysCouponCodeDto> couponCodeDtoList = sysCouponCodeDao.findByIdList(couponIdList);
+            if (couponIdList.size() != couponCodeDtoList.size()) {
+                throw new BizException("操作失败:优惠券数据异常");
+            }
+            BigDecimal fullAmount = BigDecimal.ZERO;
+            BigDecimal faceAmount = BigDecimal.ZERO;
+
+            for (SysCouponCodeDto sysCouponCodeDto : couponCodeDtoList) {
+                if (sysCouponCodeDto.getUsageStatus() == 1) {
+                    throw new BizException("操作失败:优惠券已使用");
+                }
+                if (sysCouponCodeDto.getUseStartDate().after(date)) {
+                    throw new BizException("操作失败:不在优惠券使用期限");
+                }
+                if (date.after(sysCouponCodeDto.getUseDeadlineDate())) {
+                    throw new BizException("操作失败:优惠券已过期");
+                }
+                CouponTypeEnum couponType = sysCouponCodeDto.getCouponType();
+                switch (couponType) {
+                    case DISCOUNT:
+                        throw new BizException("操作失败:暂不支持折扣劵");
+                    case FULL_REDUCTION:
+                        fullAmount = fullAmount.add(sysCouponCodeDto.getFullAmount());
+                        faceAmount = faceAmount.add(sysCouponCodeDto.getFaceValue());
+                        break;
+                    default:
+                        throw new BizException("操作失败:错误的优惠券类型");
+                }
+            }
+            if (amount.compareTo(fullAmount) < 0) {
+                throw new BizException("操作失败:当前消费金额不满足优惠券满减条件");
+            }
+            amount = amount.subtract(faceAmount);
+            if (amount.signum() < 0) {
+                amount = BigDecimal.ZERO;
+            }
+            //使用优惠券
+            if (useFlag) {
+                sysCouponCodeDao.use(couponIdList);
+            }
+            studentPaymentOrder.setCouponCodeId(StringUtils.join(couponIdList, ","));
+            studentPaymentOrder.setCouponRemitFee(faceAmount);
+        }
+        studentPaymentOrder.setExpectAmount(amount);
+        studentPaymentOrder.setActualAmount(amount);
+        return studentPaymentOrder;
     }
 
-	@Override
-	public List<SysCouponCodeDto> findByIdList(List<Integer> couponIdList) {
-		return sysCouponCodeDao.findByIdList(couponIdList);
-	}
-
-	@Override
-	public void quit(String couponCodeId) {
-		if(StringUtils.isEmpty(couponCodeId)){
-			return;
-		}
-		sysCouponCodeDao.quit(couponCodeId);
-	}
+    @Override
+    public List<SysCouponCodeDto> findByIdList(List<Integer> couponIdList) {
+        return sysCouponCodeDao.findByIdList(couponIdList);
+    }
+
+    @Override
+    public void quit(String couponCodeId) {
+        if (StringUtils.isEmpty(couponCodeId)) {
+            return;
+        }
+        sysCouponCodeDao.quit(couponCodeId);
+    }
 }

+ 131 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysCouponIssueRecordServiceImpl.java

@@ -0,0 +1,131 @@
+package com.ym.mec.biz.service.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.SysCouponIssueRecordDao;
+import com.ym.mec.biz.dal.entity.SysCoupon;
+import com.ym.mec.biz.dal.entity.SysCouponIssueRecord;
+import com.ym.mec.biz.dal.vo.CouponIssueRecordVo;
+import com.ym.mec.biz.service.SysCouponCodeService;
+import com.ym.mec.biz.service.SysCouponIssueRecordService;
+import com.ym.mec.biz.service.SysCouponService;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.PageUtil;
+import com.ym.mec.common.page.WrapperUtil;
+import com.ym.mec.common.tenant.TenantContextHolder;
+import org.redisson.api.RedissonClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+/**
+ * 优惠券发放记录(SysCouponIssueRecord)表服务实现类
+ *
+ * @author hgw
+ * @since 2021-12-29 20:26:12
+ */
+@Service("sysCouponIssueRecordService")
+public class SysCouponIssueRecordServiceImpl extends ServiceImpl<SysCouponIssueRecordDao, SysCouponIssueRecord> implements SysCouponIssueRecordService {
+
+    private final static Logger log = LoggerFactory.getLogger(SysCouponIssueRecordServiceImpl.class);
+
+    @Autowired
+    private SysCouponCodeService sysCouponCodeService;
+    @Autowired
+    private SysCouponService sysCouponService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private RedissonClient redissonClient;
+
+    /**
+     * 手动发优惠券
+     *
+     * @param param studentIds 学生id
+     * @param param couponId   优惠券id
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void issueCoupon(Map<String, Object> param) {
+        String ids = WrapperUtil.toStr(param, "studentIds", "请选择学生!");
+        List<String> studentIds = WrapperUtil.toList(ids);
+        //校验优惠券信息 是否存在 是否是启用状态
+        SysCoupon sysCoupon = Optional.ofNullable(param.get("couponId"))
+                .map(String::valueOf)
+                .map(Integer::parseInt)
+                .map(sysCouponService::get)
+                .filter(c -> c.getStatus() == 1 && c.getIssuanceType() == 1)
+                .orElseThrow(() -> new BizException("查询不到优惠券!"));
+
+        Integer tenantId = TenantContextHolder.getTenantId();
+
+        SysCouponIssueRecord record = new SysCouponIssueRecord();
+        record.setCouponId(sysCoupon.getId());
+        record.setCouponName(sysCoupon.getName());
+        record.setNum(studentIds.size());
+        record.setOps(0);
+        record.setTenantId(tenantId);
+        record.setCreatedBy(getUserId());
+        record.setCreatedTime(new Date());
+        this.save(record);
+
+        studentIds.forEach(id -> sysCouponCodeService.exchangeCoupon(Integer.parseInt(id), sysCoupon.getId(),
+                null, 1, 1, record.getId())
+        );
+
+    }
+
+    @Override
+    public int revokeCoupon(Integer id) {
+        List<SysCouponIssueRecord> issueRecords = this.list(new WrapperUtil<SysCouponIssueRecord>()
+                .hasEq("id_", id)
+                .hasEq("ops", 0)
+                .queryWrapper());
+        if (CollectionUtils.isEmpty(issueRecords)) {
+            throw new BizException("未查询到该优惠券的发放记录!");
+        }
+
+
+        return 0;
+    }
+
+    /**
+     * 查询发放记录
+     */
+    @Override
+    public PageInfo<CouponIssueRecordVo> queryIssueRecord(Map<String, Object> param) {
+        Page<CouponIssueRecordVo> pageInfo = PageUtil.getPageInfo(param);
+        pageInfo.setAsc("a.create_time_");
+        return PageUtil.pageInfo(baseMapper.queryIssueRecord(pageInfo, param));
+    }
+
+    /**
+     * 查询发放名单
+     */
+    @Override
+    public PageInfo<?> queryIssueDetail(Map<String, Object> param) {
+        Page<?> pageInfo = PageUtil.getPageInfo(param);
+        pageInfo.setAsc("scc.create_time_");
+        return PageUtil.pageInfo(baseMapper.queryIssueDetail(pageInfo, param));
+    }
+
+    private Integer getUserId() {
+        //修改机构基础信息
+        return Optional.ofNullable(sysUserFeignService.queryUserInfo())
+                .map(SysUser::getId)
+                .orElseThrow(() -> new BizException("用户信息获取失败,请刷新页面或者重新登录!"));
+    }
+
+}
+

+ 145 - 97
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysCouponServiceImpl.java

@@ -21,106 +21,154 @@ import org.springframework.transaction.annotation.Transactional;
 import java.util.*;
 
 @Service
-public class SysCouponServiceImpl extends BaseServiceImpl<Integer, SysCoupon>  implements SysCouponService {
-	
-	@Autowired
-	private SysCouponDao sysCouponDao;
-	@Autowired
-	private SysMessageService sysMessageService;
+public class SysCouponServiceImpl extends BaseServiceImpl<Integer, SysCoupon> implements SysCouponService {
 
-	@Override
-	public BaseDAO<Integer, SysCoupon> getDAO() {
-		return sysCouponDao;
-	}
+    @Autowired
+    private SysCouponDao sysCouponDao;
+    @Autowired
+    private SysMessageService sysMessageService;
 
-	@Override
-	public PageInfo<SysCoupon> queryPage(SysCouponQueryInfo queryInfo) {
-		PageInfo<SysCoupon> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
-		Map<String, Object> params = new HashMap<String, Object>();
-		MapUtil.populateMap(params, queryInfo);
+    @Override
+    public BaseDAO<Integer, SysCoupon> getDAO() {
+        return sysCouponDao;
+    }
 
-		List<SysCoupon> dataList = new ArrayList<>();
-		int count = this.findCount(params);
-		if (count > 0) {
-			pageInfo.setTotal(count);
-			params.put("offset", pageInfo.getOffset());
-			dataList = this.getDAO().queryPage(params);
-		}
-		pageInfo.setRows(dataList);
-		return pageInfo;
-	}
+    @Override
+    public PageInfo<SysCoupon> queryPage(SysCouponQueryInfo queryInfo) {
+        PageInfo<SysCoupon> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
 
-	@Override
-	@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
-	public void updateCoupon(SysCoupon sysCoupon) {
-		SysCoupon oldCoupon = sysCouponDao.lockCoupon(sysCoupon.getId());
-		if(Objects.isNull(oldCoupon)){
-			throw new BizException("优惠券信息不存在");
-		}
-		//如果已经有人领取,则只能修改库存总量与预警值
-		if(oldCoupon.getConsumeNum()>0){
-			if(oldCoupon.getStatus()==0){
-				oldCoupon.setStockCount(sysCoupon.getStockCount());
-				oldCoupon.setWarningStockNum(sysCoupon.getWarningStockNum());
-			}
-			if(oldCoupon.getStockCount()==-1){
-				oldCoupon.setWarningStockNum(-1);
-			}
-			oldCoupon.setStatus(sysCoupon.getStatus());
-			if(oldCoupon.getStockCount()-oldCoupon.getConsumeNum()>oldCoupon.getWarningStockNum()){
-				oldCoupon.setWarningStatus(0);
-			}
-			sysCouponDao.update(oldCoupon);
-		}else{
-			switch (sysCoupon.getType()){
-				case DISCOUNT:
-					if(Objects.isNull(sysCoupon.getFaceValue())){
-						throw new BizException("请指定折扣比例");
-					}
-					sysCoupon.setFullAmount(null);
-					break;
-				case FULL_REDUCTION:
-					if(Objects.isNull(sysCoupon.getFaceValue())){
-						throw new BizException("请指定优惠金额");
-					}
-					if(Objects.isNull(sysCoupon.getFullAmount())){
-						throw new BizException("请指定达标金额");
-					}
-					break;
-				default:
-					throw new BizException("请指定优惠券类型");
-			}
-			switch (sysCoupon.getEffectiveType()){
-				case DAYS:
-					if(Objects.isNull(sysCoupon.getDeadline())){
-						throw new BizException("请指定有效天数");
-					}
-					sysCoupon.setEffectiveStartTime(null);
-					sysCoupon.setEffectiveExpireTime(null);
-					break;
-				case TIME_BUCKET:
-					if(Objects.isNull(sysCoupon.getEffectiveStartTime())||Objects.isNull(sysCoupon.getEffectiveExpireTime())){
-						throw new BizException("请指定有效时间段");
-					}
-					sysCoupon.setDeadline(null);
-					break;
-				default:
-					throw new BizException("请指定有效期类型");
-			}
-			if(sysCoupon.getStockCount()==-1){
-				sysCoupon.setWarningStockNum(-1);
-			}
-			sysCouponDao.update(sysCoupon);
-		}
-	}
+        List<SysCoupon> dataList = new ArrayList<>();
+        int count = this.findCount(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = this.getDAO().queryPage(params);
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
+    public void updateCoupon(SysCoupon sysCoupon) {
+        SysCoupon oldCoupon = sysCouponDao.lockCoupon(sysCoupon.getId());
+        if (Objects.isNull(oldCoupon)) {
+            throw new BizException("优惠券信息不存在");
+        }
+        //如果已经有人领取,则只能修改库存总量与预警值
+        if (oldCoupon.getConsumeNum() > 0) {
+            if (oldCoupon.getStatus() == 0) {
+                oldCoupon.setStockCount(sysCoupon.getStockCount());
+                oldCoupon.setWarningStockNum(sysCoupon.getWarningStockNum());
+            }
+            if (oldCoupon.getStockCount() == -1) {
+                oldCoupon.setWarningStockNum(-1);
+            }
+            oldCoupon.setStatus(sysCoupon.getStatus());
+            if (oldCoupon.getStockCount() - oldCoupon.getConsumeNum() > oldCoupon.getWarningStockNum()) {
+                oldCoupon.setWarningStatus(0);
+            }
+            sysCouponDao.update(oldCoupon);
+        } else {
+            switch (sysCoupon.getType()) {
+                case DISCOUNT:
+                    if (Objects.isNull(sysCoupon.getFaceValue())) {
+                        throw new BizException("请指定折扣比例");
+                    }
+                    sysCoupon.setFullAmount(null);
+                    break;
+                case FULL_REDUCTION:
+                    if (Objects.isNull(sysCoupon.getFaceValue())) {
+                        throw new BizException("请指定优惠金额");
+                    }
+                    if (Objects.isNull(sysCoupon.getFullAmount())) {
+                        throw new BizException("请指定达标金额");
+                    }
+                    break;
+                default:
+                    throw new BizException("请指定优惠券类型");
+            }
+            switch (sysCoupon.getEffectiveType()) {
+                case DAYS:
+                    if (Objects.isNull(sysCoupon.getDeadline())) {
+                        throw new BizException("请指定有效天数");
+                    }
+                    sysCoupon.setEffectiveStartTime(null);
+                    sysCoupon.setEffectiveExpireTime(null);
+                    break;
+                case TIME_BUCKET:
+                    if (Objects.isNull(sysCoupon.getEffectiveStartTime()) || Objects.isNull(sysCoupon.getEffectiveExpireTime())) {
+                        throw new BizException("请指定有效时间段");
+                    }
+                    sysCoupon.setDeadline(null);
+                    break;
+                default:
+                    throw new BizException("请指定有效期类型");
+            }
+            if (sysCoupon.getStockCount() == -1) {
+                sysCoupon.setWarningStockNum(-1);
+            }
+            sysCouponDao.update(sysCoupon);
+        }
+    }
+
+    @Async
+    @Override
+    public void stockWarning(Integer couponId, String couponName) {
+        Map<Integer, String> teacherPhoneMap = new HashMap<>();
+        teacherPhoneMap.put(2112251, "13618651329");
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.YIMEI, MessageTypeEnum.COUPON_STOCK_WARNING,
+                teacherPhoneMap, null, 0, null, null,
+                couponName);
+    }
+
+    /**
+     * 新增优惠券
+     *
+     * @param sysCoupon
+     */
+    public long add(SysCoupon sysCoupon) {
+        sysCoupon.setStatus(0);
+        sysCoupon.setConsumeNum(0);
+        sysCoupon.setWarningStatus(0);
+        if (Objects.isNull(sysCoupon.getType())) {
+            throw new BizException("请指定优惠券类型");
+        }
+
+        switch (sysCoupon.getType()) {
+            case DISCOUNT:
+                if (Objects.isNull(sysCoupon.getFaceValue())) {
+                    throw new BizException("请指定折扣比例");
+                }
+                break;
+            case FULL_REDUCTION:
+                if (Objects.isNull(sysCoupon.getFaceValue())) {
+                    throw new BizException("请指定优惠金额");
+                }
+                if (Objects.isNull(sysCoupon.getFullAmount())) {
+                    throw new BizException("请指定达标金额");
+                }
+                break;
+            default:
+                throw new BizException("请指定优惠券类型");
+        }
+        switch (sysCoupon.getEffectiveType()) {
+            case DAYS:
+                if (Objects.isNull(sysCoupon.getDeadline())) {
+                    throw new BizException("请指定有效天数");
+                }
+                break;
+            case TIME_BUCKET:
+                if (Objects.isNull(sysCoupon.getEffectiveStartTime()) || Objects.isNull(sysCoupon.getEffectiveExpireTime())) {
+                    throw new BizException("请指定有效时间段");
+                }
+                break;
+            default:
+                throw new BizException("请指定有效期类型");
+        }
+        return sysCouponDao.insert(sysCoupon);
+    }
 
-	@Async
-	@Override
-	public void stockWarning(Integer couponId, String couponName) {
-		Map<Integer, String> teacherPhoneMap = new HashMap<>();
-		teacherPhoneMap.put(2112251, "13618651329");
-		sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.YIMEI, MessageTypeEnum.COUPON_STOCK_WARNING,
-				teacherPhoneMap, null, 0, null, null,
-				couponName);
-	}
 }

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

@@ -80,7 +80,7 @@ public class TenantAssetsInfoServiceImpl extends ServiceImpl<TenantAssetsInfoDao
             //计算总上课时间
             BigDecimal courseDate = getCourseDate(record.getClassDate(), record.getStartClassTime(), record.getEndClassTime());
             //课程总价 = 每分钟扣费标准 * 总上课时间
-            BigDecimal coursePrice = minutePrice.multiply(courseDate, new MathContext(2, RoundingMode.HALF_UP));
+            BigDecimal coursePrice = minutePrice.multiply(courseDate, new MathContext(3, RoundingMode.HALF_UP));
             //修改流水
             TenantCloudCourseRecord sourceCord = new TenantCloudCourseRecord();
             sourceCord.setId(record.getId());
@@ -104,12 +104,14 @@ public class TenantAssetsInfoServiceImpl extends ServiceImpl<TenantAssetsInfoDao
         //校验课程 筛选出线上课
         dto = getOnlineCourse(dto);
         if (CollectionUtils.isEmpty(dto)) {
+            log.info("deductAmount >>>>>>courseData is null {}", dto);
             return;
         }
         //开始扣费
         dto.forEach(course -> {
             log.info("deductAmount >>>>>> {}", course);
             if (Objects.isNull(course.getTenantId())) {
+                log.info("deductAmount getTenantId is null>>>>>> {}", course);
                 return;
             }
             //获取总人数 ,+1算上老师
@@ -131,9 +133,10 @@ public class TenantAssetsInfoServiceImpl extends ServiceImpl<TenantAssetsInfoDao
             //计算总上课时间
             BigDecimal courseDate = getCourseDate(course.getClassDate(), course.getStartClassTime(), course.getEndClassTime());
             //课程总价 = 每分钟扣费标准 * 总上课时间
-            BigDecimal coursePrice = minutePrice.multiply(courseDate, new MathContext(2, RoundingMode.HALF_UP));
+            BigDecimal coursePrice = minutePrice.multiply(courseDate, new MathContext(3, RoundingMode.HALF_UP));
             //写流水
             insertRecord(course, coursePrice, 1);
+            log.info("deductAmount >>>>>> coursePrice {}  tenantId {}", coursePrice, course.getTenantId());
             //扣余额
             baseMapper.deductAmount(coursePrice, course.getTenantId());
         });
@@ -148,6 +151,7 @@ public class TenantAssetsInfoServiceImpl extends ServiceImpl<TenantAssetsInfoDao
      * @param state       扣费状态 1扣费  3未扣费
      */
     private void insertRecord(CourseSchedule course, BigDecimal coursePrice, Integer state) {
+        log.info("deductAmount  insertRecord >>>>>> {}  coursePrice {} state {}", course, coursePrice, state);
         //写入流水
         TenantCloudCourseRecord record = new TenantCloudCourseRecord();
         record.setCourseId(course.getId().intValue());

+ 5 - 19
mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java

@@ -2629,25 +2629,11 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
 		if (list.size() > 0) {
 			StudentPaymentOrder applyOrder = list.get(list.size() - 1);
-			// 查询订单状态
-			PayStatus payStatus = studentPaymentOrderService.queryPayStatus(applyOrder.getPaymentChannel(), applyOrder.getOrderNo(), applyOrder.getTransNo());
-			if(payStatus == PayStatus.SUCCESSED){
-				throw new BizException("订单已支付成功,请勿重复支付");
-			}/*else if(payStatus == PayStatus.PAYING){
-				throw new BizException("订单还在交易中,请稍后重试");
-			}*/
-			if(!vipGroupBuyParams.isRepeatPay()){
-				return BaseController.failed(HttpStatus.CONTINUE, "您有待支付的订单,是否继续支付");
-			}
-			//处理关闭订单
-			applyOrder.setStatus(DealStatusEnum.CLOSE);
-			applyOrder.setMemo("关闭VIP订单");
-			if (applyOrder.getBalancePaymentAmount() != null && applyOrder.getBalancePaymentAmount().compareTo(BigDecimal.ZERO) > 0) {
-				sysUserCashAccountService.updateBalance(applyOrder.getUserId(), applyOrder.getBalancePaymentAmount(),
-						PlatformCashAccountDetailTypeEnum.REFUNDS, "购买VIP支付失败");
-			}
-			studentPaymentOrderService.update(applyOrder);
-			sysCouponCodeService.quit(applyOrder.getCouponCodeId());
+			//校验重复支付
+			HttpResponseResult result = studentPaymentOrderService.checkRepeatPay(applyOrder, vipGroupBuyParams.isRepeatPay());
+			if(result.getCode() != 200){
+				return result;
+			}
 			classGroup.setStudentNum(classGroup.getStudentNum() - 1);
 		}
 

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

@@ -69,11 +69,12 @@
     <!-- 分页查询 -->
     <select id="queryPage" resultMap="ChargeType" parameterType="map">
         SELECT ct.*,s.id_ subject_id_,s.name_ subject_name_
-        FROM (SELECT * FROM charge_type WHERE del_flag_ = 0 <include refid="global.limit"/>) ct
+        FROM charge_type ct
         LEFT JOIN charge_type_subject_mapper ctsm ON ct.id_ = ctsm.charge_type_id_
         LEFT JOIN `subject` s ON ctsm.subject_id_ = s.id_
-        where ct.tenant_id_ = #{tenantId}
+        where ct.tenant_id_ = #{tenantId} and ct.del_flag_ = 0
         ORDER BY ct.update_time_
+        <include refid="global.limit"/>
     </select>
 
     <!-- 查询当前表的总记录数 -->

+ 2 - 5
mec-biz/src/main/resources/config/mybatis/CloudTeacherOrderMapper.xml

@@ -50,20 +50,17 @@
     </resultMap>
 
     <select id="get" resultMap="CloudTeacherOrder">
-        <!--@mbg.generated-->
         select * from cloud_teacher_order where id_ = #{id}
     </select>
     <delete id="delete">
-        <!--@mbg.generated-->
         delete from cloud_teacher_order
         where id_ = #{id}
     </delete>
     <insert id="insert" keyColumn="id_" keyProperty="id" parameterType="com.ym.mec.biz.dal.entity.CloudTeacherOrder"
             useGeneratedKeys="true">
-        <!--@mbg.generated-->
-        insert into cloud_teacher_order (organ_id_,student_id_, type_, level_, time_, amount_, refund_amount_, status_,
+        INSERT INTO cloud_teacher_order (organ_id_,student_id_, type_, level_, time_, amount_, refund_amount_, status_,
         order_id_,platform_order_id_,start_time_,end_time_,remark_, create_time_, update_time_,music_group_id_,active_remark_,tenant_id_)
-        values (#{organId},#{studentId}, #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{level}, #{time}, #{amount}, #{refundAmount},
+        VALUES (#{organId},#{studentId}, #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{level}, #{time}, #{amount}, #{refundAmount},
         #{status},#{orderId},#{platformOrderId},#{startTime},#{endTime}, #{remark}, NOW(), NOW(),#{musicGroupId},#{activeRemark},#{tenantId})
     </insert>
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.CloudTeacherOrder">

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

@@ -37,7 +37,7 @@
 		(course_schedule_id_,operator_id_,previous_course_schedule_,current_course_schedule_,create_time_,tenant_id_)
 		VALUES
 		<foreach collection="scheduleModifyLogs" item="item" separator=",">
-			(#{item.courseScheduleId},#{item.operatorId},#{item.previousCourseSchedule},#{item.currentCourseSchedule},#{item.createTime},#{tenantId})
+			(#{item.courseScheduleId},#{item.operatorId},#{item.previousCourseSchedule},#{item.currentCourseSchedule},#{item.createTime},#{item.tenantId})
 		</foreach>
 	</insert>
 	<sql id="queryPageSql">

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

@@ -101,4 +101,11 @@
     <select id="findByCalenderId" resultType="com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderActivity">
       SELECT <include refid="Base_Column_List"/> FROM music_group_payment_calender_activity WHERE calender_id_ = #{calenderId}
     </select>
+    <select id="findByIds" resultType="com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderActivity">
+      SELECT <include refid="Base_Column_List"/> FROM music_group_payment_calender_activity
+      WHERE id_ IN
+        <foreach collection="activityIdList" separator="," item="id" close=")" open="(">
+          #{id}
+        </foreach>
+    </select>
 </mapper>

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

@@ -696,7 +696,7 @@
     <sql id="queryCalenderPageSql">
         <where>
             <if test="search != null and search != ''">
-                AND mgpc.music_group_id_ = #{search} OR mg.name_ LIKE CONCAT('%',#{search},'%')
+                AND (mgpc.music_group_id_ = #{search} OR mg.name_ LIKE CONCAT('%',#{search},'%'))
             </if>
             <if test="musicGroupId != null">
                 AND mgpc.music_group_id_ = #{musicGroupId}
@@ -713,6 +713,12 @@
             <if test="status != null">
                 AND mgpc.status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
             </if>
+            <if test="organId != null and organId != ''">
+                AND FIND_IN_SET(mgpc.organ_id_,#{organId})
+            </if>
+            <if test="tenantId != null">
+                AND mgpc.tenant_id_ = #{tenantId}
+            </if>
         </where>
     </sql>
     <select id="countCalender" resultType="java.lang.Integer">

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

@@ -1331,7 +1331,7 @@
         LEFT JOIN organization o ON o.id_ = su.organ_id_
         LEFT JOIN subject sb ON sb.id_ = s.subject_id_list_
         <where>
-        	su.tenant_id_ = #{tenantid}
+        	su.tenant_id_ = #{tenantId}
             <if test="studentIds != null and studentIds.size > 0">
                 AND s.user_id_ IN
                 <foreach collection="studentIds" separator="," item="studentId" open="(" close=")">
@@ -1355,7 +1355,7 @@
         SELECT count(s.user_id_) FROM student s
         LEFT JOIN sys_user su ON su.id_ = s.user_id_
         <where>
-        	su.tenant_id_ = #{tenantid}
+        	su.tenant_id_ = #{tenantId}
             <if test="studentIds != null and studentIds.size > 0">
                 AND s.user_id_ IN
                 <foreach collection="studentIds" separator="," item="studentId" open="(" close=")">

+ 10 - 11
mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderDetailMapper.xml

@@ -59,15 +59,12 @@
     <!-- 向数据库增加一条记录 -->
     <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail" useGeneratedKeys="true"
             keyColumn="id" keyProperty="id">
-        <!--
-        <selectKey resultClass="int" keyProperty="id" >
-        SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL
-        </selectKey>
-        -->
         INSERT INTO student_payment_order_detail
-        (id_,type_,goods_id_list_,price_,create_time_,update_time_,payment_order_id_,kit_group_purchase_type_,student_instrument_id_,is_renew_,tenant_id_)
-        VALUES(#{id},#{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{goodsIdList},#{price},now(),now(),
-        #{paymentOrderId},#{kitGroupPurchaseType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{studentInstrumentId},#{isRenew},#{tenantId})
+        (type_,goods_id_list_,price_,create_time_,update_time_,payment_order_id_,kit_group_purchase_type_,
+         student_instrument_id_,is_renew_,tenant_id_)
+        VALUES(#{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{goodsIdList},#{price},now(),now(),
+        #{paymentOrderId},#{kitGroupPurchaseType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+               #{studentInstrumentId},#{isRenew},#{tenantId})
     </insert>
 
     <!-- 根据主键查询一条记录 -->
@@ -121,12 +118,14 @@
 
     <insert id="batchAdd" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id_">
         INSERT INTO student_payment_order_detail
-        (id_,type_,goods_id_list_,price_,remit_fee_,create_time_,update_time_,payment_order_id_,kit_group_purchase_type_,student_instrument_id_,is_renew_,tenant_id_)
+        (type_,goods_id_list_,price_,remit_fee_,create_time_,update_time_,payment_order_id_,
+         kit_group_purchase_type_,student_instrument_id_,is_renew_,tenant_id_)
         VALUE
         <foreach collection="studentPaymentOrderDetailList" item="orderDetail" separator=",">
-            (#{orderDetail.id},#{orderDetail.type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+            (#{orderDetail.type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             #{orderDetail.goodsIdList},#{orderDetail.price},#{orderDetail.remitFee},now(),now(),#{orderDetail.paymentOrderId},
-            #{orderDetail.kitGroupPurchaseType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{orderDetail.studentInstrumentId},#{orderDetail.isRenew},#{orderDetail.tenantId})
+            #{orderDetail.kitGroupPurchaseType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+            #{orderDetail.studentInstrumentId},#{orderDetail.isRenew},#{orderDetail.tenantId})
         </foreach>
     </insert>
 

+ 3 - 24
mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml

@@ -40,6 +40,7 @@
         <result column="activity_id_" property="activityId"/>
         <result column="activity_buy_num_" property="activityBuyNum"/>
         <result column="tenant_id_" property="tenantId"/>
+        <result column="calender_id_" property="calenderId"/>
     </resultMap>
 
     <resultMap type="com.ym.mec.biz.dal.dto.StudentPaymentOrderDto" extends="StudentPaymentOrder"
@@ -109,7 +110,7 @@
          balance_payment_amount_, remit_fee_, course_remit_fee_, trans_no_,
          status_, memo_, create_time_, update_time_, payment_channel_, payment_business_channel_,
          payment_account_no_, mer_nos_, order_no_, music_group_id_, class_group_id_, pay_time_,batch_no_,coupon_code_id_,
-         coupon_remit_fee_,activity_id_,activity_buy_num_,tenant_id_)
+         coupon_remit_fee_,activity_id_,activity_buy_num_,tenant_id_,calender_id_)
         VALUES (#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
                 #{userId}, #{organId}, #{routingOrganId},
                 #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
@@ -118,7 +119,7 @@
                 #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{memo}, now(), now(),
                 #{paymentChannel}, #{paymentBusinessChannel}, #{paymentAccountNo}, #{merNos}, #{orderNo},
                 #{musicGroupId},
-                #{classGroupId}, #{payTime},#{batchNo},#{couponCodeId},#{couponRemitFee},#{activityId},#{activityBuyNum},#{tenantId})
+                #{classGroupId}, #{payTime},#{batchNo},#{couponCodeId},#{couponRemitFee},#{activityId},#{activityBuyNum},#{tenantId},#{calenderId})
     </insert>
 
 
@@ -404,19 +405,6 @@
         </where>
     </sql>
 
-    <select id="queryApplyGoodsList" resultMap="Goods" parameterType="map">
-        select g.*
-        from goods g
-        where g.id_ in (SELECT spod.goods_id_list_
-                        FROM student_payment_order spo
-                                 left join
-                             student_payment_order_detail spod on spo.id_ = spod.payment_order_id_
-                        where spo.music_group_id_ =
-                              #{musicGroupId}
-                          and spo.type_ = 'APPLY'
-                          and spod.type_ =
-                              #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler})
-    </select>
     <select id="queryByCondition" resultMap="StudentPaymentOrder" parameterType="map">
         SELECT spo.*
         FROM student_payment_order spo
@@ -572,15 +560,6 @@
           AND spo.type_ = 'APPLY' and spo.status_ = 'SUCCESS'
         GROUP BY sr.user_id_;
     </select>
-    <select id="findOrderByGroupType" resultType="int">
-        SELECT COUNT(id_) FROM student_payment_order
-        WHERE group_type_ = #{groupType}
-        AND user_id_ = #{userId}
-        AND music_group_id_ = #{sporadicId}
-        <if test="status != null">
-            AND status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
-        </if>
-    </select>
     <select id="findPaymentOrderByGroupType" resultMap="StudentPaymentOrder">
         SELECT * FROM student_payment_order
         WHERE group_type_ = #{groupType}

+ 18 - 4
mec-biz/src/main/resources/config/mybatis/SysCouponCodeMapper.xml

@@ -16,6 +16,8 @@
 		<result column="use_start_date_" property="useStartDate" />
 		<result column="use_deadline_date_" property="useDeadlineDate" />
 		<result column="payment_order_id_" property="paymentOrderId" />
+		<result column="issue_id_" property="issueId" />
+		<result column="type_" property="type" />
 		<result column="create_time_" property="createTime" />
 		<result column="update_time_" property="updateTime" />
         <result column="tenant_id_" property="tenantId"/>
@@ -40,6 +42,7 @@
 		<result column="used_time_" property="usedTime"/>
 		<result column="use_start_date_" property="useStartDate"/>
 		<result column="use_deadline_date_" property="useDeadlineDate"/>
+		<result column="issueType" property="issueType"/>
 	</resultMap>
 
 	<!-- 根据主键查询一条记录 -->
@@ -60,18 +63,18 @@
 		</selectKey>
 		-->
 		INSERT INTO sys_coupon_code (coupon_id_,code_,usage_status_,user_id_,used_time_,use_start_date_,use_deadline_date_,
-		                             payment_order_id_,create_time_,update_time_,tenant_id_)
+		                             payment_order_id_,issue_id_,type_,create_time_,update_time_,tenant_id_)
 							 VALUES(#{couponId},#{code},#{usageStatus},#{userId},#{usedTime},#{useStartDate},#{useDeadlineDate},
-									#{paymentOrderId},NOW(),NOW(),#{tenantId})
+									#{paymentOrderId},#{issueId},#{type},NOW(),NOW(),#{tenantId})
 	</insert>
 
 	<insert id="batchInsert" parameterType="com.ym.mec.biz.dal.entity.SysCouponCode" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
 		INSERT INTO sys_coupon_code (coupon_id_,code_,usage_status_,user_id_,used_time_,use_start_date_,use_deadline_date_,
-		payment_order_id_,create_time_,update_time_,tenant_id_)
+		payment_order_id_,issue_id_,type_,create_time_,update_time_,tenant_id_)
 		VALUE
 		<foreach collection="couponCodes" item="couponCode" separator=",">
 			(#{couponCode.couponId},#{couponCode.code},#{couponCode.usageStatus},#{couponCode.userId},#{couponCode.usedTime},#{couponCode.useStartDate},#{couponCode.useDeadlineDate},
-			#{couponCode.paymentOrderId},NOW(),NOW(),#{tenantId})
+			#{couponCode.paymentOrderId},#{couponCode.issueId},#{couponCode.type},NOW(),NOW(),#{couponCode.tenantId})
 		</foreach>
 	</insert>
 
@@ -100,6 +103,12 @@
 			<if test="paymentOrderId != null">
 				payment_order_id_ = #{paymentOrderId},
 			</if>
+            <if test="issueId != null">
+                issue_id_ = #{issueId},
+            </if>
+            <if test="type != null">
+                type_ = #{type},
+            </if>
 			<if test="useDeadlineDate != null">
 				use_deadline_date_ = #{useDeadlineDate},
 			</if>
@@ -168,6 +177,9 @@
 			<if test="search!=null and search!=''">
 				AND (scc.user_id_=#{search} OR su.phone_=#{search} OR su.username_ LIKE CONCAT('%', #{search}, '%'))
 			</if>
+			<if test="issueType !=null">
+                AND scc.type_ = #{issueType}
+            </if>
 		</where>
 	</sql>
 
@@ -189,6 +201,7 @@
 			scc.use_start_date_,
 			scc.use_deadline_date_,
 			scc.used_time_,
+            scc.type_ as issueType,
 		    IF(scc.usage_status_ = 0 AND scc.use_deadline_date_ &lt; NOW(),2,scc.usage_status_) usage_status_
 		FROM sys_coupon_code scc
 			 LEFT JOIN sys_coupon sc ON scc.coupon_id_=sc.id_
@@ -245,6 +258,7 @@
 		scc.use_start_date_,
 		scc.use_deadline_date_,
 		scc.used_time_,
+		 scc.type_ as issueType,
 		IF(scc.usage_status_ = 0 AND scc.use_deadline_date_ &lt; NOW(),2,scc.usage_status_) usage_status_
 		FROM sys_coupon_code scc
 		LEFT JOIN sys_coupon sc ON scc.coupon_id_=sc.id_

+ 76 - 0
mec-biz/src/main/resources/config/mybatis/SysCouponIssueRecordMapper.xml

@@ -0,0 +1,76 @@
+<?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.SysCouponIssueRecordDao">
+    <resultMap id="BaseResultMap" type="com.ym.mec.biz.dal.entity.SysCouponIssueRecord">
+        <id column="id_" jdbcType="INTEGER" property="id"/>
+        <result column="tenant_id_" jdbcType="INTEGER" property="tenantId"/>
+        <result column="coupon_id_" jdbcType="INTEGER" property="couponId"/>
+        <result column="coupon_name_" jdbcType="VARCHAR" property="couponName"/>
+        <result column="num_" jdbcType="INTEGER" property="num"/>
+        <result column="ops_" jdbcType="INTEGER" property="ops"/>
+        <result column="created_by_" jdbcType="INTEGER" property="createdBy"/>
+        <result column="created_time_" jdbcType="TIMESTAMP" property="createdTime"/>
+        <result column="updated_by_" jdbcType="INTEGER" property="updatedBy"/>
+        <result column="updated_time_" jdbcType="TIMESTAMP" property="updatedTime"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id_
+        , tenant_id_, coupon_id_, coupon_name_, num_, ops_, created_by_, created_time_, updated_by_, updated_time_
+    </sql>
+
+    <insert id="insertBatch" keyColumn="id_" keyProperty="id" useGeneratedKeys="true"
+            parameterType="com.ym.mec.biz.dal.entity.SysCouponIssueRecord">
+        insert into sys_coupon_issue_record(tenant_id_, coupon_id_, coupon_name_, num_, ops_, created_by_,
+        created_time_, updated_by_, updated_time_)
+        values
+        <foreach collection="entities" item="entity" separator=",">
+            (#{entity.tenantId}, #{entity.couponId}, #{entity.couponName}, #{entity.num}, #{entity.ops},
+            #{entity.createdBy}, #{entity.createdTime}, #{entity.updatedBy}, #{entity.updatedTime})
+        </foreach>
+    </insert>
+
+    <select id="queryIssueDetail" parameterType="map" resultType="map">
+        SELECT o.name_ as organName
+        , s.user_id_ as userId
+        , su.username_ as userName
+        , su.phone_ as phone
+        , sb.name_ as subjectName
+        , scc.usage_status_ as usageStatus
+        FROM student s
+        LEFT JOIN sys_user su ON su.id_ = s.user_id_
+        LEFT JOIN organization o ON o.id_ = su.organ_id_
+        LEFT JOIN subject sb ON sb.id_ = s.subject_id_list_
+        join sys_coupon_code scc on s.user_id_ = scc.user_id_
+        where s.tenant_id_ = #{param.tenantId}
+        <if test="param.issueId !=null">
+            and scc.issue_id_ = #{param.issueId}
+        </if>
+        <if test="param.organId !=null">
+            and o.id_ = #{param.organId}
+        </if>
+        <if test="param.subjectId !=null">
+            and sb.id_ = #{param.subjectId}
+        </if>
+        <if test="param.usageStatus !=null">
+            and scc.usage_status_ = #{param.usageStatus}
+        </if>
+    </select>
+
+    <select id="queryIssueRecord" parameterType="map" resultType="com.ym.mec.biz.dal.vo.CouponIssueRecordVo">
+        select a.created_time_ as createdTime,
+        a.coupon_name_ as couponName,
+        a.num_ as num,
+        u.real_name_ as `name`,
+        a.ops_ as ops
+        from sys_coupon_issue_record as a
+        left join sys_user as u on a.created_by_ = u.id_
+        where a.tenant_id_ = #{param.tenantId}
+        <if test="param.couponId !=null">
+          and a.coupon_id_ =#{param.couponId}
+        </if>
+        <if test="param.search !=null">
+            and a.coupon_name_ like concat('%',#{param.search},'%')
+        </if>
+    </select>
+</mapper>

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

@@ -11,7 +11,9 @@
 		<result column="name_" property="name" />
 		<result column="description_" property="description" />
 		<result column="status_" property="status" />
+        <result column="issuance_type_" jdbcType="INTEGER" property="issuanceType"/>
 		<result column="type_" property="type" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result column="type_detail_" jdbcType="VARCHAR" property="typeDetail"/>
 		<result column="face_value_" property="faceValue" />
 		<result column="full_amount_" property="fullAmount" />
 		<result column="limit_exchange_num_" property="limitExchangeNum" />
@@ -42,10 +44,12 @@
 
 	<!-- 向数据库增加一条记录 -->
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.SysCoupon" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
-		INSERT INTO sys_coupon (id_,name_,description_,status_,type_,face_value_,full_amount_,limit_exchange_num_,effective_type_,deadline_,
+		INSERT INTO sys_coupon (id_,name_,description_,status_,issuance_type_,type_,type_detail_,face_value_,full_amount_,limit_exchange_num_,effective_type_,deadline_,
 		                        effective_start_time_, effective_expire_time_,end_date_,start_date_,stock_count_,consume_num_,warning_stock_num_,
 		                        create_time_,update_time_,tenant_id_)
-		                        VALUES(#{id},#{name},#{description},#{status},#{type, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{faceValue},#{fullAmount},#{limitExchangeNum},
+		                        VALUES(#{id},#{name},#{description},#{status},#{issuanceType},
+		                               #{type, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+		                               #{typeDetail},#{faceValue},#{fullAmount},#{limitExchangeNum},
 		                               #{effectiveType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{deadline},
 		                               #{effectiveStartTime},#{effectiveExpireTime},#{endDate},#{startDate},#{stockCount},#{consumeNum},#{warningStockNum},
 		                               NOW(), NOW(),#{tenantId})

+ 6 - 2
mec-common/common-core/src/main/java/com/ym/mec/common/page/PageUtil.java

@@ -2,6 +2,7 @@ package com.ym.mec.common.page;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ym.mec.common.tenant.TenantContextHolder;
 
 import java.util.Map;
 import java.util.Objects;
@@ -52,16 +53,19 @@ public class PageUtil {
      * @param str   关键字
      * @return Optional
      */
-    public static <S, O> Optional<Integer> getPage(Map<S, O> param, String str) {
+    public static <O> Optional<Integer> getPage(Map<String, O> param, String str) {
         return Optional.ofNullable(param)
                 .map(p -> p.get(str))
                 .map(String::valueOf)
                 .map(Integer::valueOf);
     }
 
-    public static <S, O, T> Page<T> getPageInfo(Map<S, O> param) {
+    public static <O, T> Page<T> getPageInfo(Map<String, O> param) {
         int pageSize = getPage(param, "rows").orElse(20);
         int pageIndex = getPage(param, "page").orElse(1);
+        if (!param.containsKey("tenantId")) {
+            param.put("tenantId", (O) TenantContextHolder.getTenantId());
+        }
         return new Page<>(pageIndex, pageSize);
     }
 

+ 31 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/page/WrapperUtil.java

@@ -1,6 +1,7 @@
 package com.ym.mec.common.page;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ym.mec.common.exception.BizException;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 
@@ -73,6 +74,27 @@ public class WrapperUtil<T> {
         return this.hasIn(column, WrapperUtil.toList(val));
     }
 
+    public static <S, O> String toStr(Map<S, O> map, S str) {
+        Optional<O> o = Optional.ofNullable(map)
+                .map(m -> m.get(str));
+        return strOptional(o)
+                .orElse(null);
+    }
+
+    public static <S, O> String toStr(Map<S, O> map, S str, String exMsg) {
+        Optional<O> o = Optional.ofNullable(map)
+                .map(m -> m.get(str));
+        return strOptional(o)
+                .orElseThrow(() -> new BizException(exMsg));
+    }
+
+    private static <O> Optional<String> strOptional(Optional<O> optional) {
+        return optional
+                .filter(s -> s instanceof String)
+                .map(String::valueOf)
+                .filter(StringUtils::isNotBlank);
+    }
+
     public static List<String> toList(String key) {
         return toList(key, ",");
     }
@@ -104,4 +126,13 @@ public class WrapperUtil<T> {
         return Arrays.stream(b).filter(StringUtils::isNotBlank).collect(Collectors.toList());
     }
 
+    /**
+     * 全部有值则为true
+     *
+     * @param obj 多个对象
+     */
+    public static boolean checkObj(Object... obj) {
+        return Arrays.stream(obj).noneMatch(Objects::isNull);
+    }
+
 }

+ 95 - 159
mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupController.java

@@ -1,66 +1,37 @@
 package com.ym.mec.student.controller;
 
-import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentType.ADD_STUDENT;
-import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentType.MUSIC_APPLY;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.stream.Collectors;
-
-import javax.annotation.Resource;
-
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpStatus;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDao;
 import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDetailDao;
 import com.ym.mec.biz.dal.dao.StudentPreRegistrationDao;
 import com.ym.mec.biz.dal.dto.MusicGroupSubjectGoodsAndInfoDto;
 import com.ym.mec.biz.dal.dto.RegisterPayDto;
 import com.ym.mec.biz.dal.dto.RenewParamDto;
-import com.ym.mec.biz.dal.entity.ApprovalStatus;
-import com.ym.mec.biz.dal.entity.Goods;
-import com.ym.mec.biz.dal.entity.MusicGroup;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentCalenderStatusEnum;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail;
-import com.ym.mec.biz.dal.entity.MusicGroupQuit;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus;
-import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
-import com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail;
-import com.ym.mec.biz.dal.entity.StudentPreRegistration;
-import com.ym.mec.biz.dal.entity.StudentRegistration;
-import com.ym.mec.biz.dal.enums.CourseViewTypeEnum;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
-import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.MusicGroupStatusEnum;
 import com.ym.mec.biz.dal.enums.OrderDetailTypeEnum;
-import com.ym.mec.biz.dal.enums.OrderTypeEnum;
-import com.ym.mec.biz.dal.enums.PayStatus;
 import com.ym.mec.biz.dal.enums.PaymentStatusEnum;
-import com.ym.mec.biz.service.MusicGroupService;
-import com.ym.mec.biz.service.MusicGroupSubjectPlanService;
-import com.ym.mec.biz.service.OrganizationService;
-import com.ym.mec.biz.service.StudentPaymentOrderDetailService;
-import com.ym.mec.biz.service.StudentPaymentOrderService;
-import com.ym.mec.biz.service.StudentRegistrationService;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 @RequestMapping("musicGroup")
 @Api(tags = "乐团服务")
@@ -82,7 +53,7 @@ public class MusicGroupController extends BaseController {
     @Autowired
     private MusicGroupPaymentCalenderDetailDao musicGroupPaymentCalenderDetailDao;
     @Autowired
-    private MusicGroupPaymentCalenderDao musicGroupPaymentCalenderDao;
+    private MusicGroupPaymentCalenderService musicGroupPaymentCalenderService;
     @Autowired
     private StudentPreRegistrationDao studentPreRegistrationDao;
     @Autowired
@@ -101,7 +72,6 @@ public class MusicGroupController extends BaseController {
         if (sysUser == null) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
-
         return succeed(studentPreRegistrationDao.queryByMusicGroupIdAndUserId(sysUser.getId(), musicGroupId));
     }
 
@@ -169,41 +139,57 @@ public class MusicGroupController extends BaseController {
         if (sysUser != null && Objects.nonNull(sysUser.getId())) {
             userId = sysUser.getId();
         }
-
         StudentRegistration studentRegistration = studentRegistrationService.queryByUserIdAndMusicGroupId(userId, musicGroupId);
         if (studentRegistration == null) {
             return failed(HttpStatus.CONTINUE, "乐团报名信息不存在");
         }
-        
+
         // 判断是否可以继续购买
         List<StudentPaymentOrderDetail> studentPaymentOrderDetailList = studentPaymentOrderDetailService.findUserApplyOrder(userId, musicGroupId, DealStatusEnum.SUCCESS);
+
         if(studentPaymentOrderDetailList != null && studentPaymentOrderDetailList.size() > 0){
-        	List<OrderDetailTypeEnum> typeList = studentPaymentOrderDetailList.stream().map(t -> t.getType()).collect(Collectors.toList());
-        	//判断是否所有类型都购买完
-			if (musicGroup.getCourseViewType() == CourseViewTypeEnum.MEMBER_FEE) {
-				if (typeList.contains(OrderDetailTypeEnum.MUSICAL) && typeList.contains(OrderDetailTypeEnum.ACCESSORIES)
-						&& (typeList.contains(OrderDetailTypeEnum.CLOUD_TEACHER) || typeList.contains(OrderDetailTypeEnum.CLOUD_TEACHER_PLUS))) {
-					return failed(HttpStatus.PROCESSING, "您已缴费,请等待乐团开启");
-				}
-			} else {
-				if (typeList.contains(OrderDetailTypeEnum.MUSICAL)
-						&& typeList.contains(OrderDetailTypeEnum.ACCESSORIES)
-						&& (typeList.contains(OrderDetailTypeEnum.CLOUD_TEACHER) || typeList.contains(OrderDetailTypeEnum.CLOUD_TEACHER_PLUS) || typeList.contains(OrderDetailTypeEnum.COURSE)
-								|| typeList.contains(OrderDetailTypeEnum.HIGH_ONLINE_COURSE) || typeList.contains(OrderDetailTypeEnum.SINGLE)
-								|| typeList.contains(OrderDetailTypeEnum.MIX) || typeList.contains(OrderDetailTypeEnum.HIGH)
-								|| typeList.contains(OrderDetailTypeEnum.VIP) || typeList.contains(OrderDetailTypeEnum.DEMO)
-								|| typeList.contains(OrderDetailTypeEnum.COMPREHENSIVE) || typeList.contains(OrderDetailTypeEnum.ENLIGHTENMENT)
-								|| typeList.contains(OrderDetailTypeEnum.TRAINING_SINGLE) || typeList.contains(OrderDetailTypeEnum.TRAINING_MIX)
-								|| typeList.contains(OrderDetailTypeEnum.HIGH_ONLINE) || typeList.contains(OrderDetailTypeEnum.MUSIC_NETWORK) || typeList
-									.contains(OrderDetailTypeEnum.CLASSROOM))) {
-					return failed(HttpStatus.PROCESSING, "您已缴费,请等待乐团开启");
-				}
-			}
+            List<OrderDetailTypeEnum> typeList = studentPaymentOrderDetailList.stream().map(t -> t.getType()).collect(Collectors.toList());
+            //如果乐器和辅件都买过/那么看是否购买过其他的缴费项
+            if (typeList.contains(OrderDetailTypeEnum.MUSICAL) && typeList.contains(OrderDetailTypeEnum.ACCESSORIES)) {
+                MusicGroupPaymentCalender paymentCalender = musicGroupPaymentCalenderService.getApplyCalenderByMusicId(musicGroupId);
+                HashMap<String, Object> calenderDetail = new HashMap<>(4);
+                musicGroupPaymentCalenderService.getCalenderDetail(calenderDetail,paymentCalender.getId());
+                boolean flag = false;
+                //是否购买乐团课
+                if(Objects.nonNull(calenderDetail.get("course"))){
+                    if(typeList.contains(OrderDetailTypeEnum.COURSE)
+                            || typeList.contains(OrderDetailTypeEnum.HIGH_ONLINE_COURSE) || typeList.contains(OrderDetailTypeEnum.SINGLE)
+                            || typeList.contains(OrderDetailTypeEnum.MIX) || typeList.contains(OrderDetailTypeEnum.HIGH)
+                            || typeList.contains(OrderDetailTypeEnum.DEMO) || typeList.contains(OrderDetailTypeEnum.CLASSROOM)
+                            || typeList.contains(OrderDetailTypeEnum.COMPREHENSIVE) || typeList.contains(OrderDetailTypeEnum.ENLIGHTENMENT)
+                            || typeList.contains(OrderDetailTypeEnum.TRAINING_SINGLE) || typeList.contains(OrderDetailTypeEnum.TRAINING_MIX)
+                            || typeList.contains(OrderDetailTypeEnum.HIGH_ONLINE) || typeList.contains(OrderDetailTypeEnum.MUSIC_NETWORK)){
+                        flag = true;
+                    }else {
+                        flag = false;
+                    }
+                }
+                //是否购买会员
+                if(Objects.nonNull(calenderDetail.get("member"))){
+                    if(typeList.contains(OrderDetailTypeEnum.CLOUD_TEACHER) || typeList.contains(OrderDetailTypeEnum.CLOUD_TEACHER_PLUS)){
+                        flag = true;
+                    }else {
+                        flag = false;
+                    }
+                }
+                //是否购买活动包
+                if(Objects.nonNull(calenderDetail.get("activity"))){
+                    if(typeList.contains(OrderDetailTypeEnum.VIP) || typeList.contains(OrderDetailTypeEnum.PRACTICE)){
+                        flag = true;
+                    }else {
+                        flag = false;
+                    }
+                }
+                if(flag){
+                    return failed(HttpStatus.PROCESSING, "您已缴费,请等待乐团开启");
+                }
+            }
         }
-        
-        /*if (studentRegistration.getPaymentStatus() != null && studentRegistration.getPaymentStatus() == PaymentStatusEnum.YES) {
-            
-        }*/
 
         if (studentRegistration.getPaymentStatus() == PaymentStatusEnum.NO) {
             return failed("乐团还未开启缴费,请等待通知");
@@ -228,58 +214,6 @@ public class MusicGroupController extends BaseController {
         return succeed(studentRegistration);
     }
 
-    @ApiOperation(value = "续费")
-    @PostMapping("/renew")
-    public HttpResponseResult renew(@RequestBody RenewParamDto renewParamDto) throws Exception {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        Integer userId = sysUser.getId();
-        Long calenderId = renewParamDto.getCalenderId();
-        if(calenderId == null){
-            throw new BizException("参数校验失败");
-        }
-        MusicGroupPaymentCalender calender = musicGroupPaymentCalenderDao.get(calenderId);
-        if (renewParamDto.getRepeatPay() == false) {
-            MusicGroupPaymentCalender.PaymentType paymentType = calender.getPaymentType();
-            OrderTypeEnum type = paymentType== ADD_STUDENT?OrderTypeEnum.ADD_STUDENT:paymentType == MUSIC_APPLY?OrderTypeEnum.APPLY:OrderTypeEnum.RENEW;
-            // 判断是否存在支付中的记录
-            List<StudentPaymentOrder> list = studentPaymentOrderService.queryByCondition(GroupType.MUSIC, calender.getMusicGroupId(), userId, DealStatusEnum.ING,
-                    type);
-            if (list != null && list.size() > 0) {
-                for (StudentPaymentOrder order : list) {
-                    // 查询订单状态
-                    PayStatus payStatus = studentPaymentOrderService.queryPayStatus(order.getPaymentChannel(), order.getOrderNo(), order.getTransNo());
-                    if(payStatus == PayStatus.SUCCESSED){
-                        throw new BizException("订单已支付成功,请勿重复支付");
-                    }/*else if(payStatus == PayStatus.PAYING){
-                        throw new BizException("订单还在交易中,请稍后重试");
-                    }*/
-                    return failed(HttpStatus.CONTINUE, "您有待支付的订单");
-                }
-            }
-        }
-        MusicGroupPaymentCalenderDetail calenderDetail = musicGroupPaymentCalenderDetailDao.findByCalenderIdAndUserId(calenderId, userId);
-        if (calenderDetail == null) {
-            throw new BizException("缴费项不存在该学员,请联系教务老师");
-        }
-        if (calenderDetail.getPaymentStatus() == PaymentStatus.PAID_COMPLETED) {
-            throw new BizException("您已缴费,请勿重复提交");
-        }
-        //缴费项目已开启或者单独开启
-        Map renew;
-        if (calender.getStatus() == PaymentCalenderStatusEnum.OPEN || calenderDetail.getOpen() == 1) {
-            renewParamDto.setUserId(userId);
-            renew = musicGroupService.renew(renewParamDto);
-        } else if (calender.getStatus() == PaymentCalenderStatusEnum.OVER) {
-            throw new BizException("缴费已截止,如有问题请联系指导老师");
-        } else {
-            throw new BizException("缴费暂未开始,如有问题请联系指导老师");
-        }
-        if (renew.containsKey("tradeState")) {
-            return failed(HttpStatus.CREATED, renew, "恭喜您,缴费成功!");
-        }
-        return succeed(renew);
-    }
-
     @ApiOperation(value = "申请退团")
     @PostMapping("/quitMusicGroup")
     @ApiImplicitParams({@ApiImplicitParam(name = "musicGroupId", value = "乐团id", required = true, dataType = "String"),
@@ -328,62 +262,63 @@ public class MusicGroupController extends BaseController {
         return succeed(null);
     }
 
+    @ApiOperation(value = "续费")
+    @PostMapping("/renew")
+    public HttpResponseResult renew(@RequestBody RegisterPayDto renewParamDto) throws Exception {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        Integer userId = sysUser.getId();
+        Long calenderId = renewParamDto.getCalenderId();
+        if(calenderId == null){
+            throw new BizException("参数校验失败");
+        }
+        MusicGroupPaymentCalender calender = musicGroupPaymentCalenderService.get(calenderId);
+        MusicGroupPaymentCalenderDetail calenderDetail = musicGroupPaymentCalenderDetailDao.findByCalenderIdAndUserId(calenderId, userId);
+        if (calenderDetail == null) {
+            throw new BizException("缴费项不存在该学员,请联系教务老师");
+        }
+        if (calenderDetail.getPaymentStatus() == PaymentStatus.PAID_COMPLETED) {
+            throw new BizException("您已缴费,请勿重复提交");
+        }
+        //缴费项目已开启或者单独开启
+        if (calender.getStatus() == PaymentCalenderStatusEnum.OPEN || calenderDetail.getOpen() == 1) {
+            renewParamDto.setUserId(userId);
+            renewParamDto.setBatchNo(calender.getBatchNo());
+            return musicGroupService.renew(renewParamDto);
+        } else if (calender.getStatus() == PaymentCalenderStatusEnum.OVER) {
+            throw new BizException("缴费已截止,如有问题请联系指导老师");
+        } else {
+            throw new BizException("缴费暂未开始,如有问题请联系指导老师");
+        }
+    }
+
     @ApiOperation(value = "乐团报名支付")
     @PostMapping("/pay")
     public HttpResponseResult pay(@RequestBody RegisterPayDto registerPayDto) throws Exception {
-
         StudentRegistration studentRegistration = studentRegistrationService.get(registerPayDto.getRegisterId().longValue());
         if (studentRegistration == null) {
             return failed("报名信息有误,请核查");
         }
-
         String err = studentRegistrationService.checkRegOrPayStatus(studentRegistration.getMusicGroupId());
         if (err != null) {
             return failed(err + "不可缴费,请联系教务老师");
         }
-
-        Integer userId = studentRegistration.getUserId();
-
-        //判断用户是否已存在订单
-        List<StudentPaymentOrder> applyOrderList = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, studentRegistration.getMusicGroupId(), DealStatusEnum.ING);
-        
-        if (applyOrderList != null && applyOrderList.size() > 0) {
-        	StudentPaymentOrder applyOrder = applyOrderList.get(0);
-        	// 查询订单状态
-            PayStatus payStatus = studentPaymentOrderService.queryPayStatus(applyOrder.getPaymentChannel(), applyOrder.getOrderNo(), applyOrder.getTransNo());
-            if(payStatus == PayStatus.SUCCESSED){
-        		throw new BizException("订单已支付成功,请勿重复支付");
-        	}
-            return failed(HttpStatus.CONTINUE, "您有待支付的订单");
-        }
-        Map payMap = musicGroupService.pay(registerPayDto);
-        if (payMap.containsKey("hasPaidZero")) {
-            return failed(HttpStatus.RESET_CONTENT, payMap, "报名审核中");
-        }
-        if (payMap.containsKey("tradeState")) {
-            return failed(HttpStatus.CREATED, payMap, "恭喜您,报名成功!");
-        }
-        return succeed(payMap);
+        registerPayDto.setUserId(studentRegistration.getUserId());
+        registerPayDto.setMusicGroupId(studentRegistration.getMusicGroupId());
+        return musicGroupService.pay(registerPayDto);
     }
 
     @ApiOperation(value = "乐团报名重新支付")
     @PostMapping("/rePay")
     @ApiImplicitParams({@ApiImplicitParam(name = "registerPayDto", value = "支付信息", required = true, dataType = "RegisterPayDto")})
     public HttpResponseResult rePay(@RequestBody RegisterPayDto registerPayDto) throws Exception {
-        StudentRegistration studentRegistration = studentRegistrationService.get(registerPayDto.getRegisterId().longValue());
+        /*StudentRegistration studentRegistration = studentRegistrationService.get(registerPayDto.getRegisterId().longValue());
         if (studentRegistration == null) {
             return failed("报名信息有误,请核查");
         }
-
         String err = studentRegistrationService.checkRegOrPayStatus(studentRegistration.getMusicGroupId());
         if (err != null) {
             return failed(err + "不可缴费,请联系教务老师");
         }
-//        Integer userId = studentRegistration.getUserId();
-        /*StudentPaymentOrder ApplyOrder = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, studentRegistration.getMusicGroupId(), DealStatusEnum.SUCCESS);
-        if (ApplyOrder != null) {
-            return failed("您已支付成功,请勿重复支付");
-        }*/
         Map payMap = musicGroupService.rePay(registerPayDto);
         if (payMap.containsKey("hasPaidZero")) {
             return failed(HttpStatus.RESET_CONTENT, payMap, "报名审核中");
@@ -391,7 +326,8 @@ public class MusicGroupController extends BaseController {
         if (payMap.containsKey("tradeState")) {
             return failed(HttpStatus.CREATED, payMap, "恭喜您,报名成功!");
         }
-        return succeed(payMap);
+        return succeed(payMap);*/
+        return failed("操作失败,请联系管理员");
     }
 
     @ApiOperation(value = "订单状态查询")

+ 1 - 4
mec-student/src/main/java/com/ym/mec/student/controller/SporadicChargeInfoController.java

@@ -77,10 +77,7 @@ public class SporadicChargeInfoController extends BaseController {
                 PayStatus payStatus = studentPaymentOrderService.queryPayStatus(applyOrder.getPaymentChannel(), applyOrder.getOrderNo(), applyOrder.getTransNo());
                 if(payStatus == PayStatus.SUCCESSED){
             		throw new BizException("订单已支付成功,请勿重复支付");
-            	}/*else if(payStatus == PayStatus.PAYING){
-            		throw new BizException("订单还在交易中,请稍后重试");
-            	}*/
-                
+            	}
                 return failed(HttpStatus.CONTINUE, "您有待支付的订单");
             }
         }

+ 38 - 33
mec-student/src/main/java/com/ym/mec/student/controller/SysCouponCodeController.java

@@ -4,6 +4,7 @@ import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.page.SysCouponCodeQueryInfo;
 import com.ym.mec.biz.service.SysCouponCodeService;
+import com.ym.mec.biz.service.SysCouponIssueRecordService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.page.QueryInfo;
@@ -19,37 +20,41 @@ import org.springframework.web.bind.annotation.RestController;
 @RestController
 public class SysCouponCodeController extends BaseController {
 
-	@Autowired
-	private SysCouponCodeService sysCouponCodeService;
-	@Autowired
-	private SysUserFeignService sysUserFeignService;
-
-	@ApiOperation("分页查询")
-	@RequestMapping(value = "queryPage")
-	public HttpResponseResult queryPage(SysCouponCodeQueryInfo queryInfo) {
-		SysUser sysUser = sysUserFeignService.queryUserInfo();
-		if (sysUser != null && sysUser.getId() != null) {
-			queryInfo.setUserId(sysUser.getId());
-		}
-		if(queryInfo.getUserId() == null){
-			return failed("请登录");
-		}
-		return succeed(sysCouponCodeService.querySysCouponUseList(queryInfo));
-	}
-
-	@ApiOperation("获取云教练活动跑马灯")
-	@RequestMapping(value = "queryPageAll")
-	public HttpResponseResult queryPageAll(QueryInfo queryInfo) {
-		return succeed(sysCouponCodeService.queryHorseRaceLampDtoList(queryInfo));
-	}
-
-	@ApiOperation("兑换优惠券")
-	@PostMapping(value = "exchangeCoupon")
-	public HttpResponseResult exchangeCoupon(Integer couponId, Long paymentOrderId, Integer exchangeNum){
-		SysUser sysUser = sysUserFeignService.queryUserInfo();
-		if (sysUser == null) {
-			return failed("用户信息获取失败");
-		}
-		return succeed(sysCouponCodeService.exchangeCouponTest(sysUser.getId(), couponId, paymentOrderId, exchangeNum));
-	}
+    @Autowired
+    private SysCouponCodeService sysCouponCodeService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private SysCouponIssueRecordService couponIssueRecordService;
+
+
+    @ApiOperation("分页查询")
+    @RequestMapping(value = "queryPage")
+    public HttpResponseResult queryPage(SysCouponCodeQueryInfo queryInfo) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser != null && sysUser.getId() != null) {
+            queryInfo.setUserId(sysUser.getId());
+        }
+        if (queryInfo.getUserId() == null) {
+            return failed("请登录");
+        }
+        return succeed(sysCouponCodeService.querySysCouponUseList(queryInfo));
+    }
+
+    @ApiOperation("获取云教练活动跑马灯")
+    @RequestMapping(value = "queryPageAll")
+    public HttpResponseResult queryPageAll(QueryInfo queryInfo) {
+        return succeed(sysCouponCodeService.queryHorseRaceLampDtoList(queryInfo));
+    }
+
+    @ApiOperation("兑换优惠券")
+    @PostMapping(value = "exchangeCoupon")
+    public HttpResponseResult exchangeCoupon(Integer couponId, Long paymentOrderId, Integer exchangeNum) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        return succeed(sysCouponCodeService.exchangeCouponTest(sysUser.getId(), couponId, paymentOrderId, exchangeNum));
+    }
+
 }

+ 1 - 1
mec-web/src/main/java/com/ym/mec/web/controller/MusicGroupController.java

@@ -293,7 +293,7 @@ public class MusicGroupController extends BaseController {
 		if(musicGroupRegsDto.getRegisterIds().size() <=0){
 			return failed("请选择要添加的学员");
 		}
-		return succeed(musicGroupService.addMusicGroupRegs(musicGroupRegsDto.getMusicGroupId(),musicGroupRegsDto.getRegisterIds()));
+		return musicGroupService.addMusicGroupRegs(musicGroupRegsDto.getMusicGroupId(),musicGroupRegsDto.getRegisterIds());
 	}
 
 	@ApiOperation(value = "关闭乐团")

+ 39 - 74
mec-web/src/main/java/com/ym/mec/web/controller/SysCouponController.java

@@ -1,6 +1,5 @@
 package com.ym.mec.web.controller;
 
-import com.ym.mec.biz.dal.dao.SysCouponDao;
 import com.ym.mec.biz.dal.entity.SysCoupon;
 import com.ym.mec.biz.dal.page.SysCouponQueryInfo;
 import com.ym.mec.biz.service.SysCouponService;
@@ -14,6 +13,7 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.validation.Valid;
 import java.util.Objects;
 
 @RequestMapping("sysCoupon")
@@ -21,81 +21,46 @@ import java.util.Objects;
 @RestController
 public class SysCouponController extends BaseController {
 
-	@Autowired
-	private SysCouponService sysCouponService;
-	@Autowired
-	private SysCouponDao sysCouponDao;
+    @Autowired
+    private SysCouponService sysCouponService;
 
-	@ApiOperation("新增")
-	@PostMapping(value = "add")
-	@PreAuthorize("@pcs.hasPermissions('sysCoupon/add')")
-	public HttpResponseResult add(SysCoupon sysCoupon) {
-		sysCoupon.setStatus(0);
-		sysCoupon.setConsumeNum(0);
-		sysCoupon.setWarningStatus(0);
-		if(Objects.isNull(sysCoupon.getType())){
-			return failed("请指定优惠券类型");
-		}
-		switch (sysCoupon.getType()){
-			case DISCOUNT:
-				if(Objects.isNull(sysCoupon.getFaceValue())){
-					return failed("请指定折扣比例");
-				}
-				break;
-			case FULL_REDUCTION:
-				if(Objects.isNull(sysCoupon.getFaceValue())){
-					return failed("请指定优惠金额");
-				}
-				if(Objects.isNull(sysCoupon.getFullAmount())){
-					return failed("请指定达标金额");
-				}
-				break;
-			default:
-				return failed("请指定优惠券类型");
-		}
-		switch (sysCoupon.getEffectiveType()){
-			case DAYS:
-				if(Objects.isNull(sysCoupon.getDeadline())){
-					return failed("请指定有效天数");
-				}
-				break;
-			case TIME_BUCKET:
-				if(Objects.isNull(sysCoupon.getEffectiveStartTime())||Objects.isNull(sysCoupon.getEffectiveExpireTime())){
-					return failed("请指定有效时间段");
-				}
-				break;
-			default:
-				return failed("请指定有效期类型");
-		}
-		return succeed(sysCouponService.insert(sysCoupon));
-	}
+    @ApiOperation("新增")
+    @PostMapping(value = "add")
+    @PreAuthorize("@pcs.hasPermissions('sysCoupon/add')")
+    public HttpResponseResult add(@Valid SysCoupon sysCoupon) {
+        try {
+            return succeed(sysCouponService.add(sysCoupon));
+        } catch (Exception e) {
+            return failed(e.getMessage());
+        }
+    }
 
-	@ApiOperation("修改")
-	@PostMapping(value = "updateCoupon")
-	@PreAuthorize("@pcs.hasPermissions('sysCoupon/updateCoupon')")
-	public HttpResponseResult updateCoupon(SysCoupon sysCoupon) {
-		sysCouponService.updateCoupon(sysCoupon);
-		return succeed();
-	}
+    @ApiOperation("修改")
+    @PostMapping(value = "updateCoupon")
+    @PreAuthorize("@pcs.hasPermissions('sysCoupon/updateCoupon')")
+    public HttpResponseResult updateCoupon(SysCoupon sysCoupon) {
+        sysCouponService.updateCoupon(sysCoupon);
+        return succeed();
+    }
 
-	@ApiOperation("删除")
-	@PostMapping(value = "delete")
-	@PreAuthorize("@pcs.hasPermissions('sysCoupon/delete')")
-	public HttpResponseResult del(Integer id) {
-		SysCoupon sysCoupon = sysCouponService.get(id);
-		if(Objects.isNull(sysCoupon)){
-			return failed("优惠券信息不存在");
-		}
-		if(sysCoupon.getConsumeNum()>0){
-			return failed("此优惠券已消耗,暂不可删除");
-		}
-		return succeed(sysCouponService.delete(id));
-	}
+    @ApiOperation("删除")
+    @PostMapping(value = "delete")
+    @PreAuthorize("@pcs.hasPermissions('sysCoupon/delete')")
+    public HttpResponseResult del(Integer id) {
+        SysCoupon sysCoupon = sysCouponService.get(id);
+        if (Objects.isNull(sysCoupon)) {
+            return failed("优惠券信息不存在");
+        }
+        if (sysCoupon.getConsumeNum() > 0) {
+            return failed("此优惠券已消耗,暂不可删除");
+        }
+        return succeed(sysCouponService.delete(id));
+    }
 
-	@ApiOperation("分页查询")
-	@RequestMapping(value = "queryPage")
-	@PreAuthorize("@pcs.hasPermissions('sysCoupon/queryPage')")
-	public HttpResponseResult queryPage(SysCouponQueryInfo queryInfo) {
-		return succeed(sysCouponService.queryPage(queryInfo));
-	}
+    @ApiOperation("分页查询")
+    @RequestMapping(value = "queryPage")
+//    @PreAuthorize("@pcs.hasPermissions('sysCoupon/queryPage')")
+    public HttpResponseResult queryPage(SysCouponQueryInfo queryInfo) {
+        return succeed(sysCouponService.queryPage(queryInfo));
+    }
 }

+ 60 - 0
mec-web/src/main/java/com/ym/mec/web/controller/SysCouponIssueRecordController.java

@@ -0,0 +1,60 @@
+package com.ym.mec.web.controller;
+
+
+import com.ym.mec.biz.service.SysCouponIssueRecordService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * 优惠券发放记录(SysCouponIssueRecord)表控制层
+ *
+ * @author hgw
+ * @since 2021-12-30 16:48:15
+ */
+@RestController
+@RequestMapping("/sysCouponIssue")
+public class SysCouponIssueRecordController extends BaseController {
+    /**
+     * 服务对象
+     */
+    @Resource
+    private SysCouponIssueRecordService couponIssueRecordService;
+
+    /**
+     * 手动发放优惠券
+     */
+    @ApiOperation("手动发放优惠券")
+    @PostMapping(value = "/issueCoupon")
+    public HttpResponseResult issueCoupon(@RequestBody Map<String, Object> param) {
+        couponIssueRecordService.issueCoupon(param);
+        return succeed();
+    }
+
+    @ApiOperation("撤销发放优惠券")
+    @PostMapping(value = "/revokeCoupon")
+    public HttpResponseResult revokeCoupon(Integer couponId) {
+        return succeed(couponIssueRecordService.revokeCoupon(couponId));
+    }
+
+    @ApiOperation("查询优惠券发放名单")
+    @PostMapping(value = "/queryIssueDetail")
+    public HttpResponseResult queryIssueDetail(@RequestBody Map<String, Object> param) {
+        return succeed(couponIssueRecordService.queryIssueDetail(param));
+    }
+
+    @ApiOperation("查询优惠券发放记录")
+    @PostMapping(value = "/queryIssueRecord")
+    public HttpResponseResult queryIssueRecord(@RequestBody Map<String, Object> param) {
+        return succeed(couponIssueRecordService.queryIssueRecord(param));
+    }
+
+}
+