Forráskód Böngészése

学生端活动购买

zouxuan 2 éve
szülő
commit
b9753e3142
27 módosított fájl, 551 hozzáadás és 317 törlés
  1. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java
  2. 0 50
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ActivityMemberPayParamDto.java
  3. 50 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ActivityPayParamDto.java
  4. 0 12
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MemberPayParamDto.java
  5. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/PayParamBasicDto.java
  6. 0 23
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/PracticeGroupBuyParamsDto.java
  7. 0 12
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/RegisterPayDto.java
  8. 0 27
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/RenewParamDto.java
  9. 0 12
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SporadicPayDto.java
  10. 0 14
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentRepair.java
  11. 12 4
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/VipGroupActivity.java
  12. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java
  13. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/service/PracticeGroupSellPriceService.java
  14. 0 2
      mec-biz/src/main/java/com/ym/mec/biz/service/SporadicChargeInfoService.java
  15. 11 12
      mec-biz/src/main/java/com/ym/mec/biz/service/SysUserCashAccountService.java
  16. 21 0
      mec-biz/src/main/java/com/ym/mec/biz/service/VipGroupActivityService.java
  17. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/service/VipGroupDefaultClassesUnitPriceService.java
  18. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupSellPriceServiceImpl.java
  19. 0 9
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupServiceImpl.java
  20. 4 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  21. 44 71
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysUserCashAccountServiceImpl.java
  22. 267 17
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupActivityServiceImpl.java
  23. 12 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupDefaultClassesUnitPriceServiceImpl.java
  24. 7 0
      mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml
  25. 4 1
      mec-biz/src/main/resources/config/mybatis/VipGroupActivityMapper.xml
  26. 60 39
      mec-student/src/main/java/com/ym/mec/student/controller/ActivityController.java
  27. 3 6
      mec-web/src/main/java/com/ym/mec/web/controller/VipGroupActivityController.java

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

@@ -772,4 +772,13 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
     List<StudentRegistration> queryServiceStudentByMusicGroupStatus(@Param("nextMonday") String nextMonday,@Param("tenantId") Integer tenantId);
     
     List<StudentOrganDto> queryEffectiveStudent(@Param("organIds") List<Integer> organIds);
+
+    /**
+    * @description: 获取学员乐团主管列表
+     * @param userId
+    * @return java.util.Map<java.lang.Integer,java.lang.String>
+    * @author zx
+    * @date 2022/10/9 18:11
+    */
+    Map<Integer, String> queryStudentEduMap(Integer userId);
 }

+ 0 - 50
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ActivityMemberPayParamDto.java

@@ -1,50 +0,0 @@
-package com.ym.mec.biz.dal.dto;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-
-public class ActivityMemberPayParamDto extends PayParamBasicDto implements Serializable {
-
-    //前端录入实际缴费金额
-    private BigDecimal amount;
-
-    private Long paymentId;
-
-    //购买数量
-    private Integer val;
-
-    //如果isRepeatPay = true 则需要传入订单号
-    private String orderNo;
-
-    public BigDecimal getAmount() {
-        return amount;
-    }
-
-    public void setAmount(BigDecimal amount) {
-        this.amount = amount;
-    }
-
-    public Long getPaymentId() {
-        return paymentId;
-    }
-
-    public void setPaymentId(Long paymentId) {
-        this.paymentId = paymentId;
-    }
-
-    public Integer getVal() {
-        return val;
-    }
-
-    public void setVal(Integer val) {
-        this.val = val;
-    }
-
-    public String getOrderNo() {
-        return orderNo;
-    }
-
-    public void setOrderNo(String orderNo) {
-        this.orderNo = orderNo;
-    }
-}

+ 50 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ActivityPayParamDto.java

@@ -0,0 +1,50 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+public class ActivityPayParamDto extends PayParamBasicDto implements Serializable {
+
+    @ApiModelProperty(value = "购买数量",required = false)
+    private Integer buyNum = 1;
+
+    @ApiModelProperty(value = "活动编号",required = false)
+    private Integer vipGroupActivityId;
+
+    private Integer userId;
+
+    private Integer organId;
+
+    public Integer getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(Integer organId) {
+        this.organId = organId;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getBuyNum() {
+        return buyNum;
+    }
+
+    public void setBuyNum(Integer buyNum) {
+        this.buyNum = buyNum;
+    }
+
+    public Integer getVipGroupActivityId() {
+        return vipGroupActivityId;
+    }
+
+    public void setVipGroupActivityId(Integer vipGroupActivityId) {
+        this.vipGroupActivityId = vipGroupActivityId;
+    }
+}

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

@@ -4,13 +4,9 @@ import com.ym.mec.biz.dal.enums.PeriodEnum;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.io.Serializable;
-import java.math.BigDecimal;
 
 public class MemberPayParamDto extends PayParamBasicDto implements Serializable {
 
-    @ApiModelProperty(value = "前端录入实际缴费金额",required = false)
-    private BigDecimal amount;
-
     @ApiModelProperty(value = "用于后台创建的团练宝订单购买",required = false)
     private Long paymentId;
 
@@ -55,14 +51,6 @@ public class MemberPayParamDto extends PayParamBasicDto implements Serializable
         this.periodEnum = periodEnum;
     }
 
-    public BigDecimal getAmount() {
-        return amount;
-    }
-
-    public void setAmount(BigDecimal amount) {
-        this.amount = amount;
-    }
-
     public Long getPaymentId() {
         return paymentId;
     }

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

@@ -3,6 +3,7 @@ package com.ym.mec.biz.dal.dto;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.List;
 
 import com.ym.mec.common.entity.BaseEntity;
@@ -17,6 +18,17 @@ public class PayParamBasicDto extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "优惠券列表", required = false)
     private List<Integer> couponIdList;
 
+    @ApiModelProperty(value = "前端录入实际缴费金额",required = false)
+    private BigDecimal amount;
+
+    public BigDecimal getAmount() {
+        return amount;
+    }
+
+    public void setAmount(BigDecimal amount) {
+        this.amount = amount;
+    }
+
     public List<Integer> getCouponIdList() {
         return couponIdList;
     }

+ 0 - 23
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/PracticeGroupBuyParamsDto.java

@@ -2,8 +2,6 @@ package com.ym.mec.biz.dal.dto;
 
 import io.swagger.annotations.ApiModelProperty;
 
-import java.math.BigDecimal;
-
 public class PracticeGroupBuyParamsDto extends PayParamBasicDto{
 
     @ApiModelProperty(value = "课程组ID")
@@ -18,21 +16,8 @@ public class PracticeGroupBuyParamsDto extends PayParamBasicDto{
     @ApiModelProperty(value = "营销活动编号")
     private Integer activityId;
 
-    private BigDecimal amount;
-
     private Integer organId;
 
-//    @ApiModelProperty(value = "购买的会员数量")
-//    private Integer buyMemberNum = 1;
-
-//    public Integer getBuyMemberNum() {
-//        return buyMemberNum;
-//    }
-//
-//    public void setBuyMemberNum(Integer buyMemberNum) {
-//        this.buyMemberNum = buyMemberNum;
-//    }
-
     public Integer getOrganId() {
         return organId;
     }
@@ -41,14 +26,6 @@ public class PracticeGroupBuyParamsDto extends PayParamBasicDto{
         this.organId = organId;
     }
 
-    public BigDecimal getAmount() {
-        return amount;
-    }
-
-    public void setAmount(BigDecimal amount) {
-        this.amount = amount;
-    }
-
     public Integer getActivityId() {
         return activityId;
     }

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

@@ -2,7 +2,6 @@ package com.ym.mec.biz.dal.dto;
 
 import io.swagger.annotations.ApiModelProperty;
 
-import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 
@@ -10,8 +9,6 @@ import java.util.Map;
  * 学团注册支付
  */
 public class RegisterPayDto extends PayParamBasicDto{
-    //总金额
-    private BigDecimal amount;
     //报名id
     private Integer registerId;
     //乐器id->type
@@ -91,15 +88,6 @@ public class RegisterPayDto extends PayParamBasicDto{
         this.registerId = registerId;
     }
 
-
-    public BigDecimal getAmount() {
-        return amount;
-    }
-
-    public void setAmount(BigDecimal amount) {
-        this.amount = amount;
-    }
-
     public Map<Long, String> getGoodsGroups() {
         return goodsGroups;
     }

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

@@ -1,27 +0,0 @@
-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;
-    }
-}

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

@@ -2,11 +2,7 @@ package com.ym.mec.biz.dal.dto;
 
 import io.swagger.annotations.ApiModelProperty;
 
-import java.math.BigDecimal;
-
 public class SporadicPayDto extends PayParamBasicDto {
-    @ApiModelProperty(value = "金额",required = false)
-    private BigDecimal amount;
 
     @ApiModelProperty(value = "用户编号",required = false)
     private Integer userId;
@@ -17,14 +13,6 @@ public class SporadicPayDto extends PayParamBasicDto {
     @ApiModelProperty(value = "购买数量",required = false)
     private Integer num = 1;
 
-    public BigDecimal getAmount() {
-        return amount;
-    }
-
-    public void setAmount(BigDecimal amount) {
-        this.amount = amount;
-    }
-
     public Integer getUserId() {
         return userId;
     }

+ 0 - 14
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentRepair.java

@@ -146,12 +146,6 @@ public class StudentRepair extends PayParamBasicDto {
     private String description;
 
     /**
-     * 维修金额
-     */
-    @ApiModelProperty(value = "维修金额", required = false)
-    private BigDecimal amount;
-
-    /**
      * 维修完成时间
      */
     @ApiModelProperty(value = "维修完成时间", required = false)
@@ -371,14 +365,6 @@ public class StudentRepair extends PayParamBasicDto {
         this.description = description;
     }
 
-    public BigDecimal getAmount() {
-        return amount;
-    }
-
-    public void setAmount(BigDecimal amount) {
-        this.amount = amount;
-    }
-
     public Date getFinishTime() {
         return finishTime;
     }

+ 12 - 4
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/VipGroupActivity.java

@@ -52,9 +52,6 @@ public class VipGroupActivity extends BaseEntity {
 	@ApiModelProperty(value = "可排课截至时间")
 	private java.util.Date coursesEndTime;
 
-//	@ApiModelProperty(value = "活动类型(基础活动、折扣、赠送课时)")
-//	private VipGroupActivityTypeEnum type;
-
 	@ApiModelProperty(value = "折扣)")
 	private BigDecimal discount = new BigDecimal(100);
 
@@ -162,7 +159,7 @@ public class VipGroupActivity extends BaseEntity {
 	//用于标记活动类型,购买的活动类型1、1v1 20节,2、1v1 40节,3、1v2 20节,4、1v2 40节,5、乐理课
 	private Integer code;
 
-	@ApiModelProperty(value = "活动渠道,1乐团渠道,2常规活动")
+	@ApiModelProperty(value = "活动渠道,1乐团渠道,2常规活动,3学员购买")
 	private Integer activityChannel;
 
 	@ApiModelProperty(value = "赠送的优惠券的编号")
@@ -171,6 +168,17 @@ public class VipGroupActivity extends BaseEntity {
 	@ApiModelProperty(value = "赠送的优惠券的数量")
 	private Integer giveCouponNum;
 
+	@ApiModelProperty(value = "单价")
+	private BigDecimal singlePrice;
+
+	public BigDecimal getSinglePrice() {
+		return singlePrice;
+	}
+
+	public void setSinglePrice(BigDecimal singlePrice) {
+		this.singlePrice = singlePrice;
+	}
+
 	public Integer getGiveCouponId() {
 		return giveCouponId;
 	}

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java

@@ -25,6 +25,9 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
 //    SMS_WITHDRAW_SUCCESS("SMS_WITHDRAW_SUCCESS", "提现成功"),
 //    SMS_MUSIC_GROUP_CLOSE("SMS_MUSIC_GROUP_CLOSE", "乐团关闭(关闭后)"),
 
+    PUSH_STUDENT_BUY_ACTIVITY("PUSH_STUDENT_BUY_ACTIVITY", "活动购买成功"),
+    PUSH_SYSTEM_ACTIVITY_COURSE("PUSH_SYSTEM_ACTIVITY_COURSE", "待排课通知"),
+    PUSH_TEACHER_ACTIVITY_COURSE("PUSH_TEACHER_ACTIVITY_COURSE", "待排课通知"),
     STUDENT_SMS_PUSH_PAYMENT_SUCCESS("STUDENT_SMS_PUSH_PAYMENT_SUCCESS", "缴费成功结果通知"),
     STUDENT_SMS_BALANCE_CONSUME("STUDENT_SMS_BALANCE_CONSUME", "余额消费"),
     STUDENT_PUSH_VIP_BUY("STUDENT_PUSH_VIP_BUY", "VIP课购买"),

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

@@ -3,6 +3,17 @@ package com.ym.mec.biz.service;
 import com.ym.mec.biz.dal.entity.PracticeGroupSellPrice;
 import com.ym.mec.common.service.BaseService;
 
+import java.math.BigDecimal;
+
 public interface PracticeGroupSellPriceService extends BaseService<Integer, PracticeGroupSellPrice> {
 
+    /**
+    * @description: 获取网管课价格
+     * @param organId 分部
+     * @param courseNum 课程数量
+    * @return java.math.BigDecimal
+    * @author zx
+    * @date 2022/10/9 15:47
+    */
+    BigDecimal getAmount(Integer organId, BigDecimal courseNum);
 }

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

@@ -1,12 +1,10 @@
 package com.ym.mec.biz.service;
 
-import com.ym.mec.biz.dal.entity.Organization;
 import com.ym.mec.biz.dal.entity.SporadicChargeInfo;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.page.SporadicChargeInfoQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
-import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 

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

@@ -1,5 +1,7 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dto.PayParamBasicDto;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.entity.SysUserCashAccount;
 import com.ym.mec.biz.dal.enums.PlatformCashAccountDetailTypeEnum;
 import com.ym.mec.common.service.BaseService;
@@ -53,18 +55,6 @@ public interface SysUserCashAccountService extends BaseService<Integer, SysUserC
 	 */
 	boolean appendCourseBalance(Integer userId, BigDecimal decimal, PlatformCashAccountDetailTypeEnum type, String description);
 
-	/**
-	 * @describe 从账户金额与课程金额中扣减指定金额
-	 * 优先课程金额,不够再扣减账户金额
-	 * @author Joburgess
-	 * @date 2021/1/20 0020
-	 * @param userId:
-	 * @param decimal:
-	 * @param type:
-	 * @param description:
-	 * @return void
-	 */
-	void subtractFromCourseBalanceAndBalance(Integer userId, BigDecimal decimal, PlatformCashAccountDetailTypeEnum type, String description,Long vipGroupId);
 
 	/**
 	 * 将课程余额转入到可用余额
@@ -79,4 +69,13 @@ public interface SysUserCashAccountService extends BaseService<Integer, SysUserC
 	 * @return
 	 */
 	SysUserCashAccount getLocked(Integer userId);
+
+	/**
+	* @description: 余额消耗
+	 * @param
+	* @return java.lang.Boolean
+	* @author zx
+	* @date 2022/10/9 16:29
+	*/
+	Boolean use(PayParamBasicDto payParam, StudentPaymentOrder studentPaymentOrder);
 }

+ 21 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/VipGroupActivityService.java

@@ -1,17 +1,25 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dao.VipGroupActivityDao;
 import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.entity.VipGroupActivity;
 import com.ym.mec.biz.dal.page.ActivityStudentQueryInfo;
 import com.ym.mec.biz.dal.page.DoubleEleven2021QueryInfo;
 import com.ym.mec.biz.dal.page.VipGroupActivityQueryInfo;
+import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 public interface VipGroupActivityService extends BaseService<Integer, VipGroupActivity> {
 
+    VipGroupActivityDao getDao();
+
     /**
      * @Author: Joburgess
      * @Date: 2019/10/1
@@ -33,6 +41,8 @@ public interface VipGroupActivityService extends BaseService<Integer, VipGroupAc
      */
     List<VipGroupActivity> findByVipGroupCategory(ActivityQueryDto activityQueryDto);
 
+    BigDecimal getActivityPrice(VipGroupActivity vipGroupActivity, Integer organId, BigDecimal buyNum);
+
     /**
      * 导出vip活动
      * @param queryInfo
@@ -96,4 +106,15 @@ public interface VipGroupActivityService extends BaseService<Integer, VipGroupAc
     * @date 2021/10/26 11:38
     */
     PageInfo<DoubleEleven2021OrderDetailDto> doubleEleven2021OrderDetail(DoubleEleven2021QueryInfo queryInfo);
+
+    /**
+    * @description: 通用活动购买
+     * @param activityPayParamDto
+    * @return com.ym.mec.common.entity.HttpResponseResult
+    * @author zx
+    * @date 2022/10/9 14:38
+    */
+    HttpResponseResult buy(ActivityPayParamDto activityPayParamDto) throws Exception;
+
+    void orderCallback(StudentPaymentOrder studentPaymentOrder);
 }

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

@@ -3,6 +3,17 @@ package com.ym.mec.biz.service;
 import com.ym.mec.biz.dal.entity.VipGroupDefaultClassesUnitPrice;
 import com.ym.mec.common.service.BaseService;
 
+import java.math.BigDecimal;
+
 public interface VipGroupDefaultClassesUnitPriceService extends BaseService<Integer, VipGroupDefaultClassesUnitPrice> {
 
+    /**
+    * @description: 获取课程价格
+     * @param organId
+     * @param courseNum
+    * @return java.math.BigDecimal
+    * @author zx
+    * @date 2022/10/9 15:56
+    */
+    BigDecimal getAmount(Integer organId, BigDecimal courseNum);
 }

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupSellPriceServiceImpl.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service.impl;
 
+import com.ym.mec.common.exception.BizException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -9,6 +10,9 @@ import com.ym.mec.biz.service.PracticeGroupSellPriceService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 
+import java.math.BigDecimal;
+import java.util.Optional;
+
 @Service
 public class PracticeGroupSellPriceServiceImpl extends BaseServiceImpl<Integer, PracticeGroupSellPrice> implements PracticeGroupSellPriceService {
 	
@@ -20,4 +24,10 @@ public class PracticeGroupSellPriceServiceImpl extends BaseServiceImpl<Integer,
 		return practiceGroupSellPriceDao;
 	}
 
+	@Override
+	public BigDecimal getAmount(Integer organId, BigDecimal courseNum) {
+		PracticeGroupSellPrice practiceGroupSellPrice = Optional.ofNullable(practiceGroupSellPriceDao.get(organId)).
+				orElseThrow(()->new BizException("请配置网管课价格"));
+		return practiceGroupSellPrice.getSingleClassMinutesPrice().multiply(courseNum);
+	}
 }

+ 0 - 9
mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupServiceImpl.java

@@ -3,7 +3,6 @@ package com.ym.mec.biz.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
-import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.*;
@@ -85,8 +84,6 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
     @Autowired
     private ClassGroupStudentMapperDao classGroupStudentMapperDao;
     @Autowired
-    private SysUserFeignService sysUserFeignService;
-    @Autowired
     private SysUserService sysUserService;
     @Autowired
     private TeacherDao teacherDao;
@@ -142,12 +139,6 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
     @Autowired
     private ActivityUserMapperService activityUserMapperService;
     @Autowired
-    private CourseScheduleTeacherSalaryService courseScheduleTeacherSalaryService;
-    @Autowired
-    private VipGroupDao vipGroupDao;
-    @Autowired
-    private VipGroupCategoryDao vipGroupCategoryDao;
-    @Autowired
     private SysUserCashAccountLogService sysUserCashAccountLogService;
     @Autowired
     private OrganizationService organizationService;

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

@@ -807,9 +807,11 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
             activityUserMapper.setActivityId(vipGroupActivityId);
             activityUserMapper.setTeacherId(teacherId);
             activityUserMapper.setActualPrice(studentPaymentOrder.getExpectAmount());
+            activityUserMapper.setAddMemo(activity.getName());
             if (vipGroupId != null) {
                 activityUserMapper.setVipFlag(2);
-            } else {
+            }
+            if(practiceGroupId != null) {
                 activityUserMapper.setPracticeFlag(2);
             }
             activityUserMapperService.copyProperty(activityUserMapper,activity,false,true);
@@ -841,7 +843,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
                 cloudTeacherOrder.setUpdateTime(now);
                 cloudTeacherOrder.setAmount(BigDecimal.ZERO);
                 cloudTeacherOrder.setOrderId(studentPaymentOrder.getId());
-                cloudTeacherOrder.setRemark("购买vip活动赠送会员");
+                cloudTeacherOrder.setRemark(studentPaymentOrder.getMemo() + "赠送会员");
                 cloudTeacherOrder.setLevel(activity.getGiveMemberRankId());
                 cloudTeacherOrder.setStudentId(studentPaymentOrder.getUserId());
                 cloudTeacherOrder.setType(activity.getGivePeriodEnum());

+ 44 - 71
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysUserCashAccountServiceImpl.java

@@ -5,15 +5,18 @@ import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.SysUserCashAccountDao;
 import com.ym.mec.biz.dal.dao.SysUserCashAccountDetailDao;
 import com.ym.mec.biz.dal.dao.SysUserCoursesAccountDetailDao;
-import com.ym.mec.biz.dal.entity.SysUserCashAccount;
-import com.ym.mec.biz.dal.entity.SysUserCashAccountDetail;
-import com.ym.mec.biz.dal.entity.SysUserCoursesAccountDetail;
+import com.ym.mec.biz.dal.dto.ActivityPayParamDto;
+import com.ym.mec.biz.dal.dto.PayParamBasicDto;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.enums.PlatformCashAccountDetailTypeEnum;
 import com.ym.mec.biz.dal.enums.PlatformCashAccountStatusEnum;
+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.SysUserCashAccountService;
+import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
@@ -38,11 +41,14 @@ public class SysUserCashAccountServiceImpl extends BaseServiceImpl<Integer, SysU
     private SysUserFeignService sysUserFeignService;
     @Autowired
     private SysMessageService sysMessageService;
-
     @Autowired
     private SysUserCashAccountDetailDao sysUserCashAccountDetailDao;
     @Autowired
     private SysUserCoursesAccountDetailDao sysUserCoursesAccountDetailDao;
+    @Autowired
+    private StudentPaymentRouteOrderService studentPaymentRouteOrderService;
+    @Autowired
+    private StudentPaymentOrderService studentPaymentOrderService;
 
     @Override
     public BaseDAO<Integer, SysUserCashAccount> getDAO() {
@@ -256,73 +262,6 @@ public class SysUserCashAccountServiceImpl extends BaseServiceImpl<Integer, SysU
     }
 
     @Override
-    public void subtractFromCourseBalanceAndBalance(Integer userId, BigDecimal decimal, PlatformCashAccountDetailTypeEnum type, String description,Long vipGroupId) {
-        SysUserCashAccount cashAccount = sysUserCashAccountDao.getLocked(userId);
-        if (cashAccount == null) {
-            throw new BizException("用户[{}]现金账户不存在", userId);
-        }
-        decimal = decimal.abs();
-        BigDecimal allBalance = cashAccount.getCourseBalance().add(cashAccount.getBalance());
-        BigDecimal changeMoney = decimal;
-        if (changeMoney.compareTo(allBalance)>0) {
-            throw new BizException("现金账户[{}]课程余额不足,可用余额剩{}元", userId, allBalance.doubleValue());
-        }
-
-        if (changeMoney.compareTo(BigDecimal.ZERO) == 0) {
-            return;
-        }
-
-        Date date = new Date();
-        SysUserCoursesAccountDetail sysUserCoursesAccountDetail = new SysUserCoursesAccountDetail();
-        if(changeMoney.compareTo(cashAccount.getCourseBalance())>0){
-            changeMoney = changeMoney.subtract(cashAccount.getCourseBalance());
-            sysUserCoursesAccountDetail.setAmount(cashAccount.getCourseBalance());
-            cashAccount.setCourseBalance(BigDecimal.ZERO);
-        }else{
-            cashAccount.setCourseBalance(cashAccount.getCourseBalance().subtract(changeMoney));
-            sysUserCoursesAccountDetail.setAmount(changeMoney);
-            changeMoney = BigDecimal.ZERO;
-        }
-        cashAccount.setUpdateTime(date);
-
-        String comment = description;
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if(sysUser != null && sysUser.getId()!=null){
-            comment +=  "-" + sysUser.getId();
-        }
-        sysUserCoursesAccountDetail.setUserId(userId);
-        sysUserCoursesAccountDetail.setBalance(cashAccount.getCourseBalance());
-        sysUserCoursesAccountDetail.setComment(comment);
-        sysUserCoursesAccountDetail.setDescription("总扣费金额:"+decimal);
-        sysUserCoursesAccountDetail.setStatus(DealStatusEnum.SUCCESS);
-        sysUserCoursesAccountDetail.setType(type);
-        sysUserCoursesAccountDetail.setUpdateTime(date);
-        sysUserCoursesAccountDetail.setCreateTime(date);
-        sysUserCoursesAccountDetail.setGroupId(vipGroupId);
-        sysUserCoursesAccountDetailDao.insert(sysUserCoursesAccountDetail);
-
-        if(changeMoney.compareTo(BigDecimal.ZERO)==0){
-            sysUserCashAccountDao.update(cashAccount);
-            return;
-        }
-        cashAccount.setBalance(cashAccount.getBalance().subtract(changeMoney));
-        sysUserCashAccountDao.update(cashAccount);
-
-        SysUserCashAccountDetail detail = new SysUserCashAccountDetail();
-        detail.setAmount(changeMoney);
-        detail.setBalance(cashAccount.getBalance());
-        detail.setComment(comment);
-        detail.setCreateTime(date);
-        detail.setDescription("总扣费金额:"+decimal);
-        detail.setStatus(DealStatusEnum.SUCCESS);
-        detail.setType(type);
-        detail.setUpdateTime(date);
-        detail.setUserId(userId);
-        detail.setGroupId(vipGroupId);
-        sysUserCashAccountDetailDao.insert(detail);
-    }
-
-    @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public boolean transferCourseBalanceToBalance(Integer userId, BigDecimal money) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
@@ -383,4 +322,38 @@ public class SysUserCashAccountServiceImpl extends BaseServiceImpl<Integer, SysU
         return sysUserCashAccountDao.getLocked(userId);
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean use(PayParamBasicDto payParam, StudentPaymentOrder studentPaymentOrder) {
+        BigDecimal amount = payParam.getAmount();
+        if (payParam.getUseBalancePayment() || payParam.getAmount().doubleValue() == 0) {
+            SysUserCashAccount userCashAccount = sysUserCashAccountDao.getLocked(studentPaymentOrder.getUserId());
+            if (userCashAccount == null) {
+                throw new BizException("用户账户找不到");
+            }
+            studentPaymentOrder.setPaymentChannel("BALANCE");
+            if (userCashAccount.getBalance().subtract(amount).doubleValue() >= 0) {
+                studentPaymentRouteOrderService.addRouteOrder(studentPaymentOrder.getOrderNo(), studentPaymentOrder.getOrganId(),amount);
+                // 更新订单信息
+                studentPaymentOrder.setActualAmount(new BigDecimal(0));
+                studentPaymentOrder.setBalancePaymentAmount(amount);
+                studentPaymentOrder.setStatus(DealStatusEnum.SUCCESS);
+                studentPaymentOrder.setRoutingOrganId(studentPaymentOrder.getOrganId());
+//                studentPaymentOrderService.orderCallback(studentPaymentOrder);
+
+                this.updateBalance(studentPaymentOrder.getUserId(), amount.negate(), PlatformCashAccountDetailTypeEnum.PAY_FEE, studentPaymentOrder.getMemo());
+                return true;
+            } else {
+                if (userCashAccount.getBalance().doubleValue() > 0) {
+                    this.updateBalance(studentPaymentOrder.getUserId(), userCashAccount.getBalance().negate(), PlatformCashAccountDetailTypeEnum.PAY_FEE,studentPaymentOrder.getMemo());
+                    amount = amount.subtract(userCashAccount.getBalance());
+                    studentPaymentOrder.setActualAmount(amount);
+                    studentPaymentOrder.setBalancePaymentAmount(userCashAccount.getBalance());
+                } else {
+                    studentPaymentOrder.setBalancePaymentAmount(new BigDecimal(0));
+                }
+            }
+        }
+        return false;
+    }
 }

+ 267 - 17
mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupActivityServiceImpl.java

@@ -1,32 +1,40 @@
 package com.ym.mec.biz.service.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.*;
-import com.ym.mec.biz.dal.entity.ActivityApplyStudentType;
-import com.ym.mec.biz.dal.entity.Teacher;
-import com.ym.mec.biz.dal.entity.VipGroupActivity;
-import com.ym.mec.biz.dal.entity.VipGroupCategory;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.ActivityStudentQueryInfo;
 import com.ym.mec.biz.dal.page.DoubleEleven2021QueryInfo;
 import com.ym.mec.biz.dal.page.VipGroupActivityQueryInfo;
-import com.ym.mec.biz.service.VipGroupActivityService;
+import com.ym.mec.biz.service.*;
+import com.ym.mec.common.constant.CommonConstants;
+import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.service.IdGeneratorService;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.common.tenant.TenantContextHolder;
+import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
-
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
 
+import static com.ym.mec.biz.dal.enums.SysUserRoleEnum.ORGAN_MANAGER;
+import static java.math.BigDecimal.ROUND_DOWN;
+
 @Service
 public class VipGroupActivityServiceImpl extends BaseServiceImpl<Integer, VipGroupActivity>  implements VipGroupActivityService {
 	
@@ -39,7 +47,35 @@ public class VipGroupActivityServiceImpl extends BaseServiceImpl<Integer, VipGro
 	@Autowired
 	private VipGroupCategoryDao vipGroupCategoryDao;
 	@Autowired
+	private StudentPaymentOrderService studentPaymentOrderService;
+	@Autowired
+	private ActivityUserMapperService activityUserMapperService;
+	@Autowired
+	private SysCouponCodeService sysCouponCodeService;
+	@Autowired
+	private MemberFeeSettingService memberFeeSettingService;
+	@Autowired
+	private PracticeGroupSellPriceService practiceGroupSellPriceService;
+	@Autowired
+	private VipGroupDefaultClassesUnitPriceService vipGroupDefaultClassesUnitPriceService;
+	@Autowired
+	private IdGeneratorService idGeneratorService;
+	@Autowired
+	private SysUserCashAccountService sysUserCashAccountService;
+	@Autowired
+	private SysUserCashAccountDetailService sysUserCashAccountDetailService;
+	@Autowired
 	private SysConfigDao sysConfigDao;
+	@Autowired
+	private PayService payService;
+	@Autowired
+	private StudentRegistrationDao studentRegistrationDao;
+	@Autowired
+	private SysEmployeePositionService employeePositionService;
+	@Autowired
+	private SysMessageService sysMessageService;
+	@Autowired
+	private StudentDao studentDao;
 
 	@Override
 	public BaseDAO<Integer, VipGroupActivity> getDAO() {
@@ -62,7 +98,12 @@ public class VipGroupActivityServiceImpl extends BaseServiceImpl<Integer, VipGro
 		}
 	}
 
-	@Override
+    @Override
+    public VipGroupActivityDao getDao() {
+        return vipGroupActivityDao;
+    }
+
+    @Override
 	public VipGroupActivityAddDto addVipGroupActivity(VipGroupActivityAddDto vipGroupActivityAddDto) {
 
 		if(Objects.isNull(vipGroupActivityAddDto.getOrganId())){
@@ -147,19 +188,47 @@ public class VipGroupActivityServiceImpl extends BaseServiceImpl<Integer, VipGro
 
 	@Override
 	public List<VipGroupActivity> findByVipGroupCategory(ActivityQueryDto activityQueryDto) {
-		Teacher teacher = teacherDao.get(activityQueryDto.getTeacherId());
-		if(Objects.isNull(teacher)){
-			throw new BizException("未找到指定教师");
+		if(activityQueryDto.getTeacherId() != null){
+			Teacher teacher = teacherDao.get(activityQueryDto.getTeacherId());
+			if(Objects.isNull(teacher)){
+				throw new BizException("未找到指定教师");
+			}
+			String organId = activityQueryDto.getOrganId();
+			if(StringUtils.isBlank(organId)){
+				organId = teacher.getTeacherOrganId().toString();
+				if (StringUtils.isNotEmpty(teacher.getFlowOrganRange())) {
+					organId += "," + teacher.getFlowOrganRange();
+				}
+				activityQueryDto.setOrganId(organId);
+			}
+		}
+		List<VipGroupActivity> activityList = vipGroupActivityDao.findByCategory(activityQueryDto);
+		if(!CollectionUtils.isEmpty(activityList)){
+			Integer organId = Integer.parseInt(activityQueryDto.getOrganId());
+			BigDecimal buyNum = new BigDecimal(1);
+			activityList.stream().forEach(e->e.setSinglePrice(this.getActivityPrice(e,organId,buyNum)));
 		}
-		String organId = activityQueryDto.getOrganId();
-		if(StringUtils.isBlank(organId)){
-			organId = teacher.getTeacherOrganId().toString();
-			if (StringUtils.isNotEmpty(teacher.getFlowOrganRange())) {
-				organId += "," + teacher.getFlowOrganRange();
+		return activityList;
+	}
+
+	@Override
+	public BigDecimal getActivityPrice(VipGroupActivity vipGroupActivity, Integer organId, BigDecimal buyNum){
+		BigDecimal actualAmount;
+		if(vipGroupActivity.getActivityType().equals(1)){
+			//获取团练宝价格
+			actualAmount = memberFeeSettingService.getAmount(organId,1,
+					vipGroupActivity.getPeriodEnum(),buyNum,
+					MemberFeeSettingServiceImpl::getCurrentFee);
+		}else {
+			if (StringUtils.isEmpty(vipGroupActivity.getVipGroupCategoryIdList())){
+				//获取分部网管课价格
+				actualAmount = practiceGroupSellPriceService.getAmount(organId,buyNum);
+			}else {
+				//获取分部vip课价格
+				actualAmount = vipGroupDefaultClassesUnitPriceService.getAmount(organId,buyNum);
 			}
-			activityQueryDto.setOrganId(organId);
 		}
-		return vipGroupActivityDao.findByCategory(activityQueryDto);
+		return actualAmount;
 	}
 
 	@Override
@@ -398,4 +467,185 @@ public class VipGroupActivityServiceImpl extends BaseServiceImpl<Integer, VipGro
 		pageInfo.setRows(dataList);
 		return pageInfo;
 	}
+
+	private VipGroupActivity checkActivityBuy(ActivityPayParamDto payParam){
+		VipGroupActivity vipGroupActivity = vipGroupActivityDao.get(payParam.getVipGroupActivityId());
+		if (Objects.nonNull(vipGroupActivity.getStudentMaxUsedTimes()) && vipGroupActivity.getStudentMaxUsedTimes() != -1) {
+			int useNum = activityUserMapperService.countActivityBuyNum(vipGroupActivity.getId(), payParam.getUserId());
+			if (useNum >= vipGroupActivity.getStudentMaxUsedTimes()) {
+				throw new BizException("您已超过该活动购买限制{}次", vipGroupActivity.getStudentMaxUsedTimes());
+			}
+		}
+		if (Objects.nonNull(vipGroupActivity.getMinCourseNum())
+				&& vipGroupActivity.getMinCourseNum() != -1 && Objects.nonNull(vipGroupActivity.getMaxCourseNum())
+				&& vipGroupActivity.getMaxCourseNum() != -1) {
+			if (payParam.getBuyNum().compareTo(vipGroupActivity.getMinCourseNum()) < 0 || payParam.getBuyNum().compareTo(vipGroupActivity.getMaxCourseNum()) > 0) {
+				throw new BizException("该活动课时数为{}节~{}节", vipGroupActivity.getMinCourseNum(), vipGroupActivity.getMaxCourseNum());
+			}
+		}
+		return vipGroupActivity;
+	}
+
+    @Override
+	@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
+    public HttpResponseResult buy(ActivityPayParamDto payParam) throws Exception {
+		//校验购买资格
+		VipGroupActivity vipGroupActivity = this.checkActivityBuy(payParam);
+		//判断购买类型
+		OrderTypeEnum type;
+		CouponDetailTypeEnum couponType;
+		if(vipGroupActivity.getActivityType().equals(1)){
+			type = OrderTypeEnum.MEMBER;
+			couponType = CouponDetailTypeEnum.MEMBER;
+		}else {
+			if (StringUtils.isEmpty(vipGroupActivity.getVipGroupCategoryIdList())){
+				type = OrderTypeEnum.PRACTICE_GROUP_BUY;
+				couponType = CouponDetailTypeEnum.PRACTICE;
+			}else {
+				type = OrderTypeEnum.SMALL_CLASS_TO_BUY;
+				couponType = CouponDetailTypeEnum.VIP;
+			}
+		}
+		//计算支付金额
+		BigDecimal actualAmount = this.getActivityPrice(vipGroupActivity,payParam.getOrganId(),new BigDecimal(payParam.getBuyNum()));
+		actualAmount = actualAmount.multiply(vipGroupActivity.getDiscount()).divide(new BigDecimal(100), CommonConstants.DECIMAL_PLACE, ROUND_DOWN);
+		// 判断是否存在支付中的记录
+		List<StudentPaymentOrder> list = studentPaymentOrderService
+				.queryByCondition(GroupType.ACTIVITY,
+						payParam.getVipGroupActivityId().toString(),
+						payParam.getUserId(),
+						DealStatusEnum.ING,type);
+
+		if (list.size() > 0) {
+			StudentPaymentOrder applyOrder = list.get(list.size() - 1);
+			//校验重复支付
+			HttpResponseResult result = studentPaymentOrderService.checkRepeatPay(applyOrder, payParam.getRepeatPay());
+			if (result.getCode() != 200) {
+				return result;
+			}
+		}
+
+		//校验优惠券
+		String[] checkCoupon = CouponDetailTypeEnum.getAllowType(couponType);
+		StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(payParam.getCouponIdList(), actualAmount, true, checkCoupon);
+		if(payParam.getAmount().compareTo(studentPaymentOrder.getActualAmount()) != 0){
+			throw new BizException("非法请求");
+		}
+		studentPaymentOrder.setUserId(payParam.getUserId());
+		studentPaymentOrder.setGroupType(GroupType.ACTIVITY);
+		String orderNo = idGeneratorService.generatorId("payment") + "";
+		studentPaymentOrder.setOrderNo(orderNo);
+		studentPaymentOrder.setStatus(DealStatusEnum.ING);
+		studentPaymentOrder.setType(OrderTypeEnum.SMALL_CLASS_TO_BUY);
+		studentPaymentOrder.setMusicGroupId(payParam.getVipGroupActivityId().toString());
+		studentPaymentOrder.setOrganId(payParam.getOrganId());
+		studentPaymentOrder.setRoutingOrganId(payParam.getOrganId());
+		studentPaymentOrder.setVersion(0);
+		studentPaymentOrder.setActivityBuyNum(payParam.getBuyNum());
+		studentPaymentOrder.setActivityId(payParam.getVipGroupActivityId().toString());
+		studentPaymentOrder.setMemo("学员活动购买");
+		studentPaymentOrderService.insert(studentPaymentOrder);
+
+		//余额消耗
+		Boolean success = sysUserCashAccountService.use(payParam,studentPaymentOrder);
+		if(success){
+			this.orderCallback(studentPaymentOrder);
+			Map<String, Object> result = new HashMap<>();
+			result.put("orderNo", studentPaymentOrder.getOrderNo());
+			return BaseController.succeed(result);
+		}
+
+		BigDecimal amount = studentPaymentOrder.getActualAmount();
+		BigDecimal balance = BigDecimal.ZERO;
+		String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
+		//分类费用 course,instrument,accessories,other
+		Map<String, BigDecimal> classFee = new HashMap<>();
+		classFee.put("course", amount);
+		classFee.put("instrument", BigDecimal.ZERO);
+		classFee.put("accessories", BigDecimal.ZERO);
+		classFee.put("other", BigDecimal.ZERO);
+		Map<String, Object> payMap = payService.getPayMap(
+				amount,
+				balance,
+				orderNo,
+				baseApiUrl + "/api-student/studentOrder/callback",
+				baseApiUrl + "/api-student/studentOrder/paymentResult?orderNo=" + orderNo,
+				"学员活动购买",
+				vipGroupActivity.getName(),
+				payParam.getOrganId(),
+				"activityBuy"
+		);
+
+		studentPaymentOrder.setMerNos((String) payMap.get("routingMerNos"));
+		studentPaymentOrder.setPaymentChannel((String) payMap.get("type"));
+		studentPaymentOrderService.update(studentPaymentOrder);
+		return BaseController.succeed(payMap);
+    }
+
+	private StudentPaymentOrder checkOrderStatus(StudentPaymentOrder studentPaymentOrder){
+		StudentPaymentOrder order = studentPaymentOrderService.lockOrder(studentPaymentOrder.getId());
+		if (!order.getStatus().equals(DealStatusEnum.ING)) {
+			throw new BizException("订单状态异常");
+		}
+		//更新订单状态
+		int updateCount = studentPaymentOrderService.update(studentPaymentOrder);
+		if (updateCount <= 0) {
+			throw new BizException("订单更新失败");
+		}
+		return order;
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
+	public void orderCallback(StudentPaymentOrder studentPaymentOrder) {
+		studentPaymentOrder = this.checkOrderStatus(studentPaymentOrder);
+		if (studentPaymentOrder.getStatus() == DealStatusEnum.SUCCESS) {
+			//活动赠送
+			studentPaymentOrderService.activityGive(Integer.parseInt(studentPaymentOrder.getActivityId()), studentPaymentOrder,
+					null, null, null);
+			//保存账户信息
+			sysUserCashAccountDetailService.saveSysUserCashAccountDetail(studentPaymentOrder,studentPaymentOrder.getMemo());
+			//发送短信
+			this.sendSuccessMsg(studentPaymentOrder);
+		}else {
+			if (Objects.nonNull(studentPaymentOrder.getBalancePaymentAmount()) && studentPaymentOrder.getBalancePaymentAmount().compareTo(BigDecimal.ZERO) > 0) {
+				sysUserCashAccountService.updateBalance(studentPaymentOrder.getUserId(), studentPaymentOrder.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS, studentPaymentOrder.getMemo() + "支付失败,退还余额");
+			}
+			sysCouponCodeService.quit(studentPaymentOrder.getCouponCodeId());
+			return;
+		}
+	}
+
+	private void sendSuccessMsg(StudentPaymentOrder studentPaymentOrder){
+		Integer userId = studentPaymentOrder.getUserId();
+		VipGroupActivity vipGroupActivity = vipGroupActivityDao.get(Integer.parseInt(studentPaymentOrder.getActivityId()));
+		String activityName = vipGroupActivity.getName();
+		SysUser user = teacherDao.getUser(userId);
+		String username = StringUtils.isEmpty(user.getUsername())?user.getRealName():user.getUsername();
+		Map<Integer, String> map = new HashMap<>(1);
+		map.put(userId, userId.toString());
+		sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.PUSH_STUDENT_BUY_ACTIVITY, map, null, 0,null, "STUDENT",
+				activityName);
+		//获取乐团主管
+		Map<Integer, String> eduMap = studentRegistrationDao.queryStudentEduMap(userId);
+		if(CollectionUtils.isEmpty(eduMap)){
+			Set<Integer> integers = employeePositionService.queryUserIdByRoleId(new SysUserRoleEnum[]{ORGAN_MANAGER}, studentPaymentOrder.getOrganId());
+			if(!CollectionUtils.isEmpty(integers)){
+				for (Integer integer : integers) {
+					eduMap.put(integer,integer.toString());
+				}
+			}
+		}
+		if(!CollectionUtils.isEmpty(eduMap)){
+			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,MessageTypeEnum.PUSH_SYSTEM_ACTIVITY_COURSE,
+					eduMap,null,0,null,"SYSTEM",username,activityName);
+		}
+		Student student = studentDao.get(userId);
+		if(Objects.nonNull(student) && student.getTeacherId() != null){
+			Map<Integer, String> teacherMap = new HashMap<>(1);
+			teacherMap.put(student.getTeacherId(), student.getTeacherId().toString());
+			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,MessageTypeEnum.PUSH_TEACHER_ACTIVITY_COURSE,
+					teacherMap,null,0,null,"TEACHER",username,activityName);
+		}
+	}
 }

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

@@ -1,16 +1,17 @@
 package com.ym.mec.biz.service.impl;
 
-import com.ym.mec.common.exception.BizException;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
 import com.ym.mec.biz.dal.dao.VipGroupDefaultClassesUnitPriceDao;
 import com.ym.mec.biz.dal.entity.VipGroupDefaultClassesUnitPrice;
 import com.ym.mec.biz.service.VipGroupDefaultClassesUnitPriceService;
 import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
 import java.util.Objects;
+import java.util.Optional;
 
 @Service
 public class VipGroupDefaultClassesUnitPriceServiceImpl extends BaseServiceImpl<Integer, VipGroupDefaultClassesUnitPrice>  implements VipGroupDefaultClassesUnitPriceService {
@@ -35,4 +36,11 @@ public class VipGroupDefaultClassesUnitPriceServiceImpl extends BaseServiceImpl<
 			return super.insert(bean);
 		}
 	}
+
+	@Override
+	public BigDecimal getAmount(Integer organId, BigDecimal courseNum) {
+		VipGroupDefaultClassesUnitPrice vipGroupDefaultClassesUnitPrice = Optional.ofNullable(vipGroupDefaultClassesUnitPriceDao.getByVipGroup(organId.longValue())).
+				orElseThrow(()->new BizException("课程单价设置错误"));
+		return vipGroupDefaultClassesUnitPrice.getOnlineClassesUnitPrice().multiply(courseNum);
+	}
 }

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

@@ -1831,4 +1831,11 @@
         </foreach>
         group by sr.user_id_ , u.organ_id_
     </select>
+    <select id="queryStudentEduMap" resultType="java.util.Map">
+        select mg.educational_teacher_id_ 'key',su.real_name_ 'value' from student_registration sr
+        left join music_group mg ON mg.id_ = sr.music_group_id_
+        left join sys_user su ON su.id_ = mg.educational_teacher_id_
+        where sr.music_group_status_ = 'NORMAL' AND mg.status_ = 'PROGRESS' AND sr.user_id_ = #{userId}
+        group by mg.educational_teacher_id_
+    </select>
 </mapper>

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

@@ -196,8 +196,11 @@
 			vip_group_activity vga
 			LEFT JOIN activity_apply_student_type ast ON vga.id_ = ast.activity_id_
 		WHERE vga.status_ = 'PROGRESS'
-		AND vga.del_flag_ = 0 AND vga.course_type_ = #{activityQueryDto.courseType}
+		AND vga.del_flag_ = 0
 		AND FIND_IN_SET(#{activityQueryDto.organId},vga.organ_id_)
+		<if test="activityQueryDto.courseType != null and activityQueryDto.courseType != ''">
+			AND vga.course_type_ = #{activityQueryDto.courseType}
+		</if>
 		<if test="activityQueryDto.enable != null and activityQueryDto.enable == true">
 			AND ((NOW() &lt; vga.end_time_ AND NOW() > vga.start_time_) OR vga.end_time_ IS NULL)
 		</if>

+ 60 - 39
mec-student/src/main/java/com/ym/mec/student/controller/ActivityController.java

@@ -1,18 +1,21 @@
 package com.ym.mec.student.controller;
 
 import com.alibaba.fastjson.JSONArray;
-import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.StudentDao;
 import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
 import com.ym.mec.biz.dal.dao.SysConfigDao;
-import com.ym.mec.biz.dal.dao.VipGroupActivityDao;
-import com.ym.mec.biz.dal.dto.BuyDoubleEleven2021Dto;
+import com.ym.mec.biz.dal.dto.ActivityPayParamDto;
+import com.ym.mec.biz.dal.dto.ActivityQueryDto;
 import com.ym.mec.biz.dal.dto.Cloud2022ActivityDto;
 import com.ym.mec.biz.dal.entity.ActivityDetailDto;
 import com.ym.mec.biz.dal.entity.SporadicChargeInfo;
+import com.ym.mec.biz.dal.entity.Student;
 import com.ym.mec.biz.dal.entity.VipGroupActivity;
 import com.ym.mec.biz.service.MarketActivityService;
 import com.ym.mec.biz.service.SporadicChargeInfoService;
+import com.ym.mec.biz.service.SysUserService;
+import com.ym.mec.biz.service.VipGroupActivityService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.yonge.log.model.AuditLogAnnotation;
@@ -20,9 +23,10 @@ import io.swagger.annotations.Api;
 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.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
+import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -31,7 +35,7 @@ import java.util.stream.Collectors;
 @RestController
 public class ActivityController extends BaseController {
     @Autowired
-    private SysUserFeignService sysUserFeignService;
+    private SysUserService sysUserService;
     @Autowired
     private SysConfigDao sysConfigDao;
     @Autowired
@@ -41,19 +45,15 @@ public class ActivityController extends BaseController {
     @Autowired
     private StudentPaymentOrderDao studentPaymentOrderDao;
     @Autowired
-    private VipGroupActivityDao vipGroupActivityDao;
+    private VipGroupActivityService vipGroupActivityService;
+    @Autowired
+    private StudentDao studentDao;
 
     @ApiOperation(value = "分部双11活动信息")
     @GetMapping("/doubleEleven2020")
     public HttpResponseResult<List<SporadicChargeInfo>> doubleEleven2020(){
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null || sysUser.getId() == null) {
-            return failed("请先登录");
-        }
-        if (sysUser.getOrganId() == null) {
-            return failed("用户信息有误,没有分部信息");
-        }
-        Integer organId = sysUser.getOrganId();
+        SysUser user = sysUserService.getUser();
+        Integer organId = user.getOrganId();
 
         List<SporadicChargeInfo> activeInfos = sporadicChargeInfoService.getOrganActiveInfo(organId, 12);
         activeInfos.sort(Comparator.comparing(SporadicChargeInfo::getAmount).reversed());
@@ -66,13 +66,7 @@ public class ActivityController extends BaseController {
     @ApiOperation(value = "分部双11活动信息")
     @RequestMapping("/doubleEleven2021")
     public HttpResponseResult doubleEleven2021(){
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null || sysUser.getId() == null) {
-            return failed("请先登录");
-        }
-        if (sysUser.getOrganId() == null) {
-            return failed("用户信息有误,没有分部信息");
-        }
+        SysUser sysUser = sysUserService.getUser();
         Map<String,Object> resultMap = new HashMap<>(1);
         List<ActivityDetailDto> activityDetailDtos = marketActivityService.queryActivity(2, sysUser.getOrganId());
         resultMap.put("activityDetailList",activityDetailDtos);
@@ -83,22 +77,17 @@ public class ActivityController extends BaseController {
             resultMap.put("startTime",activityDetailDto.getStartTime());
             resultMap.put("endTime",activityDetailDto.getEndTime());
         }
-//        resultMap.put("horseRaceLampList",luckDrawPrizeService.queryHorseRaceLampDto(2));
-//        LuckDrawCount luckDrawCount = luckDrawCountService.findByIdAndGroupId(sysUser.getId(),2);
-//        if(luckDrawCount != null){
-//            resultMap.put("drawNum",luckDrawCount.getAvailableCount());
-//        }else {
-//            resultMap.put("drawNum",0);
-//        }
         return succeed(resultMap);
     }
 
-    @ApiOperation("2021双十一活动购买")
-    @PostMapping(value = "/buyDoubleEleven2021")
-    @AuditLogAnnotation(operateName = "2021双十一活动购买")
-    public HttpResponseResult buyDoubleEleven2021(@RequestBody BuyDoubleEleven2021Dto buyDoubleEleven2021Dto) throws Exception {
-//        return practiceGroupService.buyDoubleEleven2021(buyDoubleEleven2021Dto);
-        return failed("购买入口已关闭,请联系管理员");
+    @ApiOperation("活动购买")
+    @PostMapping(value = "/buy")
+    @AuditLogAnnotation(operateName = "活动购买")
+    public HttpResponseResult buy(@RequestBody ActivityPayParamDto activityPayParamDto) throws Exception {
+        SysUser user = sysUserService.getUser();
+        activityPayParamDto.setUserId(user.getId());
+        activityPayParamDto.setOrganId(user.getOrganId());
+        return vipGroupActivityService.buy(activityPayParamDto);
     }
 
     @ApiOperation("获取2022云教练活动列表")
@@ -108,16 +97,13 @@ public class ActivityController extends BaseController {
         String configValue = sysConfigDao.findConfigValue("2022_cloud_activity_config");
         List<Cloud2022ActivityDto> cloud2022ActivityDtos = JSONArray.parseArray(configValue, Cloud2022ActivityDto.class);
         String collect = cloud2022ActivityDtos.stream().map(e -> e.getActivityId()).collect(Collectors.joining(","));
-        return succeed(vipGroupActivityDao.queryByIds(collect));
+        return succeed(vipGroupActivityService.getDao().queryByIds(collect));
     }
 
     @ApiOperation(value = "学员已购买的双十一活动信息")
     @GetMapping("/queryStudentDoubleEleven2021Order")
     public Object queryStudentDoubleEleven2021Order() {
-        SysUser user = sysUserFeignService.queryUserInfo();
-        if (user == null) {
-            return failed(HttpStatus.FORBIDDEN, "请登录");
-        }
+        SysUser user = sysUserService.getUser();
         List<ActivityDetailDto> activityDetailDtos = marketActivityService.queryActivity(2, user.getOrganId());
         String activitys = studentPaymentOrderDao.queryStudentDoubleEleven2021Order(user.getId());
         List<Integer> activityList = new ArrayList<>();
@@ -147,4 +133,39 @@ public class ActivityController extends BaseController {
         }
         return succeed("");
     }
+
+    @ApiOperation(value = "获取活动方案")
+    @GetMapping("/get")
+    public HttpResponseResult<VipGroupActivity> get(Integer id){
+        VipGroupActivity vipGroupActivity = vipGroupActivityService.get(id);
+        SysUser user = sysUserService.getUser();
+        vipGroupActivity.setSinglePrice(vipGroupActivityService.getActivityPrice(vipGroupActivity,user.getOrganId(),new BigDecimal(1)));
+        return succeed(vipGroupActivity);
+    }
+
+    @ApiOperation(value = "根据课程类型获取对应课程活动方案")
+    @GetMapping("/findByVipGroupCategory")
+    public HttpResponseResult<List<VipGroupActivity>> findByVipGroupCategory(){
+        SysUser user = sysUserService.getUser();
+        ActivityQueryDto activityQueryDto = new ActivityQueryDto();
+        activityQueryDto.setStudentIds(user.getId().toString());
+        activityQueryDto.setCourseType(null);
+        activityQueryDto.setActivityChannel(3);
+        Student student = studentDao.get(user.getId());
+        Boolean isNewUser = student.getIsNewUser();
+        if(isNewUser){
+            activityQueryDto.setNewStudentNum(0);
+        }else {
+            activityQueryDto.setNewStudentNum(1);
+        }
+        if(student.getMemberRankSettingId() == null){
+            activityQueryDto.setMemberNum(1);
+        }else {
+            activityQueryDto.setMemberNum(0);
+        }
+        activityQueryDto.setOrganId(user.getOrganId().toString());
+        activityQueryDto.setEnable(true);
+        List<VipGroupActivity> vipGroupActivities = vipGroupActivityService.findByVipGroupCategory(activityQueryDto);
+        return succeed(vipGroupActivities);
+    }
 }

+ 3 - 6
mec-web/src/main/java/com/ym/mec/web/controller/VipGroupActivityController.java

@@ -12,6 +12,7 @@ import com.ym.mec.biz.dal.entity.VipGroupActivity;
 import com.ym.mec.biz.dal.page.DoubleEleven2021QueryInfo;
 import com.ym.mec.biz.dal.page.VipGroupActivityQueryInfo;
 import com.ym.mec.biz.service.OrganizationService;
+import com.ym.mec.biz.service.SysUserService;
 import com.ym.mec.biz.service.VipGroupActivityService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
@@ -44,7 +45,7 @@ public class VipGroupActivityController extends BaseController {
     @Autowired
     private VipGroupActivityService vipGroupActivityService;
     @Autowired
-    private SysUserFeignService sysUserFeignService;
+    private SysUserService sysUserService;
 	@Autowired
 	private OrganizationService organizationService;
 	@Autowired
@@ -108,11 +109,7 @@ public class VipGroupActivityController extends BaseController {
     @PostMapping("/update")
     @PreAuthorize("@pcs.hasPermissions('vipGroupActivity/update')")
     public Object update(@RequestBody VipGroupActivityAddDto vipGroupActivityAddDto){
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if(sysUser == null){
-            return failed("用户信息获取失败");
-        }
-        return succeed(vipGroupActivityService.updateVipGroupActivity(vipGroupActivityAddDto, sysUser.getId()));
+        return succeed(vipGroupActivityService.updateVipGroupActivity(vipGroupActivityAddDto,sysUserService.getUserId()));
     }
 
     @ApiOperation(value = "删除活动方案")