4 次代码提交 1a89ff4151 ... 5d30e43e5e

作者 SHA1 备注 提交日期
  hanchaolong 5d30e43e5e feat: 用户、组织机构导入功能开发; 1 天之前
  hanchaolong 75563050df Merge branch 'master' of http://git.dgtis.com/hanchaolong/jd_logistics 1 天之前
  hanchaolong d9609043a0 feat: 用户、组织机构导入功能开发; 1 天之前
  hanchaolong 423876b581 feat: 用户、组织机构导入功能开发; 4 天之前

+ 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;

+ 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, "部门数据");
+    }
 }

+ 17 - 9
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, "用户数据");
     }
 

+ 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);

+ 82 - 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,83 @@ 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()));
+                    continue;
+                } 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;
+    }
 }

+ 98 - 0
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;
 
@@ -594,4 +602,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;
+    }
 }

+ 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>