Переглянути джерело

Merge remote-tracking branch 'origin/master'

zouxuan 3 роки тому
батько
коміт
d4871d8c58
58 змінених файлів з 1733 додано та 276 видалено
  1. 18 1
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/AdminFeignService.java
  2. 7 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/MallPortalFeignService.java
  3. 15 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/AdminFeignServiceFallback.java
  4. 6 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/MallPortalFeignServiceFallback.java
  5. 114 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/entity/MallOrderItemDto.java
  6. 40 5
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderReturnApplyServiceImpl.java
  7. 10 0
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/OmsCartItem.java
  8. 23 0
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/OmsOrderItem.java
  9. 18 3
      cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/OmsCartItemMapper.xml
  10. 33 3
      cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/OmsOrderItemMapper.xml
  11. 5 0
      cooleshow-mall/mall-portal/pom.xml
  12. 1 1
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/config/ResourceServerConfig.java
  13. 8 1
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderController.java
  14. 7 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsPortalOrderService.java
  15. 3 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsCartItemServiceImpl.java
  16. 89 2
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java
  17. 11 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/task/OrderTimeOutCancelTask.java
  18. 2 2
      cooleshow-mall/mall-portal/src/main/resources/config/mybatis/PortalOrderItemDao.xml
  19. 22 0
      cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/MallAutoReceiveTask.java
  20. 45 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/PlatformCashAccountRecordController.java
  21. 27 3
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UserAccountController.java
  22. 14 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UserAccountRecordController.java
  23. 17 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/PlatformCashAccountRecordDao.java
  24. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserAccountDao.java
  25. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserAccountRecordDao.java
  26. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderReq.java
  27. 87 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/PlatformCashAccountRecordSearch.java
  28. 43 26
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/PlatformCashAccountRecord.java
  29. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrder.java
  30. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderDetail.java
  31. 16 19
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/AccountBizTypeEnum.java
  32. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/GoodTypeEnum.java
  33. 31 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/PlatformCashAccountRecordService.java
  34. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserAccountRecordService.java
  35. 19 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserAccountService.java
  36. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderService.java
  37. 23 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  38. 15 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  39. 4 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MemberPriceSettingsServiceImpl.java
  40. 5 34
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  41. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PianoRoomBuyRecordServiceImpl.java
  42. 105 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PlatformCashAccountRecordServiceImpl.java
  43. 3 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java
  44. 10 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserAccountRecordServiceImpl.java
  45. 250 57
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserAccountServiceImpl.java
  46. 4 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundServiceImpl.java
  47. 139 15
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  48. 9 36
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonPurchaseRecordServiceImpl.java
  49. 52 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/PlatformCashAccountRecordSummaryVo.java
  50. 10 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherHomeVo.java
  51. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserAccountRecordVo.java
  52. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserAccountVo.java
  53. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserOrderRefundVo.java
  54. 110 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/PlatformCashAccountRecordMapper.xml
  55. 3 7
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserAccountMapper.xml
  56. 37 4
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserAccountRecordMapper.xml
  57. 10 5
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderDetailMapper.xml
  58. 155 24
      toolset/utils/src/main/java/com/yonge/toolset/utils/collection/ListUtil.java

+ 18 - 1
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/AdminFeignService.java

@@ -1,13 +1,16 @@
 package com.yonge.cooleshow.api.feign;
 
 import com.yonge.cooleshow.api.feign.fallback.AdminFeignServiceFallback;
-import com.yonge.cooleshow.api.feign.fallback.MallAdminFeignServiceFallback;
 import com.yonge.cooleshow.common.constant.AppConstant;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.entity.MallOrderItemDto;
 import com.yonge.toolset.feign.config.FeignConfiguration;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.List;
 
 /**
  * Description
@@ -46,6 +49,20 @@ public interface AdminFeignService {
     @PostMapping(value = "/task/teacherEarning")
     HttpResponseResult<Object> sendTeacherEarning();
 
+
+    /**
+     * 设置商城收入分润
+     */
+    @PostMapping("/userAccount/mallRecord")
+    public HttpResponseResult<Boolean> mallRecord(@RequestBody List<MallOrderItemDto> shareDto ) ;
+
+    /**
+     * 设置商城收入状态
+     */
+    @PostMapping("/userAccount/mallRecordState")
+    public HttpResponseResult<Boolean> mallRecordState(@RequestBody  List<MallOrderItemDto> shareDto ) ;
+
+
     //老师课酬
     @PostMapping(value = "/task/refreshBlackList")
     HttpResponseResult refreshBlackList();

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

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.api.feign;
 
 import com.yonge.cooleshow.api.feign.fallback.MallPortalFeignServiceFallback;
 import com.yonge.cooleshow.common.constant.AppConstant;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.feign.config.FeignConfiguration;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -15,4 +16,10 @@ public interface MallPortalFeignService {
      */
     @GetMapping("/task/cancelTimeOutOrder")
     Object cancelTimeOutOrder();
+
+    /**
+     * 自动收货
+     */
+    @GetMapping("/autoReceive")
+    HttpResponseResult autoReceive();
 }

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

@@ -2,6 +2,9 @@ package com.yonge.cooleshow.api.feign.fallback;
 
 import com.yonge.cooleshow.api.feign.AdminFeignService;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.entity.MallOrderItemDto;
+
+import java.util.List;
 
 /**
  * Description
@@ -31,14 +34,26 @@ public class AdminFeignServiceFallback implements AdminFeignService {
     }
 
     @Override
+    public HttpResponseResult<Boolean> mallRecord(List<MallOrderItemDto> shareDto) {
+        return null;
+    }
 
+    @Override
+    public HttpResponseResult<Boolean> mallRecordState(List<MallOrderItemDto> shareDto) {
+        return null;
+    }
+
+
+    @Override
     public HttpResponseResult refreshBlackList() {
 
         return null;
     }
 
+    @Override
     public HttpResponseResult<String> findConfigValue(String paramName) {
 
         return null;
     }
+
 }

+ 6 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/MallPortalFeignServiceFallback.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.api.feign.fallback;
 
 
 import com.yonge.cooleshow.api.feign.MallPortalFeignService;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
 
 /**
  * Description
@@ -14,4 +15,9 @@ public class MallPortalFeignServiceFallback implements MallPortalFeignService {
     public Object cancelTimeOutOrder() {
         return null;
     }
+
+    @Override
+    public HttpResponseResult autoReceive() {
+        return null;
+    }
 }

+ 114 - 0
cooleshow-common/src/main/java/com/yonge/cooleshow/common/entity/MallOrderItemDto.java

@@ -0,0 +1,114 @@
+package com.yonge.cooleshow.common.entity;
+
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
+
+import java.math.BigDecimal;
+
+/**
+ * Description 老师分润
+ *
+ * @author liujunchi
+ * @date 2022-07-25
+ */
+public class MallOrderItemDto {
+
+    // 订单详情id
+    private Long id;
+
+    // 订单id
+    private Long orderId;
+
+    // 订单号
+    private String orderSn;
+
+    // 商品id
+    private Long productSkuId;
+
+
+    private String productName;
+
+    // 分享人id
+    private Long promoterId;
+
+    // 购买金额
+    private BigDecimal realAmount;
+
+    // 购买人id
+    private Long userId;
+
+    // 分润状态
+    private PostStatusEnum status;
+
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Long orderId) {
+        this.orderId = orderId;
+    }
+
+    public String getOrderSn() {
+        return orderSn;
+    }
+
+    public void setOrderSn(String orderSn) {
+        this.orderSn = orderSn;
+    }
+
+    public Long getProductSkuId() {
+        return productSkuId;
+    }
+
+    public void setProductSkuId(Long productSkuId) {
+        this.productSkuId = productSkuId;
+    }
+
+    public String getProductName() {
+        return productName;
+    }
+
+    public void setProductName(String productName) {
+        this.productName = productName;
+    }
+
+    public Long getPromoterId() {
+        return promoterId;
+    }
+
+    public void setPromoterId(Long promoterId) {
+        this.promoterId = promoterId;
+    }
+
+    public BigDecimal getRealAmount() {
+        return realAmount;
+    }
+
+    public void setRealAmount(BigDecimal realAmount) {
+        this.realAmount = realAmount;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public PostStatusEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(PostStatusEnum status) {
+        this.status = status;
+    }
+}

+ 40 - 5
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderReturnApplyServiceImpl.java

@@ -1,14 +1,17 @@
 package com.yonge.cooleshow.admin.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.github.pagehelper.PageHelper;
 import com.yonge.cooleshow.admin.dao.OmsOrderReturnApplyDao;
-import com.yonge.cooleshow.admin.dto.HomeStatistical;
-import com.yonge.cooleshow.admin.dto.OmsOrderReturnApplyResult;
-import com.yonge.cooleshow.admin.dto.OmsReturnApplyQueryParam;
-import com.yonge.cooleshow.admin.dto.OmsUpdateStatusParam;
+import com.yonge.cooleshow.admin.dto.*;
+import com.yonge.cooleshow.api.feign.AdminFeignService;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.entity.MallOrderItemDto;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import com.yonge.cooleshow.common.service.IdGeneratorService;
 import com.yonge.cooleshow.mall.common.exception.ApiException;
 import com.yonge.cooleshow.mall.common.service.RedisService;
+import com.yonge.cooleshow.mbg.mapper.OmsOrderItemMapper;
 import com.yonge.cooleshow.mbg.model.*;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.cooleshow.mbg.mapper.OmsOrderReturnApplyMapper;
@@ -24,12 +27,13 @@ import com.yonge.toolset.payment.base.model.RefundBill;
 import com.yonge.toolset.payment.core.service.PaymentClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
@@ -48,6 +52,11 @@ public class OmsOrderReturnApplyServiceImpl implements OmsOrderReturnApplyServic
     private OmsOrderReturnApplyMapper returnApplyMapper;
 
     @Autowired
+    private OmsOrderItemMapper orderItemMapper;
+
+    @Autowired
+    private AdminFeignService adminFeignService;
+    @Autowired
     private RedisService redisService;
     private String REDIS_KEY_ORDER_ID= "redis.key.orderId";
     private String REDIS_DATABASE = "redis.database";
@@ -113,6 +122,10 @@ public class OmsOrderReturnApplyServiceImpl implements OmsOrderReturnApplyServic
             if (omsOrderReturnApply.getReturnAmount().compareTo(BigDecimal.ZERO) >0) {
                 refundAmount(omsOrderReturnApply);
             }
+
+            // 确认退款 取消平台收入和 分润
+            setRecord(returnApply);
+
         } else if (status.equals(3)) {
             //拒绝退货
             returnApply.setId(id);
@@ -126,6 +139,28 @@ public class OmsOrderReturnApplyServiceImpl implements OmsOrderReturnApplyServic
         return returnApplyMapper.updateByPrimaryKeySelective(returnApply);
     }
 
+    private void setRecord(OmsOrderReturnApply returnApply) {
+        if (returnApply.getOrderItemId() != null) {
+            OmsOrderItem omsOrderItem = orderItemMapper.selectByPrimaryKey(returnApply.getOrderItemId());
+            if (omsOrderItem != null) {
+                MallOrderItemDto teacherShareDto = new MallOrderItemDto();
+                BeanUtils.copyProperties(omsOrderItem, teacherShareDto);
+                teacherShareDto.setRealAmount(omsOrderItem.getRealAmount().multiply(BigDecimal.valueOf(omsOrderItem.getProductQuantity())));
+                teacherShareDto.setProductId(omsOrderItem.getProductId());
+                teacherShareDto.setStatus(PostStatusEnum.CANCEL);
+                List<MallOrderItemDto> list = new ArrayList<>();
+                list.add(teacherShareDto);
+                HttpResponseResult<Boolean> result = adminFeignService.mallRecordState(list);
+
+                if (result.getStatus()) {
+                    log.debug("分润取消写入成功,json: {}", JSON.toJSONString(teacherShareDto));
+                } else {
+                    log.error("分润取消写入失败,json: {}",JSON.toJSONString(teacherShareDto));
+                }
+            }
+        }
+    }
+
     /**
      * 退款处理
      *

+ 10 - 0
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/OmsCartItem.java

@@ -16,6 +16,9 @@ public class OmsCartItem implements Serializable {
 
     private Long memberId;
 
+    @ApiModelProperty("推广人id")
+    private Long promoterId;
+
     @ApiModelProperty(value = "购买数量")
     private Integer quantity;
 
@@ -66,6 +69,13 @@ public class OmsCartItem implements Serializable {
     @ApiModelProperty(value = "锁定库存")
     private Integer lockStock = 0 ;
 
+    public Long getPromoterId() {
+        return promoterId;
+    }
+
+    public void setPromoterId(Long promoterId) {
+        this.promoterId = promoterId;
+    }
 
     public Integer getStock() {
         return stock;

+ 23 - 0
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/OmsOrderItem.java

@@ -23,6 +23,12 @@ public class OmsOrderItem implements Serializable {
 
     private String productSn;
 
+    @ApiModelProperty("推广人id")
+    private Long promoterId;
+
+    @ApiModelProperty("分享比例(%)")
+    private String shareProportion;
+
     @ApiModelProperty(value = "销售价格")
     private BigDecimal productPrice;
 
@@ -65,6 +71,23 @@ public class OmsOrderItem implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
+
+    public Long getPromoterId() {
+        return promoterId;
+    }
+
+    public void setPromoterId(Long promoterId) {
+        this.promoterId = promoterId;
+    }
+
+    public String getShareProportion() {
+        return shareProportion;
+    }
+
+    public void setShareProportion(String shareProportion) {
+        this.shareProportion = shareProportion;
+    }
+
     public Long getId() {
         return id;
     }

+ 18 - 3
cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/OmsCartItemMapper.xml

@@ -21,6 +21,7 @@
     <result column="product_sn" jdbcType="VARCHAR" property="productSn" />
     <result column="product_attr" jdbcType="VARCHAR" property="productAttr" />
     <result column="hidden_" jdbcType="VARCHAR" property="hidden" />
+    <result column="promoter_id"  property="promoterId" />
   </resultMap>
   <sql id="Example_Where_Clause">
     <where>
@@ -83,7 +84,7 @@
   <sql id="Base_Column_List">
     id, product_id, product_sku_id, member_id, quantity, price, product_pic, product_name, 
     product_sub_title, product_sku_code, member_nickname, create_date, modify_date, delete_status, 
-    product_category_id, product_brand, product_sn, product_attr,hidden_
+    product_category_id, product_brand, product_sn, product_attr,hidden_,promoter_id
   </sql>
   <select id="selectByExample" parameterType="com.yonge.cooleshow.mbg.model.OmsCartItemExample" resultMap="BaseResultMap">
     select
@@ -124,13 +125,13 @@
       product_name, product_sub_title, product_sku_code, 
       member_nickname, create_date, modify_date, 
       delete_status, product_category_id, product_brand, 
-      product_sn, product_attr,hidden_)
+      product_sn, product_attr,hidden_,promoter_id)
     values (#{productId,jdbcType=BIGINT}, #{productSkuId,jdbcType=BIGINT}, #{memberId,jdbcType=BIGINT}, 
       #{quantity,jdbcType=INTEGER}, #{price,jdbcType=DECIMAL}, #{productPic,jdbcType=VARCHAR}, 
       #{productName,jdbcType=VARCHAR}, #{productSubTitle,jdbcType=VARCHAR}, #{productSkuCode,jdbcType=VARCHAR}, 
       #{memberNickname,jdbcType=VARCHAR}, #{createDate,jdbcType=TIMESTAMP}, #{modifyDate,jdbcType=TIMESTAMP}, 
       #{deleteStatus,jdbcType=INTEGER}, #{productCategoryId,jdbcType=BIGINT}, #{productBrand,jdbcType=VARCHAR}, 
-      #{productSn,jdbcType=VARCHAR}, #{productAttr,jdbcType=VARCHAR},#{hidden})
+      #{productSn,jdbcType=VARCHAR}, #{productAttr,jdbcType=VARCHAR},#{hidden},#{promoterId})
   </insert>
   <insert id="insertSelective" parameterType="com.yonge.cooleshow.mbg.model.OmsCartItem">
     <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Long">
@@ -192,6 +193,9 @@
       <if test="hidden != null">
         hidden_,
       </if>
+      <if test="promoterId != null">
+        promoter_id,
+      </if>
     </trim>
     <trim prefix="values (" suffix=")" suffixOverrides=",">
       <if test="productId != null">
@@ -248,6 +252,9 @@
       <if test="hidden != null">
         #{hidden},
       </if>
+      <if test="promoterId != null">
+        #{promoterId},
+      </if>
     </trim>
   </insert>
   <select id="countByExample" parameterType="com.yonge.cooleshow.mbg.model.OmsCartItemExample" resultType="java.lang.Long">
@@ -316,6 +323,9 @@
       <if test="record.hidden != null">
         hidden_ = #{record.hidden},
       </if>
+      <if test="record.promoterId != null">
+        promoter_id = #{record.promoterId},
+      </if>
     </set>
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
@@ -341,6 +351,7 @@
       product_brand = #{record.productBrand,jdbcType=VARCHAR},
       product_sn = #{record.productSn,jdbcType=VARCHAR},
       product_attr = #{record.productAttr,jdbcType=VARCHAR},
+      promoter_id = #{record.promoterId},
       hidden_ = #{record.hidden}
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
@@ -403,6 +414,9 @@
       <if test="hidden != null">
         hidden_ = #{hidden},
       </if>
+      <if test="promoterId != null">
+        promoter_id = #{promoterId},
+      </if>
     </set>
     where id = #{id,jdbcType=BIGINT}
   </update>
@@ -425,6 +439,7 @@
       product_brand = #{productBrand,jdbcType=VARCHAR},
       product_sn = #{productSn,jdbcType=VARCHAR},
       product_attr = #{productAttr,jdbcType=VARCHAR},
+      promoter_id = #{promoterId},
       hidden_ = #{hidden}
     where id = #{id,jdbcType=BIGINT}
   </update>

+ 33 - 3
cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/OmsOrderItemMapper.xml

@@ -24,6 +24,8 @@
     <result column="gift_growth" jdbcType="INTEGER" property="giftGrowth" />
     <result column="product_attr" jdbcType="VARCHAR" property="productAttr" />
     <result column="returnStatus" jdbcType="INTEGER" property="returnStatus" />
+    <result column="promoter_id" jdbcType="INTEGER" property="promoterId" />
+    <result column="share_proportion_" jdbcType="INTEGER" property="shareProportion" />
   </resultMap>
   <sql id="Example_Where_Clause">
     <where>
@@ -87,7 +89,7 @@
     id, order_id, order_sn, product_id, product_pic, product_name, product_brand, product_sn, 
     product_price, product_quantity, product_sku_id, product_sku_code, product_category_id, 
     promotion_name, promotion_amount, coupon_amount, integration_amount, real_amount, 
-    gift_integration, gift_growth, product_attr
+    gift_integration, gift_growth, product_attr,promoter_id,share_proportion_
   </sql>
   <select id="selectByExample" parameterType="com.yonge.cooleshow.mbg.model.OmsOrderItemExample" resultMap="BaseResultMap">
     select a.*,if(oora.status is null,-1,oora.status) as returnStatus from  (
@@ -131,14 +133,14 @@
       product_sku_id, product_sku_code, product_category_id, 
       promotion_name, promotion_amount, coupon_amount, 
       integration_amount, real_amount, gift_integration, 
-      gift_growth, product_attr)
+      gift_growth, product_attr,promoter_id,share_proportion_)
     values (#{orderId,jdbcType=BIGINT}, #{orderSn,jdbcType=VARCHAR}, #{productId,jdbcType=BIGINT}, 
       #{productPic,jdbcType=VARCHAR}, #{productName,jdbcType=VARCHAR}, #{productBrand,jdbcType=VARCHAR}, 
       #{productSn,jdbcType=VARCHAR}, #{productPrice,jdbcType=DECIMAL}, #{productQuantity,jdbcType=INTEGER}, 
       #{productSkuId,jdbcType=BIGINT}, #{productSkuCode,jdbcType=VARCHAR}, #{productCategoryId,jdbcType=BIGINT}, 
       #{promotionName,jdbcType=VARCHAR}, #{promotionAmount,jdbcType=DECIMAL}, #{couponAmount,jdbcType=DECIMAL}, 
       #{integrationAmount,jdbcType=DECIMAL}, #{realAmount,jdbcType=DECIMAL}, #{giftIntegration,jdbcType=INTEGER}, 
-      #{giftGrowth,jdbcType=INTEGER}, #{productAttr,jdbcType=VARCHAR})
+      #{giftGrowth,jdbcType=INTEGER}, #{productAttr,jdbcType=VARCHAR},#{promoterId},#{shareProportion})
   </insert>
   <insert id="insertSelective" parameterType="com.yonge.cooleshow.mbg.model.OmsOrderItem">
     <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Long">
@@ -206,6 +208,12 @@
       <if test="productAttr != null">
         product_attr,
       </if>
+      <if test="promoterId != null">
+        promoter_id,
+      </if>
+      <if test="shareProportion != null">
+        share_proportion_,
+      </if>
     </trim>
     <trim prefix="values (" suffix=")" suffixOverrides=",">
       <if test="orderId != null">
@@ -268,6 +276,12 @@
       <if test="productAttr != null">
         #{productAttr,jdbcType=VARCHAR},
       </if>
+      <if test="promoterId != null">
+        #{promoterId,jdbcType=BIGINT},
+      </if>
+      <if test="shareProportion != null">
+        #{shareProportion,jdbcType=VARCHAR},
+      </if>
     </trim>
   </insert>
   <select id="countByExample" parameterType="com.yonge.cooleshow.mbg.model.OmsOrderItemExample" resultType="java.lang.Long">
@@ -342,6 +356,12 @@
       <if test="record.productAttr != null">
         product_attr = #{record.productAttr,jdbcType=VARCHAR},
       </if>
+      <if test="record.promoterId != null">
+        promoter_id = #{record.promoterId,jdbcType=VARCHAR},
+      </if>
+      <if test="record.shareProportion != null">
+        share_proportion_ = #{record.shareProportion,jdbcType=VARCHAR},
+      </if>
     </set>
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
@@ -369,6 +389,8 @@
       real_amount = #{record.realAmount,jdbcType=DECIMAL},
       gift_integration = #{record.giftIntegration,jdbcType=INTEGER},
       gift_growth = #{record.giftGrowth,jdbcType=INTEGER},
+      promoter_id = #{record.promoterId,jdbcType=INTEGER},
+      share_proportion_ = #{record.shareProportion},
       product_attr = #{record.productAttr,jdbcType=VARCHAR}
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
@@ -437,6 +459,12 @@
       <if test="productAttr != null">
         product_attr = #{productAttr,jdbcType=VARCHAR},
       </if>
+      <if test="promoterId != null">
+        promoter_id = #{promoterId,jdbcType=VARCHAR},
+      </if>
+      <if test="shareProportion != null">
+        share_proportion_ = #{shareProportion,jdbcType=VARCHAR},
+      </if>
     </set>
     where id = #{id,jdbcType=BIGINT}
   </update>
@@ -461,6 +489,8 @@
       real_amount = #{realAmount,jdbcType=DECIMAL},
       gift_integration = #{giftIntegration,jdbcType=INTEGER},
       gift_growth = #{giftGrowth,jdbcType=INTEGER},
+      promoter_id = #{promoterId,jdbcType=INTEGER},
+    share_proportion_ = #{shareProportion},
       product_attr = #{productAttr,jdbcType=VARCHAR}
     where id = #{id,jdbcType=BIGINT}
   </update>

+ 5 - 0
cooleshow-mall/mall-portal/pom.xml

@@ -85,6 +85,11 @@
             <version>1.0</version>
         </dependency>
         <dependency>
+            <groupId>com.yonge.cooleshow</groupId>
+            <artifactId>cooleshow-api</artifactId>
+            <version>1.0</version>
+        </dependency>
+        <dependency>
             <groupId>com.yonge.toolset</groupId>
             <artifactId>toolset-payment</artifactId>
             <version>${project.toolset.version}</version>

+ 1 - 1
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/config/ResourceServerConfig.java

@@ -28,7 +28,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
                 .and()
                 .authorizeRequests().antMatchers("/wechat/*","/v2/api-docs", "/code/*","/payment/callback/**",
                  "/order/paySuccess/test","/order/cancelUserOrder/test")
-            .permitAll().anyRequest().permitAll().and().httpBasic();
+            .permitAll().anyRequest().authenticated().and().httpBasic();
     }
 
     @Override

+ 8 - 1
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderController.java

@@ -144,7 +144,14 @@ public class OmsPortalOrderController {
     @RequestMapping(value = "/confirmReceiveOrder", method = RequestMethod.POST)
     @ResponseBody
     public CommonResult confirmReceiveOrder(Long orderId) {
-        portalOrderService.confirmReceiveOrder(orderId);
+        OmsOrder omsOrder = portalOrderService.getOrderById(orderId);
+        if (omsOrder == null) {
+            return CommonResult.failed("未找到订单");
+        }
+
+        DistributedLock.of(redissonClient)
+                       .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(omsOrder.getOrderSn())
+                               , () -> portalOrderService.confirmReceiveOrder(orderId), 60L, TimeUnit.SECONDS);
         return CommonResult.success(null);
     }
 

+ 7 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsPortalOrderService.java

@@ -111,4 +111,11 @@ public interface OmsPortalOrderService {
     void closePaymentCallBack(PaymentCallBack data);
 
 
+    /**
+     * 设置自动收货
+     *
+     * @return
+     */
+    @Transactional
+    Integer autoReceive();
 }

+ 3 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsCartItemServiceImpl.java

@@ -87,6 +87,9 @@ public class OmsCartItemServiceImpl implements OmsCartItemService {
             cartItemMapper.insert(cartItem);
             return cartItem;
         } else {
+            if (cartItem.getPromoterId() != null) {
+                existCartItem.setPromoterId(cartItem.getPromoterId());
+            }
             if (pmsSkuStock.getStock() - pmsSkuStock.getLockStock() < existCartItem.getQuantity() + cartItem.getQuantity()) {
                 throw new BizException("库存不足");
             }

+ 89 - 2
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java

@@ -4,6 +4,10 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import com.alibaba.fastjson.JSON;
 import com.github.pagehelper.PageHelper;
+import com.yonge.cooleshow.api.feign.AdminFeignService;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.entity.MallOrderItemDto;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import com.yonge.cooleshow.common.service.IdGeneratorService;
 import com.yonge.cooleshow.mall.common.api.CommonPage;
 import com.yonge.cooleshow.mall.common.enums.OrderCacheEnum;
@@ -34,6 +38,7 @@ import com.yonge.toolset.payment.util.DistributedLock;
 import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -41,7 +46,8 @@ import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
@@ -108,6 +114,10 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
     @Autowired
     private RedissonClient redissonClient;
 
+
+    @Autowired
+    private AdminFeignService adminFeignService;
+
     @Autowired
     private PortalProductDao productDao;
 
@@ -161,6 +171,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             orderItem.setPromotionName(cartPromotionItem.getPromotionMessage());
             orderItem.setGiftIntegration(cartPromotionItem.getIntegration());
             orderItem.setGiftGrowth(cartPromotionItem.getGrowth());
+            orderItem.setPromoterId(cartPromotionItem.getPromoterId());
             orderItemList.add(orderItem);
         }
         //判断购物车中商品是否都有库存
@@ -320,9 +331,54 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         // 减商品库存
         updateProductStock(orderDetail);
 
+        // 查询订单
+        OmsOrderDetail detail = detail(orderId);
+
+        // 设置平台收入和分润
+
+        setPromoterRecord(detail,PostStatusEnum.WAIT);
+
+
         return count;
     }
 
+    private void setPromoterRecord(OmsOrderDetail detail,PostStatusEnum status) {
+
+        List<OmsOrderItem> orderItemList = detail.getOrderItemList();
+
+        // orderItemList = orderItemList.stream().filter(omsOrderItem -> omsOrderItem.getPromoterId() != null).collect(Collectors.toList());
+        if (CollectionUtils.isEmpty(orderItemList) ) {
+            return;
+        }
+
+        List<MallOrderItemDto> list = new ArrayList<>();
+        for (OmsOrderItem omsOrderItem : orderItemList) {
+            if (omsOrderItem.getReturnStatus() != -1) {
+                continue;
+            }
+            MallOrderItemDto teacherShareDto = new MallOrderItemDto();
+            BeanUtils.copyProperties(omsOrderItem,teacherShareDto);
+            teacherShareDto.setRealAmount(omsOrderItem.getRealAmount().multiply(BigDecimal.valueOf(omsOrderItem.getProductQuantity())));
+            teacherShareDto.setStatus(status);
+            teacherShareDto.setUserId(detail.getMemberId());
+            list.add(teacherShareDto);
+        }
+        if (CollectionUtils.isEmpty(list)) {
+            return;
+        }
+        HttpResponseResult<Boolean> result;
+        if (status.equals(PostStatusEnum.WAIT)) {
+            result = adminFeignService.mallRecord(list);
+        } else {
+            result = adminFeignService.mallRecordState(list);
+        }
+        if (result.getStatus()) {
+            LOG.debug("分润记录写入成功,json: {}",JSON.toJSONString(list));
+        } else {
+            LOG.error("分润记录写入失败,json: {}",JSON.toJSONString(list));
+        }
+    }
+
     /**
      * 减商品库存
      */
@@ -446,11 +502,17 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         }
         if (order.getStatus() != 2) {
             Asserts.fail("该订单还未发货!");
+        }else if (order.getStatus() == 3) {
+            Asserts.fail("已确认收货!");
         }
         order.setStatus(3);
         order.setConfirmStatus(1);
         order.setReceiveTime(new Date());
-        orderMapper.updateByPrimaryKey(order);
+        int i = orderMapper.updateByPrimaryKey(order);
+
+        // 设置平台收入和分润 实际收款
+        setPromoterRecord(detail(orderId), PostStatusEnum.RECORDED);
+
     }
 
     @Override
@@ -713,6 +775,31 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         }
     }
 
+    @Override
+    public Integer autoReceive() {
+        OmsOrderSetting omsOrderSetting = orderSettingMapper.selectByPrimaryKey(1L);
+        Integer confirmOvertime = omsOrderSetting.getConfirmOvertime();
+        LocalDateTime localDateTime = LocalDateTime.now().plusDays(-confirmOvertime);
+        OmsOrderExample orderExample = new OmsOrderExample();
+        orderExample.createCriteria().andStatusEqualTo(2).andDeleteStatusEqualTo(0).andConfirmStatusEqualTo(0)
+                .andDeliveryTimeLessThanOrEqualTo(Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()));
+
+        List<OmsOrder> omsOrders = orderMapper.selectByExample(orderExample);
+        if (CollectionUtils.isEmpty(omsOrders)) {
+            return 0;
+        }
+        for (OmsOrder omsOrder : omsOrders) {
+
+            DistributedLock.of(redissonClient)
+                           .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(omsOrder.getOrderSn())
+                                   , () -> {
+                                       this.confirmReceiveOrder(omsOrder.getId());
+                                   }, 60L, TimeUnit.SECONDS);
+        }
+        return omsOrders.size();
+
+    }
+
 
     /***
      * 处理回调-支付成功

+ 11 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/task/OrderTimeOutCancelTask.java

@@ -31,4 +31,15 @@ public class OrderTimeOutCancelTask {
         LOGGER.info("取消订单,并根据sku编号释放锁定库存,取消订单数量:{}",count);
         return HttpResponseResult.succeed();
     }
+
+    /**
+     * 发货多少天后自动收货
+     */
+    @GetMapping("/autoReceive")
+    public HttpResponseResult autoReceive(){
+        Integer count = portalOrderService.autoReceive();
+        LOGGER.info("自动收货:{}",count);
+        return HttpResponseResult.succeed();
+    }
+
 }

+ 2 - 2
cooleshow-mall/mall-portal/src/main/resources/config/mybatis/PortalOrderItemDao.xml

@@ -7,7 +7,7 @@
         product_sn, product_price, product_quantity,
         product_sku_id, product_category_id, product_sku_code,promotion_name,
         promotion_amount, coupon_amount, integration_amount,
-        real_amount,product_attr) values
+        real_amount,product_attr,promoter_id,share_proportion_) values
         <foreach collection="list" item="item" separator="," index="index">
             (#{item.orderId,jdbcType=BIGINT}, #{item.orderSn,jdbcType=VARCHAR}, #{item.productId,jdbcType=BIGINT},
             #{item.productPic,jdbcType=VARCHAR}, #{item.productName,jdbcType=VARCHAR}, #{item.productBrand,jdbcType=VARCHAR},
@@ -16,7 +16,7 @@
             #{item.promotionName,jdbcType=VARCHAR},
             #{item.promotionAmount,jdbcType=DECIMAL}, #{item.couponAmount,jdbcType=DECIMAL},
             #{item.integrationAmount,jdbcType=DECIMAL},
-            #{item.realAmount,jdbcType=DECIMAL},#{item.productAttr,jdbcType=VARCHAR})
+            #{item.realAmount,jdbcType=DECIMAL},#{item.productAttr,jdbcType=VARCHAR},#{item.promoterId},#{item.shareProportion})
         </foreach>
     </insert>
 </mapper>

+ 22 - 0
cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/MallAutoReceiveTask.java

@@ -0,0 +1,22 @@
+package com.yonge.cooleshow.task.jobs;
+
+import com.yonge.cooleshow.api.feign.MallPortalFeignService;
+import com.yonge.cooleshow.task.core.BaseTask;
+import com.yonge.cooleshow.task.core.TaskException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 自动收货
+ */
+@Service
+public class MallAutoReceiveTask extends BaseTask {
+
+    @Autowired
+    private MallPortalFeignService mallPortalFeignService;
+
+    @Override
+    public void execute() throws TaskException {
+        Object o = mallPortalFeignService.autoReceive();
+    }
+}

+ 45 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/PlatformCashAccountRecordController.java

@@ -0,0 +1,45 @@
+package com.yonge.cooleshow.admin.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+import javax.validation.Valid;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.yonge.cooleshow.biz.dal.dto.search.PlatformCashAccountRecordSearch;
+import com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord;
+import com.yonge.cooleshow.biz.dal.service.PlatformCashAccountRecordService;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.mybatis.support.PageUtil;
+
+@RestController
+@RequestMapping("/platformCashAccountRecord")
+@Api(value = "平台账户记录", tags = "平台账户记录")
+public class PlatformCashAccountRecordController extends BaseController {
+
+    @Autowired
+    private PlatformCashAccountRecordService platformCashAccountRecordService;
+
+	@ApiOperation(value = "平台账户记录-列表", httpMethod = "POST", consumes = "application/json", produces = "application/json")
+	@PostMapping(value = "/list", consumes = "application/json", produces = "application/json")
+	@PreAuthorize("@pcs.hasPermissions('platformCashAccountRecord/list')")
+	public HttpResponseResult<ModelMap> list(@Valid @RequestBody PlatformCashAccountRecordSearch query) {
+		ModelMap model = new ModelMap();
+		
+		PageInfo<PlatformCashAccountRecord> pageInfo = PageUtil.pageInfo(platformCashAccountRecordService.queryPage(PageUtil.getPage(query),query));
+		model.put("pageInfo", pageInfo);
+		model.put("summary", platformCashAccountRecordService.querySummary(query));
+		
+		return succeed(model);
+	}
+
+}

+ 27 - 3
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UserAccountController.java

@@ -1,14 +1,17 @@
 package com.yonge.cooleshow.admin.controller;
 
+import com.yonge.cooleshow.biz.dal.service.UserAccountService;
+import com.yonge.cooleshow.biz.dal.vo.UserAccountVo;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
-import io.swagger.annotations.*;
+import com.yonge.cooleshow.common.entity.MallOrderItemDto;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
-import com.yonge.cooleshow.biz.dal.vo.UserAccountVo;
-import com.yonge.cooleshow.biz.dal.service.UserAccountService;
+import java.util.List;
 
 @RestController
 @RequestMapping("/userAccount")
@@ -27,4 +30,25 @@ public class UserAccountController extends BaseController {
     public HttpResponseResult<UserAccountVo> detail(@PathVariable("id") Long id) {
     	return succeed(userAccountService.detail(id));
 	}
+
+
+    /**
+     * 设置商城收入分润
+     */
+    @PostMapping("/mallRecord")
+    public HttpResponseResult<Boolean> mallRecord(@RequestBody List<MallOrderItemDto> shareDto ) {
+        return succeed(userAccountService.saveMallAccountRecord(shareDto));
+    }
+
+
+
+    /**
+     * 设置商城收入状态
+     */
+    @PostMapping("/mallRecordState")
+    public HttpResponseResult<Boolean> mallRecordState(@RequestBody List<MallOrderItemDto> shareDto ) {
+        userAccountService.mallTeacherRecordState(shareDto);
+        return succeed();
+    }
+
 }

+ 14 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UserAccountRecordController.java

@@ -2,12 +2,17 @@ package com.yonge.cooleshow.admin.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dto.req.TotalReq;
+import com.yonge.cooleshow.biz.dal.vo.UserAccountVo;
+import com.yonge.cooleshow.biz.dal.vo.res.AccountTotal;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.page.PageInfo;
 import io.swagger.annotations.*;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
@@ -15,6 +20,8 @@ import com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo;
 import com.yonge.cooleshow.biz.dal.dto.search.UserAccountRecordSearch;
 import com.yonge.cooleshow.biz.dal.service.UserAccountRecordService;
 
+import javax.validation.Valid;
+
 @RestController
 @RequestMapping("/userAccountRecord")
 @Api(value = "用户账户流水表", tags = "用户账户流水表")
@@ -44,4 +51,11 @@ public class UserAccountRecordController extends BaseController {
         return succeed(PageUtil.pageInfo(pages));
 	}
 
+    @ApiOperation(value = "收入数据统计")
+    @PostMapping("/accountTotal")
+    @PreAuthorize("@pcs.hasPermissions('userAccountRecord/accountTotal')")
+    public HttpResponseResult<UserAccountVo> accountTotal(@RequestBody UserAccountRecordSearch query) {
+        return userAccountRecordService.accountTotal(query);
+    }
+
 }

+ 17 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/PlatformCashAccountRecordDao.java

@@ -1,7 +1,12 @@
 package com.yonge.cooleshow.biz.dal.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.biz.dal.dto.search.PlatformCashAccountRecordSearch;
 import com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord;
+import com.yonge.cooleshow.biz.dal.vo.PlatformCashAccountRecordSummaryVo;
+
+import io.swagger.models.auth.In;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -15,5 +20,17 @@ import java.util.List;
 public interface PlatformCashAccountRecordDao extends BaseMapper<PlatformCashAccountRecord> {
 
     int insertBatch(@Param("entities") List<PlatformCashAccountRecord> entities);
+    
+    int batchUpdate(List<PlatformCashAccountRecord> list);
+
+    IPage<PlatformCashAccountRecord> queryPage(@Param("page") IPage<PlatformCashAccountRecord> page, @Param("param") PlatformCashAccountRecordSearch query);
+
+    PlatformCashAccountRecordSummaryVo querySummary(@Param("param") PlatformCashAccountRecordSearch query);
+
+    List<PlatformCashAccountRecord> queryByBizTypeAndPaymentDays(@Param("bizType")String bizType, @Param("paymentDays")int paymentDays);
+
+    Integer cancelRecord(@Param("orderNo")String orderNo,@Param("bizType") String bizType, @Param("bizId") Long bizId);
+
+    Integer mallRecordedRecord(@Param("orderNo")String orderNo,@Param("bizType") String bizType, @Param("bizId") Long bizId);
 }
 

+ 2 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserAccountDao.java

@@ -77,8 +77,8 @@ public interface UserAccountDao extends BaseMapper<UserAccount>{
     List<AccountTotal> accountTotal(@Param("timeType")String timeType,@Param("param")TotalReq totalReq);
 	/**
 	 * 统计本次变更前已经变更的金额
-	 * @param accountRecordDto
+	 * @param orderNo
 	 * @return
 	 */
-    BigDecimal totalTransAmount(@Param("param") UserAccountRecordDto accountRecordDto);
+    BigDecimal totalTransAmountByOrderNo(@Param("orderNo") String orderNo);
 }

+ 5 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserAccountRecordDao.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.biz.dal.enums.AccountBizTypeEnum;
 import com.yonge.cooleshow.biz.dal.vo.TeacherEarningVo;
+import com.yonge.cooleshow.biz.dal.vo.UserAccountVo;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import org.apache.ibatis.annotations.Param;
 import com.yonge.cooleshow.biz.dal.entity.UserAccountRecord;
@@ -41,6 +42,8 @@ public interface UserAccountRecordDao extends BaseMapper<UserAccountRecord> {
 
     List<UserAccountRecordVo> selectAllPage(@Param("param") UserAccountRecordSearch userAccountRecord);
 
+
+    UserAccountVo accountTotal(@Param("param") UserAccountRecordSearch param);
     /**
      * app查询详情
      *
@@ -94,4 +97,6 @@ public interface UserAccountRecordDao extends BaseMapper<UserAccountRecord> {
     UserAccountRecordVo detailByBiz(@Param("orderNo") String orderNo,
                                     @Param("bizType") AccountBizTypeEnum bizType,
                                     @Param("bizId") Long bizId);
+
+
 }

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderReq.java

@@ -32,7 +32,7 @@ public class OrderReq {
     @ApiModelProperty(value = "订单名称 ", required = true)
     private String orderName;
     @NotNull(message = "订单类型不能为空")
-    @ApiModelProperty(value = "订单类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ) 老师端(PINAO_ROOM、琴房时长)", required = true)
+    @ApiModelProperty(value = "订单类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ) 老师端(VIP、开通会员 PINAO_ROOM、琴房时长)", required = true)
     private OrderTypeEnum orderType;
     @ApiModelProperty(value = "订单描述信息 ")
     private String orderDesc;

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

@@ -0,0 +1,87 @@
+package com.yonge.cooleshow.biz.dal.dto.search;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+import com.yonge.toolset.base.page.QueryInfo;
+
+public class PlatformCashAccountRecordSearch extends QueryInfo {
+
+	@ApiModelProperty("关联订单号")
+	private String orderNo;
+	
+	@ApiModelProperty("业务编号")
+	private Long bizId;
+	
+	@ApiModelProperty("收支类型(IN-收入  OUT-支出)")
+	private String inOrOut;
+	
+	@ApiModelProperty("业务类型:PRACTICE、陪练课 LIVE、直播课 VIDEO、视频课 MUSIC、乐谱")
+	private String bizType;
+	
+	@ApiModelProperty("入账状态 WAIT 待入账 RECORDED 已入账 CANCEL 取消")
+	private String status;
+	
+	@ApiModelProperty("记录开始时间")
+	private Date startDate;
+	
+	@ApiModelProperty("记录结束时间")
+	private Date endDate;
+
+	public String getOrderNo() {
+		return orderNo;
+	}
+
+	public void setOrderNo(String orderNo) {
+		this.orderNo = orderNo;
+	}
+
+	public Long getBizId() {
+		return bizId;
+	}
+
+	public void setBizId(Long bizId) {
+		this.bizId = bizId;
+	}
+
+	public String getInOrOut() {
+		return inOrOut;
+	}
+
+	public void setInOrOut(String inOrOut) {
+		this.inOrOut = inOrOut;
+	}
+
+	public String getBizType() {
+		return bizType;
+	}
+
+	public void setBizType(String bizType) {
+		this.bizType = bizType;
+	}
+
+	public String getStatus() {
+		return status;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
+
+	public Date getStartDate() {
+		return startDate;
+	}
+
+	public void setStartDate(Date startDate) {
+		this.startDate = startDate;
+	}
+
+	public Date getEndDate() {
+		return endDate;
+	}
+
+	public void setEndDate(Date endDate) {
+		this.endDate = endDate;
+	}
+}

+ 43 - 26
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/PlatformCashAccountRecord.java

@@ -1,16 +1,19 @@
 package com.yonge.cooleshow.biz.dal.entity;
 
 
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
 import com.baomidou.mybatisplus.annotation.TableId;
-
-import java.io.Serializable;
+import com.yonge.cooleshow.biz.dal.enums.AccountBizTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
 
 /**
  * 平台账户流水表(PlatformCashAccountRecord)表实体类
@@ -34,15 +37,15 @@ public class PlatformCashAccountRecord implements Serializable {
 
     @TableField("in_or_out_")
     @ApiModelProperty(value = "收支类型:IN、收入 OUT、支出")
-    private String inOrOut;
+    private InOrOutEnum inOrOut;
 
     @TableField("post_status_")
     @ApiModelProperty(value = "入账状态 WAIT 待入账 RECORDED 已入账 CANCEL 取消")
-    private String postStatus;
+    private PostStatusEnum postStatus;
 
     @TableField("biz_type_")
     @ApiModelProperty(value = "业务类型:PRACTICE、陪练课 LIVE、直播课 VIDEO、视频课 MUSIC、乐谱")
-    private String bizType;
+    private AccountBizTypeEnum bizType;
 
     @TableField("biz_id_")
     @ApiModelProperty(value = "业务id(陪练课,直播课course_schedule_id_ | 视频课,乐谱为课程组曲子id | 提现为提现记录id)")
@@ -64,6 +67,20 @@ public class PlatformCashAccountRecord implements Serializable {
     @ApiModelProperty(value = "修改时间")
     private Date updateTime;
 
+    public PlatformCashAccountRecord() {
+    }
+
+    public PlatformCashAccountRecord(Long accountId, BigDecimal transAmount, InOrOutEnum inOrOut, PostStatusEnum postStatus, AccountBizTypeEnum bizType, Long bizId, String orderNo) {
+        this.accountId = accountId;
+        this.transAmount = transAmount;
+        this.inOrOut = inOrOut;
+        this.postStatus = postStatus;
+        this.bizType = bizType;
+        this.bizId = bizId;
+        this.orderNo = orderNo;
+        this.createTime = new Date();
+        this.updateTime = new Date();
+    }
 
     public Long getId() {
         return id;
@@ -89,31 +106,31 @@ public class PlatformCashAccountRecord implements Serializable {
         this.transAmount = transAmount;
     }
 
-    public String getInOrOut() {
-        return inOrOut;
-    }
+    public InOrOutEnum getInOrOut() {
+		return inOrOut;
+	}
 
-    public void setInOrOut(String inOrOut) {
-        this.inOrOut = inOrOut;
-    }
+	public void setInOrOut(InOrOutEnum inOrOut) {
+		this.inOrOut = inOrOut;
+	}
 
-    public String getPostStatus() {
-        return postStatus;
-    }
+	public PostStatusEnum getPostStatus() {
+		return postStatus;
+	}
 
-    public void setPostStatus(String postStatus) {
-        this.postStatus = postStatus;
-    }
+	public void setPostStatus(PostStatusEnum postStatus) {
+		this.postStatus = postStatus;
+	}
 
-    public String getBizType() {
-        return bizType;
-    }
+	public AccountBizTypeEnum getBizType() {
+		return bizType;
+	}
 
-    public void setBizType(String bizType) {
-        this.bizType = bizType;
-    }
+	public void setBizType(AccountBizTypeEnum bizType) {
+		this.bizType = bizType;
+	}
 
-    public Long getBizId() {
+	public Long getBizId() {
         return bizId;
     }
 

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

@@ -42,7 +42,7 @@ public class UserOrder implements Serializable {
     @ApiModelProperty("下单应用:STUDENT 学生端 TEACHER 老师端")
     @TableField(value = "order_client_")
     private ClientEnum orderClient;
-    @ApiModelProperty("订单类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ) 老师端(PINAO_ROOM、琴房时长)")
+    @ApiModelProperty("订单类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ) 老师端(VIP、开通会员 PINAO_ROOM、琴房时长)")
     @TableField(value = "order_type_")
     private OrderTypeEnum orderType;
     @ApiModelProperty("订单描述信息 ")

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

@@ -32,7 +32,7 @@ public class UserOrderDetail implements Serializable {
     @ApiModelProperty("卖家id ")
     @TableField(value = "merch_id_")
     private Long merchId;
-    @ApiModelProperty("订单类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ) 老师端(PINAO_ROOM、琴房时长)")
+    @ApiModelProperty("订单类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ) 老师端(VIP、开通会员 PINAO_ROOM、琴房时长)")
     @TableField(value = "good_type_")
     private GoodTypeEnum goodType;
     @ApiModelProperty("业务id ")

+ 16 - 19
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/AccountBizTypeEnum.java

@@ -10,29 +10,30 @@ import com.yonge.toolset.base.enums.BaseEnum;
  * @Data: 2022/4/7 15:48
  */
 public enum AccountBizTypeEnum implements BaseEnum<String, AccountBizTypeEnum> {
-    PRACTICE("陪练课", InOrOutEnum.IN),
-    LIVE("直播课", InOrOutEnum.IN),
-    VIDEO("视频课", InOrOutEnum.IN),
-    MUSIC("乐谱", InOrOutEnum.IN),
-    WITHDRAWAL("结算", InOrOutEnum.OUT),
-
-    LIVE_SHARE("直播课分润", InOrOutEnum.IN),
-    VIDEO_SHARE("视频课分润", InOrOutEnum.IN),
-    MUSIC_SHARE("乐谱分润", InOrOutEnum.IN),
-    VIP_SHARE("会员分润", InOrOutEnum.IN),
-    MALL_SHARE("商品分润", InOrOutEnum.IN),
+
+    PRACTICE("陪练课"),
+    LIVE("直播课"),
+    VIDEO("视频课"),
+    MUSIC("乐谱"),
+    VIP("会员充值"),
+    MALL("商品购买"),
+    PIAON_ROOM("琴房充值"),
+    WITHDRAWAL("结算"),
+
+    LIVE_SHARE("直播课分润"),
+    VIDEO_SHARE("视频课分润"),
+    MUSIC_SHARE("乐谱分润"),
+    VIP_SHARE("会员分润"),
+    MALL_SHARE("商品分润"),
 
     ;
     @EnumValue
     private String code;
     private String msg;
-    //收入、支出
-    private InOrOutEnum inOrOut;
 
-    AccountBizTypeEnum(String msg, InOrOutEnum inOrOut) {
+    AccountBizTypeEnum(String msg) {
         this.code = this.name();
         this.msg = msg;
-        this.inOrOut = inOrOut;
     }
 
     @Override
@@ -43,8 +44,4 @@ public enum AccountBizTypeEnum implements BaseEnum<String, AccountBizTypeEnum> {
     public String getMsg() {
         return this.msg;
     }
-
-    public InOrOutEnum getInOrOut() {
-        return this.inOrOut;
-    }
 }

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

@@ -15,7 +15,8 @@ public enum GoodTypeEnum implements BaseEnum<String, GoodTypeEnum> {
     LIVE("直播课购买"),
     VIDEO("视频课购买"),
     MUSIC("单曲点播"),
-    PINAO_ROOM("琴房时长");
+    PINAO_ROOM("琴房时长"),
+    MALL("商城");
     @EnumValue
     private String code;
     private String msg;

+ 31 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/PlatformCashAccountRecordService.java

@@ -1,9 +1,13 @@
 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.dao.PlatformCashAccountRecordDao;
+import com.yonge.cooleshow.biz.dal.dto.search.PlatformCashAccountRecordSearch;
 import com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord;
+import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
+import com.yonge.cooleshow.biz.dal.vo.PlatformCashAccountRecordSummaryVo;
 
 /**
  * 平台账户流水表(PlatformCashAccountRecord)表服务接口
@@ -14,5 +18,32 @@ import com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord;
 public interface PlatformCashAccountRecordService extends IService<PlatformCashAccountRecord> {
 
     PlatformCashAccountRecordDao getDao();
+    
+    IPage<PlatformCashAccountRecord> queryPage(IPage<PlatformCashAccountRecord> page, PlatformCashAccountRecordSearch query);
+    
+    PlatformCashAccountRecordSummaryVo querySummary(PlatformCashAccountRecordSearch query);
+    
+    /**
+     * 更新待入账记录
+     * @return
+     */
+    boolean updateWaitRecord();
+
+    /**
+     * 取消入账
+     * @param orderNo
+     * @param bizType
+     * @param bizId
+     */
+    void cancelRecord(String orderNo, String bizType, Long bizId);
+
+    /**
+     * 设置商城预收-> 实收
+     *
+     * @param productSkuId 商城商品skuid
+     * @param orderSn 订单
+     * @param goodType
+     */
+    void mallRecordedRecord(Long productSkuId, String orderSn, String goodType);
 }
 

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

@@ -7,7 +7,10 @@ import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo;
 import com.yonge.cooleshow.biz.dal.dto.search.UserAccountRecordSearch;
 import com.yonge.cooleshow.biz.dal.entity.UserAccountRecord;
+import com.yonge.cooleshow.biz.dal.vo.UserAccountVo;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
+import com.yonge.cooleshow.biz.dal.vo.res.AccountTotal;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
 
 import java.math.BigDecimal;
 import java.util.List;
@@ -73,4 +76,7 @@ public interface UserAccountRecordService extends IService<UserAccountRecord> {
      * 通过订单详情查询该详情对应的所有账户记录
      */
     List<UserAccountRecord> selectRecordByOrderDetail(UserOrderDetailVo userOrderDetailVo);
+
+
+    HttpResponseResult<UserAccountVo> accountTotal(UserAccountRecordSearch query);
 }

+ 19 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserAccountService.java

@@ -10,8 +10,11 @@ import com.yonge.cooleshow.biz.dal.dto.search.UserAccountSearch;
 import com.yonge.cooleshow.biz.dal.entity.UserAccount;
 import com.yonge.cooleshow.biz.dal.vo.res.AccountTotal;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.entity.MallOrderItemDto;
 import com.yonge.cooleshow.common.enums.PostStatusEnum;
 
+import java.util.List;
+
 /**
  * 用户账户表 服务类
  * 入账逻辑:
@@ -55,8 +58,9 @@ public interface UserAccountService extends IService<UserAccount>  {
      * @author liweifan
      * @date 2022-07-20
      */
-    HttpResponseResult<UserAccountRecord> accountRecord(UserAccountRecordDto accountRecordDto);
+    HttpResponseResult accountRecord(UserAccountRecordDto accountRecordDto);
 
+    HttpResponseResult<UserAccountRecord> accountRecord(List<UserAccountRecordDto> accountRecordDtos);
     /***
      * 入账结算(入账状态变更)
      * @author liweifan
@@ -74,4 +78,18 @@ public interface UserAccountService extends IService<UserAccount>  {
      * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<com.yonge.cooleshow.biz.dal.vo.res.AccountTotal>
      */
     HttpResponseResult<AccountTotal> accountTotal(TotalReq totalReq);
+
+
+    /**
+     * 设置老师分润状态
+     *
+     * @param shareDto 老师状态
+     * @return
+     */
+    void mallTeacherRecordState(List<MallOrderItemDto> shareDto);
+    /**
+     * 记录平台收入和用户分润收入
+     * @return
+     */
+    boolean saveMallAccountRecord(List<MallOrderItemDto> shareDto);
 }

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

@@ -7,6 +7,7 @@ import com.yonge.cooleshow.biz.dal.dto.req.OrderPayReq;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderRefundReq;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.entity.UserOrder;
+import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
@@ -14,8 +15,10 @@ import com.yonge.cooleshow.biz.dal.vo.res.OrderPayRes;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
 import org.apache.ibatis.annotations.Param;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -166,4 +169,6 @@ public interface UserOrderService extends IService<UserOrder> {
      */
     void orderSuccess(UserOrderVo detail, PaymentCallBack data);
 
+
+    public BigDecimal getShareFreeByGoodType(GoodTypeEnum goodType);
 }

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

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.alipay.api.domain.AccountRecord;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -12,6 +13,7 @@ import com.yonge.cooleshow.biz.dal.dao.CourseGroupDao;
 import com.yonge.cooleshow.biz.dal.dto.CheckCourseTimeDto;
 import com.yonge.cooleshow.biz.dal.dto.LiveCourseGroupDto;
 import com.yonge.cooleshow.biz.dal.dto.LiveCourseGroupDto.CoursePlanDto;
+import com.yonge.cooleshow.biz.dal.dto.UserAccountRecordDto;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderRefundReq;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.dto.search.*;
@@ -24,6 +26,7 @@ import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
 import com.yonge.cooleshow.biz.dal.vo.res.RefundCreateRes;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.base.string.MessageFormatter;
@@ -91,9 +94,10 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
     private SysMessageService sysMessageService;
     @Autowired
     private ImGroupMemberService imGroupMemberService;
-
     @Autowired
     private UserOrderRefundService userOrderRefundService;
+    @Autowired
+    private UserAccountService userAccountService;
 
     @Override
     public CourseGroupDao getDao() {
@@ -791,11 +795,25 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
             teacherSalaryList.add(teacherSalary);
         });
         courseScheduleTeacherSalaryService.getDao().insertBatch(teacherSalaryList);
+        //写老师账户
+        addTeacherAccount(orderParam, teacherSalaryList, totalExpectPrice);
         log.info("buyLiveCourseSuccess ok");
         //课程购买成功后进行消息推送
         buyLiveSendMessage(studentPayment, courseGroup);
     }
 
+    //写入老师账户
+    private void addTeacherAccount(UserOrderDetailVo orderParam, List<CourseScheduleTeacherSalary> teacherSalaryList, BigDecimal totalExpectPrice) {
+        //老师待入账
+        List<UserAccountRecordDto> userAccountRecordDtos = new ArrayList<>();
+        for (CourseScheduleTeacherSalary salary : teacherSalaryList) {
+            UserAccountRecordDto dto = new UserAccountRecordDto(orderParam.getMerchId(), PostStatusEnum.WAIT, salary.getActualSalary(),
+                    InOrOutEnum.IN, AccountBizTypeEnum.LIVE, salary.getCourseScheduleId(), orderParam.getGoodName(), orderParam.getOrderNo());
+            userAccountRecordDtos.add(dto);
+        }
+        userAccountService.accountRecord(userAccountRecordDtos);
+    }
+
     /**
      * 课程购买成功后进行消息推送
      *
@@ -1025,8 +1043,8 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
             try {
                 this.updateById(courseGroup);
             } catch (Exception e) {
-                log.error("openCourseGroup error >>> courseGroup: {} ",  JSON.toJSONString(courseGroup));
-                log.error("openCourseGroup error >>> ",  e.getCause());
+                log.error("openCourseGroup error >>> courseGroup: {} ", JSON.toJSONString(courseGroup));
+                log.error("openCourseGroup error >>> ", e.getCause());
             }
         });
     }
@@ -1073,8 +1091,8 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
                 courseGroup.setUpdatedTime(new Date());
                 this.updateById(courseGroup);
             } catch (Exception e) {
-                log.error("closeCourseGroup error >>> courseGroup: {} ",  JSON.toJSONString(courseGroup));
-                log.error("closeCourseGroup error >>> ",  e.getCause());
+                log.error("closeCourseGroup error >>> courseGroup: {} ", JSON.toJSONString(courseGroup));
+                log.error("closeCourseGroup error >>> ", e.getCause());
             }
         });
     }

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

@@ -1121,6 +1121,9 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         courseScheduleTeacherSalaryService.getDao().insertBatch(teacherSalaryList);
         log.info("buyPracticeCourseSuccess ok");
 
+        //写老师账户
+        addTeacherAccount(orderParam, teacherSalaryList);
+
         Set<Long> studentIds = new HashSet();
         studentIds.add(studentId);
         try {
@@ -1138,6 +1141,18 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         }
     }
 
+    //写入老师账户
+    private void addTeacherAccount(UserOrderDetailVo orderParam, List<CourseScheduleTeacherSalary> teacherSalaryList) {
+        //老师待入账
+        List<UserAccountRecordDto> userAccountRecordDtos = new ArrayList<>();
+        for (CourseScheduleTeacherSalary salary : teacherSalaryList) {
+            UserAccountRecordDto dto = new UserAccountRecordDto(orderParam.getMerchId(), PostStatusEnum.WAIT, salary.getActualSalary(),
+                    InOrOutEnum.IN, AccountBizTypeEnum.LIVE, salary.getCourseScheduleId(), orderParam.getGoodName(), orderParam.getOrderNo());
+            userAccountRecordDtos.add(dto);
+        }
+        userAccountService.accountRecord(userAccountRecordDtos);
+    }
+
     /**
      * 学生购买陪练课-失败-回调
      */

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

@@ -7,6 +7,9 @@ import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
+import com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord;
+import com.yonge.cooleshow.biz.dal.entity.VipCardRecord;
+import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.service.*;
 
 import com.yonge.cooleshow.biz.dal.vo.ShareProfitVo;
@@ -19,6 +22,7 @@ import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.string.MessageFormatter;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import com.yonge.toolset.utils.date.DateUtil;
 import org.springframework.beans.BeanUtils;
@@ -109,11 +113,6 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
 
         //会员购买记录入库
         vipCardRecordService.save(vipCardRecord);
-        //记录平台收入
-        PlatformCashAccountRecord platformCashAccountRecord = new PlatformCashAccountRecord();
-        platformCashAccountRecord.setAccountId(orderDetailVo.getUserId());
-//        platformCashAccountRecord.setTransAmount(ClientEnum.STUDENT.getCode());
-//        platformCashAccountRecordService.save();
         //会员购买消息推送
         authSend(userVipInfoVo.getUserId(), userVipInfoVo.getPhone(), DateUtil.format(vipCardRecord.getEndTime(), DateUtil.DEFAULT_PATTERN),orderDetailVo.getOrderClient());
     }

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

@@ -235,7 +235,6 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
             }
         } else if (ChargeTypeEnum.VIP.getCode().equals(detail.getChargeType().getCode())) {
             // 会员 判断是否为会员, 会员可播放
-            // todo 老师会员判断
             if (userType.equals(ClientEnum.STUDENT)) {
                 StudentVo studentVo = studentService.detail(studentId);
                 if (studentVo != null && YesOrNoEnum.YES.getCode().equals(studentVo.getIsVip().getCode())) {
@@ -480,9 +479,10 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
         // 检查已经购买
         checkoutPay(orderReqInfo.getUserId(), musicSheetPayDto.getMusicSheetId(),musicSheetPayDto.getClientType());
 
-
         orderCreateRes.setRes(true);
-        orderCreateRes.setMerchId(musicSheet.getUserId());
+        if (!musicSheet.getSourceType().getCode().equals(SourceTypeEnum.PLATFORM.getCode())) {
+            orderCreateRes.setMerchId(musicSheet.getUserId());
+        }
         orderCreateRes.setGoodType(orderCreateRes.getGoodType());
         orderCreateRes.setBizId(musicSheet.getId());
         orderCreateRes.setGoodNum(1);
@@ -622,40 +622,11 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
      */
     private void addTeacherAccount(UserOrderDetailVo userOrderDetailVo, BigDecimal actualPrice, BigDecimal serviceFeeAmount,
                                    Long musicSheetId) {
-
         BigDecimal transAmount = actualPrice.subtract(serviceFeeAmount).setScale(2, RoundingMode.HALF_UP);
-
-        //插入老师账户变更记录
-        HttpResponseResult<UserAccountRecord> recordRes = userAccountService.accountRecord(
+        //插入老师账户变更记录-老师预收
+        userAccountService.accountRecord(
                 new UserAccountRecordDto(userOrderDetailVo.getMerchId(), PostStatusEnum.WAIT, transAmount, InOrOutEnum.IN,
                         AccountBizTypeEnum.MUSIC, musicSheetId, userOrderDetailVo.getGoodName(), userOrderDetailVo.getOrderNo()));
-
-        if (recordRes.getStatus()) {
-            userAccountService.accountChange(recordRes.getData().getId(), PostStatusEnum.RECORDED);
-        }
-
-        //todo 插入平台实收
-
-        //判断是否分润
-        if (null != userOrderDetailVo.getRecomUserId()) {
-            // 分润比例
-            BigDecimal shareFeeRate = new BigDecimal(sysConfigService.findConfigValue(SysConfigConstant.MUSIC_SHARE_FEE))
-                    .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
-
-            //分润金额
-            BigDecimal shareFee = serviceFeeAmount.multiply(shareFeeRate).setScale(2, RoundingMode.HALF_UP);
-
-            //插入分润老师账户变更记录
-            HttpResponseResult<UserAccountRecord> recomRecordRes = userAccountService.accountRecord(
-                    new UserAccountRecordDto(userOrderDetailVo.getRecomUserId(), PostStatusEnum.WAIT, shareFee, InOrOutEnum.IN,
-                            AccountBizTypeEnum.MUSIC_SHARE, musicSheetId, userOrderDetailVo.getGoodName(), userOrderDetailVo.getOrderNo()));
-
-            if (recomRecordRes.getStatus()) {
-                userAccountService.accountChange(recomRecordRes.getData().getId(), PostStatusEnum.RECORDED);
-            }
-
-            //todo 插入平台分润支出
-        }
     }
 
     @Override

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

@@ -5,10 +5,14 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.entity.PianoRoomTime;
+import com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord;
+import com.yonge.cooleshow.biz.dal.enums.AccountBizTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.vo.*;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.slf4j.Logger;
@@ -31,6 +35,8 @@ public class PianoRoomBuyRecordServiceImpl extends ServiceImpl<PianoRoomBuyRecor
     private PianoRoomTimeService pianoRoomTimeService;
     @Autowired
     private TeacherService teacherService;
+    @Autowired
+    private PlatformCashAccountRecordService platformCashAccountRecordService;
 
     @Override
     public PianoRoomBuyRecordVo detail(Long id) {
@@ -89,6 +95,11 @@ public class PianoRoomBuyRecordServiceImpl extends ServiceImpl<PianoRoomBuyRecor
             pianoRoomTime.setUpdateTime(new Date());
             pianoRoomTimeService.updateById(pianoRoomTime);
         }
+
+        //计入平台实收
+        PlatformCashAccountRecord platformCashAccountRecord = new PlatformCashAccountRecord(orderDetailVo.getUserId(), orderDetailVo.getExpectPrice(),
+                InOrOutEnum.IN, PostStatusEnum.RECORDED, AccountBizTypeEnum.PIAON_ROOM, orderDetailVo.getBizId(), orderDetailVo.getOrderNo());
+        platformCashAccountRecordService.save(platformCashAccountRecord);
     }
 
 }

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

@@ -1,13 +1,32 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
+import com.yonge.toolset.base.util.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.biz.dal.dao.PlatformCashAccountRecordDao;
+import com.yonge.cooleshow.biz.dal.dto.search.PlatformCashAccountRecordSearch;
 import com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord;
+import com.yonge.cooleshow.biz.dal.entity.SysConfig;
+import com.yonge.cooleshow.biz.dal.enums.AccountBizTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.PlatformCashAccountRecordService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
+import com.yonge.cooleshow.biz.dal.service.SysConfigService;
+import com.yonge.cooleshow.biz.dal.vo.PlatformCashAccountRecordSummaryVo;
+import com.yonge.cooleshow.common.constant.SysConfigConstant;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
 
 /**
  * 平台账户流水表(PlatformCashAccountRecord)表服务实现类
@@ -20,10 +39,93 @@ public class PlatformCashAccountRecordServiceImpl extends ServiceImpl<PlatformCa
 
     private final static Logger log = LoggerFactory.getLogger(PlatformCashAccountRecordServiceImpl.class);
 
+    @Autowired
+    private SysConfigService sysConfigService;
+
     @Override
     public PlatformCashAccountRecordDao getDao() {
         return this.baseMapper;
     }
 
+    @Override
+    public IPage<PlatformCashAccountRecord> queryPage(IPage<PlatformCashAccountRecord> page, PlatformCashAccountRecordSearch query) {
+        return getDao().queryPage(page, query);
+    }
+
+    @Override
+    public PlatformCashAccountRecordSummaryVo querySummary(PlatformCashAccountRecordSearch query) {
+        return getDao().querySummary(query);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean updateWaitRecord() {
+        List<String> paramNames = new ArrayList<String>();
+        paramNames.add(SysConfigConstant.MALL_ACCOUNT_PERIOD);
+        paramNames.add(SysConfigConstant.MUSIC_ACCOUNT_PERIOD);
+        paramNames.add(SysConfigConstant.VIP_ACCOUNT_PERIOD);
+        paramNames.add(SysConfigConstant.VIDEO_ACCOUNT_PERIOD);
+        paramNames.add(SysConfigConstant.LIVE_ACCOUNT_PERIOD);
+
+        List<SysConfig> sysConfigs = sysConfigService.findByParamName(paramNames);
+
+        Map<String, String> configMap = sysConfigs.stream().collect(Collectors.toMap(SysConfig::getParamName, SysConfig::getParamValue));
+
+        List<PlatformCashAccountRecord> list = new ArrayList<PlatformCashAccountRecord>();
+        //根据不同类型(业务类型:PRACTICE、陪练课 LIVE、直播课 VIDEO、视频课 MUSIC、乐谱)查询超过账期待结算的记录
+        // List<PlatformCashAccountRecord> list1 = getDao().queryByBizTypeAndPaymentDays(AccountBizTypeEnum.MALL_SHARE.getCode(), Integer.parseInt(configMap.get(SysConfigConstant.MALL_ACCOUNT_PERIOD).toString()));
+        List<PlatformCashAccountRecord> list2 = getDao().queryByBizTypeAndPaymentDays(AccountBizTypeEnum.MUSIC_SHARE.getCode(), Integer.parseInt(configMap.get(SysConfigConstant.MUSIC_ACCOUNT_PERIOD).toString()));
+        List<PlatformCashAccountRecord> list3 = getDao().queryByBizTypeAndPaymentDays(AccountBizTypeEnum.VIP_SHARE.getCode(), Integer.parseInt(configMap.get(SysConfigConstant.VIP_ACCOUNT_PERIOD).toString()));
+        List<PlatformCashAccountRecord> list4 = getDao().queryByBizTypeAndPaymentDays(AccountBizTypeEnum.VIDEO_SHARE.getCode(), Integer.parseInt(configMap.get(SysConfigConstant.VIDEO_ACCOUNT_PERIOD).toString()));
+        List<PlatformCashAccountRecord> list5 = getDao().queryByBizTypeAndPaymentDays(AccountBizTypeEnum.LIVE_SHARE.getCode(), Integer.parseInt(configMap.get(SysConfigConstant.LIVE_ACCOUNT_PERIOD).toString()));
+
+        // if (list1.size() > 0) {
+        //     list.addAll(list1);
+        // }
+        if (list2.size() > 0) {
+            list.addAll(list2);
+        }
+        if (list3.size() > 0) {
+            list.addAll(list3);
+        }
+        if (list4.size() > 0) {
+            list.addAll(list4);
+        }
+        if (list5.size() > 0) {
+            list.addAll(list5);
+        }
+
+        if (list.size() > 0) {
+            Date date = new Date();
+            List<PlatformCashAccountRecord> batchUpdateList = new ArrayList<PlatformCashAccountRecord>();
+
+            for (PlatformCashAccountRecord pcar : list) {
+                //预收改成实收
+                pcar.setPostStatus(PostStatusEnum.RECORDED);
+                pcar.setUpdateTime(date);
+                batchUpdateList.add(pcar);
+            }
+
+            if (batchUpdateList.size() > 0) {
+                getDao().batchUpdate(batchUpdateList);
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public void cancelRecord(String orderNo, String bizType, Long bizId) {
+        if(StringUtil.isEmpty(orderNo) || StringUtil.isEmpty(bizType) || null == bizId){
+            return;
+        }
+        baseMapper.cancelRecord(orderNo, bizType, bizId);
+        baseMapper.cancelRecord(orderNo, bizType + "_SHARE", bizId);
+    }
+
+    @Override
+    public void mallRecordedRecord(Long productSkuId, String orderSn, String goodType) {
+
+        baseMapper.mallRecordedRecord(orderSn, goodType, productSkuId);
+    }
 }
 

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

@@ -24,6 +24,7 @@ import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.util.StringUtil;
+import com.yonge.toolset.utils.date.DateUtil;
 import com.yonge.toolset.utils.idcard.IdcardInfoExtractor;
 import com.yonge.toolset.utils.string.ValueUtil;
 import org.redisson.api.RMap;
@@ -114,7 +115,8 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
         teacherHomeVo.setIdCardNo(ValueUtil.fuzzyIdCard(teacherHomeVo.getIdCardNo()));
         teacherHomeVo.setPhone(ValueUtil.fuzzyMobile(teacherHomeVo.getPhone()));
         teacherHomeVo.setHeardUrl(teacher.getAvatar());
-
+        int num = DateUtil.daysBetween(new Date(), teacher.getMembershipEndTime());
+        teacherHomeVo.setMembershipDays(num < 0 ? 0 : num);
         if (YesOrNoEnum.YES.equals(teacher.getEntryFlag())) {
             teacherHomeVo.setEntryStatus(AuthStatusEnum.PASS);
         } else {

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

@@ -11,7 +11,9 @@ import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
 import com.yonge.cooleshow.biz.dal.service.SysMessageService;
 import com.yonge.cooleshow.biz.dal.vo.TeacherEarningVo;
+import com.yonge.cooleshow.biz.dal.vo.UserAccountVo;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -67,6 +69,11 @@ public class UserAccountRecordServiceImpl extends ServiceImpl<UserAccountRecordD
     }
 
     @Override
+    public HttpResponseResult<UserAccountVo> accountTotal(UserAccountRecordSearch query) {
+        return HttpResponseResult.succeed(baseMapper.accountTotal(query));
+    }
+
+    @Override
     public UserAccountRecordVo appDetail(Long id){
         UserAccountRecordVo detail = baseMapper.appDetail(id);
         return detail;
@@ -108,7 +115,7 @@ public class UserAccountRecordServiceImpl extends ServiceImpl<UserAccountRecordD
     @Override
     public List<UserAccountRecord> selectRecordByOrderDetail(UserOrderDetailVo userOrderDetailVo) {
         //todo 这里需要测试
-        //订单类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ) 老师端(PINAO_ROOM、琴房时长)
+        //订单类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ) 老师端(VIP、开通会员 PINAO_ROOM、琴房时长)
         //获取业务id
         List<Long> bizIds = new ArrayList<>();
         if (GoodTypeEnum.VIP.equals(userOrderDetailVo.getGoodType())
@@ -129,4 +136,6 @@ public class UserAccountRecordServiceImpl extends ServiceImpl<UserAccountRecordD
         return baseMapper.selectRecordByOrderDetail(userOrderDetailVo, bizIds);
     }
 
+
+
 }

+ 250 - 57
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserAccountServiceImpl.java

@@ -2,25 +2,27 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.biz.dal.dto.UserAccountRecordDto;
 import com.yonge.cooleshow.biz.dal.dto.req.TotalReq;
+import com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord;
 import com.yonge.cooleshow.biz.dal.entity.UserAccountRecord;
 import com.yonge.cooleshow.biz.dal.entity.UserOrder;
+import com.yonge.cooleshow.biz.dal.enums.AccountBizTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
-import com.yonge.cooleshow.biz.dal.service.UserOrderService;
+import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo;
-import com.yonge.cooleshow.biz.dal.vo.res.OrderPayRes;
+import com.yonge.cooleshow.common.entity.MallOrderItemDto;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
-import com.yonge.cooleshow.biz.dal.enums.FrozenTypeEnum;
-import com.yonge.cooleshow.biz.dal.service.UserAccountRecordService;
 import com.yonge.cooleshow.biz.dal.vo.res.AccountTotal;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.payment.util.DistributedLock;
-import org.redisson.api.RLock;
+import com.yonge.toolset.utils.collection.ListUtil;
 import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -30,15 +32,12 @@ import com.yonge.cooleshow.biz.dal.entity.UserAccount;
 import com.yonge.cooleshow.biz.dal.vo.UserAccountVo;
 import com.yonge.cooleshow.biz.dal.dto.search.UserAccountSearch;
 import com.yonge.cooleshow.biz.dal.dao.UserAccountDao;
-import com.yonge.cooleshow.biz.dal.service.UserAccountService;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
-import java.util.concurrent.*;
+import java.util.*;
+import java.util.stream.Collectors;
 
 
 @Service
@@ -52,6 +51,12 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
     @Autowired
     private UserOrderService orderService;
 
+    @Autowired
+    private PlatformCashAccountRecordService platformCashAccountRecordService;
+
+    @Autowired
+    private UserOrderService userOrderService;
+
     @Override
     public UserAccountVo detail(Long id) {
         UserAccountVo detail = baseMapper.detail(id);
@@ -67,66 +72,139 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
     }
 
     @Override
-    public HttpResponseResult<UserAccountRecord> accountRecord(UserAccountRecordDto accountRecordDto) {
-        if (null == accountRecordDto.getInOrOut()
-                || null == accountRecordDto.getPostStatus()
-                || (!PostStatusEnum.WAIT.equals(accountRecordDto.getPostStatus()) && !PostStatusEnum.FROZEN.equals(accountRecordDto.getPostStatus()))
-        ) {
-            throw new BizException("记录入账-入账状态异常: param is {}", JSONObject.toJSONString(accountRecordDto));
-        }
+    public HttpResponseResult accountRecord(UserAccountRecordDto accountRecordDto) {
+        return accountRecord(Arrays.asList(accountRecordDto));
+    }
 
-        if (null == accountRecordDto.getTransAmount() || null == accountRecordDto.getBizId()
-                || null == accountRecordDto.getBizType()) {
-            throw new BizException("记录入账-缺少入账参数: param is {}", JSONObject.toJSONString(accountRecordDto));
+    @Override
+    public HttpResponseResult accountRecord(List<UserAccountRecordDto> accountRecordDtos) {
+        if (CollectionUtils.isEmpty(accountRecordDtos)) {
+            return HttpResponseResult.succeed();
         }
-        if (BigDecimal.ZERO.compareTo(accountRecordDto.getTransAmount()) > 0) {
-            throw new BizException("记录入账-变动金额不能为负数: param is {}", JSONObject.toJSONString(accountRecordDto));
+        //校验参数
+        for (UserAccountRecordDto accountRecordDto : accountRecordDtos) {
+            if (null == accountRecordDto.getInOrOut()
+                    || null == accountRecordDto.getPostStatus()
+                    || (!PostStatusEnum.WAIT.equals(accountRecordDto.getPostStatus()) && !PostStatusEnum.FROZEN.equals(accountRecordDto.getPostStatus()))
+            ) {
+                throw new BizException("记录入账-入账状态异常: param is {}", JSONObject.toJSONString(accountRecordDto));
+            }
+
+            if (null == accountRecordDto.getTransAmount() || null == accountRecordDto.getBizId()
+                    || null == accountRecordDto.getBizType()) {
+                throw new BizException("记录入账-缺少入账参数: param is {}", JSONObject.toJSONString(accountRecordDto));
+            }
+            if (BigDecimal.ZERO.compareTo(accountRecordDto.getTransAmount()) > 0) {
+                if (null == accountRecordDto.getTransAmount() || null == accountRecordDto.getBizId()
+                        || null == accountRecordDto.getBizType()) {
+                    throw new BizException("记录入账-缺少入账参数: param is {}", JSONObject.toJSONString(accountRecordDto));
+                }
+                if (BigDecimal.ZERO.compareTo(accountRecordDto.getTransAmount()) < 0) {
+                    throw new BizException("记录入账-变动金额不能为负数: param is {}", JSONObject.toJSONString(accountRecordDto));
+                }
+            }
         }
+        //按照不同的账户分组
+        Map<Long, List<UserAccountRecordDto>> accountMap = accountRecordDtos.stream().collect(Collectors.groupingBy(UserAccountRecordDto::getAccountId));
+        Set<Long> accountIds = accountMap.keySet();
 
-        HttpResponseResult<UserAccountRecord> res = DistributedLock.of(redissonClient)
-                .runIfLockToFunction(CacheNameEnum.LOCK_RECORD_ACCOUNT.getRedisKey(accountRecordDto.getAccountId())
-                        , this::doAccountRecord, accountRecordDto, 10L);
-        if (null != res) {
-            return res;
-        } else {
-            throw new BizException("记录入账-插入账户记录失败: param is {}", JSONObject.toJSONString(accountRecordDto));
+        for (Long accountId : accountIds) {
+            List<UserAccountRecordDto> userAccountRecordDtos = accountMap.get(accountId);
+            HttpResponseResult<UserAccountRecord> res = DistributedLock.of(redissonClient)
+                    .runIfLockToFunction(CacheNameEnum.LOCK_RECORD_ACCOUNT.getRedisKey(accountId)
+                            , this::doAccountRecords, userAccountRecordDtos, 10L);
+            if (null != res) {
+                return res;
+            } else {
+                throw new BizException("记录入账-插入账户记录失败: param is {}", JSONObject.toJSONString(userAccountRecordDtos));
+            }
         }
+        return HttpResponseResult.succeed();
     }
 
+
     @Transactional(rollbackFor = Exception.class)
-    HttpResponseResult<UserAccountRecord> doAccountRecord(UserAccountRecordDto accountRecordDto) {
-        //收入要校验金额
-        if (InOrOutEnum.IN.equals(accountRecordDto.getInOrOut())) {
-            UserOrder userOrder = orderService.getOne(Wrappers.<UserOrder>lambdaQuery()
-                    .eq(UserOrder::getOrderNo, accountRecordDto.getOrderNo()));
-            if (null == userOrder) {
-                throw new BizException("记录入账-未找到入账对应订单信息: param is {}", JSONObject.toJSONString(accountRecordDto));
-            }
-            //收入判断订单金额,所有收入不能大于订单用户付款
-            BigDecimal totalTransAmount = baseMapper.totalTransAmount(accountRecordDto);
-            if (null == totalTransAmount) {
-                totalTransAmount = BigDecimal.ZERO;
+    HttpResponseResult doAccountRecords(List<UserAccountRecordDto> accountRecordDtos) {
+        if (CollectionUtils.isEmpty(accountRecordDtos)) {
+            return HttpResponseResult.succeed();
+        }
+        Long accountId = accountRecordDtos.get(0).getAccountId();
+        //收入入账
+        List<UserAccountRecordDto> collectIn = accountRecordDtos.stream().filter(dto -> InOrOutEnum.IN.equals(dto.getInOrOut())).collect(Collectors.toList());
+        //支出入账
+        List<UserAccountRecordDto> collectOut = accountRecordDtos.stream().filter(dto -> InOrOutEnum.OUT.equals(dto.getInOrOut())).collect(Collectors.toList());
+
+        //******************************************收入***********************************//
+        if (!CollectionUtils.isEmpty(collectIn)) {
+            //收入按照 业务类型-订单号-入账记录 进行分组
+            Map<AccountBizTypeEnum, Map<String, List<UserAccountRecordDto>>> collectInMap = collectIn.stream().collect(
+                    Collectors.groupingBy(UserAccountRecordDto::getBizType,
+                            Collectors.groupingBy(UserAccountRecordDto::getOrderNo)
+                    )
+            );
+
+            for (AccountBizTypeEnum bizType : collectInMap.keySet()) {
+                Map<String, List<UserAccountRecordDto>> collectBizTypeMap = collectInMap.get(bizType);
+                for (String orderNo : collectBizTypeMap.keySet()) {
+                    List<UserAccountRecordDto> userAccountRecords = collectBizTypeMap.get(orderNo);
+                    //本组入账金额
+                    BigDecimal transAmount = BigDecimal.ZERO;
+                    //冻结入账金额
+                    BigDecimal frozenTransAmount = BigDecimal.ZERO;
+
+                    for (UserAccountRecordDto o : userAccountRecords) {
+                        transAmount = transAmount.add(o.getTransAmount());
+                        if (PostStatusEnum.FROZEN.equals(o.getPostStatus())) {
+                            frozenTransAmount = frozenTransAmount.add(o.getTransAmount());
+                        }
+                    }
+                    if (!checkInOrderAmount(bizType, orderNo, transAmount)) {
+                        log.error("记录入账-订单入账金额异常: bizType is {} ,orderNo is {} , transAmount is {} ", bizType.getCode(), orderNo, transAmount);
+                        throw new BizException("记录入账-订单入账金额有误");
+                    }
+                    //冻结入账
+                    if (frozenTransAmount.compareTo(BigDecimal.ZERO) > 0) {
+                        //有冻结金额入账
+                        baseMapper.frozenChangeAccount(accountId, frozenTransAmount, InOrOutEnum.IN.getCode());
+                    }
+                    //批量入账
+                    List<UserAccountRecord> records = ListUtil.convertList(userAccountRecords, UserAccountRecord.class);
+                    userAccountRecordService.saveBatch(records);
+                }
             }
-            //金额校验失败
-            if (null == userOrder || totalTransAmount.add(accountRecordDto.getTransAmount()).compareTo(userOrder.getActualPrice()) > 0) {
-                log.error("记录入账-订单入账总金额大于购买金额: param is {}" + JSONObject.toJSONString(accountRecordDto));
-                accountRecordDto.setErrFlag(1);
-                accountRecordDto.setErrMsg("账户变更异常,订单入账总金额大于购买金额,订单号:" + accountRecordDto.getOrderNo());
+        }
+
+        //******************************************支出***********************************//
+        if (!CollectionUtils.isEmpty(collectOut)) {
+            //支出入账金额
+            BigDecimal outTransAmount = BigDecimal.ZERO;
+            //冻结入账金额
+            BigDecimal frozenTransAmount = BigDecimal.ZERO;
+
+            for (UserAccountRecordDto o : collectOut) {
+                outTransAmount = outTransAmount.add(o.getTransAmount());
+                if (PostStatusEnum.FROZEN.equals(o.getPostStatus())) {
+                    frozenTransAmount = frozenTransAmount.add(o.getTransAmount());
+                }
             }
-        } else {
+
             //支出 需要判断所有支出金额不能大于账户余额
-            UserAccountVo detail = baseMapper.detail(accountRecordDto.getAccountId());
-            if (detail.getAmountUsable().compareTo(accountRecordDto.getTransAmount()) < 0) {
-                throw new BizException("记录入账-账户余额不足: param is {}", JSONObject.toJSONString(accountRecordDto));
+            UserAccountVo detail = baseMapper.detail(accountId);
+
+            if (detail.getAmountUsable().compareTo(outTransAmount) < 0) {
+                log.error("记录入账-订单入账金额异常: param is {} ", JSONObject.toJSONString(collectOut));
+                throw new BizException("记录入账-账户余额不足");
             }
+            //冻结入账
+            if (frozenTransAmount.compareTo(BigDecimal.ZERO) > 0) {
+                //有冻结金额入账
+                baseMapper.frozenChangeAccount(accountId, frozenTransAmount, InOrOutEnum.OUT.getCode());
+            }
+            //批量入账
+            List<UserAccountRecord> records = ListUtil.convertList(collectOut, UserAccountRecord.class);
+            userAccountRecordService.saveBatch(records);
         }
-        //如果是冻结入账,需要修改主账户冻结金额和可用余额
-        if (PostStatusEnum.FROZEN.equals(accountRecordDto.getPostStatus()) && accountRecordDto.getErrFlag() == 0) {
-            baseMapper.frozenChangeAccount(accountRecordDto.getAccountId(), accountRecordDto.getTransAmount(), accountRecordDto.getInOrOut().getCode());
-        }
-        //插入账户变更记录
-        userAccountRecordService.save(accountRecordDto);
-        return HttpResponseResult.succeed(accountRecordDto);
+        return HttpResponseResult.succeed();
     }
 
     @Override
@@ -154,6 +232,10 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
         if (null == detail) {
             throw new BizException("入账状态变更, 未找到记录信息: recordId is {} postStatus is {}", param.getId(), param.getPostStatus().getCode());
         }
+        if (!PostStatusEnum.WAIT.equals(detail.getPostStatus())
+                && !PostStatusEnum.FROZEN.equals(detail.getPostStatus())) {
+            return HttpResponseResult.succeed();
+        }
         detail.setPostStatus(param.getPostStatus());
         //待入账
         if (PostStatusEnum.WAIT.equals(detail.getPostStatus())) {
@@ -279,5 +361,116 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
         return HttpResponseResult.succeed(total);
     }
 
+    /**
+     * 判断是否可以入账
+     *
+     * @param bizType     入账类型
+     * @param orderNo     该笔入账对应订单号
+     * @param transAmount 入账金额
+     * @return
+     */
+    private Boolean checkInOrderAmount(AccountBizTypeEnum bizType, String orderNo, BigDecimal transAmount) {
+        BigDecimal orderExpectPrice = BigDecimal.ZERO;
+        if (AccountBizTypeEnum.MALL_SHARE.equals(bizType)) {
+            return true;
+        } else {
+            UserOrder userOrder = orderService.getOne(Wrappers.<UserOrder>lambdaQuery()
+                    .eq(UserOrder::getOrderNo, orderNo));
+            if (null == userOrder) {
+                return false;
+            }
+            orderExpectPrice = userOrder.getExpectPrice();
+        }
+
+        //收入判断订单金额,所有收入不能大于订单用户付款
+        BigDecimal totalTransAmount = baseMapper.totalTransAmountByOrderNo(orderNo);
+        if (null == totalTransAmount) {
+            totalTransAmount = BigDecimal.ZERO;
+        }
+        //金额校验失败
+        if (totalTransAmount.add(transAmount).compareTo(orderExpectPrice) > 0) {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public void mallTeacherRecordState(List<MallOrderItemDto> shareDto) {
+        if (CollectionUtils.isEmpty(shareDto)) {
+            return ;
+        }
+        for (MallOrderItemDto mallOrderItemDto : shareDto) {
+            mallTeacherRecordState(mallOrderItemDto);
+        }
+    }
+
+    public void mallTeacherRecordState(MallOrderItemDto shareDto) {
+        List<UserAccountRecord> list = userAccountRecordService.lambdaQuery()
+                                                               .eq(UserAccountRecord::getOrderNo, shareDto.getOrderSn())
+                                                               .eq(UserAccountRecord::getBizId, shareDto.getProductSkuId())
+                                                               .list();
+        if (CollectionUtils.isEmpty(list)) {
+            return;
+        }
+        for (UserAccountRecord userAccount : list) {
+            this.accountChange(userAccount.getId(),shareDto.getStatus());
+            if (shareDto.getStatus().equals(PostStatusEnum.RECORDED)) {
+
+                platformCashAccountRecordService.mallRecordedRecord(shareDto.getProductSkuId(),shareDto.getOrderSn(),GoodTypeEnum.MALL.getCode());
+
+            } else if (shareDto.getStatus().equals(PostStatusEnum.CANCEL)) {
+                platformCashAccountRecordService.cancelRecord(shareDto.getOrderSn(),GoodTypeEnum.MALL.getCode(),shareDto.getProductSkuId());
+            }
+        }
+    }
+
+
+    /**
+     * 记录平台收入和用户分润收入
+     * @return
+     */
+    @Override
+    public boolean saveMallAccountRecord(List<MallOrderItemDto> shareDto) {
+        if (CollectionUtils.isEmpty(shareDto)) {
+            return false;
+        }
+        for (MallOrderItemDto mallOrderItemDto : shareDto) {
+            saveMallAccountRecord(mallOrderItemDto);
+        }
+        return true;
+    }
+
+    public void saveMallAccountRecord(MallOrderItemDto shareDto) {
+        BigDecimal expectPrice = shareDto.getRealAmount();
+        if (expectPrice.compareTo(BigDecimal.ZERO) <= 0) {
+            return;
+        }
+        //平台收入
+        PlatformCashAccountRecord platformCashAccountRecord = new PlatformCashAccountRecord(shareDto.getUserId(), expectPrice,
+                          InOrOutEnum.IN, PostStatusEnum.WAIT, AccountBizTypeEnum.MALL, shareDto.getProductSkuId(), shareDto.getOrderSn());
+
+        platformCashAccountRecordService.save(platformCashAccountRecord);
+
+        //分润
+        if (null != shareDto.getPromoterId()) {
+            //获取分润收益费率
+            BigDecimal shareFeeRate = userOrderService.getShareFreeByGoodType(GoodTypeEnum.MALL);
+            if (shareFeeRate.compareTo(BigDecimal.ZERO) > 0) {
+                //入老师账户
+                BigDecimal shareFee = expectPrice.multiply(shareFeeRate).setScale(2, RoundingMode.HALF_UP);
+                AccountBizTypeEnum bizTypeEnum = AccountBizTypeEnum.MALL_SHARE;
+                //插入分润老师账户变更记录-分润老师预收
+                HttpResponseResult<UserAccountRecord> recomRecordRes = this.accountRecord(
+                        new UserAccountRecordDto(shareDto.getPromoterId(), PostStatusEnum.WAIT, shareFee, InOrOutEnum.IN,
+                                                 bizTypeEnum, shareDto.getProductSkuId(), shareDto.getProductName(), shareDto.getOrderSn()));
+                if(recomRecordRes.getStatus()){
+                    //插入平台预支
+                    platformCashAccountRecord = new PlatformCashAccountRecord(shareDto.getPromoterId(), shareFee,
+                            InOrOutEnum.OUT, PostStatusEnum.WAIT, AccountBizTypeEnum.MALL_SHARE, shareDto.getProductSkuId(), shareDto.getOrderSn());
+                    platformCashAccountRecordService.save(platformCashAccountRecord);
+                }
+            }
+        }
+    }
 
 }

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

@@ -69,6 +69,8 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
     private UserAccountService userAccountService;
     @Autowired
     private UserAccountRecordService userAccountRecordService;
+    @Autowired
+    private PlatformCashAccountRecordService platformCashAccountRecordService;
 
     //验证是否可以退款,获取退款金额信息
     private static final Map<GoodTypeEnum, Function<OrderRefundReq, HttpResponseResult<RefundCreateRes>>> refundCreate = new HashMap<>();
@@ -532,8 +534,8 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
                 userAccountService.accountChange(userAccountRecord.getId(), PostStatusEnum.CANCEL);
             }
         }
-
-        //todo 处理平台入账
+        //处理平台入账
+        platformCashAccountRecordService.cancelRecord(vo.getOrderNo(),vo.getGoodType().getCode(),vo.getBizId());
     }
 
     /**

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

@@ -2,42 +2,45 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.yonge.cooleshow.biz.dal.enums.*;
-import com.yonge.toolset.payment.base.model.callback.ExecutePaymentCallBack;
-import com.yonge.toolset.payment.util.DistributedLock;
-import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
-import com.yonge.cooleshow.common.constant.SysConfigConstant;
+import com.yonge.cooleshow.biz.dal.dao.UserOrderDao;
+import com.yonge.cooleshow.biz.dal.dto.UserAccountRecordDto;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderPayReq;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
+import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
+import com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord;
+import com.yonge.cooleshow.biz.dal.entity.UserAccountRecord;
 import com.yonge.cooleshow.biz.dal.entity.UserOrder;
 import com.yonge.cooleshow.biz.dal.entity.UserOrderPayment;
+import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.service.*;
-import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
+import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
+import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderPayRes;
+import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
-import com.yonge.toolset.base.exception.BizException;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import com.yonge.cooleshow.common.service.IdGeneratorService;
+import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.result.BaseResult;
 import com.yonge.toolset.base.util.StringUtil;
 import com.yonge.toolset.payment.base.enums.OpenEnum;
 import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
 import com.yonge.toolset.payment.base.model.Payment;
+import com.yonge.toolset.payment.base.model.callback.ExecutePaymentCallBack;
 import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
 import com.yonge.toolset.payment.core.props.PaymentProperties;
 import com.yonge.toolset.payment.core.service.PaymentClient;
+import com.yonge.toolset.payment.util.DistributedLock;
 import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
-import com.yonge.cooleshow.biz.dal.dao.UserOrderDao;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.PostConstruct;
@@ -76,10 +79,15 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     @Autowired
     private PianoRoomBuyRecordService pianoRoomBuyRecordService;
     @Autowired
+    private PlatformCashAccountRecordService platformCashAccountRecordService;
+    @Autowired
+    private UserAccountService userAccountService;
+    @Autowired
     private RedissonClient redissonClient;
     @Autowired
     private PaymentProperties paymentProperties;
 
+
     //验证订单是否可以下单,获取订单金额信息
     private static final Map<GoodTypeEnum, Function<OrderReq.OrderReqInfo, HttpResponseResult<OrderCreateRes>>> orderCreate = new HashMap<>();
     //插入订单后执行
@@ -116,15 +124,12 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         orderSuccess.put(GoodTypeEnum.VIP, memberPriceSettingsService::orderSuccess);
         //直播课程购买
         orderSuccess.put(GoodTypeEnum.LIVE, courseGroupService::buyLiveCourseSuccess);
-
         //陪练课购买
         orderSuccess.put(GoodTypeEnum.PRACTICE, scheduleService::buyPracticeCourseSuccess);
         //视频课购买
         orderSuccess.put(GoodTypeEnum.VIDEO, recordService::buyVideoCourseSuccess);
-
         //曲目购买
         orderSuccess.put(GoodTypeEnum.MUSIC, musicSheetService::buyMusicSheetSuccess);
-
         //琴房时长
         orderSuccess.put(GoodTypeEnum.PINAO_ROOM, pianoRoomBuyRecordService::orderSuccess);
 
@@ -135,7 +140,6 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         orderCancel.put(GoodTypeEnum.VIDEO, recordService::buyVideoCourseFailed);
         //直播课购买
         orderCancel.put(GoodTypeEnum.LIVE, courseGroupService::buyLiveCourseCancel);
-
         // 曲目购买
         orderCancel.put(GoodTypeEnum.MUSIC, musicSheetService::buyMusicSheetCancel);
     }
@@ -258,7 +262,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         orderReq.setOrderNo(Long.toString(orderNo));
 
         //分润人为自己,不是分润订单
-        if(null != orderReq.getRecomUserId() && orderReq.getUserId().equals(orderReq.getRecomUserId())){
+        if (null != orderReq.getRecomUserId() && orderReq.getUserId().equals(orderReq.getRecomUserId())) {
             orderReq.setRecomUserId(null);
         }
 
@@ -768,6 +772,8 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             if (!Objects.isNull(userOrderVoConsumer)) {
                 userOrderVoConsumer.accept(orderDetailVo);
             }
+            //记录平台收入和用户分润收入(未记录卖家收益,卖家收益业务逻辑处理)
+            savePlatformAccountRecord(orderDetailVo);
             //清除商家统计缓存
             Long merchId = orderDetailVo.getMerchId();
             if (merchId != null && merchId != 0) {
@@ -782,6 +788,124 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         }
     }
 
+    /**
+     * 记录平台收入和用户分润收入
+     *
+     * @param orderDetailVo
+     */
+    private void savePlatformAccountRecord(UserOrderDetailVo orderDetailVo) {
+        BigDecimal expectPrice = orderDetailVo.getExpectPrice();
+        if (expectPrice.compareTo(BigDecimal.ZERO) <= 0) {
+            return;
+        }
+        //平台收入
+        //获取平台服务费率
+        BigDecimal platformFeeRate = getPlatformFreeByGoodType(orderDetailVo.getGoodType());
+        if (platformFeeRate.compareTo(BigDecimal.ZERO) > 0) {
+            //没有卖家的为平台订单,平台全额收益
+            if(null == orderDetailVo.getMerchId() || orderDetailVo.getMerchId().equals(0L)){
+                platformFeeRate = BigDecimal.ONE;
+            }
+
+            BigDecimal platformFee = expectPrice.multiply(platformFeeRate).setScale(2, RoundingMode.HALF_UP);
+
+            PlatformCashAccountRecord platformCashAccountRecord;
+            if (GoodTypeEnum.PINAO_ROOM.equals(orderDetailVo.getGoodType())) {
+                platformCashAccountRecord = new PlatformCashAccountRecord(orderDetailVo.getUserId(), platformFee,
+                        InOrOutEnum.IN, PostStatusEnum.RECORDED, AccountBizTypeEnum.PIAON_ROOM, orderDetailVo.getBizId(), orderDetailVo.getOrderNo());
+            } else {
+                AccountBizTypeEnum bizTypeEnum = AccountBizTypeEnum.valueOf(orderDetailVo.getGoodType().getCode());
+                platformCashAccountRecord = new PlatformCashAccountRecord(orderDetailVo.getUserId(), platformFee,
+                        InOrOutEnum.IN, PostStatusEnum.WAIT, bizTypeEnum, orderDetailVo.getBizId(), orderDetailVo.getOrderNo());
+            }
+            platformCashAccountRecordService.save(platformCashAccountRecord);
+        }
+
+        //分润
+        if (null != orderDetailVo.getRecomUserId()) {
+            //获取分润收益费率
+            BigDecimal shareFeeRate = getShareFreeByGoodType(orderDetailVo.getGoodType());
+            if (shareFeeRate.compareTo(BigDecimal.ZERO) > 0) {
+                //入老师账户
+                BigDecimal shareFee = expectPrice.multiply(shareFeeRate).setScale(2, RoundingMode.HALF_UP);
+                AccountBizTypeEnum bizTypeEnum = AccountBizTypeEnum.valueOf(orderDetailVo.getGoodType().getCode() + "_SHARE");
+                if(null != bizTypeEnum){
+                    //插入分润老师账户变更记录-分润老师预收
+                    HttpResponseResult<UserAccountRecord> recomRecordRes = userAccountService.accountRecord(
+                            new UserAccountRecordDto(orderDetailVo.getRecomUserId(), PostStatusEnum.WAIT, shareFee, InOrOutEnum.IN,
+                                    bizTypeEnum, orderDetailVo.getBizId(), orderDetailVo.getGoodName(), orderDetailVo.getOrderNo()));
+                    if(recomRecordRes.getStatus()){
+                        //插入平台预支
+                        PlatformCashAccountRecord platformCashAccountRecord = new PlatformCashAccountRecord(orderDetailVo.getRecomUserId(), shareFee,
+                                InOrOutEnum.OUT, PostStatusEnum.WAIT, bizTypeEnum, orderDetailVo.getBizId(), orderDetailVo.getOrderNo());
+                        platformCashAccountRecordService.save(platformCashAccountRecord);
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 获取分润收益费率
+     *
+     * @param goodType
+     * @return
+     */
+    @Override
+    public BigDecimal getShareFreeByGoodType(GoodTypeEnum goodType) {
+        if (GoodTypeEnum.VIP.equals(goodType)) {
+            return new BigDecimal(sysConfigService.findConfigValue(SysConfigConstant.VIP_SHARE_FEE))
+                    .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+        }
+        if (GoodTypeEnum.LIVE.equals(goodType)) {
+            return new BigDecimal(sysConfigService.findConfigValue(SysConfigConstant.LIVE_SHARE_FEE))
+                    .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+        }
+        if (GoodTypeEnum.VIDEO.equals(goodType)) {
+            return new BigDecimal(sysConfigService.findConfigValue(SysConfigConstant.VIDEO_SHARE_FEE))
+                    .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+        }
+        if (GoodTypeEnum.MUSIC.equals(goodType)) {
+            return new BigDecimal(sysConfigService.findConfigValue(SysConfigConstant.MUSIC_SHARE_FEE))
+                    .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+        }
+        if (GoodTypeEnum.MALL.equals(goodType)) {
+            return new BigDecimal(sysConfigService.findConfigValue(SysConfigConstant.MALL_SHARE_FEE))
+                    .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+        }
+        return BigDecimal.ZERO;
+    }
+
+    /**
+     * 获取平台服务费率
+     *
+     * @param goodType
+     * @return
+     */
+    private BigDecimal getPlatformFreeByGoodType(GoodTypeEnum goodType) {
+        //会员|琴房时长,平台全额收益
+        if (GoodTypeEnum.VIP.equals(goodType) || GoodTypeEnum.PINAO_ROOM.equals(goodType)) {
+            return BigDecimal.ONE;
+        }
+        if (GoodTypeEnum.PRACTICE.equals(goodType)) {
+            return new BigDecimal(sysConfigService.findConfigValue(SysConfigConstant.PRACTICE_SERVICE_FEE))
+                    .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+        }
+        if (GoodTypeEnum.LIVE.equals(goodType)) {
+            return new BigDecimal(sysConfigService.findConfigValue(SysConfigConstant.LIVE_SERVICE_RATE))
+                    .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+        }
+        if (GoodTypeEnum.VIDEO.equals(goodType)) {
+            return new BigDecimal(sysConfigService.findConfigValue(SysConfigConstant.VIDEO_LESSON_SERVICE_FEE))
+                    .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+        }
+        if (GoodTypeEnum.MUSIC.equals(goodType)) {
+            return new BigDecimal(sysConfigService.findConfigValue(SysConfigConstant.MUSIC_SHEET_SERVICE_FEE))
+                    .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+        }
+        return BigDecimal.ZERO;
+    }
+
     private void testOrderSuccess(UserOrderVo detail) {
         if (null == detail || StringUtil.isEmpty(detail.getOrderNo())) {
             return;

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

@@ -146,7 +146,7 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
         //查询组信息
         VideoLessonGroup lessonGroup = videoLessonGroupDao.selectById(purchaseRecord.getVideoLessonGroupId());
         //记录流水
-        addTeacherAccount(orderParam, purchaseRecord, lessonGroup);
+        addTeacherAccount(orderParam, lessonGroup);
         videoSend(lessonGroup.getTeacherId(), purchaseRecord.getStudentId(), lessonGroup);
     }
 
@@ -154,53 +154,26 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
      * 记录老师账户记录
      *
      * @param userOrderDetailVo
-     * @param purchaseRecord
+     * @param lessonGroup
      */
-    private void addTeacherAccount(UserOrderDetailVo userOrderDetailVo, VideoLessonPurchaseRecord purchaseRecord, VideoLessonGroup lessonGroup) {
-        //查询直播课服务费
+    private void addTeacherAccount(UserOrderDetailVo userOrderDetailVo, VideoLessonGroup lessonGroup) {
+        if(null == userOrderDetailVo.getMerchId()){
+
+        }
+        //查询视频课服务费
         BigDecimal liveServiceRate = new BigDecimal(sysConfigService.findConfigValue(SysConfigConstant.VIDEO_LESSON_SERVICE_FEE))
                 .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
         //支付金额
         BigDecimal actualPrice = userOrderDetailVo.getActualPrice();
-        //学生支付金额
-        //BigDecimal payMoney = purchaseRecord.getPayMoney();
         //服务费
         BigDecimal serviceFeeAmount = actualPrice.multiply(liveServiceRate).setScale(2, RoundingMode.HALF_UP);
-
         //老师入账金额
         BigDecimal transAmount = actualPrice.subtract(serviceFeeAmount).setScale(2, RoundingMode.HALF_UP);
 
-        //插入老师账户变更记录
-        HttpResponseResult<UserAccountRecord> recordRes = userAccountService.accountRecord(
+        //插入老师账户变更记录-老师预收
+        userAccountService.accountRecord(
                 new UserAccountRecordDto(userOrderDetailVo.getMerchId(), PostStatusEnum.WAIT, transAmount, InOrOutEnum.IN,
                         AccountBizTypeEnum.VIDEO, lessonGroup.getId(), lessonGroup.getLessonName(), userOrderDetailVo.getOrderNo()));
-        //
-        if (recordRes.getStatus()) {
-            userAccountService.accountChange(recordRes.getData().getId(), PostStatusEnum.RECORDED);
-        }
-
-        //todo 插入平台实收
-
-        //判断是否分润
-        if (null != userOrderDetailVo.getRecomUserId()) {
-            // 分润比例
-            BigDecimal shareFeeRate = new BigDecimal(sysConfigService.findConfigValue(SysConfigConstant.VIDEO_SHARE_FEE))
-                    .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
-
-            //分润金额
-            BigDecimal shareFee = serviceFeeAmount.multiply(shareFeeRate).setScale(2, RoundingMode.HALF_UP);
-
-            //插入分润老师账户变更记录
-            HttpResponseResult<UserAccountRecord> recomRecordRes = userAccountService.accountRecord(
-                    new UserAccountRecordDto(userOrderDetailVo.getRecomUserId(), PostStatusEnum.WAIT, shareFee, InOrOutEnum.IN,
-                            AccountBizTypeEnum.VIDEO_SHARE, lessonGroup.getId(), lessonGroup.getLessonName(), userOrderDetailVo.getOrderNo()));
-
-            if (recomRecordRes.getStatus()) {
-                userAccountService.accountChange(recomRecordRes.getData().getId(), PostStatusEnum.RECORDED);
-            }
-
-            //todo 插入平台分润支出
-        }
     }
 
     /**

+ 52 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/PlatformCashAccountRecordSummaryVo.java

@@ -0,0 +1,52 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+
+public class PlatformCashAccountRecordSummaryVo {
+
+	@ApiModelProperty(value = "预收金额")
+	private BigDecimal advancesReceived;
+	
+	@ApiModelProperty(value = "实收金额")
+	private BigDecimal settledReceived;
+	
+	@ApiModelProperty(value = "预付金额")
+	private BigDecimal advancePayment;
+	
+	@ApiModelProperty(value = "实付金额")
+	private BigDecimal settledPayment;
+
+	public BigDecimal getAdvancesReceived() {
+		return advancesReceived;
+	}
+
+	public void setAdvancesReceived(BigDecimal advancesReceived) {
+		this.advancesReceived = advancesReceived;
+	}
+
+	public BigDecimal getSettledReceived() {
+		return settledReceived;
+	}
+
+	public void setSettledReceived(BigDecimal settledReceived) {
+		this.settledReceived = settledReceived;
+	}
+
+	public BigDecimal getAdvancePayment() {
+		return advancePayment;
+	}
+
+	public void setAdvancePayment(BigDecimal advancePayment) {
+		this.advancePayment = advancePayment;
+	}
+
+	public BigDecimal getSettledPayment() {
+		return settledPayment;
+	}
+
+	public void setSettledPayment(BigDecimal settledPayment) {
+		this.settledPayment = settledPayment;
+	}
+}

+ 10 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherHomeVo.java

@@ -33,7 +33,8 @@ public class TeacherHomeVo extends Teacher implements Serializable {
     private Integer expTime;
     @ApiModelProperty("未上课时")
     private Integer unExpTime;
-
+    @ApiModelProperty("会员剩余有效期天数")
+    private Integer membershipDays;
     @ApiModelProperty("专辑数 ")
     private Integer musicAlbumNum;
     @ApiModelProperty("曲谱数 ")
@@ -74,6 +75,14 @@ public class TeacherHomeVo extends Teacher implements Serializable {
     @ApiModelProperty(value = "学生 STUDENT 老师 TEACHER 系统用户 STSTEM")
     private String userType;
 
+    public Integer getMembershipDays() {
+        return membershipDays;
+    }
+
+    public void setMembershipDays(Integer membershipDays) {
+        this.membershipDays = membershipDays;
+    }
+
     @ApiModelProperty(value = "是否会员 0否 1是")
     private YesOrNoEnum isVip;
 

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserAccountRecordVo.java

@@ -6,6 +6,7 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import org.springframework.format.annotation.DateTimeFormat;
 
+import java.math.BigDecimal;
 import java.util.Date;
 
 /**
@@ -16,6 +17,9 @@ import java.util.Date;
 public class UserAccountRecordVo extends UserAccountRecord{
 	private static final long serialVersionUID = 1L;
 
+	@ApiModelProperty("用户名称 ")
+	private String accountName;
+
 	@ApiModelProperty("发生时间(mm-dd) ")
 	private String timeDay;
 
@@ -29,6 +33,14 @@ public class UserAccountRecordVo extends UserAccountRecord{
 	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
 	private Date endTime;
 
+	public String getAccountName() {
+		return accountName;
+	}
+
+	public void setAccountName(String accountName) {
+		this.accountName = accountName;
+	}
+
 	public String getTimeDay() {
 		return timeDay;
 	}

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserAccountVo.java

@@ -18,6 +18,9 @@ public class UserAccountVo extends UserAccount{
 	@ApiModelProperty("待入账金额 ")
 	private BigDecimal amountUnrecorded;
 
+	@ApiModelProperty("已入账金额 ")
+	private BigDecimal amountRecorded;
+
 	public BigDecimal getAmountUnrecorded() {
 		return amountUnrecorded;
 	}
@@ -25,4 +28,12 @@ public class UserAccountVo extends UserAccount{
 	public void setAmountUnrecorded(BigDecimal amountUnrecorded) {
 		this.amountUnrecorded = amountUnrecorded;
 	}
+
+	public BigDecimal getAmountRecorded() {
+		return amountRecorded;
+	}
+
+	public void setAmountRecorded(BigDecimal amountRecorded) {
+		this.amountRecorded = amountRecorded;
+	}
 }

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserOrderRefundVo.java

@@ -18,7 +18,7 @@ public class UserOrderRefundVo extends UserOrderRefund{
     @TableField(value = "order_name_")
     private String orderName;
 
-    @ApiModelProperty("订单类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ) 老师端(PINAO_ROOM、琴房时长)")
+    @ApiModelProperty("订单类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ) 老师端(VIP、开通会员 PINAO_ROOM、琴房时长)")
     @TableField(value = "order_type_")
     private OrderTypeEnum orderType;
 

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

@@ -16,8 +16,8 @@
     </resultMap>
 
     <sql id="Base_Column_List">
-        id_
-        , account_id_, trans_amount_, in_or_out_, post_status_, biz_type_, biz_id_, memo_, order_no_, create_time_, update_time_
+        id_,
+		account_id_, trans_amount_, in_or_out_, post_status_, biz_type_, biz_id_, memo_, order_no_, create_time_, update_time_
     </sql>
 
     <insert id="insertBatch" keyColumn="id_" keyProperty="id" useGeneratedKeys="true"
@@ -31,4 +31,112 @@
         </foreach>
     </insert>
 
+    <update id="batchUpdate">
+        <foreach collection="list" item="param" separator=";">
+            UPDATE platform_cash_account_record
+            <set>
+                <if test="param.accountId">
+    				account_id_ = #{param.accountId}
+	    		</if>
+                <if test="param.transAmount">
+    				trans_amount_ = #{param.transAmount}
+	    		</if>
+                <if test="param.memo">
+    				memo_ = #{param.memo}
+	    		</if>
+                <if test="param.orderNo">
+    				order_no_ = #{param.orderNo}
+	    		</if>
+	    		<if test="param.bizId">
+	    			biz_id_ = #{param.bizId}
+	    		</if>
+	    		<if test="param.inOrOut">
+	    			in_or_out_ = #{param.inOrOut}
+	    		</if>
+	    		<if test="param.bizType">
+	    			biz_type_ = #{param.bizType}
+	    		</if>
+	    		<if test="param.status">
+	    			post_status_ = #{param.status}
+	    		</if>
+                update_time_ = NOW()
+            </set>
+            WHERE id_ = #{param.id}
+        </foreach>
+    </update>
+
+	<select id="queryPage" resultType="com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord">
+    	select * from platform_cash_account_record
+		<where>
+			<if test="param.orderNo">
+				and order_no_ = #{param.orderNo}
+			</if>
+			<if test="param.bizId">
+				and biz_id_ = #{param.bizId}
+			</if>
+			<if test="param.inOrOut">
+				and in_or_out_ = #{param.inOrOut}
+			</if>
+			<if test="param.bizType">
+				and biz_type_ = #{param.bizType}
+			</if>
+			<if test="param.status">
+				and post_status_ = #{param.status}
+			</if>
+			<if test="param.startDate">
+				and update_time_ &gt;= #{param.startDate}
+			</if>
+			<if test="param.endDate">
+				and update_time_ &lt;= #{param.endDate}
+			</if>
+		</where>
+    </select>
+    
+    <select id="querySummary" resultType="com.yonge.cooleshow.biz.dal.vo.PlatformCashAccountRecordSummaryVo">
+		select
+			sum(case when in_or_out_ = 'IN' and post_status_ = 'WAIT' then trans_amount_ else 0 end) advancesReceived,
+			sum(case when in_or_out_ = 'IN' and post_status_ = 'RECORDED' then trans_amount_ else 0 end) settledReceived,
+			sum(case when in_or_out_ = 'OUT' and post_status_ = 'WAIT' then trans_amount_ else 0 end) advancePayment,
+			sum(case when in_or_out_ = 'OUT' and post_status_ = 'RECORDED' then trans_amount_ else 0 end) settledPayment
+		from platform_cash_account_record
+		<where>
+			<if test="param.orderNo">
+				and order_no_ = #{param.orderNo}
+			</if>
+			<if test="param.bizId">
+				and biz_id_ = #{param.bizId}
+			</if>
+			<if test="param.inOrOut">
+				and in_or_out_ = #{param.inOrOut}
+			</if>
+			<if test="param.bizType">
+				and biz_type_ = #{param.bizType}
+			</if>
+			<if test="param.status">
+				and post_status_ = #{param.status}
+			</if>
+			<if test="param.startDate">
+				and update_time_ &gt;= #{param.startDate}
+			</if>
+			<if test="param.endDate">
+				and update_time_ &lt;= #{param.endDate}
+			</if>
+		</where>
+    </select>
+    
+    <select id="queryByBizTypeAndPaymentDays" resultType="com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord">
+    	select * from platform_cash_account_record where biz_type_ = #{bizType} and TIMESTAMPDIFF(HOUR, create_time_, now()) &gt;= ${24 * paymentDays} and post_status_ = 'WAIT'
+    </select>
+
+	<update id="cancelRecord">
+		update platform_cash_account_record set post_status_ = 'CANCEL'
+		where post_status_ = 'WAIT' and order_no_ = #{orderNo} and biz_id_ = #{bizId}
+		and biz_type_ = #{bizType}
+	</update>
+
+    <update id="mallRecordedRecord">
+		update platform_cash_account_record set post_status_ = 'RECORDED'
+		where post_status_ = 'WAIT' and order_no_ = #{orderNo} and biz_id_ = #{bizId}
+		and biz_type_ = #{bizType}
+	</update>
 </mapper>

+ 3 - 7
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserAccountMapper.xml

@@ -151,13 +151,9 @@
         order by t.sys_day_ymd_
     </select>
 
-    <select id="totalTransAmount" resultType="java.math.BigDecimal">
+    <select id="totalTransAmountByOrderNo" resultType="java.math.BigDecimal">
         select sum(trans_amount_) from user_cash_account_record
-        <where>
-            and post_status_ in ('WAIT','FROZEN','RECORDED') and in_or_out_ = 'IN' and err_flag_ = 0
-            <if test="param.orderNo != null and param.orderNo != ''">
-                and order_no_ = #{param.orderNo}
-            </if>
-        </where>
+        where post_status_ in ('WAIT','FROZEN','RECORDED') and in_or_out_ = 'IN' and err_flag_ = 0
+            and order_no_ = #{orderNo}
     </select>
 </mapper>

+ 37 - 4
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserAccountRecordMapper.xml

@@ -48,7 +48,6 @@
         <if test="null != param.orderNo and '' != param.orderNo">
             AND t.order_no_ LIKE CONCAT('%', #{param.orderNo}, '%')
         </if>
-
         <if test="null != param.userId">
             AND t.account_id_ = #{param.userId}
         </if>
@@ -72,6 +71,7 @@
     <sql id="selectSql">
         select
             <include refid="baseColumns" />,
+            ifnull(u.username_,u.real_name_) as accountName,
             DATE_FORMAT(t.create_time_,'%m-%d') as timeDay,
             a.start_time_ as startTime,
             a.end_time_ as endTime
@@ -81,9 +81,9 @@
         <where>
             <if test="null != param.search and '' != param.search">
                 AND (
-                u.user_id_ LIKE CONCAT('%', #{param.search}, '%') or
-                u.username_ LIKE CONCAT('%', #{param.search}, '%') or
-                u.phone_ LIKE CONCAT('%', #{param.search}, '%')
+                    u.id_ LIKE CONCAT('%', #{param.search}, '%') or
+                    u.username_ LIKE CONCAT('%', #{param.search}, '%') or
+                    u.phone_ LIKE CONCAT('%', #{param.search}, '%')
                 )
             </if>
             <include refid="selectCondition"/>
@@ -99,6 +99,39 @@
         <include refid="selectSql"/>
     </select>
 
+    <select id="accountTotal" resultType="com.yonge.cooleshow.biz.dal.vo.UserAccountVo">
+        select
+            sum(
+                if(t.post_status_ = 'WAIT' and t.in_or_out_ = 'IN' ,abs(t.trans_amount_),0)
+            ) as amountUnrecorded,
+            sum(
+                if(t.post_status_ = 'RECORDED' and t.in_or_out_ = 'IN',abs(t.trans_amount_),0)
+            ) as amountRecorded,
+            sum(
+                if(t.post_status_ = 'RECORDED' ,if(t.in_or_out_ = 'IN',abs(t.trans_amount_),-abs(t.trans_amount_)),0)
+            ) as amountTotal,
+            sum(
+                if(t.post_status_ in ('FROZEN','RECORDED') ,if(t.in_or_out_ = 'IN',abs(t.trans_amount_),-abs(t.trans_amount_)),0)
+            ) as amountUsable,
+            sum(
+                if(t.post_status_ = 'FROZEN' ,if(t.in_or_out_ = 'IN',abs(t.trans_amount_),-abs(t.trans_amount_)),0)
+            ) as amountFrozen
+        from user_cash_account_record t
+        left join sys_user u on t.account_id_ = u.id_
+        <where>
+            <if test="null != param.search and '' != param.search">
+                AND (
+                u.id_ LIKE CONCAT('%', #{param.search}, '%') or
+                u.username_ LIKE CONCAT('%', #{param.search}, '%') or
+                u.phone_ LIKE CONCAT('%', #{param.search}, '%')
+                )
+            </if>
+            <include refid="selectCondition"/>
+        </where>
+        order by t.update_time_ desc
+    </select>
+
+
     <!-- 表字段 -->
     <sql id="appBaseColumns">
         t.id_ as id

+ 10 - 5
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderDetailMapper.xml

@@ -49,7 +49,8 @@
     <select id="detail" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo">
         SELECT
             <include refid="baseColumns"/>,
-               o.user_id_ as userId
+                o.user_id_ as userId,
+                o.recom_user_id_ as recomUserId
         FROM user_order_detail t
         left join user_order o on t.order_no_ = o.order_no_
         where t.id_ = #{id}
@@ -57,7 +58,8 @@
     <select id="detailByOrderNo" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo">
         SELECT
             <include refid="baseColumns"/>,
-            o.user_id_ as userId
+            o.user_id_ as userId,
+            o.recom_user_id_ as recomUserId
         FROM user_order_detail t
         left join user_order o on t.order_no_ = o.order_no_
         where t.order_no_ = #{orderNo}
@@ -65,8 +67,10 @@
 
     <sql id="selectSql">
         SELECT
-            <include refid="baseColumns" />
+            <include refid="baseColumns" />,
+            o.recom_user_id_ as recomUserId
         FROM user_order_detail t
+        left join user_order o on t.order_no_ = o.order_no_
         <where>
             <if test="param.orderNo != null and param.orderNo != ''">
                 AND t.order_no_ = #{orderNo}
@@ -91,12 +95,13 @@
     <select id="getOrderDetilListByOrderNo" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo">
         SELECT
             <include refid="baseColumns" />,
+            o.recom_user_id_ as recomUserId,
             u.avatar_ as avatar,
             u.username_ as username,
-            uo.order_client_ as orderClient,
+            u.order_client_ as orderClient,
             a.star_grade_ as starGrade
         FROM user_order_detail t
-        left join user_order uo on uo.order_no_ = t.order_no_
+        left join user_order o on t.order_no_ = o.order_no_
         left join sys_user u on t.merch_id_ = u.id_
         left join teacher_total a on t.merch_id_ = a.user_id_
         where t.order_no_ = #{orderNo}

+ 155 - 24
toolset/utils/src/main/java/com/yonge/toolset/utils/collection/ListUtil.java

@@ -1,32 +1,163 @@
 package com.yonge.toolset.utils.collection;
 
+import com.alibaba.fastjson.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
+import org.springframework.util.CollectionUtils;
+
 import java.util.ArrayList;
+import java.util.LinkedList;
 import java.util.List;
+import java.util.Queue;
 
 public class ListUtil {
+    private final static Logger log = LoggerFactory.getLogger(ListUtil.class);
+
+    /**
+     * 两个集合是否相等,与元素顺序无关
+     *
+     * @param list1
+     * @param list2
+     * @return
+     */
+    public static boolean isEquals(List<?> list1, List<?> list2) {
+        if (list1 == list2) {
+            return true;
+        }
+        if (list1 == null && list2 == null) {
+            return true;
+        }
+        if (list1 == null || list2 == null) {
+            return false;
+        }
+        if (list1.size() != list2.size()) {
+            return false;
+        }
+        if (list1.containsAll(list2) && list2.containsAll(list1)) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 将list转成queue
+     *
+     * @return java.util.Queue<T>
+     * @Author weifanl
+     * @Date 14:49 2020/6/12
+     * @Param [list]
+     **/
+    public static <T> Queue<T> convertListToQueue(List<T> list, Class<T> clazz) {
+        Queue<T> queue = new LinkedList<>();
+        if (CollectionUtils.isEmpty(list)) {
+            return queue;
+        }
+        list.forEach(obj -> {
+            T clone = obj;
+            if (null != obj && !isBaseType(obj.getClass())) {
+                try {
+                    T t = clazz.newInstance();
+                    BeanUtils.copyProperties(obj, t);
+                    clone = t;
+                } catch (InstantiationException e) {
+                    e.printStackTrace();
+                } catch (IllegalAccessException e) {
+                    e.printStackTrace();
+                }
+            }
+            queue.add(clone);
+        });
+        return queue;
+    }
+
+    /**
+     * list对象转换
+     *
+     * @return java.util.List<T>
+     * @Author weifanl
+     * @Date 17:43 2020/6/17
+     * @Param [list, clazz]
+     **/
+    public static <T> List<T> convertList(List list, Class<T> clazz) {
+        List<T> retList = new ArrayList<>();
+        if (CollectionUtils.isEmpty(list)) {
+            return retList;
+        }
+
+        list.forEach(item -> {
+            try {
+                T t = clazz.newInstance();
+                BeanUtils.copyProperties(item, t);
+                retList.add(t);
+            } catch (InstantiationException e) {
+                e.printStackTrace();
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+        });
+        return retList;
+    }
+
+
+    public static boolean isBaseType(Class className) {
+        return className.equals(String.class) ||
+                className.equals(Integer.class) ||
+                className.equals(int.class) ||
+                className.equals(Byte.class) ||
+                className.equals(byte.class) ||
+                className.equals(Long.class) ||
+                className.equals(long.class) ||
+                className.equals(Double.class) ||
+                className.equals(double.class) ||
+                className.equals(Float.class) ||
+                className.equals(float.class) ||
+                className.equals(Character.class) ||
+                className.equals(char.class) ||
+                className.equals(Short.class) ||
+                className.equals(short.class) ||
+                className.equals(Boolean.class) ||
+                className.equals(boolean.class);
+    }
+
+    public static <T> T convertToBaseType(Object source, Class<T> clazz) {
+        try {
+            if (clazz.equals(String.class)) {
+                return (T) source.toString();
+            } else if (clazz.equals(Integer.class) || clazz.equals(int.class)) {
+                return (T) (Integer) Integer.parseInt(source.toString());
+            } else if (clazz.equals(Byte.class) || clazz.equals(byte.class)) {
+                return (T) (Byte) Byte.parseByte(source.toString());
+            } else if (clazz.equals(Long.class) || clazz.equals(long.class)) {
+                return (T) (Long) Long.parseLong(source.toString());
+            } else if (clazz.equals(Double.class) || clazz.equals(double.class)) {
+                return (T) (Double) Double.parseDouble(source.toString());
+            } else if (clazz.equals(Float.class) || clazz.equals(float.class)) {
+                return (T) (Float) Float.parseFloat(source.toString());
+            } else if (clazz.equals(Character.class) || clazz.equals(char.class)) {
+                return (T) (Integer) Integer.parseInt(source.toString());
+            } else if (clazz.equals(Short.class) || clazz.equals(short.class)) {
+                return (T) (Short) Short.parseShort(source.toString());
+            } else if (clazz.equals(Boolean.class) || clazz.equals(boolean.class)) {
+                return (T) (Boolean) Boolean.parseBoolean(source.toString());
+            }
 
-	/**
-	 * 两个集合是否相等,与元素顺序无关
-	 * @param list1
-	 * @param list2
-	 * @return
-	 */
-	public static boolean isEquals(List<?> list1, List<?> list2) {
-		if (list1 == list2) {
-			return true;
-		}
-		if (list1 == null && list2 == null) {
-			return true;
-		}
-		if (list1 == null || list2 == null) {
-			return false;
-		}
-		if (list1.size() != list2.size()) {
-			return false;
-		}
-		if (list1.containsAll(list2) && list2.containsAll(list1)) {
-			return true;
-		}
-		return false;
-	}
+            try {
+                T t = clazz.newInstance();
+                BeanUtils.copyProperties(source, t);
+                return t;
+            } catch (InstantiationException e) {
+                e.printStackTrace();
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+        } catch (NumberFormatException e) {
+            log.error("转换基础类型异常!");
+            log.error("异常方法:ListUtil.convertToBaseType()");
+            log.error("异常参数:" + JSONObject.toJSONString(source));
+            log.error("异常参数:" + clazz);
+            log.error("异常内容:" + e.getMessage());
+        }
+        return null;
+    }
 }