Browse Source

Merge branch 'master' of http://git.dayaedu.com/yonge/mec

yonge 4 years ago
parent
commit
74ba429c0a
43 changed files with 2311 additions and 45 deletions
  1. 3 3
      codegen/src/main/resources/generateConfigration.xml
  2. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ChargeTypeDao.java
  3. 16 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CloudTeacherOrderDao.java
  4. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/IndexBaseMonthDataDao.java
  5. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  6. 27 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysCouponCodeDao.java
  7. 13 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysCouponDao.java
  8. 105 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CloudTeacherActiveTargetDetailDto.java
  9. 105 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CloudTeacherActiveTargetDto.java
  10. 178 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SysCouponCodeDto.java
  11. 14 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CloudTeacherOrder.java
  12. 237 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysCoupon.java
  13. 136 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysCouponCode.java
  14. 34 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/CouponTypeEnum.java
  15. 34 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/EffectiveTypeEnum.java
  16. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java
  17. 56 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/CloudTeacherActiveQueryInfo.java
  18. 60 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/SysCouponCodeQueryInfo.java
  19. 34 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/SysCouponQueryInfo.java
  20. 23 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java
  21. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java
  22. 31 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysCouponCodeService.java
  23. 23 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysCouponService.java
  24. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupTrainPlanServiceImpl.java
  25. 135 32
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java
  26. 116 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysCouponCodeServiceImpl.java
  27. 83 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysCouponServiceImpl.java
  28. 11 0
      mec-biz/src/main/resources/config/mybatis/ChargeTypeMapper.xml
  29. 66 5
      mec-biz/src/main/resources/config/mybatis/CloudTeacherOrderMapper.xml
  30. 22 0
      mec-biz/src/main/resources/config/mybatis/IndexBaseMonthDataMapper.xml
  31. 24 0
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  32. 172 0
      mec-biz/src/main/resources/config/mybatis/SysCouponCodeMapper.xml
  33. 153 0
      mec-biz/src/main/resources/config/mybatis/SysCouponMapper.xml
  34. 6 0
      mec-client-api/src/main/java/com/ym/mec/task/TaskRemoteService.java
  35. 5 0
      mec-client-api/src/main/java/com/ym/mec/task/fallback/TaskRemoteServiceFallback.java
  36. 38 0
      mec-student/src/main/java/com/ym/mec/student/controller/SysCouponCodeController.java
  37. 19 0
      mec-task/src/main/java/com/ym/mec/task/jobs/RemarkCountFlagTask.java
  38. 92 0
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
  39. 33 0
      mec-web/src/main/java/com/ym/mec/web/controller/StudentManageController.java
  40. 43 0
      mec-web/src/main/java/com/ym/mec/web/controller/SysCouponCodeController.java
  41. 105 0
      mec-web/src/main/java/com/ym/mec/web/controller/SysCouponController.java
  42. 6 0
      mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java
  43. 24 5
      mec-web/src/main/java/com/ym/mec/web/controller/education/ActivityController.java

+ 3 - 3
codegen/src/main/resources/generateConfigration.xml

@@ -2,11 +2,11 @@
 <GenerateConfiguration>
 <GenerateConfiguration>
 	<dbConfiguration>
 	<dbConfiguration>
 		<driverClass>com.mysql.jdbc.Driver</driverClass>
 		<driverClass>com.mysql.jdbc.Driver</driverClass>
-		<url>jdbc:mysql://47.114.1.200:3306/mec_dev</url>
+		<url>jdbc:mysql://47.114.1.200:3306/mec_test</url>
 		<username>mec_dev</username>
 		<username>mec_dev</username>
 		<password>dayaDataOnline@2019</password>
 		<password>dayaDataOnline@2019</password>
-		<catalog>mec_dev</catalog>
-		<schema>mec_dev</schema>
+		<catalog>mec_test</catalog>
+		<schema>mec_test</schema>
 	</dbConfiguration>
 	</dbConfiguration>
 	<srcBase>e:/javabean</srcBase>
 	<srcBase>e:/javabean</srcBase>
 	<pojoPackageName>com.ym.mec.biz.dal.entity</pojoPackageName>
 	<pojoPackageName>com.ym.mec.biz.dal.entity</pojoPackageName>

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

@@ -16,4 +16,6 @@ public interface ChargeTypeDao extends BaseDAO<Integer, ChargeType> {
      * @return
      * @return
      */
      */
     List<Map<Integer, String>> queryNameByIds(@Param("chargeTypeIds") String chargeTypeIds);
     List<Map<Integer, String>> queryNameByIds(@Param("chargeTypeIds") String chargeTypeIds);
+
+    List<Map<Integer, String>> queryNormalChargeName(List<Integer> studentIds);
 }
 }

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

@@ -4,6 +4,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map;
 import java.util.Set;
 import java.util.Set;
 
 
+import com.ym.mec.biz.dal.dto.CloudTeacherActiveTargetDetailDto;
+import com.ym.mec.biz.dal.page.CloudTeacherActiveQueryInfo;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Param;
 
 
 import com.ym.mec.biz.dal.dto.CloudTeacherOrderDto;
 import com.ym.mec.biz.dal.dto.CloudTeacherOrderDto;
@@ -50,4 +52,18 @@ public interface CloudTeacherOrderDao extends BaseDAO<Long, CloudTeacherOrder> {
     CloudTeacherOrderDto queryOrderInfoByOrderId(Long orderId);
     CloudTeacherOrderDto queryOrderInfoByOrderId(Long orderId);
 
 
     List<Map<Long, String>> queryNoStartByUserIds(@Param("userIds") Set<Integer> userIds, @Param("isMusicMember") Boolean isMusicMember);
     List<Map<Long, String>> queryNoStartByUserIds(@Param("userIds") Set<Integer> userIds, @Param("isMusicMember") Boolean isMusicMember);
+
+    /**
+     * 获取购买了云教练活动的学员列表
+     * @param param
+     * @return
+     */
+    int countCloudTeacherActiveDetail(Map<String, Object> param);
+
+    /**
+     * 获取购买了云教练活动的学员列表
+     * @param param
+     * @return
+     */
+    List<CloudTeacherActiveTargetDetailDto> queryCloudTeacherActiveDetail(Map<String, Object> param);
 }
 }

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/IndexBaseMonthDataDao.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.dal.dao;
 package com.ym.mec.biz.dal.dao;
 
 
+import com.ym.mec.biz.dal.dto.CloudTeacherActiveTargetDto;
 import com.ym.mec.biz.dal.dto.OrganVipGroupCategoryCourseNumDto;
 import com.ym.mec.biz.dal.dto.OrganVipGroupCategoryCourseNumDto;
 import com.ym.mec.biz.dal.dto.StudentErrorLeaveDto;
 import com.ym.mec.biz.dal.dto.StudentErrorLeaveDto;
 import com.ym.mec.biz.dal.dto.StudentLeaveCourseDto;
 import com.ym.mec.biz.dal.dto.StudentLeaveCourseDto;
@@ -339,4 +340,11 @@ public interface IndexBaseMonthDataDao extends BaseDAO<Long, IndexBaseMonthData>
     List<IndexBaseMonthData> getCloudStudyLivelyStudentNumData(@Param("dayStr") String dayStr);
     List<IndexBaseMonthData> getCloudStudyLivelyStudentNumData(@Param("dayStr") String dayStr);
 
 
     List<IndexBaseMonthData> getCloudStudyNewStudentNumData(@Param("dayStr") String dayStr);
     List<IndexBaseMonthData> getCloudStudyNewStudentNumData(@Param("dayStr") String dayStr);
+
+    /**
+     * 云教练活动分部统计
+     * @param params
+     * @return
+     */
+    List<CloudTeacherActiveTargetDto> countCloudTeacherActive(Map<String, Object> params);
 }
 }

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java

@@ -393,4 +393,14 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
      * @return
      * @return
      */
      */
     List<Integer> getStudentByHasCourse(Integer teacherId);
     List<Integer> getStudentByHasCourse(Integer teacherId);
+
+    /**
+     * 清空学员统计标记
+     */
+    void cleanCountFlag();
+
+    /**
+     * 标记进行中乐团在读学员+VIP、网管有课的学员
+     */
+    void remarkCountFlag();
 }
 }

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

@@ -0,0 +1,27 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.biz.dal.dto.SysCouponCodeDto;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.biz.dal.entity.SysCouponCode;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface SysCouponCodeDao extends BaseDAO<Long, SysCouponCode> {
+
+    /**
+     * @describe 统计指定用户指定优惠券的数量
+     * @author Joburgess
+     * @date 2021/9/8 0008
+     * @param userId:
+     * @param couponId:
+     * @return int
+     */
+    int countWithUserAndCoupon(@Param("userId") Integer userId,
+                               @Param("couponId") Integer couponId);
+
+    List<SysCouponCodeDto> querySysCouponUseList(Map<String, Object> params);
+    int countSysCouponUseList(Map<String, Object> params);
+
+}

+ 13 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysCouponDao.java

@@ -0,0 +1,13 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.biz.dal.entity.SysCoupon;
+import org.apache.ibatis.annotations.Param;
+
+public interface SysCouponDao extends BaseDAO<Integer, SysCoupon> {
+
+    SysCoupon getWithName(@Param("name") String name);
+
+    SysCoupon lockCoupon(@Param("id") Integer id);
+	
+}

+ 105 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CloudTeacherActiveTargetDetailDto.java

@@ -0,0 +1,105 @@
+package com.ym.mec.biz.dal.dto;
+
+import java.math.BigDecimal;
+
+public class CloudTeacherActiveTargetDetailDto {
+	private Integer userId;
+
+	private String username;
+
+	private String cooperationName;
+
+	private String musicGroupName;
+
+	private String chargeType;
+
+	private String subjectName;
+
+	private String currentGradeNum;
+
+	private String teacherName;
+
+	private String remark;
+
+	private BigDecimal amount = BigDecimal.ZERO;
+
+	public Integer getUserId() {
+		return userId;
+	}
+
+	public void setUserId(Integer userId) {
+		this.userId = userId;
+	}
+
+	public String getUsername() {
+		return username;
+	}
+
+	public void setUsername(String username) {
+		this.username = username;
+	}
+
+	public String getCooperationName() {
+		return cooperationName;
+	}
+
+	public void setCooperationName(String cooperationName) {
+		this.cooperationName = cooperationName;
+	}
+
+	public String getMusicGroupName() {
+		return musicGroupName;
+	}
+
+	public void setMusicGroupName(String musicGroupName) {
+		this.musicGroupName = musicGroupName;
+	}
+
+	public String getChargeType() {
+		return chargeType;
+	}
+
+	public void setChargeType(String chargeType) {
+		this.chargeType = chargeType;
+	}
+
+	public String getSubjectName() {
+		return subjectName;
+	}
+
+	public void setSubjectName(String subjectName) {
+		this.subjectName = subjectName;
+	}
+
+	public String getCurrentGradeNum() {
+		return currentGradeNum;
+	}
+
+	public void setCurrentGradeNum(String currentGradeNum) {
+		this.currentGradeNum = currentGradeNum;
+	}
+
+	public String getTeacherName() {
+		return teacherName;
+	}
+
+	public void setTeacherName(String teacherName) {
+		this.teacherName = teacherName;
+	}
+
+	public String getRemark() {
+		return remark;
+	}
+
+	public void setRemark(String remark) {
+		this.remark = remark;
+	}
+
+	public BigDecimal getAmount() {
+		return amount;
+	}
+
+	public void setAmount(BigDecimal amount) {
+		this.amount = amount;
+	}
+}

+ 105 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CloudTeacherActiveTargetDto.java

@@ -0,0 +1,105 @@
+package com.ym.mec.biz.dal.dto;
+
+import java.math.BigDecimal;
+
+public class CloudTeacherActiveTargetDto{
+	private Integer organId;
+
+	private String organName;
+
+	private Integer targetNum = 0;
+
+	private BigDecimal targetAmount = BigDecimal.ZERO;
+
+	private Integer buyNum = 0;
+
+	private Integer totalNum = 0;
+
+	private BigDecimal buyAmount = BigDecimal.ZERO;
+
+	private BigDecimal avgBuyAmount = BigDecimal.ZERO;
+
+	private BigDecimal buyScale = BigDecimal.ZERO;
+
+	private BigDecimal targetFinishScale = BigDecimal.ZERO;
+
+	public String getOrganName() {
+		return organName;
+	}
+
+	public void setOrganName(String organName) {
+		this.organName = organName;
+	}
+
+	public Integer getBuyNum() {
+		return buyNum;
+	}
+
+	public void setBuyNum(Integer buyNum) {
+		this.buyNum = buyNum;
+	}
+
+	public Integer getTotalNum() {
+		return totalNum;
+	}
+
+	public void setTotalNum(Integer totalNum) {
+		this.totalNum = totalNum;
+	}
+
+	public BigDecimal getBuyAmount() {
+		return buyAmount;
+	}
+
+	public void setBuyAmount(BigDecimal buyAmount) {
+		this.buyAmount = buyAmount;
+	}
+
+	public BigDecimal getAvgBuyAmount() {
+		return avgBuyAmount;
+	}
+
+	public void setAvgBuyAmount(BigDecimal avgBuyAmount) {
+		this.avgBuyAmount = avgBuyAmount;
+	}
+
+	public BigDecimal getBuyScale() {
+		return buyScale;
+	}
+
+	public void setBuyScale(BigDecimal buyScale) {
+		this.buyScale = buyScale;
+	}
+
+	public BigDecimal getTargetFinishScale() {
+		return targetFinishScale;
+	}
+
+	public void setTargetFinishScale(BigDecimal targetFinishScale) {
+		this.targetFinishScale = targetFinishScale;
+	}
+
+	public Integer getOrganId() {
+		return organId;
+	}
+
+	public void setOrganId(Integer organId) {
+		this.organId = organId;
+	}
+
+	public Integer getTargetNum() {
+		return targetNum;
+	}
+
+	public void setTargetNum(Integer targetNum) {
+		this.targetNum = targetNum;
+	}
+
+	public BigDecimal getTargetAmount() {
+		return targetAmount;
+	}
+
+	public void setTargetAmount(BigDecimal targetAmount) {
+		this.targetAmount = targetAmount;
+	}
+}

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

@@ -0,0 +1,178 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.enums.CouponTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/9/8 0008
+ */
+public class SysCouponCodeDto {
+
+    @ApiModelProperty("分部编号")
+    private Integer organId;
+
+    @ApiModelProperty("分部名称")
+    private String organName;
+
+    @ApiModelProperty("用户编号")
+    private Integer userId;
+
+    @ApiModelProperty("用户名称")
+    private String userName;
+
+    @ApiModelProperty("手机号")
+    private String phone;
+
+    @ApiModelProperty("优惠券编号")
+    private Integer couponId;
+
+    @ApiModelProperty("优惠券类型")
+    private CouponTypeEnum couponType;
+
+    @ApiModelProperty("优惠券名称")
+    private String couponName;
+
+    @ApiModelProperty("描述")
+    private String couponDescription;
+
+    @ApiModelProperty("优惠码")
+    private String code;
+
+    @ApiModelProperty("订单编号")
+    private Long paymentOrderId;
+
+    @ApiModelProperty("使用状态:0未使用,1已使用")
+    private Integer usageStatus;
+
+    @ApiModelProperty("实际使用时间")
+    private java.util.Date usedTime;
+
+    @ApiModelProperty("使用开始日期")
+    private java.util.Date useStartDate;
+
+    @ApiModelProperty("使用截止日期")
+    private java.util.Date useDeadlineDate;
+
+    public Integer getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(Integer organId) {
+        this.organId = organId;
+    }
+
+    public String getOrganName() {
+        return organName;
+    }
+
+    public void setOrganName(String organName) {
+        this.organName = organName;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public Integer getCouponId() {
+        return couponId;
+    }
+
+    public void setCouponId(Integer couponId) {
+        this.couponId = couponId;
+    }
+
+    public CouponTypeEnum getCouponType() {
+        return couponType;
+    }
+
+    public void setCouponType(CouponTypeEnum couponType) {
+        this.couponType = couponType;
+    }
+
+    public String getCouponName() {
+        return couponName;
+    }
+
+    public void setCouponName(String couponName) {
+        this.couponName = couponName;
+    }
+
+    public String getCouponDescription() {
+        return couponDescription;
+    }
+
+    public void setCouponDescription(String couponDescription) {
+        this.couponDescription = couponDescription;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public Long getPaymentOrderId() {
+        return paymentOrderId;
+    }
+
+    public void setPaymentOrderId(Long paymentOrderId) {
+        this.paymentOrderId = paymentOrderId;
+    }
+
+    public Integer getUsageStatus() {
+        return usageStatus;
+    }
+
+    public void setUsageStatus(Integer usageStatus) {
+        this.usageStatus = usageStatus;
+    }
+
+    public Date getUsedTime() {
+        return usedTime;
+    }
+
+    public void setUsedTime(Date usedTime) {
+        this.usedTime = usedTime;
+    }
+
+    public Date getUseStartDate() {
+        return useStartDate;
+    }
+
+    public void setUseStartDate(Date useStartDate) {
+        this.useStartDate = useStartDate;
+    }
+
+    public Date getUseDeadlineDate() {
+        return useDeadlineDate;
+    }
+
+    public void setUseDeadlineDate(Date useDeadlineDate) {
+        this.useDeadlineDate = useDeadlineDate;
+    }
+}

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

@@ -84,6 +84,12 @@ public class CloudTeacherOrder {
     private String remark = "";
     private String remark = "";
 
 
     /**
     /**
+     * 活动备注
+     */
+    @ApiModelProperty(value = "活动备注")
+    private Integer activeRemark;
+
+    /**
      * 备注
      * 备注
      */
      */
     @ApiModelProperty(value = "版本")
     @ApiModelProperty(value = "版本")
@@ -105,6 +111,14 @@ public class CloudTeacherOrder {
     
     
     private StudentPaymentOrder studentPaymentOrder = new StudentPaymentOrder();
     private StudentPaymentOrder studentPaymentOrder = new StudentPaymentOrder();
 
 
+    public Integer getActiveRemark() {
+        return activeRemark;
+    }
+
+    public void setActiveRemark(Integer activeRemark) {
+        this.activeRemark = activeRemark;
+    }
+
     public Long getId() {
     public Long getId() {
         return id;
         return id;
     }
     }

+ 237 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysCoupon.java

@@ -0,0 +1,237 @@
+package com.ym.mec.biz.dal.entity;
+
+import com.ym.mec.biz.dal.enums.CouponTypeEnum;
+import com.ym.mec.biz.dal.enums.EffectiveTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 对应数据库表(sys_coupon):
+ */
+public class SysCoupon {
+
+	private Integer id;
+
+	@ApiModelProperty("优惠券名称")
+	private String name;
+
+	@ApiModelProperty("描述")
+	private String description;
+
+	@ApiModelProperty("状态:0停用,1启用")
+	private Integer status;
+
+	@ApiModelProperty("券类型:FULL_REDUCTION(满减券),DISCOUNT(折扣券)")
+	private CouponTypeEnum type;
+
+	@ApiModelProperty("面值")
+	private java.math.BigDecimal faceValue;
+
+	@ApiModelProperty("满多少")
+	private java.math.BigDecimal fullAmount;
+
+	@ApiModelProperty("限制兑换的最大次数")
+	private Integer limitExchangeNum;
+
+	@ApiModelProperty("期限(单位:天)")
+	private Integer deadline;
+
+	@ApiModelProperty("有效期类型")
+	private EffectiveTypeEnum effectiveType;
+
+	@ApiModelProperty("有效起始时间")
+	private java.util.Date effectiveStartTime;
+
+	@ApiModelProperty("有效截止时间")
+	private java.util.Date effectiveExpireTime;
+
+	@ApiModelProperty("领取结束时间")
+	private java.util.Date endDate;
+
+	@ApiModelProperty("领取开始时间")
+	private java.util.Date startDate;
+
+	@ApiModelProperty("库存量")
+	private Integer stockCount;
+
+	@ApiModelProperty("消耗数量")
+	private Integer consumeNum;
+
+	@ApiModelProperty("预警值")
+	private Integer warningStockNum;
+
+	private Integer warningStatus;
+
+	private java.util.Date createTime;
+
+	private java.util.Date updateTime;
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getDescription() {
+		return description;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+	public Integer getStatus() {
+		return status;
+	}
+
+	public void setStatus(Integer status) {
+		this.status = status;
+	}
+
+	public CouponTypeEnum getType() {
+		return type;
+	}
+
+	public void setType(CouponTypeEnum type) {
+		this.type = type;
+	}
+
+	public BigDecimal getFaceValue() {
+		return faceValue;
+	}
+
+	public void setFaceValue(BigDecimal faceValue) {
+		this.faceValue = faceValue;
+	}
+
+	public BigDecimal getFullAmount() {
+		return fullAmount;
+	}
+
+	public void setFullAmount(BigDecimal fullAmount) {
+		this.fullAmount = fullAmount;
+	}
+
+	public Integer getLimitExchangeNum() {
+		return limitExchangeNum;
+	}
+
+	public void setLimitExchangeNum(Integer limitExchangeNum) {
+		this.limitExchangeNum = limitExchangeNum;
+	}
+
+	public EffectiveTypeEnum getEffectiveType() {
+		return effectiveType;
+	}
+
+	public void setEffectiveType(EffectiveTypeEnum effectiveType) {
+		this.effectiveType = effectiveType;
+	}
+
+	public Integer getDeadline() {
+		return deadline;
+	}
+
+	public void setDeadline(Integer deadline) {
+		this.deadline = deadline;
+	}
+
+	public Date getEffectiveStartTime() {
+		return effectiveStartTime;
+	}
+
+	public void setEffectiveStartTime(Date effectiveStartTime) {
+		this.effectiveStartTime = effectiveStartTime;
+	}
+
+	public Date getEffectiveExpireTime() {
+		return effectiveExpireTime;
+	}
+
+	public void setEffectiveExpireTime(Date effectiveExpireTime) {
+		this.effectiveExpireTime = effectiveExpireTime;
+	}
+
+	public Date getEndDate() {
+		return endDate;
+	}
+
+	public void setEndDate(Date endDate) {
+		this.endDate = endDate;
+	}
+
+	public Date getStartDate() {
+		return startDate;
+	}
+
+	public void setStartDate(Date startDate) {
+		this.startDate = startDate;
+	}
+
+	public Integer getStockCount() {
+		return stockCount;
+	}
+
+	public void setStockCount(Integer stockCount) {
+		this.stockCount = stockCount;
+	}
+
+	public Integer getConsumeNum() {
+		return consumeNum;
+	}
+
+	public void setConsumeNum(Integer consumeNum) {
+		this.consumeNum = consumeNum;
+	}
+
+	public Integer getWarningStockNum() {
+		return warningStockNum;
+	}
+
+	public void setWarningStockNum(Integer warningStockNum) {
+		this.warningStockNum = warningStockNum;
+	}
+
+	public Integer getWarningStatus() {
+		return warningStatus;
+	}
+
+	public void setWarningStatus(Integer warningStatus) {
+		this.warningStatus = warningStatus;
+	}
+
+	public Date getCreateTime() {
+		return createTime;
+	}
+
+	public void setCreateTime(Date createTime) {
+		this.createTime = createTime;
+	}
+
+	public Date getUpdateTime() {
+		return updateTime;
+	}
+
+	public void setUpdateTime(Date updateTime) {
+		this.updateTime = updateTime;
+	}
+
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 136 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysCouponCode.java

@@ -0,0 +1,136 @@
+package com.ym.mec.biz.dal.entity;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+/**
+ * 对应数据库表(sys_coupon_code):
+ */
+public class SysCouponCode {
+
+	/**  */
+	private Long id;
+	
+	/**  */
+	private Integer couponId;
+	
+	/** 优惠码 */
+	private String code;
+	
+	/** 使用状态:0未使用,1已使用 */
+	private Integer usageStatus;
+	
+	/** 用户编号 */
+	private Integer userId;
+	
+	/** 实际使用时间 */
+	private java.util.Date usedTime;
+	
+	/** 使用开始日期 */
+	private java.util.Date useStartDate;
+	
+	/** 使用截止日期 */
+	private java.util.Date useDeadlineDate;
+	
+	/** 关联的订单号 */
+	private Long paymentOrderId;
+	
+	/**  */
+	private java.util.Date createTime;
+	
+	/**  */
+	private java.util.Date updateTime;
+	
+	public void setId(Long id){
+		this.id = id;
+	}
+	
+	public Long getId(){
+		return this.id;
+	}
+			
+	public void setCouponId(Integer couponId){
+		this.couponId = couponId;
+	}
+	
+	public Integer getCouponId(){
+		return this.couponId;
+	}
+			
+	public void setCode(String code){
+		this.code = code;
+	}
+	
+	public String getCode(){
+		return this.code;
+	}
+			
+	public void setUsageStatus(Integer usageStatus){
+		this.usageStatus = usageStatus;
+	}
+	
+	public Integer getUsageStatus(){
+		return this.usageStatus;
+	}
+			
+	public void setUserId(Integer userId){
+		this.userId = userId;
+	}
+	
+	public Integer getUserId(){
+		return this.userId;
+	}
+			
+	public void setUsedTime(java.util.Date usedTime){
+		this.usedTime = usedTime;
+	}
+	
+	public java.util.Date getUsedTime(){
+		return this.usedTime;
+	}
+			
+	public void setUseStartDate(java.util.Date useStartDate){
+		this.useStartDate = useStartDate;
+	}
+	
+	public java.util.Date getUseStartDate(){
+		return this.useStartDate;
+	}
+			
+	public void setUseDeadlineDate(java.util.Date useDeadlineDate){
+		this.useDeadlineDate = useDeadlineDate;
+	}
+	
+	public java.util.Date getUseDeadlineDate(){
+		return this.useDeadlineDate;
+	}
+			
+	public void setPaymentOrderId(Long paymentOrderId){
+		this.paymentOrderId = paymentOrderId;
+	}
+	
+	public Long getPaymentOrderId(){
+		return this.paymentOrderId;
+	}
+			
+	public void setCreateTime(java.util.Date createTime){
+		this.createTime = createTime;
+	}
+	
+	public java.util.Date getCreateTime(){
+		return this.createTime;
+	}
+			
+	public void setUpdateTime(java.util.Date updateTime){
+		this.updateTime = updateTime;
+	}
+	
+	public java.util.Date getUpdateTime(){
+		return this.updateTime;
+	}
+			
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 34 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/CouponTypeEnum.java

@@ -0,0 +1,34 @@
+package com.ym.mec.biz.dal.enums;
+
+import com.ym.mec.common.enums.BaseEnum;
+
+public enum CouponTypeEnum implements BaseEnum<String, CouponTypeEnum> {
+
+    FULL_REDUCTION("FULL_REDUCTION","满减券"),
+    DISCOUNT("DISCOUNT","折扣券");
+
+    private String code;
+
+    private String msg;
+
+    CouponTypeEnum(String code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }}

+ 34 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/EffectiveTypeEnum.java

@@ -0,0 +1,34 @@
+package com.ym.mec.biz.dal.enums;
+
+import com.ym.mec.common.enums.BaseEnum;
+
+public enum EffectiveTypeEnum implements BaseEnum<String, EffectiveTypeEnum> {
+
+    DAYS("DAYS","天数"),
+    TIME_BUCKET("TIME_BUCKET","时间段");
+
+    private String code;
+
+    private String msg;
+
+    EffectiveTypeEnum(String code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }}

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

@@ -192,6 +192,8 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     TRAIN_NO_RANK_STUDENT_PUSH("TRAIN_NO_RANK_STUDENT_PUSH", "云教练训练提醒"),
     TRAIN_NO_RANK_STUDENT_PUSH("TRAIN_NO_RANK_STUDENT_PUSH", "云教练训练提醒"),
     TRAIN_RANK_STUDENT_PUSH("TRAIN_RANK_STUDENT_PUSH", "云教练训练提醒"),
     TRAIN_RANK_STUDENT_PUSH("TRAIN_RANK_STUDENT_PUSH", "云教练训练提醒"),
     NO_TRAIN_STUDENT_PUSH("NO_TRAIN_STUDENT_PUSH", "云教练训练提醒"),
     NO_TRAIN_STUDENT_PUSH("NO_TRAIN_STUDENT_PUSH", "云教练训练提醒"),
+
+    COUPON_STOCK_WARNING("COUPON_STOCK_WARNING", "优惠券库存预警"),
     ;
     ;
 
 
     MessageTypeEnum(String code, String msg) {
     MessageTypeEnum(String code, String msg) {

+ 56 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/CloudTeacherActiveQueryInfo.java

@@ -0,0 +1,56 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+
+public class CloudTeacherActiveQueryInfo extends QueryInfo {
+
+    private String organIds;
+
+    private Integer chargeType;
+
+    private Integer subjectId;
+
+    private Integer teacherId;
+
+    private String remarkType;
+
+    public String getOrganIds() {
+        return organIds;
+    }
+
+    public void setOrganIds(String organIds) {
+        this.organIds = organIds;
+    }
+
+    public Integer getChargeType() {
+        return chargeType;
+    }
+
+    public void setChargeType(Integer chargeType) {
+        this.chargeType = chargeType;
+    }
+
+    public Integer getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Integer subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public Integer getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Integer teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public String getRemarkType() {
+        return remarkType;
+    }
+
+    public void setRemarkType(String remarkType) {
+        this.remarkType = remarkType;
+    }
+}

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

@@ -0,0 +1,60 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/9/8 0008
+ */
+public class SysCouponCodeQueryInfo extends QueryInfo {
+
+    private Integer organId;
+
+    private Integer userId;
+
+    private String couponName;
+
+    private Long paymentOrderId;
+
+    private Integer usageStatus;
+
+    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 String getCouponName() {
+        return couponName;
+    }
+
+    public void setCouponName(String couponName) {
+        this.couponName = couponName;
+    }
+
+    public Long getPaymentOrderId() {
+        return paymentOrderId;
+    }
+
+    public void setPaymentOrderId(Long paymentOrderId) {
+        this.paymentOrderId = paymentOrderId;
+    }
+
+    public Integer getUsageStatus() {
+        return usageStatus;
+    }
+
+    public void setUsageStatus(Integer usageStatus) {
+        this.usageStatus = usageStatus;
+    }
+}

+ 34 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/SysCouponQueryInfo.java

@@ -0,0 +1,34 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.biz.dal.enums.CouponTypeEnum;
+import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/9/8 0008
+ */
+public class SysCouponQueryInfo extends QueryInfo {
+
+    @ApiModelProperty("券类型:FULL_REDUCTION(满减券),DISCOUNT(折扣券)")
+    private CouponTypeEnum type;
+
+    @ApiModelProperty("状态:0停用,1启用")
+    private Integer status;
+
+    public CouponTypeEnum getType() {
+        return type;
+    }
+
+    public void setType(CouponTypeEnum type) {
+        this.type = type;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+}

+ 23 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java

@@ -3,8 +3,10 @@ package com.ym.mec.biz.service;
 import java.text.ParseException;
 import java.text.ParseException;
 import java.util.Date;
 import java.util.Date;
 import java.util.List;
 import java.util.List;
+import java.util.Map;
 
 
 import com.ym.mec.biz.dal.dto.CloudStudyStudentDataDto;
 import com.ym.mec.biz.dal.dto.CloudStudyStudentDataDto;
+import com.ym.mec.biz.dal.dto.CloudTeacherActiveTargetDetailDto;
 import com.ym.mec.biz.dal.dto.EduOrganStudentDataDto;
 import com.ym.mec.biz.dal.dto.EduOrganStudentDataDto;
 import com.ym.mec.biz.dal.dto.StatDto;
 import com.ym.mec.biz.dal.dto.StatDto;
 import com.ym.mec.biz.dal.entity.CloudTeacherOrder;
 import com.ym.mec.biz.dal.entity.CloudTeacherOrder;
@@ -12,6 +14,7 @@ import com.ym.mec.biz.dal.entity.CooperationOrgan;
 import com.ym.mec.biz.dal.entity.Student;
 import com.ym.mec.biz.dal.entity.Student;
 import com.ym.mec.biz.dal.enums.GradeTypeEnum;
 import com.ym.mec.biz.dal.enums.GradeTypeEnum;
 import com.ym.mec.biz.dal.enums.PeriodEnum;
 import com.ym.mec.biz.dal.enums.PeriodEnum;
+import com.ym.mec.biz.dal.page.CloudTeacherActiveQueryInfo;
 import com.ym.mec.biz.dal.page.OrganCloudStudyStudentDataQueryInfo;
 import com.ym.mec.biz.dal.page.OrganCloudStudyStudentDataQueryInfo;
 import com.ym.mec.biz.dal.page.StudentQueryInfo;
 import com.ym.mec.biz.dal.page.StudentQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.PageInfo;
@@ -124,4 +127,24 @@ public interface StudentService extends BaseService<Integer, Student> {
      * @return void
      * @return void
      */
      */
     void cleanStudentCloudStudySequenceDays();
     void cleanStudentCloudStudySequenceDays();
+
+    /**
+     * 标记进行中乐团在读学员+VIP、网管有课学员总数(除弦乐声部、去重)
+     */
+    void remarkCountFlag();
+
+    /**
+     * 云教练活动统计
+     * @param organIds
+     * @param queryInfo
+     * @return
+     */
+    Map<String,Object> countCloudTeacherActive(List<Integer> organIds, CloudTeacherActiveQueryInfo queryInfo);
+
+    /**
+     * 云教练活动统计详情
+     * @param queryInfo
+     * @return
+     */
+    PageInfo<CloudTeacherActiveTargetDetailDto> countCloudTeacherActiveDetail(CloudTeacherActiveQueryInfo queryInfo);
 }
 }

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java

@@ -251,6 +251,9 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
     //云教练训练次数小于4次需要回访
     //云教练训练次数小于4次需要回访
     String STUDENT_CLOUD_TEACHER_TRAIN_NUM = "student_cloud_teacher_train_num";
     String STUDENT_CLOUD_TEACHER_TRAIN_NUM = "student_cloud_teacher_train_num";
 
 
+    //云教练活动分部目标JSON
+    String CLOUD_TEACHER_ACTIVE_TARGET = "cloud_teacher_active_target";
+
     /**
     /**
      * @return com.ym.mec.biz.dal.entity.SysConfig
      * @return com.ym.mec.biz.dal.entity.SysConfig
      * @params paramName
      * @params paramName

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

@@ -0,0 +1,31 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.dto.SysCouponCodeDto;
+import com.ym.mec.biz.dal.entity.SysCouponCode;
+import com.ym.mec.biz.dal.page.SysCouponCodeQueryInfo;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.service.BaseService;
+
+public interface SysCouponCodeService extends BaseService<Long, SysCouponCode> {
+
+    /**
+     * @describe 兑换优惠券
+     * @author Joburgess
+     * @date 2021/9/8 0008
+     * @param userId: 用户编号
+     * @param couponId: 优惠券编号
+     * @param paymentOrderId: 订单编号
+     * @return boolean
+     */
+    boolean exchangeCoupon(Integer userId, Integer couponId, Long paymentOrderId);
+
+    /**
+     * @describe 优惠券领取列表
+     * @author Joburgess
+     * @date 2021/9/8 0008
+     * @param queryInfo:
+     * @return com.ym.mec.common.page.PageInfo<com.ym.mec.biz.dal.dto.SysCouponCodeDto>
+     */
+    PageInfo<SysCouponCodeDto> querySysCouponUseList(SysCouponCodeQueryInfo queryInfo);
+
+}

+ 23 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SysCouponService.java

@@ -0,0 +1,23 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.entity.SysCoupon;
+import com.ym.mec.biz.dal.page.SysCouponQueryInfo;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.service.BaseService;
+
+public interface SysCouponService extends BaseService<Integer, SysCoupon> {
+
+    PageInfo<SysCoupon> queryPage(SysCouponQueryInfo queryInfo);
+
+    void updateCoupon(SysCoupon sysCoupon);
+
+    /**
+     * @describe 优惠券低库存警告
+     * @author Joburgess
+     * @date 2021/9/8 0008
+     * @param couponId: 优惠券编号
+     * @return void
+     */
+    void stockWarning(Integer couponId, String couponName);
+
+}

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupTrainPlanServiceImpl.java

@@ -150,6 +150,10 @@ public class MusicGroupTrainPlanServiceImpl extends BaseServiceImpl<Integer, Mus
 		return musicGroupTrainPlanSaveDto;
 		return musicGroupTrainPlanSaveDto;
 	}
 	}
 
 
+	public static void main(String[] args) {
+
+	}
+
 	@Override
 	@Override
 	public MusicGroupTrainPlanSaveDto getSchoolTerm(CourseSchedule courseSchedule){
 	public MusicGroupTrainPlanSaveDto getSchoolTerm(CourseSchedule courseSchedule){
 		MusicGroupTrainPlanSaveDto musicGroupTrainPlanSaveDto = new MusicGroupTrainPlanSaveDto();
 		MusicGroupTrainPlanSaveDto musicGroupTrainPlanSaveDto = new MusicGroupTrainPlanSaveDto();

+ 135 - 32
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java

@@ -1,10 +1,12 @@
 package com.ym.mec.biz.service.impl;
 package com.ym.mec.biz.service.impl;
 
 
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.alibaba.fastjson.JSONArray;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.enums.*;
+import com.ym.mec.biz.dal.page.CloudTeacherActiveQueryInfo;
 import com.ym.mec.biz.dal.page.OrganCloudStudyStudentDataQueryInfo;
 import com.ym.mec.biz.dal.page.OrganCloudStudyStudentDataQueryInfo;
 import com.ym.mec.biz.dal.page.StudentQueryInfo;
 import com.ym.mec.biz.dal.page.StudentQueryInfo;
 import com.ym.mec.biz.service.StudentService;
 import com.ym.mec.biz.service.StudentService;
@@ -14,7 +16,6 @@ import com.ym.mec.common.constant.CommonConstants;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.PageInfo;
-import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.collection.MapUtil;
@@ -26,7 +27,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.CollectionUtils;
-import sun.nio.cs.ext.Big5;
 
 
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDate;
@@ -43,36 +43,28 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
     private StudentDao studentDao;
     private StudentDao studentDao;
     @Autowired
     @Autowired
     private TeacherDao teacherDao;
     private TeacherDao teacherDao;
-
     @Autowired
     @Autowired
     private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
     private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
-
     @Autowired
     @Autowired
     private StudentRegistrationDao studentRegistrationDao;
     private StudentRegistrationDao studentRegistrationDao;
-
     @Autowired
     @Autowired
     private MusicGroupDao musicGroupDao;
     private MusicGroupDao musicGroupDao;
-
     @Autowired
     @Autowired
     private PracticeGroupDao practiceGroupDao;
     private PracticeGroupDao practiceGroupDao;
-
     @Autowired
     @Autowired
     private MemberRankSettingDao memberRankSettingDao;
     private MemberRankSettingDao memberRankSettingDao;
-
     @Autowired
     @Autowired
     private SysConfigDao sysConfigDao;
     private SysConfigDao sysConfigDao;
     @Autowired
     @Autowired
     private SysMessageService sysMessageService;
     private SysMessageService sysMessageService;
-
     @Autowired
     @Autowired
     private SysMusicCompareRecordDao sysMusicCompareRecordDao;
     private SysMusicCompareRecordDao sysMusicCompareRecordDao;
-
     @Autowired
     @Autowired
     private CloudTeacherDao cloudTeacherDao;
     private CloudTeacherDao cloudTeacherDao;
-
+    @Autowired
+    private CloudTeacherOrderDao cloudTeacherOrderDao;
     @Autowired
     @Autowired
     private OrganizationDao organizationDao;
     private OrganizationDao organizationDao;
-
     @Autowired
     @Autowired
     private IndexBaseMonthDataDao indexBaseMonthDataDao;
     private IndexBaseMonthDataDao indexBaseMonthDataDao;
 
 
@@ -764,23 +756,6 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
             organsNewCloudStudyNumMap = MapUtil.convertIntegerMap(organsNewCloudStudyNumMapList);
             organsNewCloudStudyNumMap = MapUtil.convertIntegerMap(organsNewCloudStudyNumMapList);
         }
         }
 
 
-        //获取新增人数占比(已上乐团课小于等于4)
-        //获取有在读学员的乐团编号
-        //获取有在读学员的学员编号
-//        List<String> musicGroupIds = studentRegistrationDao.findMusicGroupIds();
-//        List<Integer> studentIdList = studentRegistrationDao.findStudentIds();
-//        List<BaseMapDto<Integer, Long>> studentMusicCourseNum = studentDao.getOrganCloudNewStudentNum(musicGroupIds,studentIdList);
-//        //获取有乐团没排课的数据
-//        List<Integer> noCourseStudentIdList = studentRegistrationDao.findNoCourseStudentIds();
-//        List<Integer> userIdList = new ArrayList<>();
-//        if(!CollectionUtils.isEmpty(studentMusicCourseNum)){
-//            List<BaseMapDto<Integer, Long>> collect = studentMusicCourseNum.stream().filter(e -> e.getValue() < 5).collect(Collectors.toList());
-//            userIdList = collect.stream().map(e -> e.getKey()).collect(Collectors.toList());
-//        }
-//        userIdList.addAll(noCourseStudentIdList);
-//        List<Map<Long, Long>> organsNewCloudNewStudentNumMapList = studentDao.groupOrganId(organIds,userIdList);
-//        Map<String, Long> organsNewCloudNewStudentNumMap = MapUtil.convertIntegerMap(organsNewCloudNewStudentNumMapList);
-
         List<IndexBaseMonthData> withDayAndDataType = indexBaseMonthDataDao.getWithDayAndDataType(LocalDate.now().toString(), CLOUD_NEW_STUDENT_NUM);
         List<IndexBaseMonthData> withDayAndDataType = indexBaseMonthDataDao.getWithDayAndDataType(LocalDate.now().toString(), CLOUD_NEW_STUDENT_NUM);
         Map<Integer, Integer> organsNewCloudNewStudentNumMap = withDayAndDataType.stream().collect(Collectors.toMap(IndexBaseMonthData::getOrganId, e -> e.getActivateNum().intValue(), (e1, e2) -> e1));
         Map<Integer, Integer> organsNewCloudNewStudentNumMap = withDayAndDataType.stream().collect(Collectors.toMap(IndexBaseMonthData::getOrganId, e -> e.getActivateNum().intValue(), (e1, e2) -> e1));
 
 
@@ -796,9 +771,6 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
             if(organsVipStudentNumMap.containsKey(organ.getId().toString())){
             if(organsVipStudentNumMap.containsKey(organ.getId().toString())){
                 organStudentVipData.setVipStudentNum(organsVipStudentNumMap.get(organ.getId().toString()).intValue());
                 organStudentVipData.setVipStudentNum(organsVipStudentNumMap.get(organ.getId().toString()).intValue());
             }
             }
-//            if(organsEVipStudentNumMap.containsKey(organ.getId().toString())){
-//                organStudentVipData.seteVipStudentNum(organsEVipStudentNumMap.get(organ.getId().toString()).intValue());
-//            }
             if(organCloudStudyStudentNumMap.containsKey(organ.getId().toString())){
             if(organCloudStudyStudentNumMap.containsKey(organ.getId().toString())){
                 organStudentVipData.setCloudStudyUseStudentNum(organCloudStudyStudentNumMap.get(organ.getId().toString()).intValue());
                 organStudentVipData.setCloudStudyUseStudentNum(organCloudStudyStudentNumMap.get(organ.getId().toString()).intValue());
             }
             }
@@ -925,4 +897,135 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
     public void cleanStudentCloudStudySequenceDays() {
     public void cleanStudentCloudStudySequenceDays() {
         studentDao.cleanStudentCloudStudySequenceDays();
         studentDao.cleanStudentCloudStudySequenceDays();
     }
     }
+
+    @Override
+    public void remarkCountFlag() {
+        //清除标记
+        studentDao.cleanCountFlag();
+        //打标记
+        studentDao.remarkCountFlag();
+    }
+
+    @Override
+    public Map<String,Object> countCloudTeacherActive(List<Integer> organIdList, CloudTeacherActiveQueryInfo queryInfo) {
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
+        //获取分部目标
+        String cloudTeacherActiveTarget = sysConfigDao.findConfigValue(SysConfigService.CLOUD_TEACHER_ACTIVE_TARGET);
+        if(StringUtils.isEmpty(cloudTeacherActiveTarget)){
+            return null;
+        }
+        List<CloudTeacherActiveTargetDto> targetDtoList = JSONArray.parseArray(cloudTeacherActiveTarget, CloudTeacherActiveTargetDto.class);
+        Map<Integer, List<CloudTeacherActiveTargetDto>> targetMap = targetDtoList.stream().collect(Collectors.groupingBy(e -> e.getOrganId()));
+
+        params.put("organIdList",organIdList);
+        List<CloudTeacherActiveTargetDto> resultList = indexBaseMonthDataDao.countCloudTeacherActive(params);
+        for (CloudTeacherActiveTargetDto dto : resultList) {
+            List<CloudTeacherActiveTargetDto> targetDtos = targetMap.get(dto.getOrganId());
+            if(targetDtos != null && targetDtos.size() > 0){
+                CloudTeacherActiveTargetDto target = targetDtos.get(0);
+                dto.setTargetNum(target.getTargetNum());
+                dto.setTargetAmount(target.getTargetAmount());
+            }
+            if(dto.getBuyAmount().doubleValue() > 0d && dto.getBuyNum() > 0){
+                BigDecimal avgBuyAmount = dto.getBuyAmount().divide(new BigDecimal(dto.getBuyNum()), CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
+                dto.setAvgBuyAmount(avgBuyAmount);
+            }
+            if(dto.getTotalNum() > 0 && dto.getBuyNum() > 0){
+                BigDecimal buyScale = new BigDecimal(dto.getBuyNum()).divide(new BigDecimal(dto.getTotalNum()), CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
+                dto.setBuyScale(buyScale);
+            }
+            if(dto.getTargetNum() > 0 && dto.getBuyNum() > 0){
+                BigDecimal targetFinishScale = new BigDecimal(dto.getBuyNum()).divide(new BigDecimal(dto.getTargetNum()), CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
+                dto.setTargetFinishScale(targetFinishScale);
+            }
+        }
+        Map<String,Object> resultMap = new HashMap<>(7);
+        BigDecimal buyAmount = resultList.stream().map(CloudTeacherActiveTargetDto::getBuyAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+        resultMap.put("buyAmount",buyAmount);
+        Integer buyNum = resultList.stream().mapToInt(CloudTeacherActiveTargetDto::getBuyNum).sum();
+        resultMap.put("buyNum",buyNum);
+        Integer totalNum = resultList.stream().mapToInt(CloudTeacherActiveTargetDto::getTotalNum).sum();
+        resultMap.put("totalNum",totalNum);
+        Integer targetNum = resultList.stream().mapToInt(CloudTeacherActiveTargetDto::getTargetNum).sum();
+        resultMap.put("targetNum",targetNum);
+        if(buyAmount.doubleValue() > 0d && buyNum > 0){
+            BigDecimal avgBuyAmount = buyAmount.divide(new BigDecimal(buyNum), CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
+            resultMap.put("avgBuyAmount",avgBuyAmount);
+        }
+        if(totalNum > 0 && buyNum > 0){
+            BigDecimal buyScale = new BigDecimal(buyNum).divide(new BigDecimal(totalNum), CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
+            resultMap.put("buyScale",buyScale);
+        }
+        if(targetNum > 0 && buyNum > 0){
+            BigDecimal targetFinishScale = new BigDecimal(buyNum).divide(new BigDecimal(targetNum), CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
+            resultMap.put("targetFinishScale",targetFinishScale);
+        }
+        Map<String,Object> result = new HashMap<>(2);
+        result.put("head",resultMap);
+        String sort = queryInfo.getSort();
+        if(StringUtils.isEmpty(sort)){
+            sort = "totalAmount";
+        }
+        String order = queryInfo.getOrder();
+        switch (sort){
+            case "totalAmount":
+                if("DESC".equalsIgnoreCase(order)){
+                    resultList = resultList.stream().sorted(Comparator.comparing(CloudTeacherActiveTargetDto::getBuyAmount,Comparator.reverseOrder())).collect(Collectors.toList());
+                }else {
+                    resultList = resultList.stream().sorted(Comparator.comparing(CloudTeacherActiveTargetDto::getBuyAmount)).collect(Collectors.toList());
+                }
+                break;
+            case "buyNum":
+                if("DESC".equalsIgnoreCase(order)){
+                    resultList = resultList.stream().sorted(Comparator.comparing(CloudTeacherActiveTargetDto::getBuyNum,Comparator.reverseOrder())).collect(Collectors.toList());
+                }else {
+                    resultList = resultList.stream().sorted(Comparator.comparing(CloudTeacherActiveTargetDto::getBuyNum)).collect(Collectors.toList());
+                }
+                break;
+            case "avgBuyAmount":
+                if("DESC".equalsIgnoreCase(order)){
+                    resultList = resultList.stream().sorted(Comparator.comparing(CloudTeacherActiveTargetDto::getAvgBuyAmount,Comparator.reverseOrder())).collect(Collectors.toList());
+                }else {
+                    resultList = resultList.stream().sorted(Comparator.comparing(CloudTeacherActiveTargetDto::getAvgBuyAmount)).collect(Collectors.toList());
+                }
+                break;
+            case "buyScale":
+                if("DESC".equalsIgnoreCase(order)){
+                    resultList = resultList.stream().sorted(Comparator.comparing(CloudTeacherActiveTargetDto::getBuyScale,Comparator.reverseOrder())).collect(Collectors.toList());
+                }else {
+                    resultList = resultList.stream().sorted(Comparator.comparing(CloudTeacherActiveTargetDto::getBuyScale)).collect(Collectors.toList());
+                }
+                break;
+            case "targetFinishScale":
+                if("DESC".equalsIgnoreCase(order)){
+                    resultList = resultList.stream().sorted(Comparator.comparing(CloudTeacherActiveTargetDto::getTargetFinishScale,Comparator.reverseOrder())).collect(Collectors.toList());
+                }else {
+                    resultList = resultList.stream().sorted(Comparator.comparing(CloudTeacherActiveTargetDto::getTargetFinishScale)).collect(Collectors.toList());
+                }
+                break;
+        }
+        result.put("resultList",resultList);
+        return result;
+    }
+
+    @Override
+    public PageInfo<CloudTeacherActiveTargetDetailDto> countCloudTeacherActiveDetail(CloudTeacherActiveQueryInfo queryInfo) {
+        PageInfo<CloudTeacherActiveTargetDetailDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<CloudTeacherActiveTargetDetailDto> dataList = null;
+        int count = cloudTeacherOrderDao.countCloudTeacherActiveDetail(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = cloudTeacherOrderDao.queryCloudTeacherActiveDetail(params);
+        }
+        if (count == 0) {
+            dataList = new ArrayList<>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
 }
 }

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

@@ -0,0 +1,116 @@
+package com.ym.mec.biz.service.impl;
+
+import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
+import com.ym.mec.biz.dal.dao.SysCouponCodeDao;
+import com.ym.mec.biz.dal.dao.SysCouponDao;
+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.page.SysCouponCodeQueryInfo;
+import com.ym.mec.biz.service.SysCouponCodeService;
+import com.ym.mec.biz.service.SysCouponService;
+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.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.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+
+@Service
+public class SysCouponCodeServiceImpl extends BaseServiceImpl<Long, SysCouponCode>  implements SysCouponCodeService {
+	
+	@Autowired
+	private SysCouponCodeDao sysCouponCodeDao;
+	@Autowired
+	private SysCouponService sysCouponService;
+	@Autowired
+	private SysCouponDao sysCouponDao;
+	@Autowired
+	private IdGeneratorService idGeneratorService;
+	@Autowired
+	private StudentPaymentOrderDao studentPaymentOrderDao;
+
+	@Override
+	public BaseDAO<Long, SysCouponCode> getDAO() {
+		return sysCouponCodeDao;
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
+	public boolean exchangeCoupon(Integer userId, Integer couponId, Long paymentOrderId) {
+		if(Objects.isNull(userId)||Objects.isNull(couponId)||Objects.isNull(paymentOrderId)){
+			throw new BizException("领取失败");
+		}
+		SysCoupon sysCoupon = sysCouponDao.lockCoupon(couponId);
+		Date now = new Date();
+		//如果优惠券不存在,或者已停用,或者不在领取有效期内,或者已消耗完,则此优惠券无效
+		boolean invalid = Objects.isNull(sysCoupon)||0==sysCoupon.getStatus()||now.compareTo(sysCoupon.getStartDate())<0||now.compareTo(sysCoupon.getEndDate())>0||sysCoupon.getConsumeNum()>=sysCoupon.getStockCount();
+		if(invalid){
+			throw new BizException("无效优惠券");
+		}
+		StudentPaymentOrder studentPaymentOrder = studentPaymentOrderDao.get(paymentOrderId);
+		if(Objects.isNull(studentPaymentOrder)){
+			throw new BizException("无效订单");
+		}
+		if(sysCoupon.getLimitExchangeNum()!=-1){
+			int userUserNum = sysCouponCodeDao.countWithUserAndCoupon(userId, couponId);
+			invalid = userUserNum>=sysCoupon.getLimitExchangeNum();
+		}
+		//如果用户使用数量超过优惠券限制则领取无效
+		if(invalid){
+			throw new BizException("当前优惠券最多可领取{}次", sysCoupon.getLimitExchangeNum());
+		}
+		SysCouponCode sysCouponCode = new SysCouponCode();
+		sysCouponCode.setUserId(userId);
+		sysCouponCode.setCouponId(couponId);
+		sysCouponCode.setPaymentOrderId(paymentOrderId);
+		sysCouponCode.setCode(String.valueOf(idGeneratorService.generatorId("coupon")));
+		sysCouponCode.setUsageStatus(0);
+		switch (sysCoupon.getEffectiveType()){
+			case DAYS:
+				sysCouponCode.setUseStartDate(now);
+				sysCouponCode.setUseDeadlineDate(DateUtil.addDays(now, sysCoupon.getDeadline()));
+				break;
+			case TIME_BUCKET:
+				sysCouponCode.setUseStartDate(sysCoupon.getStartDate());
+				sysCouponCode.setUseDeadlineDate(sysCoupon.getEndDate());
+				break;
+			default:
+				throw new BizException("无效优惠券", sysCoupon.getLimitExchangeNum());
+		}
+		sysCouponCodeDao.insert(sysCouponCode);
+		sysCoupon.setConsumeNum(new AtomicInteger(sysCoupon.getConsumeNum()).incrementAndGet());
+		if(sysCoupon.getWarningStatus()==0&&sysCoupon.getStockCount()-sysCoupon.getConsumeNum()<sysCoupon.getWarningStockNum()){
+			sysCouponService.stockWarning(sysCoupon.getId(), sysCoupon.getName());
+			sysCoupon.setWarningStatus(1);
+		}
+		sysCouponDao.update(sysCoupon);
+		return true;
+	}
+
+	@Override
+	public PageInfo<SysCouponCodeDto> querySysCouponUseList(SysCouponCodeQueryInfo queryInfo) {
+		PageInfo<SysCouponCodeDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<String, Object>();
+		MapUtil.populateMap(params, queryInfo);
+
+		List<SysCouponCodeDto> dataList = new ArrayList<>();
+		int count = sysCouponCodeDao.countSysCouponUseList(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			dataList = sysCouponCodeDao.querySysCouponUseList(params);
+		}
+		pageInfo.setRows(dataList);
+		return pageInfo;
+	}
+}

+ 83 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysCouponServiceImpl.java

@@ -0,0 +1,83 @@
+package com.ym.mec.biz.service.impl;
+
+import com.ym.mec.biz.dal.dao.SysCouponDao;
+import com.ym.mec.biz.dal.entity.SysCoupon;
+import com.ym.mec.biz.dal.enums.MessageTypeEnum;
+import com.ym.mec.biz.dal.page.SysCouponQueryInfo;
+import com.ym.mec.biz.service.SysCouponService;
+import com.ym.mec.biz.service.SysMessageService;
+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.service.impl.BaseServiceImpl;
+import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
+import com.ym.mec.util.collection.MapUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+
+@Service
+public class SysCouponServiceImpl extends BaseServiceImpl<Integer, SysCoupon>  implements SysCouponService {
+	
+	@Autowired
+	private SysCouponDao sysCouponDao;
+	@Autowired
+	private SysMessageService sysMessageService;
+
+	@Override
+	public BaseDAO<Integer, SysCoupon> getDAO() {
+		return sysCouponDao;
+	}
+
+	@Override
+	public PageInfo<SysCoupon> queryPage(SysCouponQueryInfo queryInfo) {
+		PageInfo<SysCoupon> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<String, Object>();
+		MapUtil.populateMap(params, queryInfo);
+
+		List<SysCoupon> dataList = new ArrayList<>();
+		int count = this.findCount(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			dataList = this.getDAO().queryPage(params);
+		}
+		pageInfo.setRows(dataList);
+		return pageInfo;
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
+	public void updateCoupon(SysCoupon sysCoupon) {
+		SysCoupon oldCoupon = sysCouponDao.lockCoupon(sysCoupon.getId());
+		if(Objects.isNull(oldCoupon)){
+			throw new BizException("优惠券信息不存在");
+		}
+		//如果已经有人领取,则只能修改库存总量与预警值
+		if(oldCoupon.getConsumeNum()>0){
+			oldCoupon.setStatus(sysCoupon.getStatus());
+			oldCoupon.setStockCount(sysCoupon.getStockCount());
+			oldCoupon.setWarningStockNum(sysCoupon.getWarningStockNum());
+			if(oldCoupon.getStockCount()-oldCoupon.getConsumeNum()>oldCoupon.getWarningStockNum()){
+				oldCoupon.setWarningStatus(0);
+			}
+			sysCouponDao.update(oldCoupon);
+		}else{
+			sysCouponDao.update(sysCoupon);
+		}
+	}
+
+	@Async
+	@Override
+	public void stockWarning(Integer couponId, String couponName) {
+		Map<Integer, String> teacherPhoneMap = new HashMap<>();
+		teacherPhoneMap.put(2112251, "13618651329");
+		sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.YIMEI, MessageTypeEnum.COUPON_STOCK_WARNING,
+				teacherPhoneMap, null, 0, null, null,
+				couponName);
+	}
+}

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

@@ -81,4 +81,15 @@
     <select id="queryNameByIds" resultType="java.util.Map" parameterType="list">
     <select id="queryNameByIds" resultType="java.util.Map" parameterType="list">
         SELECT id_ `key`,name_ `value` FROM charge_type WHERE FIND_IN_SET(id_,#{chargeTypeIds})
         SELECT id_ `key`,name_ `value` FROM charge_type WHERE FIND_IN_SET(id_,#{chargeTypeIds})
     </select>
     </select>
+    <select id="queryNormalChargeName" resultType="java.util.Map">
+        SELECT sr.user_id_ 'key',GROUP_CONCAT(DISTINCT ct.name_) 'value' FROM student_registration sr
+        LEFT JOIN music_group mg ON mg.id_ = sr.music_group_id_
+        LEFT JOIN charge_type ct ON ct.id_ = mg.charge_type_id_
+        WHERE mg.status_ = 'PROGRESS' AND sr.music_group_status_ = 'NORMAL'
+        AND sr.user_id_ IN
+        <foreach collection="studentIds" item="userId" open="(" close=")" separator=",">
+            #{userId}
+        </foreach>
+        GROUP BY sr.user_id_
+    </select>
 </mapper>
 </mapper>

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

@@ -17,6 +17,7 @@
         <result column="end_time_" property="endTime"/>
         <result column="end_time_" property="endTime"/>
         <result column="order_id_" property="orderId"/>
         <result column="order_id_" property="orderId"/>
         <result column="remark_" property="remark"/>
         <result column="remark_" property="remark"/>
+        <result column="active_remark_" property="activeRemark"/>
         <result column="version_" property="version"/>
         <result column="version_" property="version"/>
         <result column="create_time_" property="createTime"/>
         <result column="create_time_" property="createTime"/>
         <result column="update_time_" property="updateTime"/>
         <result column="update_time_" property="updateTime"/>
@@ -58,14 +59,17 @@
             useGeneratedKeys="true">
             useGeneratedKeys="true">
         <!--@mbg.generated-->
         <!--@mbg.generated-->
         insert into cloud_teacher_order (organ_id_,student_id_, type_, level_, time_, amount_, refund_amount_, status_,
         insert into cloud_teacher_order (organ_id_,student_id_, type_, level_, time_, amount_, refund_amount_, status_,
-        order_id_,start_time_,end_time_,remark_, create_time_, update_time_,music_group_id_)
+        order_id_,start_time_,end_time_,remark_, create_time_, update_time_,music_group_id_,active_remark_)
         values (#{organId},#{studentId}, #{type},#{level}, #{time}, #{amount}, #{refundAmount},
         values (#{organId},#{studentId}, #{type},#{level}, #{time}, #{amount}, #{refundAmount},
-        #{status},#{orderId},#{startTime},#{endTime}, #{remark}, NOW(), NOW(),#{musicGroupId})
+        #{status},#{orderId},#{startTime},#{endTime}, #{remark}, NOW(), NOW(),#{musicGroupId},#{activeRemark})
     </insert>
     </insert>
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.CloudTeacherOrder">
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.CloudTeacherOrder">
         <!--@mbg.generated-->
         <!--@mbg.generated-->
         update cloud_teacher_order
         update cloud_teacher_order
         <set>
         <set>
+            <if test="activeRemark != null">
+                active_remark_ = #{activeRemark},
+            </if>
             <if test="musicGroupId != null">
             <if test="musicGroupId != null">
                 music_group_id_ = #{musicGroupId},
                 music_group_id_ = #{musicGroupId},
             </if>
             </if>
@@ -105,9 +109,6 @@
             <if test="remark != null">
             <if test="remark != null">
                 remark_ = #{remark},
                 remark_ = #{remark},
             </if>
             </if>
-            <if test="createTime != null">
-                create_time_ = #{createTime},
-            </if>
             version_ = version_+1,
             version_ = version_+1,
             update_time_ = NOW(),
             update_time_ = NOW(),
         </set>
         </set>
@@ -208,4 +209,64 @@
         </if>
         </if>
         GROUP BY student_id_
         GROUP BY student_id_
     </select>
     </select>
+    <resultMap id="CloudTeacherActiveTargetDetailDto" type="com.ym.mec.biz.dal.dto.CloudTeacherActiveTargetDetailDto">
+        <result property="userId" column="student_id_"/>
+        <result property="username" column="username_"/>
+        <result property="amount" column="amount_"/>
+        <result property="remark" column="remark_"/>
+        <result property="cooperationName" column="cooperation_name_"/>
+        <result property="musicGroupName" column="music_group_name_"/>
+        <result property="chargeType" column="charge_type_name_"/>
+        <result property="subjectName" column="subject_name_"/>
+        <result property="currentGradeNum" column="current_grade_num_"/>
+        <result property="teacherName" column="teacher_name_"/>
+    </resultMap>
+    <select id="queryCloudTeacherActiveDetail" resultMap="CloudTeacherActiveTargetDetailDto">
+        SELECT su.username_,cto.remark_,cto.amount_,cto.student_id_,GROUP_CONCAT(DISTINCT co.name_) cooperation_name_,
+        GROUP_CONCAT(DISTINCT mg.name_) music_group_name_,GROUP_CONCAT(DISTINCT ct.name_) charge_type_name_,
+        sj.name_ subject_name_,st.current_grade_num_,sus.real_name_ teacher_name_
+        FROM cloud_teacher_order cto
+        LEFT JOIN sys_user su ON su.id_ = cto.student_id_
+        LEFT JOIN student_registration sr ON sr.user_id_ = cto.student_id_ AND sr.music_group_status_ = 'NORMAL'
+        LEFT JOIN music_group mg ON mg.id_ = sr.music_group_id_ AND mg.status_ = 'PROGRESS'
+        LEFT JOIN cooperation_organ co ON co.id_ = mg.cooperation_organ_id_
+        LEFT JOIN charge_type ct ON ct.id_ = mg.charge_type_id_
+        LEFT JOIN student st ON st.user_id_ = cto.student_id_
+        LEFT JOIN sys_user sus ON sus.id_ = st.teacher_id_
+        LEFT JOIN `subject` sj ON sj.id_ = st.user_id_
+        <include refid="queryCloudTeacherActiveDetailSql"/>
+        GROUP BY cto.id_
+        <include refid="global.limit"/>
+    </select>
+    <select id="countCloudTeacherActiveDetail" resultType="int">
+        SELECT COUNT(DISTINCT cto.id_)
+        FROM cloud_teacher_order cto
+        LEFT JOIN sys_user su ON su.id_ = cto.student_id_
+        LEFT JOIN student_registration sr ON sr.user_id_ = cto.student_id_ AND sr.music_group_status_ = 'NORMAL'
+        LEFT JOIN music_group mg ON mg.id_ = sr.music_group_id_ AND mg.status_ = 'PROGRESS'
+        <include refid="queryCloudTeacherActiveDetailSql"/>
+    </select>
+    <sql id="queryCloudTeacherActiveDetailSql">
+        <where>
+            <if test="organIds != null and organIds != ''">
+                AND FIND_IN_SET(su.organ_id_,#{organIds})
+            </if>
+            <if test="search != null and search != ''">
+                AND (su.id_ = #{search} OR su.username_ LIKE CONCAT('%',#{search},'%') OR mg.id_ LIKE CONCAT('%',#{search},'%'))
+            </if>
+            <if test="chargeType != null">
+                AND mg.charge_type_id_ = #{chargeType}
+            </if>
+            <if test="subjectId != null">
+                AND s.subject_id_list_ = #{subjectId}
+            </if>
+            <if test="teacherId != null">
+                AND s.teacher_id_ = #{teacherId}
+            </if>
+            <if test="remarkType != null and remarkType != ''">
+                AND cto.active_remark_ = #{remarkType}
+            </if>
+        </where>
+    </sql>
+
 </mapper>
 </mapper>

+ 22 - 0
mec-biz/src/main/resources/config/mybatis/IndexBaseMonthDataMapper.xml

@@ -1820,4 +1820,26 @@
 		HAVING MIN(DATE( smcr.create_time_ ))= #{dayStr}) t
 		HAVING MIN(DATE( smcr.create_time_ ))= #{dayStr}) t
 		GROUP BY t.organ_id_
 		GROUP BY t.organ_id_
 	</select>
 	</select>
+	<resultMap id="CloudTeacherActiveTargetDto" type="com.ym.mec.biz.dal.dto.CloudTeacherActiveTargetDto">
+		<result property="organId" column="organ_id_"/>
+		<result property="organName" column="organ_name_"/>
+		<result property="totalNum" column="total_num_"/>
+		<result property="buyAmount" column="buy_amount_"/>
+		<result property="buyNum" column="buy_num_"/>
+	</resultMap>
+    <select id="countCloudTeacherActive" resultMap="CloudTeacherActiveTargetDto">
+		SELECT o.name_ organ_name_,o.id_ organ_id_,CASE WHEN SUM(cto.amount_) IS NULL THEN 0 ELSE SUM(cto.amount_) END buy_amount_,
+		COUNT(DISTINCT cto.student_id_) buy_num_,COUNT(s.user_id_) total_num_ FROM student s
+		LEFT JOIN sys_user su ON su.id_ = s.user_id_
+		LEFT JOIN cloud_teacher_order cto ON cto.student_id_ = s.user_id_
+		LEFT JOIN organization o ON o.id_ = su.organ_id_
+		WHERE s.count_flag_ = 1
+		<if test="organIdList != null and organIdList.size > 0">
+			AND su.organ_id_ IN
+			<foreach collection="organIdList" open="(" close=")" item="item" separator=",">
+				#{item}
+			</foreach>
+		</if>
+		GROUP BY su.organ_id_
+	</select>
 </mapper>
 </mapper>

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

@@ -1300,4 +1300,28 @@
     <update id="cleanStudentCloudStudySequenceDays">
     <update id="cleanStudentCloudStudySequenceDays">
         UPDATE student SET cloud_study_sequence_days_=0,cloud_study_use_last_day_=date_sub(curdate(), interval 1 day) WHERE cloud_study_use_last_day_&lt;date_sub(curdate(), interval 1 day)
         UPDATE student SET cloud_study_sequence_days_=0,cloud_study_use_last_day_=date_sub(curdate(), interval 1 day) WHERE cloud_study_use_last_day_&lt;date_sub(curdate(), interval 1 day)
     </update>
     </update>
+    <update id="cleanCountFlag">
+        UPDATE student SET count_flag_ = 0 WHERE count_flag_ = 1
+    </update>
+    <update id="remarkCountFlag">
+        UPDATE student SET count_flag_ = 1 WHERE user_id_ IN (
+        SELECT * FROM (
+        SELECT DISTINCT user_id_
+        FROM ((SELECT sr.user_id_
+        FROM student_registration sr
+        LEFT JOIN music_group mg ON sr.music_group_id_=mg.id_
+        WHERE mg.status_='PROGRESS'
+        AND sr.music_group_status_='NORMAL')
+        UNION ALL
+        (SELECT
+        cssp.user_id_
+        FROM
+        course_schedule_student_payment cssp
+        LEFT JOIN course_schedule cs ON cssp.course_schedule_id_=cs.id_
+        WHERE
+        cssp.group_type_ IN ('VIP', 'PRACTICE')
+        AND cs.status_='NOT_START')) t
+        LEFT JOIN sys_user su ON t.user_id_=su.id_
+        WHERE su.del_flag_=0 AND t.user_id_ NOT IN (SELECT user_id_ FROM student WHERE subject_id_list_ REGEXP '21|25|26|27|28|29'))c)
+    </update>
 </mapper>
 </mapper>

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

@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+这个文件是自动生成的。
+不要修改此文件。所有改动将在下次重新自动生成时丢失。
+-->
+<mapper namespace="com.ym.mec.biz.dal.dao.SysCouponCodeDao">
+
+	<resultMap type="com.ym.mec.biz.dal.entity.SysCouponCode" id="SysCouponCode">
+		<result column="id_" property="id" />
+		<result column="coupon_id_" property="couponId" />
+		<result column="code_" property="code" />
+		<result column="usage_status_" property="usageStatus" />
+		<result column="user_id_" property="userId" />
+		<result column="used_time_" property="usedTime" />
+		<result column="use_start_date_" property="useStartDate" />
+		<result column="use_deadline_date_" property="useDeadlineDate" />
+		<result column="payment_order_id_" property="paymentOrderId" />
+		<result column="create_time_" property="createTime" />
+		<result column="update_time_" property="updateTime" />
+	</resultMap>
+
+	<resultMap id="SysCouponCodeDto" type="com.ym.mec.biz.dal.dto.SysCouponCodeDto">
+		<result column="organ_id_" property="organId"/>
+		<result column="organ_name_" property="organName"/>
+		<result column="user_id_" property="userId"/>
+		<result column="user_name_" property="userName"/>
+		<result column="phone_" property="phone"/>
+		<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"/>
+		<result column="coupon_description_" property="couponDescription"/>
+		<result column="code_" property="code"/>
+		<result column="payment_order_id_" property="paymentOrderId"/>
+		<result column="usage_status_" property="usageStatus"/>
+		<result column="used_time_" property="usedTime"/>
+		<result column="use_start_date_" property="useStartDate"/>
+		<result column="use_deadline_date_" property="useDeadlineDate"/>
+	</resultMap>
+
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="SysCouponCode" >
+		SELECT * FROM sys_coupon_code WHERE id_ = #{id}
+	</select>
+
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="SysCouponCode">
+		SELECT * FROM sys_coupon_code ORDER BY id_
+	</select>
+
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.SysCouponCode" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		<!--
+		<selectKey resultClass="int" keyProperty="id" > 
+		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL 
+		</selectKey>
+		-->
+		INSERT INTO sys_coupon_code (id_,coupon_id_,code_,usage_status_,user_id_,used_time_,use_start_date_,use_deadline_date_,
+		                             payment_order_id_,create_time_,update_time_)
+							 VALUES(#{id},#{couponId},#{code},#{usageStatus},#{userId},#{usedTime},#{useStartDate},#{useDeadlineDate},
+									#{paymentOrderId},NOW(),NOW())
+	</insert>
+
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.biz.dal.entity.SysCouponCode">
+		UPDATE sys_coupon_code
+		<set>
+			<if test="couponId != null">
+				coupon_id_ = #{couponId},
+			</if>
+			<if test="usageStatus != null">
+				usage_status_ = #{usageStatus},
+			</if>
+			<if test="useStartDate != null">
+				use_start_date_ = #{useStartDate},
+			</if>
+			<if test="userId != null">
+				user_id_ = #{userId},
+			</if>
+			<if test="code != null">
+				code_ = #{code},
+			</if>
+			<if test="updateTime != null">
+				update_time_ = #{updateTime},
+			</if>
+			<if test="paymentOrderId != null">
+				payment_order_id_ = #{paymentOrderId},
+			</if>
+			<if test="useDeadlineDate != null">
+				use_deadline_date_ = #{useDeadlineDate},
+			</if>
+				used_time_ = NOW()
+		</set>
+		WHERE id_ = #{id}
+	</update>
+
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete" >
+		DELETE FROM sys_coupon_code WHERE id_ = #{id}
+	</delete>
+
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="SysCouponCode" parameterType="map">
+		SELECT * FROM sys_coupon_code ORDER BY id_ <include refid="global.limit"/>
+	</select>
+
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM sys_coupon_code
+	</select>
+
+	<select id="countWithUserAndCoupon" resultType="int">
+		SELECT COUNT(id_) FROM sys_coupon_code WHERE user_id_=#{userId} AND coupon_id_=#{couponId}
+	</select>
+
+	<sql id="querySysCouponUseListCondition">
+		<where>
+			<if test="userId!=null">
+				AND scc.user_id_=#{userId}
+			</if>
+			<if test="couponName!=null and couponName!=''">
+				AND sc.name_ LIKE CONCAT('%', #{couponName}, '%')
+			</if>
+			<if test="paymentOrderId!=null">
+				AND scc.payment_order_id_=#{paymentOrderId}
+			</if>
+			<if test="usageStatus!=null">
+				AND scc.usage_status_=#{usageStatus}
+			</if>
+			<if test="organId!=null">
+				AND su.organ_id_=#{organId}
+			</if>
+			<if test="search!=null and search!=''">
+				AND (scc.user_id_=#{search} OR su.phone_=#{search} OR su.username_ LIKE CONCAT('%', #{search}, '%'))
+			</if>
+		</where>
+	</sql>
+
+	<select id="querySysCouponUseList" resultMap="SysCouponCodeDto">
+		SELECT
+			organ.name_ organ_name_,
+			su.username_,
+			su.phone_,
+			scc.coupon_id_,
+			sc.type_ coupon_type_,
+			sc.name_ coupon_name_,
+			sc.description_ coupon_description_,
+			scc.code_,
+			scc.payment_order_id_,
+			scc.use_start_date_,
+			scc.use_deadline_date_,
+			scc.used_time_,
+			scc.usage_status_
+		FROM sys_coupon_code scc
+			 LEFT JOIN sys_coupon sc ON scc.coupon_id_=sc.id_
+			 LEFT JOIN sys_user su ON scc.user_id_=su.id_
+			 LEFT JOIN organization organ ON su.organ_id_=organ.id_
+		<include refid="querySysCouponUseListCondition"></include>
+		ORDER BY scc.id_ DESC
+		<include refid="global.limit"></include>
+	</select>
+
+	<select id="countSysCouponUseList" resultType="java.lang.Integer">
+		SELECT
+			COUNT(scc.id_)
+		FROM sys_coupon_code scc
+			LEFT JOIN sys_coupon sc ON scc.coupon_id_=sc.id_
+			LEFT JOIN sys_user su ON scc.user_id_=su.id_
+			LEFT JOIN organization organ ON su.organ_id_=organ.id_
+		<include refid="querySysCouponUseListCondition"></include>
+	</select>
+</mapper>

+ 153 - 0
mec-biz/src/main/resources/config/mybatis/SysCouponMapper.xml

@@ -0,0 +1,153 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+这个文件是自动生成的。
+不要修改此文件。所有改动将在下次重新自动生成时丢失。
+-->
+<mapper namespace="com.ym.mec.biz.dal.dao.SysCouponDao">
+
+	<resultMap type="com.ym.mec.biz.dal.entity.SysCoupon" id="SysCoupon">
+		<result column="id_" property="id" />
+		<result column="name_" property="name" />
+		<result column="description_" property="description" />
+		<result column="status_" property="status" />
+		<result column="type_" property="type" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+		<result column="face_value_" property="faceValue" />
+		<result column="full_amount_" property="fullAmount" />
+		<result column="limit_exchange_num_" property="limitExchangeNum" />
+		<result column="effective_type_" property="effectiveType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+		<result column="deadline_" property="deadline" />
+		<result column="effective_start_time_" property="effectiveStartTime" />
+		<result column="effective_expire_time_" property="effectiveExpireTime" />
+		<result column="end_date_" property="endDate" />
+		<result column="start_date_" property="startDate" />
+		<result column="stock_count_" property="stockCount" />
+		<result column="consume_num_" property="consumeNum" />
+		<result column="warning_stock_num_" property="warningStockNum" />
+		<result column="warning_status_" property="warningStatus" />
+		<result column="create_time_" property="createTime" />
+		<result column="update_time_" property="updateTime" />
+	</resultMap>
+
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="SysCoupon" >
+		SELECT * FROM sys_coupon WHERE id_ = #{id}
+	</select>
+
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="SysCoupon">
+		SELECT * FROM sys_coupon ORDER BY id_
+	</select>
+
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.SysCoupon" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		INSERT INTO sys_coupon (id_,name_,description_,status_,type_,face_value_,full_amount_,limit_exchange_num_,effective_type_,deadline_,
+		                        effective_start_time_, effective_expire_time_,end_date_,start_date_,stock_count_,consume_num_,warning_stock_num_,
+		                        create_time_,update_time_)
+		                        VALUES(#{id},#{name},#{description},#{status},#{type, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{faceValue},#{fullAmount},#{limitExchangeNum},
+		                               #{effectiveType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{deadline},
+		                               #{effectiveStartTime},#{effectiveExpireTime},#{endDate},#{startDate},#{stockCount},#{consumeNum},#{warningStockNum},
+		                               NOW(), NOW())
+	</insert>
+
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.biz.dal.entity.SysCoupon">
+		UPDATE sys_coupon
+		<set>
+			<if test="status != null">
+				status_ = #{status},
+			</if>
+			<if test="effectiveExpireTime != null">
+				effective_expire_time_ = #{effectiveExpireTime},
+			</if>
+			<if test="startDate != null">
+				start_date_ = #{startDate},
+			</if>
+			<if test="faceValue != null">
+				face_value_ = #{faceValue},
+			</if>
+			<if test="name != null">
+				name_ = #{name},
+			</if>
+			<if test="fullAmount != null">
+				full_amount_ = #{fullAmount},
+			</if>
+			<if test="effectiveType != null">
+				effective_type_ = #{effectiveType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+			</if>
+			<if test="deadline != null">
+				deadline_ = #{deadline},
+			</if>
+			<if test="stockCount != null">
+				stock_count_ = #{stockCount},
+			</if>
+			<if test="endDate != null">
+				end_date_ = #{endDate},
+			</if>
+			<if test="description != null">
+				description_ = #{description},
+			</if>
+			<if test="effectiveStartTime != null">
+				effective_start_time_ = #{effectiveStartTime},
+			</if>
+			<if test="consumeNum != null">
+				consume_num_ = #{consumeNum},
+			</if>
+			<if test="type != null">
+				type_ = #{type, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+			</if>
+			<if test="limitExchangeNum != null">
+				limit_exchange_num_ = #{limitExchangeNum},
+			</if>
+			<if test="warningStockNum != null">
+				warning_stock_num_ = #{warningStockNum},
+			</if>
+			<if test="warningStatus != null">
+				warning_status_ = #{warningStatus},
+			</if>
+				update_time_ = NOW()
+		</set>
+		WHERE id_ = #{id}
+	</update>
+
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete" >
+		DELETE FROM sys_coupon WHERE id_ = #{id}
+	</delete>
+
+	<sql id="queryCondition">
+		<where>
+			<if test="status != null">
+				AND status_ = #{status}
+			</if>
+			<if test="type != null">
+				AND type_ = #{type, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+			</if>
+			<if test="search != null and search != ''">
+				AND (id_=#{search} OR name_ LIKE CONCAT('%', #{search}, '%'))
+			</if>
+		</where>
+	</sql>
+
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="SysCoupon" parameterType="map">
+		SELECT * FROM sys_coupon
+		<include refid="queryCondition"></include>
+		ORDER BY id_
+		<include refid="global.limit"/>
+	</select>
+
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM sys_coupon
+		<include refid="queryCondition"></include>
+	</select>
+
+	<select id="lockCoupon" resultMap="SysCoupon">
+		SELECT * FROM sys_coupon WHERE id_ = #{id} FOR UPDATE
+	</select>
+
+	<select id="getWithName" resultMap="SysCoupon">
+		SELECT * FROM sys_coupon WHERE name_ = #{name}
+	</select>
+</mapper>

+ 6 - 0
mec-client-api/src/main/java/com/ym/mec/task/TaskRemoteService.java

@@ -223,4 +223,10 @@ public interface TaskRemoteService {
 	/** 本周学员训练提醒 */
 	/** 本周学员训练提醒 */
 	@GetMapping("task/curWeekStudentTrainRemind")
 	@GetMapping("task/curWeekStudentTrainRemind")
 	void curWeekStudentTrainRemind();
 	void curWeekStudentTrainRemind();
+
+	/**
+	 * 标记进行中乐团在读学员+VIP、网管有课学员(除弦乐声部、去重)
+	 */
+	@GetMapping("task/remarkCountFlag")
+    void remarkCountFlag();
 }
 }

+ 5 - 0
mec-client-api/src/main/java/com/ym/mec/task/fallback/TaskRemoteServiceFallback.java

@@ -277,4 +277,9 @@ public class TaskRemoteServiceFallback implements TaskRemoteService {
 	public void curWeekStudentTrainRemind() {
 	public void curWeekStudentTrainRemind() {
 		logger.error("本周学员训练提醒失败");
 		logger.error("本周学员训练提醒失败");
 	}
 	}
+
+    @Override
+    public void remarkCountFlag() {
+        logger.error("标记进行中乐团在读学员+VIP、网管有课学员总数 失败");
+    }
 }
 }

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

@@ -0,0 +1,38 @@
+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.page.SysCouponCodeQueryInfo;
+import com.ym.mec.biz.service.SysCouponCodeService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RequestMapping("sysCouponCode")
+@Api(tags = "优惠券明细")
+@RestController
+public class SysCouponCodeController extends BaseController {
+
+	@Autowired
+	private SysCouponCodeService sysCouponCodeService;
+	@Autowired
+	private SysUserFeignService sysUserFeignService;
+
+	@ApiOperation("分页查询")
+	@PostMapping(value = "queryPage")
+	@PreAuthorize("@pcs.hasPermissions('sysCouponCode/queryPage')")
+	public HttpResponseResult queryPage(SysCouponCodeQueryInfo queryInfo) {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed("请登录");
+		}
+		queryInfo.setUserId(sysUser.getId());
+		return succeed(sysCouponCodeService.querySysCouponUseList(queryInfo));
+	}
+}

+ 19 - 0
mec-task/src/main/java/com/ym/mec/task/jobs/RemarkCountFlagTask.java

@@ -0,0 +1,19 @@
+package com.ym.mec.task.jobs;
+
+import com.ym.mec.task.TaskRemoteService;
+import com.ym.mec.task.core.BaseTask;
+import com.ym.mec.task.core.TaskException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class RemarkCountFlagTask extends BaseTask {
+
+	@Autowired
+	private TaskRemoteService taskRemoteService;
+
+	@Override
+	public void execute() throws TaskException {
+		taskRemoteService.remarkCountFlag();
+	}
+}

+ 92 - 0
mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java

@@ -3305,4 +3305,96 @@ public class ExportController extends BaseController {
             }
             }
         }
         }
     }
     }
+
+    @ApiOperation(value = "分部云教练活动统计数据导出")
+    @RequestMapping("export/countCloudTeacherActive")
+    @PreAuthorize("@pcs.hasPermissions('export/countCloudTeacherActive')")
+    public void countCloudTeacherActive(CloudTeacherActiveQueryInfo queryInfo,HttpServletResponse response) throws IOException {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("用户信息获取失败");
+        }
+        Employee employee = employeeDao.get(sysUser.getId());
+        queryInfo.setPage(1);
+        queryInfo.setRows(49999);
+        List<Integer> organIds = new ArrayList<>();
+        if(StringUtils.isNotBlank(queryInfo.getOrganIds())){
+            organIds = Arrays.stream(queryInfo.getOrganIds().split(",")).map(id->Integer.valueOf(id)).collect(Collectors.toList());
+        }else if(StringUtils.isNotBlank(employee.getOrganIdList())){
+            organIds = Arrays.stream(employee.getOrganIdList().split(",")).map(id->Integer.valueOf(id)).collect(Collectors.toList());
+        }
+        List<Integer> ids = organIds.stream().filter(id -> !OrganizationService.EXCLUDE_ORGAN_IDS.contains(id)).collect(Collectors.toList());
+        Object object = studentService.countCloudTeacherActive(ids, queryInfo).get("resultList");
+        if(object == null){
+            throw new BizException("没有可导出的记录");
+        }
+        List<CloudTeacherActiveTargetDto> rows = (List<CloudTeacherActiveTargetDto>) object;
+
+        OutputStream outputStream = response.getOutputStream();
+        try {
+            String[] header = {"分部", "购买人数", "人均购买金额", "总人数", "购买率", "目标人数", "目标达成率"};
+            String[] body = {"organName", "buyNum", "avgBuyAmount", "totalNum", "buyScale",
+                            "targetNum", "targetFinishScale"};
+            HSSFWorkbook workbook = POIUtil.exportExcel(header, body, rows);
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attachment;filename=employeeInfo-" + DateUtil.getDate(new Date()) + ".xls");
+            response.flushBuffer();
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+            outputStream.flush();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+    @ApiOperation(value = "分部云教练学员训练数据导出")
+    @RequestMapping("export/countCloudTeacherActiveDetail")
+    @PreAuthorize("@pcs.hasPermissions('export/countCloudTeacherActiveDetail')")
+    public void countCloudTeacherActiveDetail(CloudTeacherActiveQueryInfo queryInfo,HttpServletResponse response) throws IOException {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("用户信息获取失败");
+        }
+        queryInfo.setPage(1);
+        queryInfo.setRows(49999);
+        List<CloudTeacherActiveTargetDetailDto> rows = studentService.countCloudTeacherActiveDetail(queryInfo).getRows();
+        if (CollectionUtils.isEmpty(rows)) {
+            response.setStatus(200);
+            response.setContentType("Content-Type: application/json;charset=UTF-8");
+            response.getOutputStream().write("{\"data\": null, \"code\": 500, \"status\": false, \"msg\": \"没有可导出的记录\"}".getBytes());
+            response.flushBuffer();
+            return;
+        }
+        OutputStream outputStream = response.getOutputStream();
+        try {
+            String[] header = {"学员编号", "学员", "合作单位", "乐团", "乐团模式", "声部", "年级", "指导老师", "购买套餐", "购买金额"};
+            String[] body = {"userId", "username", "cooperationName", "musicGroupName", "chargeType",
+                            "subjectName", "currentGradeNum", "teacherName", "remark", "amount"};
+            HSSFWorkbook workbook = POIUtil.exportExcel(header, body, rows);
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attachment;filename=employeeInfo-" + DateUtil.getDate(new Date()) + ".xls");
+            response.flushBuffer();
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+            outputStream.flush();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
 }
 }

+ 33 - 0
mec-web/src/main/java/com/ym/mec/web/controller/StudentManageController.java

@@ -471,4 +471,37 @@ public class StudentManageController extends BaseController {
     public HttpResponseResult<StatDto> organStudentData(StudentQueryInfo queryInfo){
     public HttpResponseResult<StatDto> organStudentData(StudentQueryInfo queryInfo){
         return succeed(studentService.organStudentData(queryInfo));
         return succeed(studentService.organStudentData(queryInfo));
     }
     }
+
+    @ApiOperation(value = "云教练活动统计")
+    @GetMapping("/countCloudTeacherActive")
+    @PreAuthorize("@pcs.hasPermissions('studentManage/countCloudTeacherActive')")
+    public Object countCloudTeacherActive(CloudTeacherActiveQueryInfo queryInfo) throws Exception {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        Employee employee = employeeDao.get(sysUser.getId());
+        queryInfo.setPage(1);
+        queryInfo.setRows(49999);
+
+        List<Integer> organIds = new ArrayList<>();
+        if(StringUtils.isNotBlank(queryInfo.getOrganIds())){
+            organIds = Arrays.stream(queryInfo.getOrganIds().split(",")).map(id->Integer.valueOf(id)).collect(Collectors.toList());
+        }else if(StringUtils.isNotBlank(employee.getOrganIdList())){
+            organIds = Arrays.stream(employee.getOrganIdList().split(",")).map(id->Integer.valueOf(id)).collect(Collectors.toList());
+        }
+        List<Integer> ids = organIds.stream().filter(id -> !OrganizationService.EXCLUDE_ORGAN_IDS.contains(id)).collect(Collectors.toList());
+        return succeed(studentService.countCloudTeacherActive(ids, queryInfo));
+    }
+
+    @ApiOperation(value = "云教练活动统计详情")
+    @GetMapping("/countCloudTeacherActiveDetail")
+    @PreAuthorize("@pcs.hasPermissions('studentManage/countCloudTeacherActiveDetail')")
+    public Object countCloudTeacherActiveDetail(CloudTeacherActiveQueryInfo queryInfo) throws Exception {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        return succeed(studentService.countCloudTeacherActiveDetail(queryInfo));
+    }
 }
 }

+ 43 - 0
mec-web/src/main/java/com/ym/mec/web/controller/SysCouponCodeController.java

@@ -0,0 +1,43 @@
+package com.ym.mec.web.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.page.SysCouponCodeQueryInfo;
+import com.ym.mec.biz.service.SysCouponCodeService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RequestMapping("sysCouponCode")
+@Api(tags = "优惠券明细")
+@RestController
+public class SysCouponCodeController extends BaseController {
+
+	@Autowired
+	private SysCouponCodeService sysCouponCodeService;
+	@Autowired
+	private SysUserFeignService sysUserFeignService;
+
+	@ApiOperation("分页查询")
+	@PostMapping(value = "queryPage")
+	@PreAuthorize("@pcs.hasPermissions('sysCouponCode/queryPage')")
+	public HttpResponseResult queryPage(SysCouponCodeQueryInfo queryInfo) {
+		return succeed(sysCouponCodeService.querySysCouponUseList(queryInfo));
+	}
+
+	@ApiOperation("兑换优惠券")
+	@PostMapping(value = "exchangeCoupon")
+	public HttpResponseResult exchangeCoupon(Integer couponId, Long paymentOrderId){
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed("用户信息获取失败");
+		}
+		return succeed(sysCouponCodeService.exchangeCoupon(sysUser.getId(), couponId, paymentOrderId));
+	}
+}

+ 105 - 0
mec-web/src/main/java/com/ym/mec/web/controller/SysCouponController.java

@@ -0,0 +1,105 @@
+package com.ym.mec.web.controller;
+
+import com.ym.mec.biz.dal.dao.SysCouponDao;
+import com.ym.mec.biz.dal.entity.SysCoupon;
+import com.ym.mec.biz.dal.page.SysCouponQueryInfo;
+import com.ym.mec.biz.service.SysCouponService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Objects;
+
+@RequestMapping("sysCoupon")
+@Api(tags = "优惠券")
+@RestController
+public class SysCouponController extends BaseController {
+
+	@Autowired
+	private SysCouponService sysCouponService;
+	@Autowired
+	private SysCouponDao sysCouponDao;
+
+	@ApiOperation("新增")
+	@PostMapping(value = "add")
+	@PreAuthorize("@pcs.hasPermissions('sysCoupon/add')")
+	public HttpResponseResult add(SysCoupon sysCoupon) {
+		sysCoupon.setStatus(0);
+		sysCoupon.setConsumeNum(0);
+		sysCoupon.setWarningStatus(0);
+		if(Objects.isNull(sysCoupon.getType())){
+			return failed("请指定优惠券类型");
+		}
+		switch (sysCoupon.getType()){
+			case DISCOUNT:
+				if(Objects.isNull(sysCoupon.getFaceValue())){
+					return failed("请指定折扣比例");
+				}
+				break;
+			case FULL_REDUCTION:
+				if(Objects.isNull(sysCoupon.getFaceValue())){
+					return failed("请指定优惠金额");
+				}
+				if(Objects.isNull(sysCoupon.getFullAmount())){
+					return failed("请指定达标金额");
+				}
+				break;
+			default:
+				return failed("请指定优惠券类型");
+		}
+		switch (sysCoupon.getEffectiveType()){
+			case DAYS:
+				if(Objects.isNull(sysCoupon.getDeadline())){
+					return failed("请指定有效天数");
+				}
+				break;
+			case TIME_BUCKET:
+				if(Objects.isNull(sysCoupon.getDeadline())){
+					return failed("请指定有效时间段");
+				}
+				break;
+			default:
+				return failed("请指定有效期类型");
+		}
+		SysCoupon sysCouponDaoWithName = sysCouponDao.getWithName(sysCoupon.getName());
+		if(Objects.nonNull(sysCouponDaoWithName)){
+			return failed("优惠券名称重复");
+		}
+		return succeed(sysCouponService.insert(sysCoupon));
+	}
+
+	@ApiOperation("修改")
+	@PostMapping(value = "updateCoupon")
+	@PreAuthorize("@pcs.hasPermissions('sysCoupon/updateCoupon')")
+	public HttpResponseResult updateCoupon(SysCoupon sysCoupon) {
+		sysCouponService.updateCoupon(sysCoupon);
+		return succeed();
+	}
+
+	@ApiOperation("删除")
+	@PostMapping(value = "delete")
+	@PreAuthorize("@pcs.hasPermissions('sysCoupon/delete')")
+	public HttpResponseResult del(Integer id) {
+		SysCoupon sysCoupon = sysCouponService.get(id);
+		if(Objects.isNull(sysCoupon)){
+			return failed("优惠券信息不存在");
+		}
+		if(sysCoupon.getConsumeNum()>0){
+			return failed("此优惠券已消耗,暂不可删除");
+		}
+		return succeed(sysCouponService.delete(id));
+	}
+
+	@ApiOperation("分页查询")
+	@PostMapping(value = "queryPage")
+	@PreAuthorize("@pcs.hasPermissions('sysCoupon/queryPage')")
+	public HttpResponseResult queryPage(SysCouponQueryInfo queryInfo) {
+		return succeed(sysCouponService.queryPage(queryInfo));
+	}
+}

+ 6 - 0
mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java

@@ -500,4 +500,10 @@ public class TaskController extends BaseController {
 	public void curWeekStudentTrainRemind(){
 	public void curWeekStudentTrainRemind(){
 		sysMusicCompareRecordService.curWeekStudentTrainRemind();
 		sysMusicCompareRecordService.curWeekStudentTrainRemind();
 	}
 	}
+
+	@ApiOperation("标记进行中乐团在读学员+VIP、网管有课学员总数(除弦乐声部、去重)")
+	@GetMapping(value = "/remarkCountFlag")
+	public void remarkCountFlag(){
+		studentService.remarkCountFlag();
+	}
 }
 }

+ 24 - 5
mec-web/src/main/java/com/ym/mec/web/controller/education/ActivityController.java

@@ -8,22 +8,23 @@ import com.ym.mec.biz.dal.dto.LuckStatisDto;
 import com.ym.mec.biz.dal.dto.OrderStatisDto;
 import com.ym.mec.biz.dal.dto.OrderStatisDto;
 import com.ym.mec.biz.dal.dto.OrganMaxAmountDto;
 import com.ym.mec.biz.dal.dto.OrganMaxAmountDto;
 import com.ym.mec.biz.dal.entity.Organization;
 import com.ym.mec.biz.dal.entity.Organization;
+import com.ym.mec.biz.dal.page.CloudTeacherActiveQueryInfo;
+import com.ym.mec.biz.service.OrganizationService;
+import com.ym.mec.biz.service.StudentService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.HttpResponseResult;
-
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
-
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RestController;
 
 
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.math.RoundingMode;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
 @RequestMapping("activity")
 @RequestMapping("activity")
@@ -36,6 +37,10 @@ public class ActivityController extends BaseController {
     private SporadicChargeInfoDao sporadicChargeInfoDao;
     private SporadicChargeInfoDao sporadicChargeInfoDao;
     @Autowired
     @Autowired
     private StudentRegistrationDao studentRegistrationDao;
     private StudentRegistrationDao studentRegistrationDao;
+    @Autowired
+    private OrganizationService organizationService;
+    @Autowired
+    private StudentService studentService;
 
 
     @ApiOperation(value = "分部双11活动统计")
     @ApiOperation(value = "分部双11活动统计")
     @GetMapping("/doubleEleven2020Statis")
     @GetMapping("/doubleEleven2020Statis")
@@ -103,4 +108,18 @@ public class ActivityController extends BaseController {
         luckStatisDto.setScale(totalMoney.multiply(new BigDecimal(100)).divide(totalMaxAmount, 2, BigDecimal.ROUND_HALF_UP));
         luckStatisDto.setScale(totalMoney.multiply(new BigDecimal(100)).divide(totalMaxAmount, 2, BigDecimal.ROUND_HALF_UP));
         return succeed(luckStatisDto);
         return succeed(luckStatisDto);
     }
     }
+
+    @ApiOperation(value = "云教练活动统计")
+    @GetMapping("/countCloudTeacherActive")
+    public Object countCloudTeacherActive(CloudTeacherActiveQueryInfo queryInfo) throws Exception {
+        List<Organization> organizations = organizationService.queryEmployeeOrgan(null);
+        List<Integer> organIds = new ArrayList<>();
+        if(StringUtils.isNotBlank(queryInfo.getOrganIds())){
+            organIds = Arrays.stream(queryInfo.getOrganIds().split(",")).map(id->Integer.valueOf(id)).collect(Collectors.toList());
+        }else if(!CollectionUtils.isEmpty(organizations)){
+            organIds = organizations.stream().map(Organization::getId).collect(Collectors.toList());
+        }
+        List<Integer> ids = organIds.stream().filter(id -> !OrganizationService.EXCLUDE_ORGAN_IDS.contains(id)).collect(Collectors.toList());
+        return succeed(studentService.countCloudTeacherActive(ids, queryInfo));
+    }
 }
 }