package com.ruoyi.account.controller;
import cn.hutool.http.HttpResponse;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.account.api.model.*;
import com.ruoyi.account.dto.ApplyForAdmissionDTO;
import com.ruoyi.account.dto.ChangeAppUserInfo;
import com.ruoyi.account.mapper.AppUserMapper;
import com.ruoyi.account.service.*;
import com.ruoyi.account.util.ObsUploadUtil;
import com.ruoyi.account.util.UUIDUtil;
import com.ruoyi.account.util.weChat.EnvVersion;
import com.ruoyi.account.util.weChat.WeChatUtil;
import com.ruoyi.account.vo.*;
import com.ruoyi.common.core.constant.CacheConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.utils.poi.ExcelUtil;
import com.ruoyi.common.core.web.controller.BaseController;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.order.feignClient.OrderClient;
import com.ruoyi.order.feignClient.RemoteOrderGoodsClient;
import com.ruoyi.order.model.Order;
import com.ruoyi.other.api.domain.Shop;
import com.ruoyi.other.api.domain.ShopBalanceStatement;
import com.ruoyi.other.api.domain.ShopWithdraw;
import com.ruoyi.other.api.feignClient.ShopClient;
import com.ruoyi.system.api.domain.SysConfig;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.feignClient.SysConfigClient;
import com.ruoyi.system.api.feignClient.SysUserClient;
import com.ruoyi.system.api.model.LoginUser;
import io.swagger.annotations.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
*
* 前端控制器
*
*
* @author luodangjia
* @since 2024-11-21
*/
@Api(tags = {"用户端-小程序"})
@RestController
@RequestMapping("/app-user")
@Slf4j
public class AppUserController extends BaseController {
@Resource
private TokenService tokenService;
@Resource
private AppUserService appUserService;
@Resource
private IUserWithdrawService userWithdrawService;
@Resource
private UserPointService userPointService;
@Resource
private AppUserBankService appUserBankService;
@Resource
private AppUserMapper appUserMapper;
@Resource
private ShopClient shopClient;
@Resource
private RemoteOrderGoodsClient remoteOrderGoodsClient;
@Resource
private SysUserClient sysUserClient;
@Resource
private OrderClient orderClient;
@Resource
private SysConfigClient sysConfigClient;
@Resource
private AppUserShopService appUserShopService;
@Resource
private UserCancellationLogService userCancellationLogService;
@Resource
private RedisService redisService;
@Resource
private WeChatUtil weChatUtil;
@Value("${file.upload.location}")
private String filePath;
@PostMapping("/verifyBankInfo")
@ApiOperation(value = "用户提现前校验银行卡信息")
public R mobileLogin() {
LoginUser loginUserApplet = tokenService.getLoginUserApplet();
AppUser appUser = appUserService.getById(loginUserApplet.getUserid());
AppUserBank bank = appUserBankService.lambdaQuery().eq(AppUserBank::getAppUserId, appUser.getId()).last("limit 1")
.one();
if (bank == null){
return R.ok(false);
}else{
return R.ok(true);
}
}
@ApiOperation(value = "提现申请")
@GetMapping("/withdrawalApplication")
@ResponseBody
public R withdrawalApplication(@ApiParam("提现金额") @RequestParam BigDecimal money) {
LoginUser loginUser = tokenService.getLoginUserApplet();
SysConfig data = sysConfigClient.getInfo(8L).getData();
AppUser appUser = appUserService.getById(loginUser.getUserid());
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
String code = sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
money=money.setScale(2, BigDecimal.ROUND_HALF_DOWN);
if (money.compareTo(BigDecimal.ZERO)==0){
throw new ServiceException("提现金额必须大于零");
}
Integer rate = Integer.valueOf(data.getConfigValue());
BigDecimal availablePoint = new BigDecimal(appUser.getAvailablePoint());
BigDecimal unMoney = availablePoint.divide(BigDecimal.valueOf(rate), 2, RoundingMode.HALF_DOWN);
if (unMoney.compareTo( money)<0){
throw new ServiceException("提现金额不能大于可提现金额,当前可提现金额为:"+unMoney);
}
AppUserBank bank = appUserBankService.lambdaQuery().eq(AppUserBank::getAppUserId, appUser.getId()).last("limit 1")
.one();
if(bank==null){
throw new ServiceException("请完善账户信息后再申请提现!");
}
if(!org.springframework.util.StringUtils.hasLength(bank.getBankNumber())){
throw new ServiceException("请完善银行卡后再申请提现!");
}
// 增加用户提现积分变动记录
UserPoint one = userPointService.lambdaQuery().eq(UserPoint::getAppUserId, appUser.getId())
.orderByDesc(UserPoint::getCreateTime).last("limit 1").one();
UserWithdraw userWithdraw = new UserWithdraw();
userWithdraw.setAppUserId(appUser.getId());
userWithdraw.setMoney(money);
BigDecimal multiply = money.multiply(BigDecimal.valueOf(rate));
appUser.setAvailablePoint(appUser.getAvailablePoint()-multiply.setScale(0, RoundingMode.HALF_UP).intValue());
if (multiply.compareTo(new BigDecimal(appUser.getAvailablePoint()))>0){
throw new ServiceException("积分不足!");
}
userWithdraw.setIntegral(Integer.valueOf(multiply.setScale(0, RoundingMode.HALF_UP).toString()));
userWithdraw.setAuditStatus(0);
userWithdraw.setStatus(1);
userWithdraw.setCode(code);
userWithdraw.setCreateTime(LocalDateTime.now());
if (one.getBalance() - Integer.valueOf(multiply.setScale(0, RoundingMode.HALF_UP).toString())<0){
throw new ServiceException("积分不足!");
}
userWithdraw.setReceiverAccountNoEnc(bank.getBankNumber());
userWithdraw.setReceiverNameEnc(bank.getUserName());
userWithdraw.setReceiverBankChannelNo(bank.getReceiverBankChannelNo());
userWithdraw.setReceiverAccountType(201);
userWithdrawService.save(userWithdraw);
UserPoint userPoint = new UserPoint();
userPoint.setType(18);
userPoint.setVariablePoint(Integer.valueOf(multiply.setScale(0, RoundingMode.HALF_UP).toString()));
userPoint.setHistoricalPoint(one.getBalance());
userPoint.setBalance(one.getBalance() - Integer.valueOf(multiply.setScale(0, RoundingMode.HALF_UP).toString()));
userPoint.setCreateTime(LocalDateTime.now());
userPoint.setAppUserId(appUser.getId());
userPoint.setObjectId(userWithdraw.getId());
userPointService.save(userPoint);
appUserService.updateById(appUser);
return R.ok();
}
@ResponseBody
@PostMapping("/mobileLogin")
@ApiOperation(value = "手机号登录")
public R mobileLogin(@RequestBody MobileLogin mobileLogin) {
return appUserService.mobileLogin(mobileLogin);
}
@ResponseBody
@PostMapping("/registerAccount")
@ApiOperation(value = "注册新账号")
public R registerAccount(@RequestBody RegisterAccount registerAccount) {
return appUserService.registerAccount(registerAccount);
}
@GetMapping("/logout")
@ApiOperation(value = "登出")
public R logout() {
Long userId = tokenService.getLoginUserApplet().getUserid();
loginout(userId);
return R.ok();
}
@ResponseBody
@PostMapping("/appletLogin")
@ApiOperation(value = "小程序一键登录")
public R appletLogin(@RequestBody AppletLogin appletLogin) {
return appUserService.appletLogin(appletLogin);
}
@PostMapping("/getAppUserById")
public AppUser getAppUserById(@RequestParam("id") Long id) {
System.out.println("根据id获取用户:"+id);
return appUserService.getById(id);
}
// 获取所有用户
@PostMapping("/getAppUserAll")
public List getAppUserAll() {
return appUserService.list();
}
@PostMapping("/getBaseUserById")
public R