1. 提交代码

This commit is contained in:
2026-04-23 10:59:35 +08:00
parent fb204618a3
commit 5e7d53e8c6
8 changed files with 316 additions and 88 deletions

View File

@@ -40,8 +40,9 @@ public class AiChatController {
String user = "system"; String user = "system";
try { try {
Long userId = SecurityFrameworkUtils.getLoginUserId(); Long userId = SecurityFrameworkUtils.getLoginUserId();
String userNickname = SecurityFrameworkUtils.getLoginUserNickname();
if (userId != null) { if (userId != null) {
user = "user_" + userId; user = "user_" + userId+"_"+userNickname;
} }
} catch (Exception e) { } catch (Exception e) {
log.debug("获取登录用户失败,使用默认 user: {}", e.getMessage()); log.debug("获取登录用户失败,使用默认 user: {}", e.getMessage());

View File

@@ -1,9 +1,5 @@
package cn.iocoder.yudao.module.ydoyun.controller.admin.storeuser; package cn.iocoder.yudao.module.ydoyun.controller.admin.storeuser;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserRespVO;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import cn.iocoder.yudao.module.system.service.user.AdminUserService;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@@ -50,7 +46,7 @@ public class StoreUserController {
} }
@PutMapping("/update") @PutMapping("/update")
@Operation(summary = "更新门店-用户绑定") @Operation(summary = "更新用户及门店绑定(传 storeIds 时全量替换绑定;否则按绑定主键 id 更新单条)")
@PreAuthorize("@ss.hasPermission('ydoyun:store-user:update')") @PreAuthorize("@ss.hasPermission('ydoyun:store-user:update')")
public CommonResult<Boolean> updateStoreUser(@Valid @RequestBody StoreUserSaveReqVO updateReqVO) { public CommonResult<Boolean> updateStoreUser(@Valid @RequestBody StoreUserSaveReqVO updateReqVO) {
storeUserService.updateStoreUser(updateReqVO); storeUserService.updateStoreUser(updateReqVO);
@@ -58,23 +54,49 @@ public class StoreUserController {
} }
@DeleteMapping("/delete") @DeleteMapping("/delete")
@Operation(summary = "删除门店-用户绑定") @Operation(summary = "删除单条门店绑定记录(不删除系统用户账号)")
@Parameter(name = "id", description = "编号", required = true) @Parameter(name = "id", description = "绑定记录编号", required = true)
@PreAuthorize("@ss.hasPermission('ydoyun:store-user:delete')") @PreAuthorize("@ss.hasPermission('ydoyun:store-user:delete')")
public CommonResult<Boolean> deleteStoreUser(@RequestParam("id") Long id) { public CommonResult<Boolean> deleteStoreUser(@RequestParam("id") Long id) {
storeUserService.deleteStoreUser(id); storeUserService.deleteStoreUser(id);
return success(true); return success(true);
} }
@DeleteMapping("/delete-binding")
@Operation(summary = "按用户与门店解除绑定(不删除账号)")
@PreAuthorize("@ss.hasPermission('ydoyun:store-user:delete')")
public CommonResult<Boolean> deleteStoreUserBinding(@RequestParam("userId") Long userId,
@RequestParam("storeId") Long storeId) {
storeUserService.deleteStoreUserBinding(userId, storeId);
return success(true);
}
@DeleteMapping("/delete-user")
@Operation(summary = "删除用户账号及全部门店绑定")
@PreAuthorize("@ss.hasPermission('ydoyun:store-user:delete')")
public CommonResult<Boolean> deleteStoreUserAccount(@RequestParam("userId") Long userId) {
storeUserService.deleteStoreUserAccount(userId);
return success(true);
}
@DeleteMapping("/delete-list") @DeleteMapping("/delete-list")
@Parameter(name = "ids", description = "编号", required = true) @Parameter(name = "ids", description = "绑定记录编号", required = true)
@Operation(summary = "批量删除门店-用户绑定") @Operation(summary = "批量删除绑定记录(不删除系统用户账号)")
@PreAuthorize("@ss.hasPermission('ydoyun:store-user:delete')") @PreAuthorize("@ss.hasPermission('ydoyun:store-user:delete')")
public CommonResult<Boolean> deleteStoreUserList(@RequestParam("ids") List<Long> ids) { public CommonResult<Boolean> deleteStoreUserList(@RequestParam("ids") List<Long> ids) {
storeUserService.deleteStoreUserListByIds(ids); storeUserService.deleteStoreUserListByIds(ids);
return success(true); return success(true);
} }
@DeleteMapping("/delete-user-list")
@Parameter(name = "userIds", description = "系统用户编号", required = true)
@Operation(summary = "批量删除用户账号及绑定")
@PreAuthorize("@ss.hasPermission('ydoyun:store-user:delete')")
public CommonResult<Boolean> deleteStoreUserAccountList(@RequestParam("userIds") List<Long> userIds) {
storeUserService.deleteStoreUserAccountList(userIds);
return success(true);
}
@GetMapping("/get") @GetMapping("/get")
@Operation(summary = "获得门店-用户绑定") @Operation(summary = "获得门店-用户绑定")
@Parameter(name = "id", description = "编号", required = true, example = "1024") @Parameter(name = "id", description = "编号", required = true, example = "1024")
@@ -84,6 +106,14 @@ public class StoreUserController {
return success(BeanUtils.toBean(storeUser, StoreUserRespVO.class)); return success(BeanUtils.toBean(storeUser, StoreUserRespVO.class));
} }
@GetMapping("/get-edit")
@Operation(summary = "获得门店用户编辑信息(账号与已绑定门店列表)")
@Parameter(name = "userId", description = "系统用户编号", required = true)
@PreAuthorize("@ss.hasPermission('ydoyun:store-user:query')")
public CommonResult<StoreUserEditRespVO> getStoreUserForEdit(@RequestParam("userId") Long userId) {
return success(storeUserService.getStoreUserForEdit(userId));
}
@GetMapping("/page") @GetMapping("/page")
@Operation(summary = "获得门店-用户绑定分页") @Operation(summary = "获得门店-用户绑定分页")
@PreAuthorize("@ss.hasPermission('ydoyun:store-user:query')") @PreAuthorize("@ss.hasPermission('ydoyun:store-user:query')")

View File

@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import java.util.List;
@Schema(description = "管理后台 - 门店-用户绑定新增/修改 Request VO") @Schema(description = "管理后台 - 门店-用户绑定新增/修改 Request VO")
@Data @Data
public class StoreUserSaveReqVO { public class StoreUserSaveReqVO {
@@ -33,4 +35,10 @@ public class StoreUserSaveReqVO {
@TableField(exist = false) @TableField(exist = false)
@Schema(description = "手机号") @Schema(description = "手机号")
private String mobile; private String mobile;
/**
* 编辑用户时传入:全量替换门店绑定(与 {@link #id} 单条更新二选一,优先本字段非 null 时走批量同步)
*/
@Schema(description = "门店编号列表(编辑时全量替换绑定;空列表表示解除全部门店绑定)")
private List<Long> storeIds;
} }

View File

@@ -1,17 +1,20 @@
package cn.iocoder.yudao.module.ydoyun.dal.mysql.storeuser; package cn.iocoder.yudao.module.ydoyun.dal.mysql.storeuser;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.system.dal.dataobject.permission.UserRoleDO; import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import cn.iocoder.yudao.module.ydoyun.controller.admin.storeuser.vo.StoreUserPageReqVO; import cn.iocoder.yudao.module.ydoyun.controller.admin.storeuser.vo.StoreUserPageReqVO;
import cn.iocoder.yudao.module.ydoyun.dal.dataobject.store.StoreDO; import cn.iocoder.yudao.module.ydoyun.dal.dataobject.store.StoreDO;
import cn.iocoder.yudao.module.ydoyun.dal.dataobject.storeuser.StoreUserDO; import cn.iocoder.yudao.module.ydoyun.dal.dataobject.storeuser.StoreUserDO;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.io.Serializable; import java.io.Serializable;
import java.util.Objects; import java.util.List;
/** /**
* 门店-用户绑定 Mapper * 门店-用户绑定 Mapper
@@ -22,42 +25,34 @@ import java.util.Objects;
public interface StoreUserMapper extends BaseMapperX<StoreUserDO> { public interface StoreUserMapper extends BaseMapperX<StoreUserDO> {
/** /**
* 门店-用户绑定分页(连带查询 AdminUser 信息) * 门店-用户绑定分页:以用户表 system_users 为主表,关系表 ydoyun_store_user、门店表 ydoyun_store 为从表
*/
Page<StoreUserDO> selectUserMainPage(Page<StoreUserDO> page, @Param("reqVO") StoreUserPageReqVO reqVO);
/**
* 同上,不分页(例如 pageSize = -1 时导出全量)
*/
List<StoreUserDO> selectUserMainPageList(@Param("reqVO") StoreUserPageReqVO reqVO);
/**
* 按用户分组后的总用户数GROUP BY 场景下禁用 MP 自动 count改用手动统计
*/
Long selectUserMainPageCount(@Param("reqVO") StoreUserPageReqVO reqVO);
/**
* 门店-用户分页(入口:与 /ydoyun/store-user/page 一致;列表每用户一行)
*/ */
default PageResult<StoreUserDO> selectPage(StoreUserPageReqVO reqVO) { default PageResult<StoreUserDO> selectPage(StoreUserPageReqVO reqVO) {
if (PageParam.PAGE_SIZE_NONE.equals(reqVO.getPageSize())) {
MPJLambdaWrapper<StoreUserDO> wrapper = new MPJLambdaWrapper<StoreUserDO>() List<StoreUserDO> list = selectUserMainPageList(reqVO);
.selectAll(StoreUserDO.class) return new PageResult<>(list, (long) list.size());
// 关联字段映射到 StoreUserDO 冗余字段
.selectAs(AdminUserDO::getUsername, StoreUserDO::getUsername)
.selectAs(AdminUserDO::getNickname, StoreUserDO::getNickname)
.selectAs(AdminUserDO::getMobile, StoreUserDO::getMobile)
.selectAs(StoreDO::getStoreCode, StoreUserDO::getStoreCode)
.selectAs(StoreDO::getStoreName, StoreUserDO::getStoreName)
.leftJoin(AdminUserDO.class,
AdminUserDO::getId,
StoreUserDO::getUserId)
.leftJoin(StoreDO.class,
StoreDO::getId,
StoreUserDO::getStoreId);
if (Objects.nonNull(reqVO.getRoleId())) {
wrapper.innerJoin(UserRoleDO.class, UserRoleDO::getUserId, StoreUserDO::getUserId)
.eq(UserRoleDO::getRoleId, reqVO.getRoleId());
} }
wrapper Page<StoreUserDO> page = MyBatisUtils.buildPage(reqVO);
// 条件 page.setSearchCount(false);
.eq(Objects.nonNull(reqVO.getStoreId()), StoreUserDO::getStoreId, reqVO.getStoreId()) Long total = selectUserMainPageCount(reqVO);
.eq(Objects.nonNull(reqVO.getUserId()), StoreUserDO::getUserId, reqVO.getUserId()) page.setTotal(total != null ? total : 0L);
.like(Objects.nonNull(reqVO.getUsername()), AdminUserDO::getUsername, reqVO.getUsername()) selectUserMainPage(page, reqVO);
.like(Objects.nonNull(reqVO.getNickname()), AdminUserDO::getNickname, reqVO.getNickname()) return new PageResult<>(page.getRecords(), page.getTotal());
.like(Objects.nonNull(reqVO.getMobile()), AdminUserDO::getMobile, reqVO.getMobile())
.like(Objects.nonNull(reqVO.getStoreName()), StoreDO::getStoreName, reqVO.getStoreName())
.orderByDesc(StoreUserDO::getId);
if (reqVO.getCreateTime() != null && reqVO.getCreateTime().length == 2) {
wrapper.between(AdminUserDO::getCreateTime, reqVO.getCreateTime()[0], reqVO.getCreateTime()[1]);
}
return selectJoinPage(reqVO, StoreUserDO.class, wrapper);
} }

View File

@@ -19,6 +19,8 @@ public interface ErrorCodeConstants {
ErrorCode STORE_NOT_EXISTS = new ErrorCode(1_024_000_008, "门店不存在"); ErrorCode STORE_NOT_EXISTS = new ErrorCode(1_024_000_008, "门店不存在");
ErrorCode STORE_USER_NOT_EXISTS = new ErrorCode(1_024_000_009, "门店用户记录不存在"); ErrorCode STORE_USER_NOT_EXISTS = new ErrorCode(1_024_000_009, "门店用户记录不存在");
ErrorCode STORE_USER_BIND_NOT_EXISTS = new ErrorCode(1_024_000_011, "该用户与门店的绑定关系不存在");
ErrorCode CUSTOM_TAG_NOT_EXISTS = new ErrorCode(1_024_000_010, "自定义标签不存在"); ErrorCode CUSTOM_TAG_NOT_EXISTS = new ErrorCode(1_024_000_010, "自定义标签不存在");
ErrorCode TAG_NOT_EXISTS = new ErrorCode(1_001_001_001, "标准标签不存在"); ErrorCode TAG_NOT_EXISTS = new ErrorCode(1_001_001_001, "标准标签不存在");
ErrorCode TAG_CONFIG_NOT_EXISTS = new ErrorCode(1_001_001_002, "标签同步配置不存在"); ErrorCode TAG_CONFIG_NOT_EXISTS = new ErrorCode(1_001_001_002, "标签同步配置不存在");

View File

@@ -30,16 +30,31 @@ public interface StoreUserService {
void updateStoreUser(@Valid StoreUserSaveReqVO updateReqVO); void updateStoreUser(@Valid StoreUserSaveReqVO updateReqVO);
/** /**
* 删除门店-用户绑定 * 删除单条门店-用户绑定(不删除系统用户账号)
* *
* @param id 编号 * @param id 绑定记录编号
*/ */
void deleteStoreUser(Long id); void deleteStoreUser(Long id);
/** /**
* 批量删除门店-用户绑定 * 按用户 + 门店解除绑定(不删除系统用户账号)
*/
void deleteStoreUserBinding(Long userId, Long storeId);
/**
* 删除用户账号及其全部门店绑定(同步删除系统用户及权限等关联数据)
*/
void deleteStoreUserAccount(Long userId);
/**
* 批量删除用户账号(同 {@link #deleteStoreUserAccount(Long)}
*/
void deleteStoreUserAccountList(List<Long> userIds);
/**
* 批量删除绑定记录(不删除系统用户账号)
* *
* @param ids 编号 * @param ids 绑定记录编号列表
*/ */
void deleteStoreUserListByIds(List<Long> ids); void deleteStoreUserListByIds(List<Long> ids);
@@ -51,6 +66,11 @@ public interface StoreUserService {
*/ */
StoreUserDO getStoreUser(Long id); StoreUserDO getStoreUser(Long id);
/**
* 获得编辑弹窗所需信息(系统用户 + 已绑定门店列表)
*/
StoreUserEditRespVO getStoreUserForEdit(Long userId);
/** /**
* 获得门店-用户绑定分页 * 获得门店-用户绑定分页
* *

View File

@@ -5,6 +5,7 @@ import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserSaveReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO;
import cn.iocoder.yudao.module.system.dal.dataobject.permission.UserRoleDO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.UserRoleDO;
@@ -24,6 +25,7 @@ import cn.iocoder.yudao.module.ydoyun.dal.mysql.storeuser.StoreUserMapper;
import cn.iocoder.yudao.module.ydoyun.dal.mysql.user.YdoyunUserExtMapper; import cn.iocoder.yudao.module.ydoyun.dal.mysql.user.YdoyunUserExtMapper;
import cn.iocoder.yudao.module.ydoyun.service.store.StoreService; import cn.iocoder.yudao.module.ydoyun.service.store.StoreService;
import cn.iocoder.yudao.module.ydoyun.service.storeuser.vo.E3StoreUserVO; import cn.iocoder.yudao.module.ydoyun.service.storeuser.vo.E3StoreUserVO;
import cn.iocoder.yudao.module.ydoyun.support.ErpReportDatabaseBuilder;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -35,7 +37,11 @@ import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.function.Function; import java.util.function.Function;
import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.BAD_REQUEST;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_NOT_EXISTS;
import static cn.iocoder.yudao.module.ydoyun.enums.ErrorCodeConstants.STORE_NOT_EXISTS;
import static cn.iocoder.yudao.module.ydoyun.enums.ErrorCodeConstants.STORE_USER_BIND_NOT_EXISTS;
import static cn.iocoder.yudao.module.ydoyun.enums.ErrorCodeConstants.STORE_USER_NOT_EXISTS; import static cn.iocoder.yudao.module.ydoyun.enums.ErrorCodeConstants.STORE_USER_NOT_EXISTS;
/** /**
@@ -89,44 +95,101 @@ public class StoreUserServiceImpl implements StoreUserService {
} }
/** /**
* 更新AdminUser + StoreUser * 更新AdminUser + 门店绑定(支持全量替换 storeIds 或单条绑定字段更新)
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void updateStoreUser(StoreUserSaveReqVO updateReqVO) { public void updateStoreUser(StoreUserSaveReqVO updateReqVO) {
// 校验存在 if (updateReqVO.getStoreIds() != null) {
validateStoreUserExists(updateReqVO.getId()); if (updateReqVO.getUserId() == null) {
throw exception(BAD_REQUEST);
// 1. 同步更新 AdminUser }
if (adminUserService.getUser(updateReqVO.getUserId()) == null) {
throw exception(USER_NOT_EXISTS);
}
UserSaveReqVO userReqVO = buildUserSaveReqVO(updateReqVO);
userReqVO.setId(updateReqVO.getUserId());
adminUserService.updateUser(userReqVO);
List<Long> distinctStores = updateReqVO.getStoreIds().stream()
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toList());
storeUserMapper.delete(new LambdaQueryWrapperX<StoreUserDO>()
.eq(StoreUserDO::getUserId, updateReqVO.getUserId()));
for (Long storeId : distinctStores) {
if (storeService.getStore(storeId) == null) {
throw exception(STORE_NOT_EXISTS);
}
StoreUserDO row = new StoreUserDO();
row.setUserId(updateReqVO.getUserId());
row.setStoreId(storeId);
storeUserMapper.insert(row);
}
return;
}
validateStoreUserExists(updateReqVO.getId());
UserSaveReqVO userReqVO = buildUserSaveReqVO(updateReqVO); UserSaveReqVO userReqVO = buildUserSaveReqVO(updateReqVO);
userReqVO.setId(updateReqVO.getUserId()); userReqVO.setId(updateReqVO.getUserId());
adminUserService.updateUser(userReqVO); adminUserService.updateUser(userReqVO);
// 2. 更新绑定关系
StoreUserDO updateObj = BeanUtils.toBean(updateReqVO, StoreUserDO.class); StoreUserDO updateObj = BeanUtils.toBean(updateReqVO, StoreUserDO.class);
storeUserMapper.updateById(updateObj); storeUserMapper.updateById(updateObj);
} }
/** /**
* 删除StoreUser + 禁用 AdminUser * 删除单条绑定记录(不删除系统用户)
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void deleteStoreUser(Long id) { public void deleteStoreUser(Long id) {
StoreUserDO storeUser = storeUserMapper.selectById(id); if (storeUserMapper.selectById(id) == null) {
if (storeUser == null) {
throw exception(STORE_USER_NOT_EXISTS); throw exception(STORE_USER_NOT_EXISTS);
} }
// 1. 删除绑定关系
storeUserMapper.deleteById(id); storeUserMapper.deleteById(id);
}
// 2. 禁用用户 @Override
adminUserService.updateUserStatus(storeUser.getUserId(), 0); @Transactional(rollbackFor = Exception.class)
public void deleteStoreUserBinding(Long userId, Long storeId) {
StoreUserDO row = storeUserMapper.selectOne(new LambdaQueryWrapperX<StoreUserDO>()
.eq(StoreUserDO::getUserId, userId)
.eq(StoreUserDO::getStoreId, storeId));
if (row == null) {
throw exception(STORE_USER_BIND_NOT_EXISTS);
}
storeUserMapper.deleteById(row.getId());
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteStoreUserAccount(Long userId) {
if (userId == null) {
return;
}
if (adminUserService.getUser(userId) == null) {
throw exception(USER_NOT_EXISTS);
}
storeUserMapper.delete(new LambdaQueryWrapperX<StoreUserDO>()
.eq(StoreUserDO::getUserId, userId));
adminUserService.deleteUser(userId);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteStoreUserAccountList(List<Long> userIds) {
if (CollUtil.isEmpty(userIds)) {
return;
}
for (Long userId : userIds) {
deleteStoreUserAccount(userId);
}
} }
/** /**
* 批量删除StoreUser + 禁用 AdminUser * 批量删除绑定记录(不删除系统用户)
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@@ -134,15 +197,7 @@ public class StoreUserServiceImpl implements StoreUserService {
if (CollUtil.isEmpty(ids)) { if (CollUtil.isEmpty(ids)) {
return; return;
} }
List<StoreUserDO> list = storeUserMapper.selectBatchIds(ids);
// 1. 删除绑定
storeUserMapper.deleteByIds(ids); storeUserMapper.deleteByIds(ids);
// 2. 批量禁用用户
list.forEach(item ->
adminUserService.updateUserStatus(item.getUserId(), 0));
} }
private void validateStoreUserExists(Long id) { private void validateStoreUserExists(Long id) {
@@ -156,6 +211,29 @@ public class StoreUserServiceImpl implements StoreUserService {
return storeUserMapper.selectById(id); return storeUserMapper.selectById(id);
} }
@Override
public StoreUserEditRespVO getStoreUserForEdit(Long userId) {
AdminUserDO user = adminUserService.getUser(userId);
if (user == null) {
throw exception(USER_NOT_EXISTS);
}
List<StoreUserDO> binds = storeUserMapper.selectList(new LambdaQueryWrapperX<StoreUserDO>()
.eq(StoreUserDO::getUserId, userId));
List<Long> storeIds = binds.stream()
.map(StoreUserDO::getStoreId)
.filter(Objects::nonNull)
.distinct()
.sorted()
.collect(Collectors.toList());
StoreUserEditRespVO vo = new StoreUserEditRespVO();
vo.setUserId(userId);
vo.setUsername(user.getUsername());
vo.setNickname(user.getNickname());
vo.setMobile(user.getMobile());
vo.setStoreIds(storeIds);
return vo;
}
@Override @Override
public PageResult<StoreUserDO> getStoreUserPage(StoreUserPageReqVO pageReqVO) { public PageResult<StoreUserDO> getStoreUserPage(StoreUserPageReqVO pageReqVO) {
PageResult<StoreUserDO> pageResult = storeUserMapper.selectPage(pageReqVO); PageResult<StoreUserDO> pageResult = storeUserMapper.selectPage(pageReqVO);
@@ -227,16 +305,26 @@ public class StoreUserServiceImpl implements StoreUserService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean e3SyncStoreAndUser() { public boolean e3SyncStoreAndUser() {
Long tenantId = TenantContextHolder.getTenantId();
ReportDatabaseDO reportDatabase = null;
String prefix = null;
if (tenantId.intValue() == 162) {
prefix = "lj";
reportDatabase = buildErpDatabaseLJSM();
}else if (tenantId.intValue() == 164) {
prefix = "wbl";
reportDatabase = ErpReportDatabaseBuilder.buildErpDatabaseWBL();
}else {
throw new RuntimeException("当前租户不支持e3同步账号");
}
try { try {
// 1. 构建数据源配置
ReportDatabaseDO reportDatabase = buildErpDatabase();
// 2. SQLJava 8 写法) // 2. SQLJava 8 写法)
String sql = String sql =
"SELECT " + "SELECT " +
" CASE " + " CASE " +
" WHEN a.USERID IS NOT NULL AND LTRIM(RTRIM(a.USERID)) <> '' " + " WHEN a.USERID IS NOT NULL AND LTRIM(RTRIM(a.USERID)) <> '' " +
" THEN 'lj' + a.USERID " + " THEN '"+prefix+"' + a.USERID " +
" ELSE a.USERID " + " ELSE a.USERID " +
" END AS username, " + " END AS username, " +
" a.NAME AS nickname, " + " a.NAME AS nickname, " +
@@ -662,15 +750,15 @@ public class StoreUserServiceImpl implements StoreUserService {
return allBindings; return allBindings;
} }
private ReportDatabaseDO buildErpDatabase() { private ReportDatabaseDO buildErpDatabaseLJSM() {
ReportDatabaseDO db = new ReportDatabaseDO(); ReportDatabaseDO db = new ReportDatabaseDO();
db.setDbName("ERPLJSM 数据源"); // db.setDbName("ERPLJSM 数据源");
db.setDbType("sqlserver"); // db.setDbType("sqlserver");
db.setHost("106.15.62.63"); // db.setHost("106.15.62.63");
db.setPort(9943); // db.setPort(9943);
db.setUsername("bsai"); // db.setUsername("bsai");
db.setPassword("ljsm@bsAI"); // db.setPassword("ljsm@bsAI");
db.setDatabaseName("ERPLJSM"); // db.setDatabaseName("ERPLJSM");
return db; return db;
} }

View File

@@ -3,10 +3,94 @@
<mapper namespace="cn.iocoder.yudao.module.ydoyun.dal.mysql.storeuser.StoreUserMapper"> <mapper namespace="cn.iocoder.yudao.module.ydoyun.dal.mysql.storeuser.StoreUserMapper">
<!-- <!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可 用户管理视角:以 system_users 为主表,按用户分组,每用户一行
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL 未传门店 id 条件时 LEFT JOIN 关系表,无门店绑定的用户也会查出;指定门店 id 时 INNER JOIN 仅看该门店下的用户
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询 多门店绑定时门店名称/编码用 GROUP_CONCAT 合并;仅绑定一家门店时回填 storeId
文档可见https://www.iocoder.cn/MyBatis/x-plugins/ id 取 MIN(su.id),无绑定时为 NULL。
--> -->
<sql id="userMainPageSelectColumnsGrouped">
MIN(su.id) AS id,
IF(COUNT(DISTINCT su.store_id) = 1, MAX(su.store_id), NULL) AS storeId,
u.id AS userId,
u.create_time AS createTime,
u.update_time AS updateTime,
NULL AS creator,
NULL AS updater,
0 AS deleted,
u.username AS username,
u.nickname AS nickname,
u.mobile AS mobile,
GROUP_CONCAT(DISTINCT s.store_code ORDER BY s.store_code SEPARATOR '、') AS storeCode,
GROUP_CONCAT(DISTINCT s.store_name ORDER BY s.store_name SEPARATOR '、') AS storeName
</sql>
<sql id="userMainPageFromJoin">
FROM system_users u
<choose>
<when test="reqVO.storeId != null">
INNER JOIN ydoyun_store_user su ON su.user_id = u.id AND su.deleted = 0 AND su.store_id = #{reqVO.storeId}
</when>
<otherwise>
LEFT JOIN ydoyun_store_user su ON su.user_id = u.id AND su.deleted = 0
</otherwise>
</choose>
LEFT JOIN ydoyun_store s ON s.id = su.store_id AND s.deleted = 0
<if test="reqVO.roleId != null">
INNER JOIN system_user_role ur ON ur.user_id = u.id AND ur.deleted = 0 AND ur.role_id = #{reqVO.roleId}
</if>
</sql>
<sql id="userMainPageWhere">
WHERE u.deleted = 0
<if test="reqVO.userId != null">
AND u.id = #{reqVO.userId}
</if>
<if test="reqVO.username != null and reqVO.username != ''">
AND u.username LIKE CONCAT('%', #{reqVO.username}, '%')
</if>
<if test="reqVO.nickname != null and reqVO.nickname != ''">
AND u.nickname LIKE CONCAT('%', #{reqVO.nickname}, '%')
</if>
<if test="reqVO.mobile != null and reqVO.mobile != ''">
AND u.mobile LIKE CONCAT('%', #{reqVO.mobile}, '%')
</if>
<if test="reqVO.storeName != null and reqVO.storeName != ''">
AND s.store_name LIKE CONCAT('%', #{reqVO.storeName}, '%')
</if>
<if test="reqVO.createTime != null and reqVO.createTime.length == 2">
AND u.create_time BETWEEN #{reqVO.createTime[0]} AND #{reqVO.createTime[1]}
</if>
</sql>
<sql id="userMainPageGroupBy">
GROUP BY u.id, u.username, u.nickname, u.mobile, u.create_time, u.update_time
</sql>
<select id="selectUserMainPageCount" resultType="java.lang.Long">
SELECT COUNT(*) FROM (
SELECT u.id
<include refid="userMainPageFromJoin"/>
<include refid="userMainPageWhere"/>
<include refid="userMainPageGroupBy"/>
) t
</select>
<select id="selectUserMainPage" resultType="cn.iocoder.yudao.module.ydoyun.dal.dataobject.storeuser.StoreUserDO">
SELECT
<include refid="userMainPageSelectColumnsGrouped"/>
<include refid="userMainPageFromJoin"/>
<include refid="userMainPageWhere"/>
<include refid="userMainPageGroupBy"/>
ORDER BY u.id DESC
</select>
<select id="selectUserMainPageList" resultType="cn.iocoder.yudao.module.ydoyun.dal.dataobject.storeuser.StoreUserDO">
SELECT
<include refid="userMainPageSelectColumnsGrouped"/>
<include refid="userMainPageFromJoin"/>
<include refid="userMainPageWhere"/>
<include refid="userMainPageGroupBy"/>
ORDER BY u.id DESC
</select>
</mapper> </mapper>