功能实现:客服辖区管理

目录

项目:

业务逻辑:

需求:

具体实现:


#项目:

背景是一个电商+供应链管理,在已有的管理员模块上新增客服辖区管理功能。

#业务逻辑:

有权限的管理员账号可以给具有客服角色的管理员账号(admin,与已有的admin表相关联)分配辖区(或其他属性,待后期扩展,暂时只有辖区),客服只对该辖区的用户有权限进行查询、处理订单等操作。

#需求:

1.设置客服辖区

2.查询客服辖区

3.删除客服辖区(批量)

#具体实现:

主要是实现设置客服辖区这个需求,由于客服辖区一经设置少有改变,此处设计的逻辑比较简单:每次设置辖区时,就把该账号下原有已存在的辖区记录全部删除,再添加新的记录。辖区细分到市,每一个市一条辖区记录(例如,客服A的辖区为福建省福州市和福建省厦门市,数据库里就分别有两条相关的记录)。

查询所有记录时:将所有的data放进list里,再以客服的admin_id分组,

return出去的是的是的嵌套的list(List<List<AdminAuthorDO>>)。

Map<Long, List<AdminAuthorDO>> listMap = authorList.stream().collect(Collectors.groupingBy(AdminAuthorDO::getAdminId));

        List<List<AdminAuthorDO>> groupList= new ArrayList<>();

        for(List<AdminAuthorDO> list : listMap.values()){

            groupList.add(list);
        }

1.表结构:

CREATE TABLE `es_admin_author` (
  `id` bigint(20) NOT NULL COMMENT 'ID主键',
  `admin_id` bigint(20) DEFAULT NULL COMMENT '管理员id',
  `province_id` bigint(20) DEFAULT NULL COMMENT '省份id',
  `province` varchar(255) DEFAULT NULL COMMENT '省份名称',
  `city_id` bigint(20) DEFAULT NULL COMMENT '城市id',
  `city` varchar(255) DEFAULT NULL COMMENT '城市名称',
  `create_time` datetime DEFAULT NULL COMMENT '生成时间',
  `create_by` varchar(64) DEFAULT NULL COMMENT '创建者',
  `update_by` varchar(64) DEFAULT NULL COMMENT '更新者',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='客服授权辖区分配表';

2.api:

package com.enation.app.javashop.api.manager.system;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.enation.app.javashop.framework.database.WebPage;
import com.enation.app.javashop.framework.exception.ServiceException;
import com.enation.app.javashop.framework.util.oConvertUtils;
import com.enation.app.javashop.model.errorcode.SystemErrorCode;
import com.enation.app.javashop.model.errorcode.TradeErrorCode;
import com.enation.app.javashop.model.system.dos.AdminAuthorDO;

import com.enation.app.javashop.model.system.dto.AdminAuthorEditParam;
import com.enation.app.javashop.model.system.dto.AdminAuthorQueryParam;
import com.enation.app.javashop.service.system.AdminAuthorManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.management.Query;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 客服授权辖区分配管理API
 * @Author keyi
 * @Date 2022/6/13 16:46
 * @Version 1.0
 */

@RestController
@RequestMapping("/admin/systems/admin-author")
public class AdminAuthorManagerController {

    @Autowired
    AdminAuthorManager adminAuthorManager;

    /**
     * 增加客服授权辖区
     * @author keyi
     * @Date 2022/6/13 16:48
     * @param
     * @return
     */
    /*public AdminAuthorDO add(@RequestBody AdminAuthorDO param){

        if (oConvertUtils.isEmpty(param.getAdminId())) {
            throw new ServiceException(SystemErrorCode.E908.code(), "缺少需要配置的客服账号的AdminID");
        }
        if(oConvertUtils.isEmpty(param.getProvince())){
            throw new ServiceException(SystemErrorCode.E908.code(), "缺少省份信息");
        }

        AdminAuthorQueryParam queryParam= new AdminAuthorQueryParam();

        queryParam.setProvince(param.getProvince());
        queryParam.setCity(param.getCity());
        queryParam.setAdminId(param.getAdminId());

        AdminAuthorDO sameOne = this.adminAuthorManager.getSameOne(queryParam);

        if(oConvertUtils.isNotEmpty(sameOne)){

            throw new ServiceException(SystemErrorCode.E908.code(), "已存在相同的辖区配置,请勿重复添加");
        }


        AdminAuthorDO add = this.adminAuthorManager.add(param);
        return add;
    }*/

    /**
     * 设置客服授权辖区
     * @author keyi
     * @Date 2022/6/13 16:48
     * @param
     * @return
     */
    @PostMapping("/edit")
    public List<AdminAuthorDO> edit(@RequestBody AdminAuthorEditParam editParam){

        if (oConvertUtils.isEmpty(editParam.getAdminId())) {
            throw new ServiceException(SystemErrorCode.E908.code(), "缺少需要配置的客服账号的AdminID");
        }
        if(oConvertUtils.listIsEmpty(editParam.getAreaList())){
            throw new ServiceException(SystemErrorCode.E908.code(), "缺少辖区信息");
        }

        List<AdminAuthorDO> editList = this.adminAuthorManager.edit(editParam);

        return editList;
    }
    /**
     * 批量删除客服授权辖区
     * @author keyi
     * @Date 2022/6/13 16:48
     * @param idList 主键数组
     * @return 是否删除成功
     */
    @PostMapping("/remove")
    public Boolean remove(@RequestBody List<Long> idList){

        if(oConvertUtils.listIsNotEmpty(idList)){
            idList.forEach(id->{

                this.adminAuthorManager.remove(id);
            });
        }else {
            throw new ServiceException(SystemErrorCode.E908.code(), "未传入要删除的授权记录主键id");
        }
        return true;
    }

    /**
     * 按条件分页查询客服授权辖区列表
     * @author keyi
     * @Date 2022/6/13 16:48
     * @param param 查询参数
     * @return
     */
    @PostMapping("/query")
    public WebPage<List<List<AdminAuthorDO>>> query(@RequestBody AdminAuthorQueryParam param){
        if(oConvertUtils.isEmpty(param.getPageNo())){
            param.setPageNo(1L);
        }

        if(oConvertUtils.isEmpty(param.getPageSize())){
            param.setPageSize(10L);
        }

        WebPage page= this.adminAuthorManager.selectAdminAuthorPage(new Page(param.getPageNo(), param.getPageSize()), param);

        return page;
    }
}

3.service:

package com.enation.app.javashop.service.system.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.enation.app.javashop.framework.context.user.AdminUserContext;
import com.enation.app.javashop.framework.database.WebPage;
import com.enation.app.javashop.framework.exception.ServiceException;
import com.enation.app.javashop.framework.security.model.Admin;
import com.enation.app.javashop.framework.util.oConvertUtils;
import com.enation.app.javashop.mapper.system.AdminAuthorMapper;
import com.enation.app.javashop.mapper.system.AdminUserMapper;
import com.enation.app.javashop.model.errorcode.SystemErrorCode;
import com.enation.app.javashop.model.system.dos.AdminAuthorDO;
import com.enation.app.javashop.model.system.dos.AdminUser;
import com.enation.app.javashop.model.system.dto.AdminAuthorEditParam;
import com.enation.app.javashop.model.system.dto.AdminAuthorQueryParam;
import com.enation.app.javashop.model.trade.order.vo.OrderLineVO;
import com.enation.app.javashop.service.system.AdminAuthorManager;
import com.enation.app.javashop.service.system.AdminUserManager;
import com.sun.mail.imap.protocol.Item;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @Author keyi
 * @Date 2022/6/13 17:57
 * @Version 1.0
 */

@Service
public class AdminAuthorManagerImpl implements AdminAuthorManager {

    @Autowired
    AdminAuthorMapper adminAuthorMapper;

    @Autowired
    AdminUserManager adminUserManager;

    @Override
    public AdminAuthorDO add(AdminAuthorDO param) {

        AdminUser model = adminUserManager.getModel(param.getAdminId());

        if(oConvertUtils.isEmpty(model)){
            throw new ServiceException(SystemErrorCode.E908.code(), "id为"+param.getAdminId()+"的客服Admin账号不存在");
        }

        Admin admin = AdminUserContext.getAdmin();

        param.setUpdateBy(admin.getUsername());
        param.setCreateTime(new Date());
        param.setCreateBy(admin.getUsername());
        param.setUpdateTime(new Date());

        this.adminAuthorMapper.insert(param);
        return param;
    }

    @Override
    public void remove(Long id) {

        this.adminAuthorMapper.deleteById(id);

    }

    @Override
    public WebPage<List<List<AdminAuthorDO>>> selectAdminAuthorPage(Page page, AdminAuthorQueryParam paramDTO) {

        QueryWrapper<AdminAuthorDO> queryWrapper = new QueryWrapper<>();

        if(oConvertUtils.isNotEmpty(paramDTO.getAdminId())){
            queryWrapper.eq("admin_id",paramDTO.getAdminId());
        }

        if(oConvertUtils.isNotEmpty(paramDTO.getProvince())){
            queryWrapper.eq("province",paramDTO.getProvince());
        }

        if(oConvertUtils.isNotEmpty(paramDTO.getUsername())){
            queryWrapper.eq("username",paramDTO.getUsername());
        }

        if(oConvertUtils.isNotEmpty(paramDTO.getRealName())){
            queryWrapper.eq("real_name",paramDTO.getRealName());
        }

        IPage<AdminAuthorDO> iPage = this.adminAuthorMapper.selectPage(page, queryWrapper);

        List<AdminAuthorDO> authorList=iPage.getRecords();

        Map<Long, List<AdminAuthorDO>> listMap = authorList.stream().collect(Collectors.groupingBy(AdminAuthorDO::getAdminId));

        List<List<AdminAuthorDO>> groupList= new ArrayList<>();

        for(List<AdminAuthorDO> list : listMap.values()){

            groupList.add(list);
        }


        // 生成新的Page
        WebPage<List<List<AdminAuthorDO>>> webPage =
                new WebPage(paramDTO.getPageNo(), iPage.getTotal(), paramDTO.getPageSize(), groupList);

        return webPage;
    }

    @Override
    public AdminAuthorDO getSameOne(AdminAuthorQueryParam param) {

        QueryWrapper<AdminAuthorDO> queryWrapper = new QueryWrapper<>();

        queryWrapper.eq("admin_id",param.getAdminId());
        queryWrapper.eq("province",param.getProvince());
        queryWrapper.eq("city",param.getCity());

        // TODO: 2022/6/14 后面如果增加品类的限制 这里可能需要修改逻辑 selectOne如果符合条件的不止一个 就会报错
        AdminAuthorDO authorDO = this.adminAuthorMapper.selectOne(queryWrapper);

        return authorDO;
    }

    /**
     * 设置客服授权辖区
     */
    @Override
    public List<AdminAuthorDO> edit(AdminAuthorEditParam editParam) {

        //先删掉该客服原有的配置
        QueryWrapper<AdminAuthorDO> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("admin_id",editParam.getAdminId());
        List<AdminAuthorDO> authorDOList = this.adminAuthorMapper.selectList(queryWrapper);
        if(oConvertUtils.listIsNotEmpty(authorDOList)){
            authorDOList.forEach(item->{
                this.adminAuthorMapper.deleteById(item.getId());
            });
        }
        //添加新配置
        List<AdminAuthorDO> list = new ArrayList<>();
        editParam.getAreaList().forEach(item->{
            AdminAuthorDO adminAuthor = new AdminAuthorDO();
            adminAuthor.setAdminId(editParam.getAdminId());
            adminAuthor.setCity(item.getCity());
            adminAuthor.setProvince(item.getProvince());
            adminAuthor.setCityId(item.getCityId());
            adminAuthor.setProvinceId(item.getProvinceId());
            adminAuthor.setRealName(editParam.getRealName());
            adminAuthor.setUsername(editParam.getRealName());

            Admin admin = AdminUserContext.getAdmin();
            adminAuthor.setUpdateBy(admin.getUsername());
            adminAuthor.setCreateTime(new Date());
            adminAuthor.setCreateBy(admin.getUsername());
            adminAuthor.setUpdateTime(new Date());

            this.adminAuthorMapper.insert(adminAuthor);
            list.add(adminAuthor);
        });
        return list;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值