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> getBaseUserById(@RequestParam("id") Long id) { AppUser appUser = appUserService.getById(id); Map map = new HashMap<>(); map.put("id", appUser.getId()); map.put("name", appUser.getName()); map.put("phone", appUser.getPhone()); return R.ok(map); } @ResponseBody @PostMapping("/editAppUserById") public R editAppUserById(@RequestBody AppUser appUser) { appUserService.updateById(appUser); appUserService.update(new LambdaUpdateWrapper().eq(AppUser::getId, appUser.getId()) .set(AppUser::getLastShopTime, appUser.getLastShopTime())); return R.ok(); } @ResponseBody @PostMapping("/getSMSCode") @ApiOperation(value = "获取短信验证码") public R getSMSCode(@RequestBody SMSCode smsCode) { return appUserService.getSMSCode(smsCode); } @ResponseBody @GetMapping("/unregis") @ApiOperation(value = "注销", tags = {"小程序-个人中心首页-我的资料"}) public R unregis() { Long userId = tokenService.getLoginUserApplet().getUserid(); AppUser user = appUserService.getById(userId); //添加注销记录 UserCancellationLog userCancellationLog = new UserCancellationLog(); userCancellationLog.setAppUserId(user.getId()); userCancellationLogService.save(userCancellationLog); user.setStatus(3); appUserService.updateById(user); return R.ok(); } @ResponseBody @GetMapping("/getServicePhone") @ApiOperation(value = "获取客服电话", tags = {"小程序-个人中心首页-客服"}) public R getServicePhone() { SysConfig data = sysConfigClient.getInfo(7L).getData(); List phoneList = null; if (data != null) { phoneList = Arrays.stream(data.getConfigValue().split(";")) .map(String::trim) // 去除每个号码前后的空格 .filter(s -> !s.isEmpty()) // 过滤空字符串 .collect(Collectors.toList()); } return R.ok(phoneList); } @GetMapping("/index") @ApiOperation(value = "个人信息", tags = {"小程序-个人中心首页"}) public R index() { return R.ok(appUserService.index()); } @PostMapping("/index/change") @ApiOperation(value = "修改个人资料", tags = {"小程序-个人中心首页"}) public R indexchange(@RequestBody ChangeAppUserInfo changeAppInfo) { Long userId = tokenService.getLoginUserApplet().getUserid(); //当前用户信息 AppUser user = appUserService.getById(userId); if (null != changeAppInfo.getName()){ user.setName(changeAppInfo.getName()); } if (null != changeAppInfo.getAvatar()){ user.setAvatar(changeAppInfo.getAvatar()); } appUserService.updateById(user); return R.ok(); } /** * 根据用户名称模糊搜索用户列表 * * @param name * @return */ @PostMapping("/getAppUserByName") public R> getAppUserByName(@RequestParam("name") String name) { List list = appUserService.list(new LambdaQueryWrapper().eq(AppUser::getDelFlag, 0).eq(AppUser::getStatus, 1) .like(AppUser::getName, name)); return R.ok(list); } /** * 根据用户名称模糊搜索用户列表,不过滤状态 */ @GetMapping("/getAppUserByNameNoFilter") public R> getAppUserByNameNoFilter(@RequestParam("name") String name) { List list = appUserService.list(new LambdaQueryWrapper() .like(AppUser::getName, name)); return R.ok(list); } /** * 根据用户电话模糊搜索用户列表 * * @param phone * @return */ @PostMapping("/getAppUserByPhone") public R> getAppUserByPhone(@RequestParam("phone") String phone) { List list = appUserService.list(new LambdaQueryWrapper().eq(AppUser::getDelFlag, 0).eq(AppUser::getStatus, 1) .like(AppUser::getPhone, phone)); return R.ok(list); } /** * 更具用户电话模糊查询用户列表,不过滤状态 */ @GetMapping("/getAppUserByPhoneNoFilter") public R> getAppUserByPhoneNoFilter(@RequestParam("phone") String phone) { List list = appUserService.getAppUserByPhoneNoFilter(phone); return R.ok(list); } @GetMapping("/getUserPointsPage") @ApiOperation(value = "用户列表", tags = {"管理后台"}) public R> getUserPointsPage(@ApiParam("页码") @RequestParam Integer pageNum, @ApiParam("每一页数据大小") Integer pageSize, AppUser appUser) { Long userId = tokenService.getLoginUser().getUserid(); SysUser data = sysUserClient.getSysUser(userId).getData(); QueryWrapper queryWrapper = new QueryWrapper<>(); if (data.getRoleType() == 2) { Integer shopId = data.getObjectId(); List orders = orderClient.getRedeemedOrdersByShop(shopId).getData(); List userIds = orders.stream().map(Order::getAppUserId).collect(Collectors.toList()); //门店作为服务商的用户 /* Set shopServerUser = getShopServerUser(shopId); userIds.addAll(shopServerUser);*/ queryWrapper.in(!CollectionUtils.isEmpty(userIds), "id", userIds) .like(StringUtils.isNotEmpty( appUser.getName()),"name", appUser.getName()); } queryWrapper.eq("del_flag", 0); queryWrapper.ne("status", 3); List appUserList = appUserService.list(queryWrapper); Page objectPage = Page.of(pageNum, pageSize); objectPage.setRecords(appUserList); return R.ok(objectPage); } /** * 获取用户列表 */ @GetMapping("/getAppuserPage") public R> getAppuserPage(@ApiParam("页码") @RequestParam Integer pageNum, @ApiParam("每一页数据大小") Integer pageSize, AppUser appUser){ Integer shopId = null; Set userId = null; IPage appuserPage = appUserService.getAppuserPage(pageNum, pageSize, appUser, shopId, userId); return R.ok(appuserPage); } /** * 获取用户积分列表 */ @GetMapping("/getUserPotPage") public R> getUserPotPage(@ApiParam("页码") @RequestParam Integer pageNum, @ApiParam("每一页数据大小") Integer pageSize, AppUser appUser) { Long userid = tokenService.getLoginUser().getUserid(); SysUser sysUser = sysUserClient.getSysUser(userid).getData(); Integer shopId = null; Set userId = null; if(sysUser.getRoleType() == 2){ shopId = sysUser.getObjectId(); userId = orderClient.getAppUserByShoppingShop(shopId).getData(); } IPage appuserPage = appUserService.getAppuserPage(pageNum, pageSize, appUser, shopId, userId); for (AppUser record : appuserPage.getRecords()) { /* if (record.getInviteUserId() != null) { AppUser byId1 = appUserService.getById(record.getInviteUserId()); if (byId1!=null) { record.setInviteUserName(byId1.getName()); } }*/ if (record.getShopId()!=null){ R shopById = shopClient.getShopById(record.getShopId()); if (shopById.getData()!=null){ record.setShopName(shopById.getData().getName()); } } } return R.ok(appuserPage); } @GetMapping("/shop/getAppuserPage") @ApiOperation(value = "用户列表-在门店下过单的", tags = {"门店后台"}) public R> shopGetAppuserPage(@ApiParam("页码") @RequestParam Integer pageCurr, @ApiParam("每一页数据大小") Integer pageSize, AppUser appUser) { Long userid = tokenService.getLoginUser().getUserid(); R sysUserR = sysUserClient.getSysUser(userid); SysUser sysUser = sysUserR.getData(); List userIds = new ArrayList<>(); userIds.add(-1L); //获取在该本店下单的用户ids Integer objectId = sysUser.getObjectId(); R> listR = remoteOrderGoodsClient.byShopId(objectId); if (listR.getData()!=null){ for (Order datum : listR.getData()) { userIds.add(datum.getAppUserId()); } /* Set shopServerUser = getShopServerUser(objectId); userIds.addAll(shopServerUser);*/ } IPage appuserPage = appUserService.getAppuserPage1(pageCurr, pageSize, appUser, userIds); return R.ok(appuserPage); } @GetMapping("/frozen") @ApiOperation(value = "用户列表-冻结解冻", tags = {"管理后台"}) public R frozen(Long id, @ApiParam("1=正常,2=冻结") Integer status) { AppUser byId = appUserService.getById(id); byId.setStatus(status); appUserService.updateById(byId); if (status == 2){ loginout(id); } return R.ok(); } private void loginout(Long userId) { // 获取所有符合模式的缓存键 Collection keys = redisService.keys(CacheConstants.LOGIN_TOKEN_KEY + "*"); if (CollectionUtils.isEmpty(keys)) { return; // 如果没有匹配的键,直接返回 } // 遍历所有键并删除与指定用户ID相关的登录信息 for (String key : keys) { LoginUser user = redisService.getCacheObject(key); if (user != null && userId.equals(user.getUserid())) { redisService.deleteObject(key); } } } @GetMapping("/change/shop") @ApiOperation(value = "用户列表-更换门店", tags = {"管理后台"}) public R shop(Long id, Integer shopId) { AppUser byId = appUserService.getById(id); byId.setShopId(shopId); appUserService.updateById(byId); return R.ok(); } @GetMapping("/detail") @ApiOperation(value = "用户列表-详情", tags = {"管理后台"}) public R detail(Long id) { AppUser byId = appUserService.getById(id); //获取店铺名称 List shopNames=shopClient.getServiceProvider(byId.getId()).getData(); if(null != shopNames){ byId.setShopNames(shopNames); } //消费总金额 Integer customPoint =(byId.getExchangePoint()==null?0:byId.getExchangePoint())+ (byId.getTransferableOutPoint()==null?0:byId.getTransferableOutPoint())- (byId.getCancelPoint()==null?0:byId.getCancelPoint()); byId.setCustomPoint(customPoint); return R.ok(byId); } @GetMapping("/orders") @ApiOperation(value = "用户列表-订单列表", tags = {"管理后台"}) public R orders(Long id,Integer pageNum, Integer pageSize) { Long userid = tokenService.getLoginUser().getUserid(); SysUser sysUser = sysUserClient.getSysUser(userid).getData(); Integer shopId = -1; if(sysUser.getRoleType() == 2){ shopId = sysUser.getObjectId(); } R> listR = remoteOrderGoodsClient.byUserId(id,shopId); List data = listR.getData(); Integer total = data.size(); // 手动分页 if (data != null && data.size() > 0) { if (pageNum == null || pageNum == 0) { pageNum = 1; } if (pageSize == null || pageSize == 0) { pageSize = 10; } data = data.stream() .skip((pageNum - 1) * pageSize) .limit(pageSize) .collect(Collectors.toList()); } JSONObject jsonObject = new JSONObject(); jsonObject.put("records", data); jsonObject.put("total", total); jsonObject.put("size", pageSize); jsonObject.put("current", pageNum); return R.ok(jsonObject); } @PostMapping("/listByIds") public List listByIds(@RequestParam("ids") List ids) { if(ids.size() == 0){ return new ArrayList<>(); } List appUsers = appUserService.listByIds(ids); return appUsers; } @PostMapping("/getAppUserByPhone1") public R getAppUserByPhone1(@RequestParam("phone") String phone) { AppUser appUser = appUserService.getOne(new LambdaQueryWrapper().eq(AppUser::getDelFlag, 0).ne(AppUser::getStatus, 3) .eq(AppUser::getPhone, phone)); return R.ok(appUser); } /** * 工作台-顶部 */ @GetMapping("/statistics") @ApiOperation(value = "统计", tags = {"后台-工作台-顶部"}) public R statistics() { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("del_flag", 0); queryWrapper.ne("status", 3);//没有注销的 List appUserList = appUserService.list(queryWrapper); long consumerUser = appUserList.stream() .filter(user -> user.getLastShopTime() != null) .count();//消费者总数 UserStatistics userStatistics = new UserStatistics(); userStatistics.setTotalUser(appUserList.size());//总用户数 userStatistics.setConsumerUser((int) consumerUser);//消费过的用户 //拥有店铺用户数 Integer shopUserCount = appUserShopService.getHaveShopUserNum(); userStatistics.setShopUser(shopUserCount); //门店总数 long shopNum = shopClient.getAllShop().getData().size(); userStatistics.setShopNum((int) shopNum); return R.ok(userStatistics); } /** * 工作台-用户分析 */ @GetMapping("/homeStatistics/userAnalysis") @ApiOperation(value = "用户分析", tags = {"后台-工作台-用户分析"}) public R userAnalysis(@ApiParam(value = "用户id") @RequestParam(value = "userId",required = false) Long userId) { UserStatisticsDetail userStatistics = new UserStatisticsDetail(); QueryWrapper queryWrapper = new QueryWrapper<>(); // 条件构造 统计充值积分 queryWrapper.select("SUM(recharge_point) as total_points"); queryWrapper.eq("del_flag", 0);//未删除的 queryWrapper.ne("status", 3);//未注销的 if (userId != null) { queryWrapper.eq("id", userId); } //统计充值积分 Map result = appUserService.getMap(queryWrapper); if (result == null || result.get("total_points") == null) { userStatistics.setTotalScore(0L); }else { userStatistics.setTotalScore(Long.valueOf(result.get("total_points").toString())); } //条件构造 消费积分现金支付金额 queryWrapper.clear(); QueryWrapper queryWrapper1 = new QueryWrapper<>(); queryWrapper1.select("sum(exchange_point + transferable_out_point - cancel_point) as total_points"); queryWrapper1.select("sum(shop_amount) as payment_amounts "); queryWrapper1.eq("del_flag", 0);//未删除的 queryWrapper1.ne("status", 3);//未注销的 if (userId != null) { queryWrapper1.eq("id", userId); } Map data = appUserShopService.getPointAndPayAmount(userId); if (data == null || data.get("total_points") == null) { userStatistics.setConsumeScore(0L); }else { userStatistics.setConsumeScore(Long.valueOf(data.get("total_points").toString()) ); } if (data == null || data.get("payment_amounts") == null) { userStatistics.setShopAmount(BigDecimal.ZERO); }else { userStatistics.setShopAmount(new BigDecimal(data.get("payment_amounts").toString())); } return R.ok(userStatistics); } /** * 用户统计详情 */ @GetMapping("/statistics/detail") @ApiOperation(value = "用户统计详情", tags = {"管理后台-首页统计-用户统计详情"}) public R statisticsDetail(@ApiParam(value = "用户id") Long userId) { Long userid = tokenService.getLoginUser().getUserid(); SysUser data = sysUserClient.getSysUser(userid).getData(); Integer shopId = null; Set userIds = null; if(null != userId){ userIds = new HashSet<>(); userIds.add(userId); } if(data.getRoleType() == 2){ shopId = data.getObjectId(); if(null == userId){ userIds = orderClient.getAppUserByShoppingShop(shopId).getData(); /* Set shopServerUser = getShopServerUser(shopId); userIds.addAll(shopServerUser);*/ }else{ userIds = new HashSet<>(); userIds.add(userId); } } UserStatisticsDetail userStatisticsDetail = appUserMapper.getUserStatisticsDetail(null, userIds); return R.ok(userStatisticsDetail); } /** * 上传图片 * @param file * @return */ /* @PostMapping("/upload") public R upload(MultipartFile file){ String s = null; try { s = ObsUploadUtil.obsUpload(file); } catch (IOException e) { throw new RuntimeException(e); } return R.ok(s); }*/ private static final String FILE_DIRECTORY = "/dev/xvdb/project/upload_files"; // Linux路径 // private static final String FILE_DIRECTORY = "E://ldf_files"; // Linux路径 @PostMapping("/upload") public R handleFileUpload(@RequestParam("file") MultipartFile file) { if (file.isEmpty()) { return R.fail("请选择一个文件上传"); } try { // 1. 构建日期目录路径(格式:/年/月/日) LocalDate today = LocalDate.now(); String datePath = String.format("/%d/%02d/%02d", today.getYear(), today.getMonthValue(), today.getDayOfMonth()); // 2. 完整目标目录路径 String fullDirPath = FILE_DIRECTORY + datePath; File targetDir = new File(fullDirPath); // 3. 自动创建目录(如果不存在) if (!targetDir.exists()) { targetDir.mkdirs(); // 递归创建所有父目录 } String UUID= java.util.UUID.randomUUID().toString(); // 4. 保存文件 String filePath = fullDirPath + "/" +UUID+ file.getOriginalFilename(); File targetFile = new File(filePath); file.transferTo(targetFile); // 5. 返回可访问的URL(修正路径分隔符为Web格式) return R.ok("https://zjrqxny.com/images" + datePath + "/" + UUID+file.getOriginalFilename()); } catch (IOException e) { e.printStackTrace(); return R.fail("上传文件失败"); } } @GetMapping("/download/{year}/{month}/{day}/{fileName:.+}") @ResponseBody public ResponseEntity downloadFile( @PathVariable String year, @PathVariable String month, @PathVariable String day, @PathVariable String fileName) { System.out.println("下载文件名:"+fileName); try { // 1. 解码文件名 String decodedFileName = URLDecoder.decode(fileName, "UTF-8"); java.nio.file.Path filePath = java.nio.file.Paths.get(FILE_DIRECTORY, year, month, day, decodedFileName).normalize(); org.springframework.core.io.Resource resource = new org.springframework.core.io.UrlResource(filePath.toUri()); if (resource.exists() || resource.isReadable()) { // 5. 设置下载头(兼容所有浏览器) String contentDisposition = "attachment; filename=\"" + decodedFileName + "\"; " + "filename*=UTF-8''" + URLEncoder.encode(decodedFileName, "UTF-8").replace("+", "%20"); return ResponseEntity.ok() .contentType(MediaType.APPLICATION_OCTET_STREAM) .header(HttpHeaders.CONTENT_DISPOSITION, contentDisposition) .body(resource); } else { return ResponseEntity.notFound().build(); } } catch (IOException ex) { ex.printStackTrace(); return ResponseEntity.status(500).build(); } } /** * 清空绑定门店的用户门店数据 * @param shopId * @return */ @PostMapping("/clearBindShop") public R clearBindShop(@RequestParam("shopId") Integer shopId){ appUserService.update(new LambdaUpdateWrapper().eq(AppUser::getShopId, shopId).set(AppUser::getShopId, null) .set(AppUser::getUserType,1)); return R.ok(); } /** * 获取所有用户积分列表 */ @ResponseBody @GetMapping("/getUserPointPageList") @ApiOperation(value = "所有用户积分列表", tags = "后台-财务统计-用户积分统计") public R> getUserPointPageList(@RequestParam(value = "name",required = false) String name, @ApiParam("当前页")@RequestParam("pageCurr") Integer pageCurr, @ApiParam("分页大小")@RequestParam("pageSize") Integer pageSize) { PageInfo pageInfo=appUserService.getUserPointPageList(name,pageCurr,pageSize); return R.ok(pageInfo); } /** * 导出用户积分列表 */ @ResponseBody @GetMapping("/exportUserPoint") @ApiOperation(value = "导出用户积分列表", tags = "后台-财务统计-用户积分统计") public void exportUserPoint(HttpServletResponse response, @RequestParam(value = "name",required = false) String name) { List exportList=appUserMapper.exportUserPoint(name); ExcelUtil util = new ExcelUtil(UserPointStatisticsVO.class); util.exportExcel(response, exportList, "用户积分汇总"); } @PostMapping("/saveOrUpdateAppUser") Long saveOrUpdateAppUser(@RequestBody AppUser appuser){ if (appuser.getId() == null) { //保存用户 appUserService.save(appuser); }else { appUserService.updateById(appuser); } return appuser.getId(); } @GetMapping("/getAllUser") @ApiOperation(value = "获取所有用户") public R> getAllUser() { LambdaQueryWrapper queryWrapper=new LambdaQueryWrapper<>(); queryWrapper.select(AppUser::getId,AppUser::getName); queryWrapper.eq(AppUser::getDelFlag,0);//未删除的 queryWrapper.ne(AppUser::getStatus, 3);//未注销的 List list = appUserService.list(queryWrapper); return R.ok(list); } }