| | |
| | | package com.doumee.service.business.impl; |
| | | |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.doumee.config.wx.SendWxMessage; |
| | | import com.doumee.config.wx.TransferToUser; |
| | | import com.doumee.config.wx.WXPayUtility; |
| | | import com.doumee.config.wx.WxMiniConfig; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.doumee.core.constants.Constants; |
| | | import com.doumee.core.constants.ResponseStatus; |
| | | import com.doumee.core.exception.BusinessException; |
| | | import com.doumee.core.model.PageData; |
| | | import com.doumee.core.model.PageWrap; |
| | | import com.doumee.core.utils.DateUtil; |
| | | import com.doumee.core.utils.Utils; |
| | | import com.doumee.dao.business.MemberMapper; |
| | | import com.doumee.dao.business.MemberRevenueMapper; |
| | | import com.doumee.dao.business.DriverInfoMapper; |
| | | import com.doumee.dao.business.RevenueMapper; |
| | | import com.doumee.dao.business.ShopInfoMapper; |
| | | import com.doumee.dao.business.WithdrawalOrdersMapper; |
| | | import com.doumee.dao.business.model.Member; |
| | | import com.doumee.dao.business.model.MemberRevenue; |
| | | import com.doumee.dao.business.model.DriverInfo; |
| | | import com.doumee.dao.business.model.Revenue; |
| | | import com.doumee.dao.business.model.ShopInfo; |
| | | import com.doumee.dao.business.model.WithdrawalOrders; |
| | | import com.doumee.dao.dto.WithdrawalApproveDTO; |
| | | import com.doumee.dao.dto.WithdrawalDTO; |
| | | import com.doumee.dao.system.SystemUserMapper; |
| | | import com.doumee.dao.system.model.SystemUser; |
| | | import com.doumee.service.business.WithdrawalOrdersService; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.github.yulichang.wrapper.MPJLambdaWrapper; |
| | | import org.apache.commons.lang3.StringUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.util.CollectionUtils; |
| | | import org.springframework.util.StringUtils; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.Arrays; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.Objects; |
| | | import java.util.UUID; |
| | | import java.util.concurrent.ThreadLocalRandom; |
| | | |
| | | /** |
| | | * 提现申请记录Service实现 |
| | | * @author 江蹄蹄 |
| | | * @date 2025/07/09 12:00 |
| | | * @author rk |
| | | * @date 2026/04/10 |
| | | */ |
| | | @Service |
| | | public class WithdrawalOrdersServiceImpl implements WithdrawalOrdersService { |
| | |
| | | private WithdrawalOrdersMapper withdrawalOrdersMapper; |
| | | |
| | | @Autowired |
| | | private MemberMapper memberMapper; |
| | | private SystemUserMapper systemUserMapper; |
| | | |
| | | @Autowired |
| | | private MemberRevenueMapper memberRevenueMapper; |
| | | private ShopInfoMapper shopInfoMapper; |
| | | |
| | | @Autowired |
| | | private SendWxMessage sendWxMessage; |
| | | private DriverInfoMapper driverInfoMapper; |
| | | |
| | | @Autowired |
| | | private RevenueMapper revenueMapper; |
| | | |
| | | @Override |
| | | public Integer create(WithdrawalOrders withdrawalOrders) { |
| | |
| | | |
| | | @Override |
| | | public void deleteById(Integer id) { |
| | | withdrawalOrdersMapper.deleteById(id); |
| | | withdrawalOrdersMapper.update(new UpdateWrapper<WithdrawalOrders>().lambda() |
| | | .set(WithdrawalOrders::getDeleted, Constants.ONE) |
| | | .eq(WithdrawalOrders::getId, id)); |
| | | } |
| | | |
| | | @Override |
| | |
| | | |
| | | @Override |
| | | public void deleteByIdInBatch(List<Integer> ids) { |
| | | if (CollectionUtils.isEmpty(ids)) { |
| | | if (ids == null || ids.isEmpty()) { |
| | | return; |
| | | } |
| | | withdrawalOrdersMapper.deleteBatchIds(ids); |
| | |
| | | } |
| | | |
| | | @Override |
| | | public void updateByIdInBatch(List<WithdrawalOrders> withdrawalOrderss) { |
| | | if (CollectionUtils.isEmpty(withdrawalOrderss)) { |
| | | public void updateByIdInBatch(List<WithdrawalOrders> withdrawalOrdersList) { |
| | | if (withdrawalOrdersList == null || withdrawalOrdersList.isEmpty()) { |
| | | return; |
| | | } |
| | | for (WithdrawalOrders withdrawalOrders: withdrawalOrderss) { |
| | | for (WithdrawalOrders withdrawalOrders : withdrawalOrdersList) { |
| | | this.updateById(withdrawalOrders); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public WithdrawalOrders findById(Integer id) { |
| | | return withdrawalOrdersMapper.selectById(id); |
| | | WithdrawalOrders order = withdrawalOrdersMapper.selectById(id); |
| | | if (Objects.isNull(order)) { |
| | | throw new BusinessException(ResponseStatus.DATA_EMPTY); |
| | | } |
| | | // 查询审批人名称 |
| | | fillUpdateUserName(order); |
| | | // 根据用户类型查询关联信息 |
| | | if (Constants.ONE.equals(order.getMemberType())) { |
| | | fillMemberInfo(order); |
| | | } else { |
| | | fillShopInfo(order); |
| | | } |
| | | return order; |
| | | } |
| | | |
| | | @Override |
| | |
| | | QueryWrapper<WithdrawalOrders> wrapper = new QueryWrapper<>(withdrawalOrders); |
| | | return withdrawalOrdersMapper.selectList(wrapper); |
| | | } |
| | | |
| | | |
| | | @Override |
| | | public PageData<WithdrawalOrders> findPage(PageWrap<WithdrawalOrders> pageWrap) { |
| | | IPage<WithdrawalOrders> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); |
| | | QueryWrapper<WithdrawalOrders> queryWrapper = new QueryWrapper<>(); |
| | | MPJLambdaWrapper<WithdrawalOrders> queryWrapper = new MPJLambdaWrapper<>(); |
| | | Utils.MP.blankToNull(pageWrap.getModel()); |
| | | if (pageWrap.getModel().getId() != null) { |
| | | queryWrapper.lambda().eq(WithdrawalOrders::getId, pageWrap.getModel().getId()); |
| | | pageWrap.getModel().setDeleted(Constants.ZERO); |
| | | |
| | | // 公共:审批人名称 |
| | | queryWrapper.selectAll(WithdrawalOrders.class) |
| | | .selectAs(SystemUser::getUsername, WithdrawalOrders::getUpdateUserName) |
| | | .leftJoin(SystemUser.class, SystemUser::getId, WithdrawalOrders::getUserId); |
| | | |
| | | // 根据用户类型关联不同表 |
| | | Integer memberType = pageWrap.getModel().getMemberType(); |
| | | if (Constants.ONE.equals(memberType)) { |
| | | // 司机端:关联 DriverInfo 表 |
| | | queryWrapper.selectAs(DriverInfo::getName, WithdrawalOrders::getMemberName) |
| | | .selectAs(DriverInfo::getTelephone, WithdrawalOrders::getMemberTelephone) |
| | | .leftJoin(DriverInfo.class, DriverInfo::getMemberId, WithdrawalOrders::getMemberId); |
| | | } else { |
| | | // 店铺端 / 不筛选:关联 ShopInfo 表 |
| | | queryWrapper.selectAs(ShopInfo::getName, WithdrawalOrders::getShopName) |
| | | .selectAs(ShopInfo::getLinkName, WithdrawalOrders::getLinkName) |
| | | .leftJoin(ShopInfo.class, ShopInfo::getId, WithdrawalOrders::getMemberId, |
| | | ext -> ext.eq(ShopInfo::getDeleted, Constants.ZERO)); |
| | | } |
| | | if (pageWrap.getModel().getDeleted() != null) { |
| | | queryWrapper.lambda().eq(WithdrawalOrders::getDeleted, pageWrap.getModel().getDeleted()); |
| | | |
| | | queryWrapper.eq(WithdrawalOrders::getDeleted, pageWrap.getModel().getDeleted()); |
| | | if (memberType != null) { |
| | | queryWrapper.eq(WithdrawalOrders::getMemberType, memberType); |
| | | } |
| | | if (pageWrap.getModel().getCreateUser() != null) { |
| | | queryWrapper.lambda().eq(WithdrawalOrders::getCreateUser, pageWrap.getModel().getCreateUser()); |
| | | } |
| | | if (pageWrap.getModel().getCreateTime() != null) { |
| | | queryWrapper.lambda().ge(WithdrawalOrders::getCreateTime, Utils.Date.getStart(pageWrap.getModel().getCreateTime())); |
| | | queryWrapper.lambda().le(WithdrawalOrders::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateTime())); |
| | | } |
| | | if (pageWrap.getModel().getUpdateUser() != null) { |
| | | queryWrapper.lambda().eq(WithdrawalOrders::getUpdateUser, pageWrap.getModel().getUpdateUser()); |
| | | } |
| | | if (pageWrap.getModel().getUpdateTime() != null) { |
| | | queryWrapper.lambda().ge(WithdrawalOrders::getUpdateTime, Utils.Date.getStart(pageWrap.getModel().getUpdateTime())); |
| | | queryWrapper.lambda().le(WithdrawalOrders::getUpdateTime, Utils.Date.getEnd(pageWrap.getModel().getUpdateTime())); |
| | | } |
| | | if (pageWrap.getModel().getRemark() != null) { |
| | | queryWrapper.lambda().eq(WithdrawalOrders::getRemark, pageWrap.getModel().getRemark()); |
| | | if (StringUtils.isNotBlank(pageWrap.getModel().getOutBillNo())) { |
| | | queryWrapper.like(WithdrawalOrders::getOutBillNo, pageWrap.getModel().getOutBillNo()); |
| | | } |
| | | if (pageWrap.getModel().getMemberId() != null) { |
| | | queryWrapper.lambda().eq(WithdrawalOrders::getMemberId, pageWrap.getModel().getMemberId()); |
| | | } |
| | | if (pageWrap.getModel().getAmount() != null) { |
| | | queryWrapper.lambda().eq(WithdrawalOrders::getAmount, pageWrap.getModel().getAmount()); |
| | | } |
| | | if (pageWrap.getModel().getWxExternalNo() != null) { |
| | | queryWrapper.lambda().eq(WithdrawalOrders::getWxExternalNo, pageWrap.getModel().getWxExternalNo()); |
| | | queryWrapper.eq(WithdrawalOrders::getMemberId, pageWrap.getModel().getMemberId()); |
| | | } |
| | | if (pageWrap.getModel().getStatus() != null) { |
| | | queryWrapper.lambda().eq(WithdrawalOrders::getStatus, pageWrap.getModel().getStatus()); |
| | | queryWrapper.eq(WithdrawalOrders::getStatus, pageWrap.getModel().getStatus()); |
| | | } |
| | | if (pageWrap.getModel().getDoneTime() != null) { |
| | | queryWrapper.lambda().ge(WithdrawalOrders::getDoneTime, Utils.Date.getStart(pageWrap.getModel().getDoneTime())); |
| | | queryWrapper.lambda().le(WithdrawalOrders::getDoneTime, Utils.Date.getEnd(pageWrap.getModel().getDoneTime())); |
| | | if (pageWrap.getModel().getType() != null) { |
| | | queryWrapper.eq(WithdrawalOrders::getType, pageWrap.getModel().getType()); |
| | | } |
| | | if (pageWrap.getModel().getDoneInfo() != null) { |
| | | queryWrapper.lambda().eq(WithdrawalOrders::getDoneInfo, pageWrap.getModel().getDoneInfo()); |
| | | if (pageWrap.getModel().getCreateStartTime() != null) { |
| | | queryWrapper.ge(WithdrawalOrders::getCreateTime, Utils.Date.getStart(pageWrap.getModel().getCreateStartTime())); |
| | | } |
| | | for(PageWrap.SortData sortData: pageWrap.getSorts()) { |
| | | if (pageWrap.getModel().getCreateEndTime() != null) { |
| | | queryWrapper.le(WithdrawalOrders::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateEndTime())); |
| | | } |
| | | for (PageWrap.SortData sortData : pageWrap.getSorts()) { |
| | | if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) { |
| | | queryWrapper.orderByDesc(sortData.getProperty()); |
| | | } else { |
| | | queryWrapper.orderByAsc(sortData.getProperty()); |
| | | } |
| | | } |
| | | return PageData.from(withdrawalOrdersMapper.selectPage(page, queryWrapper)); |
| | | return PageData.from(withdrawalOrdersMapper.selectJoinPage(page, WithdrawalOrders.class, queryWrapper)); |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | @Override |
| | | public long count(WithdrawalOrders withdrawalOrders) { |
| | |
| | | return withdrawalOrdersMapper.selectCount(wrapper); |
| | | } |
| | | |
| | | |
| | | /************************************移动端接口*******************************************/ |
| | | |
| | | /** |
| | | * 提现申请 |
| | | * @param withdrawalDTO |
| | | */ |
| | | @Override |
| | | @Transactional(rollbackFor = {BusinessException.class,Exception.class}) |
| | | public TransferToUser.TransferToUserResponse applyWithdrawal(WithdrawalDTO withdrawalDTO){ |
| | | if(Objects.isNull(withdrawalDTO) |
| | | || Objects.isNull(withdrawalDTO.getAmount()) |
| | | || org.apache.commons.lang3.StringUtils.isBlank(withdrawalDTO.getName()) |
| | | || withdrawalDTO.getAmount().compareTo(BigDecimal.ZERO)<=Constants.ZERO |
| | | ){ |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST); |
| | | public Long totalAmount(PageWrap<WithdrawalOrders> pageWrap) { |
| | | QueryWrapper<WithdrawalOrders> queryWrapper = new QueryWrapper<>(); |
| | | queryWrapper.select("IFNULL(SUM(amount), 0) as amount"); |
| | | Utils.MP.blankToNull(pageWrap.getModel()); |
| | | queryWrapper.lambda().eq(WithdrawalOrders::getDeleted, Constants.ZERO); |
| | | queryWrapper.lambda().in(WithdrawalOrders::getStatus, Arrays.asList(Constants.ZERO, Constants.ONE)); |
| | | if (pageWrap.getModel().getOutBillNo() != null) { |
| | | queryWrapper.lambda().like(WithdrawalOrders::getOutBillNo, pageWrap.getModel().getOutBillNo()); |
| | | } |
| | | Member member = memberMapper.selectById(withdrawalDTO.getMember().getId()); |
| | | if(Objects.isNull(member)){ |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"用户信息异常,请联系管理员"); |
| | | if (pageWrap.getModel().getMemberId() != null) { |
| | | queryWrapper.lambda().eq(WithdrawalOrders::getMemberId, pageWrap.getModel().getMemberId()); |
| | | } |
| | | if(member.getAmount() < withdrawalDTO.getAmount().multiply(new BigDecimal("100")).intValue()){ |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,可提现余额不足。"); |
| | | if (pageWrap.getModel().getStatus() != null) { |
| | | queryWrapper.lambda().eq(WithdrawalOrders::getStatus, pageWrap.getModel().getStatus()); |
| | | } |
| | | if(StringUtils.isEmpty(member.getName())){ |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"请先去维护真实姓名后进行提现申请"); |
| | | if (pageWrap.getModel().getType() != null) { |
| | | queryWrapper.lambda().eq(WithdrawalOrders::getType, pageWrap.getModel().getType()); |
| | | } |
| | | WithdrawalOrders withdrawalOrders = new WithdrawalOrders(); |
| | | withdrawalOrders.setCreateTime(new Date()); |
| | | withdrawalOrders.setMemberId(member.getId()); |
| | | withdrawalOrders.setOutBillNo(UUID.randomUUID().toString().replace("-","")); |
| | | withdrawalOrders.setAmount((withdrawalDTO.getAmount().multiply(new BigDecimal("100"))).longValue()); |
| | | withdrawalOrders.setStatus(Constants.ZERO); |
| | | withdrawalOrders.setType(Constants.ZERO); |
| | | withdrawalOrders.setDeleted(Constants.ZERO); |
| | | |
| | | //发起提现申请 |
| | | TransferToUser.TransferToUserRequest transferToUserRequest = new TransferToUser.TransferToUserRequest(); |
| | | transferToUserRequest.openid = member.getOpenid(); |
| | | transferToUserRequest.outBillNo = withdrawalOrders.getOutBillNo(); |
| | | transferToUserRequest.transferAmount = withdrawalOrders.getAmount(); |
| | | transferToUserRequest.transferRemark = "提现申请"; |
| | | try { |
| | | TransferToUser.TransferToUserResponse response = WxMiniConfig.transferToUser.run(transferToUserRequest,withdrawalDTO.getName()); |
| | | withdrawalOrders.setRemark(JSONObject.toJSONString(response)); |
| | | if(response.state.name().equals("WAIT_USER_CONFIRM") || response.state.name().equals("ACCEPTED")){ |
| | | withdrawalOrders.setWxExternalNo(response.transferBillNo); |
| | | } |
| | | withdrawalOrdersMapper.insert(withdrawalOrders); |
| | | //更新用户余额 |
| | | memberMapper.update(new UpdateWrapper<Member>().lambda().setSql(" AMOUNT = AMOUNT - " + withdrawalOrders.getAmount() ).eq(Member::getId,member.getId())); |
| | | //存储流水记录 |
| | | MemberRevenue memberRevenue = new MemberRevenue(); |
| | | memberRevenue.setCreateTime(new Date()); |
| | | memberRevenue.setTransactionNo(withdrawalOrders.getOutBillNo()); |
| | | memberRevenue.setDeleted(Constants.ZERO); |
| | | memberRevenue.setMemberId(member.getId()); |
| | | memberRevenue.setType(Constants.THREE); |
| | | memberRevenue.setOptType(-Constants.ONE); |
| | | memberRevenue.setBeforeAmount(member.getAmount()); |
| | | memberRevenue.setAmount(withdrawalOrders.getAmount()); |
| | | memberRevenue.setAfterAmount(member.getAmount() - withdrawalOrders.getAmount()); |
| | | memberRevenue.setObjId(withdrawalOrders.getId()); |
| | | memberRevenue.setRemark(Constants.RevenueType.getInfo(memberRevenue.getType())); |
| | | memberRevenue.setObjType(Constants.ONE); |
| | | memberRevenue.setDeleted(Constants.ZERO); |
| | | memberRevenue.setStatus(Constants.TWO); |
| | | memberRevenueMapper.insert(memberRevenue); |
| | | return response; |
| | | } catch (WXPayUtility.ApiException e) { |
| | | String message = JSONObject.parseObject(e.getBody()).getString("message"); |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),message); |
| | | if (pageWrap.getModel().getCreateStartTime() != null) { |
| | | queryWrapper.lambda().ge(WithdrawalOrders::getCreateTime, Utils.Date.getStart(pageWrap.getModel().getCreateStartTime())); |
| | | } |
| | | } |
| | | |
| | | |
| | | @Override |
| | | public void transferSuccess(String outBillNo,Boolean isSuccess){ |
| | | WithdrawalOrders withdrawalOrders = withdrawalOrdersMapper.selectOne(new QueryWrapper<WithdrawalOrders>().lambda() |
| | | .eq(WithdrawalOrders::getOutBillNo,outBillNo).last("limit 1")); |
| | | Member member = memberMapper.selectById(withdrawalOrders.getMemberId()); |
| | | if(Objects.isNull(member)){ |
| | | return; |
| | | if (pageWrap.getModel().getCreateEndTime() != null) { |
| | | queryWrapper.lambda().le(WithdrawalOrders::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateEndTime())); |
| | | } |
| | | if(Objects.nonNull(withdrawalOrders)){ |
| | | //转账成功 |
| | | if(isSuccess){ |
| | | withdrawalOrdersMapper.update(new UpdateWrapper<WithdrawalOrders>().lambda() |
| | | .set(WithdrawalOrders::getStatus,Constants.ONE) |
| | | .set(WithdrawalOrders::getUpdateTime, DateUtil.getCurrDateTime()) |
| | | .eq(WithdrawalOrders::getOutBillNo,outBillNo) |
| | | ); |
| | | //修改流水记录状态 |
| | | memberRevenueMapper.update(new UpdateWrapper<MemberRevenue>().lambda() |
| | | .set(MemberRevenue::getStatus,Constants.ZERO) |
| | | .set(MemberRevenue::getUpdateTime, DateUtil.getCurrDateTime()) |
| | | .eq(MemberRevenue::getObjId,withdrawalOrders.getId()) |
| | | .eq(MemberRevenue::getObjType,Constants.ONE) |
| | | ); |
| | | withdrawalOrders.setUpdateTime(new Date()); |
| | | sendWxMessage.withdrawalMessage(member.getOpenid(),withdrawalOrders); |
| | | }else { |
| | | //更新用户余额 |
| | | memberMapper.update(new UpdateWrapper<Member>().lambda().setSql(" AMOUNT = AMOUNT + " + withdrawalOrders.getAmount() ).eq(Member::getId,withdrawalOrders.getMemberId())); |
| | | //修改流水记录状态 |
| | | memberRevenueMapper.update(new UpdateWrapper<MemberRevenue>().lambda() |
| | | .set(MemberRevenue::getStatus,Constants.ONE) |
| | | .set(MemberRevenue::getUpdateTime, DateUtil.getCurrDateTime()) |
| | | .eq(MemberRevenue::getObjId,withdrawalOrders.getId()) |
| | | .eq(MemberRevenue::getObjType,Constants.ONE) |
| | | ); |
| | | //存储流水记录 |
| | | MemberRevenue memberRevenue = new MemberRevenue(); |
| | | memberRevenue.setCreateTime(new Date()); |
| | | memberRevenue.setTransactionNo(withdrawalOrders.getOutBillNo()); |
| | | memberRevenue.setDeleted(Constants.ZERO); |
| | | memberRevenue.setMemberId(withdrawalOrders.getMemberId()); |
| | | memberRevenue.setType(Constants.FOUR); |
| | | memberRevenue.setOptType(Constants.ONE); |
| | | memberRevenue.setBeforeAmount(member.getAmount()); |
| | | memberRevenue.setAmount(withdrawalOrders.getAmount()); |
| | | memberRevenue.setAfterAmount(member.getAmount() + withdrawalOrders.getAmount()); |
| | | memberRevenue.setObjId(withdrawalOrders.getId()); |
| | | memberRevenue.setRemark(Constants.RevenueType.getInfo(memberRevenue.getType())); |
| | | memberRevenue.setObjType(Constants.ONE); |
| | | memberRevenue.setDeleted(Constants.ZERO); |
| | | memberRevenue.setStatus(Constants.ZERO); |
| | | memberRevenueMapper.insert(memberRevenue); |
| | | } |
| | | } |
| | | |
| | | WithdrawalOrders result = withdrawalOrdersMapper.selectOne(queryWrapper); |
| | | return result != null && result.getAmount() != null ? result.getAmount() : 0L; |
| | | } |
| | | |
| | | @Override |
| | | public void cancelTransfer(TransferToUser.CancelTransferRequest request){ |
| | | if(Objects.isNull(request) |
| | | || StringUtils.isEmpty(request.outBillNo)){ |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST); |
| | | public void approve(WithdrawalApproveDTO dto) { |
| | | if (dto == null || dto.getId() == null || dto.getStatus() == null) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "审批参数不完整"); |
| | | } |
| | | WithdrawalOrders withdrawalOrders = withdrawalOrdersMapper.selectOne(new QueryWrapper<WithdrawalOrders>().lambda().eq(WithdrawalOrders::getOutBillNo,request.outBillNo).last("limit 1")); |
| | | if(Objects.isNull(withdrawalOrders)){ |
| | | if (!Constants.ONE.equals(dto.getStatus()) && !Constants.TWO.equals(dto.getStatus())) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "审批结果仅支持通过或拒绝"); |
| | | } |
| | | |
| | | WithdrawalOrders order = withdrawalOrdersMapper.selectById(dto.getId()); |
| | | if (Objects.isNull(order)) { |
| | | throw new BusinessException(ResponseStatus.DATA_EMPTY); |
| | | } |
| | | Member member = memberMapper.selectById(withdrawalOrders.getMemberId()); |
| | | if(Objects.isNull(member)){ |
| | | throw new BusinessException(ResponseStatus.DATA_EMPTY); |
| | | if (!Constants.ZERO.equals(order.getStatus())) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "仅申请中的提现订单可审批"); |
| | | } |
| | | try { |
| | | TransferToUser.CancelTransferResponse response = WxMiniConfig.transferToUser.cancelRun(request); |
| | | if(response.state.equals("CANCELING")){ |
| | | //标记提现失败 加回对应的提现金额 |
| | | withdrawalOrdersMapper.update(new UpdateWrapper<WithdrawalOrders>() |
| | | .lambda().set(WithdrawalOrders::getStatus,Constants.TWO) |
| | | .eq(WithdrawalOrders::getId,withdrawalOrders.getId())); |
| | | |
| | | memberRevenueMapper.update(new UpdateWrapper<MemberRevenue>().lambda().set(MemberRevenue::getStatus,Constants.ONE) |
| | | .set(MemberRevenue::getUpdateTime,new Date()) |
| | | .eq(MemberRevenue::getObjId,withdrawalOrders.getId())) |
| | | ; |
| | | // 获取当前登录用户 |
| | | Integer currentUserId = getCurrentUserId(); |
| | | Date now = new Date(); |
| | | |
| | | //更新用户余额 |
| | | memberMapper.update(new UpdateWrapper<Member>().lambda().setSql(" AMOUNT = AMOUNT + " + withdrawalOrders.getAmount() ).eq(Member::getId,withdrawalOrders.getMemberId())); |
| | | WithdrawalOrders update = new WithdrawalOrders(); |
| | | update.setId(dto.getId()); |
| | | update.setStatus(dto.getStatus()); |
| | | update.setUserId(currentUserId); |
| | | update.setApproveTime(now); |
| | | update.setApproveRemark(dto.getApproveRemark()); |
| | | update.setUpdateTime(now); |
| | | withdrawalOrdersMapper.updateById(update); |
| | | |
| | | //存储流水记录 |
| | | MemberRevenue memberRevenue = new MemberRevenue(); |
| | | memberRevenue.setCreateTime(new Date()); |
| | | memberRevenue.setMemberId(withdrawalOrders.getMemberId()); |
| | | memberRevenue.setType(Constants.FOUR); |
| | | memberRevenue.setOptType(Constants.ONE); |
| | | memberRevenue.setBeforeAmount(member.getAmount()); |
| | | memberRevenue.setAmount(withdrawalOrders.getAmount()); |
| | | memberRevenue.setAfterAmount(member.getAmount() + withdrawalOrders.getAmount()); |
| | | memberRevenue.setObjId(withdrawalOrders.getId()); |
| | | memberRevenue.setObjType(Constants.ONE); |
| | | memberRevenue.setDeleted(Constants.ZERO); |
| | | memberRevenue.setStatus(Constants.ZERO); |
| | | memberRevenueMapper.insert(memberRevenue); |
| | | |
| | | // 驳回时退回余额 |
| | | if (Constants.TWO.equals(dto.getStatus())) { |
| | | Long amountFen = order.getAmount() != null ? order.getAmount() : 0L; |
| | | if (amountFen > 0 && order.getMemberId() != null) { |
| | | if (Constants.equalsInteger(order.getMemberType(), Constants.ONE)) { |
| | | // 司机:通过 memberId 查 DriverInfo,退回 balance |
| | | DriverInfo driver = driverInfoMapper.selectOne(new QueryWrapper<DriverInfo>().lambda() |
| | | .eq(DriverInfo::getMemberId, order.getMemberId()) |
| | | .eq(DriverInfo::getDeleted, Constants.ZERO) |
| | | .last("limit 1")); |
| | | if (driver != null) { |
| | | driverInfoMapper.update(new UpdateWrapper<DriverInfo>().lambda() |
| | | .setSql(" BALANCE = IFNULL(BALANCE, 0) + " + amountFen) |
| | | .eq(DriverInfo::getId, driver.getId())); |
| | | } |
| | | } else if (Constants.equalsInteger(order.getMemberType(), Constants.TWO)) { |
| | | // 门店:通过 memberId 查 ShopInfo,退回 balance |
| | | ShopInfo shop = shopInfoMapper.selectOne(new QueryWrapper<ShopInfo>().lambda() |
| | | .eq(ShopInfo::getRegionMemberId, order.getMemberId()) |
| | | .eq(ShopInfo::getDeleted, Constants.ZERO) |
| | | .last("limit 1")); |
| | | if (shop != null) { |
| | | shopInfoMapper.update(new UpdateWrapper<ShopInfo>().lambda() |
| | | .setSql(" BALANCE = IFNULL(BALANCE, 0) + " + amountFen) |
| | | .eq(ShopInfo::getId, shop.getId())); |
| | | } |
| | | } |
| | | // 创建退回 Revenue 记录 |
| | | Revenue revenue = new Revenue(); |
| | | revenue.setMemberId(order.getMemberId()); |
| | | revenue.setMemberType(order.getMemberType()); |
| | | revenue.setType(Constants.TWO); // 2=提现退回 |
| | | revenue.setOptType(Constants.ONE); // 1=收入 |
| | | revenue.setAmount(amountFen); |
| | | revenue.setVaildStatus(Constants.ONE); // 已入账 |
| | | revenue.setObjId(order.getId()); |
| | | revenue.setObjType(Constants.ONE); // 1=提现业务 |
| | | revenue.setStatus(Constants.ZERO); |
| | | revenue.setDeleted(Constants.ZERO); |
| | | revenue.setCreateTime(now); |
| | | revenueMapper.insert(revenue); |
| | | } |
| | | System.out.println(JSONObject.toJSONString(response)); |
| | | } catch (WXPayUtility.ApiException e) { |
| | | String message = JSONObject.parseObject(e.getBody()).getString("message"); |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),message); |
| | | } |
| | | |
| | | } |
| | | |
| | | private Integer getCurrentUserId() { |
| | | com.doumee.core.model.LoginUserInfo user = |
| | | (com.doumee.core.model.LoginUserInfo) org.apache.shiro.SecurityUtils.getSubject().getPrincipal(); |
| | | return user != null ? user.getId() : null; |
| | | } |
| | | |
| | | private void fillUpdateUserName(WithdrawalOrders order) { |
| | | if (order.getUserId() != null) { |
| | | SystemUser user = systemUserMapper.selectById(order.getUserId()); |
| | | if (user != null) { |
| | | order.setUpdateUserName(user.getUsername()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | private void fillShopInfo(WithdrawalOrders order) { |
| | | if (order.getMemberId() != null) { |
| | | ShopInfo shop = shopInfoMapper.selectById(order.getMemberId()); |
| | | if (shop != null && !Constants.ONE.equals(shop.getDeleted())) { |
| | | order.setShopInfo(shop); |
| | | order.setShopName(shop.getName()); |
| | | order.setLinkName(shop.getLinkName()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | private void fillMemberInfo(WithdrawalOrders order) { |
| | | if (order.getMemberId() != null) { |
| | | DriverInfo driver = driverInfoMapper.selectOne( |
| | | new QueryWrapper<DriverInfo>().lambda() |
| | | .eq(DriverInfo::getMemberId, order.getMemberId()) |
| | | .eq(DriverInfo::getDeleted, Constants.ZERO) |
| | | .last("limit 1")); |
| | | if (driver != null) { |
| | | order.setMemberName(driver.getName()); |
| | | order.setMemberTelephone(driver.getTelephone()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void applyDriverWithdrawal(WithdrawalDTO dto, Integer memberId) { |
| | | DriverInfo driver = driverInfoMapper.selectOne(new QueryWrapper<DriverInfo>().lambda() |
| | | .eq(DriverInfo::getMemberId, memberId) |
| | | .eq(DriverInfo::getDeleted, Constants.ZERO) |
| | | .last("limit 1")); |
| | | if (driver == null) { |
| | | throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "司机信息不存在"); |
| | | } |
| | | long amountFen = dto.getAmount().multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_HALF_UP).longValue(); |
| | | long balance = driver.getBalance() != null ? driver.getBalance() : 0L; |
| | | if (amountFen <= 0) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "提现金额必须大于0"); |
| | | } |
| | | if (amountFen > balance) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "提现金额不能超过可用余额"); |
| | | } |
| | | String billNo = generateBillNo(); |
| | | Date now = new Date(); |
| | | // 扣减司机余额 |
| | | driverInfoMapper.update(new UpdateWrapper<DriverInfo>().lambda() |
| | | .setSql(" BALANCE = IFNULL(BALANCE, 0) - " + amountFen) |
| | | .eq(DriverInfo::getId, driver.getId())); |
| | | // 创建提现记录 |
| | | WithdrawalOrders order = new WithdrawalOrders(); |
| | | order.setMemberId(memberId); |
| | | order.setMemberType(Constants.ONE); |
| | | order.setAmount(amountFen); |
| | | order.setStatus(Constants.ZERO); |
| | | order.setType(Constants.ZERO); |
| | | order.setOutBillNo(billNo); |
| | | order.setAliAccount(dto.getAliAccount()); |
| | | order.setDeleted(Constants.ZERO); |
| | | order.setCreateTime(now); |
| | | order.setUpdateTime(now); |
| | | order.setCreateUser(memberId); |
| | | withdrawalOrdersMapper.insert(order); |
| | | // 创建支出 Revenue 记录 |
| | | Revenue revenue = new Revenue(); |
| | | revenue.setMemberId(memberId); |
| | | revenue.setMemberType(Constants.ONE); |
| | | revenue.setType(Constants.ONE); |
| | | revenue.setOptType(-Constants.ONE); |
| | | revenue.setAmount(amountFen); |
| | | revenue.setVaildStatus(Constants.ONE); |
| | | revenue.setObjId(order.getId()); |
| | | revenue.setObjType(Constants.ONE); |
| | | revenue.setStatus(Constants.ZERO); |
| | | revenue.setDeleted(Constants.ZERO); |
| | | revenue.setCreateTime(now); |
| | | revenueMapper.insert(revenue); |
| | | } |
| | | |
| | | @Override |
| | | public void applyShopWithdrawal(WithdrawalDTO dto, Integer shopId) { |
| | | ShopInfo shop = shopInfoMapper.selectById(shopId); |
| | | if (shop == null) { |
| | | throw new BusinessException(ResponseStatus.DATA_EMPTY); |
| | | } |
| | | long amountFen = dto.getAmount().multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_HALF_UP).longValue(); |
| | | long balance = shop.getBalance() != null ? shop.getBalance() : 0L; |
| | | if (amountFen <= 0) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "提现金额必须大于0"); |
| | | } |
| | | if (amountFen > balance) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "提现金额不能超过可用余额"); |
| | | } |
| | | String billNo = generateBillNo(); |
| | | Date now = new Date(); |
| | | // 扣减门店余额 |
| | | shopInfoMapper.update(new UpdateWrapper<ShopInfo>().lambda() |
| | | .setSql(" BALANCE = IFNULL(BALANCE, 0) - " + amountFen) |
| | | .eq(ShopInfo::getId, shopId)); |
| | | // 创建提现记录 |
| | | WithdrawalOrders order = new WithdrawalOrders(); |
| | | order.setMemberId(shop.getRegionMemberId()); |
| | | order.setMemberType(Constants.TWO); |
| | | order.setAmount(amountFen); |
| | | order.setStatus(Constants.ZERO); |
| | | order.setType(Constants.ZERO); |
| | | order.setOutBillNo(billNo); |
| | | order.setAliAccount(dto.getAliAccount()); |
| | | order.setDeleted(Constants.ZERO); |
| | | order.setCreateTime(now); |
| | | order.setUpdateTime(now); |
| | | order.setCreateUser(shop.getRegionMemberId()); |
| | | withdrawalOrdersMapper.insert(order); |
| | | // 创建支出 Revenue 记录 |
| | | Revenue revenue = new Revenue(); |
| | | revenue.setMemberId(shop.getRegionMemberId()); |
| | | revenue.setMemberType(Constants.TWO); |
| | | revenue.setType(Constants.ONE); // 1=提现支出 |
| | | revenue.setOptType(-Constants.ONE); // -1=支出 |
| | | revenue.setAmount(amountFen); |
| | | revenue.setVaildStatus(Constants.ONE); // 已入账 |
| | | revenue.setObjId(order.getId()); |
| | | revenue.setObjType(Constants.ONE); // 1=提现业务 |
| | | revenue.setStatus(Constants.ZERO); |
| | | revenue.setDeleted(Constants.ZERO); |
| | | revenue.setCreateTime(now); |
| | | revenueMapper.insert(revenue); |
| | | } |
| | | |
| | | private String generateBillNo() { |
| | | SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); |
| | | String random = String.valueOf(ThreadLocalRandom.current().nextInt(100000, 999999)); |
| | | return "TX" + sdf.format(new Date()) + random; |
| | | } |
| | | |
| | | } |