fix (farm): 微信小程序,地块,首页

- 登录流程 调整
- 地块编号 需要修改
- 首页 在种面积
This commit is contained in:
达富斌
2025-11-09 13:58:24 +08:00
parent 4597a2c455
commit 7eaf494e16
14 changed files with 184 additions and 45 deletions

View File

@@ -55,6 +55,7 @@ public class HomeController {
return success(homeService.getBaseNameList()); return success(homeService.getBaseNameList());
} }
@PermitAll
@Operation(summary = "农场首页-天气信息-获取天气信息") @Operation(summary = "农场首页-天气信息-获取天气信息")
@GetMapping("/weather/{lng}/{lat}") @GetMapping("/weather/{lng}/{lat}")
public CommonResult<String> getBaseNameList(@PathVariable("lng") String lng, public CommonResult<String> getBaseNameList(@PathVariable("lng") String lng,

View File

@@ -95,6 +95,7 @@ public class PlotInfoServiceImpl implements PlotInfoService {
@Transactional @Transactional
@Override @Override
public void updatePlotInfo(PlotInfoSaveReqVO updateReqVO) { public void updatePlotInfo(PlotInfoSaveReqVO updateReqVO) {
updateReqVO.setPlotId(updateReqVO.getCode());
// 校验存在 // 校验存在
validatePlotInfoExists(updateReqVO.getId()); validatePlotInfoExists(updateReqVO.getId());
// 校验地块面积 // 校验地块面积

View File

@@ -343,7 +343,7 @@ public class ProductionPlanServiceImpl implements ProductionPlanService {
if (plotArea == null) { if (plotArea == null) {
return String.valueOf(totalArea); return String.valueOf(totalArea);
} }
return totalArea + "/" + plotArea + "亩"; return plotArea.intValue() + "/" +(int) Math.round(totalArea) + "亩";
} }
@Override @Override

View File

@@ -162,12 +162,32 @@ public class AuthController {
} }
} }
@PermitAll
@PostMapping("/login-by-tenant")
@Operation(summary = "登录 (切换租户之后调用)")
public CommonResult<AuthLoginRespVO> getPhoneNumber4Login(@RequestBody @Valid TenantTokenReqVO reqVO) {
AuthLoginRespVO login = authService.getPhoneNumber4Login(reqVO);
if (login != null) {
return success(login);
} else {
return error(405, "该手机号不是平台用户");
}
}
@PermitAll
@PostMapping("/get-tenant-token") @PostMapping("/get-tenant-token")
@Operation(summary = "获取租户的令牌列表") @Operation(summary = "获取租户的令牌列表")
public CommonResult<List<TenantTokenRespVO>> getTenantTokenList(@RequestHeader("authorization") String authorization, public CommonResult<List<TenantTokenRespVO>> getTenantTokenList(@RequestBody @Valid WxLoginReqVO reqVO) {
@RequestBody @Valid TenantTokenReqVO reqVO) {
String token = TokenExtractorUtil.extractToken(authorization); List<TenantTokenRespVO> res = authService.getTenantTokenList(reqVO);
List<TenantTokenRespVO> res = authService.getTenantTokenList(reqVO.getPhoneNumber(), token); return success(res);
}
@PermitAll
@PostMapping("/get-tenant-token/by-mobile")
@Operation(summary = "获取租户的令牌列表")
public CommonResult<List<TenantTokenRespVO>> getTenantTokenList4Mobile(@RequestBody @Valid TenantTokenReqVO reqVO) {
List<TenantTokenRespVO> res = authService.getTenantTokenList4Mobile(reqVO);
return success(res); return success(res);
} }

View File

@@ -29,4 +29,6 @@ public class AuthLoginRespVO {
private Long tenantId; private Long tenantId;
private String mobile;
} }

View File

@@ -15,6 +15,7 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor @NoArgsConstructor
public class TenantTokenReqVO { public class TenantTokenReqVO {
private String tenantId;
private String phoneNumber; private String phoneNumber;
} }

View File

@@ -27,5 +27,8 @@ public class TenantTokenRespVO {
private String refreshToken; private String refreshToken;
@Schema(description = "默认展示租户 (1:当前; 0: 非当前)") @Schema(description = "默认展示租户 (1:当前; 0: 非当前)")
private Integer defaultStatus; private Integer defaultStatus;
@Schema(description = "手机号")
private String mobile;
} }

View File

@@ -24,4 +24,6 @@ public class WxLoginReqVO {
private String rawData; private String rawData;
private String openid; private String openid;
private String tenantId;
} }

View File

@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.system.controller.admin.user;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission; import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission;
import cn.iocoder.yudao.module.system.controller.admin.auth.vo.TenantTokenReqVO;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileRespVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileRespVO;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO;
@@ -62,6 +63,21 @@ public class UserProfileController {
return success(UserConvert.INSTANCE.convert(user, userRoles, dept, posts)); return success(UserConvert.INSTANCE.convert(user, userRoles, dept, posts));
} }
@GetMapping("/get/wx")
@Operation(summary = "获得登录用户信息 (微信端使用)")
@DataPermission(enable = false) // 关闭数据权限,避免只查看自己时,查询不到部门。
public CommonResult<UserProfileRespVO> getUserProfile2(TenantTokenReqVO reqVO) {
// 获得用户基本信息
AdminUserDO user = userService.getUserByMobileAndTenantId2(reqVO.getPhoneNumber(), reqVO.getTenantId());
// 获得用户角色
List<RoleDO> userRoles = roleService.getRoleListFromCache(permissionService.getUserRoleIdListByUserId(user.getId()));
// 获得部门信息
DeptDO dept = user.getDeptId() != null ? deptService.getDept(user.getDeptId()) : null;
// 获得岗位信息
List<PostDO> posts = CollUtil.isNotEmpty(user.getPostIds()) ? postService.getPostList(user.getPostIds()) : null;
return success(UserConvert.INSTANCE.convert(user, userRoles, dept, posts));
}
@PutMapping("/update") @PutMapping("/update")
@Operation(summary = "修改用户个人信息") @Operation(summary = "修改用户个人信息")
public CommonResult<Boolean> updateUserProfile(@Valid @RequestBody UserProfileUpdateReqVO reqVO) { public CommonResult<Boolean> updateUserProfile(@Valid @RequestBody UserProfileUpdateReqVO reqVO) {

View File

@@ -54,4 +54,8 @@ public interface AdminUserMapper extends BaseMapperX<AdminUserDO> {
@InterceptorIgnore(tenantLine = "true") @InterceptorIgnore(tenantLine = "true")
@Select("SELECT * FROM system_users WHERE deleted = 0 AND mobile = #{mobile}") @Select("SELECT * FROM system_users WHERE deleted = 0 AND mobile = #{mobile}")
List<AdminUserDO> selectListByMobile(@Param("mobile") String mobile); List<AdminUserDO> selectListByMobile(@Param("mobile") String mobile);
@InterceptorIgnore(tenantLine = "true")
@Select("SELECT * FROM system_users WHERE deleted = 0 AND mobile = #{mobile} AND tenant_id = #{tenantId}")
AdminUserDO selectListByMobileAndTenantId(@Param("mobile") String mobile,@Param("tenantId") String tenantId);
} }

View File

@@ -105,8 +105,11 @@ public interface AdminAuthService {
* @param phoneNumber * @param phoneNumber
* @return * @return
*/ */
List<TenantTokenRespVO> getTenantTokenList(String phoneNumber,String accessToken); List<TenantTokenRespVO> getTenantTokenList(WxLoginReqVO reqVO);
List<TenantTokenRespVO> getTenantTokenList4Mobile(TenantTokenReqVO reqVO);
List<TenantTokenRespVO> getTenantList(WxLoginReqVO reqVO);
/** /**
* 登录前置操作 * 登录前置操作
* 1. 获取用户所拥有的租户列表 * 1. 获取用户所拥有的租户列表
@@ -114,4 +117,11 @@ public interface AdminAuthService {
* @return * @return
*/ */
List<TenantRespVO> loginForTenantList(LoginForTenantReqVO reqVO); List<TenantRespVO> loginForTenantList(LoginForTenantReqVO reqVO);
/**
* 登录
* @param reqVO
* @return
*/
AuthLoginRespVO getPhoneNumber4Login(TenantTokenReqVO reqVO);
} }

View File

@@ -411,35 +411,24 @@ public class AdminAuthServiceImpl implements AdminAuthService {
WxUserPhoneRespVO bean = JSONUtil.toBean(decryptedData, WxUserPhoneRespVO.class); WxUserPhoneRespVO bean = JSONUtil.toBean(decryptedData, WxUserPhoneRespVO.class);
// 绑定用户 // 绑定用户
String phoneNumber = bean.getPhoneNumber(); String phoneNumber = bean.getPhoneNumber();
AdminUserDO user = userService.getUserByMobile(phoneNumber); AdminUserDO user = userService.getUserByMobileAndTenantId(phoneNumber,reqVO.getTenantId());
if (user == null) { // List<AdminUserDO> mList = userService.getUserByMobileToList(phoneNumber);
return null; // AdminUserDO user = mList.stream().filter(e -> e.getTenantId() == 2)
} // AdminUserDO user = null;
// for (AdminUserDO u : mList) {
// 检查用户租户ID,如果为空则尝试修复
if (user.getTenantId() == null) { if (user == null) {
Long currentTenantId = TenantContextHolder.getTenantId(); return null;
// 如果TenantContextHolder中没有,尝试从请求头中获取
if (currentTenantId == null) {
try {
currentTenantId = WebFrameworkUtils.getTenantId(ServletUtils.getRequest());
} catch (Exception e) {
log.debug("[getPhoneNumber][无法获取当前请求,跳过从请求头提取租户ID]");
}
} }
if (currentTenantId != null) { this.fixOpenid(user,reqVO.getOpenid());
log.warn("[getPhoneNumber][用户({}) 租户ID为空,使用当前租户ID: {}]", user.getId(), currentTenantId); // if (u.getTenantId() == 2) {
user.setTenantId(currentTenantId); // user = u; // 同一个手机号 随意给到一个租户
userService.updateByid(user); // }
} else { // }
log.error("[getPhoneNumber][用户({}) 租户ID为空,且无法获取当前租户ID]", user.getId());
}
}
user.setOpenid(reqVO.getOpenid());
userService.updateByid(user);
AuthLoginRespVO tokenAfterLoginSuccess = createTokenAfterLoginSuccess(user.getId(), user.getUsername(), LoginLogTypeEnum.LOGIN_MOBILE); AuthLoginRespVO tokenAfterLoginSuccess = createTokenAfterLoginSuccess(user.getId(), user.getUsername(), LoginLogTypeEnum.LOGIN_MOBILE);
tokenAfterLoginSuccess.setMobile(phoneNumber);
return tokenAfterLoginSuccess; return tokenAfterLoginSuccess;
} catch (Exception e) { } catch (Exception e) {
log.error("[getPhoneNumber][解密手机号失败,encryptedData: {}, sessionKey: {}, iv: {}]", log.error("[getPhoneNumber][解密手机号失败,encryptedData: {}, sessionKey: {}, iv: {}]",
@@ -448,6 +437,42 @@ public class AdminAuthServiceImpl implements AdminAuthService {
} }
} }
@Override
public AuthLoginRespVO getPhoneNumber4Login(TenantTokenReqVO reqVO) {
String phoneNumber = reqVO.getPhoneNumber();
AdminUserDO user = userService.getUserByMobileAndTenantId2(phoneNumber,reqVO.getTenantId());
AuthLoginRespVO tokenAfterLoginSuccess = createTokenAfterLoginSuccess(user.getId(), user.getUsername(), LoginLogTypeEnum.LOGIN_MOBILE);
tokenAfterLoginSuccess.setMobile(phoneNumber);
return tokenAfterLoginSuccess;
}
private void fixOpenid(AdminUserDO user, String openid){
// 检查用户租户ID,如果为空则尝试修复
if (user.getTenantId() == null) {
Long currentTenantId = TenantContextHolder.getTenantId();
// 如果TenantContextHolder中没有,尝试从请求头中获取
if (currentTenantId == null) {
try {
currentTenantId = WebFrameworkUtils.getTenantId(ServletUtils.getRequest());
} catch (Exception e) {
log.debug("[getPhoneNumber][无法获取当前请求,跳过从请求头提取租户ID]");
}
}
if (currentTenantId != null) {
log.warn("[getPhoneNumber][用户({}) 租户ID为空,使用当前租户ID: {}]", user.getId(), currentTenantId);
user.setTenantId(currentTenantId);
userService.updateByid(user);
} else {
log.error("[getPhoneNumber][用户({}) 租户ID为空,且无法获取当前租户ID]", user.getId());
}
}
user.setOpenid(openid);
userService.updateByid(user);
}
@Override @Override
public Boolean synchronize(UserReqVO reqVO) { public Boolean synchronize(UserReqVO reqVO) {
AdminUserDO userByMobile = userService.getUserByMobile(reqVO.getPhone()); AdminUserDO userByMobile = userService.getUserByMobile(reqVO.getPhone());
@@ -501,20 +526,58 @@ public class AdminAuthServiceImpl implements AdminAuthService {
} }
@Override @Override
public List<TenantTokenRespVO> getTenantTokenList(String phoneNumber,String accessToken) { public List<TenantTokenRespVO> getTenantList(WxLoginReqVO reqVO) {
// log.info("{} ==> {}", "wx登录",reqVO.toString());
// AuthLoginRespVO login = this.getPhoneNumber(reqVO);
// String mobile = login.getMobile();
// String token = login.getAccessToken();
//
// return this.getTenantTokenList(mobile, token);
return null;
}
@Override
public List<TenantTokenRespVO> getTenantTokenList(WxLoginReqVO reqVO) {
List<TenantTokenRespVO> res = new ArrayList<>(); List<TenantTokenRespVO> res = new ArrayList<>();
try { // 解密手机号数据
OAuth2AccessTokenDO currentOAuth = oauth2TokenService.getAccessToken(accessToken); String decryptedData = decryptWxData(reqVO.getEncryptedData(), reqVO.getSessionKey(), reqVO.getIv(), wxMiniAppId);
Long tenantId = currentOAuth.getTenantId(); // 解析JSON数据
TenantDO tenant = tenantService.getTenant(tenantId); WxUserPhoneRespVO bean = JSONUtil.toBean(decryptedData, WxUserPhoneRespVO.class);
// 绑定用户
String phoneNumber = bean.getPhoneNumber();
res.add(this.getCurrentTenant(currentOAuth,tenant.getName())); try {
res.addAll(this.getTenantList(phoneNumber,tenantId)); // OAuth2AccessTokenDO currentOAuth = oauth2TokenService.getAccessToken(accessToken);
// Long tenantId = currentOAuth.getTenantId();
// TenantDO tenant = tenantService.getTenant(tenantId);
// Long userId = currentOAuth.getUserId();
res.addAll(this.getTenantList(phoneNumber));
// res.add(this.getCurrentTenant(currentOAuth,tenant.getName()));
res.addAll(this.getRemoteTenant(phoneNumber)); res.addAll(this.getRemoteTenant(phoneNumber));
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
res.stream().forEach(e -> e.setMobile(phoneNumber));
return res;
}
@Override
public List<TenantTokenRespVO> getTenantTokenList4Mobile(TenantTokenReqVO reqVO) {
List<TenantTokenRespVO> res = new ArrayList<>();
String phoneNumber = reqVO.getPhoneNumber();
try {
res.addAll(this.getTenantList(phoneNumber));
res.addAll(this.getRemoteTenant(phoneNumber));
} catch (Exception e) {
e.printStackTrace();
}
res.stream().forEach(e -> e.setMobile(phoneNumber));
return res; return res;
} }
@@ -522,14 +585,14 @@ public class AdminAuthServiceImpl implements AdminAuthService {
* 获取当前登录租户列表 * 获取当前登录租户列表
* @return * @return
*/ */
private List<TenantTokenRespVO> getTenantList(String phoneNumber,Long tenantId) { private List<TenantTokenRespVO> getTenantList(String phoneNumber) {
List<TenantRespVO> tList = tenantService.getTenantListByMobile(phoneNumber); List<TenantRespVO> tList = tenantService.getTenantListByMobile(phoneNumber);
tList = tList.stream() // tList = tList.stream()
.filter(tenant -> ObjectUtils.notEqual(tenantId, tenant.getTenantId())) // .filter(tenant -> ObjectUtils.notEqual(tenantId, tenant.getTenantId()))
.collect(Collectors.toList()); // .collect(Collectors.toList());
return tList.stream().map(e -> return tList.stream().map(e ->
new TenantTokenRespVO(String.valueOf(e.getTenantId()), e.getTenantName(), "1", "", "", 0) new TenantTokenRespVO(String.valueOf(e.getTenantId()), e.getTenantName(), "1", "", "", 0,phoneNumber)
).toList(); ).toList();
} }

View File

@@ -119,6 +119,8 @@ public interface AdminUserService {
* @return 用户对象信息 * @return 用户对象信息
*/ */
AdminUserDO getUserByMobile(String mobile); AdminUserDO getUserByMobile(String mobile);
AdminUserDO getUserByMobileAndTenantId(String mobile,String tenantId);
AdminUserDO getUserByMobileAndTenantId2(String mobile,String tenantId);
List<AdminUserDO> getUserByMobileToList(String mobile); List<AdminUserDO> getUserByMobileToList(String mobile);
List<AdminUserDO> getUserByMobileToList2(String mobileNumber); List<AdminUserDO> getUserByMobileToList2(String mobileNumber);

View File

@@ -12,6 +12,7 @@ import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils; import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils;
import cn.iocoder.yudao.framework.datapermission.core.util.DataPermissionUtils; import cn.iocoder.yudao.framework.datapermission.core.util.DataPermissionUtils;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
import cn.iocoder.yudao.module.infra.api.config.ConfigApi; import cn.iocoder.yudao.module.infra.api.config.ConfigApi;
import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthRegisterReqVO; import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthRegisterReqVO;
@@ -332,6 +333,19 @@ public class AdminUserServiceImpl implements AdminUserService {
return userMapper.selectByMobile(mobile); return userMapper.selectByMobile(mobile);
} }
@Override
public AdminUserDO getUserByMobileAndTenantId(String mobile,String tenantId) {
LambdaQueryWrapperX<AdminUserDO> x = new LambdaQueryWrapperX<>();
x.eq(AdminUserDO::getMobile, mobile);
x.eq(AdminUserDO::getTenantId, tenantId);
return userMapper.selectOne(x);
}
@Override
public AdminUserDO getUserByMobileAndTenantId2(String mobile, String tenantId) {
return userMapper.selectListByMobileAndTenantId(mobile,tenantId);
}
@Override @Override
public List<AdminUserDO> getUserByMobileToList(String mobile) { public List<AdminUserDO> getUserByMobileToList(String mobile) {
return userMapper.selectList(AdminUserDO::getMobile,mobile); return userMapper.selectList(AdminUserDO::getMobile,mobile);