From 34b5862db82c767c0cf872e5e49fb57dc3f0fc28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BB=98=E7=BB=AA=E5=A3=AE?= <2235602974@qq.com> Date: Mon, 21 Mar 2022 09:54:34 +0800 Subject: [PATCH 1/3] =?UTF-8?q?:sparkles:=20=E8=8F=9C=E5=8D=95=E7=BB=B4?= =?UTF-8?q?=E6=8A=A4=E6=9C=8D=E5=8A=A1=E7=9B=91=E6=8E=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/pig.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/db/pig.sql b/db/pig.sql index f6cfea7e0..9e08532be 100644 --- a/db/pig.sql +++ b/db/pig.sql @@ -277,6 +277,7 @@ INSERT INTO `sys_menu` VALUES (3301, '表单新增', 'gen_form_add', NULL, 3300, INSERT INTO `sys_menu` VALUES (3302, '表单修改', 'gen_form_edit', NULL, 3300, '', 0, '0', '1', '0', ' ', '2018-05-15 21:35:18', ' ', '2020-03-11 22:39:09'); INSERT INTO `sys_menu` VALUES (3303, '表单删除', 'gen_form_del', NULL, 3300, '', 0, '0', '1', '0', ' ', '2018-05-15 21:35:18', ' ', '2020-03-11 22:39:11'); INSERT INTO `sys_menu` VALUES (3400, '表单设计', NULL, '/gen/design', 3000, 'icon-biaodanbiaoqian', 0, '1', '0', '0', ' ', '2020-03-11 22:18:05', ' ', '2020-03-12 00:16:25'); +INSERT INTO `sys_menu` VALUES (4000, '服务监控', NULL, 'http://localhost:5001/login', -1, 'icon-zhexiantu', 4, '0', '0', '0', 'admin', '2022-03-21 09:44:50', 'admin', '2022-03-21 09:47:06'); INSERT INTO `sys_menu` VALUES (9999, '系统官网', NULL, 'https://pig4cloud.com/#/', -1, 'icon-guanwangfangwen', 999, '0', '0', '0', ' ', '2019-01-17 17:05:19', 'admin', '2020-03-11 23:52:57'); COMMIT; @@ -440,6 +441,7 @@ INSERT INTO `sys_role_menu` VALUES (1, 3301); INSERT INTO `sys_role_menu` VALUES (1, 3302); INSERT INTO `sys_role_menu` VALUES (1, 3303); INSERT INTO `sys_role_menu` VALUES (1, 3400); +INSERT INTO `sys_role_menu` VALUES (1, 4000); INSERT INTO `sys_role_menu` VALUES (1, 9999); COMMIT; From 6784cb8b8cf46e04b5bc9e657961f10d7c404eac Mon Sep 17 00:00:00 2001 From: fxz <2235602974@qq.com> Date: Mon, 21 Mar 2022 03:08:31 +0000 Subject: [PATCH 2/3] update db/pig.sql. --- db/pig.sql | 1 - 1 file changed, 1 deletion(-) diff --git a/db/pig.sql b/db/pig.sql index be7ce7f26..62941675c 100644 --- a/db/pig.sql +++ b/db/pig.sql @@ -264,7 +264,6 @@ INSERT INTO `sys_menu` VALUES (2400, '终端管理', '', '/admin/client/index', INSERT INTO `sys_menu` VALUES (2401, '客户端新增', 'sys_client_add', NULL, 2400, '1', 0, '0', '1', '0', ' ', '2018-05-15 21:35:18', ' ', '2021-05-25 06:48:34'); INSERT INTO `sys_menu` VALUES (2402, '客户端修改', 'sys_client_edit', NULL, 2400, NULL, 0, '0', '1', '0', ' ', '2018-05-15 21:37:06', ' ', '2021-05-25 06:48:34'); INSERT INTO `sys_menu` VALUES (2403, '客户端删除', 'sys_client_del', NULL, 2400, NULL, 0, '0', '1', '0', ' ', '2018-05-15 21:39:16', ' ', '2021-05-25 06:48:34'); -INSERT INTO `sys_menu` VALUES (2500, '服务监控', NULL, 'http://localhost:5001', 2000, 'icon-server', 0, '0', '0', '0', ' ', '2018-06-26 10:50:32', ' ', '2019-02-01 20:41:30'); INSERT INTO `sys_menu` VALUES (2600, '文件管理', NULL, '/admin/file/index', 2000, 'icon-wenjianguanli', 0, '0', '0', '0', ' ', '2018-06-26 10:50:32', ' ', '2019-02-01 20:41:30'); INSERT INTO `sys_menu` VALUES (2601, '文件删除', 'sys_file_del', NULL, 2600, NULL, 0, '0', '1', '0', ' ', '2017-11-29 11:30:11', ' ', '2021-05-25 06:48:34'); INSERT INTO `sys_menu` VALUES (2602, '文件新增', 'sys_file_add', NULL, 2600, NULL, 0, '0', '1', '0', ' ', '2018-05-11 22:34:55', ' ', '2021-05-25 06:48:34'); From 6d4c3d11fafcd195b44fdba8d6a87e4bf2f7ab2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BB=98=E7=BB=AA=E5=A3=AE?= <2235602974@qq.com> Date: Mon, 21 Mar 2022 14:56:13 +0800 Subject: [PATCH 3/3] =?UTF-8?q?:sparkles:=20=E8=A7=92=E8=89=B2=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E3=80=81=E5=B2=97=E4=BD=8D=E7=AE=A1=E7=90=86=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/pig.sql | 4 + .../pig/admin/api/vo/PostExcelVO.java | 64 ++++++++++++++ .../pig/admin/api/vo/RoleExcelVO.java | 56 +++++++++++++ .../pig/admin/controller/PostController.java | 27 ++++++ .../pig/admin/controller/RoleController.java | 27 ++++++ .../pig/admin/service/SysPostService.java | 19 +++++ .../pig/admin/service/SysRoleService.java | 19 +++++ .../service/impl/SysPostServiceImpl.java | 78 ++++++++++++++++++ .../service/impl/SysRoleServiceImpl.java | 78 ++++++++++++++++++ .../src/main/resources/file/post.xlsx | Bin 0 -> 8905 bytes .../src/main/resources/file/role.xlsx | Bin 0 -> 8834 bytes 11 files changed, 372 insertions(+) create mode 100644 pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/PostExcelVO.java create mode 100644 pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/RoleExcelVO.java create mode 100644 pig-upms/pig-upms-biz/src/main/resources/file/post.xlsx create mode 100644 pig-upms/pig-upms-biz/src/main/resources/file/role.xlsx diff --git a/db/pig.sql b/db/pig.sql index be7ce7f26..b9793af01 100644 --- a/db/pig.sql +++ b/db/pig.sql @@ -241,6 +241,7 @@ INSERT INTO `sys_menu` VALUES (1301, '角色新增', 'sys_role_add', NULL, 1300, INSERT INTO `sys_menu` VALUES (1302, '角色修改', 'sys_role_edit', NULL, 1300, NULL, 0, '0', '1', '0', ' ', '2017-11-08 10:14:41', ' ', '2021-05-25 06:48:34'); INSERT INTO `sys_menu` VALUES (1303, '角色删除', 'sys_role_del', NULL, 1300, NULL, 0, '0', '1', '0', ' ', '2017-11-08 10:14:59', ' ', '2021-05-25 06:48:34'); INSERT INTO `sys_menu` VALUES (1304, '分配权限', 'sys_role_perm', NULL, 1300, NULL, 0, '0', '1', '0', ' ', '2018-04-20 07:22:55', ' ', '2021-05-25 06:48:34'); +INSERT INTO `sys_menu` VALUES (1305, '导入导出', 'sys_role_import_export', NULL, 1300, NULL, 0, '0', '1', '0', 'admin', '2022-03-21 11:14:52', 'admin', '2022-03-21 11:15:07'); INSERT INTO `sys_menu` VALUES (1400, '部门管理', NULL, '/admin/dept/index', 1000, 'icon-web-icon-', 0, '0', '0', '0', ' ', '2018-01-20 13:17:19', ' ', '2020-03-12 00:15:44'); INSERT INTO `sys_menu` VALUES (1401, '部门新增', 'sys_dept_add', NULL, 1400, NULL, 0, '0', '1', '0', ' ', '2018-01-20 14:56:16', ' ', '2021-05-25 06:48:34'); INSERT INTO `sys_menu` VALUES (1402, '部门修改', 'sys_dept_edit', NULL, 1400, NULL, 0, '0', '1', '0', ' ', '2018-01-20 14:56:59', ' ', '2021-05-25 06:48:34'); @@ -250,6 +251,7 @@ INSERT INTO `sys_menu` VALUES (1501, '岗位查看', 'sys_post_get', NULL, 1500, INSERT INTO `sys_menu` VALUES (1502, '岗位新增', 'sys_post_add', NULL, 1500, '1', 1, '0', '1', '0', NULL, '2018-05-15 21:35:18', 'admin', '2022-03-15 17:32:48'); INSERT INTO `sys_menu` VALUES (1503, '岗位修改', 'sys_post_edit', NULL, 1500, '1', 2, '0', '1', '0', NULL, '2018-05-15 21:35:18', 'admin', '2022-03-15 17:33:10'); INSERT INTO `sys_menu` VALUES (1504, '岗位删除', 'sys_post_del', NULL, 1500, '1', 3, '0', '1', '0', NULL, '2018-05-15 21:35:18', 'admin', '2022-03-15 17:33:27'); +INSERT INTO `sys_menu` VALUES (1505, '导入导出', 'sys_post_import_export', NULL, 1500, NULL, 4, '0', '1', '0', 'admin', '2022-03-21 12:53:05', 'admin', '2022-03-21 12:53:05'); INSERT INTO `sys_menu` VALUES (2000, '系统管理', NULL, '/setting', -1, 'icon-xitongguanli', 2, '0', '0', '0', ' ', '2017-11-07 20:56:00', ' ', '2020-03-11 23:52:53'); INSERT INTO `sys_menu` VALUES (2100, '日志管理', NULL, '/admin/log/index', 2000, 'icon-rizhiguanli', 0, '0', '0', '0', ' ', '2017-11-20 14:06:22', ' ', '2020-03-12 00:15:49'); INSERT INTO `sys_menu` VALUES (2101, '日志删除', 'sys_log_del', NULL, 2100, NULL, 0, '0', '1', '0', ' ', '2017-11-20 20:37:37', ' ', '2021-05-25 06:48:34'); @@ -413,6 +415,7 @@ INSERT INTO `sys_role_menu` VALUES (1, 1301); INSERT INTO `sys_role_menu` VALUES (1, 1302); INSERT INTO `sys_role_menu` VALUES (1, 1303); INSERT INTO `sys_role_menu` VALUES (1, 1304); +INSERT INTO `sys_role_menu` VALUES (1, 1305); INSERT INTO `sys_role_menu` VALUES (1, 1400); INSERT INTO `sys_role_menu` VALUES (1, 1401); INSERT INTO `sys_role_menu` VALUES (1, 1402); @@ -422,6 +425,7 @@ INSERT INTO `sys_role_menu` VALUES (1, 1501); INSERT INTO `sys_role_menu` VALUES (1, 1502); INSERT INTO `sys_role_menu` VALUES (1, 1503); INSERT INTO `sys_role_menu` VALUES (1, 1504); +INSERT INTO `sys_role_menu` VALUES (1, 1505); INSERT INTO `sys_role_menu` VALUES (1, 2000); INSERT INTO `sys_role_menu` VALUES (1, 2100); INSERT INTO `sys_role_menu` VALUES (1, 2101); diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/PostExcelVO.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/PostExcelVO.java new file mode 100644 index 000000000..cb1fd1021 --- /dev/null +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/PostExcelVO.java @@ -0,0 +1,64 @@ +package com.pig4cloud.pig.admin.api.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 岗位excel 对应的实体 + * + * @author fxz + * @date 2022/3/21 + */ +@Data +@ColumnWidth(30) +public class PostExcelVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @ExcelProperty("岗位编号") + private Long postId; + + /** + * 岗位名称 + */ + @NotBlank(message = "岗位名称不能为空") + @ExcelProperty("岗位名称") + private String postName; + + /** + * 岗位标识 + */ + @NotBlank(message = "岗位标识不能为空") + @ExcelProperty("岗位标识") + private String postCode; + + /** + * 岗位排序 + */ + @NotNull(message = "岗位排序不能为空") + @ExcelProperty("岗位排序") + private Integer postSort; + + /** + * 岗位描述 + */ + @NotBlank(message = "岗位描述不能为空") + @ExcelProperty(value = "岗位描述") + private String remark; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private LocalDateTime createTime; + +} diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/RoleExcelVO.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/RoleExcelVO.java new file mode 100644 index 000000000..81da88330 --- /dev/null +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/vo/RoleExcelVO.java @@ -0,0 +1,56 @@ +package com.pig4cloud.pig.admin.api.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 角色excel 对应的实体 + * + * @author fxz + * @date 2022/3/21 + */ +@Data +@ColumnWidth(30) +public class RoleExcelVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @ExcelProperty("角色编号") + private Long roleId; + + /** + * 角色名称 + */ + @NotBlank(message = "角色名称不能为空") + @ExcelProperty("角色名称") + private String roleName; + + /** + * 角色标识 + */ + @NotBlank(message = "角色标识不能为空") + @ExcelProperty("角色标识") + private String roleCode; + + /** + * 角色描述 + */ + @NotBlank(message = "角色描述不能为空") + @ExcelProperty("角色描述") + private String roleDesc; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private LocalDateTime createTime; + +} diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/PostController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/PostController.java index ec7ab25f0..c7912bb65 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/PostController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/PostController.java @@ -20,13 +20,17 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.pig4cloud.pig.admin.api.entity.SysPost; +import com.pig4cloud.pig.admin.api.vo.PostExcelVO; import com.pig4cloud.pig.admin.service.SysPostService; import com.pig4cloud.pig.common.core.util.R; import com.pig4cloud.pig.common.log.annotation.SysLog; +import com.pig4cloud.plugin.excel.annotation.RequestExcel; +import com.pig4cloud.plugin.excel.annotation.ResponseExcel; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -115,4 +119,27 @@ public R removeById(@PathVariable Long postId) { return R.ok(sysPostService.removeById(postId)); } + /** + * 导出excel 表格 + * @return + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('sys_post_import_export')") + public List export() { + return sysPostService.listPost(); + } + + /** + * 导入岗位 + * @param excelVOList 岗位列表 + * @param bindingResult 错误信息列表 + * @return ok fail + */ + @PostMapping("/import") + @PreAuthorize("@pms.hasPermission('sys_post_import_export')") + public R importRole(@RequestExcel List excelVOList, BindingResult bindingResult) { + return sysPostService.importPost(excelVOList, bindingResult); + } + } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/RoleController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/RoleController.java index b1254a102..f9ea9c54c 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/RoleController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/RoleController.java @@ -20,14 +20,18 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.pig4cloud.pig.admin.api.entity.SysRole; +import com.pig4cloud.pig.admin.api.vo.RoleExcelVO; import com.pig4cloud.pig.admin.api.vo.RoleVo; import com.pig4cloud.pig.admin.service.SysRoleMenuService; import com.pig4cloud.pig.admin.service.SysRoleService; import com.pig4cloud.pig.common.core.util.R; import com.pig4cloud.pig.common.log.annotation.SysLog; +import com.pig4cloud.plugin.excel.annotation.RequestExcel; +import com.pig4cloud.plugin.excel.annotation.ResponseExcel; import io.swagger.annotations.Api; import lombok.RequiredArgsConstructor; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -125,4 +129,27 @@ public R saveRoleMenus(@RequestBody RoleVo roleVo) { return R.ok(sysRoleMenuService.saveRoleMenus(sysRole.getRoleCode(), roleVo.getRoleId(), roleVo.getMenuIds())); } + /** + * 导出excel 表格 + * @return + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('sys_role_import_export')") + public List export() { + return sysRoleService.listRole(); + } + + /** + * 导入角色 + * @param excelVOList 角色列表 + * @param bindingResult 错误信息列表 + * @return ok fail + */ + @PostMapping("/import") + @PreAuthorize("@pms.hasPermission('sys_role_import_export')") + public R importRole(@RequestExcel List excelVOList, BindingResult bindingResult) { + return sysRoleService.importRole(excelVOList, bindingResult); + } + } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysPostService.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysPostService.java index 26a415f9e..6bd2ea6c9 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysPostService.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysPostService.java @@ -19,6 +19,11 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.pig4cloud.pig.admin.api.entity.SysPost; +import com.pig4cloud.pig.admin.api.vo.PostExcelVO; +import com.pig4cloud.pig.common.core.util.R; +import org.springframework.validation.BindingResult; + +import java.util.List; /** * 岗位管理 服务类 @@ -28,4 +33,18 @@ */ public interface SysPostService extends IService { + /** + * 导入岗位 + * @param excelVOList 岗位列表 + * @param bindingResult 错误信息列表 + * @return ok fail + */ + R importPost(List excelVOList, BindingResult bindingResult); + + /** + * 导出excel 表格 + * @return + */ + List listPost(); + } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysRoleService.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysRoleService.java index bad70cafb..c00b36a12 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysRoleService.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/SysRoleService.java @@ -18,6 +18,11 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.pig4cloud.pig.admin.api.entity.SysRole; +import com.pig4cloud.pig.admin.api.vo.RoleExcelVO; +import com.pig4cloud.pig.common.core.util.R; +import org.springframework.validation.BindingResult; + +import java.util.List; /** *

@@ -36,4 +41,18 @@ public interface SysRoleService extends IService { */ Boolean removeRoleById(Long id); + /** + * 导入角色 + * @param excelVOList 角色列表 + * @param bindingResult 错误信息列表 + * @return ok fail + */ + R importRole(List excelVOList, BindingResult bindingResult); + + /** + * 查询全部的角色 + * @return list + */ + List listRole(); + } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysPostServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysPostServiceImpl.java index 03340f23c..63756ea05 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysPostServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysPostServiceImpl.java @@ -16,11 +16,24 @@ */ package com.pig4cloud.pig.admin.service.impl; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.pig4cloud.pig.admin.api.entity.SysPost; +import com.pig4cloud.pig.admin.api.entity.SysRole; +import com.pig4cloud.pig.admin.api.vo.PostExcelVO; import com.pig4cloud.pig.admin.mapper.SysPostMapper; import com.pig4cloud.pig.admin.service.SysPostService; +import com.pig4cloud.pig.common.core.util.R; +import com.pig4cloud.plugin.excel.vo.ErrorMessage; import org.springframework.stereotype.Service; +import org.springframework.validation.BindingResult; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; /** * 岗位管理表 服务实现类 @@ -31,4 +44,69 @@ @Service public class SysPostServiceImpl extends ServiceImpl implements SysPostService { + /** + * 导入岗位 + * @param excelVOList 岗位列表 + * @param bindingResult 错误信息列表 + * @return ok fail + */ + @Override + public R importPost(List excelVOList, BindingResult bindingResult) { + // 通用校验获取失败的数据 + List errorMessageList = (List) bindingResult.getTarget(); + + // 个性化校验逻辑 + List postList = this.list(); + + // 执行数据插入操作 组装 PostDto + for (int i = 0; i < excelVOList.size(); i++) { + PostExcelVO excel = excelVOList.get(i); + Set errorMsg = new HashSet<>(); + // 检验岗位名称或者岗位编码是否存在 + boolean existPost = postList.stream().anyMatch(post -> excel.getPostName().equals(post.getPostName()) + || excel.getPostCode().equals(post.getPostCode())); + + if (existPost) { + errorMsg.add(String.format("%s %s 岗位名或岗位编码已经存在", excel.getPostName(), excel.getPostCode())); + } + + // 数据合法情况 + if (CollUtil.isEmpty(errorMsg)) { + insertExcelPost(excel); + } + else { + // 数据不合法 + errorMessageList.add(new ErrorMessage((long) (i + 2), errorMsg)); + } + } + if (CollUtil.isNotEmpty(errorMessageList)) { + return R.failed(errorMessageList); + } + return R.ok(); + } + + /** + * 导出excel 表格 + * @return + */ + @Override + public List listPost() { + List postList = this.list(Wrappers.emptyWrapper()); + // 转换成execl 对象输出 + return postList.stream().map(post -> { + PostExcelVO postExcelVO = new PostExcelVO(); + BeanUtil.copyProperties(post, postExcelVO); + return postExcelVO; + }).collect(Collectors.toList()); + } + + /** + * 插入excel Post + */ + private void insertExcelPost(PostExcelVO excel) { + SysPost sysPost = new SysPost(); + BeanUtil.copyProperties(excel, sysPost); + this.save(sysPost); + } + } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysRoleServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysRoleServiceImpl.java index bbadc3846..74c17eca2 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysRoleServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysRoleServiceImpl.java @@ -16,18 +16,29 @@ package com.pig4cloud.pig.admin.service.impl; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.pig4cloud.pig.admin.api.entity.SysRole; import com.pig4cloud.pig.admin.api.entity.SysRoleMenu; +import com.pig4cloud.pig.admin.api.vo.RoleExcelVO; import com.pig4cloud.pig.admin.mapper.SysRoleMapper; import com.pig4cloud.pig.admin.mapper.SysRoleMenuMapper; import com.pig4cloud.pig.admin.service.SysRoleService; import com.pig4cloud.pig.common.core.constant.CacheConstants; +import com.pig4cloud.pig.common.core.util.R; +import com.pig4cloud.plugin.excel.vo.ErrorMessage; import lombok.RequiredArgsConstructor; import org.springframework.cache.annotation.CacheEvict; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.BindingResult; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; /** *

@@ -56,4 +67,71 @@ public Boolean removeRoleById(Long id) { return this.removeById(id); } + /** + * 导入角色 + * @param excelVOList 角色列表 + * @param bindingResult 错误信息列表 + * @return ok fail + */ + @Override + public R importRole(List excelVOList, BindingResult bindingResult) { + // 通用校验获取失败的数据 + List errorMessageList = (List) bindingResult.getTarget(); + + // 个性化校验逻辑 + List roleList = this.list(); + + // 执行数据插入操作 组装 RoleDto + for (int i = 0; i < excelVOList.size(); i++) { + RoleExcelVO excel = excelVOList.get(i); + Set errorMsg = new HashSet<>(); + // 检验角色名称或者角色编码是否存在 + boolean existRole = roleList.stream().anyMatch(sysRole -> excel.getRoleName().equals(sysRole.getRoleName()) + || excel.getRoleCode().equals(sysRole.getRoleCode())); + + if (existRole) { + errorMsg.add(String.format("%s %s 角色名或角色编码已经存在", excel.getRoleName(), excel.getRoleDesc())); + } + + // 数据合法情况 + if (CollUtil.isEmpty(errorMsg)) { + insertExcelRole(excel); + } + else { + // 数据不合法情况 + errorMessageList.add(new ErrorMessage((long) (i + 2), errorMsg)); + } + } + if (CollUtil.isNotEmpty(errorMessageList)) { + return R.failed(errorMessageList); + } + return R.ok(); + } + + /** + * 查询全部的角色 + * @return list + */ + @Override + public List listRole() { + List roleList = this.list(Wrappers.emptyWrapper()); + // 转换成execl 对象输出 + return roleList.stream().map(role -> { + RoleExcelVO roleExcelVO = new RoleExcelVO(); + BeanUtil.copyProperties(role, roleExcelVO); + return roleExcelVO; + }).collect(Collectors.toList()); + } + + /** + * 插入excel Role + */ + private void insertExcelRole(RoleExcelVO excel) { + SysRole sysRole = new SysRole(); + sysRole.setRoleName(excel.getRoleName()); + sysRole.setRoleDesc(excel.getRoleDesc()); + sysRole.setRoleCode(excel.getRoleCode()); + this.save(sysRole); + } + } diff --git a/pig-upms/pig-upms-biz/src/main/resources/file/post.xlsx b/pig-upms/pig-upms-biz/src/main/resources/file/post.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..4e98211b965b0f799455a25bac73f76b6a308c7d GIT binary patch literal 8905 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 E1CA*q?*IS* literal 0 HcmV?d00001 diff --git a/pig-upms/pig-upms-biz/src/main/resources/file/role.xlsx b/pig-upms/pig-upms-biz/src/main/resources/file/role.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..0c986e8bdee6e584a5648f86436797751f807516 GIT binary patch literal 8834 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 literal 0 HcmV?d00001