1. 提交代码
This commit is contained in:
@@ -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());
|
||||||
|
|||||||
@@ -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')")
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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, "标签同步配置不存在");
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得门店-用户绑定分页
|
* 获得门店-用户绑定分页
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -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. SQL(Java 8 写法)
|
// 2. SQL(Java 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
Reference in New Issue
Block a user