package cn.lili.modules.member.serviceimpl; import lombok.extern.slf4j.Slf4j; import cn.hutool.core.text.CharSequenceUtil; import cn.lili.cache.Cache; import cn.lili.cache.CachePrefix; import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.ResultUtil; import cn.lili.common.exception.ServiceException; import cn.lili.common.security.context.UserContext; import cn.lili.common.security.enums.UserEnums; import cn.lili.common.utils.StringUtils; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.member.entity.dos.Clerk; import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.entity.dos.StoreClerkRole; import cn.lili.modules.member.entity.dos.StoreRole; import cn.lili.modules.member.entity.dto.ClerkAddDTO; import cn.lili.modules.member.entity.dto.ClerkEditDTO; import cn.lili.modules.member.entity.dto.ClerkQueryDTO; import cn.lili.modules.member.entity.dto.MemberAddDTO; import cn.lili.modules.member.entity.vo.ClerkVO; import cn.lili.modules.member.mapper.ClerkMapper; import cn.lili.modules.member.service.*; import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; /** * 店员业务实现 * * @author wget * @title: ClerkServiceImpl * @projectName lilishop * @date 2021/12/28 8:13 下午 */ @Service @Transactional(rollbackFor = Exception.class) @Slf4j public class ClerkServiceImpl extends ServiceImpl implements ClerkService { @Autowired private StoreRoleService storeRoleService; @Autowired private StoreDepartmentService storeDepartmentService; @Autowired private MemberService memberService; @Autowired private StoreClerkRoleService storeClerkRoleService; @Autowired private Cache cache; @Override public ResultMessage addClerk(ClerkAddDTO clerkAddDTO) { int rolesMaxSize = 10; try { //角色必选,并且最后设置10个 if (clerkAddDTO.getRoles() != null && clerkAddDTO.getRoles().size() >= rolesMaxSize) { throw new ServiceException(ResultCode.PERMISSION_BEYOND_TEN); } //校验是否已经是会员 Member member = memberService.findByMobile(clerkAddDTO.getMobile()); if (member == null) { //添加会员 MemberAddDTO memberAddDTO = new MemberAddDTO(); memberAddDTO.setMobile(clerkAddDTO.getMobile()); memberAddDTO.setPassword(clerkAddDTO.getPassword()); memberAddDTO.setUsername(clerkAddDTO.getUsername()); member = memberService.addMember(memberAddDTO); } else { //校验要添加的会员是否已经是店主 if (Boolean.TRUE.equals(member.getHaveStore())) { throw new ServiceException(ResultCode.STORE_APPLY_DOUBLE_ERROR); } //校验会员的有效性 if (Boolean.FALSE.equals(member.getDisabled())) { throw new ServiceException(ResultCode.USER_STATUS_ERROR); } } //添加店员 clerkAddDTO.setMemberId(member.getId()); clerkAddDTO.setShopkeeper(false); clerkAddDTO.setStoreId(UserContext.getCurrentUser().getStoreId()); this.saveClerk(clerkAddDTO); //修改此会员拥有店铺 List ids = new ArrayList<>(); ids.add(member.getId()); memberService.updateHaveShop(true, UserContext.getCurrentUser().getStoreId(), ids); } catch (ServiceException se) { log.info(se.getMsg(), se); throw se; } catch (Exception e) { log.error("添加店员出错", e); } return ResultUtil.success(); } @Override public Member addClerkReturnMember(ClerkAddDTO clerkAddDTO) { int rolesMaxSize = 10; Member member = null; try { //角色必选,并且最后设置10个 if (clerkAddDTO.getRoles() != null && clerkAddDTO.getRoles().size() >= rolesMaxSize) { throw new ServiceException(ResultCode.PERMISSION_BEYOND_TEN); } //校验是否已经是会员 member = memberService.findByMobile(clerkAddDTO.getMobile()); if (member == null) { //添加会员 MemberAddDTO memberAddDTO = new MemberAddDTO(); memberAddDTO.setMobile(clerkAddDTO.getMobile()); memberAddDTO.setPassword(clerkAddDTO.getPassword()); memberAddDTO.setUsername(clerkAddDTO.getUsername()); member = memberService.addMember(memberAddDTO); } else { //校验要添加的会员是否已经是店主 if (Boolean.TRUE.equals(member.getHaveStore())) { throw new ServiceException(ResultCode.STORE_APPLY_DOUBLE_ERROR); } //校验会员的有效性 if (Boolean.FALSE.equals(member.getDisabled())) { throw new ServiceException(ResultCode.USER_STATUS_ERROR); } } //添加店员 clerkAddDTO.setMemberId(member.getId()); clerkAddDTO.setShopkeeper(false); String storeId = UserContext.getCurrentUser().getStoreId(); // storeId = "1376433565247471616"; //测试用 clerkAddDTO.setStoreId(storeId); this.saveClerk(clerkAddDTO); //修改此会员拥有店铺 List ids = new ArrayList<>(); ids.add(member.getId()); memberService.updateHaveShop(true,storeId, ids); } catch (ServiceException se) { log.info(se.getMsg(), se); throw se; } catch (Exception e) { log.error("添加店员出错", e); } return member; } @Override public IPage clerkForPage(PageVO page, ClerkQueryDTO clerkQueryDTO) { QueryWrapper clerkVOQueryWrapper = new QueryWrapper<>(); clerkVOQueryWrapper.eq("li_clerk.store_id", UserContext.getCurrentUser().getStoreId()); clerkVOQueryWrapper.eq(StringUtils.isNotEmpty(clerkQueryDTO.getDepartmentId()), "li_clerk.department_id", clerkQueryDTO.getDepartmentId()); clerkVOQueryWrapper.like(StringUtils.isNotEmpty(clerkQueryDTO.getClerkName()), "li_clerk.clerk_name", clerkQueryDTO.getClerkName()); clerkVOQueryWrapper.like(StringUtils.isNotEmpty(clerkQueryDTO.getMobile()), "m.mobile", clerkQueryDTO.getMobile()); return this.baseMapper.selectClerkPage(PageUtil.initPage(page), clerkVOQueryWrapper); /*Page clerkPage = page(initPage, initWrapper); if (clerkPage.getRecords().size() > 0) { List roles = storeRoleService.list(new QueryWrapper() .eq("store_id", UserContext.getCurrentUser().getStoreId())); List departments = storeDepartmentService.list(new QueryWrapper() .eq("store_id", UserContext.getCurrentUser().getStoreId())); List memberIds = new ArrayList<>(); clerkPage.getRecords().forEach(clerk -> { memberIds.add(clerk.getMemberId()); }); List members = memberService.list(new QueryWrapper().in("id", memberIds)); List result = new ArrayList<>(); clerkPage.getRecords().forEach(clerk -> { ClerkVO clerkVO = new ClerkVO(clerk); if (!CharSequenceUtil.isEmpty(clerk.getDepartmentId())) { try { clerkVO.setDepartmentTitle( departments.stream().filter (department -> department.getId().equals(clerk.getDepartmentId())) .collect(Collectors.toList()) .get(0) .getTitle() ); } catch (Exception e) { log.error("填充部门信息异常", e); } } clerkVO.setMobile( members.stream().filter (member -> member.getId().equals(clerk.getMemberId())) .collect(Collectors.toList()) .get(0) .getMobile() ); if (!StringUtils.isEmpty(clerk.getRoleIds())) { try { List memberRoles = Arrays.asList(clerk.getRoleIds().split(",")); clerkVO.setRoles( roles.stream().filter (role -> memberRoles.contains(role.getId())) .collect(Collectors.toList()) ); } catch (Exception e) { log.error("填充部门信息异常", e); } } result.add(clerkVO); }); Page pageResult = new Page(clerkPage.getCurrent(), clerkPage.getSize(), clerkPage.getTotal()); pageResult.setRecords(result); return pageResult; } return new Page();*/ } @Override public ClerkVO get(String id) { Clerk clerk = this.getById(id); ClerkVO clerkVO = new ClerkVO(clerk); //手机号码 clerkVO.setMobile(memberService.getById(clerk.getMemberId()).getMobile()); if (!CharSequenceUtil.isEmpty(clerk.getDepartmentId())) { clerkVO.setDepartmentTitle(storeDepartmentService.getById(clerk.getDepartmentId()).getTitle()); } if (!StringUtils.isEmpty(clerk.getRoleIds())) { List memberRoles = Arrays.asList(clerk.getRoleIds().split(",")); List roles = storeRoleService.list(new QueryWrapper() .eq("store_id", UserContext.getCurrentUser().getStoreId())); clerkVO.setRoles( roles.stream().filter (role -> memberRoles.contains(role.getId())) .collect(Collectors.toList()) ); } return clerkVO; } @Override public Clerk updateClerk(ClerkEditDTO clerkEditDTO) { Clerk clerk = this.getById(clerkEditDTO.getId()); if (clerk != null) { //编辑店主限制 if (Boolean.TRUE.equals(clerk.getShopkeeper())) { throw new ServiceException(ResultCode.CANT_EDIT_CLERK_SHOPKEEPER); } String storeId = UserContext.getCurrentUser().getStoreId(); // storeId = "1376433565247471616"; //校验当前店员是否是当前店铺的 if (!clerk.getStoreId().equals(storeId)) { throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); } if (Boolean.TRUE.equals(clerkEditDTO.getIsSuper())) { clerk.setRoleIds(""); } else { //角色赋值 if (!clerkEditDTO.getRoles().isEmpty()) { clerk.setRoleIds(CharSequenceUtil.join(",", clerkEditDTO.getRoles())); //添加店员用户角色 List storeClerkRoleList = new ArrayList<>(); clerkEditDTO.getRoles().forEach(a -> storeClerkRoleList.add(StoreClerkRole.builder().clerkId(clerk.getId()).roleId(a).build())); storeClerkRoleService.saveBatch(storeClerkRoleList); } else { clerk.setRoleIds(""); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(StoreClerkRole::getClerkId, clerk.getId()); storeClerkRoleService.remove(queryWrapper); } } //部门校验 if (CharSequenceUtil.isNotEmpty(clerkEditDTO.getDepartmentId())) { System.out.println(clerkEditDTO.getDepartmentId()); System.out.println(storeDepartmentService.getById(clerkEditDTO.getDepartmentId())); if (storeDepartmentService.getById(clerkEditDTO.getDepartmentId()) != null) { clerk.setDepartmentId(clerkEditDTO.getDepartmentId()); System.out.println(clerk); } else { throw new ServiceException(ResultCode.PERMISSION_NOT_FOUND_ERROR); } } else { clerk.setDepartmentId(""); } cache.vagueDel(CachePrefix.PERMISSION_LIST.getPrefix(UserEnums.STORE) + clerk.getMemberId()); cache.vagueDel(CachePrefix.STORE_USER_MENU.getPrefix() + clerk.getMemberId()); clerk.setIsSuper(clerkEditDTO.getIsSuper()); this.updateById(clerk); return clerk; } throw new ServiceException(ResultCode.CLERK_NOT_FOUND_ERROR); } @Override public Clerk saveClerk(ClerkAddDTO clerkAddDTO) { Clerk clerk = new Clerk(clerkAddDTO); clerk.setShopkeeper(clerkAddDTO.getShopkeeper()); clerk.setIsSuper(clerkAddDTO.getIsSuper()); //校验此会员是否已经是店员 Clerk temp = this.getClerkByMemberId(clerkAddDTO.getMemberId()); //店员信息不为空 if (temp != null && !temp.getStoreId().equals(clerkAddDTO.getStoreId())) { throw new ServiceException(ResultCode.CLERK_USER_ERROR); } if (temp != null) { throw new ServiceException(ResultCode.CLERK_ALREADY_EXIT_ERROR); } //部门校验 if (CharSequenceUtil.isNotEmpty(clerkAddDTO.getDepartmentId()) && storeDepartmentService.getById(clerkAddDTO.getDepartmentId()) == null) { throw new ServiceException(ResultCode.PERMISSION_NOT_FOUND_ERROR); } //角色校验 if (clerkAddDTO.getRoles() != null && !clerkAddDTO.getRoles().isEmpty()) { List storeRoles = storeRoleService.list(clerkAddDTO.getRoles()); System.out.println(storeRoles); if (storeRoles.size() != clerkAddDTO.getRoles().size()) { throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); } } this.save(clerk); //判断用户角色权限不为超级会员且权限路径不为空 if (Boolean.FALSE.equals(clerkAddDTO.getIsSuper()) && clerkAddDTO.getRoles() != null) { //添加店员用户角色 List storeClerkRoleList = new ArrayList<>(); clerkAddDTO.getRoles().forEach(a -> storeClerkRoleList.add(StoreClerkRole.builder().clerkId(clerk.getId()).roleId(a).build())); storeClerkRoleService.saveBatch(storeClerkRoleList); } return clerk; } @Override public Clerk getClerkByMemberId(String memberId) { return this.getOne(new QueryWrapper().eq("member_id", memberId)); } @Override public void resetPassword(List ids) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("store_id", UserContext.getCurrentUser().getStoreId()); queryWrapper.in("id", ids); List clerks = this.baseMapper.selectList(queryWrapper); //校验要重置的店员是否是当前店铺的店员 if (clerks.size() != ids.size()) { throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); } //店员密码就是会员密码所以要组织会员修改密码参数信息 List memberIds = new ArrayList<>(); clerks.forEach(clerk -> { //如果是店主无法重置密码 if (Boolean.TRUE.equals(clerk.getShopkeeper())) { throw new ServiceException(ResultCode.CLERK_SUPPER); } memberIds.add(clerk.getMemberId()); }); memberService.resetPassword(memberIds); } @Override public void deleteClerk(List ids) { QueryWrapper queryWrapper = new QueryWrapper<>(); ; // String storeId = "1376433565247471616"; queryWrapper.eq("store_id", UserContext.getCurrentUser().getId()); queryWrapper.in("id", ids); List clerks = this.baseMapper.selectList(queryWrapper); if (!clerks.isEmpty()) { //校验要重置的店员是否是当前店铺的店员 if (clerks.size() != ids.size()) { throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); } //删除店员 this.removeByIds(ids); //更改会员为为拥有店铺 List memberIds = new ArrayList<>(); clerks.forEach(clerk -> { //无法删除当前登录的店员 System.out.println(UserContext.getCurrentUser()); if (UserContext.getCurrentUser().getClerkId().equals(clerk.getId())) { throw new ServiceException(ResultCode.CLERK_CURRENT_SUPPER); } //无法删除店主 if (Boolean.TRUE.equals(clerk.getShopkeeper())) { throw new ServiceException(ResultCode.CLERK_SUPPER); } memberIds.add(clerk.getMemberId()); }); memberService.updateHaveShop(false, null, memberIds); } } @Override public Member checkClerk(String mobile) { //校验是否已经是会员 Member member = memberService.findByMobile(mobile); if (member != null) { //校验要添加的会员是否已经是店主 if (Boolean.TRUE.equals(member.getHaveStore())) { throw new ServiceException(ResultCode.STORE_APPLY_DOUBLE_ERROR); } //校验会员的有效性 if (Boolean.FALSE.equals(member.getDisabled())) { throw new ServiceException(ResultCode.USER_STATUS_ERROR); } //校验此会员是否已经是店员 Clerk clerk = this.getClerkByMemberId(member.getId()); if (clerk != null && !clerk.getStoreId().equals(UserContext.getCurrentUser().getStoreId())) { throw new ServiceException(ResultCode.CLERK_USER_ERROR); } if (clerk != null && clerk.getStoreId().equals(UserContext.getCurrentUser().getStoreId())) { throw new ServiceException(ResultCode.CLERK_ALREADY_EXIT_ERROR); } return member; } return new Member(); } @Override public Member checkClerk(String memberId, String mobile) { //校验是否已经是会员 Member member = memberService.findByMobile(mobile); System.out.println(member); if (member != null) { // 是当前账号修改 if (memberId !=null && memberId.equals(member.getId())) { return member; } //校验要添加的会员是否已经是店主 if (Boolean.TRUE.equals(member.getHaveStore())) { throw new ServiceException(ResultCode.STORE_APPLY_DOUBLE_ERROR); } //校验会员的有效性 if (Boolean.FALSE.equals(member.getDisabled())) { throw new ServiceException(ResultCode.USER_STATUS_ERROR); } //校验此会员是否已经是店员 Clerk clerk = this.getClerkByMemberId(member.getId()); if (clerk != null && !clerk.getStoreId().equals(UserContext.getCurrentUser().getStoreId())) { throw new ServiceException(ResultCode.CLERK_USER_ERROR); } if (clerk != null && clerk.getStoreId().equals(UserContext.getCurrentUser().getStoreId())) { throw new ServiceException(ResultCode.CLERK_ALREADY_EXIT_ERROR); } return member; } return new Member(); } @Override public void disable(String id, Boolean status) { Clerk clerk = this.getById(id); if (clerk == null) { throw new ServiceException(ResultCode.USER_NOT_EXIST); } //店主无法禁用 if (clerk.getShopkeeper() && clerk.getStatus()) { throw new ServiceException(ResultCode.CLERK_SUPPER); } clerk.setStatus(status); this.updateById(clerk); } }