新增:责任人导入功能

This commit is contained in:
zjh 2026-01-05 11:19:18 +08:00
parent 7f252ad4e0
commit 99e94f7d87
7 changed files with 248 additions and 11 deletions

View File

@ -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.department.pojo.entity.XdapDepartments;
import com.xdap.api.moudle.user.pojo.XdapUsers; import com.xdap.api.moudle.user.pojo.XdapUsers;
import com.xdap.runtime.service.RuntimeDatasourceService; 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.controller.form.*;
import com.xdap.self_development.exception.CommonException; import com.xdap.self_development.exception.CommonException;
import com.xdap.self_development.pojo.ResponsiblePerson; 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 com.xdap.self_development.service.ResponsiblePersonService;
import org.springframework.validation.BindingResult; import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import java.util.ArrayList; import java.util.ArrayList;
@ -28,6 +31,36 @@ public class ResponsiblePersonController {
@Resource @Resource
private ResponsiblePersonService responsiblePersonService; 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") @GetMapping("/isResponsiblePerson")
public Response isResponsiblePerson( public Response isResponsiblePerson(

View File

@ -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<ResponsiblePerson> {
MyResponse problems;
private final ResponsiblePersonService responsiblePersonService;
private List<ResponsiblePerson> 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();
}
}

View File

@ -1,5 +1,6 @@
package com.xdap.self_development.pojo; package com.xdap.self_development.pojo;
import com.alibaba.excel.annotation.ExcelProperty;
import com.definesys.mpaas.query.annotation.*; import com.definesys.mpaas.query.annotation.*;
import com.definesys.mpaas.query.model.MpaasBasePojo; import com.definesys.mpaas.query.model.MpaasBasePojo;
import lombok.Data; import lombok.Data;
@ -17,11 +18,14 @@ public class ResponsiblePerson extends MpaasBasePojo {
private String id; private String id;
private String departmentId; private String departmentId;
private String userId; private String userId;
@ExcelProperty("责任部门")
private String department; private String department;
@ExcelProperty("子系统")
private String subsystem; private String subsystem;
private String partsName; private String partsName;
private Integer personLevel; private Integer personLevel;
@ExcelProperty("责任人")
@Column(type = ColumnType.CALCULATE) @Column(type = ColumnType.CALCULATE)
private String username; private String username;
} }

View File

@ -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;
}

View File

@ -2,12 +2,17 @@ package com.xdap.self_development.service;
import com.definesys.mpaas.query.db.PageQueryResult; import com.definesys.mpaas.query.db.PageQueryResult;
import com.xdap.api.moudle.user.pojo.XdapUsers; 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.controller.form.*;
import com.xdap.self_development.pojo.ResponsiblePerson; 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.Valid;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List;
import java.util.Set; import java.util.Set;
public interface ResponsiblePersonService { public interface ResponsiblePersonService {
@ -29,4 +34,14 @@ public interface ResponsiblePersonService {
Set<String> getAllSubsystem(); Set<String> getAllSubsystem();
ArrayList<XdapUsers> getUserBydepartment(String dept,String subsystem); ArrayList<XdapUsers> 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<ResponsiblePerson> cachedDataList, MyResponse problems);
} }

View File

@ -1,19 +1,32 @@
package com.xdap.self_development.service.impl; 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.definesys.mpaas.query.db.PageQueryResult;
import com.xdap.api.moudle.user.pojo.XdapUsers; import com.xdap.api.moudle.user.pojo.XdapUsers;
import com.xdap.runtime.service.RuntimeDatasourceService; 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.config.BusinessDatabase;
import com.xdap.self_development.controller.form.*; import com.xdap.self_development.controller.form.*;
import com.xdap.self_development.exception.CommonException; 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.Parameter;
import com.xdap.self_development.pojo.ResponsiblePerson; 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.ResponsiblePersonService;
import com.xdap.self_development.service.XdapDeptUsersService; import com.xdap.self_development.service.XdapDeptUsersService;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource; 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.ArrayList;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
@ -156,4 +169,127 @@ public class ResponsiblePersonServiceImpl implements ResponsiblePersonService {
} }
return xdapUsers1; 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<ResponsiblePerson> 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<ResponsiblePerson> 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<ResponsiblePerson> cachedDataList, MyResponse problems) {
cachedDataList.forEach(item -> {
List<ResponsiblePerson> 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<String> getIncludeColumnFieldNames() {
List<String> fieldNames = new ArrayList<>();
fieldNames.add("department");
fieldNames.add("subsystem");
fieldNames.add("username");
return fieldNames;
}
} }

View File

@ -6,7 +6,6 @@ import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import com.definesys.mpaas.query.db.PageQueryResult; import com.definesys.mpaas.query.db.PageQueryResult;
import com.xdap.self_development.common.MyResponse; 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.config.BusinessDatabase;
import com.xdap.self_development.controller.form.*; import com.xdap.self_development.controller.form.*;
import com.xdap.self_development.exception.CommonException; import com.xdap.self_development.exception.CommonException;
@ -39,8 +38,6 @@ import java.util.stream.Collectors;
public class TemplateServiceImpl implements TemplateService { public class TemplateServiceImpl implements TemplateService {
@Resource @Resource
private BusinessDatabase bd; private BusinessDatabase bd;
@Resource
private UserPermissionGetter permissionGetter;
@Override @Override
public PageQueryResult<Template> getTemplateByCondition(TemplatePageForm form) { public PageQueryResult<Template> getTemplateByCondition(TemplatePageForm form) {
@ -187,13 +184,6 @@ public class TemplateServiceImpl implements TemplateService {
List<Parameter> list; List<Parameter> list;
if (form.isTemplateEmpty()) { if (form.isTemplateEmpty()) {
// list = bd.getBusinessDatabase()
// .viewQueryMode(true)
// .view("selectParametersByTId")
// .setVar("templateId", templateDB.getId())
// .select("parameterName", "parameterNumber")
// .orderBy("parameterNumber", "asc")
// .doQuery(Parameter.class);
list = new ArrayList<>(); list = new ArrayList<>();
list.add(new Parameter()); list.add(new Parameter());
} else { } else {
@ -363,6 +353,7 @@ public class TemplateServiceImpl implements TemplateService {
Parameter existingParam = existingParamMap.get(key); Parameter existingParam = existingParamMap.get(key);
if (existingParam != null) { if (existingParam != null) {
newParam.setId(existingParam.getId()); newParam.setId(existingParam.getId());
String datils = getParameterChange(existingParam, newParam);
bd.getBusinessDatabase() bd.getBusinessDatabase()
.eq("id", newParam.getId()) .eq("id", newParam.getId())
.doUpdate(newParam); .doUpdate(newParam);
@ -372,7 +363,7 @@ public class TemplateServiceImpl implements TemplateService {
targetTemplate.getTemplateName(), targetTemplate.getTemplateName(),
targetTemplate.getVersion(), targetTemplate.getVersion(),
newParam.getParameterNumber(), newParam.getParameterNumber(),
"更新参数", datils,
targetTemplate.getId(), targetTemplate.getId(),
existingParam.getId(), existingParam.getId(),
Timestamp.valueOf(LocalDateTime.now()), Timestamp.valueOf(LocalDateTime.now()),