Pārlūkot izejas kodu

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

liujunchi 3 gadi atpakaļ
vecāks
revīzija
e2d41f607f
38 mainītis faili ar 489 papildinājumiem un 148 dzēšanām
  1. 37 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/MallAdminFeignService.java
  2. 4 2
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/MallPortalFeignService.java
  3. 8 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/StudentFeignService.java
  4. 22 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/MallAdminFeignServiceFallback.java
  5. 5 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/StudentFeignServiceFallback.java
  6. 3 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/filter/UsernameAuthenticationFilter.java
  7. 3 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/provider/PhoneAuthenticationProvider.java
  8. 2 3
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/service/CustomTokenServices.java
  9. 1 1
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserDeviceServiceImpl.java
  10. 3 3
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/UserController.java
  11. 49 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/AppConstant.java
  12. 7 0
      cooleshow-mall/mall-admin/pom.xml
  13. 32 0
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/client/MallAdminFeignClient.java
  14. 1 1
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/config/ResourceServerConfig.java
  15. 0 13
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/OmsOrderController.java
  16. 0 2
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/dao/OmsOrderDao.java
  17. 3 4
      cooleshow-mall/mall-admin/src/main/resources/config/mybatis/OmsOrderDao.xml
  18. 0 2
      cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/enums/OrdeerCacherEnmu.java
  19. 1 1
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/task/OrderTimeOutCancelTask.java
  20. 23 0
      cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/TotalStudentTimeTask.java
  21. 13 0
      cooleshow-user/user-biz/pom.xml
  22. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/SysMessageDao.java
  23. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/StudentTime.java
  24. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrder.java
  25. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/StudentTimeService.java
  26. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SysMessageService.java
  27. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderService.java
  28. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  29. 101 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentTimeServiceImpl.java
  30. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/SysMessageServiceImpl.java
  31. 62 75
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  32. 32 9
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonPurchaseRecordServiceImpl.java
  33. 3 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/SysMessageMapper.xml
  34. 1 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherAuthEntryRecordMapper.xml
  35. 11 9
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderMapper.xml
  36. 11 4
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java
  37. 19 8
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/task/TaskController.java
  38. 0 7
      toolset/toolset-mybatis/pom.xml

+ 37 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/MallAdminFeignService.java

@@ -0,0 +1,37 @@
+package com.yonge.cooleshow.api.feign;
+
+import com.yonge.cooleshow.api.feign.fallback.MallAdminFeignServiceFallback;
+import com.yonge.cooleshow.common.constant.AppConstant;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.feign.config.FeignConfiguration;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.List;
+import java.util.Map;
+
+@FeignClient(name = AppConstant.APPLICATION_MALL_ADMIN_SERVER, configuration = FeignConfiguration.class,
+        fallback = MallAdminFeignServiceFallback.class)
+public interface MallAdminFeignService {
+
+
+    @PostMapping(value = "/order/userOrderInfoList")
+    /***
+     * 远程查询订单成功的用户和时间信息
+     * @author liweifan
+     * @param: param {
+     *              startTime="yyyy-MM-dd HH:mm:ss",    --订单开始时间
+     *              endTime="yyyy-MM-dd HH:mm:ss",      --订单结束时间
+     *              userIdList=[1,2]                    --用户id集合
+     * }
+     * @updateTime 2022/5/5 10:57
+     * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<java.util.List<java.util.Map<java.lang.String,java.lang.Object>>>
+     *      {
+     *          userId:1,                               --用户id
+     *          receiveTime:毫秒值        --订单完成时间
+     *      }
+     */
+    HttpResponseResult<List<Map<String,Object>>> userOrderInfoList(@RequestBody Map<String,Object> param);
+}

+ 4 - 2
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/MallPortalFeignService.java

@@ -1,16 +1,18 @@
 package com.yonge.cooleshow.api.feign;
 
 import com.yonge.cooleshow.api.feign.fallback.MallPortalFeignServiceFallback;
+import com.yonge.cooleshow.common.constant.AppConstant;
 import com.yonge.toolset.feign.config.FeignConfiguration;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
 
-@FeignClient(name = "mall-portal-server", configuration = FeignConfiguration.class, fallback = MallPortalFeignServiceFallback.class)
+@FeignClient(name = AppConstant.APPLICATION_MALL_PORTAL_SERVER, configuration = FeignConfiguration.class,
+        fallback = MallPortalFeignServiceFallback.class)
 public interface MallPortalFeignService {
 
     /**
      * 订单轮询
      */
-    @GetMapping("/task/pollingOrder")
+    @GetMapping("/task/cancelTimeOutOrder")
     Object cancelTimeOutOrder();
 }

+ 8 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/StudentFeignService.java

@@ -17,6 +17,14 @@ public interface StudentFeignService {
     @GetMapping(value = "/task/queryStudentTotal")
     Object queryStudentTotal();
     /***
+     * 统计学员第一次购买时间(半小时一次,统计当天数据)
+     * @author liweifan
+     * @updateTime 2022/3/28 15:34
+     * @return: java.lang.Object
+     */
+    @GetMapping(value = "/task/totalStudentTime")
+    Object totalStudentTime();
+    /***
      * 轮询用户订单
      * @author liweifan
      * @updateTime 2022/3/28 15:34

+ 22 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/MallAdminFeignServiceFallback.java

@@ -0,0 +1,22 @@
+package com.yonge.cooleshow.api.feign.fallback;
+
+
+import com.yonge.cooleshow.api.feign.MallAdminFeignService;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-04-26
+ */
+public class MallAdminFeignServiceFallback implements MallAdminFeignService {
+
+    @Override
+    public HttpResponseResult<List<Map<String, Object>>> userOrderInfoList(Map<String, Object> param) {
+        return HttpResponseResult.failed("远程调用失败");
+    }
+}

+ 5 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/StudentFeignServiceFallback.java

@@ -12,6 +12,11 @@ public class StudentFeignServiceFallback implements StudentFeignService {
     }
 
     @Override
+    public Object totalStudentTime() {
+        return null;
+    }
+
+    @Override
     public Object pollingOrder() {
         return null;
     }

+ 3 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/filter/UsernameAuthenticationFilter.java

@@ -73,6 +73,9 @@ public class UsernameAuthenticationFilter extends AbstractAuthenticationProcessi
 		if (userInfo == null) {
 			throw new UsernameNotFoundException("404.9");
 		}
+		if (userInfo.getSysUser().getLockFlag() == 1) {
+			throw new LockedException("用户已锁定");
+		}
 	
 //		if (userInfo.getSysUser().getUserType() != SysUserType.SYSTEM && !StringUtils.equalsIgnoreCase(clientId, userInfo.getSysUser().getUserType().getCode())) {
 //			throw new LockedException("登录失败");

+ 3 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/provider/PhoneAuthenticationProvider.java

@@ -80,6 +80,9 @@ public class PhoneAuthenticationProvider extends AbstractAuthenticationProvider
 			if (user == null) {
 				throw new LockedException("用户不存在");
 			}
+			if (user.getLockFlag() == 1) {
+				throw new LockedException("用户已锁定");
+			}
 			
 			if (StringUtils.isNotBlank(deviceNum)) {
 				sysUserDeviceService.bindDevice(clientId, user.getId(), deviceNum);

+ 2 - 3
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/service/CustomTokenServices.java

@@ -275,14 +275,13 @@ public class CustomTokenServices implements AuthorizationServerTokenServices, Re
 		return clientAuth.getClientId();
 	}
 	
-	public boolean revokeToken(String clientId, String phone){
+	public boolean revokeToken(String clientId, String phone) {
 		Collection<OAuth2AccessToken> list = tokenStore.findTokensByClientIdAndUserName(clientId, SecurityConstants.PHONE_PRINCIPAL_PREFIX + phone);
 
 		if (list == null || list.size() == 0) {
 			list = tokenStore.findTokensByClientIdAndUserName(clientId, SecurityConstants.USERNAME_PRINCIPAL_PREFIX + phone);
-		} else {
-			list.addAll(tokenStore.findTokensByClientIdAndUserName(clientId, SecurityConstants.USERNAME_PRINCIPAL_PREFIX + phone));
 		}
+
 		if (list != null) {
 			for (OAuth2AccessToken accessToken : list) {
 				if (accessToken != null) {

+ 1 - 1
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserDeviceServiceImpl.java

@@ -52,7 +52,7 @@ public class SysUserDeviceServiceImpl extends BaseServiceImpl<Long, SysUserDevic
 
 			if (!deviceList.contains(deviceNum)) {
 				if (deviceList.size() >= 5) {
-					throw new BadCredentialsException("当前账号绑定设备过多,请联系主教老师");
+					throw new BadCredentialsException("登录失败,当前账号绑定设备过多");
 				}
 
 				SysUserDevice sysUserDevice = new SysUserDevice();

+ 3 - 3
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/UserController.java

@@ -318,13 +318,13 @@ public class UserController extends BaseController {
         
         if(lockFlag == 1){
         	if(sysUser.getUserType().contains("STUDENT")){
-        		tokenService.revokeToken("STUDENT", sysUser.getPhone());
+        		tokenService.revokeToken("student", sysUser.getPhone());
         	}
         	if(sysUser.getUserType().contains("TEACHER")){
-        		tokenService.revokeToken("TEACHER", sysUser.getPhone());
+        		tokenService.revokeToken("teacher", sysUser.getPhone());
         	}
         	if(sysUser.getUserType().contains("SYSTEM")){
-        		tokenService.revokeToken("SYSTEM", sysUser.getPhone());
+        		tokenService.revokeToken("system", sysUser.getPhone());
         	}
         }
         sysUser.setUpdateTime(new Date());

+ 49 - 0
cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/AppConstant.java

@@ -0,0 +1,49 @@
+package com.yonge.cooleshow.common.constant;
+
+/**
+ * @Author: liweifan
+ * @Data: 2022/5/5 10:02
+ */
+public interface AppConstant {
+    /**
+     * 网关
+     */
+    String APPLICATION_GATEWAY_WEB_SERVER = "gateway-web-server";
+    /**
+     * 鉴权
+     */
+    String APPLICATION_AUTH_SERVER = "auth-server";
+    /**
+     * 定时任务
+     */
+    String APPLICATION_TASK_SERVER = "task-server";
+    /**
+     * 管理端
+     */
+    String APPLICATION_ADMIN_SERVER = "admin-server";
+    /**
+     * 老师端
+     */
+    String APPLICATION_TEACHER_SERVER = "teacher-server";
+    /**
+     * 学生端
+     */
+    String APPLICATION_STUDENT_SERVER = "student-server";
+    /**
+     * CMS
+     */
+    String APPLICATION_CMS_SERVER= "cms-server";
+    /**
+     * 商城管理端
+     */
+    String APPLICATION_MALL_ADMIN_SERVER = "mall-admin-server";
+    /**
+     * 商城门户
+     */
+    String APPLICATION_MALL_PORTAL_SERVER = "mall-portal-server";
+    /**
+     * WEBSOCKET
+     */
+    String APPLICATION_WEBSOCKET_SERVER = "websocket-server";
+
+}

+ 7 - 0
cooleshow-mall/mall-admin/pom.xml

@@ -31,6 +31,7 @@
         <dependency>
             <groupId>com.yonge.toolset</groupId>
             <artifactId>thirdparty-component</artifactId>
+            <version>1.0</version>
         </dependency>
 
         <dependency>
@@ -70,6 +71,12 @@
             <artifactId>toolset-emoji</artifactId>
             <version>1.0</version>
         </dependency>
+
+        <dependency>
+            <groupId>com.yonge.cooleshow</groupId>
+            <artifactId>cooleshow-api</artifactId>
+            <version>1.0</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 32 - 0
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/client/MallAdminFeignClient.java

@@ -0,0 +1,32 @@
+package com.yonge.cooleshow.admin.client;
+
+import com.yonge.cooleshow.admin.service.OmsOrderService;
+import com.yonge.cooleshow.api.feign.MallAdminFeignService;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import springfox.documentation.annotations.ApiIgnore;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Author: liweifan
+ * @Data: 2022/5/5 10:17
+ */
+@ApiIgnore
+@RestController
+@RequestMapping("/feign-client/order")
+public class MallAdminFeignClient implements MallAdminFeignService {
+    @Autowired
+    private OmsOrderService orderService;
+
+    @PostMapping(value = "/userOrderInfoList")
+    public HttpResponseResult<List<Map<String,Object>>> userOrderInfoList(@RequestBody Map<String,Object> param) {
+        List<Map<String,Object>> orderList = orderService.userOrderInfoList(param);
+        return HttpResponseResult.succeed(orderList);
+    }
+}

+ 1 - 1
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/config/ResourceServerConfig.java

@@ -30,7 +30,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
                 .permitAll()
             .and()
                 .authorizeRequests()
-                .antMatchers("/wechat/*","/v2/api-docs", "/code/*","/payment/callback","/admin/login")
+                .antMatchers("/wechat/*","/feign-client/**","/v2/api-docs", "/code/*","/payment/callback","/admin/login")
             .permitAll().anyRequest().authenticated().and().httpBasic();
     }
 

+ 0 - 13
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/OmsOrderController.java

@@ -37,19 +37,6 @@ public class OmsOrderController {
         return CommonResult.success(CommonPage.restPage(orderList));
     }
 
-    @ApiOperation("远程查询订单成功的用户和时间信息")
-    @PostMapping(value = "/userOrderInfoList")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "startTime", dataType = "LocalDateTime", value = "订单开始时间", required = true),
-            @ApiImplicitParam(name = "endTime", dataType = "LocalDateTime", value = "订单结束时间",required = true),
-            @ApiImplicitParam(name = "userIdList", dataType = "List", value = "用户id集合",required = true),
-    })
-    @ResponseBody
-    public CommonResult<List<Map<String,Object>>> userOrderInfoList(@RequestBody Map<String,Object> param) {
-        List<Map<String,Object>> orderList = orderService.userOrderInfoList(param);
-        return CommonResult.success(orderList);
-    }
-
     @ApiOperation("批量发货")
     @RequestMapping(value = "/update/delivery", method = RequestMethod.POST)
     @ResponseBody

+ 0 - 2
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/dao/OmsOrderDao.java

@@ -30,7 +30,5 @@ public interface OmsOrderDao {
      */
     OmsOrderDetail getDetail(@Param("id") Long id);
 
-
-
     List<Map<String,Object>> getUserOrderInfoList(Map<String, Object> param);
 }

+ 3 - 4
cooleshow-mall/mall-admin/src/main/resources/config/mybatis/OmsOrderDao.xml

@@ -88,11 +88,10 @@
         ORDER BY oi.id ASC,oh.create_time DESC
     </select>
 
-
-
     <select id="getUserOrderInfoList" resultType="java.util.Map">
-        select member_id as userId,
-        min(receive_time) as receiveTime
+        select
+            member_id as userId,
+            min(receive_time) as receiveTime
         from oms_order
         <where>
             <if test="startTime != null and startTime !=''">

+ 0 - 2
cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/enums/OrdeerCacherEnmu.java

@@ -18,8 +18,6 @@ public enum OrdeerCacherEnmu {
     LOCK_REFUND_ORDER_MALL("商城退款锁"),
 
     ;
-
-    ;
     /***
      * 缓存描述
      * @author liweifan

+ 1 - 1
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/task/OrderTimeOutCancelTask.java

@@ -23,7 +23,7 @@ public class OrderTimeOutCancelTask {
     /**
      * 订单轮询
      */
-    @GetMapping("/pollingOrder")
+    @GetMapping("/cancelTimeOutOrder")
     public HttpResponseResult cancelTimeOutOrder(){
         Integer count = portalOrderService.cancelTimeOutOrder();
         LOGGER.info("取消订单,并根据sku编号释放锁定库存,取消订单数量:{}",count);

+ 23 - 0
cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/TotalStudentTimeTask.java

@@ -0,0 +1,23 @@
+package com.yonge.cooleshow.task.jobs;
+
+import com.yonge.cooleshow.api.feign.StudentFeignService;
+import com.yonge.cooleshow.api.feign.TeacherFeignService;
+import com.yonge.cooleshow.task.core.BaseTask;
+import com.yonge.cooleshow.task.core.TaskException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Author: liweifan
+ * @Data: 2022/3/28 15:55
+ */
+@Service
+public class TotalStudentTimeTask extends BaseTask {
+    @Autowired
+    private StudentFeignService studentFeignService;
+
+    @Override
+    public void execute() throws TaskException {
+        Object o = studentFeignService.totalStudentTime();
+    }
+}

+ 13 - 0
cooleshow-user/user-biz/pom.xml

@@ -46,6 +46,13 @@
             <artifactId>swagger-spring-boot-starter</artifactId>
         </dependency>
 
+        <!-- mybatis-plus -->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.0.7.1</version>
+        </dependency>
+
         <dependency>
             <groupId>commons-lang</groupId>
             <artifactId>commons-lang</artifactId>
@@ -74,6 +81,12 @@
         </dependency>
 
         <dependency>
+            <groupId>com.yonge.cooleshow</groupId>
+            <artifactId>cooleshow-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
             <groupId>com.huifu.adapay</groupId>
             <artifactId>adapay-java-sdk</artifactId>
             <version>1.2.10</version>

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/SysMessageDao.java

@@ -52,4 +52,6 @@ public interface SysMessageDao extends BaseDAO<Long, SysMessage> {
 	 * 修改单个消息状态
 	 */
 	public int updateOneStatus(@Param("id") Long id, @Param("status") int status);
+
+    String selectConfigUrl(String messageType);
 }

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/StudentTime.java

@@ -19,7 +19,7 @@ import org.springframework.format.annotation.DateTimeFormat;
 @ApiModel(value = "StudentTime对象", description = "学生使用功能时间表")
 public class StudentTime implements Serializable {
     private static final long serialVersionUID = 1L;
-    @TableId(value = "user_id_", type = IdType.AUTO)
+    @TableId(value = "user_id_")
     private Long userId;
     @ApiModelProperty("第一次购买vip时间 ")
     @TableField(value = "first_vip_time_")

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrder.java

@@ -72,6 +72,9 @@ public class UserOrder implements Serializable {
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date payTime;
+    @ApiModelProperty("原因 ")
+    @TableField(value = "reason_")
+    private String reason;
     @TableField(value = "update_time_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@@ -197,6 +200,14 @@ public class UserOrder implements Serializable {
         this.payTime = payTime;
     }
 
+    public String getReason() {
+        return reason;
+    }
+
+    public void setReason(String reason) {
+        this.reason = reason;
+    }
+
     public Date getUpdateTime() {
         return updateTime;
     }

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

@@ -13,7 +13,7 @@ import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
  */
 public interface StudentTimeService extends IService<StudentTime> {
     /***
-     * 统计学员第一次购买时间(一天一次,统计前一天数据)
+     * 统计学员第一次购买时间(半小时一次,统计当天数据)
      * @author liweifan
      * @updateTime 2022/4/26 14:39
      */

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

@@ -126,4 +126,5 @@ public interface SysMessageService extends BaseService<Long, SysMessage> {
 	
 	public List<SysMessage> queryUserInRecentMinList(String mobile, int recentMin, MessageSendMode type);
 
+	String selectConfigUrl(String messageType);
 }

+ 9 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderService.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderPayReq;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.entity.UserOrder;
+import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderPayRes;
@@ -135,4 +136,12 @@ public interface UserOrderService extends IService<UserOrder> {
      * @return: java.util.List<com.yonge.cooleshow.biz.dal.entity.UserOrder>
      */
     List<UserOrder> selectUnRecordTimeOrder(OrderSearch query);
+    /***
+     * 修改订单状态(测试用)
+     * @author liweifan
+     * @param: orderNo
+     * @param: orderStatus
+     * @updateTime 2022/4/29 18:41
+     */
+    void setOrderStatus(String orderNo, OrderStatusEnum orderStatus);
 }

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

@@ -936,6 +936,8 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         }
         courseScheduleTeacherSalaryService.getDao().insertBatch(teacherSalaryList);
         log.info("buyPracticeCourseSuccess ok");
+
+
     }
 
     /**

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

@@ -1,10 +1,14 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.api.feign.MallAdminFeignService;
 import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
 import com.yonge.cooleshow.biz.dal.entity.UserOrder;
 import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
+import com.yonge.cooleshow.biz.dal.service.UserOrderDetailService;
 import com.yonge.cooleshow.biz.dal.service.UserOrderService;
+import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.slf4j.Logger;
@@ -12,12 +16,16 @@ import org.slf4j.LoggerFactory;
 import com.yonge.cooleshow.biz.dal.entity.StudentTime;
 import com.yonge.cooleshow.biz.dal.dao.StudentTimeDao;
 import com.yonge.cooleshow.biz.dal.service.StudentTimeService;
+import org.springframework.util.CollectionUtils;
 
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 
 @Service
@@ -25,6 +33,11 @@ public class StudentTimeServiceImpl extends ServiceImpl<StudentTimeDao, StudentT
     private final static Logger log = LoggerFactory.getLogger(StudentTimeServiceImpl.class);
     @Autowired
     private UserOrderService userOrderService;
+    @Autowired
+    private UserOrderDetailService orderDetailService;
+    @Autowired
+    private MallAdminFeignService mallAdminFeignService;
+
     @Override
     public void totalStudentTime() {
         LocalDate toDay = LocalDate.now();
@@ -32,8 +45,95 @@ public class StudentTimeServiceImpl extends ServiceImpl<StudentTimeDao, StudentT
         OrderSearch query = new OrderSearch();
         query.setStartTime(LocalDateTime.of(toDay, LocalTime.MIN));
         query.setEndTime(LocalDateTime.of(toDay, LocalTime.MAX));
+
+        Map<Long, StudentTime> studentTimeMap = new HashMap<>();
+
         List<UserOrder> orderList = userOrderService.selectUnRecordTimeOrder(query);
-        //查询需要统计的用户
+        if (!CollectionUtils.isEmpty(orderList)) {
+            List<Long> userIds = orderList.stream().map(UserOrder::getUserId).collect(Collectors.toList());
+            List<StudentTime> studentTimes = baseMapper.selectBatchIds(userIds);
+            for (StudentTime studentTime : studentTimes) {
+                studentTimeMap.put(studentTime.getUserId(), studentTime);
+            }
+        }
+
+        Date now = new Date();
+        for (UserOrder userOrder : orderList) {
+            StudentTime studentTime = studentTimeMap.get(userOrder.getUserId());
+            if (null == studentTime) {
+                studentTime = new StudentTime();
+            }
+
+            List<UserOrderDetailVo> orderDetilListByOrderNo = orderDetailService.getOrderDetilListByOrderNo(userOrder.getOrderNo());
+
+            for (UserOrderDetailVo detailVo : orderDetilListByOrderNo) {
+                if (null == studentTime.getFirstVipTime() && GoodTypeEnum.VIP.equals(detailVo.getGoodType())) {
+                    studentTime.setFirstVipTime(now);
+                }
+                if (null == studentTime.getFirstPracticeTime() && GoodTypeEnum.PRACTICE.equals(detailVo.getGoodType())) {
+                    studentTime.setFirstPracticeTime(now);
+                }
+                if (null == studentTime.getFirstLiveTime() && GoodTypeEnum.LIVE.equals(detailVo.getGoodType())) {
+                    studentTime.setFirstLiveTime(now);
+                }
+                if (null == studentTime.getFirstVideoTime() && GoodTypeEnum.VIDEO.equals(detailVo.getGoodType())) {
+                    studentTime.setFirstVideoTime(now);
+                }
+                if (null == studentTime.getFirstMusicTime() && GoodTypeEnum.MUSIC.equals(detailVo.getGoodType())) {
+                    studentTime.setFirstMusicTime(now);
+                }
+            }
+            if (null == studentTime.getUserId()) {
+                studentTime.setUserId(userOrder.getUserId());
+                baseMapper.insert(studentTime);
+            } else {
+                baseMapper.updateById(studentTime);
+            }
+        }
+        //商城用户统计
+        Map<String, Object> param = new HashMap<>();
+        param.put("startTime", query.getStartTime());
+        param.put("endTime", query.getEndTime());
+        List<Map<String, Object>> mallDataList = mallAdminFeignService.userOrderInfoList(param).getData();
+        Map<Long, Date> timeMap = new HashMap<>();
+        if (CollectionUtils.isEmpty(mallDataList)) {
+            return;
+        }
+
+        for (Map<String, Object> data : mallDataList) {
+            try {
+                Long userId = Long.valueOf(data.get("userId").toString());
+                Date receiveTime = new Date(Long.valueOf(data.get("receiveTime").toString()));
+                timeMap.put(userId, receiveTime);
+            } catch (Exception e) {
+                log.error("统计学生首次使用时间异常,param is {}", JSONObject.toJSONString(data));
+                continue;
+            }
+        }
+
+        List<StudentTime> studentTimes = baseMapper.selectBatchIds(timeMap.keySet());
+        Map<Long, StudentTime> mallStudentTimeMap = new HashMap<>();
+        for (StudentTime studentTime : studentTimes) {
+            mallStudentTimeMap.put(studentTime.getUserId(), studentTime);
+        }
+
+        for (Long userId : timeMap.keySet()) {
+            StudentTime studentTime = mallStudentTimeMap.get(userId);
+            if (null == studentTime) {
+                studentTime = new StudentTime();
+            }
+
+            if (null == studentTime.getFirstMallTime()) {
+                studentTime.setFirstMallTime(timeMap.get(userId));
+            }
+
+            if (null == studentTime.getUserId()) {
+                studentTime.setUserId(userId);
+                baseMapper.insert(studentTime);
+            } else {
+                baseMapper.updateById(studentTime);
+            }
+        }
 
     }
 

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

@@ -409,4 +409,9 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 	public List<SysMessage> queryUserInRecentMinList(String mobile, int recentMin, MessageSendMode type) {
 		return sysMessageDao.queryUserInRecentMinList(mobile, recentMin, type);
 	}
+
+	@Override
+	public String selectConfigUrl(String messageType) {
+		return sysMessageDao.selectConfigUrl(messageType);
+	}
 }

+ 62 - 75
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java

@@ -28,6 +28,7 @@ import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
 import com.yonge.cooleshow.biz.dal.dao.UserOrderDao;
@@ -36,6 +37,7 @@ import org.springframework.transaction.annotation.Transactional;
 import javax.annotation.PostConstruct;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.time.LocalDateTime;
 import java.util.*;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
@@ -67,9 +69,6 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     @Autowired
     private MusicSheetService musicSheetService;
     @Autowired
-    private StudentTimeService studentTimeService;
-
-    @Autowired
     private RedissonClient redissonClient;
 
     //验证订单是否可以下单
@@ -166,6 +165,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public HttpResponseResult<Boolean> orderCancel(OrderPayReq payReq) {
         UserOrderVo detail = detail(payReq.getOrderNo());
         if (null == detail) {
@@ -207,6 +207,24 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     }
 
     @Override
+    public void setOrderStatus(String orderNo, OrderStatusEnum orderStatus) {
+        UserOrderVo detail = detail(orderNo);
+        if(OrderStatusEnum.WAIT_PAY.equals(detail.getStatus())
+            || OrderStatusEnum.PAYING.equals(detail.getStatus())){
+
+            if(OrderStatusEnum.CLOSE.equals(orderStatus)){
+                doOrderCancel(detail,orderStatus,"测试接口-订单关闭");
+            }
+            if(OrderStatusEnum.FAIL.equals(orderStatus)){
+                doOrderCancel(detail,orderStatus,"测试接口-订单交易失败");
+            }
+            if(OrderStatusEnum.PAID.equals(orderStatus)){
+                orderSuccess(detail);
+            }
+        }
+    }
+
+    @Override
     public IPage<UserOrderVo> selectPage(IPage<UserOrderVo> page, OrderSearch query) {
         return page.setRecords(baseMapper.selectPage(page, query));
     }
@@ -300,6 +318,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void orderCallback(String data, String type) {
         JSONObject hfRes = JSONObject.parseObject(data);
         if (type.equals("payment.succeeded")) {//支付成功
@@ -407,66 +426,30 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         //查询半小时前创建的并且还未完成的订单 WAIT_PAY 待支付订单 PAYING 支付中订单
         OrderSearch search = new OrderSearch();
         search.setStatus(OrderStatusEnum.WAIT_PAY.getCode());
+        search.setEndTime(LocalDateTime.now().minusMinutes(30));
         //查询待支付订单
         List<UserOrderVo> waitPayOrderList = baseMapper.selectList(search);
-        ((Runnable) () -> {
-            List<UserOrderVo> dataList = waitPayOrderList;
-            for (UserOrderVo orderVo : dataList) {
-                long now = System.currentTimeMillis();
-
-                Date createTime = orderVo.getCreateTime();
-                long interval = 0L;
-                //订单到期时间为创建时间往后30分钟
-                if(null != createTime){
-                    interval = createTime.getTime() + 1000 * 60 * 30l - now;
-                }
-                //等待时间后取消订单
-                try {
-                    Thread.sleep(interval);
-                } catch (InterruptedException e) {
-                    e.printStackTrace();
-                }
-                //取消订单要获取锁,防止在轮询取消时,用户修改订单状态
-                boolean b = DistributedLock.of(redissonClient)
-                        .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(orderVo.getUserId())
-                                , () -> pollingCancelOrder(orderVo.getOrderNo()), 60L, TimeUnit.SECONDS);
-            }
-        }).run();
-
+        for (UserOrderVo orderVo : waitPayOrderList) {
+            //取消订单要获取锁,防止在轮询取消时,用户修改订单状态
+            boolean b = DistributedLock.of(redissonClient)
+                    .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(orderVo.getUserId())
+                            , () -> pollingCancelOrder(orderVo.getOrderNo()), 60L, TimeUnit.SECONDS);
+        }
 
         search.setStatus(OrderStatusEnum.PAYING.getCode());
+        search.setEndTime(LocalDateTime.now().minusMinutes(120));
         //查询待支付中订单
         List<UserOrderVo> payingOrderList = baseMapper.selectList(search);
-        ((Runnable) () -> {
-            List<UserOrderVo> dataList = payingOrderList;
-            for (UserOrderVo orderVo : dataList) {
-                long now = System.currentTimeMillis();
-                Date createTime = orderVo.getCreateTime();
-
-                long interval = 0L;
-                //订单到期时间为创建时间往后30分钟
-                if(null != createTime){
-                    interval = createTime.getTime() + 1000 * 60 * 120l - now;
-                }
-                //间隔时间超过30分钟的,留给下次轮询处理
-                if(interval >= 1000 * 60 * 30){
-                    continue;
-                }
-                //等待时间后取消订单
-                try {
-                    Thread.sleep(interval);
-                } catch (InterruptedException e) {
-                    e.printStackTrace();
-                }
-                //取消订单要获取锁,防止在轮询取消时,用户修改订单状态
-                boolean b = DistributedLock.of(redissonClient)
-                        .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(orderVo.getUserId())
-                                , () -> pollingCancelOrder(orderVo.getOrderNo()), 60L, TimeUnit.SECONDS);
-            }
-        }).run();
+        for (UserOrderVo orderVo : payingOrderList) {
+            //取消订单要获取锁,防止在轮询取消时,用户修改订单状态
+            boolean b = DistributedLock.of(redissonClient)
+                    .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(orderVo.getUserId())
+                            , () -> pollingCancelOrder(orderVo.getOrderNo()), 60L, TimeUnit.SECONDS);
+        }
     }
 
-    private void pollingCancelOrder(String orderNo){
+    @Transactional(rollbackFor = Exception.class)
+    void pollingCancelOrder(String orderNo) {
         UserOrderVo detail = detail(orderNo);
         if (null == detail) {
             return;
@@ -475,7 +458,9 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             try {
                 Map<String, Object> resMap = paymentSdk.queryPayment(detail.getTransNo());
                 //支付成功
-                if (TradeStatusEnum.succeeded.getCode().equals(resMap.get("status").toString())) {
+                if (TradeStatusEnum.succeeded.getCode().equals(resMap.get("status").toString())
+                        && (OrderStatusEnum.WAIT_PAY.equals(detail.getStatus())
+                        || OrderStatusEnum.PAYING.equals(detail.getStatus()))) {
                     orderSuccess(detail);
                     return;
                 }
@@ -780,24 +765,6 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             return;
         }
 
-        UserOrderPayment orderPayment = orderPaymentService.detailByOrderNo(userOrder.getOrderNo());
-        if (null != orderPayment) {
-            //更新付款单
-            orderPayment.setStatus(TradeStatusEnum.failed);
-            orderPayment.setPayFailMsg(StringUtil.isEmpty(reason) ? "交易取消" : reason);
-            orderPayment.setUpdateTime(new Date());
-            //发送支付关单请求
-            HttpResponseResult<Map<String, Object>> responseResult = paymentSdk.closePayment(userOrder.getTransNo(), reason, "");
-            if (!responseResult.getStatus()) {
-                orderPayment.setCloseStatus(TradeStatusEnum.failed);
-                orderPayment.setCloseFailMsg(responseResult.getMsg());
-                orderPaymentService.updateById(orderPayment);
-                return;
-            } else {
-                orderPayment.setCloseStatus(TradeStatusEnum.pending);
-                orderPaymentService.updateById(orderPayment);
-            }
-        }
         List<UserOrderDetailVo> orderDetailList = orderDetailService.getOrderDetilListByOrderNo(userOrder.getOrderNo());
         for (UserOrderDetailVo orderDetailVo : orderDetailList) {
             orderDetailVo.setUserId(userOrder.getUserId());
@@ -808,10 +775,30 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
                 userOrderVoConsumer.accept(orderDetailVo);
             }
         }
-
+        userOrder.setReason(reason);
         userOrder.setStatus(orderStatus);
         userOrder.setUpdateTime(new Date());
         baseMapper.updateById(userOrder);
+
+
+        UserOrderPayment orderPayment = orderPaymentService.detailByOrderNo(userOrder.getOrderNo());
+        if (null != orderPayment) {
+            //更新付款单
+            orderPayment.setStatus(TradeStatusEnum.failed);
+            orderPayment.setPayFailMsg(StringUtil.isEmpty(reason) ? "交易取消" : reason);
+            orderPayment.setUpdateTime(new Date());
+        }
+        //发送支付关单请求
+        HttpResponseResult<Map<String, Object>> responseResult = paymentSdk.closePayment(userOrder.getTransNo(), reason, "");
+        if (!responseResult.getStatus()) {
+            orderPayment.setCloseStatus(TradeStatusEnum.failed);
+            orderPayment.setCloseFailMsg(responseResult.getMsg());
+            orderPaymentService.updateById(orderPayment);
+            return;
+        } else {
+            orderPayment.setCloseStatus(TradeStatusEnum.pending);
+            orderPaymentService.updateById(orderPayment);
+        }
     }
 
     void orderSuccess(UserOrderVo detail) {

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

@@ -11,11 +11,9 @@ import com.yonge.cooleshow.biz.dal.dto.UserAccountRecordDto;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.dao.VideoLessonPurchaseRecordDao;
-import com.yonge.cooleshow.biz.dal.enums.AccountBizTypeEnum;
-import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
-import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
-import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
+import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.service.SysConfigService;
+import com.yonge.cooleshow.biz.dal.service.SysMessageService;
 import com.yonge.cooleshow.biz.dal.service.UserAccountService;
 import com.yonge.cooleshow.biz.dal.service.VideoLessonPurchaseRecordService;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
@@ -23,6 +21,7 @@ import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.exception.BizException;
+import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import com.yonge.toolset.utils.obj.ObjectUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -59,6 +58,8 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
     private SysConfigService sysConfigService;
     @Autowired
     private UserOrderDao userOrderDao;
+    @Autowired
+    private SysMessageService sysMessageService;
 
     public VideoLessonPurchaseRecordDao getDao() {
         return videoLessonPurchaseRecordDao;
@@ -89,10 +90,10 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
         }
 
         //校验课程是否购买
-        VideoLessonPurchaseRecord isAlreadyBuy= videoLessonPurchaseRecordDao.selectOne(Wrappers.<VideoLessonPurchaseRecord>lambdaQuery()
+        VideoLessonPurchaseRecord isAlreadyBuy = videoLessonPurchaseRecordDao.selectOne(Wrappers.<VideoLessonPurchaseRecord>lambdaQuery()
                 .eq(VideoLessonPurchaseRecord::getStudentId, studentId)
                 .eq(VideoLessonPurchaseRecord::getVideoLessonGroupId, groupId));
-        if (!ObjectUtil.isEmpty(isAlreadyBuy)){
+        if (!ObjectUtil.isEmpty(isAlreadyBuy)) {
             throw new BizException("已购买过该课程");
         }
 
@@ -141,7 +142,7 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
             throw new BizException("订单不存在!");
         }
         //修改支付状态
-        videoLessonPurchaseRecordDao.updateStatus(orderNo,userOrder.getStatus().getCode());
+        videoLessonPurchaseRecordDao.updateStatus(orderNo, userOrder.getStatus().getCode());
 
         //查询直播课服务费
         String videoServiceRateStr = sysConfigService.findConfigValue(SysConfigConstant.VIDEO_LESSON_SERVICE_FEE);
@@ -149,11 +150,12 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
 
         //查询组信息
         VideoLessonGroup lessonGroup = videoLessonGroupDao.selectById(purchaseRecord.getVideoLessonGroupId());
-
+        Long teacherId = lessonGroup.getTeacherId();
+        Long studentId = purchaseRecord.getStudentId();
         //记录流水
         BigDecimal payMoney = purchaseRecord.getPayMoney();//学生支付金额
         UserAccountRecordDto userAccountRecord = new UserAccountRecordDto();
-        userAccountRecord.setUserId(lessonGroup.getTeacherId());
+        userAccountRecord.setUserId(teacherId);
         //扣除手续费后所得金额
         userAccountRecord.setTransAmount(payMoney.subtract(payMoney.multiply(liveServiceRate)).setScale(2, RoundingMode.HALF_UP));
         userAccountRecord.setInOrOut(InOrOutEnum.IN);
@@ -163,6 +165,27 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
         userAccountRecord.setOrderNo(orderNo);
         userAccountService.accountChange(userAccountRecord);
         log.info("buyVideoCourseSuccess ok");
+
+        //查询老师&学生信息
+        SysUser teacher = sysUserFeignService.queryUserById(teacherId);
+        SysUser student = sysUserFeignService.queryUserById(studentId);
+
+        //消息接收者(Key:用户编号 value:消息接收对象)
+        Map<Long, String> teacherReceivers = new HashMap<>();
+        teacherReceivers.put(teacherId, teacher.getPhone());
+        Map<Long,String> studentReceivers = new HashMap<>();
+        studentReceivers.put(studentId, student.getPhone());
+
+        //消息推送-老师端
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_BUY_VIDEO,
+                teacherReceivers, null, 0, null, ClientEnum.TEACHER.getCode(),
+                student.getUsername(), lessonGroup.getLessonName());
+
+        //消息推送-学生端
+        String url = sysMessageService.selectConfigUrl(MessageTypeEnum.VIDEO_BUY.getCode());
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.VIDEO_BUY,
+                studentReceivers, null, 0, null, ClientEnum.STUDENT.getCode(),
+                teacher.getUsername(), lessonGroup.getLessonName(),url);
     }
 
     /**

+ 3 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/SysMessageMapper.xml

@@ -202,4 +202,7 @@
 		from sys_message where receiver_ = #{mobile} and type_ = #{type} and <![CDATA[DATE_ADD(send_time_,
 		INTERVAL #{recentMin} MINUTE) >= now()]]>
 	</select>
+	<select id="selectConfigUrl" resultType="java.lang.String" parameterType="java.lang.String">
+		SELECT url_ FROM sys_message_config WHERE message_type_=#{messageType}
+	</select>
 </mapper>

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

@@ -105,7 +105,7 @@
                 SELECT u.username_ FROM sys_user u WHERE u.id_ = t.verify_user_id_
             ) as verifyUser
         from teacher_auth_entry_record t
-        left join sys_user u on t.verify_user_id_ = u.id_
+        left join sys_user u on t.user_id_ = u.id_
         where t.user_id_ = #{userId}
 		order by t.create_time_ desc limit 1
     </select>

+ 11 - 9
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderMapper.xml

@@ -17,6 +17,7 @@
         <result column="user_note_" property="userNote"/>
         <result column="create_time_" property="createTime"/>
         <result column="pay_time_" property="payTime"/>
+        <result column="reason_" property="reason"/>
         <result column="update_time_" property="updateTime"/>
     </resultMap>
 
@@ -37,6 +38,7 @@
         , t.user_note_ as userNote
         , t.create_time_ as createTime
         , t.pay_time_ as payTime
+        , t.reason_ as reason
         , t.update_time_ as updateTime
         </sql>
 
@@ -168,19 +170,19 @@
 
     <select id="selectUnRecordTimeOrder" resultType="com.yonge.cooleshow.biz.dal.entity.UserOrder">
         SELECT
-        <include refid="baseColumns"/>
+            <include refid="baseColumns"/>
         FROM user_order t
         left join student_time st on t.user_id_ = st.user_id_
         where t.status_ = 'PAID'
         and exists (
-        select 1 from user_order_detail od where t.order_no_ = od.order_no_
-        and (
-        (st.first_vip_time_ is null and od.good_type_ = 'VIP') or
-        (st.first_practice_time_ is null and od.good_type_ = 'PRACTICE') or
-        (st.first_video_time_ is null and od.good_type_ = 'VIDEO') or
-        (st.first_live_time_ is null and od.good_type_ = 'LIVE') or
-        (st.first_music_time_ is null and od.good_type_ = 'MUSIC')
-        )
+            select 1 from user_order_detail od where t.order_no_ = od.order_no_
+            and (
+                (st.first_vip_time_ is null and od.good_type_ = 'VIP') or
+                (st.first_practice_time_ is null and od.good_type_ = 'PRACTICE') or
+                (st.first_video_time_ is null and od.good_type_ = 'VIDEO') or
+                (st.first_live_time_ is null and od.good_type_ = 'LIVE') or
+                (st.first_music_time_ is null and od.good_type_ = 'MUSIC')
+            )
         )
         <if test="param.startTime !=null">
             <![CDATA[AND t.create_time_ >= #{param.startTime} ]]>

+ 11 - 4
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java

@@ -9,6 +9,7 @@ import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
 import com.yonge.cooleshow.biz.dal.entity.UserOrder;
 import com.yonge.cooleshow.biz.dal.enums.CacheNameEnum;
 import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
 import com.yonge.cooleshow.biz.dal.service.UserOrderService;
 import com.yonge.cooleshow.biz.dal.support.DistributedLock;
 import com.yonge.cooleshow.biz.dal.support.PageUtil;
@@ -244,13 +245,19 @@ public class UserOrderController extends BaseController {
         return succeed(detail);
     }
 
-    /**
-     * 查询单条
-     */
     @GetMapping("/setSuccessStatus")
-    @ApiOperation(value = "完成所有订单")
+    @ApiOperation(value = "完成所有订单(测试用)")
     public HttpResponseResult<Boolean> setSuccessStatus() {
         userOrderService.setSuccessStatus();
         return succeed(true);
     }
+
+    @GetMapping("/setOrderStatus")
+    @ApiOperation(value = "设置订单状态(测试用)")
+    public HttpResponseResult<Boolean> setOrderStatus(
+            @RequestParam("orderNo") String orderNo,
+            @RequestParam("orderStatus") OrderStatusEnum orderStatus) {
+        userOrderService.setOrderStatus(orderNo,orderStatus);
+        return succeed(true);
+    }
 }

+ 19 - 8
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/task/TaskController.java

@@ -1,10 +1,7 @@
 package com.yonge.cooleshow.student.task;
 
 import com.yonge.cooleshow.biz.dal.entity.StudentTotal;
-import com.yonge.cooleshow.biz.dal.service.StudentService;
-import com.yonge.cooleshow.biz.dal.service.StudentTotalService;
-import com.yonge.cooleshow.biz.dal.service.TeacherService;
-import com.yonge.cooleshow.biz.dal.service.UserOrderService;
+import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.vo.StudentTotalVo;
 import com.yonge.cooleshow.biz.dal.vo.TeacherTotalVo;
 import com.yonge.cooleshow.common.controller.BaseController;
@@ -26,12 +23,14 @@ public class TaskController extends BaseController {
     @Autowired
     private StudentTotalService studentTotalService;
     @Autowired
+    private StudentTimeService studentTimeService;
+    @Autowired
     private UserOrderService userOrderService;
     /***
      * 查询所有学生统计数据
      * @author liweifan
-     * @updateTime 2022/3/29 11:58
-     * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<java.util.List<com.yonge.cooleshow.biz.dal.vo.StudentTotalVo>>
+     * @updateTime 2022/4/29 19:12
+     * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<java.util.List<com.yonge.cooleshow.biz.dal.entity.StudentTotal>>
      */
     @GetMapping("/queryStudentTotal")
     public HttpResponseResult<List<StudentTotal>> queryStudentTotal() {
@@ -39,10 +38,22 @@ public class TaskController extends BaseController {
     }
 
     /***
+     * 统计学员第一次购买时间(半小时一次,统计当天数据)
+     * @author liweifan
+     * @updateTime 2022/4/29 19:12
+     * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<java.lang.Boolean>
+     */
+    @GetMapping("/totalStudentTime")
+    public HttpResponseResult<Boolean> totalStudentTime() {
+        studentTimeService.totalStudentTime();
+        return succeed(true);
+    }
+
+    /***
      * 轮询用户订单
      * @author liweifan
-     * @updateTime 2022/3/29 11:58
-     * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<java.util.List<com.yonge.cooleshow.biz.dal.vo.StudentTotalVo>>
+     * @updateTime 2022/4/29 19:12
+     * @return: com.yonge.cooleshow.common.entity.HttpResponseResult
      */
     @GetMapping("/pollingOrder")
     public HttpResponseResult pollingOrder() {

+ 0 - 7
toolset/toolset-mybatis/pom.xml

@@ -32,13 +32,6 @@
             <artifactId>mybatis-spring-boot-starter</artifactId>
         </dependency>
 
-        <!-- mybatis-plus -->
-        <dependency>
-            <groupId>com.baomidou</groupId>
-            <artifactId>mybatis-plus-boot-starter</artifactId>
-            <version>3.0.7.1</version>
-        </dependency>
-
         <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>druid-spring-boot-starter</artifactId>