Browse Source

Merge remote-tracking branch 'origin/feature/0721-tenant' into feature/0721-tenant

zouxuan 1 year ago
parent
commit
af558ab6e8
41 changed files with 965 additions and 136 deletions
  1. 3 1
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserServiceImpl.java
  2. 2 4
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/TokenController.java
  3. 5 2
      cooleshow-auth/auth-server/src/main/resources/config/mybatis/SysUserMapper.xml
  4. 30 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/EActivationCode.java
  5. 99 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/UserPaymentClient.java
  6. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImGroup.java
  7. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TenantActivationCode.java
  8. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/ImGroupType.java
  9. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImGroupService.java
  10. 4 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/StudentService.java
  11. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantActivationCodeService.java
  12. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderService.java
  13. 0 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserPaymentCoreService.java
  14. 24 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImGroupServiceImpl.java
  15. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/RedisCacheServiceImpl.java
  16. 38 10
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java
  17. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java
  18. 81 34
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantActivationCodeServiceImpl.java
  19. 64 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantAlbumServiceImpl.java
  20. 10 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantInfoServiceImpl.java
  21. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  22. 3 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserPaymentCoreServiceImpl.java
  23. 15 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserPaymentOrderServiceImpl.java
  24. 17 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/StudentWrapper.java
  25. 23 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantAlbumWrapper.java
  26. 6 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/UserPaymentOrderWrapper.java
  27. 4 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/teacher/TeacherWrapper.java
  28. 6 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/StudentMapper.xml
  29. 1 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  30. 72 0
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java
  31. 232 0
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/vo/UserPaymentOrderVo.java
  32. 7 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/ImGroupController.java
  33. 22 20
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherController.java
  34. 3 2
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/StudentController.java
  35. 11 13
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TeacherController.java
  36. 3 1
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TenantActivationCodeController.java
  37. 2 1
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TenantAlbumController.java
  38. 29 14
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/UserOrderController.java
  39. 52 0
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/open/OpenTeacherController.java
  40. 1 4
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/vo/UserPaymentOrderVo.java
  41. 49 0
      toolset/toolset-base/src/main/java/com/yonge/toolset/base/util/StringUtil.java

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

@@ -46,6 +46,7 @@ import java.text.MessageFormat;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Random;
 import java.util.stream.Collectors;
 
@@ -406,6 +407,7 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
 
     @Override
     public Long getTenantByClient(Long userId, String clientId) {
-        return sysUserDao.getTenantByClient(userId,clientId);
+        // 查询用户机构信息,若没有则返回-1
+        return Optional.ofNullable(sysUserDao.getTenantByClient(userId, clientId)).orElse(-1L);
     }
 }

+ 2 - 4
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/TokenController.java

@@ -31,7 +31,6 @@ import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
 import org.springframework.security.oauth2.common.OAuth2AccessToken;
 import org.springframework.security.oauth2.provider.token.ResourceServerTokenServices;
-import org.springframework.security.oauth2.provider.token.TokenStore;
 import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -61,9 +60,6 @@ public class TokenController extends BaseController {
     private ResourceServerTokenServices resourceServerTokenServices;
 
     @Autowired
-    private TokenStore tokenStore;
-
-    @Autowired
     private RestTemplate restTemplate;
 
     @Autowired
@@ -93,7 +89,9 @@ public class TokenController extends BaseController {
     public SysUser queryUserInfo() {
         AuthUser authUser = SecurityUtils.getUser();
         if (authUser != null) {
+            // 获取用户信息
             SysUser sysUser = userService.get(authUser.getUserId());
+            // 获取用户机构信息
             sysUser.setTenantId(userService.getTenantByClient(authUser.getUserId(),authUser.getClientId()));
             return sysUser;
         }

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

@@ -313,9 +313,12 @@
             <when test="clientId == 'TEACHER'">
                 teacher
             </when>
-            <when test="clientId == 'SYSTEM'">
-                employee
+            <when test="clientId == 'ORGANIZATION'">
+                tenant_staff
             </when>
+            <otherwise>
+                employee
+            </otherwise>
         </choose>
         where user_id_ = #{userId}
     </select>

+ 30 - 0
cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/EActivationCode.java

@@ -0,0 +1,30 @@
+package com.yonge.cooleshow.common.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+
+public enum EActivationCode implements BaseEnum<String, EActivationCode> {
+
+    SEND("已发"),
+    WAIT("未发"),
+    ;
+
+    @EnumValue
+    private String code;
+
+    private String desc;
+
+    EActivationCode(String desc) {
+        this.code = this.name();
+        this.desc = desc;
+    }
+
+    @Override
+    public String getCode() {
+        return name();
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+}

+ 99 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/UserPaymentClient.java

@@ -0,0 +1,99 @@
+package com.yonge.cooleshow.admin.controller.open;
+
+import com.alibaba.fastjson.JSON;
+import com.microsvc.toolkit.common.response.template.R;
+import com.microsvc.toolkit.common.webportal.exception.BizException;
+import com.microsvc.toolkit.config.jwt.utils.JwtUserInfo;
+import com.microsvc.toolkit.middleware.payment.common.api.PaymentServiceContext;
+import com.microsvc.toolkit.middleware.payment.common.api.entity.PaymentResp;
+import com.microsvc.toolkit.middleware.payment.common.api.entity.RefundResp;
+import com.yonge.cooleshow.biz.dal.service.UserOrderService;
+import com.yonge.cooleshow.biz.dal.service.UserPaymentCoreService;
+import com.yonge.cooleshow.biz.dal.service.UserPaymentOrderService;
+import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Objects;
+
+@Slf4j
+@RestController
+@RequestMapping("/open/userOrder")
+@Api(tags = "开放权限接口-支付回调")
+public class UserPaymentClient {
+
+    @Autowired
+    private PaymentServiceContext paymentServiceContext;
+    @Autowired
+    private UserPaymentCoreService userPaymentCoreService;
+    @Autowired
+    private UserPaymentOrderService userPaymentOrderService;
+
+    @Autowired
+    private UserOrderService userOrderService;
+
+    /**
+     * 支付消息回调
+     * @param request HttpServletRequest
+     * @return String
+     */
+    @ApiOperation(value = "支付消息回调", notes = "三方支付平台支付消息通知")
+    @ApiImplicitParams({
+        @ApiImplicitParam(name = "vendor", value = "服务提供方", dataType = "String")
+    })
+    @RequestMapping(value = "/payment/callback/{vendor}", method = {RequestMethod.GET, RequestMethod.POST})
+    public String payment(@PathVariable("vendor") String vendor, HttpServletRequest request) {
+
+        // 支付回调消息
+        PaymentResp paymentResp = paymentServiceContext.getPaymentService(vendor).callbackNotifyForPay(request);
+        if (Objects.isNull(paymentResp)) {
+            return null;
+        }
+        log.info("payment vendor={}, paymentResp={}", vendor, JSON.toJSONString(paymentResp));
+        // 支付订单确认
+        UserPaymentOrderWrapper.UserPaymentOrder paymentOrder = userPaymentOrderService
+                .getUserPaymentOrderByOrderNo(paymentResp.getTransNo(), paymentResp.getMerOrderNo());
+        if (Objects.isNull(paymentOrder)) {
+            return paymentResp.getMsg();
+        }
+
+        // 执行支付回调流程
+        userPaymentCoreService.executePaymentCallback(paymentResp);
+
+        return paymentServiceContext.getPaymentService(vendor).returnNotifyResult(request);
+    }
+
+    @ApiOperation(value = "用户付款", notes = "用户付款")
+    @PostMapping("/executePayment")
+    public R<UserPaymentOrderWrapper.PaymentReq> executePayment(@Validated @RequestBody UserPaymentOrderWrapper.PaymentOrderReqConfig config) {
+
+        // 用户登录状态校验
+        if (StringUtils.isBlank(config.getUserId())) {
+            throw BizException.from("用户未登录");
+        }
+
+        // 用户下单请求
+        UserPaymentOrderWrapper.PaymentOrderReqConfig reqConfig = UserPaymentOrderWrapper.PaymentOrderReqConfig.from(config.jsonString());
+
+        JwtUserInfo<Object> userInfo = JwtUserInfo.builder()
+            .userId(config.getUserId())
+            .clientType(config.getUserType().getCode())
+            .build();
+        // 创建用户支付数据
+        UserPaymentOrderWrapper.PaymentReq paymentConfig = userPaymentCoreService.executePayment(userInfo, reqConfig);
+        if (Objects.isNull(paymentConfig)) {
+            throw BizException.from("用户支付请求错误");
+        }
+
+        return R.from(paymentConfig);
+    }
+
+}

+ 9 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImGroup.java

@@ -7,10 +7,15 @@ import com.yonge.cooleshow.biz.dal.enums.ImGroupType;
 import com.yonge.toolset.base.enums.BaseEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 import javax.validation.constraints.NotBlank;
 import java.io.Serializable;
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
 
 /**
  * 即时通讯群组(ImGroup)表实体类
@@ -18,6 +23,7 @@ import java.util.Date;
  * @author zx
  * @since 2022-03-22 10:45:57
  */
+@Data
 @ApiModel(value = "im_group-即时通讯群组")
 public class ImGroup implements Serializable {
     @TableId(value = "id_")
@@ -70,6 +76,9 @@ public class ImGroup implements Serializable {
     @ApiModelProperty(value = "课程组id")
     private Long courseGroupId;
 
+
+    private Set<Long> studentIdList = new HashSet<>();
+
     public Long getCourseGroupId() {
         return courseGroupId;
     }

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

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.yonge.cooleshow.common.enums.EActivationCode;
 import lombok.Data;
 
 import io.swagger.annotations.ApiModel;
@@ -44,7 +45,7 @@ public class TenantActivationCode implements Serializable {
 
     @ApiModelProperty("发送状态(WAIT,SEND)") 
 	@TableField(value = "send_status_")
-    private String sendStatus;
+    private EActivationCode sendStatus;
 
     @ApiModelProperty("激活状态") 
 	@TableField(value = "activation_status_")

+ 2 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/ImGroupType.java

@@ -5,7 +5,8 @@ import com.yonge.toolset.base.enums.BaseEnum;
 
 public enum ImGroupType implements BaseEnum<String, ImGroupType> {
     FAN("粉丝群"),
-    COURSE("课程群");
+    COURSE("课程群"),
+    ORG("机构群");
     @EnumValue
     private String code;
     private String msg;

+ 8 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImGroupService.java

@@ -8,6 +8,7 @@ import com.yonge.cooleshow.biz.dal.entity.ImGroup;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  * 即时通讯群组(ImGroup)表服务接口
@@ -85,5 +86,12 @@ public interface ImGroupService extends IService<ImGroup> {
      * @return ImGroup
      */
     ImGroup findGroupInfoById(String groupId, Long userId);
+
+    /**
+     * 添加群成员
+     * @param groupId 群id
+     * @param studentIdList 学生成员列表
+     */
+    void addGroupMember(String groupId, Set<Long> studentIdList) throws Exception;
 }
 

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

@@ -117,7 +117,9 @@ public interface StudentService extends IService<Student> {
     /**
      * 导入学生
      * @param dataList 数据列表
-     * @param id 操作人
+     * @param tenantId 机构ID
+     * @param suerId 操作人
      */
-    void importStudentExcel(List<ExcelDataReaderProperty<StudentWrapper.StudentExport>> dataList, Long id);
+    void importStudentExcel(List<ExcelDataReaderProperty<StudentWrapper.StudentExport>> dataList,Long tenantId,
+                            Long suerId);
 }

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantActivationCodeService.java

@@ -2,8 +2,10 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantActivationCodeWrapper;
 import com.yonge.cooleshow.biz.dal.entity.TenantActivationCode;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 
@@ -46,4 +48,14 @@ public interface TenantActivationCodeService extends IService<TenantActivationCo
     void sendActivationCode(Long tenantId, Long tenantAlbumPurchaseId, List<String> activationCodeList, List<Long> studentIdList);
 
     void active(String activationCode, Long studentId);
+
+
+
+    /**
+     * 添加用户机构专辑激活记录
+     *
+     * @param studentId 学生ID
+     * @param userOrderDetailVo 订单详情
+     */
+    void addUserTenantAlbumRecord(Long studentId, UserOrderDetailVo userOrderDetailVo);
 }

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

@@ -209,4 +209,10 @@ public interface UserOrderService extends IService<UserOrder> {
      */
     BigDecimal getShareFreeByConfigName(String configName);
 
+    /**
+     * 获取订单数据
+     *
+     * @param orderNo 订单号
+     */
+    UserOrder getByOrderNo(String orderNo);
 }

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

@@ -48,7 +48,6 @@ public interface UserPaymentCoreService {
      */
     UserPaymentOrderWrapper.PaymentReq executePayment(JwtUserInfo<?> userInfo, UserPaymentOrderWrapper.PaymentOrderReqConfig reqConfig);
 
-    @Transactional
     UserPaymentOrderWrapper.PaymentConfig executeOrder(UserPaymentOrderWrapper.UserPaymentOrder orderReq);
 
     /**

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

@@ -114,12 +114,36 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
         this.baseMapper.insert(imGroup);
         //处理本地群成员列表
         List<GroupMember> groupMembers = imGroupMemberService.initGroupMember(imGroupId, imGroup.getCreateBy(), true, ImGroupMemberRoleType.TEACHER);
+
+        if (imGroup.getStudentIdList().isEmpty()) {
+            List<GroupMember> groupMemberList = imGroupMemberService.initGroupMembers(imGroupId,
+                    imGroup.getStudentIdList(), ImGroupMemberRoleType.STUDENT);
+            groupMembers.addAll(groupMemberList);
+        }
+
         //创建融云群
         this.rtcCreate(imGroup.getCreateBy(),imGroupId,imGroup.getName());
         //加入融云群
         imGroupMemberService.join(groupMembers,imGroupId);
     }
 
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void addGroupMember(String groupId, Set<Long> studentIdList) throws Exception {
+        ImGroup imGroup = this.baseMapper.selectById(groupId);
+        if (imGroup == null) {
+            throw new BizException("群不存在");
+        }
+        if (imGroup.getStudentIdList().isEmpty()) {
+            throw new BizException("添加的群成员不能为空");
+
+        }
+        List<GroupMember> groupMemberList = imGroupMemberService.initGroupMembers(groupId,
+                imGroup.getStudentIdList(), ImGroupMemberRoleType.STUDENT);
+        imGroupMemberService.join(groupMemberList, groupId);
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public String autoCreate(Long courseGroupId, String courseGroupType) throws Exception {

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

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 import com.google.common.collect.Lists;
 import com.yonge.cooleshow.biz.dal.service.CacheKey;
 import com.yonge.cooleshow.biz.dal.service.RedisCacheService;
+import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.BooleanUtils;
@@ -72,7 +73,7 @@ public class RedisCacheServiceImpl implements RedisCacheService {
      */
     @Override
     public String getPaymentCacheKey(String orderNo) {
-        return getCacheKey(CacheKey.PAYMENT_ORDER_LOCK, orderNo);
+        return CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(orderNo);
     }
 
     /**

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

@@ -55,7 +55,9 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.text.MessageFormat;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
@@ -362,7 +364,7 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
     @Transactional(rollbackFor = Exception.class)
     @Override
     public Boolean save(StudentWrapper.Student studentInfo) {
-        if (studentInfo.getId() != null) {
+        if (studentInfo.getId() == null) {
             return createStudent(studentInfo);
         } else {
             return updateStudent(studentInfo);
@@ -371,7 +373,8 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public void importStudentExcel(List<ExcelDataReaderProperty<StudentWrapper.StudentExport>> dataList, Long id) {
+    public void importStudentExcel(List<ExcelDataReaderProperty<StudentWrapper.StudentExport>> dataList,
+                                   Long tenantId, Long userId) {
         if (dataList.isEmpty()) {
             throw new BizException("导入数据不能为空");
         }
@@ -384,12 +387,13 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
             Integer rowIndex = next.getRowIndex();
             StudentWrapper.StudentExport student = next.getClazz();
 
-            student.checkValid().forEach(err -> errMsg.add(String.format("第%s行%s", rowIndex, err)));
+            int msgRowNo = rowIndex + 1;
+            student.checkValid().forEach(err -> errMsg.add(String.format("第%s行%s", msgRowNo, err)));
 
             if (phoneMap.containsKey(student.getPhone().trim())) {
-                errMsg.add(String.format("第%s行手机号重复", rowIndex));
+                errMsg.add(String.format("第%s行手机号重复", msgRowNo));
             } else {
-                phoneMap.put(student.getPhone().trim(), rowIndex);
+                phoneMap.put(student.getPhone().trim(), msgRowNo);
             }
 
             if (errMsg.size() > 100) {
@@ -397,7 +401,11 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
             }
         }
 
-        int row = 100;
+        if (!errMsg.isEmpty()) {
+            throw new BizException(String.join(",", errMsg));
+        }
+
+        int row = 50;
         int page = 1;
         List<List<String>> phonePartition = Lists.partition(new ArrayList<>(phoneMap.keySet()), row);
 
@@ -411,13 +419,30 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
 
             if (!studentVos.isEmpty()) {
                 List<String> existPhoneList = studentVos.stream().map(StudentVo::getPhone).collect(Collectors.toList());
-                existPhoneList.forEach(phone -> errMsg.add(String.format("第%s行手机号已经注册学生", phoneMap.get(phone))));
+                existPhoneList.forEach(phone -> {
+                    if (phoneMap.containsKey(phone)) {
+                        errMsg.add(String.format("第%s行手机号已经注册学生", phoneMap.get(phone)));
+                    }
+                });
             }
         }
 
         if (!errMsg.isEmpty()) {
             throw new BizException(String.join(",", errMsg));
         }
+
+        for (ExcelDataReaderProperty<StudentWrapper.StudentExport> next : dataList) {
+            StudentWrapper.StudentExport studentExport = next.getClazz();
+            StudentWrapper.Student student = new StudentWrapper.Student();
+            student.setTenantId(tenantId);
+            student.setName(studentExport.getUserName());
+            student.setGender("1".equals(studentExport.getGender()) ? 1 : 0);
+            student.setSubjectId(studentExport.getSubjectId());
+
+            LocalDate birthday = LocalDate.parse(studentExport.getBirthday(), DateTimeFormatter.ISO_LOCAL_DATE);
+            student.setBirthdate(birthday);
+            save(student);
+        }
     }
 
     private Boolean updateStudent(StudentWrapper.Student studentInfo) {
@@ -426,14 +451,14 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
             throw new BizException("学生信息不存在");
         }
         // 解绑
-        if (!studentInfo.getBindTenant()) {
+        if (Boolean.FALSE.equals(studentInfo.getBindTenant())) {
             studentInfo.setTenantId(-1L);
             // 退群,删除好友
             imUserFriendService.delFriendByTenantId(student.getTenantId(), student.getUserId());
         }
         // 手机号码修改
+        com.yonge.cooleshow.biz.dal.entity.SysUser sysUser = getOrCreateAccount(studentInfo);
         if (!student.getPhone().equals(studentInfo.getPhone())) {
-            com.yonge.cooleshow.biz.dal.entity.SysUser sysUser = getOrCreateAccount(studentInfo);
             this.lambdaUpdate().set(Student::getSubjectId, studentInfo.getSubjectId())
                     .set(Student::getTenantId, studentInfo.getTenantId())
                     .set(Student::getUserId, sysUser.getId())
@@ -470,10 +495,12 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
         com.yonge.cooleshow.biz.dal.entity.SysUser sysUser;
         if (!sysUsers.isEmpty()) {
             sysUser = sysUsers.get(0);
-            if (this.getBaseMapper().selectById(sysUser.getId()) != null) {
+            if (!sysUser.getId().equals(studentInfo.getId()) &&
+                    this.getBaseMapper().selectById(sysUser.getId()) != null) {
                 throw new BizException("手机号已经注册学生账号");
             }
             sysUser.setGender(studentInfo.getGender());
+            sysUser.setUsername(studentInfo.getName());
             sysUser.setBirthdate(studentInfo.getBirthdate());
             String userType = sysUser.getUserType();
             String studentUserType = "STUDENT";
@@ -491,6 +518,7 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
             sysUser.setGender(studentInfo.getGender());
             sysUser.setUserType("STUDENT");
             sysUser.setBirthdate(studentInfo.getBirthdate());
+            sysUser.setUsername(studentInfo.getName());
 
             String newPassword = MessageFormat.format("klxjg{0}", studentInfo.getPhone().substring(7));
             String password = new BCryptPasswordEncoder().encode(newPassword);

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

@@ -472,6 +472,7 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
         teacher.setMusicianDate(null);
         teacher.setIsSettlement(teacherSubmitReq.getIsSettlement());
         teacher.setIsTestUser(teacherSubmitReq.getIsTestUser());
+        teacher.setSettlementFrom(teacherSubmitReq.getSettlementFrom());
         teacher.setTenantId(teacherSubmitReq.getTenantId() == null ? -1L : teacherSubmitReq.getTenantId());
         if (teacher.getTenantId() == -1L) {
             teacher.setSettlementFrom(ESettlementFrom.TEACHER);

+ 81 - 34
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantActivationCodeServiceImpl.java

@@ -5,11 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.biz.dal.dao.StudentDao;
-import com.yonge.cooleshow.biz.dal.entity.Student;
-import com.yonge.cooleshow.biz.dal.entity.SysUser;
-import com.yonge.cooleshow.biz.dal.entity.TenantActivationCode;
-import com.yonge.cooleshow.biz.dal.entity.TenantAlbumPurchase;
-import com.yonge.cooleshow.biz.dal.entity.UserTenantAlbumRecord;
+import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
 import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
@@ -17,7 +13,11 @@ import com.yonge.cooleshow.biz.dal.mapper.TenantActivationCodeMapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantAlbumPurchaseMapper;
 import com.yonge.cooleshow.biz.dal.mapper.UserTenantAlbumRecordMapper;
 import com.yonge.cooleshow.biz.dal.service.TenantActivationCodeService;
+import com.yonge.cooleshow.biz.dal.service.TenantAlbumService;
+import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantActivationCodeWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumWrapper;
+import com.yonge.cooleshow.common.enums.EActivationCode;
 import com.yonge.toolset.base.exception.BizException;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
@@ -51,6 +51,9 @@ public class TenantActivationCodeServiceImpl extends ServiceImpl<TenantActivatio
     @Autowired
     private UserTenantAlbumRecordMapper userTenantAlbumRecordMapper;
 
+    @Autowired
+    private TenantAlbumService tenantAlbumService;
+
     /**
      * 查询详情
      *
@@ -138,7 +141,7 @@ public class TenantActivationCodeServiceImpl extends ServiceImpl<TenantActivatio
         for (Long studentId : studentIds) {
             for (TenantActivationCode tenantActivationCode : tenantActivationCodes) {
                 boolean update = this.lambdaUpdate()
-                        .set(TenantActivationCode::getSendStatus, "SEND")
+                        .set(TenantActivationCode::getSendStatus, EActivationCode.SEND.getCode())
                         .set(TenantActivationCode::getActivationPhone, idPhoneMap.get(studentId))
                         .eq(TenantActivationCode::getActivationStatus, false)
                         .eq(TenantActivationCode::getId, tenantActivationCode.getId())
@@ -151,6 +154,7 @@ public class TenantActivationCodeServiceImpl extends ServiceImpl<TenantActivatio
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void active(String activationCode, Long studentId) {
         Student student = studentDao.selectById(studentId);
         if (student == null) {
@@ -184,32 +188,86 @@ public class TenantActivationCodeServiceImpl extends ServiceImpl<TenantActivatio
         if (!update) {
             throw new BizException("激活码已经被使用");
         }
+        Long tenantAlbumPurchaseId = code.getTenantAlbumPurchaseId();
+        TenantAlbumPurchase purchase = tenantAlbumPurchaseMapper.selectById(tenantAlbumPurchaseId);
+        Integer purchaseCycle = purchase.getPurchaseCycle();
+
+
+        addUserTenantAlbumRecord(student.getUserId(), purchase,null);
+
+        // 更新购买记录中激活码使用统计数量值
+        Integer activeCodeNumber = this.lambdaQuery()
+                .eq(TenantActivationCode::getTenantId, tenantId)
+                .eq(TenantActivationCode::getTenantAlbumPurchaseId, code.getTenantAlbumPurchaseId())
+                .eq(TenantActivationCode::getActivationStatus, true).count();
+
+        TenantAlbumPurchase tenantAlbumPurchase = new TenantAlbumPurchase();
+        tenantAlbumPurchase.setId(code.getTenantAlbumPurchaseId());
+        tenantAlbumPurchase.setActiveQuantity(activeCodeNumber);
+        tenantAlbumPurchaseMapper.updateById(tenantAlbumPurchase);
+    }
+
+
+    /**
+     * 添加用户机构专辑激活记录
+     *
+     * @param studentId 学生ID
+     * @param userOrderDetailVo 订单详情
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void addUserTenantAlbumRecord(Long studentId, UserOrderDetailVo userOrderDetailVo) {
+        addUserTenantAlbumRecord(studentId, null, userOrderDetailVo);
+
+    }
+
+    private void addUserTenantAlbumRecord(Long studentId, TenantAlbumPurchase purchase, UserOrderDetailVo userOrderDetailVo) {
+
+
+        UserTenantAlbumRecord userTenantAlbumRecord = new UserTenantAlbumRecord();
+        if (userOrderDetailVo != null) {
+
+            TenantAlbumWrapper.TenantAlbumContent tenantAlbumContent = JSON
+                    .parseObject(userOrderDetailVo.getBizContent(), TenantAlbumWrapper.TenantAlbumContent.class);
+
+            userTenantAlbumRecord.setTenantId(tenantAlbumContent.getTenantId());
+            userTenantAlbumRecord.setUserId(studentId);
+            userTenantAlbumRecord.setTenantAlbumId(tenantAlbumContent.getTenantAlbumId());
+            userTenantAlbumRecord.setOrderNo(userOrderDetailVo.getOrderNo());
+            userTenantAlbumRecord.setSourceType(SourceTypeEnum.ORDER);
+            userTenantAlbumRecord.setClientType(ClientEnum.STUDENT);
+            userTenantAlbumRecord.setSubOrderNo(userOrderDetailVo.getSubOrderNo());
+            userTenantAlbumRecord.setCreateBy(studentId);
+            userTenantAlbumRecord.setTimes(tenantAlbumContent.getBuyCycle());
+        } else if (purchase != null) {
+
+            userTenantAlbumRecord.setTenantId(purchase.getTenantId());
+            userTenantAlbumRecord.setUserId(studentId);
+            userTenantAlbumRecord.setTenantAlbumId(purchase.getTenantAlbumId());
+            userTenantAlbumRecord.setOrderNo(purchase.getId().toString());
+            userTenantAlbumRecord.setSourceType(SourceTypeEnum.TENANT);
+            userTenantAlbumRecord.setClientType(ClientEnum.STUDENT);
+            userTenantAlbumRecord.setSubOrderNo(purchase.getId().toString());
+            userTenantAlbumRecord.setCreateBy(studentId);
+            userTenantAlbumRecord.setTimes(purchase.getPurchaseCycle());
+        }
+
+
 
         QueryWrapper<UserTenantAlbumRecord> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda()
-                .eq(UserTenantAlbumRecord::getTenantId, student.getTenantId())
-                .eq(UserTenantAlbumRecord::getUserId, student.getUserId())
-                .eq(UserTenantAlbumRecord::getTenantAlbumId, code.getTenantAlbumId())
+                .eq(UserTenantAlbumRecord::getTenantId, userTenantAlbumRecord.getTenantId())
+                .eq(UserTenantAlbumRecord::getUserId, studentId)
+                .eq(UserTenantAlbumRecord::getTenantAlbumId, userTenantAlbumRecord.getTenantAlbumId())
                 .eq(UserTenantAlbumRecord::getClientType, ClientEnum.STUDENT)
                 .orderByDesc(UserTenantAlbumRecord::getEndTime);
         List<UserTenantAlbumRecord> userTenantAlbumRecords = userTenantAlbumRecordMapper.selectList(queryWrapper);
 
-        UserTenantAlbumRecord userTenantAlbumRecord = new UserTenantAlbumRecord();
-        userTenantAlbumRecord.setTenantId(student.getTenantId());
-        userTenantAlbumRecord.setUserId(student.getUserId());
-        userTenantAlbumRecord.setTenantAlbumId(code.getTenantAlbumId());
-        userTenantAlbumRecord.setOrderNo("");
-        userTenantAlbumRecord.setSourceType(SourceTypeEnum.TENANT);
-        userTenantAlbumRecord.setClientType(ClientEnum.STUDENT);
-        userTenantAlbumRecord.setSubOrderNo("");
-        userTenantAlbumRecord.setCreateBy(student.getUserId());
+        userTenantAlbumRecord.setUserId(studentId);
+        userTenantAlbumRecord.setCreateBy(studentId);
 
-        Long tenantAlbumPurchaseId = code.getTenantAlbumPurchaseId();
-        TenantAlbumPurchase purchase = tenantAlbumPurchaseMapper.selectById(tenantAlbumPurchaseId);
-        Integer purchaseCycle = purchase.getPurchaseCycle();
 
         userTenantAlbumRecord.setType("MONTH");
-        userTenantAlbumRecord.setTimes(purchaseCycle);
 
         Calendar instance = Calendar.getInstance();
         if (userTenantAlbumRecords.isEmpty()) {
@@ -226,19 +284,8 @@ public class TenantActivationCodeServiceImpl extends ServiceImpl<TenantActivatio
             }
         }
         userTenantAlbumRecord.setStartTime(instance.getTime());
-        instance.add(Calendar.MONTH, purchaseCycle);
+        instance.add(Calendar.MONTH, userTenantAlbumRecord.getTimes());
         userTenantAlbumRecord.setEndTime(instance.getTime());
         userTenantAlbumRecordMapper.insert(userTenantAlbumRecord);
-
-        // 更新购买记录中激活码使用统计数量值
-        Integer activeCodeNumber = this.lambdaQuery()
-                .eq(TenantActivationCode::getTenantId, tenantId)
-                .eq(TenantActivationCode::getTenantAlbumPurchaseId, code.getTenantAlbumPurchaseId())
-                .eq(TenantActivationCode::getActivationStatus, true).count();
-
-        TenantAlbumPurchase tenantAlbumPurchase = new TenantAlbumPurchase();
-        tenantAlbumPurchase.setId(code.getTenantAlbumPurchaseId());
-        tenantAlbumPurchase.setActiveQuantity(activeCodeNumber);
-        tenantAlbumPurchaseMapper.updateById(tenantAlbumPurchase);
     }
 }

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

@@ -1,13 +1,20 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import cn.hutool.core.lang.Snowflake;
+import cn.hutool.core.lang.UUID;
+import cn.hutool.core.lang.generator.SnowflakeGenerator;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.biz.dal.entity.*;
+import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
+import com.yonge.cooleshow.common.enums.EActivationCode;
 import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.base.util.StringUtil;
 import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -18,6 +25,7 @@ import com.yonge.cooleshow.biz.dal.mapper.TenantAlbumMapper;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -44,6 +52,12 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
     @Autowired
     private UserOrderService userOrderService;
 
+    @Autowired
+    private TenantActivationCodeService tenantActivationCodeService;
+
+    @Autowired
+    private TenantAlbumPurchaseService tenantAlbumPurchaseService;
+
     /**
      * 查询详情
      * @param id 详情ID
@@ -102,9 +116,10 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
             throw new BizException("订单商品信息为空");
         }
 
-        TenantAlbumWrapper.TenantAlbumBuy tenantAlbumBuy = JSON
-                .parseObject(JSON.toJSONString(orderGoodsInfo.getBizContent()), TenantAlbumWrapper.TenantAlbumBuy.class);
-        if (tenantAlbumBuy == null) {
+
+        TenantAlbumWrapper.TenantAlbumContent tenantAlbumContent = JSON
+                .parseObject(orderGoodsInfo.getBizContent(), TenantAlbumWrapper.TenantAlbumContent.class);
+        if (tenantAlbumContent == null) {
             log.error("订单创建前检测,订单商品信息为空");
             throw new BizException("订单商品信息为空");
         }
@@ -116,6 +131,7 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
             log.error("订单创建前检测,专辑不存在,bizId={}", orderGoodsInfo.getBizId());
             throw new BizException("订单商品信息为空");
         }
+        tenantAlbumContent.setBuyCycle(tenantAlbum.getPurchaseCycle());
 
         // 查询专辑所在机构
         List<TenantAlbumRef> refList =
@@ -148,8 +164,10 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
                 }
                 price = tenantAlbum.getSalePrice();
                 userOrderDetail.setMerchId(tenantInfo.getId());
-                tenantAlbumBuy.setBuyCycle(1);
-                tenantAlbumBuy.setBuyNumber(1);
+                tenantAlbumContent.setBuyMultiple(1);
+                tenantAlbumContent.setBuyNumber(1);
+                tenantAlbumContent.setBuyCycle(tenantAlbumContent.getBuyCycle());
+                tenantAlbumContent.setTenantId(tenantInfo.getId());
                 break;
             }
 
@@ -166,6 +184,8 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
                 }
                 price = tenantAlbum.getOriginalPrice();
                 userOrderDetail.setMerchId(0L);
+                tenantAlbumContent.setTenantId(tenantStaff.getTenantId());
+                tenantAlbumContent.setBuyCycle(tenantAlbumContent.getBuyCycle()*tenantAlbumContent.getBuyMultiple());
                 break;
             }
         }
@@ -174,9 +194,10 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
 
         userOrderDetail.setGoodUrl(userOrderService.getGoodUrlByType(orderGoodsInfo.getGoodType()));
         userOrderDetail.setBizId(tenantAlbum.getId());
+        userOrderDetail.setBizContent(JSON.toJSONString(tenantAlbumContent));
         userOrderDetail.setGoodNum(orderGoodsInfo.getGoodNum());
         userOrderDetail.setOriginalPrice(price.multiply(new BigDecimal(orderGoodsInfo.getGoodNum()))
-                .multiply(new BigDecimal(tenantAlbumBuy.getBuyCycle())));
+                .multiply(new BigDecimal(tenantAlbumContent.getBuyCycle())));
         userOrderDetail.setCouponAmount(BigDecimal.ZERO);
         userOrderDetail.setExpectPrice(userOrderDetail.getOriginalPrice());
         userOrderDetail.setActualPrice(userOrderDetail.getExpectPrice().subtract(userOrderDetail.getCouponAmount()));
@@ -195,9 +216,45 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
     public void orderSuccess(UserOrderDetailVo userOrderDetailVo) {
 
         // 学生 插入机构专辑购买数据
+        // 学生购买机构专辑
+        switch (userOrderDetailVo.getOrderClient()) {
+            case STUDENT: {
+                tenantActivationCodeService.addUserTenantAlbumRecord(userOrderDetailVo.getUserId(),userOrderDetailVo);
 
+                break;
+            }
 
-        // 机构   插入机构专辑购买记录,生成机构专辑激活码
+            case TENANT: {
+                // 机构   插入机构专辑购买记录,生成机构专辑激活码
+
+                TenantAlbumWrapper.TenantAlbumContent tenantAlbumContent = JSON
+                        .parseObject(userOrderDetailVo.getBizContent(), TenantAlbumWrapper.TenantAlbumContent.class);
+                TenantAlbumPurchase tenantAlbumPurchase = new TenantAlbumPurchase();
+                tenantAlbumPurchase.setTenantId(tenantAlbumContent.getTenantId());
+                tenantAlbumPurchase.setTenantAlbumId(userOrderDetailVo.getBizId());
+                tenantAlbumPurchase.setPurchaseTime(userOrderDetailVo.getCreateTime());
+                tenantAlbumPurchase.setPurchaseQuantity(userOrderDetailVo.getGoodNum());
+                tenantAlbumPurchase.setPurchaseCycle(tenantAlbumContent.getBuyCycle());
+                tenantAlbumPurchase.setActiveQuantity(0);
+                tenantAlbumPurchase.setPurchasePrice(userOrderDetailVo.getActualPrice());
+                tenantAlbumPurchase.setPurchaseStatus(OrderStatusEnum.PAID.getCode());
+                tenantAlbumPurchaseService.save(tenantAlbumPurchase);
+
+                List<TenantActivationCode> tenantActivationCodes = new ArrayList<>();
+                for (int i = 0; i < userOrderDetailVo.getGoodNum(); i++) {
+                    TenantActivationCode tenantActivationCode = new TenantActivationCode();
+                    tenantActivationCode.setTenantId(tenantAlbumContent.getTenantId());
+                    tenantActivationCode.setTenantAlbumId(tenantAlbumContent.getTenantAlbumId());
+                    tenantActivationCode.setTenantAlbumPurchaseId(tenantAlbumPurchase.getId());
+//                    tenantActivationCode.setActivationCode(StringUtil.DeciamlToThirtySix(IdWorker.get32UUID()));
+                    tenantActivationCode.setActivationCode(IdWorker.get32UUID());
+                    tenantActivationCode.setSendStatus(EActivationCode.WAIT);
+                    tenantActivationCodes.add(tenantActivationCode);
+                }
+                tenantActivationCodeService.saveBatch(tenantActivationCodes);
+                break;
+            }
+        }
 
     }
 }

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

@@ -4,8 +4,16 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 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.biz.dal.entity.*;
-import com.yonge.cooleshow.biz.dal.mapper.*;
+import com.yonge.cooleshow.biz.dal.entity.SysArea;
+import com.yonge.cooleshow.biz.dal.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.entity.TenantEntryRecord;
+import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
+import com.yonge.cooleshow.biz.dal.entity.TenantStaff;
+import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
+import com.yonge.cooleshow.biz.dal.mapper.TenantApplyRecordMapper;
+import com.yonge.cooleshow.biz.dal.mapper.TenantEntryRecordMapper;
+import com.yonge.cooleshow.biz.dal.mapper.TenantInfoMapper;
+import com.yonge.cooleshow.biz.dal.mapper.TenantStaffMapper;
 import com.yonge.cooleshow.biz.dal.service.SysAreaService;
 import com.yonge.cooleshow.biz.dal.service.SysConfigService;
 import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
@@ -18,7 +26,6 @@ import com.yonge.toolset.base.exception.BizException;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
-import org.checkerframework.checker.units.qual.A;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Service;

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

@@ -1097,6 +1097,11 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
                 .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
     }
 
+    @Override
+    public UserOrder getByOrderNo(String orderNo) {
+        return this.lambdaQuery().eq(UserOrder::getOrderNo, orderNo).last("limit 1").one();
+    }
+
     /**
      * 获取平台服务费率
      *

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

@@ -416,7 +416,7 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
     public UserPaymentOrderWrapper.PaymentConfig executeOrder(UserPaymentOrderWrapper.UserPaymentOrder orderReq) {
 
         // 填充订单基本信息
-        orderReq.id(IdWorker.getId())
+        orderReq
             .orderNo(IdWorker.getIdStr())
             .paymentVender(Optional.ofNullable(orderReq.getPaymentType()).orElse(paymentServiceContext.getPaymentService().venderName()))
             .paymentChannel("")
@@ -553,9 +553,9 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
         redisCacheService.saveUserOrderConfig(String.valueOf(orderReq.getUserId()), orderReq.getOrderType().getCode(), reqConfig.jsonString());
 
         // 若订单无需支付,直接完成订单,VIP购买
-        /*if (BigDecimal.ZERO.compareTo(orderReq.getPaymentCashAmount()) == 0 && EPaymentType.VIP == orderReq.getOrderType()) {
+        if (BigDecimal.ZERO.compareTo(orderReq.getPaymentCashAmount()) == 0) {
             executePaymentSuccess(orderReq, null);
-        }*/
+        }
 
         return UserPaymentOrderWrapper.PaymentConfig.builder()
             .orderNo(orderReq.getOrderNo())
@@ -938,6 +938,4 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
         //log.info("scheduleUpdatePaymentOrderStatus PAYMENT_FINISH ------> ");
     }
 
-
-
 }

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

@@ -10,6 +10,7 @@ import com.yonge.cooleshow.biz.dal.service.UserOrderService;
 import com.yonge.cooleshow.biz.dal.service.UserPaymentOrderService;
 import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
 import com.yonge.cooleshow.common.enums.EPaymentVersion;
+import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
@@ -62,6 +63,10 @@ public class UserPaymentOrderServiceImpl  implements UserPaymentOrderService {
             return null;
         }
 
+        if (one.getPaymentVersion().equals(EPaymentVersion.V1)) {
+            throw new BizException("支付方式不支持");
+        }
+
         // 查询订单支付信息
         UserOrderPayment newestPayment = userOrderPaymentService.getNewestPayment(transNo, merOrderNo);
 
@@ -119,6 +124,10 @@ public class UserPaymentOrderServiceImpl  implements UserPaymentOrderService {
         if (userOrder == null) {
             return null;
         }
+
+        if (userOrder.getPaymentVersion().equals(EPaymentVersion.V1)) {
+            throw new BizException("支付方式不支持");
+        }
         // 查询订单支付信息
         UserOrderPayment newestPayment = userOrderPaymentService.getNewestPayment(null, merOrderNo);
 
@@ -157,7 +166,11 @@ public class UserPaymentOrderServiceImpl  implements UserPaymentOrderService {
 
         // 更新订单支付信息
 
-        userOrder = userOrderService.getById(userOrder.getId());
+        UserOrder order1 = userOrderService.getById(userOrder.getId());
+
+        if (order1.getPaymentVersion().equals(EPaymentVersion.V1)) {
+            throw new BizException("支付方式不支持");
+        }
 
         UserOrderPayment newestPayment = userOrderPaymentService.getNewestPayment(order.getTransNo(), userOrder.getOrderNo());
         if (newestPayment == null) {
@@ -206,6 +219,7 @@ public class UserPaymentOrderServiceImpl  implements UserPaymentOrderService {
         userOrder.setPaymentVersion(EPaymentVersion.V2);
 
         userOrderService.save(userOrder);
+        orderReq.setId(userOrder.getId());
     }
 
 }

+ 17 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/StudentWrapper.java

@@ -11,6 +11,7 @@ import lombok.NoArgsConstructor;
 import org.apache.commons.lang3.StringUtils;
 
 import java.io.Serializable;
+import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.List;
@@ -141,7 +142,7 @@ public class StudentWrapper {
         @ExcelProperty(value = "学生姓名")
         private String userName;
 
-        @ExcelProperty(value = "手机号")
+        @ExcelProperty(value = "手机号")
         private String phone;
 
         @ExcelProperty(value = "声部")
@@ -153,6 +154,11 @@ public class StudentWrapper {
         @ExcelProperty(value = "性别")
         private String gender;
 
+        private static final String PHONE_REG = "^(13\\d|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18\\d|19[0-35-9])" +
+                "\\d{8}$";
+
+        private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd");
+
         public List<String> checkValid() {
             ArrayList<String> errMsg = new ArrayList<>();
             if (StringUtils.isEmpty(userName)) {
@@ -160,8 +166,7 @@ public class StudentWrapper {
             }
             if (StringUtils.isEmpty(phone)) {
                 errMsg.add("手机号为空");
-            }
-            if (Pattern.matches("^1[3-9]\\d{9}$", phone)) {
+            } else if (!Pattern.matches(PHONE_REG, phone)) {
                 errMsg.add("手机号格式错误");
             }
             if (StringUtils.isEmpty(subjectId)) {
@@ -169,6 +174,15 @@ public class StudentWrapper {
             }
             if (StringUtils.isEmpty(birthday)) {
                 errMsg.add("出生日期为空");
+            } else {
+                if (birthday.contains("/")) {
+                    birthday = birthday.replaceAll("/", "-");
+                }
+                try {
+                    SDF.parse(birthday);
+                } catch (Exception e) {
+                    errMsg.add("出生日期格式错误");
+                }
             }
             if (StringUtils.isEmpty(gender)) {
                 errMsg.add("性别为空");

+ 23 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantAlbumWrapper.java

@@ -92,4 +92,27 @@ public class TenantAlbumWrapper {
 
     }
 
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" TenantAlbumContent-机构专辑采购信息")
+    public static class TenantAlbumContent {
+
+        @ApiModelProperty("专辑ID")
+        private Long tenantAlbumId;
+
+        @ApiModelProperty("采购数量")
+        private Integer buyNumber;
+
+        @ApiModelProperty("采购倍数")
+        private Integer buyMultiple;
+
+        @ApiModelProperty(value = "采购周期",hidden = true)
+        private Integer buyCycle;
+
+        @ApiModelProperty(value = "采购机构",hidden = true)
+        private Long tenantId;
+
+    }
 }

+ 6 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/UserPaymentOrderWrapper.java

@@ -317,8 +317,8 @@ public class UserPaymentOrderWrapper {
                     .orderClient(getPaymentClient())
                     .userId(getUserId())
                     .orderNo(getOrderNo())
-                    .orderType(OrderTypeEnum.valueOf(getOrderType().name()))
-                    .status(OrderStatusEnum.parse(getStatus()))
+                    .orderType(getOrderType() !=null?OrderTypeEnum.valueOf(getOrderType().name()):null)
+                    .status(getStatus() !=null? OrderStatusEnum.parse(getStatus()):null)
                     .originalPrice(getOriginalPrice())
                     .expectPrice(getCurrentPrice())
                     .actualPrice(getPaymentCashAmount())
@@ -566,6 +566,9 @@ public class UserPaymentOrderWrapper {
         @ApiModelProperty("支付用户Id")
         private String userId;
 
+        @ApiModelProperty("支付用户类型")
+        private ClientEnum userType;
+
         public String jsonString() {
             return JSON.toJSONString(this);
         }
@@ -831,7 +834,7 @@ public class UserPaymentOrderWrapper {
         private Long userId;
 
 
-        @ApiModelProperty("用户身份")
+        @ApiModelProperty(value = "用户身份",hidden = true)
         private ClientEnum paymentClient;
 
         @ApiModelProperty(value = "生成的订单详情信息",hidden = true)

+ 4 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/teacher/TeacherWrapper.java

@@ -10,6 +10,8 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * Created by Eric.Shang on 2022/10/8.
@@ -88,8 +90,8 @@ public class TeacherWrapper {
     @ApiModel("老师设置结算方式模型")
     public static class TeacherSetSettlement {
 
-        @ApiModelProperty("老师ID")
-        private Long userId;
+        @ApiModelProperty("老师ID,批量用数组方式")
+        private List<Long> teacherIdList = new ArrayList<>();
 
         @ApiModelProperty("结算方式")
         private ESettlementFrom settlementFrom;

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

@@ -159,6 +159,12 @@
             <if test="param.tenantName != null and param.tenantName.trim() != ''">
                 and ti.name_ like concat('%',#{param.tenantName},'%')
             </if>
+            <if test="param.phoneList != null and param.phoneList.size() > 0">
+                and u.phone_ in
+                <foreach collection="param.phoneList" separator="," item="item"  open="(" close=")" >
+                    #{item}
+                </foreach>
+            </if>
         </where>
         <choose>
             <when test="param.orderBy != null and param.orderBy.trim() != ''">

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

@@ -101,6 +101,7 @@
             u.real_name_ as realName,
             u.avatar_ as avatar,
             u.birthdate_ as birthdate,
+            u.gender_ as gender,
             (case when t.membership_end_time_ &gt;= now() then 1 else 0 end) isVip,
 <!--            t.tag_ tag,-->
             u.del_flag_ as delFlag,

+ 72 - 0
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java

@@ -1,6 +1,9 @@
 package com.yonge.cooleshow.student.controller;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.microsvc.toolkit.common.response.template.R;
+import com.microsvc.toolkit.config.jwt.utils.JwtUserInfo;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderPayReq;
@@ -8,9 +11,13 @@ import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
 import com.yonge.cooleshow.biz.dal.entity.UserOrder;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.service.UserPaymentCoreService;
+import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.UserOrderService;
+import com.yonge.cooleshow.common.enums.EPaymentVersion;
+import com.yonge.cooleshow.student.vo.UserPaymentOrderVo;
 import com.yonge.toolset.payment.util.DistributedLock;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
@@ -29,6 +36,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import springfox.documentation.annotations.ApiIgnore;
 
@@ -39,6 +47,7 @@ import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.temporal.TemporalAdjusters;
 import java.util.Date;
+import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -57,6 +66,9 @@ public class UserOrderController extends BaseController {
     @Autowired
     private RedissonClient redissonClient;
 
+    @Autowired
+    private UserPaymentCoreService userPaymentCoreService;
+
     @ApiOperation(value = "下单接口")
     @PostMapping("/executeOrder")
     public HttpResponseResult<UserOrder> executeOrder(@Valid @RequestBody OrderReq orderReq) {
@@ -114,6 +126,55 @@ public class UserOrderController extends BaseController {
         }
     }
 
+
+
+    @ApiOperation(value = "用户下单", notes = "用户下单")
+    @PostMapping("/executeOrder/v2")
+    public R<UserPaymentOrderWrapper.PaymentConfig> executeOrder(@Validated @RequestBody UserPaymentOrderVo.OrderReq orderReq) {
+
+        // 设置下单用户信息
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (Objects.isNull(sysUser)) {
+            throw com.microsvc.toolkit.common.webportal.exception.BizException.from("用户信息不存在");
+        }
+        orderReq.setUserId(sysUser.getId());
+        orderReq.setPaymentClient(ClientEnum.STUDENT.name());
+
+
+        // 用户下单请求
+        UserPaymentOrderWrapper.UserPaymentOrder order = JSON.parseObject(orderReq.jsonString(), UserPaymentOrderWrapper.UserPaymentOrder.class);
+        // 新增数据
+        UserPaymentOrderWrapper.PaymentConfig paymentConfig = userPaymentCoreService.executeOrderCreate(order);
+        if (Objects.isNull(paymentConfig)) {
+            throw com.microsvc.toolkit.common.webportal.exception.BizException.from("下单失败");
+        }
+
+        return R.from(paymentConfig);
+    }
+
+    @ApiOperation(value = "用户付款", notes = "用户付款")
+    @PostMapping("/orderPay/v2")
+    public R<UserPaymentOrderWrapper.PaymentReq> executePayment(@Validated @RequestBody UserPaymentOrderVo.PaymentReqConfig config) {
+        // 设置下单用户信息
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (Objects.isNull(sysUser)) {
+            throw com.microsvc.toolkit.common.webportal.exception.BizException.from("用户信息不存在");
+        }
+
+
+        // 用户下单请求
+        UserPaymentOrderWrapper.PaymentOrderReqConfig reqConfig = UserPaymentOrderWrapper.PaymentOrderReqConfig.from(config.jsonString());
+
+        // 创建用户支付数据
+        UserPaymentOrderWrapper.PaymentReq paymentConfig = userPaymentCoreService.executePayment(JwtUserInfo.builder()
+                .userId(sysUser.getId().toString()).clientType(ClientEnum.STUDENT.getCode()).build(), reqConfig);
+        if (Objects.isNull(paymentConfig)) {
+            throw com.microsvc.toolkit.common.webportal.exception.BizException.from("付款失败");
+        }
+
+        return R.from(paymentConfig);
+    }
+
     @ApiOperation(value = "通过业务id查询用户正在交易中的订单")
     @PostMapping("/getPendingOrder")
     @ApiImplicitParams({
@@ -157,6 +218,17 @@ public class UserOrderController extends BaseController {
         }
         payReq.setUserId(user.getId());
 
+        UserOrder order = userOrderService.getByOrderNo(payReq.getOrderNo());
+        if (null == order) {
+            return failed("订单不存在");
+        }
+        if(order.getPaymentVersion().equals(EPaymentVersion.V2)){
+
+
+            // 用户取消支付
+            userPaymentCoreService.cancelPayment(JwtUserInfo.builder().userId(user.getId().toString()).clientType(ClientEnum.STUDENT.getCode()).build(), payReq.getOrderNo());
+        }
+
         try {
             HttpResponseResult<Boolean> res = DistributedLock.of(redissonClient)
                     .runIfLockToFunction(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(payReq.getOrderNo())

+ 232 - 0
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/vo/UserPaymentOrderVo.java

@@ -0,0 +1,232 @@
+package com.yonge.cooleshow.student.vo;
+
+import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
+import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 平台订单表
+ * 2022-12-20 19:09:34
+ */
+@ApiModel(value = "UserPaymentOrderVo对象", description = "平台订单表查询视图对象")
+public class UserPaymentOrderVo {
+
+    @Data
+    @ApiModel(" UserPaymentOrder-平台订单表")
+    public static class UserPaymentOrder {
+
+
+		@ApiModelProperty("主键")
+        private Long id;
+
+		@ApiModelProperty("支付厂商")
+        private String paymentVender;
+
+		@ApiModelProperty("支付渠道")
+        private String paymentChannel;
+
+		@ApiModelProperty("用户身份")
+        private String paymentClient;
+
+		@ApiModelProperty("用户编号")
+        private Long userId;
+
+		@ApiModelProperty("商户订单号")
+        private String orderNo;
+
+		@ApiModelProperty("交易流水号")
+        private String transNo;
+
+		@ApiModelProperty("业务类型Id")
+        private String bizId;
+
+		@ApiModelProperty("订单支付类型")
+        private String orderType;
+
+		@ApiModelProperty("订单状态")
+        private String status;
+
+		@ApiModelProperty("原价")
+        private BigDecimal originalPrice;
+
+		@ApiModelProperty("现价")
+        private BigDecimal currentPrice;
+
+		@ApiModelProperty("支付现金金额")
+        private BigDecimal paymentCashAmount;
+
+		@ApiModelProperty("支付优惠金额")
+        private BigDecimal paymentCouponAmount;
+
+		@ApiModelProperty("支付通道费用")
+        private BigDecimal paymentChannelFee;
+
+		@ApiModelProperty("订单名称")
+        private String orderName;
+
+		@ApiModelProperty("订单描述信息")
+        private String orderDesc;
+
+		@ApiModelProperty("用户备注")
+        private String userNote;
+
+		@ApiModelProperty("支付时间")
+        private Date payTime;
+
+		@ApiModelProperty("原因")
+        private String errorMsg;
+
+		@ApiModelProperty("收货地址")
+        private Long receiveAddress;
+
+		@ApiModelProperty("更新时间")
+        private Date updateTime;
+
+		@ApiModelProperty("下单时间")
+        private Date createTime;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static UserPaymentOrder from(String json) {
+            return JSON.parseObject(json, UserPaymentOrder.class);
+        }
+
+
+        public UserPaymentOrder userId(String userId) {
+            this.userId = Long.parseLong(userId);
+            return this;
+        }
+
+        public UserPaymentOrder paymentClient(String paymentClient) {
+            this.paymentClient = String.valueOf(paymentClient);
+            return this;
+        }
+    }
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel("下单请求对象")
+    public static class OrderReq implements Serializable {
+
+        @ApiModelProperty("支付类型: adapay")
+        private String paymentType;
+
+        @ApiModelProperty("业务类型Id")
+        private String bizId;
+
+        @NotNull(message = "订单类型不能为空")
+        @ApiModelProperty(value = "订单类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ACTI_REGIST、活动报名 ) 老师端(VIP、开通会员 PIANO_ROOM、琴房时长 ACTI_REGIST 活动报名)", required = true)
+        private OrderTypeEnum orderType;
+
+        @ApiModelProperty("现价")
+        private BigDecimal currentPrice;
+
+        @ApiModelProperty("支付现金金额")
+        private BigDecimal paymentCashAmount;
+
+        @ApiModelProperty("支付优惠金额")
+        private BigDecimal paymentCouponAmount;
+
+        @ApiModelProperty("订单名称")
+        private String orderName;
+
+        @ApiModelProperty("订单描述信息")
+        private String orderDesc;
+
+        @ApiModelProperty("用户备注")
+        private String userNote;
+
+        @ApiModelProperty("优惠券Id;多个使用,隔开")
+        private String couponIds;
+
+        @ApiModelProperty("订单商品信息")
+        private List<UserPaymentOrderWrapper.OrderGoodsInfo> goodsInfos;
+
+        @ApiModelProperty(value = "用户身份", hidden = true)
+        private String paymentClient;
+
+        @ApiModelProperty(value = "用户编号", hidden = true)
+        private Long userId;
+
+        @ApiModelProperty(value = "推荐用户id(有推荐人的情况)")
+        private Long recomUserId;
+
+        @ApiModelProperty(value = "活动id")
+        private Long activityId;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public OrderReq paymentClient(String paymentClient) {
+            this.paymentClient = String.valueOf(paymentClient);
+            return this;
+        }
+
+        public OrderReq userId(String userId) {
+            this.userId = Long.parseLong(userId);
+            return this;
+        }
+    }
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel("订单支付参数配置")
+    public static class PaymentReqConfig implements Serializable {
+
+        @ApiModelProperty("支付渠道")
+        private String paymentChannel;
+
+        @ApiModelProperty("商户订单号")
+        private String merOrderNo;
+
+        @ApiModelProperty("商品名称")
+        private String subject;
+
+        @ApiModelProperty("商品描述")
+        private String body;
+
+        @ApiModelProperty("附加信息")
+        private String addition;
+
+        @ApiModelProperty("价格")
+        private BigDecimal price;
+
+        @ApiModelProperty("银行卡类型")
+        private String bankType;
+
+        @ApiModelProperty("微信授权code")
+        private String code;
+
+        @ApiModelProperty("订单过期时间")
+        private Date expirationTime;
+
+        @ApiModelProperty("微信支付公众号")
+        private String wxAppId;
+
+        @ApiModelProperty(value = "支付用户Id", hidden = true)
+        private String userId;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+    }
+}

+ 7 - 0
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/ImGroupController.java

@@ -50,6 +50,13 @@ public class ImGroupController extends BaseController {
         return succeed();
     }
 
+    @ApiOperation("添加群成员")
+    @PostMapping(value = "/addGroupMember")
+    public HttpResponseResult addGroupMember(@Valid @RequestBody ImGroup imGroup, BindingResult bindingResult) throws Exception {
+        imGroupService.addGroupMember(imGroup.getId(), imGroup.getStudentIdList());
+        return succeed();
+    }
+
     @ApiOperation("解散群聊")
     @PostMapping(value = "/dismiss/{groupId}")
     public HttpResponseResult dismiss(@ApiParam(value = "群编号", required = true) @PathVariable("groupId") String groupId) throws Exception {

+ 22 - 20
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherController.java

@@ -1,43 +1,45 @@
 package com.yonge.cooleshow.teacher.controller;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.dto.RealnameAuthReq;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dto.TeacherDto;
+import com.yonge.cooleshow.biz.dal.entity.Subject;
 import com.yonge.cooleshow.biz.dal.entity.Teacher;
 import com.yonge.cooleshow.biz.dal.entity.TenantUnbindRecord;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.service.SmsCodeService;
 import com.yonge.cooleshow.biz.dal.service.SysUserService;
-import com.yonge.cooleshow.biz.dal.service.TenantUnbindRecordService;
-import com.yonge.cooleshow.biz.dal.wrapper.StudentWrapper;
-import com.yonge.cooleshow.biz.dal.wrapper.teacher.TeacherWrapper;
-import com.yonge.toolset.utils.idcard.IdcardInfoExtractor;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
-
-import java.util.List;
-
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpStatus;
-import org.springframework.web.bind.annotation.*;
-
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
-import com.yonge.cooleshow.auth.api.entity.SysUser;
-import com.yonge.cooleshow.biz.dal.dto.TeacherDto;
-import com.yonge.cooleshow.biz.dal.entity.Subject;
 import com.yonge.cooleshow.biz.dal.service.TeacherService;
+import com.yonge.cooleshow.biz.dal.service.TenantUnbindRecordService;
 import com.yonge.cooleshow.biz.dal.vo.MyFens;
 import com.yonge.cooleshow.biz.dal.vo.TeacherHomeVo;
 import com.yonge.cooleshow.biz.dal.vo.TeacherVo;
+import com.yonge.cooleshow.biz.dal.wrapper.teacher.TeacherWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.base.page.QueryInfo;
 import com.yonge.toolset.base.util.StringUtil;
 import com.yonge.toolset.mybatis.support.PageUtil;
+import com.yonge.toolset.utils.idcard.IdcardInfoExtractor;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
+import java.util.List;
 
 @RestController
 @RequestMapping("/teacher")

+ 3 - 2
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/StudentController.java

@@ -16,6 +16,7 @@ import com.yonge.cooleshow.common.enums.BizHttpStatus;
 import com.yonge.cooleshow.common.enums.UserLockFlag;
 import com.yonge.cooleshow.common.enums.UserStatusEnum;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.toolset.utils.easyexcel.ErrMsg;
@@ -112,7 +113,7 @@ public class StudentController extends BaseController {
         try {
             ExcelDataReader<StudentWrapper.StudentExport> reader =
                     ExcelUtils.getReader(StudentWrapper.StudentExport.class, file);
-            studentService.importStudentExcel(reader.getDataList(), user.getId());
+            studentService.importStudentExcel(reader.getDataList(),user.getTenantId(), user.getId());
             return HttpResponseResult.succeed();
         } catch (ExcelException e) {
             return HttpResponseResult.failed(BizHttpStatus.IMPORT.getCode(), e.getErrMsgList(), BizHttpStatus.IMPORT.getMsg());
@@ -124,7 +125,7 @@ public class StudentController extends BaseController {
         TenantInfo tenantInfo = tenantInfoService.lambdaQuery().eq(TenantInfo::getUserId, sysUser.getId())
                 .last("limit 1").one();
         if (tenantInfo == null) {
-            throw new com.microsvc.toolkit.common.webportal.exception.BizException("非法请求");
+            throw new BizException("非法请求");
         }
         return tenantInfo;
     }

+ 11 - 13
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TeacherController.java

@@ -33,6 +33,7 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
 import javax.validation.Valid;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -45,7 +46,7 @@ public class TeacherController extends BaseController {
     @Autowired
     private TeacherService teacherService;
 
-    @Autowired
+    @Resource
     private SysUserFeignService sysUserFeignService;
 
     @Autowired
@@ -119,30 +120,27 @@ public class TeacherController extends BaseController {
             if (teacher == null) {
                 throw new BizException("老师不存在");
             }
+        } else {
+            // 新增 默认机构为操作人的机构
+            teacherSubmitReq.setTenantId(tenantInfo.getId());
         }
-        teacherSubmitReq.setTenantId(tenantInfo.getId());
         return teacherService.submit(teacherSubmitReq);
     }
 
     @PostMapping("/setSettlement")
     @ApiOperation(value = "设置结算方式")
     public HttpResponseResult<Boolean> setSettlement(@Valid @RequestBody TeacherWrapper.TeacherSetSettlement setSettlement) {
-        TenantInfo tenantInfo = getTenantInfo();
-        teacherService.lambdaUpdate()
-                .set(Teacher::getSettlementFrom, setSettlement.getSettlementFrom())
-                .eq(Teacher::getTenantId, tenantInfo.getId())
-                .eq(Teacher::getUserId, setSettlement.getUserId()).update();
-        return succeed();
-    }
 
-    @PostMapping("/batchSetSettlement")
-    @ApiOperation(value = "批量设置结算方式")
-    public HttpResponseResult<Boolean> batchSetSettlement(@Valid @RequestBody TeacherWrapper.TeacherSetSettlement setSettlement) {
+        List<Long> teacherIdList = setSettlement.getTeacherIdList();
+        if (teacherIdList.isEmpty()) {
+            throw new BizException("未选择老师");
+        }
+
         TenantInfo tenantInfo = getTenantInfo();
         teacherService.lambdaUpdate()
                 .set(Teacher::getSettlementFrom, setSettlement.getSettlementFrom())
                 .eq(Teacher::getTenantId, tenantInfo.getId())
-                .update();
+                .in(Teacher::getUserId, setSettlement.getTeacherIdList()).update();
         return succeed();
     }
 

+ 3 - 1
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TenantActivationCodeController.java

@@ -31,6 +31,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
+
 
 @Slf4j
 @Validated
@@ -45,7 +47,7 @@ public class TenantActivationCodeController extends BaseController {
     @Autowired
     private TenantAlbumPurchaseService tenantAlbumPurchaseService;
 
-    @Autowired
+    @Resource
     private SysUserFeignService sysUserFeignService;
 
     @Autowired

+ 2 - 1
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TenantAlbumController.java

@@ -31,6 +31,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
 import java.util.List;
 
 @Slf4j
@@ -43,7 +44,7 @@ public class TenantAlbumController extends BaseController {
     @Autowired
     private TenantAlbumService tenantAlbumService;
 
-    @Autowired
+    @Resource
     private SysUserFeignService sysUserFeignService;
 
     @Autowired

+ 29 - 14
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/UserOrderController.java

@@ -7,21 +7,32 @@ import com.microsvc.toolkit.common.webportal.exception.BizException;
 import com.microsvc.toolkit.config.jwt.utils.JwtUserInfo;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dto.req.OrderPayReq;
+import com.yonge.cooleshow.biz.dal.entity.UserOrder;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.service.UserPaymentCoreService;
 import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.CacheNameEnum;
+import com.yonge.cooleshow.common.enums.EPaymentVersion;
 import com.yonge.cooleshow.tenant.vo.UserPaymentOrderVo;
+import com.yonge.toolset.base.util.StringUtil;
+import com.yonge.toolset.payment.util.DistributedLock;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
 
 import java.util.Objects;
 
+import static com.yonge.cooleshow.common.entity.HttpResponseResult.failed;
+
 @Validated
 @RestController
 @RequestMapping("/userOrder")
@@ -36,7 +47,7 @@ public class UserOrderController {
     private UserPaymentCoreService userPaymentCoreService;
 
     @ApiOperation(value = "用户下单", notes = "用户下单")
-    @PostMapping("/executeOrder")
+    @PostMapping("/executeOrder/v2")
     public R<UserPaymentOrderWrapper.PaymentConfig> executeOrder(@Validated @RequestBody UserPaymentOrderVo.OrderReq orderReq) {
 
         // 设置下单用户信息
@@ -60,7 +71,7 @@ public class UserOrderController {
     }
 
     @ApiOperation(value = "用户付款", notes = "用户付款")
-    @PostMapping("/executePayment")
+    @PostMapping("/orderPay/v2")
     public R<UserPaymentOrderWrapper.PaymentReq> executePayment(@Validated @RequestBody UserPaymentOrderVo.PaymentReqConfig config) {
         // 设置下单用户信息
         SysUser sysUser = sysUserFeignService.queryUserInfo();
@@ -74,7 +85,7 @@ public class UserOrderController {
 
         // 创建用户支付数据
         UserPaymentOrderWrapper.PaymentReq paymentConfig = userPaymentCoreService.executePayment(JwtUserInfo.builder()
-                .userId(sysUser.getId().toString()).clientType(ClientEnum.TEACHER.getCode()).build(), reqConfig);
+                .userId(sysUser.getId().toString()).clientType(ClientEnum.TENANT.getCode()).build(), reqConfig);
         if (Objects.isNull(paymentConfig)) {
             throw BizException.from("付款失败");
         }
@@ -82,22 +93,26 @@ public class UserOrderController {
         return R.from(paymentConfig);
     }
 
-    @ApiOperation(value = "取消支付", notes = "取消支付")
+    @ApiOperation(value = "取消订单")
+    @PostMapping("/orderCancel")
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "orderNo", value = "订单号", dataType = "String")
+            @ApiImplicitParam(name = "orderNo", value = "订单号", paramType = "query", dataType = "String", required = true),
+            @ApiImplicitParam(name = "reason", value = "取消说明", paramType = "query", dataType = "String")
     })
-    @PostMapping("/cancelPayment/{orderNo}")
-    public R<JSONObject> cancelPayment(@PathVariable("orderNo") String orderNo) {
-
-
-        // 订单编号判断
-        if (StringUtils.isBlank(orderNo)) {
-            throw BizException.from("订单编号不能为空");
+    public HttpResponseResult<Boolean> orderCancel(@ApiIgnore @RequestBody OrderPayReq payReq) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
         }
+        if (StringUtil.isEmpty(payReq.getOrderNo())) {
+            return failed("订单号不能为空");
+        }
+        payReq.setUserId(user.getId());
 
         // 用户取消支付
-        userPaymentCoreService.cancelPayment(new JwtUserInfo<>(), orderNo);
+        userPaymentCoreService.cancelPayment(JwtUserInfo.builder().userId(user.getId().toString()).clientType(ClientEnum.TENANT.getCode()).build(), payReq.getOrderNo());
 
-        return R.defaultR();
+        return HttpResponseResult.status(true);
     }
+
 }

+ 52 - 0
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/open/OpenTeacherController.java

@@ -0,0 +1,52 @@
+package com.yonge.cooleshow.tenant.controller.open;
+
+import com.yonge.cooleshow.biz.dal.dto.req.TeacherSubmitReq;
+import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
+import com.yonge.cooleshow.biz.dal.service.TeacherService;
+import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.base.exception.BizException;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+
+/**
+ * @author 袁亮
+ * @apiNote 二维码方式注册老师账号
+ */
+@RestController
+@RequestMapping("/open/teacher")
+@Api(value = "教师表", tags = "教师表")
+public class OpenTeacherController extends BaseController {
+
+    @Autowired
+    private TeacherService teacherService;
+
+    @Autowired
+    private TenantInfoService tenantInfoService;
+
+    /**
+     * 新增或修改
+     */
+    @PostMapping("/submit")
+    @ApiOperation(value = "新增", notes = "传入teacher")
+    public HttpResponseResult<Boolean> submit(@Valid @RequestBody TeacherSubmitReq teacherSubmitReq) {
+        Long tenantId = teacherSubmitReq.getTenantId();
+        if (tenantId == null) {
+            throw new BizException("未选择机构");
+        }
+        TenantInfo tenantInfo = tenantInfoService.getById(tenantId);
+        if (tenantInfo == null || Boolean.FALSE.equals(tenantInfo.getEnableFlag())) {
+            throw new BizException("机构不可用");
+        }
+        teacherSubmitReq.setUserId(null);
+        return teacherService.submit(teacherSubmitReq);
+    }
+}

+ 1 - 4
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/vo/UserPaymentOrderVo.java

@@ -129,7 +129,7 @@ public class UserPaymentOrderVo {
     @ApiModel("下单请求对象")
     public static class OrderReq implements Serializable {
 
-        @ApiModelProperty("支付类型: adapay, wxpay")
+        @ApiModelProperty("支付类型: adapay")
         private String paymentType;
 
         @ApiModelProperty("业务类型Id")
@@ -227,9 +227,6 @@ public class UserPaymentOrderVo {
         @ApiModelProperty("微信支付公众号")
         private String wxAppId;
 
-        @ApiModelProperty(value = "收货地址", hidden = true)
-        private Long receiveAddress;
-
         @ApiModelProperty(value = "支付用户Id", hidden = true)
         private String userId;
 

+ 49 - 0
toolset/toolset-base/src/main/java/com/yonge/toolset/base/util/StringUtil.java

@@ -334,4 +334,53 @@ public class StringUtil {
     public static boolean hasLength(@Nullable String str) {
         return str != null && !str.isEmpty();
     }
+
+    // 定义36进制数字
+    private static final String X36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+    // 定义静态进制数
+    private static int BASE = 36;
+
+
+    // 拿到10进制转换36进制的值键对
+    private static HashMap<Integer, Character> tenToThirtysix = createMapTenToThirtysix();
+
+    private static HashMap<Integer, Character> createMapTenToThirtysix() {
+        HashMap<Integer, Character> map = new HashMap<>();
+        for (int i = 0; i < X36.length(); i++) {
+            // 0--0,... ..., 35 -- Z的对应存放进去
+            map.put(i, X36.charAt(i));
+        }
+        return map;
+    }
+
+    /**
+     * 用递归来实现10 to 36
+     *
+     * @param iSrc
+     * @return
+     */
+    public static String DeciamlToThirtySix(Long iSrc) {
+        String result = "";
+        Long key;
+        Long value;
+
+        key = iSrc / BASE;
+        value = iSrc - key * BASE;
+        if (key != 0) {
+            result = result + DeciamlToThirtySix(key);
+        }
+
+        result = result + tenToThirtysix.get(value.intValue()).toString();
+
+        return result;
+    }
+
+
+
+    public static void main(String[] args) {
+
+        String s = DeciamlToThirtySix(1684471133338419201L);
+        System.out.println(s);
+    }
 }