Browse Source

订单处理

igl 1 năm trước cách đây
mục cha
commit
84eca6a3cc
25 tập tin đã thay đổi với 473 bổ sung104 xóa
  1. 1 1
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/dto/BalanceDetailDTO.java
  2. 11 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/service/BalanceDetailService.java
  3. 0 11
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/service/MerchantBalanceDetailService.java
  4. 7 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/service/UserInviteService.java
  5. 9 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/AssetMapper.java
  6. 4 4
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/BalanceDetailMapper.java
  7. 48 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/Asset.java
  8. 11 4
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/BalanceDetail.java
  9. 25 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/AssetService.java
  10. 19 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/BalanceDetailService.java
  11. 16 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/OrderHandleService.java
  12. 0 6
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/PayService.java
  13. 7 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/PlatformProfitRatioService.java
  14. 2 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/ProfitRatioConfigService.java
  15. 11 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/UserProfitRatioService.java
  16. 57 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/AssetServiceImpl.java
  17. 75 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/BalanceDetailServiceImpl.java
  18. 0 58
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/MerchantBalanceDetailServiceImpl.java
  19. 88 6
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/OderHandleServiceImpl.java
  20. 4 9
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/OmsOrderServiceImpl.java
  21. 29 3
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/PlatformProfitRatioServiceImpl.java
  22. 10 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/ProfitRatioConfigServiceImpl.java
  23. 9 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/UserInviteServiceImpl.java
  24. 28 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/UserProfitRatioServiceImpl.java
  25. 2 2
      vehicle-server/src/main/resources/mapper/MerchantBalanceDetailMapper.xml

+ 1 - 1
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/dto/MerchantBalanceDetailDTO.java → vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/dto/BalanceDetailDTO.java

@@ -7,7 +7,7 @@ import java.math.BigDecimal;
 import java.util.Date;
 
 @Data
-public class MerchantBalanceDetailDTO implements Serializable {
+public class BalanceDetailDTO implements Serializable {
 
     private static final long serialVersionUID = 4117711721816177519L;
 

+ 11 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/service/BalanceDetailService.java

@@ -0,0 +1,11 @@
+package com.chelvc.cloud.vehicle.api.service;
+
+import com.chelvc.cloud.vehicle.api.dto.BalanceDetailDTO;
+import com.chelvc.cloud.vehicle.api.param.QueryMerchantBalanceParam;
+import com.chelvc.framework.common.model.Pagination;
+
+public interface BalanceDetailService {
+
+    Pagination<BalanceDetailDTO> queryByUserId(QueryMerchantBalanceParam param, Integer pageNum,
+                                               Integer pageSize, Long userId, Integer type);
+}

+ 0 - 11
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/service/MerchantBalanceDetailService.java

@@ -1,11 +0,0 @@
-package com.chelvc.cloud.vehicle.api.service;
-
-import com.chelvc.cloud.vehicle.api.dto.MerchantBalanceDetailDTO;
-import com.chelvc.cloud.vehicle.api.param.QueryMerchantBalanceParam;
-import com.chelvc.framework.common.model.Pagination;
-
-public interface MerchantBalanceDetailService {
-
-    Pagination<MerchantBalanceDetailDTO> queryByUserId(QueryMerchantBalanceParam param, Integer pageNum,
-                                                       Integer pageSize, Long userId);
-}

+ 7 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/service/UserInviteService.java

@@ -9,4 +9,11 @@ public interface UserInviteService {
     void bindInvite(UserInviteParams params);
 
     TeamDTO teamList(TeamInvitePageParam param, Long userId);
+
+    /**
+     * 查看上级用户
+     * @param userId
+     * @return
+     */
+    Long queryUserByTarget(Long userId, Integer type);
 }

+ 9 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/AssetMapper.java

@@ -0,0 +1,9 @@
+package com.chelvc.cloud.vehicle.server.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.chelvc.cloud.vehicle.server.entity.Asset;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface AssetMapper extends BaseMapper<Asset> {
+}

+ 4 - 4
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/MerchantBalanceDetailMapper.java → vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/BalanceDetailMapper.java

@@ -5,15 +5,15 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.chelvc.cloud.vehicle.api.dto.MerchantBalanceDetailDTO;
-import com.chelvc.cloud.vehicle.server.entity.MerchantBalanceDetail;
+import com.chelvc.cloud.vehicle.api.dto.BalanceDetailDTO;
+import com.chelvc.cloud.vehicle.server.entity.BalanceDetail;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
 
 @Mapper
 @Repository
-public interface MerchantBalanceDetailMapper extends BaseMapper<MerchantBalanceDetail> {
+public interface BalanceDetailMapper extends BaseMapper<BalanceDetail> {
 
-    IPage<MerchantBalanceDetailDTO> queryByUserId(@Param("page") Page<MerchantBalanceDetailDTO> page, @Param(Constants.WRAPPER) QueryWrapper<MerchantBalanceDetail> queryWrapper);
+    IPage<BalanceDetailDTO> queryByUserId(@Param("page") Page<BalanceDetailDTO> page, @Param(Constants.WRAPPER) QueryWrapper<BalanceDetail> queryWrapper);
 }

+ 48 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/Asset.java

@@ -0,0 +1,48 @@
+package com.chelvc.cloud.vehicle.server.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.chelvc.framework.database.entity.Entity;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+import lombok.experimental.SuperBuilder;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString(callSuper = true)
+@TableName(autoResultMap = true)
+public class Asset implements Entity<Long> {
+
+    /**
+     * 主键
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    private Long id;
+
+    private Long userId;
+
+    /**
+     * 类型:1-用户;2-商家
+     */
+    private Integer type;
+
+    /**
+     * 总金额
+     */
+    private BigDecimal total;
+
+    /**
+     * 冻结金额
+     */
+    private BigDecimal frozen;
+
+    private LocalDateTime updateTime;
+}

+ 11 - 4
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/MerchantBalanceDetail.java → vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/BalanceDetail.java

@@ -4,11 +4,14 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.chelvc.framework.database.entity.Entity;
-import lombok.*;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
 import lombok.experimental.SuperBuilder;
 
 import java.math.BigDecimal;
-import java.util.Date;
+import java.time.LocalDateTime;
 
 @Data
 @SuperBuilder
@@ -16,14 +19,18 @@ import java.util.Date;
 @AllArgsConstructor
 @ToString(callSuper = true)
 @TableName(autoResultMap = true)
-public class MerchantBalanceDetail implements Entity<Long> {
+public class BalanceDetail implements Entity<Long> {
     private static final long serialVersionUID = -4673150288436488029L;
     @TableId(type = IdType.ASSIGN_ID)
     private Long id;
     private Long userId;
     private Integer type;
+    private Long orderId;
+    private Integer flowType;
+    private Long sourceId;
     private Integer operateType;
     private BigDecimal operateAmount;
     private BigDecimal surplusAmount;
-    private Date createTime;
+    private LocalDateTime createTime;
+    private String remark;
 }

+ 25 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/AssetService.java

@@ -0,0 +1,25 @@
+package com.chelvc.cloud.vehicle.server.service;
+
+import com.chelvc.cloud.vehicle.server.entity.Asset;
+
+import java.math.BigDecimal;
+
+public interface AssetService {
+    /**
+     * 查看资产
+     * @param userId 用户标识
+     * @param type 类型:1-用户;2-商家
+     * @return
+     */
+    Asset queryAsset(Long userId, Integer type);
+
+    /**
+     * 更新资产
+     * @param operateType 操作类型:0-增加;1-减少
+     * @param operateAmount 操作金额
+     * @param userId 用户标识
+     * @param type 类型:0-平台;1-用户;2-商家
+     * @return
+     */
+    BigDecimal updateAsset(Integer operateType, BigDecimal operateAmount, Long userId, Integer type);
+}

+ 19 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/BalanceDetailService.java

@@ -0,0 +1,19 @@
+package com.chelvc.cloud.vehicle.server.service;
+
+import java.math.BigDecimal;
+
+public interface BalanceDetailService {
+    /**
+     * 记录用户流水
+     * @param orderId 订单id
+     * @param type 类型:0-平台;1-用户;2-商户
+     * @param userId 用户id
+     * @param operateAmount 操作金额
+     * @param surplusAmount 当前余额
+     * @param flowType 流水类型:0-收入;1-支出
+     * @param operateType 操作类型:1-订单收益;2-提现
+     * @param sourceId 来源id
+     */
+    void recordFlow(Long orderId, Integer type,  Long userId, BigDecimal operateAmount, BigDecimal surplusAmount,
+                    Integer flowType, Integer operateType, Long sourceId);
+}

+ 16 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/OrderHandleService.java

@@ -0,0 +1,16 @@
+package com.chelvc.cloud.vehicle.server.service;
+
+import com.chelvc.cloud.vehicle.server.entity.OmsOrder;
+
+public interface OrderHandleService {
+
+    void orderPay(Long orderId);
+
+    void handleOrder(OmsOrder omsOrder);
+
+    /**
+     * 支付成功回调处理
+     * @param order
+     */
+    void paySuccess(OmsOrder order);
+}

+ 0 - 6
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/PayService.java

@@ -1,6 +0,0 @@
-package com.chelvc.cloud.vehicle.server.service;
-
-public interface PayService {
-
-    void orderPay(Long orderId);
-}

+ 7 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/PlatformProfitRatioService.java

@@ -3,4 +3,11 @@ package com.chelvc.cloud.vehicle.server.service;
 public interface PlatformProfitRatioService {
 
     void  updateProfitRatio();
+
+    /**
+     * 查看平台对商家抽佣比例
+     * @param merchantId
+     * @return
+     */
+    int queryRatio(Long merchantId);
 }

+ 2 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/ProfitRatioConfigService.java

@@ -7,4 +7,6 @@ import java.util.List;
 public interface ProfitRatioConfigService {
 
     List<ProfitRatioConfig> queryListByType(Integer type);
+
+    ProfitRatioConfig queryByTypeAndLeast(Integer type);
 }

+ 11 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/UserProfitRatioService.java

@@ -0,0 +1,11 @@
+package com.chelvc.cloud.vehicle.server.service;
+
+public interface UserProfitRatioService {
+    /**
+     * 获取抽佣比例
+     * @param inviteUserId
+     * @param type
+     * @return
+     */
+    int queryRatio(Long inviteUserId, Integer type);
+}

+ 57 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/AssetServiceImpl.java

@@ -0,0 +1,57 @@
+package com.chelvc.cloud.vehicle.server.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.chelvc.cloud.vehicle.server.dao.AssetMapper;
+import com.chelvc.cloud.vehicle.server.entity.Asset;
+import com.chelvc.cloud.vehicle.server.service.AssetService;
+import com.chelvc.framework.base.exception.ResourceUnavailableException;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Service
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class AssetServiceImpl extends ServiceImpl<AssetMapper, Asset> implements AssetService {
+    @Override
+    public Asset queryAsset(Long userId, Integer type) {
+        LambdaQueryWrapper<Asset> wrapper = Wrappers.lambdaQuery();
+        wrapper.eq(Asset::getUserId, userId);
+        wrapper.eq(Asset::getType, type);
+        Asset asset = baseMapper.selectOne(wrapper);
+        if(asset != null){
+            return asset;
+        }
+        asset = new Asset();
+        asset.setFrozen(new BigDecimal("0"));
+        asset.setType(type);
+        asset.setTotal(new BigDecimal("0"));
+        asset.setUpdateTime(LocalDateTime.now());
+        asset.setUserId(userId);
+        baseMapper.insert(asset);
+        return asset;
+    }
+
+    @Override
+    public BigDecimal updateAsset(Integer operateType, BigDecimal operateAmount, Long userId, Integer type) {
+        Asset asset = queryAsset(userId, type);
+        BigDecimal total = asset.getTotal();
+        if(operateType == 1 && total.compareTo(operateAmount) < 0){
+            throw new ResourceUnavailableException("账户余额不足");
+        }
+        if(operateType == 0){
+            asset.setTotal(total.add(operateAmount));
+        } else if(operateType == 1){
+            asset.setTotal(total.subtract(operateAmount));
+        }
+        int i = baseMapper.updateById(asset);
+        if(i != 1){
+            throw new ResourceUnavailableException("操作失败");
+        }
+        return asset.getTotal();
+    }
+}

+ 75 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/BalanceDetailServiceImpl.java

@@ -0,0 +1,75 @@
+package com.chelvc.cloud.vehicle.server.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.chelvc.cloud.vehicle.api.dto.BalanceDetailDTO;
+import com.chelvc.cloud.vehicle.api.param.QueryMerchantBalanceParam;
+import com.chelvc.cloud.vehicle.server.dao.BalanceDetailMapper;
+import com.chelvc.cloud.vehicle.server.entity.BalanceDetail;
+import com.chelvc.cloud.vehicle.server.service.BalanceDetailService;
+import com.chelvc.framework.common.model.Pagination;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Service
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class BalanceDetailServiceImpl extends ServiceImpl<BalanceDetailMapper, BalanceDetail>
+        implements BalanceDetailService, com.chelvc.cloud.vehicle.api.service.BalanceDetailService{
+
+    private final BalanceDetailMapper merchantBalanceDetailMapper;
+    @Override
+    public void recordFlow(Long orderId, Integer type, Long userId, BigDecimal operateAmount, BigDecimal surplusAmount,
+                           Integer flowType, Integer operateType, Long sourceId) {
+        BalanceDetail detail = new BalanceDetail();
+        detail.setType(type);
+        detail.setFlowType(flowType);
+        detail.setOperateType(operateType);
+        detail.setOrderId(orderId);
+        detail.setUserId(userId);
+        detail.setCreateTime(LocalDateTime.now());
+        detail.setOperateAmount(operateAmount);
+        detail.setSurplusAmount(surplusAmount);
+        detail.setSourceId(sourceId);
+        baseMapper.insert(detail);
+    }
+
+    @Override
+    public Pagination<BalanceDetailDTO> queryByUserId(QueryMerchantBalanceParam param,
+                    Integer pageNum, Integer pageSize, Long userId, Integer type) {
+        if(param == null || userId == null){
+            return null;
+        }
+        Page<BalanceDetailDTO> page = new Page<>(pageNum, pageSize);
+        IPage<BalanceDetailDTO> result = merchantBalanceDetailMapper
+                .queryByUserId(page, queryWrapper(param, userId, type));
+        return Pagination.<BalanceDetailDTO>builder().total(result.getTotal()).pages(result.getPages())
+                .records(result.getRecords()).build();
+    }
+
+    public QueryWrapper<BalanceDetail> queryWrapper(QueryMerchantBalanceParam param, Long userId, Integer type) {
+        QueryWrapper<BalanceDetail> lqw = Wrappers.query();
+        lqw.eq("t1.type", type);
+        lqw.eq("t1.user_id", userId);
+        if(param.getType() != null){
+            lqw.eq("t1.type", param.getType());
+        }
+        if(param.getOperateType() != null){
+            lqw.eq("t1.operate_type", param.getOperateType());
+        }
+        if(param.getStartTime() != null){
+            lqw.ge("t1.create_time", param.getStartTime());
+        }
+        if(param.getEndTime() != null){
+            lqw.lt("t1.create_time", param.getEndTime());
+        }
+        lqw.orderByDesc("t1.create_time");
+        return lqw;
+    }
+}

+ 0 - 58
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/MerchantBalanceDetailServiceImpl.java

@@ -1,58 +0,0 @@
-package com.chelvc.cloud.vehicle.server.service.impl;
-
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.chelvc.cloud.vehicle.api.dto.MerchantBalanceDetailDTO;
-import com.chelvc.cloud.vehicle.api.param.QueryMerchantBalanceParam;
-import com.chelvc.cloud.vehicle.api.service.MerchantBalanceDetailService;
-import com.chelvc.cloud.vehicle.server.dao.MerchantBalanceDetailMapper;
-import com.chelvc.cloud.vehicle.server.entity.MerchantBalanceDetail;
-import com.chelvc.framework.common.model.Pagination;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.dubbo.config.annotation.DubboService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-@Slf4j
-@Service
-@RequiredArgsConstructor(onConstructor = @__(@Autowired))
-@DubboService(interfaceClass = com.chelvc.cloud.vehicle.api.service.MerchantBalanceDetailService.class)
-public class MerchantBalanceDetailServiceImpl implements MerchantBalanceDetailService {
-
-    private final MerchantBalanceDetailMapper merchantBalanceDetailMapper;
-
-    @Override
-    public Pagination<MerchantBalanceDetailDTO> queryByUserId(QueryMerchantBalanceParam param,
-                                                              Integer pageNum, Integer pageSize, Long userId) {
-        if(param == null || userId == null){
-            return null;
-        }
-        Page<MerchantBalanceDetailDTO> page = new Page<>(pageNum, pageSize);
-        IPage<MerchantBalanceDetailDTO> result = merchantBalanceDetailMapper
-                .queryByUserId(page, queryWrapper(param, userId));
-        return Pagination.<MerchantBalanceDetailDTO>builder().total(result.getTotal()).pages(result.getPages())
-                .records(result.getRecords()).build();
-    }
-
-    public QueryWrapper<MerchantBalanceDetail> queryWrapper(QueryMerchantBalanceParam param, Long userId) {
-        QueryWrapper<MerchantBalanceDetail> lqw = Wrappers.query();
-        lqw.eq("t1.user_id", userId);
-        if(param.getType() != null){
-            lqw.eq("t1.type", param.getType());
-        }
-        if(param.getOperateType() != null){
-            lqw.eq("t1.operate_type", param.getOperateType());
-        }
-        if(param.getStartTime() != null){
-            lqw.ge("t1.create_time", param.getStartTime());
-        }
-        if(param.getEndTime() != null){
-            lqw.lt("t1.create_time", param.getEndTime());
-        }
-        lqw.orderByDesc("t1.create_time");
-        return lqw;
-    }
-}

+ 88 - 6
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/PayServiceImpl.java → vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/OderHandleServiceImpl.java

@@ -2,16 +2,21 @@ package com.chelvc.cloud.vehicle.server.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.chelvc.cloud.vehicle.api.service.UserInviteService;
 import com.chelvc.cloud.vehicle.server.dao.OmsOrderMapper;
 import com.chelvc.cloud.vehicle.server.entity.OmsOrder;
-import com.chelvc.cloud.vehicle.server.service.PayService;
+import com.chelvc.cloud.vehicle.server.service.*;
+import com.chelvc.framework.base.exception.ResourceUnavailableException;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.io.BufferedInputStream;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.nio.charset.StandardCharsets;
 import java.security.KeyStore;
 import java.security.PrivateKey;
@@ -19,14 +24,18 @@ import java.security.PublicKey;
 import java.security.Signature;
 import java.security.cert.CertificateFactory;
 import java.security.cert.X509Certificate;
+import java.util.Date;
 import java.util.Objects;
 
 @Service
 @RequiredArgsConstructor(onConstructor = @__(@Autowired))
-public class PayServiceImpl implements PayService {
-
+public class OderHandleServiceImpl implements OrderHandleService {
     private final OmsOrderMapper omsOrderMapper;
-
+    private final UserInviteService userInviteService;
+    private final UserProfitRatioService userProfitRatioService;
+    private final PlatformProfitRatioService platformProfitRatioService;
+    private final AssetService assetService;
+    private final BalanceDetailService balanceDetailService;
     @Override
     public void orderPay(Long orderId) {
         LambdaQueryWrapper<OmsOrder> wrapper = Wrappers.lambdaQuery();
@@ -56,6 +65,79 @@ public class PayServiceImpl implements PayService {
         sb.append("payResult=").append("10");
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void handleOrder(OmsOrder omsOrder) {
+        omsOrder.setStatus(4);
+        omsOrder.setConfirmStatus(1);
+        omsOrder.setReceiveTime(new Date());
+        omsOrder.setUpdateTime(new Date());
+        int i = omsOrderMapper.updateById(omsOrder);
+        if(i != 1){
+            throw new ResourceUnavailableException("处理失败");
+        }
+        //分佣逻辑=====================================
+        //实际支付金额
+        BigDecimal payAmount = omsOrder.getPayAmount();
+        Long userId = omsOrder.getUserId();
+        Long merchantId = omsOrder.getMerchantId();
+        BigDecimal userAmount = BigDecimal.ZERO;
+        BigDecimal merchantAmount = BigDecimal.ZERO;
+        //平台抽佣
+        int platformRatio = platformProfitRatioService.queryRatio(merchantId);
+        //平台抽佣金额----向上取整保留2位小数
+        BigDecimal platformAmount = new BigDecimal(platformRatio).divide(new BigDecimal("100"), 2, RoundingMode.UP)
+                .multiply(payAmount).setScale(2, RoundingMode.UP);
+        //用户抽佣----查看消费用户上级
+        Long inviteUserId = userInviteService.queryUserByTarget(userId, 1);
+        if(inviteUserId != null){
+            //用户分佣
+            int userRatio = userProfitRatioService.queryRatio(inviteUserId, 1);
+            if(userRatio > 0){
+                userAmount = new BigDecimal(userRatio).divide(new BigDecimal("100"), 2, RoundingMode.UP)
+                        .multiply(platformAmount).setScale(2, RoundingMode.UP);
+            }
+        }
+        //商户抽佣----查看消费用户上级
+        Long inviteMerchantId = userInviteService.queryUserByTarget(merchantId, 2);
+        if(inviteMerchantId != null){
+            //商户分佣
+            int merchantRatio = userProfitRatioService.queryRatio(inviteMerchantId, 2);
+            if(merchantRatio > 0){
+                merchantAmount = new BigDecimal(merchantRatio).divide(new BigDecimal("100"), 2, RoundingMode.UP)
+                        .multiply(platformAmount).setScale(2, RoundingMode.UP);
+            }
+        }
+        //商家应得金额
+        BigDecimal operateAmount = payAmount.subtract(platformAmount);
+        BigDecimal surplusAmount = assetService.updateAsset(0, operateAmount, merchantId, 2);
+        balanceDetailService.recordFlow(omsOrder.getId(), 2, merchantId, operateAmount, surplusAmount, 0, 1, userId);
+        BigDecimal platformSurplusAmount = assetService.updateAsset(1, operateAmount, 1L, 0);
+        balanceDetailService.recordFlow(omsOrder.getId(), 0, 1L, operateAmount, platformSurplusAmount, 1, 1, merchantId);
+        //邀请用户---分得佣金
+        if(userAmount.compareTo(BigDecimal.ZERO) > 0){
+            BigDecimal userSurplusAmount = assetService.updateAsset(0, userAmount, inviteUserId, 1);
+            balanceDetailService.recordFlow(omsOrder.getId(), 1, inviteUserId, userAmount, userSurplusAmount, 0, 1, userId);
+            BigDecimal platformSurplusAmount1 = assetService.updateAsset(1, userAmount, 1L, 0);
+            balanceDetailService.recordFlow(omsOrder.getId(), 0, 1L, userAmount, platformSurplusAmount1, 1, 1, inviteUserId);
+        }
+        //邀请商家---分得佣金
+        if(merchantAmount.compareTo(BigDecimal.ZERO) > 0){
+            BigDecimal merchantSurplusAmount2 = assetService.updateAsset(0, merchantAmount, inviteMerchantId, 1);
+            balanceDetailService.recordFlow(omsOrder.getId(), 1, inviteMerchantId, merchantAmount, merchantSurplusAmount2, 0, 1, merchantId);
+            BigDecimal platformSurplusAmount2 = assetService.updateAsset(1, merchantAmount, 1L, 0);
+            balanceDetailService.recordFlow(omsOrder.getId(), 0, 1L, merchantAmount, platformSurplusAmount2, 1, 1, inviteMerchantId);
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void paySuccess(OmsOrder order) {
+        omsOrderMapper.updateById(order);
+        BigDecimal surplusAmount = assetService.updateAsset(0, order.getPayAmount(), 1L, 0);
+        balanceDetailService.recordFlow(order.getId(), 0, 1L, order.getPayAmount(), surplusAmount, 0, 1, order.getUserId());
+    }
+
     public static void main(String[] args) {
 
         StringBuilder sb = new StringBuilder();
@@ -183,7 +265,7 @@ public class PayServiceImpl implements PayService {
             KeyStore ks = KeyStore.getInstance("PKCS12");
 
             //读取密钥仓库(相对路径)
-            String file = Objects.requireNonNull(PayServiceImpl.class.getClassLoader().getResource("payUtils/10012951683.pfx")).getPath().replaceAll("%20", " ");
+            String file = Objects.requireNonNull(OderHandleServiceImpl.class.getClassLoader().getResource("payUtils/10012951683.pfx")).getPath().replaceAll("%20", " ");
             System.out.println(file);
 
             FileInputStream ksfis = new FileInputStream(file);
@@ -213,7 +295,7 @@ public class PayServiceImpl implements PayService {
         try {
             //快钱公钥
             //String file = Pkipair.class.getResource("99bill.RSA.cer").toURI().getPath();
-            String file = Objects.requireNonNull(PayServiceImpl.class.getClassLoader().getResource("payUtils/CFCA_sandbox.cer")).toURI().getPath();
+            String file = Objects.requireNonNull(OderHandleServiceImpl.class.getClassLoader().getResource("payUtils/CFCA_sandbox.cer")).toURI().getPath();
             //System.out.println(file);
             FileInputStream inStream = new FileInputStream(file);
 

+ 4 - 9
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/OmsOrderServiceImpl.java

@@ -59,6 +59,8 @@ public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder> i
 
     private final EmployeeService employeeService;
 
+    private final OrderHandleService orderHandleService;
+
     @Override
     public ConfirmOrderResultDTO generateConfirmOrder(OmsOrderModifyParam orderParam) {
         ConfirmOrderResultDTO result = new ConfirmOrderResultDTO();
@@ -249,7 +251,7 @@ public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder> i
         order.setStatus(1);
         order.setPaymentTime(new Date());
         order.setPayType(payType);
-        this.baseMapper.updateById(order);
+        orderHandleService.paySuccess(order);
         //恢复所有下单商品的锁定库存,扣减真实库存
 //        List<OmsOrderItemDTO> orderDetailList = this.baseMapper.getDetail(orderId);
 //        int count = this.baseMapper.updateSkuStock(orderDetailList);
@@ -784,14 +786,7 @@ public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder> i
         if(status != 1){
             throw new ResourceUnavailableException("该订单不可用");
         }
-        omsOrder.setStatus(4);
-        omsOrder.setConfirmStatus(1);
-        omsOrder.setReceiveTime(new Date());
-        omsOrder.setUpdateTime(new Date());
-        int i = baseMapper.updateById(omsOrder);
-        if(i != 1){
-            throw new ResourceUnavailableException("处理失败");
-        }
+        orderHandleService.handleOrder(omsOrder);
     }
 
 

+ 29 - 3
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/PlatformProfitRatioServiceImpl.java

@@ -15,11 +15,11 @@ import com.chelvc.cloud.vehicle.server.entity.ProfitRatioConfig;
 import com.chelvc.cloud.vehicle.server.service.IOmsOrderService;
 import com.chelvc.cloud.vehicle.server.service.PlatformProfitRatioService;
 import com.chelvc.cloud.vehicle.server.service.ProfitRatioConfigService;
-import com.chelvc.framework.base.exception.ResourceUnavailableException;
 import com.chelvc.framework.common.model.Pagination;
 import lombok.RequiredArgsConstructor;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.util.CollectionUtils;
 
@@ -27,7 +27,7 @@ import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.List;
 
-@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+@RequiredArgsConstructor(onConstructor = @__({@Autowired, @Lazy}))
 @DubboService(interfaceClass = com.chelvc.cloud.vehicle.api.service.PlatformProfitRatioService.class)
 public class PlatformProfitRatioServiceImpl extends ServiceImpl<PlatformProfitRatioMapper, PlatformProfitRatio>
         implements PlatformProfitRatioService,  com.chelvc.cloud.vehicle.api.service.PlatformProfitRatioService{
@@ -74,6 +74,17 @@ public class PlatformProfitRatioServiceImpl extends ServiceImpl<PlatformProfitRa
         }
     }
 
+    @Override
+    public int queryRatio(Long merchantId) {
+        LambdaQueryWrapper<PlatformProfitRatio> wrapper = Wrappers.lambdaQuery();
+        wrapper.eq(PlatformProfitRatio::getUserId, merchantId);
+        PlatformProfitRatio platformProfitRatio = baseMapper.selectOne(wrapper);
+        if(platformProfitRatio != null){
+            return platformProfitRatio.getRatio();
+        }
+        return init(merchantId);
+    }
+
     @Override
     public Pagination<PlatformProfitRatioDTO> queryPageList(QueryPlatformProfitRatioParam param, Long pageNum, Long pageSize) {
         Page<PlatformProfitRatioDTO> page = new Page<>(pageNum, pageSize);
@@ -87,6 +98,20 @@ public class PlatformProfitRatioServiceImpl extends ServiceImpl<PlatformProfitRa
                 .records(result.getRecords()).build();
     }
 
+    public int init(Long userId){
+        ProfitRatioConfig config = profitRatioConfigService.queryByTypeAndLeast(1);
+        PlatformProfitRatio ratio = new PlatformProfitRatio();
+        ratio.setUserId(userId);
+        ratio.setRatio(config == null ? 10 : config.getRatio());
+        ratio.setUpdater(1L);
+        ratio.setUpdater(1L);
+        ratio.setUpdateTime(LocalDateTime.now());
+        ratio.setCreateTime(LocalDateTime.now());
+        ratio.setTurnover(new BigDecimal("0"));
+        baseMapper.insert(ratio);
+        return ratio.getRatio();
+    }
+
     @Override
     public void edit(EditPlatformProfitRatioParam param) {
         Long userId = param.getUserId();
@@ -94,7 +119,8 @@ public class PlatformProfitRatioServiceImpl extends ServiceImpl<PlatformProfitRa
         wrapper.eq(PlatformProfitRatio::getUserId, userId);
         PlatformProfitRatio platformProfitRatio = baseMapper.selectOne(wrapper);
         if(platformProfitRatio == null){
-            throw new ResourceUnavailableException("商家不存在");
+            init(userId);
+            return;
         }
         platformProfitRatio.setRatio(param.getRatio());
         platformProfitRatio.setUpdater(param.getOperateUserId());

+ 10 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/ProfitRatioConfigServiceImpl.java

@@ -95,4 +95,14 @@ public class ProfitRatioConfigServiceImpl extends ServiceImpl<ProfitRatioConfigM
         wrapper.orderByDesc(ProfitRatioConfig::getNum);
         return baseMapper.selectList(wrapper);
     }
+
+    @Override
+    public ProfitRatioConfig queryByTypeAndLeast(Integer type) {
+        LambdaQueryWrapper<ProfitRatioConfig> wrapper = Wrappers.lambdaQuery();
+        wrapper.eq(ProfitRatioConfig::getType, type);
+        wrapper.eq(ProfitRatioConfig::getStatus, 0);
+        wrapper.orderByAsc(ProfitRatioConfig::getNum);
+        wrapper.last("LIMIT 1");
+        return baseMapper.selectOne(wrapper);
+    }
 }

+ 9 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/UserInviteServiceImpl.java

@@ -142,4 +142,13 @@ public class UserInviteServiceImpl extends ServiceImpl<UserInviteMapper, UserInv
         dto.setRecords(records);
         return dto;
     }
+
+    @Override
+    public Long queryUserByTarget(Long userId, Integer type) {
+        LambdaQueryWrapper<UserInvite> inviteWrapper = Wrappers.lambdaQuery();
+        inviteWrapper.eq(UserInvite::getTargetId, userId);
+        inviteWrapper.eq(UserInvite::getType, type);
+        UserInvite userInvite = baseMapper.selectOne(inviteWrapper);
+        return userInvite == null ? null : userInvite.getUserId();
+    }
 }

+ 28 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/UserProfitRatioServiceImpl.java

@@ -0,0 +1,28 @@
+package com.chelvc.cloud.vehicle.server.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.chelvc.cloud.vehicle.server.dao.UserProfitRatioMapper;
+import com.chelvc.cloud.vehicle.server.entity.UserProfitRatio;
+import com.chelvc.cloud.vehicle.server.service.UserProfitRatioService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class UserProfitRatioServiceImpl extends ServiceImpl<UserProfitRatioMapper, UserProfitRatio> implements UserProfitRatioService {
+
+    @Override
+    public int queryRatio(Long inviteUserId, Integer type) {
+        LambdaQueryWrapper<UserProfitRatio> wrapper = Wrappers.lambdaQuery();
+        wrapper.eq(UserProfitRatio::getUserId, inviteUserId);
+        wrapper.eq(UserProfitRatio::getType, type);
+        UserProfitRatio userProfitRatio = baseMapper.selectOne(wrapper);
+        if(userProfitRatio == null){
+            return 0;
+        }
+        return userProfitRatio.getRatio();
+    }
+}

+ 2 - 2
vehicle-server/src/main/resources/mapper/MerchantBalanceDetailMapper.xml

@@ -2,9 +2,9 @@
 <!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.chelvc.cloud.vehicle.server.dao.MerchantBalanceDetailMapper">
+<mapper namespace="com.chelvc.cloud.vehicle.server.dao.BalanceDetailMapper">
 
-    <resultMap type="com.chelvc.cloud.vehicle.api.dto.MerchantBalanceDetailDTO" id="MerchantBalanceDetailResult">
+    <resultMap type="com.chelvc.cloud.vehicle.api.dto.BalanceDetailDTO" id="MerchantBalanceDetailResult">
     <result property="id" column="id"/>
     <result property="userId" column="user_id"/>
     <result property="operateType" column="operate_type"/>