Просмотр исходного кода

Merge remote-tracking branch 'origin/master'

颜琼丽 13 часов назад
Родитель
Сommit
faab01a578
20 измененных файлов с 466 добавлено и 47 удалено
  1. 3 0
      jd-logistics-api/jd-logistics-api-system/src/main/java/com/ruoyi/system/api/domain/SysDept.java
  2. 20 0
      jd-logistics-api/jd-logistics-api-system/src/main/java/com/ruoyi/system/api/domain/SysUser.java
  3. 30 3
      jd-logistics-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java
  4. 3 3
      jd-logistics-auth/src/main/resources/bootstrap.yml
  5. 5 5
      jd-logistics-gateway/src/main/resources/bootstrap.yml
  6. 4 4
      jd-logistics-modules/jd-logistics-file/src/main/resources/bootstrap.yml
  7. 3 3
      jd-logistics-modules/jd-logistics-job/src/main/resources/bootstrap.yml
  8. 32 2
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/controller/SysDeptController.java
  9. 18 10
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/controller/SysUserController.java
  10. 63 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/domain/dto/DeptImportDTO.java
  11. 41 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/domain/dto/UserImportDTO.java
  12. 10 1
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java
  13. 12 1
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java
  14. 12 3
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
  15. 81 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java
  16. 106 5
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
  17. 3 3
      jd-logistics-modules/jd-logistics-system/src/main/resources/bootstrap.yml
  18. 12 0
      jd-logistics-modules/jd-logistics-system/src/main/resources/mapper/system/SysDeptMapper.xml
  19. 5 1
      jd-logistics-modules/jd-logistics-system/src/main/resources/mapper/system/SysUserMapper.xml
  20. 3 3
      jd-logistics-visual/jd-logistics-monitor/src/main/resources/bootstrap.yml

+ 3 - 0
jd-logistics-api/jd-logistics-api-system/src/main/java/com/ruoyi/system/api/domain/SysDept.java

@@ -76,6 +76,9 @@ public class SysDept extends BaseEntity
     /** 公司地址 */
     private String companyAddress;
 
+    /** 部门编码 */
+    private String deptCode;
+
     public Long getDeptId()
     {
         return deptId;

+ 20 - 0
jd-logistics-api/jd-logistics-api-system/src/main/java/com/ruoyi/system/api/domain/SysUser.java

@@ -70,7 +70,11 @@ public class SysUser extends BaseEntity
     /** 最后登录时间 */
     @Excel(name = "最后登录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT)
     private Date loginDate;
+    /** 最早登录时间 */
+    @Excel(name = "最早登录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT)
+    private Date loginFirstDate;
 
+    private String agreeFlag;
     /** 密码最后更新时间 */
     private Date pwdUpdateDate;
 
@@ -322,6 +326,22 @@ public class SysUser extends BaseEntity
         this.openId = openId;
     }
 
+    public void setLoginFirstDate(Date loginFirstDate) {
+        this.loginFirstDate = loginFirstDate;
+    }
+
+    public void setAgreeFlag(String agreeFlag) {
+        this.agreeFlag = agreeFlag;
+    }
+
+    public Date getLoginFirstDate() {
+        return loginFirstDate;
+    }
+
+    public String getAgreeFlag() {
+        return agreeFlag;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

+ 30 - 3
jd-logistics-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java

@@ -19,6 +19,8 @@ import com.ruoyi.system.api.RemoteUserService;
 import com.ruoyi.system.api.domain.SysUser;
 import com.ruoyi.system.api.model.LoginUser;
 
+import java.util.Date;
+
 /**
  * 登录校验方法
  * 
@@ -93,10 +95,35 @@ public class SysLoginService
         }
         passwordService.validate(user, password);
         recordLogService.recordLogininfor(username, Constants.LOGIN_SUCCESS, "登录成功");
-        recordLoginInfo(user.getUserId());
+        //recordLoginInfo(user.getUserId());
+        recordLoginInfoAndPolicy(user);
         return userInfo;
     }
 
+    /**
+     * 记录登录信息
+     *
+     * @paramuser
+     */
+    public void recordLoginInfoAndPolicy( SysUser user)
+    {
+        SysUser sysUser = new SysUser();
+        sysUser.setUserId(user.getUserId());
+        if("0".equals(user.getAgreeFlag())){
+            sysUser.setLoginFirstDate(new Date());
+            sysUser.setAgreeFlag("1");
+        }
+        // 更新用户登录IP
+        sysUser.setLoginIp(IpUtils.getIpAddr());
+        // 更新用户登录时间
+        sysUser.setLoginDate(DateUtils.getNowDate());
+
+
+        remoteUserService.recordUserLogin(sysUser, SecurityConstants.INNER);
+    }
+
+
+
     /**
      * 记录登录信息
      *
@@ -208,8 +235,8 @@ public class SysLoginService
             throw new ServiceException("对不起,您的账号:" + username + " 已停用");
         }
         recordLogService.recordLogininfor(username, Constants.LOGIN_SUCCESS, "登录成功");
-        recordLoginInfo(user.getUserId());
-
+        //recordLoginInfo(user.getUserId());
+        recordLoginInfoAndPolicy(user);
         return userInfo;
     }
 

+ 3 - 3
jd-logistics-auth/src/main/resources/bootstrap.yml

@@ -14,14 +14,14 @@ spring:
     nacos:
       discovery:
         # 服务注册地址
-        server-addr: 192.168.100.246:8848
+        server-addr: 172.26.48.165:8848
       config:
         # 配置中心地址
-        server-addr: 192.168.100.246:8848
+        server-addr: 172.26.48.165:8848
         # 配置文件格式
         file-extension: yml
         # 共享配置
         shared-configs:
           - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
       username: nacos
-      password: nacos
+      password: sdwl_Huawei@!123

+ 5 - 5
jd-logistics-gateway/src/main/resources/bootstrap.yml

@@ -14,28 +14,28 @@ spring:
     nacos:
       discovery:
         # 服务注册地址
-        server-addr: 192.168.100.246:8848
+        server-addr: 172.26.48.165:8848
       config:
         # 配置中心地址
-        server-addr: 192.168.100.246:8848
+        server-addr: 172.26.48.165:8848
         # 配置文件格式
         file-extension: yml
         # 共享配置
         shared-configs:
           - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
       username: nacos
-      password: nacos
+      password: sdwl_Huawei@!123
     sentinel:
       # 取消控制台懒加载
       eager: true
       transport:
         # 控制台地址
-        dashboard: 192.168.100.246:8718
+        dashboard: 172.26.48.165:8718
       # nacos配置持久化
       datasource:
         ds1:
           nacos:
-            server-addr: 192.168.100.246:8848
+            server-addr: 172.26.48.165:8848
             dataId: sentinel-jd-logistics-gateway
             groupId: DEFAULT_GROUP
             data-type: json

+ 4 - 4
jd-logistics-modules/jd-logistics-file/src/main/resources/bootstrap.yml

@@ -3,7 +3,7 @@ server:
   port: 9300
 
 # Spring
-spring: 
+spring:
   application:
     # 应用名称
     name: jd-logistics-file
@@ -14,14 +14,14 @@ spring:
     nacos:
       discovery:
         # 服务注册地址
-        server-addr: 127.0.0.1:8848
+        server-addr: 172.26.48.165:8848
       config:
         # 配置中心地址
-        server-addr: 127.0.0.1:8848
+        server-addr: 172.26.48.165:8848
         # 配置文件格式
         file-extension: yml
         # 共享配置
         shared-configs:
           - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
       username: nacos
-      password: nacos
+      password: sdwl_Huawei@!123

+ 3 - 3
jd-logistics-modules/jd-logistics-job/src/main/resources/bootstrap.yml

@@ -14,14 +14,14 @@ spring:
     nacos:
       discovery:
         # 服务注册地址
-        server-addr: 127.0.0.1:8848
+        server-addr: 172.26.48.165:8848
       config:
         # 配置中心地址
-        server-addr: 127.0.0.1:8848
+        server-addr: 172.26.48.165:8848
         # 配置文件格式
         file-extension: yml
         # 共享配置
         shared-configs:
           - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
       username: nacos
-      password: nacos
+      password: sdwl_Huawei@!123

+ 32 - 2
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/controller/SysDeptController.java

@@ -1,6 +1,10 @@
 package com.ruoyi.system.controller;
 
+import java.io.IOException;
 import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+
+import com.ruoyi.common.core.utils.poi.ExcelUtil;
 import org.apache.commons.lang3.ArrayUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -11,7 +15,9 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.PutMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
 import com.ruoyi.common.core.constant.UserConstants;
 import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.common.core.web.controller.BaseController;
@@ -21,6 +27,7 @@ import com.ruoyi.common.log.enums.BusinessType;
 import com.ruoyi.common.security.annotation.RequiresPermissions;
 import com.ruoyi.common.security.utils.SecurityUtils;
 import com.ruoyi.system.api.domain.SysDept;
+import com.ruoyi.system.domain.dto.DeptImportDTO;
 import com.ruoyi.system.service.ISysDeptService;
 
 /**
@@ -121,13 +128,36 @@ public class SysDeptController extends BaseController
     {
         if (deptService.hasChildByDeptId(deptId))
         {
-            return warn("存在下级部门,不允许删除");
+            return warn("存在下级部门不允许删除");
         }
         if (deptService.checkDeptExistUser(deptId))
         {
-            return warn("部门存在用户,不允许删除");
+            return warn("部门存在用户不允许删除");
         }
         deptService.checkDeptDataScope(deptId);
         return toAjax(deptService.deleteDeptById(deptId));
     }
+
+    /**
+     * 导入部门数据
+     */
+    @RequiresPermissions("system:dept:add")
+    @Log(title = "部门管理", businessType = BusinessType.IMPORT)
+    @PostMapping("/importData")
+    public AjaxResult importData(MultipartFile file) throws Exception {
+        ExcelUtil<DeptImportDTO> util = new ExcelUtil<DeptImportDTO>(DeptImportDTO.class);
+        List<DeptImportDTO> deptList = util.importExcel(file.getInputStream());
+        String message = deptService.importDept(deptList);
+        return success(message);
+    }
+
+    /**
+     * 下载部门导入模板
+     */
+    @RequiresPermissions("system:dept:add")
+    @PostMapping("/importTemplate")
+    public void importTemplate(HttpServletResponse response) throws IOException {
+        ExcelUtil<DeptImportDTO> util = new ExcelUtil<DeptImportDTO>(DeptImportDTO.class);
+        util.importTemplateExcel(response, "部门数据");
+    }
 }

+ 18 - 10
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/controller/SysUserController.java

@@ -41,6 +41,7 @@ import com.ruoyi.system.api.domain.SysDept;
 import com.ruoyi.system.api.domain.SysRole;
 import com.ruoyi.system.api.domain.SysUser;
 import com.ruoyi.system.api.model.LoginUser;
+import com.ruoyi.system.domain.dto.UserImportDTO;
 import com.ruoyi.system.service.ISysConfigService;
 import com.ruoyi.system.service.ISysDeptService;
 import com.ruoyi.system.service.ISysPermissionService;
@@ -100,22 +101,29 @@ public class SysUserController extends BaseController
         util.exportExcel(response, list, "用户数据");
     }
 
+
+    /**
+     * 导入用户数据
+     */
     @Log(title = "用户管理", businessType = BusinessType.IMPORT)
-    @RequiresPermissions("system:user:import")
+    @RequiresPermissions("system:user:add")
     @PostMapping("/importData")
-    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
-    {
-        ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
-        List<SysUser> userList = util.importExcel(file.getInputStream());
+    public AjaxResult importData(MultipartFile file) throws Exception {
+        ExcelUtil<UserImportDTO> util = new ExcelUtil<UserImportDTO>(UserImportDTO.class);
+        List<UserImportDTO> userImportList = util.importExcel(file.getInputStream());
         String operName = SecurityUtils.getUsername();
-        String message = userService.importUser(userList, updateSupport, operName);
+        String message = userService.importUserFromDTO(userImportList, operName);
         return success(message);
     }
 
+
+    /**
+     * 下载用户导入模板
+     */
+    @RequiresPermissions("system:user:add")
     @PostMapping("/importTemplate")
-    public void importTemplate(HttpServletResponse response) throws IOException
-    {
-        ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
+    public void importTemplate(HttpServletResponse response) throws IOException {
+        ExcelUtil<UserImportDTO> util = new ExcelUtil<UserImportDTO>(UserImportDTO.class);
         util.importTemplateExcel(response, "用户数据");
     }
 
@@ -268,7 +276,7 @@ public class SysUserController extends BaseController
             return error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
         }
         user.setCreateBy(SecurityUtils.getUsername());
-        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
+        //user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
         return toAjax(userService.insertUser(user));
     }
 

+ 63 - 0
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/domain/dto/DeptImportDTO.java

@@ -0,0 +1,63 @@
+package com.ruoyi.system.domain.dto;
+
+import java.math.BigDecimal;
+import java.util.List;
+import com.ruoyi.common.core.annotation.Excel;
+import lombok.Data;
+
+/**
+ * 部门 Excel 导入对象
+ * 
+ * @author lydgt
+ */
+@Data
+public class DeptImportDTO {
+
+    /** 组织名称 */
+    @Excel(name = "组织名称")
+    private String deptName;
+
+    /** 组织编码 */
+    @Excel(name = "组织编码")
+    private String deptCode;
+
+    /** 父组织名称 */
+    @Excel(name = "父组织名称")
+    private String parentDeptName;
+
+    /** 父组织编码 */
+    @Excel(name = "父组织编码")
+    private String parentDeptCode;
+
+    /** 负责人手机号 */
+    @Excel(name = "负责人手机号")
+    private String phone;
+
+    /** 负责人姓名 */
+    @Excel(name = "负责人姓名")
+    private String leader;
+
+    /** 费率 */
+    @Excel(name = "费率")
+    private String rateValue;
+
+    /** 发票抬头 */
+    @Excel(name = "发票抬头")
+    private String invoiceName;
+
+    /** 纳税人识别号 */
+    @Excel(name = "纳税人识别号")
+    private String invoiceNum;
+
+    /** 地址 */
+    @Excel(name = "地址")
+    private String companyAddress;
+
+    /** 开户银行 */
+    @Excel(name = "开户银行")
+    private String openBank;
+
+    /** 银行账号 */
+    @Excel(name = "银行账号")
+    private String bankAccount;
+}

+ 41 - 0
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/domain/dto/UserImportDTO.java

@@ -0,0 +1,41 @@
+package com.ruoyi.system.domain.dto;
+
+import com.ruoyi.common.core.annotation.Excel;
+import lombok.Data;
+
+/**
+ * 用户 Excel 导入对象
+ * 
+ * @author lydgt
+ */
+@Data
+public class UserImportDTO {
+
+    /** 手机号 */
+    @Excel(name = "手机号")
+    private String phonenumber;
+
+    /** 姓名 */
+    @Excel(name = "姓名")
+    private String nickName;
+
+    /** 工号 */
+    @Excel(name = "工号")
+    private String employeeCode;
+
+    /** 用户角色名称 */
+    @Excel(name = "用户角色")
+    private String roleName;
+
+    /** 组织名称 */
+    @Excel(name = "组织名称")
+    private String deptName;
+
+    /** 组织编码 */
+    @Excel(name = "组织编码")
+    private String deptCode;
+
+    /** 邮箱 */
+    @Excel(name = "邮箱")
+    private String email;
+}

+ 10 - 1
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java

@@ -111,8 +111,17 @@ public interface SysDeptMapper
     /**
      * 删除部门管理信息
      * 
-     * @param deptId 部门ID
+     * @param deptId 部门 ID
      * @return 结果
      */
     public int deleteDeptById(Long deptId);
+
+    /**
+     * 根据部门编码和名称查询部门
+     *
+     * @param deptCode 部门编码
+     * @param deptName 部门名称
+     * @return 部门信息
+     */
+    public SysDept selectDeptByInfo(@Param("deptCode") String deptCode, @Param("deptName") String deptName);
 }

+ 12 - 1
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java

@@ -2,6 +2,7 @@ package com.ruoyi.system.service;
 
 import java.util.List;
 import com.ruoyi.system.api.domain.SysDept;
+import com.ruoyi.system.domain.dto.DeptImportDTO;
 import com.ruoyi.system.domain.vo.TreeSelect;
 
 /**
@@ -117,8 +118,18 @@ public interface ISysDeptService
     /**
      * 删除部门管理信息
      * 
-     * @param deptId 部门ID
+     * @param deptId 部门 ID
      * @return 结果
      */
     public int deleteDeptById(Long deptId);
+
+    /**
+     * 导入部门数据
+     * 
+     * @param deptList 部门数据列表
+     * @param isUpdateSupport 是否更新已存在的数据
+     * @param operName 操作用户名
+     * @return 导入结果
+     */
+    public String importDept(List<DeptImportDTO> deptList);
 }

+ 12 - 3
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/service/ISysUserService.java

@@ -2,6 +2,7 @@ package com.ruoyi.system.service;
 
 import java.util.List;
 import com.ruoyi.system.api.domain.SysUser;
+import com.ruoyi.system.domain.dto.UserImportDTO;
 
 /**
  * 用户 业务层
@@ -204,12 +205,20 @@ public interface ISysUserService
      */
     public String importUser(List<SysUser> userList, Boolean isUpdateSupport, String operName);
 
+    /**
+     * 导入用户数据(使用导入对象)
+     * 
+     * @param userImportList 用户导入数据列表
+     * @param operName 操作用户
+     * @return 结果
+     */
+    public String importUserFromDTO(List<UserImportDTO> userImportList, String operName);
+
 
     /**
-     * 通过用户名和OpenId查询用户
+     * 通过用户名和 OpenId 查询用户
      *
-     * @param userName 用户名
-     * @param openId 用户名
+     * @param sysUser 用户对象
      * @return 用户对象信息
      */
     public SysUser selectUserByOpenId( SysUser sysUser);

+ 81 - 0
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java

@@ -4,6 +4,8 @@ import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 import java.util.stream.Collectors;
+
+import com.ruoyi.common.core.utils.DateUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.ruoyi.common.core.constant.UserConstants;
@@ -16,6 +18,7 @@ import com.ruoyi.common.security.utils.SecurityUtils;
 import com.ruoyi.system.api.domain.SysDept;
 import com.ruoyi.system.api.domain.SysRole;
 import com.ruoyi.system.api.domain.SysUser;
+import com.ruoyi.system.domain.dto.DeptImportDTO;
 import com.ruoyi.system.domain.vo.TreeSelect;
 import com.ruoyi.system.mapper.SysDeptMapper;
 import com.ruoyi.system.mapper.SysRoleMapper;
@@ -335,4 +338,82 @@ public class SysDeptServiceImpl implements ISysDeptService
     {
         return getChildList(list, t).size() > 0 ? true : false;
     }
+
+    /**
+     * 导入部门数据
+     * 
+     * @param deptList 部门数据列表
+     * @return 导入结果
+     */
+    @Override
+    public String importDept(List<DeptImportDTO> deptList) {
+        if (StringUtils.isNull(deptList) || deptList.size() == 0) {
+            throw new ServiceException("导入部门数据不能为空!");
+        }
+
+        int successNum = 0;
+        int failureNum = 0;
+        StringBuilder successMsg = new StringBuilder();
+        StringBuilder failureMsg = new StringBuilder();
+
+        for (DeptImportDTO importDTO : deptList) {
+            try {
+                // 将导入对象转换为 SysDept 实体对象
+                SysDept dept = convertToSysDept(importDTO);
+
+                // 根据父组织编码和名称查询父部门 ID
+                SysDept parentId = deptMapper.selectDeptByInfo(importDTO.getParentDeptCode(), importDTO.getParentDeptName());
+
+                // 设置父部门 ID,如果为 null 则默认为顶级部门(0)
+                dept.setParentId(parentId == null ? 0L : parentId.getDeptId());
+
+                // 检查部门名称是否唯一
+                if (null != deptMapper.checkDeptNameUnique(dept.getDeptName(), dept.getParentId())) {
+                    failureNum++;
+                    failureMsg.append(String.format("%1$s、部门已存在;", dept.getDeptName()));
+                } else {
+                    // 新增部门
+                    this.insertDept(dept);
+                    successNum++;
+                    successMsg.append(String.format("%1$s、导入成功;", dept.getDeptName()));
+                }
+            } catch (Exception e) {
+                failureNum++;
+                String msg = String.format("%1$s、导入失败:%2$s", importDTO.getDeptName(), e.getMessage());
+                failureMsg.append(msg);
+            }
+        }
+
+        if (failureNum > 0) {
+            failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据,格式如下:");
+            successMsg.insert(0, "恭喜您,导入成功!共 " + successNum + " 条数据,格式如下:");
+            return failureMsg.toString();
+        } else {
+            successMsg.insert(0, "恭喜您,全部导入成功!共 " + successNum + " 条数据,格式如下:");
+            return successMsg.toString();
+        }
+    }
+
+    /**
+     * 将 DeptImportDTO 转换为 SysDept 实体
+     * 
+     * @param importDTO 导入对象
+     * @return SysDept 实体
+     */
+    private SysDept convertToSysDept(DeptImportDTO importDTO) {
+        SysDept dept = new SysDept();
+        dept.setDeptName(importDTO.getDeptName());
+        dept.setDeptCode(importDTO.getDeptCode());
+        dept.setLeader(importDTO.getLeader());
+        dept.setPhone(importDTO.getPhone());
+        dept.setInvoiceName(importDTO.getInvoiceName());
+        dept.setInvoiceNum(importDTO.getInvoiceNum());
+        dept.setCompanyAddress(importDTO.getCompanyAddress());
+        dept.setOpenBank(importDTO.getOpenBank());
+        dept.setBankAccount(importDTO.getBankAccount());
+        dept.setCreateBy(SecurityUtils.getUsername());
+        dept.setCreateTime(DateUtils.getNowDate());
+        dept.setRateValue(importDTO.getRateValue());
+        return dept;
+    }
 }

+ 106 - 5
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java

@@ -8,6 +8,8 @@ import javax.validation.Validator;
 import com.ruoyi.logistics.config.GemaiyunSmsConfig;
 import com.ruoyi.logistics.util.GemaiyunSmsUtil;
 import com.ruoyi.logistics.util.PasswordUtils;
+
+import com.ruoyi.common.core.utils.DateUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -21,11 +23,14 @@ import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.common.core.utils.bean.BeanValidators;
 import com.ruoyi.common.datascope.annotation.DataScope;
 import com.ruoyi.common.security.utils.SecurityUtils;
+import com.ruoyi.system.api.domain.SysDept;
 import com.ruoyi.system.api.domain.SysRole;
 import com.ruoyi.system.api.domain.SysUser;
 import com.ruoyi.system.domain.SysPost;
 import com.ruoyi.system.domain.SysUserPost;
 import com.ruoyi.system.domain.SysUserRole;
+import com.ruoyi.system.domain.dto.UserImportDTO;
+import com.ruoyi.system.mapper.SysDeptMapper;
 import com.ruoyi.system.mapper.SysPostMapper;
 import com.ruoyi.system.mapper.SysRoleMapper;
 import com.ruoyi.system.mapper.SysUserMapper;
@@ -66,6 +71,9 @@ public class SysUserServiceImpl implements ISysUserService
     @Autowired
     private ISysDeptService deptService;
 
+    @Autowired
+    private SysDeptMapper deptMapper;
+
     @Autowired
     protected Validator validator;
 
@@ -267,6 +275,9 @@ public class SysUserServiceImpl implements ISysUserService
     @Transactional(rollbackFor = Exception.class)
     public int insertUser(SysUser user)
     {
+
+        String password=PasswordUtils.generate8PasswordWithSpecial();
+        user.setPassword(SecurityUtils.encryptPassword(password));
         // 新增用户信息
         int rows = userMapper.insertUser(user);
         // 新增用户岗位关联
@@ -274,10 +285,10 @@ public class SysUserServiceImpl implements ISysUserService
         // 新增用户与角色管理
         insertUserRole(user);
 
-        String password=PasswordUtils.generate8PasswordWithSpecial();
-        user.setPassword(password);
+
+
         if(rows>0){
-            sendCreateUserSms(user);
+            sendCreateUserSms(user,password);
         }
 
         return rows;
@@ -285,12 +296,12 @@ public class SysUserServiceImpl implements ISysUserService
 
 
 
-    private void sendCreateUserSms(SysUser user) {
+    private void sendCreateUserSms(SysUser user,String password) {
         try {
             // ✅ 局部变量,每个请求独立,安全!
             StringBuilder sb = new StringBuilder();
             sb.append(user.getNickName()).append("##")
-                    .append(user.getPassword());
+                    .append(password);
             String content = sb.toString();
             // 调用短信接口
             String result = GemaiyunSmsUtil.sendSms(
@@ -594,4 +605,94 @@ public class SysUserServiceImpl implements ISysUserService
     public SysUser selectUserByOpenId(SysUser sysUser) {
         return userMapper.selectUserByOpenId(sysUser.getUserName(), sysUser.getOpenId());
     }
+
+    /**
+     * 导入用户数据(使用导入对象)
+     *
+     * @param userImportList 用户导入数据列表
+     * @param operName 操作用户
+     * @return 结果
+     */
+    @Override
+    public String importUserFromDTO(List<UserImportDTO> userImportList, String operName) {
+        if (StringUtils.isNull(userImportList) || userImportList.size() == 0) {
+            throw new ServiceException("导入用户数据不能为空!");
+        }
+
+        int successNum = 0;
+        int failureNum = 0;
+        StringBuilder successMsg = new StringBuilder();
+        StringBuilder failureMsg = new StringBuilder();
+
+        for (UserImportDTO importDTO : userImportList) {
+            try {
+                // 将导入对象转换为 SysUser 实体对象
+                SysUser user = convertToSysUser(importDTO, operName);
+
+                // 根据组织编码和名称查询部门 ID
+                SysDept deptId = deptMapper.selectDeptByInfo(importDTO.getDeptCode(), importDTO.getDeptName());
+                if (StringUtils.isNull(deptId)) {
+                    throw new ServiceException("部门不存在:" + importDTO.getDeptName());
+                }
+                user.setDeptId(deptId.getDeptId());
+
+                // 验证是否存在这个用户
+                SysUser u = userMapper.selectUserByUserName(user.getUserName());
+                if (StringUtils.isNull(u)) {
+                    BeanValidators.validateWithException(validator, user);
+                    deptService.checkDeptDataScope(user.getDeptId());
+                    user.setCreateBy(operName);
+
+                    // 处理角色关联
+                    if (StringUtils.isNotEmpty(importDTO.getRoleName())) {
+                        SysRole roleId = roleMapper.checkRoleNameUnique(importDTO.getRoleName());
+                        if (StringUtils.isNotNull(roleId)) {
+                            user.setRoleIds(new Long[]{roleId.getRoleId()});
+                        }
+                    }
+
+                    this.insertUser(user);
+
+
+                    successNum++;
+                    successMsg.append("<br/>" + successNum + "、账号 " + user.getUserName() + " 导入成功");
+                } else {
+                    failureNum++;
+                    failureMsg.append("<br/>" + failureNum + "、账号 " + user.getUserName() + " 已存在");
+                }
+            } catch (Exception e) {
+                failureNum++;
+                String msg = "<br/>" + failureNum + "、账号 " + importDTO.getPhonenumber() + " 导入失败:";
+                failureMsg.append(msg + e.getMessage());
+                log.error(msg, e);
+            }
+        }
+
+        if (failureNum > 0) {
+            failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
+            throw new ServiceException(failureMsg.toString());
+        } else {
+            successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
+        }
+        return successMsg.toString();
+    }
+
+    /**
+     * 将 UserImportDTO 转换为 SysUser 实体
+     *
+     * @param importDTO 导入对象
+     * @param operName 操作用户名
+     * @return SysUser 实体
+     */
+    private SysUser convertToSysUser(UserImportDTO importDTO, String operName)
+    {
+        SysUser user = new SysUser();
+        user.setUserName(importDTO.getEmployeeCode());
+        user.setNickName(importDTO.getNickName());
+        user.setPhonenumber(importDTO.getPhonenumber());
+        user.setEmail(importDTO.getEmail());
+        user.setCreateBy(operName);
+        user.setCreateTime(DateUtils.getNowDate());
+        return user;
+    }
 }

+ 3 - 3
jd-logistics-modules/jd-logistics-system/src/main/resources/bootstrap.yml

@@ -14,14 +14,14 @@ spring:
     nacos:
       discovery:
         # 服务注册地址
-        server-addr: 192.168.100.246:8848
+        server-addr: 172.26.48.165:8848
       config:
         # 配置中心地址
-        server-addr: 192.168.100.246:8848
+        server-addr: 172.26.48.165:8848
         # 配置文件格式
         file-extension: yml
         # 共享配置
         shared-configs:
           - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
       username: nacos
-      password: nacos
+      password: sdwl_Huawei@!123

+ 12 - 0
jd-logistics-modules/jd-logistics-system/src/main/resources/mapper/system/SysDeptMapper.xml

@@ -179,4 +179,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		update sys_dept set del_flag = '2' where dept_id = #{deptId}
 	</delete>
 
+	<select id="selectDeptByInfo" resultMap="SysDeptResult">
+		<include refid="selectDeptVo"/>
+		where del_flag = '0'
+		<if test="deptCode != null and deptCode != ''">
+			and dept_code = #{deptCode}
+		</if>
+		<if test="deptName != null and deptName != ''">
+			and dept_name = #{deptName}
+		</if>
+		limit 1
+	</select>
+
 </mapper> 

+ 5 - 1
jd-logistics-modules/jd-logistics-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -24,6 +24,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="updateBy"     column="update_by"        />
         <result property="updateTime"   column="update_time"      />
         <result property="remark"       column="remark"           />
+		<result property="loginFirstDate"   column="login_first_date"      />
+		<result property="agreeFlag"       column="agree_flag"           />
         <association property="dept"    javaType="SysDept"         resultMap="deptResult" />
         <collection  property="roles"   javaType="java.util.List"  resultMap="RoleResult" />
     </resultMap>
@@ -48,7 +50,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </resultMap>
 	
 	<sql id="selectUserVo">
-        select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.pwd_update_date, u.create_by, u.create_time, u.remark, 
+        select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.pwd_update_date, u.create_by, u.create_time, u.remark,u.login_first_date,u.agree_flag,
         d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status,
         r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status
         from sys_user u
@@ -196,6 +198,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  			<if test="loginDate != null">login_date = #{loginDate},</if>
  			<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
  			<if test="remark != null">remark = #{remark},</if>
+			<if test="loginFirstDate != null">login_first_date = #{loginFirstDate},</if>
+			<if test="agreeFlag != null">agree_flag = #{agreeFlag},</if>
  			update_time = sysdate()
  		</set>
  		where user_id = #{userId}

+ 3 - 3
jd-logistics-visual/jd-logistics-monitor/src/main/resources/bootstrap.yml

@@ -14,14 +14,14 @@ spring:
     nacos:
       discovery:
         # 服务注册地址
-        server-addr: 127.0.0.1:8848
+        server-addr: 172.26.48.165:8848
       config:
         # 配置中心地址
-        server-addr: 127.0.0.1:8848
+        server-addr: 172.26.48.165:8848
         # 配置文件格式
         file-extension: yml
         # 共享配置
         shared-configs:
           - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
       username: nacos
-      password: nacos
+      password: sdwl_Huawei@!123