| | |
| | | package com.ruoyi.account.controller; |
| | | |
| | | |
| | | import com.alibaba.fastjson2.JSONObject; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.ruoyi.account.api.model.AppUser; |
| | | import com.ruoyi.account.api.model.BalanceChangeRecord; |
| | | import com.ruoyi.account.api.model.WithdrawalRequests; |
| | | import com.ruoyi.account.dto.WithQuery; |
| | | import com.ruoyi.account.dto.WithdrawalRequestsDTO; |
| | | import com.ruoyi.account.service.AppUserService; |
| | | import com.ruoyi.account.service.BalanceChangeRecordService; |
| | | import com.ruoyi.account.service.WithdrawalRequestsService; |
| | | import com.ruoyi.account.util.payment.TransferUtil; |
| | | import com.ruoyi.account.util.payment.model.AccountBalanceQueryResult; |
| | | import com.ruoyi.account.util.payment.model.SinglePay; |
| | | import com.ruoyi.account.util.payment.model.SinglePayCallbackResult; |
| | | import com.ruoyi.account.util.payment.model.SinglePayResult; |
| | | import com.ruoyi.account.vo.WithdrawalAuth; |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.common.core.web.domain.AjaxResult; |
| | | import com.ruoyi.common.security.service.TokenService; |
| | | import com.ruoyi.system.api.model.LoginUser; |
| | | import io.swagger.annotations.Api; |
| | | import io.swagger.annotations.ApiOperation; |
| | | 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 io.swagger.annotations.ApiParam; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * <p> |
| | |
| | | |
| | | @Resource |
| | | private WithdrawalRequestsService withdrawalRequestsService; |
| | | @Resource |
| | | private AppUserService appUserService; |
| | | |
| | | @Resource |
| | | private BalanceChangeRecordService balanceChangeRecordService; |
| | | @Resource |
| | | private TokenService tokenService; |
| | | |
| | | /** |
| | | * 提现申请 |
| | |
| | | return AjaxResult.success(); |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | @PostMapping("/page") |
| | | @ApiOperation(value = "提现申请", tags = {"后台"}) |
| | | @ApiOperation(value = "提现申请列表", tags = {"后台"}) |
| | | public R<IPage<WithdrawalRequests>> page(@RequestBody WithQuery withQuery){ |
| | | return R.ok(withdrawalRequestsService.pageList(withQuery)); |
| | | |
| | | IPage<WithdrawalRequests> withdrawalRequestsIPage = withdrawalRequestsService.pageList(withQuery); |
| | | for (WithdrawalRequests record : withdrawalRequestsIPage.getRecords()) { |
| | | record.setIdStr(record.getId().toString()); |
| | | } |
| | | return R.ok(withdrawalRequestsIPage); |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | @PostMapping("/auth") |
| | | @ApiOperation(value = "提现申请审批", tags = {"后台"}) |
| | | public R auth(@RequestBody WithdrawalAuth withdrawalAuth){ |
| | | WithdrawalRequests withdrawal = withdrawalRequestsService.getById(withdrawalAuth.getId()); |
| | | BigDecimal withdrawalAmount = withdrawal.getWithdrawalAmount(); |
| | | if(withdrawal.getAuditStatus() != 1){ |
| | | return R.fail("不能重复审核"); |
| | | } |
| | | Integer auditStatus = withdrawalAuth.getAuditStatus(); |
| | | if (auditStatus==2){ |
| | | //执行转账操作 |
| | | if(withdrawal.getWithdrawalMethod() == 2){ |
| | | //先检查账户余额是否充足 |
| | | AccountBalanceQueryResult accountBalanceQueryResult = TransferUtil.accountBalanceQuery(); |
| | | if(null == accountBalanceQueryResult){ |
| | | return R.fail("查询账户余额出错"); |
| | | } |
| | | Double useAbleSettAmount = accountBalanceQueryResult.getUseAbleSettAmount(); |
| | | //计算代付手续费 |
| | | if(useAbleSettAmount < (withdrawal.getArrivalAmount().doubleValue() + 1)){ |
| | | return R.fail("账户可用余额不足,请先补充账户余额"); |
| | | } |
| | | //银行卡转账 |
| | | SinglePay singlePay = new SinglePay(); |
| | | singlePay.setTradeMerchantNo(TransferUtil.sysTradeMerchantNo); |
| | | singlePay.setMerchantOrderNo(withdrawal.getId().toString()); |
| | | singlePay.setReceiverAccountNoEnc(withdrawal.getBankCardNumber()); |
| | | singlePay.setReceiverNameEnc(withdrawal.getAccountHolder()); |
| | | singlePay.setReceiverAccountType(201); |
| | | singlePay.setPaidAmount(withdrawal.getArrivalAmount().doubleValue()); |
| | | singlePay.setPaidDesc("账户余额提现"); |
| | | singlePay.setPaidUse("205"); |
| | | singlePay.setCallbackUrl("/account/withdrawal-requests/withdrawalCallback"); |
| | | SinglePayResult singlePayResult = TransferUtil.singlePay(singlePay); |
| | | if(null == singlePayResult){ |
| | | LoginUser loginUserApplet = tokenService.getLoginUserApplet(); |
| | | AppUser appUser = appUserService.getById(loginUserApplet.getUserid()); |
| | | BigDecimal balance = appUser.getBalance(); |
| | | BalanceChangeRecord balanceChangeRecord = new BalanceChangeRecord(); |
| | | balanceChangeRecord.setAppUserId(appUser.getId()); |
| | | balanceChangeRecord.setVipId(appUser.getVipId()); |
| | | // balanceChangeRecord.setOrderId(withdrawalRequests.getId()); |
| | | balanceChangeRecord.setChangeType(2); |
| | | balanceChangeRecord.setChangeAmount(withdrawalAmount); |
| | | balanceChangeRecord.setDelFlag(0); |
| | | balanceChangeRecord.setCreateTime(LocalDateTime.now()); |
| | | balanceChangeRecord.setChangeDirection(-1); |
| | | balanceChangeRecordService.save(balanceChangeRecord); |
| | | return R.fail("转账失败"); |
| | | } |
| | | withdrawal.setStatus(1); |
| | | }else{ |
| | | //微信转账 |
| | | return R.fail("微信转账开发中"); |
| | | } |
| | | } |
| | | if(3 == auditStatus){ |
| | | //回退扣除的金额,添加明细记录 |
| | | //修改用户的可提现金额 |
| | | AppUser appUser = appUserService.getById(withdrawal.getAppUserId()); |
| | | BigDecimal withdrawableAmount = appUser.getWithdrawableAmount(); |
| | | BigDecimal withdrawnAmount = appUser.getWithdrawnAmount(); |
| | | BigDecimal balance = appUser.getBalance(); |
| | | appUser.setWithdrawableAmount(withdrawableAmount.add(withdrawalAmount).setScale(2, RoundingMode.HALF_EVEN)); |
| | | appUser.setWithdrawnAmount(withdrawnAmount.subtract(withdrawalAmount).setScale(2, RoundingMode.HALF_EVEN)); |
| | | appUser.setBalance(appUser.getBalance().add(withdrawalAmount).setScale(2, RoundingMode.HALF_EVEN)); |
| | | appUserService.updateById(appUser); |
| | | //添加变动明细 |
| | | BalanceChangeRecord balanceChangeRecord = new BalanceChangeRecord(); |
| | | balanceChangeRecord.setAppUserId(appUser.getId()); |
| | | balanceChangeRecord.setVipId(appUser.getVipId()); |
| | | balanceChangeRecord.setOrderId(withdrawal.getId()); |
| | | balanceChangeRecord.setChangeType(2); |
| | | balanceChangeRecord.setChangeAmount(withdrawalAmount); |
| | | balanceChangeRecord.setDelFlag(0); |
| | | balanceChangeRecord.setCreateTime(LocalDateTime.now()); |
| | | balanceChangeRecord.setChangeDirection(-1); |
| | | balanceChangeRecordService.save(balanceChangeRecord); |
| | | } |
| | | withdrawal.setAuditStatus(auditStatus); |
| | | withdrawalRequestsService.updateById(withdrawal); |
| | | return R.ok(); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 提现审核通过后转账回调通知 |
| | | * @param singlePayCallbackResult |
| | | */ |
| | | @ResponseBody |
| | | @PostMapping("/withdrawalCallback") |
| | | public Object withdrawalCallback(@RequestBody SinglePayCallbackResult singlePayCallbackResult){ |
| | | Integer status = singlePayCallbackResult.getStatus(); |
| | | String merchantOrderNo = singlePayCallbackResult.getMerchantOrderNo(); |
| | | WithdrawalRequests withdrawalRequests = withdrawalRequestsService.getById(merchantOrderNo); |
| | | if(203 == status || 205 == status){ |
| | | if(1 == withdrawalRequests.getStatus()){ |
| | | withdrawalRequests.setStatus(2); |
| | | withdrawalRequests.setArrivalTime(LocalDateTime.now()); |
| | | withdrawalRequestsService.updateById(withdrawalRequests); |
| | | } |
| | | JSONObject jsonObject = new JSONObject(); |
| | | jsonObject.put("statusCode", 2001); |
| | | return jsonObject; |
| | | }else{ |
| | | //回退扣除的金额,添加明细记录 |
| | | //修改用户的可提现金额 |
| | | BigDecimal withdrawalAmount = withdrawalRequests.getWithdrawalAmount(); |
| | | AppUser appUser = appUserService.getById(withdrawalRequests.getAppUserId()); |
| | | BigDecimal withdrawableAmount = appUser.getWithdrawableAmount(); |
| | | BigDecimal withdrawnAmount = appUser.getWithdrawnAmount(); |
| | | BigDecimal balance = appUser.getBalance(); |
| | | appUser.setWithdrawableAmount(withdrawableAmount.add(withdrawalAmount).setScale(2, RoundingMode.HALF_EVEN)); |
| | | appUser.setWithdrawnAmount(withdrawnAmount.subtract(withdrawalAmount).setScale(2, RoundingMode.HALF_EVEN)); |
| | | appUser.setBalance(appUser.getBalance().add(withdrawalAmount).setScale(2, RoundingMode.HALF_EVEN)); |
| | | appUserService.updateById(appUser); |
| | | //添加变动明细 |
| | | BalanceChangeRecord balanceChangeRecord = new BalanceChangeRecord(); |
| | | balanceChangeRecord.setAppUserId(appUser.getId()); |
| | | balanceChangeRecord.setVipId(appUser.getVipId()); |
| | | balanceChangeRecord.setOrderId(withdrawalRequests.getId()); |
| | | balanceChangeRecord.setChangeType(2); |
| | | balanceChangeRecord.setChangeAmount(withdrawalAmount); |
| | | balanceChangeRecord.setDelFlag(0); |
| | | balanceChangeRecord.setCreateTime(LocalDateTime.now()); |
| | | balanceChangeRecord.setChangeDirection(-1); |
| | | balanceChangeRecordService.save(balanceChangeRecord); |
| | | |
| | | withdrawalRequests.setStatus(3); |
| | | withdrawalRequests.setRemark(singlePayCallbackResult.getErrorCodeDesc()); |
| | | withdrawalRequestsService.updateById(withdrawalRequests); |
| | | |
| | | JSONObject jsonObject = new JSONObject(); |
| | | jsonObject.put("statusCode", 2001); |
| | | return jsonObject; |
| | | } |
| | | } |
| | | } |
| | | |