diff --git a/src/main/java/com/xdap/self_development/controller/ResponsiblePersonController.java b/src/main/java/com/xdap/self_development/controller/ResponsiblePersonController.java index beb0ba0..ea224b0 100644 --- a/src/main/java/com/xdap/self_development/controller/ResponsiblePersonController.java +++ b/src/main/java/com/xdap/self_development/controller/ResponsiblePersonController.java @@ -5,6 +5,7 @@ import com.definesys.mpaas.query.db.PageQueryResult; import com.xdap.api.moudle.department.pojo.entity.XdapDepartments; import com.xdap.api.moudle.user.pojo.XdapUsers; import com.xdap.runtime.service.RuntimeDatasourceService; +import com.xdap.self_development.common.MyResponse; import com.xdap.self_development.controller.form.*; import com.xdap.self_development.exception.CommonException; import com.xdap.self_development.pojo.ResponsiblePerson; @@ -12,8 +13,10 @@ import com.xdap.self_development.pojo.view.DepartmentUserView; import com.xdap.self_development.service.ResponsiblePersonService; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import javax.validation.constraints.NotBlank; import java.util.ArrayList; @@ -28,6 +31,36 @@ public class ResponsiblePersonController { @Resource private ResponsiblePersonService responsiblePersonService; + // 导入责任人 + @PostMapping("/import") + public Response importPerson( + @RequestPart("file") MultipartFile file, + @RequestPart("userId") String userId + ) { + MyResponse templateImportView = responsiblePersonService.importPerson(file, userId); + if (templateImportView.getFlag()) { + return Response.error("导入异常").data(templateImportView); + } else { + return Response.ok().setMessage("导入成功"); + } + } + + // 导出责任人 + @GetMapping("/export") + public void exportPerson( + HttpServletResponse response + ) { + responsiblePersonService.exportPerson(response); + } + + // 获取导入模板 + @GetMapping("/getImportTemplate") + public void getImportTemplate( + HttpServletResponse response + ) { + responsiblePersonService.exportVoidPerson(response); + } + // 判断是否为责任人 @GetMapping("/isResponsiblePerson") public Response isResponsiblePerson( diff --git a/src/main/java/com/xdap/self_development/listener/PersonReadListener.java b/src/main/java/com/xdap/self_development/listener/PersonReadListener.java new file mode 100644 index 0000000..f176dbd --- /dev/null +++ b/src/main/java/com/xdap/self_development/listener/PersonReadListener.java @@ -0,0 +1,43 @@ +package com.xdap.self_development.listener; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.read.listener.ReadListener; +import com.xdap.self_development.common.MyResponse; +import com.xdap.self_development.pojo.ResponsiblePerson; +import com.xdap.self_development.pojo.view.XdapUserView; +import com.xdap.self_development.service.ResponsiblePersonService; + +import java.util.ArrayList; +import java.util.List; + +public class PersonReadListener implements ReadListener { + MyResponse problems; + private final ResponsiblePersonService responsiblePersonService; + private List cachedDataList; + + public PersonReadListener(ResponsiblePersonService responsiblePersonService, MyResponse problems) { + this.problems = problems; + this.responsiblePersonService = responsiblePersonService; + this.cachedDataList = new ArrayList<>(); + } + + @Override + public void invoke(ResponsiblePerson responsiblePerson, AnalysisContext analysisContext) { + XdapUserView user = responsiblePersonService + .getUserByDeptAndName(responsiblePerson.getDepartment(), responsiblePerson.getPartsName()); + if (user == null || user.getUserId() == null) { + problems.setFlag(true); + problems.getErrors().add("责任人导入失败:" + responsiblePerson.getPartsName() + "无法找到"); + } else { + responsiblePerson.setUserId(user.getUserId()); + responsiblePerson.setDepartmentId(user.getDepartmentId()); + cachedDataList.add(responsiblePerson); + } + } + + @Override + public void doAfterAllAnalysed(AnalysisContext analysisContext) { + responsiblePersonService.importAllPerson(cachedDataList, problems); + cachedDataList.clear(); + } +} diff --git a/src/main/java/com/xdap/self_development/pojo/ResponsiblePerson.java b/src/main/java/com/xdap/self_development/pojo/ResponsiblePerson.java index 98796ff..b343068 100644 --- a/src/main/java/com/xdap/self_development/pojo/ResponsiblePerson.java +++ b/src/main/java/com/xdap/self_development/pojo/ResponsiblePerson.java @@ -1,5 +1,6 @@ package com.xdap.self_development.pojo; +import com.alibaba.excel.annotation.ExcelProperty; import com.definesys.mpaas.query.annotation.*; import com.definesys.mpaas.query.model.MpaasBasePojo; import lombok.Data; @@ -17,11 +18,14 @@ public class ResponsiblePerson extends MpaasBasePojo { private String id; private String departmentId; private String userId; + @ExcelProperty("责任部门") private String department; + @ExcelProperty("子系统") private String subsystem; private String partsName; private Integer personLevel; + @ExcelProperty("责任人") @Column(type = ColumnType.CALCULATE) private String username; } \ No newline at end of file diff --git a/src/main/java/com/xdap/self_development/pojo/view/XdapUserView.java b/src/main/java/com/xdap/self_development/pojo/view/XdapUserView.java new file mode 100644 index 0000000..c9dd71f --- /dev/null +++ b/src/main/java/com/xdap/self_development/pojo/view/XdapUserView.java @@ -0,0 +1,15 @@ +package com.xdap.self_development.pojo.view; + +import com.definesys.mpaas.query.annotation.SQL; +import com.definesys.mpaas.query.annotation.SQLQuery; +import lombok.Data; + +@SQLQuery(value = { + @SQL(view = "getUserByDeptAndName", + sql = "SELECT xu.id AS userId, xd.id AS departmentId FROM xdap_users xu LEFT JOIN xdap_dept_users xdu ON xu.id = xdu.user_id LEFT JOIN xdap_departments xd ON xdu.department_id = xd.id WHERE xu.username = #username AND xd.structure_name = #department") +}) +@Data +public class XdapUserView { + private String userId; + private String departmentId; +} diff --git a/src/main/java/com/xdap/self_development/service/ResponsiblePersonService.java b/src/main/java/com/xdap/self_development/service/ResponsiblePersonService.java index 65e91d0..bf404fd 100644 --- a/src/main/java/com/xdap/self_development/service/ResponsiblePersonService.java +++ b/src/main/java/com/xdap/self_development/service/ResponsiblePersonService.java @@ -2,12 +2,17 @@ package com.xdap.self_development.service; import com.definesys.mpaas.query.db.PageQueryResult; import com.xdap.api.moudle.user.pojo.XdapUsers; +import com.xdap.self_development.common.MyResponse; import com.xdap.self_development.controller.form.*; import com.xdap.self_development.pojo.ResponsiblePerson; +import com.xdap.self_development.pojo.view.XdapUserView; +import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import javax.validation.constraints.NotBlank; import java.util.ArrayList; +import java.util.List; import java.util.Set; public interface ResponsiblePersonService { @@ -29,4 +34,14 @@ public interface ResponsiblePersonService { Set getAllSubsystem(); ArrayList getUserBydepartment(String dept,String subsystem); + + void exportPerson(HttpServletResponse response); + + void exportVoidPerson(HttpServletResponse response); + + MyResponse importPerson(MultipartFile file, String userId); + + XdapUserView getUserByDeptAndName(@NotBlank String dept, @NotBlank String name); + + void importAllPerson(List cachedDataList, MyResponse problems); } diff --git a/src/main/java/com/xdap/self_development/service/impl/ResponsiblePersonServiceImpl.java b/src/main/java/com/xdap/self_development/service/impl/ResponsiblePersonServiceImpl.java index 8873007..b1e8c1c 100644 --- a/src/main/java/com/xdap/self_development/service/impl/ResponsiblePersonServiceImpl.java +++ b/src/main/java/com/xdap/self_development/service/impl/ResponsiblePersonServiceImpl.java @@ -1,19 +1,32 @@ package com.xdap.self_development.service.impl; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; import com.definesys.mpaas.query.db.PageQueryResult; import com.xdap.api.moudle.user.pojo.XdapUsers; import com.xdap.runtime.service.RuntimeDatasourceService; +import com.xdap.self_development.common.MyResponse; import com.xdap.self_development.config.BusinessDatabase; import com.xdap.self_development.controller.form.*; import com.xdap.self_development.exception.CommonException; +import com.xdap.self_development.listener.PersonReadListener; import com.xdap.self_development.pojo.Parameter; import com.xdap.self_development.pojo.ResponsiblePerson; +import com.xdap.self_development.pojo.view.XdapUserView; import com.xdap.self_development.service.ResponsiblePersonService; import com.xdap.self_development.service.XdapDeptUsersService; import org.apache.commons.lang3.ObjectUtils; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.InputStream; +import java.net.URLEncoder; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; import java.util.Set; @@ -156,4 +169,127 @@ public class ResponsiblePersonServiceImpl implements ResponsiblePersonService { } return xdapUsers1; } + + @Override + public void exportPerson(HttpServletResponse response) { + String fileName = "部门责任人_" + + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd_HH-mm-ss")); + try { + String encodedFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20"); + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("UTF-8"); + response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + encodedFileName + ".xlsx"); + response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); + response.setHeader("Pragma", "no-cache"); + response.setDateHeader("Expires", 0); + + List list = bd.getBusinessDatabase() + .viewQueryMode(true).view("getResponsibleAndName") + .setVar("level", 1) + .doQuery(ResponsiblePerson.class); + + EasyExcel.write(response.getOutputStream(), ResponsiblePerson.class) + .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) + .includeColumnFieldNames(getIncludeColumnFieldNames()) + .sheet("责任人") + .doWrite(list); + } catch (Exception e) { + throw new CommonException("导出Excel失败: " + e.getMessage()); + } + } + + @Override + public void exportVoidPerson(HttpServletResponse response) { + String fileName = "部门责任人导入模板_" + + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd_HH-mm-ss")); + try { + String encodedFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20"); + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("UTF-8"); + response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + encodedFileName + ".xlsx"); + response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); + response.setHeader("Pragma", "no-cache"); + response.setDateHeader("Expires", 0); + + List list = new ArrayList<>(); + list.add(new ResponsiblePerson()); + + EasyExcel.write(response.getOutputStream(), ResponsiblePerson.class) + .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) + .includeColumnFieldNames(getIncludeColumnFieldNames()) + .sheet("责任人") + .doWrite(list); + } catch (Exception e) { + throw new CommonException("导出Excel失败: " + e.getMessage()); + } + } + + @Override + public MyResponse importPerson(MultipartFile file, String userId) { + // 验证文件是否为工作表 + if (file == null || file.isEmpty()) { + throw new CommonException("文件不能为空"); + } + + String filename = file.getOriginalFilename(); + if (filename == null || + !(filename.toLowerCase().endsWith(".xls") || + filename.toLowerCase().endsWith(".xlsx"))) { + throw new CommonException("只支持 .xls 或 .xlsx 格式的文件"); + } + MyResponse problems = + new MyResponse(false, new ArrayList<>(), new StringBuilder("已完成导入:无")); + + try (InputStream inputStream = file.getInputStream()) { + EasyExcel.read( + inputStream, + Parameter.class, + new PersonReadListener(this, problems) + ).doReadAll(); + + } catch (IOException e) { + throw new CommonException("读取文件失败"); + } + + return problems; + } + + @Override + public XdapUserView getUserByDeptAndName(String dept, String name) { + return bd.getBusinessDatabase() + .viewQueryMode(true) + .view("getResponsibleAndName") + .setVar("department", dept) + .setVar("username", name) + .doQueryFirst(XdapUserView.class); + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void importAllPerson(List cachedDataList, MyResponse problems) { + cachedDataList.forEach(item -> { + List responsiblePeople = bd.getBusinessDatabase() + .eq("department_id", item.getDepartmentId()) + .eq("subsystem", item.getSubsystem()) + .eq("personLevel", 1) + .doQuery(ResponsiblePerson.class); + + if (!responsiblePeople.isEmpty()) { + problems.setFlag(false); + problems.getErrors().add("部门:" + item.getDepartment() + "子系统:" + item.getSubsystem() + "已存在责任人"); + } else { + bd.getBusinessDatabase().doInsert(item); + } + }); + } + + + private List getIncludeColumnFieldNames() { + List fieldNames = new ArrayList<>(); + fieldNames.add("department"); + fieldNames.add("subsystem"); + fieldNames.add("username"); + return fieldNames; + } } diff --git a/src/main/java/com/xdap/self_development/service/impl/TemplateServiceImpl.java b/src/main/java/com/xdap/self_development/service/impl/TemplateServiceImpl.java index 8aecec6..dba73b4 100644 --- a/src/main/java/com/xdap/self_development/service/impl/TemplateServiceImpl.java +++ b/src/main/java/com/xdap/self_development/service/impl/TemplateServiceImpl.java @@ -6,7 +6,6 @@ import com.alibaba.excel.write.metadata.WriteSheet; import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; import com.definesys.mpaas.query.db.PageQueryResult; import com.xdap.self_development.common.MyResponse; -import com.xdap.self_development.common.UserPermissionGetter; import com.xdap.self_development.config.BusinessDatabase; import com.xdap.self_development.controller.form.*; import com.xdap.self_development.exception.CommonException; @@ -39,8 +38,6 @@ import java.util.stream.Collectors; public class TemplateServiceImpl implements TemplateService { @Resource private BusinessDatabase bd; - @Resource - private UserPermissionGetter permissionGetter; @Override public PageQueryResult