Bladeren bron

花名册用户关联

lizhenhao 2 jaren geleden
bovenliggende
commit
62db408ae5
23 gewijzigde bestanden met toevoegingen van 1153 en 55 verwijderingen
  1. 16 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/common/CommonUtils.java
  2. 1 2
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/roster/controller/RosterBaseController.java
  3. 14 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/roster/domain/RosterBase.java
  4. 3 1
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/roster/mapper/xml/RosterBaseMapper.xml
  5. 262 32
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/roster/service/RosterBaseService.java
  6. 39 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/roster/service/dto/RosterBaseDTO.java
  7. 6 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/controller/OfficeController.java
  8. 2 2
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/controller/RoleController.java
  9. 3 7
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/controller/UserController.java
  10. 230 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/domain/RosterBaseC.java
  11. 64 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/domain/SysSerialnumTplC.java
  12. 6 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/domain/User.java
  13. 9 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/mapper/RosterBaseCMapper.java
  14. 20 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/mapper/SerialnumTplCMapper.java
  15. 24 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/mapper/UserMapper.java
  16. 38 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/mapper/xml/SerialnumTplCMapper.xml
  17. 27 1
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/mapper/xml/UserMapper.xml
  18. 10 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/service/OfficeService.java
  19. 2 2
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/service/RoleService.java
  20. 14 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/service/RosterBaseCService.java
  21. 293 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/service/SerialnumTplCService.java
  22. 64 7
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/service/UserService.java
  23. 6 1
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/service/dto/UserDTO.java

+ 16 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/common/CommonUtils.java

@@ -1,6 +1,10 @@
 package com.jeeplus.test.cw.common;
 
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import com.jeeplus.sys.service.DictTypeService;
+import com.jeeplus.sys.service.OfficeService;
+import com.jeeplus.sys.service.dto.OfficeDTO;
 import com.jeeplus.sys.service.dto.RoleDTO;
 import com.jeeplus.sys.service.dto.UserDTO;
 import com.jeeplus.sys.utils.UserUtils;
@@ -181,4 +185,16 @@ public class CommonUtils {
         long min = def / (1000 * 60);
         return min + "分钟前";
     }
+
+    /**
+     * 获取所有公司中的第一个
+     * @return
+     */
+    public static String getFirstCompanyId() {
+        List<OfficeDTO> allCompany = SpringUtil.getBean(OfficeService.class).getAllCompany();
+        if (CollectionUtil.isNotEmpty(allCompany)) {
+            return allCompany.get(0).getId();
+        }
+        return "";
+    }
 }

+ 1 - 2
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/roster/controller/RosterBaseController.java

@@ -137,8 +137,7 @@ public class RosterBaseController {
     @DeleteMapping("delete")
     public ResponseEntity delete(String ids,HttpServletRequest request) {
         String idArray[] =ids.split(",");
-        rosterBaseService.removeByIds (Lists.newArrayList (idArray));
-        return ResponseEntity.ok ("删除花名册成功");
+        return rosterBaseService.removeByRosterIds (idArray);
     }
 
     /**

+ 14 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/roster/domain/RosterBase.java

@@ -2,7 +2,9 @@ package com.jeeplus.test.roster.domain;
 
 import java.io.Serializable;
 import java.util.Date;
+import java.util.List;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.jeeplus.core.domain.BaseEntity;
@@ -223,5 +225,17 @@ public class RosterBase extends BaseEntity {
      */
     private String headshot;
 
+    /**
+     * 人员类型  1员工  2游客
+     */
+    private String personType;
+
+    /**
+     * 公司id
+     */
+    @TableField(exist = false)
+    private String companyId;
+
+
     private static final long serialVersionUID = 1L;
 }

+ 3 - 1
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/roster/mapper/xml/RosterBaseMapper.xml

@@ -49,6 +49,7 @@
     <result column="email" jdbcType="VARCHAR" property="email" />
     <result column="headshot" jdbcType="VARCHAR" property="headshot" />
     <result column="office_name" jdbcType="VARCHAR" property="officeName" />
+    <result column="person_type" jdbcType="VARCHAR" property="personType" />
     <association property="rosterContractDTO" javaType="com.jeeplus.test.roster.service.dto.RosterContractDTO" column="id" select="getContractDTO"></association>
     <association property="rosterLeadershipDTO" javaType="com.jeeplus.test.roster.service.dto.RosterLeadershipDTO" column="id" select="getLeadershipDTO"></association>
     <collection property="rosterBankCardsDTOList" ofType="com.jeeplus.test.roster.service.dto.RosterBankCardsDTO" column="id" select="getBankCardsList"></collection>
@@ -105,7 +106,8 @@
     rb.qq,
     rb.wechat,
     rb.email,
-    rb.headshot
+    rb.headshot,
+    rb.person_type
   </sql>
   <sql id="Contract_Column_List">
     rc.id,

+ 262 - 32
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/roster/service/RosterBaseService.java

@@ -8,15 +8,22 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jeeplus.core.excel.utils.EasyPoiUtil;
+import com.jeeplus.security.util.SecurityUtils;
 import com.jeeplus.sys.constant.enums.OfficeTypeEnum;
+import com.jeeplus.sys.domain.Cert;
 import com.jeeplus.sys.domain.Office;
 import com.jeeplus.sys.domain.User;
+import com.jeeplus.sys.mapper.UserMapper;
+import com.jeeplus.sys.service.CertService;
 import com.jeeplus.sys.service.OfficeService;
 import com.jeeplus.sys.service.UserService;
+import com.jeeplus.sys.service.dto.CertDTO;
 import com.jeeplus.sys.service.dto.UserDTO;
+import com.jeeplus.sys.service.mapstruct.CertWrapper;
 import com.jeeplus.sys.utils.DictUtils;
 import com.jeeplus.sys.utils.StringUtils;
 import com.jeeplus.sys.utils.UserUtils;
+import com.jeeplus.test.cw.common.CommonUtils;
 import com.jeeplus.test.cw.invoice.service.dto.CwFinanceInvoiceDetailDTO;
 import com.jeeplus.test.jobPosion.service.dto.JobPositionDTO;
 import com.jeeplus.test.jobPosion.utils.BeanUtils;
@@ -28,6 +35,7 @@ import com.jeeplus.test.roster.mapper.RosterBaseMapper;
 import com.jeeplus.test.roster.service.dto.*;
 import com.jeeplus.test.roster.service.mapstruct.*;
 import com.jeeplus.test.workContract.service.dto.WorkContractInfoDto;
+import org.apache.commons.compress.utils.Lists;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
@@ -35,6 +43,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -83,6 +92,12 @@ public class RosterBaseService extends ServiceImpl<RosterBaseMapper, RosterBase>
     @Autowired
     private UserService userService;
 
+    @Autowired
+    private UserMapper userMapper;
+
+    @Autowired
+    private CertService certService;
+
     public IPage<RosterBaseDTO> findList(Page<RosterBaseDTO> page, QueryWrapper<RosterBase> queryWrapper){
         queryWrapper.eq("rb.del_flag","0");
         IPage<RosterBaseDTO> rosterBaseDTOIPage = rosterBaseMapper.findList(page, queryWrapper);
@@ -140,6 +155,42 @@ public class RosterBaseService extends ServiceImpl<RosterBaseMapper, RosterBase>
                     }
                 });
             }
+            // 查询花名册关联用户的信息
+            User user = userService.getOne(new QueryWrapper<User>().lambda().eq(User::getRosterId, id));
+            List<CertDTO> certDTOList = new ArrayList<>();
+            if (ObjectUtil.isNotEmpty(user)) {
+                // 获取用户资质
+                List<Cert> certList = userService.getCertListByUserId(user.getId());  // 根据用户id获取资质信息
+                if (CollectionUtil.isNotEmpty(certList)) {
+                    certList.stream().forEach(c -> {
+                        CertDTO certDTO = CertWrapper.INSTANCE.toDTO(c);
+                        if (StringUtils.isNotBlank(certDTO.getFileUrl())) {  //  根据oss图片路径获取图片临时地址
+                            String fileLsUrl = ossService.getFileTemporaryLookUrl(certDTO.getFileUrl());
+                            certDTO.setFileLsUrl(fileLsUrl);
+                        }
+                        certDTOList.add(certDTO);
+                    });
+                }
+                // 获取用户的公司
+                if (StringUtils.isNotBlank(user.getCompanyId())) {
+                    rosterBaseDTO.setCompanyId(user.getCompanyId());
+                }
+                // 获取用户角色
+                List<String> userRole = userMapper.getUserRole(user.getId());
+                if (CollectionUtil.isNotEmpty(userRole)) {
+                    rosterBaseDTO.setRoleIdList(userRole);
+                }
+                // 获取用户岗位
+                List<String> userPost = userMapper.getUserPost(user.getId());
+                if (CollectionUtil.isNotEmpty(userPost)) {
+                    rosterBaseDTO.setPostIdList(userPost);
+                }
+                // 获取用户的管理部门
+                if (StringUtils.isNotBlank(user.getManageOfficeIds())) {
+                    rosterBaseDTO.setManageOfficeIds(user.getManageOfficeIds());
+                }
+            }
+            rosterBaseDTO.setCertDTOList(certDTOList);
         }
         return rosterBaseDTO;
     }
@@ -148,12 +199,35 @@ public class RosterBaseService extends ServiceImpl<RosterBaseMapper, RosterBase>
 
         if(ObjectUtil.isNotEmpty(rosterBaseDTO)){
             if(StringUtils.isNotBlank(rosterBaseDTO.getId())){
+                RosterBase byId = this.getById(rosterBaseDTO.getId());
+                // 原数据的人员类型为员工,现在要修改成游客,那么就要将原数据关联的用户删除掉
+                if ("1".equals(byId.getPersonType()) && "2".equals(rosterBaseDTO.getPersonType())) {
+                    // 通过花名册id查询用户
+                    List<User> ulist = userService.list(new QueryWrapper<User>().lambda().eq(User::getRosterId, rosterBaseDTO.getId()));
+                    if (CollectionUtil.isNotEmpty(ulist)) {
+                        ulist.stream().forEach(i -> {
+                            // 通过花名册id删除用户
+                            userService.removeById(i.getId());
+                            UserDTO u = new UserDTO();
+                            u.setId(i.getId());
+                            // 删除用户关联的管理部门信息
+                            userMapper.deleteUserManageOffice(u);  //  根据用户id删除用户的管理部门信息
+                            // 删除用户关联的岗位信息
+                            userMapper.deleteUserPost(i.getId());
+                            // 删除用户关联的角色信息
+                            userMapper.deleteUserRole(i.getId());
+                        });
+                    }
+
+                }
+                // 身份证号唯一验证(排除自己)
                 if(StringUtils.isNotBlank(rosterBaseDTO.getIdCard())){
                     List<RosterBase> rosterBaseList = this.list(new QueryWrapper<RosterBase>().eq("id_card", rosterBaseDTO.getIdCard()).ne("id",rosterBaseDTO.getId()));
                     if(CollectionUtil.isNotEmpty(rosterBaseList)){
                         return ResponseEntity.badRequest().body("基础信息-身份证号 已存在,保存失败");
                     }
                 }
+                // 手机号唯一验证(排除自己)
                 if(StringUtils.isNotBlank(rosterBaseDTO.getMobile())){
                     List<RosterBase> rosterBaseList = this.list(new QueryWrapper<RosterBase>().eq("mobile", rosterBaseDTO.getMobile()).ne("id",rosterBaseDTO.getId()));
                     if(CollectionUtil.isNotEmpty(rosterBaseList)){
@@ -166,13 +240,14 @@ public class RosterBaseService extends ServiceImpl<RosterBaseMapper, RosterBase>
                 //工号生成
                 String serialNum = serialnumTplService.genSerialNum(userDTO.getCompanyDTO().getId(), RosterBaseDTO.BIZ_CODE);
                 rosterBaseDTO.setJobNo(serialNum);
-
+                // 身份证号唯一验证
                 if(StringUtils.isNotBlank(rosterBaseDTO.getIdCard())){
                     List<RosterBase> rosterBaseList = this.list(new QueryWrapper<RosterBase>().eq("id_card", rosterBaseDTO.getIdCard()));
                     if(CollectionUtil.isNotEmpty(rosterBaseList)){
                         return ResponseEntity.badRequest().body("基础信息-身份证号 已存在,保存失败");
                     }
                 }
+                // 手机号唯一验证
                 if(StringUtils.isNotBlank(rosterBaseDTO.getMobile())){
                     List<RosterBase> rosterBaseList = this.list(new QueryWrapper<RosterBase>().eq("mobile", rosterBaseDTO.getMobile()));
                     if(CollectionUtil.isNotEmpty(rosterBaseList)){
@@ -185,8 +260,14 @@ public class RosterBaseService extends ServiceImpl<RosterBaseMapper, RosterBase>
 
         RosterBase rosterBase = RosterBaseWrapper.INSTANCE.toEntity(rosterBaseDTO);
 
+        // 新增或修改花名册数据
         this.saveOrUpdate(rosterBase);
 
+        // 新增或修改用户数据(花名册的人员类型为员工时)
+        if ("1".equals(rosterBase.getPersonType())) {
+            this.saveOrUpdateUser(rosterBase, CommonUtils.getFirstCompanyId());
+        }
+
         if(ObjectUtil.isNotEmpty(rosterBaseDTO)){
             //保存合同信息
             if(ObjectUtil.isNotEmpty(rosterBaseDTO.getRosterContractDTO())){
@@ -296,6 +377,50 @@ public class RosterBaseService extends ServiceImpl<RosterBaseMapper, RosterBase>
             }else{
                 rosterLeadershipService.remove(new QueryWrapper<RosterLeadership>().eq("base_id",rosterBase.getId()));
             }
+            User user = userService.getOne(new QueryWrapper<User>().lambda().eq(User::getRosterId, rosterBase.getId()));
+            if (ObjectUtil.isNotEmpty(user)) {
+                // 保存花名册关联用户的资质信息
+                if(ObjectUtil.isNotEmpty(rosterBaseDTO.getCertDTOList())){
+                    certService.remove(new QueryWrapper<Cert>().lambda().eq(Cert::getUserId,user.getId()));
+                    List<Cert> certList = new ArrayList<>();
+                    rosterBaseDTO.getCertDTOList().stream().forEach(i -> {
+                        Cert cert = CertWrapper.INSTANCE.toEntity(i);
+                        cert.setUserId(user.getId());
+                        cert.setId("");
+                        certList.add(cert);
+                    });
+                    if (CollectionUtil.isNotEmpty(certList)) {
+                        certService.saveBatch(certList);
+                    }
+                }
+                // 保存花名册关联用户的角色
+                userMapper.deleteUserRole(user.getId());  //  删除用户的角色
+                if (CollectionUtil.isNotEmpty(rosterBaseDTO.getRoleIdList())) {
+                    rosterBaseDTO.getRoleIdList().stream().forEach(i -> {
+                        userMapper.insertUserRole(user.getId(), i);  // 插入用户的角色
+                    });
+                }
+                // 保存花名册关联用户的岗位
+                userMapper.deleteUserPost(user.getId());  //  删除用户的岗位
+                if (CollectionUtil.isNotEmpty(rosterBaseDTO.getPostIdList())) {
+                    rosterBaseDTO.getPostIdList().stream().forEach(i -> {
+                        userMapper.insertUserPost(user.getId(), i);  // 插入用户的岗位
+                    });
+                }
+                // 保存花名册关联用户的管理部门
+                UserDTO u = new UserDTO();
+                u.setId(user.getId());
+                userMapper.deleteUserManageOffice(u);  //  删除用户的管理部门 (用户、管理部门关联表)
+                String oIds = "";
+                if (StringUtils.isNotBlank(rosterBaseDTO.getManageOfficeIds())) {
+                    List<String> officeIds= Arrays.asList(rosterBaseDTO.getManageOfficeIds().split(","));
+                    officeIds.stream().forEach(officeId -> {
+                        userMapper.insertUserManageOffice(officeId,user.getId());  // 插入用户的管理部门 (用户、管理部门关联表)
+                    });
+                    oIds = rosterBaseDTO.getManageOfficeIds();
+                }
+                userMapper.updateUserManageOffice(oIds, user.getId()); // 修改用户的管理部门 (用户表)
+            }
         }
         return ResponseEntity.ok("花名册保存成功");
     }
@@ -310,57 +435,111 @@ public class RosterBaseService extends ServiceImpl<RosterBaseMapper, RosterBase>
             //去除excel中的空行
             list = getExcelList(list);
             for (RosterBaseDTO rosterBaseDTO : list) {
+                // 姓名为必填项
                 if (StringUtils.isBlank(rosterBaseDTO.getName())) {
                     return ResponseEntity.badRequest().body ("导入花名册失败!文件中有姓名未填写");
                 }
-                // 查询这个人员姓名是否存在,已存在则抛出提示
-                List<RosterBase> rs = this.list(new QueryWrapper<RosterBase>().lambda().eq(RosterBase::getName, rosterBaseDTO.getName()));
-                if (CollectionUtil.isNotEmpty(rs)) {
-                    return ResponseEntity.badRequest().body ("导入花名册失败!人员“"+ rosterBaseDTO.getName() +"”已存在");
+                // 姓名唯一验证
+//                List<RosterBase> rs = this.list(new QueryWrapper<RosterBase>().lambda().eq(RosterBase::getName, rosterBaseDTO.getName()));
+//                if (CollectionUtil.isNotEmpty(rs)) {
+//                    return ResponseEntity.badRequest().body ("导入花名册失败!人员“"+ rosterBaseDTO.getName() +"”已存在,请重新填写");
+//                }
+
+                // 人员类型必填
+                if (StringUtils.isBlank(rosterBaseDTO.getPersonType())) {
+                    return ResponseEntity.badRequest().body ("导入花名册失败!文件中有人员类型未填写");
                 }
-                if (StringUtils.isBlank(rosterBaseDTO.getOfficeName())) {
-                    return ResponseEntity.badRequest().body ("导入花名册失败!文件中有部门未填写");
+                // 验证人员类型填写是否符合要求
+                String personType = DictUtils.getDictValue(rosterBaseDTO.getPersonType(), "roster_person_type","null");
+                if ("null".equals(personType)) {
+                    return ResponseEntity.badRequest().body ("导入花名册失败!文件中有人员类型填写错误,请重新填写");
                 }
-                // 查询这个部门是否存在于当前系统中,不存在则不进行导入数据操作,抛出提示
-                List<Office> officeList = officeService.list(new QueryWrapper<Office>().lambda().eq(Office::getType, OfficeTypeEnum.OFFICE.getValue()).eq(Office::getName, rosterBaseDTO.getOfficeName()));
-                if (CollectionUtil.isEmpty(officeList)) {
-                    return ResponseEntity.badRequest().body("导入花名册失败!文件中含有不存在的部门,请重新填写");
+                // 人员类型转换
+                rosterBaseDTO.setPersonType(personType);
+
+                // 人员类型为员工
+                if ("1".equals(personType)) {
+                    if (StringUtils.isBlank(rosterBaseDTO.getOfficeName())) {
+                        return ResponseEntity.badRequest().body ("导入花名册失败!人员类型为员工的时候,部门为必填项");
+                    }
+                    if (StringUtils.isBlank(rosterBaseDTO.getCertificatesType())) {
+                        return ResponseEntity.badRequest().body ("导入花名册失败!人员类型为员工的时候,证件类型为必填项");
+                    }
+                    if (StringUtils.isBlank(rosterBaseDTO.getIdCard())) {
+                        return ResponseEntity.badRequest().body ("导入花名册失败!人员类型为员工的时候,证件号为必填项");
+                    }
+                    if (StringUtils.isBlank(rosterBaseDTO.getWorkerType())) {
+                        return ResponseEntity.badRequest().body ("导入花名册失败!人员类型为员工的时候,员工类型为必填项");
+                    }
+                } else {
+                    // 人员类型为 游客 的时候,不填写部门和员工类型
+                    rosterBaseDTO.setOfficeName("");
+                    rosterBaseDTO.setWorkerType("");
                 }
-                // 部门填写符合要求,将部门名字转换为部门id
-                rosterBaseDTO.setOfficeId(officeList.get(0).getId());
-                if (StringUtils.isBlank(rosterBaseDTO.getCertificatesType())) {
-                    return ResponseEntity.badRequest().body ("导入花名册失败!文件中有证件类型未填写");
+
+                if (StringUtils.isNotBlank(rosterBaseDTO.getOfficeName())) {
+                    // 查询这个部门是否存在于当前系统中,不存在则不进行导入数据操作,抛出提示
+                    List<Office> officeList = officeService.list(new QueryWrapper<Office>().lambda().eq(Office::getType, OfficeTypeEnum.OFFICE.getValue()).eq(Office::getName, rosterBaseDTO.getOfficeName()));
+                    if (CollectionUtil.isEmpty(officeList)) {
+                        return ResponseEntity.badRequest().body("导入花名册失败!文件中的部门”" + rosterBaseDTO.getOfficeName() + "“不存在,请重新填写");
+                    }
+                    // 部门填写符合要求,将部门名字转换为部门id
+                    rosterBaseDTO.setOfficeId(officeList.get(0).getId());
                 }
-                // 验证证件类型填写是否符合要求
-                String certificatesType = DictUtils.getDictValue(rosterBaseDTO.getCertificatesType(), "certificates_type","null");
-                if ("null".equals(certificatesType)) {
-                    return ResponseEntity.badRequest().body ("导入花名册失败!文件中有证件类型填写错误,请重新填写");
+
+                if (StringUtils.isNotBlank(rosterBaseDTO.getCertificatesType())) {
+                    // 验证证件类型填写是否符合要求
+                    String certificatesType = DictUtils.getDictValue(rosterBaseDTO.getCertificatesType(), "certificates_type","null");
+                    if ("null".equals(certificatesType)) {
+                        return ResponseEntity.badRequest().body ("导入花名册失败!文件中有证件类型填写错误,请重新填写");
+                    }
+                    // 证件类型转换
+                    rosterBaseDTO.setCertificatesType(certificatesType);
                 }
-                // 证件类型转换
-                rosterBaseDTO.setCertificatesType(certificatesType);
-                if (StringUtils.isBlank(rosterBaseDTO.getIdCard())) {
-                    return ResponseEntity.badRequest().body ("导入花名册失败!文件中有证件号未填写");
+
+                if (StringUtils.isNotBlank(rosterBaseDTO.getIdCard())) {
+                    // 证件号唯一验证
+                    List<RosterBase> rosterBaseList = this.list(new QueryWrapper<RosterBase>().eq("id_card", rosterBaseDTO.getIdCard()));
+                    if(CollectionUtil.isNotEmpty(rosterBaseList)){
+                        return ResponseEntity.badRequest().body("导入花名册失败!文件中证件号”" + rosterBaseDTO.getIdCard() + "“已存在,请重新填写");
+                    }
                 }
+
+                // 电话号码必填
                 if (StringUtils.isBlank(rosterBaseDTO.getMobile())) {
                     return ResponseEntity.badRequest().body ("导入花名册失败!文件中有电话号码未填写");
                 }
-                if (StringUtils.isBlank(rosterBaseDTO.getWorkerType())) {
-                    return ResponseEntity.badRequest().body ("导入花名册失败!文件中有员工类型未填写");
+                // 电话号码唯一验证
+                List<RosterBase> mobileList = this.list(new QueryWrapper<RosterBase>().lambda().eq(RosterBase::getMobile, rosterBaseDTO.getMobile()));
+                if (CollectionUtil.isNotEmpty(mobileList)) {
+                    return ResponseEntity.badRequest().body ("导入花名册失败!文件中有电话号码已存在,请重新填写");
                 }
-                // 验证员工类型填写是否符合要求
-                String workerType = DictUtils.getDictValue(rosterBaseDTO.getWorkerType(), "worker_type","null");
-                if ("null".equals(workerType)) {
-                    return ResponseEntity.badRequest().body ("导入花名册失败!文件中有员工类型填写错误,请重新填写");
+
+                if (StringUtils.isNotBlank(rosterBaseDTO.getWorkerType())) {
+                    // 验证员工类型填写是否符合要求
+                    String workerType = DictUtils.getDictValue(rosterBaseDTO.getWorkerType(), "worker_type","null");
+                    if ("null".equals(workerType)) {
+                        return ResponseEntity.badRequest().body ("导入花名册失败!文件中有员工类型填写错误,请重新填写");
+                    }
+                    // 员工类型转换
+                    rosterBaseDTO.setWorkerType(workerType);
                 }
-                // 员工类型转换
-                rosterBaseDTO.setWorkerType(workerType);
-                // 新增数据
+
+                // 生成最终数据
                 RosterBase rosterBase = RosterBaseWrapper.INSTANCE.toEntity(rosterBaseDTO);
                 rosterList.add(rosterBase);
                 successNum++;
             }
             if (CollectionUtil.isNotEmpty(rosterList)) {
+                String companyId = CommonUtils.getFirstCompanyId();
+                // 批量新增花名册数据
                 this.saveBatch(rosterList);
+                rosterList.stream().forEach(r -> {
+                    // 人员类型为员工时,同步新增用户信息
+                    if ("1".equals(r.getPersonType())) {
+                        this.saveOrUpdateUser(r, companyId);
+                    }
+                });
             }
             return ResponseEntity.ok ( "已成功导入 " + successNum + " 条数据" );
         } catch (Exception e) {
@@ -384,4 +563,55 @@ public class RosterBaseService extends ServiceImpl<RosterBaseMapper, RosterBase>
 
         return rosterBaseDTOS;
     }
+
+
+    /**
+     * 新增或修改花名册的时候,同步创建或修改用户数据
+     */
+    public void saveOrUpdateUser (RosterBase rosterBase,String companyId) {
+        User user = new User();
+        user.setRosterId(rosterBase.getId());  // 花名册id
+        user.setOfficeId(rosterBase.getOfficeId());  //  部门
+        user.setMobile(rosterBase.getMobile());  //  电话号码
+        user.setName(rosterBase.getName());  //  姓名
+        user.setLoginName(rosterBase.getName());  //  登录名
+        user.setNo(rosterBase.getJobNo());  //  工号
+        if (StringUtils.isNotBlank(rosterBase.getEmail())) {
+            user.setEmail(rosterBase.getEmail()); // 邮箱
+        }
+        if (StringUtils.isNotBlank(rosterBase.getCompanyId())) { // 公司
+            user.setCompanyId(rosterBase.getCompanyId());
+        } else {
+            user.setCompanyId(companyId);  // 默认给第一个公司
+        }
+        //  根据花名册id查询用户信息
+        User u = userService.getOne(new QueryWrapper<User>().lambda().eq(User::getRosterId, rosterBase.getId()));
+        if (ObjectUtil.isNotEmpty(u)) {
+            user.setId(u.getId());  //  用户id
+            user.setUpPassword("1");  //  密码修改状态改为 ”已修改“
+        } else {
+            user.setLoginFlag("1");  //  是否允许登录     默认直接给 “1” 允许登录
+            user.setPassword(SecurityUtils.encryptPassword("123456"));  //  密码     默认密码 “123456”
+        }
+        userService.saveOrUpdate(user);
+    }
+
+    public ResponseEntity removeByRosterIds(String[] ids) {
+        // 删除花名册数据
+        this.removeByIds(Arrays.asList(ids));
+        // 删除花名册关联用户数据
+        // 员工切换为游客、花名册直接删除   这两种情况都要删除用户信息以及用户关联的角色等信息
+        userService.remove(new QueryWrapper<User>().lambda().in(User::getRosterId, ids));
+        Arrays.asList(ids).stream().forEach(item -> {
+            UserDTO u = new UserDTO();
+            u.setId(item);
+            // 删除用户关联的管理部门信息
+            userMapper.deleteUserManageOffice(u);  //  根据用户id删除用户的管理部门信息
+            // 删除用户关联的岗位信息
+            userMapper.deleteUserPost(item);
+            // 删除用户关联的角色信息
+            userMapper.deleteUserRole(item);
+        });
+        return ResponseEntity.ok ("删除花名册成功");
+    }
 }

+ 39 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/roster/service/dto/RosterBaseDTO.java

@@ -1,12 +1,23 @@
 package com.jeeplus.test.roster.service.dto;
 
 import cn.afterturn.easypoi.excel.annotation.Excel;
+import cn.afterturn.easypoi.excel.annotation.ExcelCollection;
+import cn.afterturn.easypoi.excel.annotation.ExcelEntity;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.jeeplus.core.domain.BaseEntity;
+import com.jeeplus.core.query.Query;
+import com.jeeplus.core.query.QueryType;
 import com.jeeplus.core.service.dto.BaseDTO;
+import com.jeeplus.sys.service.dto.CertDTO;
+import com.jeeplus.sys.service.dto.OfficeDTO;
+import com.jeeplus.sys.service.dto.PostDTO;
+import com.jeeplus.sys.service.dto.RoleDTO;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import javax.validation.constraints.NotNull;
 import java.util.Date;
 import java.util.List;
 
@@ -291,5 +302,33 @@ public class RosterBaseDTO extends BaseDTO {
     @Excel(name = "部门",width = 25,orderNum = "2")
     private String officeName;
 
+    /**
+     * 人员类型  1员工  2游客
+     */
+    @Excel(name="人员类型",width = 25,orderNum = "7",dict = "roster_person_type",addressList = true)
+    private String personType;
+
+    /**
+     * 执业资格证列表
+     */
+    private List<CertDTO> certDTOList;
+
+    /**
+     * 角色信息
+     */
+    private List<String> roleIdList;
+
+    /**
+     * 岗位信息
+     */
+    private List<String> postIdList;
+
+    /**
+     * 管理的部门名称
+     */
+    private String manageOfficeIds;
+
+
+
     private static final long serialVersionUID = 1L;
 }

+ 6 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/controller/OfficeController.java

@@ -132,5 +132,11 @@ public class OfficeController {
         return ResponseEntity.ok (result);
     }
 
+    @ApiLog("查询全部集团")
+    @GetMapping("get_all_company")
+    public ResponseEntity<List<OfficeDTO>> getAllCompany() {
+        List<OfficeDTO> result = officeService.getAllCompany();
+        return ResponseEntity.ok (result);
+    }
 
 }

+ 2 - 2
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/controller/RoleController.java

@@ -184,7 +184,7 @@ public class RoleController {
 	@ApiLog("从角色中移除用户")
 	@PreAuthorize("hasAuthority('sys:role:assign')")
 	@DeleteMapping("removeUserFromRole")
-	public ResponseEntity removeUserFromRole(String userId, String roleId) {
+	public ResponseEntity removeUserFromRole(String userId, String roleId) throws Exception {
 		RoleDTO role = roleService.get(roleId);
 		UserDTO user = userService.get(userId);
 		if (UserUtils.getCurrentUserDTO ().getId().equals(userId) && !UserUtils.getCurrentUserDTO ().isAdmin ()) {
@@ -213,7 +213,7 @@ public class RoleController {
 	@ApiLog("添加用户到角色")
 	@PreAuthorize("hasAuthority('sys:role:assign')")
 	@PutMapping("addUserToRole")
-	public ResponseEntity addUserToRole(String roleId, String[] userIds) {
+	public ResponseEntity addUserToRole(String roleId, String[] userIds) throws Exception {
 		StringBuilder msg = new StringBuilder();
 		int newNum = 0;
 		RoleDTO roleDTO = roleService.get ( roleId );

+ 3 - 7
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/controller/UserController.java

@@ -223,7 +223,7 @@ public class UserController {
     @PreAuthorize("hasAnyAuthority('sys:user:add', 'sys:user:edit')")
     @ApiOperation(value = "保存用户")
     @PostMapping("save")
-    public ResponseEntity save(@Valid @RequestBody UserDTO userDTO) {
+    public ResponseEntity save(@Valid @RequestBody UserDTO userDTO) throws Exception {
         // 如果新密码为空,则不更换密码
         if ( StrUtil.isNotBlank ( userDTO.getNewPassword ( ) ) ) {
             userDTO.setPassword ( SecurityUtils.encryptPassword ( userDTO.getNewPassword ( ) ) );
@@ -278,7 +278,7 @@ public class UserController {
     @ApiLog("修改个人资料")
     @ApiOperation(value = "修改个人资料")
     @PostMapping("saveInfo")
-    public ResponseEntity saveInfo(@RequestBody UserDTO userDTO) {
+    public ResponseEntity saveInfo(@RequestBody UserDTO userDTO) throws Exception {
         //修改用户信息
         //判断参数中手机号是否存在
         if(StringUtils.isNotBlank(userDTO.getMobile())){
@@ -288,11 +288,7 @@ public class UserController {
                 return ResponseEntity.badRequest ( ).body ( "修改个人资料失败! 该手机号已存在,无法修改!" );
             }
         }
-        userService.updateById ( UserWrapper.INSTANCE.toEntity ( userDTO ) );
-
-        //更新缓存信息
-        UserUtils.deleteCache ( UserUtils.getCurrentUserDTO ( ) );
-        return ResponseEntity.ok ( "修改个人资料成功!" );
+        return userService.updateInfo(userDTO);
     }
 
     /**

+ 230 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/domain/RosterBaseC.java

@@ -0,0 +1,230 @@
+package com.jeeplus.sys.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import com.jeeplus.core.query.Query;
+import com.jeeplus.core.query.QueryType;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+/**
+ * roster_base
+ * @author 
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("roster_base")
+public class RosterBaseC extends BaseEntity {
+
+    /**
+     * 备注信息
+     */
+    private String remarks;
+
+    /**
+     * 姓名
+     */
+    @Query(type = QueryType.LIKE, tableColumn = "rb.name")
+    private String name;
+
+    /**
+     * 部门id
+     */
+    private String officeId;
+
+    /**
+     * 职位id
+     */
+    private String jobPositionId;
+
+    /**
+     * 职务id
+     */
+    private String positionId;
+
+    /**
+     * 职级id
+     */
+    private String rankId;
+
+    /**
+     * 工号
+     */
+    private String jobNo;
+
+    /**
+     * 证件类型
+     */
+    private String certificatesType;
+
+    /**
+     * 证件号
+     */
+    @Query(type = QueryType.LIKE, tableColumn = "rb.id_card")
+    private String idCard;
+
+    /**
+     * 证件照正面
+     */
+    private String certificatesFront;
+
+    /**
+     * 证件照反面
+     */
+    private String certificatesBack;
+
+    /**
+     * 手机号码
+     */
+    private String mobile;
+
+    /**
+     * 合同类型
+     */
+    private String contractType;
+
+    /**
+     * 员工类型
+     */
+    @Query(type = QueryType.EQ, tableColumn = "rb.worker_type")
+    private String workerType;
+
+    /**
+     * 入职日期
+     */
+    private Date onboardingDate;
+
+    /**
+     * 历史工龄
+     */
+    private String seniority;
+
+    /**
+     * 合同公司
+     */
+    private String contractCompany;
+
+    /**
+     * 性别
+     */
+    private String sex;
+
+    /**
+     * 出生日期
+     */
+    private Date birthDate;
+
+    /**
+     * 工作地点
+     */
+    private String workPlace;
+
+    /**
+     * 联系地址
+     */
+    private String contactAddress;
+
+    /**
+     * 入职年度就业情形
+     */
+    private String employmentSituation;
+
+    /**
+     * 工时制度
+     */
+    private String workingHour;
+
+    /**
+     * 民族
+     */
+    private String ethnic;
+
+    /**
+     * 户口类型
+     */
+    private String accountType;
+
+    /**
+     * 户口所在地
+     */
+    private String accountAddr;
+
+    /**
+     * 籍贯
+     */
+    private String origin;
+
+    /**
+     * 居住地址
+     */
+    private String liveAddr;
+
+    /**
+     * 最高学历
+     */
+    private String highestEducation;
+
+    /**
+     * 政治面貌
+     */
+    private String politicalFace;
+
+    /**
+     * 婚姻状况
+     */
+    private String maritalStatus;
+
+    /**
+     * 血型
+     */
+    private String bloodType;
+
+    /**
+     * 紧急联系人姓名
+     */
+    private String emergencyContactName;
+
+    /**
+     * 紧急联系人电话
+     */
+    private String emergencyContactTel;
+
+    /**
+     * 配偶姓名
+     */
+    private String spouseName;
+
+    /**
+     * 孩子姓名
+     */
+    private String childName;
+
+    /**
+     * QQ
+     */
+    private String qq;
+
+    /**
+     * 微信
+     */
+    private String wechat;
+
+    /**
+     * 个人邮箱
+     */
+    private String email;
+
+    /**
+     * 头像
+     */
+    private String headshot;
+
+    /**
+     * 人员类型  1员工  2游客
+     */
+    private String personType;
+
+    private static final long serialVersionUID = 1L;
+}

+ 64 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/domain/SysSerialnumTplC.java

@@ -0,0 +1,64 @@
+package com.jeeplus.sys.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import com.jeeplus.core.query.Query;
+import lombok.Data;
+
+@Data
+@TableName(value = "sys_serialnum_tpl")
+public class SysSerialnumTplC extends BaseEntity {
+
+    /**
+     * 公司id
+     */
+    @TableField(value = "company_id")
+    private String companyId;
+
+    /**
+     * 业务标识
+     */
+    @TableField(value = "biz_code")
+    private String bizCode;
+
+    /**
+     * 年度
+     */
+    @TableField(value = "year_built")
+    private String yearBuilt;
+
+    /**
+     * 序列号
+     */
+    @TableField(value = "serial_num")
+    private Integer serialNum;
+
+    /**
+     * 编号模板
+     */
+    @TableField(value = "serial_tpl")
+    private String serialTpl;
+
+    /**
+     * 序列号长度
+     */
+    @TableField(value = "serial_num_len")
+    private Integer serialNumLen;
+
+    /**
+     * 模板名称
+     */
+    @Query
+    @TableField(value = "tpl_name")
+    private String tplName;
+
+    /**
+     * 模板示例
+     */
+    @TableField(value = "serial_tpl_ex")
+    private String serialTplEx;
+
+    @TableField(exist = false)
+    private String companyName;
+}

+ 6 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/domain/User.java

@@ -6,8 +6,10 @@ package com.jeeplus.sys.domain;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.jeeplus.core.domain.BaseEntity;
 import com.jeeplus.core.query.Query;
+import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
 
 import java.util.Date;
 
@@ -20,6 +22,8 @@ import java.util.Date;
 @Data
 @EqualsAndHashCode(callSuper = false)
 @TableName("sys_user")
+@NoArgsConstructor
+@AllArgsConstructor
 public class User extends BaseEntity {
 
     private static final long serialVersionUID = 1L;
@@ -118,6 +122,8 @@ public class User extends BaseEntity {
 
     private String manageOfficeIds;   //管理的部门id
 
+    private String rosterId;   // 花名册id
+
     /**
      * 构造函数
      */

+ 9 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/mapper/RosterBaseCMapper.java

@@ -0,0 +1,9 @@
+package com.jeeplus.sys.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.sys.domain.RosterBaseC;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface RosterBaseCMapper extends BaseMapper<RosterBaseC> {
+}

+ 20 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/mapper/SerialnumTplCMapper.java

@@ -0,0 +1,20 @@
+package com.jeeplus.sys.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.sys.domain.SysSerialnumTplC;
+import org.apache.ibatis.annotations.Param;
+
+public interface SerialnumTplCMapper extends BaseMapper<SysSerialnumTplC> {
+
+    IPage<SysSerialnumTplC> pageList(Page<SysSerialnumTplC> page, @Param(Constants.WRAPPER) QueryWrapper queryWrapper);
+
+    SysSerialnumTplC queryByComAndBizCode(@Param("id")String id, @Param("bizCode")String bizCode);
+
+    void resetSerialNum(@Param("id")String id,@Param("yearBuilt")String yearBuilt,@Param("newYear")String newYear);
+
+    int updateSerialNum(SysSerialnumTplC numTpl);
+}

+ 24 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/mapper/UserMapper.java

@@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jeeplus.sys.service.dto.OfficeDTO;
+import com.jeeplus.sys.service.dto.PostDTO;
 import com.jeeplus.sys.service.dto.UserDTO;
 import com.jeeplus.sys.domain.User;
 import org.apache.ibatis.annotations.Delete;
@@ -198,4 +199,27 @@ public interface UserMapper extends BaseMapper<User> {
      */
     void insertUserManageOffice(@Param("officeId") String officeId,@Param("userId") String userId);
 
+    /**
+     * 修改用户的公司
+     */
+    void updateUserCompany(@Param("companyId") String companyId,@Param("userId") String userId);
+
+    /**
+     * 根据用户id获取关联的岗位
+     * @param userId
+     * @return
+     */
+    List<String> getUserPost(@Param("userId") String userId);
+
+    /**
+     * 根据用户id获取关联的角色
+     * @param userId
+     * @return
+     */
+    List<String> getUserRole(@Param("userId") String userId);
+
+    /**
+     * 修改用户的管理部门
+     */
+    void updateUserManageOffice(@Param("officeIds") String officeIds,@Param("userId") String userId);
 }

+ 38 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/mapper/xml/SerialnumTplCMapper.xml

@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jeeplus.sys.mapper.SerialnumTplCMapper">
+
+	<select id="pageList" resultType="com.jeeplus.sys.domain.SysSerialnumTplC">
+		SELECT
+			a.id,
+			a.tpl_name,
+			(SELECT b.`name` FROM sys_office b WHERE b.del_flag = 0 AND b.id = a.company_id ) AS company_name,
+			a.biz_code,
+			a.serial_num_len,
+			a.serial_tpl_ex
+		FROM
+			sys_serialnum_tpl a
+		${ew.customSqlSegment}
+		ORDER BY create_date DESC
+	</select>
+
+	<select id="queryByComAndBizCode" resultType="com.jeeplus.sys.domain.SysSerialnumTplC">
+		select	a.*
+		 from sys_serialnum_tpl a
+		where a.company_id = #{id} and a.biz_code = #{bizCode} and a.del_flag = 0
+		order by update_date desc
+		limit 1
+	</select>
+
+	<update id="resetSerialNum">
+		UPDATE sys_serialnum_tpl
+		SET serial_num = 0 , year_built = #{newYear}
+		WHERE id = #{id} AND  year_built = #{yearBuilt}
+	</update>
+
+	<update id="updateSerialNum">
+		UPDATE sys_serialnum_tpl
+		SET serial_num = serial_num +1
+		WHERE id = #{id}
+	</update>
+</mapper>

+ 27 - 1
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/mapper/xml/UserMapper.xml

@@ -25,6 +25,7 @@
 		<result property="officeDTO.name" column="officeDTO.name" />
 		<result property="officeDTO.parentIds" column="officeDTO.parentIds" />
 		<result property="officeDTO.isPublic" column="officeDTO.isPublic"></result>
+		<result property="rosterId" column="roster_id"></result>
 		<collection property="roleDTOList" javaType="java.util.List" ofType="com.jeeplus.sys.service.dto.RoleDTO">
 			<id property="id" column="roleDTO.id" />
 			<result property="name" column="roleDTO.name"/>
@@ -67,7 +68,8 @@
     	o.name AS "officeDTO.name",
     	o.parent_id AS "officeDTO.parent.id",
     	o.parent_ids AS "officeDTO.parentIds",
-    	o.is_public AS "officeDTO.isPublic"
+    	o.is_public AS "officeDTO.isPublic",
+    	a.roster_id
     </sql>
 	<sql id="Cert_Column_List">
         cert.id,
@@ -363,4 +365,28 @@
 		insert sys_user_manage_office(user_id, office_id) VALUES (#{userId}, #{officeId})
 	</insert>
 
+	<update id="updateUserCompany">
+		update sys_user set company_id = #{companyId} where id = #{userId}
+	</update>
+
+	<select id="getUserPost" resultType="string">
+		select
+		sup.post_id
+		from sys_user_post sup
+		inner join sys_post p on sup.post_id = p.id and p.del_flag = 0
+		where sup.user_id = #{userId}
+	</select>
+
+	<select id="getUserRole" resultType="string">
+		select
+		sur.role_id
+		from sys_user_role sur
+		inner join sys_role r on sur.role_id = r.id and r.del_flag = 0
+		where sur.user_id = #{userId}
+	</select>
+
+	<update id="updateUserManageOffice">
+		update sys_user set manage_office_ids = #{officeIds} where id = #{userId}
+	</update>
+
 </mapper>

+ 10 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/service/OfficeService.java

@@ -375,4 +375,14 @@ public class OfficeService extends TreeService<OfficeMapper, Office> {
        return officeMapper.getOfficeIdByNames(nameList);
     }
 
+    public List<OfficeDTO> getAllCompany() {
+        Page<OfficeDTO> page = new Page<>();
+        page.setSize(-1);
+        page.setCurrent(1);
+        QueryWrapper<OfficeDTO> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("so.del_flag","0");
+        queryWrapper.eq("so.parent_id","0");  // parent_id 为 “0”
+        queryWrapper.orderByDesc("so.name");
+        return officeMapper.findList(page, queryWrapper).getRecords();
+    }
 }

+ 2 - 2
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/service/RoleService.java

@@ -121,7 +121,7 @@ public class RoleService extends ServiceImpl<RoleMapper, Role> {
      * @param userDTO
      * @return
      */
-    public Boolean removeUserFromRole(RoleDTO roleDTO, UserDTO userDTO) {
+    public Boolean removeUserFromRole(RoleDTO roleDTO, UserDTO userDTO) throws Exception {
         List<RoleDTO> roleDTOList = userDTO.getRoleDTOList ();
         for (RoleDTO e : roleDTOList) {
             if (e.getId().equals(roleDTO.getId())) {
@@ -139,7 +139,7 @@ public class RoleService extends ServiceImpl<RoleMapper, Role> {
      * @param userDTO
      * @return
      */
-    public UserDTO addUserToRole(RoleDTO roleDTO, UserDTO userDTO) {
+    public UserDTO addUserToRole(RoleDTO roleDTO, UserDTO userDTO) throws Exception {
         if (userDTO == null) {
             return null;
         }

+ 14 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/service/RosterBaseCService.java

@@ -0,0 +1,14 @@
+package com.jeeplus.sys.service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jeeplus.sys.domain.RosterBaseC;
+import com.jeeplus.sys.mapper.RosterBaseCMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class RosterBaseCService extends ServiceImpl<RosterBaseCMapper, RosterBaseC> {
+
+
+}

+ 293 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/service/SerialnumTplCService.java

@@ -0,0 +1,293 @@
+package com.jeeplus.sys.service;
+
+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.jeeplus.sys.domain.Office;
+import com.jeeplus.sys.domain.SysSerialnumTplC;
+import com.jeeplus.sys.mapper.OfficeMapper;
+import com.jeeplus.sys.mapper.SerialnumTplCMapper;
+import com.jeeplus.sys.service.dto.UserDTO;
+import com.jeeplus.sys.utils.StringUtils;
+import com.jeeplus.sys.utils.UserUtils;
+import org.apache.http.client.utils.DateUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+@Service
+public class SerialnumTplCService {
+
+    @Resource
+    private SerialnumTplCMapper serialnumTplCMapper;
+
+    @Resource
+    private OfficeMapper officeMapper;
+
+    public IPage<SysSerialnumTplC> list(Page<SysSerialnumTplC> page, QueryWrapper<SysSerialnumTplC> sysSerialnumTplQueryWrapper) {
+        sysSerialnumTplQueryWrapper.eq("del_flag", 0);
+        IPage<SysSerialnumTplC> list = serialnumTplCMapper.pageList(page, sysSerialnumTplQueryWrapper);
+        return list;
+    }
+
+    public String remove(String id) {
+        serialnumTplCMapper.deleteById(id);
+        return "操作成功";
+    }
+
+    public SysSerialnumTplC findById(String id) {
+        SysSerialnumTplC sysSerialnumTplC = serialnumTplCMapper.selectById(id);
+        return sysSerialnumTplC;
+    }
+
+    public String save(SysSerialnumTplC sysSerialnumTplC) {
+        //获取当前登录人信息
+        UserDTO dto = UserUtils.getCurrentUserDTO();
+        //新增
+        if (StringUtils.isEmpty(sysSerialnumTplC.getId())) {
+            String id = UUID.randomUUID().toString().replace("-", "");
+            sysSerialnumTplC.setId(id);
+            sysSerialnumTplC.setCreateBy(dto.getId());
+            sysSerialnumTplC.setCreateDate(new Date());
+            sysSerialnumTplC.setUpdateBy(dto.getId());
+            sysSerialnumTplC.setUpdateDate(new Date());
+            sysSerialnumTplC.setDelFlag(0);
+            serialnumTplCMapper.insert(sysSerialnumTplC);
+        }
+        //修改
+        if (StringUtils.isNotEmpty(sysSerialnumTplC.getId())) {
+            sysSerialnumTplC.setUpdateBy(dto.getId());
+            sysSerialnumTplC.setUpdateDate(new Date());
+            serialnumTplCMapper.updateById(sysSerialnumTplC);
+        }
+        return "操作完成";
+    }
+
+    @Transactional(readOnly = false,propagation = Propagation.REQUIRES_NEW)
+    public String genSerialNum(String companyId, String bizCode) throws Exception {
+        //获取当前登录人信息
+        UserDTO dto = UserUtils.getCurrentUserDTO();
+        Office office = officeMapper.selectById(companyId);
+        if (StringUtils.isBlank(bizCode)){
+            throw new Exception("生成编号失败,业务类型不能为空");
+        }
+        if (office != null) {
+            SysSerialnumTplC numTpl = this.querySerialTpl(office, bizCode);
+            if (numTpl == null) {
+                //查询编号模板   {brspnm}DZ-{year}-{serialNum}
+                SysSerialnumTplC serialNumTpl = serialnumTplCMapper.queryByComAndBizCode(companyId, bizCode);
+                serialNumTpl.setCompanyId(companyId);
+                serialNumTpl.setSerialNum(0);
+                serialNumTpl.setCreateBy(dto.getId());
+                serialNumTpl.setId(UUID.randomUUID().toString().replace("-", ""));
+                serialnumTplCMapper.insert(serialNumTpl);
+                numTpl = serialNumTpl;
+            }
+            if (numTpl == null) {
+                throw new Exception("生成编号失败,请先设置相关业务编号模板");
+            }
+            String year = DateUtils.formatDate(new Date(), "yyyy");
+            if (!year.equals(numTpl.getYearBuilt())) {
+                serialnumTplCMapper.resetSerialNum(numTpl.getId(), numTpl.getYearBuilt(), year);
+            }
+            Map<String, String> map = new HashMap<>();
+            String serialTpl = numTpl.getSerialTpl();
+            int i = serialnumTplCMapper.updateSerialNum(numTpl);
+            if (i != 1) {
+                throw new Exception("生成编号失败,请稍后重试");
+            }
+            String num = String.valueOf(numTpl.getSerialNum() + 1);
+            StringBuffer sb = new StringBuffer();
+            for (int x = 0; x < (numTpl.getSerialNumLen() - num.length()); x++) {
+                sb.append("0");
+            }
+            sb.append(num);
+            //查询公司简称
+            if (serialTpl.contains("spnm")) {
+                String companyShortname = UserUtils.getSysParam("company_shortname");
+                map.put("spnm", StringUtils.isBlank(companyShortname) ? "" : companyShortname);
+            }
+            //查询分公司简称
+            if (serialTpl.contains("brspnm")) {
+                String branchShortname = UserUtils.getSysParam("branch_shortname");
+                map.put("brspnm", StringUtils.isBlank(branchShortname) ? "" : branchShortname);
+            }
+            //年份
+            if (serialTpl.contains("year")) {
+                map.put("year", year);
+            }
+            //月份
+            if (serialTpl.contains("month")) {
+                int month = new Date().getMonth() + 1;
+                map.put("month", month + "");
+            }
+            //序列号
+            if (serialTpl.contains("serialNum")) {
+                map.put("serialNum", sb.toString());
+            }
+            //日期
+            if (serialTpl.contains("day")) {
+                map.put("day", new Date().getDate() + "");
+            }
+            String serNum = StringUtils.renderString(serialTpl, map);
+            return serNum;
+        }
+        return "";
+    }
+
+    @Transactional(readOnly = false,propagation = Propagation.REQUIRES_NEW)
+    public String genSerialNumNoSort(String companyId, String bizCode) throws Exception {
+        //获取当前登录人信息
+        UserDTO dto = UserUtils.getCurrentUserDTO();
+        Office office = officeMapper.selectById(companyId);
+        if (StringUtils.isBlank(bizCode)){
+            throw new Exception("生成编号失败,业务类型不能为空");
+        }
+        if (office != null) {
+            SysSerialnumTplC numTpl = this.querySerialTpl(office, bizCode);
+            if (numTpl == null) {
+                //查询编号模板   {brspnm}DZ-{year}-{serialNum}
+                SysSerialnumTplC serialNumTpl = serialnumTplCMapper.queryByComAndBizCode(companyId, bizCode);
+                serialNumTpl.setCompanyId(companyId);
+                serialNumTpl.setSerialNum(0);
+                serialNumTpl.setCreateBy(dto.getId());
+                serialNumTpl.setId(UUID.randomUUID().toString().replace("-", ""));
+                serialnumTplCMapper.insert(serialNumTpl);
+                numTpl = serialNumTpl;
+            }
+            if (numTpl == null) {
+                throw new Exception("生成编号失败,请先设置相关业务编号模板");
+            }
+            String year = DateUtils.formatDate(new Date(), "yyyy");
+            if (!year.equals(numTpl.getYearBuilt())) {
+                serialnumTplCMapper.resetSerialNum(numTpl.getId(), numTpl.getYearBuilt(), year);
+            }
+            Map<String, String> map = new HashMap<>();
+            String serialTpl = numTpl.getSerialTpl();
+            int i = serialnumTplCMapper.updateSerialNum(numTpl);
+            if (i != 1) {
+                throw new Exception("生成编号失败,请稍后重试");
+            }
+            String num = String.valueOf(numTpl.getSerialNum() + 1);
+            StringBuffer sb = new StringBuffer();
+            sb.append(num);
+            //查询公司简称
+            if (serialTpl.contains("spnm")) {
+                String companyShortname = UserUtils.getSysParam("company_shortname");
+                map.put("spnm", StringUtils.isBlank(companyShortname) ? "" : companyShortname);
+            }
+            //查询分公司简称
+            if (serialTpl.contains("brspnm")) {
+                String branchShortname = UserUtils.getSysParam("branch_shortname");
+                map.put("brspnm", StringUtils.isBlank(branchShortname) ? "" : branchShortname);
+            }
+            //年份
+            if (serialTpl.contains("year")) {
+                map.put("year", year);
+            }
+            //月份
+            if (serialTpl.contains("month")) {
+                int month = new Date().getMonth() + 1;
+                map.put("month", month + "");
+            }
+            //序列号
+            if (serialTpl.contains("serialNum")) {
+                map.put("serialNum", sb.toString());
+            }
+            //日期
+            if (serialTpl.contains("day")) {
+                map.put("day", new Date().getDate() + "");
+            }
+            String serNum = StringUtils.renderString(serialTpl, map);
+            return serNum;
+        }
+        return "";
+    }
+
+    @Transactional(readOnly = false,propagation = Propagation.REQUIRES_NEW)
+    public String genSerialReviewNum(String companyId, String bizCode) throws Exception {
+        //获取当前登录人信息
+        UserDTO dto = UserUtils.getCurrentUserDTO();
+        Office office = officeMapper.selectById(companyId);
+        if (StringUtils.isBlank(bizCode)){
+            throw new Exception("生成编号失败,业务类型不能为空");
+        }
+        if (office != null) {
+            SysSerialnumTplC numTpl = this.querySerialTpl(office, bizCode);
+            if (numTpl == null) {
+                //查询编号模板   {brspnm}DZ-{year}-{serialNum}
+                SysSerialnumTplC serialNumTpl = serialnumTplCMapper.queryByComAndBizCode(companyId, bizCode);
+                serialNumTpl.setCompanyId(companyId);
+                serialNumTpl.setSerialNum(0);
+                serialNumTpl.setCreateBy(dto.getId());
+                serialNumTpl.setId(UUID.randomUUID().toString().replace("-", ""));
+                serialnumTplCMapper.insert(serialNumTpl);
+                numTpl = serialNumTpl;
+            }
+            if (numTpl == null) {
+                throw new Exception("生成编号失败,请先设置相关业务编号模板");
+            }
+            String year = DateUtils.formatDate(new Date(), "yyyy");
+            if (!year.equals(numTpl.getYearBuilt())) {
+                serialnumTplCMapper.resetSerialNum(numTpl.getId(), numTpl.getYearBuilt(), year);
+            }
+            Map<String, String> map = new HashMap<>();
+            String serialTpl = numTpl.getSerialTpl();
+            int i = serialnumTplCMapper.updateSerialNum(numTpl);
+            if (i != 1) {
+                throw new Exception("生成编号失败,请稍后重试");
+            }
+            String num = String.valueOf(numTpl.getSerialNum() + 1);
+            StringBuffer sb = new StringBuffer();
+//            for (int x = 0; x < (numTpl.getSerialNumLen() - num.length()); x++) {
+//                sb.append("0");
+//            }
+            sb.append(num);
+            //查询公司简称
+            if (serialTpl.contains("spnm")) {
+                String companyShortname = UserUtils.getSysParam("company_shortname");
+                map.put("spnm", StringUtils.isBlank(companyShortname) ? "" : companyShortname);
+            }
+            //查询分公司简称
+            if (serialTpl.contains("brspnm")) {
+                String branchShortname = UserUtils.getSysParam("branch_shortname");
+                map.put("brspnm", StringUtils.isBlank(branchShortname) ? "" : branchShortname);
+            }
+            //年份
+            if (serialTpl.contains("year")) {
+                map.put("year", year);
+            }
+            //月份
+            if (serialTpl.contains("month")) {
+                int month = new Date().getMonth() + 1;
+                map.put("month", month + "");
+            }
+            //序列号
+            if (serialTpl.contains("serialNum")) {
+                map.put("serialNum", sb.toString());
+            }
+            //日期
+            if (serialTpl.contains("day")) {
+                map.put("day", new Date().getDate() + "");
+            }
+            String serNum = StringUtils.renderString(serialTpl, map);
+            return serNum;
+        }
+        return "";
+    }
+
+    private SysSerialnumTplC querySerialTpl(Office company, String bizCode) {
+        SysSerialnumTplC numTpl = serialnumTplCMapper.queryByComAndBizCode(company.getId(), bizCode);
+        if (numTpl==null && company.getParentId()!=null && !"0".equals(company.getParentId())){
+            Office office = officeMapper.selectById(company.getParentId());
+            numTpl = this.querySerialTpl(office,bizCode);
+        }
+        return numTpl;
+    }
+}

+ 64 - 7
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/service/UserService.java

@@ -6,9 +6,7 @@ package com.jeeplus.sys.service;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
-import com.jeeplus.sys.domain.Cert;
-import com.jeeplus.sys.domain.Office;
-import com.jeeplus.sys.mapper.CertMapper;
+import com.jeeplus.sys.domain.*;
 import com.jeeplus.sys.mapper.OfficeMapper;
 import com.jeeplus.sys.service.dto.CertDTO;
 import com.jeeplus.sys.service.dto.LoginUserOnlineDTO;
@@ -16,7 +14,6 @@ import com.jeeplus.sys.service.mapstruct.CertWrapper;
 import com.jeeplus.sys.utils.ServletUtils;
 import com.jeeplus.sys.utils.ip.AddressUtils;
 import com.jeeplus.sys.utils.ip.IpUtils;
-import com.sun.org.apache.xpath.internal.operations.Bool;
 import eu.bitwalker.useragentutils.UserAgent;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -25,8 +22,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jeeplus.common.redis.RedisUtils;
 import com.jeeplus.common.utils.RequestUtils;
 import com.jeeplus.sys.constant.CacheNames;
-import com.jeeplus.sys.domain.SysConfig;
-import com.jeeplus.sys.domain.User;
 import com.jeeplus.sys.mapper.UserMapper;
 import com.jeeplus.sys.service.dto.OfficeDTO;
 import com.jeeplus.sys.service.dto.UserDTO;
@@ -35,6 +30,7 @@ import com.jeeplus.sys.utils.UserUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.annotation.Cacheable;
+import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -69,6 +65,12 @@ public class UserService  extends ServiceImpl<UserMapper, User> {
 	@Autowired
 	private CertService certService;
 
+	@Autowired
+	private SerialnumTplCService serialnumTplCService;
+
+	@Autowired
+	private RosterBaseCService rosterBaseCService;
+
 	/**
 	 * 单一登录判断,是否允许登录
 	 * @return
@@ -249,7 +251,7 @@ public class UserService  extends ServiceImpl<UserMapper, User> {
 	 * 保存或者更新用户
 	 * @param userDTO
 	 */
-	public void saveOrUpdate(UserDTO userDTO) {
+	public void saveOrUpdate(UserDTO userDTO) throws Exception {
 		User user = userWrapper.toEntity (userDTO);
 		super.saveOrUpdate ( user );
 		if( StrUtil.isBlank ( userDTO.getId () ) ){
@@ -271,6 +273,8 @@ public class UserService  extends ServiceImpl<UserMapper, User> {
 				baseMapper.insertUserPost ( userDTO.getId (), postDTO.getId () );
 			} );
 		}
+		// 新增/修改关联花名册数据
+		this.saveOrUpdateRoster(user);
 		UserUtils.deleteCache ( userDTO );
 	}
 
@@ -279,6 +283,10 @@ public class UserService  extends ServiceImpl<UserMapper, User> {
 		baseMapper.deleteUserRole(userDTO.getId ());
 		baseMapper.deleteUserPost ( userDTO.getId () );
 		super.removeById (userDTO.getId ());
+		if (StringUtils.isNotBlank(userDTO.getRosterId())) {
+			// 删除与用户关联的花名册数据
+			rosterBaseCService.removeById(userDTO.getRosterId());
+		}
 		UserUtils.deleteCache ( userDTO );
 	}
 
@@ -478,4 +486,53 @@ public class UserService  extends ServiceImpl<UserMapper, User> {
 			}
 		}
 	}
+
+	// 新增/修改花名册数据
+	public void saveOrUpdateRoster (User user) throws Exception {
+		RosterBaseC r = new RosterBaseC();
+		r.setName(user.getName());  // 姓名
+		r.setOfficeId("");  // 部门
+		r.setMobile("");  // 电话号码
+		r.setEmail("");  // 邮箱
+		if (StringUtils.isNotBlank(user.getOfficeId())) {
+			r.setOfficeId(user.getOfficeId());  // 部门
+		}
+		if (StringUtils.isNotBlank(user.getMobile())) {
+			r.setMobile(user.getMobile());  // 电话号码
+		}
+		if (StringUtils.isNotBlank(user.getEmail())) {
+			r.setEmail(user.getEmail());  // 邮箱
+		}
+		User u = this.getById(user.getId());
+		if (StringUtils.isNotBlank(u.getRosterId())) {
+			r.setId(u.getRosterId()); // 花名册id
+		} else {
+			UserDTO userDTO = UserUtils.getCurrentUserDTO();
+			String serialNum = serialnumTplCService.genSerialNum(userDTO.getCompanyDTO().getId(), "3");
+			r.setJobNo(serialNum); // 花名册工号
+			user.setNo(serialNum); // 用户工号
+			r.setPersonType("1");  //  人员类型: 员工
+		}
+		// 保存花名册数据
+		rosterBaseCService.saveOrUpdate(r);
+		user.setRosterId(r.getId());
+		this.updateById(user);
+	}
+
+	// 修改用户信息
+	public ResponseEntity updateInfo(UserDTO userDTO) throws Exception {
+		User user = UserWrapper.INSTANCE.toEntity(userDTO);
+		// 根据用户id修改用户信息
+		this.updateById (user);
+		// 修改用户信息的同时更新花名册数据
+		this.saveOrUpdateRoster(user);
+		//更新缓存信息
+		UserUtils.deleteCache ( UserUtils.getCurrentUserDTO ( ) );
+		return ResponseEntity.ok ( "修改个人资料成功!" );
+	}
+
+	// 根据用户id查询资格证
+	public List<Cert> getCertListByUserId(String userId) {
+		return certService.list(new QueryWrapper<Cert>().lambda().eq(Cert::getUserId,userId));
+	}
 }

+ 6 - 1
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/service/dto/UserDTO.java

@@ -64,7 +64,7 @@ public class  UserDTO extends BaseDTO {
     /**
      * 工号
      */
-    @Length(min = 1, max = 100)
+//    @Length(min = 1, max = 100)
     @Excel (name = "工号")
     private String no;
 
@@ -304,4 +304,9 @@ public class  UserDTO extends BaseDTO {
      */
     private List<String> manageOfficeNameList;
 
+    /**
+     * 花名册id
+     */
+    private String rosterId;
+
 }