Browse Source

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VipCardRecordServiceImpl.java
liweifan 3 years ago
parent
commit
bc7f603f59
54 changed files with 823 additions and 259 deletions
  1. 2 2
      cooleshow-auth/auth-server/src/main/resources/config/mybatis/SysMenuMapper.xml
  2. 14 1
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/dal/entity/SysNewsType.java
  3. 9 3
      cooleshow-cms/src/main/resources/config/mybatis/SysNewsTypeMapper.xml
  4. 1 1
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderReturnApplyServiceImpl.java
  5. 4 0
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/PmsProductAttributeMapper.java
  6. 11 1
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/UserOrderPaymentMapper.java
  7. 12 0
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/PmsProduct.java
  8. 11 0
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/PmsProductAttributeValue.java
  9. 25 0
      cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/UserOrderPaymentMapper.xml
  10. 2 1
      cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/enums/PayChannelEnum.java
  11. 1 1
      cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/sdk/adapay/PaymentSdk.java
  12. 23 32
      cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/sdk/req/OrderPayReq.java
  13. 7 3
      cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/service/PaymentService.java
  14. 9 24
      cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/service/impl/AdapayPaymentServiceImpl.java
  15. 7 4
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsCartItemController.java
  16. 4 2
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderController.java
  17. 3 5
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderReturnApplyController.java
  18. 14 10
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/PaymentController.java
  19. 5 11
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/PmsPortalProductController.java
  20. 20 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dto/OmsReturnApplyQueryParam.java
  21. 90 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dto/ProductSearch.java
  22. 1 7
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsPortalOrderService.java
  23. 34 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/UserOrderPaymentService.java
  24. 3 2
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/HomeServiceImpl.java
  25. 18 39
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java
  26. 16 1
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/PmsPortalProductServiceImpl.java
  27. 53 1
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/UserOrderPaymentServiceImpl.java
  28. 4 2
      cooleshow-mall/mall-portal/src/main/resources/config/mybatis/PortalOrderDao.xml
  29. 5 3
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/SmsCodeController.java
  30. 5 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleDao.java
  31. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/TeacherFreeTimeDao.java
  32. 13 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicSheetSearch.java
  33. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/TeacherMusicSheetAuditSearch.java
  34. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageTypeEnum.java
  35. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleService.java
  36. 3 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SmsCodeService.java
  37. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SysMessageService.java
  38. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  39. 184 73
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  40. 14 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/SmsCodeServiceImpl.java
  41. 2 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/SysMessageServiceImpl.java
  42. 6 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonPurchaseRecordServiceImpl.java
  43. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VipCardRecordServiceImpl.java
  44. 25 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/DateChangeVo.java
  45. 24 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/DateVo.java
  46. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MyFens.java
  47. 31 5
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  48. 7 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml
  49. 4 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherFreeTimeMapper.xml
  50. 3 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  51. 6 3
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/SmsCodeController.java
  52. 5 3
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/SmsCodeController.java
  53. 6 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherCourseScheduleController.java
  54. 44 0
      toolset/utils/src/main/java/com/yonge/toolset/utils/date/DateUtil.java

+ 2 - 2
cooleshow-auth/auth-server/src/main/resources/config/mybatis/SysMenuMapper.xml

@@ -84,7 +84,7 @@
             <if test="name != null">
                 name_ = #{name},
             </if>
-            <if test="icon != null">
+            <if test="icon != null and icon != ''">
                 icon_ = #{icon},
             </if>
             <if test="component != null">
@@ -99,7 +99,7 @@
             <if test="hid != null">
                 hidden_ = #{hid},
             </if>
-            <if test="memo != null">
+            <if test="memo != null and memo != ''">
                 memo_ = #{memo},
             </if>
         </set>

+ 14 - 1
cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/dal/entity/SysNewsType.java

@@ -16,6 +16,9 @@ public class SysNewsType {
 	/**  */
 	@ApiModelProperty("名称")
 	private String name;
+
+	@ApiModelProperty("图片url")
+	private String url;
 	
 	/**  */
 	@ApiModelProperty("上级id")
@@ -33,7 +36,16 @@ public class SysNewsType {
 	
 	/**  */
 	private java.util.Date updateTime;
-	
+
+	public String getUrl() {
+		return url;
+	}
+
+	public void setUrl(String url) {
+		this.url = url;
+	}
+
+
 	public void setId(Long id){
 		this.id = id;
 	}
@@ -94,4 +106,5 @@ public class SysNewsType {
 	public void setOrder(Integer order) {
 		this.order = order;
 	}
+
 }

+ 9 - 3
cooleshow-cms/src/main/resources/config/mybatis/SysNewsTypeMapper.xml

@@ -9,6 +9,7 @@
 		<result column="parent_id_" property="parentId" />
 		<result column="del_flag_" property="delFlag" />
 		<result column="order_" property="order" />
+		<result column="url_" property="url" />
 		<result column="create_time_" property="createTime" />
 		<result column="update_time_" property="updateTime" />
 	</resultMap>
@@ -32,8 +33,8 @@
 	<insert id="insert" parameterType="com.yonge.cooleshow.cms.dal.entity.SysNewsType"
 		useGeneratedKeys="true" keyColumn="id" keyProperty="id">
 		INSERT INTO sys_news_type
-		(id_,name_,parent_id_,del_flag_,create_time_,update_time_,order_)
-		VALUES(#{id},#{name},#{parentId},#{delFlag},#{createTime},#{updateTime},#{order})
+		(id_,name_,parent_id_,del_flag_,create_time_,update_time_,order_,url_)
+		VALUES(#{id},#{name},#{parentId},#{delFlag},#{createTime},#{updateTime},#{order},#{url})
 	</insert>
 
 	<!-- 根据主键查询一条记录 -->
@@ -59,7 +60,10 @@
 				create_time_ = #{createTime},
 			</if>
 			<if test="order != null">
-				order_ = #{order}
+				order_ = #{order},
+			</if>
+			<if test="url != null">
+				url_ = #{url}
 			</if>
 		</set>
 		WHERE id_ = #{id}
@@ -109,6 +113,7 @@
 		snt.del_flag_ as sntDelFlag,
 		snt.create_time_ as createTime,
 		snt.update_time_ as updateTime,
+		snt.url_ as url,
 		sni.*
 		FROM sys_news_type snt
 		left join sys_news_information sni on sni.sub_type_ = snt.id_
@@ -128,6 +133,7 @@
 		<result column="sntOrder" property="order" />
 		<result column="sntDelFlag" property="delFlag" />
 		<result column="createTime" property="createTime" />
+		<result column="url" property="url" />
 		<result column="updateTime" property="updateTime" />
 
 		<collection property="newsInformationList"  ofType="com.yonge.cooleshow.cms.dal.entity.SysNewsInformation">

+ 1 - 1
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderReturnApplyServiceImpl.java

@@ -110,7 +110,7 @@ public class OmsOrderReturnApplyServiceImpl implements OmsOrderReturnApplyServic
      */
     private void refundAmount(OmsOrderReturnApply returnApply) {
         // 退款
-        UserOrderPayment userOrderPayment = userOrderPaymentMapper.selectByTranNo(returnApply.getOrderSn());
+        UserOrderPayment userOrderPayment = userOrderPaymentMapper.selectByOrderNoAndStatusSucceeded(returnApply.getOrderSn());
         OrderRefundReq refundReq = new OrderRefundReq();
         refundReq.setOrderNo(returnApply.getOrderSn());
         refundReq.setRefundAmount(returnApply.getReturnAmount().setScale(2, RoundingMode.HALF_UP).toString());

+ 4 - 0
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/PmsProductAttributeMapper.java

@@ -1,8 +1,12 @@
 package com.yonge.cooleshow.mbg.mapper;
 
+import com.yonge.cooleshow.mbg.model.PmsProduct;
 import com.yonge.cooleshow.mbg.model.PmsProductAttribute;
 import com.yonge.cooleshow.mbg.model.PmsProductAttributeExample;
+
 import java.util.List;
+
+import com.yonge.cooleshow.mbg.model.PmsProductAttributeValue;
 import org.apache.ibatis.annotations.Param;
 
 public interface PmsProductAttributeMapper {

+ 11 - 1
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/UserOrderPaymentMapper.java

@@ -1,6 +1,9 @@
 package com.yonge.cooleshow.mbg.mapper;
 
 import com.yonge.cooleshow.mbg.model.UserOrderPayment;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 public interface UserOrderPaymentMapper {
 
@@ -13,5 +16,12 @@ public interface UserOrderPaymentMapper {
     int updateByPrimaryKeySelective(UserOrderPayment userOrderPayment);
 
 
-    UserOrderPayment selectByOrderNo(String orderSn, String payChannel, String payStaus);
+    List<UserOrderPayment> selectByOrderNo(@Param("orderSn") String orderSn);
+
+    UserOrderPayment selectByOrderNoAndStatus(@Param("orderSn") String orderSn, @Param(
+            "payChannel") String payChannel, @Param("payStatus") String payStatus);
+
+    UserOrderPayment selectByOrderNoAndStatusPaying(@Param("orderSn") String orderSn);
+
+    UserOrderPayment selectByOrderNoAndStatusSucceeded(@Param("orderSn") String orderSn);
 }

+ 12 - 0
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/PmsProduct.java

@@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
+import java.util.List;
 
 public class PmsProduct implements Serializable {
     private Long id;
@@ -120,8 +121,19 @@ public class PmsProduct implements Serializable {
     @ApiModelProperty(value = "移动端网页详情")
     private String detailMobileHtml;
 
+    @ApiModelProperty("商品的sku库存信息")
+    private List<PmsSkuStock> skuStockList;
+
     private static final long serialVersionUID = 1L;
 
+    public List<PmsSkuStock> getSkuStockList() {
+        return skuStockList;
+    }
+
+    public void setSkuStockList(List<PmsSkuStock> skuStockList) {
+        this.skuStockList = skuStockList;
+    }
+
     public Long getId() {
         return id;
     }

+ 11 - 0
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/PmsProductAttributeValue.java

@@ -10,11 +10,22 @@ public class PmsProductAttributeValue implements Serializable {
 
     private Long productAttributeId;
 
+    @ApiModelProperty("属性名")
+    private String productAttributeName;
+
     @ApiModelProperty(value = "手动添加规格或参数的值,参数单值,规格有多个时以逗号隔开")
     private String value;
 
     private static final long serialVersionUID = 1L;
 
+    public String getProductAttributeName() {
+        return productAttributeName;
+    }
+
+    public void setProductAttributeName(String productAttributeName) {
+        this.productAttributeName = productAttributeName;
+    }
+
     public Long getId() {
         return id;
     }

+ 25 - 0
cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/UserOrderPaymentMapper.xml

@@ -226,4 +226,29 @@
         <include refid="Base_Column_List" />
       from user_order_payment where trans_no_ = #{orderNo} limit 1
     </select>
+
+    <select id="selectByOrderNo" resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List" />
+        from user_order_payment where order_no_ = #{orderSn}
+    </select>
+
+    <select id="selectByOrderNoAndStatusPaying" resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List" />
+        from user_order_payment where order_no_ = #{orderSn} and status_ = 'paying'
+    </select>
+
+    <select id="selectByOrderNoAndStatus" resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List" />
+        from user_order_payment where order_no_ = #{orderSn}
+        and status_ = #{payStatus} and pay_channel_ = #{payChannel}
+    </select>
+
+    <select id="selectByOrderNoAndStatusSucceeded" resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List" />
+        from user_order_payment where order_no_ = #{orderSn} and status_ = 'succeeded'
+    </select>
 </mapper>

+ 2 - 1
cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/enums/PayChannelEnum.java

@@ -8,7 +8,8 @@ package com.yonge.cooleshow.enums;
  */
 public enum PayChannelEnum {
     alipay("alipay","支付宝APP支付"),
-    wx_lite("wx_lite","微信APP支付")
+    wx_lite("wx_lite","微信小程序支付"),
+    alipay_lite("alipay_lite","支付宝小程序支付")
     ;
     private String code;
     private String msg;

+ 1 - 1
cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/sdk/adapay/PaymentSdk.java

@@ -221,7 +221,7 @@ public class PaymentSdk {
     /**
      *  查看退款订单
      *
-     * {
+     * @param {
      *     "status": "succeeded",
      *     "prod_mode": "true",
      *     "refunds": [

+ 23 - 32
cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/sdk/req/OrderPayReq.java

@@ -21,17 +21,20 @@ public class OrderPayReq {
     @ApiModelProperty(value = "订单号 ", required = true)
     private String orderNo;
     @NotNull(message = "支付渠道不能为空")
-    @ApiModelProperty(value = "支付渠道:  alipay 支付宝  wx_lite 微信 ", required = true)
+    @ApiModelProperty(value = "支付渠道:  alipay 支付宝APP支付 alipay_lite 支付宝小程序支付  wx_lite 微信小程序支付 ", required = true)
     private PayChannelEnum payChannel;
+    @ApiModelProperty(value = "微信用户openId(微信支付必传)")
+    private String openId;
+    @ApiModelProperty(value = "买家的支付宝用户 id(支付宝小程序支付必传)")
+    private String buyerId;
+    @ApiModelProperty(value = "用户说明 ")
+    private String reason;
+
+
     @ApiModelProperty(value = "用户id ")
     private Long userId;
     @ApiModelProperty(value = "用户端公网ip ")
     private String ipAddress;
-    @ApiModelProperty(value = "微信用户openId(微信支付必传)")
-    private String openId;
-
-    @ApiModelProperty(value = "订单状态",hidden = true)
-    private OrderStatusEnum orderStatus;
 
     @ApiModelProperty(value = "订单金额",hidden = true)
     private BigDecimal orderPrice;
@@ -45,32 +48,20 @@ public class OrderPayReq {
     @ApiModelProperty(value = "拉起支付信息",hidden = true)
     private String payInfo;
 
-    public void orderStatus(Integer orderStatus) {
-        if (orderStatus == 0) {
-            this.orderStatus = OrderStatusEnum.PAYING;
-        } else if (orderStatus == 1) {
-            this.orderStatus = OrderStatusEnum.PAID;
-        }else if (orderStatus == 2) {
-            this.orderStatus = OrderStatusEnum.CLOSE;
-        }else if (orderStatus == 3) {
-            this.orderStatus = OrderStatusEnum.CLOSE;
-        }else if (orderStatus == 4) {
-            this.orderStatus = OrderStatusEnum.CLOSE;
-        }else if (orderStatus == 5) {
-            this.orderStatus = OrderStatusEnum.CLOSE;
-        }else if (orderStatus == 6) {
-            this.orderStatus = OrderStatusEnum.WAIT_PAY;
-        } else {
-            this.orderStatus = OrderStatusEnum.CLOSE;
-        }
-    }
-
-    public OrderStatusEnum getOrderStatus() {
-        return orderStatus;
-    }
-
-    public void setOrderStatus(OrderStatusEnum orderStatus) {
-        this.orderStatus = orderStatus;
+    public String getBuyerId() {
+        return buyerId;
+    }
+
+    public void setBuyerId(String buyerId) {
+        this.buyerId = buyerId;
+    }
+
+    public String getReason() {
+        return reason;
+    }
+
+    public void setReason(String reason) {
+        this.reason = reason;
     }
 
     public BigDecimal getOrderPrice() {

+ 7 - 3
cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/service/PaymentService.java

@@ -23,10 +23,14 @@ public interface PaymentService {
      */
     OrderPayRes orderPay(OrderPayReq payReq);
 
-    OrderPayRes orderPayWaitPay(OrderPayReq payReq);
 
-
-    OrderPayRes orderPayPaying(OrderPayReq payReq);
+    /**
+     * 拉起原有支付信息,继续支付
+     *
+     * @param payReq
+     * @return
+     */
+    OrderPayRes orderContinue(OrderPayReq payReq);
 
     /**
      * 退款

+ 9 - 24
cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/service/impl/AdapayPaymentServiceImpl.java

@@ -39,21 +39,6 @@ public class AdapayPaymentServiceImpl implements PaymentService {
 
     @Override
     public OrderPayRes orderPay(OrderPayReq payReq) {
-        if (OrderStatusEnum.WAIT_PAY.equals(payReq.getOrderStatus())) {
-            //处于待支付状态,需要调用汇付发起付款请求接口
-            return orderPayWaitPay(payReq);
-        } else if (OrderStatusEnum.PAYING.equals(payReq.getOrderStatus())) {
-            //处于付款中状态,需要拉起付款接口返回信息,并且去到汇付
-            return orderPayPaying(payReq);
-        }
-        OrderPayRes orderPayRes = new OrderPayRes();
-        orderPayRes.setStatus(false);
-        orderPayRes.setMessage("订单状态异常");
-        return orderPayRes;
-    }
-
-    @Override
-    public OrderPayRes orderPayWaitPay(OrderPayReq payReq) {
         PaymentReq paymentReq = new PaymentReq();
         paymentReq.setOrder_no(payReq.getOrderNo());
         paymentReq.setPay_channel(payReq.getPayChannel().getCode());
@@ -68,7 +53,11 @@ public class AdapayPaymentServiceImpl implements PaymentService {
         //异步通知地址
         paymentReq.setNotify_url(HuifuConfiguration.getHuifuProperties().getNotifyUrl());
 
-        if (PayChannelEnum.wx_lite.equals(payReq.getPayChannel())) {
+        if (PayChannelEnum.alipay_lite.equals(payReq.getPayChannel())) {
+            Map<String, Object> expend = new HashMap<>();
+            expend.put("buyer_id", payReq.getBuyerId());
+            paymentReq.setExpend(expend);
+        } else if (PayChannelEnum.wx_lite.equals(payReq.getPayChannel())) {
             Map<String, Object> expend = new HashMap<>();
             expend.put("open_id", payReq.getOpenId());
             paymentReq.setExpend(expend);
@@ -99,15 +88,11 @@ public class AdapayPaymentServiceImpl implements PaymentService {
     }
 
     @Override
-    public OrderPayRes orderPayPaying(OrderPayReq payReq) {
+    public OrderPayRes orderContinue(OrderPayReq payReq) {
         OrderPayRes orderPayRes = new OrderPayRes();
-        if (OrderStatusEnum.PAYING.getCode().equals(payReq.getOrderStatus().getCode())) {
-            orderPayRes.setPay_info(payReq.getPayInfo());
-            orderPayRes.setPay_amt(payReq.getOrderPrice().toString());
-        } else {
-            orderPayRes.setStatus(false);
-            orderPayRes.setMessage("订单不处于支付状态中");
-        }
+        orderPayRes.setPay_info(payReq.getPayInfo());
+        orderPayRes.setPayChannel(payReq.getPayChannel().getCode());
+        orderPayRes.setPay_amt(payReq.getOrderPrice().setScale(2, RoundingMode.HALF_UP).toString());
         return orderPayRes;
     }
 

+ 7 - 4
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsCartItemController.java

@@ -6,6 +6,7 @@ import com.yonge.cooleshow.portal.domain.CartProduct;
 import com.yonge.cooleshow.portal.domain.CartPromotionItem;
 import com.yonge.cooleshow.portal.service.OmsCartItemService;
 import com.yonge.cooleshow.portal.service.UmsMemberService;
+import com.yonge.toolset.utils.string.StringUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -49,8 +50,9 @@ public class OmsCartItemController {
     @ApiOperation("获取当前会员的购物车列表,包括促销信息")
     @RequestMapping(value = "/list/promotion", method = RequestMethod.GET)
     @ResponseBody
-    public CommonResult<List<CartPromotionItem>> listPromotion(@RequestParam(required = false) List<Long> cartIds) {
-        List<CartPromotionItem> cartPromotionItemList = cartItemService.listPromotion(memberService.getCurrentMember().getId(), cartIds);
+    public CommonResult<List<CartPromotionItem>> listPromotion(@RequestParam(required = false) String cartIds) {
+        List<Long> list = StringUtil.toLongList(cartIds);
+        List<CartPromotionItem> cartPromotionItemList = cartItemService.listPromotion(memberService.getCurrentMember().getId(), list);
         return CommonResult.success(cartPromotionItemList);
     }
 
@@ -88,8 +90,9 @@ public class OmsCartItemController {
     @ApiOperation("删除购物车中的指定商品")
     @RequestMapping(value = "/delete", method = RequestMethod.POST)
     @ResponseBody
-    public CommonResult delete(@RequestParam("ids") List<Long> ids) {
-        int count = cartItemService.delete(memberService.getCurrentMember().getId(), ids);
+    public CommonResult delete(@RequestParam("ids") String ids) {
+        List<Long> list = StringUtil.toLongList(ids);
+        int count = cartItemService.delete(memberService.getCurrentMember().getId(), list);
         if (count > 0) {
             return CommonResult.success(count);
         }

+ 4 - 2
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderController.java

@@ -6,6 +6,7 @@ import com.yonge.cooleshow.portal.domain.ConfirmOrderResult;
 import com.yonge.cooleshow.portal.domain.OmsOrderDetail;
 import com.yonge.cooleshow.portal.domain.OrderParam;
 import com.yonge.cooleshow.portal.service.OmsPortalOrderService;
+import com.yonge.toolset.utils.string.StringUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;
@@ -30,8 +31,9 @@ public class OmsPortalOrderController {
     @ApiOperation("根据购物车信息生成确认单")
     @RequestMapping(value = "/generateConfirmOrder", method = RequestMethod.POST)
     @ResponseBody
-    public CommonResult<ConfirmOrderResult> generateConfirmOrder(@RequestBody List<Long> cartIds) {
-        ConfirmOrderResult confirmOrderResult = portalOrderService.generateConfirmOrder(cartIds);
+    public CommonResult<ConfirmOrderResult> generateConfirmOrder(@RequestParam String cartIds) {
+        List<Long> list = StringUtil.toLongList(cartIds);
+        ConfirmOrderResult confirmOrderResult = portalOrderService.generateConfirmOrder(list);
         return CommonResult.success(confirmOrderResult);
     }
 

+ 3 - 5
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderReturnApplyController.java

@@ -53,12 +53,10 @@ public class OmsPortalOrderReturnApplyController {
     }
 
     @ApiOperation("分页查询退货申请")
-    @RequestMapping(value = "/list", method = RequestMethod.GET)
+    @RequestMapping(value = "/list", method = RequestMethod.POST)
     @ResponseBody
-    public CommonResult<CommonPage<OmsOrderReturnApply>> list(OmsReturnApplyQueryParam queryParam,
-                                                              @RequestParam(value = "pageSize", defaultValue = "5") Integer pageSize,
-                                                              @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum) {
-        List<OmsOrderReturnApply> returnApplyList = returnApplyService.list(queryParam, pageSize, pageNum);
+    public CommonResult<CommonPage<OmsOrderReturnApply>> list(@RequestBody OmsReturnApplyQueryParam queryParam) {
+        List<OmsOrderReturnApply> returnApplyList = returnApplyService.list(queryParam, queryParam.getPageSize(), queryParam.getPageNum());
         return CommonResult.success(CommonPage.restPage(returnApplyList));
     }
 

+ 14 - 10
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/PaymentController.java

@@ -17,6 +17,7 @@ import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.utils.web.WebUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -112,22 +113,25 @@ public class PaymentController extends BaseController {
         payReq.setUserId(user.getId());
         payReq.setIpAddress(WebUtil.getRemoteIp(request));
 
-        Future<OrderPayRes> orderPayResFuture = DistributedLock.of(redissonClient)
-              .callIfLockCanGet(OrdeerCacherEnmu.LOCK_PAY_ORDER.getRedisKey(user.getId()),
-                                () -> portalOrderService.orderPay(payReq), 60L, TimeUnit.SECONDS);
-
+        RLock lock = redissonClient.getLock(OrdeerCacherEnmu.LOCK_PAY_ORDER.getRedisKey(user.getId()));
         try {
-            OrderPayRes orderPayRes = orderPayResFuture.get();
-            if (orderPayRes.isStatus()) {
-                return succeed(orderPayRes);
-            }  else {
-                return failed(orderPayRes.getMessage());
+            boolean b = lock.tryLock(60, TimeUnit.SECONDS);
+            if (b) {
+                OrderPayRes orderPayRes = portalOrderService.orderPay(payReq);
+                if (orderPayRes.isStatus()) {
+                    return succeed(orderPayRes);
+                }  else {
+                    return failed(orderPayRes.getMessage());
+                }
             }
+            return failed("请求超时");
         }catch (BizException e) {
             return failed(e.getMessage());
-        }catch (Exception e) {
+        } catch (Exception e) {
             e.printStackTrace();
             return HttpResponseResult.failed("付款失败");
+        }finally {
+            lock.unlock();
         }
     }
 }

+ 5 - 11
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/PmsPortalProductController.java

@@ -4,6 +4,7 @@ import com.yonge.cooleshow.mall.common.api.CommonPage;
 import com.yonge.cooleshow.mall.common.api.CommonResult;
 import com.yonge.cooleshow.mbg.model.PmsProduct;
 import com.yonge.cooleshow.portal.domain.PmsPortalProductDetail;
+import com.yonge.cooleshow.portal.dto.ProductSearch;
 import com.yonge.cooleshow.portal.dto.ProductSearchConditionVo;
 import com.yonge.cooleshow.portal.service.PmsPortalProductService;
 import io.swagger.annotations.Api;
@@ -28,18 +29,11 @@ public class PmsPortalProductController {
     private PmsPortalProductService portalProductService;
 
     @ApiOperation(value = "综合搜索、筛选、排序")
-    @ApiImplicitParam(name = "sort", value = "排序字段:0->按相关度;1->按新品;2->按销量;3->价格从低到高;4->价格从高到低",
-            defaultValue = "0", allowableValues = "0,1,2,3,4", paramType = "query", dataType = "integer")
-    @RequestMapping(value = "/search", method = RequestMethod.GET)
+    @RequestMapping(value = "/search", method = RequestMethod.POST)
     @ResponseBody
-    public CommonResult<CommonPage<PmsProduct>> search(@RequestParam(required = false) String keyword,
-                                                       @RequestParam(required = false) Long brandId,
-                                                       @RequestParam(required = false) Long productCategoryId,
-                                                       @RequestParam(required = false) Long productAttributeCategoryId,
-                                                       @RequestParam(required = false, defaultValue = "0") Integer pageNum,
-                                                       @RequestParam(required = false, defaultValue = "5") Integer pageSize,
-                                                       @RequestParam(required = false, defaultValue = "0") Integer sort) {
-        List<PmsProduct> productList = portalProductService.search(keyword, brandId, productCategoryId,productAttributeCategoryId, pageNum, pageSize, sort);
+    public CommonResult<CommonPage<PmsProduct>> search(@RequestBody ProductSearch search) {
+        List<PmsProduct> productList = portalProductService.search(search.getKeyword(),search.getBrandId(),search.getProductCategoryId(),
+                       search.getProductAttributeCategoryId(), search.getPageNum(), search.getPageSize(), search.getSort());
         return CommonResult.success(CommonPage.restPage(productList));
     }
 

+ 20 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dto/OmsReturnApplyQueryParam.java

@@ -22,6 +22,26 @@ public class OmsReturnApplyQueryParam {
     @ApiModelProperty(value = "处理时间")
     private String handleTime;
 
+
+    private Integer pageSize;
+    private Integer pageNum;
+
+    public Integer getPageSize() {
+        return pageSize;
+    }
+
+    public void setPageSize(Integer pageSize) {
+        this.pageSize = pageSize;
+    }
+
+    public Integer getPageNum() {
+        return pageNum;
+    }
+
+    public void setPageNum(Integer pageNum) {
+        this.pageNum = pageNum;
+    }
+
     public Long getId() {
         return id;
     }

+ 90 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dto/ProductSearch.java

@@ -0,0 +1,90 @@
+package com.yonge.cooleshow.portal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import org.springframework.web.bind.annotation.RequestParam;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-05-13
+ */
+public class ProductSearch {
+
+    @ApiModelProperty("名称搜索")
+    private String keyword;
+
+    @ApiModelProperty("品牌id")
+    private Long brandId;
+
+    @ApiModelProperty("商品分类id")
+    private Long productCategoryId;
+
+    @ApiModelProperty("商品类型id")
+    private Long productAttributeCategoryId;
+
+    @ApiModelProperty("")
+    private Integer pageNum = 1;
+
+    @ApiModelProperty("")
+    private Integer pageSize= 5;
+
+    @ApiModelProperty("")
+    private Integer sort = 0;
+
+    public String getKeyword() {
+        return keyword;
+    }
+
+    public void setKeyword(String keyword) {
+        this.keyword = keyword;
+    }
+
+    public Long getBrandId() {
+        return brandId;
+    }
+
+    public void setBrandId(Long brandId) {
+        this.brandId = brandId;
+    }
+
+    public Long getProductCategoryId() {
+        return productCategoryId;
+    }
+
+    public void setProductCategoryId(Long productCategoryId) {
+        this.productCategoryId = productCategoryId;
+    }
+
+    public Long getProductAttributeCategoryId() {
+        return productAttributeCategoryId;
+    }
+
+    public void setProductAttributeCategoryId(Long productAttributeCategoryId) {
+        this.productAttributeCategoryId = productAttributeCategoryId;
+    }
+
+    public Integer getPageNum() {
+        return pageNum;
+    }
+
+    public void setPageNum(Integer pageNum) {
+        this.pageNum = pageNum;
+    }
+
+    public Integer getPageSize() {
+        return pageSize;
+    }
+
+    public void setPageSize(Integer pageSize) {
+        this.pageSize = pageSize;
+    }
+
+    public Integer getSort() {
+        return sort;
+    }
+
+    public void setSort(Integer sort) {
+        this.sort = sort;
+    }
+}

+ 1 - 7
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsPortalOrderService.java

@@ -44,7 +44,7 @@ public interface OmsPortalOrderService {
      * 取消单个超时订单
      */
     @Transactional
-    void cancelOrder(Long orderId, String message);
+    void cancelOrder(Long orderId,  String message);
 
     /**
      * 发送延迟消息取消订单
@@ -75,14 +75,8 @@ public interface OmsPortalOrderService {
     void deleteOrder(Long orderId);
 
     /**
-     *
-     * @param data
-     * @param type
-     */    /**
      * 订单拉起支付
      *
-     * @param payReq 支付信息
-     * @return
      */
     @Transactional
     void orderCallback(String data, String type);

+ 34 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/UserOrderPaymentService.java

@@ -4,6 +4,8 @@ import com.yonge.cooleshow.enums.PayChannelEnum;
 import com.yonge.cooleshow.enums.PayStatusEnum;
 import com.yonge.cooleshow.mbg.model.UserOrderPayment;
 
+import java.util.List;
+
 /**
  * Description
  *
@@ -31,4 +33,36 @@ public interface UserOrderPaymentService {
 
     UserOrderPayment getByOrderNo(String orderSn, PayChannelEnum payChannel, PayStatusEnum pending);
 
+    /**
+     * 根据订单查询 订单支付信息
+     *
+     * @param orderSn 订单号
+     * @return
+     */
+    List<UserOrderPayment> getByOrderNo(String orderSn);
+
+    /**
+     * 关单
+     *
+     * @param orderSn 订单号
+     * @param message 信息
+     */
+    void closePayment(String orderSn, String message);
+
+    /**
+     * 查询支付中的订单, 最多只有一个
+     *
+     * @param orderSn
+     * @return
+     */
+    UserOrderPayment getByOrderNoAndStatusPaying(String orderSn);
+
+
+    /**
+     * 查询支付成功的订单, 最多只有一个
+     *
+     * @param orderSn
+     * @return
+     */
+    UserOrderPayment getByOrderNoAndStatusSucceeded(String orderSn);
 }

+ 3 - 2
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/HomeServiceImpl.java

@@ -77,6 +77,7 @@ public class HomeServiceImpl implements HomeService {
     }
 
     private List<PmsProduct> getHotProductList() {
+        PageHelper.startPage(1, 3);
         PmsProductExample example = new PmsProductExample();
         example.setOrderByClause("sort desc");
         example.createCriteria().andDeleteStatusEqualTo(0)
@@ -95,7 +96,7 @@ public class HomeServiceImpl implements HomeService {
     }
 
     private  List<PmsProductAttributeCategory>  getHomeProductAttributeCategory() {
-        PageHelper.startPage(1, 4);
+        PageHelper.startPage(1, 10);
         PmsProductAttributeCategoryExample example = new PmsProductAttributeCategoryExample();
         example.setOrderByClause("id desc");
         List<PmsProductAttributeCategory> pmsProductCategories = productAttributeCategoryMapper.selectByExample(example);
@@ -107,7 +108,7 @@ public class HomeServiceImpl implements HomeService {
 
 
     private List<ProductCategorySmallVo> getHomeProductCategoryList() {
-        PageHelper.startPage(1, 4);
+        PageHelper.startPage(1, 10);
         PmsProductCategoryExample example = new PmsProductCategoryExample();
         example.setOrderByClause("sort desc");
         example.createCriteria().andParentIdEqualTo(0L)

+ 18 - 39
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java

@@ -327,26 +327,9 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
                 UmsMember member = memberService.getById(cancelOrder.getMemberId());
                 memberService.updateIntegration(cancelOrder.getMemberId(), member.getIntegration() + cancelOrder.getUseIntegration());
             }
-            UserOrderPayment orderPayment = userOrderPaymentService.getByTranNo(cancelOrder.getOrderSn());
-            if (null != orderPayment) {
-                // 发起关单
-                OrderCloseReq orderCloseReq = new OrderCloseReq();
-                orderCloseReq.setPaymentId(orderPayment.getTransNo());
-                orderCloseReq.setReason(message);
-                OrderCloseRes closeRes = adapayPaymentService.orderClose(orderCloseReq);
-                if (closeRes.isStatus()) {
-                    orderPayment.setCloseStatus(PayStatusEnum.pending.getCode());
-                } else {
-                    orderPayment.setCloseStatus(PayStatusEnum.failed.getCode());
-                    orderPayment.setCloseFailMsg(closeRes.getFailMsg());
-                }
+            // 发起关单
+            userOrderPaymentService.closePayment(cancelOrder.getOrderSn(),message);
 
-                //更新付款单
-                orderPayment.setStatus(PayStatusEnum.failed.getCode());
-                orderPayment.setPayFailMsg(message);
-                orderPayment.setUpdateTime(new Date());
-                userOrderPaymentService.saveOrUpdate(orderPayment);
-            }
         }
     }
 
@@ -479,16 +462,20 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             orderPayRes.setMessage("订单已付款或已关闭");
             return orderPayRes;
         }
+        payReq.setOrderPrice(detail.getPayAmount());
         UserOrderPayment userOrderPayment = userOrderPaymentService
                 .getByOrderNo(detail.getOrderSn(), payReq.getPayChannel(), PayStatusEnum.pending);
-        payReq.orderStatus(detail.getStatus());
-        payReq.setOrderNo(detail.getOrderSn());
-        payReq.setOrderPrice(detail.getPayAmount());
-        payReq.setGoodTitle("");
-        payReq.setGoodDesc("");
-        if (userOrderPayment != null) {
+
+        if (userOrderPayment == null) {
+            // 支付订单号
+            payReq.setOrderNo(generateOrderSn(detail));
+        }else {
+            // 拉起原有的支付
             payReq.setPayInfo(userOrderPayment.getPayInfo());
+            return adapayPaymentService.orderContinue(payReq);
         }
+        payReq.setGoodTitle("酷乐秀商城订单编号-" + detail.getOrderSn());
+        payReq.setGoodDesc("酷乐秀商城订单编号-" + detail.getOrderSn());
         // 支付中的返回拉起信息
         orderPayRes = adapayPaymentService.orderPay(payReq);
         if (!orderPayRes.isStatus()) {
@@ -500,12 +487,6 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             cancelOrder(detail.getId(),"订单金额和实际支付金额不符");
             throw new BizException("订单金额和实际支付金额不符");
         }
-        // 订单状态和付款状态都是付款中,直接返回付款拉起信息
-        if (OrderStatusEnum.PAYING.getCode().equals(payReq.getOrderStatus().getCode())
-                && PayStatusEnum.pending.getCode().equals(orderPayRes.getPayStatus().getCode())) {
-            return orderPayRes;
-        }
-
 
         OmsOrder omsOrder = new OmsOrder();
         omsOrder.setId(detail.getId());
@@ -513,10 +494,9 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             omsOrder.setStatus(0);
             orderMapper.updateByPrimaryKeySelective(omsOrder);
             // 保存订单支付表
-            if (userOrderPayment == null) {
-                userOrderPayment = new UserOrderPayment();
-            }
-            userOrderPayment.setOrderNo(orderPayRes.getOrderNo());
+            userOrderPayment = new UserOrderPayment();
+            userOrderPayment.setOrderNo(detail.getOrderSn());
+            userOrderPayment.setAdapayNo(orderPayRes.getOrderNo());
             userOrderPayment.setPayChannel(orderPayRes.getPayChannel());
             userOrderPayment.setTransNo(orderPayRes.getTransNo());
             userOrderPayment.setPayAmt(new BigDecimal(orderPayRes.getPay_amt()));
@@ -635,9 +615,9 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
     @Transactional(rollbackFor = Exception.class)
     void payingOrderHandle(OmsOrder userOrder) {
         //判断汇付订单状态
-        UserOrderPayment orderPayment = userOrderPaymentService.getByTranNo(userOrder.getOrderSn());
+        UserOrderPayment orderPayment = userOrderPaymentService.getByOrderNoAndStatusPaying(userOrder.getOrderSn());
         if (null == orderPayment) {
-            return;
+            cancelOrder(userOrder.getId(), "支付超时");
         }
         try {
             Map<String, Object> resMap = paymentSdk.queryPayment(orderPayment.getTransNo());
@@ -659,14 +639,13 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
     /**
      * 订单完成
      *
-     * @author liweifan
      * @param: detail
      * @updateTime 2022/4/13 17:17
      */
     @Transactional(rollbackFor = Exception.class)
     void orderSuccess(OmsOrder detail, JSONObject hfRes) {
         //更新订单
-        UserOrderPayment orderPayment = userOrderPaymentService.getByTranNo(detail.getOrderSn());
+        UserOrderPayment orderPayment = userOrderPaymentService.getByOrderNoAndStatusPaying(detail.getOrderSn());
         if (orderPayment.getPayChannel().equals("alipay")) {
             paySuccess(detail.getId(),1);
         } else if (orderPayment.getPayChannel().equals("wx_lite")) {

+ 16 - 1
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/PmsPortalProductServiceImpl.java

@@ -18,6 +18,7 @@ import org.springframework.util.CollectionUtils;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -76,7 +77,21 @@ public class PmsPortalProductServiceImpl implements PmsPortalProductService {
         } else if (sort == 4) {
             example.setOrderByClause("price desc");
         }
-        return productMapper.selectByExample(example);
+        List<PmsProduct> pmsProducts = productMapper.selectByExample(example);
+        List<Long> productIdList = pmsProducts.stream().map(PmsProduct::getId).collect(Collectors.toList());
+        if (CollectionUtils.isEmpty(productIdList)) {
+            return pmsProducts;
+        }
+        PmsSkuStockExample skuExample = new PmsSkuStockExample();
+        skuExample.createCriteria().andProductIdIn(productIdList);
+        List<PmsSkuStock> skuStockList = skuStockMapper.selectByExample(skuExample);
+        Map<Long, List<PmsSkuStock>> collect = skuStockList.stream()
+                                                           .collect(Collectors.groupingBy(PmsSkuStock::getProductId));
+        for (PmsProduct pmsProduct : pmsProducts) {
+            pmsProduct.setSkuStockList(collect.get(pmsProduct.getId()));
+        }
+        return pmsProducts;
+
     }
 
     @Override

+ 53 - 1
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/UserOrderPaymentServiceImpl.java

@@ -5,9 +5,16 @@ import com.yonge.cooleshow.enums.PayStatusEnum;
 import com.yonge.cooleshow.mbg.mapper.UserOrderPaymentMapper;
 import com.yonge.cooleshow.mbg.model.UserOrderPayment;
 import com.yonge.cooleshow.portal.service.UserOrderPaymentService;
+import com.yonge.cooleshow.sdk.req.OrderCloseReq;
+import com.yonge.cooleshow.sdk.res.OrderCloseRes;
+import com.yonge.cooleshow.service.PaymentService;
+import com.yonge.toolset.utils.string.StringUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.Date;
+import java.util.List;
+
 /**
  * Description
  *
@@ -20,6 +27,9 @@ public class UserOrderPaymentServiceImpl implements UserOrderPaymentService {
     @Autowired
     private UserOrderPaymentMapper userOrderPaymentMapper;
 
+    @Autowired
+    private PaymentService adapayPaymentService;
+
     @Override
     public UserOrderPayment getByTranNo(String orderNo) {
         return userOrderPaymentMapper.selectByTranNo(orderNo);
@@ -42,6 +52,48 @@ public class UserOrderPaymentServiceImpl implements UserOrderPaymentService {
     @Override
     public UserOrderPayment getByOrderNo(String orderSn, PayChannelEnum payChannel, PayStatusEnum payStatus) {
 
-        return userOrderPaymentMapper.selectByOrderNo(orderSn,payChannel.getCode(),payStatus.getCode());
+        return userOrderPaymentMapper.selectByOrderNoAndStatus(orderSn,payChannel.getCode(),payStatus.getCode());
+    }
+
+    @Override
+    public List<UserOrderPayment> getByOrderNo(String orderSn) {
+        return userOrderPaymentMapper.selectByOrderNo(orderSn);
+    }
+
+    @Override
+    public void closePayment(String orderSn, String message) {
+        UserOrderPayment orderPayment = userOrderPaymentMapper.selectByOrderNoAndStatusPaying(orderSn);
+
+        if (orderPayment != null) {
+            //更新付款单
+            orderPayment.setStatus(PayStatusEnum.failed.getCode());
+            orderPayment.setPayFailMsg(StringUtil.isEmpty(message) ? "交易取消" : message);
+            orderPayment.setUpdateTime(new Date());
+
+            //发送支付关单请求
+            if (!StringUtil.isEmpty(orderPayment.getTransNo())) {
+                OrderCloseReq orderCloseReq = new OrderCloseReq();
+                orderCloseReq.setPaymentId(orderPayment.getTransNo());
+                orderCloseReq.setReason(message);
+                OrderCloseRes closeRes = adapayPaymentService.orderClose(orderCloseReq);
+                if (!closeRes.isStatus()) {
+                    orderPayment.setCloseStatus(PayStatusEnum.failed.getCode());
+                    orderPayment.setCloseFailMsg(closeRes.getFailMsg());
+                } else {
+                    orderPayment.setCloseStatus(PayStatusEnum.pending.getCode());
+                }
+            }
+            userOrderPaymentMapper.updateByPrimaryKeySelective(orderPayment);
+        }
+    }
+
+    @Override
+    public UserOrderPayment getByOrderNoAndStatusPaying(String orderSn) {
+        return userOrderPaymentMapper.selectByOrderNoAndStatusPaying(orderSn);
+    }
+
+    @Override
+    public UserOrderPayment getByOrderNoAndStatusSucceeded(String orderSn) {
+        return userOrderPaymentMapper.selectByOrderNoAndStatusSucceeded(orderSn);
     }
 }

+ 4 - 2
cooleshow-mall/mall-portal/src/main/resources/config/mybatis/PortalOrderDao.xml

@@ -18,7 +18,8 @@
             ot.product_name ot_product_name,
             ot.product_sku_id ot_product_sku_id,
             ot.product_sku_code ot_product_sku_code,
-            ot.product_quantity ot_product_quantity
+            ot.product_quantity ot_product_quantity,
+        o.status
         FROM
             oms_order o
             LEFT JOIN oms_order_item ot ON o.id = ot.order_id
@@ -38,7 +39,8 @@
             ot.product_name     ot_product_name,
             ot.product_sku_id   ot_product_sku_id,
             ot.product_sku_code ot_product_sku_code,
-            ot.product_quantity ot_product_quantity
+            ot.product_quantity ot_product_quantity,
+            o.status
         FROM
             oms_order o
             LEFT JOIN oms_order_item ot ON o.id = ot.order_id

+ 5 - 3
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/SmsCodeController.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.admin.controller;
 
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -36,10 +37,11 @@ public class SmsCodeController extends BaseController {
     private RedisTemplate<String,String> redisTemplate;
 
     @ApiOperation(value = "发送登录短信验证码")
-    @ApiImplicitParam(name = "mobile", value = "手机号", required = true, dataType = "String")
+    @ApiImplicitParams({  @ApiImplicitParam(name = "mobile", value = "手机号", required = true, dataType = "String"),
+                          @ApiImplicitParam(name = "type", value = "类型(PASSWD:修改密码,LOGIN:登录,REGISTER:注册)", required = true, dataType = "String") })
     @PostMapping(value = "/sendSmsCode")
-    public Object sendLoginVerifyCode(String mobile) throws Exception {
-        smsCodeService.sendValidCode(mobile);
+    public Object sendLoginVerifyCode(String mobile,String type) throws Exception {
+        smsCodeService.sendValidCode(mobile, type, ClientEnum.SYSTEM);
         return succeed();
     }
 

+ 5 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleDao.java

@@ -136,8 +136,11 @@ public interface CourseScheduleDao extends BaseMapper<CourseSchedule> {
     //学生端-首页-最近一堂课
     StudentHomePage.RecentCourses selectRecentCourses(Long studentId);
 
-    //老师端-首页-最近一堂课
-    StudentHomePage.RecentCourses selectRecentCoursesTeacher(Long teacherId);
+    //老师端-首页-最近一堂课(陪练课)
+    StudentHomePage.RecentCourses selectRecentCoursesPractice(Long teacherId);
+
+    //老师端-首页-最近一堂课(直播课)
+    StudentHomePage.RecentCourses selectRecentCoursesLive(Long teacherId);
 
     /**
      * 本周剩余的课时

+ 3 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/TeacherFreeTimeDao.java

@@ -58,5 +58,8 @@ public interface TeacherFreeTimeDao extends BaseMapper<TeacherFreeTime> {
 
     //查询老师所有声部配置
     List<TeacherSubjectPrice> selectPriceByTeacherId(Long teacherId);
+
+    //查询过审老师配置默认
+    List<TeacherFreeTime> getTeacherFreeTime();
 }
 

+ 13 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicSheetSearch.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.dto.search;
 
 import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
+import com.yonge.cooleshow.biz.dal.enums.ChargeTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.YesOrNoEnum;
 import com.yonge.toolset.base.page.QueryInfo;
@@ -50,6 +51,18 @@ public class MusicSheetSearch  extends QueryInfo{
     @ApiModelProperty(value = "假删除 false : 未删除 true:已删除",hidden = true)
     private Boolean delFlag = false;
 
+    @ApiModelProperty(value = "收费类型(FREE:免费;VIP:会员;CHARGE:单曲收费)")
+    private ChargeTypeEnum chargeType;  //收费类型(0:免费;1:会员;2:单曲收费)
+
+
+    public ChargeTypeEnum getChargeType() {
+        return chargeType;
+    }
+
+    public void setChargeType(ChargeTypeEnum chargeType) {
+        this.chargeType = chargeType;
+    }
+
     public String getIdAndName() {
         return idAndName;
     }

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/TeacherMusicSheetAuditSearch.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.dto.search;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
+import com.yonge.cooleshow.biz.dal.enums.ChargeTypeEnum;
 import com.yonge.toolset.base.page.QueryInfo;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -35,6 +36,8 @@ public class TeacherMusicSheetAuditSearch extends QueryInfo{
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date endTime;
 
+    @ApiModelProperty(value = "收费类型(FREE:免费;VIP:会员;CHARGE:单曲收费)")
+    private ChargeTypeEnum chargeType;  //收费类型(0:免费;1:会员;2:单曲收费)
 
     @ApiModelProperty(value = "审核状态  UNPAALY、未申请 DOING、审核中 PASS、通过 UNPASS、不通过")
     private AuthStatusEnum authStatus;
@@ -42,6 +45,14 @@ public class TeacherMusicSheetAuditSearch extends QueryInfo{
     @ApiModelProperty(value = "假删除 0 : 未删除 1:已删除",hidden = true)
     private Boolean delFlag = false;
 
+    public ChargeTypeEnum getChargeType() {
+        return chargeType;
+    }
+
+    public void setChargeType(ChargeTypeEnum chargeType) {
+        this.chargeType = chargeType;
+    }
+
     public String getIdAndName() {
         return idAndName;
     }

+ 3 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageTypeEnum.java

@@ -7,6 +7,9 @@ import com.yonge.toolset.base.enums.BaseEnum;
 
 public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     SMS_VERIFY_CODE_LOGIN("SMS_VERIFY_CODE_LOGIN", "验证码登录"),
+    SMS_VERIFY_CODE_REGISTER("SMS_VERIFY_CODE_REGISTER", "验证码注册"),
+    SMS_VERIFY_CODE_UPDATE_PSW("SMS_VERIFY_CODE_UPDATE_PSW", "密码修改"),
+    SMS_VERIFY_CODE("SMS_VERIFY_CODE","验证码"),
     KAPTCHA_SESSION_KEY("KAPTCHA_SESSION_KEY", "登录图形验证码"),
     STUDENT_BUY_TEACHER_MUSIC_SHEET("STUDENT_BUY_TEACHER_MUSIC_SHEET","学员购买老师乐谱"),
     MUSIC_SHEET_AUTH_PASS("MUSIC_SHEET_AUTH_PASS","乐谱审核通过"),

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleService.java

@@ -232,5 +232,6 @@ public interface CourseScheduleService extends IService<CourseSchedule> {
     void sendTodayNotRepliedAndNotDecorateHomework();
 
     Map<String, String> selectRoomConfig();
+    void test();
 }
 

+ 3 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SmsCodeService.java

@@ -1,5 +1,7 @@
 package com.yonge.cooleshow.biz.dal.service;
 
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+
 public interface SmsCodeService {
 
 	/**
@@ -14,5 +16,5 @@ public interface SmsCodeService {
 	 * 发送登录验证码
 	 * @return
 	 */
-	boolean sendValidCode(String mobile) throws Exception;
+	boolean sendValidCode(String mobile, String type, ClientEnum platform) throws Exception;
 }

+ 2 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SysMessageService.java

@@ -84,9 +84,10 @@ public interface SysMessageService extends BaseService<Long, SysMessage> {
 	 * @param userId 用户编号
 	 * @param messageType 消息类型
 	 * @param receiver 消息接受者
+	 * @param platform
 	 * @return
 	 */
-	public boolean sendSecurityCode(MessageSender messageSender, Long userId, MessageTypeEnum messageType, String receiver);
+	public boolean sendSecurityCode(MessageSender messageSender, Long userId, MessageTypeEnum messageType, String receiver, String platform);
 
 	/**
 	 * 获取已经发送的验证码

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java

@@ -774,7 +774,7 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
             Map<Long, String> teacherReceivers = new HashMap<>();
             teacherReceivers.put(teacherInfo.getId(), teacherInfo.getPhone());
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, studentBuyLive,
-                    teacherReceivers, null, 0, studentBuyLiveUrl, ClientEnum.TEACHER.getCode(),
+                    teacherReceivers, null, 0, studentBuyLiveUrl +courseGroup.getId() , ClientEnum.TEACHER.getCode(),
                     studentInfo.getUsername(), courseGroup.getName() );
             log.info("buyLiveCourseSuccess buyLiveSendMessage STUDENT_BUY_LIVE ok");
 

+ 184 - 73
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -11,10 +12,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.collect.Lists;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
-import com.yonge.cooleshow.biz.dal.dao.CourseScheduleDao;
-import com.yonge.cooleshow.biz.dal.dao.CourseScheduleRepliedDao;
-import com.yonge.cooleshow.biz.dal.dao.CourseScheduleStudentPaymentDao;
-import com.yonge.cooleshow.biz.dal.dao.TeacherFreeTimeDao;
+import com.yonge.cooleshow.biz.dal.dao.*;
 import com.yonge.cooleshow.biz.dal.dto.PracticeScheduleDto;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.dto.search.HomeworkSearch;
@@ -36,7 +34,9 @@ import com.yonge.toolset.utils.date.DateUtil;
 import com.yonge.toolset.utils.obj.ObjectUtil;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.redisson.api.RLock;
 import org.redisson.api.RMap;
+import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -49,6 +49,7 @@ import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.temporal.TemporalAdjusters;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.function.BiConsumer;
 import java.util.function.BiFunction;
 import java.util.function.Function;
@@ -68,6 +69,8 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
     private final static Logger log = LoggerFactory.getLogger(CourseScheduleServiceImpl.class);
 
     @Autowired
+    private RedissonClient redissonClient;
+    @Autowired
     private SysUserFeignService sysUserFeignService;
     @Autowired
     private HolidaysFestivalsService holidaysFestivalsService;
@@ -89,6 +92,8 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
     private TeacherFreeTimeDao teacherFreeTimeDao;
     @Autowired
     private SysMessageService sysMessageService;
+    @Autowired
+    private HolidaysFestivalsDao holidaysFestivalsDao;
 
     @Override
     public CourseScheduleDao getDao() {
@@ -663,7 +668,9 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
             }
 
             if (replied == 1) {
-                search.setRepliedIds(studentList);
+                if (CollectionUtils.isEmpty(studentList)) {
+                    search.setRepliedIds(null);
+                } else search.setRepliedIds(studentList);
             }
         }
         return page.setRecords(baseMapper.queryTeacherPracticeCourse(page, monthToDate(search)));
@@ -896,66 +903,77 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         //批量检查学生课时在数据库是否重复
         batchCheckStudentCourseTime(studentId, dateList, CourseScheduleDate::getStartTime, CourseScheduleDate::getEndTime);
 
-        String orderNo = orderReqInfo.getOrderNo();
-        scheduleDto.setType(CourseScheduleEnum.PRACTICE.getCode());
-        scheduleDto.setStatus(CourseGroupEnum.ING.getCode());
-        scheduleDto.setMixStudentNum(1);
-        scheduleDto.setStudentId(studentId);
-
-        //写入course_group
-        baseMapper.addCourseGroup(scheduleDto);
-        Long groupId = scheduleDto.getGroupId();
-
-        //根据老师id获取默认配置声部原价
-        TeacherSubjectPrice teacherSubjectPrice = teacherFreeTimeDao.selectSubjectPrice(scheduleDto.getTeacherId(), scheduleDto.getSubjectId());
-        BigDecimal subjectPrice = teacherSubjectPrice.getSubjectPrice();
-
-        //每课实际价格
-        Map<Integer, BigDecimal> courseAveragePrice = WrapperUtil.getAveragePrice(scheduleDto.getCourseNum(), scheduleDto.getCoursePrice());
-
-        List<CourseScheduleDate> classTime = scheduleDto.getClassTime();
-        for (int i = 0; i < classTime.size(); i++) {
-            CourseScheduleDate date = classTime.get(i);
-            CourseSchedule schedule = new CourseSchedule();
-            schedule.setClassDate(date.getClassDate());
-            schedule.setStartTime(date.getStartTime());
-            schedule.setEndTime(date.getEndTime());
-            schedule.setCourseGroupId(groupId);
-            schedule.setType(CourseScheduleEnum.PRACTICE.getCode());
-            schedule.classNum(i + 1);
-            schedule.setTeacherId(scheduleDto.getTeacherId());
-            schedule.setLock(1);
-            schedule.setStatus(CourseScheduleEnum.NOT_START.getCode());
-            schedule.setCreatedBy(scheduleDto.getStudentId());
-            //写入course_schedule
-            baseMapper.insert(schedule);
-
-            Long scheduleId = schedule.getId();
-            CourseScheduleStudentPayment payment = new CourseScheduleStudentPayment();
-            payment.setUserId(scheduleDto.getStudentId());
-            payment.setCourseId(scheduleId);
-            payment.setCourseGroupId(groupId);
-            payment.setCourseType(CourseScheduleEnum.PRACTICE.getCode());
-            payment.setOrderNo(orderNo);
-            payment.setOriginalPrice(subjectPrice);//原价
-            payment.setExpectPrice(subjectPrice);//预计价格
-            payment.setActualPrice(courseAveragePrice.get(i + 1));//实际价格
-            //写入course_schedule_student_payment
-            courseScheduleStudentPaymentService.save(payment);
-        }
+        RLock lock = redissonClient.getLock("buyPractice:teacherId:" + scheduleDto.getTeacherId());
+        try {
+            if (lock.tryLock(20, 10, TimeUnit.SECONDS)) {
+                String orderNo = orderReqInfo.getOrderNo();
+                scheduleDto.setType(CourseScheduleEnum.PRACTICE.getCode());
+                scheduleDto.setStatus(CourseGroupEnum.NOT_SALE.getCode());
+                scheduleDto.setMixStudentNum(1);
+                scheduleDto.setStudentId(studentId);
+
+                //写入course_group
+                baseMapper.addCourseGroup(scheduleDto);
+                Long groupId = scheduleDto.getGroupId();
+
+                //根据老师id获取默认配置声部原价
+                TeacherSubjectPrice teacherSubjectPrice = teacherFreeTimeDao.selectSubjectPrice(scheduleDto.getTeacherId(), scheduleDto.getSubjectId());
+                BigDecimal subjectPrice = teacherSubjectPrice.getSubjectPrice();
+
+                //每课实际价格
+                Map<Integer, BigDecimal> courseAveragePrice = WrapperUtil.getAveragePrice(scheduleDto.getCourseNum(), scheduleDto.getCoursePrice());
+
+                List<CourseScheduleDate> classTime = scheduleDto.getClassTime();
+                for (int i = 0; i < classTime.size(); i++) {
+                    CourseScheduleDate date = classTime.get(i);
+                    CourseSchedule schedule = new CourseSchedule();
+                    schedule.setClassDate(date.getClassDate());
+                    schedule.setStartTime(date.getStartTime());
+                    schedule.setEndTime(date.getEndTime());
+                    schedule.setCourseGroupId(groupId);
+                    schedule.setType(CourseScheduleEnum.PRACTICE.getCode());
+                    schedule.classNum(i + 1);
+                    schedule.setTeacherId(scheduleDto.getTeacherId());
+                    schedule.setLock(1);
+                    schedule.setStatus(CourseScheduleEnum.NOT_START.getCode());
+                    schedule.setCreatedBy(scheduleDto.getStudentId());
+                    //写入course_schedule
+                    baseMapper.insert(schedule);
+
+                    Long scheduleId = schedule.getId();
+                    CourseScheduleStudentPayment payment = new CourseScheduleStudentPayment();
+                    payment.setUserId(scheduleDto.getStudentId());
+                    payment.setCourseId(scheduleId);
+                    payment.setCourseGroupId(groupId);
+                    payment.setCourseType(CourseScheduleEnum.PRACTICE.getCode());
+                    payment.setOrderNo(orderNo);
+                    payment.setOriginalPrice(subjectPrice);//原价
+                    payment.setExpectPrice(subjectPrice);//预计价格
+                    payment.setActualPrice(courseAveragePrice.get(i + 1));//实际价格
+                    //写入course_schedule_student_payment
+                    courseScheduleStudentPaymentService.save(payment);
+                }
 
-        OrderCreateRes orderCreateRes = new OrderCreateRes();
-        orderCreateRes.setRes(true);
-        orderCreateRes.setMerchId(scheduleDto.getTeacherId());
-        orderCreateRes.setBizId(groupId);
-        orderCreateRes.setOriginalPrice(scheduleDto.getCoursePrice());
-        orderCreateRes.setExpectPrice(scheduleDto.getCoursePrice());
-        orderCreateRes.setGoodNum(scheduleDto.getCourseNum());
-        orderCreateRes.setGoodType(GoodTypeEnum.PRACTICE);
-        HttpResponseResult<OrderCreateRes> httpResponseResult = new HttpResponseResult<>();
-        httpResponseResult.setData(orderCreateRes);
-        log.info("buyPracticeCourse  return {}", httpResponseResult);
-        return httpResponseResult;
+                OrderCreateRes orderCreateRes = new OrderCreateRes();
+                orderCreateRes.setRes(true);
+                orderCreateRes.setMerchId(scheduleDto.getTeacherId());
+                orderCreateRes.setBizId(groupId);
+                orderCreateRes.setOriginalPrice(scheduleDto.getCoursePrice());
+                orderCreateRes.setExpectPrice(scheduleDto.getCoursePrice());
+                orderCreateRes.setGoodNum(scheduleDto.getCourseNum());
+                orderCreateRes.setGoodType(GoodTypeEnum.PRACTICE);
+                HttpResponseResult<OrderCreateRes> httpResponseResult = new HttpResponseResult<>();
+                httpResponseResult.setData(orderCreateRes);
+                log.info("buyPracticeCourse  return {}", httpResponseResult);
+                return httpResponseResult;
+            }
+        } catch (InterruptedException e) {
+            log.error("runIfLockCanGet error lockName : {}", "buyPractice:teacherId:" + scheduleDto.getTeacherId(), e);
+            throw new RuntimeException("runIfLockCanGet error lockName :" + "buyPractice:teacherId:" + scheduleDto.getTeacherId(), e);
+        } finally {
+            lock.unlock();
+        }
+        return null;
     }
 
     /**
@@ -970,9 +988,12 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
             throw new BizException("订单不存在!");
         }
 
-        //course_schedule中lock_改为0
+        //lock_改为0,课程&组状态改为ING
         List<Long> scheduleIds = paymentList.stream().map(CourseScheduleStudentPayment::getCourseId).collect(Collectors.toList());
         baseMapper.updateLock(scheduleIds);
+        UpdateWrapper<CourseGroup> warp = new UpdateWrapper<>();
+        warp.set("status_", "ING").eq("id_", paymentList.get(0).getCourseGroupId());
+        courseGroupService.update(warp);
 
         //查询陪练课服务费
         String practiceServiceRateStr = sysConfigService.findConfigValue(SysConfigConstant.PRACTICE_SERVICE_FEE);
@@ -1050,13 +1071,17 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         Date now = new Date();
         //校验时间是否为未来时刻
         if (classDate.before(now) || startTime.before(now) || endTime.before(now)) {
-            throw new BizException("时间不正确");
+            throw new BizException("排课日期必须大于当前日期");
+        }
+        if (!(DateUtil.dateToString(classDate).equals(DateUtil.dateToString(startTime))) ||
+                !(DateUtil.dateToString(startTime).equals(DateUtil.dateToString(endTime)))) {
+            throw new BizException("排课日期必须为同天");
         }
 
         //校验课程是否存在
         CourseSchedule schedule = baseMapper.selectOne(Wrappers.<CourseSchedule>lambdaQuery()
                 .eq(CourseSchedule::getId, courseId)
-                .eq(CourseSchedule::getLock, 1)
+                .eq(CourseSchedule::getLock, 0)
                 .eq(CourseSchedule::getStatus, CourseScheduleEnum.NOT_START)
                 .eq(CourseSchedule::getType, CourseScheduleEnum.PRACTICE));
         if (ObjectUtil.isEmpty(schedule)) {
@@ -1071,7 +1096,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
             throw new BizException("课程无人购买");
         }
 
-        //批量检查老师课时在数据库是否重复
+        //校验老师课程是否冲突
         List<CourseSchedule> scheduleList = this.list(Wrappers.<CourseSchedule>lambdaQuery()
                 .eq(CourseSchedule::getTeacherId, teacherId)
                 .in(CourseSchedule::getStatus, Lists.newArrayList(CourseScheduleEnum.NOT_START.getCode(), CourseScheduleEnum.ING.getCode())));
@@ -1080,7 +1105,8 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
                 throw new BizException("老师排课冲突,课程id:{}", courseSchedule.getId());
             }
         }
-        //批量检查学生课时在数据库是否重复
+
+        //校验学生课程是否冲突
         List<CourseSchedule> studentList = baseMapper.selectSchedule(courseId);
         for (CourseSchedule courseSchedule : studentList) {
             if (inInterSection(startTime, endTime, courseSchedule.getStartTime(), courseSchedule.getEndTime(), true)) {
@@ -1108,7 +1134,26 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
             homePage.setRecentCourses(baseMapper.selectRecentCourses(studentId));
         }
         if (studentId == null) {
-            homePage.setRecentCourses(baseMapper.selectRecentCoursesTeacher(teacherId));
+            StudentHomePage.RecentCourses coursesPractice = baseMapper.selectRecentCoursesPractice(teacherId);
+            StudentHomePage.RecentCourses coursesLive = baseMapper.selectRecentCoursesLive(teacherId);
+
+            if (coursesPractice == null && coursesLive != null) {
+                homePage.setRecentCourses(coursesLive);
+            }
+            if (coursesPractice != null && coursesLive == null) {
+                homePage.setRecentCourses(coursesPractice);
+            }
+
+            if (coursesPractice != null && coursesLive != null) {
+                Date practiceTime = coursesPractice.getCourseStartTime();
+                Date liveTime = coursesLive.getCourseStartTime();
+
+                if (practiceTime.compareTo(liveTime) == -1) {
+                    homePage.setRecentCourses(coursesPractice);
+                } else {
+                    homePage.setRecentCourses(coursesLive);
+                }
+            }
         }
         return homePage;
     }
@@ -1185,7 +1230,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         String teacherUrl = sysMessageService.selectConfigUrl(MessageTypeEnum.STUDENT_BUY_PRACTICE.getCode());
         sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_BUY_PRACTICE,
                 teacherReceivers, null, 0, teacherUrl, ClientEnum.TEACHER.getCode(),
-                student.getUsername(), courseNum );
+                student.getUsername(), courseNum);
         log.info("send success {}", MessageTypeEnum.STUDENT_BUY_PRACTICE);
 
         //老师端-学生买陪练课(短信)
@@ -1198,7 +1243,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         String studentUrl = sysMessageService.selectConfigUrl(MessageTypeEnum.PRACTICE_BUY.getCode());
         sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.PRACTICE_BUY,
                 studentReceivers, null, 0, studentUrl, ClientEnum.STUDENT.getCode(),
-                teacher.getUsername(), courseNum );
+                teacher.getUsername(), courseNum);
         log.info("send success {}", MessageTypeEnum.PRACTICE_BUY);
 
         //学生端-买陪练课(短信)
@@ -1255,7 +1300,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
                 String teacherUrl = sysMessageService.selectConfigUrl(MessageTypeEnum.TOMORROW_COURSE_REMINDER.getCode());
                 sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TOMORROW_COURSE_REMINDER,
                         teacherReceivers, null, 0, teacherUrl, ClientEnum.TEACHER.getCode(),
-                        practiceCount.toString(), liveCount.toString() );
+                        practiceCount.toString(), liveCount.toString());
                 log.info("send success {}", MessageTypeEnum.TOMORROW_COURSE_REMINDER);
 
                 //老师端-明日课程提醒(短信)
@@ -1284,4 +1329,70 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         sysConfig.put("liveEndTime", sysConfigService.findConfigValue(SysConfigConstant.DESTROY_EXPIRED_LIVE_ROOM_MINUTE));
         return sysConfig;
     }
+
+    public void test() {
+        //1.查询所有过审的老师
+        List<TeacherFreeTime> teacherFreeTime = teacherFreeTimeDao.getTeacherFreeTime();
+
+        //2.根据配置是否跳过节假日分组
+        //跳过节假日
+        List<TeacherFreeTime> skipHoliday = teacherFreeTime.stream().filter(item -> item.getSkipHolidayFlag()).collect(Collectors.toList());
+        //不跳过节假日
+        List<TeacherFreeTime> noSkipHoliday = teacherFreeTime.stream().filter(item -> !item.getSkipHolidayFlag()).collect(Collectors.toList());
+
+        //3.查询节假日
+        HolidaysFestivals holidays = holidaysFestivalsDao.queryByYear(Integer.parseInt(DateUtil.getYear(new Date())));
+        String[] strs = holidays.getHolidaysFestivalsJson().split(",");
+        List<String> holiday = Arrays.asList(strs);
+
+        //4.获取未来30天日期
+        List<String> futureDays = DateUtil.getFutureDays(30);
+        //5.获取未来30天日期(剔除节假日)
+        List<String> futureDaysNoVacation = futureDays.stream().filter(item -> !holiday.contains(item)).collect(Collectors.toList());
+
+        Map<Long, Object> map = new HashMap<>();
+
+
+        //6.遍历老师获取周1-7配置
+        for (TeacherFreeTime freeTimeConfig : skipHoliday) {//跳过节假日
+            String mondayConfig = freeTimeConfig.getMonday();
+            List<DateVo> mondayConfigList = JSONObject.parseArray(mondayConfig, DateVo.class);
+            List<DateChangeVo> rList = new ArrayList<>();//未来30天所有周一排课时间
+
+            map.put(freeTimeConfig.getId(), rList);
+            for (String day : futureDaysNoVacation) {//遍历未来30天跳过节假日
+                String week = DateUtil.getWeek(day);
+                if (week.equals("monday")) {//当前时间为周一
+                    splicingDate(day, mondayConfigList, rList);
+                }
+            }
+        }
+        System.out.println(map);
+
+        //7.遍历30天日期拼接配置 生成日历
+
+        //8.根据老师id查询未来课程时间
+
+        //9.遍历7.8校验区间是否重合
+
+        //10.记录没重合老师id
+    }
+
+    /**
+     * 拼接日期时间
+     *
+     * @param day         日期
+     * @param strDateList 时间集合
+     * @param rList       接受容器
+     * @return
+     */
+    public List<DateChangeVo> splicingDate(String day, List<DateVo> strDateList, List<DateChangeVo> rList) {
+        for (DateVo vo : strDateList) {
+            DateChangeVo dateChange = new DateChangeVo();
+            dateChange.setStartTime(DateUtil.strToDate(day + " " + vo.getStartTime()));
+            dateChange.setEndTime(DateUtil.strToDate(day + " " + vo.getEndTime()));
+            rList.add(dateChange);
+        }
+        return rList;
+    }
 }

+ 14 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/SmsCodeServiceImpl.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 
 import java.util.List;
 
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -38,7 +39,7 @@ public class SmsCodeServiceImpl implements SmsCodeService {
 	}
 
 	@Override
-	public boolean sendValidCode(String mobile) {
+	public boolean sendValidCode(String mobile, String type, ClientEnum platform) {
 		SysUser sysUser = sysUserFeignService.queryUserByMobile(mobile);
 		Long userId = null;
 		if (sysUser != null) {
@@ -54,7 +55,18 @@ public class SmsCodeServiceImpl implements SmsCodeService {
 		if (list != null && list.size() >= times) {
 			throw new BizException("对不起,您发送太频繁请稍后重试!");
 		}
-		sysMessageService.sendSecurityCode(MessageSenderPluginContext.MessageSender.AWSMS, userId, MessageTypeEnum.SMS_VERIFY_CODE_LOGIN, mobile);
+		if ("PASSWD".equals(type)) {
+			sysMessageService.sendSecurityCode(MessageSenderPluginContext.MessageSender.AWSMS, userId, MessageTypeEnum.SMS_VERIFY_CODE_UPDATE_PSW, mobile,platform.getMsg());
+
+		} else if ("LOGIN".equals(type)) {
+			sysMessageService.sendSecurityCode(MessageSenderPluginContext.MessageSender.AWSMS, userId, MessageTypeEnum.SMS_VERIFY_CODE_LOGIN, mobile,platform.getMsg());
+
+		} else if ("REGISTER".equals(type)) {
+			sysMessageService.sendSecurityCode(MessageSenderPluginContext.MessageSender.AWSMS, userId, MessageTypeEnum.SMS_VERIFY_CODE_REGISTER, mobile,platform.getMsg());
+
+		} else {
+			sysMessageService.sendSecurityCode(MessageSenderPluginContext.MessageSender.AWSMS, userId, MessageTypeEnum.SMS_VERIFY_CODE, mobile,platform.getMsg());
+		}
 		return true;
 	}
 

+ 2 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/SysMessageServiceImpl.java

@@ -10,8 +10,6 @@ import java.util.Map.Entry;
 import java.util.Random;
 import java.util.Set;
 
-import com.yonge.cooleshow.biz.dal.vo.MessageTypeCountVo;
-
 import com.yonge.toolset.base.string.MessageFormatter;
 
 import com.yonge.toolset.mybatis.service.impl.BaseServiceImpl;
@@ -324,7 +322,7 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 	}
 
 	@Override
-	public boolean sendSecurityCode(MessageSender messageSender, Long userId, MessageTypeEnum messageType, String receiver) {
+	public boolean sendSecurityCode(MessageSender messageSender, Long userId, MessageTypeEnum messageType, String receiver, String platform) {
 		String key1 = getVerificationCode1CacheKey(messageType, receiver);
 		if (redisCache.get(key1) != null) {
 			throw new BizException("请勿频繁操作,获取验证码间隔时间为60秒");
@@ -337,7 +335,7 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 		}
 		Map<Long, String> receivers = new HashMap<>(1);
 		receivers.put(userId, receiver);
-		batchSendMessage(messageSender, messageType, receivers, null, 1, "","", code);
+		batchSendMessage(messageSender, messageType, receivers, null, 1, "","",platform, code);
 		redisCache.put(key, code + "", CODE_EXPIRE);
 		redisCache.put(key1, code + "", CODE_INTERVAL_TIME);
 		return true;

+ 6 - 6
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonPurchaseRecordServiceImpl.java

@@ -166,7 +166,7 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
         userAccountService.accountChange(userAccountRecord);
         log.info("buyVideoCourseSuccess ok");
 
-        videoSend(teacherId, studentId, lessonGroup.getLessonName());
+        videoSend(teacherId, studentId, lessonGroup);
     }
 
     /**
@@ -204,7 +204,7 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
      * @Author: cy
      * @Date: 2022/5/6
      */
-    public void videoSend(Long teacherId, Long studentId, String lessonName) {
+    public void videoSend(Long teacherId, Long studentId, VideoLessonGroup lesson) {
         //查询老师&学生信息
         SysUser teacher = sysUserFeignService.queryUserById(teacherId);
         SysUser student = sysUserFeignService.queryUserById(studentId);
@@ -221,7 +221,7 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
         try {
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_BUY_VIDEO,
                     teacherReceivers, null, 0, null, ClientEnum.TEACHER.getCode(),
-                    student.getUsername(), lessonName);
+                    student.getUsername(), lesson.getLessonName());
             log.info("send success {}", MessageTypeEnum.STUDENT_BUY_VIDEO);
         } catch (Exception e) {
             log.error("send fail {}", MessageTypeEnum.STUDENT_BUY_VIDEO);
@@ -232,8 +232,8 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
         try {
             String url = sysMessageService.selectConfigUrl(MessageTypeEnum.VIDEO_BUY.getCode());
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.VIDEO_BUY,
-                    studentReceivers, null, 0, url, ClientEnum.STUDENT.getCode(),
-                    teacher.getUsername(), lessonName );
+                    studentReceivers, null, 0, url + lesson.getId(), ClientEnum.STUDENT.getCode(),
+                    teacher.getUsername(), lesson.getLessonName() );
             log.info("send success {}", MessageTypeEnum.VIDEO_BUY);
         } catch (Exception e) {
             log.error("send fail {}", MessageTypeEnum.VIDEO_BUY);
@@ -244,7 +244,7 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
         try {
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_VIDEO_BUY,
                     studentSMS, null, 0, null, null,
-                    teacher.getUsername(), lessonName);
+                    teacher.getUsername(), lesson.getLessonName());
             log.info("sms send success {}", MessageTypeEnum.SMS_VIDEO_BUY);
         } catch (Exception e) {
             log.error("sms send fail {}", MessageTypeEnum.SMS_VIDEO_BUY);

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VipCardRecordServiceImpl.java

@@ -101,6 +101,7 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
             String url = sysMessageService.selectConfigUrl(MessageTypeEnum.SMS_VIP_EXPIRE_THIRTY_DAY.getCode());
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_VIP_EXPIRE_THIRTY_DAY,
                     receivers, null, 0, url, ClientEnum.STUDENT.getCode() );
+                    receivers, null, 0, null, ClientEnum.TEACHER.getCode() ,url);
         } catch (Exception e) {
             log.error("会员到期3天短信消息推送异常,userId={}", userId);
         }
@@ -122,6 +123,7 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
             String url = sysMessageService.selectConfigUrl(MessageTypeEnum.SMS_VIP_EXPIRE.getCode());
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_VIP_EXPIRE,
                     receivers, null, 0, url, ClientEnum.STUDENT.getCode());
+                    receivers, null, 0, null, ClientEnum.TEACHER.getCode(),url);
         } catch (Exception e) {
             log.error("会员到期3天短信消息推送异常,userId={}", userId);
         }

+ 25 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/DateChangeVo.java

@@ -0,0 +1,25 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import java.io.Serializable;
+import java.util.Date;
+
+public class DateChangeVo implements Serializable {
+    private Date startTime;
+    private Date endTime;
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+}

+ 24 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/DateVo.java

@@ -0,0 +1,24 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import java.io.Serializable;
+
+public class DateVo implements Serializable {
+    private String startTime;
+    private String endTime;
+
+    public String getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(String startTime) {
+        this.startTime = startTime;
+    }
+
+    public String getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(String endTime) {
+        this.endTime = endTime;
+    }
+}

+ 10 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MyFens.java

@@ -18,9 +18,19 @@ public class MyFens extends BaseEntity {
     private String realName;
     @ApiModelProperty("头像地址")
     private String avatar;
+    @ApiModelProperty("声部")
+    private String subjectName;
     @ApiModelProperty(value = "性别 0女 1男")
     private GenderEnum gender;
 
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
     public String getUserId() {
         return userId;
     }

+ 31 - 5
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -254,6 +254,7 @@
         FROM course_schedule_student_payment p
         LEFT JOIN course_schedule s ON p.course_id_ = s.id_
         WHERE s.teacher_id_=#{teacherId}
+        AND s.status_='ING'
         <![CDATA[ AND s.class_date_  >= #{startDate} ]]>
         <![CDATA[ AND s.class_date_  <= #{endDate} ]]>
     </select>
@@ -316,7 +317,8 @@
         LEFT JOIN course_group g ON cs.course_group_id_ = g.id_
         LEFT JOIN (SELECT course_id_ AS pid,count(*) AS payCount FROM course_schedule_student_payment GROUP BY course_id_ ) p ON cs.id_=p.pid
         LEFT JOIN `subject` sb ON g.subject_id_=sb.id_
-        WHERE cs.type_='LIVE'
+        WHERE cs.status_='ING'
+        AND cs.type_='LIVE'
         AND cs.teacher_id_=#{param.teacherId}
         AND cs.class_date_=#{param.classDate}
         AND cs.id_ IN(
@@ -348,7 +350,8 @@
         LEFT JOIN course_schedule cs ON p.course_id_=cs.id_
         LEFT JOIN course_group g ON p.course_group_id_ = g.id_
         LEFT JOIN `subject` sb ON g.subject_id_=sb.id_
-        WHERE p.course_id_ IN (SELECT s.id_ FROM course_schedule s WHERE s.type_='PRACTICE' AND s.teacher_id_=#{param.teacherId})
+        WHERE cs.status_='ING'
+        AND p.course_id_ IN (SELECT s.id_ FROM course_schedule s WHERE s.type_='PRACTICE' AND s.teacher_id_=#{param.teacherId})
         AND cs.class_date_=#{param.classDate}
         ORDER BY startTime
     </select>
@@ -501,7 +504,7 @@
     </insert>
 
     <update id="updateLock" parameterType="java.util.List">
-        UPDATE course_schedule SET lock_ = 0 WHERE id_ IN
+        UPDATE course_schedule SET lock_ = 0,status_='ING' WHERE id_ IN
         <foreach collection="list" item="item" open="(" separator="," close=")">
             #{item}
         </foreach>
@@ -575,7 +578,7 @@
         ORDER BY ABS(NOW() - s.start_time_) ASC
         limit 1
     </select>
-    <select id="selectRecentCoursesTeacher" resultType="com.yonge.cooleshow.biz.dal.vo.StudentHomePage$RecentCourses">
+    <select id="selectRecentCoursesPractice" resultType="com.yonge.cooleshow.biz.dal.vo.StudentHomePage$RecentCourses">
         SELECT
             u.id_ AS teacherId,
             u.username_ AS teacherName,
@@ -591,7 +594,30 @@
         LEFT JOIN sys_user u ON s.teacher_id_=u.id_
         LEFT JOIN course_group g ON s.course_group_id_=g.id_
         WHERE s.teacher_id_=#{teacherId}
-        AND s.status_ IN ('NOT_START','ING')
+        AND s.type_='PRACTICE'
+        AND s.status_ = 'ING'
+        ORDER BY ABS(NOW() - s.start_time_) ASC
+        limit 1
+    </select>
+    <select id="selectRecentCoursesLive" resultType="com.yonge.cooleshow.biz.dal.vo.StudentHomePage$RecentCourses"
+            parameterType="java.lang.Long">
+        SELECT
+            u.id_ AS teacherId,
+            u.username_ AS teacherName,
+            u.real_name_ AS realName,
+            u.avatar_ AS avatar,
+            s.course_group_id_ AS courseGroupId,
+            s.id_ AS courseId,
+            g.name_ AS courseGroupName,
+            s.type_ AS courseType,
+            s.status_ AS `status`,
+            s.start_time_ AS courseStartTime
+        FROM course_schedule s
+        LEFT JOIN sys_user u ON s.teacher_id_=u.id_
+        LEFT JOIN course_group g ON s.course_group_id_=g.id_
+        WHERE s.teacher_id_=#{teacherId}
+        AND s.type_='LIVE'
+        AND s.status_ ='ING'
         ORDER BY ABS(NOW() - s.start_time_) ASC
         limit 1
     </select>

+ 7 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml

@@ -110,6 +110,9 @@
         <if test="param.sourceType != null">
             and t.source_type_ = #{param.sourceType}
         </if>
+        <if test="param.chargeType != null">
+            and t.charge_type_ = #{param.chargeType}
+        </if>
     </sql>
 
     <select id="selectAlbumDetailPage" resultType="com.yonge.cooleshow.biz.dal.vo.MusicSheetVo">
@@ -433,7 +436,7 @@
         left join music_sheet_auth_record msar on ms.id_ = msar.music_sheet_id_
         left join sys_user su2 on msar.verify_user_id_ = su2.id_
         <where>
-            ms.user_id_ &gt; 0
+            ms.source_type_  = 'TEACHER'
             <if test="param.idAndName != null and param.idAndName != ''">
                 and (su.id_ like concat('%',#{param.idAndName} ,'%')
                 or su.username_ like concat('%',#{param.idAndName},'%')
@@ -454,6 +457,9 @@
             <if test="param.delFlag != null">
                 and ms.del_flag_ = #{param.delFlag}
             </if>
+            <if test="param.chargeType != null">
+                and ms.charge_type_ = #{param.chargeType}
+            </if>
         </where>
         order by  ms.submit_audit_time_ desc
     </select>

+ 4 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherFreeTimeMapper.xml

@@ -110,4 +110,8 @@
                  LEFT JOIN teacher_subject_price p ON f.id_=p.teacher_free_time_id
         WHERE f.teacher_id_=#{teacherId} AND f.default_flag_=1
     </select>
+    <select id="getTeacherFreeTime" resultType="com.yonge.cooleshow.biz.dal.entity.TeacherFreeTime">
+        SELECT * FROM teacher_free_time WHERE default_flag_=1
+        AND teacher_id_ IN(SELECT user_id_ FROM teacher_auth_entry_record WHERE teacher_auth_status_='PASS' GROUP BY user_id_)
+    </select>
 </mapper>

+ 3 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherMapper.xml

@@ -160,9 +160,11 @@
             u.avatar_ AS avatar,
             u.username_ AS userName,
             u.real_name_ AS realName,
-            u.gender_ AS gender
+            u.gender_ AS gender,
+            (SELECT group_concat(name_) FROM `subject` WHERE find_in_set(id_,sr.subject_id_)) AS subjectName
         FROM student_star s
         LEFT JOIN sys_user u ON s.student_id_ = u.id_
+        LEFT JOIN student sr ON s.student_id_ = sr.user_id_
         WHERE s.teacher_id_ =#{teacherId}
     </select>
 </mapper>

+ 6 - 3
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/SmsCodeController.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.student.controller;
 
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -36,10 +37,12 @@ public class SmsCodeController extends BaseController {
     private RedisTemplate<String,String> redisTemplate;
 
     @ApiOperation(value = "发送登录短信验证码")
-    @ApiImplicitParam(name = "mobile", value = "手机号", required = true, dataType = "String")
+    @ApiImplicitParams({  @ApiImplicitParam(name = "mobile", value = "手机号", required = true, dataType = "String"),
+         @ApiImplicitParam(name = "type", value = "类型(PASSWD:修改密码,LOGIN:登录,REGISTER:注册)", required = true, dataType = "String") })
+
     @PostMapping(value = "/sendSmsCode")
-    public Object sendLoginVerifyCode(String mobile) throws Exception {
-        smsCodeService.sendValidCode(mobile);
+    public Object sendLoginVerifyCode(String mobile,String type) throws Exception {
+        smsCodeService.sendValidCode(mobile, type, ClientEnum.STUDENT);
         return succeed();
     }
 

+ 5 - 3
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/SmsCodeController.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.teacher.controller;
 
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -36,10 +37,11 @@ public class SmsCodeController extends BaseController {
     private RedisTemplate<String,String> redisTemplate;
 
     @ApiOperation(value = "发送登录短信验证码")
-    @ApiImplicitParam(name = "mobile", value = "手机号", required = true, dataType = "String")
+    @ApiImplicitParams({  @ApiImplicitParam(name = "mobile", value = "手机号", required = true, dataType = "String"),
+                          @ApiImplicitParam(name = "type", value = "类型(PASSWD:修改密码,LOGIN:登录,REGISTER:注册)", required = true, dataType = "String") })
     @PostMapping(value = "/sendSmsCode")
-    public Object sendLoginVerifyCode(String mobile) throws Exception {
-        smsCodeService.sendValidCode(mobile);
+    public Object sendLoginVerifyCode(String mobile,String type) throws Exception {
+        smsCodeService.sendValidCode(mobile, type, ClientEnum.TEACHER);
         return succeed();
     }
 

+ 6 - 0
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherCourseScheduleController.java

@@ -155,5 +155,11 @@ public class TeacherCourseScheduleController extends BaseController {
     public HttpResponseResult<Object> selectRoomConfig() {
         return succeed(courseScheduleService.selectRoomConfig());
     }
+
+    @GetMapping("/test")
+    public HttpResponseResult<Object> teset() {
+        courseScheduleService.test();
+        return succeed();
+    }
 }
 

+ 44 - 0
toolset/utils/src/main/java/com/yonge/toolset/utils/date/DateUtil.java

@@ -1367,6 +1367,50 @@ public class DateUtil {
 		return null;
 	}
 
+	/**
+	 * 获取未来n天(不包含当天)
+	 * @param amount
+	 * @return
+	 */
+	public static List<String> getFutureDays(Integer amount) {
+		Calendar c = Calendar.getInstance();
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		List<String> lsDate = new ArrayList<>();
+		for (int i = 1; i <= amount; i++) {
+			c.setTime(new Date());
+			c.add(Calendar.DATE, +i);
+			Date d = c.getTime();
+			lsDate.add(sdf.format(d));
+			Collections.sort(lsDate);
+		}
+		return lsDate;
+	}
+
+	/**
+	 * 获取当前星期
+	 * @param sdate 日期
+	 * @return
+	 * @throws Exception
+	 */
+	public static String getWeek(String sdate) {
+		// 再转换为时间
+		DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+		String[] weeks = {"sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"};
+		Date parseDate = null;
+		try {
+			parseDate = dateFormat.parse(sdate);
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		Calendar c = Calendar.getInstance();
+		c.setTime(parseDate);
+		int week_index = c.get(Calendar.DAY_OF_WEEK) - 1;
+		if (week_index < 0) {
+			week_index = 0;
+		}
+		return weeks[week_index];
+	}
+
 	public static void main(String[] args) throws ParseException {
 		// DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
 		DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");