Selaa lähdekoodia

Merge branch 'local/share_1008' into feature/1007-develop

liujc 1 vuosi sitten
vanhempi
commit
f41923f99d
33 muutettua tiedostoa jossa 1072 lisäystä ja 306 poistoa
  1. 103 35
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/TenantMemberController.java
  2. 4 1
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/open/UserPaymentClient.java
  3. 103 35
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TenantMemberController.java
  4. 14 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/PlatformCashAccountRecord.java
  5. 7 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TenantAccountRecord.java
  6. 97 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TenantTeacherAccountRecord.java
  7. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderDetail.java
  8. 27 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/TenantTeacherAccountRecordMapper.java
  9. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TeacherService.java
  10. 7 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantMemberService.java
  11. 43 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantTeacherAccountRecordService.java
  12. 2 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanServiceImpl.java
  13. 2 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  14. 4 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  15. 2 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MemberPriceSettingsServiceImpl.java
  16. 5 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  17. 224 97
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PaymentDivMemberRecordServiceImpl.java
  18. 2 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PianoRoomBuyRecordServiceImpl.java
  19. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/SysMessageServiceImpl.java
  20. 38 11
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java
  21. 8 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantAlbumServiceImpl.java
  22. 159 50
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantMemberServiceImpl.java
  23. 66 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantTeacherAccountRecordServiceImpl.java
  24. 18 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundServiceImpl.java
  25. 5 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserPaymentCoreServiceImpl.java
  26. 2 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonPurchaseRecordServiceImpl.java
  27. 9 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantMemberWrapper.java
  28. 63 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantTeacherAccountRecordWrapper.java
  29. 7 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/UserPaymentOrderWrapper.java
  30. 2 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/PlatformCashAccountRecordMapper.xml
  31. 8 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantMemberMapper.xml
  32. 33 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantTeacherAccountRecordMapper.xml
  33. 1 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderDetailMapper.xml

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

@@ -4,11 +4,16 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.microsvc.toolkit.common.response.paging.PageInfo;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
 import com.microsvc.toolkit.common.response.template.R;
+import com.microsvc.toolkit.middleware.payment.common.api.BasePaymentService;
+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.TenantMember;
 import com.yonge.cooleshow.biz.dal.service.TenantMemberService;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantMemberWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.EPayerType;
+import com.yonge.toolset.base.exception.BizException;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -23,6 +28,7 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.validation.Valid;
 import java.io.File;
@@ -46,6 +52,8 @@ public class TenantMemberController extends BaseController {
     @Autowired
     private TenantMemberService tenantMemberService;
 
+    @Autowired
+    private PaymentServiceContext paymentServiceContext;
     @ApiOperation(value = "详情", notes = "机构子账户表-根据详情ID查询单条, 传入id")
     @PreAuthorize("@pcs.hasPermissions('tenantMember/detail', {'BACKEND'})")
     @PostMapping("/detail/{id}")
@@ -69,50 +77,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));
     }
 
 
@@ -133,4 +151,54 @@ public class TenantMemberController extends BaseController {
 
         return R.from(tenantMemberService.removeById(id));
     }
+
+
+    @ApiOperation(value = "查询三方企业账户", notes = "机构子账户表-根据详情ID查询单条, 传入id")
+    @PreAuthorize("@pcs.hasPermissions('tenantMember/detail', {'BACKEND'})")
+    @PostMapping("/remoteDetail/{id}")
+    public R<PaymentMerchant.MerchantMember> remoteDetail(@PathVariable("id") Long id) {
+
+        PaymentMerchant.MerchantMember merchantMember = tenantMemberService.remoteDetail(id);
+
+        return R.from(merchantMember);
+    }
+
+
+    @ApiOperation("修改企业用户(状态是failed才能修改)")
+    @PostMapping(value = "upload")
+    @PreAuthorize("@pcs.hasPermissions('tenantMember/upload')")
+    public HttpResponseResult<String> upload(MultipartFile multipartFile) throws Exception {
+
+
+        File file = new File("/var/tmp/" + multipartFile.getOriginalFilename());
+        if (!file.getParentFile().exists()) {
+            file.getParentFile().mkdirs();
+        }
+        FileOutputStream fos = new FileOutputStream(file);
+        InputStream inputStream = multipartFile.getInputStream();
+
+        try {
+            IOUtils.copy(inputStream, fos);
+            inputStream.close();
+            fos.close();
+
+
+            PaymentMerchant.MerchantConfig merchantConfig = tenantMemberService.getMerchantConfig(EPayerType.YEEPAY.getDesc());
+
+            // 创建账户
+            BasePaymentService paymentService = paymentServiceContext.getPaymentService(EPayerType.YEEPAY.getDesc());
+            if (paymentService == null) {
+                throw new BizException("支付渠道不存在");
+            }
+
+            return succeed(paymentService.upload(merchantConfig, file));
+        } catch (Exception e) {
+            return failed(e.getMessage());
+        } finally {
+            IOUtils.closeQuietly(fos);
+            IOUtils.closeQuietly(inputStream);
+            FileUtils.deleteQuietly(file);
+        }
+
+    }
 }

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

@@ -160,6 +160,7 @@ public class UserPaymentClient {
 
     @PostMapping("/callback/adapay")
     public String callback(HttpServletRequest request) {
+        log.info("adapay 子账户回调");
         try {
             // 验签请参data
             String data = request.getParameter("data");
@@ -172,10 +173,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 +"]在系统中不存在";
             }
@@ -226,6 +228,7 @@ public class UserPaymentClient {
     @PostMapping("/callback/yeepay/{requestNo}")
     public String callback(@PathVariable("requestNo") String requestNo, HttpServletRequest request) {
 
+        log.info("yeepay 子账户回调");
         TenantMember tenantMember = tenantMemberService.getByRequestNo(requestNo);
         if(tenantMember == null){
             return "请求编号["+ requestNo +"]在系统中不存在";

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

@@ -4,8 +4,13 @@ import com.microsvc.toolkit.common.response.paging.PageInfo;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
 import com.microsvc.toolkit.common.response.template.R;
 
+import com.microsvc.toolkit.middleware.payment.common.api.BasePaymentService;
+import com.microsvc.toolkit.middleware.payment.common.api.PaymentServiceContext;
+import com.microsvc.toolkit.middleware.payment.common.api.entity.PaymentMerchant;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.EPayerType;
+import com.yonge.toolset.base.exception.BizException;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -25,6 +30,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.biz.dal.service.TenantMemberService;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantMemberWrapper;
 import com.yonge.cooleshow.biz.dal.entity.TenantMember;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.validation.Valid;
 import java.io.File;
@@ -48,6 +54,8 @@ public class TenantMemberController extends BaseController {
     @Autowired
     private TenantMemberService tenantMemberService;
 
+    @Autowired
+    private PaymentServiceContext paymentServiceContext;
     @ApiOperation(value = "详情", notes = "机构子账户表-根据详情ID查询单条, 传入id")
     @PreAuthorize("@pcs.hasPermissions('tenantMember/detail', {'BACKEND'})")
     @PostMapping("/detail/{id}")
@@ -71,50 +79,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));
     }
 
 
@@ -135,4 +153,54 @@ public class TenantMemberController extends BaseController {
 
         return R.from(tenantMemberService.removeById(id));
     }
+
+
+    @ApiOperation(value = "查询三方企业账户", notes = "机构子账户表-根据详情ID查询单条, 传入id")
+    @PreAuthorize("@pcs.hasPermissions('tenantMember/remoteDetail', {'BACKEND'})")
+    @PostMapping("/remoteDetail/{id}")
+    public R<PaymentMerchant.MerchantMember> remoteDetail(@PathVariable("id") Long id) {
+
+        PaymentMerchant.MerchantMember merchantMember = tenantMemberService.remoteDetail(id);
+
+        return R.from(merchantMember);
+    }
+
+
+    @ApiOperation("修改企业用户(状态是failed才能修改)")
+    @PostMapping(value = "upload")
+    @PreAuthorize("@pcs.hasPermissions('tenantMember/upload')")
+    public HttpResponseResult<String> upload(MultipartFile multipartFile) throws Exception {
+
+
+        File file = new File("/var/tmp/" + multipartFile.getOriginalFilename());
+        if (!file.getParentFile().exists()) {
+            file.getParentFile().mkdirs();
+        }
+        FileOutputStream fos = new FileOutputStream(file);
+        InputStream inputStream = multipartFile.getInputStream();
+
+        try {
+            IOUtils.copy(inputStream, fos);
+            inputStream.close();
+            fos.close();
+
+
+            PaymentMerchant.MerchantConfig merchantConfig = tenantMemberService.getMerchantConfig(EPayerType.YEEPAY.getDesc());
+
+            // 创建账户
+            BasePaymentService paymentService = paymentServiceContext.getPaymentService(EPayerType.YEEPAY.getDesc());
+            if (paymentService == null) {
+                throw new BizException("支付渠道不存在");
+            }
+
+            return succeed(paymentService.upload(merchantConfig, file));
+        } catch (Exception e) {
+            return failed(e.getMessage());
+        } finally {
+            IOUtils.closeQuietly(fos);
+            IOUtils.closeQuietly(inputStream);
+            FileUtils.deleteQuietly(file);
+        }
+
+    }
 }

+ 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;
     }

+ 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")

+ 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);
+	
+}

+ 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);
 }

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

@@ -4,6 +4,7 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.microsvc.toolkit.middleware.payment.common.api.entity.PaymentMerchant;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantMemberWrapper;
 import com.yonge.cooleshow.biz.dal.entity.TenantMember;
 import com.yonge.cooleshow.common.enums.EPayerType;
@@ -42,6 +43,8 @@ public interface TenantMemberService extends IService<TenantMember>  {
      */
     Boolean add(TenantMemberWrapper.InsertOrUpdateTenantMember tenantMember);
 
+    PaymentMerchant.MerchantConfig getMerchantConfig(String paymentVerdor);
+
     /**
      * 更新
      * @param tenantMember TenantMemberWrapper.TenantMember
@@ -59,4 +62,8 @@ public interface TenantMemberService extends IService<TenantMember>  {
     TenantMember getByMemberId(String memberId, EPayerType payerType);
 
     TenantMember getByRequestNo(String requestNo);
+
+    TenantMember getByAppIdAndTenantId(String appId, Long tenantId, EPayerType payerType);
+
+    PaymentMerchant.MerchantMember remoteDetail(Long id);
 }

+ 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);
+     
+}

+ 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;
             }

+ 2 - 5
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());
 
     }
 

+ 5 - 7
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());
@@ -1722,18 +1722,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());
 
     }
 

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

@@ -6,8 +6,13 @@ 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.microsvc.toolkit.middleware.payment.common.api.enums.PaymentStatus;
 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 +59,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 +143,9 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
     @Autowired
     private StudentService studentService;
 
+    @Autowired
+    private TenantTeacherAccountRecordService tenantTeacherAccountRecordService;
+
 
     /**
      * 查询详情
@@ -246,7 +254,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 +305,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,13 +319,11 @@ 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 老师设置了不分润
-                if (accountTenantTo.getIncomeTenant() != null && accountTenantTo.getIncomeTenant() == 0) {
-
-                } else if (accountTenantTo.getIncomeTenant() != null && accountTenantTo.getIncomeTenant() >0) {
+                if (accountTenantTo.getIncomeTenant() != null && accountTenantTo.getIncomeTenant() >0) {
                     // 分润给机构
                     tenantdivMap.merge(accountTenantTo.getIncomeTenant(), teacherAmount, BigDecimal::add);
                     tenantdivMap.merge(-1L, teacherAmount, BigDecimal::subtract);
@@ -431,7 +437,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();
@@ -442,9 +448,7 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
             // 老师收入总金额
             BigDecimal teacherAmount = teacherSalaryList.stream().map(CourseScheduleTeacherSalary::getActualSalary).reduce(BigDecimal.ZERO, BigDecimal::add);
             // 判断分润给机构 还是给老师
-            if (accountTenantTo.getIncomeTenant() != null && accountTenantTo.getIncomeTenant() == 0) {
-
-            } else if (accountTenantTo.getIncomeTenant() != null && accountTenantTo.getIncomeTenant() > 0) {
+           if (accountTenantTo.getIncomeTenant() != null && accountTenantTo.getIncomeTenant() > 0) {
                 // 分润给机构
                 tenantdivMap.merge( accountTenantTo.getIncomeTenant() , teacherAmount, BigDecimal::add);
                 tenantdivMap.merge(-1L, teacherAmount, BigDecimal::subtract);
@@ -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();
@@ -578,9 +582,7 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
             // 老师收入总金额
             BigDecimal teacherAmount = teacherSalaryList.stream().map(CourseScheduleTeacherSalary::getActualSalary).reduce(BigDecimal.ZERO, BigDecimal::add);
             // 判断分润给机构 还是给老师
-            if (accountTenantTo.getIncomeTenant() != null && accountTenantTo.getIncomeTenant() == 0) {
-
-            } else if (accountTenantTo.getIncomeTenant() !=null && accountTenantTo.getIncomeTenant() >0) {
+            if (accountTenantTo.getIncomeTenant() !=null && accountTenantTo.getIncomeTenant() >0) {
                 // 分润给机构
                 tenantdivMap.merge(accountTenantTo.getIncomeTenant() , teacherAmount, BigDecimal::add);
                 tenantdivMap.merge(-1L, teacherAmount, BigDecimal::subtract);
@@ -652,7 +654,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();
@@ -660,9 +662,7 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
             accountTenantTo = JSON.parseObject(userAccountConfig, UserPaymentOrderWrapper.AccountTenantTo.class);
         }
 
-        if (accountTenantTo.getIncomeTenant() != null && accountTenantTo.getIncomeTenant() == 0) {
-
-        } else if (accountTenantTo.getIncomeTenant() !=null && accountTenantTo.getIncomeTenant() >0) {
+        if (accountTenantTo.getIncomeTenant() !=null && accountTenantTo.getIncomeTenant() >0) {
             // 分润给机构
             tenantdivMap.merge(accountTenantTo.getIncomeTenant(), teacherAmount, BigDecimal::add);
             tenantdivMap.merge(-1L, teacherAmount, BigDecimal::subtract);
@@ -795,15 +795,33 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
 
         Map<Long,BigDecimal> tenantShare = new HashMap<>();
 
+        BigDecimal amount = bizMap.values().stream().reduce(BigDecimal.ZERO, BigDecimal::add);
+
         // 计算分润
-        teacherAmount(userPaymentOrder, tenantdivMap, teacherMap,tenantShare, tenantdivMap.get(-1L));
+        teacherAmount(userPaymentOrder, tenantdivMap, teacherMap,tenantShare, tenantdivMap.get(-1L).subtract(amount));
+
+        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 ){
+
+            // 写入机构收支表
+            tenantDivRecord(userPaymentOrder, tenantdivMap,false);
+            // 写入平台
+            platformDivRecord(userPaymentOrder, tenantdivMap);
+        } else {
+            // 写入平台
+            platformDivRecord(userPaymentOrder, tenantdivMap);
+            // 写入机构收支表
+            tenantDivRecord(userPaymentOrder, tenantdivMap,false);
 
-        // 写入平台
-        platformDivRecord(userPaymentOrder, tenantdivMap);
+        }
 
         // 写入机构分润
         tenantDivRecord(userPaymentOrder, tenantShare,true);
@@ -827,6 +845,17 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
     }
 
     private void teacherBizRecord(UserOrderDetailVo userPaymentOrder, Long bizId, BigDecimal amount) {
+        String userAccountConfig = userPaymentOrder.getAccountConfig();
+        UserPaymentOrderWrapper.AccountTenantTo accountTenantTo;
+        if (StringUtils.isBlank(userAccountConfig)) {
+            accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
+        } else {
+            accountTenantTo = JSON.parseObject(userAccountConfig, UserPaymentOrderWrapper.AccountTenantTo.class);
+        }
+        if (!accountTenantTo.isIncomeTeacher()) {
+            return;
+        }
+
         //获取账期时间
         Date accountPeriodTime = userOrderService.getAccountPeriodTime(userPaymentOrder);
 
@@ -855,63 +884,66 @@ 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;
+        DivideResp divide = new DivideResp();
+        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 {
+                    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(divide.getStatus()!=null && divide.getStatus().equals(PaymentStatus.SUCCESSED))
+                .status("SUCCESS")
+                .feeFlag(true)
+                .feeAmt(feeAmt)
+                .build();
+        paymentDivMemberRecordService.save(paymentDivMemberRecord);
     }
 
     private void teacherShare(UserOrderDetailVo userPaymentOrder, BigDecimal shareFee) {
@@ -935,58 +967,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 +1125,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());
 
     }
 

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

@@ -65,7 +65,7 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 	@Autowired
 	private RedisCache<String, Object> redisCache;
 	// 验证码有效期
-	public static final int CODE_EXPIRE = 60 * 5;
+	public static final int CODE_EXPIRE = 60 * 10;
 	// 发送验证码的间隔时间
 	public static final int CODE_INTERVAL_TIME = 60;
 

+ 38 - 11
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;
@@ -1116,19 +1117,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;
     }
 }

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

@@ -209,6 +209,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 +232,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 +266,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());
 
     }
 
@@ -332,6 +331,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())

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

@@ -3,24 +3,21 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 
 
 import com.alibaba.fastjson.JSON;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
-import com.baomidou.mybatisplus.extension.service.additional.update.impl.LambdaUpdateChainWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 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.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.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import lombok.extern.slf4j.Slf4j;
@@ -31,7 +28,6 @@ import com.yonge.cooleshow.biz.dal.service.TenantMemberService;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
-import java.util.stream.Collectors;
 
 
 /**
@@ -85,27 +81,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);
     }
 
@@ -118,16 +114,39 @@ public class TenantMemberServiceImpl extends ServiceImpl<TenantMemberMapper, Ten
     @Transactional(rollbackFor = Exception.class)
     public Boolean add(TenantMemberWrapper.InsertOrUpdateTenantMember tenantMember) {
 
+        Integer count = this.lambdaQuery()
+            .eq(TenantMember::getTenantId, tenantMember.getTenantId())
+            .eq(TenantMember::getPayerName, tenantMember.getPayerName())
+            .count();
+        if (count > 0) {
+            throw new BizException("该机构已创建成功,请核查");
+        }
+
         PaymentMerchant.MerchantConfig merchantConfig = getMerchantConfig(tenantMember.getPayerName());
         tenantMember.setRequestNo(IdWorker.getIdStr());
 
         // 创建账户
         BasePaymentService paymentService = paymentServiceContext.getPaymentService(tenantMember.getPayerName());
+        if (paymentService == null) {
+            throw new BizException("支付渠道不存在");
+        }
 
         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);
+            if (tenantMember.getPayerType().equals(EPayerType.YEEPAY)) {
+                tenantMember.setMemberId(paymentCorpMember.get("merchantNo").toString());
+//                tenantMember.setRequestNo(paymentCorpMember.get("requestNo").toString());
+            }
+        }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) {
@@ -152,7 +171,7 @@ public class TenantMemberServiceImpl extends ServiceImpl<TenantMemberMapper, Ten
                 .attachFile(tenantMember.getFile())
                 .bankCode(tenantMember.getBankCode())
                 .bankAccountType(tenantMember.getBankAcctType())
-                .bankCardNo(tenantMember.getBankCode())
+                .bankCardNo(tenantMember.getCardNo())
                 .cardName(tenantMember.getCardName())
                 .zipCode(tenantMember.getZipCode())
                 .requestNo(tenantMember.getRequestNo())
@@ -168,17 +187,18 @@ 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.getDesc());
         } 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.getDesc());
         }
         return merchantMember;
 
     }
 
-    private PaymentMerchant.MerchantConfig getMerchantConfig(String paymentVerdor) {
+    @Override
+    public PaymentMerchant.MerchantConfig getMerchantConfig(String paymentVerdor) {
         // 注册对应的子账户
         PaymentMerchantConfig merchantConfig = paymentMerchantConfigService.getByPaymentVendor(paymentVerdor);
 
@@ -209,6 +229,13 @@ public class TenantMemberServiceImpl extends ServiceImpl<TenantMemberMapper, Ten
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean update(TenantMemberWrapper.InsertOrUpdateTenantMember tenantMember){
+        Integer count = this.lambdaQuery()
+            .eq(TenantMember::getId, tenantMember.getId())
+            .count();
+        if (count == 0) {
+            throw new BizException("商户不存在请核对");
+        }
+
 
         TenantMember member = this.getById(tenantMember.getId());
 
@@ -216,16 +243,29 @@ public class TenantMemberServiceImpl extends ServiceImpl<TenantMemberMapper, Ten
 
         // 创建账户
         BasePaymentService paymentService = paymentServiceContext.getPaymentService(tenantMember.getPayerName());
-
+        if (paymentService == null) {
+            throw new BizException("支付渠道不存在");
+        }
         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);
     }
 
     /**
@@ -234,18 +274,54 @@ public class TenantMemberServiceImpl extends ServiceImpl<TenantMemberMapper, Ten
      * @return
      */
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Boolean updateCount(TenantMemberWrapper.UpdateCount tenantMember) {
 
-        if (!StringUtil.isEmpty(tenantMember)){
-            LambdaUpdateChainWrapper<TenantMember> wrapper = this.lambdaUpdate()
-                    .set(TenantMember::getCardNo, tenantMember.getCardNo())
-                    .set(TenantMember::getBankCode, tenantMember.getBankCode())
-                    .eq(TenantMember::getId, tenantMember.getId());
+        TenantMember member = getById(tenantMember.getId());
+        if (member == null) {
+            throw new BizException("商户不存在请核对");
+        }
+        if (!member.getStatus().equals(AuthStatusEnum.PASS)) {
+            throw new BizException("商户审核通过,才能绑定结算卡");
+        }
+
+        member.setBankCode(tenantMember.getBankCode());
+        member.setCardNo(tenantMember.getCardNo());
+
+        PaymentMerchant.MerchantConfig merchantConfig = getMerchantConfig(member.getPayerName());
+
+        // 创建账户
+        BasePaymentService paymentService = paymentServiceContext.getPaymentService(member.getPayerName());
+        if (paymentService == null) {
+            throw new BizException("支付渠道不存在");
+        }
+
+        try {
+            //删除结算账户
+            if (StringUtils.isNotBlank(member.getSettleAccountId())) {
+                paymentService.deleteSettleAccount(merchantConfig.getMerchantKey(), merchantConfig.getAppId(), member.getMemberId(), member.getSettleAccountId());
+            }
+
+            PaymentMerchant.AccountInfo accountInfo = PaymentMerchant.AccountInfo.builder()
+                .memberId(member.getMemberId())
+                .cardId(member.getCardNo())
+                .cardName(member.getCardName())
+                .areaCode(member.getAreaCode())
+                .bankAcctType(member.getBankAcctType())
+                .bankCode(member.getBankCode())
+                .bankName(member.getBankCode())
+                .provCode(member.getProvCode())
+                .telNo(member.getLegalMp())
+                .build();
+            //创建结算账户
+            String settleAccountId = paymentService.createSettleAccount(merchantConfig, accountInfo);
 
-            wrapper.update();
-            return true;
+            member.setSettleAccountId(settleAccountId);
+        }catch (Exception e) {
+            log.error("更新结算账户失败", e);
+            throw new BizException("更新结算账户失败:" + e.getMessage());
         }
-         return false;
+        return this.updateById(member);
     }
 
     @Override
@@ -265,4 +341,37 @@ 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();
+
+    }
+
+    @Override
+    public PaymentMerchant.MerchantMember remoteDetail(Long id) {
+
+        TenantMember tenantMember = getById(id);
+
+        TenantMember member = this.getById(tenantMember.getId());
+
+        PaymentMerchant.MerchantConfig merchantConfig = getMerchantConfig(tenantMember.getPayerName());
+
+        // 创建账户
+        BasePaymentService paymentService = paymentServiceContext.getPaymentService(tenantMember.getPayerName());
+        if (paymentService == null) {
+            throw new BizException("支付渠道不存在");
+        }
+        PaymentMerchant.MerchantMember merchantMember = getMerchantMember(TenantMemberWrapper.InsertOrUpdateTenantMember.from(JSON.toJSONString(tenantMember)));
+
+        return paymentService.getPaymentCorpMember(merchantConfig, merchantMember);
+
+    }
+
 }

+ 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));       
+    }
+}

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

@@ -78,6 +78,9 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
     @Autowired
     private UserOrderService userOrderService;
 
+    @Autowired
+    private TenantTeacherAccountRecordService tenantTeacherAccountRecordService;
+
     //验证是否可以退款,获取退款金额信息
     private static final Map<GoodTypeEnum, Function<OrderRefundReq, HttpResponseResult<RefundCreateRes>>> refundCreate = new HashMap<>();
     //插入退款后执行
@@ -656,19 +659,28 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
                 .list();
         if (CollectionUtils.isNotEmpty(list)) {
             for (TenantAccountRecord tenantAccountRecord : list) {
-                if (PostStatusEnum.WAIT.getCode().equals(tenantAccountRecord.getPostStatus())
-                        || PostStatusEnum.FROZEN.getCode().equals(tenantAccountRecord.getPostStatus())) {
-                    tenantAccountRecord.setPostStatus(PostStatusEnum.CANCEL.getCode());
-                    platformCashAccountRecordService.cancelRecord(tenantAccountRecord.getOrderNo(), tenantAccountRecord.getBizType(), tenantAccountRecord.getBizId(),
-                            InOrOutEnum.OUT);
-                }
+                tenantAccountRecord.setPostStatus(PostStatusEnum.CANCEL.getCode());
+                platformCashAccountRecordService.cancelRecord(tenantAccountRecord.getOrderNo(), tenantAccountRecord.getBizType(), tenantAccountRecord.getBizId(),
+                        InOrOutEnum.OUT);
             }
             tenantAccountRecordService.updateBatchById(list);
+            // 处理机构老师入账
+            List<TenantTeacherAccountRecord> teacherAccountRecordList = tenantTeacherAccountRecordService.lambdaQuery()
+                .eq(TenantTeacherAccountRecord::getOrderNo, vo.getOrderNo())
+                .list();
+            if (CollectionUtils.isNotEmpty(teacherAccountRecordList)) {
+                for (TenantTeacherAccountRecord tenantTeacherAccountRecord : teacherAccountRecordList) {
+                    tenantTeacherAccountRecord.setPostStatus(PostStatusEnum.CANCEL.getCode());
+                }
+                tenantTeacherAccountRecordService.updateBatchById(teacherAccountRecordList);
+            }
         }
 
         //处理平台入账
         platformCashAccountRecordService.cancelRecord(vo.getOrderNo(), vo.getGoodType().getCode(), vo.getBizId(),
                                                       InOrOutEnum.IN);
+        platformCashAccountRecordService.cancelRecord(vo.getOrderNo(), vo.getGoodType().getCode(), vo.getBizId(),
+                                                      InOrOutEnum.OUT);
     }
 
     /**

+ 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);
                 }
             }

+ 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());
 
     }
 

+ 9 - 3
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("公司名称")
@@ -339,8 +345,8 @@ public class TenantMemberWrapper {
             return JSON.toJSONString(this);
         }
 
-        public static TenantMember from(String json) {
-            return JSON.parseObject(json, TenantMember.class);
+        public static InsertOrUpdateTenantMember from(String json) {
+            return JSON.parseObject(json, InsertOrUpdateTenantMember.class);
         }
     }
 

+ 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);

+ 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}

+ 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>