Pārlūkot izejas kodu

新增组织架构增删改

wangliang 1 gadu atpakaļ
vecāks
revīzija
3e7fe35fb3
24 mainītis faili ar 725 papildinājumiem un 31 dzēšanām
  1. 99 0
      sop-business/src/main/java/com/qmth/sop/business/bean/dto/OrgDto.java
  2. 59 0
      sop-business/src/main/java/com/qmth/sop/business/bean/result/RoleResult.java
  3. 136 0
      sop-business/src/main/java/com/qmth/sop/business/bean/result/SysUserResult.java
  4. 2 0
      sop-business/src/main/java/com/qmth/sop/business/entity/SysOrg.java
  5. 9 0
      sop-business/src/main/java/com/qmth/sop/business/mapper/SysOrgMapper.java
  6. 11 0
      sop-business/src/main/java/com/qmth/sop/business/mapper/SysUserMapper.java
  7. 33 0
      sop-business/src/main/java/com/qmth/sop/business/service/SysOrgService.java
  8. 10 0
      sop-business/src/main/java/com/qmth/sop/business/service/SysUserService.java
  9. 152 0
      sop-business/src/main/java/com/qmth/sop/business/service/impl/SysOrgServiceImpl.java
  10. 12 0
      sop-business/src/main/java/com/qmth/sop/business/service/impl/SysUserServiceImpl.java
  11. 3 3
      sop-business/src/main/java/com/qmth/sop/business/templete/service/impl/TaskLogicServiceImpl.java
  12. 11 0
      sop-business/src/main/resources/mapper/SysOrgMapper.xml
  13. 30 0
      sop-business/src/main/resources/mapper/SysUserMapper.xml
  14. 2 0
      sop-common/src/main/java/com/qmth/sop/common/contant/SystemConstant.java
  15. 2 0
      sop-common/src/main/java/com/qmth/sop/common/enums/ExceptionResultEnum.java
  16. 59 0
      sop-common/src/main/java/com/qmth/sop/common/enums/FieldUniqueEnum.java
  17. 22 0
      sop-common/src/main/java/com/qmth/sop/common/util/ServletUtil.java
  18. 6 5
      sop-server/src/main/java/com/qmth/sop/server/api/ActivitiFromHtmlController.java
  19. 14 4
      sop-server/src/main/java/com/qmth/sop/server/api/SysController.java
  20. 46 2
      sop-server/src/main/java/com/qmth/sop/server/api/SysOrgController.java
  21. 2 6
      sop-server/src/main/java/com/qmth/sop/server/api/SysPrivilegeController.java
  22. 0 2
      sop-server/src/main/java/com/qmth/sop/server/api/TBTaskController.java
  23. 2 5
      sop-server/src/main/java/com/qmth/sop/server/api/TBUserArchivesController.java
  24. 3 4
      sop-server/src/main/java/com/qmth/sop/server/api/TDFormWidgetController.java

+ 99 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/dto/OrgDto.java

@@ -0,0 +1,99 @@
+package com.qmth.sop.business.bean.dto;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.sop.business.bean.result.SysUserResult;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Date: 2021/3/29.
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class OrgDto implements Serializable {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long id;
+    private String code;
+    private String name;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long parentId;
+    private Boolean enable;
+
+    @ApiModelProperty(value = "类型")
+    private String type;
+
+    private List<OrgDto> children = new ArrayList<>();
+
+    @ApiModelProperty(value = "机构下系统用户")
+    private List<SysUserResult> sysUserList;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Long getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(Long parentId) {
+        this.parentId = parentId;
+    }
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+
+    public List<OrgDto> getChildren() {
+        return children;
+    }
+
+    public void setChildren(List<OrgDto> children) {
+        this.children = children;
+    }
+
+    public List<SysUserResult> getSysUserList() {
+        return sysUserList;
+    }
+
+    public void setSysUserList(List<SysUserResult> sysUserList) {
+        this.sysUserList = sysUserList;
+    }
+}

+ 59 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/result/RoleResult.java

@@ -0,0 +1,59 @@
+package com.qmth.sop.business.bean.result;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 角色返回值
+ * @Author: CaoZixuan
+ * @Date: 2022-03-15
+ */
+public class RoleResult implements Serializable {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty("角色id")
+    private Long roleId;
+
+    @ApiModelProperty("角色名称")
+    private String roleName;
+
+    @ApiModelProperty("角色类别")
+    private String roleType;
+
+    public RoleResult() {
+
+    }
+
+    public RoleResult(Long roleId, String roleName, String roleType) {
+        this.roleId = roleId;
+        this.roleName = roleName;
+        this.roleType = roleType;
+    }
+
+    public String getRoleType() {
+        return roleType;
+    }
+
+    public void setRoleType(String roleType) {
+        this.roleType = roleType;
+    }
+
+    public Long getRoleId() {
+        return roleId;
+    }
+
+    public void setRoleId(Long roleId) {
+        this.roleId = roleId;
+    }
+
+    public String getRoleName() {
+        return roleName;
+    }
+
+    public void setRoleName(String roleName) {
+        this.roleName = roleName;
+    }
+}

+ 136 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/result/SysUserResult.java

@@ -0,0 +1,136 @@
+package com.qmth.sop.business.bean.result;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.sop.business.entity.SysUser;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @Description: 机构下用户查询返回
+ * @Author: CaoZixuan
+ * @Date: 2022-02-23
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class SysUserResult implements Serializable {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "用户id")
+    private Long id;
+
+    @ApiModelProperty(value = "登录名")
+    private String loginName;
+
+    @ApiModelProperty(value = "用户真实姓名")
+    private String realName;
+
+    @ApiModelProperty(value = "电话号码")
+    private String mobileNumber;
+
+    @ApiModelProperty(value = "机构id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @JSONField(serialize = false)
+    @JsonIgnore
+    private Long orgId;
+
+    @ApiModelProperty(value = "角色信息集合")
+    private List<RoleResult> roleResultList;
+
+    @ApiModelProperty(value = "角色id集合")
+    private String roleIds;
+
+    @ApiModelProperty(value = "机构名称")
+    private String orgName;
+
+    @ApiModelProperty(value = "机构编码")
+    private String orgCode;
+
+    public SysUserResult(){
+
+    }
+
+    public SysUserResult(SysUser sysUser){
+        this.id = sysUser.getId();
+        this.loginName = sysUser.getLoginName();
+        this.realName = sysUser.getRealName();
+        this.mobileNumber = sysUser.getMobileNumber();
+        this.orgId = sysUser.getOrgId();
+    }
+
+    public String getOrgName() {
+        return orgName;
+    }
+
+    public void setOrgName(String orgName) {
+        this.orgName = orgName;
+    }
+
+    public String getOrgCode() {
+        return orgCode;
+    }
+
+    public void setOrgCode(String orgCode) {
+        this.orgCode = orgCode;
+    }
+
+    public String getRoleIds() {
+        return roleIds;
+    }
+
+    public void setRoleIds(String roleIds) {
+        this.roleIds = roleIds;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getLoginName() {
+        return loginName;
+    }
+
+    public void setLoginName(String loginName) {
+        this.loginName = loginName;
+    }
+
+    public String getRealName() {
+        return realName;
+    }
+
+    public void setRealName(String realName) {
+        this.realName = realName;
+    }
+
+    public String getMobileNumber() {
+        return mobileNumber;
+    }
+
+    public void setMobileNumber(String mobileNumber) {
+        this.mobileNumber = mobileNumber;
+    }
+
+    public Long getOrgId() {
+        return orgId;
+    }
+
+    public void setOrgId(Long orgId) {
+        this.orgId = orgId;
+    }
+
+    public List<RoleResult> getRoleResultList() {
+        return roleResultList;
+    }
+
+    public void setRoleResultList(List<RoleResult> roleResultList) {
+        this.roleResultList = roleResultList;
+    }
+}

+ 2 - 0
sop-business/src/main/java/com/qmth/sop/business/entity/SysOrg.java

@@ -6,6 +6,7 @@ import com.qmth.sop.common.base.BaseEntity;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
+import javax.validation.constraints.NotBlank;
 import java.io.Serializable;
 
 /**
@@ -28,6 +29,7 @@ public class SysOrg extends BaseEntity implements Serializable {
     private String code;
 
     @ApiModelProperty(value = "机构名称")
+    @NotBlank(message = "机构名称不能为空")
     private String name;
 
     @ApiModelProperty(value = "上级机构id")

+ 9 - 0
sop-business/src/main/java/com/qmth/sop/business/mapper/SysOrgMapper.java

@@ -1,8 +1,11 @@
 package com.qmth.sop.business.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qmth.sop.business.bean.dto.OrgDto;
 import com.qmth.sop.business.entity.SysOrg;
 
+import java.util.List;
+
 /**
  * <p>
  * 学校组织架构 Mapper 接口
@@ -13,4 +16,10 @@ import com.qmth.sop.business.entity.SysOrg;
  */
 public interface SysOrgMapper extends BaseMapper<SysOrg> {
 
+    /**
+     * 获取所有机构
+     *
+     * @return
+     */
+    List<OrgDto> listOrgAll();
 }

+ 11 - 0
sop-business/src/main/java/com/qmth/sop/business/mapper/SysUserMapper.java

@@ -1,9 +1,12 @@
 package com.qmth.sop.business.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qmth.sop.business.bean.result.SysUserResult;
 import com.qmth.sop.business.entity.SysUser;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 /**
  * <p>
  * 用户表 Mapper 接口
@@ -21,4 +24,12 @@ public interface SysUserMapper extends BaseMapper<SysUser> {
      * @return
      */
     String findProcessDefinitionIdByDeploymentId(@Param("deploymentId") String deploymentId);
+
+    /**
+     * 根据机构id查询用户
+     *
+     * @param orgId
+     * @return
+     */
+    List<SysUserResult> findSysUserResultList(@Param("orgId") Long orgId);
 }

+ 33 - 0
sop-business/src/main/java/com/qmth/sop/business/service/SysOrgService.java

@@ -1,8 +1,11 @@
 package com.qmth.sop.business.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.sop.business.bean.dto.OrgDto;
 import com.qmth.sop.business.entity.SysOrg;
 
+import java.util.List;
+
 /**
  * <p>
  * 学校组织架构 服务类
@@ -13,4 +16,34 @@ import com.qmth.sop.business.entity.SysOrg;
  */
 public interface SysOrgService extends IService<SysOrg> {
 
+    /**
+     * 获取机构树
+     *
+     * @param showUserList
+     * @return
+     */
+    List<OrgDto> listOrgTree(Boolean showUserList);
+
+    /**
+     * 获取所有机构
+     *
+     * @return
+     */
+    List<OrgDto> listOrgAll();
+
+    /**
+     * 保存/修改机构信息
+     *
+     * @param org
+     * @return
+     */
+    Boolean saveOrg(SysOrg org);
+
+    /**
+     * 机构禁用
+     *
+     * @param org
+     * @return
+     */
+    Boolean enable(SysOrg org);
 }

+ 10 - 0
sop-business/src/main/java/com/qmth/sop/business/service/SysUserService.java

@@ -2,10 +2,12 @@ package com.qmth.sop.business.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.sop.business.bean.result.LoginResult;
+import com.qmth.sop.business.bean.result.SysUserResult;
 import com.qmth.sop.business.entity.SysUser;
 import com.qmth.sop.common.enums.AppSourceEnum;
 
 import java.security.NoSuchAlgorithmException;
+import java.util.List;
 
 /**
  * <p>
@@ -35,4 +37,12 @@ public interface SysUserService extends IService<SysUser> {
      * @param all
      */
     public Boolean removeUserInfo(Long userId, boolean all) throws NoSuchAlgorithmException;
+
+    /**
+     * 根据机构id查询用户
+     *
+     * @param orgId
+     * @return
+     */
+    List<SysUserResult> findSysUserResultList(Long orgId);
 }

+ 152 - 0
sop-business/src/main/java/com/qmth/sop/business/service/impl/SysOrgServiceImpl.java

@@ -1,10 +1,31 @@
 package com.qmth.sop.business.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.boot.api.exception.ApiException;
+import com.qmth.sop.business.bean.dto.OrgDto;
+import com.qmth.sop.business.bean.result.RoleResult;
+import com.qmth.sop.business.bean.result.SysUserResult;
 import com.qmth.sop.business.entity.SysOrg;
+import com.qmth.sop.business.entity.SysUser;
 import com.qmth.sop.business.mapper.SysOrgMapper;
 import com.qmth.sop.business.service.SysOrgService;
+import com.qmth.sop.business.service.SysUserService;
+import com.qmth.sop.common.enums.ExceptionResultEnum;
+import com.qmth.sop.common.enums.FieldUniqueEnum;
+import com.qmth.sop.common.util.ResultUtil;
+import com.qmth.sop.common.util.ServletUtil;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.dao.DuplicateKeyException;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -17,4 +38,135 @@ import org.springframework.stereotype.Service;
 @Service
 public class SysOrgServiceImpl extends ServiceImpl<SysOrgMapper, SysOrg> implements SysOrgService {
 
+    @Resource
+    SysUserService sysUserService;
+
+    /**
+     * 获取机构树
+     *
+     * @param showUserList
+     * @return
+     */
+    @Override
+    public List<OrgDto> listOrgTree(Boolean showUserList) {
+        Long orgId = Objects.nonNull(ServletUtil.getRequestHeaderOrgIdNotVaild()) ? Long.valueOf(ServletUtil.getRequestHeaderOrgIdNotVaild().toString()) : null;
+        List<SysUserResult> sysUserResultList = null;
+        if (Objects.nonNull(showUserList) && showUserList) {
+            sysUserResultList = sysUserService.findSysUserResultList(orgId);
+            if (!CollectionUtils.isEmpty(sysUserResultList)) {
+                sysUserResultList.forEach(e -> {
+                    if (Objects.nonNull(e.getRoleIds())) {
+                        String[] roldIds = StringUtils.split(e.getRoleIds(), ";");
+                        List<RoleResult> roleResultList = new ArrayList<>(roldIds.length);
+                        for (int y = 0; y < roldIds.length; y++) {
+                            String[] strs = StringUtils.split(roldIds[y], ",");
+                            roleResultList.add(new RoleResult(Long.parseLong(strs[0]), strs[1], strs[2]));
+                        }
+                        e.setRoleResultList(roleResultList);
+                        e.setRoleIds(null);
+                    }
+                });
+            }
+        }
+        List<OrgDto> orgList = this.listOrgAll();
+        Map<Long, OrgDto> map = null;
+        if (Objects.nonNull(showUserList) && showUserList) {
+            List<SysUserResult> finalSysUserResultList = sysUserResultList;
+            map = orgList.stream()
+                    .peek(e -> {
+                        // 加入机构下所有人员查询
+                        e.setSysUserList(finalSysUserResultList.stream().filter(f -> Objects.nonNull(f.getOrgId()) && f.getOrgId().equals(e.getId())).collect(Collectors.toList()));
+                    })
+                    .collect(Collectors.toMap(OrgDto::getId, Function.identity(), (dto1, dto2) -> dto1));
+        } else {
+            map = orgList.stream().collect(Collectors.toMap(OrgDto::getId, Function.identity(), (dto1, dto2) -> dto1));
+        }
+
+        Iterator<Long> iterator = map.keySet().iterator();
+        Set<Long> deleteKeys = new HashSet<>();
+        while (iterator.hasNext()) {
+            Long parentId = iterator.next();
+            if (map.get(parentId).getParentId() != null) {
+                if (Objects.nonNull(map.get(map.get(parentId).getParentId()))) {
+                    map.get(map.get(parentId).getParentId()).getChildren().add(map.get(parentId));
+                    deleteKeys.add(parentId);
+                }
+            }
+        }
+        for (Long key : deleteKeys) {
+            map.remove(key);
+        }
+        return new ArrayList<>(map.values());
+    }
+
+    /**
+     * 获取所有机构
+     *
+     * @return
+     */
+    @Override
+    public List<OrgDto> listOrgAll() {
+        return this.baseMapper.listOrgAll();
+    }
+
+    /**
+     * 保存/修改机构信息
+     *
+     * @param org
+     * @return
+     */
+    @Override
+    @Transactional
+    public Boolean saveOrg(SysOrg org) {
+        try {
+            SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+            if (Objects.isNull(org.getId())) {// 新增
+                org.insertInfo(sysUser.getId());
+            } else { // 修改
+                SysOrg sysOrg = this.getById(org.getId());
+                Optional.ofNullable(sysOrg).orElseThrow(() -> ExceptionResultEnum.ORG_NO_DATA.exception());
+                org.updateInfo(sysUser.getId());
+            }
+            return saveOrUpdate(org);
+        } catch (Exception e) {
+            if (e instanceof DuplicateKeyException) {
+                String errorColumn = e.getCause().toString();
+                String columnStr = errorColumn.substring(errorColumn.lastIndexOf("key") + 3, errorColumn.length()).replaceAll("'", "");
+                throw ExceptionResultEnum.SQL_ERROR.exception("[" + FieldUniqueEnum.convertToTitle(columnStr) + "]数据不允许重复插入");
+            } else if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 机构禁用
+     *
+     * @param org
+     * @return
+     */
+    @Override
+    @Transactional
+    public Boolean enable(SysOrg org) {
+        // 禁用时,校验机构
+        if (!org.getEnable()) {
+            // 机构下是否有用户
+            List<SysUser> sysUsers = sysUserService.list(new QueryWrapper<SysUser>().lambda().eq(SysUser::getOrgId, org.getId()));
+            if (!CollectionUtils.isEmpty(sysUsers)) {
+                throw ExceptionResultEnum.ERROR.exception("该机构下有用户,不能禁用");
+            }
+
+            // 机构下是否有子机构
+            List<SysOrg> sysOrgs = this.list(new QueryWrapper<SysOrg>().lambda().eq(SysOrg::getParentId, org.getId()));
+            if (!CollectionUtils.isEmpty(sysOrgs)) {
+                throw ExceptionResultEnum.ERROR.exception("该机构下有子机构,不能禁用");
+            }
+        }
+        SysOrg sysOrg = this.getById(org.getId());
+        Optional.ofNullable(sysOrg).orElseThrow(() -> ExceptionResultEnum.ORG_NO_DATA.exception());
+        return this.update(new UpdateWrapper<SysOrg>().lambda().set(SysOrg::getEnable, org.getEnable()).eq(SysOrg::getId, org.getId()));
+    }
 }

+ 12 - 0
sop-business/src/main/java/com/qmth/sop/business/service/impl/SysUserServiceImpl.java

@@ -5,6 +5,7 @@ import com.qmth.boot.core.enums.Platform;
 import com.qmth.sop.business.bean.auth.AuthBean;
 import com.qmth.sop.business.bean.auth.ExpireTimeBean;
 import com.qmth.sop.business.bean.result.LoginResult;
+import com.qmth.sop.business.bean.result.SysUserResult;
 import com.qmth.sop.business.cache.CommonCacheService;
 import com.qmth.sop.business.entity.SysRole;
 import com.qmth.sop.business.entity.SysUser;
@@ -113,4 +114,15 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         commonCacheService.removeUserRolePrivilegeCache(userId);
         return true;
     }
+
+    /**
+     * 根据机构id查询用户
+     *
+     * @param orgId
+     * @return
+     */
+    @Override
+    public List<SysUserResult> findSysUserResultList(Long orgId) {
+        return this.baseMapper.findSysUserResultList(orgId);
+    }
 }

+ 3 - 3
sop-business/src/main/java/com/qmth/sop/business/templete/service/impl/TaskLogicServiceImpl.java

@@ -66,7 +66,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
             map.computeIfAbsent(SystemConstant.EXCEL_DATA, v -> userArchivesImportDtoLinkedMultiValueMap);
             map.computeIfAbsent(SystemConstant.EXCEL_DATA_ERROR, v -> errorData.toString());
 
-            //处理数据逻辑
+            //TODO 处理数据逻辑
         } finally {
             if (Objects.nonNull(inputStream)) {
                 inputStream.close();
@@ -88,11 +88,11 @@ public class TaskLogicServiceImpl implements TaskLogicService {
         File fileTemp = null;
         try {
             fileTemp = SystemConstant.getFileTempVar(SystemConstant.XLSX_PREFIX);
-            //数据读取逻辑start
+            //TODO 数据读取逻辑start
             List<UserArchivesImportDto> archivesImportDtoList = new ArrayList<>();
             archivesImportDtoList.add(new UserArchivesImportDto("1", "2", "123", "aaa", "bbb"));
             archivesImportDtoList.add(new UserArchivesImportDto("4", "5", "789", "ccc", "ddd"));
-            //数据读取逻辑end
+            //TODO 数据读取逻辑end
             EasyExcel.write(fileTemp, UserArchivesImportDto.class).sheet("人员档案导出").doWrite(archivesImportDtoList);
 
             BasicAttachment basicAttachment = basicAttachmentService.saveAttachment(fileTemp, UploadFileEnum.FILE);

+ 11 - 0
sop-business/src/main/resources/mapper/SysOrgMapper.xml

@@ -2,4 +2,15 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.qmth.sop.business.mapper.SysOrgMapper">
 
+    <select id="listOrgAll" resultType="com.qmth.sop.business.bean.dto.OrgDto">
+        select
+        so.id,
+        so.code,
+        so.name,
+        so.`type` type,
+        so.parent_id as parentId,
+        so.enable
+        from sys_org so
+        order by so.create_time asc
+    </select>
 </mapper>

+ 30 - 0
sop-business/src/main/resources/mapper/SysUserMapper.xml

@@ -5,4 +5,34 @@
     <select id="findProcessDefinitionIdByDeploymentId" resultType="java.lang.String">
         select ARP.ID_ from ACT_RE_PROCDEF ARP where ARP.DEPLOYMENT_ID_ = #{deploymentId}
     </select>
+
+    <select id="findSysUserResultList" resultType="com.qmth.sop.business.bean.result.SysUserResult">
+        select
+        su.id as id,
+        su.login_name as loginName,
+        su.real_name as realName,
+        su.mobile_number as mobileNumber,
+        so.id as orgId,
+        group_concat(CONCAT(sr.id, "," ,sr.name,"," ,sr.type) SEPARATOR ';') as roleIds
+        from sys_user su
+        join sys_org so on so.id = su.org_id
+        join sys_user_role sur on sur.user_id = su.id
+        join sys_role sr on sr.id = sur.role_id
+        <where> 1 = 1
+            <if test="orgId != null and orgId != ''">
+                and su.org_id = #{orgId}
+            </if>
+            and su.enable = 1
+            and so.enable = 1
+            and sur.enable = 1
+            and sr.enable = 1
+        </where>
+        group by
+        su.id,
+        su.login_name,
+        su.real_name,
+        su.mobile_number,
+        so.id
+        order by su.login_name
+    </select>
 </mapper>

+ 2 - 0
sop-common/src/main/java/com/qmth/sop/common/contant/SystemConstant.java

@@ -42,6 +42,7 @@ public class SystemConstant {
     public static final String TASK = "task";
     public static final String PARAMS = "params";
     public static final String ORG = "org";
+    public static final String ORG_ID = "orgId";
     public static final String MD5 = "MD5";
     public static final String SIGNATURE = "signature";
     public static final String GET = "get";
@@ -117,6 +118,7 @@ public class SystemConstant {
     public static final String PREFIX_URL_USER_ARCHIVES = "/admin/user/archives";
     public static final String PREFIX_URL_TASK = "/admin/task";
     public static final String PREFIX_URL_SYS = "/admin/sys";
+    public static final String PREFIX_URL_ORG = "/admin/org";
 
     /**
      * 缓存配置

+ 2 - 0
sop-common/src/main/java/com/qmth/sop/common/enums/ExceptionResultEnum.java

@@ -41,6 +41,8 @@ public enum ExceptionResultEnum {
 
     ATTACHMENT_NO_DATA(HttpStatus.INTERNAL_SERVER_ERROR, 5000004, "没有附件数据"),
 
+    ORG_NO_DATA(HttpStatus.INTERNAL_SERVER_ERROR, 5000005, "没有机构数据"),
+
     USER_NO_DATA(HttpStatus.INTERNAL_SERVER_ERROR, 5000009, "用户或密码不正确"),
 
     USER_ENABLE(HttpStatus.INTERNAL_SERVER_ERROR, 5000011, "用户已禁用"),

+ 59 - 0
sop-common/src/main/java/com/qmth/sop/common/enums/FieldUniqueEnum.java

@@ -0,0 +1,59 @@
+package com.qmth.sop.common.enums;
+
+import java.util.Objects;
+
+/**
+ * @Description: 唯一约束字段转换
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/7/13
+ */
+public enum FieldUniqueEnum {
+
+    sys_user_UN_moblie_number("手机号"),
+
+    sys_user_UN_login_name("登录名"),
+
+    sys_org_UN_name("机构名称");
+
+    private String title;
+
+    private FieldUniqueEnum(String title) {
+        this.title = title;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    /**
+     * 状态转换 toName
+     *
+     * @param value
+     * @return
+     */
+    public static String convertToName(String value) {
+        for (FieldUniqueEnum e : FieldUniqueEnum.values()) {
+            if (Objects.equals(value.trim(), e.getTitle())) {
+                return e.name();
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 状态转换 toTitle
+     *
+     * @param value
+     * @return
+     */
+    public static String convertToTitle(String value) {
+        for (FieldUniqueEnum e : FieldUniqueEnum.values()) {
+            if (value.trim().contains(e.name())) {
+                return e.getTitle();
+            }
+        }
+        return null;
+    }
+}

+ 22 - 0
sop-common/src/main/java/com/qmth/sop/common/util/ServletUtil.java

@@ -235,4 +235,26 @@ public class ServletUtil {
         ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
         return servletRequestAttributes.getRequest().getSession();
     }
+
+    /**
+     * 获取header中orgId
+     *
+     * @return
+     */
+    public static Object getRequestHeaderOrgId() {
+        Object object = getRequest().getHeader(SystemConstant.ORG_ID);
+        if (Objects.isNull(object)) {
+            throw ExceptionResultEnum.NOT_LOGIN.exception();
+        }
+        return object;
+    }
+
+    /**
+     * 获取header中orgId
+     *
+     * @return
+     */
+    public static Object getRequestHeaderOrgIdNotVaild() {
+        return getRequest().getHeader(SystemConstant.ORG_ID);
+    }
 }

+ 6 - 5
sop-server/src/main/java/com/qmth/sop/server/api/ActivitiFromHtmlController.java

@@ -1,6 +1,9 @@
 package com.qmth.sop.server.api;
 
 import com.qmth.sop.business.activiti.service.ActivitiService;
+import com.qmth.sop.business.bean.bean.FormPropertyBean;
+import com.qmth.sop.business.bean.result.FlowViewResult;
+import com.qmth.sop.business.entity.TFCustomFlow;
 import com.qmth.sop.business.service.TFCustomFlowService;
 import com.qmth.sop.common.contant.SystemConstant;
 import com.qmth.sop.common.enums.FlowApprovePassEnum;
@@ -10,7 +13,6 @@ import com.qmth.sop.common.util.ResultUtil;
 import io.swagger.annotations.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -25,7 +27,6 @@ import java.util.*;
 @Api(tags = "测试流程表单htmlController")
 @RestController
 @RequestMapping(SystemConstant.PREFIX_TEST_FLOW)
-@Validated
 public class ActivitiFromHtmlController {
     private final static Logger log = LoggerFactory.getLogger(ActivitiFromHtmlController.class);
 
@@ -51,7 +52,7 @@ public class ActivitiFromHtmlController {
 
     @ApiOperation(value = "获取流程部署信息")
     @RequestMapping(value = "/deployment/data", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = Object.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = TFCustomFlow.class)})
     public Result getDeploymentData() {
         return ResultUtil.ok(tfCustomFlowService.findFlowDeploymentList());
     }
@@ -92,7 +93,7 @@ public class ActivitiFromHtmlController {
 
     @ApiOperation(value = "获取待办接口")
     @RequestMapping(value = "/getTaskList", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = Object.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = FormPropertyBean.class)})
     public Result getTaskList(@ApiParam(value = "用户id", required = true) @RequestParam String userId) {
         return ResultUtil.ok(activitiService.getTaskList(Long.parseLong(userId)));
     }
@@ -114,7 +115,7 @@ public class ActivitiFromHtmlController {
 
     @ApiOperation(value = "获取流程详细信息接口")
     @RequestMapping(value = "/view", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = Object.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = FlowViewResult.class)})
     public Result flowView(@ApiParam(value = "用户id", required = true) String flowId) {
         return ResultUtil.ok(activitiService.flowView(Long.parseLong(flowId)));
     }

+ 14 - 4
sop-server/src/main/java/com/qmth/sop/server/api/SysController.java

@@ -5,9 +5,11 @@ import com.qmth.boot.api.annotation.Aac;
 import com.qmth.boot.api.annotation.BOOL;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.boot.api.exception.ApiException;
+import com.qmth.sop.business.bean.dto.OrgDto;
 import com.qmth.sop.business.bean.params.LoginParam;
 import com.qmth.sop.business.bean.result.EditResult;
 import com.qmth.sop.business.bean.result.LoginResult;
+import com.qmth.sop.business.bean.result.MenuResult;
 import com.qmth.sop.business.cache.CommonCacheService;
 import com.qmth.sop.business.entity.BasicAttachment;
 import com.qmth.sop.business.entity.SysConfig;
@@ -26,7 +28,6 @@ import org.slf4j.LoggerFactory;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 import org.springframework.validation.BindingResult;
-import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -53,7 +54,6 @@ import java.util.stream.Stream;
 @Api(tags = "系统公用Controller")
 @RestController
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_COMMON)
-@Validated
 public class SysController {
     private final static Logger log = LoggerFactory.getLogger(SysController.class);
 
@@ -78,6 +78,9 @@ public class SysController {
     @Resource
     BasicVerifyCodeService basicVerifyCodeService;
 
+    @Resource
+    SysOrgService sysOrgService;
+
     @ApiOperation(value = "登录")
     @RequestMapping(value = "/login", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "用户信息", response = LoginResult.class)})
@@ -158,7 +161,7 @@ public class SysController {
 
     @ApiOperation(value = "下载导入模板")
     @RequestMapping(value = "/download_import_template", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = Object.class)})
     public void downloadImportTemplate(@ApiParam(value = "模版类型", required = true) @RequestParam ImportTemplateEnum type) throws IOException {
         List<ImportTemplateEnum> templateEnums = Stream.of(ImportTemplateEnum.values()).map(m -> m).collect(Collectors.toList());
         if (!templateEnums.contains(type)) {
@@ -230,7 +233,7 @@ public class SysController {
 
     @ApiOperation(value = "查询用户权限")
     @RequestMapping(value = "/get_menu", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = Object.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = MenuResult.class)})
     public Result getMenu() {
         return ResultUtil.ok(sysUserRoleService.listByUserId());
     }
@@ -242,4 +245,11 @@ public class SysController {
     public Result getSystemTime() {
         return ResultUtil.ok(System.currentTimeMillis());
     }
+
+    @ApiOperation(value = "获取机构下所有用户")
+    @RequestMapping(value = "/get_org_user_list", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = OrgDto.class)})
+    public Result getOrgUserList() {
+        return ResultUtil.ok(sysOrgService.listOrgTree(true));
+    }
 }

+ 46 - 2
sop-server/src/main/java/com/qmth/sop/server/api/SysOrgController.java

@@ -1,19 +1,63 @@
 package com.qmth.sop.server.api;
 
 
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.sop.business.bean.dto.OrgDto;
+import com.qmth.sop.business.entity.SysOrg;
+import com.qmth.sop.business.service.SysOrgService;
+import com.qmth.sop.common.contant.SystemConstant;
+import com.qmth.sop.common.util.Result;
+import com.qmth.sop.common.util.ResultUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
+import javax.validation.Valid;
+
 /**
  * <p>
- * 学校组织架构 前端控制器
+ * 组织架构 前端控制器
  * </p>
  *
  * @author wangliang
  * @since 2023-07-17
  */
+@Api(tags = "组织架构Controller")
 @RestController
-@RequestMapping("/sys-org")
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_ORG)
 public class SysOrgController {
 
+    @Resource
+    SysOrgService sysOrgService;
+
+    @ApiOperation(value = "查询")
+    @RequestMapping(value = "/list", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = OrgDto.class)})
+    public Result list() {
+        return ResultUtil.ok(sysOrgService.listOrgTree(false));
+    }
+
+    @ApiOperation(value = "新增/修改")
+    @RequestMapping(value = "/save", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = Object.class)})
+    public Result save(@Valid @RequestBody SysOrg org, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+        return ResultUtil.ok(sysOrgService.saveOrg(org));
+    }
+
+    @ApiOperation(value = "启用/禁用")
+    @RequestMapping(value = "/enable", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = Object.class)})
+    public Result enable(@RequestBody SysOrg org) {
+        return ResultUtil.ok(sysOrgService.enable(org));
+    }
 }

+ 2 - 6
sop-server/src/main/java/com/qmth/sop/server/api/SysPrivilegeController.java

@@ -1,6 +1,7 @@
 package com.qmth.sop.server.api;
 
 import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.sop.business.bean.dto.PrivilegeDto;
 import com.qmth.sop.business.service.SysPrivilegeService;
 import com.qmth.sop.common.contant.SystemConstant;
 import com.qmth.sop.common.util.Result;
@@ -31,14 +32,9 @@ public class SysPrivilegeController {
     @Resource
     SysPrivilegeService sysPrivilegeService;
 
-    /**
-     * 查询
-     *
-     * @return
-     */
     @ApiOperation(value = "查询")
     @RequestMapping(value = "/list", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = Object.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = PrivilegeDto.class)})
     public Result list() {
         return ResultUtil.ok(sysPrivilegeService.listPrivilegeTree());
     }

+ 0 - 2
sop-server/src/main/java/com/qmth/sop/server/api/TBTaskController.java

@@ -14,7 +14,6 @@ import com.qmth.sop.common.util.Result;
 import com.qmth.sop.common.util.ResultUtil;
 import io.swagger.annotations.*;
 import org.springframework.util.CollectionUtils;
-import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -37,7 +36,6 @@ import java.util.Objects;
 @Api(tags = "任务管理Controller")
 @RestController
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_TASK)
-@Validated
 public class TBTaskController {
 
     @Resource

+ 2 - 5
sop-server/src/main/java/com/qmth/sop/server/api/TBUserArchivesController.java

@@ -1,7 +1,6 @@
 package com.qmth.sop.server.api;
 
 import com.qmth.boot.api.constant.ApiConstant;
-import com.qmth.sop.business.bean.result.EditResult;
 import com.qmth.sop.business.entity.TBTask;
 import com.qmth.sop.business.service.TBTaskService;
 import com.qmth.sop.business.templete.execute.AsyncUserArchivesExportService;
@@ -11,7 +10,6 @@ import com.qmth.sop.common.enums.TaskTypeEnum;
 import com.qmth.sop.common.util.Result;
 import com.qmth.sop.common.util.ResultUtil;
 import io.swagger.annotations.*;
-import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -32,7 +30,6 @@ import java.util.Map;
 @Api(tags = "人员档案Controller")
 @RestController
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_USER_ARCHIVES)
-@Validated
 public class TBUserArchivesController {
 
     @Resource
@@ -46,7 +43,7 @@ public class TBUserArchivesController {
 
     @ApiOperation(value = "人员档案导入")
     @RequestMapping(value = "/import", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = Object.class)})
     public Result importUserArchives(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file) throws Exception {
         Map<String, Object> map = tbTaskService.saveTask(file, TaskTypeEnum.USER_ARCHIVES_IMPORT);
         asyncUserArchivesImportService.importTask(map);
@@ -56,7 +53,7 @@ public class TBUserArchivesController {
 
     @ApiOperation(value = "人员档案导出")
     @RequestMapping(value = "/export", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = Object.class)})
     public Result exportUserArchives() throws Exception {
         Map<String, Object> map = tbTaskService.saveTask(TaskTypeEnum.USER_ARCHIVES_EXPORT);
         asyncUserArchivesExportService.exportTask(map);

+ 3 - 4
sop-server/src/main/java/com/qmth/sop/server/api/TDFormWidgetController.java

@@ -8,6 +8,7 @@ import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.sop.business.bean.result.FlowFormWidgetResult;
 import com.qmth.sop.business.bean.result.FlowTablePropResult;
 import com.qmth.sop.business.bean.result.FlowTdFormWidgetResult;
+import com.qmth.sop.business.bean.result.FormWidgetResult;
 import com.qmth.sop.business.cache.CommonCacheService;
 import com.qmth.sop.business.entity.TDFormWidget;
 import com.qmth.sop.business.entity.TDTableProp;
@@ -21,7 +22,6 @@ import com.qmth.sop.common.util.Result;
 import com.qmth.sop.common.util.ResultUtil;
 import io.swagger.annotations.*;
 import org.springframework.util.CollectionUtils;
-import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -34,7 +34,6 @@ import java.util.stream.Collectors;
 @Api(tags = "系统控件Controller")
 @RestController
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_WIDGET)
-@Validated
 @Aac(auth = BOOL.FALSE)
 public class TDFormWidgetController {
 
@@ -45,14 +44,14 @@ public class TDFormWidgetController {
     TDFormWidgetService tdFormWidgetService;
 
     @ApiOperation(value = "控件查询列表")
-    @ApiResponses({@ApiResponse(code = 200, message = "控件查询列表信息", response = Object.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "控件查询列表信息", response = FormWidgetResult.class)})
     @RequestMapping(value = "/list", method = RequestMethod.POST)
     public Result list() {
         return ResultUtil.ok(commonCacheService.formWidgetCache());
     }
 
     @ApiOperation(value = "流程控件查询")
-    @ApiResponses({@ApiResponse(code = 200, message = "流程控件查询", response = Object.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "流程控件查询", response = FlowFormWidgetResult.class)})
     @RequestMapping(value = "/flow/select", method = RequestMethod.POST)
     public Result flowSelect(@ApiParam(value = "开始id", required = true) @RequestParam Long beginId,
                              @ApiParam(value = "结束id", required = true) @RequestParam Long endId) {