分账提现接口

This commit is contained in:
张松 2025-10-27 19:48:30 +08:00
parent 3c2af59c4c
commit 1560e5a36f
12 changed files with 227 additions and 14 deletions

View File

@ -1,10 +1,17 @@
package com.czg.controller.user;
import com.czg.market.dto.MkDistributionWithdrawFlowDTO;
import com.czg.market.entity.MkDistributionFlow;
import com.czg.market.entity.MkDistributionWithdrawFlow;
import com.czg.market.service.MkDistributionFlowService;
import com.czg.market.service.MkDistributionUserService;
import com.czg.market.service.MkDistributionWithdrawFlowService;
import com.czg.market.vo.DistributionCenterShopVO;
import com.czg.order.dto.MkDistributionPayDTO;
import com.czg.resp.CzgResult;
import com.czg.sa.StpKit;
import com.czg.service.Impl.AppWxServiceImpl;
import com.czg.utils.AssertUtil;
import com.mybatisflex.core.paginate.Page;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
@ -22,6 +29,10 @@ import java.util.Map;
public class UDistributionController {
@Resource
private MkDistributionUserService distributionUserService;
@Resource
private AppWxServiceImpl appWxService;
@Resource
private MkDistributionWithdrawFlowService withdrawFlowService;
/**
* 分销员购买
@ -63,4 +74,14 @@ public class UDistributionController {
return CzgResult.success(distributionUserService.centerConfig(StpKit.USER.getLoginIdAsLong(), shopId));
}
/**
* 用户提现
* @param withdrawFlowDTO 提现信息
* @return 是否成功
*/
@PostMapping("/withdraw")
public CzgResult<Boolean> withdraw(@Validated @RequestBody MkDistributionWithdrawFlowDTO withdrawFlowDTO) {
return CzgResult.success(distributionUserService.withdraw(StpKit.USER.getLoginIdAsLong(), withdrawFlowDTO));
}
}

View File

@ -0,0 +1,32 @@
package com.czg.market.dto;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import com.alibaba.fastjson2.annotation.JSONField;
import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.NotNull;
import lombok.experimental.Accessors;
import java.io.Serial;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 提现记录表 实体类
*
* @author ww
* @since 2025-10-27
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class MkDistributionWithdrawFlowDTO implements Serializable {
@NotNull
private Long shopId;
@NotNull(message = "提现金额不为空")
@DecimalMin(value = "30", message = "提现金额不能小于30")
private BigDecimal amount;
}

View File

@ -110,6 +110,4 @@ public class MkDistributionFlow implements Serializable {
private String nickName;
private String resp;
private String packageInfo;
}

View File

@ -0,0 +1,84 @@
package com.czg.market.entity;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.io.Serial;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 提现记录表 实体类
*
* @author ww
* @since 2025-10-27
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table("mk_distribution_withdraw_flow")
public class MkDistributionWithdrawFlow implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Id(keyType = KeyType.Auto)
private Long id;
/**
* 店铺id
*/
private Long shopId;
/**
* 店铺用户id
*/
private Long shopUserId;
/**
* 提现金额
*/
private BigDecimal amount;
/**
* 手续费
*/
private BigDecimal serviceFee;
/**
* 微信转账单号
*/
private String billNo;
/**
* 提现必须参数
*/
private String packageInfo;
/**
* 创建时间
*/
@Column(onInsertValue = "now()")
private LocalDateTime createTime;
/**
* 修改时间
*/
@Column(onInsertValue = "now()", onUpdateValue = "now()")
private LocalDateTime updateTime;
/**
* pending提现中 success可提现 finish已完成
*/
private String status;
}

View File

@ -1,6 +1,7 @@
package com.czg.market.service;
import com.czg.market.dto.MkDistributionUserDTO;
import com.czg.market.dto.MkDistributionWithdrawFlowDTO;
import com.czg.market.entity.MkDistributionUser;
import com.czg.market.vo.DistributionCenterShopVO;
import com.czg.order.dto.MkDistributionPayDTO;
@ -93,4 +94,9 @@ public interface MkDistributionUserService extends IService<MkDistributionUser>
*/
void distribute(Long sourceId, String orderNo, BigDecimal amount, Long userId, Long shopId, String type);
void updateIncome(BigDecimal pendingIncome, BigDecimal receivedIncome, BigDecimal withdrawIncome, Long id);
Boolean withdraw(long userId, MkDistributionWithdrawFlowDTO withdrawFlowDTO);
}

View File

@ -0,0 +1,15 @@
package com.czg.market.service;
import com.czg.market.dto.MkDistributionWithdrawFlowDTO;
import com.mybatisflex.core.service.IService;
import com.czg.market.entity.MkDistributionWithdrawFlow;
/**
* 提现记录表 服务层
*
* @author ww
* @since 2025-10-27
*/
public interface MkDistributionWithdrawFlowService extends IService<MkDistributionWithdrawFlow> {
}

View File

@ -4,6 +4,7 @@ import com.czg.market.vo.DistributionCenterShopVO;
import com.mybatisflex.core.BaseMapper;
import com.czg.market.entity.MkDistributionUser;
import java.math.BigDecimal;
import java.util.List;
/**
@ -22,4 +23,6 @@ public interface MkDistributionUserMapper extends BaseMapper<MkDistributionUser>
* 查询我的分销店铺列表 未开通
*/
List<DistributionCenterShopVO> selectUnDistributionShops(Long shopUserId);
boolean updateIncome(BigDecimal pendingIncome, BigDecimal receivedIncome, BigDecimal withdrawIncome, Long id);
}

View File

@ -0,0 +1,14 @@
package com.czg.service.market.mapper;
import com.mybatisflex.core.BaseMapper;
import com.czg.market.entity.MkDistributionWithdrawFlow;
/**
* 提现记录表 映射层
*
* @author ww
* @since 2025-10-27
*/
public interface MkDistributionWithdrawFlowMapper extends BaseMapper<MkDistributionWithdrawFlow> {
}

View File

@ -13,6 +13,7 @@ import com.czg.account.service.UserInfoService;
import com.czg.constant.TableValueConstant;
import com.czg.exception.CzgException;
import com.czg.market.dto.MkDistributionUserDTO;
import com.czg.market.dto.MkDistributionWithdrawFlowDTO;
import com.czg.market.entity.MkDistributionAmountFlow;
import com.czg.market.entity.MkDistributionConfig;
import com.czg.market.entity.MkDistributionLevelConfig;
@ -73,10 +74,12 @@ public class MkDistributionUserServiceImpl extends ServiceImpl<MkDistributionUse
private MkDistributionAmountFlowService distributionAmountFlowService;
@Resource
private MkDistributionFlowService distributionFlowService;
@Resource
private MkDistributionUserService distributionUserService;
@DubboReference
private AppWxServiceImpl appWxService;
@DubboReference
private ShopUserService shopUserService;
@DubboReference
@ -372,25 +375,17 @@ public class MkDistributionUserServiceImpl extends ServiceImpl<MkDistributionUse
.setSourceId(sourceId).setAmount(amount).setType(type).setStatus(flag ? TableValueConstant.DistributionFlow.Status.SUCCESS.getCode() :
TableValueConstant.DistributionFlow.Status.PENDING.getCode())
.setRewardAmount(rewardAmount).setBillNo(IdUtil.simpleUUID());
distributionFlowService.save(mkDistributionFlow);
distributionUserService.updateIncome(!flag ? rewardAmount : BigDecimal.ZERO,
flag ? rewardAmount : BigDecimal.ZERO, BigDecimal.ZERO, distributionUser.getId());
if (flag) {
ShopUser shopUser = shopUserService.getById(distributionUser.getShopUserId());
UserInfo userInfo = userInfoService.getById(shopUser.getUserId());
distributionAmountFlowService.save(new MkDistributionAmountFlow()
.setType(TableValueConstant.DistributionAmountFlow.Type.SELF_RECHARGE.getCode())
.setShopId(config.getShopId()).setAmount(finalAmount).setChangeAmount(amount).setSourceId(mkDistributionFlow.getId())
.setRemark("自助充值").setOpAccount(StpKit.USER.getAccount()));
try {
JSONObject jsonObject = appWxService.transferBalance(userInfo.getWechatOpenId(), userInfo.getRealName(), rewardAmount, "分销奖励", mkDistributionFlow.getBillNo());
mkDistributionFlow.setPackageInfo(jsonObject.getString("package_info"));
mkDistributionFlow.setResp(jsonObject.toJSONString());
}catch (Exception e) {
mkDistributionFlow.setResp(e.getMessage());
mkDistributionFlow.setStatus(TableValueConstant.DistributionFlow.Status.FAIL.getCode());
}
}
distributionFlowService.save(mkDistributionFlow);
}
@ -410,4 +405,14 @@ public class MkDistributionUserServiceImpl extends ServiceImpl<MkDistributionUse
deepReward(config, sourceShopUserInfo, amount, sourceId, type, orderNo, 1);
}, "分销方法执行失败");
}
@Override
public void updateIncome(BigDecimal pendingIncome, BigDecimal receivedIncome, BigDecimal withdrawIncome, Long id) {
boolean flag = mapper.updateIncome(pendingIncome, receivedIncome, withdrawIncome, id);
}
@Override
public Boolean withdraw(long userId, MkDistributionWithdrawFlowDTO withdrawFlowDTO) {
return null;
}
}

View File

@ -0,0 +1,20 @@
package com.czg.service.market.service.impl;
import com.czg.market.dto.MkDistributionWithdrawFlowDTO;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.czg.market.entity.MkDistributionWithdrawFlow;
import com.czg.market.service.MkDistributionWithdrawFlowService;
import com.czg.service.market.mapper.MkDistributionWithdrawFlowMapper;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
/**
* 提现记录表 服务层实现
*
* @author ww
* @since 2025-10-27
*/
@Service
public class MkDistributionWithdrawFlowServiceImpl extends ServiceImpl<MkDistributionWithdrawFlowMapper, MkDistributionWithdrawFlow> implements MkDistributionWithdrawFlowService{
}

View File

@ -3,6 +3,14 @@
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.czg.service.market.mapper.MkDistributionUserMapper">
<update id="updateIncome">
update mk_distribution_user
set total_income = total_income + #{pendingIncome},
pending_income = pending_income + #{pendingIncome},
received_income = received_income + #{receivedIncome},
withdrawn_income = withdrawn_income + #{withdrawIncome}
where id = #{id}
</update>
<select id="selectMyDistributionShops" resultType="com.czg.market.vo.DistributionCenterShopVO">
select shop.id as shopId,

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.czg.service.market.mapper.MkDistributionWithdrawFlowMapper">
</mapper>