소스 검색

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

zouxuan 2 년 전
부모
커밋
252e1fe20d
46개의 변경된 파일1799개의 추가작업 그리고 254개의 파일을 삭제
  1. 9 9
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/SysAreaController.java
  2. 9 9
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/OpenSysAreaController.java
  3. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/TeacherSubmitReq.java
  4. 4 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/StudentSearch.java
  5. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/TeacherSearch.java
  6. 4 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TenantApplyRecord.java
  7. 9 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/TenantActivationCodeMapper.java
  8. 10 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/TenantAlbumPurchaseMapper.java
  9. 3 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/TenantStaffMapper.java
  10. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/StudentService.java
  11. 6 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantActivationCodeService.java
  12. 14 9
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantAlbumPurchaseService.java
  13. 6 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantApplyRecordService.java
  14. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantStaffService.java
  15. 37 33
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImUserFriendServiceImpl.java
  16. 117 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java
  17. 5 18
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java
  18. 88 16
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantActivationCodeServiceImpl.java
  19. 21 13
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantAlbumPurchaseServiceImpl.java
  20. 69 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantApplyRecordServiceImpl.java
  21. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantStaffServiceImpl.java
  22. 31 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/StudentWrapper.java
  23. 75 12
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantActivationCodeWrapper.java
  24. 59 14
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantAlbumPurchaseWrapper.java
  25. 44 12
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantAlbumWrapper.java
  26. 47 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantApplyRecordWrapper.java
  27. 1 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ImUserFriendMapper.xml
  28. 8 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/StudentMapper.xml
  29. 8 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  30. 34 12
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantActivationCodeMapper.xml
  31. 2 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantAlbumMapper.xml
  32. 17 7
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantAlbumPurchaseMapper.xml
  33. 7 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantStaffMapper.xml
  34. 99 0
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/StudentController.java
  35. 9 9
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/SysAreaController.java
  36. 131 0
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TeacherController.java
  37. 134 0
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TenantActivationCodeController.java
  38. 117 0
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TenantAlbumController.java
  39. 117 0
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TenantAlbumPurchaseController.java
  40. 47 0
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/open/OpenStudentController.java
  41. 38 38
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/open/OpenSysAreaController.java
  42. 53 0
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/open/OpenTenantController.java
  43. 45 0
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/vo/StudentVo.java
  44. 99 0
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/vo/TenantActivationCodeVo.java
  45. 64 0
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/vo/TenantAlbumPurchaseVo.java
  46. 83 0
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/vo/TenantAlbumVo.java

+ 9 - 9
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/SysAreaController.java

@@ -5,12 +5,12 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.google.common.collect.Lists;
 import com.microsvc.toolkit.common.response.paging.PageInfo;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
-import com.microsvc.toolkit.common.response.template.R;
 import com.microsvc.toolkit.common.webportal.exception.BizException;
 import com.yonge.cooleshow.admin.io.request.SysAreaVo;
 import com.yonge.cooleshow.biz.dal.entity.SysArea;
 import com.yonge.cooleshow.biz.dal.service.SysAreaService;
 import com.yonge.cooleshow.biz.dal.wrapper.SysAreaWrapper;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -44,9 +44,9 @@ public class SysAreaController {
             @ApiImplicitParam(name = "id", value = "id", dataType = "long")
     })
     @GetMapping("/detail/{id}")
-    public R<SysAreaWrapper.SysArea> detail(@PathVariable("id") Long id) {
+    public HttpResponseResult<SysAreaWrapper.SysArea> detail(@PathVariable("id") Long id) {
 
-        return R.from(sysAreaService.detail(id));
+        return HttpResponseResult.succeed(sysAreaService.detail(id));
 	}
 
 	/**
@@ -56,7 +56,7 @@ public class SysAreaController {
 	 */
 	@ApiOperation(value = "根据code查询", notes = "传入code")
     @GetMapping("/queryByCode/{code}")
-    public R<SysArea> queryByCode(@PathVariable("code") Integer code) {
+    public HttpResponseResult<SysArea> queryByCode(@PathVariable("code") Integer code) {
 
 		List<Integer> codeList = new ArrayList<Integer>();
 		codeList.add(code);
@@ -66,7 +66,7 @@ public class SysAreaController {
 			throw BizException.from("根据code查询区域表失败");
 		}
 
-        return R.from(list.get(0));
+        return HttpResponseResult.succeed(list.get(0));
 	}
 
     /**
@@ -77,11 +77,11 @@ public class SysAreaController {
     @ApiOperation(value = "查询分页", notes = "传入sysAreaSearch")
     @PreAuthorize("@auditsvc.hasPermissions('sysArea/page', {'BACKEND'})")
     @PostMapping("/page")
-    public R<PageInfo<SysAreaWrapper.SysArea>> page(@RequestBody SysAreaWrapper.SysAreaQuery query) {
+    public HttpResponseResult<PageInfo<SysAreaWrapper.SysArea>> page(@RequestBody SysAreaWrapper.SysAreaQuery query) {
 
         IPage<SysAreaWrapper.SysArea> pages = sysAreaService.selectPage(QueryInfo.getPage(query), query);
 
-        return R.from(QueryInfo.pageInfo(pages));
+        return HttpResponseResult.succeed(QueryInfo.pageInfo(pages));
 	}
 
     /**
@@ -90,7 +90,7 @@ public class SysAreaController {
      */
     @ApiOperation(value = "查询全部区域", notes = "查询全部区域")
     @GetMapping("/queryAllProvince")
-    public R<List<SysAreaVo.Province>> queryAllProvince() {
+    public HttpResponseResult<List<SysAreaVo.Province>> queryAllProvince() {
 
         List<SysAreaVo.Province> provinces = Lists.newArrayList();
 
@@ -119,6 +119,6 @@ public class SysAreaController {
             }
         }
 
-        return R.from(provinces);
+        return HttpResponseResult.succeed(provinces);
     }
 }

+ 9 - 9
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/OpenSysAreaController.java

@@ -5,12 +5,12 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.google.common.collect.Lists;
 import com.microsvc.toolkit.common.response.paging.PageInfo;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
-import com.microsvc.toolkit.common.response.template.R;
 import com.microsvc.toolkit.common.webportal.exception.BizException;
 import com.yonge.cooleshow.admin.io.request.SysAreaVo;
 import com.yonge.cooleshow.biz.dal.entity.SysArea;
 import com.yonge.cooleshow.biz.dal.service.SysAreaService;
 import com.yonge.cooleshow.biz.dal.wrapper.SysAreaWrapper;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -44,9 +44,9 @@ public class OpenSysAreaController {
             @ApiImplicitParam(name = "id", value = "id", dataType = "long")
     })
     @GetMapping("/detail/{id}")
-    public R<SysAreaWrapper.SysArea> detail(@PathVariable("id") Long id) {
+    public HttpResponseResult<SysAreaWrapper.SysArea> detail(@PathVariable("id") Long id) {
 
-        return R.from(sysAreaService.detail(id));
+        return HttpResponseResult.succeed(sysAreaService.detail(id));
     }
 
     /**
@@ -56,7 +56,7 @@ public class OpenSysAreaController {
      */
     @ApiOperation(value = "根据code查询", notes = "传入code")
     @GetMapping("/queryByCode/{code}")
-    public R<SysArea> queryByCode(@PathVariable("code") Integer code) {
+    public HttpResponseResult<SysArea> queryByCode(@PathVariable("code") Integer code) {
 
         List<Integer> codeList = new ArrayList<Integer>();
         codeList.add(code);
@@ -66,7 +66,7 @@ public class OpenSysAreaController {
             throw BizException.from("根据code查询区域表失败");
         }
 
-        return R.from(list.get(0));
+        return HttpResponseResult.succeed(list.get(0));
     }
 
     /**
@@ -77,11 +77,11 @@ public class OpenSysAreaController {
     @ApiOperation(value = "查询分页", notes = "传入sysAreaSearch")
     @PreAuthorize("@auditsvc.hasPermissions('sysArea/page', {'BACKEND'})")
     @PostMapping("/page")
-    public R<PageInfo<SysAreaWrapper.SysArea>> page(@RequestBody SysAreaWrapper.SysAreaQuery query) {
+    public HttpResponseResult<PageInfo<SysAreaWrapper.SysArea>> page(@RequestBody SysAreaWrapper.SysAreaQuery query) {
 
         IPage<SysAreaWrapper.SysArea> pages = sysAreaService.selectPage(QueryInfo.getPage(query), query);
 
-        return R.from(QueryInfo.pageInfo(pages));
+        return HttpResponseResult.succeed(QueryInfo.pageInfo(pages));
     }
 
     /**
@@ -90,7 +90,7 @@ public class OpenSysAreaController {
      */
     @ApiOperation(value = "查询全部区域", notes = "查询全部区域")
     @GetMapping("/queryAllProvince")
-    public R<List<SysAreaVo.Province>> queryAllProvince() {
+    public HttpResponseResult<List<SysAreaVo.Province>> queryAllProvince() {
 
         List<SysAreaVo.Province> provinces = Lists.newArrayList();
 
@@ -119,6 +119,6 @@ public class OpenSysAreaController {
             }
         }
 
-        return R.from(provinces);
+        return HttpResponseResult.succeed(provinces);
     }
 }

+ 3 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/TeacherSubmitReq.java

@@ -53,6 +53,9 @@ public class TeacherSubmitReq implements Serializable {
     @ApiModelProperty("结算方式")
     private ESettlementFrom settlementFrom;
 
+    @ApiModelProperty("是否解绑")
+    private Boolean bindTenant;
+
     public Long getUserId() {
         return userId;
     }

+ 4 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/StudentSearch.java

@@ -64,11 +64,14 @@ public class StudentSearch extends QueryInfo{
     private Integer hideFlag;
 
     @ApiModelProperty("机构ID")
-    private String tenantId;
+    private Long tenantId;
 
     @ApiModelProperty("机构名称")
     private String tenantName;
 
+    @ApiModelProperty(value = "排序方式",hidden = true)
+    private String orderBy;
+
     public Date getVipStartTime() {
         return vipStartTime;
     }

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/TeacherSearch.java

@@ -68,6 +68,8 @@ public class TeacherSearch extends QueryInfo{
 	@ApiModelProperty("结算方式")
 	private String settlementFrom;
 
+	@ApiModelProperty(value = "排序方式, 默认 create_time_ desc", hidden = true)
+	private String orderBy;
 	public YesOrNoEnum getTrainFlag() {
 		if (YesOrNoEnum.YES == trainFlag) {
 			return trainFlag;

+ 4 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TenantApplyRecord.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.biz.dal.enums.AuthStatusEnum;
 import lombok.Data;
 
 import io.swagger.annotations.ApiModel;
@@ -23,8 +24,8 @@ import java.util.Date;
 public class TenantApplyRecord implements Serializable {
 
     @ApiModelProperty("主键ID") 
-	    @TableId(value = "id_")
-	    private Long id;
+    @TableId(value = "id_")
+    private Long id;
 
     @ApiModelProperty("机构ID") 
 	@TableField(value = "tenant_id_")
@@ -60,7 +61,7 @@ public class TenantApplyRecord implements Serializable {
 
     @ApiModelProperty("审核状态 DOING、审核中 PASS、通过 UNPASS、不通过") 
 	@TableField(value = "status_")
-    private String status;
+    private AuthStatusEnum status;
 
     @ApiModelProperty("审核人") 
 	@TableField(value = "verify_user_id_")

+ 9 - 8
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/TenantActivationCodeMapper.java

@@ -16,12 +16,13 @@ import com.yonge.cooleshow.biz.dal.wrapper.TenantActivationCodeWrapper;
 @Repository
 public interface TenantActivationCodeMapper extends BaseMapper<TenantActivationCode> {
 
-	/**
-	 * 分页查询
-	 * @param page IPage<TenantActivationCodeWrapper.TenantActivationCode>
-	 * @param param TenantActivationCodeWrapper.TenantActivationCodeQuery
-	 * @return List<TenantActivationCodeWrapper.TenantActivationCode>
-	 */
-	List<TenantActivationCode> selectPage(@Param("page") IPage<TenantActivationCode> page, @Param("param") TenantActivationCodeWrapper.TenantActivationCodeQuery param);
-	
+    /**
+     * 分页查询
+     *
+     * @param page  IPage<TenantActivationCodeWrapper.TenantActivationCode>
+     * @param param TenantActivationCodeWrapper.TenantActivationCodeQuery
+     * @return List<TenantActivationCodeWrapper.TenantActivationCode>
+     */
+    List<TenantActivationCodeWrapper.TenantActivationCode> selectPage(@Param("page") IPage<TenantActivationCodeWrapper.TenantActivationCode> page, @Param("param") TenantActivationCodeWrapper.TenantActivationCodeQuery param);
+
 }

+ 10 - 8
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/TenantAlbumPurchaseMapper.java

@@ -16,12 +16,14 @@ import com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumPurchaseWrapper;
 @Repository
 public interface TenantAlbumPurchaseMapper extends BaseMapper<TenantAlbumPurchase> {
 
-	/**
-	 * 分页查询
-	 * @param page IPage<TenantAlbumPurchaseWrapper.TenantAlbumPurchase>
-	 * @param param TenantAlbumPurchaseWrapper.TenantAlbumPurchaseQuery
-	 * @return List<TenantAlbumPurchaseWrapper.TenantAlbumPurchase>
-	 */
-	List<TenantAlbumPurchase> selectPage(@Param("page") IPage<TenantAlbumPurchase> page, @Param("param") TenantAlbumPurchaseWrapper.TenantAlbumPurchaseQuery param);
-	
+    /**
+     * 分页查询
+     *
+     * @param page  IPage<TenantAlbumPurchaseWrapper.TenantAlbumPurchase>
+     * @param param TenantAlbumPurchaseWrapper.TenantAlbumPurchaseQuery
+     * @return List<TenantAlbumPurchaseWrapper.TenantAlbumPurchase>
+     */
+    List<TenantAlbumPurchaseWrapper.TenantAlbumPurchase> selectPage(@Param("page") IPage<TenantAlbumPurchaseWrapper.TenantAlbumPurchase> page,
+                                                                    @Param("param") TenantAlbumPurchaseWrapper.TenantAlbumPurchaseQuery param);
+
 }

+ 3 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/TenantStaffMapper.java

@@ -23,5 +23,7 @@ public interface TenantStaffMapper extends BaseMapper<TenantStaff> {
 	 * @return List<TenantStaffWrapper.TenantStaff>
 	 */
 	List<TenantStaff> selectPage(@Param("page") IPage<TenantStaff> page, @Param("param") TenantStaffWrapper.TenantStaffQuery param);
-	
+
+    TenantStaff getByPhone(@Param("phone") String phone);
+
 }

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

@@ -104,4 +104,10 @@ public interface StudentService extends IService<Student> {
      * @return StudentWrapper.UnionStudentResp
      */
     StudentWrapper.UnionStudentResp unionStudent(StudentWrapper.UnionStudent info);
+
+    /**
+     * 添加学生
+     * @param studentInfo 学生信息
+     */
+    Boolean save(StudentWrapper.Student studentInfo);
 }

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

@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantActivationCodeWrapper;
 import com.yonge.cooleshow.biz.dal.entity.TenantActivationCode;
 
+import java.util.List;
+
 /**
  * 机构激活码
  * 2023-07-21 17:32:49
@@ -24,7 +26,8 @@ public interface TenantActivationCodeService extends IService<TenantActivationCo
      * @param query TenantActivationCodeWrapper.TenantActivationCodeQuery
      * @return IPage<TenantActivationCode>
      */
-    IPage<TenantActivationCode> selectPage(IPage<TenantActivationCode> page, TenantActivationCodeWrapper.TenantActivationCodeQuery query);
+    IPage<TenantActivationCodeWrapper.TenantActivationCode> selectPage(IPage<TenantActivationCodeWrapper.TenantActivationCode> page,
+                                                                       TenantActivationCodeWrapper.TenantActivationCodeQuery query);
 	
     /**
      * 添加
@@ -39,5 +42,6 @@ public interface TenantActivationCodeService extends IService<TenantActivationCo
      * @return Boolean
      */
      Boolean update(TenantActivationCodeWrapper.TenantActivationCode tenantActivationCode);
-     
+
+    void sendActivationCode(Long tenantId, Long tenantAlbumPurchaseId, List<String> activationCodeList, List<Long> studentIdList);
 }

+ 14 - 9
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantAlbumPurchaseService.java

@@ -9,35 +9,40 @@ import com.yonge.cooleshow.biz.dal.entity.TenantAlbumPurchase;
  * 机构专辑采购
  * 2023-07-21 17:32:49
  */
-public interface TenantAlbumPurchaseService extends IService<TenantAlbumPurchase>  {
+public interface TenantAlbumPurchaseService extends IService<TenantAlbumPurchase> {
 
-	/**
+    /**
      * 查询详情
+     *
      * @param id 详情ID
      * @return TenantAlbumPurchase
      */
-	TenantAlbumPurchase detail(Long id);
+    TenantAlbumPurchase detail(Long id);
 
     /**
      * 分页查询
-     * @param page IPage<TenantAlbumPurchase>
+     *
+     * @param page  IPage<TenantAlbumPurchase>
      * @param query TenantAlbumPurchaseWrapper.TenantAlbumPurchaseQuery
      * @return IPage<TenantAlbumPurchase>
      */
-    IPage<TenantAlbumPurchase> selectPage(IPage<TenantAlbumPurchase> page, TenantAlbumPurchaseWrapper.TenantAlbumPurchaseQuery query);
-	
+    IPage<TenantAlbumPurchaseWrapper.TenantAlbumPurchase> selectPage(IPage<TenantAlbumPurchaseWrapper.TenantAlbumPurchase> page,
+                                                                     TenantAlbumPurchaseWrapper.TenantAlbumPurchaseQuery query);
+
     /**
      * 添加
+     *
      * @param tenantAlbumPurchase TenantAlbumPurchaseWrapper.TenantAlbumPurchase
      * @return Boolean
      */
-     Boolean add(TenantAlbumPurchaseWrapper.TenantAlbumPurchase tenantAlbumPurchase);   
+    Boolean add(TenantAlbumPurchaseWrapper.TenantAlbumPurchase tenantAlbumPurchase);
 
     /**
      * 更新
+     *
      * @param tenantAlbumPurchase TenantAlbumPurchaseWrapper.TenantAlbumPurchase
      * @return Boolean
      */
-     Boolean update(TenantAlbumPurchaseWrapper.TenantAlbumPurchase tenantAlbumPurchase);
-     
+    Boolean update(TenantAlbumPurchaseWrapper.TenantAlbumPurchase tenantAlbumPurchase);
+
 }

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

@@ -39,5 +39,10 @@ public interface TenantApplyRecordService extends IService<TenantApplyRecord>  {
      * @return Boolean
      */
      Boolean update(TenantApplyRecordWrapper.TenantApplyRecord tenantApplyRecord);
-     
+
+    /**
+     * 申请入驻
+     *
+     */
+    void apply(TenantApplyRecordWrapper.TenantApply tenantApply);
 }

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

@@ -39,5 +39,6 @@ public interface TenantStaffService extends IService<TenantStaff>  {
      * @return Boolean
      */
      Boolean update(TenantStaffWrapper.TenantStaff tenantStaff);
-     
+
+    TenantStaff getByPhone(String phone);
 }

+ 37 - 33
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImUserFriendServiceImpl.java

@@ -81,14 +81,15 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
         BasicUserInfo teacherInfo = teacherDao.getBasicUserInfo(teacherId);
         List<BasicUserInfo> studentInfos = teacherDao.findBasicUserInfo(studentIds);
         studentInfos.add(teacherInfo);
-        Map<Long, List<BasicUserInfo>> basicUserInfoMap = studentInfos.stream().collect(Collectors.groupingBy(BasicUserInfo::getUserId));
-        for(Long studentId : studentIds){
+        Map<Long, List<BasicUserInfo>> basicUserInfoMap =
+                studentInfos.stream().collect(Collectors.groupingBy(BasicUserInfo::getUserId));
+        for (Long studentId : studentIds) {
             //老师关联学员
             ImUserFriend teacherFriend = new ImUserFriend();
             //学员关联老师
             ImUserFriend studentFriend = new ImUserFriend();
             List<BasicUserInfo> basicUserInfos = basicUserInfoMap.get(studentId);
-            if(CollectionUtils.isNotEmpty(basicUserInfos)){
+            if (CollectionUtils.isNotEmpty(basicUserInfos)) {
                 BasicUserInfo info = basicUserInfos.get(0);
                 teacherFriend.setFriendAvatar(info.getAvatar());
                 teacherFriend.setFriendNickname(info.getUsername());
@@ -125,14 +126,14 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
 
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         BasicUserInfo basicUserInfo = teacherDao.getBasicUserInfo(userId);
-        if(sysUser != null && sysUser.getId() != null){
+        if (sysUser != null && sysUser.getId() != null) {
 
             ImUserFriend imUserFriend = lambdaQuery()
                     .eq(ImUserFriend::getUserId, sysUser.getId())
                     .eq(ImUserFriend::getClientType, clientType)
                     .eq(ImUserFriend::getFriendId, userId)
                     .one();
-            if(Objects.nonNull(imUserFriend)){
+            if (Objects.nonNull(imUserFriend)) {
                 //更新当前用户关联的该用户的详情信息
                 imUserFriend.setFriendAvatar(basicUserInfo.getAvatar());
                 imUserFriend.setFriendNickname(basicUserInfo.getUsername());
@@ -166,8 +167,8 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
     /**
      * 新用户自动添加客服
      *
-     * @param userId    新用户ID
-     * @param friendIds 好友ID
+     * @param userId     新用户ID
+     * @param friendIds  好友ID
      * @param clientType 客户端类型
      * @return Integer
      */
@@ -256,7 +257,8 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
     public void sendCustomerServiceNotifyMessage(String sender, CustomerService.NotifyMessage info) {
 
         // 发送者信息
-        com.yonge.cooleshow.biz.dal.entity.SysUser senderUser = sysUserMapper.selectOne(Wrappers.<com.yonge.cooleshow.biz.dal.entity.SysUser>lambdaQuery()
+        com.yonge.cooleshow.biz.dal.entity.SysUser senderUser =
+                sysUserMapper.selectOne(Wrappers.<com.yonge.cooleshow.biz.dal.entity.SysUser>lambdaQuery()
                 .eq(com.yonge.cooleshow.biz.dal.entity.SysUser::getPhone, sender));
 
         if (Objects.isNull(senderUser)) {
@@ -276,7 +278,8 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
             }
         } else {
 
-            LambdaQueryWrapper<com.yonge.cooleshow.biz.dal.entity.SysUser> wrapper = Wrappers.<com.yonge.cooleshow.biz.dal.entity.SysUser>lambdaQuery()
+            LambdaQueryWrapper<com.yonge.cooleshow.biz.dal.entity.SysUser> wrapper =
+                    Wrappers.<com.yonge.cooleshow.biz.dal.entity.SysUser>lambdaQuery()
                     .select(com.yonge.cooleshow.biz.dal.entity.SysUser::getId,
                             com.yonge.cooleshow.biz.dal.entity.SysUser::getUsername)
                     .in(com.yonge.cooleshow.biz.dal.entity.SysUser::getPhone, info.getReceives());
@@ -337,17 +340,17 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
     }
 
 
-
     /**
      * 用户IM好友列表
      *
      * @param clientType 客户端类型
-     * @param userId 用户ID
+     * @param userId     用户ID
      * @param paramMap   Map<String, Object>
      * @return List<ImUserWrapper.ImUserFriend>
      */
     @Override
-    public List<ImUserWrapper.ImUserFriend> findUserAllImFriendInfo(ClientEnum clientType, Long userId, Map<String, Object> paramMap) {
+    public List<ImUserWrapper.ImUserFriend> findUserAllImFriendInfo(ClientEnum clientType, Long userId, Map<String,
+            Object> paramMap) {
 
         // 用户好友匹配条件
         Object search = paramMap.get("search");
@@ -360,30 +363,30 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
                         e -> e.eq(ImUserFriend::getFriendId, search).or().like(ImUserFriend::getFriendNickname, search))
                 .orderByDesc(ImUserFriend::getId).list();
 
-        List<ImUserWrapper.ImUserFriend> userFriends = JSON.parseArray(JSON.toJSONString(records), ImUserWrapper.ImUserFriend.class);
+        List<ImUserWrapper.ImUserFriend> userFriends = JSON.parseArray(JSON.toJSONString(records),
+                ImUserWrapper.ImUserFriend.class);
 
         for (ImUserWrapper.ImUserFriend item : userFriends) {
 
             switch (clientType) {
-                case TEACHER:
-                    {
-                        // 老师查询学生好友
-                        if (item.getFriendType() == ClientEnum.TEACHER) {
-                            item.setImFriendId(MessageFormat.format("{0}", String.valueOf(item.getFriendId())));
-                        } else {
-                            item.friendType(Optional.ofNullable(item.getFriendType()).orElse(ClientEnum.STUDENT))
-                                    .setImFriendId(MessageFormat.format("{0}:{1}", String.valueOf(item.getFriendId()), ClientEnum.STUDENT.name()));
-                        }
-
+                case TEACHER: {
+                    // 老师查询学生好友
+                    if (item.getFriendType() == ClientEnum.TEACHER) {
+                        item.setImFriendId(MessageFormat.format("{0}", String.valueOf(item.getFriendId())));
+                    } else {
+                        item.friendType(Optional.ofNullable(item.getFriendType()).orElse(ClientEnum.STUDENT))
+                                .setImFriendId(MessageFormat.format("{0}:{1}", String.valueOf(item.getFriendId()),
+                                        ClientEnum.STUDENT.name()));
                     }
-                    break;
-                case STUDENT:
-                    {
-                        // 查询学生老师好友
-                        item.friendType(Optional.ofNullable(item.getFriendType()).orElse(ClientEnum.TEACHER))
-                                .setImFriendId(MessageFormat.format("{0}", String.valueOf(item.getFriendId())));
-                    }
-                    break;
+
+                }
+                break;
+                case STUDENT: {
+                    // 查询学生老师好友
+                    item.friendType(Optional.ofNullable(item.getFriendType()).orElse(ClientEnum.TEACHER))
+                            .setImFriendId(MessageFormat.format("{0}", String.valueOf(item.getFriendId())));
+                }
+                break;
                 default:
                     break;
             }
@@ -394,8 +397,9 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
 
     /**
      * 删除机构下的好友
-     * @param tenantId 机构ID
-     * @param userId 用户ID
+     *
+     * @param tenantId   机构ID
+     * @param userId     用户ID
      */
     @Override
     public void delFriendByTenantId(Long tenantId, Long userId) {

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

@@ -1,9 +1,12 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.microsvc.toolkit.common.webportal.exception.BizException;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.StudentDao;
 import com.yonge.cooleshow.biz.dal.dao.SubjectDao;
@@ -11,15 +14,27 @@ import com.yonge.cooleshow.biz.dal.dao.TeacherDao;
 import com.yonge.cooleshow.biz.dal.dao.UserBindingTeacherDao;
 import com.yonge.cooleshow.biz.dal.dto.search.QueryMyFollowSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentSearch;
-import com.yonge.cooleshow.biz.dal.entity.*;
+import com.yonge.cooleshow.biz.dal.entity.Student;
+import com.yonge.cooleshow.biz.dal.entity.StudentTotal;
+import com.yonge.cooleshow.biz.dal.entity.Subject;
+import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
+import com.yonge.cooleshow.biz.dal.entity.UserBindingTeacher;
+import com.yonge.cooleshow.biz.dal.entity.UserTenantAlbumRecord;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
-import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.service.ImGroupService;
+import com.yonge.cooleshow.biz.dal.service.ImUserFriendService;
+import com.yonge.cooleshow.biz.dal.service.StudentService;
+import com.yonge.cooleshow.biz.dal.service.StudentTotalService;
+import com.yonge.cooleshow.biz.dal.service.SysConfigService;
+import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
+import com.yonge.cooleshow.biz.dal.service.UserTenantAlbumRecordService;
 import com.yonge.cooleshow.biz.dal.vo.MyFollow;
 import com.yonge.cooleshow.biz.dal.vo.StudentHomeVo;
 import com.yonge.cooleshow.biz.dal.vo.StudentVo;
 import com.yonge.cooleshow.biz.dal.vo.TeacherVo;
 import com.yonge.cooleshow.biz.dal.wrapper.StudentWrapper;
+import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.cooleshow.common.enums.UserLockFlag;
@@ -72,6 +87,12 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
     @Autowired
     private UserTenantAlbumRecordService userTenantAlbumRecordService;
 
+    @Autowired
+    private SysConfigService sysConfigService;
+
+    @Autowired
+    private ImGroupService imGroupService;
+
     @Override
     public StudentVo detail(Long userId) {
         return baseMapper.detail(userId);
@@ -257,8 +278,9 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
         StudentVo studentVo = detailByPhone(info.getMobile());
 
 
-        com.yonge.cooleshow.biz.dal.entity.SysUser sysUser = sysUserMapper.selectOne(Wrappers.<com.yonge.cooleshow.biz.dal.entity.SysUser>lambdaQuery()
-                                                                                             .eq(com.yonge.cooleshow.biz.dal.entity.SysUser::getPhone, info.getMobile()));
+        com.yonge.cooleshow.biz.dal.entity.SysUser sysUser =
+                sysUserMapper.selectOne(Wrappers.<com.yonge.cooleshow.biz.dal.entity.SysUser>lambdaQuery()
+                        .eq(com.yonge.cooleshow.biz.dal.entity.SysUser::getPhone, info.getMobile()));
 
         studentResp.setSysUser(sysUser);
         if (Objects.isNull(studentVo)) {
@@ -281,7 +303,8 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
                 studentResp.setUpdateFlag(true);
             } else {
 
-                com.yonge.cooleshow.biz.dal.entity.SysUser updateEntity = new com.yonge.cooleshow.biz.dal.entity.SysUser();
+                com.yonge.cooleshow.biz.dal.entity.SysUser updateEntity =
+                        new com.yonge.cooleshow.biz.dal.entity.SysUser();
                 updateEntity.setId(sysUser.getId());
                 updateEntity.setUpdateTime(LocalDateTime.now());
                 //updateEntity.setDelFlag(Optional.ofNullable(info.getLockFlag()).orElse(0)); // 激活帐号
@@ -337,11 +360,98 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
         return studentResp;
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public Boolean save(StudentWrapper.Student studentInfo) {
+        if (studentInfo.getId() != null) {
+            return createStudent(studentInfo);
+        } else {
+            return updateStudent(studentInfo);
+        }
+    }
+
+    private Boolean updateStudent(StudentWrapper.Student studentInfo) {
+        StudentVo student = detail(studentInfo.getId());
+        if (student == null) {
+            throw new BizException("学生信息不存在");
+        }
+        // 解绑
+        if (!studentInfo.getBindTenant()) {
+            studentInfo.setTenantId(-1L);
+            // 退群,删除好友
+            imUserFriendService.delFriendByTenantId(student.getTenantId(), student.getUserId());
+        }
+        // 手机号码修改
+        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())
+                    .set(Student::getUpdateTime, new Date())
+                    .eq(Student::getUserId, studentInfo.getId())
+                    .update();
+        } else {
+            Student newStudent = new Student();
+            newStudent.setUserId(studentInfo.getId());
+            newStudent.setSubjectId(studentInfo.getSubjectId());
+            newStudent.setUpdateTime(new Date());
+            newStudent.setTenantId(studentInfo.getTenantId());
+            this.getBaseMapper().updateById(newStudent);
+        }
+        return true;
+    }
+
+    private Boolean createStudent(StudentWrapper.Student studentInfo) {
+        com.yonge.cooleshow.biz.dal.entity.SysUser sysUser = getOrCreateAccount(studentInfo);
+        Student student = new Student();
+        student.setUserId(sysUser.getId());
+        student.setTenantId(studentInfo.getTenantId());
+        student.setSubjectId(studentInfo.getSubjectId());
+        student.setCreateTime(new Date());
+        student.setLockFlag(UserLockFlag.NORMAL);
+        save(student);
+        return true;
+    }
+
+    private com.yonge.cooleshow.biz.dal.entity.SysUser getOrCreateAccount(StudentWrapper.Student studentInfo) {
+        QueryWrapper<com.yonge.cooleshow.biz.dal.entity.SysUser> sysUserQueryWrapper = new QueryWrapper<>();
+        sysUserQueryWrapper.lambda().eq(com.yonge.cooleshow.biz.dal.entity.SysUser::getPhone, studentInfo.getPhone());
+        List<com.yonge.cooleshow.biz.dal.entity.SysUser> sysUsers = sysUserMapper.selectList(sysUserQueryWrapper);
+        com.yonge.cooleshow.biz.dal.entity.SysUser sysUser;
+        if (!sysUsers.isEmpty()) {
+            sysUser = sysUsers.get(0);
+            if (this.getBaseMapper().selectById(sysUser.getId()) != null) {
+                throw new BizException("手机号已经注册学生账号");
+            }
+            sysUser.setGender(studentInfo.getGender());
+            sysUser.setBirthdate(studentInfo.getBirthdate());
+            String userType = sysUser.getUserType();
+            String studentUserType = "STUDENT";
+            if (StringUtils.isEmpty(userType)) {
+                sysUser.setUserType(studentUserType);
+            } else if (!userType.contains(studentUserType)) {
+                sysUser.setUserType(userType + "," + studentUserType);
+            }
+            sysUserMapper.updateById(sysUser);
+        } else {
+            sysUser = JSON.parseObject(JSON.toJSONString(studentInfo),
+                    com.yonge.cooleshow.biz.dal.entity.SysUser.class);
+            sysUser.setPhone(studentInfo.getPhone());
+            sysUser.setAvatar(sysConfigService.findConfigValue(SysConfigConstant.DEFAULT_HEARD));
+            sysUser.setGender(studentInfo.getGender());
+            sysUser.setUserType("STUDENT");
+            sysUser.setBirthdate(studentInfo.getBirthdate());
+            sysUserMapper.insert(sysUser);
+        }
+        return sysUser;
+    }
+
     /**
      * 更新学生关联帐号
-     * @param info StudentWrapper.UnionStudent
+     *
+     * @param info        StudentWrapper.UnionStudent
      * @param studentResp StudentWrapper.UnionStudentResp
-     * @param student Student
+     * @param student     Student
      */
     private void updateStudentUnionStatus(StudentWrapper.UnionStudent info,
                                           StudentWrapper.UnionStudentResp studentResp, Student student) {

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

@@ -161,20 +161,6 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
             }).filter(Objects::nonNull).collect(Collectors.joining(","));
             teacherVo.setSubjectName(subjectNames);
         }
-
-        // 设置机构名称
-        List<Long> tenantIdList = teacherVos.stream().map(TeacherVo::getTenantId)
-                .filter(next -> next != null && !next.equals(-1L)).distinct()
-                .collect(Collectors.toList());
-        if (!tenantIdList.isEmpty()) {
-            Map<Long, String> tenantIdNameMap = tenantInfoService.lambdaQuery().in(TenantInfo::getId, tenantIdList)
-                    .list().stream().collect(Collectors.toMap(TenantInfo::getId, TenantInfo::getName));
-            tenantIdNameMap.put(-1L, "平台老师");
-            for (TeacherVo next : teacherVos) {
-                next.setTenantName(tenantIdNameMap.getOrDefault(next.getTenantId(), ""));
-            }
-        }
-
         return page.setRecords(teacherVos);
     }
 
@@ -383,8 +369,6 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
         } else {
             teacher.setUpdateTime(new Date());
             teacher = getTeacherDetil(teacher, teacherSubmitReq);
-            baseMapper.updateById(teacher);
-
             if (null == teacher.getEntryAuthDate() || null == teacher.getMusicianDate()) {
                 baseMapper.update(teacher, Wrappers.<Teacher>lambdaUpdate()
                         .set(Teacher::getEntryAuthDate, teacher.getEntryAuthDate())
@@ -393,8 +377,8 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
                 );
             }
 
-            // 机构发生变化
-            if (!teacher.getTenantId().equals(teacherSubmitReq.getTenantId())) {
+            // 机构解绑
+            if (teacher.getTenantId() != -1 && !teacherSubmitReq.getBindTenant()) {
                 // 老师建立的班级群解散,并解除好友关系
                 List<ImGroupMember> groupMembers = imGroupMemberService.lambdaQuery()
                         .eq(ImGroupMember::getIsAdmin,true)
@@ -411,7 +395,10 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
                     });
                     imUserFriendService.delFriendByTenantId(teacher.getTenantId(), teacher.getUserId());
                 }
+                // 机构解绑后,归属为平台老师
+                teacher.setTenantId(-1L);
             }
+            baseMapper.updateById(teacher);
         }
 
         return teacher;

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

@@ -1,15 +1,27 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springframework.stereotype.Service;
-import org.springframework.beans.BeanUtils;
-import lombok.extern.slf4j.Slf4j;
+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.wrapper.TenantActivationCodeWrapper;
+import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantActivationCodeMapper;
 import com.yonge.cooleshow.biz.dal.service.TenantActivationCodeService;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantActivationCodeWrapper;
+import com.yonge.toolset.base.exception.BizException;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 机构激活码
@@ -19,48 +31,108 @@ import com.yonge.cooleshow.biz.dal.service.TenantActivationCodeService;
 @Service
 public class TenantActivationCodeServiceImpl extends ServiceImpl<TenantActivationCodeMapper, TenantActivationCode> implements TenantActivationCodeService {
 
-	/**
+    @Autowired
+    private StudentDao studentDao;
+
+    @Autowired
+    private SysUserMapper sysUserMapper;
+
+    /**
      * 查询详情
+     *
      * @param id 详情ID
      * @return TenantActivationCode
      */
-	@Override
+    @Override
     public TenantActivationCode detail(Long id) {
-        
+
         return baseMapper.selectById(id);
     }
-    
+
     /**
      * 分页查询
-     * @param page IPage<TenantActivationCode>
+     *
+     * @param page  IPage<TenantActivationCode>
      * @param query TenantActivationCodeWrapper.TenantActivationCodeQuery
      * @return IPage<TenantActivationCode>
      */
     @Override
-    public IPage<TenantActivationCode> selectPage(IPage<TenantActivationCode> page, TenantActivationCodeWrapper.TenantActivationCodeQuery query) {
-        
+    public IPage<TenantActivationCodeWrapper.TenantActivationCode> selectPage(IPage<TenantActivationCodeWrapper.TenantActivationCode> page,
+                                                                              TenantActivationCodeWrapper.TenantActivationCodeQuery query) {
+
         return page.setRecords(baseMapper.selectPage(page, query));
     }
-	
+
     /**
      * 添加
+     *
      * @param tenantActivationCode TenantActivationCodeWrapper.TenantActivationCode
      * @return Boolean
      */
     @Override
-    public Boolean add(TenantActivationCodeWrapper.TenantActivationCode tenantActivationCode) {    	
-        
+    public Boolean add(TenantActivationCodeWrapper.TenantActivationCode tenantActivationCode) {
+
         return this.save(JSON.parseObject(tenantActivationCode.jsonString(), TenantActivationCode.class));
     }
 
     /**
      * 更新
+     *
      * @param tenantActivationCode TenantActivationCodeWrapper.TenantActivationCode
      * @return Boolean
      */
     @Override
-    public Boolean update(TenantActivationCodeWrapper.TenantActivationCode tenantActivationCode){
+    public Boolean update(TenantActivationCodeWrapper.TenantActivationCode tenantActivationCode) {
+
+        return this.updateById(JSON.parseObject(tenantActivationCode.jsonString(), TenantActivationCode.class));
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void sendActivationCode(Long tenantId, Long tenantAlbumPurchaseId, List<String> activationCodeList,
+                                   List<Long> studentIdList) {
+        QueryWrapper<TenantActivationCode> queryWrapper = new QueryWrapper<>();
+        if (CollectionUtils.isEmpty(activationCodeList)) {
+            // 入参为空走批量发放方式
+            queryWrapper.lambda().eq(TenantActivationCode::getTenantId, tenantId)
+                    .eq(TenantActivationCode::getTenantAlbumPurchaseId, tenantAlbumPurchaseId)
+                    .eq(TenantActivationCode::getActivationStatus, false);
+        } else {
+            queryWrapper.lambda().eq(TenantActivationCode::getTenantId, tenantId)
+                    .eq(TenantActivationCode::getTenantAlbumPurchaseId, tenantAlbumPurchaseId)
+                    .in(TenantActivationCode::getActivationCode, activationCodeList)
+                    .eq(TenantActivationCode::getActivationStatus, false);
+        }
+
+        List<TenantActivationCode> tenantActivationCodes = baseMapper.selectList(queryWrapper);
+        if (tenantActivationCodes.isEmpty()) {
+            throw new BizException("无可发放的激活码");
+        }
+
+        QueryWrapper<Student> studentQueryWrapper = new QueryWrapper<>();
+        studentQueryWrapper.lambda().eq(Student::getTenantId, tenantId)
+                .in(Student::getUserId, studentIdList);
+        List<Student> students = studentDao.selectList(studentQueryWrapper);
+        if (tenantActivationCodes.size() < students.size()) {
+            throw new BizException("学生的数量不能大于可用的激活码数量");
+        }
+
+        List<Long> studentIds = students.stream().map(Student::getUserId).collect(Collectors.toList());
+        Map<Long, String> idPhoneMap = sysUserMapper.selectBatchIds(studentIds).stream()
+                .collect(Collectors.toMap(SysUser::getId, SysUser::getPhone));
 
-        return this.updateById(JSON.parseObject(tenantActivationCode.jsonString(), TenantActivationCode.class));       
+        for (Long studentId : studentIds) {
+            for (TenantActivationCode tenantActivationCode : tenantActivationCodes) {
+                boolean update = this.lambdaUpdate()
+                        .set(TenantActivationCode::getSendStatus, "SEND")
+                        .set(TenantActivationCode::getActivationPhone, idPhoneMap.get(studentId))
+                        .eq(TenantActivationCode::getActivationStatus, false)
+                        .eq(TenantActivationCode::getId, tenantActivationCode.getId())
+                        .update();
+                if (!update) {
+                    throw new BizException("激活码已被激活:" + tenantActivationCode.getActivationCode());
+                }
+            }
+        }
     }
 }

+ 21 - 13
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantAlbumPurchaseServiceImpl.java

@@ -11,6 +11,8 @@ import com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumPurchaseWrapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantAlbumPurchaseMapper;
 import com.yonge.cooleshow.biz.dal.service.TenantAlbumPurchaseService;
 
+import java.util.List;
+
 /**
  * 机构专辑采购
  * 2023-07-21 17:32:49
@@ -19,48 +21,54 @@ import com.yonge.cooleshow.biz.dal.service.TenantAlbumPurchaseService;
 @Service
 public class TenantAlbumPurchaseServiceImpl extends ServiceImpl<TenantAlbumPurchaseMapper, TenantAlbumPurchase> implements TenantAlbumPurchaseService {
 
-	/**
+    /**
      * 查询详情
+     *
      * @param id 详情ID
      * @return TenantAlbumPurchase
      */
-	@Override
+    @Override
     public TenantAlbumPurchase detail(Long id) {
-        
+
         return baseMapper.selectById(id);
     }
-    
+
     /**
      * 分页查询
-     * @param page IPage<TenantAlbumPurchase>
+     *
+     * @param page  IPage<TenantAlbumPurchase>
      * @param query TenantAlbumPurchaseWrapper.TenantAlbumPurchaseQuery
      * @return IPage<TenantAlbumPurchase>
      */
     @Override
-    public IPage<TenantAlbumPurchase> selectPage(IPage<TenantAlbumPurchase> page, TenantAlbumPurchaseWrapper.TenantAlbumPurchaseQuery query) {
-        
-        return page.setRecords(baseMapper.selectPage(page, query));
+    public IPage<TenantAlbumPurchaseWrapper.TenantAlbumPurchase> selectPage(IPage<TenantAlbumPurchaseWrapper.TenantAlbumPurchase> page,
+                                                                            TenantAlbumPurchaseWrapper.TenantAlbumPurchaseQuery query) {
+
+        List<TenantAlbumPurchaseWrapper.TenantAlbumPurchase> selectPage = baseMapper.selectPage(page, query);
+        return page.setRecords(selectPage);
     }
-	
+
     /**
      * 添加
+     *
      * @param tenantAlbumPurchase TenantAlbumPurchaseWrapper.TenantAlbumPurchase
      * @return Boolean
      */
     @Override
-    public Boolean add(TenantAlbumPurchaseWrapper.TenantAlbumPurchase tenantAlbumPurchase) {    	
-        
+    public Boolean add(TenantAlbumPurchaseWrapper.TenantAlbumPurchase tenantAlbumPurchase) {
+
         return this.save(JSON.parseObject(tenantAlbumPurchase.jsonString(), TenantAlbumPurchase.class));
     }
 
     /**
      * 更新
+     *
      * @param tenantAlbumPurchase TenantAlbumPurchaseWrapper.TenantAlbumPurchase
      * @return Boolean
      */
     @Override
-    public Boolean update(TenantAlbumPurchaseWrapper.TenantAlbumPurchase tenantAlbumPurchase){
+    public Boolean update(TenantAlbumPurchaseWrapper.TenantAlbumPurchase tenantAlbumPurchase) {
 
-        return this.updateById(JSON.parseObject(tenantAlbumPurchase.jsonString(), TenantAlbumPurchase.class));       
+        return this.updateById(JSON.parseObject(tenantAlbumPurchase.jsonString(), TenantAlbumPurchase.class));
     }
 }

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

@@ -3,6 +3,13 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.microsvc.toolkit.common.webportal.exception.BizException;
+import com.yonge.cooleshow.biz.dal.entity.TenantStaff;
+import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
+import com.yonge.cooleshow.biz.dal.service.SmsCodeService;
+import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
+import com.yonge.cooleshow.biz.dal.service.TenantStaffService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.beans.BeanUtils;
 import lombok.extern.slf4j.Slf4j;
@@ -10,6 +17,9 @@ import com.yonge.cooleshow.biz.dal.entity.TenantApplyRecord;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantApplyRecordWrapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantApplyRecordMapper;
 import com.yonge.cooleshow.biz.dal.service.TenantApplyRecordService;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
 
 /**
  * 机构入驻申请记录
@@ -19,12 +29,19 @@ import com.yonge.cooleshow.biz.dal.service.TenantApplyRecordService;
 @Service
 public class TenantApplyRecordServiceImpl extends ServiceImpl<TenantApplyRecordMapper, TenantApplyRecord> implements TenantApplyRecordService {
 
-	/**
+
+    @Autowired
+    private TenantStaffService tenantStaffService;
+
+    @Autowired
+    private SmsCodeService smsCodeService;
+
+    /**
      * 查询详情
      * @param id 详情ID
      * @return TenantApplyRecord
      */
-	@Override
+    @Override
     public TenantApplyRecord detail(Long id) {
         
         return baseMapper.selectById(id);
@@ -41,15 +58,15 @@ public class TenantApplyRecordServiceImpl extends ServiceImpl<TenantApplyRecordM
         
         return page.setRecords(baseMapper.selectPage(page, query));
     }
-	
+
     /**
      * 添加
      * @param tenantApplyRecord TenantApplyRecordWrapper.TenantApplyRecord
      * @return Boolean
      */
     @Override
-    public Boolean add(TenantApplyRecordWrapper.TenantApplyRecord tenantApplyRecord) {    	
-        
+    public Boolean add(TenantApplyRecordWrapper.TenantApplyRecord tenantApplyRecord) {
+
         return this.save(JSON.parseObject(tenantApplyRecord.jsonString(), TenantApplyRecord.class));
     }
 
@@ -63,4 +80,51 @@ public class TenantApplyRecordServiceImpl extends ServiceImpl<TenantApplyRecordM
 
         return this.updateById(JSON.parseObject(tenantApplyRecord.jsonString(), TenantApplyRecord.class));       
     }
+
+    /**
+     * 申请入驻
+     *
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void apply(TenantApplyRecordWrapper.TenantApply tenantApply) {
+
+        // 检测验证码
+        boolean b = smsCodeService.verifyValidCode(tenantApply.getPhone(), tenantApply.getCode(), null);
+        if (!b) {
+            throw new BizException("验证码错误");
+        }
+
+
+        // 根据手机号 判断是否已经有机构账户
+        TenantStaff tenantStaff = tenantStaffService.getByPhone(tenantApply.getPhone());
+        if (tenantStaff != null) {
+            throw new BizException("该手机号已经有机构账户");
+        }
+
+        // 查询申请记录 是否存在正在申请中的
+        TenantApplyRecord record = this.lambdaQuery()
+                .eq(TenantApplyRecord::getPhone, tenantApply.getPhone())
+                .in(TenantApplyRecord::getStatus, AuthStatusEnum.DOING, AuthStatusEnum.UNPASS)
+                .last("limit 1")
+                .one();
+
+        // 保存申请记录
+        TenantApplyRecord tenantApplyRecord = JSON.parseObject(tenantApply.jsonString(), TenantApplyRecord.class);
+        if (record != null) {
+            tenantApplyRecord.setId(record.getId());
+        }
+        tenantApplyRecord.setStatus(AuthStatusEnum.DOING);
+        tenantApplyRecord.setUpdateTime(new Date());
+        this.saveOrUpdate(tenantApplyRecord);
+
+        // 审核人  审核理由 null
+        this.lambdaUpdate()
+                .eq(TenantApplyRecord::getId, tenantApplyRecord.getId())
+                .set(TenantApplyRecord::getVerifyUserId, null)
+                .set(TenantApplyRecord::getReason, null)
+                .update();
+
+
+    }
 }

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

@@ -63,4 +63,10 @@ public class TenantStaffServiceImpl extends ServiceImpl<TenantStaffMapper, Tenan
 
         return this.updateById(JSON.parseObject(tenantStaff.jsonString(), TenantStaff.class));       
     }
+
+    @Override
+    public TenantStaff getByPhone(String phone) {
+        return baseMapper.getByPhone(phone);
+
+    }
 }

+ 31 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/StudentWrapper.java

@@ -9,6 +9,7 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import java.io.Serializable;
+import java.time.LocalDate;
 
 /**
  * 学生封装类
@@ -82,4 +83,34 @@ public class StudentWrapper {
             return this;
         }
     }
+
+    @Data
+    @ApiModel("学生基础信息")
+    public static class Student{
+
+        @ApiModelProperty("id")
+        private Long id;
+
+        @ApiModelProperty("机构ID")
+        private Long tenantId;
+
+        @ApiModelProperty("姓名")
+        private String name;
+
+        @ApiModelProperty("性别。0:女 1:男")
+        private Integer gender;
+
+        @ApiModelProperty("生日")
+        private LocalDate birthdate;
+
+        @ApiModelProperty("手机号码")
+        private String phone;
+
+        @ApiModelProperty("声部,多个用逗号隔开")
+        private String subjectId;
+
+        @ApiModelProperty("是否绑定机构,0:解绑,1:不解绑")
+        private Boolean bindTenant;
+
+    }
 }

+ 75 - 12
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantActivationCodeWrapper.java

@@ -4,6 +4,8 @@ import com.alibaba.fastjson.JSON;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
 import java.util.Optional;
 
 import lombok.AllArgsConstructor;
@@ -20,25 +22,40 @@ import org.apache.commons.lang3.StringUtils;
 public class TenantActivationCodeWrapper {
 
     @Data
-	@Builder
+    @Builder
     @NoArgsConstructor
     @AllArgsConstructor
     @ApiModel(" TenantActivationCodeQuery-机构激活码")
     public static class TenantActivationCodeQuery implements QueryInfo {
-    
-    	@ApiModelProperty("当前页")
+
+        @ApiModelProperty("当前页")
         private Integer page;
-        
+
         @ApiModelProperty("分页行数")
         private Integer rows;
-        
+
         @ApiModelProperty("关键字匹配")
-		private String keyword;
-        
+        private String keyword;
+
+        @ApiModelProperty("机构ID")
+        private Long tenantId;
+
+        @ApiModelProperty("专辑购买ID")
+        private Long tenantAlbumPurchaseId;
+
+        @ApiModelProperty("激活状态")
+        private Boolean activationStatus;
+
+        @ApiModelProperty("激活开始")
+        private Date activationStartTime;
+
+        @ApiModelProperty("激活结束")
+        private Date activationEndTime;
+
         public String getKeyword() {
             return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
         }
-        
+
         public String jsonString() {
             return JSON.toJSONString(this);
         }
@@ -46,11 +63,57 @@ public class TenantActivationCodeWrapper {
         public static TenantActivationCodeQuery from(String json) {
             return JSON.parseObject(json, TenantActivationCodeQuery.class);
         }
-    }  
+    }
 
-	@ApiModel(" TenantActivationCode-机构激活码")
+    @Data
+    @ApiModel(" TenantActivationCode-机构激活码")
     public static class TenantActivationCode {
-        
+
+        @ApiModelProperty("主键ID")
+        private Long id;
+
+        @ApiModelProperty("机构ID")
+        private Long tenantId;
+
+        @ApiModelProperty("机构专辑ID")
+        private Long tenantAlbumId;
+
+        @ApiModelProperty("周期")
+        private Integer purchaseCycle;
+
+        @ApiModelProperty("机构专辑采购ID")
+        private Long tenantAlbumPurchaseId;
+
+        @ApiModelProperty("激活码")
+        private String activationCode;
+
+        @ApiModelProperty("发送状态(WAIT,SEND)")
+        private String sendStatus;
+
+        @ApiModelProperty("激活状态")
+        private Boolean activationStatus;
+
+        @ApiModelProperty("激活手机号")
+        private String activationPhone;
+
+        @ApiModelProperty("激活时间")
+        private Date activationTime;
+
+        @ApiModelProperty("激活用户ID")
+        private Long activationUserId;
+
+        @ApiModelProperty("激活用户名称")
+        private String activationUserName;
+
+        @ApiModelProperty("更新时间")
+        private Date updateTime;
+
+        @ApiModelProperty("创建时间")
+        private Date createTime;
+
+        @ApiModelProperty("激活数量")
+        private Integer activeQuantity;
+
         public String jsonString() {
             return JSON.toJSONString(this);
         }
@@ -58,6 +121,6 @@ public class TenantActivationCodeWrapper {
         public static TenantActivationCode from(String json) {
             return JSON.parseObject(json, TenantActivationCode.class);
         }
-	}
+    }
 
 }

+ 59 - 14
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantAlbumPurchaseWrapper.java

@@ -4,14 +4,16 @@ import com.alibaba.fastjson.JSON;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
-import java.util.Optional;
-
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import org.apache.commons.lang3.StringUtils;
 
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.Optional;
+
 /**
  * 机构专辑采购
  * 2023-07-21 17:32:49
@@ -20,25 +22,31 @@ import org.apache.commons.lang3.StringUtils;
 public class TenantAlbumPurchaseWrapper {
 
     @Data
-	@Builder
+    @Builder
     @NoArgsConstructor
     @AllArgsConstructor
     @ApiModel(" TenantAlbumPurchaseQuery-机构专辑采购")
     public static class TenantAlbumPurchaseQuery implements QueryInfo {
-    
-    	@ApiModelProperty("当前页")
+
+        @ApiModelProperty("当前页")
         private Integer page;
-        
+
         @ApiModelProperty("分页行数")
         private Integer rows;
-        
+
         @ApiModelProperty("关键字匹配")
-		private String keyword;
-        
+        private String keyword;
+
+        @ApiModelProperty("机构ID")
+        private Long tenantId;
+
+        @ApiModelProperty(value = "排序规则", hidden = true)
+        private String orderBy;
+
         public String getKeyword() {
             return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
         }
-        
+
         public String jsonString() {
             return JSON.toJSONString(this);
         }
@@ -46,11 +54,48 @@ public class TenantAlbumPurchaseWrapper {
         public static TenantAlbumPurchaseQuery from(String json) {
             return JSON.parseObject(json, TenantAlbumPurchaseQuery.class);
         }
-    }  
+    }
 
-	@ApiModel(" TenantAlbumPurchase-机构专辑采购")
+    @Data
+    @ApiModel(" TenantAlbumPurchase-机构专辑采购")
     public static class TenantAlbumPurchase {
-        
+
+        @ApiModelProperty("主键ID")
+        private Long id;
+
+        @ApiModelProperty("机构ID")
+        private Long tenantId;
+
+        @ApiModelProperty("机构专辑ID")
+        private Long tenantAlbumId;
+
+        @ApiModelProperty("机构专辑名称")
+        private Long tenantAlbumName;
+
+        @ApiModelProperty("采购时间")
+        private Date purchaseTime;
+
+        @ApiModelProperty("购买数量")
+        private Integer purchaseQuantity;
+
+        @ApiModelProperty("采购周期")
+        private Integer purchaseCycle;
+
+        @ApiModelProperty("激活数量")
+        private Integer activeQuantity;
+
+        @ApiModelProperty("采购价格")
+        private BigDecimal purchasePrice;
+
+        @ApiModelProperty("采购状态")
+        private String purchaseStatus;
+
+        @ApiModelProperty("更新时间")
+        private Date updateTime;
+
+        @ApiModelProperty("创建时间")
+        private Date createTime;
+
         public String jsonString() {
             return JSON.toJSONString(this);
         }
@@ -58,6 +103,6 @@ public class TenantAlbumPurchaseWrapper {
         public static TenantAlbumPurchase from(String json) {
             return JSON.parseObject(json, TenantAlbumPurchase.class);
         }
-	}
+    }
 
 }

+ 44 - 12
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantAlbumWrapper.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+
 import java.util.Optional;
 
 import lombok.AllArgsConstructor;
@@ -20,25 +21,28 @@ import org.apache.commons.lang3.StringUtils;
 public class TenantAlbumWrapper {
 
     @Data
-	@Builder
+    @Builder
     @NoArgsConstructor
     @AllArgsConstructor
     @ApiModel(" TenantAlbumQuery-机构专辑")
     public static class TenantAlbumQuery implements QueryInfo {
-    
-    	@ApiModelProperty("当前页")
+
+        @ApiModelProperty("当前页")
         private Integer page;
-        
+
         @ApiModelProperty("分页行数")
         private Integer rows;
-        
+
         @ApiModelProperty("关键字匹配")
-		private String keyword;
-        
+        private String keyword;
+
+        @ApiModelProperty("机构ID")
+        private Long tenantId;
+
         public String getKeyword() {
             return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
         }
-        
+
         public String jsonString() {
             return JSON.toJSONString(this);
         }
@@ -46,11 +50,11 @@ public class TenantAlbumWrapper {
         public static TenantAlbumQuery from(String json) {
             return JSON.parseObject(json, TenantAlbumQuery.class);
         }
-    }  
+    }
 
-	@ApiModel(" TenantAlbum-机构专辑")
+    @ApiModel(" TenantAlbum-机构专辑")
     public static class TenantAlbum {
-        
+
         public String jsonString() {
             return JSON.toJSONString(this);
         }
@@ -58,6 +62,34 @@ public class TenantAlbumWrapper {
         public static TenantAlbum from(String json) {
             return JSON.parseObject(json, TenantAlbum.class);
         }
-	}
+    }
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" TenantAlbum-机构专辑采购")
+    public static class TenantAlbumBuy {
+
+        @ApiModelProperty("专辑ID")
+        private Long tenantAlbumId;
+
+        @ApiModelProperty("采购数量")
+        private Integer buyNumber;
+
+        @ApiModelProperty("采购周期")
+        private Integer buyCycle;
+
+        public Boolean isValid() {
+            if (this.buyNumber == null || this.buyNumber < 0) {
+                return false;
+            }
+            if (this.buyCycle == null || this.buyCycle < 0 || this.buyCycle % 6 != 0) {
+                return false;
+            }
+            return true;
+        }
+
+    }
 
 }

+ 47 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantApplyRecordWrapper.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.wrapper;
 
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -12,6 +13,8 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 import org.apache.commons.lang3.StringUtils;
 
+import javax.validation.constraints.NotNull;
+
 /**
  * 机构入驻申请记录
  * 2023-07-21 17:32:49
@@ -60,4 +63,48 @@ public class TenantApplyRecordWrapper {
         }
 	}
 
+
+    @Data
+    @ApiModel(" TenantApply-机构入驻申请")
+    public static class TenantApply {
+
+
+
+        @ApiModelProperty("名称")
+        private String name;
+
+        @ApiModelProperty("logo")
+        private String logo;
+
+        @ApiModelProperty("简介")
+        private String briefIntroduction;
+
+        @ApiModelProperty("省份编码")
+        private Integer provinceCode;
+
+        @ApiModelProperty("城市编码")
+        private Integer cityCode;
+
+        @ApiModelProperty("地区/街道")
+        private Integer regionCode;
+
+        @ApiModelProperty("联系人")
+        private String username;
+
+        @ApiModelProperty("手机号")
+        @NotNull(message = "手机号不能为空")
+        private String phone;
+
+        @ApiModelProperty("验证码")
+        @NotNull(message = "验证码不能为空")
+        private String code;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static TenantApplyRecord from(String json) {
+            return JSON.parseObject(json, TenantApplyRecord.class);
+        }
+    }
 }

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

@@ -36,6 +36,6 @@
                     (t1.user_id_ = t2.user_id_ OR t1.friend_id_ = t2.user_id_)
             )
         WHERE t1.user_id_ = #{userId}
-           OR t1.friend_id_ = #{userId}
+        OR t1.friend_id_ = #{userId}
     </delete>
 </mapper>

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

@@ -159,7 +159,14 @@
                 and te.name_ like concat('%',#{param.tenantName},'%')
             </if>
         </where>
-        order by t.create_time_ desc
+        <choose>
+            <when test="param.orderBy != null and param.orderBy.trim() != ''">
+                order by #{param.orderBy}
+            </when>
+            <otherwise>
+                order by t.create_time_ desc
+            </otherwise>
+        </choose>
     </select>
 
     <select id="querySubject" resultMap="com.yonge.cooleshow.biz.dal.dao.SubjectDao.Subject">

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

@@ -182,7 +182,14 @@
                 and te.name_ like concat('%',#{param.tenantName},'%')
             </if>
         </where>
-        order by t.create_time_ desc
+        <choose>
+            <when test="param.orderBy != null and param.orderBy.trim() != ''">
+                order by #{param.orderBy}
+            </when>
+            <otherwise>
+                order by t.create_time_ desc
+            </otherwise>
+        </choose>
     </select>
 
 	<resultMap id="BasicUserInfo" type="com.yonge.cooleshow.biz.dal.dto.BasicUserInfo">

+ 34 - 12
cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantActivationCodeMapper.xml

@@ -1,12 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE  mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
 <mapper namespace="com.yonge.cooleshow.biz.dal.mapper.TenantActivationCodeMapper">
-
-	 
-    
     <!-- 表字段 -->
     <sql id="baseColumns">
-         t.id_ AS id
+        t.id_ AS id
         , t.tenant_id_ AS tenantId
         , t.tenant_album_id_ AS tenantAlbumId
         , t.tenant_album_purchase_id_ AS tenantAlbumPurchaseId
@@ -18,12 +15,37 @@
         , t.activation_user_id_ AS activationUserId
         , t.update_time_ AS updateTime
         , t.create_time_ AS createTime
-        </sql> 
-    
-    <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.entity.TenantActivationCode">
-		SELECT         
-        	<include refid="baseColumns" />
-		FROM tenant_activation_code t
-	</select>
-    
+    </sql>
+
+    <select id="selectPage"
+            resultType="com.yonge.cooleshow.biz.dal.wrapper.TenantActivationCodeWrapper$TenantActivationCode">
+        SELECT
+        <include refid="baseColumns"/>, ta.purchase_cycle_ as purchaseCycle, su.username_ as activationUserName
+        FROM tenant_activation_code t
+        LEFT JOIN tenant_album ta on t.tenant_album_id_ = ta.id_
+        LEFT JOIN sys_user su on t.active_user_id = su.id_
+        <where>
+            <if test="param.keyword != null and param.keyword.trim() != ''">
+                AND (
+                t.activation_code_ like concat ('%',#{param.keyword},'%') or
+                su.username_ like concat ('%',#{param.keyword},'%')
+                )
+            </if>
+            <if test="param.tenantId != null">
+                AND t.tenant_id_ = #{param.tenantId}
+            </if>
+            <if test="param.tenantAlbumPurchaseId != null">
+                AND t.tenant_album_purchase_id_ = #{param.tenantAlbumPurchaseId}
+            </if>
+            <if test="param.activationStatus != null">
+                AND t.activation_status_ = #{param.activationStatus}
+            </if>
+            <if test="param.activationStartTime != null">
+                AND t.activation_time_ >= #{param.activationStartTime}
+            </if>
+            <if test="param.activationEndTime != null">
+                AND #{param.activationEndTime} >= t.activation_time_
+            </if>
+        </where>
+    </select>
 </mapper>

+ 2 - 2
cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantAlbumMapper.xml

@@ -7,8 +7,8 @@
     <!-- 表字段 -->
     <sql id="baseColumns">
          t.id_ AS id
-        , t.name_ AS name
-        , t.describe_ AS describe
+        , t.name_ AS `name`
+        , t.describe_ AS `describe`
         , t.cover_img_ AS coverImg
         , t.music_num_ AS musicNum
         , t.original_price_ AS originalPrice

+ 17 - 7
cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantAlbumPurchaseMapper.xml

@@ -17,12 +17,22 @@
         , t.purchase_status_ AS purchaseStatus
         , t.update_time_ AS updateTime
         , t.create_time_ AS createTime
-        </sql> 
-    
-    <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.entity.TenantAlbumPurchase">
-		SELECT         
-        	<include refid="baseColumns" />
-		FROM tenant_album_purchase t
-	</select>
+        </sql>
+
+    <select id="selectPage"
+            resultType="com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumPurchaseWrapper$TenantAlbumPurchase">
+        SELECT
+        <include refid="baseColumns"/>,ta.name_ as tenantAlbumName
+        FROM tenant_album_purchase t
+        LEFT JOIN tenant_album ta on t.tenant_album_id_ = ta.id_
+        <choose>
+            <when test="param.orderBy != null and param.orderBy.trim() != ''">
+                order by #{param.orderBy}
+            </when>
+            <otherwise>
+                order by t.id_ desc
+            </otherwise>
+        </choose>
+    </select>
     
 </mapper>

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

@@ -27,5 +27,11 @@
         	<include refid="baseColumns" />
 		FROM tenant_staff t
 	</select>
-    
+
+    <select id="getByPhone" resultType="com.yonge.cooleshow.biz.dal.entity.TenantStaff">
+        select *
+        from tenant_staff t
+        left join sys_user t1 on t1.id_ = t.user_id_
+        where t1.phone_ = #{phone}
+    </select>
 </mapper>

+ 99 - 0
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/StudentController.java

@@ -0,0 +1,99 @@
+package com.yonge.cooleshow.tenant.controller;
+
+import com.alibaba.fastjson.JSON;
+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.search.StudentSearch;
+import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
+import com.yonge.cooleshow.biz.dal.service.StudentService;
+import com.yonge.cooleshow.biz.dal.service.SysUserService;
+import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
+import com.yonge.cooleshow.biz.dal.vo.StudentVo;
+import com.yonge.cooleshow.biz.dal.wrapper.StudentWrapper;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+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.page.PageInfo;
+import com.yonge.toolset.mybatis.support.PageUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+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 java.util.List;
+
+@RestController
+@RequestMapping("/student")
+@Api(value = "学生表", tags = "学生表")
+public class StudentController extends BaseController {
+    @Autowired
+    private StudentService studentService;
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private TenantInfoService tenantInfoService;
+
+    @GetMapping("/detail/{id}")
+    @ApiOperation(value = "详情", notes = "传入id")
+    public HttpResponseResult<StudentVo> detail(@PathVariable("id") Long id) {
+        StudentVo detail = studentService.detail(id);
+        return succeed(detail);
+    }
+
+    @PostMapping("/page")
+    @ApiOperation(value = "查询分页", notes = "传入StudentSearch")
+    public HttpResponseResult<PageInfo<StudentVo>> page(@RequestBody StudentSearch query) {
+        TenantInfo tenantInfo = getTenantInfo();
+        query.setTenantId(tenantInfo.getId());
+        query.setDelFlag(YesOrNoEnum.NO);
+        query.setOrderBy("t.username desc");
+
+        IPage<StudentVo> pages = studentService.selectPage(PageUtil.getPage(query), query);
+        List<StudentVo> rows = pages.getRecords();
+
+        for (StudentVo vo : rows) {
+            if (vo.getDelFlag() == YesOrNoEnum.YES) {
+                vo.setUserStatus(UserStatusEnum.CLOSED);
+            } else {
+                if (vo.getLockFlag() == UserLockFlag.LOCKED) {
+                    vo.setUserStatus(UserStatusEnum.LOCKED);
+                } else {
+                    vo.setUserStatus(UserStatusEnum.NORMAL);
+                }
+            }
+        }
+        return succeed(PageUtil.pageInfo(pages));
+    }
+
+    @PostMapping("/save")
+    @ApiOperation(value = "新增/修改", notes = "传入Student")
+    public HttpResponseResult<Boolean> save(
+            @Validated @RequestBody com.yonge.cooleshow.tenant.vo.StudentVo.Student student) {
+        TenantInfo tenantInfo = getTenantInfo();
+        StudentWrapper.Student studentInfo = JSON.parseObject(JSON.toJSONString(student), StudentWrapper.Student.class);
+        studentInfo.setTenantId(tenantInfo.getId());
+        studentService.save(studentInfo);
+        return succeed();
+    }
+
+    private TenantInfo getTenantInfo() {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        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("非法请求");
+        }
+        return tenantInfo;
+    }
+}

+ 9 - 9
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/SysAreaController.java

@@ -5,11 +5,11 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.google.common.collect.Lists;
 import com.microsvc.toolkit.common.response.paging.PageInfo;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
-import com.microsvc.toolkit.common.response.template.R;
 import com.microsvc.toolkit.common.webportal.exception.BizException;
 import com.yonge.cooleshow.biz.dal.entity.SysArea;
 import com.yonge.cooleshow.biz.dal.service.SysAreaService;
 import com.yonge.cooleshow.biz.dal.wrapper.SysAreaWrapper;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.tenant.io.request.SysAreaVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -44,9 +44,9 @@ public class SysAreaController {
             @ApiImplicitParam(name = "id", value = "id", dataType = "long")
     })
     @GetMapping("/detail/{id}")
-    public R<SysAreaWrapper.SysArea> detail(@PathVariable("id") Long id) {
+    public HttpResponseResult<SysAreaWrapper.SysArea> detail(@PathVariable("id") Long id) {
 
-        return R.from(sysAreaService.detail(id));
+        return HttpResponseResult.succeed(sysAreaService.detail(id));
 	}
 
 	/**
@@ -56,7 +56,7 @@ public class SysAreaController {
 	 */
 	@ApiOperation(value = "根据code查询", notes = "传入code")
     @GetMapping("/queryByCode/{code}")
-    public R<SysArea> queryByCode(@PathVariable("code") Integer code) {
+    public HttpResponseResult<SysArea> queryByCode(@PathVariable("code") Integer code) {
 
 		List<Integer> codeList = new ArrayList<Integer>();
 		codeList.add(code);
@@ -66,7 +66,7 @@ public class SysAreaController {
 			throw BizException.from("根据code查询区域表失败");
 		}
 
-        return R.from(list.get(0));
+        return HttpResponseResult.succeed(list.get(0));
 	}
 
     /**
@@ -77,11 +77,11 @@ public class SysAreaController {
     @ApiOperation(value = "查询分页", notes = "传入sysAreaSearch")
     @PreAuthorize("@auditsvc.hasPermissions('sysArea/page', {'BACKEND'})")
     @PostMapping("/page")
-    public R<PageInfo<SysAreaWrapper.SysArea>> page(@RequestBody SysAreaWrapper.SysAreaQuery query) {
+    public HttpResponseResult<PageInfo<SysAreaWrapper.SysArea>> page(@RequestBody SysAreaWrapper.SysAreaQuery query) {
 
         IPage<SysAreaWrapper.SysArea> pages = sysAreaService.selectPage(QueryInfo.getPage(query), query);
 
-        return R.from(QueryInfo.pageInfo(pages));
+        return HttpResponseResult.succeed(QueryInfo.pageInfo(pages));
 	}
 
     /**
@@ -90,7 +90,7 @@ public class SysAreaController {
      */
     @ApiOperation(value = "查询全部区域", notes = "查询全部区域")
     @GetMapping("/queryAllProvince")
-    public R<List<SysAreaVo.Province>> queryAllProvince() {
+    public HttpResponseResult<List<SysAreaVo.Province>> queryAllProvince() {
 
         List<SysAreaVo.Province> provinces = Lists.newArrayList();
 
@@ -119,6 +119,6 @@ public class SysAreaController {
             }
         }
 
-        return R.from(provinces);
+        return HttpResponseResult.succeed(provinces);
     }
 }

+ 131 - 0
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TeacherController.java

@@ -0,0 +1,131 @@
+package com.yonge.cooleshow.tenant.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.microsvc.toolkit.common.webportal.exception.BizException;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dto.req.TeacherSubmitReq;
+import com.yonge.cooleshow.biz.dal.dto.search.TeacherSearch;
+import com.yonge.cooleshow.biz.dal.entity.Teacher;
+import com.yonge.cooleshow.biz.dal.entity.TeacherStyleVideo;
+import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
+import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
+import com.yonge.cooleshow.biz.dal.service.TeacherService;
+import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
+import com.yonge.cooleshow.biz.dal.vo.TeacherVo;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+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.page.PageInfo;
+import com.yonge.toolset.mybatis.support.PageUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+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;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@RestController
+@RequestMapping("/teacher")
+@Api(value = "教师表", tags = "教师表")
+public class TeacherController extends BaseController {
+
+    @Autowired
+    private TeacherService teacherService;
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private TenantInfoService tenantInfoService;
+
+    /**
+     * 查询单条
+     */
+    @GetMapping("/detail/{id}")
+    @ApiOperation(value = "详情", notes = "传入id")
+    public HttpResponseResult<TeacherVo> detail(@PathVariable("id") Long userId) {
+        TenantInfo tenantInfo = getTenantInfo();
+
+        TeacherVo detail = teacherService.findTeacherDetailInfo(userId);
+        if (detail == null) {
+            throw new BizException("数据不存在");
+        }
+        if (tenantInfo.getId().equals(detail.getTenantId())) {
+            throw new BizException("非法请求");
+        }
+        if (!CollectionUtils.isEmpty(detail.getStyleVideo())) {
+            List<TeacherStyleVideo> styleVideo = detail.getStyleVideo();
+            List<TeacherStyleVideo> collect =
+                    styleVideo.stream().filter(o -> AuthStatusEnum.PASS.equals(o.getAuthStatus())).collect(Collectors.toList());
+            detail.setStyleVideo(collect);
+        }
+        return succeed(detail);
+    }
+
+    /**
+     * 查询分页
+     */
+    @PostMapping("/page")
+    @ApiOperation(value = "查询分页", notes = "传入teacher")
+    public HttpResponseResult<PageInfo<TeacherVo>> page(@RequestBody TeacherSearch query) {
+        TenantInfo tenantInfo = getTenantInfo();
+        query.setTenantId(tenantInfo.getId());
+        query.setDelFlag(YesOrNoEnum.NO);
+        query.setOrderBy("t.username desc");
+
+        IPage<TeacherVo> pages = teacherService.selectPage(PageUtil.getPage(query), query);
+        List<TeacherVo> rows = pages.getRecords();
+
+        for (TeacherVo vo : rows) {
+            if (vo.getDelFlag() == YesOrNoEnum.YES) {
+                vo.setUserStatus(UserStatusEnum.CLOSED);
+            } else {
+                if (vo.getLockFlag() == UserLockFlag.LOCKED) {
+                    vo.setUserStatus(UserStatusEnum.LOCKED);
+                } else {
+                    vo.setUserStatus(UserStatusEnum.NORMAL);
+                }
+            }
+        }
+        return succeed(PageUtil.pageInfo(pages));
+    }
+
+    /**
+     * 新增或修改
+     */
+    @PostMapping("/submit")
+    @ApiOperation(value = "新增或修改", notes = "传入teacher")
+    public HttpResponseResult<Boolean> submit(@Valid @RequestBody TeacherSubmitReq teacherSubmitReq) {
+        TenantInfo tenantInfo = getTenantInfo();
+        if (teacherSubmitReq.getUserId() != null) {
+            Teacher teacher = teacherService.lambdaQuery().eq(Teacher::getUserId, teacherSubmitReq.getUserId())
+                    .eq(Teacher::getTenantId, tenantInfo.getId()).last("limit 1").one();
+            if (teacher == null) {
+                throw new BizException("老师不存在");
+            }
+        }
+        teacherSubmitReq.setTenantId(tenantInfo.getId());
+        return teacherService.submit(teacherSubmitReq);
+    }
+
+    private TenantInfo getTenantInfo() {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        TenantInfo tenantInfo = tenantInfoService.lambdaQuery().eq(TenantInfo::getUserId, sysUser.getId())
+                .last("limit 1").one();
+        if (tenantInfo == null) {
+            throw new BizException("非法请求");
+        }
+        return tenantInfo;
+    }
+}

+ 134 - 0
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TenantActivationCodeController.java

@@ -0,0 +1,134 @@
+package com.yonge.cooleshow.tenant.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.microsvc.toolkit.common.response.paging.PageInfo;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.microsvc.toolkit.common.response.template.R;
+import com.microsvc.toolkit.common.webportal.exception.BizException;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.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.TenantInfo;
+import com.yonge.cooleshow.biz.dal.service.TenantActivationCodeService;
+import com.yonge.cooleshow.biz.dal.service.TenantAlbumPurchaseService;
+import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantActivationCodeWrapper;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.tenant.vo.TenantActivationCodeVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PathVariable;
+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.RestController;
+
+
+@Slf4j
+@Validated
+@RestController
+@RequestMapping("/tenantActivationCode")
+@Api(tags = "机构激活码")
+public class TenantActivationCodeController extends BaseController {
+
+    @Autowired
+    private TenantActivationCodeService tenantActivationCodeService;
+
+    @Autowired
+    private TenantAlbumPurchaseService tenantAlbumPurchaseService;
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private TenantInfoService tenantInfoService;
+
+    @ApiOperation(value = "详情", notes = "机构激活码-根据详情ID查询单条, 传入id")
+//    @GetMapping("/detail/{id}")
+    public R<TenantActivationCodeVo.TenantActivationCode> detail(@PathVariable("id") Long id) {
+
+        TenantActivationCode wrapper = tenantActivationCodeService.detail(id);
+
+        return R.from(TenantActivationCodeVo.TenantActivationCode.from(JSON.toJSONString(wrapper)));
+    }
+
+    @ApiOperation(value = "查询分页", notes = "机构激活码- 传入 TenantActivationCodeVo.TenantActivationCodeQuery")
+    @PostMapping("/page")
+    public HttpResponseResult<PageInfo<TenantActivationCodeWrapper.TenantActivationCode>> page(
+            @RequestBody TenantActivationCodeWrapper.TenantActivationCodeQuery query) {
+        TenantInfo tenantInfo = getTenantInfo();
+        query.setTenantId(tenantInfo.getId());
+        // 查询数据
+        IPage<TenantActivationCodeWrapper.TenantActivationCode> pages =
+                tenantActivationCodeService.selectPage(QueryInfo.getPage(query), query);
+        PageInfo<TenantActivationCodeWrapper.TenantActivationCode> pageInfo = QueryInfo.pageInfo(pages,
+                pages.getRecords());
+
+        if (query.getTenantAlbumPurchaseId() != null) {
+            TenantActivationCodeWrapper.TenantActivationCode extra =
+                    new TenantActivationCodeWrapper.TenantActivationCode();
+            TenantAlbumPurchase purchase = tenantAlbumPurchaseService.getById(query.getTenantAlbumPurchaseId());
+            extra.setActiveQuantity(purchase.getActiveQuantity());
+            pageInfo.setExtra(extra);
+        }
+
+        return succeed(pageInfo);
+    }
+
+    @ApiOperation(value = "激活码发放", notes = "机构激活码- 传入 TenantActivationCodeVo.TenantActivationCodeSend")
+    @PostMapping("/send")
+    public HttpResponseResult<Boolean> send(@Validated @RequestBody TenantActivationCodeVo.TenantActivationCodeSend send) {
+        TenantInfo tenantInfo = getTenantInfo();
+        tenantActivationCodeService.sendActivationCode(tenantInfo.getId(), send.getTenantAlbumPurchaseId(),
+                send.getActivationCodeList(),
+                send.getStudentIdList());
+        return succeed();
+    }
+
+    @ApiOperation(value = "新增", notes = "机构激活码- 传入 TenantActivationCodeVo.TenantActivationCode")
+//    @PostMapping("/save")
+    public R<JSONObject> add(@Validated @RequestBody TenantActivationCodeVo.TenantActivationCode tenantActivationCodeVo) {
+
+        // 新增数据
+        tenantActivationCodeService.save(JSON.parseObject(tenantActivationCodeVo.jsonString(),
+                TenantActivationCode.class));
+
+        return R.defaultR();
+    }
+
+    @ApiOperation(value = "修改", notes = "机构激活码- 传入 TenantActivationCodeVo.TenantActivationCode")
+//    @PostMapping("/update")
+    public R<JSONObject> update(@Validated @RequestBody TenantActivationCodeVo.TenantActivationCode tenantActivationCodeVo) {
+
+        // 更新数据
+        tenantActivationCodeService.updateById(JSON.parseObject(tenantActivationCodeVo.jsonString(),
+                TenantActivationCode.class));
+
+        return R.defaultR();
+    }
+
+    @ApiOperation(value = "删除", notes = "机构激活码- 传入id")
+//    @PostMapping("/remove")
+    public R<Boolean> remove(@RequestParam Long id) {
+
+        return R.from(tenantActivationCodeService.removeById(id));
+    }
+
+    private TenantInfo getTenantInfo() {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        TenantInfo tenantInfo = tenantInfoService.lambdaQuery().eq(TenantInfo::getUserId, sysUser.getId())
+                .last("limit 1").one();
+        if (tenantInfo == null) {
+            throw new BizException("非法请求");
+        }
+        return tenantInfo;
+    }
+}

+ 117 - 0
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TenantAlbumController.java

@@ -0,0 +1,117 @@
+package com.yonge.cooleshow.tenant.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.microsvc.toolkit.common.response.paging.PageInfo;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.microsvc.toolkit.common.webportal.exception.BizException;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.entity.TenantAlbum;
+import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
+import com.yonge.cooleshow.biz.dal.service.TenantAlbumService;
+import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumWrapper;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.tenant.vo.TenantAlbumVo;
+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.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PathVariable;
+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.RestController;
+
+import java.util.List;
+
+@Slf4j
+@Validated
+@RestController
+@RequestMapping("/tenantAlbum")
+@Api(tags = "机构专辑")
+public class TenantAlbumController extends BaseController {
+
+    @Autowired
+    private TenantAlbumService tenantAlbumService;
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private TenantInfoService tenantInfoService;
+
+    @ApiOperation(value = "详情", notes = "机构专辑-根据详情ID查询单条, 传入id")
+//    @GetMapping("/detail/{id}")
+    public HttpResponseResult<TenantAlbumVo.TenantAlbum> detail(@PathVariable("id") Long id) {
+        TenantAlbum wrapper = tenantAlbumService.detail(id);
+        return succeed(TenantAlbumVo.TenantAlbum.from(JSON.toJSONString(wrapper)));
+    }
+
+    @ApiOperation(value = "查询分页", notes = "机构专辑- 传入 TenantAlbumVo.TenantAlbumQuery")
+    @PostMapping("/page")
+    public HttpResponseResult<PageInfo<TenantAlbumVo.TenantAlbum>> page(@RequestBody TenantAlbumWrapper.TenantAlbumQuery query) {
+        TenantInfo tenantInfo = getTenantInfo();
+        query.setTenantId(tenantInfo.getId());
+        // 查询数据
+        IPage<TenantAlbum> pages = tenantAlbumService.selectPage(QueryInfo.getPage(query), query);
+        // 数据类型转换
+        List<TenantAlbumVo.TenantAlbum> records = JSON.parseArray(JSON.toJSONString(pages.getRecords()),
+                TenantAlbumVo.TenantAlbum.class);
+        return succeed(QueryInfo.pageInfo(pages, records));
+    }
+
+    @ApiOperation(value = "采购专辑", notes = "机构专辑- 传入 TenantAlbumVo.TenantAlbumQuery")
+    @PostMapping("/buyAlbum")
+    public HttpResponseResult<Boolean> buyAlbum(@RequestBody TenantAlbumWrapper.TenantAlbumBuy buy) {
+        // todo 订单接入
+        return succeed();
+    }
+
+    @ApiOperation(value = "新增", notes = "机构专辑- 传入 TenantAlbumVo.TenantAlbum")
+//    @PostMapping("/add")
+    public HttpResponseResult<JSONObject> add(@Validated @RequestBody TenantAlbumVo.TenantAlbum tenantAlbumVo) {
+
+        // 新增数据
+        tenantAlbumService.save(JSON.parseObject(tenantAlbumVo.jsonString(), TenantAlbum.class));
+        return succeed();
+    }
+
+    @ApiOperation(value = "修改", notes = "机构专辑- 传入 TenantAlbumVo.TenantAlbum")
+//    @PostMapping("/update")
+    public HttpResponseResult<JSONObject> update(@Validated @RequestBody TenantAlbumVo.TenantAlbum tenantAlbumVo) {
+
+        // 更新数据
+        tenantAlbumService.updateById(JSON.parseObject(tenantAlbumVo.jsonString(), TenantAlbum.class));
+        return succeed();
+    }
+
+    @ApiOperation(value = "删除", notes = "机构专辑- 传入id")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "id", dataType = "long")
+    })
+    @PreAuthorize("@auditsvc.hasPermissions('tenantAlbum/remove', {'BACKEND'})")
+//    @PostMapping("/remove")
+    public HttpResponseResult<Boolean> remove(@RequestParam Long id) {
+        return HttpResponseResult.succeed(tenantAlbumService.removeById(id));
+    }
+
+    private TenantInfo getTenantInfo() {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        TenantInfo tenantInfo = tenantInfoService.lambdaQuery().eq(TenantInfo::getUserId, sysUser.getId())
+                .last("limit 1").one();
+        if (tenantInfo == null) {
+            throw new BizException("非法请求");
+        }
+        return tenantInfo;
+    }
+
+}

+ 117 - 0
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TenantAlbumPurchaseController.java

@@ -0,0 +1,117 @@
+package com.yonge.cooleshow.tenant.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.microsvc.toolkit.common.response.paging.PageInfo;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.microsvc.toolkit.common.webportal.exception.BizException;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.entity.TenantAlbumPurchase;
+import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
+import com.yonge.cooleshow.biz.dal.service.TenantAlbumPurchaseService;
+import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumPurchaseWrapper;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.tenant.vo.TenantAlbumPurchaseVo;
+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.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PathVariable;
+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.RestController;
+
+
+@Slf4j
+@Validated
+@RestController
+@RequestMapping("/tenantAlbumPurchase")
+@Api(tags = "机构专辑采购")
+public class TenantAlbumPurchaseController extends BaseController {
+
+    @Autowired
+    private TenantAlbumPurchaseService tenantAlbumPurchaseService;
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private TenantInfoService tenantInfoService;
+
+    @ApiOperation(value = "详情", notes = "机构专辑采购-根据详情ID查询单条, 传入id")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "id", dataType = "long")
+    })
+    @PreAuthorize("@auditsvc.hasPermissions('tenantAlbumPurchase/detail', {'BACKEND'})")
+//    @GetMapping("/detail/{id}")
+    public HttpResponseResult<TenantAlbumPurchaseWrapper.TenantAlbumPurchase> detail(@PathVariable("id") Long id) {
+
+        TenantAlbumPurchase wrapper = tenantAlbumPurchaseService.detail(id);
+
+        return succeed(TenantAlbumPurchaseWrapper.TenantAlbumPurchase.from(JSON.toJSONString(wrapper)));
+    }
+
+    @ApiOperation(value = "查询分页", notes = "机构专辑采购- 传入 TenantAlbumPurchaseVo.TenantAlbumPurchaseQuery")
+    @PreAuthorize("@auditsvc.hasPermissions('tenantAlbumPurchase/page', {'BACKEND'})")
+    @PostMapping("/page")
+    public HttpResponseResult<PageInfo<TenantAlbumPurchaseWrapper.TenantAlbumPurchase>> page(
+            @RequestBody TenantAlbumPurchaseWrapper.TenantAlbumPurchaseQuery query) {
+        TenantInfo tenantInfo = getTenantInfo();
+        query.setTenantId(tenantInfo.getId());
+        // 查询数据
+        IPage<TenantAlbumPurchaseWrapper.TenantAlbumPurchase> pages =
+                tenantAlbumPurchaseService.selectPage(QueryInfo.getPage(query), query);
+        return succeed(QueryInfo.pageInfo(pages, pages.getRecords()));
+    }
+
+    @ApiOperation(value = "新增", notes = "机构专辑采购- 传入 TenantAlbumPurchaseVo.TenantAlbumPurchase")
+    @PreAuthorize("@auditsvc.hasPermissions('tenantAlbumPurchase/save', {'BACKEND'})")
+//    @PostMapping("/save")
+    public HttpResponseResult<JSONObject> add(
+            @Validated @RequestBody TenantAlbumPurchaseVo.TenantAlbumPurchase tenantAlbumPurchaseVo) {
+
+        // 新增数据
+        tenantAlbumPurchaseService.save(JSON.parseObject(tenantAlbumPurchaseVo.jsonString(),
+                TenantAlbumPurchase.class));
+        return succeed();
+    }
+
+    @ApiOperation(value = "修改", notes = "机构专辑采购- 传入 TenantAlbumPurchaseVo.TenantAlbumPurchase")
+    @PreAuthorize("@auditsvc.hasPermissions('tenantAlbumPurchase/update', {'BACKEND'})")
+//    @PostMapping("/update")
+    public HttpResponseResult<JSONObject> update(@Validated @RequestBody TenantAlbumPurchaseVo.TenantAlbumPurchase tenantAlbumPurchaseVo
+    ) {
+        // 更新数据
+        tenantAlbumPurchaseService.updateById(JSON.parseObject(tenantAlbumPurchaseVo.jsonString(),
+                TenantAlbumPurchase.class));
+        return succeed();
+    }
+
+    @ApiOperation(value = "删除", notes = "机构专辑采购- 传入id")
+    @PreAuthorize("@auditsvc.hasPermissions('tenantAlbumPurchase/remove', {'BACKEND'})")
+//    @PostMapping("/remove")
+    public HttpResponseResult<Boolean> remove(@RequestParam Long id) {
+
+        return succeed(tenantAlbumPurchaseService.removeById(id));
+    }
+
+    private TenantInfo getTenantInfo() {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        TenantInfo tenantInfo = tenantInfoService.lambdaQuery().eq(TenantInfo::getUserId, sysUser.getId())
+                .last("limit 1").one();
+        if (tenantInfo == null) {
+            throw new BizException("非法请求");
+        }
+        return tenantInfo;
+    }
+}

+ 47 - 0
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/open/OpenStudentController.java

@@ -0,0 +1,47 @@
+package com.yonge.cooleshow.tenant.controller.open;
+
+import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
+import com.yonge.cooleshow.biz.dal.service.StudentService;
+import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
+import com.yonge.cooleshow.biz.dal.wrapper.StudentWrapper;
+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.validation.annotation.Validated;
+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;
+
+@RestController
+@RequestMapping("/open/student")
+@Api(value = "学生表", tags = "学生表")
+public class OpenStudentController extends BaseController {
+    @Autowired
+    private StudentService studentService;
+
+    @Autowired
+    private TenantInfoService tenantInfoService;
+
+    @PostMapping("/save")
+    @ApiOperation(value = "新增/修改", notes = "传入Student")
+    public HttpResponseResult<Boolean> save(
+            @Validated @RequestBody com.yonge.cooleshow.tenant.vo.StudentVo.Student student) {
+        Long tenantId = student.getTenantId();
+        if (tenantId == null) {
+            throw new BizException("未指定机构");
+        }
+        TenantInfo tenantInfo = tenantInfoService.getById(tenantId);
+        if (tenantInfo == null) {
+            throw new BizException("机构不存在");
+        }
+        StudentWrapper.Student studentInfo = JSON.parseObject(JSON.toJSONString(student), StudentWrapper.Student.class);
+        studentInfo.setTenantId(tenantInfo.getId());
+        studentService.save(studentInfo);
+        return succeed();
+    }
+}

+ 38 - 38
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/open/OpenSysAreaController.java

@@ -1,15 +1,15 @@
-package com.yonge.cooleshow.tenant.controller.open;
+package com.yonge.cooleshow.tenant.controller;
 
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.google.common.collect.Lists;
 import com.microsvc.toolkit.common.response.paging.PageInfo;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
-import com.microsvc.toolkit.common.response.template.R;
 import com.microsvc.toolkit.common.webportal.exception.BizException;
 import com.yonge.cooleshow.biz.dal.entity.SysArea;
 import com.yonge.cooleshow.biz.dal.service.SysAreaService;
 import com.yonge.cooleshow.biz.dal.wrapper.SysAreaWrapper;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.tenant.io.request.SysAreaVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -34,55 +34,55 @@ public class OpenSysAreaController {
     @Autowired
     private SysAreaService sysAreaService;
 
-	/**
-	 * 查询单条
-	 * @param id 详情ID
-	 * @return R<SysAreaVo.SysArea>
-	 */
-	@ApiOperation(value = "详情", notes = "传入id")
+    /**
+     * 查询单条
+     * @param id 详情ID
+     * @return R<SysAreaVo.SysArea>
+     */
+    @ApiOperation(value = "详情", notes = "传入id")
     @ApiImplicitParams({
             @ApiImplicitParam(name = "id", value = "id", dataType = "long")
     })
     @GetMapping("/detail/{id}")
-    public R<SysAreaWrapper.SysArea> detail(@PathVariable("id") Long id) {
+    public HttpResponseResult<SysAreaWrapper.SysArea> detail(@PathVariable("id") Long id) {
 
-        return R.from(sysAreaService.detail(id));
-	}
+        return HttpResponseResult.succeed(sysAreaService.detail(id));
+    }
 
-	/**
-	 * 根据code查询
-	 * @param code 详情ID
-	 * @return R<SysAreaVo.SysArea>
-	 */
-	@ApiOperation(value = "根据code查询", notes = "传入code")
+    /**
+     * 根据code查询
+     * @param code 详情ID
+     * @return R<SysAreaVo.SysArea>
+     */
+    @ApiOperation(value = "根据code查询", notes = "传入code")
     @GetMapping("/queryByCode/{code}")
-    public R<SysArea> queryByCode(@PathVariable("code") Integer code) {
+    public HttpResponseResult<SysArea> queryByCode(@PathVariable("code") Integer code) {
 
-		List<Integer> codeList = new ArrayList<Integer>();
-		codeList.add(code);
-		List<SysArea> list = sysAreaService.queryByCodes(codeList);
+        List<Integer> codeList = new ArrayList<Integer>();
+        codeList.add(code);
+        List<SysArea> list = sysAreaService.queryByCodes(codeList);
 
-		if(list == null || list.size() == 0){
-			throw BizException.from("根据code查询区域表失败");
-		}
+        if(list == null || list.size() == 0){
+            throw BizException.from("根据code查询区域表失败");
+        }
 
-        return R.from(list.get(0));
-	}
+        return HttpResponseResult.succeed(list.get(0));
+    }
 
     /**
-	 * 查询分页
-	 * @param query SysAreaVo.SysAreaQuery
-	 * @return R<PageInfo<SysAreaVo.SysAreaList>>
-	 */
+     * 查询分页
+     * @param query SysAreaVo.SysAreaQuery
+     * @return R<PageInfo<SysAreaVo.SysAreaList>>
+     */
     @ApiOperation(value = "查询分页", notes = "传入sysAreaSearch")
     @PreAuthorize("@auditsvc.hasPermissions('sysArea/page', {'BACKEND'})")
     @PostMapping("/page")
-    public R<PageInfo<SysAreaWrapper.SysArea>> page(@RequestBody SysAreaWrapper.SysAreaQuery query) {
+    public HttpResponseResult<PageInfo<SysAreaWrapper.SysArea>> page(@RequestBody SysAreaWrapper.SysAreaQuery query) {
 
         IPage<SysAreaWrapper.SysArea> pages = sysAreaService.selectPage(QueryInfo.getPage(query), query);
 
-        return R.from(QueryInfo.pageInfo(pages));
-	}
+        return HttpResponseResult.succeed(QueryInfo.pageInfo(pages));
+    }
 
     /**
      * 查询全部区域
@@ -90,21 +90,21 @@ public class OpenSysAreaController {
      */
     @ApiOperation(value = "查询全部区域", notes = "查询全部区域")
     @GetMapping("/queryAllProvince")
-    public R<List<SysAreaVo.Province>> queryAllProvince() {
+    public HttpResponseResult<List<SysAreaVo.Province>> queryAllProvince() {
 
         List<SysAreaVo.Province> provinces = Lists.newArrayList();
 
         // 全部城市信息
         Map<Integer, List<SysArea>> areaMap = sysAreaService.lambdaQuery().list().stream()
-            .filter(x -> x.getDelFlag().equals("0"))
-            .collect(Collectors.groupingBy(SysArea::getParentOrganId));
+                .filter(x -> x.getDelFlag().equals("0"))
+                .collect(Collectors.groupingBy(SysArea::getParentOrganId));
 
         SysAreaVo.Province provinceVo;
         SysAreaVo.City cityVo;
         for (SysArea province : areaMap.get(0)) {
 
             provinceVo = JSON.parseObject(JSON.toJSONString(province), SysAreaVo.Province.class)
-                .cities(Lists.newArrayList());
+                    .cities(Lists.newArrayList());
             provinces.add(provinceVo);
 
             // 城市信息
@@ -119,6 +119,6 @@ public class OpenSysAreaController {
             }
         }
 
-        return R.from(provinces);
+        return HttpResponseResult.succeed(provinces);
     }
 }

+ 53 - 0
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/open/OpenTenantController.java

@@ -0,0 +1,53 @@
+package com.yonge.cooleshow.tenant.controller.open;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.google.common.collect.Lists;
+import com.microsvc.toolkit.common.response.paging.PageInfo;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.yonge.cooleshow.biz.dal.entity.SysArea;
+import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
+import com.yonge.cooleshow.biz.dal.service.SysAreaService;
+import com.yonge.cooleshow.biz.dal.service.TenantApplyRecordService;
+import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
+import com.yonge.cooleshow.biz.dal.wrapper.StudentWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.SysAreaWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantApplyRecordWrapper;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.tenant.io.request.SysAreaVo;
+import com.yonge.toolset.base.exception.BizException;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Validated
+@RestController
+@RequestMapping("/open/tenant")
+@Api(tags = "机构")
+public class OpenTenantController {
+
+
+    @Autowired
+    private TenantApplyRecordService tenantApplyRecordService;
+
+
+    @PostMapping("/apply")
+    @ApiOperation(value = "申请")
+    public HttpResponseResult<Boolean> save(
+            @Validated @RequestBody TenantApplyRecordWrapper.TenantApply tenantApply) {
+
+        tenantApplyRecordService.apply(tenantApply);
+
+        return HttpResponseResult.status(true);
+    }
+}

+ 45 - 0
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/vo/StudentVo.java

@@ -0,0 +1,45 @@
+package com.yonge.cooleshow.tenant.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+@ApiModel("学生入参模型")
+@Data
+public class StudentVo {
+
+    @Data
+    @ApiModel("添加/修改学生")
+    public static class Student{
+
+        @ApiModelProperty("id")
+        private Long id;
+
+        @ApiModelProperty("所属机构,开放接口必填")
+        private Long tenantId;
+
+        @ApiModelProperty("姓名")
+        @NotNull
+        private String name;
+
+        @ApiModelProperty("性别。0:女 1:男")
+        @NotNull
+        private Boolean gender;
+
+        @ApiModelProperty("生日")
+        private Date birthdate;
+
+        @ApiModelProperty("手机号码")
+        @NotNull
+        private String phone;
+
+        @ApiModelProperty("声部,多个用逗号隔开")
+        private String subjectId;
+
+        @ApiModelProperty("是否解绑")
+        private Boolean bindTenant;
+    }
+}

+ 99 - 0
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/vo/TenantActivationCodeVo.java

@@ -0,0 +1,99 @@
+package com.yonge.cooleshow.tenant.vo;
+
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 机构激活码
+ * 2023-07-25 11:45:04
+ */
+@ApiModel(value = "TenantActivationCodeVo对象", description = "机构激活码查询视图对象")
+public class TenantActivationCodeVo {
+
+    @Data
+    @ApiModel(" TenantActivationCodeSend-机构激活码发放")
+    public static class TenantActivationCodeSend {
+
+        @ApiModelProperty("专辑购买记录的ID")
+        @NotNull(message = "专辑购买记录的ID不能为空")
+        private Long tenantAlbumPurchaseId;
+
+        @ApiModelProperty("激活码列表,批量导入时为空")
+        private List<String> activationCodeList = new ArrayList<>();
+
+        @ApiModelProperty("学生ID列表")
+        @Size(min = 1, message = "未选择学生")
+        private List<Long> studentIdList = new ArrayList<>();
+    }
+
+    @Data
+    @ApiModel(" TenantActivationCode-机构激活码")
+    public static class TenantActivationCode {
+
+
+        @ApiModelProperty("主键ID")
+        private Long id;
+
+
+        @ApiModelProperty("机构ID")
+        private Long tenantId;
+
+
+        @ApiModelProperty("机构专辑ID")
+        private Long tenantAlbumId;
+
+
+        @ApiModelProperty("机构专辑采购ID")
+        private Long tenantAlbumPurchaseId;
+
+
+        @ApiModelProperty("激活码")
+        private String activationCode;
+
+
+        @ApiModelProperty("发送状态(WAIT,SEND)")
+        private String sendStatus;
+
+
+        @ApiModelProperty("激活状态")
+        private Boolean activationStatus;
+
+
+        @ApiModelProperty("激活手机号")
+        private String activationPhone;
+
+
+        @ApiModelProperty("激活时间")
+        private Date activationTime;
+
+
+        @ApiModelProperty("激活用户ID")
+        private Long activationUserId;
+
+
+        @ApiModelProperty("更新时间")
+        private Date updateTime;
+
+
+        @ApiModelProperty("创建时间")
+        private Date createTime;
+
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static TenantActivationCode from(String json) {
+            return JSON.parseObject(json, TenantActivationCode.class);
+        }
+    }
+
+}

+ 64 - 0
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/vo/TenantAlbumPurchaseVo.java

@@ -0,0 +1,64 @@
+package com.yonge.cooleshow.tenant.vo;
+
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 机构专辑采购
+ * 2023-07-25 11:05:33
+ */
+@ApiModel(value = "TenantAlbumPurchaseVo对象", description = "机构专辑采购查询视图对象")
+public class TenantAlbumPurchaseVo {
+
+    @Data
+    @ApiModel(" TenantAlbumPurchase-机构专辑采购")
+    public static class TenantAlbumPurchase {
+
+        @ApiModelProperty("主键ID")
+        private Long id;
+
+        @ApiModelProperty("机构ID")
+        private Long tenantId;
+
+        @ApiModelProperty("机构专辑ID")
+        private Long tenantAlbumId;
+
+        @ApiModelProperty("采购时间")
+        private Date purchaseTime;
+
+        @ApiModelProperty("购买数量")
+        private Integer purchaseQuantity;
+
+        @ApiModelProperty("采购周期")
+        private Integer purchaseCycle;
+
+        @ApiModelProperty("激活数量")
+        private Integer activeQuantity;
+
+        @ApiModelProperty("采购价格")
+        private BigDecimal purchasePrice;
+
+        @ApiModelProperty("采购状态")
+        private String purchaseStatus;
+
+        @ApiModelProperty("更新时间")
+        private Date updateTime;
+
+        @ApiModelProperty("创建时间")
+        private Date createTime;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static TenantAlbumPurchase from(String json) {
+            return JSON.parseObject(json, TenantAlbumPurchase.class);
+        }
+    }
+
+}

+ 83 - 0
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/vo/TenantAlbumVo.java

@@ -0,0 +1,83 @@
+package com.yonge.cooleshow.tenant.vo;
+
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 机构专辑
+ * 2023-07-25 10:27:37
+ */
+@ApiModel(value = "TenantAlbumVo对象", description = "机构专辑查询视图对象")
+public class TenantAlbumVo {
+
+    @Data
+    @ApiModel(" TenantAlbum-机构专辑")
+    public static class TenantAlbum {
+
+
+        @ApiModelProperty("主键ID")
+        private Long id;
+
+
+        @ApiModelProperty("专辑名称")
+        private String name;
+
+
+        @ApiModelProperty("专辑介绍")
+        private String describe;
+
+
+        @ApiModelProperty("专辑封面")
+        private String coverImg;
+
+
+        @ApiModelProperty("曲目数")
+        private Integer musicNum;
+
+
+        @ApiModelProperty("平台价格")
+        private BigDecimal originalPrice;
+
+
+        @ApiModelProperty("机构价格")
+        private BigDecimal salePrice;
+
+
+        @ApiModelProperty("购买周期")
+        private Integer purchaseCycle;
+
+
+        @ApiModelProperty("曲目声部分类(多个,分隔)")
+        private String subjectTypes;
+
+
+        @ApiModelProperty("启用状态")
+        private Boolean status;
+
+
+        @ApiModelProperty("删除标识")
+        private Boolean delFlag;
+
+
+        @ApiModelProperty("更新时间")
+        private Date updateTime;
+
+
+        @ApiModelProperty("创建时间")
+        private Date createTime;
+
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static TenantAlbum from(String json) {
+            return JSON.parseObject(json, TenantAlbum.class);
+        }
+    }
+}