|
@@ -0,0 +1,197 @@
|
|
|
+package cn.newfeifan.mall.module.distri.service.applicationforwithdrawal;
|
|
|
+
|
|
|
+import cn.newfeifan.mall.framework.common.exception.ErrorCode;
|
|
|
+import cn.newfeifan.mall.module.distri.constant.DistriConstants;
|
|
|
+import cn.newfeifan.mall.module.distri.controller.admin.integral.vo.IntegralSaveReqVO;
|
|
|
+import cn.newfeifan.mall.module.distri.controller.app.applicationforwithdrawalchannel.vo.AppApplicationForWithdrawalChannelSaveReqVO;
|
|
|
+import cn.newfeifan.mall.module.distri.controller.app.ptdailywithdrawal.vo.AppPtDailyWithdrawalSaveReqVO;
|
|
|
+import cn.newfeifan.mall.module.distri.controller.app.ptprofitlog.vo.PtProfitLogSaveReqVO;
|
|
|
+import cn.newfeifan.mall.module.distri.dal.dataobject.applicationforwithdrawalchannel.ApplicationForWithdrawalChannelDO;
|
|
|
+import cn.newfeifan.mall.module.distri.dal.dataobject.integral.IntegralDO;
|
|
|
+import cn.newfeifan.mall.module.distri.dal.dataobject.ptdailywithdrawal.PtDailyWithdrawalDO;
|
|
|
+import cn.newfeifan.mall.module.distri.enums.CaclEnum;
|
|
|
+import cn.newfeifan.mall.module.distri.enums.WithdrawalChannelTypeEnum;
|
|
|
+import cn.newfeifan.mall.module.distri.service.applicationforwithdrawalchannel.ApplicationForWithdrawalChannelService;
|
|
|
+import cn.newfeifan.mall.module.distri.service.integral.IntegralService;
|
|
|
+import cn.newfeifan.mall.module.distri.service.ptdailywithdrawal.PtDailyWithdrawalService;
|
|
|
+import cn.newfeifan.mall.module.distri.service.ptprofitlog.PtProfitLogService;
|
|
|
+import cn.newfeifan.mall.module.member.dal.dataobject.user.MemberUserDO;
|
|
|
+import cn.newfeifan.mall.module.member.service.user.MemberUserService;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+import org.springframework.validation.annotation.Validated;
|
|
|
+
|
|
|
+import cn.newfeifan.mall.module.distri.controller.app.applicationforwithdrawal.vo.*;
|
|
|
+import cn.newfeifan.mall.module.distri.dal.dataobject.applicationforwithdrawal.ApplicationForWithdrawalDO;
|
|
|
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
|
|
|
+import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
|
|
|
+
|
|
|
+import cn.newfeifan.mall.module.distri.dal.mysql.applicationforwithdrawal.ApplicationForWithdrawalMapper;
|
|
|
+
|
|
|
+import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
|
+import static cn.newfeifan.mall.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
|
|
+import static cn.newfeifan.mall.module.distri.enums.ErrorCodeConstants.*;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 提现申请记录 Service 实现类
|
|
|
+ *
|
|
|
+ * @author 非繁人
|
|
|
+ */
|
|
|
+@Service
|
|
|
+@Validated
|
|
|
+public class ApplicationForWithdrawalServiceImpl implements ApplicationForWithdrawalService {
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private ApplicationForWithdrawalMapper applicationForWithdrawalMapper;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private ApplicationForWithdrawalChannelService applicationForWithdrawalChannelService;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private PtDailyWithdrawalService ptDailyWithdrawalService;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private MemberUserService userService;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private IntegralService integralService;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private PtProfitLogService ptProfitLogService;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public Long createApplicationForWithdrawal(AppApplicationForWithdrawalSaveReqVO reqVO) {
|
|
|
+
|
|
|
+ // 获取用户钱包
|
|
|
+ IntegralDO integralDO = integralService.selectByUser(getLoginUserId());
|
|
|
+
|
|
|
+ if(integralDO.getCurrentQuota() < reqVO.getAmount() * DistriConstants.INTEGRAL_PAGE2DB){
|
|
|
+ ErrorCode ERROR = new ErrorCode(1_005_031_005, "积分不足!");
|
|
|
+ throw exception(ERROR);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取pt一级提现记录
|
|
|
+ PtDailyWithdrawalDO ptDailyWithdrawalDO = ptDailyWithdrawalService.getPtDailyWithdrawalToDay();
|
|
|
+
|
|
|
+ // 二级提现记录
|
|
|
+ ApplicationForWithdrawalChannelDO applicationForWithdrawalChannelDO = applicationForWithdrawalChannelService.getApplicationForWithdrawalChannel(reqVO.getWithdrawalType(), ptDailyWithdrawalDO.getId());
|
|
|
+
|
|
|
+ // 插入
|
|
|
+ MemberUserDO user = userService.getUser(getLoginUserId());
|
|
|
+
|
|
|
+ reqVO.setApplicationForWithdrawalChannelId(applicationForWithdrawalChannelDO.getId());
|
|
|
+ reqVO.setUserId(user.getId());
|
|
|
+
|
|
|
+ // 根据渠道获取对应账号
|
|
|
+ if (reqVO.getWithdrawalType().equals(WithdrawalChannelTypeEnum.ALIPAY.getType())) {
|
|
|
+ reqVO.setWithdrawalAccount(user.getAlipayAccount());
|
|
|
+ } else if (reqVO.getWithdrawalType().equals(WithdrawalChannelTypeEnum.BANK.getType())) {
|
|
|
+ reqVO.setWithdrawalAccount(user.getBankAccount());
|
|
|
+ }
|
|
|
+
|
|
|
+ if(reqVO.getWithdrawalAccount() == null || reqVO.getWithdrawalAccount().isEmpty()){
|
|
|
+ ErrorCode ERROR = new ErrorCode(1_005_031_005, "提现账号不能为空!");
|
|
|
+ throw exception(ERROR);
|
|
|
+ }
|
|
|
+
|
|
|
+ ApplicationForWithdrawalDO applicationForWithdrawal = BeanUtils.toBean(reqVO, ApplicationForWithdrawalDO.class);
|
|
|
+ applicationForWithdrawalMapper.insert(applicationForWithdrawal);
|
|
|
+
|
|
|
+ // 每一次申请就会改变二级表总数据
|
|
|
+ applicationForWithdrawalChannelDO.setAmount(applicationForWithdrawalChannelDO.getAmount() + reqVO.getAmount());
|
|
|
+ applicationForWithdrawalChannelDO.setCount(applicationForWithdrawalChannelDO.getCount() + 1);
|
|
|
+ applicationForWithdrawalChannelService.updateApplicationForWithdrawalChannel(BeanUtils.toBean(applicationForWithdrawalChannelDO, AppApplicationForWithdrawalChannelSaveReqVO.class));
|
|
|
+
|
|
|
+ // 每一次申请就会改变一级表总数据
|
|
|
+ ptDailyWithdrawalDO.setAmount(ptDailyWithdrawalDO.getAmount() + reqVO.getAmount());
|
|
|
+ ptDailyWithdrawalDO.setCount(ptDailyWithdrawalDO.getCount() + 1);
|
|
|
+ ptDailyWithdrawalService.updatePtDailyWithdrawal(BeanUtils.toBean(ptDailyWithdrawalDO, AppPtDailyWithdrawalSaveReqVO.class));
|
|
|
+
|
|
|
+ // 修改用户钱包余额
|
|
|
+ integralDO.setCurrentQuota(integralDO.getCurrentQuota() - reqVO.getAmount() * DistriConstants.INTEGRAL_PAGE2DB);
|
|
|
+ integralService.updateIntegral(BeanUtils.toBean(integralDO, IntegralSaveReqVO.class));
|
|
|
+
|
|
|
+ // 记录用户积分变动日志
|
|
|
+ PtProfitLogSaveReqVO ptProfitLogSaveReqVO = PtProfitLogSaveReqVO.builder()
|
|
|
+ .amount(-reqVO.getAmount() * DistriConstants.INTEGRAL_PAGE2DB)
|
|
|
+ .afterAmount(integralDO.getCurrentQuota())
|
|
|
+ .profitStatus(CaclEnum.WITHDRAWAL.getType())
|
|
|
+ .userId(user.getId())
|
|
|
+ .generateUserId(user.getId())
|
|
|
+ .build();
|
|
|
+ ptProfitLogService.createPtProfitLog(ptProfitLogSaveReqVO);
|
|
|
+
|
|
|
+ // 返回
|
|
|
+ return applicationForWithdrawal.getId();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void updateApplicationForWithdrawal(AppApplicationForWithdrawalSaveReqVO updateReqVO) {
|
|
|
+ // 校验存在
|
|
|
+ validateApplicationForWithdrawalExists(updateReqVO.getId());
|
|
|
+ // 更新
|
|
|
+ ApplicationForWithdrawalDO updateObj = BeanUtils.toBean(updateReqVO, ApplicationForWithdrawalDO.class);
|
|
|
+ applicationForWithdrawalMapper.updateById(updateObj);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void deleteApplicationForWithdrawal(Long id) {
|
|
|
+ // 校验存在
|
|
|
+ validateApplicationForWithdrawalExists(id);
|
|
|
+ // 删除
|
|
|
+ applicationForWithdrawalMapper.deleteById(id);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void validateApplicationForWithdrawalExists(Long id) {
|
|
|
+ if (applicationForWithdrawalMapper.selectById(id) == null) {
|
|
|
+ throw exception(APPLICATION_FOR_WITHDRAWAL_NOT_EXISTS);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ApplicationForWithdrawalDO getApplicationForWithdrawal(Long id) {
|
|
|
+ return applicationForWithdrawalMapper.selectById(id);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public PageResult<ApplicationForWithdrawalDO> getApplicationForWithdrawalPage(AppApplicationForWithdrawalPageReqVO pageReqVO) {
|
|
|
+
|
|
|
+ pageReqVO.setUserId(getLoginUserId());
|
|
|
+
|
|
|
+ PageResult<ApplicationForWithdrawalDO> result = applicationForWithdrawalMapper.selectPage(pageReqVO);
|
|
|
+
|
|
|
+ for (ApplicationForWithdrawalDO withdrawalDO : result.getList()) {
|
|
|
+ withdrawalDO.setWithdrawalAccount(formatAccount(withdrawalDO.getWithdrawalAccount()));
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 格式化账号,只显示前三位和后四位,中间用*代替
|
|
|
+ *
|
|
|
+ * @param account 原始账号字符串
|
|
|
+ * @return 格式化后的账号
|
|
|
+ */
|
|
|
+ private String formatAccount(String account) {
|
|
|
+ if (account == null || account.length() <= 7) {
|
|
|
+ return "****"; // 如果账号长度小于等于7,显示四个星号
|
|
|
+ }
|
|
|
+
|
|
|
+ // 截取前三位
|
|
|
+ String firstPart = account.substring(0, 3);
|
|
|
+ // 截取后四位
|
|
|
+ String lastPart = account.substring(account.length() - 4);
|
|
|
+
|
|
|
+ // 生成中间的*部分
|
|
|
+ String middlePart = "****";
|
|
|
+
|
|
|
+ // 拼接最终的格式化账号
|
|
|
+ return firstPart + middlePart + lastPart;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|