Преглед изворни кода

Merge branch 'online1' of http://git.dayaedu.com/yonge/mec into vip_price_827

yonge пре 3 година
родитељ
комит
291d368012
83 измењених фајлова са 1370 додато и 500 уклоњено
  1. 1 1
      cms/src/main/java/com/ym/mec/cms/controller/NewsController.java
  2. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/config/SoundCompareConfig.java
  3. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPaymentOrderDao.java
  4. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPaymentOrderDetailDao.java
  5. 19 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysCouponCodeDao.java
  6. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysMusicScoreAccompanimentDao.java
  7. 13 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MaintenancePayDto.java
  8. 138 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MemberPayParamDto.java
  9. 40 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/PayParamBasicDto.java
  10. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/PracticeGroupBuyDto.java
  11. 1 12
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/RegisterPayDto.java
  12. 27 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/RenewParamDto.java
  13. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ReplacementPayDto.java
  14. 1 22
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SporadicPayDto.java
  15. 59 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SubjectChangeParamDto.java
  16. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SysCouponCodeDto.java
  17. 13 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/VipGroupBuyParamsDto.java
  18. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroup.java
  19. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SellOrder.java
  20. 44 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentGoodsSell.java
  21. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentPaymentOrder.java
  22. 25 15
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentRepair.java
  23. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/CloudTeacherOrderService.java
  24. 2 8
      mec-biz/src/main/java/com/ym/mec/biz/service/MemberRankSettingService.java
  25. 1 4
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupService.java
  26. 5 4
      mec-biz/src/main/java/com/ym/mec/biz/service/SellOrderService.java
  27. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentGoodsSellService.java
  28. 4 1
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentOrderDetailService.java
  29. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentOrderService.java
  30. 13 3
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentRegistrationService.java
  31. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/service/SubjectChangeService.java
  32. 18 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysCouponCodeService.java
  33. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/SysMusicScoreAccompanimentService.java
  34. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CloudTeacherOrderServiceImpl.java
  35. 15 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStudentPaymentServiceImpl.java
  36. 6 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/EduPracticeGroupServiceImpl.java
  37. 39 32
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MemberRankSettingServiceImpl.java
  38. 72 81
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  39. 12 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupServiceImpl.java
  40. 8 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ReplacementInstrumentActivityServiceImpl.java
  41. 36 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SellOrderServiceImpl.java
  42. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SporadicChargeInfoImpl.java
  43. 14 11
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkServiceImpl.java
  44. 20 9
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentGoodsSellServiceImpl.java
  45. 14 18
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentInstrumentServiceImpl.java
  46. 29 9
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderDetailServiceImpl.java
  47. 10 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  48. 12 29
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  49. 67 21
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRepairServiceImpl.java
  50. 40 18
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SubjectChangeServiceImpl.java
  51. 69 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysCouponCodeServiceImpl.java
  52. 4 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMessageServiceImpl.java
  53. 20 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicScoreAccompanimentServiceImpl.java
  54. 7 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  55. 6 2
      mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml
  56. 9 5
      mec-biz/src/main/resources/config/mybatis/SellOrderMapper.xml
  57. 10 2
      mec-biz/src/main/resources/config/mybatis/StudentGoodsSellMapper.xml
  58. 11 0
      mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderDetailMapper.xml
  59. 12 4
      mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml
  60. 6 2
      mec-biz/src/main/resources/config/mybatis/StudentRepairMapper.xml
  61. 36 0
      mec-biz/src/main/resources/config/mybatis/SysCouponCodeMapper.xml
  62. 8 0
      mec-biz/src/main/resources/config/mybatis/SysMusicScoreAccompanimentMapper.xml
  63. 38 0
      mec-common/common-core/src/main/java/com/ym/mec/common/entity/ImNoticeMessage.java
  64. 13 3
      mec-im/src/main/java/com/ym/controller/GroupController.java
  65. 59 0
      mec-im/src/main/java/com/ym/pojo/NoticeMessage.java
  66. 1 1
      mec-student/src/main/java/com/ym/mec/student/config/ResourceServerConfig.java
  67. 13 11
      mec-student/src/main/java/com/ym/mec/student/controller/MemberRankController.java
  68. 44 76
      mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupController.java
  69. 2 2
      mec-student/src/main/java/com/ym/mec/student/controller/RepairController.java
  70. 1 2
      mec-student/src/main/java/com/ym/mec/student/controller/ReplacementInstrumentActivityController.java
  71. 1 4
      mec-student/src/main/java/com/ym/mec/student/controller/SporadicChargeInfoController.java
  72. 1 2
      mec-student/src/main/java/com/ym/mec/student/controller/StudentInstrumentController.java
  73. 6 17
      mec-student/src/main/java/com/ym/mec/student/controller/SubjectChangeController.java
  74. 4 2
      mec-student/src/main/java/com/ym/mec/student/controller/SysCouponCodeController.java
  75. 2 2
      mec-student/src/main/java/com/ym/mec/student/controller/SysMusicScoreAccompanimentController.java
  76. 2 2
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/SysMusicScoreAccompanimentController.java
  77. 0 2
      mec-web/src/main/java/com/ym/mec/web/controller/SubjectChangeController.java
  78. 2 2
      mec-web/src/main/java/com/ym/mec/web/controller/SysMusicScoreAccompanimentController.java
  79. 2 2
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduMusicScoreController.java
  80. 5 3
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduRepairController.java
  81. 30 0
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduSysCouponCodeController.java
  82. 7 13
      mec-web/src/main/java/com/ym/mec/web/controller/education/ImGroupNoticeController.java
  83. 2 2
      mec-web/src/main/resources/logback-spring.xml

+ 1 - 1
cms/src/main/java/com/ym/mec/cms/controller/NewsController.java

@@ -62,7 +62,7 @@ public class NewsController extends BaseController {
 	@Autowired
 	private SysConfigService sysConfigService;
 
-	private final LocalDate xiaMenBannerStartShowTime = LocalDate.parse("2021-10-01", DateUtil.dateFormatter);
+	private final LocalDate xiaMenBannerStartShowTime = LocalDate.parse("2021-10-11", DateUtil.dateFormatter);
 
 	@ApiOperation("资讯列表分页查询")
 	@GetMapping(value = "/list")

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/config/SoundCompareConfig.java

@@ -35,7 +35,7 @@ public class SoundCompareConfig {
     /**
      * @describe 有效分贝大小
      */
-    public int validDb = 20;
+    public int validDb = 35;
     /**
      * @describe 有效频率
      */

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

@@ -449,4 +449,11 @@ public interface StudentPaymentOrderDao extends BaseDAO<Long, StudentPaymentOrde
                                             @Param("activeRemark") Integer activeRemark,
                                             @Param("remark") String remark, @Param("status") String status);
 
+    /**
+     * 获取购买了乐器的报名订单
+     * @param musicGroupId
+     * @param studentId
+     * @return
+     */
+    Integer getOrderIdByMusical(@Param("musicGroupId") String musicGroupId, @Param("studentId") Integer studentId);
 }

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPaymentOrderDetailDao.java

@@ -4,6 +4,7 @@ import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 
+import com.ym.mec.biz.dal.entity.Goods;
 import org.apache.ibatis.annotations.Param;
 
 import com.ym.mec.biz.dal.dto.Mapper;
@@ -156,4 +157,12 @@ public interface StudentPaymentOrderDetailDao extends BaseDAO<Long, StudentPayme
     List<Mapper> getInstrumentNumInMusicApply(@Param("musicGroupIds") List<String> musicGroupIds);
     
 	List<StudentApplyInstrumentDto> queryByType(@Param("musicGroupId") String musicGroupId, @Param("orderDetailType") OrderDetailTypeEnum orderDetailType);
+
+    /**
+     *获取报名时购买的乐器或者附件
+     * @param orderIds
+     * @param type
+     * @return
+     */
+    List<Goods> getGoodsSellPrice(@Param("orderIds") List<Long> orderIds, @Param("type") String type);
 }

+ 19 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysCouponCodeDao.java

@@ -40,4 +40,23 @@ public interface SysCouponCodeDao extends BaseDAO<Long, SysCouponCode> {
      * @return
      */
     List<HorseRaceLampDto> queryHorseRaceLampDtoList(Map<String, Object> params);
+
+    /**
+     * 支付失败退还优惠券
+     * @param couponCodeId
+     */
+    void quit(@Param("couponCodeId") String couponCodeId);
+
+    /**
+     * 根据优惠券编号获取优惠券列表详情
+     * @param couponIdList
+     * @return
+     */
+    List<SysCouponCodeDto> findByIdList(@Param("couponIdList") List<Integer> couponIdList);
+
+    /**
+     * 使用优惠券
+     * @param couponIdList
+     */
+    void use(@Param("couponIdList") List<Integer> couponIdList);
 }

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

@@ -31,5 +31,5 @@ public interface SysMusicScoreAccompanimentDao extends BaseDAO<Integer, SysMusic
      * 获取伴奏声部列表
      * @return
      */
-    List<Subject> querySubjectIds();
+    List<Subject> querySubjectIds(@Param("categoriesIdList") List<Integer> categoriesIdList);
 }

+ 13 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MaintenancePayDto.java

@@ -3,8 +3,9 @@ package com.ym.mec.biz.dal.dto;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.math.BigDecimal;
+import java.util.List;
 
-public class MaintenancePayDto {
+public class MaintenancePayDto{
     @ApiModelProperty(value = "乐器列表id", required = true)
     private Long id;
 
@@ -14,6 +15,17 @@ public class MaintenancePayDto {
     @ApiModelProperty(value = "是否使用余额", required = true)
     private Boolean isUseBalance = false;
 
+    @ApiModelProperty(value = "优惠券列表", required = false)
+    private List<Integer> couponIdList;
+
+    public List<Integer> getCouponIdList() {
+        return couponIdList;
+    }
+
+    public void setCouponIdList(List<Integer> couponIdList) {
+        this.couponIdList = couponIdList;
+    }
+
     public Long getId() {
         return id;
     }

+ 138 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MemberPayParamDto.java

@@ -0,0 +1,138 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.enums.PeriodEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+public class MemberPayParamDto{
+    @ApiModelProperty(value = "购买次数", required = false)
+    private Integer buyNum;
+
+    private Integer giveNum;
+
+    private Integer activeRemark;
+
+    private String remark;
+
+    @ApiModelProperty(value = "优惠券列表", required = false)
+    private Integer memberRankId;
+
+    private PeriodEnum periodEnum;
+
+    private BigDecimal amount;
+
+    private boolean isUseBalance = false;
+
+    private boolean repay = false;
+
+    private Integer userId;
+
+    @ApiModelProperty(value = "优惠券列表", required = false)
+    private List<Integer> couponIdList;
+
+    public boolean isRepay() {
+        return repay;
+    }
+
+    public void setRepay(boolean repay) {
+        this.repay = repay;
+    }
+
+    public List<Integer> getCouponIdList() {
+        return couponIdList;
+    }
+
+    public void setCouponIdList(List<Integer> couponIdList) {
+        this.couponIdList = couponIdList;
+    }
+
+    public Integer getBuyNum() {
+        return buyNum;
+    }
+
+    public void setBuyNum(Integer buyNum) {
+        this.buyNum = buyNum;
+    }
+
+    public Integer getGiveNum() {
+        return giveNum;
+    }
+
+    public void setGiveNum(Integer giveNum) {
+        this.giveNum = giveNum;
+    }
+
+    public Integer getActiveRemark() {
+        return activeRemark;
+    }
+
+    public void setActiveRemark(Integer activeRemark) {
+        this.activeRemark = activeRemark;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getMemberRankId() {
+        return memberRankId;
+    }
+
+    public void setMemberRankId(Integer memberRankId) {
+        this.memberRankId = memberRankId;
+    }
+
+    public PeriodEnum getPeriodEnum() {
+        return periodEnum;
+    }
+
+    public void setPeriodEnum(PeriodEnum periodEnum) {
+        this.periodEnum = periodEnum;
+    }
+
+    public BigDecimal getAmount() {
+        return amount;
+    }
+
+    public void setAmount(BigDecimal amount) {
+        this.amount = amount;
+    }
+
+    public boolean isUseBalance() {
+        return isUseBalance;
+    }
+
+    public void setUseBalance(boolean useBalance) {
+        isUseBalance = useBalance;
+    }
+
+    @Override
+    public String toString() {
+        return "MemberPayParamDto{" +
+                "buyNum=" + buyNum +
+                ", giveNum=" + giveNum +
+                ", activeRemark=" + activeRemark +
+                ", remark='" + remark + '\'' +
+                ", memberRankId=" + memberRankId +
+                ", periodEnum=" + periodEnum +
+                ", amount=" + amount +
+                ", isUseBalance=" + isUseBalance +
+                ", userId=" + userId +
+                ", couponIdList=" + couponIdList +
+                '}';
+    }
+}

+ 40 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/PayParamBasicDto.java

@@ -0,0 +1,40 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+
+public class PayParamBasicDto {
+    @ApiModelProperty(value = "是否使用余额", required = false)
+    private Boolean isUseBalancePayment = false;
+
+    @ApiModelProperty(value = "是否继续支付", required = false)
+    private Boolean isRepeatPay = false;
+
+    @ApiModelProperty(value = "优惠券列表", required = false)
+    private List<Integer> couponIdList;
+
+    public List<Integer> getCouponIdList() {
+        return couponIdList;
+    }
+
+    public void setCouponIdList(List<Integer> couponIdList) {
+        this.couponIdList = couponIdList;
+    }
+
+    public Boolean getUseBalancePayment() {
+        return isUseBalancePayment;
+    }
+
+    public void setUseBalancePayment(Boolean useBalancePayment) {
+        isUseBalancePayment = useBalancePayment;
+    }
+
+    public Boolean getRepeatPay() {
+        return isRepeatPay;
+    }
+
+    public void setRepeatPay(Boolean repeatPay) {
+        isRepeatPay = repeatPay;
+    }
+}

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

@@ -20,6 +20,17 @@ public class PracticeGroupBuyDto extends PracticeGroup {
 
     private List<PracticeDrillTimeDto> drillTimes;
 
+    @ApiModelProperty(value = "优惠券列表", required = false)
+    private List<Integer> couponIdList;
+
+    public List<Integer> getCouponIdList() {
+        return couponIdList;
+    }
+
+    public void setCouponIdList(List<Integer> couponIdList) {
+        this.couponIdList = couponIdList;
+    }
+
     public Long getGroupId() {
         return groupId;
     }

+ 1 - 12
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/RegisterPayDto.java

@@ -9,7 +9,7 @@ import java.util.Map;
 /**
  * 学团注册支付
  */
-public class RegisterPayDto {
+public class RegisterPayDto extends PayParamBasicDto{
     //总金额
     private BigDecimal amount;
     //报名id
@@ -23,9 +23,6 @@ public class RegisterPayDto {
     //乐器id->type
     private Map<Long, String> goodsGroups;
 
-    //是否余额支付
-    private Boolean isUseBalancePayment = false;
-
     @ApiModelProperty(value = "可选课程的key",required = false)
     private List<String> courseKeys;
 
@@ -81,14 +78,6 @@ public class RegisterPayDto {
         this.otherGoodsIds = otherGoodsIds;
     }
 
-	public Boolean getIsUseBalancePayment() {
-		return isUseBalancePayment;
-	}
-
-	public void setIsUseBalancePayment(Boolean isUseBalancePayment) {
-		this.isUseBalancePayment = isUseBalancePayment;
-	}
-
     public Map<Long, String> getGoodsGroups() {
         return goodsGroups;
     }

+ 27 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/RenewParamDto.java

@@ -0,0 +1,27 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+public class RenewParamDto extends PayParamBasicDto{
+    @ApiModelProperty(value = "缴费项目编号", required = false)
+    private Long calenderId;
+
+    @ApiModelProperty(value = "学员编号", required = false)
+    private Integer userId;
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Long getCalenderId() {
+        return calenderId;
+    }
+
+    public void setCalenderId(Long calenderId) {
+        this.calenderId = calenderId;
+    }
+}

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ReplacementPayDto.java

@@ -3,6 +3,7 @@ package com.ym.mec.biz.dal.dto;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 public class ReplacementPayDto {
     @ApiModelProperty(value = "调查id", required = true)
@@ -17,6 +18,17 @@ public class ReplacementPayDto {
     @ApiModelProperty(value = "重新支付", required = true)
     private Boolean rePay = false;
 
+    @ApiModelProperty(value = "优惠券列表", required = false)
+    private List<Integer> couponIdList;
+
+    public List<Integer> getCouponIdList() {
+        return couponIdList;
+    }
+
+    public void setCouponIdList(List<Integer> couponIdList) {
+        this.couponIdList = couponIdList;
+    }
+
     public Integer getId() {
         return id;
     }

+ 1 - 22
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SporadicPayDto.java

@@ -4,7 +4,7 @@ import io.swagger.annotations.ApiModelProperty;
 
 import java.math.BigDecimal;
 
-public class SporadicPayDto {
+public class SporadicPayDto extends PayParamBasicDto {
     @ApiModelProperty(value = "金额",required = false)
     private BigDecimal amount;
 
@@ -17,19 +17,6 @@ public class SporadicPayDto {
     @ApiModelProperty(value = "购买数量",required = false)
     private Integer num = 1;
 
-    private boolean isRepeatPay;
-
-    @ApiModelProperty(value = "是否余额支付",required = false)
-    Boolean isUseBalancePayment = false;
-
-    public boolean getIsRepeatPay() {
-        return isRepeatPay;
-    }
-
-    public void setIsRepeatPay(boolean repeatPay) {
-        isRepeatPay = repeatPay;
-    }
-
     public BigDecimal getAmount() {
         return amount;
     }
@@ -54,14 +41,6 @@ public class SporadicPayDto {
         this.sporadicId = sporadicId;
     }
 
-    public Boolean getUseBalancePayment() {
-        return isUseBalancePayment;
-    }
-
-    public void setUseBalancePayment(Boolean useBalancePayment) {
-        isUseBalancePayment = useBalancePayment;
-    }
-
     public Integer getNum() {
         return num;
     }

+ 59 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SubjectChangeParamDto.java

@@ -0,0 +1,59 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+public class SubjectChangeParamDto{
+    private Integer id;
+
+    private BigDecimal amount;
+
+    private Boolean isUseBalancePayment = false;
+
+    private Boolean isRepay = false;
+
+    @ApiModelProperty(value = "优惠券列表", required = false)
+    private List<Integer> couponIdList;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public BigDecimal getAmount() {
+        return amount;
+    }
+
+    public void setAmount(BigDecimal amount) {
+        this.amount = amount;
+    }
+
+    public Boolean getUseBalancePayment() {
+        return isUseBalancePayment;
+    }
+
+    public void setUseBalancePayment(Boolean useBalancePayment) {
+        isUseBalancePayment = useBalancePayment;
+    }
+
+    public Boolean getRepay() {
+        return isRepay;
+    }
+
+    public void setRepay(Boolean repay) {
+        isRepay = repay;
+    }
+
+    public List<Integer> getCouponIdList() {
+        return couponIdList;
+    }
+
+    public void setCouponIdList(List<Integer> couponIdList) {
+        this.couponIdList = couponIdList;
+    }
+}

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

@@ -30,6 +30,9 @@ public class SysCouponCodeDto {
     @ApiModelProperty("优惠券编号")
     private Integer couponId;
 
+    @ApiModelProperty("优惠券编号")
+    private Integer couponCodeId;
+
     @ApiModelProperty("优惠券类型")
     private CouponTypeEnum couponType;
 
@@ -66,6 +69,14 @@ public class SysCouponCodeDto {
     @ApiModelProperty("使用截止日期")
     private java.util.Date useDeadlineDate;
 
+    public Integer getCouponCodeId() {
+        return couponCodeId;
+    }
+
+    public void setCouponCodeId(Integer couponCodeId) {
+        this.couponCodeId = couponCodeId;
+    }
+
     public Integer getOrganId() {
         return organId;
     }

+ 13 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/VipGroupBuyParamsDto.java

@@ -2,6 +2,8 @@ package com.ym.mec.biz.dal.dto;
 
 import io.swagger.annotations.ApiModelProperty;
 
+import java.util.List;
+
 /**
  * @Author Joburgess
  * @Date 2019/10/2
@@ -23,6 +25,17 @@ public class VipGroupBuyParamsDto {
     @ApiModelProperty(value = "是否重新支付")
     private boolean isRepeatPay;
 
+    @ApiModelProperty(value = "优惠券列表", required = false)
+    private List<Integer> couponIdList;
+
+    public List<Integer> getCouponIdList() {
+        return couponIdList;
+    }
+
+    public void setCouponIdList(List<Integer> couponIdList) {
+        this.couponIdList = couponIdList;
+    }
+
     public boolean isRepeatPay() {
         return isRepeatPay;
     }

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

@@ -189,6 +189,17 @@ public class MusicGroup {
 	
 	private Boolean memberCourseShowFlag;
 
+	@ApiModelProperty(value = "作业是否发送消息",required = true)
+	private Integer homeworkPushFlag = 1;
+
+	public Integer getHomeworkPushFlag() {
+		return homeworkPushFlag;
+	}
+
+	public void setHomeworkPushFlag(Integer homeworkPushFlag) {
+		this.homeworkPushFlag = homeworkPushFlag;
+	}
+
 	public Integer getCloudTeacherType() {
 		return cloudTeacherType;
 	}

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

@@ -203,6 +203,17 @@ public class SellOrder {
 
     private Boolean hasRoute = false;
 
+    @ApiModelProperty(value="优惠券减免")
+    private BigDecimal couponRemitAmount = BigDecimal.ZERO;
+
+    public BigDecimal getCouponRemitAmount() {
+        return couponRemitAmount;
+    }
+
+    public void setCouponRemitAmount(BigDecimal couponRemitAmount) {
+        this.couponRemitAmount = couponRemitAmount;
+    }
+
     public String getReceiveStatus() {
         return receiveStatus;
     }

+ 44 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentGoodsSell.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.entity;
 
 import com.ym.mec.biz.dal.dto.GoodsSellDto;
+import com.ym.mec.biz.dal.dto.SysCouponCodeDto;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
@@ -36,6 +37,9 @@ public class StudentGoodsSell {
 	@ApiModelProperty(value = "减免费用",required = true)
 	private java.math.BigDecimal marketAmount = BigDecimal.ZERO;
 
+	@ApiModelProperty(value = "优惠券减免费用",required = true)
+	private java.math.BigDecimal couponMarketAmount = BigDecimal.ZERO;
+
 	private Date createTime;
 
 	private Date updateTime;
@@ -61,6 +65,46 @@ public class StudentGoodsSell {
 	@ApiModelProperty(value = "合作单位编号", required = false)
 	private Integer cooperationOrganId;
 
+	@ApiModelProperty(value = "优惠券列表", required = false)
+	private List<Integer> couponIdList;
+
+	private String couponIds;
+
+	@ApiModelProperty(value = "优惠券详情列表", required = false)
+	private List<SysCouponCodeDto> couponCodeDtoList;
+
+	public String getCouponIds() {
+		return couponIds;
+	}
+
+	public void setCouponIds(String couponIds) {
+		this.couponIds = couponIds;
+	}
+
+	public List<SysCouponCodeDto> getCouponCodeDtoList() {
+		return couponCodeDtoList;
+	}
+
+	public void setCouponCodeDtoList(List<SysCouponCodeDto> couponCodeDtoList) {
+		this.couponCodeDtoList = couponCodeDtoList;
+	}
+
+	public BigDecimal getCouponMarketAmount() {
+		return couponMarketAmount;
+	}
+
+	public void setCouponMarketAmount(BigDecimal couponMarketAmount) {
+		this.couponMarketAmount = couponMarketAmount;
+	}
+
+	public List<Integer> getCouponIdList() {
+		return couponIdList;
+	}
+
+	public void setCouponIdList(List<Integer> couponIdList) {
+		this.couponIdList = couponIdList;
+	}
+
 	public Integer getCooperationOrganId() {
 		return cooperationOrganId;
 	}

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

@@ -122,6 +122,28 @@ public class StudentPaymentOrder {
 	
 	private String batchNo;
 
+	@ApiModelProperty(value = "优惠券编号列表",required = true)
+	private String couponCodeId;
+
+	@ApiModelProperty(value = "优惠券减免总额",required = true)
+	private BigDecimal couponRemitFee = BigDecimal.ZERO;
+
+	public String getCouponCodeId() {
+		return couponCodeId;
+	}
+
+	public void setCouponCodeId(String couponCodeId) {
+		this.couponCodeId = couponCodeId;
+	}
+
+	public BigDecimal getCouponRemitFee() {
+		return couponRemitFee;
+	}
+
+	public void setCouponRemitFee(BigDecimal couponRemitFee) {
+		this.couponRemitFee = couponRemitFee;
+	}
+
 	public String getReceiveStatus() {
 		return receiveStatus;
 	}

+ 25 - 15
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentRepair.java

@@ -1,12 +1,15 @@
 package com.ym.mec.biz.dal.entity;
 
+import com.ym.mec.biz.dal.dto.PayParamBasicDto;
+import com.ym.mec.biz.dal.dto.SysCouponCodeDto;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
 import java.math.BigDecimal;
 import java.util.Date;
+import java.util.List;
 
-public class StudentRepair {
+public class StudentRepair extends PayParamBasicDto {
     private Integer id;
     /**
      * 维修单号
@@ -197,12 +200,6 @@ public class StudentRepair {
     private Integer repairStatus;
 
     /**
-     * 使用余额
-     */
-    @ApiModelProperty(value = "使用余额", required = false)
-    private Boolean isUseBalancePayment;
-
-    /**
      * 送修时间
      */
     @ApiModelProperty(value = "送修时间", required = true)
@@ -214,9 +211,30 @@ public class StudentRepair {
     @ApiModelProperty(value = "更新时间", required = false)
     private Date updateTime;
 
+    private String couponIds;
+
     @ApiModelProperty(value = "辅件金额", required = false)
     private BigDecimal repairGoodsAmount = BigDecimal.ZERO;
 
+    @ApiModelProperty(value = "优惠券列表", required = false)
+    List<SysCouponCodeDto> couponCodeDtos;
+
+    public List<SysCouponCodeDto> getCouponCodeDtos() {
+        return couponCodeDtos;
+    }
+
+    public void setCouponCodeDtos(List<SysCouponCodeDto> couponCodeDtos) {
+        this.couponCodeDtos = couponCodeDtos;
+    }
+
+    public String getCouponIds() {
+        return couponIds;
+    }
+
+    public void setCouponIds(String couponIds) {
+        this.couponIds = couponIds;
+    }
+
     public String getGoodsJson() {
         return goodsJson;
     }
@@ -441,14 +459,6 @@ public class StudentRepair {
         this.employeeAddress = employeeAddress;
     }
 
-    public Boolean getIsUseBalancePayment() {
-        return isUseBalancePayment;
-    }
-
-    public void setIsUseBalancePayment(Boolean useBalancePayment) {
-        isUseBalancePayment = useBalancePayment;
-    }
-
     @Override
     public String toString() {
         return ToStringBuilder.reflectionToString(this);

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

@@ -21,7 +21,7 @@ public interface CloudTeacherOrderService extends BaseService<Long, CloudTeacher
      * @param order
      * @return
      */
-    Boolean addOrderDetail2CloudTeacher(StudentPaymentOrder order);
+    Boolean addOrderDetail2CloudTeacher(StudentPaymentOrder order, BigDecimal cloudTeacherFee);
 
 
     /**

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

@@ -4,6 +4,7 @@ import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 
+import com.ym.mec.biz.dal.dto.MemberPayParamDto;
 import com.ym.mec.biz.dal.entity.MemberRankSetting;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.enums.PeriodEnum;
@@ -33,14 +34,7 @@ public interface MemberRankSettingService extends BaseService<Integer, MemberRan
 	 * @param remark 备注
 	 * @return
 	 */
-	Map buy(Integer userId,
-			Integer memberRankId,
-			PeriodEnum periodEnum,
-			BigDecimal amount,
-			boolean isUseBalance,
-			Integer buyNum,
-			Integer giveNum,
-			Integer activeRemark,String remark) throws Exception;
+	Map buy(MemberPayParamDto memberPayParamDto) throws Exception;
 	
 	/**
 	 * 订单回调

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

@@ -181,12 +181,9 @@ public interface MusicGroupService extends BaseService<String, MusicGroup> {
 
 	/**
 	 *  续费
-	 * @param calenderId 缴费项目编号
-	 * @param userId 用户编号
-	 * @param isUseBalancePayment 是否使用余额付款
 	 * @return
 	 */
-	Map renew(Long calenderId, Integer userId, boolean isUseBalancePayment) throws Exception;
+	Map renew(RenewParamDto renewParamDto) throws Exception;
 
 	/**
 	 * 学生支付订单

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

@@ -17,12 +17,13 @@ public interface SellOrderService extends BaseService<Integer, SellOrder> {
     /**
      * 添加销售订单
      *
-     * @param goodsIds
-     * @param totalAmount
-     * @param balance
+     * @param goodsIds 商品列表
+     * @param totalAmount 订单总额
+     * @param balance 余额支付
+     * @param couponRemitFee 优惠券减免
      * @return
      */
-    List<SellOrder> addSellOrder(Long orderId, String musicGroupId, List<Integer> goodsIds, BigDecimal totalAmount, BigDecimal balance);
+    List<SellOrder> addSellOrder(Long orderId, String musicGroupId, List<Integer> goodsIds, BigDecimal totalAmount, BigDecimal balance, BigDecimal couponRemitFee);
 
     /**
      * 将订单详情加入销售列表

+ 6 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentGoodsSellService.java

@@ -54,4 +54,10 @@ public interface StudentGoodsSellService extends BaseService<Integer, StudentGoo
      */
     List<StudentInstrument> saveStudentInstrument(StudentPaymentOrder order);
 
+    /**
+     * 获取商品订单详情
+     * @param goodsSellId
+     * @return
+     */
+    StudentGoodsSell getStudentGoodsOrder(Integer goodsSellId);
 }

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

@@ -2,11 +2,14 @@ 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;
 import com.ym.mec.common.service.BaseService;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 public interface StudentPaymentOrderDetailService extends BaseService<Long, StudentPaymentOrderDetail> {
@@ -18,7 +21,7 @@ public interface StudentPaymentOrderDetailService extends BaseService<Long, Stud
      * @param studentPaymentOrderDetailList
      * @return
      */
-    int batchAdd(List<StudentPaymentOrderDetail> studentPaymentOrderDetailList);
+    int batchAdd(List<StudentPaymentOrderDetail> studentPaymentOrderDetailList, BigDecimal couponRemitFee);
 
     /**
      * 查询注册支付的订单详情

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentOrderService.java

@@ -20,6 +20,7 @@ import com.ym.mec.biz.dal.page.SporadicOrderQueryInfo;
 import com.ym.mec.biz.dal.page.StudentPaymentOrderQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
+import org.apache.ibatis.annotations.Param;
 
 public interface StudentPaymentOrderService extends BaseService<Long, StudentPaymentOrder> {
 
@@ -191,4 +192,11 @@ public interface StudentPaymentOrderService extends BaseService<Long, StudentPay
     
     PayStatus queryPayStatus(String paymentChannel, String orderNo, String transNo) throws Exception;
 
+    /**
+     * 获取购买了乐器的报名订单
+     * @param musicGroupId
+     * @param studentId
+     * @return
+     */
+    Integer getOrderIdByMusical(@Param("musicGroupId") String musicGroupId, @Param("studentId") Integer studentId);
 }

+ 13 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/StudentRegistrationService.java

@@ -123,12 +123,22 @@ public interface StudentRegistrationService extends BaseService<Long, StudentReg
      * @param buyMaintenance
      * @param buyCloudTeacher
      * @param buyCloudTeacherPlus
+     * @param couponIdList
      * @return
      * @throws Exception
      */
-    StudentPaymentOrder addOrder(StudentRegistration studentRegistration, BigDecimal amount, String orderNo, String paymentChannel, BigDecimal courseFee,
-                                 List<MusicGroupSubjectGoodsGroup> goodsGroups, BigDecimal remitFee, BigDecimal courseRemitFee,
-                                 List<MusicGroupPaymentCalenderCourseSettings> newCourses, Boolean buyMaintenance, Boolean buyCloudTeacher, Boolean buyCloudTeacherPlus) throws Exception;
+    StudentPaymentOrder addOrder(StudentRegistration studentRegistration,
+                                 BigDecimal amount,
+                                 String orderNo,
+                                 String paymentChannel,
+                                 BigDecimal courseFee,
+                                 List<MusicGroupSubjectGoodsGroup> goodsGroups,
+                                 BigDecimal remitFee,
+                                 BigDecimal courseRemitFee,
+                                 List<MusicGroupPaymentCalenderCourseSettings> newCourses,
+                                 Boolean buyMaintenance,
+                                 Boolean buyCloudTeacher,
+                                 Boolean buyCloudTeacherPlus,List<Integer> couponIdList) throws Exception;
 
     /**
      * 查询用户指定乐团的报名信息

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

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dto.SubjectChangeParamDto;
 import com.ym.mec.biz.dal.entity.SellOrder;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.entity.SubjectChange;
@@ -24,7 +25,7 @@ public interface SubjectChangeService extends BaseService<Integer, SubjectChange
      * @param isUseBalancePayment
      * @return
      */
-    Map payChange(Integer id, BigDecimal amount, Boolean isUseBalancePayment,Boolean isRepay) throws Exception;
+    Map payChange(SubjectChangeParamDto subjectChangeParamDto) throws Exception;
 
     /**
      * 添加声部更换

+ 18 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SysCouponCodeService.java

@@ -2,6 +2,7 @@ package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.dto.HorseRaceLampDto;
 import com.ym.mec.biz.dal.dto.SysCouponCodeDto;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.entity.SysCouponCode;
 import com.ym.mec.biz.dal.page.SysCouponCodeQueryInfo;
 import com.ym.mec.common.page.PageInfo;
@@ -49,4 +50,21 @@ public interface SysCouponCodeService extends BaseService<Long, SysCouponCode> {
      * @return
      */
     List<SysCouponCode> queryCouponPage(BigDecimal amount, Integer userId);
+
+    /**
+     * 使用优惠券
+     * @param couponIdList
+     * @param amount
+     * @param useFlag 是否消耗优惠券
+     * @return
+     */
+    StudentPaymentOrder use(List<Integer> couponIdList, BigDecimal amount,Boolean useFlag);
+
+    List<SysCouponCodeDto> findByIdList(List<Integer> couponIdList);
+
+    /**
+     * 退优惠券
+     * @param couponCodeId
+     */
+    void quit(String couponCodeId);
 }

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

@@ -18,7 +18,7 @@ public interface SysMusicScoreAccompanimentService extends BaseService<Integer,
 
     List<SysMusicScoreAccompaniment> queryAccPage(SysExamSongQueryInfo queryInfo);
 
-    List<Subject> querySubjectIds();
+    List<Subject> querySubjectIds(Integer categoriesId);
 
     PageInfo<SysMusicScoreAccompaniment> queryScorePage(SysExamSongQueryInfo queryInfo);
 }

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

@@ -48,7 +48,7 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-	public Boolean addOrderDetail2CloudTeacher(StudentPaymentOrder order) {
+	public Boolean addOrderDetail2CloudTeacher(StudentPaymentOrder order,BigDecimal cloudTeacherFee) {
 		CloudTeacherOrder cloudTeacherOrder = cloudTeacherOrderDao.queryByOrderId(order.getId());
 
 		if (cloudTeacherOrder == null) {
@@ -56,6 +56,7 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
 		}
 		Date date = new Date();
 
+		cloudTeacherOrder.setAmount(cloudTeacherFee);
 		cloudTeacherOrder.setStatus(1);
 		cloudTeacherOrder.setUpdateTime(date);
 

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

@@ -74,6 +74,8 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 	private MusicGroupStudentClassAdjustDao musicGroupStudentClassAdjustDao;
 	@Autowired
 	private SysConfigDao sysConfigDao;
+	@Autowired
+	private StudentPaymentOrderDao studentPaymentOrderDaop;
 
 	@Override
 	public BaseDAO<Long, CourseScheduleStudentPayment> getDAO() {
@@ -102,7 +104,7 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 			throw new BizException("未获取到排课信息");
 		}
 
-        int giveClassTimes=0;
+		int giveClassTimes=0;
         if(vipGroupApplyBaseInfoDto.getStatus().equals(VipGroupStatusEnum.APPLYING)
                 &&Objects.nonNull(vipGroupActivity)
                 &&vipGroupActivity.getType().equals(VipGroupActivityTypeEnum.GIVE_CLASS)
@@ -110,6 +112,12 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
             giveClassTimes=Integer.parseInt(vipGroupActivity.getAttribute2());
         }
 
+		StudentPaymentOrder studentPaymentOrder = studentPaymentOrderDaop.findByStudentVipGroup(vipGroupId, userId, DealStatusEnum.SUCCESS.getCode());
+		BigDecimal couponFee = new BigDecimal(0);
+		if(Objects.nonNull(studentPaymentOrder)){
+			couponFee = studentPaymentOrder.getCouponRemitFee().divide(new BigDecimal(vipGroupCourseSchedules.size()-giveClassTimes), CommonConstants.DECIMAL_PLACE);
+		}
+
 		List<CourseScheduleStudentPayment> courseScheduleStudentPayments=new ArrayList<>();
 		Map<TeachModeEnum, List<CourseSchedule>> courseScheduleGroupByTeachMode = vipGroupCourseSchedules.stream().collect(Collectors.groupingBy(CourseSchedule::getTeachMode));
 		for(TeachModeEnum teachModeEnum:courseScheduleGroupByTeachMode.keySet()){
@@ -129,13 +137,14 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 					//学生线上单节课应缴费计算
 					switch (vipGroupActivity.getType()) {
 						case BASE_ACTIVITY:
-							courseScheduleStudentPayment.setExpectPrice(vipGroupApplyBaseInfoDto.getOnlineClassesUnitPrice());
+							courseScheduleStudentPayment.setExpectPrice(vipGroupApplyBaseInfoDto.getOnlineClassesUnitPrice().subtract(couponFee));
 							break;
 						case DISCOUNT:
 							courseScheduleStudentPayment.setExpectPrice(
 									vipGroupApplyBaseInfoDto.getOnlineClassesUnitPrice().multiply(
 											new BigDecimal(vipGroupActivity.getAttribute1()))
 											.divide(new BigDecimal(100), CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP)
+											.subtract(couponFee)
 							);
 							break;
 						case GIVE_CLASS:
@@ -143,7 +152,7 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 									&& i >= (courseSchedules.size()-giveClassTimes)) {
 								courseScheduleStudentPayment.setExpectPrice(new BigDecimal(0));
 							} else {
-								courseScheduleStudentPayment.setExpectPrice(vipGroupApplyBaseInfoDto.getOnlineClassesUnitPrice());
+								courseScheduleStudentPayment.setExpectPrice(vipGroupApplyBaseInfoDto.getOnlineClassesUnitPrice().subtract(couponFee));
 							}
 							break;
 						default:
@@ -153,13 +162,14 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 					//学生线下单节课应缴费计算
 					switch (vipGroupActivity.getType()) {
 						case BASE_ACTIVITY:
-							courseScheduleStudentPayment.setExpectPrice(vipGroupApplyBaseInfoDto.getOfflineClassesUnitPrice());
+							courseScheduleStudentPayment.setExpectPrice(vipGroupApplyBaseInfoDto.getOfflineClassesUnitPrice().subtract(couponFee));
 							break;
 						case DISCOUNT:
 							courseScheduleStudentPayment.setExpectPrice(
 									vipGroupApplyBaseInfoDto.getOfflineClassesUnitPrice().multiply(
 											new BigDecimal(vipGroupActivity.getAttribute1()))
 											.divide(new BigDecimal(100), CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP)
+											.subtract(couponFee)
 							);
 							break;
 						case GIVE_CLASS:
@@ -167,7 +177,7 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
                                     && i >= (courseSchedules.size()-giveClassTimes)) {
 								courseScheduleStudentPayment.setExpectPrice(new BigDecimal(0));
 							} else {
-								courseScheduleStudentPayment.setExpectPrice(vipGroupApplyBaseInfoDto.getOfflineClassesUnitPrice());
+								courseScheduleStudentPayment.setExpectPrice(vipGroupApplyBaseInfoDto.getOfflineClassesUnitPrice().subtract(couponFee));
 							}
 							break;
 						default:

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

@@ -112,6 +112,8 @@ public class EduPracticeGroupServiceImpl implements EduPracticeGroupService{
     private TeacherCourseRewardService teacherCourseRewardService;
     @Autowired
     private StudentPaymentRouteOrderService studentPaymentRouteOrderService;
+    @Autowired
+    private SysCouponCodeService sysCouponCodeService;
 
     private static final Logger LOGGER = LoggerFactory
             .getLogger(EduPracticeGroupService.class);
@@ -447,7 +449,10 @@ public class EduPracticeGroupServiceImpl implements EduPracticeGroupService{
             return BaseController.failed(HttpStatus.FOUND, errMessage);
         }
 
-        StudentPaymentOrder studentPaymentOrder=new StudentPaymentOrder();
+        //使用优惠券
+        StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(practiceGroupBuyParams.getCouponIdList(),amount,true);
+        amount = studentPaymentOrder.getActualAmount();
+
         studentPaymentOrder.setUserId(practiceGroupBuyParams.getStudentId());
         studentPaymentOrder.setGroupType(GroupType.PRACTICE);
         String orderNo=idGeneratorService.generatorId("payment") + "";

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

@@ -6,6 +6,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
+import com.ym.mec.biz.dal.dto.MemberPayParamDto;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.entity.HttpResponseResult;
@@ -144,22 +145,17 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
 
 	@Override
 	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED)
-	public Map buy(Integer userId,
-				   Integer memberRankId,
-				   PeriodEnum periodEnum,
-				   BigDecimal amount,
-				   boolean isUseBalance,
-				   Integer buyNum,
-				   Integer giveNum,
-				   Integer activeRemark,String remark) throws Exception {
-		logger.info("云教练活动购买:userId:{} memberRankId:{} periodEnum:{} amount:{} isUseBalance:{} buyNum:{} giveNum:{} activeRemark:{} remark:{}",
-				userId,memberRankId,periodEnum,amount,isUseBalance,buyNum,giveNum,activeRemark,remark);
+	public Map buy(MemberPayParamDto memberPayParamDto) throws Exception {
+		logger.info("云教练活动购买:memberPayParamDto:{} ",memberPayParamDto);
+		Integer userId = memberPayParamDto.getUserId();
+		BigDecimal amount = memberPayParamDto.getAmount();
+		Integer memberRankId = memberPayParamDto.getMemberRankId();
 		Student student = studentService.getLocked(userId);
 		if (student == null) {
 			throw new BizException("非法访问");
 		}
 		//是否可以购买
-		buyCloudTeacherActive(userId,activeRemark,remark);
+		buyCloudTeacherActive(userId,memberPayParamDto.getActiveRemark(),memberPayParamDto.getRemark());
 		SysUser user = sysUserFeignService.queryUserById(userId);
 
 		Integer organId = user.getOrganId();
@@ -182,17 +178,17 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
 
 		BigDecimal actualAmount = BigDecimal.ZERO;
 
-		switch (periodEnum) {
+		switch (memberPayParamDto.getPeriodEnum()) {
 			case DAY:
 				actualAmount = memberFeeSetting.getCurrentDayFee();
 				cloudTeacherOrder.setType(1);
 				cloudTeacherOrder.setTime(1);
 				break;
 			case MONTH:
-				actualAmount = memberFeeSetting.getCurrentMonthFee().multiply(new BigDecimal(buyNum));
+				actualAmount = memberFeeSetting.getCurrentMonthFee().multiply(new BigDecimal(memberPayParamDto.getBuyNum()));
 				cloudTeacherOrder.setType(2);
 				//购买月份加上赠送月份,目前只有按月购买的活动,其他的暂不处理
-				cloudTeacherOrder.setTime(buyNum + giveNum);
+				cloudTeacherOrder.setTime(memberPayParamDto.getBuyNum() + memberPayParamDto.getGiveNum());
 				break;
 			case QUARTERLY:
 				actualAmount = memberFeeSetting.getCurrentQuarterlyFee();
@@ -221,14 +217,13 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
 
 		Date date = new Date();
 
-		StudentPaymentOrder studentPaymentOrder = new StudentPaymentOrder();
+		StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(memberPayParamDto.getCouponIdList(),amount,true);
+		amount = studentPaymentOrder.getActualAmount();
 		studentPaymentOrder.setUserId(userId);
 		studentPaymentOrder.setOrganId(organId);
 		studentPaymentOrder.setRoutingOrganId(organId);
 		studentPaymentOrder.setCreateTime(date);
 		studentPaymentOrder.setUpdateTime(date);
-		studentPaymentOrder.setExpectAmount(amount);
-		studentPaymentOrder.setActualAmount(amount);
 		studentPaymentOrder.setBalancePaymentAmount(BigDecimal.ZERO);
 		studentPaymentOrder.setStatus(DealStatusEnum.ING);
 		studentPaymentOrder.setVersion(0);
@@ -240,7 +235,7 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
 		studentPaymentOrder.setPaymentChannel("BALANCE");
 		studentPaymentOrder.setMusicGroupId(memberRankId + "");
 
-		if (isUseBalance) {
+		if (memberPayParamDto.isUseBalance()) {
 			SysUserCashAccount userCashAccount = sysUserCashAccountService.getLocked(userId);
 			if (userCashAccount == null) {
 				throw new BizException("用户账户找不到");
@@ -270,13 +265,13 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
 		cloudTeacherOrder.setOrganId(studentPaymentOrder.getOrganId());
 		cloudTeacherOrder.setStudentId(studentPaymentOrder.getUserId());
 		cloudTeacherOrder.setLevel(memberRankId);
-		cloudTeacherOrder.setAmount(studentPaymentOrder.getExpectAmount());
+		cloudTeacherOrder.setAmount(amount);
 		cloudTeacherOrder.setStatus(0);
 		cloudTeacherOrder.setOrderId(studentPaymentOrder.getId());
 		cloudTeacherOrder.setCreateTime(date);
 		cloudTeacherOrder.setUpdateTime(date);
-		cloudTeacherOrder.setActiveRemark(activeRemark);
-		cloudTeacherOrder.setRemark(remark);
+		cloudTeacherOrder.setActiveRemark(memberPayParamDto.getActiveRemark());
+		cloudTeacherOrder.setRemark(memberPayParamDto.getRemark());
 		cloudTeacherOrderService.insert(cloudTeacherOrder);
 
 		Map result = studentPaymentOrderService.createOrder(studentPaymentOrder, null, "BUY_MEMBER");
@@ -315,7 +310,7 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
 				sysUserCashAccountService.updateBalance(studentPaymentOrder.getUserId(), studentPaymentOrder.getBalancePaymentAmount(),
 						PlatformCashAccountDetailTypeEnum.REFUNDS, "购买会员支付失败");
 			}
-
+			sysCouponCodeService.quit(studentPaymentOrder.getCouponCodeId());
 			return true;
 		}
 
@@ -446,14 +441,17 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
 
 		}
 		result.setCode(HttpStatus.OK.value());
-		result.setData(this.buy(userId,
-				memberRankId,
-				month,
-				amount,
-				isUseBalance,
-				buyNum,
-				giveNum,
-				activeRemark,remark));
+		MemberPayParamDto memberPayParamDto = new MemberPayParamDto();
+		memberPayParamDto.setMemberRankId(memberRankId);
+		memberPayParamDto.setUserId(userId);
+		memberPayParamDto.setPeriodEnum(month);
+		memberPayParamDto.setUseBalance(isUseBalance);
+		memberPayParamDto.setBuyNum(buyNum);
+		memberPayParamDto.setGiveNum(giveNum);
+		memberPayParamDto.setActiveRemark(activeRemark);
+		memberPayParamDto.setRemark(remark);
+		memberPayParamDto.setAmount(amount);
+		result.setData(this.buy(memberPayParamDto));
 		return result;
 	}
 
@@ -464,13 +462,22 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
 		if(activeRemark == null || StringUtils.isEmpty(remark)){
 			return;
 		}
+		Integer studentId = cloudTeacherOrder.getStudentId();
+		SysUser sysUser = sysUserFeignService.queryUserById(studentId);
+		if(sysUser == null){
+			throw new BizException("用户信息获取失败");
+		}
+		Integer couponId = 1;
+		if(sysUser.getOrganId() != null && sysUser.getOrganId() == 4){
+			couponId = 2;
+		}
 		if(activeRemark.equals(202109)){
 			switch (remark){
 				case "2赠1":
-					sysCouponCodeService.exchangeCoupon(cloudTeacherOrder.getStudentId(),1,cloudTeacherOrder.getOrderId(),3);
+					sysCouponCodeService.exchangeCoupon(cloudTeacherOrder.getStudentId(),couponId,cloudTeacherOrder.getOrderId(),3);
 					break;
 				case "3赠2":
-					sysCouponCodeService.exchangeCoupon(cloudTeacherOrder.getStudentId(),1,cloudTeacherOrder.getOrderId(),6);
+					sysCouponCodeService.exchangeCoupon(cloudTeacherOrder.getStudentId(),couponId,cloudTeacherOrder.getOrderId(),6);
 					break;
 			}
 		}

+ 72 - 81
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -4,6 +4,7 @@ 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.*;
 import static com.ym.mec.biz.dal.enums.PaymentStatusEnum.YES;
 
 import java.io.IOException;
@@ -21,6 +22,8 @@ import java.util.Objects;
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.service.*;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -74,18 +77,6 @@ import com.ym.mec.biz.dal.dao.SysConfigDao;
 import com.ym.mec.biz.dal.dao.SysUserCashAccountDao;
 import com.ym.mec.biz.dal.dao.TeacherAttendanceDao;
 import com.ym.mec.biz.dal.dao.TeacherDao;
-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.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.ApprovalStatus;
 import com.ym.mec.biz.dal.entity.ChargeType;
 import com.ym.mec.biz.dal.entity.ClassGroup;
@@ -152,29 +143,6 @@ import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.page.MusicGroupQueryInfo;
 import com.ym.mec.biz.dal.page.MusicMemberQueryInfo;
 import com.ym.mec.biz.event.source.GroupEventSource;
-import com.ym.mec.biz.service.ClassGroupService;
-import com.ym.mec.biz.service.ClassGroupStudentMapperService;
-import com.ym.mec.biz.service.CloudTeacherOrderService;
-import com.ym.mec.biz.service.ContractService;
-import com.ym.mec.biz.service.CourseScheduleStudentPaymentService;
-import com.ym.mec.biz.service.GoodsService;
-import com.ym.mec.biz.service.ImGroupMemberService;
-import com.ym.mec.biz.service.ImGroupService;
-import com.ym.mec.biz.service.ImUserFriendService;
-import com.ym.mec.biz.service.MusicGroupPaymentCalenderService;
-import com.ym.mec.biz.service.MusicGroupService;
-import com.ym.mec.biz.service.MusicGroupSubjectGoodsGroupService;
-import com.ym.mec.biz.service.MusicGroupSubjectPlanService;
-import com.ym.mec.biz.service.PayService;
-import com.ym.mec.biz.service.StudentPaymentOrderDetailService;
-import com.ym.mec.biz.service.StudentPaymentOrderService;
-import com.ym.mec.biz.service.StudentPaymentRouteOrderService;
-import com.ym.mec.biz.service.StudentRegistrationService;
-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.SysUserCashAccountDetailService;
-import com.ym.mec.biz.service.SysUserCashAccountService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.ImGroupMember;
@@ -352,6 +320,9 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Autowired
     private StudentService studentService;
 
+    @Autowired
+    private SysCouponCodeService sysCouponCodeService;
+
     private SimpleDateFormat sdf_ymd = new SimpleDateFormat("yyyy-MM-dd");
 
     private SimpleDateFormat sdf_hms = new SimpleDateFormat("HH:mm:ss");
@@ -656,9 +627,6 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if (chargeInfo.getDiscountAmount() != null && chargeInfo.getDiscountAmount().compareTo(BigDecimal.ZERO) > 0) {
             amount = amount.subtract(chargeInfo.getDiscountAmount().multiply(new BigDecimal(sporadicPayDto.getNum())));
         }
-        if (!(amount.compareTo(sporadicPayDto.getAmount()) == 0)) {
-            throw new BizException("订单金额异常");
-        }
         if (chargeInfo.getMaxAmount() != null) {
             if (chargeInfo.getOpenMaxTerm().equals(YesOrNoEnum.YES) && chargeInfo.getMaxAmount().compareTo(chargeInfo.getPaidAmount()) <= 0) {
                 throw new Exception("活动名额已满,谢谢您的支持!");
@@ -689,13 +657,15 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         Integer userId = sporadicPayDto.getUserId();
         String orderNo = idGeneratorService.generatorId("payment") + "";
         String channelType = "";
-        StudentPaymentOrder studentPaymentOrder = new StudentPaymentOrder();
+        StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(sporadicPayDto.getCouponIdList(),amount,true);
+        amount = studentPaymentOrder.getActualAmount();
+        if (!(amount.compareTo(sporadicPayDto.getAmount()) == 0)) {
+            throw new BizException("订单金额异常");
+        }
         studentPaymentOrder.setUserId(userId);
         studentPaymentOrder.setGroupType(GroupType.SPORADIC);
         studentPaymentOrder.setOrderNo(orderNo);
         studentPaymentOrder.setType(type);
-        studentPaymentOrder.setExpectAmount(amount);
-        studentPaymentOrder.setActualAmount(amount);
         studentPaymentOrder.setStatus(DealStatusEnum.ING);
         studentPaymentOrder.setMusicGroupId(sporadicPayDto.getSporadicId().toString());
         studentPaymentOrder.setClassGroupId(sporadicPayDto.getNum());
@@ -900,19 +870,28 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     		cloudTeacherOrder.setStatus(0);
             cloudTeacherOrder.setMusicGroupId(musicGroup.getId());
         }
+        String orderNo = idGeneratorService.generatorId("payment") + "";
 
+        String channelType = "";
+        StudentPaymentOrder studentPaymentOrder = studentRegistrationService.addOrder(studentRegistration,
+                orderAmount,
+                orderNo,
+                channelType,
+                courseFee,
+                goodsGroups,
+                remitFee,
+                courseRemitFee,
+                newCourses,
+                registerPayDto.getBuyMaintenance(),
+                registerPayDto.getBuyCloudTeacher(),
+                registerPayDto.getBuyCloudTeacherPlus(),registerPayDto.getCouponIdList());
+        orderAmount = studentPaymentOrder.getActualAmount();
         if (amount.compareTo(orderAmount) != 0) {
             throw new BizException("商品价格不符");
         }
-
         if (amount.compareTo(BigDecimal.ZERO) < 0) {
             throw new BizException("价格异常");
         }
-        String orderNo = idGeneratorService.generatorId("payment") + "";
-
-        String channelType = "";
-
-        StudentPaymentOrder studentPaymentOrder = studentRegistrationService.addOrder(studentRegistration, amount, orderNo, channelType, courseFee, goodsGroups, remitFee, courseRemitFee, newCourses, registerPayDto.getBuyMaintenance(), registerPayDto.getBuyCloudTeacher(), registerPayDto.getBuyCloudTeacherPlus());
         studentPaymentOrder = studentPaymentOrderService.get(studentPaymentOrder.getId());
         boolean canPay = studentPaymentOrder.getClassGroupId() != null && studentPaymentOrder.getClassGroupId().equals(206);
         
@@ -924,7 +903,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         }
 
         BigDecimal balance = BigDecimal.ZERO;
-        if (registerPayDto.getIsUseBalancePayment() && amount.compareTo(BigDecimal.ZERO) > 0) {
+        if (registerPayDto.getUseBalancePayment() && amount.compareTo(BigDecimal.ZERO) > 0) {
             SysUserCashAccount userCashAccount = sysUserCashAccountService.getLocked(userId);
             if (userCashAccount == null) {
                 throw new BizException("用户账户找不到");
@@ -1162,20 +1141,29 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             cloudTeacherOrder.setMusicGroupId(musicGroup.getId());
         }
 
+        String orderNo = idGeneratorService.generatorId("payment") + "";
+
+        String channelType = "";
+        StudentPaymentOrder studentPaymentOrder = studentRegistrationService.addOrder(studentRegistration,
+                orderAmount,
+                orderNo,
+                channelType,
+                courseFee,
+                goodsGroups,
+                remitFee,
+                courseRemitFee,
+                newCourses,
+                registerPayDto.getBuyMaintenance(),
+                registerPayDto.getBuyCloudTeacher(),
+                registerPayDto.getBuyCloudTeacherPlus(),registerPayDto.getCouponIdList());
+        studentPaymentOrder = studentPaymentOrderService.get(studentPaymentOrder.getId());
+        orderAmount = studentPaymentOrder.getActualAmount();
         if (amount.compareTo(orderAmount) != 0) {
             throw new BizException("商品价格不符");
         }
-
         if (amount.compareTo(BigDecimal.ZERO) < 0) {
             throw new BizException("价格异常");
         }
-
-        String orderNo = idGeneratorService.generatorId("payment") + "";
-
-        String channelType = "";
-
-        StudentPaymentOrder studentPaymentOrder = studentRegistrationService.addOrder(studentRegistration, amount, orderNo, channelType, courseFee, goodsGroups, remitFee, courseRemitFee, newCourses, registerPayDto.getBuyMaintenance(), registerPayDto.getBuyCloudTeacher(), registerPayDto.getBuyCloudTeacherPlus());
-        studentPaymentOrder = studentPaymentOrderService.get(studentPaymentOrder.getId());
         boolean canPay = studentPaymentOrder.getClassGroupId() != null && studentPaymentOrder.getClassGroupId().equals(206);
         
         if(cloudTeacherOrder != null){
@@ -1186,7 +1174,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         }
         
         BigDecimal balance = BigDecimal.ZERO;
-        if (registerPayDto.getIsUseBalancePayment() && amount.compareTo(BigDecimal.ZERO) > 0) {
+        if (registerPayDto.getUseBalancePayment() && amount.compareTo(BigDecimal.ZERO) > 0) {
             SysUserCashAccount userCashAccount = sysUserCashAccountService.get(userId);
             if (userCashAccount == null) {
                 throw new BizException("用户账户找不到");
@@ -2342,7 +2330,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                     studentLastChange = subjectChangeDao.getStudentLastChange(userId, musicGroupId);
                 }
                 
-    			if (studentLastChange != null && minPaymentOrderId <= studentLastChange.getOriginalOrderId()) {
+    			if (studentLastChange != null && (studentLastChange.getOriginalOrderId() == null || minPaymentOrderId <= studentLastChange.getOriginalOrderId())) {
     				if (returnFeeDto.getIsReturnMusicalFee()) {
     					amount = amount.add(studentLastChange.getChangeMusicalPrice());
     					
@@ -2360,7 +2348,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     				for (StudentPaymentOrderDetail detail : orderDetailList) {
 
     					// 退乐器费用
-    					if (returnFeeDto.getIsReturnMusicalFee() && detail.getType() == OrderDetailTypeEnum.MUSICAL) {
+    					if (returnFeeDto.getIsReturnMusicalFee() && detail.getType() == MUSICAL) {
     						amount = amount.add(detail.getPrice()).subtract(detail.getRemitFee());
     						
     						StudentInstrument studentMaintenance = studentInstrumentDao.getStudentMaintenance(userId, musicGroupId);
@@ -2372,7 +2360,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
     					// 退教辅费用
     					if (returnFeeDto.getIsReturnAccessoriesFee()
-    							&& (detail.getType() == OrderDetailTypeEnum.ACCESSORIES || detail.getType() == OrderDetailTypeEnum.TEACHING)) {
+    							&& (detail.getType() == ACCESSORIES || detail.getType() == TEACHING)) {
     						amount = amount.add(detail.getPrice()).subtract(detail.getRemitFee());
     					}
     				}
@@ -2682,7 +2670,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 				for (StudentPaymentOrderDetail detail : orderDetailList) {
 
 					// 退乐器费用
-					if (isRefundInstrumentFee && detail.getType() == OrderDetailTypeEnum.MUSICAL) {
+					if (isRefundInstrumentFee && detail.getType() == MUSICAL) {
 						amount = amount.add(detail.getPrice()).subtract(detail.getRemitFee());
 						
 						StudentInstrument studentMaintenance = studentInstrumentDao.getStudentMaintenance(userId, musicGroupId);
@@ -2694,7 +2682,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
 					// 退教辅费用
 					if (isRefundTeachingAssistantsFee
-							&& (detail.getType() == OrderDetailTypeEnum.ACCESSORIES || detail.getType() == OrderDetailTypeEnum.TEACHING)) {
+							&& (detail.getType() == ACCESSORIES || detail.getType() == TEACHING)) {
 						amount = amount.add(detail.getPrice()).subtract(detail.getRemitFee());
 					}
 				}
@@ -2730,7 +2718,9 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
     @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
-    public Map renew(Long calenderId, Integer userId, boolean isUseBalancePayment) throws Exception {
+    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("缴费项目不存在");
@@ -2755,12 +2745,12 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 		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") + "";
@@ -2768,7 +2758,9 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         BigDecimal amount = calenderDetail.getExpectAmount().add(calenderDetail.getExpectMemberAmount());
 
         Date date = new Date();
-        StudentPaymentOrder studentPaymentOrder = new StudentPaymentOrder();
+        //使用优惠券
+        StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(renewParamDto.getCouponIdList(),amount,true);
+        amount = studentPaymentOrder.getActualAmount();
         studentPaymentOrder.setGroupType(GroupType.MUSIC);
         studentPaymentOrder.setUserId(userId);
         studentPaymentOrder.setOrderNo(orderNo);
@@ -2778,8 +2770,6 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 		} else {
 			studentPaymentOrder.setType(OrderTypeEnum.RENEW);
 		}
-        studentPaymentOrder.setExpectAmount(amount);
-        studentPaymentOrder.setActualAmount(amount);
         studentPaymentOrder.setStatus(DealStatusEnum.ING);
         studentPaymentOrder.setMusicGroupId(calender.getMusicGroupId());
         studentPaymentOrder.setBatchNo(calender.getId() + "");
@@ -2814,19 +2804,8 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     		cloudTeacherOrderService.insert(cloudTeacherOrder);
         }
 
-        /*ArrayList<StudentPaymentOrderDetail> studentPaymentOrderDetailList = new ArrayList<>();
-        StudentPaymentOrderDetail studentPaymentOrderDetail = new StudentPaymentOrderDetail();
-        studentPaymentOrderDetail.setType(OrderDetailTypeEnum.COURSE);
-        studentPaymentOrderDetail.setPrice(amount);
-        studentPaymentOrderDetail.setCreateTime(date);
-        studentPaymentOrderDetail.setUpdateTime(date);
-        studentPaymentOrderDetail.setPaymentOrderId(studentPaymentOrder.getId());
-        studentPaymentOrderDetailList.add(studentPaymentOrderDetail);
-
-        studentPaymentOrderDetailService.batchAdd(studentPaymentOrderDetailList);*/
-
         BigDecimal balance = BigDecimal.ZERO;
-        if (isUseBalancePayment || amount.doubleValue() == 0) {
+        if (renewParamDto.getUseBalancePayment() || amount.doubleValue() == 0) {
             SysUserCashAccount userCashAccount = sysUserCashAccountService.getLocked(userId);
             if (userCashAccount == null) {
                 throw new BizException("用户账户找不到");
@@ -2984,6 +2963,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 					}
 				}
 
+                cloudTeacherOrder.setAmount(calenderDetail.getExpectMemberAmount());
 				cloudTeacherOrderService.update(cloudTeacherOrder);
 				// 添加会员有效时长
 				studentService.updateMemberRank(cloudTeacherOrder, periodEnum);
@@ -3047,7 +3027,18 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 }
             }
             if (paymentOrderDetails.size() > 0) {
-                studentPaymentOrderDetailService.batchAdd(paymentOrderDetails);
+                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);
+                }
             }
 
             //缴费
@@ -3086,7 +3077,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     		calenderDetail.setPaymentStatus(MusicGroupStudentFee.PaymentStatus.NON_PAYMENT);
     		calenderDetail.setUpdateTime(date);
     		musicGroupPaymentCalenderDetailDao.update(calenderDetail);
-    		
+            sysCouponCodeService.quit(studentPaymentOrder.getCouponCodeId());
             if (studentPaymentOrder.getBalancePaymentAmount() != null && studentPaymentOrder.getBalancePaymentAmount().doubleValue() > 0) {
                 sysUserCashAccountService.updateBalance(userId, studentPaymentOrder.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS,
                         "乐团续费失败");

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

@@ -136,6 +136,8 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
     private StudentPaymentRouteOrderService studentPaymentRouteOrderService;
     @Autowired
     private StudentGoodsSellDao studentGoodsSellDao;
+    @Autowired
+    private SysCouponCodeService sysCouponCodeService;
 
     private static Map<Integer, Map<Integer, List<Integer>>> schoolSubjectTeachersMap;
 
@@ -3111,8 +3113,9 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             }
             return BaseController.failed(HttpStatus.FOUND, errMessage);
         }
-
-        StudentPaymentOrder studentPaymentOrder = new StudentPaymentOrder();
+        //使用优惠券
+        StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(practiceGroupBuyParams.getCouponIdList(),amount,true);
+        amount = studentPaymentOrder.getActualAmount();
         studentPaymentOrder.setUserId(practiceGroupBuyParams.getStudentId());
         studentPaymentOrder.setGroupType(GroupType.PRACTICE);
         String orderNo = idGeneratorService.generatorId("payment") + "";
@@ -3558,7 +3561,9 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             return BaseController.failed(HttpStatus.FOUND, errMessage);
         }
 
-        StudentPaymentOrder studentPaymentOrder = new StudentPaymentOrder();
+        //使用优惠券
+        StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(practiceGroupBuyParams.getCouponIdList(),amount,true);
+        amount = studentPaymentOrder.getActualAmount();
         studentPaymentOrder.setUserId(practiceGroupBuyParams.getStudentId());
         studentPaymentOrder.setGroupType(GroupType.PRACTICE);
         String orderNo = idGeneratorService.generatorId("payment") + "";
@@ -3667,6 +3672,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
                 order.setMemo("重复支付,进入余额");
             }
             studentPaymentOrderDao.update(order);
+            sysCouponCodeService.quit(order.getCouponCodeId());
             return;
         }
 
@@ -3676,6 +3682,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
                 sysUserCashAccountService.updateBalance(order.getUserId(), order.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS, "网管课支付失败,退还余额");
             }
             studentPaymentOrderDao.update(order);
+            sysCouponCodeService.quit(order.getCouponCodeId());
             return;
         }
 
@@ -3690,6 +3697,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             practiceGroup.setGroupStatus(GroupStatusEnum.CANCEL);
             practiceGroupDao.update(practiceGroup);
             groupService.deleteGroupOtherInfo(order.getMusicGroupId(), GroupType.PRACTICE);
+            sysCouponCodeService.quit(order.getCouponCodeId());
             return;
         }
         studentPaymentOrderDao.update(order);
@@ -3735,6 +3743,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
 
             sysUserCashAccountService.updateBalance(order.getUserId(), order.getExpectAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS, "支付成功,用户取消,退还余额");
 
+            sysCouponCodeService.quit(order.getCouponCodeId());
             return;
         }
         ClassGroup classGroup = classGroupDao.findByMusicGroupAndType(order.getMusicGroupId(), GroupType.PRACTICE.getCode());

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

@@ -86,6 +86,8 @@ public class ReplacementInstrumentActivityServiceImpl extends BaseServiceImpl<In
     private QuestionnaireQuestionDao questionnaireQuestionDao;
     @Autowired
     private QuestionnaireQuestionItemDao questionnaireQuestionItemDao;
+    @Autowired
+    private SysCouponCodeService sysCouponCodeService;
 
     private final Logger logger = LoggerFactory.getLogger(this.getClass());
 
@@ -295,12 +297,13 @@ public class ReplacementInstrumentActivityServiceImpl extends BaseServiceImpl<In
         }
 
         Goods goods = goodsDao.get(replacementInstrumentActivity.getInstrumentsId());
-        BigDecimal orderAmount = goods.getGroupPurchasePrice();
-        BigDecimal amount = replacementPayDto.getAmount(); //扣除余额之前的金额
-        if (amount.compareTo(orderAmount) != 0) {
+        BigDecimal amount = goods.getGroupPurchasePrice();
+
+        StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(replacementPayDto.getCouponIdList(),amount,true);
+        amount = studentPaymentOrder.getActualAmount();
+        if (amount.compareTo(replacementPayDto.getAmount()) != 0) {
             throw new BizException("商品价格不符");
         }
-
         String channelType = "";
         Date nowDate = new Date();
 
@@ -320,15 +323,12 @@ public class ReplacementInstrumentActivityServiceImpl extends BaseServiceImpl<In
         CooperationOrgan cooperationOrgan = cooperationOrganDao.get(replacementInstrumentActivity.getCooperationOrganId());
 
         String orderNo = idGeneratorService.generatorId("payment") + "";
-        StudentPaymentOrder studentPaymentOrder = new StudentPaymentOrder();
 
         studentPaymentOrder.setPaymentChannel("BALANCE");
         studentPaymentOrder.setUserId(userId);
         studentPaymentOrder.setGroupType(GroupType.REPLACEMENT);
         studentPaymentOrder.setOrderNo(orderNo);
         studentPaymentOrder.setType(OrderTypeEnum.REPLACEMENT);
-        studentPaymentOrder.setExpectAmount(orderAmount);
-        studentPaymentOrder.setActualAmount(amount);
         studentPaymentOrder.setBalancePaymentAmount(balance);
         studentPaymentOrder.setStatus(DealStatusEnum.ING);
         studentPaymentOrder.setMusicGroupId(replacementInstrumentActivity.getId().toString());
@@ -465,6 +465,7 @@ public class ReplacementInstrumentActivityServiceImpl extends BaseServiceImpl<In
             if (studentPaymentOrder.getBalancePaymentAmount() != null && studentPaymentOrder.getBalancePaymentAmount().compareTo(BigDecimal.ZERO) > 0) {
                 sysUserCashAccountService.updateBalance(studentPaymentOrder.getUserId(), studentPaymentOrder.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS, "乐保购买支付失败");
             }
+            sysCouponCodeService.quit(studentPaymentOrder.getCouponCodeId());
 
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SMS_PUSH_SPORADIC_PAYMENT_FAILED, map, null, 0, null, "STUDENT",
                     studentPaymentOrder.getActualAmount(), "乐器置换");

+ 36 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SellOrderServiceImpl.java

@@ -50,7 +50,7 @@ public class SellOrderServiceImpl extends BaseServiceImpl<Integer, SellOrder> im
 
     @Override
     @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
-    public List<SellOrder> addSellOrder(Long orderId, String musicGroupId, List<Integer> goodsIds, BigDecimal totalAmount, BigDecimal balance) {
+    public List<SellOrder> addSellOrder(Long orderId, String musicGroupId, List<Integer> goodsIds, BigDecimal totalAmount, BigDecimal balance, BigDecimal couponRemitFee) {
         if (goodsIds == null || goodsIds.size() <= 0) {
             return null;
         }
@@ -75,6 +75,12 @@ public class SellOrderServiceImpl extends BaseServiceImpl<Integer, SellOrder> im
                 }
             }
         }
+        //商品总价值去掉优惠券减免
+//        if(goodsTotalPrice.compareTo(couponRemitFee) <= 0){
+//            goodsTotalPrice = BigDecimal.ZERO;
+//        }else {
+//            goodsTotalPrice = goodsTotalPrice.subtract(couponRemitFee);
+//        }
 
         //已分配的商品余额
         BigDecimal hasRouteBalance = BigDecimal.ZERO;
@@ -87,8 +93,9 @@ public class SellOrderServiceImpl extends BaseServiceImpl<Integer, SellOrder> im
         AccountType accountType = sysPaymentConfigService.checkAccountType(PaymentChannelEnum.valueOf(order.getPaymentChannel()), order.getMerNos());
 
         List<SellOrder> sellOrderList = goodsService.subtractStock(goodsIds, accountType);
-
-        for (Integer goodsId : goodsIds) {
+        BigDecimal freeCouponRemitFee = couponRemitFee;
+        for (int j = 0; j < goodsIds.size(); j++) {
+            Integer goodsId = goodsIds.get(j);
             BigDecimal goodsPrice = BigDecimal.ZERO;
             Goods nowGoods = new Goods();
             for (Goods goods : goodies) {
@@ -98,7 +105,23 @@ public class SellOrderServiceImpl extends BaseServiceImpl<Integer, SellOrder> im
                 }
             }
             goodsPrice = nowGoods.getDiscountPrice();
-
+            //扣除减免金额
+//            if(couponRemitFee.compareTo(BigDecimal.ZERO) > 0){
+//                if(j == goodsIds.size() - 1){
+//                    goodsPrice = goodsPrice.subtract(freeCouponRemitFee);
+//                }else {
+//                    //获取比例
+//                    BigDecimal divide = goodsPrice.divide(goodsPrice.add(couponRemitFee), 6, BigDecimal.ROUND_HALF_UP);
+//                    //分摊金额
+//                    BigDecimal scale = couponRemitFee.multiply(divide).setScale(2, BigDecimal.ROUND_HALF_UP);
+//                    freeCouponRemitFee = freeCouponRemitFee.subtract(scale);
+//                    goodsPrice = goodsPrice.subtract(scale);
+//                }
+//            }
+
+            //当前商品占用的总优惠券减免
+            BigDecimal couponBalance = goodsTotalPrice.compareTo(BigDecimal.ZERO) <= 0 ? BigDecimal.ZERO :
+                    couponRemitFee.multiply(goodsPrice).divide(goodsTotalPrice, 2, BigDecimal.ROUND_DOWN);
             //当前商品占用的总余额
             BigDecimal goodsBalance = goodsTotalPrice.compareTo(BigDecimal.ZERO) <= 0 ? BigDecimal.ZERO :
                     goodsTotalBalance.multiply(goodsPrice).divide(goodsTotalPrice, 2, BigDecimal.ROUND_DOWN);
@@ -107,9 +130,11 @@ public class SellOrderServiceImpl extends BaseServiceImpl<Integer, SellOrder> im
                     goodsTotalActualAmount.multiply(goodsPrice).divide(goodsTotalPrice, 2, BigDecimal.ROUND_DOWN);
 
             if (i == goodsNum) {
+                couponBalance = couponRemitFee.subtract(freeCouponRemitFee);
                 goodsBalance = goodsTotalBalance.subtract(hasRouteBalance);
                 goodsActualAmount = goodsTotalActualAmount.subtract(hasRouteActualAmount);
             }
+            freeCouponRemitFee = freeCouponRemitFee.subtract(couponBalance);
             hasRouteBalance = hasRouteBalance.add(goodsBalance);
             hasRouteActualAmount = hasRouteActualAmount.add(goodsActualAmount);
             i++;
@@ -126,6 +151,7 @@ public class SellOrderServiceImpl extends BaseServiceImpl<Integer, SellOrder> im
 
             BigDecimal hasRouteSellOrderActualAmount = BigDecimal.ZERO;
             BigDecimal hasRouteSellOrderBalance = BigDecimal.ZERO;
+            BigDecimal hasRouteCouponBalance = BigDecimal.ZERO;
             for (SellOrder sellOrder : sellOrderList) {
                 if (!goodsId.equals(sellOrder.getParentGoodsId()) && !goodsId.equals(sellOrder.getGoodsId())) {
                     continue;
@@ -135,21 +161,26 @@ public class SellOrderServiceImpl extends BaseServiceImpl<Integer, SellOrder> im
                 }
                 BigDecimal sellOrderActualAmount = BigDecimal.ZERO;
                 BigDecimal sellOrderBalance = BigDecimal.ZERO;
+                BigDecimal sellOrderCouponBalance = BigDecimal.ZERO;
                 if (complementPrice.compareTo(BigDecimal.ZERO) > 0) {
                     sellOrderActualAmount = complementGoodsPrice.get(sellOrder.getGoodsId()).multiply(new BigDecimal(sellOrder.getNum())).multiply(goodsActualAmount).divide(complementPrice, 2, BigDecimal.ROUND_DOWN);
                     sellOrderBalance = complementGoodsPrice.get(sellOrder.getGoodsId()).multiply(new BigDecimal(sellOrder.getNum())).multiply(goodsBalance).divide(complementPrice, 2, BigDecimal.ROUND_DOWN);
+                    sellOrderCouponBalance = complementGoodsPrice.get(sellOrder.getGoodsId()).multiply(new BigDecimal(sellOrder.getNum())).multiply(couponBalance).divide(complementPrice, 2, BigDecimal.ROUND_DOWN);
                 }
 
                 complementGoodsNum = complementGoodsNum - sellOrder.getNum();
                 if (complementGoodsNum <= 0) {
                     sellOrderActualAmount = goodsActualAmount.subtract(hasRouteSellOrderActualAmount);
                     sellOrderBalance = goodsBalance.subtract(hasRouteSellOrderBalance);
+                    sellOrderCouponBalance = couponBalance.subtract(hasRouteCouponBalance);
                 }
                 hasRouteSellOrderActualAmount = hasRouteSellOrderActualAmount.add(sellOrderActualAmount);
                 hasRouteSellOrderBalance = hasRouteSellOrderBalance.add(sellOrderBalance);
+                hasRouteCouponBalance = hasRouteCouponBalance.add(sellOrderCouponBalance);
 
-                sellOrder.setExpectAmount(sellOrderActualAmount.add(sellOrderBalance));
+                sellOrder.setExpectAmount(sellOrderActualAmount.add(sellOrderBalance).add(sellOrderCouponBalance));
                 sellOrder.setBalanceAmount(sellOrderBalance);
+                sellOrder.setCouponRemitAmount(sellOrderCouponBalance);
                 sellOrder.setActualAmount(sellOrderActualAmount);
                 sellOrder.setOrganId(order.getOrganId());
                 sellOrder.setCooperationOrganId(musicGroup.getCooperationOrganId());

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

@@ -52,6 +52,8 @@ public class SporadicChargeInfoImpl extends BaseServiceImpl<Integer, SporadicCha
     private ContractService contractService;
     @Autowired
     private LuckDrawCountService luckDrawCountService;
+    @Autowired
+    private SysCouponCodeService sysCouponCodeService;
 
     private final Logger logger = LoggerFactory.getLogger(this.getClass());
 
@@ -171,7 +173,7 @@ public class SporadicChargeInfoImpl extends BaseServiceImpl<Integer, SporadicCha
             if (studentPaymentOrder.getBalancePaymentAmount() != null && studentPaymentOrder.getBalancePaymentAmount().compareTo(BigDecimal.ZERO) > 0) {
                 sysUserCashAccountService.updateBalance(studentPaymentOrder.getUserId(), studentPaymentOrder.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS, info.getTitle() + "支付失败");
             }
-
+            sysCouponCodeService.quit(studentPaymentOrder.getCouponCodeId());
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SMS_PUSH_SPORADIC_PAYMENT_FAILED, map, null, 0, "", "STUDENT",
                     studentPaymentOrder.getActualAmount(), info.getTitle());
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_SMS_PUSH_SPORADIC_PAYMENT_FAILED, yimei, null, 0, "", "",

+ 14 - 11
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkServiceImpl.java

@@ -175,20 +175,23 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
             String notifyUrl = "9?courseScheduleID=" + bean.getId() + "&userId=" + bean.getUserId() + "&studentCourseHomeworkId=" + bean.getId() + "&extra=0";
             String extra = "dayaedu?courseScheduleID=" + courseSchedule.getId() + "&userId=" + bean.getUserId() + "&studentCourseHomeworkId=" + bean.getId() + "&extra=0";
             String courseDate = DateUtil.dateToString(courseSchedule.getClassDate(), "yyyy年MM月dd日");
-            sysMessageService.batchSendImMessage(MessageTypeEnum.IM_HOMEWORK_SUBMIT_PUSH, bean.getUserId().toString(), extra,
-                    new String[]{courseSchedule.getActualTeacherId().toString()},
-                    null, courseDate, courseSchedule.getName());
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_HOMEWORK_SUBMIT,
                     userMap, null, 0, notifyUrl, "TEACHER", courseSchedule.getName(), courseDate, user.getUsername());
+            MusicGroup musicGroup = musicGroupDao.get(courseSchedule.getMusicGroupId());
 
-            Date date = new Date();
-            if (date.before(courseHomework.getExpiryDate())) {
-                ClassGroup classGroup = classGroupDao.findByCourseSchedule(existHomework.getCourseScheduleId().intValue(), 0);
-                if (classGroup != null) {
-                    SysUser sysUser = sysUserFeignService.queryUserById(existHomework.getUserId());
-                    sysMessageService.batchSendImGroupMessage(MessageTypeEnum.IM_HOMEWORK_SUBMIT_PUSH_GROUP, existHomework.getUserId().toString(), null,
-                            new String[]{classGroup.getId().toString()},
-                            null, sysUser.getUsername());
+            sysMessageService.batchSendImMessage(MessageTypeEnum.IM_HOMEWORK_SUBMIT_PUSH, bean.getUserId().toString(), extra,
+                    new String[]{courseSchedule.getActualTeacherId().toString()},
+                    null, courseDate, courseSchedule.getName());
+            if(musicGroup != null && musicGroup.getHomeworkPushFlag() == 1){
+                Date date = new Date();
+                if (date.before(courseHomework.getExpiryDate())) {
+                    ClassGroup classGroup = classGroupDao.findByCourseSchedule(existHomework.getCourseScheduleId().intValue(), 0);
+                    if (classGroup != null) {
+                        SysUser sysUser = sysUserFeignService.queryUserById(existHomework.getUserId());
+                        sysMessageService.batchSendImGroupMessage(MessageTypeEnum.IM_HOMEWORK_SUBMIT_PUSH_GROUP, existHomework.getUserId().toString(), null,
+                                new String[]{classGroup.getId().toString()},
+                                null, sysUser.getUsername());
+                    }
                 }
             }
         }

+ 20 - 9
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentGoodsSellServiceImpl.java

@@ -2,13 +2,11 @@ package com.ym.mec.biz.service.impl;
 
 
 import com.alibaba.fastjson.JSONObject;
-import com.ym.mec.biz.dal.dao.GoodsDao;
-import com.ym.mec.biz.dal.dao.StudentGoodsSellDao;
-import com.ym.mec.biz.dal.dao.StudentInstrumentDao;
-import com.ym.mec.biz.dal.dao.SysConfigDao;
+import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.GoodsSellDto;
 import com.ym.mec.biz.dal.dto.StudentGoodsSellDto;
 import com.ym.mec.biz.dal.dto.StudentPaymentOrderDto;
+import com.ym.mec.biz.dal.dto.SysCouponCodeDto;
 import com.ym.mec.biz.dal.entity.Goods;
 import com.ym.mec.biz.dal.entity.StudentGoodsSell;
 import com.ym.mec.biz.dal.entity.StudentInstrument;
@@ -16,6 +14,7 @@ import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.page.GoodsSellQueryInfo;
 import com.ym.mec.biz.service.StudentGoodsSellService;
 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.service.impl.BaseServiceImpl;
@@ -25,10 +24,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
 
 @Service
 public class StudentGoodsSellServiceImpl extends BaseServiceImpl<Integer, StudentGoodsSell> implements StudentGoodsSellService {
@@ -41,6 +38,10 @@ public class StudentGoodsSellServiceImpl extends BaseServiceImpl<Integer, Studen
     private GoodsDao goodsDao;
     @Autowired
     private StudentInstrumentDao studentInstrumentDao;
+    @Autowired
+    private StudentPaymentOrderDao studentPaymentOrderDao;
+    @Autowired
+    private SysCouponCodeDao sysCouponCodeDao;
 
     @Override
     public BaseDAO<Integer, StudentGoodsSell> getDAO() {
@@ -144,5 +145,15 @@ public class StudentGoodsSellServiceImpl extends BaseServiceImpl<Integer, Studen
         return studentInstruments;
     }
 
-
+    @Override
+    public StudentGoodsSell getStudentGoodsOrder(Integer goodsSellId) {
+        StudentGoodsSell studentGoodsSell = studentGoodsSellDao.get(goodsSellId);
+        //获取优惠券列表
+        String couponIds = studentGoodsSell.getCouponIds();
+        if(StringUtils.isNotEmpty(couponIds)){
+            List<Integer> couponIdList = Arrays.stream(couponIds.split(",")).map(id -> Integer.valueOf(id)).collect(Collectors.toList());
+            studentGoodsSell.setCouponCodeDtoList(sysCouponCodeDao.findByIdList(couponIdList));
+        }
+        return studentGoodsSell;
+    }
 }

+ 14 - 18
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentInstrumentServiceImpl.java

@@ -8,6 +8,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
+import com.ym.mec.biz.service.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -34,16 +35,6 @@ import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.enums.OrderDetailTypeEnum;
 import com.ym.mec.biz.dal.enums.OrderTypeEnum;
 import com.ym.mec.biz.dal.enums.PlatformCashAccountDetailTypeEnum;
-import com.ym.mec.biz.service.ContractService;
-import com.ym.mec.biz.service.GoodsCategoryService;
-import com.ym.mec.biz.service.GoodsService;
-import com.ym.mec.biz.service.PayService;
-import com.ym.mec.biz.service.StudentInstrumentService;
-import com.ym.mec.biz.service.StudentPaymentOrderService;
-import com.ym.mec.biz.service.StudentPaymentRouteOrderService;
-import com.ym.mec.biz.service.SysMessageService;
-import com.ym.mec.biz.service.SysUserCashAccountDetailService;
-import com.ym.mec.biz.service.SysUserCashAccountService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.IdGeneratorService;
@@ -82,6 +73,8 @@ public class StudentInstrumentServiceImpl extends BaseServiceImpl<Long, StudentI
     private StudentPaymentOrderDetailDao studentPaymentOrderDetailDao;
     @Autowired
     private GoodsDao goodsDao;
+    @Autowired
+    private SysCouponCodeService sysCouponCodeService;
 
     private final Logger logger = LoggerFactory.getLogger(this.getClass());
 
@@ -99,8 +92,9 @@ public class StudentInstrumentServiceImpl extends BaseServiceImpl<Long, StudentI
         }
         Integer userId = studentInstrument.getStudentId();
         BigDecimal orderAmount = new BigDecimal(sysConfigDao.findConfigValue("maintenance_price"));
-        BigDecimal amount = maintenancePayDto.getAmount(); //扣除余额之前的金额
-        if (amount.compareTo(orderAmount) != 0) {
+        StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(maintenancePayDto.getCouponIdList(),orderAmount,true);
+        BigDecimal amount = studentPaymentOrder.getActualAmount();
+        if (amount.compareTo(maintenancePayDto.getAmount()) != 0) {
             throw new BizException("商品价格不符");
         }
 
@@ -121,15 +115,13 @@ public class StudentInstrumentServiceImpl extends BaseServiceImpl<Long, StudentI
         }
 
         String orderNo = idGeneratorService.generatorId("payment") + "";
-        StudentPaymentOrder studentPaymentOrder = new StudentPaymentOrder();
 
+        studentPaymentOrder.setActualAmount(amount);
         studentPaymentOrder.setPaymentChannel("BALANCE");
         studentPaymentOrder.setUserId(userId);
         studentPaymentOrder.setGroupType(GroupType.MAINTENANCE);
         studentPaymentOrder.setOrderNo(orderNo);
         studentPaymentOrder.setType(OrderTypeEnum.MAINTENANCE);
-        studentPaymentOrder.setExpectAmount(orderAmount);
-        studentPaymentOrder.setActualAmount(amount);
         studentPaymentOrder.setBalancePaymentAmount(balance);
         studentPaymentOrder.setStatus(DealStatusEnum.ING);
         studentPaymentOrder.setMusicGroupId(studentInstrument.getId().toString());
@@ -148,7 +140,7 @@ public class StudentInstrumentServiceImpl extends BaseServiceImpl<Long, StudentI
 
         StudentPaymentOrderDetail maintenanceOrderDetail = new StudentPaymentOrderDetail();
         maintenanceOrderDetail.setType(OrderDetailTypeEnum.MAINTENANCE);
-        maintenanceOrderDetail.setPrice(orderAmount);
+        maintenanceOrderDetail.setPrice(studentPaymentOrder.getActualAmount());
         maintenanceOrderDetail.setRemitFee(BigDecimal.ZERO);
         maintenanceOrderDetail.setPaymentOrderId(studentPaymentOrder.getId());
         maintenanceOrderDetail.setStudentInstrumentId(maintenancePayDto.getId());
@@ -280,7 +272,7 @@ public class StudentInstrumentServiceImpl extends BaseServiceImpl<Long, StudentI
             if (studentPaymentOrder.getBalancePaymentAmount() != null && studentPaymentOrder.getBalancePaymentAmount().compareTo(BigDecimal.ZERO) > 0) {
                 sysUserCashAccountService.updateBalance(studentPaymentOrder.getUserId(), studentPaymentOrder.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS, "乐保购买支付失败");
             }
-
+            sysCouponCodeService.quit(studentPaymentOrder.getCouponCodeId());
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SMS_PUSH_SPORADIC_PAYMENT_FAILED, map, null, 0, null, "STUDENT",
                     studentPaymentOrder.getActualAmount(), "乐保购买");
             return false;
@@ -384,7 +376,11 @@ public class StudentInstrumentServiceImpl extends BaseServiceImpl<Long, StudentI
         StudentInstrument studentInstrument = null;
     	
 		if (subjectChange.getOriginalOrderId() != null) {
-			studentInstrument = studentInstrumentDao.getByOrderId(subjectChange.getOriginalOrderId().longValue());
+		    //获取购买了乐器的报名订单
+            Integer orderId = studentPaymentOrderService.getOrderIdByMusical(subjectChange.getMusicGroupId(),subjectChange.getStudentId());
+            if(orderId != null){
+                studentInstrument = studentInstrumentDao.getByOrderId(orderId.longValue());
+            }
 		}
         
 		if (subjectChange == null || subjectChange.getChangeMusical() == null ||

+ 29 - 9
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderDetailServiceImpl.java

@@ -11,6 +11,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
+import com.ym.mec.biz.dal.entity.*;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -26,14 +27,6 @@ import com.ym.mec.biz.dal.dao.SubjectChangeDao;
 import com.ym.mec.biz.dal.dao.SubjectDao;
 import com.ym.mec.biz.dal.dao.TeacherDao;
 import com.ym.mec.biz.dal.dto.MusicalListDetailDto;
-import com.ym.mec.biz.dal.entity.Goods;
-import com.ym.mec.biz.dal.entity.MusicGroup;
-import com.ym.mec.biz.dal.entity.MusicGroupPurchaseList;
-import com.ym.mec.biz.dal.entity.Organization;
-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.SubjectChange;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
 import com.ym.mec.biz.dal.enums.KitGroupPurchaseTypeEnum;
 import com.ym.mec.biz.dal.enums.OrderDetailTypeEnum;
@@ -84,10 +77,37 @@ public class StudentPaymentOrderDetailServiceImpl extends BaseServiceImpl<Long,
     }
 
     @Override
-    public int batchAdd(List<StudentPaymentOrderDetail> studentPaymentOrderDetailList) {
+    public int batchAdd(List<StudentPaymentOrderDetail> studentPaymentOrderDetailList, BigDecimal couponRemitFee) {
         if(studentPaymentOrderDetailList == null || studentPaymentOrderDetailList.size() == 0){
             return 0;
         }
+        //按比例分摊优惠券减免金额
+        if(couponRemitFee.compareTo(BigDecimal.ZERO) > 0){
+            //待分配减免
+            BigDecimal waitRemitFee = couponRemitFee;
+            //已使用减免金额
+            BigDecimal useRemitFee = BigDecimal.ZERO;
+            List<StudentPaymentOrderDetail> collect = studentPaymentOrderDetailList.stream().filter(e -> e.getPrice().compareTo(BigDecimal.ZERO) > 0).collect(Collectors.toList());
+            if(collect.size() == 0){
+                throw new BizException("订单金额异常");
+            }
+            BigDecimal totalAmount = collect.stream().map(StudentPaymentOrderDetail::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+            for (int i = 0; i < collect.size(); i++) {
+                StudentPaymentOrderDetail orderDetail = collect.get(i);
+                //如果是最后一件商品
+                if (i == collect.size() - 1) {
+                    orderDetail.setPrice(orderDetail.getPrice().subtract(waitRemitFee));
+                } else {
+                    //获取比例
+                    BigDecimal ratioAmount = orderDetail.getPrice().divide(totalAmount, 6, BigDecimal.ROUND_HALF_UP);
+                    //获取分配的减免金额
+                    BigDecimal multiply = ratioAmount.multiply(couponRemitFee).setScale(2, BigDecimal.ROUND_HALF_UP);
+                    waitRemitFee = waitRemitFee.subtract(multiply);
+                    useRemitFee = useRemitFee.add(multiply);
+                    orderDetail.setPrice(orderDetail.getPrice().subtract(multiply));
+                }
+            }
+        }
         return studentPaymentOrderDetailDao.batchAdd(studentPaymentOrderDetailList);
     }
 

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

@@ -106,6 +106,8 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
 
     @Autowired
     private CloudTeacherOrderService cloudTeacherOrderService;
+    @Autowired
+    private SysCouponCodeService sysCouponCodeService;
 
     @Override
     public BaseDAO<Long, StudentPaymentOrder> getDAO() {
@@ -151,7 +153,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
 				spod.setUpdateTime(date);
 			}
 
-			studentPaymentOrderDetailService.batchAdd(details);
+			studentPaymentOrderDetailService.batchAdd(details,studentPaymentOrder.getCouponRemitFee());
 		}
 
 		String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
@@ -348,6 +350,8 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
             sysUserCashAccountService.updateBalance(order.getUserId(), order.getActualAmount(),
                     PlatformCashAccountDetailTypeEnum.REFUNDS, memo + ",订单号:" + order.getOrderNo());
 
+            //退还优惠券
+            sysCouponCodeService.quit(order.getCouponCodeId());
             if (StringUtils.isNotBlank(order.getPaymentChannel())
                     && order.getPaymentChannel().equals("ADAPAY")
                     && !rpMap.containsKey("simulation")) {
@@ -703,4 +707,9 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
 		}
 		throw new BizException("支付渠道错误");
 	}
+
+    @Override
+    public Integer getOrderIdByMusical(String musicGroupId, Integer studentId) {
+        return studentPaymentOrderDao.getOrderIdByMusical(musicGroupId,studentId);
+    }
 }

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

@@ -20,6 +20,7 @@ import java.util.stream.Collectors;
 
 import javax.annotation.Resource;
 
+import com.ym.mec.biz.service.*;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -116,26 +117,6 @@ import com.ym.mec.biz.dal.page.MusicGroupRecordStudentQueryInfo;
 import com.ym.mec.biz.dal.page.NoClassMusicStudentQueryInfo;
 import com.ym.mec.biz.dal.page.RegistrationOrPreQueryInfo;
 import com.ym.mec.biz.dal.page.StudentRegistrationQueryInfo;
-import com.ym.mec.biz.service.ClassGroupService;
-import com.ym.mec.biz.service.ClassGroupStudentMapperService;
-import com.ym.mec.biz.service.CloudTeacherOrderService;
-import com.ym.mec.biz.service.ContractService;
-import com.ym.mec.biz.service.CourseScheduleService;
-import com.ym.mec.biz.service.CourseScheduleStudentPaymentService;
-import com.ym.mec.biz.service.ImGroupMemberService;
-import com.ym.mec.biz.service.MusicGroupPaymentCalenderService;
-import com.ym.mec.biz.service.MusicGroupSubjectPlanService;
-import com.ym.mec.biz.service.SellOrderService;
-import com.ym.mec.biz.service.StudentInstrumentService;
-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.StudentService;
-import com.ym.mec.biz.service.SubjectService;
-import com.ym.mec.biz.service.SysConfigService;
-import com.ym.mec.biz.service.SysMessageService;
-import com.ym.mec.biz.service.SysUserCashAccountDetailService;
-import com.ym.mec.biz.service.SysUserCashAccountService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.ImResult;
@@ -240,6 +221,8 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
     private OrganizationCloudTeacherFeeDao organizationCloudTeacherFeeDao;
     @Autowired
     private CloudTeacherOrderService cloudTeacherOrderService;
+    @Autowired
+    private SysCouponCodeService sysCouponCodeService;
 
     @Override
     public BaseDAO<Long, StudentRegistration> getDAO() {
@@ -618,15 +601,14 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
     @Override
     @Transactional(rollbackFor = Exception.class)
     public StudentPaymentOrder addOrder(StudentRegistration studentRegistration, BigDecimal amount, String orderNo, String paymentChannel,
-                                        BigDecimal courseFee, List<MusicGroupSubjectGoodsGroup> goodsGroups, BigDecimal remitFee, BigDecimal courseRemitFee, List<MusicGroupPaymentCalenderCourseSettings> newCourses, Boolean buyMaintenance, Boolean buyCloudTeacher, Boolean buyCloudTeacherPlus) throws Exception {
+                                        BigDecimal courseFee, List<MusicGroupSubjectGoodsGroup> goodsGroups, BigDecimal remitFee, BigDecimal courseRemitFee,
+                                        List<MusicGroupPaymentCalenderCourseSettings> newCourses, Boolean buyMaintenance, Boolean buyCloudTeacher, Boolean buyCloudTeacherPlus,List<Integer> couponIdList) throws Exception {
         Date date = new Date();
-        StudentPaymentOrder studentPaymentOrder = new StudentPaymentOrder();
+        StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(couponIdList,amount,true);
         studentPaymentOrder.setUserId(studentRegistration.getUserId());
         studentPaymentOrder.setGroupType(GroupType.MUSIC);
         studentPaymentOrder.setOrderNo(orderNo);
         studentPaymentOrder.setType(OrderTypeEnum.APPLY);
-        studentPaymentOrder.setExpectAmount(amount);
-        studentPaymentOrder.setActualAmount(amount);
         studentPaymentOrder.setStatus(DealStatusEnum.ING);
         studentPaymentOrder.setPaymentChannel(paymentChannel);
         studentPaymentOrder.setMusicGroupId(studentRegistration.getMusicGroupId());
@@ -735,7 +717,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
             cloudTeacherOrderDetail.setIsRenew(0);
             studentPaymentOrderDetailList.add(cloudTeacherOrderDetail);
         }
-        studentPaymentOrderDetailService.batchAdd(studentPaymentOrderDetailList);
+        studentPaymentOrderDetailService.batchAdd(studentPaymentOrderDetailList,studentPaymentOrder.getCouponRemitFee());
 
         //增加缴费学生数,0元订单不增加报名人数(没买云教练/云教练+的)
         boolean paidZeroFlag = false;
@@ -1234,7 +1216,10 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
             studentInstrumentService.addOrderDetail2Instrument(studentPaymentOrder);
 
             //学生云教练处理
-            cloudTeacherOrderService.addOrderDetail2CloudTeacher(studentPaymentOrder);
+            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);
 
             //合并学员处理
             if (studentRegistration.getIsMerge().equals(1) && studentPaymentOrder.getExpectAmount().compareTo(BigDecimal.ZERO) <= 0) {
@@ -1293,6 +1278,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
             if (studentPaymentOrder.getBalancePaymentAmount() != null && studentPaymentOrder.getBalancePaymentAmount().compareTo(BigDecimal.ZERO) > 0) {
                 sysUserCashAccountService.updateBalance(studentPaymentOrder.getUserId(), studentPaymentOrder.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS, "报名缴费失败");
             }
+            sysCouponCodeService.quit(studentPaymentOrder.getCouponCodeId());
             //三方乐团不发送缴费通知
             if (musicGroup.getOwnershipType() != null && musicGroup.getOwnershipType() == CooperationOrgan.OwnershipType.OWN) {
                 String studentApplyUrl = sysConfigDao.findConfigValue(SysConfigService.STUDENT_APPLY_URL) + studentRegistration.getMusicGroupId();
@@ -1302,9 +1288,6 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
                         MessageTypeEnum.STUDENT_SMS_PAYMENT_FAILED, map, null, 0, null, "",
                         HttpUtil.getSortUrl(studentApplyUrl));
             }
-//            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,
-//                    MessageTypeEnum.STUDENT_SMS_PAYMENT_FAILED,map,null,0,"1",
-//                    studentApplyUrl);
         }
 
         return studentPaymentOrder;

+ 67 - 21
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRepairServiceImpl.java

@@ -9,6 +9,7 @@ import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.BasicUserDto;
 import com.ym.mec.biz.dal.dto.GoodsSellDto;
 import com.ym.mec.biz.dal.dto.RepairGoodsDto;
+import com.ym.mec.biz.dal.dto.SysCouponCodeDto;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.RepairStudentQueryInfo;
@@ -78,6 +79,8 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
     private StudentInstrumentService studentInstrumentService;
     @Autowired
     private StudentGoodsSellService studentGoodsSellService;
+    @Autowired
+    private SysCouponCodeService sysCouponCodeService;
 
     private final Logger logger = LoggerFactory.getLogger(this.getClass());
 
@@ -144,6 +147,8 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
                 if (orderByOrderNo.getBalancePaymentAmount() != null && orderByOrderNo.getBalancePaymentAmount().compareTo(BigDecimal.ZERO) > 0) {
                     sysUserCashAccountService.updateBalance(orderByOrderNo.getUserId(), orderByOrderNo.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS, "关闭订单");
                 }
+                //退优惠券
+                sysCouponCodeService.quit(orderByOrderNo.getCouponCodeId());
             }
             StudentGoodsSell byOrderNo = studentGoodsSellDao.findByOrderNo(studentGoodsSell.getOrderNo());
             if (byOrderNo != null) {
@@ -202,11 +207,23 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
         if (amount.signum() < 0) {
             throw new BizException("操作失败:订单金额异常");
         }
+        //使用优惠券
+        StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(studentGoodsSell.getCouponIdList(),amount,studentGoodsSell.getType() != 1);
+        amount = studentPaymentOrder.getActualAmount();
+        // 判断金额是否正确
+//        if (studentGoodsSell.getTotalAmount().compareTo(amount) != 0) {
+//            throw new BizException("非法请求");
+//        }
+        studentGoodsSell.setCouponMarketAmount(studentPaymentOrder.getCouponRemitFee());
         studentGoodsSell.setOrganId(student.getOrganId());
         studentGoodsSell.setTotalAmount(amount);
         studentGoodsSell.setGoodsJson(JSONObject.toJSONString(goodsSellDtos));
         String orderNo = idGeneratorService.generatorId("payment") + "";
         studentGoodsSell.setOrderNo(orderNo);
+        List<Integer> couponIdList = studentGoodsSell.getCouponIdList();
+        if(couponIdList != null && couponIdList.size() > 0){
+            studentGoodsSell.setCouponIds(StringUtils.join(couponIdList,","));
+        }
         studentGoodsSellDao.insert(studentGoodsSell);
 
         if (studentGoodsSell.getType() == 1) {
@@ -215,13 +232,10 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
             return repairInfoMap;
         }
 
-        StudentPaymentOrder studentPaymentOrder = new StudentPaymentOrder();
         studentPaymentOrder.setUserId(studentId);
         studentPaymentOrder.setGroupType(GroupType.GOODS_SELL);
         studentPaymentOrder.setOrderNo(orderNo);
         studentPaymentOrder.setType(OrderTypeEnum.GOODS_SELL);
-        studentPaymentOrder.setExpectAmount(amount);
-        studentPaymentOrder.setActualAmount(amount);
         studentPaymentOrder.setStatus(DealStatusEnum.ING);
         studentPaymentOrder.setOrganId(student.getOrganId());
         studentPaymentOrder.setRoutingOrganId(student.getOrganId());
@@ -325,16 +339,21 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
                 if (studentPaymentOrder.getBalancePaymentAmount() != null && studentPaymentOrder.getBalancePaymentAmount().compareTo(BigDecimal.ZERO) > 0) {
                     sysUserCashAccountService.updateBalance(studentPaymentOrder.getUserId(), studentPaymentOrder.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS, "关闭订单");
                 }
+                sysCouponCodeService.quit(studentPaymentOrder.getCouponCodeId());
             }
         }
         studentGoodsSellDao.update(studentGoodsSell);
-        studentPaymentOrder = new StudentPaymentOrder();
+        String couponIds = studentGoodsSell.getCouponIds();
+        List<Integer> couponIdList = new ArrayList<>();
+        if(StringUtils.isNotEmpty(couponIds)){
+            couponIdList = Arrays.stream(couponIds.split(",")).mapToInt(Integer::valueOf).boxed().collect(Collectors.toList());
+        }
+        studentPaymentOrder = sysCouponCodeService.use(couponIdList,amount,true);
+        amount = studentPaymentOrder.getActualAmount();
         studentPaymentOrder.setUserId(studentId);
         studentPaymentOrder.setGroupType(GroupType.GOODS_SELL);
         studentPaymentOrder.setOrderNo(orderNo);
         studentPaymentOrder.setType(OrderTypeEnum.GOODS_SELL);
-        studentPaymentOrder.setExpectAmount(amount);
-        studentPaymentOrder.setActualAmount(amount);
         studentPaymentOrder.setStatus(DealStatusEnum.ING);
         studentPaymentOrder.setOrganId(studentGoodsSell.getOrganId());
         studentPaymentOrder.setRoutingOrganId(studentGoodsSell.getOrganId());
@@ -444,11 +463,16 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
                 }
             }
         }
+        List<Integer> couponIdList = repairInfo.getCouponIdList();
         amount = amount.subtract(repairInfo.getExemptionAmount());
         if (amount.compareTo(BigDecimal.ZERO) < 0) {
             throw new BizException("特权减免金额不能大于总金额");
         }
-
+        StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(couponIdList,amount,repairInfo.getType() != 1);
+        amount = studentPaymentOrder.getActualAmount();
+        if(couponIdList != null && couponIdList.size() > 0){
+            repairInfo.setCouponIds(StringUtils.join(couponIdList,","));
+        }
         studentRepairDao.insert(repairInfo);
         if (repairInfo.getType() == 1) {
             Map<String, Object> repairInfoMap = new HashMap<>();
@@ -459,13 +483,10 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
         repairInfo.setPayStatus(1);
         String channelType = "";
 
-        StudentPaymentOrder studentPaymentOrder = new StudentPaymentOrder();
         studentPaymentOrder.setUserId(repairInfo.getStudentId());
         studentPaymentOrder.setGroupType(GroupType.REPAIR);
         studentPaymentOrder.setOrderNo(orderNo);
         studentPaymentOrder.setType(OrderTypeEnum.REPAIR);
-        studentPaymentOrder.setExpectAmount(amount);
-        studentPaymentOrder.setActualAmount(amount);
         studentPaymentOrder.setStatus(DealStatusEnum.ING);
         studentPaymentOrder.setMusicGroupId(repairInfo.getId().toString());
         studentPaymentOrder.setPaymentChannel("BALANCE");
@@ -477,7 +498,7 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
         studentPaymentOrder.setVersion(0);
 
         BigDecimal balance = BigDecimal.ZERO;
-        if (repairInfo.getIsUseBalancePayment() && amount.compareTo(BigDecimal.ZERO) > 0) {
+        if (repairInfo.getUseBalancePayment() && amount.compareTo(BigDecimal.ZERO) > 0) {
             SysUserCashAccount userCashAccount = sysUserCashAccountService.getLocked(repairInfo.getStudentId());
             if (userCashAccount == null) {
                 throw new BizException("用户账户找不到");
@@ -576,7 +597,13 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
 
     @Override
     public StudentRepair getRepairInfo(Integer id) {
-        return studentRepairDao.getRepairInfo(id);
+        StudentRepair repairInfo = studentRepairDao.getRepairInfo(id);
+        String couponIds = repairInfo.getCouponIds();
+        if(StringUtils.isNotEmpty(couponIds)){
+            List<Integer> collect = Arrays.stream(couponIds.split(",")).map(e -> Integer.valueOf(e)).collect(Collectors.toList());
+            repairInfo.setCouponCodeDtos(sysCouponCodeService.findByIdList(collect));
+        }
+        return repairInfo;
     }
 
     @Override
@@ -602,7 +629,7 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
         amount = amount.subtract(studentRepair.getExemptionAmount());
 
         String orderNo = idGeneratorService.generatorId("payment") + "";
-        studentRepair.setIsUseBalancePayment(repairInfo.getIsUseBalancePayment());
+        studentRepair.setUseBalancePayment(repairInfo.getUseBalancePayment());
         studentRepair.setTransNo(orderNo);
         studentRepair.setRepairStatus(0);
         studentRepair.setPayStatus(1);
@@ -614,14 +641,16 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
         studentRepairDao.update(studentRepair);
 
         String channelType = "";
-
-        StudentPaymentOrder studentPaymentOrder = new StudentPaymentOrder();
+        List<Integer> couponIdList = new ArrayList<>();
+        if(StringUtils.isNotEmpty(studentRepair.getCouponIds())){
+            couponIdList = Arrays.stream(studentRepair.getCouponIds().split(",")).mapToInt(Integer::valueOf).boxed().collect(Collectors.toList());
+        }
+        StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(couponIdList,amount,true);
+        amount = studentPaymentOrder.getActualAmount();
         studentPaymentOrder.setUserId(studentRepair.getStudentId());
         studentPaymentOrder.setGroupType(GroupType.REPAIR);
         studentPaymentOrder.setOrderNo(orderNo);
         studentPaymentOrder.setType(OrderTypeEnum.REPAIR);
-        studentPaymentOrder.setExpectAmount(amount);
-        studentPaymentOrder.setActualAmount(amount);
         studentPaymentOrder.setStatus(DealStatusEnum.ING);
         studentPaymentOrder.setMusicGroupId(studentRepair.getId().toString());
         studentPaymentOrder.setPaymentChannel("BALANCE");
@@ -633,7 +662,7 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
         studentPaymentOrder.setVersion(0);
 
         BigDecimal balance = BigDecimal.ZERO;
-        if (studentRepair.getIsUseBalancePayment() && amount.compareTo(BigDecimal.ZERO) > 0) {
+        if (studentRepair.getUseBalancePayment() && amount.compareTo(BigDecimal.ZERO) > 0) {
             SysUserCashAccount userCashAccount = sysUserCashAccountService.getLocked(studentRepair.getStudentId());
             if (userCashAccount == null) {
                 throw new BizException("用户账户找不到");
@@ -755,6 +784,7 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
             if (studentPaymentOrder.getBalancePaymentAmount() != null && studentPaymentOrder.getBalancePaymentAmount().compareTo(BigDecimal.ZERO) > 0) {
                 sysUserCashAccountService.updateBalance(studentPaymentOrder.getUserId(), studentPaymentOrder.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS, "乐器购买支付失败");
             }
+            sysCouponCodeService.quit(studentPaymentOrder.getCouponCodeId());
         }
     }
 
@@ -807,7 +837,7 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
         BigDecimal balancePaymentAmount = orderByOrderNo.getBalancePaymentAmount();
         //可用余额
         BigDecimal usableBalance = balancePaymentAmount;
-        BigDecimal marketAmount = studentGoodsSell.getMarketAmount();
+        BigDecimal marketAmount = studentGoodsSell.getMarketAmount().add(studentGoodsSell.getCouponMarketAmount());
         //可用减免金额
         BigDecimal usableMarketAmount = marketAmount;
         //包含减免余额的总金额
@@ -1060,12 +1090,28 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
                 rechargeDetail.setPerAmount(studentPaymentOrder.getPerAmount().negate());
             }
             sysUserCashAccountDetailService.insert(paymentDetail);
+            //优惠券减免金额
+            BigDecimal couponRemitFee = studentPaymentOrder.getCouponRemitFee();
+            if(couponRemitFee.compareTo(BigDecimal.ZERO) > 0 && repairInfo.getAmount().compareTo(BigDecimal.ZERO) > 0){
+                //获取维修金额
+                BigDecimal repairAmount = repairInfo.getAmount();
+                //获取比例
+                BigDecimal divide = repairAmount.divide(repairAmount.add(couponRemitFee), 6, BigDecimal.ROUND_HALF_UP);
+                BigDecimal bigDecimal = couponRemitFee.multiply(divide).setScale(2, BigDecimal.ROUND_HALF_UP);
+                couponRemitFee = couponRemitFee.subtract(bigDecimal);
+//                repairInfo.setAmount(repairAmount.subtract(bigDecimal));
+//                studentRepairDao.update(repairInfo);
+            }
             //生成销售订单
             if (StringUtils.isNotBlank(repairInfo.getGoodsJson())) {
                 List<Goods> goods = JSONObject.parseArray(repairInfo.getGoodsJson(), Goods.class);
                 List<Integer> goodsIds = goods.stream().map(Goods::getId).collect(Collectors.toList());
                 if (goodsIds.size() > 0) {
-                    sellOrderService.addSellOrder(studentPaymentOrder.getId(), null, goodsIds, studentPaymentOrder.getExpectAmount().add(repairInfo.getExemptionAmount()), studentPaymentOrder.getBalancePaymentAmount());
+                    sellOrderService.addSellOrder(studentPaymentOrder.getId(),
+                            null,
+                            goodsIds,
+                            studentPaymentOrder.getExpectAmount().add(repairInfo.getExemptionAmount()),
+                            studentPaymentOrder.getBalancePaymentAmount(),couponRemitFee);
                 }
             }
 
@@ -1095,7 +1141,7 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
             if (studentPaymentOrder.getBalancePaymentAmount() != null && studentPaymentOrder.getBalancePaymentAmount().compareTo(BigDecimal.ZERO) > 0) {
                 sysUserCashAccountService.updateBalance(studentPaymentOrder.getUserId(), studentPaymentOrder.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS, "乐器维修支付失败");
             }
-
+            sysCouponCodeService.quit(studentPaymentOrder.getCouponCodeId());
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SMS_PUSH_SPORADIC_PAYMENT_FAILED, map, null, 0, null, "STUDENT",
                     studentPaymentOrder.getActualAmount(), "乐器维修");
             return false;

+ 40 - 18
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SubjectChangeServiceImpl.java

@@ -3,6 +3,7 @@ package com.ym.mec.biz.service.impl;
 import static com.ym.mec.biz.dal.enums.DealStatusEnum.SUCCESS;
 
 import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.SubjectChangeParamDto;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.SubjectChangeQueryInfo;
@@ -79,6 +80,8 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
     private StudentRegistrationDao studentRegistrationDao;
     @Autowired
     private MusicGroupSubjectPlanService musicGroupSubjectPlanService;
+    @Autowired
+    private SysCouponCodeService sysCouponCodeService;
 
     private final Logger logger = LoggerFactory.getLogger(this.getClass());
 
@@ -93,11 +96,22 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
         if (subjectChange == null) {
             return null;
         }
+        List<StudentPaymentOrder> orders = studentPaymentOrderDao.findMusicGroupApplyOrderByStatus(subjectChange.getStudentId(), subjectChange.getMusicGroupId(), SUCCESS);
+        //获取原报名订单的乐器费用
         if (subjectChange.getOriginalMusical() != null) {
-            subjectChange.setOriginalMusicalGoods(goodsDao.get(subjectChange.getOriginalMusical()));
+            if(orders != null && orders.size() > 0){
+                List<Long> collect = orders.stream().map(e -> e.getId()).collect(Collectors.toList());
+                List<Goods> musical = studentPaymentOrderDetailDao.getGoodsSellPrice(collect, "MUSICAL");
+                if(musical != null && musical.size() > 0){
+                    subjectChange.setOriginalMusicalGoods(musical.get(0));
+                }
+            }
         }
         if (subjectChange.getOriginalAccessories() != null) {
-            subjectChange.setOriginalAccessoriesGoods(goodsDao.findGoodsByIds(subjectChange.getOriginalAccessories()));
+            if(orders != null && orders.size() > 0){
+                List<Long> collect = orders.stream().map(e -> e.getId()).collect(Collectors.toList());
+                subjectChange.setOriginalAccessoriesGoods(studentPaymentOrderDetailDao.getGoodsSellPrice(collect,"ACCESSORIES"));
+            }
         }
 
         if (subjectChange.getChangeMusical() != null) {
@@ -112,10 +126,10 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public Map payChange(Integer id, BigDecimal viewAmount, Boolean isUseBalancePayment, Boolean isRepay) throws Exception {
+    public Map payChange(SubjectChangeParamDto subjectChangeParamDto) throws Exception {
         Date date = new Date();
-        SubjectChange subjectChange = subjectChangeDao.get(id);
-        if (isRepay) {
+        SubjectChange subjectChange = subjectChangeDao.get(subjectChangeParamDto.getId());
+        if (subjectChangeParamDto.getRepay()) {
             StudentPaymentOrder studentPaymentOrder = studentPaymentOrderService.get(subjectChange.getOrderId().longValue());
             
             if(studentPaymentOrder != null && studentPaymentOrder.getStatus() == DealStatusEnum.ING){
@@ -158,13 +172,12 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
 
         String channelType = "";
 
-        StudentPaymentOrder studentPaymentOrder = new StudentPaymentOrder();
+        StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(subjectChangeParamDto.getCouponIdList(),amount,true);
+        amount = studentPaymentOrder.getActualAmount();
         studentPaymentOrder.setUserId(subjectChange.getStudentId());
         studentPaymentOrder.setGroupType(GroupType.SUBJECT_CHANGE);
         studentPaymentOrder.setOrderNo(orderNo);
         studentPaymentOrder.setType(OrderTypeEnum.SUBJECT_CHANGE);
-        studentPaymentOrder.setExpectAmount(amount);
-        studentPaymentOrder.setActualAmount(amount);
         studentPaymentOrder.setStatus(DealStatusEnum.ING);
         studentPaymentOrder.setMusicGroupId(subjectChange.getId().toString());
         studentPaymentOrder.setPaymentChannel("BALANCE");
@@ -184,12 +197,12 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
         }
 
         studentPaymentOrder.setVersion(0);
-        if (amount.compareTo(viewAmount) != 0) {
+        if (amount.compareTo(subjectChangeParamDto.getAmount()) != 0) {
             throw new BizException("价格异常");
         }
 
         BigDecimal balance = BigDecimal.ZERO;
-        if (isUseBalancePayment != null && isUseBalancePayment && amount.compareTo(BigDecimal.ZERO) > 0) {
+        if (subjectChangeParamDto.getUseBalancePayment() && amount.compareTo(BigDecimal.ZERO) > 0) {
             SysUserCashAccount userCashAccount = sysUserCashAccountService.getLocked(subjectChange.getStudentId());
             if (userCashAccount == null) {
                 throw new BizException("用户账户找不到");
@@ -202,7 +215,7 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
                 sysUserCashAccountService.updateBalance(subjectChange.getStudentId(), balance.negate(), PlatformCashAccountDetailTypeEnum.PAY_FEE, "乐器维修");
             }
         }
-        if (amount.compareTo(viewAmount) != 0) {
+        if (amount.compareTo(subjectChangeParamDto.getAmount()) != 0) {
             throw new BizException("价格异常");
         }
         studentPaymentOrderService.update(studentPaymentOrder);
@@ -589,11 +602,11 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
             subjectChange.setSellTime(nowDate);
 
             //乐器辅件价差大于0时,有销售金额
-            if (subjectChange.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.GROUP) && studentPaymentOrder.getActualAmount().compareTo(BigDecimal.ZERO) > 0) {
-                BigDecimal sellAmount = studentPaymentOrder.getActualAmount().multiply(subjectChange.getGoodsMargin())
-                        .divide(studentPaymentOrder.getExpectAmount(), 2, BigDecimal.ROUND_HALF_UP);
-                subjectChange.setSellAmount(sellAmount);
-            }
+//            if (subjectChange.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.GROUP) && studentPaymentOrder.getActualAmount().compareTo(BigDecimal.ZERO) > 0) {
+//                BigDecimal sellAmount = studentPaymentOrder.getActualAmount().multiply(subjectChange.getGoodsMargin())
+//                        .divide(studentPaymentOrder.getExpectAmount(), 2, BigDecimal.ROUND_HALF_UP);
+//                subjectChange.setSellAmount(sellAmount);
+//            }
 
             if (this.update(subjectChange) <= 0) {
                 throw new BizException("维修单更新失败");
@@ -612,7 +625,16 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
                 	sellOrderService.refundByOrderId(subjectChange.getOriginalOrderId().longValue(), false);
                 }
                 //添加新订单
-                this.addSellOrder(studentPaymentOrder.getId(), subjectChange.getMusicGroupId(), goodsIdList, studentPaymentOrder.getExpectAmount(), studentPaymentOrder.getBalancePaymentAmount(), subjectChange.getKitGroupPurchaseType());
+                List<SellOrder> sellOrders = this.addSellOrder(studentPaymentOrder.getId(), subjectChange.getMusicGroupId(), goodsIdList, studentPaymentOrder.getExpectAmount(), studentPaymentOrder.getBalancePaymentAmount(), subjectChange.getKitGroupPurchaseType());
+                if(sellOrders != null && sellOrders.size() > 0){
+                    SubjectChange change = subjectChangeDao.get(subjectChange.getId());
+                    BigDecimal instrumentAmount = sellOrders.stream().filter(e -> e.getType() == SellTypeEnum.INSTRUMENT).map(e -> e.getExpectAmount()).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    BigDecimal accessoriesAmount = sellOrders.stream().filter(e -> e.getType() == SellTypeEnum.ACCESSORIES).map(e -> e.getExpectAmount()).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    change.setChangeMusicalPrice(instrumentAmount.add(change.getOriginalMusicalPrice()));
+                    change.setChangeAccessoriesPrice(accessoriesAmount.add(change.getOriginalAccessoriesPrice()));
+                    change.setSellAmount(instrumentAmount.add(accessoriesAmount));
+                    subjectChangeDao.update(change);
+                }
             }
 
             //乐保处理
@@ -664,7 +686,7 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
             if (studentPaymentOrder.getBalancePaymentAmount() != null && studentPaymentOrder.getBalancePaymentAmount().compareTo(BigDecimal.ZERO) > 0) {
                 sysUserCashAccountService.updateBalance(studentPaymentOrder.getUserId(), studentPaymentOrder.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS, "声部更改支付失败");
             }
-
+            sysCouponCodeService.quit(studentPaymentOrder.getCouponCodeId());
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SMS_PUSH_SPORADIC_PAYMENT_FAILED, map, null, 0, null, "STUDENT",
                     studentPaymentOrder.getActualAmount(), "声部更换");
             return false;

+ 69 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysCouponCodeServiceImpl.java

@@ -8,6 +8,7 @@ import com.ym.mec.biz.dal.dto.SysCouponCodeDto;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.entity.SysCoupon;
 import com.ym.mec.biz.dal.entity.SysCouponCode;
+import com.ym.mec.biz.dal.enums.CouponTypeEnum;
 import com.ym.mec.biz.dal.page.SysCouponCodeQueryInfo;
 import com.ym.mec.biz.service.SysCouponCodeService;
 import com.ym.mec.biz.service.SysCouponService;
@@ -19,6 +20,7 @@ import com.ym.mec.common.service.IdGeneratorService;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -157,4 +159,71 @@ public class SysCouponCodeServiceImpl extends BaseServiceImpl<Long, SysCouponCod
 
 		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;
+    }
+
+	@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);
+	}
 }

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

@@ -176,6 +176,9 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 
 	@Override
 	public boolean batchSeoMessage(Set<Integer> userIds, MessageTypeEnum messageType,String memo, Object... args) {
+		if(userIds != null){
+			userIds.removeAll(Collections.singleton(null));
+		}
 		if (userIds == null || userIds.size() == 0) {
 			throw new BizException("接收地址不能为空");
 		}
@@ -273,7 +276,7 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 		privateMessage.setTargetId(receiver.split(","));
 		privateMessage.setSenderId(sender);
 		privateMessage.setContent(new ImTxtMessage(content,null));
-		imFeignService.privateSend(privateMessage);
+//		imFeignService.privateSend(privateMessage);
 	}
 
 	@Override

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

@@ -79,8 +79,26 @@ public class SysMusicScoreAccompanimentServiceImpl extends BaseServiceImpl<Integ
 	}
 
 	@Override
-	public List<Subject> querySubjectIds() {
-		return sysMusicScoreAccompanimentDao.querySubjectIds();
+	public List<Subject> querySubjectIds(Integer categoriesId) {
+		List<Integer> categoriesIdList = new ArrayList<>();
+		if(categoriesId != null){
+			MusicScoreQueryInfo musicScoreQueryInfo = new MusicScoreQueryInfo();
+			musicScoreQueryInfo.setParentId(categoriesId);
+			List<SysMusicScoreCategories> scoreCategories = sysMusicScoreCategoriesService.queryTree(musicScoreQueryInfo);
+			if(scoreCategories.size() > 0){
+				List<SysMusicScoreCategories> allScoreCategories = new ArrayList<>();
+				allScoreCategories.addAll(scoreCategories);
+				for (SysMusicScoreCategories scoreCategory : scoreCategories) {
+					if(scoreCategory.getSysMusicScoreCategoriesList() != null){
+						allScoreCategories.addAll(scoreCategory.getSysMusicScoreCategoriesList());
+					}
+				}
+				categoriesIdList = allScoreCategories.stream().map(e->e.getId()).collect(Collectors.toList());
+			}else {
+				categoriesIdList.add(categoriesId);
+			}
+		}
+		return sysMusicScoreAccompanimentDao.querySubjectIds(categoriesIdList);
 	}
 
     @Override

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

@@ -165,6 +165,8 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 	private VipGroupStudentCoursePriceDao vipGroupStudentCoursePriceDao;
 	@Autowired
 	private SysConfigService sysConfigService;
+	@Autowired
+	private SysCouponCodeService sysCouponCodeService;
 
 	private static final Logger LOGGER = LoggerFactory
 			.getLogger(VipGroup.class);
@@ -2166,26 +2168,24 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		List<CourseSchedule> courseSchedules = JSON.parseArray(vipGroup.getCourseSchedulesJson(),CourseSchedule.class);
 		courseScheduleService.checkNewCourseSchedules(courseSchedules,false,false);
 
-		StudentPaymentOrder studentPaymentOrder=new StudentPaymentOrder();
+		StudentPaymentOrder studentPaymentOrder=sysCouponCodeService.use(vipGroupBuyParams.getCouponIdList(),vipGroup.getTotalPrice(),true);
 		studentPaymentOrder.setUserId(user.getId());
         studentPaymentOrder.setGroupType(GroupType.VIP);
 		String orderNo=idGeneratorService.generatorId("payment") + "";
 		studentPaymentOrder.setOrderNo(orderNo);
 		studentPaymentOrder.setStatus(DealStatusEnum.ING);
 		studentPaymentOrder.setType(OrderTypeEnum.SMALL_CLASS_TO_BUY);
-		studentPaymentOrder.setExpectAmount(vipGroup.getTotalPrice());
 		studentPaymentOrder.setMusicGroupId(vipGroup.getId().toString());
-		studentPaymentOrder.setActualAmount(studentPaymentOrder.getExpectAmount());
 		studentPaymentOrder.setMusicGroupId(vipGroup.getId().toString());
 		studentPaymentOrder.setClassGroupId(classGroup.getId());
 		studentPaymentOrder.setOrganId(vipGroup.getOrganId());
 		studentPaymentOrder.setVersion(0);
 		studentPaymentOrderDao.insert(studentPaymentOrder);
 
-		BigDecimal amount=vipGroup.getTotalPrice();
+		BigDecimal amount=studentPaymentOrder.getActualAmount();
 		BigDecimal balance = BigDecimal.ZERO;
 		if("36".equals(user.getOrganId())){
-			studentPaymentRouteOrderService.addRouteOrder(orderNo, vipGroup.getOrganId(), vipGroup.getTotalPrice());
+			studentPaymentRouteOrderService.addRouteOrder(orderNo, vipGroup.getOrganId(), amount);
 			studentPaymentOrder.setPaymentChannel("BALANCE");
 			studentPaymentOrder.setActualAmount(new BigDecimal(0));
 			studentPaymentOrder.setBalancePaymentAmount(amount);
@@ -2201,7 +2201,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 				throw new BizException("用户账户找不到");
 			}
 			studentPaymentOrder.setPaymentChannel("BALANCE");
-			if(userCashAccount.getBalance().subtract(vipGroup.getTotalPrice()).doubleValue() >= 0){
+			if(userCashAccount.getBalance().subtract(amount).doubleValue() >= 0){
 				studentPaymentRouteOrderService.addRouteOrder(orderNo, vipGroup.getOrganId(), vipGroup.getTotalPrice());
 				// 更新订单信息
 				studentPaymentOrder.setActualAmount(new BigDecimal(0));
@@ -2306,6 +2306,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 				sysUserCashAccountService.updateBalance(userId, studentPaymentOrder.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS,
 						"VIP课购买失败");
 			}
+			sysCouponCodeService.quit(order.getCouponCodeId());
 			return;
 		}
 

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

@@ -46,6 +46,7 @@
         <result column="is_show_record_of_student_" property="isShowRecordOfStudent"/>
         <result column="musical_instruments_provide_status_" property="musicalInstrumentsProvideStatus"/>
         <result column="member_course_show_flag_" property="memberCourseShowFlag"/>
+        <result column="homework_push_flag_" property="homeworkPushFlag"/>
     </resultMap>
     
     <resultMap type="com.ym.mec.biz.dal.dto.MusicGroupBasicDto" id="MusicGroupBasicDto" extends="MusicGroup">
@@ -105,7 +106,7 @@
                  settlement_type_, cooperation_organ_id_, enlightenment_course_time_,
                  parent_meeting_time_, img_, director_user_id_, is_classroom_lessons_, memo_, expect_start_group_date_,
                  ownership_type_, repair_user_id_, del_flag_, payment_valid_start_date_, payment_valid_end_date_,
-                 payment_pattern_, course_view_type_, transaction_teacher_id_,member_course_show_flag_)
+                 payment_pattern_, course_view_type_, transaction_teacher_id_,homework_push_flag_,member_course_show_flag_)
         VALUES (#{id}, #{name}, #{organId}, #{schoolId}, #{applyExpireDate}, #{preApplyExpireDate}, #{teamTeacherId},
                 #{educationalTeacherId},
                 #{chargeTypeId}, #{courseForm}, now(), now(),
@@ -117,13 +118,16 @@
                 #{isClassroomLessons}, #{memo}, #{expectStartGroupDate},
                 #{ownershipType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{repairUserId},
                 #{delFlag}, #{paymentValidStartDate}, #{paymentValidEndDate}, #{paymentPattern},
-                #{courseViewType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{transactionTeacherId},#{memberCourseShowFlag})
+                #{courseViewType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{transactionTeacherId},#{homeworkPushFlag},#{memberCourseShowFlag})
     </insert>
 
     <!-- 根据主键查询一条记录 -->
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.MusicGroup">
         UPDATE music_group
         <set>
+            <if test="homeworkPushFlag != null">
+                homework_push_flag_ = #{homeworkPushFlag},
+            </if>
             <if test="paymentPattern != null">
                 payment_pattern_ = #{paymentPattern},
             </if>

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

@@ -16,6 +16,7 @@
         <result column="expect_amount_" property="expectAmount"/>
         <result column="actual_amount_" property="actualAmount"/>
         <result column="balance_amount_" property="balanceAmount"/>
+        <result column="coupon_remit_amount_" property="couponRemitAmount"/>
         <result column="type_" property="type" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="parent_goods_id_" property="parentGoodsId"/>
         <result column="goods_id_" property="goodsId"/>
@@ -47,7 +48,7 @@
         actual_amount_,balance_amount_, sell_cost_, sell_cost2_, type_,parent_goods_id_, goods_id_,goods_name_, num_,
         user_id_,
         payment_channel_,mer_no_,batch_no_,stock_type_,account_type_,status_, refund_time_,sell_time_, create_ime_,
-        update_time_
+        update_time_,coupon_remit_amount_
     </sql>
     <select id="get" parameterType="java.lang.Integer" resultMap="SellOrder">
         <!--@mbg.generated-->
@@ -67,18 +68,21 @@
         insert into sell_order (edu_teacher_id_,organ_id_, cooperation_organ_id_, trans_no_,order_id_, order_no_,
         expect_amount_,actual_amount_,balance_amount_, type_,parent_goods_id_, goods_id_,goods_name_, sell_cost_,
         sell_cost2_, num_, user_id_, payment_channel_,
-        mer_no_,batch_no_,stock_type_,account_type_, refund_time_,sell_time_, create_ime_, update_time_)
+        mer_no_,batch_no_,stock_type_,account_type_, refund_time_,sell_time_, create_ime_, update_time_,coupon_remit_amount_)
         values (#{eduTeacherId},#{organId}, #{cooperationOrganId}, #{transNo}, #{orderNo},#{orderId}, #{expectAmount},
         #{actualAmount}, #{balanceAmount}, #{type},#{parentGoodsId}, #{goodsId}, #{goodsName}, #{sellCost},
         #{sellCost2}, #{num}, #{userId},
         #{paymentChannel}, #{merNo},#{batchNo},
         #{stockType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{accountType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
-        #{refundTime},#{sellTime}, #{createIme}, #{updateTime})
+        #{refundTime},#{sellTime}, #{createIme}, #{updateTime}, #{couponRemitAmount})
     </insert>
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.SellOrder">
         <!--@mbg.generated-->
         update sell_order
         <set>
+            <if test="couponRemitAmount != null">
+                coupon_remit_amount_ = #{couponRemitAmount},
+            </if>
             <if test="eduTeacherId != null">
                 edu_teacher_id_ = #{eduTeacherId},
             </if>
@@ -256,7 +260,7 @@
         insert into sell_order (organ_id_, cooperation_organ_id_, trans_no_,order_id_, order_no_, expect_amount_,
         actual_amount_,balance_amount_, type_, parent_goods_id_, goods_id_,goods_name_, sell_cost_, sell_cost2_, num_,
         user_id_, payment_channel_,
-        mer_no_,batch_no_,stock_type_,account_type_, sell_time_,edu_teacher_id_, create_ime_, update_time_)
+        mer_no_,batch_no_,stock_type_,account_type_, sell_time_,edu_teacher_id_, create_ime_, update_time_,coupon_remit_amount_)
         VALUE
         <foreach collection="sellOrders" separator="," item="sellOrder">
             (#{sellOrder.organId},#{sellOrder.cooperationOrganId},#{sellOrder.transNo},#{sellOrder.orderId},#{sellOrder.orderNo},
@@ -264,7 +268,7 @@
             #{sellOrder.goodsName},#{sellOrder.sellCost},#{sellOrder.sellCost2},#{sellOrder.num},#{sellOrder.userId},
             #{sellOrder.paymentChannel},#{sellOrder.merNo},#{sellOrder.batchNo},
             #{sellOrder.stockType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{sellOrder.accountType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
-            #{sellOrder.sellTime},#{sellOrder.eduTeacherId},NOW(),NOW())
+            #{sellOrder.sellTime},#{sellOrder.eduTeacherId},NOW(),NOW(),#{sellOrder.couponRemitAmount})
         </foreach>
     </insert>
 

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

@@ -13,6 +13,7 @@
 		<result column="goods_json_" property="goodsJson" />
 		<result column="total_amount_" property="totalAmount" />
 		<result column="market_amount_" property="marketAmount" />
+		<result column="coupon_market_amount_" property="couponMarketAmount" />
 		<result column="order_no_" property="orderNo" />
 		<result column="username_" property="userName" />
 		<result column="organ_id_" property="organId" />
@@ -20,6 +21,7 @@
 		<result column="cooperation_organ_id_" property="cooperationOrganId" />
 		<result column="create_time_" property="createTime" />
 		<result column="update_time_" property="updateTime" />
+		<result column="coupon_ids_" property="couponIds" />
 	</resultMap>
 	
 	<!-- 根据主键查询一条记录 -->
@@ -37,14 +39,20 @@
 	<!-- 向数据库增加一条记录 -->
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.StudentGoodsSell" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
 		INSERT INTO student_goods_sell (user_id_,teacher_id_,goods_json_,total_amount_,market_amount_,
-		create_time_,update_time_,order_no_,organ_id_,author_user_,cooperation_organ_id_)
+		create_time_,update_time_,order_no_,organ_id_,author_user_,cooperation_organ_id_,coupon_market_amount_,coupon_ids_)
 		VALUES(#{userId},#{teacherId},#{goodsJson},#{totalAmount},#{marketAmount},
-		NOW(),NOW(),#{orderNo},#{organId},#{authorUser},#{cooperationOrganId})
+		NOW(),NOW(),#{orderNo},#{organId},#{authorUser},#{cooperationOrganId},#{couponMarketAmount},#{couponIds})
 	</insert>
 	
 	<!-- 根据主键查询一条记录 -->
 	<update id="update" parameterType="com.ym.mec.biz.dal.entity.StudentGoodsSell">
 		UPDATE student_goods_sell <set>
+		<if test="couponIds != null">
+			coupon_ids_ = #{couponIds},
+		</if>
+		<if test="couponMarketAmount != null">
+			coupon_market_amount_ = #{couponMarketAmount},
+		</if>
 		<if test="cooperationOrganId != null">
 			cooperation_organ_id_ = #{cooperationOrganId},
 		</if>

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

@@ -324,4 +324,15 @@
         WHERE spo.music_group_id_ = #{musicGroupId}
         AND spo.type_ = 'APPLY' and spo.status_ = 'SUCCESS' and spod.type_ = #{orderDetailType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
     </select>
+    <select id="getGoodsSellPrice" resultMap="com.ym.mec.biz.dal.dao.GoodsDao.Goods">
+        SELECT g.id_,g.goods_category_id_,g.sn_,g.name_,g.brand_,g.specification_,g.image_,g.type_,spod.price_ group_purchase_price_
+        FROM student_payment_order_detail spod
+        LEFT JOIN goods g ON spod.goods_id_list_ = g.id_
+        WHERE spod.payment_order_id_ IN
+        <foreach collection="orderIds" separator="," item="item" open="(" close=")">
+            #{item}
+        </foreach>
+        AND spod.type_ = #{type}
+        GROUP BY spod.id_
+    </select>
 </mapper>

+ 12 - 4
mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml

@@ -35,6 +35,8 @@
         <result column="version_" property="version"/>
         <result column="receive_status_" property="receiveStatus"/>
         <result column="batch_no_" property="batchNo"/>
+        <result column="coupon_code_id_" property="couponCodeId"/>
+        <result column="coupon_remit_fee_" property="couponRemitFee"/>
     </resultMap>
 
     <resultMap type="com.ym.mec.biz.dal.dto.StudentPaymentOrderDto" extends="StudentPaymentOrder"
@@ -99,12 +101,12 @@
     <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.StudentPaymentOrder" useGeneratedKeys="true"
             keyColumn="id" keyProperty="id">
         INSERT INTO student_payment_order
-        (id_, group_type_, user_id_, organ_id_, routing_organ_id_, type_, expect_amount_, actual_amount_, com_amount_,
+        (group_type_, user_id_, organ_id_, routing_organ_id_, type_, expect_amount_, actual_amount_, com_amount_,
          per_amount_,
          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_)
-        VALUES (#{id}, #{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+         payment_account_no_, mer_nos_, order_no_, music_group_id_, class_group_id_, pay_time_,batch_no_,coupon_code_id_,coupon_remit_fee_)
+        VALUES (#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
                 #{userId}, #{organId}, #{routingOrganId},
                 #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
                 #{expectAmount}, #{actualAmount}, #{comAmount}, #{perAmount}, #{balancePaymentAmount},
@@ -112,7 +114,7 @@
                 #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{memo}, now(), now(),
                 #{paymentChannel}, #{paymentBusinessChannel}, #{paymentAccountNo}, #{merNos}, #{orderNo},
                 #{musicGroupId},
-                #{classGroupId}, #{payTime},#{batchNo})
+                #{classGroupId}, #{payTime},#{batchNo},#{couponCodeId},#{couponRemitFee})
     </insert>
 
 
@@ -1004,4 +1006,10 @@
         </if>
         LIMIT 1
     </select>
+    <select id="getOrderIdByMusical" resultType="java.lang.Integer">
+        SELECT DISTINCT spo.id_ FROM student_payment_order spo
+        LEFT JOIN student_payment_order_detail spod ON spo.id_ = spod.payment_order_id_
+        WHERE spo.type_ = 'APPLY' AND spo.status_ = 'SUCCESS' AND spo.music_group_id_ = #{musicGroupId}
+        AND spo.user_id_ = #{studentId} AND spod.type_ = 'MUSICAL'
+    </select>
 </mapper>

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

@@ -38,6 +38,7 @@
         <result column="update_time_" jdbcType="TIMESTAMP" property="updateTime"/>
         <result column="username_" jdbcType="VARCHAR" property="studentName"/>
         <result column="goods_json_" jdbcType="VARCHAR" property="goodsJson"/>
+        <result column="coupon_ids_" jdbcType="VARCHAR" property="couponIds"/>
     </resultMap>
     <!-- 根据主键查询一条记录 -->
     <select id="get" resultMap="StudentRepair">
@@ -52,7 +53,7 @@
         insert into student_repair (id_,music_group_id_, trans_no_,student_instrument_id_,maintenance_status_,repair_name_,
         repair_img_,exemption_amount_,organ_id_,student_id_, student_name_,student_school_,employee_id_, employee_name_,
         subject_id_,subject_name_, type_, instrument_no_,fee_list_,description_, amount_, finish_time_,send_type_,
-        contact_name_, contact_mobile_,address_,pay_status_, create_time_,update_time_,repair_status_,goods_json_)
+        contact_name_, contact_mobile_,address_,pay_status_, create_time_,update_time_,repair_status_,goods_json_,coupon_ids_)
         values (#{id,jdbcType=INTEGER},#{musicGroupId}, #{transNo,jdbcType=VARCHAR}, #{studentInstrumentId},
         #{maintenanceStatus},#{repairName},#{repairImg},#{exemptionAmount},#{organId,jdbcType=INTEGER},
         #{studentId,jdbcType=INTEGER}, #{studentName,jdbcType=VARCHAR}, #{studentSchool,jdbcType=VARCHAR},
@@ -61,11 +62,14 @@
         #{feeList,jdbcType=VARCHAR},#{description,jdbcType=VARCHAR}, #{amount,jdbcType=DECIMAL},
         #{finishTime,jdbcType=TIMESTAMP},#{sendType,jdbcType=INTEGER}, #{contactName,jdbcType=VARCHAR},
         #{contactMobile,jdbcType=VARCHAR},#{address,jdbcType=VARCHAR}, #{payStatus,jdbcType=INTEGER},
-        #{createTime,jdbcType=TIMESTAMP},#{updateTime,jdbcType=TIMESTAMP},#{repairStatus},#{goodsJson})
+        #{createTime,jdbcType=TIMESTAMP},#{updateTime,jdbcType=TIMESTAMP},#{repairStatus},#{goodsJson},#{couponIds})
     </insert>
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.StudentRepair">
         UPDATE student_repair
         <set>
+            <if test="couponIds != null">
+                coupon_ids_ = #{couponIds},
+            </if>
             <if test="musicGroupId != null">
                 music_group_id_ = #{musicGroupId},
             </if>

+ 36 - 0
mec-biz/src/main/resources/config/mybatis/SysCouponCodeMapper.xml

@@ -26,6 +26,7 @@
 		<result column="user_id_" property="userId"/>
 		<result column="username_" property="userName"/>
 		<result column="phone_" property="phone"/>
+		<result column="coupon_code_id_" property="couponCodeId"/>
 		<result column="coupon_id_" property="couponId"/>
 		<result column="coupon_type_" property="couponType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
 		<result column="coupon_name_" property="couponName"/>
@@ -105,6 +106,16 @@
 		</set>
 		WHERE id_ = #{id}
 	</update>
+	<update id="quit">
+		UPDATE sys_coupon_code SET usage_status_ = 0,used_time_ = NULL,update_time_ = NOW() WHERE FIND_IN_SET(id_,#{couponCodeId})
+	</update>
+	<update id="use">
+		UPDATE sys_coupon_code SET usage_status_ = 1,used_time_ = NOW(),update_time_ = NOW()
+		WHERE id_ IN
+		<foreach collection="couponIdList" open="(" close=")" item="item" separator=",">
+			#{item}
+		</foreach>
+	</update>
 
 	<!-- 根据主键删除一条记录 -->
 	<delete id="delete" >
@@ -164,6 +175,7 @@
 		    scc.user_id_,
 			su.username_,
 			su.phone_,
+			scc.id_ coupon_code_id_,
 			scc.coupon_id_,
 			sc.type_ coupon_type_,
 			sc.name_ coupon_name_,
@@ -213,4 +225,28 @@
 		LEFT JOIN sys_coupon sc ON sc.id_ = suc.coupon_id_
 		GROUP BY suc.user_id_,suc.payment_order_id_,suc.coupon_id_)t
 	</select>
+	<select id="findByIdList" resultMap="SysCouponCodeDto">
+		SELECT
+		scc.user_id_,
+		scc.id_ coupon_code_id_,
+		scc.coupon_id_,
+		sc.type_ coupon_type_,
+		sc.name_ coupon_name_,
+		sc.face_value_,
+		sc.full_amount_,
+		sc.description_ coupon_description_,
+		scc.code_,
+		scc.payment_order_id_,
+		scc.use_start_date_,
+		scc.use_deadline_date_,
+		scc.used_time_,
+		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_
+		WHERE scc.id_ IN
+		<foreach collection="couponIdList" open="(" close=")" item="item" separator=",">
+			#{item}
+		</foreach>
+		ORDER BY scc.id_ DESC
+	</select>
 </mapper>

+ 8 - 0
mec-biz/src/main/resources/config/mybatis/SysMusicScoreAccompanimentMapper.xml

@@ -175,7 +175,15 @@
     <select id="querySubjectIds" resultMap="com.ym.mec.biz.dal.dao.SubjectDao.Subject">
 		SELECT s.* FROM sys_music_score_accompaniment sesa
 		LEFT JOIN `subject` s ON s.id_ = sesa.subject_id_
+		LEFT JOIN sys_music_score sms ON sms.id_ = sesa.exam_song_id_
+		LEFT JOIN sys_music_score_categories sesc ON sesc.id_ = sms.music_score_categories_id_
 		WHERE sesa.del_flag_ = 0 AND sesa.subject_id_ IS NOT NULL
+		<if test="categoriesIdList != null and categoriesIdList.size > 0">
+			AND sesc.id_ IN
+			<foreach collection="categoriesIdList" separator="," item="item" open="(" close=")">
+				#{item}
+			</foreach>
+		</if>
 		GROUP BY sesa.subject_id_
 	</select>
 

+ 38 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/entity/ImNoticeMessage.java

@@ -0,0 +1,38 @@
+package com.ym.mec.common.entity;
+
+import com.alibaba.fastjson.JSONObject;
+
+public class ImNoticeMessage extends ImBaseMessage {
+    private String content = "";
+    private String extra = "";
+    private static final transient String TYPE = "DY:NoticeMsg";
+
+    public ImNoticeMessage(String content, String extra) {
+        this.content = content;
+        this.extra = extra;
+    }
+
+    public String getType() {
+        return TYPE;
+    }
+
+    public String getContent() {
+        return this.content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getExtra() {
+        return this.extra;
+    }
+
+    public void setExtra(String extra) {
+        this.extra = extra;
+    }
+
+    public String toString() {
+        return JSONObject.toJSONString(this);
+    }
+}

+ 13 - 3
mec-im/src/main/java/com/ym/controller/GroupController.java

@@ -1,7 +1,10 @@
 package com.ym.controller;
 
+import com.ym.mec.common.entity.ImBaseMessage;
 import com.ym.mec.common.entity.ImGroupMessage;
+import com.ym.mec.common.entity.ImNoticeMessage;
 import com.ym.mec.common.entity.ImTxtMessage;
+import com.ym.pojo.NoticeMessage;
 import com.ym.service.GroupService;
 import com.ym.service.MessageService;
 import io.rong.messages.TxtMessage;
@@ -12,6 +15,7 @@ import io.rong.models.message.GroupMessage;
 import io.rong.models.message.MentionMessage;
 import io.rong.models.message.PrivateMessage;
 import io.rong.models.message.RecallMessage;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -35,9 +39,15 @@ public class GroupController{
     @RequestMapping(value = "/send", method = RequestMethod.POST)
     public Object send(@RequestBody ImGroupMessage imGroupMessage) throws Exception {
         GroupMessage groupMessage = new GroupMessage();
-        ImTxtMessage content = (ImTxtMessage)imGroupMessage.getContent();
-        TxtMessage txtMessage = new TxtMessage(content.getContent(),content.getExtra());
-        groupMessage.setContent(txtMessage);
+        ImTxtMessage imTxtMessage = (ImTxtMessage) imGroupMessage.getContent();
+        String objectName = imGroupMessage.getObjectName();
+        if("DY:NoticeMsg".equals(objectName)){
+            NoticeMessage noticeMessage = new NoticeMessage(imTxtMessage.getContent(),imTxtMessage.getExtra());
+            groupMessage.setContent(noticeMessage);
+        }else {
+            TxtMessage txtMessage = new TxtMessage(imTxtMessage.getContent(),imTxtMessage.getExtra());
+            groupMessage.setContent(txtMessage);
+        }
         groupMessage.setTargetId(imGroupMessage.getTargetId());
         groupMessage.setSenderId(imGroupMessage.getSenderId());
         groupMessage.setObjectName(imGroupMessage.getObjectName());

+ 59 - 0
mec-im/src/main/java/com/ym/pojo/NoticeMessage.java

@@ -0,0 +1,59 @@
+package com.ym.pojo;
+
+import io.rong.messages.BaseMessage;
+import io.rong.messages.UserInfo;
+import io.rong.util.GsonUtil;
+import lombok.Data;
+
+@Data
+public class NoticeMessage extends BaseMessage {
+    private String content = "";
+    private Object extraContent;
+    private String extra = "";
+    private io.rong.messages.UserInfo user = null;
+    private static final transient String TYPE = "DY:NoticeMsg";
+
+    public NoticeMessage(String content, String extra) {
+        this.content = content;
+        this.extra = extra;
+    }
+
+    public NoticeMessage(String content, String extra, io.rong.messages.UserInfo user) {
+        this.content = content;
+        this.extra = extra;
+        this.user = user;
+    }
+
+    public String getType() {
+        return "DY:NoticeMsg";
+    }
+
+    public String getContent() {
+        return this.content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getExtra() {
+        return this.extra;
+    }
+
+    public void setExtra(String extra) {
+        this.extra = extra;
+    }
+
+    public io.rong.messages.UserInfo getUser() {
+        return this.user;
+    }
+
+    public void setUser(UserInfo user) {
+        this.user = user;
+    }
+
+    public String toString() {
+        return GsonUtil.toJson(this, NoticeMessage.class);
+
+    }
+}

+ 1 - 1
mec-student/src/main/java/com/ym/mec/student/config/ResourceServerConfig.java

@@ -25,7 +25,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
     public void configure(HttpSecurity http) throws Exception {
         http.csrf().disable().exceptionHandling().accessDeniedHandler(baseAccessDeniedHandler).authenticationEntryPoint(baseAuthenticationEntryPoint).and()
                 .authorizeRequests().antMatchers("/v2/api-docs", "/code/*", "/register/*", "/studentOrder/*", "/musicGroup/getSubjectGoodsAndInfo",
-                "/musicGroup/getMusicGroupStatus", "/musicGroup/getOrderStatus",
+                "/musicGroup/getMusicGroupStatus", "/musicGroup/getOrderStatus","/sysCouponCode/queryPage",
                 "/musicGroup/pay",
                 "/musicGroup/rePay",
                 "/studentManage/queryStudentPer",

+ 13 - 11
mec-student/src/main/java/com/ym/mec/student/controller/MemberRankController.java

@@ -3,6 +3,7 @@ package com.ym.mec.student.controller;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.SysConfigDao;
+import com.ym.mec.biz.dal.dto.MemberPayParamDto;
 import com.ym.mec.biz.dal.entity.MemberRankSetting;
 import com.ym.mec.biz.dal.enums.PeriodEnum;
 import com.ym.mec.biz.dal.page.CloudTeacherOrderQueryInfo;
@@ -15,10 +16,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 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.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.math.BigDecimal;
 import java.util.Date;
@@ -66,17 +64,20 @@ public class MemberRankController extends BaseController {
 
 	@ApiOperation(value = "购买会员")
 	@PostMapping("/buy")
-	public Object buy(Integer memberRankId, PeriodEnum periodEnum, BigDecimal amount, boolean isUseBalance) throws Exception {
+	public Object buy(@RequestBody MemberPayParamDto memberPayParamDto) throws Exception {
 		SysUser sysUser = sysUserFeignService.queryUserInfo();
 		if (sysUser == null) {
 			return failed(HttpStatus.FORBIDDEN, "请登录");
 		}
-		return succeed(memberRankSettingService.buy(sysUser.getId(), memberRankId, periodEnum, amount, isUseBalance,1,0,null,null));
+		memberPayParamDto.setUserId(sysUser.getId());
+		memberPayParamDto.setBuyNum(1);
+		memberPayParamDto.setGiveNum(0);
+		return succeed(memberRankSettingService.buy(memberPayParamDto));
 	}
 
 	@ApiOperation(value = "2021-09活动购买会员")
 	@PostMapping("/activeBuy")
-	public HttpResponseResult ActiveBuy(Integer memberRankId, Integer buyNum, BigDecimal amount, boolean isUseBalance, boolean repay) throws Exception {
+	public HttpResponseResult ActiveBuy(@RequestBody MemberPayParamDto memberPayParamDto) throws Exception {
 		Date nowTime = new Date();
 		String startTimeStr = sysConfigDao.findConfigValue("cloud_teacher_active_start_time");
 		Date startTime = DateUtil.stringToDate(startTimeStr);
@@ -93,16 +94,17 @@ public class MemberRankController extends BaseController {
 			return failed(HttpStatus.FORBIDDEN, "请登录");
 		}
 		//买2赠1、买3赠2
+		Integer buyNum = memberPayParamDto.getBuyNum();
 		int giveNum = buyNum == 2?1:buyNum == 3?2:0;
 		String remark = buyNum == 2?"2赠1":buyNum == 3?"3赠2":buyNum == 1?"单月":"其他";
 		return memberRankSettingService.ActiveBuy(sysUser.getId(),
-				memberRankId,
+				memberPayParamDto.getMemberRankId(),
 				PeriodEnum.MONTH,
-				amount,
-				isUseBalance,
+				memberPayParamDto.getAmount(),
+				memberPayParamDto.isUseBalance(),
 				buyNum,
 				giveNum,
-				202109,remark,repay);
+				202109,remark,memberPayParamDto.isRepay());
 	}
 	
     @ApiOperation(value = "查询订单列表")

+ 44 - 76
mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupController.java

@@ -1,63 +1,38 @@
 package com.ym.mec.student.controller;
 
-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.CourseScheduleDao;
 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.RegisterPayDto;
-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.dto.RenewParamDto;
+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.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.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;
+
+import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentType.ADD_STUDENT;
+import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentType.MUSIC_APPLY;
 
 @RequestMapping("musicGroup")
 @Api(tags = "乐团服务")
@@ -80,15 +55,11 @@ public class MusicGroupController extends BaseController {
     private MusicGroupPaymentCalenderDetailDao musicGroupPaymentCalenderDetailDao;
     @Autowired
     private MusicGroupPaymentCalenderDao musicGroupPaymentCalenderDao;
-
     @Autowired
     private StudentPreRegistrationDao studentPreRegistrationDao;
     @Autowired
     private OrganizationService organizationService;
 
-    @Autowired
-    private CourseScheduleDao courseScheduleDao;
-
     @ApiOperation("预报名")
     @PostMapping(value = "/preRegister")
     public Object preRegister(@RequestBody StudentPreRegistration studentPreRegistration) {
@@ -231,31 +202,32 @@ public class MusicGroupController extends BaseController {
     }
 
     @ApiOperation(value = "续费")
-    @GetMapping("/renew")
-    @ApiImplicitParams({@ApiImplicitParam(name = "calenderId", value = "缴费项目编号", required = true, dataType = "Long"),
-            @ApiImplicitParam(name = "isUseBalancePayment", value = "是否使用余额付款", required = true, dataType = "Boolean")})
-    public HttpResponseResult renew(Long calenderId, Boolean isUseBalancePayment, boolean isRepeatPay) throws Exception {
+    @PostMapping("/renew")
+    public HttpResponseResult renew(@RequestBody RenewParamDto renewParamDto) throws Exception {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         Integer userId = sysUser.getId();
-
-        if (isUseBalancePayment == null) {
-            isUseBalancePayment = false;
+        Long calenderId = renewParamDto.getCalenderId();
+        if(calenderId == null){
+            throw new BizException("参数校验失败");
         }
         MusicGroupPaymentCalender calender = musicGroupPaymentCalenderDao.get(calenderId);
-        if (isRepeatPay == false) {
+        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,
-                    OrderTypeEnum.RENEW);
-            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("订单还在交易中,请稍后重试");
-            	}
-                return failed(HttpStatus.CONTINUE, "您有待支付的订单");
+                    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);
@@ -268,7 +240,8 @@ public class MusicGroupController extends BaseController {
         //缴费项目已开启或者单独开启
         Map renew;
         if (calender.getStatus() == PaymentCalenderStatusEnum.OPEN || calenderDetail.getOpen() == 1) {
-            renew = musicGroupService.renew(calenderId, userId, isUseBalancePayment);
+            renewParamDto.setUserId(userId);
+            renew = musicGroupService.renew(renewParamDto);
         } else if (calender.getStatus() == PaymentCalenderStatusEnum.OVER) {
             throw new BizException("缴费已截止,如有问题请联系指导老师");
         } else {
@@ -330,7 +303,6 @@ public class MusicGroupController extends BaseController {
 
     @ApiOperation(value = "乐团报名支付")
     @PostMapping("/pay")
-    @ApiImplicitParams({@ApiImplicitParam(name = "registerPayDto", value = "支付信息", required = true, dataType = "RegisterPayDto")})
     public HttpResponseResult pay(@RequestBody RegisterPayDto registerPayDto) throws Exception {
 
         StudentRegistration studentRegistration = studentRegistrationService.get(registerPayDto.getRegisterId().longValue());
@@ -345,10 +317,6 @@ public class MusicGroupController extends BaseController {
 
         Integer userId = studentRegistration.getUserId();
 
-        /*StudentPaymentOrder ApplyOrder = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, studentRegistration.getMusicGroupId(), DealStatusEnum.SUCCESS);
-        if (ApplyOrder != null) {
-            return failed("您已支付成功,请勿重复支付");
-        }*/
         //判断用户是否已存在订单
         List<StudentPaymentOrder> applyOrderList = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, studentRegistration.getMusicGroupId(), DealStatusEnum.ING);
         

+ 2 - 2
mec-student/src/main/java/com/ym/mec/student/controller/RepairController.java

@@ -123,7 +123,7 @@ public class RepairController extends BaseController {
 
     @ApiOperation("支付维修单")
     @PostMapping(value = "/payRepair")
-    public HttpResponseResult payRepair(StudentRepair repairInfo) throws Exception {
+    public HttpResponseResult payRepair(@RequestBody StudentRepair repairInfo) throws Exception {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
@@ -172,7 +172,7 @@ public class RepairController extends BaseController {
     @ApiOperation(value = "获取学员商品订单")
     @GetMapping("/getStudentGoodsOrder")
     public Object getStudentGoodsOrder(Integer goodsSellId) {
-        return succeed(studentGoodsSellService.get(goodsSellId));
+        return succeed(studentGoodsSellService.getStudentGoodsOrder(goodsSellId));
     }
 
     @ApiOperation(value = "确认收货")

+ 1 - 2
mec-student/src/main/java/com/ym/mec/student/controller/ReplacementInstrumentActivityController.java

@@ -145,8 +145,7 @@ public class ReplacementInstrumentActivityController extends BaseController {
 
     @ApiOperation(value = "置换支付")
     @PostMapping("/pay")
-    @ApiImplicitParams({@ApiImplicitParam(name = "replacementPayDto", value = "支付参数", required = true, dataType = "ReplacementPayDto")})
-    public HttpResponseResult pay(ReplacementPayDto replacementPayDto) throws Exception {
+    public HttpResponseResult pay(@RequestBody ReplacementPayDto replacementPayDto) throws Exception {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null) {
             throw new BizException("用户信息获取失败,请重新登陆");

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

@@ -67,12 +67,9 @@ public class SporadicChargeInfoController extends BaseController {
             if (sysUser == null || sysUser.getId() == null) {
                 return failed("用户不存在");
             }
-//            if (!sysUser.getUserType().contains("STUDENT")) {
-//                return failed("用户信息异常");
-//            }
             sporadicPayDto.setUserId(sysUser.getId());
         }
-        if (sporadicPayDto.getIsRepeatPay() == false) {
+        if (sporadicPayDto.getRepeatPay() == false) {
         	List<StudentPaymentOrder> studentPaymentOrderList = studentPaymentOrderDao.findPaymentOrderByGroupType(sporadicPayDto.getUserId(), sporadicPayDto.getSporadicId(), "SPORADIC", DealStatusEnum.ING);
             if (studentPaymentOrderList != null && studentPaymentOrderList.size() > 0) {
             	StudentPaymentOrder applyOrder = studentPaymentOrderList.get(studentPaymentOrderList.size() - 1);

+ 1 - 2
mec-student/src/main/java/com/ym/mec/student/controller/StudentInstrumentController.java

@@ -50,8 +50,7 @@ public class StudentInstrumentController extends BaseController {
 
     @ApiOperation(value = "乐保支付")
     @PostMapping("/pay")
-    @ApiImplicitParams({@ApiImplicitParam(name = "maintenancePayDto", value = "支付参数", required = true, dataType = "MaintenancePayDto")})
-    public HttpResponseResult pay(MaintenancePayDto maintenancePayDto) throws Exception {
+    public HttpResponseResult pay(@RequestBody MaintenancePayDto maintenancePayDto) throws Exception {
         Map payMap = studentInstrumentService.pay(maintenancePayDto);
         if (payMap.containsKey("tradeState")) {
             return failed(HttpStatus.CREATED, payMap, "恭喜您,支付成功!");

+ 6 - 17
mec-student/src/main/java/com/ym/mec/student/controller/SubjectChangeController.java

@@ -1,6 +1,7 @@
 package com.ym.mec.student.controller;
 
 import com.ym.mec.biz.dal.dao.SubjectChangeDao;
+import com.ym.mec.biz.dal.dto.SubjectChangeParamDto;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.entity.SubjectChange;
 import com.ym.mec.biz.dal.enums.PayStatus;
@@ -10,21 +11,13 @@ import com.ym.mec.biz.service.SubjectChangeService;
 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.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.math.BigDecimal;
+import org.springframework.web.bind.annotation.*;
 import java.util.Map;
 
 @RequestMapping("subjectChange")
@@ -52,13 +45,9 @@ public class SubjectChangeController extends BaseController {
 
     @ApiOperation(value = "支付更换声部费用")
     @PostMapping("/payChange")
-    @ApiImplicitParams({@ApiImplicitParam(name = "id", value = "id", required = true, dataType = "Integer"),
-            @ApiImplicitParam(name = "金额", value = "amount", required = true, dataType = "BigDecimal"),
-            @ApiImplicitParam(name = "是否使余额", value = "isUseBalancePayment", required = true, dataType = "Boolean")
-    })
-    public HttpResponseResult<Map> payChange(Integer id, BigDecimal amount, Boolean isUseBalancePayment, Boolean isRepay) throws Exception {
-        SubjectChange subjectChange = subjectChangeDao.get(id);
-        if (!isRepay && subjectChange.getStatus().equals(SubjectChangeStatusEnum.ING)) {
+    public HttpResponseResult<Map> payChange(@RequestBody SubjectChangeParamDto subjectChangeParamDto) throws Exception {
+        SubjectChange subjectChange = subjectChangeDao.get(subjectChangeParamDto.getId());
+        if (!subjectChangeParamDto.getRepay() && subjectChange.getStatus().equals(SubjectChangeStatusEnum.ING)) {
         	
             StudentPaymentOrder applyOrder = studentPaymentOrderService.get(subjectChange.getOrderId().longValue());
         	// 查询订单状态
@@ -70,7 +59,7 @@ public class SubjectChangeController extends BaseController {
         	}
             return failed(HttpStatus.CONTINUE, "您有待支付的订单");
         }
-        Map payMap = subjectChangeService.payChange(id, amount, isUseBalancePayment, isRepay);
+        Map payMap = subjectChangeService.payChange(subjectChangeParamDto);
         if (payMap.containsKey("tradeState")) {
             return failed(HttpStatus.CREATED, payMap, "恭喜您,支付成功!");
         }

+ 4 - 2
mec-student/src/main/java/com/ym/mec/student/controller/SysCouponCodeController.java

@@ -28,10 +28,12 @@ public class SysCouponCodeController extends BaseController {
 	@RequestMapping(value = "queryPage")
 	public HttpResponseResult queryPage(SysCouponCodeQueryInfo queryInfo) {
 		SysUser sysUser = sysUserFeignService.queryUserInfo();
-		if (sysUser == null) {
+		if (sysUser != null && sysUser.getId() != null) {
+			queryInfo.setUserId(sysUser.getId());
+		}
+		if(queryInfo.getUserId() == null){
 			return failed("请登录");
 		}
-		queryInfo.setUserId(sysUser.getId());
 		return succeed(sysCouponCodeService.querySysCouponUseList(queryInfo));
 	}
 

+ 2 - 2
mec-student/src/main/java/com/ym/mec/student/controller/SysMusicScoreAccompanimentController.java

@@ -41,7 +41,7 @@ public class SysMusicScoreAccompanimentController extends BaseController {
 
     @ApiOperation(value = "获取伴奏声部列表")
     @GetMapping("/querySubjectIds")
-    public Object querySubjectIds() {
-        return succeed(sysMusicScoreAccompanimentService.querySubjectIds());
+    public Object querySubjectIds(Integer categoriesId) {
+        return succeed(sysMusicScoreAccompanimentService.querySubjectIds(categoriesId));
     }
 }

+ 2 - 2
mec-teacher/src/main/java/com/ym/mec/teacher/controller/SysMusicScoreAccompanimentController.java

@@ -40,8 +40,8 @@ public class SysMusicScoreAccompanimentController extends BaseController {
 
     @ApiOperation(value = "获取伴奏声部列表")
     @GetMapping("/querySubjectIds")
-    public Object querySubjectIds() {
-        return succeed(sysMusicScoreAccompanimentService.querySubjectIds());
+    public Object querySubjectIds(Integer categoriesId) {
+        return succeed(sysMusicScoreAccompanimentService.querySubjectIds(categoriesId));
     }
 
     @ApiOperation(value = "分页查询")

+ 0 - 2
mec-web/src/main/java/com/ym/mec/web/controller/SubjectChangeController.java

@@ -38,8 +38,6 @@ import java.util.List;
 public class SubjectChangeController extends BaseController {
 
     @Autowired
-    private StudentRegistrationService studentRegistrationService;
-    @Autowired
     private MusicGroupSubjectPlanService musicGroupSubjectPlanService;
     @Autowired
     private SubjectChangeService subjectChangeService;

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

@@ -45,7 +45,7 @@ public class SysMusicScoreAccompanimentController extends BaseController {
 
     @ApiOperation(value = "获取伴奏声部列表")
     @GetMapping("/querySubjectIds")
-    public Object querySubjectIds() {
-        return succeed(sysMusicScoreAccompanimentService.querySubjectIds());
+    public Object querySubjectIds(Integer categoriesId) {
+        return succeed(sysMusicScoreAccompanimentService.querySubjectIds(categoriesId));
     }
 }

+ 2 - 2
mec-web/src/main/java/com/ym/mec/web/controller/education/EduMusicScoreController.java

@@ -52,7 +52,7 @@ public class EduMusicScoreController extends BaseController {
 
     @ApiOperation(value = "获取伴奏声部列表")
     @GetMapping("/querySubjectIds")
-    public Object querySubjectIds() {
-        return succeed(sysMusicScoreAccompanimentService.querySubjectIds());
+    public Object querySubjectIds(Integer categoriesId) {
+        return succeed(sysMusicScoreAccompanimentService.querySubjectIds(categoriesId));
     }
 }

+ 5 - 3
mec-web/src/main/java/com/ym/mec/web/controller/education/EduRepairController.java

@@ -25,8 +25,10 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.*;
-import java.util.stream.Collectors;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 
 @RequestMapping("eduRepair")
 @Api(tags = "教务维修服务")
@@ -101,7 +103,7 @@ public class EduRepairController extends BaseController {
 
     @ApiOperation("添加维修单")
     @PostMapping(value = "/addRepair")
-    public HttpResponseResult addRepair(StudentRepair repairInfo) throws Exception {
+    public HttpResponseResult addRepair(@RequestBody StudentRepair repairInfo) throws Exception {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null) {
             return failed(HttpStatus.FORBIDDEN, "请登录");

+ 30 - 0
mec-web/src/main/java/com/ym/mec/web/controller/education/EduSysCouponCodeController.java

@@ -0,0 +1,30 @@
+package com.ym.mec.web.controller.education;
+
+import com.ym.mec.biz.dal.page.SysCouponCodeQueryInfo;
+import com.ym.mec.biz.service.SysCouponCodeService;
+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.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RequestMapping("eduSysCouponCode")
+@Api(tags = "优惠券明细")
+@RestController
+public class EduSysCouponCodeController extends BaseController {
+
+	@Autowired
+	private SysCouponCodeService sysCouponCodeService;
+
+	@ApiOperation("分页查询")
+	@RequestMapping(value = "queryPage")
+	public HttpResponseResult queryPage(SysCouponCodeQueryInfo queryInfo) {
+		if(queryInfo.getUserId() == null){
+			throw new BizException("请指定学员");
+		}
+		return succeed(sysCouponCodeService.querySysCouponUseList(queryInfo));
+	}
+}

+ 7 - 13
mec-web/src/main/java/com/ym/mec/web/controller/education/ImGroupNoticeController.java

@@ -1,22 +1,19 @@
 package com.ym.mec.web.controller.education;
 
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.ImGroupNotice;
+import com.ym.mec.biz.dal.page.ImGroupNoticeQueryInfo;
+import com.ym.mec.biz.service.ImGroupNoticeService;
+import com.ym.mec.common.controller.BaseController;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-
-import java.util.Date;
-
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 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.entity.ImGroupNotice;
-import com.ym.mec.biz.dal.page.ImGroupNoticeQueryInfo;
-import com.ym.mec.biz.service.ImGroupNoticeService;
-import com.ym.mec.common.controller.BaseController;
-import com.ym.mec.im.ImFeignService;
+import java.util.Date;
 
 /**
  * @Author Joburgess
@@ -31,8 +28,6 @@ public class ImGroupNoticeController extends BaseController {
     private ImGroupNoticeService imGroupNoticeService;
     @Autowired
     private SysUserFeignService sysUserFeignService;
-    @Autowired
-    private ImFeignService imFeignService;
 
     @ApiOperation(value = "新增")
     @RequestMapping("/add")
@@ -42,7 +37,6 @@ public class ImGroupNoticeController extends BaseController {
         if(sysUser == null){
             return failed("获取用户信息失败");
         }
-        imGroupNotice.setOperatorId(sysUser.getId().longValue());
         return succeed(imGroupNoticeService.insert(imGroupNotice));
     }
 

+ 2 - 2
mec-web/src/main/resources/logback-spring.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration scan="true" scanPeriod="10 seconds">
 
-	<property name="LOG_HOME" value="/Users/chenxiaoyu/Documents/logs/web-%d{yyyy-MM-dd_HH}-%i.log" />
+	<property name="LOG_HOME" value="/mdata/logs/web-%d{yyyy-MM-dd_HH}-%i.log" />
 	<property name="CONSOLE_LOG_PATTERN"
 			  value="[%X{username} %X{ip} %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}] : %msg%n" />
 
@@ -30,7 +30,7 @@
 	<appender name="messagefile"
 			  class="ch.qos.logback.core.rolling.RollingFileAppender">
 		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-			<FileNamePattern>/Users/chenxiaoyu/Documents/logs/web-message-%d{yyyy-MM-dd_HH}-%i.log</FileNamePattern>
+			<FileNamePattern>/mdata/logs/web-message-%d{yyyy-MM-dd_HH}-%i.log</FileNamePattern>
 			<MaxHistory>90</MaxHistory>
 			<TimeBasedFileNamingAndTriggeringPolicy
 					class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">