Browse Source

代码提交

weifanli 2 years ago
parent
commit
814c387844
27 changed files with 386 additions and 114 deletions
  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. 49 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/AppConstant.java
  7. 7 0
      cooleshow-mall/mall-admin/pom.xml
  8. 32 0
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/client/MallAdminFeignClient.java
  9. 1 1
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/config/ResourceServerConfig.java
  10. 0 13
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/OmsOrderController.java
  11. 0 2
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/dao/OmsOrderDao.java
  12. 3 4
      cooleshow-mall/mall-admin/src/main/resources/config/mybatis/OmsOrderDao.xml
  13. 0 2
      cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/enums/OrdeerCacherEnmu.java
  14. 1 1
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/task/OrderTimeOutCancelTask.java
  15. 23 0
      cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/TotalStudentTimeTask.java
  16. 13 0
      cooleshow-user/user-biz/pom.xml
  17. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/StudentTime.java
  18. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrder.java
  19. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/StudentTimeService.java
  20. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderService.java
  21. 75 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentTimeServiceImpl.java
  22. 42 57
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  23. 1 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherAuthEntryRecordMapper.xml
  24. 11 9
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderMapper.xml
  25. 11 4
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java
  26. 19 8
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/task/TaskController.java
  27. 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;
     }

+ 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>

+ 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
      */

+ 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);
 }

+ 75 - 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,69 @@ 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, LocalDateTime> timeMap = new HashMap<>();
+        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()));
+
+            } catch (Exception e) {
+                log.error("统计学生首次使用时间异常,param is {}", JSONObject.toJSONString(data));
+                continue;
+            }
+        }
+        List<Long> userIds = orderList.stream().map(UserOrder::getUserId).collect(Collectors.toList());
+
 
     }
 

+ 42 - 57
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;
                 }
@@ -808,7 +793,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
                 userOrderVoConsumer.accept(orderDetailVo);
             }
         }
-
+        userOrder.setReason(reason);
         userOrder.setStatus(orderStatus);
         userOrder.setUpdateTime(new Date());
         baseMapper.updateById(userOrder);

+ 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>