From e3a2245265516fef78b4737d6fffc939e7c5e0af Mon Sep 17 00:00:00 2001 From: huliguo <2023611923@qq.com> Date: 星期四, 03 七月 2025 17:56:07 +0800 Subject: [PATCH] bug修改 --- pt-errand/src/main/java/com/ruoyi/errand/service/impl/AppUserServiceImpl.java | 247 +++++++++++++++++++++++++++++++++++++----------- 1 files changed, 189 insertions(+), 58 deletions(-) diff --git a/pt-errand/src/main/java/com/ruoyi/errand/service/impl/AppUserServiceImpl.java b/pt-errand/src/main/java/com/ruoyi/errand/service/impl/AppUserServiceImpl.java index c444219..9cd135d 100644 --- a/pt-errand/src/main/java/com/ruoyi/errand/service/impl/AppUserServiceImpl.java +++ b/pt-errand/src/main/java/com/ruoyi/errand/service/impl/AppUserServiceImpl.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +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.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -11,16 +12,10 @@ import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.errand.constant.*; -import com.ruoyi.errand.domain.AppUser; +import com.ruoyi.errand.domain.*; -import com.ruoyi.errand.domain.Order; -import com.ruoyi.errand.domain.UserCancellationLog; -import com.ruoyi.errand.domain.VipOrder; -import com.ruoyi.errand.mapper.AppUserMapper; +import com.ruoyi.errand.mapper.*; -import com.ruoyi.errand.mapper.OrderMapper; -import com.ruoyi.errand.mapper.UserCancellationLogMapper; -import com.ruoyi.errand.mapper.VipOrderMapper; import com.ruoyi.errand.object.dto.app.AppletLogin; import com.ruoyi.errand.object.dto.app.BirthDayDTO; import com.ruoyi.errand.object.dto.app.MobileLoginDTO; @@ -35,7 +30,11 @@ import com.ruoyi.errand.object.vo.sys.OrderPageListVO; import com.ruoyi.errand.object.vo.sys.UserStatsVO; import com.ruoyi.errand.service.AppUserService; +import com.ruoyi.errand.service.CommunityCourierService; import com.ruoyi.errand.utils.*; +import com.ruoyi.errand.utils.sms.AliyunSmsService; +import com.ruoyi.errand.utils.wx.RefundCallbackResult; +import com.ruoyi.errand.utils.wx.WechatPayService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -43,9 +42,11 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.lang.reflect.Array; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.time.temporal.TemporalUnit; @@ -68,6 +69,21 @@ private OrderMapper orderMapper; @Autowired private VipOrderMapper vipOrderMapper; + @Autowired + private WechatPayService wechatPayService; + @Autowired + private AppUserService appUserService; + @Autowired + private CommunityCourierMapper communityCourierMapper; + @Autowired + private CommunityCourierService communityCourierService; + @Autowired + private CourierMapper courierMapper; + @Autowired + private CommunityMapper communityMapper; + @Autowired + private TokenBlacklistService blacklistService; + @Override @@ -100,7 +116,7 @@ for (int i = 0; i < 6; i++) { code += Double.valueOf(Math.random() * 10).intValue(); } - SMSUtil.sendSms("[\"" + code + "\"]", phone, "8824121211029", "39533d100b2b4aee8ed198aa49fe99dd"); + AliyunSmsService.sendVerificationCode(phone,code); redisService.setCacheObject(phone, code, 300L, TimeUnit.SECONDS); } @@ -116,7 +132,7 @@ AppUser appUser = this.getOne(new LambdaQueryWrapper<AppUser>().eq(AppUser::getPhone, mobileLogin.getPhone()) .ne(AppUser::getStatus,AppUserStatusConstant.LOGOUT) .eq(AppUser::getDelFlag,DelFlagConstant.UNDELETE)); - if (null == appUser) { + if (null == appUser || null == appUser.getWxOpenid()) { //用户不存在 //跳转注册页面 LoginVO loginVo = new LoginVO(); @@ -142,7 +158,7 @@ loginVO.setToken("app:" + jwt.get("token").toString()); loginVO.setFailureTime(TimeUnit.MILLISECONDS.toSeconds((long)jwt.get("exp"))); loginVO.setPhone(appUser.getPhone()); - loginVO.setSkipPage(appUser.getFirstLogin()); + loginVO.setSkipPage(1); loginVO.setIsCourier(appUser.getCourierId()!=null); return R.ok(loginVO); } @@ -166,7 +182,7 @@ String phone = phoneJson.getString("phoneNumber"); //查询用户是否存在 AppUser appUser = this.getOne(new LambdaQueryWrapper<AppUser>().eq(AppUser::getPhone, phone).ne(AppUser::getStatus, AppUserStatusConstant.LOGOUT).eq(AppUser::getDelFlag,DelFlagConstant.UNDELETE)); - if(null == appUser){ + if(null == appUser || null == appUser.getWxOpenid()){ //跳转到注册界面 LoginVO loginVo = new LoginVO(); loginVo.setSkipPage(2); @@ -182,7 +198,7 @@ } //构建token Map<String,Object> tokenMap = new HashMap<>(); - map.put("userId",appUser.getId()); + tokenMap.put("userId",appUser.getId()); Map<String, Object> jwt = JwtUtil.createJWT(tokenMap); @@ -190,12 +206,13 @@ loginVO.setToken("app:" + jwt.get("token").toString()); loginVO.setFailureTime(TimeUnit.MILLISECONDS.toSeconds((long)jwt.get("exp"))); loginVO.setPhone(appUser.getPhone()); - loginVO.setSkipPage(appUser.getFirstLogin()); + loginVO.setSkipPage(1); + loginVO.setIsCourier(appUser.getCourierId()!=null); return R.ok(loginVO); } @Override - public void register(RegisterDTO registerDTO) { + public LoginVO register(RegisterDTO registerDTO) { //使用jscode获取微信openid Map<String, Object> map = weChatUtil.code2Session(registerDTO.getJscode()); Integer errcode = Integer.valueOf(map.get("errcode").toString()); @@ -203,28 +220,45 @@ throw new ServiceException(map.get("msg").toString()); } String openid = map.get("openid").toString(); - AppUser appUser1 = this.getOne(new LambdaQueryWrapper<AppUser>().eq(AppUser::getWxOpenid, openid).ne(AppUser::getStatus, AppUserStatusConstant.LOGOUT).eq(AppUser::getDelFlag,DelFlagConstant.UNDELETE)); - if (null != appUser1) { - throw new ServiceException("此微信号已注册,请直接登录!"); - } AppUser appUser2 = this.getOne(new LambdaQueryWrapper<AppUser>().eq(AppUser::getPhone, registerDTO.getPhone()).ne(AppUser::getStatus, AppUserStatusConstant.LOGOUT).eq(AppUser::getDelFlag,DelFlagConstant.UNDELETE)); - if (null != appUser2) { + if (null != appUser2 && appUser2.getWxOpenid() !=null) { throw new ServiceException("手机号已注册,请直接登录!"); } - //注册一个 - AppUser appUser = new AppUser(); - appUser.setPhone(registerDTO.getPhone()); - appUser.setDelFlag(DelFlagConstant.UNDELETE); - appUser.setStatus(AppUserStatusConstant.NORMAL); - appUser.setWxOpenid(openid); - appUser.setAvatar(DEFAULT_AVATAR_URL); - appUser.setFirstLogin(IsFirstLoginConstant.YES); - appUser.setFirstOrder(IsFirstOrder.YES); - //注册 修改用户信息 - appUser.setName(registerDTO.getUsername()); - appUser.setFirstLogin(IsFirstLoginConstant.NO); - appUser.setCommunityId(registerDTO.getCommunityId()); - this.updateById(appUser); + + if (appUser2 ==null) { + appUser2 = new AppUser(); + //注册一个 + appUser2.setPhone(registerDTO.getPhone()); + appUser2.setDelFlag(DelFlagConstant.UNDELETE); + appUser2.setStatus(AppUserStatusConstant.NORMAL); + appUser2.setWxOpenid(openid); + appUser2.setFirstLogin(IsFirstLoginConstant.YES); + appUser2.setFirstOrder(IsFirstOrder.YES); + } + //修改 + appUser2.setName(registerDTO.getUsername()); + appUser2.setAvatar(registerDTO.getAvatar()==null?DEFAULT_AVATAR_URL:registerDTO.getAvatar()); + appUser2.setCommunityId(registerDTO.getCommunityId()); + appUser2.setWxOpenid(openid); + appUser2.setPhone(registerDTO.getPhone()); + appUser2.setCreateTime(LocalDateTime.now()); + appUser2.setRegionExtend(registerDTO.getRegionExtend()); + + + this.saveOrUpdate(appUser2); + + //构建token + Map<String,Object> tokenMap = new HashMap<>(); + tokenMap.put("userId",appUser2.getId()); + Map<String, Object> jwt = JwtUtil.createJWT(tokenMap); + + LoginVO loginVO=new LoginVO(); + loginVO.setToken("app:" + jwt.get("token").toString()); + loginVO.setFailureTime(TimeUnit.MILLISECONDS.toSeconds((long)jwt.get("exp"))); + loginVO.setPhone(appUser2.getPhone()); + loginVO.setSkipPage(1); + loginVO.setIsCourier(appUser2.getCourierId()!=null); + return loginVO; } @@ -232,19 +266,55 @@ public OrderPageVO getOrderPage(Integer communityId) { AppUser appUser = (AppUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); //更换绑定的小区 - if (communityId!=null){ + if (communityId!=null&& !Objects.equals(appUser.getCommunityId(), communityId)){ appUser.setCommunityId(communityId); this.updateById(appUser); } List<OrderPageVO> orderPage = this.getBaseMapper().getOrderPage(appUser.getId()); - + Community community = communityMapper.selectById(appUser.getCommunityId()); + String regionFullName = getRegionFullName(community.getRegionId()); + orderPage.get(0).setRegionName(regionFullName); + orderPage.get(0).setRegionId(community.getRegionId()); return orderPage.get(0); } + @Autowired + private RegionMapper regionMapper; + /** + * 根据区ID查询完整的省市区名称 + */ + public String getRegionFullName(Integer districtId) { + Region district = regionMapper.selectById(districtId); + if (district == null) { + return ""; + } + Region city = regionMapper.selectById(district.getParentId()); + if (city == null) { + return district.getName(); + } + + Region province = regionMapper.selectById(city.getParentId()); + if (province == null) { + return city.getName() + district.getName(); + } + + return province.getName() + city.getName() + district.getName(); + } @Override public AppUserInfoVO getMyInfo() { AppUser appUser = (AppUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); - return this.getBaseMapper().getMyInfo(appUser.getId()); + AppUserInfoVO myInfo = this.getBaseMapper().getMyInfo(appUser.getId()); + + myInfo.setEndTimeStamp(myInfo.getEndTime() != null ? + myInfo.getEndTime().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli() : + null); + if (myInfo.getEndTime() != null) { + if(myInfo.getEndTime().isBefore(LocalDateTime.now())){ + myInfo.setVipId(null); + } + } + + return myInfo; } @Override @@ -270,16 +340,44 @@ * 注销账号 */ @Override - public void delete() { + public void delete(String token) { AppUser appuser = (AppUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); - appuser.setDelFlag(DelFlagConstant.DELETE); - appuser.setStatus(AppUserStatusConstant.LOGOUT); - this.updateById(appuser); + //跑腿员 订单是否完成 + if (appuser.getCourierId()!=null){ + //跑腿员 + Courier courier = courierMapper.selectById(appuser.getCourierId()); + if (null != courier && courier.getDelFlag().equals(DelFlagConstant.UNDELETE)) { + //查订单是否完成 + Long count = orderMapper.selectCount(new LambdaUpdateWrapper<Order>().eq(Order::getCourierId, appuser.getCourierId()) + .eq(Order::getDelFlag, DelFlagConstant.UNDELETE) + .eq(Order::getOrderStatus, 2)); + if (count > 0) { + throw new ServiceException("您还有订单未完成,无法注销"); + } + } + //与小区关系删除 + CommunityCourier communityCourier = communityCourierMapper.selectOne(new LambdaQueryWrapper<CommunityCourier>().eq(CommunityCourier::getCourierId, appuser.getCourierId())); + if (null != communityCourier) { + communityCourierMapper.deleteById(communityCourier.getId()); + } + //跑腿员删除 + courier.setDelFlag(DelFlagConstant.DELETE); + courierMapper.updateById(courier); + } + UpdateWrapper<AppUser> updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("id", appuser.getId()) + .set("courier_id", null) + .set("del_flag", DelFlagConstant.DELETE) + .set("status",AppUserStatusConstant.LOGOUT); + + this.getBaseMapper().update(null, updateWrapper); + UserCancellationLog userCancellationLog=new UserCancellationLog(); userCancellationLog.setApp_user_id(appuser.getId()); userCancellationLog.setDel_flag(DelFlagConstant.DELETE); userCancellationLog.setCreate_time(LocalDateTime.now()); userCancellationLogMapper.insert(userCancellationLog); + blacklistService.addToBlacklist(token); } @Override @@ -334,12 +432,15 @@ } @Override - public AppUserSysDetailVO detail(Integer id) { + public AppUserSysDetailVO detail(String id) { // 获取本月的开始时间和结束时间 LocalDate now = LocalDate.now(); LocalDateTime startOfMonth = now.withDayOfMonth(1).atStartOfDay(); LocalDateTime endOfMonth = now.withDayOfMonth(now.lengthOfMonth()).atTime(23, 59, 59); AppUser appUser = this.getBaseMapper().selectById(id); + if (null == appUser || appUser.getDelFlag() == DelFlagConstant.DELETE) { + throw new ServiceException("用户不存在"); + } AppUserSysDetailVO vo = new AppUserSysDetailVO(); BeanUtils.copyProperties(appUser, vo); int isVip =0; @@ -365,7 +466,7 @@ } @Override - public void froze(Integer id) { + public void froze(String id) { AppUser appUser = this.getBaseMapper().selectById(id); if (appUser==null|| Objects.equals(appUser.getDelFlag(), DelFlagConstant.DELETE)) { throw new ServiceException("用户不存在"); @@ -382,13 +483,14 @@ } @Override - public void refund(Integer id) { + public void refund(String id) { // 1. 查询用户所有未退费的VIP订单(状态为4-已完成且未删除) List<VipOrder> orders = vipOrderMapper.selectList(new LambdaQueryWrapper<VipOrder>() .eq(VipOrder::getAppUserId, id) .eq(VipOrder::getOrderStatus, 4) // 4-已完成 .eq(VipOrder::getDelFlag, DelFlagConstant.UNDELETE) // 0-未删除 .isNull(VipOrder::getRefundTime) // 未退款的 + .eq(VipOrder::getPayStatus,2) .orderByDesc(VipOrder::getOrderTime)); // 2. 计算每个订单的有效期结束时间 @@ -410,29 +512,55 @@ //退款 log.info("开始会员退费,被退款人员id:{},退款订单:{}",vipOrder.getAppUserId(),vipOrder.getId()); R r = refundPayMoney(vipOrder);//退款 - if (200 == r.getCode()) { - //退款成功取消用户的会员,将用户状态改变 - AppUser appUser = this.getById(id); - appUser.setStartTime(LocalDateTime.now()); - appUser.setEndTime(LocalDateTime.now()); - appUser.setVipId(null); + if (200 != r.getCode()) { + throw new ServiceException("退款失败,msg:"+ r.getMsg()+" 订单id:"+vipOrder.getId()); } }); + UpdateWrapper<AppUser> updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("id", id) + .set("vip_id", null) // 显式设置vip_id为null + .set("end_time", LocalDateTime.now()); // 设置结束时间 + appUserService.update(null, updateWrapper); } @Override - public R refundPayMoneyCallback(RefundCallbackResult refundCallbackResult) { - String code = refundCallbackResult.getR3_RefundOrderNo().substring(1); - VipOrder vipOrder = vipOrderMapper.selectOne(new LambdaQueryWrapper<VipOrder>().eq(VipOrder::getOrderNumber, code)); + public R refundPayMoneyCallback(String xmlData) { + RefundCallbackResult result = wechatPayService.processRefundCallback(xmlData); + if (!result.isSuccess()) { + System.out.println("会员退费错误:"+result.getMsg()); + return R.fail(result.getMsg()); + } + VipOrder vipOrder = vipOrderMapper.selectOne(new LambdaQueryWrapper<VipOrder>().eq(VipOrder::getOrderNumber, result.getOrderNo())); if (null == vipOrder || vipOrder.getPayStatus() == 1 || vipOrder.getOrderStatus() == 6) { return R.ok(); } - vipOrder.setRefundCode(refundCallbackResult.getR5_RefundTrxNo()); + vipOrder.setRefundCode(result.getRefundNo()); vipOrder.setRefundStatus(2); vipOrder.setRefundTime(LocalDateTime.now()); vipOrder.setOrderStatus(6);//已退费 vipOrderMapper.updateById(vipOrder); + //退款成功取消用户的会员,将用户状态改变 + UpdateWrapper<AppUser> updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("id", vipOrder.getAppUserId()) + .set("vip_id", null) // 显式设置vip_id为null + .set("end_time", LocalDateTime.now()); // 设置结束时间 + + appUserService.update(null, updateWrapper); return R.ok(); + } + + @Override + public void setName(String name) { + AppUser appuser = (AppUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + appuser.setName(name); + this.updateById(appuser); + } + + @Override + public void setAvatar(String avatar) { + AppUser appuser = (AppUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + appuser.setAvatar(avatar); + this.updateById(appuser); } private Map<Long, LocalDateTime> calculateOrderEndTimes(List<VipOrder> orders) { @@ -484,11 +612,14 @@ BigDecimal paymentAmount = order.getPaymentAmount(); if (BigDecimal.ZERO.compareTo(order.getPaymentAmount()) < 0) {//支付的金额是否大于0 //微信退款 - RefundResult refund = PaymentUtil.refund(order.getOrderNumber(), "R" + order.getOrderNumber(), paymentAmount.doubleValue(), - "/app/user/refundPayMoneyCallback"); - if (!"100".equals(refund.getRa_Status())) { - return R.fail(refund.getRc_CodeMsg());//退款失败 + Map<String,String> map = wechatPayService.refund(order.getOrderNumber(), order.getOrderNumber(), order.getPaymentAmount().toString(), order.getPaymentAmount().toString(), "会员退款", "/app/user/refundPayMoneyCallback"); + if (!"SUCCESS".equals(map.get("return_code"))) { + return R.fail(map.get("return_msg"));//退款失败 } + //这里申请成功后先返回,等待微信退款成功再取消用户会员 + order.setRefundStatus(1); + vipOrderMapper.updateById(order); + return R.ok(); } return R.ok(); } -- Gitblit v1.7.1