瀏覽代碼

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

Eric 1 年之前
父節點
當前提交
d1f9487283
共有 92 個文件被更改,包括 3528 次插入617 次删除
  1. 18 0
      cooleshow-auth/auth-api/pom.xml
  2. 123 95
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/StudentController.java
  3. 70 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/SysGoodsPriceController.java
  4. 146 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TenantAlbumController.java
  5. 15 5
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TenantInfoController.java
  6. 1 23
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TenantUnbindRecordController.java
  7. 131 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/TenantAlbumVo.java
  8. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserOrderDao.java
  9. 15 96
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/OrderSearch.java
  10. 4 55
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/PlatformCashAccountRecordSearch.java
  11. 3 79
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/TeacherWithdrawalSearch.java
  12. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImGroup.java
  13. 49 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/PaymentDivMember.java
  14. 78 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/PaymentDivMemberRecord.java
  15. 97 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/PaymentMerchantConfig.java
  16. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TenantAlbumMusic.java
  17. 14 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrder.java
  18. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/ImGroupType.java
  19. 36 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/SubjectTypeEnum.java
  20. 27 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/PaymentDivMemberMapper.java
  21. 39 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/PaymentDivMemberRecordMapper.java
  22. 27 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/PaymentMerchantConfigMapper.java
  23. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/TenantAlbumMapper.java
  24. 3 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/TenantAlbumRefMapper.java
  25. 6 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/TenantInfoMapper.java
  26. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImGroupService.java
  27. 55 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/PaymentDivMemberRecordService.java
  28. 43 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/PaymentDivMemberService.java
  29. 43 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/PaymentMerchantConfigService.java
  30. 11 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/StudentService.java
  31. 2 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SysMusicCompareRecordService.java
  32. 26 10
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantActivationCodeService.java
  33. 3 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantAlbumRefService.java
  34. 20 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantAlbumService.java
  35. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantInfoService.java
  36. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantUnbindRecordService.java
  37. 14 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderService.java
  38. 24 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImGroupServiceImpl.java
  39. 99 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PaymentDivMemberRecordServiceImpl.java
  40. 66 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PaymentDivMemberServiceImpl.java
  41. 109 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PaymentMerchantConfigServiceImpl.java
  42. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/RedisCacheServiceImpl.java
  43. 77 14
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java
  44. 1 11
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/SysMusicCompareRecordServiceImpl.java
  45. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java
  46. 92 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantActivationCodeServiceImpl.java
  47. 8 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantAlbumRefServiceImpl.java
  48. 79 56
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantAlbumServiceImpl.java
  49. 17 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantInfoServiceImpl.java
  50. 144 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantUnbindRecordServiceImpl.java
  51. 16 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  52. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserPaymentCoreServiceImpl.java
  53. 15 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserPaymentOrderServiceImpl.java
  54. 182 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/PaymentDivMemberRecordWrapper.java
  55. 63 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/PaymentDivMemberWrapper.java
  56. 63 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/PaymentMerchantConfigWrapper.java
  57. 30 17
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/StudentWrapper.java
  58. 43 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/SysGoodsPriceWrapper.java
  59. 32 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantActivationCodeWrapper.java
  60. 78 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantAlbumWrapper.java
  61. 13 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantUnbindRecordWrapper.java
  62. 3 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/UserPaymentOrderWrapper.java
  63. 4 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/teacher/TeacherWrapper.java
  64. 23 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/PaymentDivMemberMapper.xml
  65. 107 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/PaymentDivMemberRecordMapper.xml
  66. 35 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/PaymentMerchantConfigMapper.xml
  67. 6 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/PlatformCashAccountRecordMapper.xml
  68. 6 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/StudentMapper.xml
  69. 1 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  70. 11 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantAlbumMapper.xml
  71. 6 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantAlbumRefMapper.xml
  72. 30 6
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantInfoMapper.xml
  73. 4 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantUnbindRecordMapper.xml
  74. 53 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderMapper.xml
  75. 3 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserWithdrawalMapper.xml
  76. 2 46
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/StudentController.java
  77. 72 0
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java
  78. 232 0
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/vo/UserPaymentOrderVo.java
  79. 7 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/ImGroupController.java
  80. 61 0
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/IndexController.java
  81. 76 0
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/PaymentDivMemberRecordController.java
  82. 5 3
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/StudentController.java
  83. 11 13
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TeacherController.java
  84. 94 1
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TenantActivationCodeController.java
  85. 3 2
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TenantAlbumController.java
  86. 100 0
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TenantUnbindRecordController.java
  87. 29 14
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/UserOrderController.java
  88. 52 0
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/open/OpenTeacherController.java
  89. 29 20
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/open/OpenTenantController.java
  90. 1 1
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/vo/TenantActivationCodeVo.java
  91. 1 4
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/vo/UserPaymentOrderVo.java
  92. 49 0
      toolset/toolset-base/src/main/java/com/yonge/toolset/base/util/StringUtil.java

+ 18 - 0
cooleshow-auth/auth-api/pom.xml

@@ -33,5 +33,23 @@
 			<groupId>com.yonge.cooleshow</groupId>
 			<artifactId>cooleshow-common</artifactId>
 		</dependency>
+		<dependency>
+			<groupId>com.yonge.cooleshow</groupId>
+			<artifactId>cooleshow-common</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.cloud</groupId>
+			<artifactId>spring-cloud-openfeign-core</artifactId>
+			<version>2.1.1.RELEASE</version>
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>com.yonge.toolset</groupId>
+			<artifactId>utils</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>com.yonge.toolset</groupId>
+			<artifactId>utils</artifactId>
+		</dependency>
 	</dependencies>
 </project>

+ 123 - 95
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/StudentController.java

@@ -1,42 +1,21 @@
 package com.yonge.cooleshow.admin.controller;
 
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.Date;
-import java.util.List;
-
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.Valid;
-
-import org.apache.commons.lang3.StringUtils;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-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 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.VipSubmitReq;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.VipRecordSearch;
+import com.yonge.cooleshow.biz.dal.entity.Student;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.service.MemberPriceSettingsService;
+import com.yonge.cooleshow.biz.dal.service.SmsCodeService;
 import com.yonge.cooleshow.biz.dal.service.StudentService;
+import com.yonge.cooleshow.biz.dal.service.TenantUnbindRecordService;
 import com.yonge.cooleshow.biz.dal.service.VipCardRecordService;
 import com.yonge.cooleshow.biz.dal.vo.StudentVo;
 import com.yonge.cooleshow.biz.dal.vo.VipRecordVo;
+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;
@@ -47,6 +26,29 @@ import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.toolset.utils.date.DateUtil;
 import com.yonge.toolset.utils.excel.POIUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.security.access.prepost.PreAuthorize;
+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.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Date;
+import java.util.List;
 
 @RestController
 @RequestMapping("/student")
@@ -64,6 +66,12 @@ public class StudentController extends BaseController {
     @Autowired
     private VipCardRecordService vipCardRecordService;
 
+    @Autowired
+    private SmsCodeService smsCodeService;
+
+    @Autowired
+    private TenantUnbindRecordService tenantUnbindRecordService;
+
 
     @GetMapping("/detail/{id}")
     @ApiOperation(value = "详情", notes = "传入id")
@@ -71,49 +79,49 @@ public class StudentController extends BaseController {
             @ApiImplicitParam(name = "id", value = "id", paramType = "path", dataType = "long", required = true),
     })
     @PreAuthorize("@pcs.hasPermissions('student/detail')")
-    public HttpResponseResult<StudentVo> detail(@PathVariable("id") Long id){
-		StudentVo detail = studentService.detail(id);
-		return succeed(detail);
-	}
+    public HttpResponseResult<StudentVo> detail(@PathVariable("id") Long id) {
+        StudentVo detail = studentService.detail(id);
+        return succeed(detail);
+    }
 
     @PostMapping("/page")
     @ApiOperation(value = "查询分页", notes = "传入StudentSearch")
     @PreAuthorize("@pcs.hasPermissions('student/page')")
     public HttpResponseResult<PageInfo<StudentVo>> page(@RequestBody StudentSearch query) {
-    	
-    	if(StringUtils.isNotBlank(query.getUserStatus())){
-    		switch (query.getUserStatus()) {
-			case "LOCKED":
-				query.setDelFlag(YesOrNoEnum.NO);
-				query.setLockFlag(UserLockFlag.LOCKED);
-				break;
-			case "CLOSED":
-				query.setDelFlag(YesOrNoEnum.YES);
-				break;
-
-			default:
-				query.setDelFlag(YesOrNoEnum.NO);
-				query.setLockFlag(UserLockFlag.NORMAL);
-				break;
-			}
-    	}
-    	
-		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);
-				}
-			}
-		}
+
+        if (StringUtils.isNotBlank(query.getUserStatus())) {
+            switch (query.getUserStatus()) {
+                case "LOCKED":
+                    query.setDelFlag(YesOrNoEnum.NO);
+                    query.setLockFlag(UserLockFlag.LOCKED);
+                    break;
+                case "CLOSED":
+                    query.setDelFlag(YesOrNoEnum.YES);
+                    break;
+
+                default:
+                    query.setDelFlag(YesOrNoEnum.NO);
+                    query.setLockFlag(UserLockFlag.NORMAL);
+                    break;
+            }
+        }
+
+        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));
-	}
+    }
 
     @ApiOperation(value = "学生列表导出")
     @PostMapping("export")
@@ -121,45 +129,45 @@ public class StudentController extends BaseController {
     public void export(HttpServletResponse response, @RequestBody StudentSearch queryInfo) throws IOException {
         queryInfo.setPage(1);
         queryInfo.setRows(49999);
-    	
-    	if(StringUtils.isNotBlank(queryInfo.getUserStatus())){
-    		switch (queryInfo.getUserStatus()) {
-			case "LOCKED":
-				queryInfo.setDelFlag(YesOrNoEnum.NO);
-				queryInfo.setLockFlag(UserLockFlag.LOCKED);
-				break;
-			case "CLOSED":
-				queryInfo.setDelFlag(YesOrNoEnum.YES);
-				break;
-
-			default:
-				queryInfo.setDelFlag(YesOrNoEnum.NO);
-				queryInfo.setLockFlag(UserLockFlag.NORMAL);
-				break;
-			}
-    	}
+
+        if (StringUtils.isNotBlank(queryInfo.getUserStatus())) {
+            switch (queryInfo.getUserStatus()) {
+                case "LOCKED":
+                    queryInfo.setDelFlag(YesOrNoEnum.NO);
+                    queryInfo.setLockFlag(UserLockFlag.LOCKED);
+                    break;
+                case "CLOSED":
+                    queryInfo.setDelFlag(YesOrNoEnum.YES);
+                    break;
+
+                default:
+                    queryInfo.setDelFlag(YesOrNoEnum.NO);
+                    queryInfo.setLockFlag(UserLockFlag.NORMAL);
+                    break;
+            }
+        }
         List<StudentVo> rows = studentService.selectPage(PageUtil.getPage(queryInfo), queryInfo).getRecords();
         if (rows.size() < 1) {
             throw new BizException("没有可导出数据");
         }
-		
-		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);
-				}
-			}
-		}
+
+        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);
+                }
+            }
+        }
         OutputStream outputStream = response.getOutputStream();
         try {
             HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"学生编号", "学生姓名", "真实姓名", "性别", "出生日期",
-                    "年龄", "专业", "手机号码", "是否是会员", "注册时间","用户状态","学生来源"}, new String[]{
-                    "userId","username" , "realName", "gender.msg", "birthdate", "age", "subjectName", "phone",
-                    "isVip.msg", "createTime", "userStatus.msg","tenantName"}, rows);
+                    "年龄", "专业", "手机号码", "是否是会员", "注册时间", "用户状态", "学生来源"}, new String[]{
+                    "userId", "username", "realName", "gender.msg", "birthdate", "age", "subjectName", "phone",
+                    "isVip.msg", "createTime", "userStatus.msg", "tenantName"}, rows);
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attac:wq" +
                     "hment;filename=学生列表-" + DateUtil.getDate(new Date()) + ".xls");
@@ -185,7 +193,7 @@ public class StudentController extends BaseController {
     @PreAuthorize("@pcs.hasPermissions('student/addVip')")
     public HttpResponseResult<Boolean> addVip(@Valid @RequestBody VipSubmitReq vipSubmitReq) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null  || sysUser.getId() == null) {
+        if (sysUser == null || sysUser.getId() == null) {
             return failed("用户信息获取失败");
         }
         return succeed(memberPriceSettingsService.addVip(vipSubmitReq, ClientEnum.STUDENT, sysUser));
@@ -200,4 +208,24 @@ public class StudentController extends BaseController {
         recordSearch.setClient(ClientEnum.STUDENT);
         return succeed(vipCardRecordService.vipRecord(recordSearch));
     }
+
+    @PostMapping("/updateTenant")
+    @ApiOperation(value = "修改机构")
+    public HttpResponseResult<Boolean> updateTenant(@RequestBody StudentWrapper.StudentUpdateTenant updateTenant) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        if (user.getTenantId() == null || user.getTenantId() == -1) {
+            return failed("非机构用户不允许更换机构");
+        }
+
+        Student student = studentService.getById(user.getId());
+        if (student == null) {
+            return failed("未查询到学生的信息");
+        }
+
+        studentService.updateTenant(student, updateTenant.getTenantId());
+        return succeed();
+    }
 }

+ 70 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/SysGoodsPriceController.java

@@ -0,0 +1,70 @@
+package com.yonge.cooleshow.admin.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.biz.dal.entity.SysGoodsPrice;
+import com.yonge.cooleshow.biz.dal.service.SysGoodsPriceService;
+import com.yonge.cooleshow.biz.dal.wrapper.SysGoodsPriceWrapper;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.mybatis.support.PageUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+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;
+
+/**
+ * 商品价格设置
+ * 2023-07-21 17:32:49
+ */
+
+@RestController
+@RequestMapping("/sysGoodsPrice")
+@Api(value = "商品价格", tags = "商品价格")
+public class SysGoodsPriceController extends BaseController {
+
+    @Autowired
+    SysGoodsPriceService sysGoodsPriceService;
+
+    /**
+     * 查询分页
+     * @param query
+     */
+    @PostMapping("/page")
+    @ApiOperation(value = "查询分页", notes = "sysGoodsPrice")
+    @PreAuthorize("@pcs.hasPermissions('sysGoodsPrice/page')")
+    public HttpResponseResult<PageInfo<SysGoodsPrice>> page(@RequestBody SysGoodsPriceWrapper.SysGoodsPriceQuery query) {
+        IPage<SysGoodsPrice> pages = sysGoodsPriceService.selectPage(PageUtil.getPage(query), query);
+        return HttpResponseResult.succeed(PageUtil.pageInfo(pages));
+    }
+
+
+    /**
+     * 修改
+     * @param sysGoodsPrice
+     */
+    @PostMapping("/update")
+    @ApiOperation(value = "修改", notes = "sysGoodsPrice")
+    @PreAuthorize("@pcs.hasPermissions('sysGoodsPrice/update')")
+    public HttpResponseResult<Boolean> update(@RequestBody SysGoodsPriceWrapper.SysGoodsPrice sysGoodsPrice) {
+
+        return HttpResponseResult.succeed(sysGoodsPriceService.update(sysGoodsPrice));
+    }
+
+    /**
+     * 新增
+     * @param sysGoodsPrice
+     */
+    @PostMapping("/add")
+    @ApiOperation(value = "新增", notes = "sysGoodsPrice")
+    @PreAuthorize("@pcs.hasPermissions('sysGoodsPrice/add')")
+    public HttpResponseResult<Boolean> add(@RequestBody SysGoodsPriceWrapper.SysGoodsPrice sysGoodsPrice) {
+        return HttpResponseResult.succeed(sysGoodsPriceService.add(sysGoodsPrice));
+    }
+
+
+}

+ 146 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TenantAlbumController.java

@@ -0,0 +1,146 @@
+package com.yonge.cooleshow.admin.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.admin.io.request.TenantAlbumVo;
+import com.yonge.cooleshow.api.feign.dto.TenantWrapper;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.entity.*;
+import com.yonge.cooleshow.biz.dal.enums.SubjectTypeEnum;
+import com.yonge.cooleshow.biz.dal.service.TenantAlbumMusicService;
+import com.yonge.cooleshow.biz.dal.service.TenantAlbumRefService;
+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.entity.HttpResponseResult;
+import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.base.page.QueryInfo;
+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.security.access.prepost.PreAuthorize;
+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.Collection;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+
+/**
+ * @Author:haonan
+ * @Date:2023/7/27 18:26
+ * @Filename:TenantAlbumController
+ */
+
+@RestController
+@RequestMapping("/tenantAlbum")
+@Api(value = "机构管理", tags = "机构管理")
+public class TenantAlbumController {
+    @Autowired
+    TenantAlbumService tenantAlbumService;
+
+    @Autowired
+    private TenantAlbumMusicService tenantAlbumMusicService;
+
+    @Autowired
+    private TenantAlbumRefService tenantAlbumRefService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private TenantInfoService tenantInfoService;
+
+    /**
+     * 查询分页
+     *
+     * @param query
+     */
+    @PostMapping("/page")
+    @ApiOperation(value = "查询分页", notes = "tenantAlbum")
+    //@PreAuthorize("@pcs.hasPermissions('tenantAlbum/page')")
+    public HttpResponseResult<PageInfo<TenantAlbumWrapper.TenantAlbum>> page(@RequestBody TenantAlbumWrapper.TenantAlbumQuery query) {
+
+
+        IPage<TenantAlbumWrapper.TenantAlbum> pages = tenantAlbumService.selectPage(query.getPage(query), query);
+        return HttpResponseResult.succeed(PageUtil.pageInfo(pages));
+    }
+
+
+
+    /**
+     * 查询详情
+     * @param query 详情ID
+     * @return TenantAlbum
+     */
+    @PostMapping("/detail")
+    @ApiOperation(value = "查询详情", notes = "detail")
+    //@PreAuthorize("@pcs.hasPermissions('tenantAlbum/detail')")
+    public HttpResponseResult<TenantAlbumVo.TenantAlbum> detail(@RequestBody TenantAlbumVo.TenantAlbum query) {
+
+        TenantAlbumVo.TenantAlbum vo = new TenantAlbumVo.TenantAlbum();
+        Long id = query.getId();
+        TenantAlbum tenantAlbum= tenantAlbumService.detail(id);
+        //查关联表
+        TenantAlbumRef ref = tenantAlbumRefService.getBytenantAlbumId(id);
+        vo.setTenantId(ref.getTenantId());
+        //查询机构专辑表
+        vo.setName(tenantAlbum.getName());
+        vo.setDescribe(tenantAlbum.getDescribe());
+        vo.setCoverImg(tenantAlbum.getCoverImg());
+        vo.setPurchaseCycle(tenantAlbum.getPurchaseCycle());
+        vo.setSalePrice(tenantAlbum.getSalePrice());
+        //查询曲目表
+
+        List<TenantAlbumVo.MusicSheetData> data = query.getMusicSheetData();
+
+        List<TenantAlbumMusic> tenantAlbumMusics = query.getMusicSheetData().stream().map(next -> {
+
+            AtomicInteger sort = new AtomicInteger(0);
+            return next.getMusicSheetIdList().stream().map(tenantAlbumMusic -> {
+
+                TenantAlbumMusic tenantAlbumMusic1 = new TenantAlbumMusic();
+                //tenantAlbumMusic1.setId(tenantAlbumMusic);
+                tenantAlbumMusic1.setSubjectType(next.getSubjectType());
+                tenantAlbumMusic1.setTenantId(query.getTenantId());
+                tenantAlbumMusic1.setMusicSheetId(tenantAlbumMusic);
+                tenantAlbumMusic1.setDelFlag(true);
+                tenantAlbumMusic1.setTenantAlbumId(tenantAlbum.getId());
+                tenantAlbumMusic1.setSortNumber(sort.getAndIncrement());
+                return tenantAlbumMusic1;
+            }).collect(Collectors.toList());
+
+        }).flatMap(Collection::stream).collect(Collectors.toList());
+
+
+        vo.setTenantAlbumMusics(tenantAlbumMusics);
+
+/*        List<TenantAlbumVo.MusicSheetData> dataList = query.getMusicSheetData();
+        TenantAlbumVo.MusicSheetData data = dataList.get(0);
+        List<Long> list = data.getMusicSheetIdList();
+        data.getSubjectType();
+        Long musicId = list.get(0);
+
+        tenantAlbumMusicService.detail(musicId);*/
+        return HttpResponseResult.succeed(vo);
+    }
+
+
+    /**
+     * 新增专辑
+     */
+    @PostMapping("/insert")
+    @ApiOperation(value = "新增专辑", notes = "新增专辑")
+    @PreAuthorize("@pcs.hasPermissions('tenantAlbum/insert')")
+    public HttpResponseResult<Boolean> insertTenantAlbum( @RequestBody TenantAlbumWrapper.TenantAlbum album) {
+
+
+        return HttpResponseResult.succeed(tenantAlbumService.insertTenantAlbum(album));
+    }
+
+
+}

+ 15 - 5
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TenantInfoController.java

@@ -39,13 +39,15 @@ public class TenantInfoController extends BaseController {
      */
     @PostMapping("/page")
     @ApiOperation(value = "查询分页", notes = "TenantInfo")
-    //@PreAuthorize("@pcs.hasPermissions('tenantInfo/page')")
+    @PreAuthorize("@pcs.hasPermissions('tenantInfo/page')")
     public HttpResponseResult<PageInfo<TenantInfoWrapper.TenantInfo>> page(@RequestBody TenantInfoWrapper.TenantInfoQuery query) {
 
         IPage<TenantInfoWrapper.TenantInfo> pages = tenantInfoService.selectPage(PageUtil.getPage(query), query);
         return succeed(PageUtil.pageInfo(pages));
     }
 
+
+
     /**
      * 修改数据
      */
@@ -57,6 +59,18 @@ public class TenantInfoController extends BaseController {
         return succeed(tenantInfoService.updateTenantInfo(info));
     }
 
+    /**
+     * 查看详情
+     */
+    @PostMapping("/detail")
+    @ApiOperation(value = "查看详情", notes = "查看详情")
+    @PreAuthorize("@pcs.hasPermissions('tenantInfo/detail')")
+    public HttpResponseResult<TenantInfoWrapper.TenantInfo > detail(@Valid @RequestBody TenantInfo info) {
+        Long id = info.getId();
+        return succeed(tenantInfoService.Infodetail(id));
+    }
+
+
 
     /**
      * 插入数据
@@ -137,7 +151,3 @@ public class TenantInfoController extends BaseController {
 
 
 }
-
-
-
-//sysUser     tenantStaff

+ 1 - 23
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TenantUnbindRecordController.java

@@ -108,30 +108,8 @@ public class TenantUnbindRecordController extends BaseController {
         if (audio.getId() == null || audio.getStatus() == null) {
             throw new BizException("参数错误");
         }
+        Boolean entry = tenantUnbindRecordService.entry(audio);
 
-        boolean update = tenantUnbindRecordService.lambdaUpdate()
-                .set(TenantUnbindRecord::getStatus, audio.getStatus() ? "PASS" : "UNPASS")
-                .set(TenantUnbindRecord::getReason, audio.getReason())
-                .set(TenantUnbindRecord::getVerifyUserId, sysUserFeignService.queryUserInfo().getId())
-                .eq(TenantUnbindRecord::getId, audio.getId())
-                .eq(TenantUnbindRecord::getStatus, "DOING").update();
-        if (!update) {
-            throw new BizException("审核失败,请刷新后重试");
-        }
-
-        if (audio.getStatus()) {
-            TenantUnbindRecord unbindRecord = tenantUnbindRecordService.getById(audio.getId());
-            String userType = unbindRecord.getUserType();
-            if ("STUDENT".equals(userType)) {
-                studentService.lambdaUpdate()
-                        .set(Student::getTenantId, -1L)
-                        .eq(Student::getUserId, unbindRecord.getUserId()).update();
-            } else if ("TEACHER".equals(userType)) {
-                teacherService.lambdaUpdate()
-                        .set(Teacher::getTenantId, -1L)
-                        .eq(Teacher::getUserId, unbindRecord.getUserId()).update();
-            }
-        }
         return succeed();
     }
 

+ 131 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/TenantAlbumVo.java

@@ -0,0 +1,131 @@
+package com.yonge.cooleshow.admin.io.request;
+
+import com.alibaba.fastjson.JSON;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.yonge.cooleshow.biz.dal.entity.TenantAlbumMusic;
+import com.yonge.cooleshow.biz.dal.enums.SubjectTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.math.BigDecimal;
+import java.util.List;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 机构专辑
+ * 2023-07-28 10:17:46
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@ApiModel(value = "TenantAlbumVo对象", description = "机构专辑查询视图对象")
+public class TenantAlbumVo {
+
+
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" TenantAlbum-机构专辑")
+    public static class TenantAlbum {
+
+
+        @ApiModelProperty("主键ID")
+        private Long id;
+
+        @ApiModelProperty("机构ID")
+        private Long tenantId;
+
+
+        @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;
+
+        @ApiModelProperty("曲目相关信息")
+        private List<MusicSheetData> musicSheetData = new ArrayList<>();
+
+
+        private List<TenantAlbumMusic> tenantAlbumMusics = new ArrayList<>();
+
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static TenantAlbum from(String json) {
+            return JSON.parseObject(json, TenantAlbum.class);
+        }
+    }
+
+    @Data
+    public static class MusicSheetData{
+        private SubjectTypeEnum subjectType;
+
+        private List<Long> musicSheetIdList = new ArrayList<>();
+
+    }
+
+    @Data
+    public static class tenantAlbumMusics{
+        private Long id;
+        private Long tenantId;
+        private SubjectTypeEnum subjectType;
+        private Long tenantAlbumId;
+        private Long musicSheetId;
+        private Integer sortNumber;
+        private Boolean delFlag;
+        private Date updateTime;
+        private Date createTime;
+    }
+
+}

+ 8 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserOrderDao.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.biz.dal.entity.UserOrder;
 import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
+import com.yonge.cooleshow.biz.dal.wrapper.PaymentDivMemberRecordWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
 import org.apache.ibatis.annotations.Param;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
@@ -93,4 +94,11 @@ public interface UserOrderDao extends BaseMapper<UserOrder>{
 
     List<UserOrder> selectPaymentOrderPage(@Param("page") IPage<UserPaymentOrderWrapper.UserPaymentOrder> page,
                                            @Param("query") UserPaymentOrderWrapper.UserPaymentOrderQuery query);
+
+	//首页支出明细列表
+    List<PaymentDivMemberRecordWrapper.IndexIncomeQueryDto> queryExpend(@Param("page") IPage<PaymentDivMemberRecordWrapper.IndexIncomeQueryDto> page,
+																		@Param("param") PaymentDivMemberRecordWrapper.IndexIncomeQuery param);
+
+	//小程序首页订单详情
+	PaymentDivMemberRecordWrapper.OrderDetailDto getExpendOrderDetail(@Param("orderNo") String orderNo);
 }

+ 15 - 96
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/OrderSearch.java

@@ -5,6 +5,7 @@ import com.yonge.cooleshow.common.enums.EPaymentVersion;
 import com.yonge.toolset.base.page.QueryInfo;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 import java.time.LocalDateTime;
 
@@ -12,129 +13,47 @@ import java.time.LocalDateTime;
  * @Author: liweifan
  * @Data: 2022-03-30 13:53:51
  */
+@Data
 @ApiModel(value = "OrderSearch对象", description = "平台订单表查询对象")
 public class OrderSearch extends QueryInfo{
     @ApiModelProperty("交易流水号/订单号")
 	private String searchNo;
+
 	@ApiModelProperty("下单应用:STUDENT 学生端 TEACHER 老师端")
 	private String orderClient;
+
 	@ApiModelProperty("交易类型:  VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ACTI_REGIST、活动报名(多选用,分割)")
 	private String orderType;
+
 	@ApiModelProperty("订单状态 WAIT_PAY 待支付 PAYING 支付中  PAID 已付款 CLOSE 已关闭 FAIL 支付失败 (多选用,分割)")
 	private String status;
+
 	@ApiModelProperty(value = "交易开始时间")
 	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
 	private LocalDateTime startTime;
+
 	@ApiModelProperty(value = "交易结束时间")
 	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
 	private LocalDateTime endTime;
+
 	@ApiModelProperty("买家id")
 	private Long userId;
+
 	@ApiModelProperty("卖家id")
 	private Long merchId;
+
+	@ApiModelProperty("机构编号")
+	private Long tenantId;
+
 	@ApiModelProperty("查询时间(yyyy-mm) ")
 	private String searchDate;
+
 	@ApiModelProperty(hidden = true)
 	private String goodType;
+
 	@ApiModelProperty(hidden = true)
 	private Long bizId;
 
     @ApiModelProperty(value = "版本",hidden = true)
     private EPaymentVersion paymentVersion;
-
-    public EPaymentVersion getPaymentVersion() {
-        return paymentVersion;
-    }
-
-    public void setPaymentVersion(EPaymentVersion paymentVersion) {
-        this.paymentVersion = paymentVersion;
-    }
-
-    public String getSearchNo() {
-		return searchNo;
-	}
-
-	public void setSearchNo(String searchNo) {
-		this.searchNo = searchNo;
-	}
-
-	public String getOrderType() {
-		return orderType;
-	}
-
-	public void setOrderType(String orderType) {
-		this.orderType = orderType;
-	}
-
-	public String getStatus() {
-		return status;
-	}
-
-	public void setStatus(String status) {
-		this.status = status;
-	}
-
-	public LocalDateTime getStartTime() {
-		return startTime;
-	}
-
-	public void setStartTime(LocalDateTime startTime) {
-		this.startTime = startTime;
-	}
-
-	public LocalDateTime getEndTime() {
-		return endTime;
-	}
-
-	public void setEndTime(LocalDateTime endTime) {
-		this.endTime = endTime;
-	}
-
-	public Long getUserId() {
-		return userId;
-	}
-
-	public void setUserId(Long userId) {
-		this.userId = userId;
-	}
-
-	public Long getMerchId() {
-		return merchId;
-	}
-
-	public void setMerchId(Long merchId) {
-		this.merchId = merchId;
-	}
-
-	public String getSearchDate() {
-		return searchDate;
-	}
-
-	public void setSearchDate(String searchDate) {
-		this.searchDate = searchDate;
-	}
-
-	public String getGoodType() {
-		return goodType;
-	}
-
-	public void setGoodType(String goodType) {
-		this.goodType = goodType;
-	}
-
-	public Long getBizId() {
-		return bizId;
-	}
-
-	public void setBizId(Long bizId) {
-		this.bizId = bizId;
-	}
-
-	public String getOrderClient() {
-		return orderClient;
-	}
-
-	public void setOrderClient(String orderClient) {
-		this.orderClient = orderClient;
-	}
 }

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

@@ -8,7 +8,9 @@ import io.swagger.annotations.ApiModelProperty;
 import java.util.Date;
 
 import com.yonge.toolset.base.page.QueryInfo;
+import lombok.Data;
 
+@Data
 public class PlatformCashAccountRecordSearch extends QueryInfo {
 
 	@ApiModelProperty("关联订单号")
@@ -33,59 +35,6 @@ public class PlatformCashAccountRecordSearch extends QueryInfo {
 	@ApiModelProperty("记录结束时间")
 	private Date endDate;
 
-	public String getOrderNo() {
-		return orderNo;
-	}
-
-	public void setOrderNo(String orderNo) {
-		this.orderNo = orderNo;
-	}
-
-	public Long getBizId() {
-		return bizId;
-	}
-
-	public void setBizId(Long bizId) {
-		this.bizId = bizId;
-	}
-
-	public String getInOrOut() {
-		return inOrOut;
-	}
-
-	public void setInOrOut(String inOrOut) {
-		this.inOrOut = inOrOut;
-	}
-
-	public AccountBizTypeEnum getBizType() {
-		return bizType;
-	}
-
-	public void setBizType(AccountBizTypeEnum bizType) {
-		this.bizType = bizType;
-	}
-
-	public PostStatusEnum getPostStatus() {
-		return postStatus;
-	}
-
-	public void setPostStatus(PostStatusEnum postStatus) {
-		this.postStatus = postStatus;
-	}
-
-	public Date getStartDate() {
-		return startDate;
-	}
-
-	public void setStartDate(Date startDate) {
-		this.startDate = startDate;
-	}
-
-	public Date getEndDate() {
-		return endDate;
-	}
-
-	public void setEndDate(Date endDate) {
-		this.endDate = endDate;
-	}
+	@ApiModelProperty("机构编号")
+	private Long tenantId;
 }

+ 3 - 79
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/TeacherWithdrawalSearch.java

@@ -7,6 +7,7 @@ import com.yonge.toolset.base.page.QueryInfo;
 import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 import java.time.LocalDateTime;
 
@@ -14,6 +15,7 @@ import java.time.LocalDateTime;
  * @Author: liweifan
  * @Data: 2022-03-30 13:53:51
  */
+@Data
 @ApiModel(value = "TeacherWithdrawalSearch对象", description = "老师账户结算表查询对象")
 public class TeacherWithdrawalSearch extends QueryInfo{
 	private static final long serialVersionUID = 1L;
@@ -42,83 +44,5 @@ public class TeacherWithdrawalSearch extends QueryInfo{
 
 	private Long userId;
 
-	public String getTransNo() {
-		return transNo;
-	}
-
-	public void setTransNo(String transNo) {
-		this.transNo = transNo;
-	}
-
-	public String getUsername() {
-		return username;
-	}
-
-	public void setUsername(String username) {
-		this.username = username;
-	}
-
-	public TradeStatusEnum getTradeStatus() {
-		return tradeStatus;
-	}
-
-	public void setTradeStatus(TradeStatusEnum tradeStatus) {
-		this.tradeStatus = tradeStatus;
-	}
-
-	public LocalDateTime getStartTime() {
-		return startTime;
-	}
-
-	public void setStartTime(LocalDateTime startTime) {
-		this.startTime = startTime;
-	}
-
-	public LocalDateTime getEndTime() {
-		return endTime;
-	}
-
-	public void setEndTime(LocalDateTime endTime) {
-		this.endTime = endTime;
-	}
-
-	public String getSearchDate() {
-		return searchDate;
-	}
-
-	public void setSearchDate(String searchDate) {
-		this.searchDate = searchDate;
-	}
-
-	public Long getUserId() {
-		return userId;
-	}
-
-	public void setUserId(Long userId) {
-		this.userId = userId;
-	}
-
-	public AuthStatusEnum getAuthStatus() {
-		return authStatus;
-	}
-
-	public void setAuthStatus(AuthStatusEnum authStatus) {
-		this.authStatus = authStatus;
-	}
-
-	public String getVerifyUser() {
-		return verifyUser;
-	}
-
-	public void setVerifyUser(String verifyUser) {
-		this.verifyUser = verifyUser;
-	}
-
-	public String getStatus() {
-		return status;
-	}
-
-	public void setStatus(String status) {
-		this.status = status;
-	}
+	private Long tenantId;
 }

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

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

+ 49 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/PaymentDivMember.java

@@ -0,0 +1,49 @@
+package com.yonge.cooleshow.biz.dal.entity;
+
+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 lombok.Data;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 分账子账户配置
+ * 2023-07-28 16:53:51
+ */
+@Data
+@ApiModel(" PaymentDivMember-分账子账户配置")
+@TableName("payment_div_member")
+public class PaymentDivMember implements Serializable {
+
+    @ApiModelProperty("主键") 
+	    @TableId(value = "id_")
+	    private Long id;
+
+    @ApiModelProperty("机构ID") 
+	@TableField(value = "tenant_id_")
+    private Long tenantId;
+
+    @ApiModelProperty("商户ID") 
+	@TableField(value = "app_id_")
+    private String appId;
+
+    @ApiModelProperty("分账用户ID") 
+	@TableField(value = "member_id_")
+    private String memberId;
+
+    @ApiModelProperty("创建时间") 
+	@TableField(value = "create_time_")
+    private Date createTime;
+
+    @ApiModelProperty("更新时间") 
+	@TableField(value = "update_time_")
+    private Date updateTime;
+
+}

+ 78 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/PaymentDivMemberRecord.java

@@ -0,0 +1,78 @@
+package com.yonge.cooleshow.biz.dal.entity;
+
+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 lombok.Data;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import java.math.BigDecimal;
+
+/**
+ * 分账子账户记录表
+ * 2023-07-28 15:45:03
+ */
+@Data
+@ApiModel(" PaymentDivMemberRecord-分账子账户记录表")
+@TableName("payment_div_member_record")
+public class PaymentDivMemberRecord implements Serializable {
+
+    @ApiModelProperty("主键") 
+	    @TableId(value = "id_")
+	    private Long id;
+
+    @ApiModelProperty("机构ID") 
+	@TableField(value = "tenant_id_")
+    private Long tenantId;
+
+    @ApiModelProperty("商户ID") 
+	@TableField(value = "app_id_")
+    private String appId;
+
+    @ApiModelProperty("分账用户ID") 
+	@TableField(value = "member_id_")
+    private String memberId;
+
+    @ApiModelProperty("订单编号") 
+	@TableField(value = "order_no_")
+    private String orderNo;
+
+    @ApiModelProperty("三方流水号") 
+	@TableField(value = "trans_no_")
+    private String transNo;
+
+    @ApiModelProperty("分账金额") 
+	@TableField(value = "amount_")
+    private BigDecimal amount;
+
+    @ApiModelProperty("机构到账标记") 
+	@TableField(value = "tenant_enter_flag_")
+    private Boolean tenantEnterFlag;
+
+    @ApiModelProperty("分账状态 ING,SUCCESS,REFUND,CLOSE") 
+	@TableField(value = "status_")
+    private String status;
+
+    @ApiModelProperty("手续费标识") 
+	@TableField(value = "fee_flag_")
+    private String feeFlag;
+
+    @ApiModelProperty("手续费") 
+	@TableField(value = "fee_amt_")
+    private BigDecimal feeAmt;
+
+    @ApiModelProperty("创建时间") 
+	@TableField(value = "create_time_")
+    private Date createTime;
+
+    @ApiModelProperty("更新时间") 
+	@TableField(value = "update_time_")
+    private Date updateTime;
+
+}

+ 97 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/PaymentMerchantConfig.java

@@ -0,0 +1,97 @@
+package com.yonge.cooleshow.biz.dal.entity;
+
+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 lombok.Data;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 支付三方账户配置
+ * 2023-07-28 16:53:51
+ */
+@Data
+@ApiModel(" PaymentMerchantConfig-支付三方账户配置")
+@TableName("payment_merchant_config")
+public class PaymentMerchantConfig implements Serializable {
+
+    @ApiModelProperty("主键") 
+	    @TableId(value = "id_")
+	    private Long id;
+
+    @ApiModelProperty("机构ID") 
+	@TableField(value = "tenant_id_")
+    private Long tenantId;
+
+    @ApiModelProperty("支付厂商") 
+	@TableField(value = "payment_vendor_")
+    private String paymentVendor;
+
+    @ApiModelProperty("支付厂商") 
+	@TableField(value = "payer_name_")
+    private String payerName;
+
+    @ApiModelProperty("商户ID") 
+	@TableField(value = "app_id_")
+    private String appId;
+
+    @ApiModelProperty("商户简称(英文)") 
+	@TableField(value = "mer_key_")
+    private String merKey;
+
+    @ApiModelProperty("商户Key") 
+	@TableField(value = "api_key_")
+    private String apiKey;
+
+    @ApiModelProperty("Mock密钥") 
+	@TableField(value = "mock_api_key_")
+    private String mockApiKey;
+
+    @ApiModelProperty("私钥") 
+	@TableField(value = "rsa_private_key_")
+    private String rsaPrivateKey;
+
+    @ApiModelProperty("公钥") 
+	@TableField(value = "rsa_public_key_")
+    private String rsaPublicKey;
+
+    @ApiModelProperty("拓展参数") 
+	@TableField(value = "expend_params_")
+    private String expendParams;
+
+    @ApiModelProperty("微信Key") 
+	@TableField(value = "wx_app_id_")
+    private String wxAppId;
+
+    @ApiModelProperty("微信密钥") 
+	@TableField(value = "wx_app_secret_")
+    private String wxAppSecret;
+
+    @ApiModelProperty("支付宝Key") 
+	@TableField(value = "alipay_app_id_")
+    private String alipayAppId;
+
+    @ApiModelProperty("支付宝私钥") 
+	@TableField(value = "alipay_private_key_")
+    private String alipayPrivateKey;
+
+    @ApiModelProperty("支付宝公钥") 
+	@TableField(value = "alipay_public_key_")
+    private String alipayPublicKey;
+
+    @ApiModelProperty("创建时间") 
+	@TableField(value = "create_time_")
+    private Date createTime;
+
+    @ApiModelProperty("更新时间") 
+	@TableField(value = "update_time_")
+    private Date updateTime;
+
+}

+ 2 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TenantAlbumMusic.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.SubjectTypeEnum;
 import lombok.Data;
 
 import io.swagger.annotations.ApiModel;
@@ -32,7 +33,7 @@ public class TenantAlbumMusic implements Serializable {
 
     @ApiModelProperty("声部分类(ENSEMBLE, MUSIC, SUBJECT)") 
 	@TableField(value = "subject_type_")
-    private String subjectType;
+    private SubjectTypeEnum subjectType;
 
     @ApiModelProperty("机构专辑ID") 
 	@TableField(value = "tenant_album_id_")

+ 14 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrder.java

@@ -39,7 +39,6 @@ public class UserOrder implements Serializable {
     @TableField(value = "order_no_")
     private String orderNo;
 
-
     @ApiModelProperty("支付版本 ")
     @TableField(value = "payment_version_")
     private EPaymentVersion paymentVersion;
@@ -75,50 +74,64 @@ public class UserOrder implements Serializable {
     @ApiModelProperty("订单名称 ")
     @TableField(value = "order_name_")
     private String orderName;
+
     @ApiModelProperty("下单应用:STUDENT 学生端 TEACHER 老师端")
     @TableField(value = "order_client_")
     private ClientEnum orderClient;
+
     @ApiModelProperty("订单类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ACTI_REGIST、活动报名 TENANT_ALBUM 平台专辑) " +
             "老师端(VIP、开通会员 PIANO_ROOM、琴房时长)")
     @TableField(value = "order_type_")
     private OrderTypeEnum orderType;
+
     @ApiModelProperty("订单描述信息 ")
     @TableField(value = "order_desc_")
     private String orderDesc;
+
     @ApiModelProperty("订单状态 WAIT_PAY 待支付 PAYING 支付中  PAID 已付款 CLOSE 已关闭 FAIL 支付失败")
     @TableField(value = "status_")
     private OrderStatusEnum status;
+
     @ApiModelProperty("原价 ")
     @TableField(value = "original_price_")
     private BigDecimal originalPrice;
+
     @ApiModelProperty("预计价格 ")
     @TableField(value = "expect_price_")
     private BigDecimal expectPrice;
+
     @ApiModelProperty("实际价格 ")
     @TableField(value = "actual_price_")
     private BigDecimal actualPrice;
+
     @ApiModelProperty("优惠金额 ")
     @TableField(value = "coupon_amount_")
     private BigDecimal couponAmount;
+
     @ApiModelProperty("平台服务费 ")
     @TableField(value = "plantform_fee_")
     private BigDecimal plantformFee;
+
     @ApiModelProperty("用户备注 ")
     @TableField(value = "user_note_")
     private String userNote;
+
     @ApiModelProperty("下单时间 ")
     @TableField(value = "create_time_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date createTime;
+
     @ApiModelProperty("支付时间 ")
     @TableField(value = "pay_time_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date payTime;
+
     @ApiModelProperty("原因 ")
     @TableField(value = "reason_")
     private String reason;
+
     @TableField(value = "update_time_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")

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

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

+ 36 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/SubjectTypeEnum.java

@@ -0,0 +1,36 @@
+package com.yonge.cooleshow.biz.dal.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+
+/**
+ * Description 审核状态(0:待审核;1:通过;2:未通过)
+ *
+ * @author: haonan
+ * @date: 2023-07-28
+ */
+public enum SubjectTypeEnum implements BaseEnum<String, SubjectTypeEnum> {
+
+
+    ENSEMBLE("合奏"),
+    MUSIC("小曲目"),
+    SUBJECT("声部");
+
+    @EnumValue
+    private String code;
+    private String msg;
+
+    SubjectTypeEnum(String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    public String getMsg() {
+        return this.msg;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }
+}

+ 27 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/PaymentDivMemberMapper.java

@@ -0,0 +1,27 @@
+package com.yonge.cooleshow.biz.dal.mapper;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+import com.yonge.cooleshow.biz.dal.entity.PaymentDivMember;
+import com.yonge.cooleshow.biz.dal.wrapper.PaymentDivMemberWrapper;
+
+/**
+ * 分账子账户配置
+ * 2023-07-28 16:53:51
+ */
+@Repository
+public interface PaymentDivMemberMapper extends BaseMapper<PaymentDivMember> {
+
+	/**
+	 * 分页查询
+	 * @param page IPage<PaymentDivMemberWrapper.PaymentDivMember>
+	 * @param param PaymentDivMemberWrapper.PaymentDivMemberQuery
+	 * @return List<PaymentDivMemberWrapper.PaymentDivMember>
+	 */
+	List<PaymentDivMember> selectPage(@Param("page") IPage<PaymentDivMember> page, @Param("param") PaymentDivMemberWrapper.PaymentDivMemberQuery param);
+	
+}

+ 39 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/PaymentDivMemberRecordMapper.java

@@ -0,0 +1,39 @@
+package com.yonge.cooleshow.biz.dal.mapper;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantPersonStatWrapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+import com.yonge.cooleshow.biz.dal.entity.PaymentDivMemberRecord;
+import com.yonge.cooleshow.biz.dal.wrapper.PaymentDivMemberRecordWrapper;
+
+/**
+ * 分账子账户记录表
+ * 2023-07-28 15:45:03
+ */
+@Repository
+public interface PaymentDivMemberRecordMapper extends BaseMapper<PaymentDivMemberRecord> {
+
+	/**
+	 * 分页查询
+	 * @param page IPage<PaymentDivMemberRecordWrapper.PaymentDivMemberRecord>
+	 * @param param PaymentDivMemberRecordWrapper.PaymentDivMemberRecordQuery
+	 * @return List<PaymentDivMemberRecordWrapper.PaymentDivMemberRecord>
+	 */
+	List<PaymentDivMemberRecord> selectPage(@Param("page") IPage<PaymentDivMemberRecord> page, @Param("param") PaymentDivMemberRecordWrapper.PaymentDivMemberRecordQuery param);
+
+    List<PaymentDivMemberRecordWrapper.IndexIncomeQueryDto> queryIncome(@Param("page") IPage<PaymentDivMemberRecordWrapper.IndexIncomeQueryDto> page,
+																		@Param("param") PaymentDivMemberRecordWrapper.IndexIncomeQuery param);
+
+	//小程序首页订单详情
+    PaymentDivMemberRecordWrapper.OrderDetailDto getIncomeOrderDetail(@Param("orderNo") String orderNo, @Param("tenantId") Long tenantId);
+
+	//首页收入汇总
+	List<PaymentDivMemberRecordWrapper.IndexIncomeSummaryDetailDto> incomeSummary(@Param("query") PaymentDivMemberRecordWrapper.IndexIncomeQuery query);
+
+	//首页支出汇总
+    List<PaymentDivMemberRecordWrapper.IndexIncomeSummaryDetailDto> expendSummary(@Param("query") PaymentDivMemberRecordWrapper.IndexIncomeQuery query);
+}

+ 27 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/PaymentMerchantConfigMapper.java

@@ -0,0 +1,27 @@
+package com.yonge.cooleshow.biz.dal.mapper;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+import com.yonge.cooleshow.biz.dal.entity.PaymentMerchantConfig;
+import com.yonge.cooleshow.biz.dal.wrapper.PaymentMerchantConfigWrapper;
+
+/**
+ * 支付三方账户配置
+ * 2023-07-28 16:53:51
+ */
+@Repository
+public interface PaymentMerchantConfigMapper extends BaseMapper<PaymentMerchantConfig> {
+
+	/**
+	 * 分页查询
+	 * @param page IPage<PaymentMerchantConfigWrapper.PaymentMerchantConfig>
+	 * @param param PaymentMerchantConfigWrapper.PaymentMerchantConfigQuery
+	 * @return List<PaymentMerchantConfigWrapper.PaymentMerchantConfig>
+	 */
+	List<PaymentMerchantConfig> selectPage(@Param("page") IPage<PaymentMerchantConfig> page, @Param("param") PaymentMerchantConfigWrapper.PaymentMerchantConfigQuery param);
+	
+}

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

@@ -22,6 +22,6 @@ public interface TenantAlbumMapper extends BaseMapper<TenantAlbum> {
 	 * @param param TenantAlbumWrapper.TenantAlbumQuery
 	 * @return List<TenantAlbumWrapper.TenantAlbum>
 	 */
-	List<TenantAlbum> selectPage(@Param("page") IPage<TenantAlbum> page, @Param("param") TenantAlbumWrapper.TenantAlbumQuery param);
+	List<TenantAlbumWrapper.TenantAlbum> selectPage(@Param("page") IPage<TenantAlbumWrapper.TenantAlbum> page, @Param("param") TenantAlbumWrapper.TenantAlbumQuery param);
 	
 }

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

@@ -23,5 +23,7 @@ public interface TenantAlbumRefMapper extends BaseMapper<TenantAlbumRef> {
 	 * @return List<TenantAlbumRefWrapper.TenantAlbumRef>
 	 */
 	List<TenantAlbumRef> selectPage(@Param("page") IPage<TenantAlbumRef> page, @Param("param") TenantAlbumRefWrapper.TenantAlbumRefQuery param);
-	
+
+
+    TenantAlbumRef selectByAlbumId(@Param("id") Long id);
 }

+ 6 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/TenantInfoMapper.java

@@ -53,9 +53,14 @@ public interface TenantInfoMapper extends BaseMapper<TenantInfo> {
 
 	TenantInfoWrapper.TenantInfo queryNow(@Param("param") TenantInfoWrapper.TenantInfoQuery query);
 
-	Boolean insertNow(@Param("info") TenantInfoWrapper.TenantInfo info);
 
 	Boolean updateStatusById(@Param("id") long id);
 
 	Boolean updateUnpassStatusById(@Param("id") long id);
+
+	TenantInfoWrapper.TenantInfo selectInfoById(@Param("id") Long id);
+
+	String queryStudentCount(@Param("id") Long id);
+
+	String queryTeacherCount(@Param("id") Long id);
 }

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

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

+ 55 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/PaymentDivMemberRecordService.java

@@ -0,0 +1,55 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.wrapper.PaymentDivMemberRecordWrapper;
+import com.yonge.cooleshow.biz.dal.entity.PaymentDivMemberRecord;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantPersonStatWrapper;
+
+import java.util.List;
+
+/**
+ * 分账子账户记录表
+ * 2023-07-28 15:45:03
+ */
+public interface PaymentDivMemberRecordService extends IService<PaymentDivMemberRecord>  {
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return PaymentDivMemberRecord
+     */
+	PaymentDivMemberRecord detail(Long id);
+
+    /**
+     * 分页查询
+     * @param page IPage<PaymentDivMemberRecord>
+     * @param query PaymentDivMemberRecordWrapper.PaymentDivMemberRecordQuery
+     * @return IPage<PaymentDivMemberRecord>
+     */
+    IPage<PaymentDivMemberRecord> selectPage(IPage<PaymentDivMemberRecord> page, PaymentDivMemberRecordWrapper.PaymentDivMemberRecordQuery query);
+	
+    /**
+     * 添加
+     * @param paymentDivMemberRecord PaymentDivMemberRecordWrapper.PaymentDivMemberRecord
+     * @return Boolean
+     */
+     Boolean add(PaymentDivMemberRecordWrapper.PaymentDivMemberRecord paymentDivMemberRecord);   
+
+    /**
+     * 更新
+     * @param paymentDivMemberRecord PaymentDivMemberRecordWrapper.PaymentDivMemberRecord
+     * @return Boolean
+     */
+     Boolean update(PaymentDivMemberRecordWrapper.PaymentDivMemberRecord paymentDivMemberRecord);
+
+     //小程序首页收入明细
+    IPage<PaymentDivMemberRecordWrapper.IndexIncomeQueryDto> queryIncome(IPage<PaymentDivMemberRecordWrapper.IndexIncomeQueryDto> page,
+                                                                         PaymentDivMemberRecordWrapper.IndexIncomeQuery query);
+
+    //小程序首页订单详情
+    PaymentDivMemberRecordWrapper.OrderDetailDto getIncomeOrderDetail(String orderNo,Long tenantId);
+
+    //首页收入汇总
+    PaymentDivMemberRecordWrapper.IndexIncomeSummaryDto incomeSummary(PaymentDivMemberRecordWrapper.IndexIncomeQuery query);
+}

+ 43 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/PaymentDivMemberService.java

@@ -0,0 +1,43 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.wrapper.PaymentDivMemberWrapper;
+import com.yonge.cooleshow.biz.dal.entity.PaymentDivMember;
+
+/**
+ * 分账子账户配置
+ * 2023-07-28 16:53:51
+ */
+public interface PaymentDivMemberService extends IService<PaymentDivMember>  {
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return PaymentDivMember
+     */
+	PaymentDivMember detail(Long id);
+
+    /**
+     * 分页查询
+     * @param page IPage<PaymentDivMember>
+     * @param query PaymentDivMemberWrapper.PaymentDivMemberQuery
+     * @return IPage<PaymentDivMember>
+     */
+    IPage<PaymentDivMember> selectPage(IPage<PaymentDivMember> page, PaymentDivMemberWrapper.PaymentDivMemberQuery query);
+	
+    /**
+     * 添加
+     * @param paymentDivMember PaymentDivMemberWrapper.PaymentDivMember
+     * @return Boolean
+     */
+     Boolean add(PaymentDivMemberWrapper.PaymentDivMember paymentDivMember);   
+
+    /**
+     * 更新
+     * @param paymentDivMember PaymentDivMemberWrapper.PaymentDivMember
+     * @return Boolean
+     */
+     Boolean update(PaymentDivMemberWrapper.PaymentDivMember paymentDivMember);
+     
+}

+ 43 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/PaymentMerchantConfigService.java

@@ -0,0 +1,43 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.wrapper.PaymentMerchantConfigWrapper;
+import com.yonge.cooleshow.biz.dal.entity.PaymentMerchantConfig;
+
+/**
+ * 支付三方账户配置
+ * 2023-07-28 16:53:51
+ */
+public interface PaymentMerchantConfigService extends IService<PaymentMerchantConfig>  {
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return PaymentMerchantConfig
+     */
+	PaymentMerchantConfig detail(Long id);
+
+    /**
+     * 分页查询
+     * @param page IPage<PaymentMerchantConfig>
+     * @param query PaymentMerchantConfigWrapper.PaymentMerchantConfigQuery
+     * @return IPage<PaymentMerchantConfig>
+     */
+    IPage<PaymentMerchantConfig> selectPage(IPage<PaymentMerchantConfig> page, PaymentMerchantConfigWrapper.PaymentMerchantConfigQuery query);
+	
+    /**
+     * 添加
+     * @param paymentMerchantConfig PaymentMerchantConfigWrapper.PaymentMerchantConfig
+     * @return Boolean
+     */
+     Boolean add(PaymentMerchantConfigWrapper.PaymentMerchantConfig paymentMerchantConfig);   
+
+    /**
+     * 更新
+     * @param paymentMerchantConfig PaymentMerchantConfigWrapper.PaymentMerchantConfig
+     * @return Boolean
+     */
+     Boolean update(PaymentMerchantConfigWrapper.PaymentMerchantConfig paymentMerchantConfig);
+     
+}

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

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

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

@@ -1,14 +1,13 @@
 package com.yonge.cooleshow.biz.dal.service;
 
-import java.util.List;
-import java.util.Map;
-
 import com.yonge.cooleshow.biz.dal.dao.SysMusicCompareRecordDao;
 import com.yonge.cooleshow.biz.dal.entity.SysMusicCompareRecord;
 import com.yonge.cooleshow.biz.dal.queryInfo.SysMusicCompareRecordQueryInfo;
 import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.mybatis.service.BaseService;
 
+import java.util.Map;
+
 public interface SysMusicCompareRecordService extends BaseService<Long, SysMusicCompareRecord> {
 
     SysMusicCompareRecordDao getDao();

+ 26 - 10
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantActivationCodeService.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantActivationCodeWrapper;
 import com.yonge.cooleshow.biz.dal.entity.TenantActivationCode;
+import com.yonge.toolset.utils.easyexcel.ExcelDataReaderProperty;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
@@ -13,49 +14,64 @@ import java.util.List;
  * 机构激活码
  * 2023-07-21 17:32:49
  */
-public interface TenantActivationCodeService extends IService<TenantActivationCode>  {
+public interface TenantActivationCodeService extends IService<TenantActivationCode> {
 
-	/**
+    /**
      * 查询详情
+     *
      * @param id 详情ID
      * @return TenantActivationCode
      */
-	TenantActivationCode detail(Long id);
+    TenantActivationCode detail(Long id);
 
     /**
      * 分页查询
-     * @param page IPage<TenantActivationCode>
+     *
+     * @param page  IPage<TenantActivationCode>
      * @param query TenantActivationCodeWrapper.TenantActivationCodeQuery
      * @return IPage<TenantActivationCode>
      */
     IPage<TenantActivationCodeWrapper.TenantActivationCode> selectPage(IPage<TenantActivationCodeWrapper.TenantActivationCode> page,
                                                                        TenantActivationCodeWrapper.TenantActivationCodeQuery query);
-	
+
     /**
      * 添加
+     *
      * @param tenantActivationCode TenantActivationCodeWrapper.TenantActivationCode
      * @return Boolean
      */
-     Boolean add(TenantActivationCodeWrapper.TenantActivationCode tenantActivationCode);   
+    Boolean add(TenantActivationCodeWrapper.TenantActivationCode tenantActivationCode);
 
     /**
      * 更新
+     *
      * @param tenantActivationCode TenantActivationCodeWrapper.TenantActivationCode
      * @return Boolean
      */
-     Boolean update(TenantActivationCodeWrapper.TenantActivationCode tenantActivationCode);
+    Boolean update(TenantActivationCodeWrapper.TenantActivationCode tenantActivationCode);
 
-    void sendActivationCode(Long tenantId, Long tenantAlbumPurchaseId, List<String> activationCodeList, List<Long> studentIdList);
+    void sendActivationCode(Long tenantId, Long tenantAlbumPurchaseId, List<String> activationCodeList,
+                            List<Long> studentIdList);
 
     void active(String activationCode, Long studentId);
 
 
-
     /**
      * 添加用户机构专辑激活记录
      *
-     * @param studentId 学生ID
+     * @param studentId         学生ID
      * @param userOrderDetailVo 订单详情
      */
     void addUserTenantAlbumRecord(Long studentId, UserOrderDetailVo userOrderDetailVo);
+
+    /**
+     * 导入激活码
+     *
+     * @param dataList              数据列表
+     * @param tenantId              机构ID
+     * @param userId                机构管理员用户ID
+     * @param tenantAlbumPurchaseId 专辑购买的ID
+     */
+    void importActiveCode(List<ExcelDataReaderProperty<TenantActivationCodeWrapper.ImportTemplate>> dataList,
+                          Long tenantId, Long userId, Long tenantAlbumPurchaseId);
 }

+ 3 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantAlbumRefService.java

@@ -33,7 +33,7 @@ public interface TenantAlbumRefService extends IService<TenantAlbumRef>  {
      * @param tenantAlbumRef TenantAlbumRefWrapper.TenantAlbumRef
      * @return Boolean
      */
-     Boolean add(TenantAlbumRefWrapper.TenantAlbumRef tenantAlbumRef);   
+     Boolean add(TenantAlbumRef tenantAlbumRef);
 
     /**
      * 更新
@@ -49,4 +49,6 @@ public interface TenantAlbumRefService extends IService<TenantAlbumRef>  {
      * @return
      */
     List<TenantAlbumRef> getByAlbumId(Long tenantAlbumId);
+
+    TenantAlbumRef getBytenantAlbumId(Long id);
 }

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

@@ -26,14 +26,14 @@ public interface TenantAlbumService extends IService<TenantAlbum>  {
      * @param query TenantAlbumWrapper.TenantAlbumQuery
      * @return IPage<TenantAlbum>
      */
-    IPage<TenantAlbum> selectPage(IPage<TenantAlbum> page, TenantAlbumWrapper.TenantAlbumQuery query);
+    IPage<TenantAlbumWrapper.TenantAlbum> selectPage(IPage<TenantAlbumWrapper.TenantAlbum> page, TenantAlbumWrapper.TenantAlbumQuery query);
 	
     /**
      * 添加
      * @param tenantAlbum TenantAlbumWrapper.TenantAlbum
      * @return Boolean
      */
-     Boolean add(TenantAlbumWrapper.TenantAlbum tenantAlbum);   
+     Boolean add(TenantAlbum tenantAlbum);
 
     /**
      * 更新
@@ -55,4 +55,22 @@ public interface TenantAlbumService extends IService<TenantAlbum>  {
      * @param userOrderDetailVo
      */
     void orderSuccess(UserOrderDetailVo userOrderDetailVo);
+
+    Boolean insertTenantAlbum(TenantAlbumWrapper.TenantAlbum album);
+
+
+    /**
+     * 添加机构专辑数据
+     * @return
+     */
+    //Boolean addTenantAlbum(TenantAlbum album);
+
+    /**
+     * 添加机构Id
+     * @param tenantId
+     * @return
+     */
+    //Boolean addTenantId(Long tenantId);
+
+   // Boolean addMusicSheet(List<com.yonge.cooleshow.admin.io.request.TenantAlbumVo.MusicSheetData> data);
 }

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

@@ -89,4 +89,6 @@ public interface TenantInfoService extends IService<TenantInfo>  {
      * @return
      */
     Boolean entry(TenantInfoWrapper.TenantInfoQuery query);
+
+    TenantInfoWrapper.TenantInfo Infodetail(Long id);
 }

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

@@ -45,4 +45,10 @@ public interface TenantUnbindRecordService extends IService<TenantUnbindRecord>
      */
     Boolean update(TenantUnbindRecordWrapper.TenantUnbindRecord tenantUnbindRecord);
 
+    /**
+     * 审核
+     * @param audio
+     * @return
+     */
+    Boolean entry(TenantUnbindRecordWrapper.Audio audio);
 }

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

@@ -11,6 +11,7 @@ import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderPayRes;
+import com.yonge.cooleshow.biz.dal.wrapper.PaymentDivMemberRecordWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
@@ -209,4 +210,17 @@ public interface UserOrderService extends IService<UserOrder> {
      */
     BigDecimal getShareFreeByConfigName(String configName);
 
+    /**
+     * 获取订单数据
+     *
+     * @param orderNo 订单号
+     */
+    UserOrder getByOrderNo(String orderNo);
+
+    //首页支出明细列表
+    IPage<PaymentDivMemberRecordWrapper.IndexIncomeQueryDto> queryExpend(IPage<PaymentDivMemberRecordWrapper.IndexIncomeQueryDto> page,
+                                                                         PaymentDivMemberRecordWrapper.IndexIncomeQuery query);
+
+    //首页支出订单详情
+    PaymentDivMemberRecordWrapper.OrderDetailDto getExpendOrderDetail(String orderNo);
 }

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

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

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

@@ -0,0 +1,99 @@
+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.yonge.cooleshow.biz.dal.wrapper.TenantPersonStatWrapper;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.beans.BeanUtils;
+import lombok.extern.slf4j.Slf4j;
+import com.yonge.cooleshow.biz.dal.entity.PaymentDivMemberRecord;
+import com.yonge.cooleshow.biz.dal.wrapper.PaymentDivMemberRecordWrapper;
+import com.yonge.cooleshow.biz.dal.mapper.PaymentDivMemberRecordMapper;
+import com.yonge.cooleshow.biz.dal.service.PaymentDivMemberRecordService;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 分账子账户记录表
+ * 2023-07-28 15:45:03
+ */
+@Slf4j
+@Service
+public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMemberRecordMapper, PaymentDivMemberRecord> implements PaymentDivMemberRecordService {
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return PaymentDivMemberRecord
+     */
+	@Override
+    public PaymentDivMemberRecord detail(Long id) {
+        
+        return baseMapper.selectById(id);
+    }
+    
+    /**
+     * 分页查询
+     * @param page IPage<PaymentDivMemberRecord>
+     * @param query PaymentDivMemberRecordWrapper.PaymentDivMemberRecordQuery
+     * @return IPage<PaymentDivMemberRecord>
+     */
+    @Override
+    public IPage<PaymentDivMemberRecord> selectPage(IPage<PaymentDivMemberRecord> page, PaymentDivMemberRecordWrapper.PaymentDivMemberRecordQuery query) {
+        
+        return page.setRecords(baseMapper.selectPage(page, query));
+    }
+	
+    /**
+     * 添加
+     * @param paymentDivMemberRecord PaymentDivMemberRecordWrapper.PaymentDivMemberRecord
+     * @return Boolean
+     */
+    @Override
+    public Boolean add(PaymentDivMemberRecordWrapper.PaymentDivMemberRecord paymentDivMemberRecord) {    	
+        
+        return this.save(JSON.parseObject(paymentDivMemberRecord.jsonString(), PaymentDivMemberRecord.class));
+    }
+
+    /**
+     * 更新
+     * @param paymentDivMemberRecord PaymentDivMemberRecordWrapper.PaymentDivMemberRecord
+     * @return Boolean
+     */
+    @Override
+    public Boolean update(PaymentDivMemberRecordWrapper.PaymentDivMemberRecord paymentDivMemberRecord){
+
+        return this.updateById(JSON.parseObject(paymentDivMemberRecord.jsonString(), PaymentDivMemberRecord.class));       
+    }
+
+    @Override
+    public IPage<PaymentDivMemberRecordWrapper.IndexIncomeQueryDto> queryIncome(IPage<PaymentDivMemberRecordWrapper.IndexIncomeQueryDto> page, PaymentDivMemberRecordWrapper.IndexIncomeQuery query) {
+        return page.setRecords(baseMapper.queryIncome(page, query));
+    }
+
+    @Override
+    public PaymentDivMemberRecordWrapper.OrderDetailDto getIncomeOrderDetail(String orderNo,Long tenantId) {
+        return baseMapper.getIncomeOrderDetail(orderNo,tenantId);
+    }
+
+    @Override
+    public PaymentDivMemberRecordWrapper.IndexIncomeSummaryDto incomeSummary(PaymentDivMemberRecordWrapper.IndexIncomeQuery query) {
+        List<PaymentDivMemberRecordWrapper.IndexIncomeSummaryDetailDto> incomeSummary = baseMapper.incomeSummary(query);
+        PaymentDivMemberRecordWrapper.IndexIncomeSummaryDto result = new PaymentDivMemberRecordWrapper.IndexIncomeSummaryDto();
+        if(CollectionUtils.isNotEmpty(incomeSummary)){
+            BigDecimal reduce = incomeSummary.stream().map(e -> e.getAmount()).reduce(BigDecimal.ZERO, BigDecimal::add);
+            result.setIncomeDtos(incomeSummary);
+            result.setTotalIncome(reduce);
+        }
+        List<PaymentDivMemberRecordWrapper.IndexIncomeSummaryDetailDto> expendSummary = baseMapper.expendSummary(query);
+        if(CollectionUtils.isNotEmpty(expendSummary)){
+            BigDecimal reduce = expendSummary.stream().map(e -> e.getAmount()).reduce(BigDecimal.ZERO, BigDecimal::add);
+            result.setExpendDtos(expendSummary);
+            result.setTotalExpend(reduce);
+        }
+        return result;
+    }
+}

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

@@ -0,0 +1,66 @@
+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 org.springframework.stereotype.Service;
+import org.springframework.beans.BeanUtils;
+import lombok.extern.slf4j.Slf4j;
+import com.yonge.cooleshow.biz.dal.entity.PaymentDivMember;
+import com.yonge.cooleshow.biz.dal.wrapper.PaymentDivMemberWrapper;
+import com.yonge.cooleshow.biz.dal.mapper.PaymentDivMemberMapper;
+import com.yonge.cooleshow.biz.dal.service.PaymentDivMemberService;
+
+/**
+ * 分账子账户配置
+ * 2023-07-28 16:53:51
+ */
+@Slf4j
+@Service
+public class PaymentDivMemberServiceImpl extends ServiceImpl<PaymentDivMemberMapper, PaymentDivMember> implements PaymentDivMemberService {
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return PaymentDivMember
+     */
+	@Override
+    public PaymentDivMember detail(Long id) {
+        
+        return baseMapper.selectById(id);
+    }
+    
+    /**
+     * 分页查询
+     * @param page IPage<PaymentDivMember>
+     * @param query PaymentDivMemberWrapper.PaymentDivMemberQuery
+     * @return IPage<PaymentDivMember>
+     */
+    @Override
+    public IPage<PaymentDivMember> selectPage(IPage<PaymentDivMember> page, PaymentDivMemberWrapper.PaymentDivMemberQuery query) {
+        
+        return page.setRecords(baseMapper.selectPage(page, query));
+    }
+	
+    /**
+     * 添加
+     * @param paymentDivMember PaymentDivMemberWrapper.PaymentDivMember
+     * @return Boolean
+     */
+    @Override
+    public Boolean add(PaymentDivMemberWrapper.PaymentDivMember paymentDivMember) {    	
+        
+        return this.save(JSON.parseObject(paymentDivMember.jsonString(), PaymentDivMember.class));
+    }
+
+    /**
+     * 更新
+     * @param paymentDivMember PaymentDivMemberWrapper.PaymentDivMember
+     * @return Boolean
+     */
+    @Override
+    public Boolean update(PaymentDivMemberWrapper.PaymentDivMember paymentDivMember){
+
+        return this.updateById(JSON.parseObject(paymentDivMember.jsonString(), PaymentDivMember.class));       
+    }
+}

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

@@ -0,0 +1,109 @@
+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.middleware.payment.common.api.PaymentServiceContext;
+import com.microsvc.toolkit.middleware.payment.impl.AdapayPaymentServicePlugin;
+import com.microsvc.toolkit.middleware.payment.properties.PayConfigProperties;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.beans.BeanUtils;
+import lombok.extern.slf4j.Slf4j;
+import com.yonge.cooleshow.biz.dal.entity.PaymentMerchantConfig;
+import com.yonge.cooleshow.biz.dal.wrapper.PaymentMerchantConfigWrapper;
+import com.yonge.cooleshow.biz.dal.mapper.PaymentMerchantConfigMapper;
+import com.yonge.cooleshow.biz.dal.service.PaymentMerchantConfigService;
+
+import javax.annotation.PostConstruct;
+import java.util.List;
+
+/**
+ * 支付三方账户配置
+ * 2023-07-28 16:53:51
+ */
+@Slf4j
+@Service
+public class PaymentMerchantConfigServiceImpl extends ServiceImpl<PaymentMerchantConfigMapper, PaymentMerchantConfig> implements PaymentMerchantConfigService {
+
+
+    @Autowired
+    private PayConfigProperties properties;
+
+    @PostConstruct
+    public void init(){
+        List<PaymentMerchantConfig> list = this.list();
+
+        if(CollectionUtils.isEmpty(list)) {
+            return;
+        }
+        for (PaymentMerchantConfig config : list) {
+            PayConfigProperties.AdapayPayConfig adapayPayConfig = new PayConfigProperties.AdapayPayConfig();
+            adapayPayConfig.setEnable(true);
+            adapayPayConfig.setAppId(config.getAppId());
+            adapayPayConfig.setPayType(config.getPaymentVendor());
+            adapayPayConfig.setMerchantId(config.getMerKey());
+            adapayPayConfig.setMerchantId(config.getApiKey());
+            adapayPayConfig.setPayNotifyUrl(properties.getPayNotifyUrl());
+            adapayPayConfig.setRefundNotifyUrl(properties.getRefundNotifyUrl());
+            adapayPayConfig.setKeyPublic(config.getRsaPublicKey());
+            adapayPayConfig.setKeyPrivate(config.getRsaPrivateKey());
+            adapayPayConfig.setSupportCreditCards(properties.getSupportCreditCards());
+            AdapayPaymentServicePlugin plugin = null;
+            try {
+                plugin = new AdapayPaymentServicePlugin(config.getPaymentVendor(), adapayPayConfig, false);
+                PaymentServiceContext.addPlugin(plugin);
+            } catch (Exception e) {
+                log.error("初始化支付插件失败", e);
+            }
+        }
+
+    }
+
+    /**
+     * 查询详情
+     * @param id 详情ID
+     * @return PaymentMerchantConfig
+     */
+    @Override
+    public PaymentMerchantConfig detail(Long id) {
+        
+        return baseMapper.selectById(id);
+    }
+
+    
+    /**
+     * 分页查询
+     * @param page IPage<PaymentMerchantConfig>
+     * @param query PaymentMerchantConfigWrapper.PaymentMerchantConfigQuery
+     * @return IPage<PaymentMerchantConfig>
+     */
+    @Override
+    public IPage<PaymentMerchantConfig> selectPage(IPage<PaymentMerchantConfig> page, PaymentMerchantConfigWrapper.PaymentMerchantConfigQuery query) {
+        
+        return page.setRecords(baseMapper.selectPage(page, query));
+    }
+
+    /**
+     * 添加
+     * @param paymentMerchantConfig PaymentMerchantConfigWrapper.PaymentMerchantConfig
+     * @return Boolean
+     */
+    @Override
+    public Boolean add(PaymentMerchantConfigWrapper.PaymentMerchantConfig paymentMerchantConfig) {
+
+        return this.save(JSON.parseObject(paymentMerchantConfig.jsonString(), PaymentMerchantConfig.class));
+    }
+
+    /**
+     * 更新
+     * @param paymentMerchantConfig PaymentMerchantConfigWrapper.PaymentMerchantConfig
+     * @return Boolean
+     */
+    @Override
+    public Boolean update(PaymentMerchantConfigWrapper.PaymentMerchantConfig paymentMerchantConfig){
+
+        return this.updateById(JSON.parseObject(paymentMerchantConfig.jsonString(), PaymentMerchantConfig.class));       
+    }
+}

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

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

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

@@ -15,6 +15,7 @@ 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.ImGroupMember;
 import com.yonge.cooleshow.biz.dal.entity.Student;
 import com.yonge.cooleshow.biz.dal.entity.StudentTotal;
 import com.yonge.cooleshow.biz.dal.entity.Subject;
@@ -23,6 +24,8 @@ 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.ImGroupMemberService;
+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;
@@ -44,6 +47,7 @@ import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.toolset.utils.date.DateUtil;
 import com.yonge.toolset.utils.easyexcel.ExcelDataReaderProperty;
 import com.yonge.toolset.utils.string.ValueUtil;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.redisson.api.RMap;
 import org.redisson.api.RedissonClient;
@@ -55,12 +59,15 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.text.MessageFormat;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 
+@Slf4j
 @Service
 public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> implements StudentService {
     @Autowired
@@ -84,6 +91,12 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
     @Autowired
     private SysConfigService sysConfigService;
 
+    @Autowired
+    private ImGroupService imGroupService;
+
+    @Autowired
+    private ImGroupMemberService imGroupMemberService;
+
     @Override
     public StudentDao getDao() {
         return baseMapper;
@@ -362,7 +375,7 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
     @Transactional(rollbackFor = Exception.class)
     @Override
     public Boolean save(StudentWrapper.Student studentInfo) {
-        if (studentInfo.getId() != null) {
+        if (studentInfo.getId() == null) {
             return createStudent(studentInfo);
         } else {
             return updateStudent(studentInfo);
@@ -371,7 +384,8 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public void importStudentExcel(List<ExcelDataReaderProperty<StudentWrapper.StudentExport>> dataList, Long id) {
+    public void importStudentExcel(List<ExcelDataReaderProperty<StudentWrapper.StudentExport>> dataList,
+                                   Long tenantId, Long userId) {
         if (dataList.isEmpty()) {
             throw new BizException("导入数据不能为空");
         }
@@ -384,12 +398,13 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
             Integer rowIndex = next.getRowIndex();
             StudentWrapper.StudentExport student = next.getClazz();
 
-            student.checkValid().forEach(err -> errMsg.add(String.format("第%s行%s", rowIndex, err)));
+            int msgRowNo = rowIndex + 1;
+            student.checkValid().forEach(err -> errMsg.add(String.format("第%s行%s", msgRowNo, err)));
 
             if (phoneMap.containsKey(student.getPhone().trim())) {
-                errMsg.add(String.format("第%s行手机号重复", rowIndex));
+                errMsg.add(String.format("第%s行手机号重复", msgRowNo));
             } else {
-                phoneMap.put(student.getPhone().trim(), rowIndex);
+                phoneMap.put(student.getPhone().trim(), msgRowNo);
             }
 
             if (errMsg.size() > 100) {
@@ -397,7 +412,11 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
             }
         }
 
-        int row = 100;
+        if (!errMsg.isEmpty()) {
+            throw new BizException(String.join(",", errMsg));
+        }
+
+        int row = 50;
         int page = 1;
         List<List<String>> phonePartition = Lists.partition(new ArrayList<>(phoneMap.keySet()), row);
 
@@ -411,13 +430,54 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
 
             if (!studentVos.isEmpty()) {
                 List<String> existPhoneList = studentVos.stream().map(StudentVo::getPhone).collect(Collectors.toList());
-                existPhoneList.forEach(phone -> errMsg.add(String.format("第%s行手机号已经注册学生", phoneMap.get(phone))));
+                existPhoneList.forEach(phone -> {
+                    if (phoneMap.containsKey(phone)) {
+                        errMsg.add(String.format("第%s行手机号已经注册学生", phoneMap.get(phone)));
+                    }
+                });
             }
         }
 
         if (!errMsg.isEmpty()) {
             throw new BizException(String.join(",", errMsg));
         }
+
+        for (ExcelDataReaderProperty<StudentWrapper.StudentExport> next : dataList) {
+            StudentWrapper.StudentExport studentExport = next.getClazz();
+            StudentWrapper.Student student = new StudentWrapper.Student();
+            student.setTenantId(tenantId);
+            student.setName(studentExport.getUserName());
+            student.setGender("1".equals(studentExport.getGender()) ? 1 : 0);
+            student.setSubjectId(studentExport.getSubjectId());
+
+            LocalDate birthday = LocalDate.parse(studentExport.getBirthday(), DateTimeFormatter.ISO_LOCAL_DATE);
+            student.setBirthdate(birthday);
+            save(student);
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void updateTenant(Student student, Long toTenantId) {
+        if (student.getTenantId().equals(toTenantId)) {
+            return;
+        }
+        List<ImGroupMember> groupMembers = imGroupMemberService.lambdaQuery()
+                .eq(ImGroupMember::getUserId, student.getUserId())
+                .eq(ImGroupMember::getRoleType, ClientEnum.STUDENT.getCode())
+                .eq(ImGroupMember::getIsAdmin, false).list();
+        List<String> groupIdList = groupMembers.stream().map(ImGroupMember::getGroupId).distinct()
+                .collect(Collectors.toList());
+        for (String groupId : groupIdList) {
+            try {
+                imGroupService.quit(groupId, student.getUserId(), ClientEnum.STUDENT);
+            } catch (Exception e) {
+                log.error("退出群聊失败:{}", e);
+            }
+        }
+        this.lambdaUpdate().set(Student::getTenantId, toTenantId)
+                .eq(Student::getUserId, student.getUserId())
+                .update();
     }
 
     private Boolean updateStudent(StudentWrapper.Student studentInfo) {
@@ -426,14 +486,14 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
             throw new BizException("学生信息不存在");
         }
         // 解绑
-        if (!studentInfo.getBindTenant()) {
-            studentInfo.setTenantId(-1L);
-            // 退群,删除好友
-            imUserFriendService.delFriendByTenantId(student.getTenantId(), student.getUserId());
-        }
+//        if (Boolean.FALSE.equals(studentInfo.getBindTenant())) {
+//            studentInfo.setTenantId(-1L);
+//            // 退群,删除好友
+//            imUserFriendService.delFriendByTenantId(student.getTenantId(), student.getUserId());
+//        }
         // 手机号码修改
+        com.yonge.cooleshow.biz.dal.entity.SysUser sysUser = getOrCreateAccount(studentInfo);
         if (!student.getPhone().equals(studentInfo.getPhone())) {
-            com.yonge.cooleshow.biz.dal.entity.SysUser sysUser = getOrCreateAccount(studentInfo);
             this.lambdaUpdate().set(Student::getSubjectId, studentInfo.getSubjectId())
                     .set(Student::getTenantId, studentInfo.getTenantId())
                     .set(Student::getUserId, sysUser.getId())
@@ -470,10 +530,12 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
         com.yonge.cooleshow.biz.dal.entity.SysUser sysUser;
         if (!sysUsers.isEmpty()) {
             sysUser = sysUsers.get(0);
-            if (this.getBaseMapper().selectById(sysUser.getId()) != null) {
+            if (!sysUser.getId().equals(studentInfo.getId()) &&
+                    this.getBaseMapper().selectById(sysUser.getId()) != null) {
                 throw new BizException("手机号已经注册学生账号");
             }
             sysUser.setGender(studentInfo.getGender());
+            sysUser.setUsername(studentInfo.getName());
             sysUser.setBirthdate(studentInfo.getBirthdate());
             String userType = sysUser.getUserType();
             String studentUserType = "STUDENT";
@@ -491,6 +553,7 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
             sysUser.setGender(studentInfo.getGender());
             sysUser.setUserType("STUDENT");
             sysUser.setBirthdate(studentInfo.getBirthdate());
+            sysUser.setUsername(studentInfo.getName());
 
             String newPassword = MessageFormat.format("klxjg{0}", studentInfo.getPhone().substring(7));
             String password = new BCryptPasswordEncoder().encode(newPassword);

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

@@ -4,10 +4,8 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.google.common.collect.Lists;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
-import com.yonge.cooleshow.auth.api.entity.SysUserDevice;
 import com.yonge.cooleshow.biz.dal.dao.MusicSheetDao;
 import com.yonge.cooleshow.biz.dal.dao.SysMusicCompareRecordDao;
-import com.yonge.cooleshow.biz.dal.dao.SysMusicCompareWeekDataDao;
 import com.yonge.cooleshow.biz.dal.dto.IndexBaseDto;
 import com.yonge.cooleshow.biz.dal.dto.IndexBaseMonthData;
 import com.yonge.cooleshow.biz.dal.dto.StudentTrainChartDto;
@@ -41,15 +39,7 @@ import java.time.DayOfWeek;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Service

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

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

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

@@ -4,6 +4,7 @@ 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 com.google.common.collect.Lists;
 import com.yonge.cooleshow.biz.dal.dao.StudentDao;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
@@ -15,20 +16,27 @@ import com.yonge.cooleshow.biz.dal.mapper.UserTenantAlbumRecordMapper;
 import com.yonge.cooleshow.biz.dal.service.TenantActivationCodeService;
 import com.yonge.cooleshow.biz.dal.service.TenantAlbumService;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
+import com.yonge.cooleshow.biz.dal.wrapper.StudentWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantActivationCodeWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumWrapper;
 import com.yonge.cooleshow.common.enums.EActivationCode;
 import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.utils.easyexcel.ExcelDataReaderProperty;
 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.ArrayList;
 import java.util.Calendar;
+import java.util.Comparator;
 import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -193,7 +201,7 @@ public class TenantActivationCodeServiceImpl extends ServiceImpl<TenantActivatio
         Integer purchaseCycle = purchase.getPurchaseCycle();
 
 
-        addUserTenantAlbumRecord(student.getUserId(), purchase,null);
+        addUserTenantAlbumRecord(student.getUserId(), purchase, null);
 
         // 更新购买记录中激活码使用统计数量值
         Integer activeCodeNumber = this.lambdaQuery()
@@ -211,7 +219,7 @@ public class TenantActivationCodeServiceImpl extends ServiceImpl<TenantActivatio
     /**
      * 添加用户机构专辑激活记录
      *
-     * @param studentId 学生ID
+     * @param studentId         学生ID
      * @param userOrderDetailVo 订单详情
      */
     @Override
@@ -221,14 +229,94 @@ public class TenantActivationCodeServiceImpl extends ServiceImpl<TenantActivatio
 
     }
 
-    private void addUserTenantAlbumRecord(Long studentId, TenantAlbumPurchase purchase, UserOrderDetailVo userOrderDetailVo) {
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void importActiveCode(List<ExcelDataReaderProperty<TenantActivationCodeWrapper.ImportTemplate>> dataList,
+                                 Long tenantId, Long userId, Long tenantAlbumPurchaseId) {
+        if (dataList.isEmpty()) {
+            return;
+        }
+        dataList.sort(Comparator.comparingInt(ExcelDataReaderProperty::getRowIndex));
+
+        List<String> errMsg = new ArrayList<>();
+        Set<String> codeSet = new HashSet<>();
+        Map<String, Integer> codeRowMap = new HashMap<>();
+        Map<String, String> codePhoneMap = new HashMap<>();
+        // 校验数据格式是否错误
+        for (ExcelDataReaderProperty<TenantActivationCodeWrapper.ImportTemplate> next : dataList) {
+            Integer rowIndex = next.getRowIndex();
+            TenantActivationCodeWrapper.ImportTemplate code = next.getClazz();
+
+            int msgRowNo = rowIndex + 1;
+            code.checkIsIllegal().forEach(err -> errMsg.add(String.format("第%s行%s", msgRowNo, err)));
+            if (codeSet.contains(code.getCode())) {
+                errMsg.add(String.format("第%s行%s", msgRowNo, "激活码重复"));
+            } else {
+                codeSet.add(code.getCode());
+            }
+            codeRowMap.put(code.getCode().trim(), msgRowNo);
+            codePhoneMap.put(code.getCode().trim(), code.getPhone().trim());
+
+            if (errMsg.size() > 100) {
+                break;
+            }
+        }
+
+        if (!errMsg.isEmpty()) {
+            throw new BizException(String.join(",", errMsg));
+        }
+        // 校验激活码是否被使用
+        List<List<String>> codePartition = Lists.partition(new ArrayList<>(codeRowMap.keySet()), 50);
+
+        List<TenantActivationCode> tenantActivationCodes = new ArrayList<>();
+        for (List<String> codes : codePartition) {
+            List<TenantActivationCode> activationCodes = this.lambdaQuery()
+                    .eq(TenantActivationCode::getTenantId, tenantId)
+                    .eq(TenantActivationCode::getTenantAlbumPurchaseId, tenantAlbumPurchaseId)
+                    .in(TenantActivationCode::getActivationCode, codes).list();
+
+            // 存在无效码或者已经使用过的码
+            if (codes.size() != activationCodes.size() ||
+                    activationCodes.stream().anyMatch(TenantActivationCode::getActivationStatus)) {
+                Map<String, Boolean> codeStatusMap = activationCodes.stream()
+                        .collect(Collectors.toMap(TenantActivationCode::getActivationCode,
+                                TenantActivationCode::getActivationStatus));
+                for (String code : codes) {
+                    if (!codeStatusMap.containsKey(code)) {
+                        errMsg.add(String.format("第%s行%s", codeRowMap.get(code), "验证码无效"));
+                    } else if (Boolean.TRUE.equals(codeStatusMap.get(code))) {
+                        errMsg.add(String.format("第%s行%s", codeRowMap.get(code), "验证码已经激活"));
+                    }
+                }
+            }
+
+            List<TenantActivationCode> updateDataList = activationCodes.stream().map(next -> {
+                TenantActivationCode tenantActivationCode = new TenantActivationCode();
+                tenantActivationCode.setId(next.getId());
+                next.setActivationPhone(codePhoneMap.get(next.getActivationCode()));
+                next.setSendStatus(EActivationCode.SEND);
+                return tenantActivationCode;
+            }).collect(Collectors.toList());
+
+            tenantActivationCodes.addAll(updateDataList);
+        }
+        if (!errMsg.isEmpty()) {
+            throw new BizException(String.join(",", errMsg));
+        }
+        if (tenantActivationCodes.isEmpty()) {
+            this.updateBatchById(tenantActivationCodes, 50);
+        }
+    }
+
+    private void addUserTenantAlbumRecord(Long studentId, TenantAlbumPurchase purchase,
+                                          UserOrderDetailVo userOrderDetailVo) {
 
 
         UserTenantAlbumRecord userTenantAlbumRecord = new UserTenantAlbumRecord();
         if (userOrderDetailVo != null) {
 
             TenantAlbumWrapper.TenantAlbumContent tenantAlbumContent = JSON
-                    .parseObject(JSON.toJSONString(userOrderDetailVo.getBizContent()), TenantAlbumWrapper.TenantAlbumContent.class);
+                    .parseObject(userOrderDetailVo.getBizContent(), TenantAlbumWrapper.TenantAlbumContent.class);
 
             userTenantAlbumRecord.setTenantId(tenantAlbumContent.getTenantId());
             userTenantAlbumRecord.setUserId(studentId);
@@ -253,7 +341,6 @@ public class TenantActivationCodeServiceImpl extends ServiceImpl<TenantActivatio
         }
 
 
-
         QueryWrapper<UserTenantAlbumRecord> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda()
                 .eq(UserTenantAlbumRecord::getTenantId, userTenantAlbumRecord.getTenantId())

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

@@ -50,9 +50,9 @@ public class TenantAlbumRefServiceImpl extends ServiceImpl<TenantAlbumRefMapper,
      * @return Boolean
      */
     @Override
-    public Boolean add(TenantAlbumRefWrapper.TenantAlbumRef tenantAlbumRef) {    	
-        
-        return this.save(JSON.parseObject(tenantAlbumRef.jsonString(), TenantAlbumRef.class));
+    public Boolean add(TenantAlbumRef tenantAlbumRef) {
+        return this.save(tenantAlbumRef);
+        //return this.save(JSON.parseObject(tenantAlbumRef.jsonString(), TenantAlbumRef.class));
     }
 
     /**
@@ -78,4 +78,9 @@ public class TenantAlbumRefServiceImpl extends ServiceImpl<TenantAlbumRefMapper,
                 .eq(TenantAlbumRef::getTenantAlbumId, tenantAlbumId)
                 .list();
     }
+
+    @Override
+    public TenantAlbumRef getBytenantAlbumId(Long id) {
+        return baseMapper.selectByAlbumId(id);
+    }
 }

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

@@ -2,14 +2,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.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.entity.*;
-import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
-import com.yonge.cooleshow.common.enums.EActivationCode;
 import com.yonge.toolset.base.exception.BizException;
 import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -19,10 +18,13 @@ import lombok.extern.slf4j.Slf4j;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumWrapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantAlbumMapper;
 import org.springframework.transaction.annotation.Transactional;
+import springfox.documentation.spring.web.json.Json;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
 /**
@@ -49,10 +51,10 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
     private UserOrderService userOrderService;
 
     @Autowired
-    private TenantActivationCodeService tenantActivationCodeService;
+    private SysUserFeignService sysUserFeignService;
 
     @Autowired
-    private TenantAlbumPurchaseService tenantAlbumPurchaseService;
+    private TenantAlbumMusicService tenantAlbumMusicService;
 
     /**
      * 查询详情
@@ -72,9 +74,9 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
      * @return IPage<TenantAlbum>
      */
     @Override
-    public IPage<TenantAlbum> selectPage(IPage<TenantAlbum> page, TenantAlbumWrapper.TenantAlbumQuery query) {
-        
-        return page.setRecords(baseMapper.selectPage(page, query));
+    public IPage<TenantAlbumWrapper.TenantAlbum> selectPage(IPage<TenantAlbumWrapper.TenantAlbum> page, TenantAlbumWrapper.TenantAlbumQuery query) {
+        List<TenantAlbumWrapper.TenantAlbum> albums = baseMapper.selectPage(page, query);
+        return page.setRecords(albums);
     }
 
     /**
@@ -83,9 +85,10 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
      * @return Boolean
      */
     @Override
-    public Boolean add(TenantAlbumWrapper.TenantAlbum tenantAlbum) {
+    public Boolean add(TenantAlbum tenantAlbum) {
 
-        return this.save(JSON.parseObject(tenantAlbum.jsonString(), TenantAlbum.class));
+        //return this.save(JSON.parseObject(tenantAlbum.jsonString(), TenantAlbum.class));
+        return this.save(tenantAlbum);
     }
 
     /**
@@ -112,10 +115,9 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
             throw new BizException("订单商品信息为空");
         }
 
-
-        TenantAlbumWrapper.TenantAlbumContent tenantAlbumContent = JSON
-                .parseObject(JSON.toJSONString(orderGoodsInfo.getBizContent()), TenantAlbumWrapper.TenantAlbumContent.class);
-        if (tenantAlbumContent == null) {
+        TenantAlbumWrapper.TenantAlbumBuy tenantAlbumBuy = JSON
+                .parseObject(JSON.toJSONString(orderGoodsInfo.getBizContent()), TenantAlbumWrapper.TenantAlbumBuy.class);
+        if (tenantAlbumBuy == null) {
             log.error("订单创建前检测,订单商品信息为空");
             throw new BizException("订单商品信息为空");
         }
@@ -159,10 +161,8 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
                 }
                 price = tenantAlbum.getSalePrice();
                 userOrderDetail.setMerchId(tenantInfo.getId());
-                tenantAlbumContent.setBuyMultiple(1);
-                tenantAlbumContent.setBuyNumber(1);
-                tenantAlbumContent.setBuyCycle(tenantAlbumContent.getBuyCycle());
-                tenantAlbumContent.setTenantId(tenantInfo.getId());
+                tenantAlbumBuy.setBuyCycle(1);
+                tenantAlbumBuy.setBuyNumber(1);
                 break;
             }
 
@@ -179,8 +179,6 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
                 }
                 price = tenantAlbum.getOriginalPrice();
                 userOrderDetail.setMerchId(0L);
-                tenantAlbumContent.setTenantId(tenantStaff.getTenantId());
-                tenantAlbumContent.setBuyCycle(tenantAlbumContent.getBuyCycle()*tenantAlbumContent.getBuyMultiple());
                 break;
             }
         }
@@ -189,10 +187,9 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
 
         userOrderDetail.setGoodUrl(userOrderService.getGoodUrlByType(orderGoodsInfo.getGoodType()));
         userOrderDetail.setBizId(tenantAlbum.getId());
-        userOrderDetail.setBizContent(JSON.toJSONString(tenantAlbumContent));
         userOrderDetail.setGoodNum(orderGoodsInfo.getGoodNum());
         userOrderDetail.setOriginalPrice(price.multiply(new BigDecimal(orderGoodsInfo.getGoodNum()))
-                .multiply(new BigDecimal(tenantAlbumContent.getBuyCycle())));
+                .multiply(new BigDecimal(tenantAlbumBuy.getBuyCycle())));
         userOrderDetail.setCouponAmount(BigDecimal.ZERO);
         userOrderDetail.setExpectPrice(userOrderDetail.getOriginalPrice());
         userOrderDetail.setActualPrice(userOrderDetail.getExpectPrice().subtract(userOrderDetail.getCouponAmount()));
@@ -211,43 +208,69 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
     public void orderSuccess(UserOrderDetailVo userOrderDetailVo) {
 
         // 学生 插入机构专辑购买数据
-        // 学生购买机构专辑
-        switch (userOrderDetailVo.getOrderClient()) {
-            case STUDENT: {
-                tenantActivationCodeService.addUserTenantAlbumRecord(userOrderDetailVo.getUserId(),userOrderDetailVo);
 
-                break;
-            }
 
-            case TENANT: {
-                // 机构   插入机构专辑购买记录,生成机构专辑激活码
-
-                TenantAlbumWrapper.TenantAlbumContent tenantAlbumContent = JSON
-                        .parseObject(JSON.toJSONString(userOrderDetailVo.getBizContent()), TenantAlbumWrapper.TenantAlbumContent.class);
-                TenantAlbumPurchase tenantAlbumPurchase = new TenantAlbumPurchase();
-                tenantAlbumPurchase.setTenantId(userOrderDetailVo.getMerchId());
-                tenantAlbumPurchase.setTenantAlbumId(userOrderDetailVo.getBizId());
-                tenantAlbumPurchase.setPurchaseTime(userOrderDetailVo.getCreateTime());
-                tenantAlbumPurchase.setPurchaseQuantity(userOrderDetailVo.getGoodNum());
-                tenantAlbumPurchase.setPurchaseCycle(tenantAlbumContent.getBuyCycle());
-                tenantAlbumPurchase.setActiveQuantity(0);
-                tenantAlbumPurchase.setPurchaseStatus(OrderStatusEnum.PAID.getCode());
-                tenantAlbumPurchaseService.save(tenantAlbumPurchase);
-
-                List<TenantActivationCode> tenantActivationCodes = new ArrayList<>();
-                for (int i = 0; i < userOrderDetailVo.getGoodNum(); i++) {
-                    TenantActivationCode tenantActivationCode = new TenantActivationCode();
-                    tenantActivationCode.setTenantId(tenantAlbumContent.getTenantId());
-                    tenantActivationCode.setTenantAlbumId(tenantAlbumContent.getTenantAlbumId());
-                    tenantActivationCode.setTenantAlbumPurchaseId(tenantAlbumPurchase.getId());
-                    tenantActivationCode.setActivationCode(String.valueOf(IdWorker.getId()));
-                    tenantActivationCode.setSendStatus(EActivationCode.WAIT);
-                    tenantActivationCodes.add(tenantActivationCode);
-                }
-                tenantActivationCodeService.saveBatch(tenantActivationCodes);
-                break;
-            }
+        // 机构   插入机构专辑购买记录,生成机构专辑激活码
+
+    }
+
+    /**
+     * 新增机构专辑
+     * @param album
+     * @return
+     */
+    @Override
+    public Boolean insertTenantAlbum(TenantAlbumWrapper.TenantAlbum album) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        TenantInfo tenantInfo = tenantInfoService.lambdaQuery().eq(TenantInfo::getUserId, sysUser.getId())
+                .last("limit 1").one();
+        if (tenantInfo == null) {
+            throw new BizException("非法请求");
+        }
+
+        //给机构专辑赋值
+        TenantAlbum tenantAlbum = new TenantAlbum();
+        tenantAlbum.setName(album.getName());
+        tenantAlbum.setDescribe(album.getDescribe());
+        tenantAlbum.setCoverImg(album.getCoverImg());
+        tenantAlbum.setPurchaseCycle(album.getPurchaseCycle());
+        tenantAlbum.setSalePrice(album.getSalePrice());
+
+        //tenantAlbumService.addTenantAlbum(tenantAlbum);
+        add(tenantAlbum);
+        //关联表赋值
+        //tenantAlbumService.addTenantId(album.getTenantId());
+        TenantAlbumRef ref = new TenantAlbumRef();
+        ref.setTenantAlbumId(album.getId());
+        ref.setTenantId(album.getTenantId());
+        tenantAlbumRefService.add(ref);
+        //曲目表赋值
+        List<TenantAlbumWrapper.TenantAlbum.MusicSheetData> data = album.getMusicSheetData();
+
+        List<TenantAlbumMusic> tenantAlbumMusics = album.getMusicSheetData().stream().map(next -> {
+
+            AtomicInteger sort = new AtomicInteger(0);
+            return next.getMusicSheetIdList().stream().map(tenantAlbumMusic -> {
+
+                TenantAlbumMusic tenantAlbumMusic1 = new TenantAlbumMusic();
+                //tenantAlbumMusic1.setId(tenantAlbumMusic);
+                tenantAlbumMusic1.setSubjectType(next.getSubjectType());
+                tenantAlbumMusic1.setTenantId(album.getTenantId());
+                tenantAlbumMusic1.setMusicSheetId(tenantAlbumMusic);
+                tenantAlbumMusic1.setDelFlag(true);
+                tenantAlbumMusic1.setTenantAlbumId(tenantAlbum.getId());
+                tenantAlbumMusic1.setSortNumber(sort.getAndIncrement());
+                return tenantAlbumMusic1;
+            }).collect(Collectors.toList());
+
+        }).flatMap(Collection::stream).collect(Collectors.toList());
+
+        if(!tenantAlbumMusics.isEmpty()){
+            tenantAlbumMusicService.saveBatch(tenantAlbumMusics,100);
         }
 
+        return true;
     }
+
+
 }

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

@@ -1,5 +1,6 @@
 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.Wrappers;
@@ -17,6 +18,7 @@ import com.yonge.cooleshow.biz.dal.mapper.TenantStaffMapper;
 import com.yonge.cooleshow.biz.dal.service.SysAreaService;
 import com.yonge.cooleshow.biz.dal.service.SysConfigService;
 import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantInfoWrapper;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
@@ -83,8 +85,8 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoMapper, TenantI
         if (id == null || id == -1) {
             return null;
         }
-
-        return baseMapper.selectById(id);
+        TenantInfo info = baseMapper.selectById(id);
+        return info;
     }
 
     /**
@@ -105,7 +107,7 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoMapper, TenantI
         for (int i = 0; i < tenantInfos.size(); i++) {
             TenantInfoWrapper.TenantInfo info = tenantInfos.get(i);
             long id = info.getId();
-            listId.add(i, (int) id);
+            listId.add(i,(int)id);
         }
         //查询对应机构的老师数量
         List<Integer> listTeacher = new ArrayList<>();
@@ -436,6 +438,18 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoMapper, TenantI
         return  true;
     }
 
+    @Override
+    public TenantInfoWrapper.TenantInfo Infodetail(Long id) {
+        if (id == null || id == -1) {
+            return null;
+        }
+        TenantInfoWrapper.TenantInfo info = tenantInfoMapper.selectInfoById(id);
+
+        info.setStudentCounts(tenantInfoMapper.queryStudentCount(id));
+        info.setTeacherCounts(tenantInfoMapper.queryTeacherCount(id));
+        return info;
+    }
+
 
     /**
      * 匹配地区码与省市区

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

@@ -1,8 +1,21 @@
 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 com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.biz.dal.dao.StudentDao;
+import com.yonge.cooleshow.biz.dal.dao.SubjectDao;
+import com.yonge.cooleshow.biz.dal.dao.TeacherDao;
+import com.yonge.cooleshow.biz.dal.entity.Student;
+import com.yonge.cooleshow.biz.dal.entity.Subject;
+import com.yonge.cooleshow.biz.dal.entity.Teacher;
+import com.yonge.cooleshow.biz.dal.service.StudentService;
+import com.yonge.cooleshow.biz.dal.service.TeacherService;
+import com.yonge.toolset.base.exception.BizException;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.beans.BeanUtils;
 import lombok.extern.slf4j.Slf4j;
@@ -11,6 +24,10 @@ import com.yonge.cooleshow.biz.dal.wrapper.TenantUnbindRecordWrapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantUnbindRecordMapper;
 import com.yonge.cooleshow.biz.dal.service.TenantUnbindRecordService;
 
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
 /**
  * 机构解绑申请记录
  * 2023-07-21 17:32:49
@@ -19,6 +36,28 @@ import com.yonge.cooleshow.biz.dal.service.TenantUnbindRecordService;
 @Service
 public class TenantUnbindRecordServiceImpl extends ServiceImpl<TenantUnbindRecordMapper, TenantUnbindRecord> implements TenantUnbindRecordService {
 
+
+    @Autowired
+    private TeacherDao teacherDao;
+
+    @Autowired
+    private StudentDao studentDao;
+
+    @Autowired
+    private SubjectDao subjectDao;
+
+    @Autowired
+    private TenantUnbindRecordService tenantUnbindRecordService;
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private StudentService studentService;
+
+    @Autowired
+    private TeacherService teacherService;
+
 	/**
      * 查询详情
      * @param id 详情ID
@@ -38,8 +77,83 @@ public class TenantUnbindRecordServiceImpl extends ServiceImpl<TenantUnbindRecor
      */
     @Override
     public IPage<TenantUnbindRecordWrapper.TenantUnbindRecord> selectPage(IPage<TenantUnbindRecordWrapper.TenantUnbindRecord> page, TenantUnbindRecordWrapper.TenantUnbindRecordQuery query) {
-        
-        return page.setRecords(baseMapper.selectPage(page, query));
+
+        List<TenantUnbindRecordWrapper.TenantUnbindRecord> records = baseMapper.selectPage(page, query);
+        if(records.isEmpty()){
+            return page.setRecords(records);
+        }
+
+        Map<String, List<TenantUnbindRecordWrapper.TenantUnbindRecord>> gropuByUserType = records.stream().collect(Collectors.groupingBy(TenantUnbindRecordWrapper.TenantUnbindRecord::getUserType));
+
+        List<Long> teacherIds  = new ArrayList<>();
+        List<Long> studentIds  = new ArrayList<>();
+
+        for (Map.Entry<String, List<TenantUnbindRecordWrapper.TenantUnbindRecord>> entry : gropuByUserType.entrySet()) {
+            if("TEACHER".equals(entry.getKey())){
+                teacherIds.addAll(entry.getValue().stream().map(TenantUnbindRecordWrapper.TenantUnbindRecord::getUserId).collect(Collectors.toList()));
+            }else{
+                studentIds.addAll(entry.getValue().stream().map(TenantUnbindRecordWrapper.TenantUnbindRecord::getUserId).collect(Collectors.toList()));
+
+            }
+
+        }
+        List<Teacher> teachers = new ArrayList<>();
+        List<Teacher> students = new ArrayList<>();
+        List<Teacher> users = new ArrayList<>();
+        if(!teacherIds.isEmpty()){
+            QueryWrapper<Teacher>
+                    objectQueryWrapper = new QueryWrapper<>();
+            objectQueryWrapper.lambda()
+                    .in(Teacher::getUserId,teacherIds);
+            teachers = teacherDao.selectList(objectQueryWrapper);
+        }else {
+            QueryWrapper<Student>
+                    objectQueryWrapper = new QueryWrapper<>();
+            objectQueryWrapper.lambda()
+                    .in(Student::getUserId,studentIds);
+            List<Student> studentList = studentDao.selectList(objectQueryWrapper);
+            students =studentList.stream().map(next->{
+                Teacher teacher = new Teacher();
+                teacher.setUserId(next.getUserId());
+                teacher.setSubject(next.getSubjectId());
+                return teacher;
+            }).collect(Collectors.toList());
+        }
+        users.addAll(students);
+        users.addAll(teachers);
+
+        List<Long> subjectIdList = users.stream().map(next -> {
+            List<Long > list = new ArrayList<>();
+            String subjectId = next.getSubjectId();
+            if (StringUtils.isEmpty(subjectId)) {
+                return list;
+            }
+            return Arrays.stream(next.getSubjectId().split(",")).map(Long::valueOf).collect(Collectors.toList());
+        }).flatMap(Collection::stream).collect(Collectors.toList());
+
+        Map<Long,String> userIdSubjectNameMap = new HashMap<>();
+        if(!subjectIdList.isEmpty()){
+            List<Subject> subjectList = subjectDao.findBySubjectIds(subjectIdList);
+            Map<Long, String> idNameMap = subjectList.stream().collect(Collectors.toMap(Subject::getId, Subject::getName));
+
+            for (Teacher user : users) {
+                String subjectId = user.getSubjectId();
+                if(StringUtils.isEmpty(subjectId)){
+                    continue;
+                }
+                List<String> names = Arrays.stream(subjectId.split(",")).map(next ->
+                        idNameMap.getOrDefault(Long.valueOf(next), "")).collect(Collectors.toList());
+                userIdSubjectNameMap.put(user.getUserId(),String.join(",",names));
+            }
+        }
+
+        for (TenantUnbindRecordWrapper.TenantUnbindRecord record : records) {
+            record.setSubjectName(userIdSubjectNameMap.getOrDefault(record.getUserId(),""));
+
+        }
+
+
+        return page.setRecords(records);
     }
 	
     /**
@@ -63,4 +177,32 @@ public class TenantUnbindRecordServiceImpl extends ServiceImpl<TenantUnbindRecor
 
         return this.updateById(JSON.parseObject(tenantUnbindRecord.jsonString(), TenantUnbindRecord.class));       
     }
+
+    @Override
+    public Boolean entry(TenantUnbindRecordWrapper.Audio audio) {
+        boolean update = tenantUnbindRecordService.lambdaUpdate()
+                .set(TenantUnbindRecord::getStatus, audio.getStatus() ? "PASS" : "UNPASS")
+                .set(TenantUnbindRecord::getReason, audio.getReason())
+                .set(TenantUnbindRecord::getVerifyUserId, sysUserFeignService.queryUserInfo().getId())
+                .eq(TenantUnbindRecord::getId, audio.getId())
+                .eq(TenantUnbindRecord::getStatus, "DOING").update();
+        if (!update) {
+            throw new BizException("审核失败,请刷新后重试");
+        }
+
+        if (audio.getStatus()) {
+            TenantUnbindRecord unbindRecord = tenantUnbindRecordService.getById(audio.getId());
+            String userType = unbindRecord.getUserType();
+            if ("STUDENT".equals(userType)) {
+                studentService.lambdaUpdate()
+                        .set(Student::getTenantId, -1L)
+                        .eq(Student::getUserId, unbindRecord.getUserId()).update();
+            } else if ("TEACHER".equals(userType)) {
+                teacherService.lambdaUpdate()
+                        .set(Teacher::getTenantId, -1L)
+                        .eq(Teacher::getUserId, unbindRecord.getUserId()).update();
+            }
+        }
+        return null;
+    }
 }

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

@@ -29,6 +29,7 @@ import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderPayRes;
+import com.yonge.cooleshow.biz.dal.wrapper.PaymentDivMemberRecordWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.coupon.CouponOrderWrapper;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
@@ -1097,6 +1098,21 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
                 .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
     }
 
+    @Override
+    public UserOrder getByOrderNo(String orderNo) {
+        return this.lambdaQuery().eq(UserOrder::getOrderNo, orderNo).last("limit 1").one();
+    }
+
+    @Override
+    public IPage<PaymentDivMemberRecordWrapper.IndexIncomeQueryDto> queryExpend(IPage<PaymentDivMemberRecordWrapper.IndexIncomeQueryDto> page, PaymentDivMemberRecordWrapper.IndexIncomeQuery query) {
+        return page.setRecords(baseMapper.queryExpend(page, query));
+    }
+
+    @Override
+    public PaymentDivMemberRecordWrapper.OrderDetailDto getExpendOrderDetail(String orderNo) {
+        return baseMapper.getExpendOrderDetail(orderNo);
+    }
+
     /**
      * 获取平台服务费率
      *

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

@@ -416,7 +416,7 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
     public UserPaymentOrderWrapper.PaymentConfig executeOrder(UserPaymentOrderWrapper.UserPaymentOrder orderReq) {
 
         // 填充订单基本信息
-        orderReq.id(IdWorker.getId())
+        orderReq
             .orderNo(IdWorker.getIdStr())
             .paymentVender(Optional.ofNullable(orderReq.getPaymentType()).orElse(paymentServiceContext.getPaymentService().venderName()))
             .paymentChannel("")

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

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

+ 182 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/PaymentDivMemberRecordWrapper.java

@@ -0,0 +1,182 @@
+package com.yonge.cooleshow.biz.dal.wrapper;
+
+import com.alibaba.fastjson.JSON;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
+import com.yonge.cooleshow.common.enums.payment.EGoodsType;
+import com.yonge.cooleshow.common.enums.payment.EOrderType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Optional;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * 分账子账户记录表
+ * 2023-07-28 15:45:03
+ */
+@ApiModel(value = "PaymentDivMemberRecordWrapper对象", description = "分账子账户记录表查询对象")
+public class PaymentDivMemberRecordWrapper {
+
+    @Data
+	@Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" PaymentDivMemberRecordQuery-分账子账户记录表")
+    public static class PaymentDivMemberRecordQuery implements QueryInfo {
+    
+    	@ApiModelProperty("当前页")
+        private Integer page;
+        
+        @ApiModelProperty("分页行数")
+        private Integer rows;
+        
+        @ApiModelProperty("关键字匹配")
+		private String keyword;
+        
+        public String getKeyword() {
+            return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
+        }
+        
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static PaymentDivMemberRecordQuery from(String json) {
+            return JSON.parseObject(json, PaymentDivMemberRecordQuery.class);
+        }
+    }
+
+    @Data
+    @ApiModel("首页收入明细查询")
+    public static class IndexIncomeQuery implements QueryInfo {
+
+    	@ApiModelProperty("当前页")
+        private Integer page;
+
+        @ApiModelProperty("分页行数")
+        private Integer rows;
+
+        @ApiModelProperty("关键字匹配")
+		private String keyword;
+
+        @ApiModelProperty("支付时间")
+		private String startTime;
+
+        @ApiModelProperty("支付时间")
+		private String endTime;
+
+        @ApiModelProperty("订单类型")
+        private EOrderType orderType;
+
+        @ApiModelProperty("排序字段")
+        private String sortField = "payTime";
+
+        @ApiModelProperty("排序方式")
+        private String sortType = "DESC";
+
+        private Long tenantId;
+
+        public String getKeyword() {
+            return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
+        }
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static PaymentDivMemberRecordQuery from(String json) {
+            return JSON.parseObject(json, PaymentDivMemberRecordQuery.class);
+        }
+    }
+
+    @Data
+    @ApiModel("首页收入明细查询")
+    public static class IndexIncomeQueryDto{
+
+        @ApiModelProperty("姓名")
+        private String name;
+
+        @ApiModelProperty("头像")
+        private String avatar;
+
+        @ApiModelProperty("电话号码")
+        private String phone;
+
+        @ApiModelProperty("金额")
+        private BigDecimal amount;
+
+        @ApiModelProperty("支付时间")
+        private String payTime;
+
+        @ApiModelProperty("订单编号")
+        private String orderNo;
+
+        @ApiModelProperty("订单类型")
+        private EOrderType orderType;
+    }
+
+    @Data
+    @ApiModel("首页收入、支出汇总")
+    public static class IndexIncomeSummaryDto{
+
+        @ApiModelProperty("累计收入")
+        private BigDecimal totalIncome = BigDecimal.ZERO;
+
+        @ApiModelProperty("累计支出")
+        private BigDecimal totalExpend = BigDecimal.ZERO;
+
+        @ApiModelProperty("收入汇总详情")
+        private List<IndexIncomeSummaryDetailDto> incomeDtos;
+
+        @ApiModelProperty("支出汇总详情")
+        private List<IndexIncomeSummaryDetailDto> expendDtos;
+    }
+
+    @Data
+    @ApiModel("首页收入、支出汇总")
+    public static class IndexIncomeSummaryDetailDto{
+        @ApiModelProperty("金额")
+        private BigDecimal amount = BigDecimal.ZERO;
+
+        @ApiModelProperty("订单类型")
+        private EOrderType orderType;
+    }
+
+    @Data
+    @ApiModel("首页订单详情")
+    public static class OrderDetailDto extends IndexIncomeQueryDto{
+
+        @ApiModelProperty("商品类型")
+        private EGoodsType goodsType;
+
+        @ApiModelProperty("商品图片")
+        private String goodsUrl;
+
+        @ApiModelProperty("商品名称")
+        private String goodsName;
+
+        @ApiModelProperty("商品数量")
+        private Integer goodsNum;
+    }
+
+	@ApiModel(" PaymentDivMemberRecord-分账子账户记录表")
+    public static class PaymentDivMemberRecord {
+        
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static PaymentDivMemberRecord from(String json) {
+            return JSON.parseObject(json, PaymentDivMemberRecord.class);
+        }
+	}
+
+}

+ 63 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/PaymentDivMemberWrapper.java

@@ -0,0 +1,63 @@
+package com.yonge.cooleshow.biz.dal.wrapper;
+
+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;
+
+/**
+ * 分账子账户配置
+ * 2023-07-28 16:53:51
+ */
+@ApiModel(value = "PaymentDivMemberWrapper对象", description = "分账子账户配置查询对象")
+public class PaymentDivMemberWrapper {
+
+    @Data
+	@Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" PaymentDivMemberQuery-分账子账户配置")
+    public static class PaymentDivMemberQuery implements QueryInfo {
+    
+    	@ApiModelProperty("当前页")
+        private Integer page;
+        
+        @ApiModelProperty("分页行数")
+        private Integer rows;
+        
+        @ApiModelProperty("关键字匹配")
+		private String keyword;
+        
+        public String getKeyword() {
+            return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
+        }
+        
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static PaymentDivMemberQuery from(String json) {
+            return JSON.parseObject(json, PaymentDivMemberQuery.class);
+        }
+    }  
+
+	@ApiModel(" PaymentDivMember-分账子账户配置")
+    public static class PaymentDivMember {
+        
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static PaymentDivMember from(String json) {
+            return JSON.parseObject(json, PaymentDivMember.class);
+        }
+	}
+
+}

+ 63 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/PaymentMerchantConfigWrapper.java

@@ -0,0 +1,63 @@
+package com.yonge.cooleshow.biz.dal.wrapper;
+
+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;
+
+/**
+ * 支付三方账户配置
+ * 2023-07-28 16:53:51
+ */
+@ApiModel(value = "PaymentMerchantConfigWrapper对象", description = "支付三方账户配置查询对象")
+public class PaymentMerchantConfigWrapper {
+
+    @Data
+	@Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" PaymentMerchantConfigQuery-支付三方账户配置")
+    public static class PaymentMerchantConfigQuery implements QueryInfo {
+    
+    	@ApiModelProperty("当前页")
+        private Integer page;
+        
+        @ApiModelProperty("分页行数")
+        private Integer rows;
+        
+        @ApiModelProperty("关键字匹配")
+		private String keyword;
+        
+        public String getKeyword() {
+            return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
+        }
+        
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static PaymentMerchantConfigQuery from(String json) {
+            return JSON.parseObject(json, PaymentMerchantConfigQuery.class);
+        }
+    }  
+
+	@ApiModel(" PaymentMerchantConfig-支付三方账户配置")
+    public static class PaymentMerchantConfig {
+        
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static PaymentMerchantConfig from(String json) {
+            return JSON.parseObject(json, PaymentMerchantConfig.class);
+        }
+	}
+
+}

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

@@ -11,6 +11,7 @@ import lombok.NoArgsConstructor;
 import org.apache.commons.lang3.StringUtils;
 
 import java.io.Serializable;
+import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.List;
@@ -117,31 +118,19 @@ public class StudentWrapper {
         @ApiModelProperty("声部,多个用逗号隔开")
         private String subjectId;
 
-        @ApiModelProperty("是否解绑")
-        private Boolean bindTenant;
+//        @ApiModelProperty("是否解绑")
+//        private Boolean bindTenant;
 
     }
 
     @Data
-    @ApiModel("解绑机构")
-    public static class UnbindTenant {
-
-        @ApiModelProperty("短信验证码")
-        private String code;
-
-        @ApiModelProperty("解绑原因")
-        private String unbindReason;
-    }
-
-
-    @Data
     @ApiModel("学生导入模板模型")
     public static class StudentExport {
 
         @ExcelProperty(value = "学生姓名")
         private String userName;
 
-        @ExcelProperty(value = "手机号")
+        @ExcelProperty(value = "手机号")
         private String phone;
 
         @ExcelProperty(value = "声部")
@@ -153,6 +142,11 @@ public class StudentWrapper {
         @ExcelProperty(value = "性别")
         private String gender;
 
+        private static final String PHONE_REG = "^(13\\d|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18\\d|19[0-35-9])" +
+                "\\d{8}$";
+
+        private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd");
+
         public List<String> checkValid() {
             ArrayList<String> errMsg = new ArrayList<>();
             if (StringUtils.isEmpty(userName)) {
@@ -160,8 +154,7 @@ public class StudentWrapper {
             }
             if (StringUtils.isEmpty(phone)) {
                 errMsg.add("手机号为空");
-            }
-            if (Pattern.matches("^1[3-9]\\d{9}$", phone)) {
+            } else if (!Pattern.matches(PHONE_REG, phone)) {
                 errMsg.add("手机号格式错误");
             }
             if (StringUtils.isEmpty(subjectId)) {
@@ -169,6 +162,15 @@ public class StudentWrapper {
             }
             if (StringUtils.isEmpty(birthday)) {
                 errMsg.add("出生日期为空");
+            } else {
+                if (birthday.contains("/")) {
+                    birthday = birthday.replaceAll("/", "-");
+                }
+                try {
+                    SDF.parse(birthday);
+                } catch (Exception e) {
+                    errMsg.add("出生日期格式错误");
+                }
             }
             if (StringUtils.isEmpty(gender)) {
                 errMsg.add("性别为空");
@@ -176,4 +178,15 @@ public class StudentWrapper {
             return errMsg;
         }
     }
+
+    @Data
+    @ApiModel("学生修改机构")
+    public static class StudentUpdateTenant {
+
+        @ApiModelProperty("学生ID")
+        private Long studentId;
+
+        @ApiModelProperty("机构ID")
+        private Long tenantId;
+    }
 }

+ 43 - 6
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/SysGoodsPriceWrapper.java

@@ -1,9 +1,14 @@
 package com.yonge.cooleshow.biz.dal.wrapper;
 
 import com.alibaba.fastjson.JSON;
-import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.yonge.toolset.base.page.QueryInfo;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.util.Date;
 import java.util.Optional;
 
 import lombok.AllArgsConstructor;
@@ -24,13 +29,13 @@ public class SysGoodsPriceWrapper {
     @NoArgsConstructor
     @AllArgsConstructor
     @ApiModel(" SysGoodsPriceQuery-商品价格设置")
-    public static class SysGoodsPriceQuery implements QueryInfo {
+    public static class SysGoodsPriceQuery extends QueryInfo {
     
     	@ApiModelProperty("当前页")
-        private Integer page;
+        private int page;
         
         @ApiModelProperty("分页行数")
-        private Integer rows;
+        private int rows;
         
         @ApiModelProperty("关键字匹配")
 		private String keyword;
@@ -46,11 +51,43 @@ public class SysGoodsPriceWrapper {
         public static SysGoodsPriceQuery from(String json) {
             return JSON.parseObject(json, SysGoodsPriceQuery.class);
         }
-    }  
+    }
 
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
 	@ApiModel(" SysGoodsPrice-商品价格设置")
     public static class SysGoodsPrice {
-        
+        @ApiModelProperty("主键ID")
+        private Long id;
+
+        @ApiModelProperty("商品类型")
+        private String goodsType;
+
+        @ApiModelProperty("销售价")
+        private BigDecimal salePrice;
+
+        @ApiModelProperty("原价")
+        private BigDecimal originalPrice;
+
+        @ApiModelProperty("描述")
+        private String describe;
+
+        @ApiModelProperty("购买周期")
+        private Integer duration;
+
+        @ApiModelProperty("图片")
+        private String goodsImg;
+
+        @ApiModelProperty("更新人")
+        private Long updateBy;
+
+        @ApiModelProperty("更新时间")
+        private Date updateTime;
+
+        @ApiModelProperty("创建时间")
+        private Date createTime;
         public String jsonString() {
             return JSON.toJSONString(this);
         }

+ 32 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantActivationCodeWrapper.java

@@ -1,12 +1,16 @@
 package com.yonge.cooleshow.biz.dal.wrapper;
 
+import com.alibaba.excel.annotation.ExcelProperty;
 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.ArrayList;
 import java.util.Date;
+import java.util.List;
 import java.util.Optional;
+import java.util.regex.Pattern;
 
 import lombok.AllArgsConstructor;
 import lombok.Builder;
@@ -126,4 +130,32 @@ public class TenantActivationCodeWrapper {
         }
     }
 
+    @Data
+    public static class ImportTemplate {
+
+        @ExcelProperty(value = "激活码")
+        private String code;
+
+        @ExcelProperty(value = "手机号")
+        private String phone;
+
+        private static final String PHONE_REG = "^(13\\d|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18\\d|19[0-35-9])" +
+                "\\d{8}$";
+
+        public List<String> checkIsIllegal() {
+            List<String> errMsg = new ArrayList<>();
+            if (StringUtils.isEmpty(code)) {
+                errMsg.add("激活码不能为空");
+            }
+            if (StringUtils.isEmpty(phone)) {
+                errMsg.add("手机号不能为空");
+            } else if (!Pattern.matches(PHONE_REG, phone)) {
+                errMsg.add("手机号格式错误");
+            }
+            return errMsg;
+        }
+
+
+    }
+
 }

+ 78 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantAlbumWrapper.java

@@ -2,9 +2,15 @@ package com.yonge.cooleshow.biz.dal.wrapper;
 
 import com.alibaba.fastjson.JSON;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.yonge.cooleshow.biz.dal.enums.SubjectTypeEnum;
+
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
 import java.util.Optional;
 
 import lombok.AllArgsConstructor;
@@ -25,7 +31,10 @@ public class TenantAlbumWrapper {
     @NoArgsConstructor
     @AllArgsConstructor
     @ApiModel(" TenantAlbumQuery-机构专辑")
-    public static class TenantAlbumQuery implements QueryInfo {
+    public static class   TenantAlbumQuery implements QueryInfo {
+
+        @ApiModelProperty("主键ID")
+        private Long id;
 
         @ApiModelProperty("当前页")
         private Integer page;
@@ -39,6 +48,12 @@ public class TenantAlbumWrapper {
         @ApiModelProperty("机构ID")
         private Long tenantId;
 
+        @ApiModelProperty("专辑名称")
+        private String name;
+
+        @ApiModelProperty("机构名称")
+        private String tenantName;
+
         public String getKeyword() {
             return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
         }
@@ -52,9 +67,61 @@ public class TenantAlbumWrapper {
         }
     }
 
-    @ApiModel(" TenantAlbum-机构专辑")
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" TenantAlbum-机构专辑返回")
     public static class TenantAlbum {
 
+            @ApiModelProperty("主键ID")
+            private Long id;
+
+            @ApiModelProperty("机构ID")
+            private Long tenantId;
+
+            @ApiModelProperty("专辑名称")
+            private String name;
+
+            @ApiModelProperty("机构名称")
+            private String tenantName;
+
+            @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;
+
+        @ApiModelProperty("曲目相关信息")
+        private List<MusicSheetData> musicSheetData = new ArrayList<>();
+
         public String jsonString() {
             return JSON.toJSONString(this);
         }
@@ -62,6 +129,14 @@ public class TenantAlbumWrapper {
         public static TenantAlbum from(String json) {
             return JSON.parseObject(json, TenantAlbum.class);
         }
+
+        @Data
+        public static class MusicSheetData{
+            private SubjectTypeEnum subjectType;
+
+            private List<Long> musicSheetIdList = new ArrayList<>();
+        }
+
     }
 
     @Data
@@ -111,7 +186,7 @@ public class TenantAlbumWrapper {
         @ApiModelProperty(value = "采购周期",hidden = true)
         private Integer buyCycle;
 
-        @ApiModelProperty("采购机构")
+        @ApiModelProperty(value = "采购机构",hidden = true)
         private Long tenantId;
 
     }

+ 13 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantUnbindRecordWrapper.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;
@@ -48,6 +49,9 @@ public class TenantUnbindRecordWrapper {
         @ApiModelProperty("用户类型,TEACHER/STUDENT")
         private String userType;
 
+        @ApiModelProperty("审核状态 DOING、审核中 PASS、通过 UNPASS、不通过")
+        private String status;
+
         public String getKeyword() {
             return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
         }
@@ -134,6 +138,15 @@ public class TenantUnbindRecordWrapper {
         @ApiModelProperty("创建时间")
         private Date createTime;
 
+        @ApiModelProperty("头像")
+        private String avatar;
+
+        @ApiModelProperty("声部Id")
+        private String subjectId;
+
+        @ApiModelProperty("声部名称")
+        private String subjectName;
+
 
         public String jsonString() {
             return JSON.toJSONString(this);

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

@@ -317,8 +317,8 @@ public class UserPaymentOrderWrapper {
                     .orderClient(getPaymentClient())
                     .userId(getUserId())
                     .orderNo(getOrderNo())
-                    .orderType(OrderTypeEnum.valueOf(getOrderType().name()))
-                    .status(OrderStatusEnum.parse(getStatus()))
+                    .orderType(getOrderType() !=null?OrderTypeEnum.valueOf(getOrderType().name()):null)
+                    .status(getStatus() !=null? OrderStatusEnum.parse(getStatus()):null)
                     .originalPrice(getOriginalPrice())
                     .expectPrice(getCurrentPrice())
                     .actualPrice(getPaymentCashAmount())
@@ -834,7 +834,7 @@ public class UserPaymentOrderWrapper {
         private Long userId;
 
 
-        @ApiModelProperty("用户身份")
+        @ApiModelProperty(value = "用户身份",hidden = true)
         private ClientEnum paymentClient;
 
         @ApiModelProperty(value = "生成的订单详情信息",hidden = true)

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

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

+ 23 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/PaymentDivMemberMapper.xml

@@ -0,0 +1,23 @@
+<?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.PaymentDivMemberMapper">
+
+	 
+    
+    <!-- 表字段 -->
+    <sql id="baseColumns">
+         t.id_ AS id
+        , t.tenant_id_ AS tenantId
+        , t.app_id_ AS appId
+        , t.member_id_ AS memberId
+        , t.create_time_ AS createTime
+        , t.update_time_ AS updateTime
+        </sql> 
+    
+    <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.entity.PaymentDivMember">
+		SELECT         
+        	<include refid="baseColumns" />
+		FROM payment_div_member t
+	</select>
+    
+</mapper>

+ 107 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/PaymentDivMemberRecordMapper.xml

@@ -0,0 +1,107 @@
+<?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.PaymentDivMemberRecordMapper">
+
+    <!-- 表字段 -->
+    <sql id="baseColumns">
+         t.id_ AS id
+        , t.tenant_id_ AS tenantId
+        , t.app_id_ AS appId
+        , t.member_id_ AS memberId
+        , t.order_no_ AS orderNo
+        , t.trans_no_ AS transNo
+        , t.amount_ AS amount
+        , t.tenant_enter_flag_ AS tenantEnterFlag
+        , t.status_ AS status
+        , t.fee_flag_ AS feeFlag
+        , t.fee_amt_ AS feeAmt
+        , t.create_time_ AS createTime
+        , t.update_time_ AS updateTime
+        </sql> 
+    
+    <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.entity.PaymentDivMemberRecord">
+		SELECT         
+        	<include refid="baseColumns" />
+		FROM payment_div_member_record t
+	</select>
+    <select id="queryIncome"
+            resultType="com.yonge.cooleshow.biz.dal.wrapper.PaymentDivMemberRecordWrapper$IndexIncomeQueryDto">
+        select
+            pdmr.order_no_ as orderNo,
+            sut.name_ as name,
+            su.avatar_ as avatar,
+            su.phone_ as phone,
+            pdmr.amount_ as amount,
+            uo.pay_time_ as payTime,
+            uo.order_type_ as orderType
+        from
+            payment_div_member_record pdmr
+                left join
+            user_order uo ON uo.order_no_ = pdmr.order_no_
+                left join
+            sys_user_tsign sut ON sut.user_id_ = pdmr.user_id_
+                left join
+            sys_user su ON su.id_ = sut.user_id_
+        where
+            pdmr.status_ = 'SUCCESS' AND pdmr.tenant_id_ = #{param.tenantId}
+          <if test="param.startTime != null and param.startTime != ''">
+              AND uo.pay_time_ BETWEEN #{param.startTime} AND #{param.endTime}
+          </if>
+          <if test="param.orderType != null">
+              AND uo.order_type_ = #{param.orderType}
+          </if>
+          <if test="param.keyword != null and param.keyword != ''">
+              and sut.name_ LIKE CONCAT('%',#{param.keyword},'%')
+          </if>
+           ORDER BY ${param.sortField} ${param.sortType}
+    </select>
+    <select id="getIncomeOrderDetail"
+            resultType="com.yonge.cooleshow.biz.dal.wrapper.PaymentDivMemberRecordWrapper$OrderDetailDto">
+        select
+            pdmr.order_no_ as orderNo,
+            sut.name_ as name,
+            su.avatar_ as avatar,
+            su.phone_ as phone,
+            pdmr.amount_ as amount,
+            uo.pay_time_ as payTime,
+            uo.order_type_ as orderType,
+            uod.good_name_ as goodsName,
+            uod.good_num_ as goodsNum,
+            uod.good_type_ as goodsType,
+            uod.good_url_ as goodsUrl
+        from
+            payment_div_member_record pdmr
+                left join
+            user_order uo ON uo.order_no_ = pdmr.order_no_
+                left join
+            sys_user_tsign sut ON sut.user_id_ = pdmr.user_id_
+                left join
+            sys_user su ON su.id_ = sut.user_id_
+                left join
+            user_order_detail uod ON uod.order_no_ = uo.order_no_
+            WHERE pdmr.order_no_ = #{orderNo} AND pdmr.tenant_id_ = #{tenantId} LIMIT 1
+    </select>
+    <select id="incomeSummary"
+            resultType="com.yonge.cooleshow.biz.dal.wrapper.PaymentDivMemberRecordWrapper$IndexIncomeSummaryDetailDto">
+        select uo.order_type_ as orderType,SUM(pdmr.amount_) amount
+        from payment_div_member_record pdmr
+        left join user_order uo ON uo.order_no_ = pdmr.order_no_
+        where pdmr.status_ = 'SUCCESS' AND pdmr.tenant_id_ = #{query.tenantId}
+        <if test="param.startTime != null and param.startTime != ''">
+            AND uo.pay_time_ BETWEEN #{param.startTime} AND #{param.endTime}
+        </if>
+        group by uo.order_type_
+    </select>
+    <select id="expendSummary"
+            resultType="com.yonge.cooleshow.biz.dal.wrapper.PaymentDivMemberRecordWrapper$IndexIncomeSummaryDetailDto">
+        select uo.order_type_ as orderType,SUM(uo.actual_price_) amount
+        from user_order uo
+        where uo.status_ = 'SUCCESS' AND uo.order_type_ = 'TENANT_ALBUM'
+        AND uo.tenant_id_ = #{query.tenantId}
+        <if test="param.startTime != null and param.startTime != ''">
+            AND uo.pay_time_ BETWEEN #{param.startTime} AND #{param.endTime}
+        </if>
+        group by uo.order_type_
+    </select>
+
+</mapper>

+ 35 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/PaymentMerchantConfigMapper.xml

@@ -0,0 +1,35 @@
+<?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.PaymentMerchantConfigMapper">
+
+	 
+    
+    <!-- 表字段 -->
+    <sql id="baseColumns">
+         t.id_ AS id
+        , t.tenant_id_ AS tenantId
+        , t.payment_vendor_ AS paymentVendor
+        , t.payer_name_ AS payerName
+        , t.app_id_ AS appId
+        , t.mer_key_ AS merKey
+        , t.api_key_ AS apiKey
+        , t.mock_api_key_ AS mockApiKey
+        , t.rsa_private_key_ AS rsaPrivateKey
+        , t.rsa_public_key_ AS rsaPublicKey
+        , t.expend_params_ AS expendParams
+        , t.wx_app_id_ AS wxAppId
+        , t.wx_app_secret_ AS wxAppSecret
+        , t.alipay_app_id_ AS alipayAppId
+        , t.alipay_private_key_ AS alipayPrivateKey
+        , t.alipay_public_key_ AS alipayPublicKey
+        , t.create_time_ AS createTime
+        , t.update_time_ AS updateTime
+        </sql> 
+    
+    <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.entity.PaymentMerchantConfig">
+		SELECT         
+        	<include refid="baseColumns" />
+		FROM payment_merchant_config t
+	</select>
+    
+</mapper>

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

@@ -80,6 +80,9 @@
 	<sql id="selectSql">
 		select * from platform_cash_account_record
 		<where>
+			<if test="param.tenantId">
+				and tenant_id_ = #{param.tenantId}
+			</if>
 			<if test="param.orderNo">
 				and order_no_ = #{param.orderNo}
 			</if>
@@ -119,6 +122,9 @@
 			sum(case when in_or_out_ = 'OUT' and post_status_ = 'RECORDED' then trans_amount_ else 0 end) settledPayment
 		from platform_cash_account_record
 		<where>
+			<if test="param.tenantId">
+				and tenant_id_ = #{param.tenantId}
+			</if>
 			<if test="param.orderNo">
 				and order_no_ = #{param.orderNo}
 			</if>

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

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

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

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

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

@@ -21,10 +21,20 @@
         , t.create_time_ AS createTime
         </sql> 
     
-    <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.entity.TenantAlbum">
+    <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumWrapper$TenantAlbum">
 		SELECT         
         	<include refid="baseColumns" />
+        i.name_ AS tenantName
 		FROM tenant_album t
+        LEFT JOIN tenant_album_ref r on  t.id_ = r.tenant_album_id_
+        left join tenant_info i on r.tenant_id_ = i.id_
+        where 1=1
+        <if test="param.name != null and param.name != ''">
+            and t.name_ = #{param.name}
+        </if>
+        <if test="param.tenantId != null ">
+            and i.id_= #{param.tenantId}
+        </if>
 	</select>
     
 </mapper>

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

@@ -18,5 +18,10 @@
         	<include refid="baseColumns" />
 		FROM tenant_album_ref t
 	</select>
-    
+    <select id="selectByAlbumId" resultType="com.yonge.cooleshow.biz.dal.entity.TenantAlbumRef">
+        select <include refid="baseColumns" />
+        from tenant_album_ref
+        where tenant_album_id_ = #{id}
+    </select>
+
 </mapper>

+ 30 - 6
cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantInfoMapper.xml

@@ -27,11 +27,6 @@
         values (#{param.name},#{param.logo},#{param.briefIntroduction},#{param.provinceCode},#{param.cityCode},#{param.regionCode},#{param.username},#{param.phone})
     </insert>
 
-    <insert id="insertNow">
-        insert into tenant_entry_record (id_,tenant_id_,
-        )
-        (id_,)
-    </insert>
 
     <update id="updateInfo">
         update tenant_info
@@ -115,10 +110,16 @@
         SELECT count(t.tenant_id_) FROM teacher t where t.tenant_id_ IN (<foreach collection="listId" separator="," item="Id">#{Id}</foreach>)
     </select>
 
+    <select id="queryTeacherCount" resultType="java.lang.String">
+        SELECT count(t.tenant_id_) FROM teacher t where t.tenant_id_ = #{id}
+    </select>
+
     <select id="queryStudentCounts" resultType="java.lang.Integer">
         SELECT count(s.tenant_id_) FROM student s where s.tenant_id_ IN (<foreach collection="listId" separator="," item="Id">#{Id}</foreach>)
     </select>
-
+    <select id="queryStudentCount" resultType="java.lang.String">
+        SELECT count(s.tenant_id_) FROM student s where s.tenant_id_ = #{id}
+    </select>
     <select id="selectApplyPage" resultType="com.yonge.cooleshow.biz.dal.wrapper.TenantInfoWrapper$TenantInfo">
         SELECT
         id_ as id,
@@ -202,5 +203,28 @@
         id_ = #{param.id}
         </if>
     </select>
+    <select id="selectInfoById" resultType="com.yonge.cooleshow.biz.dal.wrapper.TenantInfoWrapper$TenantInfo">
+        select
+                  t.id_ AS id
+                , t.name_ AS name
+                , t.logo_ AS logo
+                , t.province_code_ AS provinceCode
+                , t.city_code_ AS cityCode
+                , t.region_code_ AS regionCode
+                , t.username_ AS userName
+                , t.user_id_ AS userId
+                , t.phone_ AS phone
+                , t.update_time_ AS updateTime
+                , t.create_time_ AS createTime
+                , t.brief_Introduction_ AS briefIntroduction
+        from tenant_info t
+        where 1=1
+        <if test="id != null">
+           id_ = #{id}
+        </if>
+        }
+
+    </select>
+
 
 </mapper>

+ 4 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantUnbindRecordMapper.xml

@@ -28,6 +28,7 @@
         ,ti.phone_ as tenantUserPhone
         ,su.username_ as userName
         ,su.phone_ as phone
+        ,su.avatar_ as avatar
         FROM tenant_unbind_record t
         LEFT JOIN tenant_info ti ON ti.id_ = t.tenant_id_
         LEFT JOIN sys_user su on su.id_ = t.user_id_
@@ -53,6 +54,9 @@
             <if test="param.regionCode != null">
                 AND ti.region_code_ = #{param.regionCode}
             </if>
+            <if test="param.status != null and param.status != ''">
+                AND t.status_ = #{param.status}
+            </if>
         </where>
         order by t.id_ desc
     </select>

+ 53 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderMapper.xml

@@ -124,6 +124,9 @@
             <if test="null != param.orderClient and '' != param.orderClient">
                 AND t.order_client_ = #{param.orderClient}
             </if>
+            <if test="param.tenantId != null">
+                and t.tenant_id_ = #{param.tenantId}
+            </if>
             <if test="param.paymentVersion != null">
                 and t.payment_version_ = #{param.paymentVersion}
             </if>
@@ -314,4 +317,54 @@
                 </if>
             </where>
     </select>
+    <select id="queryExpend"
+            resultType="com.yonge.cooleshow.biz.dal.wrapper.PaymentDivMemberRecordWrapper$IndexIncomeQueryDto">
+        select
+        uo.order_no_ as orderNo,
+        sut.name_ as name,
+        su.avatar_ as avatar,
+        su.phone_ as phone,
+        uo.actual_price_ as amount,
+        uo.pay_time_ as payTime,
+        uo.order_type_ as orderType
+        from user_order uo
+        left join
+        sys_user_tsign sut ON sut.user_id_ = uo.user_id_
+        left join
+        sys_user su ON su.id_ = sut.user_id_
+        where uo.status_ = 'SUCCESS' AND uo.tenant_id_ = #{param.tenantId} AND uo.order_type_ = 'TENANT_ALBUM'
+        <if test="param.startTime != null and param.startTime != ''">
+            AND uo.pay_time_ BETWEEN #{param.startTime} AND #{param.endTime}
+        </if>
+        <if test="param.orderType != null">
+            AND uo.order_type_ = #{param.orderType}
+        </if>
+        <if test="param.keyword != null and param.keyword != ''">
+            and sut.name_ LIKE CONCAT('%',#{param.keyword},'%')
+        </if>
+        ORDER BY ${param.sortField} ${param.sortType}
+    </select>
+    <select id="getExpendOrderDetail"
+            resultType="com.yonge.cooleshow.biz.dal.wrapper.PaymentDivMemberRecordWrapper$OrderDetailDto">
+        select
+            uo.order_no_ as orderNo,
+            sut.name_ as name,
+            su.avatar_ as avatar,
+            su.phone_ as phone,
+            uo.actual_price_ as amount,
+            uo.pay_time_ as payTime,
+            uo.order_type_ as orderType,
+            uod.good_name_ as goodsName,
+            uod.good_num_ as goodsNum,
+            uod.good_type_ as goodsType,
+            uod.good_url_ as goodsUrl
+        from user_order uo
+         left join
+        sys_user_tsign sut ON sut.user_id_ = uo.user_id_
+         left join
+        sys_user su ON su.id_ = sut.user_id_
+         left join
+        user_order_detail uod ON uod.order_no_ = uo.order_no_
+        WHERE pdmr.order_no_ = #{orderNo} LIMIT 1
+    </select>
 </mapper>

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

@@ -92,6 +92,9 @@
             left join sys_user au on t.auth_user_id_ = au.id_
         <where>
             u.del_flag_ = 0
+            <if test="param.tenantId !=null">
+                AND t.tenant_id_ = #{param.tenantId}
+            </if>
             <if test="param.userId !=null">
                 AND t.user_id_ = #{param.userId}
             </if>

+ 2 - 46
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/StudentController.java

@@ -36,6 +36,7 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
 import javax.validation.Valid;
 import java.util.List;
 
@@ -45,16 +46,13 @@ import java.util.List;
 public class StudentController extends BaseController {
     @Autowired
     private StudentService studentService;
-    @Autowired
+    @Resource
     private SysUserFeignService sysUserFeignService;
 
     @Autowired
     private SysUserService sysUserService;
 
     @Autowired
-    private TenantUnbindRecordService tenantUnbindRecordService;
-
-    @Autowired
     private SmsCodeService smsCodeService;
 
 
@@ -149,48 +147,6 @@ public class StudentController extends BaseController {
         return succeed(idcardInfoExtractor);
     }
 
-    @PostMapping("/unbindTenant")
-    @ApiOperation(value = "解绑机构申请")
-    public HttpResponseResult<Boolean> unbindTenant(@RequestBody StudentWrapper.UnbindTenant unbindTenant) {
-        SysUser user = sysUserFeignService.queryUserInfo();
-        if (user == null || null == user.getId()) {
-            return failed(HttpStatus.FORBIDDEN, "请登录");
-        }
-        if (StringUtils.isEmpty(unbindTenant.getCode())) {
-            return failed("验证码不能为空");
-        }
-        boolean validCode = smsCodeService.verifyValidCode(user.getPhone(), unbindTenant.getCode(), "");
-        if (validCode) {
-            return failed("验证码错误");
-        }
-        if (user.getTenantId() == null || user.getTenantId() == -1) {
-            return failed("非机构用户不需要解绑");
-        }
-
-        Student student = studentService.getById(user.getId());
-        if (student == null) {
-            return failed("未查询到学生的信息");
-        }
-
-        TenantUnbindRecord one = tenantUnbindRecordService.lambdaQuery()
-                .eq(TenantUnbindRecord::getTenantId, user.getTenantId())
-                .eq(TenantUnbindRecord::getUserType, "STUDENT")
-                .eq(TenantUnbindRecord::getUserId, user.getId())
-                .eq(TenantUnbindRecord::getStatus, "DOING")
-                .last("limit 1").one();
-        if (one != null) {
-            return failed("请勿重复申请");
-        }
-        TenantUnbindRecord tenantUnbindRecord = new TenantUnbindRecord();
-        tenantUnbindRecord.setTenantId(user.getTenantId());
-        tenantUnbindRecord.setUserId(user.getId());
-        tenantUnbindRecord.setUserType("STUDENT");
-        tenantUnbindRecord.setUnbindReason(unbindTenant.getUnbindReason());
-        tenantUnbindRecord.setStatus("DOING");
-        tenantUnbindRecordService.save(tenantUnbindRecord);
-        return succeed();
-    }
-
     @PostMapping("/logoffAccount")
     @ApiOperation(value = "注销学生账户")
     public HttpResponseResult<Boolean> logoffAccount(@RequestParam("code") String code) {

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

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

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

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

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

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

+ 61 - 0
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/IndexController.java

@@ -1,14 +1,19 @@
 package com.yonge.cooleshow.tenant.controller;
 
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.queryInfo.SysMusicCompareRecordQueryInfo;
+import com.yonge.cooleshow.biz.dal.service.PaymentDivMemberRecordService;
 import com.yonge.cooleshow.biz.dal.service.SysMusicCompareRecordService;
 import com.yonge.cooleshow.biz.dal.service.TenantPersonStatService;
+import com.yonge.cooleshow.biz.dal.service.UserOrderService;
+import com.yonge.cooleshow.biz.dal.wrapper.PaymentDivMemberRecordWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantPersonStatWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.mybatis.support.PageUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -28,6 +33,10 @@ public class IndexController extends BaseController {
     private SysMusicCompareRecordService sysMusicCompareRecordService;
     @Autowired
     private TenantPersonStatService tenantPersonStatService;
+    @Autowired
+    private PaymentDivMemberRecordService paymentDivMemberRecordService;
+    @Autowired
+    private UserOrderService userOrderService;
 
 
     @ApiOperation("学员训练数据统计列表")
@@ -70,4 +79,56 @@ public class IndexController extends BaseController {
         query.setTenantId(sysUser.getTenantId());
         return succeed(tenantPersonStatService.indexSum(query));
     }
+
+    @ApiOperation("收入、支出汇总")
+    @PostMapping("incomeSummary")
+    public HttpResponseResult<PaymentDivMemberRecordWrapper.IndexIncomeSummaryDto>
+    incomeSummary(@RequestBody PaymentDivMemberRecordWrapper.IndexIncomeQuery query){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("获取用户信息失败");
+        }
+        query.setTenantId(sysUser.getTenantId());
+        return succeed(paymentDivMemberRecordService.incomeSummary(query));
+    }
+
+    @ApiOperation("收入明细列表")
+    @PostMapping("queryIncome")
+    public HttpResponseResult<PageInfo<PaymentDivMemberRecordWrapper.IndexIncomeQueryDto>>
+        queryIncome(@RequestBody PaymentDivMemberRecordWrapper.IndexIncomeQuery query){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("获取用户信息失败");
+        }
+        query.setTenantId(sysUser.getTenantId());
+        return succeed(PageUtil.pageInfo(paymentDivMemberRecordService.queryIncome(QueryInfo.getPage(query), query)));
+    }
+
+    @ApiOperation("收入订单详情")
+    @PostMapping("getIncomeOrderDetail")
+    public HttpResponseResult<PaymentDivMemberRecordWrapper.OrderDetailDto> getIncomeOrderDetail(String orderNo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("获取用户信息失败");
+        }
+        return succeed(paymentDivMemberRecordService.getIncomeOrderDetail(orderNo,sysUser.getTenantId()));
+    }
+
+    @ApiOperation("支出明细列表")
+    @PostMapping("queryExpend")
+    public HttpResponseResult<PageInfo<PaymentDivMemberRecordWrapper.IndexIncomeQueryDto>>
+    queryExpend(@RequestBody PaymentDivMemberRecordWrapper.IndexIncomeQuery query){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("获取用户信息失败");
+        }
+        query.setTenantId(sysUser.getTenantId());
+        return succeed(PageUtil.pageInfo(userOrderService.queryExpend(QueryInfo.getPage(query), query)));
+    }
+
+    @ApiOperation("支出订单详情")
+    @PostMapping("getExpendOrderDetail")
+    public HttpResponseResult<PaymentDivMemberRecordWrapper.OrderDetailDto> getExpendOrderDetail(String orderNo){
+        return succeed(userOrderService.getExpendOrderDetail(orderNo));
+    }
 }

+ 76 - 0
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/PaymentDivMemberRecordController.java

@@ -0,0 +1,76 @@
+package com.yonge.cooleshow.tenant.controller;
+
+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.yonge.cooleshow.biz.dal.entity.PaymentDivMemberRecord;
+import com.yonge.cooleshow.biz.dal.service.PaymentDivMemberRecordService;
+import com.yonge.cooleshow.biz.dal.wrapper.PaymentDivMemberRecordWrapper;
+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.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@Slf4j
+@Validated
+@RestController
+@RequestMapping("/paymentDivMemberRecord")
+@Api(tags = "分账子账户记录表")
+public class PaymentDivMemberRecordController {
+
+    @Autowired
+    private PaymentDivMemberRecordService paymentDivMemberRecordService;
+
+	@ApiOperation(value = "详情", notes = "分账子账户记录表-根据详情ID查询单条, 传入id")
+    @PreAuthorize("@auditsvc.hasPermissions('paymentDivMemberRecord/detail', {'BACKEND'})")
+    //@GetMapping("/detail/{id}")
+    public R<PaymentDivMemberRecord> detail(@PathVariable("id") Long id) {
+    
+    	PaymentDivMemberRecord wrapper = paymentDivMemberRecordService.detail(id);
+        
+        return R.from(wrapper);
+	}
+    
+    @ApiOperation(value = "查询分页", notes = "分账子账户记录表- 传入 PaymentDivMemberRecordWrapper.PaymentDivMemberRecordQuery") 
+    @PreAuthorize("@auditsvc.hasPermissions('paymentDivMemberRecord/page', {'BACKEND'})") 
+    @PostMapping("/page")
+    public R<PageInfo<PaymentDivMemberRecord>> page(@RequestBody PaymentDivMemberRecordWrapper.PaymentDivMemberRecordQuery query) {
+        
+        IPage<PaymentDivMemberRecord> pages = paymentDivMemberRecordService.selectPage(QueryInfo.getPage(query), query);
+        
+        return R.from(QueryInfo.pageInfo(pages));
+	}
+    
+    @ApiOperation(value = "新增", notes = "分账子账户记录表- 传入 PaymentDivMemberRecordWrapper.PaymentDivMemberRecord")
+    @PreAuthorize("@auditsvc.hasPermissions('paymentDivMemberRecord/save', {'BACKEND'})")
+	//@PostMapping("/save")
+	public R<JSONObject> add(@Validated @RequestBody PaymentDivMemberRecord paymentDivMemberRecord) {
+        
+        // 新增数据
+        paymentDivMemberRecordService.save(paymentDivMemberRecord);
+        
+        return R.defaultR();
+	}
+    
+    @ApiOperation(value = "修改", notes = "分账子账户记录表- 传入 PaymentDivMemberRecordWrapper.PaymentDivMemberRecord")
+    @PreAuthorize("@auditsvc.hasPermissions('paymentDivMemberRecord/update', {'BACKEND'})")
+	public R<JSONObject> update(@Validated @RequestBody PaymentDivMemberRecord paymentDivMemberRecord) {
+        
+        // 更新数据
+        paymentDivMemberRecordService.updateById(paymentDivMemberRecord);
+        
+        return R.defaultR();
+	}
+
+	@ApiOperation(value = "删除", notes = "分账子账户记录表- 传入id")
+    @PreAuthorize("@auditsvc.hasPermissions('paymentDivMemberRecord/remove', {'BACKEND'})")
+	public R<Boolean> remove(@RequestParam Long id) {
+    
+		return R.from(paymentDivMemberRecordService.removeById(id));
+	}
+}

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

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

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

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

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

@@ -12,24 +12,51 @@ 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.entity.TenantStaff;
 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.service.TenantStaffService;
+import com.yonge.cooleshow.biz.dal.vo.StudentVo;
+import com.yonge.cooleshow.biz.dal.wrapper.StudentWrapper;
 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.common.enums.BizHttpStatus;
+import com.yonge.cooleshow.common.enums.UserLockFlag;
+import com.yonge.cooleshow.common.enums.UserStatusEnum;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.cooleshow.tenant.vo.TenantActivationCodeVo;
+import com.yonge.toolset.mybatis.support.PageUtil;
+import com.yonge.toolset.utils.date.DateUtil;
+import com.yonge.toolset.utils.easyexcel.ErrMsg;
+import com.yonge.toolset.utils.easyexcel.ExcelDataReader;
+import com.yonge.toolset.utils.easyexcel.ExcelException;
+import com.yonge.toolset.utils.easyexcel.ExcelUtils;
+import com.yonge.toolset.utils.excel.POIUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
 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.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Date;
+import java.util.List;
 
 
 @Slf4j
@@ -45,12 +72,15 @@ public class TenantActivationCodeController extends BaseController {
     @Autowired
     private TenantAlbumPurchaseService tenantAlbumPurchaseService;
 
-    @Autowired
+    @Resource
     private SysUserFeignService sysUserFeignService;
 
     @Autowired
     private TenantInfoService tenantInfoService;
 
+    @Autowired
+    private TenantStaffService tenantStaffService;
+
     @ApiOperation(value = "详情", notes = "机构激活码-根据详情ID查询单条, 传入id")
 //    @GetMapping("/detail/{id}")
     public R<TenantActivationCodeVo.TenantActivationCode> detail(@PathVariable("id") Long id) {
@@ -93,6 +123,69 @@ public class TenantActivationCodeController extends BaseController {
         return succeed();
     }
 
+    @GetMapping("/exportActiveCode")
+    @ApiOperation(value = "导出模板")
+    public void exportActiveCode(HttpServletResponse response) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("请登录");
+        }
+        Long tenantId = sysUser.getTenantId();
+
+        TenantActivationCodeWrapper.TenantActivationCodeQuery query =
+                new TenantActivationCodeWrapper.TenantActivationCodeQuery();
+        query.setTenantId(tenantId);
+        query.setActivationStatus(false);
+        query.setPage(1);
+        query.setRows(9999);
+        IPage<TenantActivationCodeWrapper.TenantActivationCode> queryInfo =
+                tenantActivationCodeService.selectPage(QueryInfo.getPage(query), query);
+        List<TenantActivationCodeWrapper.TenantActivationCode> rows = queryInfo.getRecords();
+        if (rows.isEmpty()) {
+            throw new BizException("没有可导出数据");
+        }
+
+        try (OutputStream outputStream = response.getOutputStream()) {
+            HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"激活码", "手机号"}, new String[]{
+                    "activationCode", "activationPhone"}, rows);
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attac:wq" +
+                    "hment;filename=active_code-" + DateUtil.getDate(new Date()) + ".xls");
+            workbook.write(outputStream);
+            outputStream.flush();
+        } catch (Exception e) {
+            log.error("导出激活码异常", e);
+        }
+    }
+
+    @PostMapping("/importActiveCode")
+    @ApiOperation(value = "导入", notes = "传入file")
+    public HttpResponseResult<List<ErrMsg>> importActiveCode(
+            @RequestParam("file") MultipartFile file,
+            @RequestParam("tenantAlbumPurchaseId") Long tenantAlbumPurchaseId) {
+        if (null == file) {
+            return HttpResponseResult.failed("请上传文件");
+        }
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        TenantStaff tenantStaff = tenantStaffService.getByUserId(user.getId());
+        if (tenantStaff == null) {
+            return HttpResponseResult.failed("权限不足");
+        }
+
+        try {
+            ExcelDataReader<TenantActivationCodeWrapper.ImportTemplate> reader =
+                    ExcelUtils.getReader(TenantActivationCodeWrapper.ImportTemplate.class, file);
+            tenantActivationCodeService.importActiveCode(reader.getDataList(), user.getTenantId(), user.getId(), tenantAlbumPurchaseId);
+            return HttpResponseResult.succeed();
+        } catch (ExcelException e) {
+            return HttpResponseResult.failed(BizHttpStatus.IMPORT.getCode(), e.getErrMsgList(),
+                    BizHttpStatus.IMPORT.getMsg());
+        }
+    }
+
     @ApiOperation(value = "新增", notes = "机构激活码- 传入 TenantActivationCodeVo.TenantActivationCode")
 //    @PostMapping("/save")
     public R<JSONObject> add(@Validated @RequestBody TenantActivationCodeVo.TenantActivationCode tenantActivationCodeVo) {

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

@@ -31,6 +31,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
 import java.util.List;
 
 @Slf4j
@@ -43,7 +44,7 @@ public class TenantAlbumController extends BaseController {
     @Autowired
     private TenantAlbumService tenantAlbumService;
 
-    @Autowired
+    @Resource
     private SysUserFeignService sysUserFeignService;
 
     @Autowired
@@ -62,7 +63,7 @@ public class TenantAlbumController extends BaseController {
         TenantInfo tenantInfo = getTenantInfo();
         query.setTenantId(tenantInfo.getId());
         // 查询数据
-        IPage<TenantAlbum> pages = tenantAlbumService.selectPage(QueryInfo.getPage(query), query);
+        IPage<TenantAlbumWrapper.TenantAlbum> pages = tenantAlbumService.selectPage(QueryInfo.getPage(query), query);
         // 数据类型转换
         List<TenantAlbumVo.TenantAlbum> records = JSON.parseArray(JSON.toJSONString(pages.getRecords()),
                 TenantAlbumVo.TenantAlbum.class);

+ 100 - 0
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TenantUnbindRecordController.java

@@ -0,0 +1,100 @@
+package com.yonge.cooleshow.tenant.controller;
+
+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.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.entity.SysArea;
+import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.vo.EmployeeVo;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantUnbindRecordWrapper;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.UserLockFlag;
+import com.yonge.toolset.base.exception.BizException;
+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.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.*;
+import java.util.stream.Collectors;
+
+
+@Slf4j
+@Validated
+@RestController
+@RequestMapping("/tenantUnbindRecord")
+@Api(tags = "机构解绑申请记录")
+public class TenantUnbindRecordController extends BaseController {
+
+    @Autowired
+    private TenantUnbindRecordService tenantUnbindRecordService;
+
+    @Autowired
+    private SysAreaService sysAreaService;
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private EmployeeService employeeService;
+
+
+    @ApiOperation(value = "查询分页", notes = "机构解绑申请记录- 传入 TenantUnbindRecordVo.TenantUnbindRecordQuery")
+    @PostMapping("/page")
+    public HttpResponseResult<PageInfo<TenantUnbindRecordWrapper.TenantUnbindRecord>>
+    page(@RequestBody TenantUnbindRecordWrapper.TenantUnbindRecordQuery query) {
+        // 查询数据
+        IPage<TenantUnbindRecordWrapper.TenantUnbindRecord> pages =
+                tenantUnbindRecordService.selectPage(QueryInfo.getPage(query), query);
+
+
+        List<Integer> areaCodeList = pages.getRecords().stream().map(next -> {
+            HashSet<Integer> areaCodes = new HashSet<>();
+            areaCodes.add(next.getProvinceCode());
+            areaCodes.add(next.getCityCode());
+            areaCodes.add(next.getRegionCode());
+            return areaCodes;
+        }).flatMap(Collection::stream).filter(Objects::nonNull).distinct().collect(Collectors.toList());
+        if (!areaCodeList.isEmpty()) {
+            Map<Integer, String> codeNameMap = sysAreaService.lambdaQuery().in(SysArea::getCode, areaCodeList).list()
+                    .stream().collect(Collectors.toMap(SysArea::getCode, SysArea::getName));
+
+            pages.getRecords().forEach(next -> {
+                next.setProvinceName(codeNameMap.getOrDefault(next.getProvinceCode(), ""));
+                next.setCityName(codeNameMap.getOrDefault(next.getCityCode(), ""));
+                next.setRegionName(codeNameMap.getOrDefault(next.getRegionCode(), ""));
+            });
+        }
+        return succeed(QueryInfo.pageInfo(pages, pages.getRecords()));
+    }
+
+    @ApiOperation(value = "审核")
+    @PostMapping("/audit")
+    public HttpResponseResult<Boolean> audit(@RequestBody TenantUnbindRecordWrapper.Audio audio) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("请登录");
+        }
+        EmployeeVo employeeVo = employeeService.detail(sysUserFeignService.queryUserInfo().getId());
+        if (employeeVo == null || UserLockFlag.LOCKED.equals(employeeVo.getLockFlag())) {
+            throw new BizException("权限不足");
+        }
+
+        if (audio.getId() == null || audio.getStatus() == null) {
+            throw new BizException("参数错误");
+        }
+        Boolean entry = tenantUnbindRecordService.entry(audio);
+
+        return succeed();
+    }
+
+
+}

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

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

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

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

+ 29 - 20
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/open/OpenTenantController.java

@@ -1,35 +1,18 @@
 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.entity.TenantStaff;
+import com.yonge.cooleshow.biz.dal.service.SmsCodeService;
 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.service.TenantStaffService;
 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")
@@ -40,6 +23,12 @@ public class OpenTenantController {
     @Autowired
     private TenantApplyRecordService tenantApplyRecordService;
 
+    @Autowired
+    private TenantStaffService tenantStaffService;
+
+    @Autowired
+    private SmsCodeService smsCodeService;
+
 
     @PostMapping("/apply")
     @ApiOperation(value = "申请")
@@ -50,4 +39,24 @@ public class OpenTenantController {
 
         return HttpResponseResult.status(true);
     }
+
+
+    @GetMapping("/bindWechat")
+    @ApiOperation(value = "绑定微信")
+    public HttpResponseResult<Boolean> bindWechat(@RequestParam("phone") String phone,
+                                                  @RequestParam("openId") String openId,
+                                                  @RequestParam("code") String code) {
+        // 校验验证码
+        boolean validCode = smsCodeService.verifyValidCode(phone, code, null);
+        if(!validCode){
+            throw new BizException("验证码错误");
+        }
+        TenantStaff tenantStaff = tenantStaffService.getByPhone(phone);
+        if (tenantStaff == null) {
+            throw new BizException("请先申请机构入驻");
+        }
+        tenantStaff.setWxOpenid(openId);
+        tenantStaffService.updateById(tenantStaff);
+        return HttpResponseResult.succeed();
+    }
 }

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

@@ -26,7 +26,7 @@ public class TenantActivationCodeVo {
         @NotNull(message = "专辑购买记录的ID不能为空")
         private Long tenantAlbumPurchaseId;
 
-        @ApiModelProperty("激活码列表,批量导入时为空")
+        @ApiModelProperty("激活码列表,批量发送时为空")
         private List<String> activationCodeList = new ArrayList<>();
 
         @ApiModelProperty("学生ID列表")

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

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

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

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