Bläddra i källkod

人员新增调整

wangqiang 1 år sedan
förälder
incheckning
f590e74b6f
29 ändrade filer med 1195 tillägg och 16 borttagningar
  1. 2 0
      jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/sys/domain/User.java
  2. 62 0
      jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/sys/service/dto/RosterBankCardsDTO.java
  3. 93 0
      jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/sys/service/dto/RosterCertificateDTO.java
  4. 66 0
      jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/sys/service/dto/RosterContractDTO.java
  5. 23 0
      jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/sys/service/dto/UserDTO.java
  6. 40 0
      jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/sys/service/dto/UserOtherInfoDto.java
  7. 17 0
      jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/sys/service/dto/WorkAttachmentDto2.java
  8. 68 0
      jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/sys/service/dto/WorkAttachmentInfo2.java
  9. 287 10
      jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/controller/UserController.java
  10. 58 0
      jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/domain/RosterBankCards.java
  11. 85 0
      jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/domain/RosterCertificate.java
  12. 59 0
      jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/domain/RosterContract.java
  13. 44 0
      jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/domain/UserOtherInfo.java
  14. 12 0
      jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/mapper/OtherUserInfoMapper.java
  15. 12 0
      jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/mapper/RosterBankCardsMapper.java
  16. 12 0
      jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/mapper/RosterCertificateMapper.java
  17. 9 0
      jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/mapper/RosterContractMapper.java
  18. 6 3
      jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/mapper/UserMapper.java
  19. 4 0
      jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/mapper/xml/OtherUserInfoMapper.xml
  20. 4 0
      jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/mapper/xml/RosterBankCardsMapper.xml
  21. 4 0
      jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/mapper/xml/RosterCertificateMapper.xml
  22. 4 0
      jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/mapper/xml/RosterContractMapper.xml
  23. 45 0
      jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/mapper/xml/UserMapper.xml
  24. 17 0
      jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/service/OtherUserInfoService.java
  25. 17 0
      jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/service/RosterBankCardsService.java
  26. 18 0
      jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/service/RosterCertificateService.java
  27. 17 0
      jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/service/RosterContractService.java
  28. 9 3
      jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/service/UserService.java
  29. 101 0
      jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/utils/SnowFlake2.java

+ 2 - 0
jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/sys/domain/User.java

@@ -24,6 +24,8 @@ public class User extends BaseEntity {
 
     private static final long serialVersionUID = 1L;
 
+    private String rosterId;   // 花名册id
+
     /**
      * 归属公司
      */

+ 62 - 0
jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/sys/service/dto/RosterBankCardsDTO.java

@@ -0,0 +1,62 @@
+package com.jeeplus.sys.service.dto;
+
+import com.jeeplus.core.service.dto.BaseDTO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 花名册-银行卡信息
+ * @TableName roster_bank_cards
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class RosterBankCardsDTO extends BaseDTO {
+
+    private static final long serialVersionUID = 1L;
+    /**
+     * 备注信息
+     */
+    private String remarks;
+
+    /**
+     * 基础信息id
+     */
+    private String baseId;
+
+    /**
+     * 工资卡开户银行
+     */
+    private String payrollCardOpenBank;
+
+    /**
+     * 工资卡分支行
+     */
+    private String payrollCardBranches;
+
+    /**
+     * 工资卡银行账号
+     */
+    private String payrollCardBankAccount;
+
+    /**
+     * 工资卡开户名
+     */
+    private String payrollCardOpeningName;
+
+    /**
+     * 工资卡照片
+     */
+    private String payrollCardPic;
+
+    /**
+     * 是否为默认
+     */
+    private String isDefault;
+
+    /**
+     * 工资卡照片
+     */
+    private String payrollCardPicLsUrl;
+
+
+}

+ 93 - 0
jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/sys/service/dto/RosterCertificateDTO.java

@@ -0,0 +1,93 @@
+package com.jeeplus.sys.service.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jeeplus.core.service.dto.BaseDTO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * roster_certificate
+ * @author 
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class RosterCertificateDTO extends BaseDTO {
+
+    /**
+     * 备注信息
+     */
+    private String remarks;
+
+    /**
+     * 基础信息id
+     */
+    private String baseId;
+
+    /**
+     * 证书名称
+     */
+    private String certName;
+
+    /**
+     * 证书类型
+     */
+    private String certType;
+
+    /**
+     * 证书编号
+     */
+    private String certNo;
+
+    /**
+     * 发证机构
+     */
+    private String issuedInstitution;
+
+    /**
+     * 发证日期
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date issuedDate;
+
+    /**
+     * 备案日期
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date recordDate;
+
+    /**
+     * 提醒日期
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date remindDate;
+
+    /**
+     * 到期日期
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date expireDate;
+
+    /**
+     * 专业
+     */
+    private String profession;
+
+    /**
+     * 级别
+     */
+    private String level;
+
+    /**
+     * 描述
+     */
+    private String description;
+
+    private static final long serialVersionUID = 1L;
+}

+ 66 - 0
jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/sys/service/dto/RosterContractDTO.java

@@ -0,0 +1,66 @@
+package com.jeeplus.sys.service.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jeeplus.core.service.dto.BaseDTO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * roster_contract
+ * @author 
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class RosterContractDTO extends BaseDTO {
+
+    /**
+     * 备注信息
+     */
+    private String remarks;
+
+    /**
+     * 基础信息id
+     */
+    private String baseId;
+
+    /**
+     * 当前合同起始日
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date beginDate;
+
+    /**
+     * 当前合同终止日
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date endDate;
+
+    /**
+     * 工作邮箱
+     */
+    private String workEmail;
+
+    /**
+     * 工作电话
+     */
+    private String workMobile;
+
+    /**
+     * 试用期到期日
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date probationPeriodEndDate;
+
+    /**
+     * 试用期(月)
+     */
+    private String probationPeriodMonth;
+
+    private static final long serialVersionUID = 1L;
+}

+ 23 - 0
jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/sys/service/dto/UserDTO.java

@@ -43,6 +43,29 @@ public class UserDTO extends BaseDTO implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
+    //其他用户信息
+    private UserOtherInfoDto otherInfoDto;
+
+    /**
+     * 合同信息
+     */
+    private RosterContractDTO rosterContractDTO;
+
+    /**
+     * 银行卡信息
+     */
+    private List<RosterBankCardsDTO> rosterBankCardsDTOList;
+
+    /**
+     * 员工证书
+     */
+    private List<RosterCertificateDTO> rosterCertificateDTOList;
+
+    /**
+     * 附件
+     */
+    private List<WorkAttachmentDto2> files;
+
     /**
      * 财务公司签字注师被选择次数
      */

+ 40 - 0
jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/sys/service/dto/UserOtherInfoDto.java

@@ -0,0 +1,40 @@
+package com.jeeplus.sys.service.dto;
+
+import com.jeeplus.core.service.dto.BaseDTO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-12-21 15:11
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class UserOtherInfoDto extends BaseDTO {
+
+    private String userInfoId;              //用户信息id
+    private String certificatesType;         //证件类型
+    private String idCard;                  //证件号
+    private String certificatesFront;       //证件照正面
+    private String certificatesBack;        //证件照反面
+    private String sex;                     //性别
+    private String birthDate;               //出生日期
+    private String workerType;              //员工类型
+    private String onboardingDate;          //入职日期
+    private String ethnic;                  //民族
+    private String contactAddress;          //联系地址
+    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 qq;
+    private String wechat;
+    private String remarks;
+}

+ 17 - 0
jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/sys/service/dto/WorkAttachmentDto2.java

@@ -0,0 +1,17 @@
+package com.jeeplus.sys.service.dto;
+
+import com.jeeplus.core.service.dto.BaseDTO;
+import lombok.Data;
+
+@Data
+public class WorkAttachmentDto2 extends BaseDTO {
+
+    private String name;
+
+    private String size;
+
+    private String url;
+
+    private String by;
+
+}

+ 68 - 0
jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/sys/service/dto/WorkAttachmentInfo2.java

@@ -0,0 +1,68 @@
+package com.jeeplus.sys.service.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+@Data
+@TableName("work_attachment")
+public class WorkAttachmentInfo2 extends BaseEntity {
+
+    /**
+     * 附件地址
+     */
+    private String url;
+
+    /**
+     * 文件类型(文件后缀名)
+     */
+    private String type;
+
+    /**
+     * 附件对应父节点id(记录是谁的id)
+     */
+    private String attachmentId;
+
+    /**
+     * 文件名
+     */
+    private String attachmentName;
+
+    /**
+     * 文件所属业务模块(数据字典配置)
+     */
+    private String attachmentFlag;
+
+    /**
+     * 所属模块子模块
+     */
+    private String moduleType;
+
+    /**
+     * 附件类型
+     */
+    private String attachmentType;
+
+    /**
+     * 附件大小
+     */
+    private String fileSize;
+
+    /**
+     * 排序
+     */
+    private Integer sort;
+
+    /**
+     * 文件描述
+     */
+    private String description;
+
+    /**
+     * 附件临时地址
+     *该属性不是实体字段
+     */
+    @TableField(exist = false)
+    private String temporaryUrl;
+}

+ 287 - 10
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/controller/UserController.java

@@ -4,6 +4,7 @@
 package com.jeeplus.sys.controller;
 
 
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.extra.spring.SpringUtil;
@@ -11,6 +12,7 @@ import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.google.common.collect.Lists;
 import com.google.gson.Gson;
@@ -25,23 +27,20 @@ import com.jeeplus.common.redis.RedisUtils;
 import com.jeeplus.common.utils.ResponseUtil;
 import com.jeeplus.core.query.QueryWrapperGenerator;
 import com.jeeplus.logging.annotation.ApiLog;
-import com.jeeplus.sys.domain.Office;
-import com.jeeplus.sys.domain.User;
+import com.jeeplus.sys.domain.*;
 import com.jeeplus.sys.domain.vo.UserVO;
 import com.jeeplus.sys.feign.IUserApi;
-import com.jeeplus.sys.service.OfficeService;
-import com.jeeplus.sys.service.UserService;
-import com.jeeplus.sys.service.dto.OfficeDTO;
-import com.jeeplus.sys.service.dto.UserDTO;
+import com.jeeplus.sys.mapper.UserMapper;
+import com.jeeplus.sys.service.*;
+import com.jeeplus.sys.service.dto.*;
+import com.jeeplus.sys.service.mapstruct.CertWrapper;
 import com.jeeplus.sys.service.mapstruct.UserWrapper;
-import com.jeeplus.sys.utils.DictUtils;
-import com.jeeplus.sys.utils.MenuUtils;
-import com.jeeplus.sys.utils.TenantUtils;
-import com.jeeplus.sys.utils.UserUtils;
+import com.jeeplus.sys.utils.*;
 import com.jeeplus.sys.utils.excel.UserEasyExcel;
 import com.jeeplus.utils.StringUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -53,6 +52,8 @@ import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import javax.validation.constraints.NotNull;
 import java.io.IOException;
+import java.lang.reflect.Field;
+import java.lang.reflect.Type;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
@@ -73,6 +74,20 @@ public class UserController {
     private UserService userService;
 
     @Autowired
+    private OtherUserInfoService otherUserInfoService;
+
+    @Autowired
+    private RosterBankCardsService rosterBankCardsService;
+    @Autowired
+    private RosterCertificateService rosterCertificateService;
+
+    @Autowired
+    private CertService certService;
+
+    @Autowired
+    private RosterContractService rosterContractService;
+
+    @Autowired
     private OfficeService officeService;
 
     @Autowired
@@ -124,6 +139,64 @@ public class UserController {
     @ApiOperation(value = "查询用户")
     public ResponseEntity queryById(@RequestParam("id") String id) {
         UserDTO userDTO = userService.get ( id );
+        UserOtherInfo otherInfo = otherUserInfoService.getOne(new QueryWrapper<UserOtherInfo>().lambda().eq(UserOtherInfo::getUserInfoId, id));
+        UserOtherInfoDto  otherInfoDto = new UserOtherInfoDto();
+        if (null != otherInfo) {
+            BeanUtils.copyProperties(otherInfo, otherInfoDto);
+            userDTO.setOtherInfoDto(otherInfoDto);
+        }
+
+        //查询合同信息
+        RosterContract contract = rosterContractService.getOne(new QueryWrapper<RosterContract>().lambda().eq(RosterContract::getBaseId, id));
+        RosterContractDTO  contractDto = new RosterContractDTO();
+        if (null != contract) {
+            BeanUtils.copyProperties(contract, contractDto);
+            userDTO.setRosterContractDTO(contractDto);
+        }
+
+        if (null != contract) {
+            BeanUtils.copyProperties(contract, contractDto);
+            userDTO.setRosterContractDTO(contractDto);
+        }
+
+        //查银行卡信息
+        List<RosterBankCards> bankCards = rosterBankCardsService.list(new QueryWrapper<RosterBankCards>().lambda().eq(RosterBankCards::getBaseId, id));
+        List<RosterBankCardsDTO>  bankCardsDTO = new ArrayList<>();
+        bankCards.forEach(ba->{
+            RosterBankCardsDTO cardsDTO = new RosterBankCardsDTO();
+            BeanUtils.copyProperties(ba, cardsDTO);
+            bankCardsDTO.add(cardsDTO);
+        });
+        userDTO.setRosterBankCardsDTOList(bankCardsDTO);
+
+        //员工证书
+        List<RosterCertificate> certificates = rosterCertificateService.list(new QueryWrapper<RosterCertificate>().lambda().eq(RosterCertificate::getBaseId, id));
+        List<RosterCertificateDTO>  certificateDTOS = new ArrayList<>();
+        certificates.forEach(ba->{
+            RosterCertificateDTO cardsDTO = new RosterCertificateDTO();
+            BeanUtils.copyProperties(ba, cardsDTO);
+            certificateDTOS.add(cardsDTO);
+        });
+        userDTO.setRosterCertificateDTOList(certificateDTOS);
+
+        //查询人员资质
+        List<Cert> certs = certService.list(new QueryWrapper<Cert>().lambda().eq(Cert::getUserId, id));
+        List<CertDTO>  certDTOS = new ArrayList<>();
+        certs.forEach(ba->{
+            CertDTO cardsDTO = new CertDTO();
+            BeanUtils.copyProperties(ba, cardsDTO);
+            certDTOS.add(cardsDTO);
+        });
+        userDTO.setCertDTOList(certDTOS);
+
+        // 附件信息
+        List<WorkAttachmentDto2> files = userService.getByAttachmentId(id);
+        if (CollectionUtils.isNotEmpty(files)) {
+            for (WorkAttachmentDto2 i : files) {
+                i.setCreateBy(SpringUtil.getBean ( IUserApi.class ).getById(i.getBy()));
+            }
+        }
+        userDTO.setFiles(files);
         return ResponseEntity.ok ( userDTO );
     }
 
@@ -678,6 +751,9 @@ public class UserController {
     @ApiOperation(value = "保存用户")
     @PostMapping("save")
     public ResponseEntity save(@Valid @RequestBody UserDTO userDTO) {
+
+        UserDTO info = SpringUtil.getBean ( IUserApi.class ).getByToken ( TokenProvider.getCurrentToken() );
+
         // 如果新密码为空,则不更换密码
         if ( StrUtil.isNotBlank ( userDTO.getNewPassword ( ) ) ) {
             userDTO.setPassword ( SecurityUtils.encryptPassword ( userDTO.getNewPassword ( ) ) );
@@ -685,8 +761,152 @@ public class UserController {
         if ( !UserUtils.isCheckLoginName ( userDTO.getOldLoginName ( ), userDTO.getLoginName ( ), userDTO.getTenantDTO ( ).getId ( ) ) ) {
             return ResponseEntity.badRequest ( ).body ( "保存用户'" + userDTO.getLoginName ( ) + "'失败,登录名已存在!" );
         }
+        String id = SnowFlake2.getId();
+        if (StringUtils.isBlank(userDTO.getId())) {
+            userDTO.setId(id);
+        }
+
+
+
         // 保存用户信息
         userService.saveOrUpdate ( userDTO );
+
+        //保存合同信息
+        if(ObjectUtil.isNotEmpty(userDTO.getRosterContractDTO())){
+            RosterContractDTO rosterContractDTO = userDTO.getRosterContractDTO();
+
+            RosterContract rosterContract = new RosterContract();
+            BeanUtils.copyProperties(rosterContractDTO, rosterContract);
+
+            rosterContract.setCreateById(info.getId());
+            rosterContract.setCreateTime(new Date());
+            rosterContract.setUpdateById(info.getId());
+            rosterContract.setUpdateTime(new Date());
+
+            rosterContract.setBaseId(userDTO.getId());
+            rosterContractService.remove(new QueryWrapper<RosterContract>().eq("base_id",userDTO.getId()));
+            rosterContractService.saveOrUpdate(rosterContract);
+        } else {
+            rosterContractService.remove(new QueryWrapper<RosterContract>().eq("base_id",userDTO.getId()));
+        }
+        //保存  银行卡信息、人员资质、员工证书  及  其他个人信息
+        //1、保存其他个人信息
+        if (null != userDTO.getOtherInfoDto()) {
+            UserOtherInfoDto otherInfoDto = userDTO.getOtherInfoDto();
+            UserOtherInfo otherInfo = new UserOtherInfo();
+            BeanUtils.copyProperties(otherInfoDto, otherInfo);
+
+            otherInfo.setCreateById(info.getId());
+            otherInfo.setCreateTime(new Date());
+            otherInfo.setUpdateById(info.getId());
+            otherInfo.setUpdateTime(new Date());
+            otherInfo.setUserInfoId(userDTO.getId());
+            otherUserInfoService.saveOrUpdate(otherInfo);
+        }
+        //2、保存银行卡信息
+        if(CollectionUtil.isNotEmpty(userDTO.getRosterBankCardsDTOList())){
+            List<String> collect = userDTO.getRosterBankCardsDTOList().stream().map(RosterBankCardsDTO::getId).collect(Collectors.toList());
+            rosterBankCardsService.remove(new QueryWrapper<RosterBankCards>().eq("base_id",userDTO.getId()).notIn(CollectionUtil.isNotEmpty(collect),"id",collect));
+            userDTO.getRosterBankCardsDTOList().stream().forEach(item->{
+                if(ObjectUtil.isNotEmpty(item)&& objectCheckIsNull(item)){
+                    RosterBankCards rosterBankCards = new RosterBankCards();
+                    BeanUtils.copyProperties(item, rosterBankCards);
+                    rosterBankCards.setCreateById(info.getId());
+                    rosterBankCards.setCreateTime(new Date());
+                    rosterBankCards.setUpdateById(info.getId());
+                    rosterBankCards.setUpdateTime(new Date());
+                    rosterBankCards.setBaseId(userDTO.getId());
+                    rosterBankCardsService.saveOrUpdate(rosterBankCards);
+                }
+            });
+        }else{
+            rosterBankCardsService.remove(new QueryWrapper<RosterBankCards>().eq("base_id",userDTO.getId()));
+        }
+        //3、保存员工证书
+        //保存员工证书
+        if(CollectionUtil.isNotEmpty(userDTO.getRosterCertificateDTOList())){
+            List<String> collect = userDTO.getRosterCertificateDTOList().stream().map(RosterCertificateDTO::getId).collect(Collectors.toList());
+            rosterCertificateService.remove(new QueryWrapper<RosterCertificate>().eq("base_id",userDTO.getId()).notIn(CollectionUtil.isNotEmpty(collect),"id",collect));
+            userDTO.getRosterCertificateDTOList().stream().forEach(item->{
+                if(ObjectUtil.isNotEmpty(item)&& objectCheckIsNull(item)){
+                    RosterCertificate rosterCertificate = new RosterCertificate();
+                    BeanUtils.copyProperties(item, rosterCertificate);
+                    rosterCertificate.setCreateById(info.getId());
+                    rosterCertificate.setCreateTime(new Date());
+                    rosterCertificate.setUpdateById(info.getId());
+                    rosterCertificate.setUpdateTime(new Date());
+                    rosterCertificate.setBaseId(userDTO.getId());
+                    rosterCertificate.setBaseId(userDTO.getId());
+                    rosterCertificateService.saveOrUpdate(rosterCertificate);
+                }
+            });
+        }else{
+            rosterCertificateService.remove(new QueryWrapper<RosterCertificate>().eq("base_id",userDTO.getId()));
+        }
+        //4、保存人员资质
+        // 保存花名册关联用户的资质信息
+        certService.remove(new QueryWrapper<Cert>().lambda().eq(Cert::getUserId,userDTO.getId()));
+        if(ObjectUtil.isNotEmpty(userDTO.getCertDTOList())){
+            List<Cert> certList = new ArrayList<>();
+            userDTO.getCertDTOList().stream().forEach(i -> {
+                Cert cert = CertWrapper.INSTANCE.toEntity(i);
+                cert.setUserId(userDTO.getId());
+                cert.setId("");
+                certList.add(cert);
+            });
+            if (CollectionUtil.isNotEmpty(certList)) {
+                certService.saveBatch(certList);
+            }
+        }
+        User user = userService.getOne(new QueryWrapper<User>().lambda().eq(User::getRosterId, userDTO.getId()));
+        if (ObjectUtil.isNotEmpty(user)) {
+            // 保存花名册关联用户的资质信息
+//            certService.remove(new QueryWrapper<Cert>().lambda().eq(Cert::getUserId,user.getId()));
+//            if(ObjectUtil.isNotEmpty(userDTO.getCertDTOList())){
+//                List<Cert> certList = new ArrayList<>();
+//                userDTO.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(userDTO.getRoleIdList())) {
+//                userDTO.getRoleIdList().stream().forEach(i -> {
+//                    userMapper.insertUserRole(user.getId(), i);  // 插入用户的角色
+//                });
+//            }
+//            // 保存花名册关联用户的岗位
+//            userMapper.deleteUserPost(user.getId());  //  删除用户的岗位
+//            if (CollectionUtil.isNotEmpty(userDTO.getPostIdList())) {
+//                userDTO.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(userDTO.getManageOfficeIds())) {
+//                List<String> officeIds= Arrays.asList(userDTO.getManageOfficeIds().split(","));
+//                officeIds.stream().forEach(officeId -> {
+//                    userMapper.insertUserManageOffice(officeId,user.getId());  // 插入用户的管理部门 (用户、管理部门关联表)
+//                });
+//                oIds = userDTO.getManageOfficeIds();
+//            }
+//            userMapper.updateUserManageOffice(oIds, user.getId()); // 修改用户的管理部门 (用户表)
+        }
+        //5、保存附件信息
+        if (CollectionUtils.isNotEmpty(userDTO.getFiles())) {
+            saveFiles(userDTO.getFiles(), userDTO, id);
+        }
+
         return ResponseEntity.ok ( "保存用户'" + userDTO.getLoginName ( ) + "'成功!" );
     }
 
@@ -1385,7 +1605,64 @@ public class UserController {
 
 
 
+    public static boolean objectCheckIsNull(Object object) {
+        boolean flag = false; //定义返回结果,默认为true
 
+        if (Objects.isNull(object)) {
+            flag = false;
+        } else {
+            Class clazz = (Class) object.getClass(); // 得到类对象
+            Field fields[] = clazz.getDeclaredFields(); // 得到所有属性
+            for (Field field : fields) {
+                if("serialVersionUID".equals(field.getName()) || "BIZ_CODE".equalsIgnoreCase(field.getName())){
+                    continue;
+                }
+                field.setAccessible(true);
+                Object fieldValue = null;
+                try {
+                    fieldValue = field.get(object); //得到属性值
+                    Type fieldType = field.getGenericType();//得到属性类型
+                    String fieldName = field.getName(); // 得到属性名
+                    System.out.println(("属性类型:" + fieldType + ",属性名:" + fieldName + ",属性值:" + fieldValue));
+                } catch (IllegalArgumentException e) {
+                    e.printStackTrace();
+                } catch (IllegalAccessException e) {
+                    e.printStackTrace();
+                }
+                if (fieldValue != null && fieldValue != "") {  //只要有一个属性值不为null 就返回false 表示对象不为null
+                    flag = true;
+                    break;
+                }
+            }
+        }
 
+        return flag;
+    }
 
+    public void saveFiles(List<WorkAttachmentDto2> list, UserDTO userDTO, String id) {
+        int j = 1;
+        for (WorkAttachmentDto2 dto : list) {
+            WorkAttachmentInfo2 i = new WorkAttachmentInfo2();
+            //包含了url、size、name
+            i.setId(UUID.randomUUID().toString().replace("-", ""));
+//            i.getCreateBy().setId(userDTO.getId());
+            i.setCreateTime(new Date());
+//            i.getUpdateBy().setId(userDTO.getId());
+            i.setUpdateTime(new Date());
+            i.setDelFlag(0);
+            i.setUrl(dto.getUrl());
+            //文件类型处理
+            List<String> strings = Arrays.asList(dto.getName().split("\\."));
+            if (org.flowable.editor.language.json.converter.util.CollectionUtils.isNotEmpty(strings)) {
+                i.setType(strings.get(1));
+            }
+            i.setAttachmentId(id);
+            i.setAttachmentName(dto.getName());
+            i.setAttachmentFlag("userFilesInfo");
+            i.setFileSize(dto.getSize());
+            i.setSort(j);
+            userService.insertWorkAttachment(i, userDTO);
+            j++;
+        }
+    }
 }

+ 58 - 0
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/domain/RosterBankCards.java

@@ -0,0 +1,58 @@
+package com.jeeplus.sys.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 花名册-银行卡信息
+ * @TableName roster_bank_cards
+ */
+@Data
+@TableName("roster_bank_cards")
+public class RosterBankCards extends BaseEntity {
+    /**
+     * 备注信息
+     */
+    private String remarks;
+
+    /**
+     * 基础信息id
+     */
+    private String baseId;
+
+    /**
+     * 工资卡开户银行
+     */
+    private String payrollCardOpenBank;
+
+    /**
+     * 工资卡分支行
+     */
+    private String payrollCardBranches;
+
+    /**
+     * 工资卡银行账号
+     */
+    private String payrollCardBankAccount;
+
+    /**
+     * 工资卡开户名
+     */
+    private String payrollCardOpeningName;
+
+    /**
+     * 工资卡照片
+     */
+    private String payrollCardPic;
+
+    /**
+     * 是否为默认
+     */
+    private String isDefault;
+
+    private static final long serialVersionUID = 1L;
+
+
+}

+ 85 - 0
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/domain/RosterCertificate.java

@@ -0,0 +1,85 @@
+package com.jeeplus.sys.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+/**
+ * 员工证书
+ * roster_certificate
+ * @author 
+ */
+@Data
+@TableName("roster_certificate")
+public class RosterCertificate extends BaseEntity {
+
+    /**
+     * 备注信息
+     */
+    private String remarks;
+
+    /**
+     * 基础信息id
+     */
+    private String baseId;
+
+    /**
+     * 证书名称
+     */
+    private String certName;
+
+    /**
+     * 证书类型
+     */
+    private String certType;
+
+    /**
+     * 证书编号
+     */
+    private String certNo;
+
+    /**
+     * 发证机构
+     */
+    private String issuedInstitution;
+
+    /**
+     * 发证日期
+     */
+    private Date issuedDate;
+
+    /**
+     * 备案日期
+     */
+    private Date recordDate;
+
+    /**
+     * 提醒日期
+     */
+    private Date remindDate;
+
+    /**
+     * 到期日期
+     */
+    private Date expireDate;
+
+    /**
+     * 专业
+     */
+    private String profession;
+
+    /**
+     * 级别
+     */
+    private String level;
+
+    /**
+     * 描述
+     */
+    private String description;
+
+    private static final long serialVersionUID = 1L;
+}

+ 59 - 0
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/domain/RosterContract.java

@@ -0,0 +1,59 @@
+package com.jeeplus.sys.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+/**
+ * roster_contract
+ * @author 
+ */
+@Data
+@TableName("roster_contract")
+public class RosterContract extends BaseEntity {
+
+    /**
+     * 备注信息
+     */
+    private String remarks;
+
+    /**
+     * 基础信息id
+     */
+    private String baseId;
+
+    /**
+     * 当前合同起始日
+     */
+    private Date beginDate;
+
+    /**
+     * 当前合同终止日
+     */
+    private Date endDate;
+
+    /**
+     * 工作邮箱
+     */
+    private String workEmail;
+
+    /**
+     * 工作电话
+     */
+    private String workMobile;
+
+    /**
+     * 试用期到期日
+     */
+    private Date probationPeriodEndDate;
+
+    /**
+     * 试用期(月)
+     */
+    private String probationPeriodMonth;
+
+    private static final long serialVersionUID = 1L;
+}

+ 44 - 0
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/domain/UserOtherInfo.java

@@ -0,0 +1,44 @@
+package com.jeeplus.sys.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 用户其他数据
+ * @author 王强
+ * @version 1.0
+ * @date 2023-12-21 15:03
+ */
+@Data
+@TableName("sys_user_other_info")
+public class UserOtherInfo extends BaseEntity {
+
+    private String userInfoId;              //用户信息id
+    private String certificatesType;         //证件类型
+    private String idCard;                  //证件号
+    private String certificatesFront;       //证件照正面
+    private String certificatesBack;        //证件照反面
+    private String sex;                     //性别
+    private String birthDate;               //出生日期
+    private String workerType;              //员工类型
+    private String onboardingDate;          //入职日期
+    private String ethnic;                  //民族
+    private String contactAddress;          //联系地址
+    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 qq;
+    private String wechat;
+    private String remarks;
+
+
+}

+ 12 - 0
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/mapper/OtherUserInfoMapper.java

@@ -0,0 +1,12 @@
+package com.jeeplus.sys.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.sys.domain.UserOtherInfo;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-12-21 15:56
+ */
+public interface OtherUserInfoMapper extends BaseMapper<UserOtherInfo> {
+}

+ 12 - 0
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/mapper/RosterBankCardsMapper.java

@@ -0,0 +1,12 @@
+package com.jeeplus.sys.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.sys.domain.RosterBankCards;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-12-21 17:30
+ */
+public interface RosterBankCardsMapper extends BaseMapper<RosterBankCards> {
+}

+ 12 - 0
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/mapper/RosterCertificateMapper.java

@@ -0,0 +1,12 @@
+package com.jeeplus.sys.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.sys.domain.RosterCertificate;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-12-21 16:40
+ */
+public interface RosterCertificateMapper extends BaseMapper<RosterCertificate> {
+}

+ 9 - 0
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/mapper/RosterContractMapper.java

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

+ 6 - 3
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/mapper/UserMapper.java

@@ -11,9 +11,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.domain.User;
-import com.jeeplus.sys.service.dto.CertDTO;
-import com.jeeplus.sys.service.dto.OfficeDTO;
-import com.jeeplus.sys.service.dto.UserDTO;
+import com.jeeplus.sys.service.dto.*;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -26,6 +24,9 @@ import java.util.List;
  */
 public interface UserMapper extends BaseMapper <User> {
 
+    @InterceptorIgnore(tenantLine = "true")
+    void insertWorkAttachment (@Param("workAttachment") WorkAttachmentInfo2 workAttachment, @Param("userDto") UserDTO userDto);
+
     /**
      * 获取岗位列表
      *
@@ -260,4 +261,6 @@ public interface UserMapper extends BaseMapper <User> {
 
     @InterceptorIgnore(tenantLine = "true")
     String getMobileById(String id);
+
+    List<WorkAttachmentDto2> getByAttachmentId(@Param("id")String id);
 }

+ 4 - 0
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/mapper/xml/OtherUserInfoMapper.xml

@@ -0,0 +1,4 @@
+<?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.OtherUserInfoMapper">
+</mapper>

+ 4 - 0
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/mapper/xml/RosterBankCardsMapper.xml

@@ -0,0 +1,4 @@
+<?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.RosterBankCardsMapper">
+</mapper>

+ 4 - 0
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/mapper/xml/RosterCertificateMapper.xml

@@ -0,0 +1,4 @@
+<?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.RosterCertificateMapper">
+</mapper>

+ 4 - 0
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/mapper/xml/RosterContractMapper.xml

@@ -0,0 +1,4 @@
+<?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.RosterContractMapper">
+</mapper>

+ 45 - 0
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/mapper/xml/UserMapper.xml

@@ -298,6 +298,38 @@ select a.id, a.company_id as "companyDTO.id", a.office_id as "officeDTO.id", a.l
         INSERT INTO sys_user_post(user_id, post_id)
         VALUES (#{userId}, #{postId})
     </insert>
+    <insert id="insertWorkAttachment">
+        INSERT INTO work_attachment (
+            id,
+            create_by_id,
+            create_time,
+            update_by_id,
+            update_time,
+            del_flag,
+            url,
+            type,
+            attachment_id,
+            attachment_name,
+            attachment_flag,
+            file_size,
+            sort
+            )
+        VALUES(
+            #{workAttachment.id},
+            #{userDto.id},
+            #{workAttachment.createTime},
+            #{userDto.id},
+            #{workAttachment.updateTime},
+            #{workAttachment.delFlag},
+            #{workAttachment.url},
+            #{workAttachment.type},
+            #{workAttachment.attachmentId},
+            #{workAttachment.attachmentName},
+            #{workAttachment.attachmentFlag},
+            #{workAttachment.fileSize},
+            #{workAttachment.sort}
+            )
+    </insert>
 
     <select id="getUserIdByName" resultType="string">
 		select id from sys_user su where su.name = #{name} limit 1
@@ -587,5 +619,18 @@ select a.id, a.company_id as "companyDTO.id", a.office_id as "officeDTO.id", a.l
     <select id="getMobileById" resultType="java.lang.String">
         select mobile from sys_user where del_flag = '0' and id = #{id}
     </select>
+    <select id="getByAttachmentId" resultType="com.jeeplus.sys.service.dto.WorkAttachmentDto2">
+        SELECT
+			id,
+			url,
+			attachment_name AS `name`,
+			create_by_id AS `by`,
+			create_time
+		FROM
+			work_attachment
+		WHERE
+			del_flag = 0
+			AND attachment_id = #{id}
+    </select>
 
 </mapper>

+ 17 - 0
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/service/OtherUserInfoService.java

@@ -0,0 +1,17 @@
+package com.jeeplus.sys.service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jeeplus.sys.domain.UserOtherInfo;
+import com.jeeplus.sys.mapper.OtherUserInfoMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-12-21 15:58
+ */
+@Service
+@Transactional
+public class OtherUserInfoService extends ServiceImpl<OtherUserInfoMapper, UserOtherInfo> {
+}

+ 17 - 0
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/service/RosterBankCardsService.java

@@ -0,0 +1,17 @@
+package com.jeeplus.sys.service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jeeplus.sys.domain.RosterBankCards;
+import com.jeeplus.sys.mapper.RosterBankCardsMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-12-21 17:30
+ */
+@Service
+@Transactional
+public class RosterBankCardsService extends ServiceImpl<RosterBankCardsMapper, RosterBankCards> {
+}

+ 18 - 0
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/service/RosterCertificateService.java

@@ -0,0 +1,18 @@
+package com.jeeplus.sys.service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jeeplus.sys.domain.RosterCertificate;
+import com.jeeplus.sys.mapper.RosterCertificateMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-12-21 16:41
+ */
+@Service
+@Transactional
+public class RosterCertificateService extends ServiceImpl<RosterCertificateMapper, RosterCertificate> {
+}

+ 17 - 0
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/service/RosterContractService.java

@@ -0,0 +1,17 @@
+package com.jeeplus.sys.service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jeeplus.sys.domain.RosterContract;
+import com.jeeplus.sys.mapper.RosterContractMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * @author 王强
+ * @version 1.0
+ * @date 2023-12-21 18:09
+ */
+@Service
+@Transactional
+public class RosterContractService extends ServiceImpl<RosterContractMapper, RosterContract> {
+}

+ 9 - 3
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/service/UserService.java

@@ -25,9 +25,7 @@ import com.jeeplus.sys.domain.User;
 import com.jeeplus.sys.feign.IUserApi;
 import com.jeeplus.sys.mapper.OfficeMapper;
 import com.jeeplus.sys.mapper.UserMapper;
-import com.jeeplus.sys.service.dto.CertDTO;
-import com.jeeplus.sys.service.dto.OfficeDTO;
-import com.jeeplus.sys.service.dto.UserDTO;
+import com.jeeplus.sys.service.dto.*;
 import com.jeeplus.sys.service.mapstruct.CertWrapper;
 import com.jeeplus.sys.service.mapstruct.UserWrapper;
 import com.jeeplus.sys.utils.UserUtils;
@@ -81,6 +79,10 @@ public class UserService extends ServiceImpl <UserMapper, User> {
     @Autowired
     private RedisUtils redisUtils;
 
+    public void insertWorkAttachment (WorkAttachmentInfo2 workAttachment, UserDTO userDto){
+        userMapper.insertWorkAttachment(workAttachment, userDto);
+    }
+
     /**
      * 根据用户id 查询该用户会计报告的签字注师被选择次数
      * @param userId
@@ -697,4 +699,8 @@ public class UserService extends ServiceImpl <UserMapper, User> {
     public String getMobileById(String id) {
         return userMapper.getMobileById(id);
     }
+
+    public List<WorkAttachmentDto2> getByAttachmentId(String id) {
+        return userMapper.getByAttachmentId(id);
+    }
 }

+ 101 - 0
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/utils/SnowFlake2.java

@@ -0,0 +1,101 @@
+package com.jeeplus.sys.utils;
+
+/**
+ * @author: 徐滕
+ * @version: 2023-12-12 18:27
+ */
+public final class SnowFlake2 {
+
+    // 起始的时间戳
+    private final static long START_TIMESTAMP = 1480166465631L;
+
+    // 每一部分占用的位数,符号位不算在内
+    private final static long SEQUENCE_BIT = 12; // 序列号占用的位数
+    private final static long MACHINE_BIT = 5; // 机器标识占用的位数
+    private final static long DATACENTER_BIT = 5; // 数据中心占用的位数
+
+    // 每一部分的最大值
+    private final static long MAX_SEQUENCE = ~(-1L << SEQUENCE_BIT);
+    private final static long MAX_MACHINE_NUM = ~(-1L << MACHINE_BIT);
+    private final static long MAX_DATACENTER_NUM = ~(-1L << DATACENTER_BIT);
+
+    // 每一部分向左的位移
+    private final static long MACHINE_LEFT = SEQUENCE_BIT;
+    private final static long DATACENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT;
+    private final static long TIMESTAMP_LEFT = DATACENTER_LEFT + DATACENTER_BIT;
+
+    private long datacenterId; // 数据中心
+    private long machineId; // 机器标识
+    private long sequence = 0L; // 序列号
+    private long lastTimestamp = -1L;// 上一次时间戳
+
+    public SnowFlake2(long datacenterId, long machineId) {
+        if (datacenterId > MAX_DATACENTER_NUM || datacenterId < 0) {
+            throw new IllegalArgumentException("Datacenter ID can't be greater than MAX_DATACENTER_NUM or less than 0");
+        }
+        if (machineId > MAX_MACHINE_NUM || machineId < 0) {
+            throw new IllegalArgumentException("Machine ID can't be greater than MAX_MACHINE_NUM or less than 0");
+        }
+        this.datacenterId = datacenterId;
+        this.machineId = machineId;
+    }
+
+    /**
+     * 产生下一个ID
+     *
+     * @return 下一个ID
+     */
+    public synchronized long nextId() {
+        long currTimestamp = getTimestamp();
+        if (currTimestamp < lastTimestamp) {
+            throw new RuntimeException("Clock moved backwards. Refusing to generate id");
+        }
+
+        // 如果是同一时间生成的,则进行毫秒内序列
+        if (currTimestamp == lastTimestamp) {
+            sequence = (sequence + 1) & MAX_SEQUENCE;
+            // 序列号已经达到最大值,下一个毫秒
+            if (sequence == 0L) {
+                currTimestamp = getNextTimestamp();
+            }
+        } else {
+            // 时间戳改变,毫秒内序列重置
+            sequence = 0L;
+        }
+
+        // 上次生成ID的时间截
+        lastTimestamp = currTimestamp;
+
+        // 移位并通过或运算拼到一起组成64位的ID
+        return (currTimestamp - START_TIMESTAMP) << TIMESTAMP_LEFT // 时间戳部分
+                | datacenterId << DATACENTER_LEFT // 数据中心部分
+                | machineId << MACHINE_LEFT // 机器标识部分
+                | sequence; // 序列号部分
+    }
+
+    /**
+     * 获取下一个毫秒数
+     *
+     * @return 下一个毫秒数
+     */
+    private long getNextTimestamp() {
+        long timestamp = getTimestamp();
+        while (timestamp <= lastTimestamp) {
+            timestamp = getTimestamp();
+        }
+        return timestamp;
+    }
+
+    /**
+     * 获取当前的时间戳
+     *
+     * @return 当前的时间戳
+     */
+    private long getTimestamp() {
+        return System.currentTimeMillis();
+    }
+    public static String getId() {
+        SnowFlake2 snowFlake = new SnowFlake2(1, 1);
+        return String.valueOf(snowFlake.nextId());
+    }
+}