MrShi
2024-11-01 deb4575b72443cf906946a9fb28a557c16556fb9
Merge branch '2.0.1' of http://139.186.142.91:10010/r/productDev/yunyibao into 2.0.1
已添加1个文件
已修改15个文件
603 ■■■■■ 文件已修改
server/service/src/main/java/com/doumee/config/shiro/ShiroRealm.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/core/model/LoginUserInfo.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/core/utils/Constants.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/business/CompanyDepartmentMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/business/model/CompanyDepartment.java 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/system/SystemDataPermissionMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/system/model/SystemDataPermission.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/system/model/SystemUser.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/system/vo/DepartmentTree.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/CompanyDepartmentService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/impl/CompanyDepartmentServiceImpl.java 216 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/third/EmailService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/system/SystemDataPermissionService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/system/impl/SystemDataPermissionServiceImpl.java 145 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/resources/mappers/SystemDataPermissionMapper.xml 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/config/shiro/ShiroRealm.java
@@ -6,6 +6,7 @@
import com.doumee.core.utils.Constants;
import com.doumee.dao.business.model.Company;
import com.doumee.dao.business.model.CompanyPermission;
import com.doumee.dao.system.model.SystemDataPermission;
import com.doumee.dao.system.model.SystemPermission;
import com.doumee.dao.system.model.SystemRole;
import com.doumee.dao.system.model.SystemUser;
@@ -140,6 +141,12 @@
                permissions =  systemPermissionService.findByUserId(user.getId());
            }
        }
        SystemRole rt = new SystemRole();
        rt.setDeleted(Boolean.FALSE);
        //数据部门权限集合
        user.setDepartIdList(systemDataPermissionService.selectHighRole(new SystemDataPermission(),rt,user));
        LoginUserInfo userInfo = LoginUserInfo.from(user, roles, permissions);
        // éªŒè¯ç”¨æˆ·
        return new SimpleAuthenticationInfo(userInfo, user.getPassword(), this.getName());
server/service/src/main/java/com/doumee/core/model/LoginUserInfo.java
@@ -46,6 +46,7 @@
    private List<String> permissions;
    private List<Integer> companyIdList;
    private List<Integer> departIdList;
    public static LoginUserInfo from(SystemUser user, List<SystemRole> roles, List<SystemPermission> permissions ) {
        if (user == null) {
server/service/src/main/java/com/doumee/core/utils/Constants.java
@@ -122,6 +122,14 @@
        }
    }
    public interface DATAPERMISSION_TYPE{
        public static final  int all = 0;
        public static final  int departAndChild = 1;
        public static final  int departAndLeaf = 2;
        public static final  int depart = 3;
        public static final  int custom = 4;
        public static final  int self = -1;
    }
    /**
     * èŽ·å–æ‰¹æ”¹å•æ—¶é—´æ ‡é¢˜åˆ—
server/service/src/main/java/com/doumee/dao/business/CompanyDepartmentMapper.java
@@ -2,11 +2,12 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.business.model.CompanyDepartment;
import com.github.yulichang.base.MPJBaseMapper;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2024/10/28 19:16
 */
public interface CompanyDepartmentMapper extends BaseMapper<CompanyDepartment> {
public interface CompanyDepartmentMapper extends MPJBaseMapper<CompanyDepartment> {
}
server/service/src/main/java/com/doumee/dao/business/model/CompanyDepartment.java
@@ -1,5 +1,6 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -9,6 +10,7 @@
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
import java.util.List;
/**
 * ä¼ä¸šä¿¡æ¯è¡¨
@@ -16,7 +18,7 @@
 * @date 2024/10/28 19:16
 */
@Data
@ApiModel("企业信息表")
@ApiModel("组织信息表")
@TableName("`company_department`")
public class CompanyDepartment {
@@ -67,8 +69,8 @@
    @ExcelColumn(name="图标")
    private String imgurl;
    @ApiModelProperty(value = "类型 0劳务公司 1内部组织", example = "1")
    @ExcelColumn(name="类型 0劳务公司 1内部组织")
    @ApiModelProperty(value = "类型 0平台组织 1企业组织 2商户组织", example = "1")
    @ExcelColumn(name="类型 0平台组织 1企业组织 2商户组织")
    private Integer type;
    @ApiModelProperty(value = "企业代码", example = "1")
@@ -77,7 +79,7 @@
    @ApiModelProperty(value = "上级组织编码(自关联)")
    @ExcelColumn(name="上级组织编码(自关联)")
    private String parentId;
    private Integer parentId;
    @ApiModelProperty(value = "联系人姓名")
    @ExcelColumn(name="联系人姓名")
@@ -101,6 +103,26 @@
    @ApiModelProperty(value = "所属企业编码")
    @ExcelColumn(name="所属企业编码")
    private String companyId;
    private Integer companyId;
    @TableField(exist = false)
    private List<CompanyDepartment> childList;
    @ApiModelProperty(value = "负责人名字")
    @TableField(exist = false)
    private String headName;
    @ApiModelProperty(value = "操作人名字")
    @TableField(exist = false)
    private String editorName;
    @ApiModelProperty(value = "负责人手机号")
    @TableField(exist = false)
    private String headPhone;
    @ApiModelProperty(value = "父级部门级别路径", example = "1")
    @TableField(exist = false)
    private String parentCompanyPath;
    @ApiModelProperty(value = "父级部门名称", example = "1")
    @TableField(exist = false)
    private String parentName;
    @ApiModelProperty(value = "父级部门级别类型 0相关方 1内部组织", example = "1")
    @TableField(exist = false)
    private String parentType;
}
server/service/src/main/java/com/doumee/dao/system/SystemDataPermissionMapper.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.system.model.SystemDataPermission;
import com.doumee.dao.system.model.SystemRole;
import com.doumee.dao.system.vo.SystemDataPermissionListVO;
import org.apache.ibatis.annotations.Param;
@@ -21,4 +22,7 @@
     * @return List<SystemDataPermissionListVO>
     */
    List<SystemDataPermissionListVO> selectManageList(@Param("dto") SystemDataPermission dto, @Param("orderByClause") String orderByClause);
    List<SystemDataPermissionListVO> selectUserList(@Param("dto") SystemDataPermission dto, @Param("role") SystemRole role, @Param("userId") Integer userId);
}
server/service/src/main/java/com/doumee/dao/system/model/SystemDataPermission.java
@@ -38,7 +38,7 @@
    @ApiModelProperty(value = "权限类型(0全部,1自定义,2仅用户所属,3用户所属及其子数据)", example = "1")
    @NotNull(message = "权限类型不能为空", groups = {OperaType.Create.class, OperaType.Update.class})
    private Short type;
    private Integer type;
    @ApiModelProperty(value = "自定义数据")
    private String customData;
server/service/src/main/java/com/doumee/dao/system/model/SystemUser.java
@@ -4,6 +4,7 @@
import com.baomidou.mybatisplus.annotation.TableName;
import com.doumee.core.constants.OperaType;
import com.doumee.dao.business.model.Company;
import com.doumee.dao.business.model.CompanyDepartment;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
@@ -67,6 +68,8 @@
    @ApiModelProperty(value = "企业编码")
    private Integer companyId;
    @ApiModelProperty(value = "组织编码")
    private Integer departmentId;
    @ApiModelProperty(value = "类型 0平台用户 1企业用户 2商户用户")
    private Integer type;
@@ -105,9 +108,15 @@
    @ApiModelProperty(value = "所属企业信息对")
    @TableField(exist = false)
    private Company company;
    @ApiModelProperty(value = "所属组织对象")
    @TableField(exist = false)
    private CompanyDepartment department;
    @ApiModelProperty(value = "权限内企业编码集合")
    @ApiModelProperty(value = "平台管理员权限内企业编码集合")
    @TableField(exist = false)
    private List<Integer> companyIdList;
    @ApiModelProperty(value = "数据权限内组织编码集合")
    @TableField(exist = false)
    private List<Integer> departIdList;
}
server/service/src/main/java/com/doumee/dao/system/vo/DepartmentTree.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,103 @@
package com.doumee.dao.system.vo;
import com.doumee.core.utils.Constants;
import com.doumee.dao.business.model.Company;
import com.doumee.dao.business.model.CompanyDepartment;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/7/13 10:40
 */
public class DepartmentTree {
    // ä¿å­˜å‚与构建树形的所有数据(通常数据库查询结果)
    public List<CompanyDepartment> nodeList = new ArrayList<>();
    public Integer origin = 0;
    /**
     *  æž„造方法
     *  @param nodeList å°†æ•°æ®é›†åˆèµ‹å€¼ç»™nodeList,即所有数据作为所有节点。
     */
    public DepartmentTree(List<CompanyDepartment> nodeList ){
        this.nodeList = nodeList;
    }
    /**
     *   èŽ·å–éœ€æž„å»ºçš„æ‰€æœ‰æ ¹èŠ‚ç‚¹ï¼ˆé¡¶çº§èŠ‚ç‚¹ï¼‰ "0"
     *   @return æ‰€æœ‰æ ¹èŠ‚ç‚¹List集合
     */
    public List<CompanyDepartment> getRootNode(){
        // ä¿å­˜æ‰€æœ‰æ ¹èŠ‚ç‚¹ï¼ˆæ‰€æœ‰æ ¹èŠ‚ç‚¹çš„æ•°æ®ï¼‰
        List<CompanyDepartment> rootNodeList = new ArrayList<>();
        // treeNode:查询出的每一条数据(节点)
        for (CompanyDepartment treeNode : nodeList){
            // åˆ¤æ–­å½“前节点是否为根节点,此处注意:若parentId类型是String,则要采用equals()方法判断。
            if (Objects.isNull(treeNode.getParentId()) || !notExistParentId(treeNode.getParentId())) {
                // æ˜¯ï¼Œæ·»åŠ 
                rootNodeList.add(treeNode);
            }
        }
        return rootNodeList;
    }
    private boolean notExistParentId(Integer parentId) {
        for (CompanyDepartment treeNode : nodeList){
            if (Constants.equalsInteger(parentId,treeNode.getId())) {
                // æ˜¯
                return true;
            }
        }
        return false;
    }
    /**
     *  æ ¹æ®æ¯ä¸€ä¸ªé¡¶çº§èŠ‚ç‚¹ï¼ˆæ ¹èŠ‚ç‚¹ï¼‰è¿›è¡Œæž„å»ºæ ‘å½¢ç»“æž„
     *  @return  æž„建整棵树
     */
    public List<CompanyDepartment> buildTree(){
        // treeNodes:保存一个顶级节点所构建出来的完整树形
        List<CompanyDepartment> treeNodes = new ArrayList<CompanyDepartment>();
        // getRootNode():获取所有的根节点
        for (CompanyDepartment treeRootNode : getRootNode()) {
            // å°†é¡¶çº§èŠ‚ç‚¹è¿›è¡Œæž„å»ºå­æ ‘
            treeRootNode = buildChildTree(treeRootNode);
            // å®Œæˆä¸€ä¸ªé¡¶çº§èŠ‚ç‚¹æ‰€æž„å»ºçš„æ ‘å½¢ï¼Œå¢žåŠ è¿›æ¥
            treeNodes.add(treeRootNode);
        }
        return treeNodes;
    }
    /**
     *  é€’å½’-----构建子树形结构
     *  @param  pNode æ ¹èŠ‚ç‚¹ï¼ˆé¡¶çº§èŠ‚ç‚¹ï¼‰
     *  @return æ•´æ£µæ ‘
     */
    public CompanyDepartment buildChildTree(CompanyDepartment pNode){
        List<CompanyDepartment> childTree = new ArrayList<CompanyDepartment>();
        // nodeList:所有节点集合(所有数据)
        for (CompanyDepartment treeNode : nodeList) {
            // åˆ¤æ–­å½“前节点的父节点ID是否等于根节点的ID,即当前节点为其下的子节点
                if (!Objects.isNull(treeNode.getParentId())&&treeNode.getParentId().equals(pNode.getId())) {
                    // å†é€’归进行判断当前节点的情况,调用自身方法
                    childTree.add(buildChildTree(treeNode));
                }
        }
        // for循环结束,即节点下没有任何节点,树形构建结束,设置树结果
        pNode.setChildList(childTree);
        return pNode;
    }
}
server/service/src/main/java/com/doumee/service/business/CompanyDepartmentService.java
@@ -19,7 +19,7 @@
     * @return Integer
     */
    Integer create(CompanyDepartment companyDepartment);
    List<CompanyDepartment> departTree(Integer type);
    /**
     * ä¸»é”®åˆ é™¤
     *
server/service/src/main/java/com/doumee/service/business/impl/CompanyDepartmentServiceImpl.java
@@ -1,20 +1,35 @@
package com.doumee.service.business.impl;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.CompanyDepartmentMapper;
import com.doumee.dao.business.model.Company;
import com.doumee.dao.business.model.CompanyDepartment;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.system.SystemUserMapper;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.dao.system.vo.DepartmentTree;
import com.doumee.service.business.CompanyDepartmentService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.Date;
import java.util.List;
import java.util.UUID;
/**
 * ä¼ä¸šä¿¡æ¯è¡¨Service实现
@@ -26,22 +41,161 @@
    @Autowired
    private CompanyDepartmentMapper companyDepartmentMapper;
    @Autowired
    private SystemUserMapper systemUserMapper;
    @Override
    public Integer create(CompanyDepartment companyDepartment) {
        companyDepartmentMapper.insert(companyDepartment);
        return companyDepartment.getId();
    public  List<CompanyDepartment> departTree(Integer type){
        MPJLambdaWrapper<CompanyDepartment> queryWrapper = new MPJLambdaWrapper<>();
        queryWrapper.selectAll(Company.class);
        queryWrapper.select("t2.realname",CompanyDepartment::getEditorName);
        queryWrapper.select("t2.realname",CompanyDepartment::getHeadName);
        queryWrapper.select("t2.mobile",CompanyDepartment::getHeadPhone);
        queryWrapper.select("t1.name",CompanyDepartment::getParentName);
        queryWrapper.select("t1.name_path",CompanyDepartment::getParentCompanyPath);
        queryWrapper.select("t1.type",CompanyDepartment::getParentType);
        queryWrapper.leftJoin(CompanyDepartment.class,CompanyDepartment::getId,CompanyDepartment::getParentId);
        queryWrapper.leftJoin(SystemUser.class,SystemUser::getId,CompanyDepartment::getHeadId);
        queryWrapper.leftJoin(SystemUser.class,SystemUser::getId,CompanyDepartment::getEditor);
        queryWrapper.eq(CompanyDepartment::getIsdeleted,Constants.ZERO);
        queryWrapper.eq(type!=null,CompanyDepartment::getType,type);
        queryWrapper.orderByAsc(true,"t.sortnum");
        List<CompanyDepartment> companyList = companyDepartmentMapper.selectJoinList(CompanyDepartment.class,queryWrapper);
        DepartmentTree treeBuild = new DepartmentTree(companyList);
        companyList = treeBuild.buildTree();
        return companyList;
    }
    @Override
    public Integer create(CompanyDepartment company) {
        LoginUserInfo user = (LoginUserInfo)SecurityUtils.getSubject().getPrincipal();
        if(StringUtils.isBlank(company.getName())){
            throw  new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        if(company.getType()==null || !(company.getType() ==0 || company.getType() ==1)){
            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "对不起,组织类型不正确,请按要求填写~");
        }
        int type = Constants.ZERO;//默认平台组织
        if(Constants.equalsInteger(user.getType(),Constants.UserType.COMPANY.getKey())){
            //如果企业用户
            type  = Constants.ONE;
        }else if(Constants.equalsInteger(user.getType(),Constants.UserType.ZHUBO.getKey())){
            //如果是商户
            type  = Constants.TWO;
        }
        //查询名称不能重复
        if(companyDepartmentMapper.selectCount(new QueryWrapper<CompanyDepartment>().lambda()
                .eq(CompanyDepartment::getName,company.getName())
                .eq(CompanyDepartment::getType,type)
                .eq(CompanyDepartment::getIsdeleted, Constants.ZERO)) >0){
            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "对不起,组织名称不能重复~");
        }
        company.setCompanyId(user.getCompanyId());//所属企业编码
        company.setIdPath(company.getId()+"/");//名称路径
        company.setNamePath(company.getName());//名称路径
        String idPath = "";
        if(company.getParentId() !=null){
            CompanyDepartment parent = findById(company.getParentId());
            if(parent == null || Constants.equalsInteger(parent.getIsdeleted(),Constants.ONE)
                    || !Constants.equalsInteger(parent.getType(),type)){
                throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "对不起,父级组织信息不存在~");
            }
            idPath = parent.getIdPath();
            company.setIdPath(parent.getIdPath()+company.getId()+"/");
            company.setNamePath(parent.getNamePath()+"/"+company.getName());
        }
        company.setCreateDate(new Date());
        company.setCreator(user.getId());
        company.setIsdeleted(Constants.ZERO);
        company.setStatus(Constants.ZERO);
        company.setSortnum(0);//默认最上面
        company.setEditDate(company.getCreateDate());
        company.setEditor(company.getCreator());
        companyDepartmentMapper.insert(company);
        //下发海康安防平台
        CompanyDepartment com = new CompanyDepartment();
        com.setId(company.getId());
        com.setIdPath(idPath+company.getId()+"/");
        companyDepartmentMapper.updateById(com);
        return company.getId();
    }
    @Override
    public void deleteById(Integer id) {
        companyDepartmentMapper.deleteById(id);
        LoginUserInfo user = (LoginUserInfo)SecurityUtils.getSubject().getPrincipal();
        int type = Constants.ZERO;//默认平台组织
        if(Constants.equalsInteger(user.getType(),Constants.UserType.COMPANY.getKey())){
            //如果企业用户
            type  = Constants.ONE;
        }else if(Constants.equalsInteger(user.getType(),Constants.UserType.ZHUBO.getKey())){
            //如果是商户
            type  = Constants.TWO;
        }
        CompanyDepartment model = findById(id);
        if(model == null || Constants.equalsInteger(model.getIsdeleted(),Constants.ONE)
                || !Constants.equalsInteger(model.getType(),type)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,该组织信息不存在!");
        }
        if(companyDepartmentMapper.selectCount(new QueryWrapper<CompanyDepartment>().lambda()
                .eq(CompanyDepartment::getParentId,id)
                .eq(CompanyDepartment::getType,type)
                .eq(CompanyDepartment::getIsdeleted, Constants.ZERO)) >0){
            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "对不起,该组织存在下级组织,无法进行该操作!");
        }
        if(systemUserMapper.selectCount(new QueryWrapper<SystemUser>().lambda()
                .eq(SystemUser::getDepartmentId,id)
                .eq(SystemUser::getType,type)
                .eq(SystemUser::getDeleted, Boolean.FALSE)) >0){
            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "对不起,该组织下存在用户信息,无法进行该操作!");
        }
        companyDepartmentMapper.update(null, new UpdateWrapper<CompanyDepartment>().lambda()
                .eq(CompanyDepartment::getId,id)
                .set(CompanyDepartment::getIsdeleted,Constants.ONE)
                .set(CompanyDepartment::getEditor,user.getId())
                .set(CompanyDepartment::getEditDate,new Date())
        );
    }
    @Override
    public void delete(CompanyDepartment companyDepartment) {
        UpdateWrapper<CompanyDepartment> deleteWrapper = new UpdateWrapper<>(companyDepartment);
        companyDepartmentMapper.delete(deleteWrapper);
        LoginUserInfo user = (LoginUserInfo)SecurityUtils.getSubject().getPrincipal();
        int type = Constants.ZERO;//默认平台组织
        if(Constants.equalsInteger(user.getType(),Constants.UserType.COMPANY.getKey())){
            //如果企业用户
            type  = Constants.ONE;
        }else if(Constants.equalsInteger(user.getType(),Constants.UserType.ZHUBO.getKey())){
            //如果是商户
            type  = Constants.TWO;
        }
        CompanyDepartment model = findById(companyDepartment.getId());
        if(model == null || Constants.equalsInteger(model.getIsdeleted(),Constants.ONE)
                || !Constants.equalsInteger(model.getType(),type)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,该组织信息不存在!");
        }
        if(companyDepartmentMapper.selectCount(new QueryWrapper<CompanyDepartment>().lambda()
                .eq(CompanyDepartment::getParentId,companyDepartment.getId())
                .eq(CompanyDepartment::getType,type)
                .eq(CompanyDepartment::getIsdeleted, Constants.ZERO)) >0){
            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "对不起,该组织存在下级组织,无法进行该操作!");
        }
        if(systemUserMapper.selectCount(new QueryWrapper<SystemUser>().lambda()
                .eq(SystemUser::getDepartmentId,companyDepartment.getId())
                .eq(SystemUser::getType,type)
                .eq(SystemUser::getDeleted, Boolean.FALSE)) >0){
            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "对不起,该组织下存在用户信息,无法进行该操作!");
        }
        companyDepartmentMapper.update(null, new UpdateWrapper<CompanyDepartment>().lambda()
                .eq(CompanyDepartment::getId,companyDepartment.getId())
                .set(CompanyDepartment::getIsdeleted,Constants.ONE)
                .set(CompanyDepartment::getEditor,user.getId())
                .set(CompanyDepartment::getEditDate,new Date())
        );
    }
    @Override
@@ -49,12 +203,54 @@
        if (CollectionUtils.isEmpty(ids)) {
            return;
        }
        companyDepartmentMapper.deleteBatchIds(ids);
        for(Integer id :ids){
            deleteById(id);
        }
    }
    @Override
    public void updateById(CompanyDepartment companyDepartment) {
        companyDepartmentMapper.updateById(companyDepartment);
    public void updateById(CompanyDepartment company) {
        if(company.getId() == null|| StringUtils.isBlank(company.getName())){
            throw  new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        if(company.getType()!=null && !(company.getType() ==0 || company.getType() ==1)){
            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "对不起,组织类型不正确,请按要求填写~");
        }
        LoginUserInfo user = (LoginUserInfo)SecurityUtils.getSubject().getPrincipal();
        int type = Constants.ZERO;//默认平台组织
        if(Constants.equalsInteger(user.getType(),Constants.UserType.COMPANY.getKey())){
            //如果企业用户
            type  = Constants.ONE;
        }else if(Constants.equalsInteger(user.getType(),Constants.UserType.ZHUBO.getKey())){
            //如果是商户
            type  = Constants.TWO;
        }
        CompanyDepartment  model = findById(company.getId());
        if(model == null || Constants.equalsInteger(model.getIsdeleted(),Constants.ONE)
                || !Constants.equalsInteger(model.getType(),type)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,该组织信息不存在!");
        }
        //查询名称不能重复
        if(companyDepartmentMapper.selectCount(new QueryWrapper<CompanyDepartment>().lambda()
                .eq(CompanyDepartment::getName,company.getName())
                .eq(CompanyDepartment::getType,type)
                .ne(CompanyDepartment::getId,company.getId())
                .eq(CompanyDepartment::getIsdeleted,Constants.ZERO)) >0){
            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "对不起,组织名称不能重复~");
        }
        company.setEditDate(new Date());
        company.setEditor(user.getId());
        company.setParentId(null);//不支持修改父级
        companyDepartmentMapper.updateById(company);
        //更新的companyPath
        String newName = model.getNamePath().replace(model.getName(),company.getName());
        companyDepartmentMapper.update(null,new UpdateWrapper<CompanyDepartment>().lambda()
                .setSql("company_name_path=REPLACE(name_path,'"+ model.getNamePath()+"','"+newName+"')")
                .likeRight(CompanyDepartment::getIdPath,model.getIdPath()));
    }
    @Override
server/service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java
@@ -28,6 +28,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Indexed;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
@@ -53,6 +54,8 @@
    private boolean debugModel;
    @Autowired
    private CompanyMapper companyMapper;
    @Autowired
    private CompanyDepartmentMapper companyDepartmentMapper;
    @Autowired
    private SystemUserMapper systemUserMapper;
    @Autowired
@@ -93,14 +96,37 @@
        companyMapper.insert(company);
        company.setEditDate(company.getCreateDate());
        company.setEditor(user.getId());
        //新建默认组织
        CompanyDepartment department = createDefaultDepart(company);
        //处理登陆账号信息
        dealSystemUserData(company);
        SystemUser sysuser = dealSystemUserData(company,department.getId());
        //处理附件信息
        dealFileData(company);
        //处理关联方案
        dealSolutionsData(company);
        return company;
    }
    private CompanyDepartment createDefaultDepart(Company company) {
        CompanyDepartment depart = new CompanyDepartment();
        depart.setCompanyId(company.getId());
        depart.setCreator(company.getCreator());
        depart.setCreateDate(company.getCreateDate());
        depart.setType(Constants.equalsInteger(company.getType(),Constants.ZERO)?Constants.ONE:Constants.TWO);
        depart.setName(company.getName());
        depart.setIsdeleted(Constants.ZERO);
        depart.setNamePath(company.getName());
        depart.setStatus(Constants.ZERO);
        depart.setRemark("默认根组织");
        companyDepartmentMapper.insert(depart);
        depart.setIdPath(company.getId()+"/");
        companyDepartmentMapper.updateById(depart);//更新路径
        return depart;
    }
    @Override
    @Transactional
    public Company createShop(Company company) {
@@ -122,14 +148,17 @@
        company.setSignStatus(Constants.ZERO);
        company.setSignIdStatus(Constants.ZERO);
        companyMapper.insert(company);
        company.setEditDate(company.getCreateDate());
        company.setEditor(user.getId());
        //处理登陆账号信息
        dealSystemUserData(company);
        dealSystemUserData(company,createDefaultDepart(company).getId());
        //处理附件信息
        dealFileData(company);
        return company;
    }
    @Override
    @Transactional
    public void  updateSolutions(Company company) {
@@ -190,7 +219,7 @@
        }
    }
    private void dealSystemUserData(Company company) {
    private SystemUser dealSystemUserData(Company company, Integer departId) {
        if(systemUserMapper.selectCount(new QueryWrapper<SystemUser>().lambda()
                .eq(SystemUser::getDeleted,Boolean.TRUE)
                .eq(SystemUser::getUsername,company.getUsername()))>0){
@@ -216,9 +245,11 @@
        user.setRealname(company.getLegalName());
        user.setMobile(company.getPhone());
        user.setCreateUser(company.getCreator());
        user.setDepartmentId(departId);
        user.setCreateTime(company.getCreateDate());
        user.setStatus(Constants.ZERO);
        systemUserMapper.insert(user);
        return user;
    }
    private void dealSystemUserDataForUpdate (Company company,String oldUserName) {
        if(systemUserMapper.selectCount(new QueryWrapper<SystemUser>().lambda()
server/service/src/main/java/com/doumee/service/business/third/EmailService.java
@@ -30,6 +30,7 @@
                helper.setTo(toEmail);
                helper.setFrom(fromEmail);
                helper.setSubject(title);
                helper.setText(content);
                if(fileList!=null){
server/service/src/main/java/com/doumee/service/system/SystemDataPermissionService.java
@@ -3,6 +3,8 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.system.model.SystemDataPermission;
import com.doumee.dao.system.model.SystemRole;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.dao.system.vo.SystemDataPermissionListVO;
import java.util.List;
@@ -105,4 +107,6 @@
     * @return long
     */
    long count(SystemDataPermission systemDataPermission);
    List<Integer> selectHighRole(SystemDataPermission systemDataPermission, SystemRole rt, SystemUser user);
}
server/service/src/main/java/com/doumee/service/system/impl/SystemDataPermissionServiceImpl.java
@@ -5,21 +5,29 @@
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.dao.business.CompanyDepartmentMapper;
import com.doumee.dao.business.model.Company;
import com.doumee.dao.business.model.CompanyDepartment;
import com.doumee.dao.system.SystemDataPermissionMapper;
import com.doumee.dao.system.SystemRoleMapper;
import com.doumee.dao.system.model.SystemDataPermission;
import com.doumee.dao.system.model.SystemRole;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.dao.system.vo.SystemDataPermissionListVO;
import com.doumee.service.system.SystemDataPermissionService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
/**
 * æ•°æ®æƒé™é…ç½®Service实现
@@ -31,6 +39,8 @@
    @Autowired
    private SystemDataPermissionMapper systemDataPermissionMapper;
    @Autowired
    private CompanyDepartmentMapper companyDepartmentMapper;
    @Autowired
    private SystemRoleMapper systemRoleMapper;
@@ -132,4 +142,139 @@
        Wrapper<SystemDataPermission> wrapper = new QueryWrapper<>(systemDataPermission);
        return systemDataPermissionMapper.selectCount(wrapper);
    }
    @Override
    public List<Integer> selectHighRole(SystemDataPermission model, SystemRole role, SystemUser user) {
        List<SystemDataPermissionListVO>list =   systemDataPermissionMapper.selectUserList(model,role,user.getId()) ;
        if(list !=null){
            boolean all = false;
            boolean departAndChild=false;
            boolean depart=false;
            boolean departAndLeaf=false;
            boolean custom=false;
            String c = "";
            for(SystemDataPermissionListVO d : list){
                if(!all && Constants.equalsInteger(d.getType(),Constants.DATAPERMISSION_TYPE.all)){
                    all =true;
                }
                if(!depart && Constants.equalsInteger(d.getType(),Constants.DATAPERMISSION_TYPE.depart)){
                    depart =true;
                }
                if(!departAndChild && Constants.equalsInteger(d.getType(),Constants.DATAPERMISSION_TYPE.departAndChild)){
                    departAndChild =true;
                }
                if(!departAndLeaf && Constants.equalsInteger(d.getType(),Constants.DATAPERMISSION_TYPE.departAndLeaf)){
                    departAndLeaf =true;
                }
                if(  Constants.equalsInteger(d.getType(),Constants.DATAPERMISSION_TYPE.custom)){
                    custom =true;
                    c += StringUtils.defaultString(d.getCustomData(),"");
                }
            }
            CompanyDepartment department = new CompanyDepartment();
            department.setId(user.getDepartmentId());
            department.setType(Constants.THREE);
            if(Constants.equalsInteger(user.getType(),Constants.UserType.COMPANY.getKey())){
                department.setType(Constants.ONE);
            }else if(Constants.equalsInteger(user.getType(),Constants.UserType.ZHUBO.getKey())){
                department.setType(Constants.TWO);
            }else if(Constants.equalsInteger(user.getType(),Constants.UserType.SYSTEM.getKey())){
                department.setType(Constants.THREE);
            }
            if(all){
                return  null;
            }else{
                List<Integer> dList = new ArrayList<>();
                dList.add(-1);//虚拟部门,排查空集合
                if(custom) {
                    //如果有自定义部门
                    String[] idStrs = c.split(",");
                    for(String s :idStrs){
                        try {
                            Integer si = Integer.parseInt(s);
                            if(!isExists(si,dList)){
                                dList.add(si);
                            }
                        }catch (Exception e){
                        }
                    }
                }
                if(departAndLeaf){
                    if(department!= null){
                        dList.addAll(userDataPermissonList(department,true));
                    }
                }else if(departAndChild){
                    if(department!= null) {
                        dList.addAll(userDataPermissonList(department, false));
                    }
                }else if(depart){
                    if(department!= null && !isExists(department.getId(), dList)){
                        dList.add(department.getId());
                    }
                }
                return  dList;
            }
        }
        return new ArrayList<>();
    }
    public List<Integer> userDataPermissonList(CompanyDepartment depart ,boolean isleaf) {
        List<Integer> pool = new ArrayList<>();
        List<CompanyDepartment> departList = companyDepartmentMapper.selectList(new QueryWrapper<CompanyDepartment>().lambda()
                .eq(CompanyDepartment::getIsdeleted,Constants.ZERO )
                .eq(CompanyDepartment::getType,depart.getType())
        );
        pool.add(depart.getId());
        this.fillDepartChildren(pool, Arrays.asList(depart.getId()),isleaf,departList);
        return pool;
    }
    private void fillDepartChildren(List<Integer> pool, List<Integer> asList, boolean isleaf, List<CompanyDepartment> departList) {
        List<CompanyDepartment> departments = getDepartListByParentIds(asList,departList);
        List<Integer> ids = departments.stream().map(CompanyDepartment::getId).collect(Collectors.toList());
        if(isleaf){
            if (ids.size() > 0) {
                pool.addAll(ids);
                this.fillDepartChildren(pool, ids,isleaf,departList);
            }
        }else{
            pool.addAll(ids);
        }
    }
    private List<CompanyDepartment> getDepartListByParentIds(List<Integer> asList, List<CompanyDepartment> departList) {
        List<CompanyDepartment> list = new ArrayList<>();
        if(asList.size()>0){
            for(Integer id : asList){
                list.addAll(getDepartListByParentId(id,departList));
            }
        }
        return list;
    }
    private List<CompanyDepartment> getDepartListByParentId(Integer pId, List<CompanyDepartment> departList) {
        List<CompanyDepartment> list = new ArrayList<>();
        if(departList!= null){
            for(CompanyDepartment d :departList){
                if(Constants.equalsInteger(d.getParentId(),pId)){
                    list.add(d);
                }
            }
        }
        return  list;
    }
    private boolean isExists(Integer s, List<Integer> dList) {
        if(dList!=null){
            for(Integer t : dList){
                if(Constants.equalsInteger(s,t)){
                    return true;
                }
            }
        }
        return false;
    }
}
server/service/src/main/resources/mappers/SystemDataPermissionMapper.xml
@@ -43,5 +43,30 @@
    </where>
    ${orderByClause}
  </select>
  <select id="selectUserList" resultMap="SystemDataPermissionListVO">
    SELECT
    sdp.`ID`, sdp.`BUSINESS_CODE`, sdp.`ROLE_ID`, sdp.`TYPE`, sdp.`CUSTOM_DATA`, sdp.`DISABLED`, sdp.`REMARK`, sdp.DISABLED, sdp.`CREATE_TIME`, sdp.`UPDATE_TIME`,
    role.`ID` AS ROLE_ID, role.`CODE` AS ROLE_CODE, role.`NAME` AS ROLE_NAME,
    create_user.ID CREATE_USER_ID, create_user.`USERNAME` CREATE_USER_NAME,
    update_user.ID UPDETE_USER_ID, update_user.`USERNAME` UPDATE_USER_NAME
    FROM SYSTEM_DATA_PERMISSION sdp
    INNER JOIN `SYSTEM_ROLE` role ON role.ID = sdp.ROLE_ID
    LEFT JOIN `SYSTEM_USER` create_user ON create_user.ID = sdp.CREATE_USER
    LEFT JOIN `SYSTEM_USER` update_user ON update_user.ID = sdp.UPDATE_USER
    <where>
      sdp.DELETED = 0
      <if test="dto.businessCode != null and dto.businessCode != ''">
        AND sdp.`BUSINESS_CODE` = #{dto.businessCode}
      </if>
      <if test="dto.roleId != null">
        AND role.`ID` =  #{dto.roleId}
      </if>
      <if test="dto.type != null">
        AND sdp.`TYPE` =  #{dto.type}
      </if>
      <if test="userId != null">
        AND exists (select sr.id from system_user_role sr where sr.role_id=sdp.role_id and sr.user_id=#{userId} and sr.deleted=0)
      </if>
    </where>
  </select>
</mapper>