Browse Source

问题修改

liweifan 3 years ago
parent
commit
4858f0094a
28 changed files with 789 additions and 123 deletions
  1. 8 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleDao.java
  2. 0 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/StudentDao.java
  3. 0 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/StudentService.java
  4. 8 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/StudentTotalService.java
  5. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TeacherTotalService.java
  6. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MemberPriceSettingsServiceImpl.java
  7. 7 14
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java
  8. 2 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentStarServiceImpl.java
  9. 46 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentTotalServiceImpl.java
  10. 4 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java
  11. 66 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherTotalServiceImpl.java
  12. 4 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VipCardRecordServiceImpl.java
  13. 116 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MusicianAuthEntryRecordVo.java
  14. 33 11
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  15. 0 3
      cooleshow-user/user-biz/src/main/resources/config/mybatis/StudentMapper.xml
  16. 14 6
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherAuthMusicianRecordMapper.xml
  17. 0 14
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/StudentController.java
  18. 18 3
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java
  19. 6 0
      toolset/toolset-payment/pom.xml
  20. 1 0
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/adapay/AdapayTemplate.java
  21. 15 1
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/ClosePayment.java
  22. 43 1
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/RefundBill.java
  23. 56 10
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/ali/OriginalAliAppTemplate.java
  24. 8 8
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/ali/config/AlipayConfiguration.java
  25. 12 12
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/ali/constant/AlipayConstant.java
  26. 205 6
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/wx/OriginalWxAppTemplate.java
  27. 68 0
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/wx/config/WxpayConfiguration.java
  28. 39 0
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/wx/constant/WxpayConstant.java

+ 8 - 6
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleDao.java

@@ -31,18 +31,20 @@ public interface CourseScheduleDao extends BaseMapper<CourseSchedule> {
     /***
      * 查询所有老师课时统计
      * @author liweifan
-     * @updateTime 2022/3/28 10:53
-     * @return: com.yonge.cooleshow.biz.dal.vo.TeacherTotalVo
+     * @param: userId
+     * @updateTime 2022/5/13 17:51
+     * @return: java.util.List<com.yonge.cooleshow.biz.dal.vo.TeacherTotalVo>
      */
-    List<TeacherTotalVo> queryTeacherTotal();
+    List<TeacherTotalVo> queryTeacherTotal(@Param("userId") Long userId);
 
     /***
      * 查询所有学生课时统计
      * @author liweifan
-     * @updateTime 2022/3/28 10:53
-     * @return: com.yonge.cooleshow.biz.dal.vo.TeacherTotalVo
+     * @param: userId
+     * @updateTime 2022/5/13 17:51
+     * @return: java.util.List<com.yonge.cooleshow.biz.dal.vo.StudentTotalVo>
      */
-    List<StudentTotalVo> queryStudentTotal();
+    List<StudentTotalVo> queryStudentTotal(@Param("userId") Long userId);
 
     /**
      * 根据学生id查询课程

+ 0 - 6
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/StudentDao.java

@@ -55,10 +55,4 @@ public interface StudentDao extends BaseMapper<Student> {
      */
     List<MyFollow> queryMyFollow(@Param("page") IPage<MyFollow> page, @Param("studentId") Long studentId);
 
-    /**
-     * 取消关注
-     *
-     * @param map
-     */
-    void unfollow(@Param("param") Map<String, Long> map);
 }

+ 0 - 6
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/StudentService.java

@@ -75,10 +75,4 @@ public interface StudentService extends IService<Student> {
      */
     IPage<MyFollow> queryMyFollow(IPage<MyFollow> page, Long studentId);
 
-    /**
-     * 取消关注
-     *
-     * @param map
-     */
-    void unfollow(Map<String, Long> map);
 }

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

@@ -35,5 +35,12 @@ public interface StudentTotalService extends IService<StudentTotal>  {
 	 * @return: java.util.List<com.yonge.cooleshow.biz.dal.vo.StudentTotalVo>
 	 */
 	List<StudentTotal> queryStudentTotal();
-
+	/***
+	 * 查询单个学生统计数据
+	 * @author liweifan
+	 * @param: id
+	 * @updateTime 2022/5/13 17:42
+	 * @return: com.yonge.cooleshow.biz.dal.entity.StudentTotal
+	 */
+	StudentTotal getStudentTotalById(Long id);
 }

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

@@ -45,4 +45,13 @@ public interface TeacherTotalService extends IService<TeacherTotal>  {
 	 * @return: java.lang.Object
 	 */
 	Object getRedisValueByKey(String key);
+
+	/***
+	 * 查询单个老师统计数据
+	 * @author liweifan
+	 * @param: userId
+	 * @updateTime 2022/5/13 18:37
+	 * @return: com.yonge.cooleshow.biz.dal.entity.TeacherTotal
+	 */
+    TeacherTotal getTeacherTotalById(Long userId);
 }

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

@@ -87,6 +87,7 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
         vipCardRecord.setUserId(orderDetailVo.getUserId());
         vipCardRecord.setOrderId(orderDetailVo.getOrderId());
         vipCardRecord.setVipCardId(detail.getId());
+        vipCardRecord.setMsgStatus(0);
 
         if (null == membershipEndTime || membershipEndTime.before(new Date())) {
             //没有会员、会员已过期

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

@@ -1,17 +1,13 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
-import com.yonge.cooleshow.biz.dal.dao.CourseScheduleDao;
-import com.yonge.cooleshow.biz.dal.dao.StudentStarDao;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentSearch;
 import com.yonge.cooleshow.biz.dal.entity.StudentTotal;
 import com.yonge.cooleshow.biz.dal.entity.Subject;
-import com.yonge.cooleshow.biz.dal.entity.Teacher;
 import com.yonge.cooleshow.biz.dal.enums.CacheNameEnum;
-import com.yonge.cooleshow.biz.dal.service.SysConfigService;
+import com.yonge.cooleshow.biz.dal.service.StudentTotalService;
 import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
 import com.yonge.cooleshow.biz.dal.vo.*;
 import com.yonge.toolset.utils.date.DateUtil;
@@ -23,12 +19,9 @@ import org.springframework.stereotype.Service;
 import com.yonge.cooleshow.biz.dal.entity.Student;
 import com.yonge.cooleshow.biz.dal.dao.StudentDao;
 import com.yonge.cooleshow.biz.dal.service.StudentService;
-import org.springframework.util.CollectionUtils;
 
-import java.lang.reflect.InvocationTargetException;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
 
 
 @Service
@@ -36,6 +29,9 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
     @Autowired
     private RedissonClient redissonClient;
 
+    @Autowired
+    private StudentTotalService totalService;
+
     @Override
     public StudentVo detail(Long userId) {
         return baseMapper.detail(userId);
@@ -62,11 +58,12 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
 
         int num = DateUtil.daysBetween(new Date(), detail.getMembershipEndTime());
         studentHomeVo.setMembershipDays(num < 0 ? 0 : num);
-        StudentTotal total = (StudentTotal) redissonClient.getBucket(CacheNameEnum.STUDENT_TOTAL.getRedisKey(user.getId()))
-                .get();
+
+        StudentTotal total = totalService.getStudentTotalById(user.getId());
         if (null == total) {
             total = new StudentTotal();
         }
+
         studentHomeVo.setExerciseDays(null == total.getExerciseDays() ? 0 : total.getExerciseDays());
         studentHomeVo.setExerciseHours(null == total.getExerciseHours() ? 0 : total.getExerciseHours());
         studentHomeVo.setTestingNum(null == total.getTestingNum() ? 0 : total.getTestingNum());
@@ -98,8 +95,4 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
         return page.setRecords(teacherVos);
     }
 
-    public void unfollow(Map<String, Long> map) {
-        WrapperUtil.toLong(map, "teacherId", "老师id不能为空!");
-        baseMapper.unfollow(map);
-    }
 }

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

@@ -26,23 +26,20 @@ public class StudentStarServiceImpl extends ServiceImpl<StudentStarDao, StudentS
     @Override
     public HttpResponseResult<Boolean> starOrUnStar(Long studentId, Long teacherId, YesOrNoEnum starStatus) {
         StudentStar studentStar = getByStudentIdAndTeacherId(studentId, teacherId);
-        TeacherTotal total = (TeacherTotal) redissonClient.getBucket(CacheNameEnum.TEACHER_TOTAL.getRedisKey(teacherId)).get();
 
         if (YesOrNoEnum.YES.equals(starStatus) && null == studentStar) {
             studentStar = new StudentStar();
             studentStar.setStudentId(studentId);
             studentStar.setTeacherId(teacherId);
             save(studentStar);
-            total.setFansNum(total.getFansNum() + 1);
         } else if (YesOrNoEnum.NO.equals(starStatus) && null != studentStar) {
             remove(Wrappers.<StudentStar>lambdaQuery()
                     .eq(StudentStar::getStudentId, studentId)
                     .eq(StudentStar::getTeacherId, teacherId)
             );
-            total.setFansNum(total.getFansNum() - 1);
         }
-        redissonClient.getBucket(CacheNameEnum.TEACHER_TOTAL.getRedisKey(teacherId))
-                .set(total);
+        redissonClient.getBucket(CacheNameEnum.STUDENT_TOTAL.getRedisKey(studentId)).delete();
+        redissonClient.getBucket(CacheNameEnum.TEACHER_TOTAL.getRedisKey(teacherId)).delete();
         return HttpResponseResult.succeed(true);
     }
 }

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

@@ -7,6 +7,8 @@ import com.yonge.cooleshow.biz.dal.dao.CourseScheduleDao;
 import com.yonge.cooleshow.biz.dal.dao.StudentDao;
 import com.yonge.cooleshow.biz.dal.dao.StudentStarDao;
 import com.yonge.cooleshow.biz.dal.entity.Student;
+import com.yonge.cooleshow.biz.dal.entity.StudentStar;
+import com.yonge.cooleshow.biz.dal.entity.TeacherTotal;
 import com.yonge.cooleshow.biz.dal.enums.CacheNameEnum;
 import com.yonge.cooleshow.biz.dal.service.SysConfigService;
 import org.redisson.api.RedissonClient;
@@ -63,7 +65,7 @@ public class StudentTotalServiceImpl extends ServiceImpl<StudentTotalDao, Studen
         }
 
         //查询已上未上课时数
-        List<StudentTotalVo> studentCourseTotal = courseScheduleDao.queryStudentTotal();
+        List<StudentTotalVo> studentCourseTotal = courseScheduleDao.queryStudentTotal(null);
         Map<Long, StudentTotalVo> studentCourseMap = new HashMap<>();
         if (!CollectionUtils.isEmpty(studentCourseTotal)) {
             studentCourseMap = studentCourseTotal.stream().collect(Collectors.toMap(StudentTotalVo::getUserId, o -> o));
@@ -94,6 +96,49 @@ public class StudentTotalServiceImpl extends ServiceImpl<StudentTotalDao, Studen
         return resultList;
     }
 
+    @Override
+    public StudentTotal getStudentTotalById(Long id) {
+        StudentTotal total = (StudentTotal) redissonClient.getBucket(CacheNameEnum.STUDENT_TOTAL.getRedisKey(id))
+                .get();
+        if (null == total) {
+            //去数据库查询
+            return totalStudentTotalById(id);
+        }
+        return total;
+    }
+
+
+    private StudentTotal totalStudentTotalById(Long id) {
+        StudentTotal studentTotal = new StudentTotal();
+        studentTotal.setUserId(id);
+
+        //查询关注老师数
+        Integer starTeacherNum = studentStarDao.selectCount(Wrappers.<StudentStar>lambdaQuery()
+                .eq(StudentStar::getStudentId, id)
+        );
+        studentTotal.setStarTeacherNum(starTeacherNum);
+
+        List<StudentTotalVo> studentTotalVos = courseScheduleDao.queryStudentTotal(id);
+        if (!CollectionUtils.isEmpty(studentTotalVos)) {
+            StudentTotalVo studentTotalVo = studentTotalVos.get(0);
+            studentTotal.setFinshHours(null == studentTotalVo.getFinshHours() ? 0 : studentTotalVo.getFinshHours());
+            studentTotal.setUnfinshHours(null == studentTotalVo.getUnfinshHours() ? 0 : studentTotalVo.getUnfinshHours());
+        }
+        //todo 缺少累计练习天数 累计练习时长 累计评测次数
+
+        redissonClient.getBucket(CacheNameEnum.STUDENT_TOTAL.getRedisKey(studentTotal.getUserId()))
+                .set(studentTotal);
+
+        StudentTotal old = getById(id);
+        if(null != old){
+            updateById(studentTotal);
+        }else{
+            save(studentTotal);
+        }
+        return studentTotal;
+    }
+
+
     int batchSize = 100;
 
     /***

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

@@ -61,6 +61,8 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
     private StudentStarService studentStarService;
     @Autowired
     private UserAccountService userAccountService;
+    @Autowired
+    private TeacherTotalService totalService;
 
     @Override
     public TeacherVo detail(Long userId) {
@@ -136,7 +138,8 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
             }
         }
 
-        TeacherTotal total = (TeacherTotal) redissonClient.getBucket(CacheNameEnum.TEACHER_TOTAL.getRedisKey(userId)).get();
+        TeacherTotal total = totalService.getTeacherTotalById(userId);
+
         if (null == total) {
             total = new TeacherTotal();
         }

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

@@ -6,8 +6,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.biz.dal.dao.CourseScheduleDao;
 import com.yonge.cooleshow.biz.dal.dao.StudentStarDao;
 import com.yonge.cooleshow.biz.dal.dao.TeacherDao;
-import com.yonge.cooleshow.biz.dal.entity.LiveRoom;
-import com.yonge.cooleshow.biz.dal.entity.Teacher;
+import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.CacheNameEnum;
 import com.yonge.cooleshow.biz.dal.service.LiveRoomService;
 import org.redisson.api.RedissonClient;
@@ -15,7 +14,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import com.yonge.cooleshow.biz.dal.entity.TeacherTotal;
 import com.yonge.cooleshow.biz.dal.vo.TeacherTotalVo;
 import com.yonge.cooleshow.biz.dal.dto.search.TeacherTotalSearch;
 import com.yonge.cooleshow.biz.dal.dao.TeacherTotalDao;
@@ -65,7 +63,7 @@ public class TeacherTotalServiceImpl extends ServiceImpl<TeacherTotalDao, Teache
             teacherStarMap = teacherStarTotal.stream().collect(Collectors.toMap(TeacherTotalVo::getUserId, o -> o));
         }
         //查询已上未上课时数
-        List<TeacherTotalVo> teacherCourseTotal = courseScheduleDao.queryTeacherTotal();
+        List<TeacherTotalVo> teacherCourseTotal = courseScheduleDao.queryTeacherTotal(null);
         Map<Long, TeacherTotalVo> teacherCourseMap = new HashMap<>();
         if (!CollectionUtils.isEmpty(teacherCourseTotal)) {
             teacherCourseMap = teacherCourseTotal.stream().collect(Collectors.toMap(TeacherTotalVo::getUserId, o -> o));
@@ -174,4 +172,68 @@ public class TeacherTotalServiceImpl extends ServiceImpl<TeacherTotalDao, Teache
     public Object getRedisValueByKey(String key) {
         return redissonClient.getBucket(key).get();
     }
+
+    @Override
+    public TeacherTotal getTeacherTotalById(Long id) {
+        TeacherTotal total = (TeacherTotal) redissonClient.getBucket(CacheNameEnum.TEACHER_TOTAL.getRedisKey(id))
+                .get();
+        if (null == total) {
+            //去数据库查询
+            return totalTeacherTotalById(id);
+        }
+        return total;
+    }
+
+    private TeacherTotal totalTeacherTotalById(Long id) {
+        TeacherTotal teacherTotal = new TeacherTotal();
+        teacherTotal.setUserId(id);
+        //查询粉丝数
+        Integer fansNum = studentStarDao.selectCount(Wrappers.<StudentStar>lambdaQuery()
+                .eq(StudentStar::getTeacherId, id)
+        );
+        teacherTotal.setFansNum(fansNum);
+
+        //查询已上未上课时数
+        List<TeacherTotalVo> teacherCourseTotal = courseScheduleDao.queryTeacherTotal(id);
+        if (!CollectionUtils.isEmpty(teacherCourseTotal)) {
+            TeacherTotalVo courseTotal = teacherCourseTotal.get(0);
+            if (null != courseTotal) {
+                //课时数
+                if (null != courseTotal.getExpTime()) {
+                    teacherTotal.setExpTime(courseTotal.getExpTime());
+                }
+                if (null != courseTotal.getUnExpTime()) {
+                    teacherTotal.setUnExpTime(courseTotal.getUnExpTime());
+                }
+                //星级
+                Double starGrade = courseTotal.getStarGrade();
+                if (null != starGrade) {
+                    Long round = Math.round(starGrade);
+                    teacherTotal.setStarGrade(round.doubleValue());
+                }
+            }
+        }
+        //查询老师正在直播的直播间
+        List<LiveRoom> templist = liveRoomService.list(Wrappers.<LiveRoom>lambdaQuery()
+                .eq(LiveRoom::getSpeakerId, id)
+                .eq(LiveRoom::getLiveState, 1)
+                .eq(LiveRoom::getRoomState, 0)
+                .eq(LiveRoom::getType, "TEMP"));
+
+        if(CollectionUtils.isEmpty(templist)){
+            teacherTotal.setLiveFlag(false);
+        }else {
+            teacherTotal.setLiveFlag(true);
+        }
+        redissonClient.getBucket(CacheNameEnum.TEACHER_TOTAL.getRedisKey(teacherTotal.getUserId()))
+                .set(teacherTotal);
+
+        TeacherTotal old = getById(id);
+        if(null != old){
+            updateById(teacherTotal);
+        }else{
+            save(teacherTotal);
+        }
+        return teacherTotal;
+    }
 }

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

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

+ 116 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MusicianAuthEntryRecordVo.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.vo;
 
 import com.yonge.cooleshow.biz.dal.entity.TeacherAuthMusicianRecord;
+import com.yonge.cooleshow.biz.dal.enums.GenderEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -17,12 +18,54 @@ public class MusicianAuthEntryRecordVo extends TeacherAuthMusicianRecord {
     @ApiModelProperty(value = "身份证号")
     private String idCardNo;
 
+    @ApiModelProperty(value = "性别 0女 1男")
+    private GenderEnum gender;
+
     @ApiModelProperty("手机号 ")
     private String phone;
 
+    @ApiModelProperty(value = "专业技能")
+    private String subjectName;
+
     @ApiModelProperty("审核人 ")
     private String verifyUser;
 
+    /**
+     * 专业技能(支持多个,用逗号分隔),对应乐器表id
+     */
+    @ApiModelProperty("专业技能(支持多个,用逗号分隔),对应乐器表id ")
+    private String subjectId;
+    /**
+     * 个人介绍
+     */
+    @ApiModelProperty("个人介绍 ")
+    private String introduction;
+    /**
+     * 毕业学校
+     */
+    @ApiModelProperty("毕业学校 ")
+    private String graduateSchool;
+    /**
+     * 学校专业
+     */
+    @ApiModelProperty("学校专业 ")
+    private String subject;
+    /**
+     * 毕业证书
+     */
+    @ApiModelProperty("毕业证书 ")
+    private String gradCertificate;
+    /**
+     * 学位证书
+     */
+    @ApiModelProperty("学位证书 ")
+    private String degreeCertificate;
+    /**
+     * 教师资格证
+     */
+    @ApiModelProperty("教师资格证 ")
+    private String teacherCertificate;
+
     public String getRealName() {
         return realName;
     }
@@ -54,4 +97,77 @@ public class MusicianAuthEntryRecordVo extends TeacherAuthMusicianRecord {
     public void setVerifyUser(String verifyUser) {
         this.verifyUser = verifyUser;
     }
+
+
+    public GenderEnum getGender() {
+        return gender;
+    }
+
+    public void setGender(GenderEnum gender) {
+        this.gender = gender;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public String getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(String subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public String getIntroduction() {
+        return introduction;
+    }
+
+    public void setIntroduction(String introduction) {
+        this.introduction = introduction;
+    }
+
+    public String getGraduateSchool() {
+        return graduateSchool;
+    }
+
+    public void setGraduateSchool(String graduateSchool) {
+        this.graduateSchool = graduateSchool;
+    }
+
+    public String getSubject() {
+        return subject;
+    }
+
+    public void setSubject(String subject) {
+        this.subject = subject;
+    }
+
+    public String getGradCertificate() {
+        return gradCertificate;
+    }
+
+    public void setGradCertificate(String gradCertificate) {
+        this.gradCertificate = gradCertificate;
+    }
+
+    public String getDegreeCertificate() {
+        return degreeCertificate;
+    }
+
+    public void setDegreeCertificate(String degreeCertificate) {
+        this.degreeCertificate = degreeCertificate;
+    }
+
+    public String getTeacherCertificate() {
+        return teacherCertificate;
+    }
+
+    public void setTeacherCertificate(String teacherCertificate) {
+        this.teacherCertificate = teacherCertificate;
+    }
 }

+ 33 - 11
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -40,7 +40,13 @@
     </insert>
 
     <select id="queryTeacherTotal" resultType="com.yonge.cooleshow.biz.dal.vo.TeacherTotalVo">
-        select a.*,b.starGrade from (
+        select
+            t.user_id_ as userId,
+            a.expTime,
+            a.unExpTime,
+            b.starGrade
+        from teacher t
+        left join (
             <!-- 统计查询已上课时数,未上课时数 -->
             select
                 a.teacher_id_ as userId,
@@ -48,8 +54,11 @@
                 sum(if(a.end_time_ &gt; now(),1,0)) as unExpTime
             from course_schedule a
             where a.lock_ = 0 and a.type_ = 'PRACTICE'
+            <if test="userId != null and userId != ''">
+                and a.teacher_id_ = #{userId}
+            </if>
             group by a.teacher_id_
-        ) a
+        ) a on t.user_id_ = a.userId
         left join (
             <!-- 统计老师星级评分 -->
             select
@@ -57,19 +66,32 @@
                 avg (b.score_) as starGrade
             from course_schedule a
             join course_schedule_replied b on a.id_ = b.course_schedule_id_
-            where a.lock_ = 0 and type_ = 'PRACTICE' and b.score_ is not null
+            where a.lock_ = 0 and a.type_ = 'PRACTICE' and b.score_ is not null
+            <if test="userId != null and userId != ''">
+                and a.teacher_id_ = #{userId}
+            </if>
             group by a.teacher_id_
-        ) b on a.userId = b.userId
+        ) b on t.user_id_ = b.userId
+        <where>
+            <if test="userId != null and userId != ''">
+                and t.user_id_ = #{userId}
+            </if>
+        </where>
     </select>
     <select id="queryStudentTotal" resultType="com.yonge.cooleshow.biz.dal.vo.StudentTotalVo">
         select
-            b.user_id_ as userId,
-            sum(if(a.end_time_ &lt;= now(),1,0)) as finshHours,
-            sum(if(a.end_time_ &gt; now(),1,0)) as unfinshHours
-        from course_schedule a
-        join course_schedule_student_payment b on a.id_ = b.course_id_
-        where a.lock_ = 0 and a.type_ = 'PRACTICE'
-        group by b.user_id_
+            t.user_id_ as userId,
+            sum(if(b.end_time_ &lt;= now(),1,0)) as finshHours,
+            sum(if(b.end_time_ &gt; now(),1,0)) as unfinshHours
+        from student t
+        left join course_schedule_student_payment a on t.user_id_ = a.user_id_
+        left join course_schedule b on a.course_id_ = b.id_ and b.lock_ = 0 and b.type_ = 'PRACTICE'
+        <where>
+            <if test="userId != null and userId != ''">
+                and t.user_id_ = #{userId}
+            </if>
+        </where>
+        group by t.user_id_
     </select>
 
     <select id="queryStudentCourse" resultMap="BaseResultMap">

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

@@ -137,7 +137,4 @@
         LEFT JOIN teacher tr ON s.teacher_id_ = tr.user_id_
         WHERE s.student_id_ = #{studentId}
     </select>
-    <delete id="unfollow" parameterType="java.util.Map">
-        DELETE FROM student_star WHERE teacher_id_=#{param.teacherId} AND student_id_=#{param.studentId}
-    </delete>
 </mapper>

+ 14 - 6
cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherAuthMusicianRecordMapper.xml

@@ -24,14 +24,22 @@
 
     <select id="detail" resultType="com.yonge.cooleshow.biz.dal.vo.MusicianAuthEntryRecordVo">
         select
-        <include refid="baseColumns"/>,
-        u.real_name_ as realName,
-        u.id_card_no_ as idCardNo,
-        (
-        SELECT u.username_ FROM sys_user u WHERE u.id_ = t.verify_user_id_
-        ) as verifyUser
+            <include refid="baseColumns"/>,
+            u.real_name_ as realName,
+            u.id_card_no_ as idCardNo,
+            (
+                SELECT u.username_ FROM sys_user u WHERE u.id_ = t.verify_user_id_
+            ) as verifyUser,
+            , te.subject_id_ as "subjectId"
+            , te.introduction_ as "introduction"
+            , te.graduate_school_ as "graduateSchool"
+            , te.subject_ as "subject"
+            , te.grad_certificate_ as "gradCertificate"
+            , te.degree_certificate_ as "degreeCertificate"
+            , te.teacher_certificate_ as "teacherCertificate"
         from teacher_auth_entry_record t
         left join sys_user u on t.user_id_ = u.id_
+        left join teacher te on  t.user_id_ = te.user_id_
         where t.id_ = #{id}
     </select>
 

+ 0 - 14
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/StudentController.java

@@ -89,18 +89,4 @@ public class StudentController extends BaseController {
         return succeed(PageUtil.pageInfo(pages));
     }
 
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "teacherId", dataType = "Long", value = "老师id"),
-    })
-    @ApiOperation(value = "取消关注")
-    @PostMapping(value = "/unfollow")
-    public HttpResponseResult<Object> unfollow(@RequestBody Map<String, Long> map) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null || sysUser.getId() == null) {
-            return failed(HttpStatus.FORBIDDEN, "请登录");
-        }
-        map.put("studentId", sysUser.getId());
-        studentService.unfollow(map);
-        return succeed();
-    }
 }

+ 18 - 3
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java

@@ -67,9 +67,14 @@ public class UserOrderController extends BaseController {
         orderReq.setUserId(user.getId());
 
         try {
-            return DistributedLock.of(redissonClient)
+            HttpResponseResult<UserOrder> res = DistributedLock.of(redissonClient)
                     .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
                             , () -> userOrderService.executeOrder(orderReq), 60L, TimeUnit.SECONDS);
+            if(null != res){
+                return res;
+            }else{
+                return HttpResponseResult.failed("下单失败");
+            }
         } catch (BizException e) {
             return HttpResponseResult.failed(e.getMessage());
         }  catch (Exception e) {
@@ -92,9 +97,14 @@ public class UserOrderController extends BaseController {
         payReq.setIpAddress(WebUtil.getRemoteIp(request));
 
         try {
-            return DistributedLock.of(redissonClient)
+            HttpResponseResult<OrderPayRes> res = DistributedLock.of(redissonClient)
                     .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
                             , () -> userOrderService.orderPay(payReq), 60L, TimeUnit.SECONDS);
+            if(null != res){
+                return res;
+            }else{
+                return HttpResponseResult.failed("付款失败");
+            }
         } catch (BizException e) {
             return HttpResponseResult.failed(e.getMessage());
         } catch (Exception e) {
@@ -147,9 +157,14 @@ public class UserOrderController extends BaseController {
         payReq.setUserId(user.getId());
 
         try {
-            return DistributedLock.of(redissonClient)
+            HttpResponseResult<Boolean> res = DistributedLock.of(redissonClient)
                     .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
                             , () -> userOrderService.orderCancel(payReq), 60L, TimeUnit.SECONDS);
+            if(null != res){
+                return res;
+            }else{
+                return HttpResponseResult.failed("取消订单失败");
+            }
         } catch (BizException e) {
             return HttpResponseResult.failed(e.getMessage());
         } catch (Exception e) {

+ 6 - 0
toolset/toolset-payment/pom.xml

@@ -48,6 +48,12 @@
             <artifactId>alipay-sdk-java</artifactId>
             <version>4.23.0.ALL</version>
         </dependency>
+        <!-- 微信 -->
+        <dependency>
+            <groupId>com.github.wechatpay-apiv3</groupId>
+            <artifactId>wechatpay-apache-httpclient</artifactId>
+            <version>0.4.6</version>
+        </dependency>
         <!-- 汇付 -->
         <dependency>
             <groupId>com.huifu.adapay</groupId>

+ 1 - 0
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/adapay/AdapayTemplate.java

@@ -30,6 +30,7 @@ public class AdapayTemplate implements PaymentTemplate {
 
     @Autowired
     private PaymentProperties paymentProperties;
+
     @Autowired
     private SysConfigPaymentService configPaymentService;
 

+ 15 - 1
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/ClosePayment.java

@@ -10,12 +10,18 @@ import com.yonge.toolset.payment.base.enums.PayChannelEnum;
  */
 public class ClosePayment extends Base {
     /***
-     * 付款单id
+     * 三方支付流水号
      * @author liweifan
      * @updateTime 2022/5/10 15:30
      */
     String id;
     /***
+     * 付款订单号
+     * @author liweifan
+     * @updateTime 2022/5/10 15:30
+     */
+    String paymentNo;
+    /***
      * 关闭原因
      * @author liweifan
      * @updateTime 2022/5/10 15:30
@@ -40,6 +46,14 @@ public class ClosePayment extends Base {
         this.id = id;
     }
 
+    public String getPaymentNo() {
+        return paymentNo;
+    }
+
+    public void setPaymentNo(String paymentNo) {
+        this.paymentNo = paymentNo;
+    }
+
     public String getReason() {
         return reason;
     }

+ 43 - 1
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/RefundBill.java

@@ -11,18 +11,36 @@ import java.math.BigDecimal;
  */
 public class RefundBill extends Base {
     /***
-     * 三方支付流水号
+     * 三方退款流水号(请求后才有)
      * @author liweifan
      * @updateTime 2022/3/31 11:00
      */
     private String id;
     /***
+     * 付款订单号
+     * @author liweifan
+     * @updateTime 2022/5/10 15:30
+     */
+    String paymentNo;
+    /***
+     * 付款订单三方流水号
+     * @author liweifan
+     * @updateTime 2022/5/10 15:30
+     */
+    String tradeNo;
+    /***
      * 退款订单号
      * @author liweifan
      * @updateTime 2022/3/31 11:00
      */
     private String refundNo;
     /***
+     * 原订单金额
+     * @author liweifan
+     * @updateTime 2022/3/31 11:01
+     */
+    private BigDecimal orderAmt;
+    /***
      * 退款金额,必须大于0,保留两位小数点,如0.10、100.05等
      * @author liweifan
      * @updateTime 2022/3/31 11:01
@@ -55,6 +73,14 @@ public class RefundBill extends Base {
         this.refundNo = refundNo;
     }
 
+    public BigDecimal getOrderAmt() {
+        return orderAmt;
+    }
+
+    public void setOrderAmt(BigDecimal orderAmt) {
+        this.orderAmt = orderAmt;
+    }
+
     public BigDecimal getRefundAmt() {
         return refundAmt;
     }
@@ -70,4 +96,20 @@ public class RefundBill extends Base {
     public void setReason(String reason) {
         this.reason = reason;
     }
+
+    public String getPaymentNo() {
+        return paymentNo;
+    }
+
+    public void setPaymentNo(String paymentNo) {
+        this.paymentNo = paymentNo;
+    }
+
+    public String getTradeNo() {
+        return tradeNo;
+    }
+
+    public void setTradeNo(String tradeNo) {
+        this.tradeNo = tradeNo;
+    }
 }

+ 56 - 10
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/ali/OriginalAliAppTemplate.java

@@ -4,9 +4,13 @@ import com.alibaba.fastjson.JSONObject;
 import com.alipay.api.AlipayApiException;
 import com.alipay.api.AlipayClient;
 import com.alipay.api.request.AlipayTradeAppPayRequest;
+import com.alipay.api.request.AlipayTradeCloseRequest;
 import com.alipay.api.request.AlipayTradeQueryRequest;
+import com.alipay.api.request.AlipayTradeRefundRequest;
 import com.alipay.api.response.AlipayTradeAppPayResponse;
+import com.alipay.api.response.AlipayTradeCloseResponse;
 import com.alipay.api.response.AlipayTradeQueryResponse;
+import com.alipay.api.response.AlipayTradeRefundResponse;
 import com.yonge.toolset.base.result.BaseResult;
 import com.yonge.toolset.payment.base.PaymentTemplate;
 import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
@@ -33,10 +37,7 @@ public class OriginalAliAppTemplate implements PaymentTemplate {
     private PaymentProperties paymentProperties;
 
     @Autowired
-    private SysConfigPaymentService configPaymentService;
-
-    @Resource(name = "alipayClientApp")
-    private AlipayClient alipayClientApp;
+    private AlipayClient alipayClient;
 
     @Override
     public BaseResult<Map<String, Object>> getOpenAuthMsg(OpenAuth openAuth) {
@@ -69,10 +70,9 @@ public class OriginalAliAppTemplate implements PaymentTemplate {
         bizContent.put("merchant_order_no", payment.getOrderNo());
         request.setBizContent(bizContent.toString());
         try {
-            AlipayTradeAppPayResponse response = alipayClientApp.sdkExecute(request);
+            AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
             if (response.isSuccess()) {
                 payment.setId(response.getTradeNo());
-                payment.setStatus(TradeStatusEnum.pending);
                 payment.setPayInfo(response.getBody());
                 return BaseResult.succeed(payment);
             } else {
@@ -92,12 +92,12 @@ public class OriginalAliAppTemplate implements PaymentTemplate {
         AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
 
         JSONObject bizContent = new JSONObject();
-        bizContent.put("out_trade_no", payment.getPaymentNo());
         bizContent.put("trade_no", payment.getId());
+        bizContent.put("out_trade_no", payment.getPaymentNo());
 
         request.setBizContent(bizContent.toString());
         try {
-            AlipayTradeQueryResponse response = alipayClientApp.execute(request);
+            AlipayTradeQueryResponse response = alipayClient.execute(request);
 
             if (response.isSuccess()) {
                 payment.setPayAmt(response.getPayAmount());
@@ -127,11 +127,57 @@ public class OriginalAliAppTemplate implements PaymentTemplate {
 
     @Override
     public BaseResult<ClosePayment> closePayment(ClosePayment closePayment) {
-        return null;
+        AlipayTradeCloseRequest request = new AlipayTradeCloseRequest ();
+
+        JSONObject bizContent = new JSONObject();
+        bizContent.put("trade_no", closePayment.getId());
+        bizContent.put("out_trade_no", closePayment.getPaymentNo());
+
+        request.setBizContent(bizContent.toString());
+        try {
+            AlipayTradeCloseResponse response = alipayClient.execute(request);
+            if (response.isSuccess()) {
+                return BaseResult.succeed(closePayment);
+            } else {
+                return BaseResult.failed(response.getMsg());
+            }
+        } catch (AlipayApiException e) {
+            log.error("调用支付宝APP支付关单接口失败,err_code={} err_msg={}", e.getErrCode(), e.getErrMsg());
+            return BaseResult.failed("关单失败");
+        } catch (Exception e) {
+            e.printStackTrace();
+            return BaseResult.failed("关单失败");
+        }
     }
 
     @Override
     public BaseResult<RefundBill> refundPayment(RefundBill refundBill) {
-        return null;
+        AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
+
+        JSONObject bizContent = new JSONObject();
+        bizContent.put("trade_no", refundBill.getId());
+        bizContent.put("out_trade_no", refundBill.getPaymentNo());
+        bizContent.put("refund_amount", refundBill.getRefundAmt());
+        bizContent.put("refund_reason", refundBill.getReason());
+        bizContent.put("out_request_no", refundBill.getRefundNo());
+
+        request.setBizContent(bizContent.toString());
+        try {
+            AlipayTradeRefundResponse response = alipayClient.execute(request);
+
+            if (response.isSuccess()) {
+                //获取交易状态
+                refundBill.setStatus(TradeStatusEnum.succeeded);
+                return BaseResult.succeed(refundBill);
+            } else {
+                return BaseResult.failed(response.getMsg());
+            }
+        } catch (AlipayApiException e) {
+            log.error("调用支付宝APP支付退款接口失败,err_code={} err_msg={}", e.getErrCode(), e.getErrMsg());
+            return BaseResult.failed("退款失败");
+        } catch (Exception e) {
+            e.printStackTrace();
+            return BaseResult.failed("退款失败");
+        }
     }
 }

+ 8 - 8
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/ali/config/AlipayConfiguration.java

@@ -27,17 +27,17 @@ public class AlipayConfiguration {
      * @updateTime 2022/5/12 14:16
      * @return: com.alipay.api.AlipayClient
      */
-    @Bean(name = "alipayClientApp")
-    public AlipayClient alipayClientApp() {
+    @Bean
+    public AlipayClient alipayClient() {
         AlipayClient alipayClient = new DefaultAlipayClient(
                 configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, AlipayConstant.ALI_URL).getParamValue(),
-                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, AlipayConstant.ALI_APP_APPID).getParamValue(),
-                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, AlipayConstant.ALI_APP_APP_PRIVATE_KEY).getParamValue(),
+                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, AlipayConstant.ALI_APPID).getParamValue(),
+                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, AlipayConstant.ALI_APP_PRIVATE_KEY).getParamValue(),
                 "json", "UTF-8",
-                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, AlipayConstant.ALI_APP_ALIPAY_PUBLIC_KEY).getParamValue(),
-                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, AlipayConstant.ALI_APP_SIGN_TYPE).getParamValue(),
-                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, AlipayConstant.ALI_APP_CONTENT_SIGN_KEY).getParamValue(),
-                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, AlipayConstant.ALI_APP_CONTENT_SIGN_TYPE).getParamValue()
+                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, AlipayConstant.ALI_ALIPAY_PUBLIC_KEY).getParamValue(),
+                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, AlipayConstant.ALI_SIGN_TYPE).getParamValue(),
+                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, AlipayConstant.ALI_CONTENT_SIGN_KEY).getParamValue(),
+                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, AlipayConstant.ALI_CONTENT_SIGN_TYPE).getParamValue()
         );
         return alipayClient;
     }

+ 12 - 12
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/ali/constant/AlipayConstant.java

@@ -13,40 +13,40 @@ public interface AlipayConstant {
      */
     String ALI_URL = "ALI_URL";
     /***
-     * 支付宝-APP支付-应用ID
+     * 支付宝-应用ID
      * @author liweifan
      * @updateTime 2022/5/12 14:12
      */
-    String ALI_APP_APPID = "ALI_APP_APPID";
+    String ALI_APPID = "ALI_APPID";
     /***
-     * 支付宝-APP支付-应用私钥
+     * 支付宝-应用私钥
      * @author liweifan
      * @updateTime 2022/5/12 14:12
      */
-    String ALI_APP_APP_PRIVATE_KEY = "ALI_APP_APP_PRIVATE_KEY";
+    String ALI_APP_PRIVATE_KEY = "ALI_APP_PRIVATE_KEY";
     /***
-     * 支付宝-APP支付-应用公钥
+     * 支付宝-应用公钥
      * @author liweifan
      * @updateTime 2022/5/12 14:12
      */
-    String ALI_APP_ALIPAY_PUBLIC_KEY = "ALI_APP_ALIPAY_PUBLIC_KEY";
+    String ALI_ALIPAY_PUBLIC_KEY = "ALI_ALIPAY_PUBLIC_KEY";
     /***
-     * 支付宝-APP支付-验签方式
+     * 支付宝-验签方式
      * @author liweifan
      * @updateTime 2022/5/12 14:12
      */
-    String ALI_APP_SIGN_TYPE = "ALI_APP_SIGN_TYPE";
+    String ALI_SIGN_TYPE = "ALI_SIGN_TYPE";
     /***
-     * 支付宝-APP支付-接口内容加密密钥
+     * 支付宝-接口内容加密密钥
      * @author liweifan
      * @updateTime 2022/5/12 14:12
      */
-    String ALI_APP_CONTENT_SIGN_KEY = "ALI_APP_CONTENT_SIGN_KEY";
+    String ALI_CONTENT_SIGN_KEY = "ALI_CONTENT_SIGN_KEY";
     /***
-     * 支付宝-APP支付-接口内容加密方式
+     * 支付宝-接口内容加密方式
      * @author liweifan
      * @updateTime 2022/5/12 14:12
      */
-    String ALI_APP_CONTENT_SIGN_TYPE = "ALI_APP_CONTENT_SIGN_TYPE";
+    String ALI_CONTENT_SIGN_TYPE = "ALI_CONTENT_SIGN_TYPE";
 
 }

+ 205 - 6
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/wx/OriginalWxAppTemplate.java

@@ -1,17 +1,32 @@
 package com.yonge.toolset.payment.original.wx;
 
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.yonge.toolset.base.result.BaseResult;
 import com.yonge.toolset.payment.base.PaymentTemplate;
+import com.yonge.toolset.payment.base.enums.OpenEnum;
+import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
 import com.yonge.toolset.payment.base.model.ClosePayment;
 import com.yonge.toolset.payment.base.model.OpenAuth;
 import com.yonge.toolset.payment.base.model.Payment;
 import com.yonge.toolset.payment.base.model.RefundBill;
+import com.yonge.toolset.payment.core.props.PaymentProperties;
 import com.yonge.toolset.payment.core.service.SysConfigPaymentService;
+import com.yonge.toolset.payment.original.wx.constant.WxpayConstant;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.util.EntityUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.io.ByteArrayOutputStream;
 import java.util.Map;
 
 @Component
@@ -20,30 +35,214 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
     private final static Logger log = LoggerFactory.getLogger(OriginalWxAppTemplate.class);
 
     @Autowired
+    private PaymentProperties paymentProperties;
+
+    @Autowired
     private SysConfigPaymentService configPaymentService;
 
+    //@Autowired
+    private CloseableHttpClient httpClient;
+
     @Override
     public BaseResult<Map<String, Object>> getOpenAuthMsg(OpenAuth openAuth) {
         return null;
     }
 
     @Override
-    public BaseResult<Payment> executePayment(Payment payment){
-        return null;
+    public BaseResult<Payment> executePayment(Payment payment) {
+        String APP_ID = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_APPID).getParamValue();
+        String MERCHANT_ID = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_ID).getParamValue();
+
+        HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/pay/transactions/app");
+        httpPost.addHeader("Accept", "application/json");
+        httpPost.addHeader("Content-type", "application/json; charset=utf-8");
+
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        ObjectMapper objectMapper = new ObjectMapper();
+
+        ObjectNode rootNode = objectMapper.createObjectNode();
+        rootNode.put("mchid", MERCHANT_ID)
+                .put("appid", APP_ID)
+                .put("description", payment.getDescription())
+                .put("out_trade_no", payment.getPaymentNo())
+                .put("notify_url", paymentProperties.getNotifyUrl()
+                        + "/" + payment.getOpenType().getCode()
+                        + "/" + payment.getPayChannel().getCode()
+                        + "/executePayment");
+
+        rootNode.putObject("amount")
+                .put("total", payment.getPayAmt());
+
+        try {
+            objectMapper.writeValue(bos, rootNode);
+
+            httpPost.setEntity(new StringEntity(bos.toString("UTF-8"), "UTF-8"));
+        } catch (Exception e) {
+            e.printStackTrace();
+            return BaseResult.failed("微信APP支付参数转换失败");
+        }
+
+        CloseableHttpResponse response;
+        try {
+            response = httpClient.execute(httpPost);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return BaseResult.failed("微信APP支付请求失败");
+        }
+        String bodyAsString;
+        try {
+            bodyAsString = EntityUtils.toString(response.getEntity());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return BaseResult.failed("微信APP支付返回结果转换失败");
+        }
+        JSONObject jsonObject = JSONObject.parseObject(bodyAsString);
+        String prepay_id = jsonObject.getString("prepay_id");
+        payment.setPayInfo(prepay_id);
+
+        BaseResult<Payment> paymentBaseResult = queryPayment(payment);
+        if (paymentBaseResult.getStatus()) {
+            payment.setId(paymentBaseResult.getData().getId());
+        }
+        return BaseResult.succeed(payment);
     }
 
     @Override
     public BaseResult<Payment> queryPayment(Payment payment) {
-        return null;
+        String MERCHANT_ID = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_ID).getParamValue();
+
+        String url = "https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/" + payment.getPaymentNo() + "?mchid=" + MERCHANT_ID;
+
+        HttpGet httpGet;
+        try {
+            URIBuilder uriBuilder = new URIBuilder(url);
+            httpGet = new HttpGet(uriBuilder.build());
+            httpGet.addHeader("Accept", "application/json");
+        } catch (Exception e) {
+            e.printStackTrace();
+            return BaseResult.failed("微信APP支付参数转换失败");
+        }
+
+        CloseableHttpResponse response;
+        try {
+            response = httpClient.execute(httpGet);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return BaseResult.failed("微信APP支付请求失败");
+        }
+        String bodyAsString;
+        try {
+            bodyAsString = EntityUtils.toString(response.getEntity());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return BaseResult.failed("微信APP支付返回结果转换失败");
+        }
+        JSONObject jsonObject = JSONObject.parseObject(bodyAsString);
+        payment.setId(jsonObject.getString("transaction_id"));
+
+        String trade_state = jsonObject.getString("trade_state");
+        if ("SUCCESS".equals(trade_state)) {
+            payment.setStatus(TradeStatusEnum.succeeded);
+        } else if ("REFUND".equals(trade_state)) {
+            payment.setStatus(TradeStatusEnum.close);
+        } else if ("NOTPAY".equals(trade_state)) {
+            payment.setStatus(TradeStatusEnum.pending);
+        } else if ("CLOSED".equals(trade_state)) {
+            payment.setStatus(TradeStatusEnum.close);
+        }
+        return BaseResult.succeed(payment);
     }
 
     @Override
     public BaseResult<ClosePayment> closePayment(ClosePayment closePayment) {
-        return null;
+        String MERCHANT_ID = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_ID).getParamValue();
+
+        HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/" + closePayment.getPaymentNo() + "/close");
+        httpPost.addHeader("Accept", "application/json");
+        httpPost.addHeader("Content-type", "application/json; charset=utf-8");
+
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        ObjectMapper objectMapper = new ObjectMapper();
+
+        ObjectNode rootNode = objectMapper.createObjectNode();
+        rootNode.put("mchid", MERCHANT_ID)
+                .put("notify_url", paymentProperties.getNotifyUrl()
+                        + "/" + closePayment.getOpenType().getCode()
+                        + "/" + closePayment.getPayChannel().getCode()
+                        + "/closePayment");
+        try {
+            objectMapper.writeValue(bos, rootNode);
+            httpPost.setEntity(new StringEntity(bos.toString("UTF-8"), "UTF-8"));
+        } catch (Exception e) {
+            e.printStackTrace();
+            return BaseResult.failed("微信APP支付参数转换失败");
+        }
+
+        CloseableHttpResponse response;
+        try {
+            response = httpClient.execute(httpPost);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return BaseResult.failed("微信APP支付请求失败");
+        }
+        return BaseResult.succeed(closePayment);
     }
 
     @Override
-    public BaseResult<RefundBill> refundPayment(RefundBill refundBill)  {
-        return null;
+    public BaseResult<RefundBill> refundPayment(RefundBill refundBill) {
+        String APP_ID = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_APPID).getParamValue();
+        String MERCHANT_ID = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_ID).getParamValue();
+
+        HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/refund/domestic/refunds");
+        httpPost.addHeader("Accept", "application/json");
+        httpPost.addHeader("Content-type", "application/json; charset=utf-8");
+
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        ObjectMapper objectMapper = new ObjectMapper();
+
+        ObjectNode rootNode = objectMapper.createObjectNode();
+        rootNode.put("mchid", MERCHANT_ID)
+                .put("appid", APP_ID)
+                .put("transaction_id", refundBill.getTradeNo())
+                .put("out_trade_no", refundBill.getPaymentNo())
+                .put("out_refund_no", refundBill.getRefundNo())
+                .put("reason", refundBill.getReason())
+                .put("notify_url", paymentProperties.getNotifyUrl()
+                        + "/" + refundBill.getOpenType().getCode()
+                        + "/" + refundBill.getPayChannel().getCode()
+                        + "/refundPayment");
+
+        rootNode.putObject("amount")
+                .put("refund", refundBill.getRefundAmt())
+                .put("total", refundBill.getOrderAmt())
+                .put("currency", "CNY");
+
+        try {
+            objectMapper.writeValue(bos, rootNode);
+
+            httpPost.setEntity(new StringEntity(bos.toString("UTF-8"), "UTF-8"));
+        } catch (Exception e) {
+            e.printStackTrace();
+            return BaseResult.failed("微信APP支付参数转换失败");
+        }
+
+        CloseableHttpResponse response;
+        try {
+            response = httpClient.execute(httpPost);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return BaseResult.failed("微信APP支付请求失败");
+        }
+        String bodyAsString;
+        try {
+            bodyAsString = EntityUtils.toString(response.getEntity());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return BaseResult.failed("微信APP支付返回结果转换失败");
+        }
+        JSONObject jsonObject = JSONObject.parseObject(bodyAsString);
+        String refund_id = jsonObject.getString("refund_id");
+        refundBill.setId(refund_id);
+        return BaseResult.succeed(refundBill);
     }
 }

+ 68 - 0
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/wx/config/WxpayConfiguration.java

@@ -0,0 +1,68 @@
+package com.yonge.toolset.payment.original.wx.config;
+
+import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder;
+import com.wechat.pay.contrib.apache.httpclient.auth.PrivateKeySigner;
+import com.wechat.pay.contrib.apache.httpclient.auth.Verifier;
+import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Credentials;
+import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Validator;
+import com.wechat.pay.contrib.apache.httpclient.cert.CertificatesManager;
+import com.wechat.pay.contrib.apache.httpclient.util.PemUtil;
+import com.yonge.toolset.payment.base.enums.OpenEnum;
+import com.yonge.toolset.payment.core.service.SysConfigPaymentService;
+import com.yonge.toolset.payment.original.wx.constant.WxpayConstant;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.io.ByteArrayInputStream;
+import java.nio.charset.StandardCharsets;
+import java.security.PrivateKey;
+
+/**
+ * @Author: liweifan
+ * @Data: 2022/5/12 10:12
+ */
+@Configuration
+public class WxpayConfiguration {
+    @Autowired
+    private SysConfigPaymentService configPaymentService;
+
+    /***
+     * 支付宝APP支付Bean
+     * @author liweifan
+     * @updateTime 2022/5/12 14:16
+     * @return: com.alipay.api.AlipayClient
+     */
+    //@Bean
+    public CloseableHttpClient closeableHttpClient() throws Exception{
+        String merchantId = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_ID).getParamValue();
+        String merchantSerialNumber = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_SERIAL_NUMBER).getParamValue();
+        String merchantPrivateKey = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_PRIVATE_KEY).getParamValue();
+        String apiV3Key = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_API_V3_KEY).getParamValue();
+
+        PrivateKey privateKey = PemUtil
+                .loadPrivateKey(new ByteArrayInputStream(merchantPrivateKey.getBytes("utf-8")));
+
+        // 获取证书管理器实例
+        CertificatesManager certificatesManager = CertificatesManager.getInstance();
+        // 向证书管理器增加需要自动更新平台证书的商户信息
+        certificatesManager.putMerchant(merchantId,
+                new WechatPay2Credentials(merchantId,
+                    new PrivateKeySigner(merchantSerialNumber, privateKey)),
+                    apiV3Key.getBytes(StandardCharsets.UTF_8)
+        );
+
+        //e4128409c23499cf24976233c8327696
+
+        // 从证书管理器中获取verifier
+        Verifier verifier = certificatesManager.getVerifier(merchantId);
+
+        WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
+                .withMerchant(merchantId, merchantSerialNumber, privateKey)
+                .withValidator(new WechatPay2Validator(verifier));
+
+        return builder.build();
+    }
+
+}

+ 39 - 0
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/wx/constant/WxpayConstant.java

@@ -0,0 +1,39 @@
+package com.yonge.toolset.payment.original.wx.constant;
+
+/**
+ *
+ * @Author: liweifan
+ * @Data: 2022/5/11 16:21
+ */
+public interface WxpayConstant {
+    /***
+     * APPID
+     * @author liweifan
+     * @updateTime 2022/5/13 14:09
+     */
+    String WX_APPID = "APPID";
+    /***
+     * 商户号
+     * @author liweifan
+     * @updateTime 2022/5/13 14:09
+     */
+    String WX_MERCHANT_ID = "WX_MERCHANT_ID";
+    /***
+     * 商户证书序列号
+     * @author liweifan
+     * @updateTime 2022/5/13 14:09
+     */
+    String WX_MERCHANT_SERIAL_NUMBER = "WX_MERCHANT_SERIAL_NUMBER";
+    /***
+     * 商户私钥
+     * @author liweifan
+     * @updateTime 2022/5/13 14:09
+     */
+    String WX_MERCHANT_PRIVATE_KEY = "WX_MERCHANT_PRIVATE_KEY";
+    /***
+     * V3密钥
+     * @author liweifan
+     * @updateTime 2022/5/13 14:09
+     */
+    String WX_API_V3_KEY = "WX_API_V3_KEY";
+}