Browse Source

fix:merge

liujunchi 3 years ago
parent
commit
7810d6e7ec
22 changed files with 329 additions and 86 deletions
  1. 9 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/StudentFeignService.java
  2. 6 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/StudentFeignServiceFallback.java
  3. 21 0
      cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/NoRepliedTeacherTask.java
  4. 5 0
      cooleshow-user/user-biz/pom.xml
  5. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/config/HuifuConfiguration.java
  6. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleDao.java
  7. 41 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/props/HuifuProperties.java
  8. 26 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/sdk/PaymentSdk.java
  9. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseRepliedService.java
  10. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderService.java
  11. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  12. 27 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseRepliedServiceImpl.java
  13. 19 24
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  14. 5 10
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  15. 38 38
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonPurchaseRecordServiceImpl.java
  16. 38 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/RepliedCountVo.java
  17. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/VideoLessonPurchaseVo.java
  18. 18 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  19. 4 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/VideoLessonGroupMapper.xml
  20. 19 2
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/PaymentController.java
  21. 8 7
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java
  22. 13 0
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/task/TaskController.java

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

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.api.feign;
 
 import com.yonge.cooleshow.api.feign.fallback.StudentFeignServiceFallback;
+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.GetMapping;
@@ -32,4 +33,12 @@ public interface StudentFeignService {
      */
     @GetMapping(value = "/task/pollingOrder")
     Object pollingOrder();
+
+    /**
+     * @Description: 当日陪练课未对老师评价(每晚9点,已评价不发)
+     * @Author: cy
+     * @Date: 2022/5/6
+     */
+    @GetMapping("/task/noRepliedTeacher")
+    HttpResponseResult noRepliedTeacher();
 }

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

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.api.feign.fallback;
 
 import com.yonge.cooleshow.api.feign.StudentFeignService;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import org.springframework.stereotype.Component;
 
 @Component
@@ -20,4 +21,9 @@ public class StudentFeignServiceFallback implements StudentFeignService {
     public Object pollingOrder() {
         return null;
     }
+
+    @Override
+    public HttpResponseResult noRepliedTeacher() {
+        return null;
+    }
 }

+ 21 - 0
cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/NoRepliedTeacherTask.java

@@ -0,0 +1,21 @@
+package com.yonge.cooleshow.task.jobs;
+
+import com.yonge.cooleshow.api.feign.StudentFeignService;
+import com.yonge.cooleshow.task.core.BaseTask;
+import com.yonge.cooleshow.task.core.TaskException;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * @Author: cy
+ * @Date: 2022/5/6
+ */
+public class NoRepliedTeacherTask extends BaseTask {
+
+    @Autowired
+    private StudentFeignService noticeRelease;
+
+    @Override
+    public void execute() throws TaskException {
+        noticeRelease.noRepliedTeacher();
+    }
+}

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

@@ -91,6 +91,11 @@
             <artifactId>adapay-java-sdk</artifactId>
             <version>1.2.10</version>
         </dependency>
+        <dependency>
+            <groupId>com.alipay.sdk</groupId>
+            <artifactId>alipay-sdk-java</artifactId>
+            <version>4.23.0.ALL</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/config/HuifuConfiguration.java

@@ -1,5 +1,7 @@
 package com.yonge.cooleshow.biz.dal.config;
 
+import com.alipay.api.AlipayClient;
+import com.alipay.api.DefaultAlipayClient;
 import com.huifu.adapay.Adapay;
 import com.huifu.adapay.model.MerConfig;
 import com.yonge.cooleshow.biz.dal.props.HuifuProperties;
@@ -30,6 +32,16 @@ public class HuifuConfiguration {
 		return merConfig;
 	}
 
+	@Bean
+	public AlipayClient alipayClient(HuifuProperties authProperties){
+		AlipayClient alipayClient = new DefaultAlipayClient(
+				"https://openapi.alipay.com/gateway.do",
+				authProperties.getAliAppid(),
+				authProperties.getAliPrivatekey(),
+				"json","GBK",authProperties.getAliPublickey(),"RSA2");
+		return alipayClient;
+	}
+
 	public static HuifuProperties getHuifuProperties(){
 		return huifuProperties;
 	}

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

@@ -180,5 +180,10 @@ public interface CourseScheduleDao extends BaseMapper<CourseSchedule> {
 
     List<TodayNotRepliedAndNotDecorateHomeworkVo> selectTodayNotRepliedAndNotDecorateHomework();
 
+    //统计学员购买课程
+    List<RepliedCountVo> countAllReplie(String today);
+
+    //根据id统计评价
+    Integer countReplies(Long studentId);
 }
 

+ 41 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/props/HuifuProperties.java

@@ -51,6 +51,24 @@ public class HuifuProperties {
      * @updateTime 2022/3/31 11:24
      */
     private String wxSecret;
+    /***
+     * 支付宝appid
+     * @author liweifan
+     * @updateTime 2022/3/31 11:24
+     */
+    private String aliAppid;
+    /***
+     * 支付宝开发者私钥(由开发者自己生成)
+     * @author liweifan
+     * @updateTime 2022/3/31 11:24
+     */
+    private String aliPrivatekey;
+    /***
+     * 支付宝公钥(由支付宝生成)
+     * @author liweifan
+     * @updateTime 2022/3/31 11:24
+     */
+    private String aliPublickey;
 
     public String getApiKey() {
         return apiKey;
@@ -108,4 +126,27 @@ public class HuifuProperties {
         this.notifyUrl = notifyUrl;
     }
 
+    public String getAliAppid() {
+        return aliAppid;
+    }
+
+    public void setAliAppid(String aliAppid) {
+        this.aliAppid = aliAppid;
+    }
+
+    public String getAliPrivatekey() {
+        return aliPrivatekey;
+    }
+
+    public void setAliPrivatekey(String aliPrivatekey) {
+        this.aliPrivatekey = aliPrivatekey;
+    }
+
+    public String getAliPublickey() {
+        return aliPublickey;
+    }
+
+    public void setAliPublickey(String aliPublickey) {
+        this.aliPublickey = aliPublickey;
+    }
 }

+ 26 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/sdk/PaymentSdk.java

@@ -2,6 +2,11 @@ package com.yonge.cooleshow.biz.dal.sdk;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.alipay.api.AlipayApiException;
+import com.alipay.api.AlipayClient;
+import com.alipay.api.DefaultAlipayClient;
+import com.alipay.api.request.AlipaySystemOauthTokenRequest;
+import com.alipay.api.response.AlipaySystemOauthTokenResponse;
 import com.huifu.adapay.core.exception.BaseAdaPayException;
 import com.huifu.adapay.model.Payment;
 import com.huifu.adapay.model.PaymentConfirm;
@@ -17,6 +22,7 @@ import com.yonge.toolset.utils.http.HttpUtil;
 import com.yonge.toolset.utils.string.StringUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
 
@@ -25,6 +31,8 @@ import java.util.*;
 @Component
 public class PaymentSdk {
     private final static Logger log = LoggerFactory.getLogger(PaymentSdk.class);
+    @Autowired
+    private AlipayClient alipayClient;
 
     /**
      * 执行一个支付交易
@@ -177,6 +185,24 @@ public class PaymentSdk {
         }
     }
 
+    public HttpResponseResult<AlipaySystemOauthTokenResponse> getAliToken(String authorization_code) {
+        AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
+        request.setGrantType("authorization_code");
+        request.setCode(authorization_code);
+        AlipaySystemOauthTokenResponse response = null;
+        try {
+            response = alipayClient.execute(request);
+            if (response.isSuccess()) {
+                return HttpResponseResult.succeed(response);
+            } else {
+                return HttpResponseResult.failed(response.getMsg());
+            }
+        } catch (AlipayApiException e) {
+            log.error("请求支付宝获取token异常,参数{},code is {},msg is {}", authorization_code, e.getErrCode(), e.getErrMsg());
+            return HttpResponseResult.failed(e.getErrMsg());
+        }
+    }
+
 /*
     public static Map<String, Object> queryList(Integer pageIndex, Long createdGte, Long createdLte) throws Exception {
         Map<String, Object> paymentParams = new HashMap<>();

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

@@ -18,4 +18,6 @@ public interface CourseRepliedService extends IService<CourseScheduleReplied> {
     CourseRepliedVo selectReplied(CourseScheduleReplied replied);
 
     IPage<MyRepliedVo> myReplied(IPage<MyRepliedVo> page, MyCourseSearch search);
+
+    void noRepliedTeacher();
 }

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

@@ -61,7 +61,7 @@ public interface UserOrderService extends IService<UserOrder> {
      * @updateTime 2022/3/31 15:42
      * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<com.yonge.cooleshow.biz.dal.entity.Order>
      */
-    HttpResponseResult<UserOrder> executeOrder(OrderReq orderReq);
+    HttpResponseResult<UserOrder> executeOrder(OrderReq orderReq) throws Exception;
 
     /***
      * 订单付款
@@ -70,7 +70,7 @@ public interface UserOrderService extends IService<UserOrder> {
      * @updateTime 2022/3/31 17:23
      * @return: com.yonge.cooleshow.common.entity.HttpResponseResult
      */
-    HttpResponseResult<OrderPayRes> orderPay(OrderPayReq payReq);
+    HttpResponseResult<OrderPayRes> orderPay(OrderPayReq payReq) throws Exception;
 
     /***
      * 通过业务id查询用户正在交易中的订单

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

@@ -123,6 +123,7 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
                 .ifPresent(sysUser -> {
                     result.setTeacherName(sysUser.getRealName());
                     result.setUserName(sysUser.getUsername());
+                    result.setAvatar(sysUser.getAvatar());
                 });
         Optional.ofNullable(group.getSubjectId()).map(subjectService::get)
                 .ifPresent(subject -> result.setSubjectName(subject.getName()));

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

@@ -19,6 +19,7 @@ import com.yonge.cooleshow.biz.dal.service.CourseRepliedService;
 import com.yonge.cooleshow.biz.dal.service.SysMessageService;
 import com.yonge.cooleshow.biz.dal.vo.CourseRepliedVo;
 import com.yonge.cooleshow.biz.dal.vo.MyRepliedVo;
+import com.yonge.cooleshow.biz.dal.vo.RepliedCountVo;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -26,7 +27,10 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.text.SimpleDateFormat;
+import java.util.Date;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -177,7 +181,29 @@ public class CourseRepliedServiceImpl extends ServiceImpl<CourseScheduleRepliedD
         return page.setRecords(repliedDao.myReplied(page, search));
     }
 
+    /**
+     * @Description: 当日陪练课未对老师评价(每晚9点,已评价不发)
+     * @Author: cy
+     * @Date: 2022/5/6
+     */
     public void noRepliedTeacher(){
-
+        String today = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
+        //统计当日所有购课学员
+        List<RepliedCountVo> repliedCounts=scheduleDao.countAllReplie(today);
+        for (RepliedCountVo repliedCount : repliedCounts) {
+            Long userId = repliedCount.getUserId();
+
+            Integer expCount = repliedCount.getCount();//应该评论课程数
+            Integer actCount=scheduleDao.countReplies(userId);//已评论课程数
+            int count = expCount - actCount;
+            if (count>0){//有课程未评价
+                Map<Long, String> studentReceivers = new HashMap<>();
+                studentReceivers.put(userId, repliedCount.getPhone());
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.NOT_EVALUATE_TEACHER_PRACTICE,
+                        studentReceivers, null, 0, null, ClientEnum.STUDENT.getCode(),
+                        count);
+                log.info("send success {}",MessageTypeEnum.NOT_EVALUATE_TEACHER_PRACTICE);
+            }
+        }
     }
 }

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

@@ -242,7 +242,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         //根据firstDay计算出该月的最后一天
         LocalDate lastDay = firstDay.with(TemporalAdjusters.lastDayOfMonth());
         //获取老师的课程  key:日期-年月日 value:课程时间-开始时间,结束时间
-        Map<String, List<CourseTimeEntity>> nowCourseMap = getTeacherCourseTime(teacherId, firstDay.toString(), lastDay.toString());
+        Map<String, List<CourseTimeEntity>> nowCourseMap = getCourseListMap(getTeacherCourseTime(teacherId, firstDay.toString(), lastDay.toString()));
         //生成日历数据
         List<CourseCalendarEntity> courseCalendarEntities = generateCourseData(firstDay, lastDay, singleCourseMinutes, freeCourseMinutes);
         //对比课程数据,筛选出空余的课程时间
@@ -310,14 +310,16 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
      * @param endDate   结束时间
      * @return key:日期-年月日 value:课程时间-开始时间,结束时间
      */
-    private Map<String, List<CourseTimeEntity>> getTeacherCourseTime(Long teacherId, String startDate, String endDate) {
+    private List<CourseSchedule> getTeacherCourseTime(Long teacherId, String startDate, String endDate) {
+        //未开始、进行中的课程
+        List<String> statusList = Lists.newArrayList(CourseScheduleEnum.NOT_START.getCode(), CourseScheduleEnum.ING.getCode());
         //查询该老师指定时间段的课程
-        List<CourseSchedule> courseList = this.list(Wrappers.<CourseSchedule>lambdaQuery()
+        return this.list(Wrappers.<CourseSchedule>lambdaQuery()
                 .eq(CourseSchedule::getTeacherId, teacherId)
+                .in(CourseSchedule::getStatus, statusList)
                 .ge(CourseSchedule::getClassDate, startDate)
                 .le(CourseSchedule::getClassDate, endDate)
         );
-        return getCourseListMap(courseList);
     }
 
     /**
@@ -533,24 +535,17 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
      * @param studentId 学员id
      */
     private Map<String, List<CourseTimeEntity>> getAllPracticeCourseTime(Long teacherId, Long studentId, String startDate, String endDate) {
-        //未开始、进行中的课程
-        List<String> statusList = Lists.newArrayList(CourseScheduleEnum.NOT_START.getCode(), CourseScheduleEnum.ING.getCode());
-        //查询该老师指定时间段的课程
-        List<CourseSchedule> courseList = this.list(Wrappers.<CourseSchedule>lambdaQuery()
-                .eq(CourseSchedule::getTeacherId, teacherId)
-                .in(CourseSchedule::getStatus, statusList)
-                .ge(CourseSchedule::getClassDate, startDate)
-                .le(CourseSchedule::getClassDate, endDate)
-        );
+        //获取老师的课程时间数据
+        List<CourseSchedule> courseList = getTeacherCourseTime(teacherId, startDate, endDate);
         if (CollectionUtils.isEmpty(courseList)) {
             courseList = new ArrayList<>();
         }
-        //查询学生的课程
+        //查询学生的课程;
         Map<String, Object> param = new HashMap<>();
         param.put("studentId", studentId);
         param.put("startClassDate", startDate);
         param.put("endClassDate", endDate);
-        param.put("statusList", statusList);
+        param.put("statusList", Lists.newArrayList(CourseScheduleEnum.NOT_START.getCode(), CourseScheduleEnum.ING.getCode()));
         List<CourseSchedule> studentCourse = baseMapper.queryStudentCourse(param);
         //将数据合并
         if (CollectionUtils.isNotEmpty(studentCourse)) {
@@ -1141,30 +1136,30 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
                 Map<Long, String> teacherSms = new HashMap<>();
                 teacherSms.put(sysUser.getId(), sysUser.getPhone());
 
-                Integer liveCount=0;
-                Integer practiceCount=0;
-                List<CountVo> typeCount=baseMapper.selectTypeCount(sysUser.getId(),tomorrow);
+                Integer liveCount = 0;
+                Integer practiceCount = 0;
+                List<CountVo> typeCount = baseMapper.selectTypeCount(sysUser.getId(), tomorrow);
                 for (CountVo countVo : typeCount) {
                     if (countVo.getType().equals(CourseScheduleEnum.LIVE.getCode())) {
-                        liveCount=countVo.getCount();
+                        liveCount = countVo.getCount();
                     }
                     if (countVo.getType().equals(CourseScheduleEnum.PRACTICE.getCode())) {
-                        practiceCount=countVo.getCount();
+                        practiceCount = countVo.getCount();
                     }
                 }
 
                 //老师端-明日课程提醒
-                String teacherUrl = sysMessageService.selectConfigUrl(MessageTypeEnum.SMS_TOMORROW_COURSE_REMINDER.getCode());
+                String teacherUrl = sysMessageService.selectConfigUrl(MessageTypeEnum.TOMORROW_COURSE_REMINDER.getCode());
                 sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TOMORROW_COURSE_REMINDER,
                         teacherReceivers, null, 0, null, ClientEnum.TEACHER.getCode(),
-                        practiceCount.toString(),liveCount.toString(),teacherUrl);
-                log.info("send success {}",MessageTypeEnum.TOMORROW_COURSE_REMINDER);
+                        practiceCount.toString(), liveCount.toString(), teacherUrl);
+                log.info("send success {}", MessageTypeEnum.TOMORROW_COURSE_REMINDER);
 
                 //老师端-明日课程提醒(短信)
                 sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_TOMORROW_COURSE_REMINDER,
                         teacherSms, null, 0, null, null,
                         practiceCount, liveCount);
-                log.info("send success {}",MessageTypeEnum.SMS_STUDENT_BUY_PRACTICE);
+                log.info("send success {}", MessageTypeEnum.SMS_STUDENT_BUY_PRACTICE);
             }
         }
     }

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

@@ -243,7 +243,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public HttpResponseResult<UserOrder> executeOrder(OrderReq orderReq) {
+    public HttpResponseResult<UserOrder> executeOrder(OrderReq orderReq) throws Exception{
         log.info("订单[创建订单] Req:{}", JSONObject.toJSONString(orderReq));
         //订单号生成
         Long orderNo = idGeneratorService.generatorId("userOrder");
@@ -288,7 +288,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public HttpResponseResult<OrderPayRes> orderPay(OrderPayReq payReq) {
+    public HttpResponseResult<OrderPayRes> orderPay(OrderPayReq payReq) throws Exception{
         //查询订单
         UserOrderVo detail = detail(payReq.getOrderNo(), payReq.getUserId());
         if (null == detail || !payReq.getUserId().equals(detail.getUserId())) {
@@ -528,7 +528,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
      * @updateTime 2022/3/31 16:15
      * @return: com.yonge.cooleshow.biz.dal.entity.Order
      */
-    private UserOrderVo insertOrder(Long orderNo, OrderReq orderReq, List<OrderCreateRes> resList) {
+    private UserOrderVo insertOrder(Long orderNo, OrderReq orderReq, List<OrderCreateRes> resList) throws Exception {
         UserOrder userOrder = new UserOrder();
 
         userOrder.setOrderNo(Long.toString(orderNo));
@@ -602,15 +602,10 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         int insert = baseMapper.insert(userOrder);
 
         if (insert == 0 || null == userOrder.getId()) {
-            throw new BizException("插入失败");
+            throw new BizException("创建订单失败");
         }
         UserOrderVo vo = new UserOrderVo();
-        try {
-            BeanUtils.copyProperties(vo, userOrder);
-        } catch (Exception e) {
-            e.printStackTrace();
-            throw new BizException("对象转换失败");
-        }
+        BeanUtils.copyProperties(vo, userOrder);
         vo.setOrderDetailList(orderDetailList);
         return vo;
     }

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

@@ -90,12 +90,12 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
         }
 
         //校验课程是否购买
-        VideoLessonPurchaseRecord isAlreadyBuy = videoLessonPurchaseRecordDao.selectOne(Wrappers.<VideoLessonPurchaseRecord>lambdaQuery()
-                .eq(VideoLessonPurchaseRecord::getStudentId, studentId)
-                .eq(VideoLessonPurchaseRecord::getVideoLessonGroupId, groupId));
-        if (!ObjectUtil.isEmpty(isAlreadyBuy)) {
-            throw new BizException("已购买过该课程");
-        }
+//        VideoLessonPurchaseRecord isAlreadyBuy = videoLessonPurchaseRecordDao.selectOne(Wrappers.<VideoLessonPurchaseRecord>lambdaQuery()
+//                .eq(VideoLessonPurchaseRecord::getStudentId, studentId)
+//                .eq(VideoLessonPurchaseRecord::getVideoLessonGroupId, groupId));
+//        if (!ObjectUtil.isEmpty(isAlreadyBuy)) {
+//            throw new BizException("已购买过该课程");
+//        }
 
         purchaseRecord.setOrderNo(orderNo);
         purchaseRecord.setStudentId(studentId);
@@ -107,7 +107,7 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
         OrderCreateRes orderCreateRes = new OrderCreateRes();
         orderCreateRes.setRes(true);
         orderCreateRes.setMerchId(lessonGroup.getTeacherId());
-        orderCreateRes.setBizId(orderReqInfo.getCouponId());
+        orderCreateRes.setBizId(groupId);
         orderCreateRes.setOriginalPrice(lessonGroup.getLessonPrice());//原价
         orderCreateRes.setExpectPrice(lessonGroup.getLessonPrice());//预计价格
         orderCreateRes.setActualPrice(purchaseRecord.getPayMoney());//实际价格
@@ -142,7 +142,7 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
             throw new BizException("订单不存在!");
         }
         //修改支付状态
-        videoLessonPurchaseRecordDao.updateStatus(orderNo, userOrder.getStatus().getCode());
+        videoLessonPurchaseRecordDao.updateStatus(orderNo, OrderStatusEnum.PAID.getCode());
 
         //查询直播课服务费
         String videoServiceRateStr = sysConfigService.findConfigValue(SysConfigConstant.VIDEO_LESSON_SERVICE_FEE);
@@ -170,6 +170,36 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
     }
 
     /**
+     * @Description: 购买视频课-失败-回调
+     * @Author: cy
+     * @Date: 2022/4/24
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void buyVideoCourseFailed(UserOrderDetailVo orderParam) {
+        String orderNo = orderParam.getOrderNo();
+
+        VideoLessonPurchaseRecord videoGroup = videoLessonPurchaseRecordDao.selectOne(Wrappers.<VideoLessonPurchaseRecord>lambdaQuery()
+                .eq(VideoLessonPurchaseRecord::getOrderNo, orderNo));
+        if (videoGroup == null) {
+            throw new BizException("课程组不存在!");
+        }
+
+        //删除video_lesson_purchase_record数据
+        videoLessonPurchaseRecordDao.delete(Wrappers.<VideoLessonPurchaseRecord>lambdaQuery()
+                .eq(VideoLessonPurchaseRecord::getOrderNo, orderNo));
+        log.info("buyVideoCourseFailed ok");
+    }
+
+    /**
+     * 获取用户信息
+     */
+    private SysUser getSysUser(Long userId) {
+        return Optional.ofNullable(userId)
+                .map(sysUserFeignService::queryUserById)
+                .orElseThrow(() -> new BizException("用户不存在"));
+    }
+
+    /**
      * @Description: 购买视频课消息推送
      * @Author: cy
      * @Date: 2022/5/6
@@ -221,34 +251,4 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
             e.printStackTrace();
         }
     }
-
-    /**
-     * @Description: 购买视频课-失败-回调
-     * @Author: cy
-     * @Date: 2022/4/24
-     */
-    @Transactional(rollbackFor = Exception.class)
-    public void buyVideoCourseFailed(UserOrderDetailVo orderParam) {
-        String orderNo = orderParam.getOrderNo();
-
-        VideoLessonPurchaseRecord videoGroup = videoLessonPurchaseRecordDao.selectOne(Wrappers.<VideoLessonPurchaseRecord>lambdaQuery()
-                .eq(VideoLessonPurchaseRecord::getOrderNo, orderNo));
-        if (videoGroup == null) {
-            throw new BizException("课程组不存在!");
-        }
-
-        //删除video_lesson_purchase_record数据
-        videoLessonPurchaseRecordDao.delete(Wrappers.<VideoLessonPurchaseRecord>lambdaQuery()
-                .eq(VideoLessonPurchaseRecord::getOrderNo, orderNo));
-        log.info("buyVideoCourseFailed ok");
-    }
-
-    /**
-     * 获取用户信息
-     */
-    private SysUser getSysUser(Long userId) {
-        return Optional.ofNullable(userId)
-                .map(sysUserFeignService::queryUserById)
-                .orElseThrow(() -> new BizException("用户不存在"));
-    }
 }

+ 38 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/RepliedCountVo.java

@@ -0,0 +1,38 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import java.io.Serializable;
+
+/**
+ * @Author: cy
+ * @Date: 2022/5/6
+ */
+public class RepliedCountVo implements Serializable {
+    private Long userId;
+    private String phone;
+    private Integer count;
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public Integer getCount() {
+        return count;
+    }
+
+    public void setCount(Integer count) {
+        this.count = count;
+    }
+}
+

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

@@ -18,6 +18,8 @@ public class VideoLessonPurchaseVo extends BaseEntity {
 
     private String realName;
 
+    private String phone;
+
     @ApiModelProperty(value = "支付金额")
     private String payMoney;
 
@@ -27,6 +29,14 @@ public class VideoLessonPurchaseVo extends BaseEntity {
     @ApiModelProperty(value = "购买时间")
     private String purchaseTime;
 
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
     public String getRealName() {
         return realName;
     }

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

@@ -524,7 +524,7 @@
         FROM video_lesson_group g
         LEFT JOIN sys_user u ON g.teacher_id_=u.id_
         LEFT JOIN `subject` s ON g.lesson_subject_=s.id_
-        LEFT JOIN (SELECT video_lesson_group_id_ ,COUNT(1) AS count_ FROM video_lesson_purchase_record GROUP BY video_lesson_group_id_) r ON g.id_= r.video_lesson_group_id_
+        LEFT JOIN (SELECT video_lesson_group_id_ ,COUNT(1) AS count_ FROM video_lesson_purchase_record WHERE order_status_='PAID' GROUP BY video_lesson_group_id_) r ON g.id_= r.video_lesson_group_id_
         WHERE g.audit_status_='PASS' and #{appAuditVersion} = g.audit_version_
         ORDER BY g.create_time_ DESC LIMIT 4
     </select>
@@ -622,6 +622,7 @@
         GROUP BY type_
     </select>
 
+
     <select id="selectTodayNotRepliedAndNotDecorateHomework"
             resultType="com.yonge.cooleshow.biz.dal.vo.TodayNotRepliedAndNotDecorateHomeworkVo">
 
@@ -637,5 +638,21 @@
         and cs.type_ = 'PRACTICE'
         group by  su.id_,su.phone_
 
+
+    <select id="countAllReplie" resultType="com.yonge.cooleshow.biz.dal.vo.RepliedCountVo"
+            parameterType="java.lang.String">
+        SELECT
+            p.user_id_ AS userId,
+            u.phone_ AS phone,
+            COUNT(1) AS count
+        FROM course_schedule_student_payment p
+        LEFT JOIN sys_user u ON p.user_id_=u.id_
+        WHERE p.course_id_ IN (SELECT id_ FROM course_schedule  WHERE class_date_=#{today} AND lock_=0 AND type_='PRACTICE')
+        GROUP BY p.user_id_;
+    </select>
+    <select id="countReplies" resultType="java.lang.Integer" parameterType="java.lang.Integer">
+        SELECT COUNT(1)
+        FROM course_schedule_replied
+        WHERE student_id_=#{studentId}
     </select>
 </mapper>

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

@@ -92,12 +92,14 @@
 	<select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.vo.VideoLessonGroupVo">
 		SELECT
 			<include refid="baseColumns"/>
+			b.name_ AS lessonSubjectName,
 			s.username_ AS username,
 			s.avatar_ AS avatar,
 		    s.real_name_ AS realName,
 			(SELECT COUNT(1) FROM video_lesson_purchase_record r WHERE r.video_lesson_group_id_=g.id_ AND r.order_status_='PAID') AS countStudent
 		FROM video_lesson_group g
 		LEFT JOIN sys_user s ON g.teacher_id_ = s.id_
+		LEFT JOIN `subject` b ON g.lesson_subject_=b.id_
 		<where>
 			<if test="param.auditStatus !=null">
 				AND g.audit_status_ = #{param.auditStatus}
@@ -162,7 +164,7 @@
 			g.lesson_count_ AS lessonCount,
 			g.lesson_price_ AS lessonPrice,
 			g.audit_status_ AS auditStatus,
-			(SELECT COUNT(1) FROM video_lesson_purchase_record r WHERE r.video_lesson_group_id_=g.id_) AS countStudent,
+			(SELECT COUNT(1) FROM video_lesson_purchase_record r WHERE r.video_lesson_group_id_=g.id_ AND r.order_status_='PAID') AS countStudent,
 			g.create_time_ AS createTime,
 			g.lesson_desc_ AS lessonDesc
 		FROM video_lesson_group g
@@ -190,6 +192,7 @@
 			p.student_id_ AS studentId,
 			u.username_ AS username,
 			u.real_name_ AS realName,
+		    u.phone_ AS phone,
 			p.pay_money_ AS payMoney,
 			p.order_no_ AS orderNo,
 			o.pay_time_ AS purchaseTime

+ 19 - 2
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/PaymentController.java

@@ -1,13 +1,12 @@
 package com.yonge.cooleshow.student.controller;
 
 import com.alibaba.fastjson.JSONObject;
+import com.alipay.api.response.AlipaySystemOauthTokenResponse;
 import com.huifu.adapay.core.AdapayCore;
-import com.huifu.adapay.core.util.AdapaySign;
 import com.huifu.adapay.core.util.StringUtil;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.sdk.PaymentSdk;
-import com.yonge.cooleshow.biz.dal.service.EmployeeService;
 import com.yonge.cooleshow.biz.dal.service.UserOrderService;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
@@ -62,6 +61,24 @@ public class PaymentController extends BaseController {
         return responseResult;
     }
 
+    @ApiOperation(value = "支付宝支付获取access_token(授权令牌)和user_id(用户支付宝 ID)")
+    @GetMapping("/getAliToken")
+    public HttpResponseResult<AlipaySystemOauthTokenResponse> getAliToken(String authorization_code) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        HttpResponseResult<AlipaySystemOauthTokenResponse> aliToken = paymentSdk.getAliToken(authorization_code);
+        /*if (responseResult.getStatus()) {
+            Map<String, String> data = responseResult.getData();
+            //绑定到用户表
+            user.setWxOpenid(data.get("openid"));
+            log.info("绑定用户openid,param is {}", JSONObject.toJSONString(user));
+            sysUserFeignService.bindOpenId(user);
+        }*/
+        return aliToken;
+    }
+
     /***
      * 汇付回调
      * 问题:1、成功失败需要回执什么信息 2、回调url地址是否需要加入白名单

+ 8 - 7
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java

@@ -62,11 +62,11 @@ public class UserOrderController extends BaseController {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
         orderReq.setUserId(user.getId());
-        Future<HttpResponseResult<UserOrder>> httpResponseResultFuture = DistributedLock.of(redissonClient)
-                .callIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
-                        , () -> userOrderService.executeOrder(orderReq), 60L, TimeUnit.SECONDS);
 
         try {
+            Future<HttpResponseResult<UserOrder>> httpResponseResultFuture = DistributedLock.of(redissonClient)
+                    .callIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
+                            , () -> userOrderService.executeOrder(orderReq), 60L, TimeUnit.SECONDS);
             return httpResponseResultFuture.get();
         } catch (BizException e) {
             return HttpResponseResult.failed(e.getMessage());
@@ -89,12 +89,13 @@ public class UserOrderController extends BaseController {
         payReq.setUserId(user.getId());
         payReq.setIpAddress(WebUtil.getRemoteIp(request));
 
-        Future<HttpResponseResult<OrderPayRes>> httpResponseResultFuture = DistributedLock.of(redissonClient)
-                .callIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
-                        , () -> userOrderService.orderPay(payReq), 60L, TimeUnit.SECONDS);
-
         try {
+            Future<HttpResponseResult<OrderPayRes>> httpResponseResultFuture = DistributedLock.of(redissonClient)
+                    .callIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
+                            , () -> userOrderService.orderPay(payReq), 60L, TimeUnit.SECONDS);
             return httpResponseResultFuture.get();
+        }  catch (BizException e) {
+            return HttpResponseResult.failed(e.getMessage());
         } catch (Exception e) {
             e.printStackTrace();
             return HttpResponseResult.failed("付款失败");

+ 13 - 0
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/task/TaskController.java

@@ -28,6 +28,8 @@ public class TaskController extends BaseController {
     private UserOrderService userOrderService;
     @Autowired
     private VipCardRecordService vipCardRecordService;
+    @Autowired
+    private CourseRepliedService repliedService;
     /***
      * 查询所有学生统计数据
      * @author liweifan
@@ -65,4 +67,15 @@ public class TaskController extends BaseController {
         userOrderService.pollingOrder();
         return succeed();
     }
+
+    /**
+     * @Description: 当日陪练课未对老师评价(每晚9点,已评价不发)
+     * @Author: cy
+     * @Date: 2022/5/6
+     */
+    @GetMapping("/noRepliedTeacher")
+    public HttpResponseResult noRepliedTeacher() {
+        repliedService.noRepliedTeacher();
+        return succeed();
+    }
 }