فهرست منبع

Merge branch 'develop-new' of http://git.dayaedu.com/yonge/cooleshow into test

zouxuan 1 سال پیش
والد
کامیت
bcd8e1b414
69فایلهای تغییر یافته به همراه1824 افزوده شده و 409 حذف شده
  1. 7 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/AdminFeignService.java
  2. 5 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/AdminFeignServiceFallback.java
  3. 45 35
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/TenantMemberController.java
  4. 2 1
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/open/UserPaymentClient.java
  5. 72 4
      cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/controller/IndexController.java
  6. 4 3
      cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/controller/TenantActivationCodeController.java
  7. 19 0
      cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/SendTenantAlbumMessageTask.java
  8. 45 35
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TenantMemberController.java
  9. 15 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/task/TaskController.java
  10. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/JumpUrlDto.java
  11. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/StudentSearch.java
  12. 14 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/PlatformCashAccountRecord.java
  13. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/Student.java
  14. 7 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TenantAccountRecord.java
  15. 97 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TenantTeacherAccountRecord.java
  16. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderDetail.java
  17. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageTypeEnum.java
  18. 27 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/TenantTeacherAccountRecordMapper.java
  19. 13 9
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/UserTenantAlbumRecordMapper.java
  20. 44 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/queryInfo/SysMusicCompareRecordQueryInfo.java
  21. 15 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/OssFileService.java
  22. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/StudentService.java
  23. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TeacherService.java
  24. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantActivationCodeService.java
  25. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantMemberService.java
  26. 43 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantTeacherAccountRecordService.java
  27. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserTenantAlbumRecordService.java
  28. 2 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanServiceImpl.java
  29. 2 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  30. 4 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  31. 39 18
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MemberPriceSettingsServiceImpl.java
  32. 33 20
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  33. 76 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/OssFileServiceImpl.java
  34. 211 94
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PaymentDivMemberRecordServiceImpl.java
  35. 2 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PianoRoomBuyRecordServiceImpl.java
  36. 36 10
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java
  37. 12 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/SysMessageServiceImpl.java
  38. 50 15
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java
  39. 42 15
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantActivationCodeServiceImpl.java
  40. 63 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantAlbumServiceImpl.java
  41. 67 34
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantMemberServiceImpl.java
  42. 66 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantTeacherAccountRecordServiceImpl.java
  43. 5 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserPaymentCoreServiceImpl.java
  44. 72 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserTenantAlbumRecordServiceImpl.java
  45. 2 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonPurchaseRecordServiceImpl.java
  46. 51 29
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VipCardRecordServiceImpl.java
  47. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/StudentVo.java
  48. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherVo.java
  49. 30 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/OssFileWrapper.java
  50. 21 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/PaymentDivMemberRecordWrapper.java
  51. 16 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/StudentWrapper.java
  52. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantActivationCodeWrapper.java
  53. 7 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantMemberWrapper.java
  54. 63 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantTeacherAccountRecordWrapper.java
  55. 7 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/UserPaymentOrderWrapper.java
  56. 50 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/UserTenantAlbumRecordWrapper.java
  57. 35 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/teacher/TeacherWrapper.java
  58. 2 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/PlatformCashAccountRecordMapper.xml
  59. 3 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/StudentMapper.xml
  60. 61 10
      cooleshow-user/user-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml
  61. 5 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantActivationCodeMapper.xml
  62. 8 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantMemberMapper.xml
  63. 33 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantTeacherAccountRecordMapper.xml
  64. 1 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderDetailMapper.xml
  65. 13 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserTenantAlbumRecordMapper.xml
  66. 1 0
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/open/OpenClient.java
  67. 43 4
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/StudentController.java
  68. 42 0
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TeacherController.java
  69. 16 1
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TenantActivationCodeController.java

+ 7 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/AdminFeignService.java

@@ -195,4 +195,11 @@ public interface AdminFeignService {
      */
     @GetMapping("/task/sendPlatformAuditMessage")
     HttpResponseResult<Object> sendPlatformAuditMessage();
+
+    /**
+     * 机构学生训练教材过期
+     */
+    @GetMapping("/task/sendTenantAlbumMessage")
+    HttpResponseResult<Object> sendTenantAlbumMessage();
+
 }

+ 5 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/AdminFeignServiceFallback.java

@@ -188,6 +188,11 @@ public class AdminFeignServiceFallback implements AdminFeignService {
     }
 
     @Override
+    public HttpResponseResult<Object> sendTenantAlbumMessage() {
+        return null;
+    }
+
+    @Override
     public ImUserInfo register(String userId, String clientType, String username, String avatar) {
         return null;
     }

+ 45 - 35
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/TenantMemberController.java

@@ -69,50 +69,60 @@ public class TenantMemberController extends BaseController {
     @ApiOperation(value = "新增", notes = "机构子账户表- 传入 TenantMemberWrapper.InsertTenantMember")
     @PreAuthorize("@pcs.hasPermissions('tenantMember/add', {'BACKEND'})")
     @PostMapping("/add")
-    public HttpResponseResult add(@Valid @RequestBody TenantMemberWrapper.InsertOrUpdateTenantMember tenantMember) throws IOException {
-
-        File file = new File("/var/tmp/" + tenantMember.getMultipartFile().getOriginalFilename());
-        tenantMember.setFile(file);
-        InputStream inputStream = tenantMember.getMultipartFile().getInputStream();
-
-        try {
-            if (!file.getParentFile().exists()) {
-                file.getParentFile().mkdirs();
+    public HttpResponseResult add(@Valid  TenantMemberWrapper.InsertOrUpdateTenantMember tenantMember) throws IOException {
+
+        if (tenantMember.getMultipartFile() != null) {
+            File file = new File("/var/tmp/" + tenantMember.getMultipartFile().getOriginalFilename());
+            tenantMember.setFile(file);
+            InputStream inputStream = tenantMember.getMultipartFile().getInputStream();
+
+            try {
+                if (!file.getParentFile().exists()) {
+                    file.getParentFile().mkdirs();
+                }
+                FileOutputStream fos = new FileOutputStream(file);
+                IOUtils.copy(inputStream, fos);
+                // 新增数据
+                return HttpResponseResult.succeed(tenantMemberService.add(tenantMember));
+            } catch (Exception e) {
+                return failed(e.getMessage());
+            } finally {
+                IOUtils.closeQuietly(inputStream);
+                FileUtils.deleteQuietly(file);
             }
-            FileOutputStream fos = new FileOutputStream(file);
-            IOUtils.copy(inputStream, fos);
-            // 新增数据
-            return HttpResponseResult.succeed(tenantMemberService.add(tenantMember));
-        } catch (Exception e) {
-            return failed(e.getMessage());
-        } finally {
-            IOUtils.closeQuietly(inputStream);
-            FileUtils.deleteQuietly(file);
         }
+
+        // 新增数据
+        return HttpResponseResult.succeed(tenantMemberService.add(tenantMember));
     }
 
     @ApiOperation(value = "修改", notes = "机构子账户表- 传入 TenantMemberWrapper.InsertTenantMember")
     @PreAuthorize("@pcs.hasPermissions('tenantMember/update', {'BACKEND'})")
     @PostMapping("/update")
-    public HttpResponseResult update(@RequestBody TenantMemberWrapper.InsertOrUpdateTenantMember tenantMember) throws IOException {
-        File file = new File("/var/tmp/" + tenantMember.getMultipartFile().getOriginalFilename());
-        tenantMember.setFile(file);
-        InputStream inputStream = tenantMember.getMultipartFile().getInputStream();
-
-        try {
-            if (!file.getParentFile().exists()) {
-                file.getParentFile().mkdirs();
+    public HttpResponseResult update( TenantMemberWrapper.InsertOrUpdateTenantMember tenantMember) throws IOException {
+        if (tenantMember.getMultipartFile() != null) {
+            File file = new File("/var/tmp/" + tenantMember.getMultipartFile().getOriginalFilename());
+            tenantMember.setFile(file);
+            InputStream inputStream = tenantMember.getMultipartFile().getInputStream();
+
+            try {
+                if (!file.getParentFile().exists()) {
+                    file.getParentFile().mkdirs();
+                }
+                FileOutputStream fos = new FileOutputStream(file);
+                IOUtils.copy(inputStream, fos);
+                // 新增数据
+                return HttpResponseResult.succeed(tenantMemberService.update(tenantMember));
+            } catch (Exception e) {
+                return failed(e.getMessage());
+            } finally {
+                IOUtils.closeQuietly(inputStream);
+                FileUtils.deleteQuietly(file);
             }
-            FileOutputStream fos = new FileOutputStream(file);
-            IOUtils.copy(inputStream, fos);
-            // 新增数据
-            return HttpResponseResult.succeed(tenantMemberService.update(tenantMember));
-        } catch (Exception e) {
-            return failed(e.getMessage());
-        } finally {
-            IOUtils.closeQuietly(inputStream);
-            FileUtils.deleteQuietly(file);
         }
+
+        // 新增数据
+        return HttpResponseResult.succeed(tenantMemberService.update(tenantMember));
     }
 
 

+ 2 - 1
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/open/UserPaymentClient.java

@@ -172,10 +172,11 @@ public class UserPaymentClient {
             }
 
             JSONObject dataObj = JSON.parseObject(data);
+            log.info("adapay callback data:{}", dataObj.toJSONString());
 
             String memberId = dataObj.getString("member_id");
 
-            TenantMember tenantMember = tenantMemberService.getByMemberId(memberId, EPayerType.YEEPAY);
+            TenantMember tenantMember = tenantMemberService.getByMemberId(memberId, EPayerType.ADAPAY);
             if(tenantMember == null){
                 return "账户["+ memberId +"]在系统中不存在";
             }

+ 72 - 4
cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/controller/IndexController.java

@@ -5,12 +5,11 @@ import com.microsvc.toolkit.common.webportal.exception.BizException;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.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.service.*;
+import com.yonge.cooleshow.biz.dal.wrapper.OssFileWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.PaymentDivMemberRecordWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantPersonStatWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.teacher.TeacherWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.page.PageInfo;
@@ -24,7 +23,11 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 @Api(tags = "首页统计")
 @RequestMapping("${app-config.url.tenant:}/index")
@@ -41,6 +44,8 @@ public class IndexController extends BaseController {
     private PaymentDivMemberRecordService paymentDivMemberRecordService;
     @Autowired
     private UserOrderService userOrderService;
+    @Autowired
+    private OssFileService ossFileService;
 
 
     @ApiOperation("学员训练数据统计列表")
@@ -58,6 +63,39 @@ public class IndexController extends BaseController {
         return succeed(sysMusicCompareRecordService.weChatStudentTrainData(queryInfo));
     }
 
+    @ApiOperation("导出学员训练数据统计列表")
+    @PostMapping("exportStudentTrainData")
+    public HttpResponseResult<OssFileWrapper.ExportFile> exportStudentTrainData
+            (@RequestBody SysMusicCompareRecordQueryInfo.WechatCompareRecordQueryInfo queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("获取用户信息失败");
+        }
+        if(StringUtils.isEmpty(queryInfo.getStartTime())){
+            throw new BizException("请选择筛选时间");
+        }
+        queryInfo.setTenantId(sysUser.getTenantId());
+        List<SysMusicCompareRecordQueryInfo.WechatCompareRecordPageDto> rows = sysMusicCompareRecordService.weChatStudentTrainData(queryInfo).getRows();
+        if (rows.isEmpty()) {
+            throw new BizException("没有可导出数据");
+        }
+
+        List<SysMusicCompareRecordQueryInfo.WechatCompareRecordExportDto> templates = rows.stream().map(next -> {
+            SysMusicCompareRecordQueryInfo.WechatCompareRecordExportDto template = new SysMusicCompareRecordQueryInfo.WechatCompareRecordExportDto();
+            template.setUsername(next.getUsername());
+            template.setSubjectName(next.getSubjectName());
+            template.setAvgTrainTimes(next.getAvgTrainTimes());
+            template.setTrainTimes(next.getTrainTimes());
+            template.setTrainDays(next.getTrainDays());
+            return template;
+        }).collect(Collectors.toList());
+
+        String format = new SimpleDateFormat("yyyyMMddHHmm").format(new Date());
+        OssFileWrapper.ExportFile exportFile = ossFileService.uploadFile(templates,
+                TeacherWrapper.ExportTeacherTemplate.class, format, "练习统计列表");
+        return succeed(exportFile);
+    }
+
 
     @ApiOperation("首页学员训练数据统计列表、汇总")
     @PostMapping("studentTrainData")
@@ -125,6 +163,36 @@ public class IndexController extends BaseController {
         return succeed(PageUtil.pageInfo(paymentDivMemberRecordService.queryIncome(QueryInfo.getPage(query), query)));
     }
 
+    @ApiOperation("导出收入明细列表")
+    @PostMapping("exportIncome")
+    public HttpResponseResult<OssFileWrapper.ExportFile>
+    exportIncome(@RequestBody PaymentDivMemberRecordWrapper.IndexIncomeQuery query){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("获取用户信息失败");
+        }
+        query.setTenantId(sysUser.getTenantId());
+        List<PaymentDivMemberRecordWrapper.IndexIncomeQueryDto> rows = paymentDivMemberRecordService.queryIncome(QueryInfo.getPage(query), query).getRecords();
+        if (rows.isEmpty()) {
+            throw new BizException("没有可导出数据");
+        }
+
+        List<PaymentDivMemberRecordWrapper.IndexIncomeExportDto> templates = rows.stream().map(next -> {
+            PaymentDivMemberRecordWrapper.IndexIncomeExportDto template = new PaymentDivMemberRecordWrapper.IndexIncomeExportDto();
+            template.setName(next.getName());
+            template.setPhone(next.getPhone());
+            template.setAmount(next.getAmount());
+            template.setPayTime(next.getPayTime());
+            template.setOrderType(next.getOrderType().getName());
+            return template;
+        }).collect(Collectors.toList());
+
+        String format = new SimpleDateFormat("yyyyMMddHHmm").format(new Date());
+        OssFileWrapper.ExportFile exportFile = ossFileService.uploadFile(templates,
+                TeacherWrapper.ExportTeacherTemplate.class, format, "练习统计列表");
+        return succeed(exportFile);
+    }
+
     @ApiOperation("收入订单详情")
     @PostMapping("getIncomeOrderDetail")
     public HttpResponseResult<PaymentDivMemberRecordWrapper.OrderDetailDto> getIncomeOrderDetail(String orderNo){

+ 4 - 3
cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/controller/TenantActivationCodeController.java

@@ -53,9 +53,7 @@ import java.io.File;
 import java.text.MessageFormat;
 import java.text.ParsePosition;
 import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 
 
 @Slf4j
@@ -173,6 +171,9 @@ public class TenantActivationCodeController extends BaseController {
         if (!update) {
             throw new BizException("激活码已经激活");
         }
+        Map<Long, String> receivers = new HashMap<>(1);
+        receivers.put(activationCode.getId(), activationCode.getActivationPhone());
+        tenantActivationCodeService.sendCancelActivationCodeMessage(receivers,tenantInfo.getName());
         return succeed();
     }
 

+ 19 - 0
cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/SendTenantAlbumMessageTask.java

@@ -0,0 +1,19 @@
+package com.yonge.cooleshow.task.jobs;
+
+import com.yonge.cooleshow.api.feign.AdminFeignService;
+import com.yonge.cooleshow.task.core.BaseTask;
+import com.yonge.cooleshow.task.core.TaskException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class SendTenantAlbumMessageTask extends BaseTask {
+
+    @Autowired
+    private AdminFeignService adminFeignService;
+
+    @Override
+    public void execute() throws TaskException {
+        Object o = adminFeignService.sendTenantAlbumMessage();
+    }
+}

+ 45 - 35
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TenantMemberController.java

@@ -71,50 +71,60 @@ public class TenantMemberController extends BaseController {
     @ApiOperation(value = "新增", notes = "机构子账户表- 传入 TenantMemberWrapper.InsertTenantMember")
     @PreAuthorize("@pcs.hasPermissions('tenantMember/add', {'BACKEND'})")
     @PostMapping("/add")
-    public HttpResponseResult add(@Valid @RequestBody TenantMemberWrapper.InsertOrUpdateTenantMember tenantMember) throws IOException {
-
-        File file = new File("/var/tmp/" + tenantMember.getMultipartFile().getOriginalFilename());
-        tenantMember.setFile(file);
-        InputStream inputStream = tenantMember.getMultipartFile().getInputStream();
-
-        try {
-            if (!file.getParentFile().exists()) {
-                file.getParentFile().mkdirs();
+    public HttpResponseResult add(@Valid TenantMemberWrapper.InsertOrUpdateTenantMember tenantMember) throws IOException {
+
+        if (tenantMember.getMultipartFile() != null) {
+            File file = new File("/var/tmp/" + tenantMember.getMultipartFile().getOriginalFilename());
+            tenantMember.setFile(file);
+            InputStream inputStream = tenantMember.getMultipartFile().getInputStream();
+
+            try {
+                if (!file.getParentFile().exists()) {
+                    file.getParentFile().mkdirs();
+                }
+                FileOutputStream fos = new FileOutputStream(file);
+                IOUtils.copy(inputStream, fos);
+                // 新增数据
+                return HttpResponseResult.succeed(tenantMemberService.add(tenantMember));
+            } catch (Exception e) {
+                return failed(e.getMessage());
+            } finally {
+                IOUtils.closeQuietly(inputStream);
+                FileUtils.deleteQuietly(file);
             }
-            FileOutputStream fos = new FileOutputStream(file);
-            IOUtils.copy(inputStream, fos);
-            // 新增数据
-            return HttpResponseResult.succeed(tenantMemberService.add(tenantMember));
-        } catch (Exception e) {
-            return failed(e.getMessage());
-        } finally {
-            IOUtils.closeQuietly(inputStream);
-            FileUtils.deleteQuietly(file);
         }
+
+        // 新增数据
+        return HttpResponseResult.succeed(tenantMemberService.add(tenantMember));
     }
 
     @ApiOperation(value = "修改", notes = "机构子账户表- 传入 TenantMemberWrapper.InsertTenantMember")
     @PreAuthorize("@pcs.hasPermissions('tenantMember/update', {'BACKEND'})")
     @PostMapping("/update")
-    public HttpResponseResult update(@RequestBody TenantMemberWrapper.InsertOrUpdateTenantMember tenantMember) throws IOException {
-        File file = new File("/var/tmp/" + tenantMember.getMultipartFile().getOriginalFilename());
-        tenantMember.setFile(file);
-        InputStream inputStream = tenantMember.getMultipartFile().getInputStream();
-
-        try {
-            if (!file.getParentFile().exists()) {
-                file.getParentFile().mkdirs();
+    public HttpResponseResult update( TenantMemberWrapper.InsertOrUpdateTenantMember tenantMember) throws IOException {
+        if (tenantMember.getMultipartFile() != null) {
+            File file = new File("/var/tmp/" + tenantMember.getMultipartFile().getOriginalFilename());
+            tenantMember.setFile(file);
+            InputStream inputStream = tenantMember.getMultipartFile().getInputStream();
+
+            try {
+                if (!file.getParentFile().exists()) {
+                    file.getParentFile().mkdirs();
+                }
+                FileOutputStream fos = new FileOutputStream(file);
+                IOUtils.copy(inputStream, fos);
+                // 新增数据
+                return HttpResponseResult.succeed(tenantMemberService.update(tenantMember));
+            } catch (Exception e) {
+                return failed(e.getMessage());
+            } finally {
+                IOUtils.closeQuietly(inputStream);
+                FileUtils.deleteQuietly(file);
             }
-            FileOutputStream fos = new FileOutputStream(file);
-            IOUtils.copy(inputStream, fos);
-            // 新增数据
-            return HttpResponseResult.succeed(tenantMemberService.update(tenantMember));
-        } catch (Exception e) {
-            return failed(e.getMessage());
-        } finally {
-            IOUtils.closeQuietly(inputStream);
-            FileUtils.deleteQuietly(file);
         }
+
+        // 新增数据
+        return HttpResponseResult.succeed(tenantMemberService.update(tenantMember));
     }
 
 

+ 15 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/task/TaskController.java

@@ -90,6 +90,9 @@ public class TaskController extends BaseController {
     @Autowired
     private LiveRoomService liveRoomService;
 
+    @Autowired
+    private UserTenantAlbumRecordService userTenantAlbumRecordService;
+
     /***
      * 轮询用户订单
      * @author liweifan
@@ -247,4 +250,16 @@ public class TaskController extends BaseController {
 
         }
     }
+
+    /**
+     * 机构学生训练教材过期
+     */
+    @GetMapping("/sendTenantAlbumMessage")
+    public HttpResponseResult<Object> sendTenantAlbumMessage() {
+
+        // 群发消息定时
+        userTenantAlbumRecordService.sendTenantAlbumMessage();
+
+        return HttpResponseResult.succeed();
+    }
 }

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/JumpUrlDto.java

@@ -25,6 +25,17 @@ public class JumpUrlDto {
     @ApiModelProperty("其它参数")
     private String params ="";
 
+    @ApiModelProperty("客户端")
+    private String clientType ="";
+
+    public String getClientType() {
+        return clientType;
+    }
+
+    public void setClientType(String clientType) {
+        this.clientType = clientType;
+    }
+
     public String getAction() {
         return action;
     }

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

@@ -68,6 +68,9 @@ public class StudentSearch extends QueryInfo{
     @ApiModelProperty("机构ID")
     private Long tenantId;
 
+    @ApiModelProperty("机构小组ID")
+    private Long tenantGroupId = -1L;
+
     @ApiModelProperty("机构名称")
     private String tenantName;
 

+ 14 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/PlatformCashAccountRecord.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.entity;
 
 
+import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -35,6 +36,11 @@ public class PlatformCashAccountRecord implements Serializable {
     @ApiModelProperty(value = "交易金额")
     private BigDecimal transAmount;
 
+
+    @ApiModelProperty("数据类型(平台,老师)")
+    @TableField(value = "source_type_")
+    private SourceTypeEnum sourceType;
+
     @TableField("in_or_out_")
     @ApiModelProperty(value = "收支类型:IN、收入 OUT、支出")
     private InOrOutEnum inOrOut;
@@ -88,6 +94,14 @@ public class PlatformCashAccountRecord implements Serializable {
         this.updateTime = new Date();
     }
 
+    public SourceTypeEnum getSourceType() {
+        return sourceType;
+    }
+
+    public void setSourceType(SourceTypeEnum sourceType) {
+        this.sourceType = sourceType;
+    }
+
     public Long getId() {
         return id;
     }

+ 4 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/Student.java

@@ -104,6 +104,10 @@ public class Student implements Serializable {
     @TableField(value = "avatar_")
     private String avatar;
 
+    @ApiModelProperty("机构小组ID")
+    @TableField(value = "tenant_group_id_")
+    private Long tenantGroupId;
+
     public Long getTenantId() {
         return tenantId;
     }

+ 7 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TenantAccountRecord.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.SourceTypeEnum;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
@@ -41,6 +42,12 @@ public class TenantAccountRecord implements Serializable {
     @TableField(value = "platform_cash_account_record_id_")
     private Long platformCashAccountRecordId;
 
+
+    @ApiModelProperty("数据类型(平台,老师)")
+    @TableField(value = "source_type_")
+    private SourceTypeEnum sourceType;
+
+
     @ApiModelProperty("交易金额") 
 	@TableField(value = "trans_amount_")
     private BigDecimal transAmount;

+ 97 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TenantTeacherAccountRecord.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 com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import java.math.BigDecimal;
+
+/**
+ * 机构老师流水表
+ * 2023-10-09 17:39:42
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@ApiModel(" TenantTeacherAccountRecord-机构老师流水表")
+@TableName("tenant_teacher_account_record")
+public class TenantTeacherAccountRecord implements Serializable {
+
+    @ApiModelProperty("id") 
+	    @TableId(value = "id_",type = IdType.AUTO)
+	    private Long id;
+
+    @ApiModelProperty("机构id") 
+	@TableField(value = "tenant_id_")
+    private Long tenantId;
+
+    @ApiModelProperty("老师id") 
+	@TableField(value = "teacher_id_")
+    private Long teacherId;
+
+    @ApiModelProperty("机构流水ID") 
+	@TableField(value = "account_record_id_")
+    private Long accountRecordId;
+
+    @ApiModelProperty("数据类型(平台,机构,老师)") 
+	@TableField(value = "source_type_")
+    private SourceTypeEnum sourceType;
+
+    @ApiModelProperty("交易金额") 
+	@TableField(value = "trans_amount_")
+    private BigDecimal transAmount;
+
+    @ApiModelProperty("收支类型:IN、收入 OUT、支出") 
+	@TableField(value = "in_or_out_")
+    private String inOrOut;
+
+    @ApiModelProperty("入账状态 WAIT 待入账 FROZEN 冻结入账 RECORDED 已入账 CANCEL 取消") 
+	@TableField(value = "post_status_")
+    private String postStatus;
+
+    @ApiModelProperty("业务类型:PRACTICE、陪练课 LIVE、直播课 VIDEO、视频课 MUSIC、乐谱 WITHDRAWAL、提现 LIVE_SHARE、直播课分润 VIDEO_SHARE、视频课分润 MUSIC_SHARE、乐谱分润 VIP_SHARE、会员分润 MALL_SHARE、商品分润") 
+	@TableField(value = "biz_type_")
+    private String bizType;
+
+    @ApiModelProperty("业务id") 
+	@TableField(value = "biz_id_")
+    private Long bizId;
+
+    @ApiModelProperty("业务名称") 
+	@TableField(value = "biz_name_")
+    private String bizName;
+
+    @ApiModelProperty("订单号") 
+	@TableField(value = "order_no_")
+    private String orderNo;
+
+    @ApiModelProperty("创建时间") 
+	@TableField(value = "create_time_")
+    private Date createTime;
+
+    @ApiModelProperty("更新时间") 
+	@TableField(value = "update_time_")
+    private Date updateTime;
+
+    @ApiModelProperty("是否异常入账") 
+	@TableField(value = "err_flag_")
+    private Integer errFlag;
+
+    @ApiModelProperty("异常信息") 
+	@TableField(value = "err_msg_")
+    private String errMsg;
+
+}

+ 4 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderDetail.java

@@ -76,6 +76,10 @@ public class UserOrderDetail implements Serializable {
     @ApiModelProperty("平台服务费比例% ")
     @TableField(value = "plantform_fee_rate_")
     private BigDecimal plantformFeeRate;
+
+    @TableField(value = "account_config_")
+    private String accountConfig;
+
     @ApiModelProperty("下单时间 ")
 	@TableField(value = "create_time_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")

+ 9 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageTypeEnum.java

@@ -121,6 +121,15 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
 
     // 平台审核提醒
     PLATFORM_AUDIT_UNBIND("平台审核提醒"),
+    TENANT_VIP_BUY("开通平台会员"),
+    TENANT_VIP_EXPIRE("平台会员到期"),
+    TENANT_PLATFORM_ADD_VIP("后台添加平台会员"),
+    TENANT_ALBUM_BUY("购买训练教程"),
+    TENANT_ALBUM_EXPIRE("训练教程到期"),
+    TENANT_SEND_CODE("发放激活码"),
+    TENANT_CODE_SENDCANCEL("激活码被撤回"),
+    TENANT_MUSIC_BUY("购买曲目"),
+    TENANT_STUDENT_CHANGE("机构变更"),
     ;
 
     MessageTypeEnum(String msg) {

+ 27 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/TenantTeacherAccountRecordMapper.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.TenantTeacherAccountRecord;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantTeacherAccountRecordWrapper;
+
+/**
+ * 机构老师流水表
+ * 2023-10-09 17:39:42
+ */
+@Repository
+public interface TenantTeacherAccountRecordMapper extends BaseMapper<TenantTeacherAccountRecord> {
+
+	/**
+	 * 分页查询
+	 * @param page IPage<TenantTeacherAccountRecordWrapper.TenantTeacherAccountRecord>
+	 * @param param TenantTeacherAccountRecordWrapper.TenantTeacherAccountRecordQuery
+	 * @return List<TenantTeacherAccountRecordWrapper.TenantTeacherAccountRecord>
+	 */
+	List<TenantTeacherAccountRecord> selectPage(@Param("page") IPage<TenantTeacherAccountRecord> page, @Param("param") TenantTeacherAccountRecordWrapper.TenantTeacherAccountRecordQuery param);
+	
+}

+ 13 - 9
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/UserTenantAlbumRecordMapper.java

@@ -5,6 +5,7 @@ import java.util.List;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.biz.dal.entity.TenantAlbum;
+import com.yonge.cooleshow.biz.dal.vo.VipCardRecordVo;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumWrapper;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
@@ -18,17 +19,20 @@ import com.yonge.cooleshow.biz.dal.wrapper.UserTenantAlbumRecordWrapper;
 @Repository
 public interface UserTenantAlbumRecordMapper extends BaseMapper<UserTenantAlbumRecord> {
 
-	/**
-	 * 分页查询
-	 * @param page IPage<UserTenantAlbumRecordWrapper.UserTenantAlbumRecord>
-	 * @param param UserTenantAlbumRecordWrapper.UserTenantAlbumRecordQuery
-	 * @return List<UserTenantAlbumRecordWrapper.UserTenantAlbumRecord>
-	 */
-	List<TenantAlbumWrapper.TenantAlbum> selectPage(@Param("page") IPage<UserTenantAlbumRecord> page, @Param("param") UserTenantAlbumRecordWrapper.UserTenantAlbumRecordQuery param);
+    /**
+     * 分页查询
+     *
+     * @param page  IPage<UserTenantAlbumRecordWrapper.UserTenantAlbumRecord>
+     * @param param UserTenantAlbumRecordWrapper.UserTenantAlbumRecordQuery
+     * @return List<UserTenantAlbumRecordWrapper.UserTenantAlbumRecord>
+     */
+    List<TenantAlbumWrapper.TenantAlbum> selectPage(@Param("page") IPage<UserTenantAlbumRecord> page, @Param("param") UserTenantAlbumRecordWrapper.UserTenantAlbumRecordQuery param);
 
-	List<Long> selectTenantIds(@Param("id") Long id);
+    List<Long> selectTenantIds(@Param("id") Long id);
 
-	List<TenantAlbum> selectTenantAlbumInfo(@Param("tenantIds") List<Long> tenantIds);
+    List<TenantAlbum> selectTenantAlbumInfo(@Param("tenantIds") List<Long> tenantIds);
 
     Long ifBuy(@Param("tenantAlbumId") Long tenantAlbumId, @Param("studentId") Long studentId);
+
+    List<UserTenantAlbumRecordWrapper.UserTenantAlbumRecord> selectTemporaryRecord();
 }

+ 44 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/queryInfo/SysMusicCompareRecordQueryInfo.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.queryInfo;
 
+import com.alibaba.excel.annotation.ExcelProperty;
 import com.yonge.cooleshow.biz.dal.enums.FeatureType;
 import com.yonge.cooleshow.biz.dal.enums.HeardLevelEnum;
 import com.yonge.toolset.base.page.QueryInfo;
@@ -49,6 +50,24 @@ public class SysMusicCompareRecordQueryInfo {
         @ApiModelProperty(name = "机构编号")
         private Long tenantId;
 
+        @ApiModelProperty(name = "最小训练总时长")
+        private Integer minTrainTimes;
+
+        @ApiModelProperty(name = "最大训练总时长")
+        private Integer maxTrainTimes;
+
+        @ApiModelProperty(name = "最小训练天数")
+        private Integer minTrainDays;
+
+        @ApiModelProperty(name = "最大训练天数")
+        private Integer maxTrainDays;
+
+        @ApiModelProperty(name = "最小平均训练时长")
+        private Integer minAvgTrainTimes;
+
+        @ApiModelProperty(name = "最大平均训练时长")
+        private Integer maxAvgTrainTimes;
+
         @ApiModelProperty(name = "排序字段")
         private String sortField = "trainTimes";
 
@@ -133,26 +152,51 @@ public class SysMusicCompareRecordQueryInfo {
     @Data
     public static class WechatCompareRecordPageDto{
         @ApiModelProperty(name = "用户编号")
+        @ExcelProperty(value = "用户编号")
         private Long userId;
 
         @ApiModelProperty(name = "头像")
+        @ExcelProperty(value = "头像")
         private String avatar;
 
         @ApiModelProperty(name = "姓名")
+        @ExcelProperty(value = "姓名")
         private String username;
 
         @ApiModelProperty(name = "声部")
+        @ExcelProperty(value = "声部")
         private String subjectName;
 
         @ApiModelProperty(name = "训练总时长")
+        @ExcelProperty(value = "训练总时长")
         private Integer trainTimes = 0;
 
         @ApiModelProperty(name = "训练天数")
+        @ExcelProperty(value = "训练天数")
         private Integer trainDays = 0;
 
         @ApiModelProperty(name = "平均训练时长")
+        @ExcelProperty(value = "平均训练时长")
+        private Integer avgTrainTimes = 0;
+
+    }
+    @Data
+    public static class WechatCompareRecordExportDto{
+        @ExcelProperty(value = "姓名")
+        private String username;
+
+        @ExcelProperty(value = "声部")
+        private String subjectName;
+
+        @ExcelProperty(value = "平均训练时长")
         private Integer avgTrainTimes = 0;
 
+        @ExcelProperty(value = "总时长")
+        private Integer trainTimes = 0;
+
+        @ExcelProperty(value = "训练天数")
+        private Integer trainDays = 0;
+
     }
 
     @Data

+ 15 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/OssFileService.java

@@ -0,0 +1,15 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.yonge.cooleshow.biz.dal.wrapper.OssFileWrapper;
+
+import java.util.List;
+
+/**
+ * @author oss文件操作
+ */
+public interface OssFileService {
+
+
+    OssFileWrapper.ExportFile uploadFile(List<?> dataList, Class<?> clazz,
+                                         String fileName, String sheetName);
+}

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

@@ -130,4 +130,6 @@ public interface StudentService extends IService<Student> {
      */
     void updateTenant(Student student, Long toTenantId);
 
+    void sendStudentTenantChange(Student student, Long toTenantId);
+
 }

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

@@ -11,6 +11,7 @@ import com.yonge.cooleshow.biz.dal.entity.TeacherStyleVideo;
 import com.yonge.cooleshow.biz.dal.enums.TeacherTagEnum;
 import com.yonge.cooleshow.biz.dal.queryInfo.TeacherQueryInfo;
 import com.yonge.cooleshow.biz.dal.vo.*;
+import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.teacher.TeacherWrapper;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 
@@ -178,5 +179,5 @@ public interface TeacherService extends IService<Teacher> {
 
     void updateTenant(TeacherWrapper.UpdateTenant updateTenant,Long userId);
 
-    Long teacherSettlementFrom(Long teacherId);
+    UserPaymentOrderWrapper.AccountTenantTo teacherSettlementFrom(Long teacherId,Long recomUserId);
 }

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

@@ -11,6 +11,7 @@ import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.utils.easyexcel.ExcelDataReaderProperty;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 机构激活码
@@ -55,6 +56,8 @@ public interface TenantActivationCodeService extends IService<TenantActivationCo
     void sendActivationCode(Long tenantId, Long tenantAlbumPurchaseId, List<String> activationCodeList,
                             List<Long> studentIdList);
 
+    void sendCancelActivationCodeMessage(Map<Long, String> receivers, String tenantName);
+
     void active(String activationCode, Long studentId);
 
 

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

@@ -59,4 +59,6 @@ public interface TenantMemberService extends IService<TenantMember>  {
     TenantMember getByMemberId(String memberId, EPayerType payerType);
 
     TenantMember getByRequestNo(String requestNo);
+
+    TenantMember getByAppIdAndTenantId(String appId, Long tenantId, EPayerType payerType);
 }

+ 43 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantTeacherAccountRecordService.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.TenantTeacherAccountRecordWrapper;
+import com.yonge.cooleshow.biz.dal.entity.TenantTeacherAccountRecord;
+
+/**
+ * 机构老师流水表
+ * 2023-10-09 17:39:42
+ */
+public interface TenantTeacherAccountRecordService extends IService<TenantTeacherAccountRecord>  {
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return TenantTeacherAccountRecord
+     */
+	TenantTeacherAccountRecord detail(Long id);
+
+    /**
+     * 分页查询
+     * @param page IPage<TenantTeacherAccountRecord>
+     * @param query TenantTeacherAccountRecordWrapper.TenantTeacherAccountRecordQuery
+     * @return IPage<TenantTeacherAccountRecord>
+     */
+    IPage<TenantTeacherAccountRecord> selectPage(IPage<TenantTeacherAccountRecord> page, TenantTeacherAccountRecordWrapper.TenantTeacherAccountRecordQuery query);
+	
+    /**
+     * 添加
+     * @param tenantTeacherAccountRecord TenantTeacherAccountRecordWrapper.TenantTeacherAccountRecord
+     * @return Boolean
+     */
+     Boolean add(TenantTeacherAccountRecordWrapper.TenantTeacherAccountRecord tenantTeacherAccountRecord);   
+
+    /**
+     * 更新
+     * @param tenantTeacherAccountRecord TenantTeacherAccountRecordWrapper.TenantTeacherAccountRecord
+     * @return Boolean
+     */
+     Boolean update(TenantTeacherAccountRecordWrapper.TenantTeacherAccountRecord tenantTeacherAccountRecord);
+     
+}

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

@@ -2,6 +2,7 @@ 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.entity.TenantAlbum;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.UserTenantAlbumRecordWrapper;
@@ -71,4 +72,11 @@ public interface UserTenantAlbumRecordService extends IService<UserTenantAlbumRe
     List<Long> getUseAlbumIdsByUserId(Long userId,ClientEnum clientType);
 
     TenantAlbumWrapper.TenantAlbum detailAlbum(String albumId);
+
+    /**
+     * 训练教程过期通知
+     */
+    void sendTenantAlbumMessage();
+
+    UserTenantAlbumRecord getNewestByTenantAlbumId(Long tenantAlbumId, Long userId, ClientEnum client);
 }

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

@@ -995,15 +995,10 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
         userOrderDetail.setActualPrice(userOrderDetail.getExpectPrice());
 
         orderGoodsInfo.setUserOrderDetail(userOrderDetail);
+        userOrderDetail.setAccountConfig(teacherService.teacherSettlementFrom(null,orderGoodsInfo.getRecomUserId()).jsonString());
 
-
-        // 设置金额入账去向
-        UserPaymentOrderWrapper.AccountTenantTo accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
-        if (orderGoodsInfo.getRecomUserId() !=null) {
-            accountTenantTo.setShareTenant(teacherService.teacherSettlementFrom(orderGoodsInfo.getRecomUserId()));
-        }
         // 存入缓存
-        redisCacheService.saveUserAccountConfig(orderGoodsInfo.getSubOrderNo(), accountTenantTo.jsonString());
+//        redisCacheService.saveUserAccountConfig(orderGoodsInfo.getSubOrderNo(), teacherService.teacherSettlementFrom(null,orderGoodsInfo.getRecomUserId()).jsonString());
 
     }
 

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

@@ -398,17 +398,11 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         log.info("buyLiveCourse  return {}", userOrderDetail);
 
         orderGoodsInfo.setUserOrderDetail(userOrderDetail);
-
+        userOrderDetail.setAccountConfig(teacherService.teacherSettlementFrom(courseGroup.getTeacherId(),orderGoodsInfo.getRecomUserId()).jsonString());
 
         // 设置金额入账去向
-        UserPaymentOrderWrapper.AccountTenantTo accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
-        if (orderGoodsInfo.getRecomUserId() !=null) {
-            accountTenantTo.setShareTenant(teacherService.teacherSettlementFrom(orderGoodsInfo.getRecomUserId()));
-        }
-
-        accountTenantTo.setIncomeTenant(teacherService.teacherSettlementFrom(courseGroup.getTeacherId()));
         // 存入缓存
-        redisCacheService.saveUserAccountConfig(orderGoodsInfo.getSubOrderNo(), accountTenantTo.jsonString());
+//        redisCacheService.saveUserAccountConfig(orderGoodsInfo.getSubOrderNo(), teacherService.teacherSettlementFrom(courseGroup.getTeacherId(),orderGoodsInfo.getRecomUserId()).jsonString());
 
     }
 

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

@@ -2493,16 +2493,12 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         RLock lock = redissonClient.getLock("teacherId:" + scheduleDto.getTeacherId());
         try {
             if (lock.tryLock(10, 60, TimeUnit.SECONDS)) {
-                orderGoodsInfo.setUserOrderDetail( buyPracticeCourseTranV2(orderGoodsInfo));
-
+                UserOrderDetail userOrderDetail = buyPracticeCourseTranV2(orderGoodsInfo);
+                orderGoodsInfo.setUserOrderDetail(userOrderDetail);
+                userOrderDetail.setAccountConfig(teacherService.teacherSettlementFrom(scheduleDto.getTeacherId(),orderGoodsInfo.getRecomUserId()).jsonString());
                 // 设置金额入账去向
-                UserPaymentOrderWrapper.AccountTenantTo accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
-                if (orderGoodsInfo.getRecomUserId() !=null) {
-                    accountTenantTo.setShareTenant(teacherService.teacherSettlementFrom(orderGoodsInfo.getRecomUserId()));
-                }
-                accountTenantTo.setIncomeTenant(teacherService.teacherSettlementFrom(scheduleDto.getTeacherId()));
                 // 存入缓存
-                redisCacheService.saveUserAccountConfig(orderGoodsInfo.getSubOrderNo(), accountTenantTo.jsonString());
+//                redisCacheService.saveUserAccountConfig(orderGoodsInfo.getSubOrderNo(), teacherService.teacherSettlementFrom(scheduleDto.getTeacherId(),orderGoodsInfo.getRecomUserId()).jsonString());
 
                 return;
             }

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

@@ -288,14 +288,11 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
         userOrderDetail.setActualPrice(userOrderDetail.getExpectPrice().subtract(couponAmount));
         orderGoodsInfo.setUserOrderDetail(userOrderDetail);
 
+        userOrderDetail.setAccountConfig( teacherService.teacherSettlementFrom(null,orderGoodsInfo.getRecomUserId()).jsonString());
 
         // 设置金额入账去向
-        UserPaymentOrderWrapper.AccountTenantTo accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
-        if (orderGoodsInfo.getRecomUserId() !=null) {
-            accountTenantTo.setShareTenant(teacherService.teacherSettlementFrom(orderGoodsInfo.getRecomUserId()));
-        }
         // 存入缓存
-        redisCacheService.saveUserAccountConfig(orderGoodsInfo.getSubOrderNo(), accountTenantTo.jsonString());
+//        redisCacheService.saveUserAccountConfig(orderGoodsInfo.getSubOrderNo(), teacherService.teacherSettlementFrom(null,orderGoodsInfo.getRecomUserId()).jsonString());
 
     }
 
@@ -309,8 +306,19 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
 
             Map<Long, String> receivers = new HashMap<>();
             receivers.put(userId, user.getPhone());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.PLATFORM_ADD_VIP,
-                                               receivers, null, 0, null, client.getCode(), times,type.getMsg(),reason);
+
+            Student student = studentService.getById(userId);
+            if (client.equals(ClientEnum.STUDENT) && student != null && student.getTenantId() != null && student.getTenantId() >0) {
+                try {
+                    sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TENANT_PLATFORM_ADD_VIP,
+                            receivers, null, 0, null, ClientEnum.TENANT_STUDENT.getCode(), times +type.getMsg(), reason);
+                } catch (Exception e) {
+                    log.error("会员赠送消息发送失败", e);
+                }
+            } else {
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.PLATFORM_ADD_VIP,
+                        receivers, null, 0, null, client.getCode(), times, type.getMsg(), reason);
+            }
         } catch (Exception e) {
             log.error("会员赠送消息发送失败 : {}",e.getMessage());
         }
@@ -345,18 +353,31 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
     private void authSend(Long userId, String phone, String param1,ClientEnum clientEnum) {
         Map<Long, String> receivers = new HashMap<>();
         receivers.put(userId, phone);
-        try {
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.VIP_BUY_SUCCESS,
-                    receivers, null, 0, null, clientEnum.getCode(), param1);
-        } catch (Exception e) {
-            log.error("会员购买极光消息推送异常,userId={}", userId);
-        }
 
-        try {
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_VIP_BUY_SUCCESS,
-                    receivers, null, 0, null, clientEnum.getCode(), param1);
-        } catch (Exception e) {
-            log.error("会员购买短信消息推送异常,userId={}", userId);
+        // 判断是否是机构学生 机构学生推送走另一个
+        Student student = studentService.getById(userId);
+        if (clientEnum.equals(ClientEnum.STUDENT) && student != null && student.getTenantId() != null && student.getTenantId() >0) {
+            try {
+                String url = sysMessageService.selectConfigUrl(MessageTypeEnum.TENANT_VIP_BUY.getCode());
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TENANT_VIP_BUY,
+                        receivers, null, 0, url, clientEnum.getCode(),param1);
+            } catch (Exception e) {
+                log.error("会员购买极光消息推送异常,userId={}", userId);
+            }
+        } else {
+            try {
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.VIP_BUY_SUCCESS,
+                        receivers, null, 0, null, clientEnum.getCode(), param1);
+            } catch (Exception e) {
+                log.error("会员购买极光消息推送异常,userId={}", userId);
+            }
+
+            try {
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_VIP_BUY_SUCCESS,
+                        receivers, null, 0, null, clientEnum.getCode(), param1);
+            } catch (Exception e) {
+                log.error("会员购买短信消息推送异常,userId={}", userId);
+            }
         }
 
     }

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

@@ -1118,7 +1118,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
             if (!musicSheet.getSourceType().getCode().equals(SourceTypeEnum.PLATFORM.getCode())) {
 
                 // 老师收入
-                BigDecimal teacherAmount = BigDecimal.ONE.subtract(serviceFee).multiply(expectPrice);
+                BigDecimal teacherAmount = BigDecimal.ONE.subtract(serviceFee).multiply(expectPrice).setScale(2, RoundingMode.HALF_UP);
 
                 // 判断是否结算给老师,不结算,不写入老师入账记录
                 Teacher teacher = teacherService.getById(musicSheet.getUserId());
@@ -1193,20 +1193,35 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
         Map<Long, String> studentReceivers = new HashMap<>();
         studentReceivers.put(studentId, student.getPhone());
 
+        try {
+            Student studentInfo = studentService.getById(studentId);
+            if (studentInfo != null && orderClient.equals(ClientEnum.STUDENT) &&
+                    studentInfo.getTenantId() != null && studentInfo.getTenantId() > 0 && orderType.equals(OrderTypeEnum.MUSIC)) {
+                try {
+                    String url = sysMessageService.selectConfigUrl(MessageTypeEnum.TENANT_MUSIC_BUY.getCode());
+                    sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TENANT_MUSIC_BUY,
+                            studentReceivers, null, 0, url, ClientEnum.TENANT_STUDENT.getCode(), name);
+                } catch (Exception e) {
+                    log.error("学生购买曲目推送失败,", e);
+                }
+            } else {
 
-        String url = sysMessageService.selectConfigUrl(messageType.getCode());
-
-        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,
-                                           messageType, studentReceivers, null,
-                0, url, orderClient.getCode(), name);
-        // 推送学生
-        Map<Long, String> studentSMS = new HashMap<>();
-        studentSMS.put(studentId, student.getPhone());
-        // 推送短信
-        url = sysMessageService.selectConfigUrl(smsMessageType.getCode());
-        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, smsMessageType,
-                studentSMS, null, 0, url, null, name);
-
+                String url = sysMessageService.selectConfigUrl(messageType.getCode());
+
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,
+                        messageType, studentReceivers, null,
+                        0, url, orderClient.getCode(), name);
+                // 推送学生
+                Map<Long, String> studentSMS = new HashMap<>();
+                studentSMS.put(studentId, student.getPhone());
+                // 推送短信
+                url = sysMessageService.selectConfigUrl(smsMessageType.getCode());
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, smsMessageType,
+                        studentSMS, null, 0, url, null, name);
+            }
+        } catch (Exception e) {
+            log.error("购买曲目消息推送失败,", e);
+        }
         return true;
     }
 
@@ -1722,18 +1737,16 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
 
 
         // 设置金额入账去向
-        UserPaymentOrderWrapper.AccountTenantTo accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
-        if (orderGoodsInfo.getRecomUserId() !=null) {
-            accountTenantTo.setShareTenant(teacherService.teacherSettlementFrom(orderGoodsInfo.getRecomUserId()));
-        }
+        Long teacherId = null;
         if (orderGoodsInfo.getGoodType().equals(GoodTypeEnum.MUSIC)) {
             MusicSheet musicSheet = this.getById(orderGoodsInfo.getUserOrderDetail().getBizId());
             if (musicSheet != null && musicSheet.getSourceType().equals(SourceTypeEnum.TEACHER)) {
-                accountTenantTo.setIncomeTenant(teacherService.teacherSettlementFrom(musicSheet.getUserId()));
+                teacherId = musicSheet.getUserId();
             }
         }
+        userOrderDetail.setAccountConfig(teacherService.teacherSettlementFrom(teacherId,orderGoodsInfo.getRecomUserId()).jsonString());
         // 存入缓存
-        redisCacheService.saveUserAccountConfig(orderGoodsInfo.getSubOrderNo(), accountTenantTo.jsonString());
+//        redisCacheService.saveUserAccountConfig(orderGoodsInfo.getSubOrderNo(), teacherService.teacherSettlementFrom(teacherId,orderGoodsInfo.getRecomUserId()).jsonString());
 
     }
 

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

@@ -0,0 +1,76 @@
+package com.yonge.cooleshow.biz.dal.service.impl;
+
+import com.alibaba.excel.EasyExcel;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.microsvc.toolkit.common.tools.DownloadManager;
+import com.microsvc.toolkit.middleware.oss.OssPluginContext;
+import com.microsvc.toolkit.middleware.oss.impl.TencentOssPlugin;
+import com.yonge.cooleshow.biz.dal.service.OssFileService;
+import com.yonge.cooleshow.biz.dal.wrapper.OssFileWrapper;
+import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.utils.http.HttpUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.joda.time.DateTime;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.File;
+import java.text.MessageFormat;
+import java.util.List;
+
+/**
+ * @author OSS 文件通用处理
+ */
+@Slf4j
+@Service
+public class OssFileServiceImpl implements OssFileService {
+
+    @Autowired
+    private OssPluginContext ossPluginContext;
+
+    @Override
+    public OssFileWrapper.ExportFile uploadFile(List<?> dataList, Class<?> clazz,
+                                                String fileName, String sheetName) {
+        if (CollectionUtils.isEmpty(dataList)) {
+            throw new BizException("导出数据为空");
+        }
+
+        // OSS上传文件目录
+        String uploadOssPath = MessageFormat.format("excel-download/{0}", DateTime.now().toString("yyyy-MM"));
+
+        // 文件上传下载地址
+        String uploadPath = MessageFormat.format("{0}/{1}-{2}.xlsx", uploadOssPath, String.valueOf(IdWorker.getId()),
+                DateTime.now().toString("MMddHHmmss"));
+
+        // 本地文件地址
+        String localPath = DownloadManager.getInstance().path(uploadPath);
+        log.debug("pageExport localPath={}", localPath);
+
+        // 模板文件保存在springboot项目的resources/static下
+        // Resource resource = new ClassPathResource("static/预报名模板导出.xlsx");
+
+        EasyExcel
+                .write(localPath, clazz)
+                //.withTemplate(resource.getStream()) // 利用模板的输出流
+                .sheet(0, sheetName)
+                .doWrite(dataList);
+
+        // 上传本地文件到OSS服务器
+        String downloadPath = ossPluginContext.getPluginService(TencentOssPlugin.PLUGIN_NAME)
+                .uploadFile(uploadOssPath, new File(localPath));
+        log.debug("pageExport downloadPath={}", downloadPath);
+
+        // 删除本地缓存文件
+        DownloadManager.getInstance().deleteOnExit(localPath);
+
+        // 学生统计下载
+        return OssFileWrapper.ExportFile
+                .builder()
+                .fileName(MessageFormat.format("{0}.xlsx", fileName))
+                .downloadPath(HttpUtil.getSortUrl(downloadPath))
+                .build();
+    }
+
+
+}

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

@@ -6,8 +6,12 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
+import com.microsvc.toolkit.middleware.payment.common.api.BasePaymentService;
 import com.microsvc.toolkit.middleware.payment.common.api.PaymentServiceContext;
+import com.microsvc.toolkit.middleware.payment.common.api.entity.DivideReq;
+import com.microsvc.toolkit.middleware.payment.common.api.entity.DivideResp;
 import com.yonge.cooleshow.biz.dal.dao.CourseScheduleStudentPaymentDao;
 import com.yonge.cooleshow.biz.dal.dao.UserOrderDao;
 import com.yonge.cooleshow.biz.dal.dao.VideoLessonGroupDao;
@@ -54,7 +58,7 @@ import java.util.stream.Collectors;
 public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMemberRecordMapper, PaymentDivMemberRecord> implements PaymentDivMemberRecordService {
 
     @Autowired
-    private PaymentDivMemberService paymentDivMemberService;
+    private TenantMemberService tenantMemberService;
 
     @Autowired
     private PaymentMerchantConfigService paymentMerchantConfigService;
@@ -138,6 +142,9 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
     @Autowired
     private StudentService studentService;
 
+    @Autowired
+    private TenantTeacherAccountRecordService tenantTeacherAccountRecordService;
+
 
     /**
      * 查询详情
@@ -246,7 +253,7 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
 
 
             BigDecimal tenantAmount = tenantAlbumContent.getSalePrice().subtract(tenantAlbumContent.getOriginalPrice())
-                    .multiply(BigDecimal.valueOf(tenantAlbumContent.getBuyMultiple()));
+                    .multiply(BigDecimal.valueOf(tenantAlbumContent.getBuyMultiple())).setScale(2, RoundingMode.HALF_UP);
 
             tenantdivMap.merge(tenantAlbumContent.getTenantId(), tenantAmount, BigDecimal::add);
             tenantdivMap.merge(-1L, tenantAmount, BigDecimal::subtract);
@@ -297,7 +304,7 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
         // 保存购买记录
         musicSheetService.addMusicSheetPurchaseRecord(userPaymentOrder, actualPrice, serviceFeeAmount);
 
-        String userAccountConfig = redisCacheService.getUserAccountConfig(userPaymentOrder.getSubOrderNo());
+        String userAccountConfig = userPaymentOrder.getAccountConfig();
         UserPaymentOrderWrapper.AccountTenantTo accountTenantTo;
         if (StringUtils.isBlank(userAccountConfig)) {
             accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
@@ -311,7 +318,7 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
             if (!musicSheet.getSourceType().getCode().equals(SourceTypeEnum.PLATFORM.getCode())) {
 
                 // 老师收入
-                BigDecimal teacherAmount = BigDecimal.ONE.subtract(serviceFee).multiply(expectPrice);
+                BigDecimal teacherAmount = BigDecimal.ONE.subtract(serviceFee).multiply(expectPrice).setScale(2, RoundingMode.HALF_UP);
 
                 // 判断分润给机构 还是给老师
                 // 机构ID = 0 老师设置了不分润
@@ -333,15 +340,12 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
             serviceFeeAmount = actualPrice;
         }
 
-        // 平台学生 发送推送
-        if(checkSendMessage(userPaymentOrder.getUserId(),userPaymentOrder.getOrderClient())) {
-            // 消息通知
-            CompletableFuture.runAsync(() -> {
-                        musicSheetService.sendBuyMessage(userPaymentOrder.getMerchId(), userPaymentOrder.getUserId(),
-                                userPaymentOrder.getBizId(), userPaymentOrder.getOrderClient(), userPaymentOrder.getOrderType());
-                    }
-            );
-        }
+        // 消息通知
+        CompletableFuture.runAsync(() -> {
+                    musicSheetService.sendBuyMessage(userPaymentOrder.getMerchId(), userPaymentOrder.getUserId(),
+                            userPaymentOrder.getBizId(), userPaymentOrder.getOrderClient(), userPaymentOrder.getOrderType());
+                }
+        );
 
 
         saveData(userPaymentOrder, tenantdivMap, teacherMap, bizMap, serviceFeeAmount);
@@ -431,7 +435,7 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
             log.info("buyPracticeCourseSuccess ok");
 
 
-            String userAccountConfig = redisCacheService.getUserAccountConfig(userPaymentOrder.getSubOrderNo());
+            String userAccountConfig = userPaymentOrder.getAccountConfig();
             UserPaymentOrderWrapper.AccountTenantTo accountTenantTo;
             if (StringUtils.isBlank(userAccountConfig)) {
                 accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
@@ -567,7 +571,7 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
             courseScheduleTeacherSalaryService.getDao().insertBatch(teacherSalaryList);
 
 
-            String userAccountConfig = redisCacheService.getUserAccountConfig(userPaymentOrder.getSubOrderNo());
+            String userAccountConfig = userPaymentOrder.getAccountConfig();
             UserPaymentOrderWrapper.AccountTenantTo accountTenantTo;
             if (StringUtils.isBlank(userAccountConfig)) {
                 accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
@@ -652,7 +656,7 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
         BigDecimal teacherAmount = expectPrice.subtract(serviceFeeAmount).setScale(2, RoundingMode.HALF_UP);
         // 判断分润给机构 还是给老师
 
-        String userAccountConfig = redisCacheService.getUserAccountConfig(userPaymentOrder.getSubOrderNo());
+        String userAccountConfig = userPaymentOrder.getAccountConfig();
         UserPaymentOrderWrapper.AccountTenantTo accountTenantTo;
         if (StringUtils.isBlank(userAccountConfig)) {
             accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
@@ -752,7 +756,7 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
         //服务费  原价的平台服务费 ,减去优惠券金额
         BigDecimal serviceFeeAmount = userPaymentOrder.getActualPrice();
 
-        memberPriceSettingsService.orderSuccess(userPaymentOrder,checkSendMessage(userPaymentOrder.getUserId(),userPaymentOrder.getOrderClient()));
+        memberPriceSettingsService.orderSuccess(userPaymentOrder);
 
         saveData(userPaymentOrder, tenantdivMap, teacherMap, bizMap, serviceFeeAmount);
     }
@@ -798,12 +802,28 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
         // 计算分润
         teacherAmount(userPaymentOrder, tenantdivMap, teacherMap,tenantShare, tenantdivMap.get(-1L));
 
+        String userAccountConfig = userPaymentOrder.getAccountConfig();
+        UserPaymentOrderWrapper.AccountTenantTo accountTenantTo;
+        if (StringUtils.isBlank(userAccountConfig)) {
+            accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
+        } else {
+            accountTenantTo = JSON.parseObject(userAccountConfig, UserPaymentOrderWrapper.AccountTenantTo.class);
+        }
+
 
-        // 写入机构收支表
-        tenantDivRecord(userPaymentOrder, tenantdivMap,false);
+        if (accountTenantTo.getIncomeTenant() >0 ){
 
-        // 写入平台
-        platformDivRecord(userPaymentOrder, tenantdivMap);
+            // 写入机构收支表
+            tenantDivRecord(userPaymentOrder, tenantdivMap,false);
+            // 写入平台
+            platformDivRecord(userPaymentOrder, tenantdivMap);
+        } else {
+            // 写入平台
+            platformDivRecord(userPaymentOrder, tenantdivMap);
+            // 写入机构收支表
+            tenantDivRecord(userPaymentOrder, tenantdivMap,false);
+
+        }
 
         // 写入机构分润
         tenantDivRecord(userPaymentOrder, tenantShare,true);
@@ -855,63 +875,65 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
         UserOrderPayment newestPayment = userOrderPaymentService.getNewestPayment(null, userPaymentOrder.getOrderNo());
 
         PaymentMerchantConfig merchantConfig = paymentMerchantConfigService.getByPaymentVendor(userPaymentOrder.getPaymentVendor());
-        List<PaymentDivMemberRecord> paymentDivMemberRecords = new ArrayList<>();
-        tenantdivMap.forEach((k, v) -> {
-
-            if (v.compareTo(BigDecimal.ZERO) > 0) {
-
-                Boolean tenantEnterFlag = false;
-                //  执行分账
-                PaymentDivMember paymentDivMember = null;
-                String divideOrderNo = IdWorker.getIdStr();
-                BigDecimal feeAmt = BigDecimal.ZERO;
-//                if (merchantConfig != null && newestPayment != null) {
-//                    paymentDivMember = paymentDivMemberService.getByAppIdAndTenantId(merchantConfig.getAppId(), k);
-//                    if (paymentDivMember != null) {
-//                        // 执行分账逻辑
-//                        BasePaymentService paymentService = paymentServiceContext.getPaymentService(merchantConfig.getPaymentVendor());
-//                        DivideReq.DivMember divMember = DivideReq.DivMember.builder()
-//                                .memberId(paymentDivMember.getMemberId())
-//                                .amount(v)
-//                                .feeFlag("Y")
-//                                .build();
-//                        DivideReq divideReq = DivideReq.builder()
-//                                .transNo(newestPayment.getTransNo())
-//                                .orderNo(userPaymentOrder.getOrderNo())
-//                                .divideOrderNo(divideOrderNo)
-//                                .divideAmount(v)
-//                                .divMembers(Lists.newArrayList(divMember))
-//                                .build();
-//                        try {
-//                            DivideResp divide = paymentService.divide(divideReq);
-//                            feeAmt = divide.getFeeAmount();
-//                            tenantEnterFlag = true;
-//                        } catch (Exception e) {
-//                            log.error("分账失败 分账对象 {} 分账数据 {} 分账订单号 {}", paymentDivMember, divideReq, divideOrderNo);
-//                        }
-//
-//                    }
-//                }
-
-                // 写入机构分账记录表
-                PaymentDivMemberRecord paymentDivMemberRecord = PaymentDivMemberRecord.builder()
-                        .tenantId(k)
-                        .appId(merchantConfig != null ? merchantConfig.getAppId() : null)
-                        .memberId(paymentDivMember != null ? paymentDivMember.getMemberId() : null)
+        String userAccountConfig = userPaymentOrder.getAccountConfig();
+        UserPaymentOrderWrapper.AccountTenantTo accountTenantTo;
+        if (StringUtils.isBlank(userAccountConfig)) {
+            accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
+        } else {
+            accountTenantTo = JSON.parseObject(userAccountConfig, UserPaymentOrderWrapper.AccountTenantTo.class);
+        }
+
+        BigDecimal amount = tenantdivMap.values().stream().reduce(BigDecimal.ZERO, BigDecimal::add);
+        boolean tenantEnterFlag = false;
+        //  执行分账
+        TenantMember tenantMember = null;
+        String divideOrderNo = IdWorker.getIdStr();
+        BigDecimal feeAmt = BigDecimal.ZERO;
+        if (merchantConfig != null && newestPayment != null) {
+            if (accountTenantTo.getIncomeTenant() > 0) {
+                tenantMember = tenantMemberService
+                        .getByAppIdAndTenantId(merchantConfig.getAppId(), accountTenantTo.getIncomeTenant(),merchantConfig.getPayerType());
+            }
+            if (tenantMember != null) {
+                // 执行分账逻辑
+                BasePaymentService paymentService = paymentServiceContext.getPaymentService(merchantConfig.getPaymentVendor());
+                DivideReq.DivMember divMember = DivideReq.DivMember.builder()
+                        .memberId(tenantMember.getMemberId())
+                        .amount(amount)
+                        .feeFlag("Y")
+                        .build();
+                DivideReq divideReq = DivideReq.builder()
+                        .transNo(newestPayment.getTransNo())
                         .orderNo(userPaymentOrder.getOrderNo())
-                        .divOrderNo(divideOrderNo)
-                        .transNo(newestPayment != null ? newestPayment.getTransNo() : null)
-                        .amount(v)
-                        .tenantEnterFlag(tenantEnterFlag)
-                        .status("SUCCESS")
-                        .feeFlag(true)
-                        .feeAmt(feeAmt)
+                        .divideOrderNo(divideOrderNo)
+                        .divideAmount(amount)
+                        .divMembers(Lists.newArrayList(divMember))
                         .build();
-                paymentDivMemberRecords.add(paymentDivMemberRecord);
-            }
+                try {
+                    DivideResp divide = paymentService.divide(divideReq);
+                    feeAmt = divide.getFeeAmount();
+                    tenantEnterFlag = true;
+                } catch (Exception e) {
+                    log.error("分账失败 分账对象 {} 分账数据 {} 分账订单号 {}", tenantMember, divideReq, divideOrderNo);
+                }
 
-        });
-        paymentDivMemberRecordService.saveBatch(paymentDivMemberRecords);
+            }
+        }
+        // 写入分账记录表
+        PaymentDivMemberRecord paymentDivMemberRecord = PaymentDivMemberRecord.builder()
+                .tenantId(accountTenantTo.getIncomeTenant())
+                .appId(merchantConfig != null ? merchantConfig.getAppId() : null)
+                .memberId(tenantMember != null ? tenantMember.getMemberId() : null)
+                .orderNo(userPaymentOrder.getOrderNo())
+                .divOrderNo(divideOrderNo)
+                .transNo(newestPayment != null ? newestPayment.getTransNo() : null)
+                .amount(amount)
+                .tenantEnterFlag(tenantEnterFlag)
+                .status("SUCCESS")
+                .feeFlag(true)
+                .feeAmt(feeAmt)
+                .build();
+        paymentDivMemberRecordService.save(paymentDivMemberRecord);
     }
 
     private void teacherShare(UserOrderDetailVo userPaymentOrder, BigDecimal shareFee) {
@@ -935,58 +957,153 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
     private void platformDivRecord(UserOrderDetailVo userPaymentOrder, Map<Long, BigDecimal> tenantdivMap) {
         // 写入平台收入表
         Date date = new Date();
+        String userAccountConfig = userPaymentOrder.getAccountConfig();
+        UserPaymentOrderWrapper.AccountTenantTo accountTenantTo;
+        if (StringUtils.isBlank(userAccountConfig)) {
+            accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
+        } else {
+            accountTenantTo = JSON.parseObject(userAccountConfig, UserPaymentOrderWrapper.AccountTenantTo.class);
+        }
+        AccountBizTypeEnum bizTypeEnum = AccountBizTypeEnum.valueOf(userPaymentOrder.getOrderType().name());
         BigDecimal amount = tenantdivMap.values().stream().reduce(BigDecimal.ZERO, BigDecimal::add);
+        PostStatusEnum platformPostStatus = PostStatusEnum.RECORDED;
+        SourceTypeEnum sourceType = SourceTypeEnum.ORDER;
+        if (accountTenantTo.getIncomeTenant() >0 ){
+            amount = tenantdivMap.get(-1L);
+            platformPostStatus = PostStatusEnum.WAIT;
+            sourceType = SourceTypeEnum.TENANT;
+        }
 
         if (amount.compareTo(BigDecimal.ZERO) <= 0) {
             return;
         }
+
         PlatformCashAccountRecord platformCashAccountRecord = new PlatformCashAccountRecord(userPaymentOrder.getUserId(), amount,
-                InOrOutEnum.IN, PostStatusEnum.RECORDED, AccountBizTypeEnum.valueOf(userPaymentOrder.getOrderType().name()), userPaymentOrder.getBizId(),
+                InOrOutEnum.IN, platformPostStatus, bizTypeEnum, userPaymentOrder.getBizId(),
                 userPaymentOrder.getOrderNo(), date);
+        platformCashAccountRecord.setSourceType(sourceType);
+
         platformCashAccountRecordService.save(platformCashAccountRecord);
+        if (accountTenantTo.getIncomeTenant() >0 ){
+            // 写入机构支出到平台
+            // 写入机构流水表
+            TenantAccountRecord tenantAccountRecord = TenantAccountRecord.builder()
+                    .tenantId(accountTenantTo.getIncomeTenant())
+                    .transAmount(amount)
+                    .platformCashAccountRecordId(platformCashAccountRecord.getId())
+                    .sourceType(SourceTypeEnum.PLATFORM)
+                    .inOrOut(InOrOutEnum.OUT.getCode())
+                    .postStatus(PostStatusEnum.WAIT.getCode())
+                    .bizType(bizTypeEnum.getCode())
+                    .bizId(userPaymentOrder.getBizId())
+                    .bizName(userPaymentOrder.getGoodName())
+                    .orderNo(userPaymentOrder.getOrderNo())
+                    .build();
+            tenantAccountRecordService.save(tenantAccountRecord);
+        }
     }
 
     private void tenantDivRecord(UserOrderDetailVo userPaymentOrder, Map<Long, BigDecimal> tenantdivMap,boolean share) {
         // 写入收支表
-        List<TenantAccountRecord> tenantAccountRecordList = new ArrayList<>();
         Date date = new Date();
-        tenantdivMap.forEach((tenantId, amount) -> {
+        for (Map.Entry<Long, BigDecimal> entry : tenantdivMap.entrySet()) {
+            Long tenantId = entry.getKey();
+            BigDecimal amount = entry.getValue();
+            BigDecimal tenantAmount = amount;
             if (tenantId.equals(-1L)) {
-                return;
+                continue;
             }
-            if (amount.compareTo(BigDecimal.ZERO) <=0) {
-                return;
+            if (amount.compareTo(BigDecimal.ZERO) <= 0) {
+                continue;
             }
-            String type = userPaymentOrder.getGoodType().getCode() ;
+            String type = userPaymentOrder.getGoodType().getCode();
             if (share) {
                 type = type + "_SHARE";
             }
 
             AccountBizTypeEnum bizTypeEnum = AccountBizTypeEnum.valueOf(type);
 
+            // 如果是机构入账
+            String userAccountConfig = userPaymentOrder.getAccountConfig();
+            UserPaymentOrderWrapper.AccountTenantTo accountTenantTo;
+            if (StringUtils.isBlank(userAccountConfig)) {
+                accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
+            } else {
+                accountTenantTo = JSON.parseObject(userAccountConfig, UserPaymentOrderWrapper.AccountTenantTo.class);
+            }
+            PostStatusEnum tenantPostStatus = PostStatusEnum.WAIT;
+            boolean isIncomeTenant = false;
+            if (accountTenantTo.getIncomeTenant() > 0 && tenantId.equals(accountTenantTo.getIncomeTenant()) && !share) {
+                tenantAmount = tenantdivMap.values().stream().reduce(BigDecimal.ZERO, BigDecimal::add);
+                tenantPostStatus = PostStatusEnum.RECORDED;
+                isIncomeTenant = true;
+            }
 
-            // 写入平台支出表
-            PlatformCashAccountRecord platformCashAccountRecord2 = new PlatformCashAccountRecord(userPaymentOrder.getUserId(), amount,
-                    InOrOutEnum.OUT, PostStatusEnum.WAIT, bizTypeEnum, userPaymentOrder.getBizId(),
-                    userPaymentOrder.getOrderNo(), date);
-            platformCashAccountRecordService.save(platformCashAccountRecord2);
+            Long platformCashAccountRecordId = null;
+            if (!isIncomeTenant) {
+                // 写入平台支出表
+                PlatformCashAccountRecord platformCashAccountRecord2 = new PlatformCashAccountRecord(userPaymentOrder.getUserId(), amount,
+                        InOrOutEnum.OUT, PostStatusEnum.WAIT, bizTypeEnum, userPaymentOrder.getBizId(),
+                        userPaymentOrder.getOrderNo(), date);
+                platformCashAccountRecord2.setSourceType(SourceTypeEnum.TENANT);
+                platformCashAccountRecordService.save(platformCashAccountRecord2);
+                platformCashAccountRecordId = platformCashAccountRecord2.getId();
+            }
 
             // 写入机构流水表
             TenantAccountRecord tenantAccountRecord = TenantAccountRecord.builder()
                     .tenantId(tenantId)
-                    .transAmount(amount)
-                    .platformCashAccountRecordId(platformCashAccountRecord2.getId())
+                    .transAmount(tenantAmount)
+                    .platformCashAccountRecordId(platformCashAccountRecordId)
+                    .sourceType(SourceTypeEnum.ORDER)
                     .inOrOut(InOrOutEnum.IN.getCode())
-                    .postStatus(PostStatusEnum.WAIT.getCode())
+                    .postStatus(tenantPostStatus.getCode())
                     .bizType(bizTypeEnum.getCode())
                     .bizId(userPaymentOrder.getBizId())
                     .bizName(userPaymentOrder.getGoodName())
                     .orderNo(userPaymentOrder.getOrderNo())
                     .build();
-            tenantAccountRecordList.add(tenantAccountRecord);
 
-        });
-        tenantAccountRecordService.saveBatch(tenantAccountRecordList);
+            if (!isIncomeTenant) {
+                tenantAccountRecord.setSourceType(SourceTypeEnum.PLATFORM);
+            }
+            tenantAccountRecordService.save(tenantAccountRecord);
+            // 是否结算到老师, 结算到老师的,写入机构支出 和老师机构收入
+            if ((accountTenantTo.isIncomeTeacher()&& !share) || (share && accountTenantTo.isShareTeacher())) {
+                TenantAccountRecord tenantAccountRecordOut = TenantAccountRecord.builder()
+                        .tenantId(tenantId)
+                        .transAmount(amount)
+                        .platformCashAccountRecordId(null)
+                        .sourceType(SourceTypeEnum.TEACHER)
+                        .inOrOut(InOrOutEnum.OUT.getCode())
+                        .postStatus(PostStatusEnum.WAIT.getCode())
+                        .bizType(bizTypeEnum.getCode())
+                        .bizId(userPaymentOrder.getBizId())
+                        .bizName(userPaymentOrder.getGoodName())
+                        .orderNo(userPaymentOrder.getOrderNo())
+                        .build();
+                tenantAccountRecordService.save(tenantAccountRecordOut);
+
+                TenantTeacherAccountRecord tenantTeacherAccountRecord = TenantTeacherAccountRecord.builder()
+                        .tenantId(tenantId)
+                        .teacherId(userPaymentOrder.getMerchId())
+                        .accountRecordId(tenantAccountRecordOut.getId())
+                        .sourceType(SourceTypeEnum.TENANT)
+                        .transAmount(amount)
+                        .inOrOut(InOrOutEnum.IN.getCode())
+                        .postStatus(PostStatusEnum.WAIT.getCode())
+                        .bizType(bizTypeEnum.getCode())
+                        .bizId(userPaymentOrder.getBizId())
+                        .bizName(userPaymentOrder.getGoodName())
+                        .orderNo(userPaymentOrder.getOrderNo())
+                        .build();
+                tenantTeacherAccountRecordService.save(tenantTeacherAccountRecord);
+                tenantAccountRecordOut.setPlatformCashAccountRecordId(tenantTeacherAccountRecord.getId());
+                tenantAccountRecordService.updateById(tenantAccountRecordOut);
+
+            }
+
+        }
     }
 
 
@@ -998,7 +1115,7 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
             return;
         }
 
-        String userAccountConfig = redisCacheService.getUserAccountConfig(userPaymentOrder.getSubOrderNo());
+        String userAccountConfig = userPaymentOrder.getAccountConfig();
         UserPaymentOrderWrapper.AccountTenantTo accountTenantTo;
         if (StringUtils.isBlank(userAccountConfig)) {
             accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();

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

@@ -154,14 +154,11 @@ public class PianoRoomBuyRecordServiceImpl extends ServiceImpl<PianoRoomBuyRecor
 
         orderGoodsInfo.setUserOrderDetail(userOrderDetail);
 
+        userOrderDetail.setAccountConfig(teacherService.teacherSettlementFrom(null,orderGoodsInfo.getRecomUserId()).jsonString());
 
         // 设置金额入账去向
-        UserPaymentOrderWrapper.AccountTenantTo accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
-        if (orderGoodsInfo.getRecomUserId() !=null) {
-            accountTenantTo.setShareTenant(teacherService.teacherSettlementFrom(orderGoodsInfo.getRecomUserId()));
-        }
         // 存入缓存
-        redisCacheService.saveUserAccountConfig(orderGoodsInfo.getSubOrderNo(), accountTenantTo.jsonString());
+//        redisCacheService.saveUserAccountConfig(orderGoodsInfo.getSubOrderNo(), teacherService.teacherSettlementFrom(null,orderGoodsInfo.getRecomUserId()).jsonString());
 
     }
 

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

@@ -24,21 +24,14 @@ import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.ImGroupMemberRoleType;
 import com.yonge.cooleshow.biz.dal.enums.ImGroupType;
+import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
 import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
-import com.yonge.cooleshow.biz.dal.service.ImGroupService;
+import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.mapper.TenantAlbumMapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantAlbumPurchaseMapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantAlbumRefMapper;
-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;
 import com.yonge.cooleshow.biz.dal.service.im.ImGroupCoreService;
-import com.yonge.cooleshow.biz.dal.service.SysConfigService;
-import com.yonge.cooleshow.biz.dal.service.TeacherService;
-import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
-import com.yonge.cooleshow.biz.dal.service.UserTenantAlbumRecordService;
 import com.yonge.cooleshow.biz.dal.vo.MyFollow;
 import com.yonge.cooleshow.biz.dal.vo.StudentHomeVo;
 import com.yonge.cooleshow.biz.dal.vo.StudentVo;
@@ -52,6 +45,7 @@ import com.yonge.cooleshow.common.enums.UserLockFlag;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.util.StringUtil;
 import com.yonge.toolset.mybatis.support.PageUtil;
+import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import com.yonge.toolset.utils.date.DateUtil;
 import com.yonge.toolset.utils.easyexcel.ExcelDataReaderProperty;
 import com.yonge.toolset.utils.string.ValueUtil;
@@ -67,7 +61,6 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.text.MessageFormat;
-import java.text.ParseException;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
@@ -121,6 +114,10 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
     @Autowired
     private CustomerServiceConfig customerServiceConfig;
 
+
+    @Autowired
+    private SysMessageService sysMessageService;
+
     @Override
     public StudentDao getDao() {
         return baseMapper;
@@ -571,6 +568,35 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
         this.lambdaUpdate().set(Student::getTenantId, toTenantId)
                 .eq(Student::getUserId, student.getUserId())
                 .update();
+
+        sendStudentTenantChange(student,toTenantId);
+    }
+
+    @Override
+    public void sendStudentTenantChange(Student student, Long toTenantId) {
+        if (student.getTenantId() == null || student.getTenantId() == -1) {
+            return;
+        }
+        SysUser sysUser = sysUserFeignService.queryUserById(student.getUserId());
+        if (sysUser == null) {
+            return;
+        }
+        TenantInfo tenantInfo = tenantInfoService.getById(student.getTenantId());
+        if (tenantInfo == null) {
+            return;
+        }
+        TenantInfo newTenantInfo = tenantInfoService.getById(toTenantId);
+        if (newTenantInfo == null) {
+            return;
+        }
+        Map<Long, String> receivers = new HashMap<>();
+        receivers.put(sysUser.getId(), sysUser.getPhone());
+        try {
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TENANT_STUDENT_CHANGE,
+                    receivers, null, 0, null, ClientEnum.TENANT_STUDENT.getCode(),tenantInfo.getName(),newTenantInfo.getName());
+        } catch (Exception e) {
+            log.error("学生机构变更极光消息推送异常,", e);
+        }
     }
 
     private Boolean updateStudent(StudentWrapper.Student studentInfo) {

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

@@ -13,6 +13,7 @@ import java.util.stream.Collectors;
 
 import com.alibaba.fastjson.JSON;
 import com.yonge.cooleshow.biz.dal.dto.JumpUrlDto;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.toolset.base.string.MessageFormatter;
 import com.yonge.toolset.mybatis.service.impl.BaseServiceImpl;
 
@@ -220,7 +221,7 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 			return;
 		}
 		if (StringUtils.isEmpty(url)) {
-			url = selectConfigUrl(type.getCode());
+			url = selectConfigUrlJumpType(type.getCode(),jpushType);
 		}
 
 		String[] tos;
@@ -271,6 +272,9 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 		} else if (messageSender.getSendMode().equals("EMAIL")) {
 			mode = MessageSendMode.EMAIL;
 		}
+        if (ClientEnum.TENANT_STUDENT.getCode().equals(jpushType)) {
+            jpushType = ClientEnum.STUDENT.getCode();
+        }
 		addMessage(receivers, messageConfig.getDescription(), MessageFormatter.arrayFormat(messageConfig.getContent(), args), triggerTime, mode, status, errorMsg, readStatus,
 				url, messageConfig.getGroup(),jpushType,messageConfig.getId());
 	}
@@ -503,6 +507,10 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 
 	@Override
 	public String selectConfigUrl(String messageType,Object ...param) {
+        return selectConfigUrlJumpType(messageType,null,param);
+    }
+
+    private String selectConfigUrlJumpType(String messageType,String jumpType,Object ...param) {
 		SysMessageConfig sysMessageConfig = sysMessageConfigService.queryByType(messageType);
 		if (sysMessageConfig == null) {
 			throw new BizException("消息类型错误");
@@ -522,6 +530,9 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 		jumpUrlDto.setUrl(sysMessageConfig.getActionUrl());
 		jumpUrlDto.setPageTag(sysMessageConfig.getPageTag());
 		jumpUrlDto.setParams(sysMessageConfig.getParams());
+        if (StringUtils.isNotBlank(jumpType) && ClientEnum.TENANT_STUDENT.getCode().equals(jumpType)) {
+            jumpUrlDto.setClientType("TENANT");
+        }
 		return JSON.toJSONString(jumpUrlDto);
 	}
 }

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

@@ -54,6 +54,7 @@ import com.yonge.cooleshow.biz.dal.vo.TeacherHomeVo;
 import com.yonge.cooleshow.biz.dal.vo.TeacherVo;
 import com.yonge.cooleshow.biz.dal.wordfilter.WordFilter;
 import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.teacher.TeacherWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
@@ -240,11 +241,19 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
         Map<Long, String> subjectMap = subjects.stream().collect(Collectors.toMap(Subject::getId, Subject::getName));
 
         List<Long> userIds = teacherVos.stream().map(Teacher::getUserId).distinct().collect(Collectors.toList());
-        List<MusicSheetUploadCountVo> musicSheetUploadCountVos = musicSheetService.countByUser(userIds);
-        Map<Long, Integer> countByUser = musicSheetUploadCountVos.stream()
-                .collect(Collectors.toMap(MusicSheetUploadCountVo::getUserId, MusicSheetUploadCountVo::getCount));
+
+        List<MusicSheet> musicSheets = musicSheetService.lambdaQuery()
+                .in(MusicSheet::getUserId, userIds)
+                .eq(MusicSheet::getDelFlag, false)
+                .eq(MusicSheet::getState, 1)
+                .eq(MusicSheet::getSourceType, "TEACHER").list();
+
+        Map<Long, List<MusicSheet>> groupByUserId = musicSheets.stream().collect(Collectors.groupingBy(MusicSheet::getUserId));
         for (TeacherVo teacherVo : teacherVos) {
-            teacherVo.setMusicSheetCount(countByUser.getOrDefault(teacherVo.getUserId(), 0));
+            List<MusicSheet> musicSheetList = groupByUserId.getOrDefault(teacherVo.getUserId(), new ArrayList<>());
+            teacherVo.setMusicSheetCount(musicSheetList.size());
+            List<String> names = musicSheetList.stream().map(MusicSheet::getMusicSheetName).collect(Collectors.toList());
+            teacherVo.setMusicSheetName(String.join(",", names));
             if (null == teacherVo.getSubjectId()) {
                 continue;
             }
@@ -1099,19 +1108,45 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
     }
 
     @Override
-    public Long teacherSettlementFrom(Long teacherId) {
+    public UserPaymentOrderWrapper.AccountTenantTo teacherSettlementFrom(Long teacherId, Long recomUserId) {
         // 判断分润给机构 还是给老师
-        if (teacherId == null) {
-            return -1L;
+
+
+        UserPaymentOrderWrapper.AccountTenantTo accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
+
+        if (teacherId != null) {
+            Teacher teacher = getById(teacherId);
+            if (teacher.getIsSettlement() !=null && !teacher.getIsSettlement()) {
+                accountTenantTo.setIncomeTenant(0L);
+            } else if (teacher.getTenantId() != null && teacher.getTenantId() > 0) {
+                accountTenantTo.setIncomeTenant(teacher.getTenantId());
+                if (ESettlementFrom.TEACHER.equals(teacher.getSettlementFrom())) {
+                    accountTenantTo.setIncomeTeacher(true);
+                }
+            } else {
+                // 分润给老师
+                accountTenantTo.setIncomeTenant(-1L);
+                accountTenantTo.setIncomeTeacher(true);
+            }
         }
-        Teacher teacher = getById(teacherId);
-        if (teacher.getIsSettlement() !=null && !teacher.getIsSettlement()) {
-            return 0L;
-        } else if (teacher.getTenantId() != null && teacher.getTenantId() > 0 && ESettlementFrom.TENANT.equals(teacher.getSettlementFrom())) {
-            return teacher.getTenantId();
-        } else {
-            // 分润给老师
-            return  -1L;
+
+
+        if (recomUserId != null) {
+            Teacher teacher = getById(recomUserId);
+            if (teacher.getIsSettlement() !=null && !teacher.getIsSettlement()) {
+                accountTenantTo.setShareTenant(0L);
+            } else if (teacher.getTenantId() != null && teacher.getTenantId() > 0) {
+                accountTenantTo.setShareTenant(teacher.getTenantId());
+                if (ESettlementFrom.TEACHER.equals(teacher.getSettlementFrom())) {
+                    accountTenantTo.setShareTeacher(true);
+                }
+            } else {
+                // 分润给老师
+                accountTenantTo.setShareTenant(-1L);
+                accountTenantTo.setShareTeacher(true);
+            }
         }
+
+        return accountTenantTo;
     }
 }

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

@@ -1,30 +1,21 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
-import com.alipay.api.domain.NextUrl;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.google.common.collect.Lists;
 import com.yonge.cooleshow.biz.dal.dao.StudentDao;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentSearch;
-import com.yonge.cooleshow.biz.dal.entity.Student;
-import com.yonge.cooleshow.biz.dal.entity.SysUser;
-import com.yonge.cooleshow.biz.dal.entity.TenantActivationCode;
-import com.yonge.cooleshow.biz.dal.entity.TenantAlbumPurchase;
-import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
-import com.yonge.cooleshow.biz.dal.entity.UserTenantAlbumRecord;
+import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
-import com.yonge.cooleshow.biz.dal.enums.im.EImSendStatus;
 import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantActivationCodeMapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantAlbumPurchaseMapper;
 import com.yonge.cooleshow.biz.dal.mapper.UserTenantAlbumRecordMapper;
-import com.yonge.cooleshow.biz.dal.service.TenantActivationCodeService;
-import com.yonge.cooleshow.biz.dal.service.TenantAlbumService;
+import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.vo.StudentVo;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantActivationCodeWrapper;
@@ -33,6 +24,7 @@ import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.EActivationCode;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.mybatis.support.PageUtil;
+import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import com.yonge.toolset.utils.easyexcel.ExcelDataReaderProperty;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
@@ -46,7 +38,6 @@ import java.util.*;
 import java.util.function.Function;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 /**
  * 机构激活码
@@ -69,7 +60,10 @@ public class TenantActivationCodeServiceImpl extends ServiceImpl<TenantActivatio
     private UserTenantAlbumRecordMapper userTenantAlbumRecordMapper;
 
     @Autowired
-    private TenantAlbumService tenantAlbumService;
+    private TenantInfoService tenantInfoService;
+
+    @Autowired
+    private SysMessageService sysMessageService;
 
     private static final String PHONE_REG = "^1\\d{10}$";
 
@@ -171,6 +165,32 @@ public class TenantActivationCodeServiceImpl extends ServiceImpl<TenantActivatio
                 throw new BizException("激活码已被激活:" + tenantActivationCodes.get(i).getActivationCode());
             }
         }
+        if (idPhoneMap.size() >0) {
+            idPhoneMap.forEach(this::sendActivationCodeMessage);
+        }
+    }
+
+    private void sendActivationCodeMessage(Long userId,String phone) {
+
+        Map<Long, String> receivers = new HashMap<>();
+        receivers.put(userId, phone);
+        try {
+            String url = sysMessageService.selectConfigUrl(MessageTypeEnum.TENANT_SEND_CODE.getCode());
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TENANT_SEND_CODE,
+                    receivers, null, 0, url, ClientEnum.TENANT_STUDENT.getCode());
+        } catch (Exception e) {
+            log.error("机构发放激活码推送异常", e);
+        }
+    }
+
+    @Override
+    public void sendCancelActivationCodeMessage(Map<Long, String> receivers, String tenantName) {
+        try {
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TENANT_CODE_SENDCANCEL,
+                    receivers, null, 0, null, ClientEnum.TENANT_STUDENT.getCode(),tenantName);
+        } catch (Exception e) {
+            log.error("机构发放激活码推送异常", e);
+        }
     }
 
     @Override
@@ -305,6 +325,11 @@ public class TenantActivationCodeServiceImpl extends ServiceImpl<TenantActivatio
         }
         one.setActivationPhone(sysUser.getPhone());
         this.updateById(one);
+        TenantInfo tenantInfo = tenantInfoService.getById(tenantId);
+        Map<Long, String> receivers = new HashMap<>(1);
+        receivers.put(userId, sysUser.getPhone());
+        this.sendCancelActivationCodeMessage(receivers,tenantInfo.getName());
+        this.sendActivationCodeMessage(userId,sysUser.getPhone());
     }
 
     @Transactional(rollbackFor = Exception.class)
@@ -330,7 +355,9 @@ public class TenantActivationCodeServiceImpl extends ServiceImpl<TenantActivatio
                 .eq(TenantActivationCode::getSendStatus, EActivationCode.SEND)
                 .eq(TenantActivationCode::getTenantId,tenantInfo.getId())
                 .update();
-
+        //获取优惠券关联的学员编号和手机号map
+        Map<Long, String> receivers = sysUserMapper.selectBatchIds(idList).stream().collect(Collectors.toMap(SysUser::getId, SysUser::getPhone));
+        this.sendCancelActivationCodeMessage(receivers,tenantInfo.getName());
     }
 
     @Transactional(rollbackFor = Exception.class)

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

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.service.additional.query.impl.LambdaQueryChainWrapper;
 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.*;
 import com.yonge.cooleshow.biz.dal.mapper.TenantAlbumMapper;
@@ -18,6 +19,8 @@ import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.util.StringUtil;
+import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
+import com.yonge.toolset.utils.date.DateUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -26,6 +29,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
@@ -76,7 +80,14 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
     @Autowired
     private TenantAccountRecordService tenantAccountRecordService;
 
+    @Autowired
+    private SysMessageService sysMessageService;
+
+    @Autowired
+    private TenantAlbumService tenantAlbumService;
 
+    @Autowired
+    private UserTenantAlbumRecordService userTenantAlbumRecordService;
     /**
      * 查询详情
      *
@@ -209,6 +220,9 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
 
         UserOrderDetail userOrderDetail = JSON.parseObject(JSON.toJSONString(orderGoodsInfo), UserOrderDetail.class);
 
+
+        // 设置金额入账去向
+        UserPaymentOrderWrapper.AccountTenantTo accountTenantTo = teacherService.teacherSettlementFrom(null, orderGoodsInfo.getRecomUserId());
         BigDecimal price = BigDecimal.ZERO;
         // 学生购买机构专辑
         switch (orderGoodsInfo.getPaymentClient()) {
@@ -229,6 +243,7 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
                 tenantAlbumContent.setBuyNumber(1);
                 tenantAlbumContent.setBuyCycle(tenantAlbumContent.getBuyCycle()*tenantAlbumContent.getBuyMultiple());
                 tenantAlbumContent.setTenantId(tenantInfo.getId());
+                accountTenantTo.setIncomeTenant(tenantInfo.getId());
                 break;
             }
 
@@ -262,18 +277,13 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
         userOrderDetail.setCouponAmount(BigDecimal.ZERO);
         userOrderDetail.setExpectPrice(userOrderDetail.getOriginalPrice());
         userOrderDetail.setActualPrice(userOrderDetail.getExpectPrice());
+        userOrderDetail.setAccountConfig(accountTenantTo.jsonString());
 
         orderGoodsInfo.setUserOrderDetail(userOrderDetail);
 
-
-        // 设置金额入账去向
-        UserPaymentOrderWrapper.AccountTenantTo accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
-        if (orderGoodsInfo.getRecomUserId() !=null) {
-            accountTenantTo.setShareTenant(teacherService.teacherSettlementFrom(orderGoodsInfo.getRecomUserId()));
-        }
-
+        userOrderDetail.setAccountConfig(accountTenantTo.jsonString());
         // 存入缓存
-        redisCacheService.saveUserAccountConfig(orderGoodsInfo.getSubOrderNo(), accountTenantTo.jsonString());
+//        redisCacheService.saveUserAccountConfig(orderGoodsInfo.getSubOrderNo(), accountTenantTo.jsonString());
 
     }
 
@@ -292,6 +302,7 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
             case STUDENT: {
                 tenantActivationCodeService.addUserTenantAlbumRecord(userOrderDetailVo.getUserId(),userOrderDetailVo);
 
+                sendMsg(userOrderDetailVo);
                 break;
             }
 
@@ -332,6 +343,7 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
                         .tenantId(tenantAlbumPurchase.getTenantId())
                         .transAmount(userOrderDetailVo.getActualPrice())
                         .inOrOut(InOrOutEnum.OUT.getCode())
+                        .sourceType(SourceTypeEnum.ORDER)
                         .postStatus(PostStatusEnum.RECORDED.getCode())
                         .bizType(OrderTypeEnum.TENANT_ALBUM.getCode())
                         .bizId(userOrderDetailVo.getBizId())
@@ -344,6 +356,49 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
         }
     }
 
+    private void sendMsg(UserOrderDetailVo userOrderDetailVo) {
+        try {
+            SysUser user = sysUserFeignService.queryUserById(userOrderDetailVo.getUserId());
+
+            if (user == null) {
+                return;
+            }
+
+            // 查询机构专辑信息
+            TenantAlbum tenantAlbum = tenantAlbumService.getById(userOrderDetailVo.getBizId());
+            if (tenantAlbum == null) {
+                return;
+            }
+
+            // 查询学生当前机构有效时间
+            UserTenantAlbumRecord albumRecord = userTenantAlbumRecordService
+                    .getNewestByTenantAlbumId(tenantAlbum.getId(), user.getId(), userOrderDetailVo.getOrderClient());
+            if (albumRecord == null) {
+                return;
+            }
+            String dateStr = DateUtil.format(albumRecord.getEndTime(), DateUtil.DEFAULT_PATTERN);
+
+
+            Map<Long, String> receivers = new HashMap<>();
+            receivers.put(user.getId(), user.getPhone());
+
+            if (userOrderDetailVo.getOrderClient().equals(ClientEnum.STUDENT)) {
+                Student student = studentService.getById(user.getId());
+                if (student.getTenantId() != null && student.getTenantId() >0) {
+                    try {
+                        String url = sysMessageService.selectConfigUrl(MessageTypeEnum.TENANT_ALBUM_BUY.getCode(),userOrderDetailVo.getOrderNo());
+                        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TENANT_ALBUM_BUY,
+                                receivers, null, 0, url, ClientEnum.TENANT_STUDENT.getCode(),tenantAlbum.getName(),dateStr);
+                    } catch (Exception e) {
+                        log.error("机构学生购买训练教材", e);
+                    }
+                }
+            }
+        } catch (Exception e) {
+            log.error("机构学生购买训练教材 : {}",e.getMessage());
+        }
+    }
+
 
     @Transactional(rollbackFor = Exception.class)
     @Override

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

@@ -13,14 +13,15 @@ import com.microsvc.toolkit.middleware.payment.common.api.PaymentServiceContext;
 import com.microsvc.toolkit.middleware.payment.common.api.entity.PaymentMerchant;
 import com.yonge.cooleshow.biz.dal.entity.PaymentMerchantConfig;
 import com.yonge.cooleshow.biz.dal.entity.SysArea;
+import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
 import com.yonge.cooleshow.biz.dal.mapper.SysAreaMapper;
 import com.yonge.cooleshow.biz.dal.service.PaymentMerchantConfigService;
 import com.yonge.cooleshow.biz.dal.service.SysConfigService;
-import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.enums.EPayerType;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.util.StringUtil;
+import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import lombok.extern.slf4j.Slf4j;
@@ -85,27 +86,27 @@ public class TenantMemberServiceImpl extends ServiceImpl<TenantMemberMapper, Ten
         if (tenantMembers.isEmpty()) {
             return page.setRecords(tenantMembers);
         }
-        //设置省市中文名称
-        List<Integer> areaCodeList = tenantMembers.stream().map(next -> {
-            HashSet<Integer> areaCodes = new HashSet<>();
-            areaCodes.add(Integer.valueOf(next.getProvCode()));
-            areaCodes.add(Integer.valueOf(next.getAreaCode()));
-            areaCodes.add(Integer.valueOf(next.getDistrictCode()));
-            return areaCodes;
-        }).flatMap(Collection::stream).filter(Objects::nonNull).distinct().collect(Collectors.toList());
-        if (!areaCodeList.isEmpty()) {
-            QueryWrapper<SysArea> queryWrapper = new QueryWrapper<>();
-            queryWrapper.lambda().in(SysArea::getCode, areaCodeList);
-
-            Map<Integer, String> codeNameMap = sysAreaMapper.selectList(queryWrapper)
-                    .stream().collect(Collectors.toMap(SysArea::getCode, SysArea::getName));
-
-            tenantMembers.forEach(next -> {
-                next.setProvName(codeNameMap.getOrDefault(Integer.valueOf(next.getProvCode()), ""));
-                next.setAreaName(codeNameMap.getOrDefault(Integer.valueOf(next.getAreaCode()), ""));
-                next.setDistrictName(codeNameMap.getOrDefault(Integer.valueOf(next.getDistrictCode()), ""));
-            });
-        }
+//        //设置省市中文名称
+//        List<Integer> areaCodeList = tenantMembers.stream().map(next -> {
+//            HashSet<Integer> areaCodes = new HashSet<>();
+//            areaCodes.add(Integer.valueOf(next.getProvCode()));
+//            areaCodes.add(Integer.valueOf(next.getAreaCode()));
+//            areaCodes.add(next.getDistrictCode()!= null?Integer.valueOf(next.getDistrictCode()):null);
+//            return areaCodes;
+//        }).flatMap(Collection::stream).filter(Objects::nonNull).distinct().collect(Collectors.toList());
+//        if (!areaCodeList.isEmpty()) {
+//            QueryWrapper<SysArea> queryWrapper = new QueryWrapper<>();
+//            queryWrapper.lambda().in(SysArea::getCode, areaCodeList);
+//
+//            Map<Integer, String> codeNameMap = sysAreaMapper.selectList(queryWrapper)
+//                    .stream().collect(Collectors.toMap(SysArea::getCode, SysArea::getName));
+//
+//            tenantMembers.forEach(next -> {
+//                next.setProvName(codeNameMap.getOrDefault(Integer.valueOf(next.getProvCode()), ""));
+//                next.setAreaName(codeNameMap.getOrDefault(Integer.valueOf(next.getAreaCode()), ""));
+//                next.setDistrictName(codeNameMap.getOrDefault(Integer.valueOf(next.getDistrictCode()), ""));
+//            });
+//        }
         return page.setRecords(tenantMembers);
     }
 
@@ -125,9 +126,17 @@ public class TenantMemberServiceImpl extends ServiceImpl<TenantMemberMapper, Ten
         BasePaymentService paymentService = paymentServiceContext.getPaymentService(tenantMember.getPayerName());
 
         PaymentMerchant.MerchantMember merchantMember = getMerchantMember(tenantMember);
-        paymentService.createPaymentCorpMember(merchantConfig,merchantMember);
-
-        return this.save(JSON.parseObject(tenantMember.jsonString(), TenantMember.class));
+        try {
+            log.info("创建子账户参数:{}", JSON.toJSONString(merchantConfig));
+            Map<String, Object> paymentCorpMember = paymentService.createPaymentCorpMember(merchantConfig, merchantMember);
+        }catch (Exception e) {
+            log.error("创建子账户失败", e);
+            throw new BizException("创建子账户失败:" + e.getMessage());
+        }
+        tenantMember.setMultipartFile(null);
+        TenantMember member = JSON.parseObject(tenantMember.jsonString(), TenantMember.class);
+        member.setStatus(AuthStatusEnum.DOING);
+        return this.save(member);
     }
 
     private PaymentMerchant.MerchantMember getMerchantMember(TenantMemberWrapper.InsertOrUpdateTenantMember tenantMember) {
@@ -168,11 +177,11 @@ public class TenantMemberServiceImpl extends ServiceImpl<TenantMemberMapper, Ten
                 .settlementDirection("BANKCARD")
                 .build();
         if (tenantMember.getPayerType().equals(EPayerType.ADAPAY)) {
-            merchantMember.setNotifyUrl(sysConfigService.findConfigValue(SysConfigConstant.SUB_ACCOUNT_CREATE_CALLBACK_URL +
-                    "/" + EPayerType.ADAPAY.getCode()));
+            merchantMember.setNotifyUrl(sysConfigService.findConfigValue(SysConfigConstant.SUB_ACCOUNT_CREATE_CALLBACK_URL) +
+                    "/" + EPayerType.ADAPAY.getCode());
         } else if (tenantMember.getPayerType().equals(EPayerType.YEEPAY)) {
-            merchantMember.setNotifyUrl(sysConfigService.findConfigValue(SysConfigConstant.SUB_ACCOUNT_CREATE_CALLBACK_URL +
-                    "/" + EPayerType.YEEPAY.getCode()+"/"+tenantMember.getRequestNo()));
+            merchantMember.setNotifyUrl(sysConfigService.findConfigValue(SysConfigConstant.SUB_ACCOUNT_CREATE_CALLBACK_URL )+
+                    "/" + EPayerType.YEEPAY.getCode()+"/"+tenantMember.getRequestNo());
         }
         return merchantMember;
 
@@ -219,13 +228,24 @@ public class TenantMemberServiceImpl extends ServiceImpl<TenantMemberMapper, Ten
 
         PaymentMerchant.MerchantMember merchantMember = getMerchantMember(tenantMember);
 
-        if (member.getPayerName().equals(tenantMember.getPayerName())) {
-            paymentService.updatePaymentCorpMember(merchantConfig, merchantMember);
-        } else {
-            paymentService.createPaymentCorpMember(merchantConfig, merchantMember);
+        try {
+            if (member.getPayerName().equals(tenantMember.getPayerName())) {
+                Boolean aBoolean = paymentService.updatePaymentCorpMember(merchantConfig, merchantMember);
+                if (!aBoolean) {
+                    throw new BizException("更新子账户失败");
+                }
+            } else {
+                Map<String, Object> paymentCorpMember = paymentService.createPaymentCorpMember(merchantConfig, merchantMember);
+            }
+        }catch (Exception e) {
+            log.error("更新子账户失败", e);
+            throw new BizException("更新子账户失败:" + e.getMessage());
         }
 
-        return this.updateById(JSON.parseObject(tenantMember.jsonString(), TenantMember.class));
+        tenantMember.setMultipartFile(null);
+        TenantMember object = JSON.parseObject(tenantMember.jsonString(), TenantMember.class);
+        object.setStatus(AuthStatusEnum.DOING);
+        return this.updateById(object);
     }
 
     /**
@@ -265,4 +285,17 @@ public class TenantMemberServiceImpl extends ServiceImpl<TenantMemberMapper, Ten
                 .one();
     }
 
+    @Override
+    public TenantMember getByAppIdAndTenantId(String appId, Long tenantId, EPayerType payerType) {
+        return this.lambdaQuery()
+                .eq(TenantMember::getAppId, appId)
+                .eq(TenantMember::getTenantId, tenantId)
+                .eq(TenantMember::getStatus, AuthStatusEnum.PASS)
+                .eq(TenantMember::getPayerType, payerType)
+                .orderByDesc(TenantMember::getUpdateTime)
+                .last("limit 1")
+                .one();
+
+    }
+
 }

+ 66 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantTeacherAccountRecordServiceImpl.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.TenantTeacherAccountRecord;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantTeacherAccountRecordWrapper;
+import com.yonge.cooleshow.biz.dal.mapper.TenantTeacherAccountRecordMapper;
+import com.yonge.cooleshow.biz.dal.service.TenantTeacherAccountRecordService;
+
+/**
+ * 机构老师流水表
+ * 2023-10-09 17:39:42
+ */
+@Slf4j
+@Service
+public class TenantTeacherAccountRecordServiceImpl extends ServiceImpl<TenantTeacherAccountRecordMapper, TenantTeacherAccountRecord> implements TenantTeacherAccountRecordService {
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return TenantTeacherAccountRecord
+     */
+	@Override
+    public TenantTeacherAccountRecord detail(Long id) {
+        
+        return baseMapper.selectById(id);
+    }
+    
+    /**
+     * 分页查询
+     * @param page IPage<TenantTeacherAccountRecord>
+     * @param query TenantTeacherAccountRecordWrapper.TenantTeacherAccountRecordQuery
+     * @return IPage<TenantTeacherAccountRecord>
+     */
+    @Override
+    public IPage<TenantTeacherAccountRecord> selectPage(IPage<TenantTeacherAccountRecord> page, TenantTeacherAccountRecordWrapper.TenantTeacherAccountRecordQuery query) {
+        
+        return page.setRecords(baseMapper.selectPage(page, query));
+    }
+	
+    /**
+     * 添加
+     * @param tenantTeacherAccountRecord TenantTeacherAccountRecordWrapper.TenantTeacherAccountRecord
+     * @return Boolean
+     */
+    @Override
+    public Boolean add(TenantTeacherAccountRecordWrapper.TenantTeacherAccountRecord tenantTeacherAccountRecord) {    	
+        
+        return this.save(JSON.parseObject(tenantTeacherAccountRecord.jsonString(), TenantTeacherAccountRecord.class));
+    }
+
+    /**
+     * 更新
+     * @param tenantTeacherAccountRecord TenantTeacherAccountRecordWrapper.TenantTeacherAccountRecord
+     * @return Boolean
+     */
+    @Override
+    public Boolean update(TenantTeacherAccountRecordWrapper.TenantTeacherAccountRecord tenantTeacherAccountRecord){
+
+        return this.updateById(JSON.parseObject(tenantTeacherAccountRecord.jsonString(), TenantTeacherAccountRecord.class));       
+    }
+}

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

@@ -1003,7 +1003,7 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
                 if (Objects.isNull(teacher)) {
                     throw new BizException("老师信息不存在");
                 }
-                if (teacher.getTenantId() != null && teacher.getTenantId() > 0 && ESettlementFrom.TENANT.equals(teacher.getSettlementFrom())) {
+                if (teacher.getTenantId() != null && teacher.getTenantId() > 0) {
                     resp.setPaymentVersion(EPaymentVersion.V2);
                 }
                 break;
@@ -1017,7 +1017,7 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
                 if (Objects.isNull(teacher)) {
                     throw new BizException("老师信息不存在");
                 }
-                if (teacher.getTenantId() != null && teacher.getTenantId() > 0 && ESettlementFrom.TENANT.equals(teacher.getSettlementFrom())) {
+                if (teacher.getTenantId() != null && teacher.getTenantId() > 0) {
                     resp.setPaymentVersion(EPaymentVersion.V2);
                 }
                 break;
@@ -1027,7 +1027,7 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
                 if (Objects.isNull(teacher)) {
                     throw new BizException("老师信息不存在");
                 }
-                if (teacher.getTenantId() != null && teacher.getTenantId() > 0 && ESettlementFrom.TENANT.equals(teacher.getSettlementFrom())) {
+                if (teacher.getTenantId() != null && teacher.getTenantId() > 0) {
                     resp.setPaymentVersion(EPaymentVersion.V2);
                 }
                 break;
@@ -1044,7 +1044,7 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
                 if (Objects.isNull(teacher)) {
                     throw new BizException("老师信息不存在");
                 }
-                if (teacher.getTenantId() != null && teacher.getTenantId() > 0 && ESettlementFrom.TENANT.equals(teacher.getSettlementFrom())) {
+                if (teacher.getTenantId() != null && teacher.getTenantId() > 0 ) {
                     resp.setPaymentVersion(EPaymentVersion.V2);
                 }
                 break;
@@ -1060,7 +1060,7 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
                 throw new BizException("推荐人信息不存在");
             }
             if (!payTypeReq.getClientType().equals(ClientEnum.TEACHER)) {
-                if (teacher.getTenantId() != null && teacher.getTenantId() > 0 && ESettlementFrom.TENANT.equals(teacher.getSettlementFrom())) {
+                if (teacher.getTenantId() != null && teacher.getTenantId() > 0) {
                     resp.setPaymentVersion(EPaymentVersion.V2);
                 }
             }

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

@@ -10,6 +10,7 @@ import com.yonge.cooleshow.biz.dal.dao.StudentDao;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicSheetSearch;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.SubjectTypeEnum;
 import com.yonge.cooleshow.biz.dal.mapper.TenantAlbumMapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantAlbumPurchaseMapper;
@@ -21,6 +22,7 @@ import com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumWrapper;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.mybatis.support.PageUtil;
+import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import com.yonge.toolset.utils.obj.ObjectUtil;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -33,6 +35,7 @@ import com.yonge.cooleshow.biz.dal.mapper.UserTenantAlbumRecordMapper;
 
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -84,12 +87,15 @@ public class UserTenantAlbumRecordServiceImpl extends ServiceImpl<UserTenantAlbu
     @Autowired
     private TenantAlbumMapper tenantAlbumMapper;
 
-	/**
+    @Autowired
+    private SysMessageService sysMessageService;
+
+    /**
      * 查询详情
      * @param id 详情ID
      * @return UserTenantAlbumRecord
      */
-	@Override
+    @Override
     public UserTenantAlbumRecord detail(Long id) {
         
         return baseMapper.selectById(id);
@@ -185,15 +191,15 @@ public class UserTenantAlbumRecordServiceImpl extends ServiceImpl<UserTenantAlbu
         }
         return page.setRecords(list);
     }
-	
+
     /**
      * 添加
      * @param userTenantAlbumRecord UserTenantAlbumRecordWrapper.UserTenantAlbumRecord
      * @return Boolean
      */
     @Override
-    public Boolean add(UserTenantAlbumRecordWrapper.UserTenantAlbumRecord userTenantAlbumRecord) {    	
-        
+    public Boolean add(UserTenantAlbumRecordWrapper.UserTenantAlbumRecord userTenantAlbumRecord) {
+
         return this.save(JSON.parseObject(userTenantAlbumRecord.jsonString(), UserTenantAlbumRecord.class));
     }
 
@@ -414,4 +420,65 @@ public class UserTenantAlbumRecordServiceImpl extends ServiceImpl<UserTenantAlbu
         album.setSalePrice(salePrice);
         return album;
     }
+
+    @Override
+    public void sendTenantAlbumMessage() {
+        List<UserTenantAlbumRecordWrapper.UserTenantAlbumRecord> userTenantAlbumRecords = baseMapper.selectTemporaryRecord();
+        if (CollectionUtils.isEmpty(userTenantAlbumRecords)) {
+            return;
+        }
+        //标识
+        Map<Long, Long> temporaryFlagMap = new HashMap<>();
+        for (UserTenantAlbumRecordWrapper.UserTenantAlbumRecord record : userTenantAlbumRecords) {
+            if (null != temporaryFlagMap.get(record.getUserId())) {
+                continue;
+            }
+            temporaryFlagMap.put(record.getUserId(), record.getUserId());
+            //发送消息
+            CompletableFuture.runAsync(() -> temporarySend(record.getUserId(), record.getPhone(),record.getClientType(),record.getTenantAlbumId()));
+            UserTenantAlbumRecord userTenantAlbumRecord = new UserTenantAlbumRecord();
+            userTenantAlbumRecord.setMsgStatus(true);
+            userTenantAlbumRecord.setUpdateTime(new Date());
+            userTenantAlbumRecord.setId(record.getId());
+
+            baseMapper.updateById(userTenantAlbumRecord);
+        }
+    }
+
+    @Override
+    public UserTenantAlbumRecord getNewestByTenantAlbumId(Long tenantAlbumId, Long userId, ClientEnum client) {
+
+        return this.lambdaQuery()
+                .eq(UserTenantAlbumRecord::getTenantAlbumId, tenantAlbumId)
+                .eq(UserTenantAlbumRecord::getUserId, userId)
+                .eq(UserTenantAlbumRecord::getClientType, client)
+                .ge(UserTenantAlbumRecord::getEndTime, new Date())
+                .orderByDesc(UserTenantAlbumRecord::getEndTime)
+                .last("limit 1")
+                .one();
+    }
+
+
+    private void temporarySend(Long userId, String phone, ClientEnum clientType, Long tenantAlbumId) {
+
+        SysUser sysUser = sysUserFeignService.queryUserById(userId);
+        if (null == sysUser) {
+            return;
+        }
+        TenantAlbum tenantAlbum = tenantAlbumService.getById(tenantAlbumId);
+        if (tenantAlbum == null) {
+            return;
+        }
+
+        Map<Long, String> receivers = new HashMap<>();
+        receivers.put(userId, phone);
+
+        try {
+            String url = sysMessageService.selectConfigUrl(MessageTypeEnum.TENANT_ALBUM_EXPIRE.getCode());
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TENANT_ALBUM_EXPIRE,
+                    receivers, null, 0, url, ClientEnum.TENANT_STUDENT.getCode(),tenantAlbum.getName());
+        } catch (Exception e) {
+            log.error("机构学生训练教材过期", e);
+        }
+    }
 }

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

@@ -342,15 +342,10 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
 
         orderGoodsInfo.setUserOrderDetail(userOrderDetail);
 
-
+        userOrderDetail.setAccountConfig(teacherService.teacherSettlementFrom(lessonGroup.getTeacherId(),orderGoodsInfo.getRecomUserId()).jsonString());
         // 设置金额入账去向
-        UserPaymentOrderWrapper.AccountTenantTo accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
-        if (orderGoodsInfo.getRecomUserId() !=null) {
-            accountTenantTo.setShareTenant(teacherService.teacherSettlementFrom(orderGoodsInfo.getRecomUserId()));
-        }
-        accountTenantTo.setIncomeTenant(teacherService.teacherSettlementFrom(lessonGroup.getTeacherId()));
         // 存入缓存
-        redisCacheService.saveUserAccountConfig(orderGoodsInfo.getSubOrderNo(), accountTenantTo.jsonString());
+//        redisCacheService.saveUserAccountConfig(orderGoodsInfo.getSubOrderNo(), teacherService.teacherSettlementFrom(lessonGroup.getTeacherId(),orderGoodsInfo.getRecomUserId()).jsonString());
 
     }
 

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

@@ -6,6 +6,7 @@ import com.yonge.cooleshow.biz.dal.dao.MemberPriceSettingsDao;
 import com.yonge.cooleshow.biz.dal.dto.search.VipRecordSearch;
 import com.yonge.cooleshow.biz.dal.entity.ActivityReward;
 import com.yonge.cooleshow.biz.dal.entity.MemberPriceSettings;
+import com.yonge.cooleshow.biz.dal.entity.Student;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.PeriodEnum;
@@ -25,6 +26,7 @@ import com.yonge.cooleshow.biz.dal.dto.search.VipCardRecordSearch;
 import com.yonge.cooleshow.biz.dal.dao.VipCardRecordDao;
 
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
 
 
 @Service
@@ -184,7 +186,9 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
             }
             temporaryFlagMap.put(record.getUserId(), record.getUserId());
             //发送消息
-            temporary3DaysSend(record.getUserId(), record.getPhone());
+            CompletableFuture.runAsync(() -> {
+                temporary3DaysSend(record.getUserId(), record.getPhone(),record.getClientType());
+            });
             record.setMsgStatus(1);
             record.setUpdateTime(new Date());
 
@@ -203,7 +207,10 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
             }
             expireFlagMap.put(record.getUserId(), record.getUserId());
             //发送消息
-            expireSend(record.getUserId(), record.getPhone(),record.getClientType());
+            //发送消息
+            CompletableFuture.runAsync(() -> {
+                expireSend(record.getUserId(), record.getPhone(), record.getClientType());
+            });
             record.setMsgStatus(2);
             record.setUpdateTime(new Date());
 
@@ -222,23 +229,27 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
     }
 
     // 发送会员到期3天消息推送
-    private void temporary3DaysSend(Long userId, String phone) {
+    private void temporary3DaysSend(Long userId, String phone, ClientEnum clientType) {
         Map<Long, String> receivers = new HashMap<>();
         receivers.put(userId, phone);
-        try {
-            String url = sysMessageService.selectConfigUrl(MessageTypeEnum.VIP_EXPIRE_THIRTY_DAY.getCode());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.VIP_EXPIRE_THIRTY_DAY,
-                    receivers, null, 0, url, ClientEnum.STUDENT.getCode());
-        } catch (Exception e) {
-            log.error("会员到期3天极光消息推送异常,userId={}", userId);
-        }
+        // 判断是否是机构学生 机构学生推送走另一个
+        if (clientType.equals(ClientEnum.STUDENT)) {
+        } else {
+            try {
+                String url = sysMessageService.selectConfigUrl(MessageTypeEnum.VIP_EXPIRE_THIRTY_DAY.getCode());
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.VIP_EXPIRE_THIRTY_DAY,
+                        receivers, null, 0, url, ClientEnum.STUDENT.getCode());
+            } catch (Exception e) {
+                log.error("会员到期3天极光消息推送异常,userId={}", userId);
+            }
 
-        try {
-            String url = sysMessageService.selectConfigUrl(MessageTypeEnum.SMS_VIP_EXPIRE_THIRTY_DAY.getCode());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_VIP_EXPIRE_THIRTY_DAY,
-                    receivers, null, 0, null, ClientEnum.STUDENT.getCode(), url);
-        } catch (Exception e) {
-            log.error("会员到期3天短信消息推送异常,userId={}", userId);
+            try {
+                String url = sysMessageService.selectConfigUrl(MessageTypeEnum.SMS_VIP_EXPIRE_THIRTY_DAY.getCode());
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_VIP_EXPIRE_THIRTY_DAY,
+                        receivers, null, 0, null, ClientEnum.STUDENT.getCode(), url);
+            } catch (Exception e) {
+                log.error("会员到期3天短信消息推送异常,userId={}", userId);
+            }
         }
     }
 
@@ -246,20 +257,31 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
     private void expireSend(Long userId, String phone,ClientEnum userType) {
         Map<Long, String> receivers = new HashMap<>();
         receivers.put(userId, phone);
-        try {
-            String url = sysMessageService.selectConfigUrl(MessageTypeEnum.VIP_EXPIRE.getCode());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.VIP_EXPIRE,
-                    receivers, null, 0, url, userType.getCode());
-        } catch (Exception e) {
-            log.error("会员到期3天极光消息推送异常,userId={}", userId);
-        }
+        Student student = studentService.getById(userId);
+        if (userType.equals(ClientEnum.STUDENT) && student != null  && student.getTenantId() != null && student.getTenantId() >0) {
+            try {
+                String url = sysMessageService.selectConfigUrl(MessageTypeEnum.TENANT_VIP_EXPIRE.getCode());
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TENANT_VIP_EXPIRE,
+                        receivers, null, 0, url, ClientEnum.TENANT_STUDENT.getCode());
+            } catch (Exception e) {
+                log.error("会员到期极光消息推送异常,userId={}", userId);
+            }
+        } else {
+            try {
+                String url = sysMessageService.selectConfigUrl(MessageTypeEnum.VIP_EXPIRE.getCode());
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.VIP_EXPIRE,
+                        receivers, null, 0, url, userType.getCode());
+            } catch (Exception e) {
+                log.error("会员到期3天极光消息推送异常,userId={}", userId);
+            }
 
-        try {
-            String url = sysMessageService.selectConfigUrl(MessageTypeEnum.SMS_VIP_EXPIRE.getCode());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_VIP_EXPIRE,
-                    receivers, null, 0, null, userType.getCode(), url);
-        } catch (Exception e) {
-            log.error("会员到期3天短信消息推送异常,userId={}", userId);
+            try {
+                String url = sysMessageService.selectConfigUrl(MessageTypeEnum.SMS_VIP_EXPIRE.getCode());
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_VIP_EXPIRE,
+                        receivers, null, 0, null, userType.getCode(), url);
+            } catch (Exception e) {
+                log.error("会员到期3天短信消息推送异常,userId={}", userId);
+            }
         }
     }
 }

+ 4 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/StudentVo.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.vo;
 
+import com.alibaba.excel.annotation.ExcelProperty;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -72,6 +73,9 @@ public class StudentVo extends Student {
     @ApiModelProperty(value = "imToken")
     private String imToken;
 
+    @ApiModelProperty(value = "小组")
+    private String tenantGroupName;
+
 
     private String imUserId;
 

+ 3 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherVo.java

@@ -96,6 +96,9 @@ public class TeacherVo extends Teacher {
     @ApiModelProperty("曲谱数量")
     private Integer musicSheetCount;
 
+    @ApiModelProperty("曲谱名称")
+    private String musicSheetName;
+
 
     public YesOrNoEnum getDelFlag() {
         return delFlag;

+ 30 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/OssFileWrapper.java

@@ -0,0 +1,30 @@
+package com.yonge.cooleshow.biz.dal.wrapper;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * OSS 文件模型
+ */
+@ApiModel(value = "OssFileWrapper对象", description = "文件通用模型")
+public class OssFileWrapper {
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel("导出文件的模型")
+    public static class ExportFile {
+
+        @ApiModelProperty("文件名称")
+        private String fileName;
+
+        @ApiModelProperty("下载地址")
+        private String downloadPath;
+    }
+}

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

@@ -1,5 +1,6 @@
 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 com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
@@ -124,6 +125,26 @@ public class PaymentDivMemberRecordWrapper {
     }
 
     @Data
+    @ApiModel("首页收入明细导出")
+    public static class IndexIncomeExportDto{
+
+        @ExcelProperty("用户名称")
+        private String name;
+
+        @ExcelProperty("手机号")
+        private String phone;
+
+        @ExcelProperty("收入")
+        private BigDecimal amount;
+
+        @ExcelProperty("订单时间")
+        private String payTime;
+
+        @ExcelProperty("订单类型")
+        private String orderType;
+    }
+
+    @Data
     @ApiModel("首页收入、支出汇总")
     public static class IndexIncomeSummaryDto{
 

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

@@ -181,6 +181,22 @@ public class StudentWrapper {
     }
 
     @Data
+    public static class ExportStudentTemplate {
+
+        @ExcelProperty(value = "姓名")
+        private String userName;
+
+        @ExcelProperty(value = "手机号")
+        private String phone;
+
+        @ExcelProperty(value = "声部")
+        private String subjectName;
+
+        @ExcelProperty(value = "小组")
+        private String tenantGroupName;
+    }
+
+    @Data
     @ApiModel("学生修改机构")
     public static class StudentUpdateTenant {
 

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

@@ -46,6 +46,9 @@ public class TenantActivationCodeWrapper {
         @ApiModelProperty("机构ID")
         private Long tenantId;
 
+        @ApiModelProperty("机构小组ID")
+        private Long tenantGroupId;
+
         @ApiModelProperty("声部ID")
         private String subjectId;
 

+ 7 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantMemberWrapper.java

@@ -2,6 +2,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 com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
 import com.yonge.cooleshow.common.enums.EPayerType;
@@ -52,6 +53,11 @@ public class TenantMemberWrapper {
         @ApiModelProperty("公司名称")
         private String name;
 
+        @ApiModelProperty("类型")
+        private EPayerType payerType;
+
+        @ApiModelProperty("状态")
+        private AuthStatusEnum status;
 
 
         public String jsonString() {
@@ -235,7 +241,7 @@ public class TenantMemberWrapper {
         private String requestNo;
 
         @ApiModelProperty("商户号")
-        @NotNull(message = "商户号不能为空")
+//        @NotNull(message = "商户号不能为空")
         private String memberId;
 
         @ApiModelProperty("公司名称")

+ 63 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantTeacherAccountRecordWrapper.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-10-09 17:39:42
+ */
+@ApiModel(value = "TenantTeacherAccountRecordWrapper对象", description = "机构老师流水表查询对象")
+public class TenantTeacherAccountRecordWrapper {
+
+    @Data
+	@Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" TenantTeacherAccountRecordQuery-机构老师流水表")
+    public static class TenantTeacherAccountRecordQuery 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 TenantTeacherAccountRecordQuery from(String json) {
+            return JSON.parseObject(json, TenantTeacherAccountRecordQuery.class);
+        }
+    }  
+
+	@ApiModel(" TenantTeacherAccountRecord-机构老师流水表")
+    public static class TenantTeacherAccountRecord {
+        
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static TenantTeacherAccountRecord from(String json) {
+            return JSON.parseObject(json, TenantTeacherAccountRecord.class);
+        }
+	}
+
+}

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

@@ -911,13 +911,18 @@ public class UserPaymentOrderWrapper {
     @ApiModel("AccountTo-订单金额接收方")
     public static class AccountTenantTo implements Serializable {
 
-        @ApiModelProperty("收入机构  -1 默认老师自己 0不分润")
+        @ApiModelProperty("收入机构  -1 默认平台 0不分润")
         private Long incomeTenant = -1L;
 
+        @ApiModelProperty("是否到老师")
+        private boolean incomeTeacher = false;
 
-        @ApiModelProperty("分享机构  -1 默认老师自己 0不分润")
+
+        @ApiModelProperty("分享机构  -1 默认平台 0不分润")
         private Long shareTenant = -1L;
 
+        @ApiModelProperty("是否到老师")
+        private boolean shareTeacher = false;
 
         public String jsonString() {
             return JSON.toJSONString(this);

+ 50 - 8
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/UserTenantAlbumRecordWrapper.java

@@ -1,9 +1,16 @@
 package com.yonge.cooleshow.biz.dal.wrapper;
 
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
 import java.util.Optional;
 
 import lombok.AllArgsConstructor;
@@ -52,19 +59,54 @@ public class UserTenantAlbumRecordWrapper {
         }
     }  
 
+    @Data
 	@ApiModel(" UserTenantAlbumRecord-购买训练工具记录")
     public static class UserTenantAlbumRecord {
-        @ApiModelProperty("专辑名称")
-        private String albumName;
 
-        @ApiModelProperty("专辑介绍")
-        private String describe;
+        @ApiModelProperty("记录id")
+        private Long id;
+
+        @ApiModelProperty("用户id")
+        private Long userId;
+
+        @ApiModelProperty("手机号")
+        private String phone;
+
+        @ApiModelProperty("机构ID")
+        private Long tenantId;
+
+        @ApiModelProperty("机构专辑ID")
+        private Long tenantAlbumId;
+
+        @ApiModelProperty("订单号")
+        private String orderNo;
+
+        @ApiModelProperty("ORDER:订单")
+        private SourceTypeEnum sourceType;
+
+        @ApiModelProperty("购买人员类型 TEACHRE :老师端 STUDNET : 学生端")
+        private ClientEnum clientType;
+
+        @ApiModelProperty("订单详情号")
+        private String subOrderNo;
+
+        @ApiModelProperty("开始时间")
+        private Date startTime;
+
+        @ApiModelProperty("结束时间")
+        private Date endTime;
+
+        @ApiModelProperty("时间类型 DAY:天 MONTH:月,YEAR:年")
+        private String type;
+
+        @ApiModelProperty("添加时间数量")
+        private Integer times;
 
-        @ApiModelProperty("机构名称")
-        private String tenantName;
+        @ApiModelProperty("消息发送 0、未发送 1、已发送提前3天消息 2、已发送会员过期消息 暂时不用")
+        private Boolean msgStatus;
 
-        @ApiModelProperty("专辑封面")
-        private String coverImg;
+        @ApiModelProperty("备注")
+        private String reason;
 
         public String jsonString() {
             return JSON.toJSONString(this);

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

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.wrapper.teacher;
 
+import com.alibaba.excel.annotation.ExcelProperty;
 import com.alibaba.fastjson.JSON;
 import com.yonge.cooleshow.common.enums.ESettlementFrom;
 import io.swagger.annotations.ApiModel;
@@ -123,4 +124,38 @@ public class TeacherWrapper {
         @NotNull
         private Long tenantId;
     }
+
+    @Data
+    public static class ExportTeacherTemplate {
+
+        @ExcelProperty(value = "姓名")
+        private String userName;
+
+        @ExcelProperty(value = "手机号")
+        private String phone;
+
+        @ExcelProperty(value = "曲谱")
+        private String musicSheet;
+
+        @ExcelProperty(value = "声部")
+        private String subjectName;
+
+        @ExcelProperty(value = "结算方式")
+        private String settlementFrom;
+
+    }
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel("导出数据")
+    public static class ExportFile {
+
+        @ApiModelProperty("文件名称")
+        private String fileName;
+
+        @ApiModelProperty("下载地址")
+        private String downloadPath;
+    }
 }

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

@@ -158,8 +158,8 @@
 	<select id="queryCanAccountByBizType"
 			resultType="com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord">
 		select t.* from platform_cash_account_record t
-        left join tenant_account_record tar on tar.platform_cash_account_record_id_ = t.id_
-		where t.post_status_ = 'WAIT' and t.account_period_time_ &lt; now() and tar.id_ is null
+<!--        left join tenant_account_record tar on tar.platform_cash_account_record_id_ = t.id_-->
+		where t.post_status_ = 'WAIT' and t.account_period_time_ &lt; now() and t.source_type_ is null
 		and t.biz_type_ IN
 		<foreach collection="bizTypes" item="item" open="(" separator="," close=")">
 			#{item}

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

@@ -175,6 +175,9 @@
                     #{item}
                 </foreach>
             </if>
+            <if test="param.tenantGroupId != null">
+                and t.tenant_group_id_ = #{param.tenantGroupId}
+            </if>
         </where>
         <choose>
             <when test="param.orderBy != null and param.orderBy.trim() != ''">

+ 61 - 10
cooleshow-user/user-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml

@@ -380,28 +380,79 @@
 			AND st.tenant_id_ = #{tenantId}
 		</if>
 		group by st.user_id_
+		<trim prefix="HAVING" suffixOverrides="AND" >
+			<if test="minTrainTimes != null">
+				trainTimes &gt;= #{minTrainTimes} AND
+			</if>
+			<if test="maxTrainTimes != null">
+				trainTimes &lt;= #{maxTrainTimes} AND
+			</if>
+			<if test="minTrainDays != null">
+				trainDays &gt;= #{minTrainDays} AND
+			</if>
+			<if test="maxTrainDays != null">
+				trainDays &lt;= #{maxTrainDays} AND
+			</if>
+			<if test="minAvgTrainTimes != null">
+				avgTrainTimes &gt;= #{minAvgTrainTimes} AND
+			</if>
+			<if test="maxAvgTrainTimes != null">
+				avgTrainTimes &lt;= #{maxAvgTrainTimes} AND
+			</if>
+		</trim>
 		ORDER BY ${sortField} ${sortType}
 		<include refid="global.limit"/>
 	</select>
 	<select id="countWeChatStudentTrainData" resultType="java.lang.Integer">
-		select COUNT(DISTINCT st.user_id_)
+		select COUNT(st.user_id_)
 		from student st
-		left join sys_user su ON st.user_id_ = su.id_
-		LEFT JOIN sys_music_compare_record smcr ON smcr.user_id_ = st.user_id_
+		left join
+		(select smcr.user_id_,
+		DATE_FORMAT(smcr.create_time_, '%Y-%m-%d') create_time_,
+		SUM(smcr.play_time_)                       playTime
+		from sys_music_compare_record smcr
 		<where>
-			<if test="clientId != null and clientId!= ''">
-				AND smcr.client_id_ = #{clientId}
+			<if test="startTime != null and startTime != ''">
+				AND smcr.create_time_ BETWEEN #{startTime} AND #{endTime}
 			</if>
 			<if test="tenantId != null">
 				AND smcr.tenant_id_ = #{tenantId}
 			</if>
-			<if test="startTime != null and startTime != ''">
-				AND smcr.create_time_ BETWEEN #{startTime} AND #{endTime}
-			</if>
-			<if test="search != null and search != ''">
-				AND su.username_ LIKE CONCAT('%',#{keyword},'%')
+			<if test="clientId != null and clientId!= ''">
+				AND smcr.client_id_ = #{clientId}
 			</if>
 		</where>
+		group by smcr.user_id_, DATE_FORMAT(create_time_, '%Y-%m-%d')) mprs ON mprs.user_id_ = st.user_id_
+		left join sys_user su ON st.user_id_ = su.id_
+		left join subject sb ON sb.id_ = st.subject_id_
+		where mprs.user_id_ = st.user_id_
+		<if test="search != null and search != ''">
+			AND su.username_ LIKE CONCAT('%',#{keyword},'%')
+		</if>
+		<if test="tenantId != null">
+			AND st.tenant_id_ = #{tenantId}
+		</if>
+		group by st.user_id_
+		<trim prefix="HAVING" suffixOverrides="AND" >
+			<if test="minTrainTimes != null">
+				trainTimes &gt;= #{minTrainTimes} AND
+			</if>
+			<if test="maxTrainTimes != null">
+				trainTimes &lt;= #{maxTrainTimes} AND
+			</if>
+			<if test="minTrainDays != null">
+				trainDays &gt;= #{minTrainDays} AND
+			</if>
+			<if test="maxTrainDays != null">
+				trainDays &lt;= #{maxTrainDays} AND
+			</if>
+			<if test="minAvgTrainTimes != null">
+				avgTrainTimes &gt;= #{minAvgTrainTimes} AND
+			</if>
+			<if test="maxAvgTrainTimes != null">
+				avgTrainTimes &lt;= #{maxAvgTrainTimes} AND
+			</if>
+		</trim>
 	</select>
 	<select id="wechatCompareRecordSum"
 			resultType="com.yonge.cooleshow.biz.dal.queryInfo.SysMusicCompareRecordQueryInfo$WechatCompareRecordSumDto">

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

@@ -24,7 +24,7 @@
         su.avatar_ as activationUserAvatar
         FROM tenant_activation_code t
         LEFT JOIN tenant_album_purchase ta on t.tenant_album_purchase_id_ = ta.id_
-        LEFT JOIN sys_user su on t.activation_user_id_ = su.id_
+        LEFT JOIN sys_user su on t.activation_phone_ = su.phone_
         LEFT JOIN student st on su.id_ = st.user_id_
         <if test="param.orderNo != null and param.orderNo != ''">
             left join tenant_album_purchase t4 on t4.id_ = t.tenant_album_purchase_id_
@@ -61,7 +61,10 @@
                 and ${param.orderNo} = t4.order_no_
             </if>
             <if test="param.subjectId != null and param.subjectId.trim() != ''">
-                and ${param.subjectId} = su.subject_id_
+                and #{param.subjectId} = st.subject_id_
+            </if>
+            <if test="param.tenantGroupId != null">
+                and st.tenant_group_id_ = #{param.tenantGroupId}
             </if>
         </where>
         order by t.activation_status_ asc, t.id_ desc

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

@@ -48,10 +48,16 @@
         FROM tenant_member t
         <where>
             <if test="param.memberId != null and param.memberId != ''">
-                and t.member_id_ = #{param.memberId}
+                and t.member_id_ like concat('%',#{param.memberId},'%')
             </if>
             <if test="param.name != null and param.name != ''">
-                and t.name_ = #{param.name}
+                and t.name_ like concat('%',#{param.name},'%')
+            </if>
+            <if test="param.payerType != null">
+                and t.payer_type_ = #{param.payerType}
+            </if>
+            <if test="param.status != null">
+                and t.status_ = #{param.status}
             </if>
         </where>
     </select>

+ 33 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantTeacherAccountRecordMapper.xml

@@ -0,0 +1,33 @@
+<?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.TenantTeacherAccountRecordMapper">
+
+	 
+    
+    <!-- 表字段 -->
+    <sql id="baseColumns">
+         t.id_ AS id
+        , t.tenant_id_ AS tenantId
+        , t.teacher_id_ AS teacherId
+        , t.account_record_id_ AS accountRecordId
+        , t.source_type_ AS sourceType
+        , t.trans_amount_ AS transAmount
+        , t.in_or_out_ AS inOrOut
+        , t.post_status_ AS postStatus
+        , t.biz_type_ AS bizType
+        , t.biz_id_ AS bizId
+        , t.biz_name_ AS bizName
+        , t.order_no_ AS orderNo
+        , t.create_time_ AS createTime
+        , t.update_time_ AS updateTime
+        , t.err_flag_ AS errFlag
+        , t.err_msg_ AS errMsg
+        </sql> 
+    
+    <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.entity.TenantTeacherAccountRecord">
+		SELECT         
+        	<include refid="baseColumns" />
+		FROM tenant_teacher_account_record t
+	</select>
+    
+</mapper>

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

@@ -42,6 +42,7 @@
         , t.good_price_ as goodPrice
         , t.plantform_fee_ as plantformFee
         , t.plantform_fee_rate_ as plantformFeeRate
+        , t.account_config_ as accountConfig
         , t.create_time_ as createTime
         , t.update_time_ as updateTime
         </sql>

+ 13 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserTenantAlbumRecordMapper.xml

@@ -75,4 +75,17 @@
 
     </select>
 
+    <select id="selectTemporaryRecord" resultType="com.yonge.cooleshow.biz.dal.wrapper.UserTenantAlbumRecordWrapper$UserTenantAlbumRecord">
+        select
+        <include refid="baseColumns"/>,
+        u.phone_ as phone
+        from (
+        select max(id_) as id_ from user_tenant_album_record group by user_id_
+        ) a
+        left join user_tenant_album_record t on a.id_ = t.id_
+        left join sys_user u on t.user_id_ = u.id_
+        where t.end_time_ &lt;= now()
+        and (msg_status_ = 0 or msg_status_ is null)
+        order by end_time_ desc
+    </select>
 </mapper>

+ 1 - 0
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/open/OpenClient.java

@@ -7,6 +7,7 @@ import com.yonge.cooleshow.biz.dal.dto.MusicImgDto;
 import com.yonge.cooleshow.biz.dal.dto.search.MemberPriceSettingsSearch;
 import com.yonge.cooleshow.biz.dal.entity.Student;
 import com.yonge.cooleshow.biz.dal.entity.SysConfig;
+import com.yonge.cooleshow.biz.dal.entity.TenantStaff;
 import com.yonge.cooleshow.biz.dal.service.ActivityPlanService;
 import com.yonge.cooleshow.biz.dal.service.AppVersionInfoService;
 import com.yonge.cooleshow.biz.dal.service.LiveRoomService;

+ 43 - 4
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/StudentController.java

@@ -6,18 +6,23 @@ import com.google.common.collect.ImmutableList;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.TeacherSearch;
 import com.yonge.cooleshow.biz.dal.entity.Student;
 import com.yonge.cooleshow.biz.dal.entity.Teacher;
 import com.yonge.cooleshow.biz.dal.entity.TenantActivationCode;
 import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.service.ImUserFriendService;
+import com.yonge.cooleshow.biz.dal.service.OssFileService;
 import com.yonge.cooleshow.biz.dal.service.StudentService;
 import com.yonge.cooleshow.biz.dal.service.TeacherService;
 import com.yonge.cooleshow.biz.dal.service.TenantActivationCodeService;
 import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
 import com.yonge.cooleshow.biz.dal.vo.StudentVo;
+import com.yonge.cooleshow.biz.dal.vo.TeacherVo;
+import com.yonge.cooleshow.biz.dal.wrapper.OssFileWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.StudentWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.teacher.TeacherWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.BizHttpStatus;
@@ -48,7 +53,9 @@ import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -63,18 +70,17 @@ public class StudentController extends BaseController {
 
     @Autowired
     private StudentService studentService;
-    @Autowired
-    private TeacherService teacherService;
     @Resource
     private SysUserFeignService sysUserFeignService;
     @Autowired
-    private ImUserFriendService imUserFriendService;
-    @Autowired
     private TenantInfoService tenantInfoService;
 
     @Autowired
     private TenantActivationCodeService tenantActivationCodeService;
 
+    @Autowired
+    private OssFileService ossFileService;
+
     @GetMapping("/detail/{id}")
     @ApiOperation(value = "详情", notes = "传入id")
     public HttpResponseResult<StudentVo> detail(@PathVariable("id") Long id) {
@@ -131,6 +137,39 @@ public class StudentController extends BaseController {
         return succeed(PageUtil.pageInfo(pages));
     }
 
+    @GetMapping("/exportStudent")
+    @ApiOperation(value = "导出学生", notes = "传入TeacherSearch")
+    public HttpResponseResult<OssFileWrapper.ExportFile> exportTeacher(@RequestBody StudentSearch query) {
+        TenantInfo tenantInfo = getTenantInfo();
+        query.setTenantId(tenantInfo.getId());
+        query.setDelFlag(YesOrNoEnum.NO);
+        query.setLockFlag(UserLockFlag.NORMAL);
+        query.setOrderBy("u.username_ asc");
+        query.setPage(1);
+        query.setRows(9999);
+
+        IPage<StudentVo> pages = studentService.selectPage(PageUtil.getPage(query), query);
+        List<StudentVo> rows = pages.getRecords();
+
+        if (rows.isEmpty()) {
+            throw new BizException("没有可导出数据");
+        }
+
+        List<StudentWrapper.ExportStudentTemplate> templateList = rows.stream().map(next -> {
+            StudentWrapper.ExportStudentTemplate template = new StudentWrapper.ExportStudentTemplate();
+            template.setUserName(next.getUsername());
+            template.setPhone(next.getPhone());
+            template.setSubjectName(next.getSubjectName());
+            template.setTenantGroupName(next.getTenantGroupName());
+            return template;
+        }).collect(Collectors.toList());
+
+        String format = new SimpleDateFormat("yyyyMMddHHmm").format(new Date());
+        OssFileWrapper.ExportFile exportFile = ossFileService.uploadFile(templateList,
+                StudentWrapper.ExportStudentTemplate.class, format, "学生");
+        return succeed(exportFile);
+    }
+
     @PostMapping("/save")
     @ApiOperation(value = "新增/修改", notes = "传入Student")
     public HttpResponseResult<Boolean> save(

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

@@ -10,9 +10,11 @@ import com.yonge.cooleshow.biz.dal.entity.Teacher;
 import com.yonge.cooleshow.biz.dal.entity.TeacherStyleVideo;
 import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
 import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
+import com.yonge.cooleshow.biz.dal.service.OssFileService;
 import com.yonge.cooleshow.biz.dal.service.TeacherService;
 import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
 import com.yonge.cooleshow.biz.dal.vo.TeacherVo;
+import com.yonge.cooleshow.biz.dal.wrapper.OssFileWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.teacher.TeacherWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
@@ -35,6 +37,8 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import javax.validation.Valid;
+import java.text.SimpleDateFormat;
+import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -52,6 +56,9 @@ public class TeacherController extends BaseController {
     @Autowired
     private TenantInfoService tenantInfoService;
 
+    @Autowired
+    private OssFileService ossFileService;
+
     /**
      * 查询单条
      */
@@ -103,6 +110,41 @@ public class TeacherController extends BaseController {
         return succeed(PageUtil.pageInfo(pages));
     }
 
+
+    @GetMapping("/exportTeacher")
+    @ApiOperation(value = "导出老师", notes = "传入TeacherSearch")
+    public HttpResponseResult<OssFileWrapper.ExportFile> exportTeacher(@RequestBody TeacherSearch query) {
+        TenantInfo tenantInfo = getTenantInfo();
+        query.setTenantId(tenantInfo.getId());
+        query.setDelFlag(YesOrNoEnum.NO);
+        query.setLockFlag(UserLockFlag.NORMAL);
+        query.setPage(1);
+        query.setRows(9999);
+        query.setOrderBy("u.username_ asc");
+
+        IPage<TeacherVo> pages = teacherService.selectPage(PageUtil.getPage(query), query);
+        List<TeacherVo> rows = pages.getRecords();
+
+        if (rows.isEmpty()) {
+            throw new BizException("没有可导出数据");
+        }
+
+        List<TeacherWrapper.ExportTeacherTemplate> templates = rows.stream().map(next -> {
+            TeacherWrapper.ExportTeacherTemplate template = new TeacherWrapper.ExportTeacherTemplate();
+            template.setUserName(next.getUsername());
+            template.setPhone(next.getPhone());
+            template.setMusicSheet(next.getMusicSheetName());
+            template.setSubjectName(next.getSubjectName());
+            template.setSettlementFrom(next.getSettlementFrom() == null ? "" : next.getSettlementFrom().getMsg());
+            return template;
+        }).collect(Collectors.toList());
+
+        String format = new SimpleDateFormat("yyyyMMddHHmm").format(new Date());
+        OssFileWrapper.ExportFile exportFile = ossFileService.uploadFile(templates,
+                TeacherWrapper.ExportTeacherTemplate.class, format, "老师");
+        return succeed(exportFile);
+    }
+
     /**
      * 新增或修改
      */

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

@@ -16,13 +16,17 @@ import com.microsvc.toolkit.middleware.oss.impl.TencentOssPlugin;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.entity.TenantActivationCode;
+import com.yonge.cooleshow.biz.dal.entity.TenantAlbum;
 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.entity.UserOrder;
 import com.yonge.cooleshow.biz.dal.service.TenantActivationCodeService;
 import com.yonge.cooleshow.biz.dal.service.TenantAlbumPurchaseService;
+import com.yonge.cooleshow.biz.dal.service.TenantAlbumService;
 import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
 import com.yonge.cooleshow.biz.dal.service.TenantStaffService;
+import com.yonge.cooleshow.biz.dal.service.UserOrderService;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantActivationCodeWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
@@ -85,6 +89,10 @@ public class TenantActivationCodeController extends BaseController {
     private TenantStaffService tenantStaffService;
     @Autowired
     private OssPluginContext ossPluginContext;
+    @Autowired
+    private UserOrderService userOrderService;
+    @Autowired
+    private TenantAlbumService tenantAlbumService;
 
     @ApiOperation(value = "详情", notes = "机构激活码-根据详情ID查询单条, 传入id")
 //    @GetMapping("/detail/{id}")
@@ -216,7 +224,14 @@ public class TenantActivationCodeController extends BaseController {
         List<TenantActivationCodeWrapper.ExportTemplate> templates = JSONArray.parseArray(JSON.toJSONString(rows), TenantActivationCodeWrapper.ExportTemplate.class);
         templates.forEach(next->next.setActivationPhone(""));
 
-        TenantActivationCodeWrapper.ExportFile exportFile = generateExportExcelFile(templates, TenantActivationCodeWrapper.ExportTemplate.class, "激活码导出", "激活码");
+        TenantAlbumPurchase tenantAlbumPurchase = tenantAlbumPurchaseService.getById(Long.valueOf(orderNo));
+        TenantAlbum tenantAlbum = tenantAlbumService.getById(tenantAlbumPurchase.getTenantAlbumId());
+        UserOrder userOrder = userOrderService.getByOrderNo(tenantAlbumPurchase.getOrderNo());
+
+        String format = new SimpleDateFormat("yyyyMMddHHmm").format(userOrder.getCreateTime());
+
+        TenantActivationCodeWrapper.ExportFile exportFile = generateExportExcelFile(templates,
+                TenantActivationCodeWrapper.ExportTemplate.class, format + tenantAlbum.getName(), "激活码");
         return succeed(exportFile);
     }