package org.jeecg.modules.project.controller;
|
|
import java.math.BigDecimal;
|
import java.util.*;
|
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.stream.Collectors;
|
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
|
import cn.hutool.core.thread.ThreadUtil;
|
import com.alibaba.excel.EasyExcel;
|
import com.alibaba.excel.ExcelReader;
|
import com.alibaba.excel.read.builder.ExcelReaderBuilder;
|
import com.alibaba.excel.read.metadata.ReadSheet;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
import org.apache.commons.lang3.StringUtils;
|
import org.apache.shiro.SecurityUtils;
|
import org.jeecg.common.api.dto.message.CustomMessage;
|
import org.jeecg.common.api.dto.message.TemplateMessageDTO;
|
import org.jeecg.common.api.vo.Result;
|
import org.jeecg.common.aspect.annotation.AutoLog;
|
import org.jeecg.common.aspect.annotation.PermissionData;
|
import org.jeecg.common.constant.WebsocketConst;
|
import org.jeecg.common.system.api.ISysBaseAPI;
|
import org.jeecg.common.system.base.controller.JeecgController;
|
import org.jeecg.common.system.query.QueryGenerator;
|
import org.jeecg.common.system.vo.DictModel;
|
import org.jeecg.common.system.vo.LoginUser;
|
import org.jeecg.common.util.DateUtils;
|
import org.jeecg.common.util.oConvertUtils;
|
import org.jeecg.modules.excel.ExcelService;
|
import org.jeecg.modules.excel.ExcelUtils;
|
import org.jeecg.modules.feign.SystemClient;
|
import org.jeecg.modules.feign.model.SysDepart;
|
import org.jeecg.modules.feign.model.SysUser;
|
import org.jeecg.modules.group.service.IProProjectGroupService;
|
import org.jeecg.modules.project.entity.*;
|
import org.jeecg.modules.project.service.IProMilepostService;
|
import org.jeecg.modules.project.service.IProProjectLinkService;
|
import org.jeecg.modules.project.service.IProProjectService;
|
import org.jeecg.modules.project.service.IProSummaryService;
|
import org.jeecg.modules.project.vo.ProjectVo;
|
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
|
import org.jeecgframework.poi.excel.entity.ExportParams;
|
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMethod;
|
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartHttpServletRequest;
|
import org.springframework.web.servlet.ModelAndView;
|
|
import io.swagger.annotations.Api;
|
import io.swagger.annotations.ApiOperation;
|
import lombok.extern.slf4j.Slf4j;
|
|
@Slf4j
|
@Api(tags = "项目表")
|
@RestController
|
@RequestMapping("/pro/project")
|
public class ProProjectController extends JeecgController<ProProject, IProProjectService> {
|
@Autowired
|
private IProProjectService proProjectService;
|
@Autowired
|
private IProSummaryService summaryService;
|
@Autowired
|
private IProMilepostService milepostService;
|
@Autowired
|
private IProProjectLinkService proLinkService;
|
//注入feign客户端
|
@Autowired
|
private SystemClient systemClient;
|
@Autowired
|
private IProProjectGroupService projectGroupService;
|
@Autowired
|
private ExcelUtils excelUtils;
|
@Autowired
|
private ISysBaseAPI sysBaseAPI;
|
|
|
@Value("${jeecg.path.upload}")
|
private String upLoadPath;
|
|
|
@ApiOperation(value = "获取项目列表", notes = "获取所有项目列表")
|
@AutoLog(value = "获取项目列表")
|
@RequestMapping(value = "/list", method = RequestMethod.GET)
|
@PermissionData(pageComponent = "pro/ProjectList")
|
public Result<IPage<ProProject>> queryPageList(ProProject project,
|
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
|
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
|
HttpServletRequest req) {
|
Result<IPage<ProProject>> result = new Result<IPage<ProProject>>();
|
QueryWrapper<ProProject> queryWrapper = QueryGenerator.initQueryWrapper(project, req.getParameterMap());
|
|
Page<ProProject> page = new Page<ProProject>(pageNo, pageSize);
|
IPage<ProProject> pageList = proProjectService.page(page, queryWrapper);
|
result.setSuccess(true);
|
result.setResult(pageList);
|
return result;
|
}
|
|
@ApiOperation(value = "周报组件获取项目列表", notes = "周报组件获取项目列表")
|
@AutoLog(value = "周报组件获取项目列表")
|
@RequestMapping(value = "/listTree", method = RequestMethod.GET)
|
@PermissionData
|
public Result<List<ProjectTreeVo>> queryListTree(ProProject project, HttpServletRequest req) {
|
Result<List<ProjectTreeVo>> result = new Result<>();
|
QueryWrapper<ProProject> queryWrapper = QueryGenerator.initQueryWrapper(project, req.getParameterMap());
|
List<ProProject> list = proProjectService.list(queryWrapper);
|
List<ProjectTreeVo> listTree = new ArrayList<>();
|
listToTree(list, listTree);
|
|
result.setSuccess(true);
|
result.setResult(listTree);
|
return result;
|
}
|
|
private void listToTree(List<ProProject> proProjects, List<ProjectTreeVo> result) {
|
ProjectTreeVo treeVo = new ProjectTreeVo();
|
Map<String, Object> slotMap = new HashMap<>();
|
slotMap.put("icon", "proGroup");
|
treeVo.setId("0");
|
treeVo.setTitle("项目列表");
|
treeVo.setValue("0");
|
treeVo.setType(1);
|
treeVo.setScopedSlots(slotMap);
|
List<ProjectTreeVo> subList = new ArrayList<>();
|
for (int i = 0; i < proProjects.size(); i++) {
|
ProProject proProject = proProjects.get(i);
|
ProjectTreeVo vo = new ProjectTreeVo(proProject);
|
Map<String, Object> slot = new HashMap<>();
|
slot.put("icon", "proItem");
|
vo.setLeaf(true);
|
vo.setType(2);
|
vo.setScopedSlots(slot);
|
subList.add(vo);
|
}
|
treeVo.setChildren(subList);
|
result.add(treeVo);
|
|
}
|
|
|
@ApiOperation(value = "获取项目详情列表", notes = "获取项目详情列表")
|
@RequestMapping(value = "/linkList", method = RequestMethod.GET)
|
public Result<List<ProProjectLinkTree>> queryPageList(ProProjectLink link) {
|
Result<List<ProProjectLinkTree>> result = new Result<List<ProProjectLinkTree>>();
|
Map<String, Object> map = new HashMap<>();
|
map.put("pro", link.getPro());
|
List<ProProjectLink> list = proLinkService.listByMap(map);
|
Collections.sort(list, (o1, o2) -> o1.getSortNo().compareTo(o2.getSortNo()));
|
List<ProProjectLinkTree> res = new ArrayList<>();
|
getTreeList(res, list, null);
|
Map<String, String> pidMap = new HashMap<>();
|
getSxh(res, pidMap);
|
result.setSuccess(true);
|
result.setResult(res);
|
return result;
|
}
|
|
@RequestMapping(value = "/linkListWbs", method = RequestMethod.GET)
|
public Result<List<ProProjectLinkTree>> linkListWbs(ProProjectLink link) {
|
Result<List<ProProjectLinkTree>> result = new Result<List<ProProjectLinkTree>>();
|
Map<String, Object> map = new HashMap<>();
|
map.put("pro", link.getPro());
|
List<ProProjectLink> list = proLinkService.listByMap(map);
|
Collections.sort(list, (o1, o2) -> o1.getSortNo().compareTo(o2.getSortNo()));
|
List<ProProjectLinkTree> treeList = new ArrayList<>();
|
List<ProProjectLinkTree> res = new ArrayList<>();
|
getTreeList(treeList, list, null);
|
Map<String, String> pidMap = new HashMap<>();
|
getSxh(treeList, pidMap);
|
treeToList(treeList, res);
|
result.setSuccess(true);
|
result.setResult(res);
|
return result;
|
}
|
|
private void treeToList(List<ProProjectLinkTree> treeList, List<ProProjectLinkTree> list) {
|
for (int i = 0; i < treeList.size(); i++) {
|
ProProjectLinkTree tree = treeList.get(i);
|
if (tree.isLeaf()) {
|
list.add(tree);
|
} else {
|
if (tree.getChildren() == null || tree.getChildren().size() < 1) {
|
list.add(tree);
|
} else {
|
treeToList(tree.getChildren(), list);
|
}
|
}
|
}
|
|
}
|
|
|
@GetMapping("/queryProById")
|
public Result<ProProject> queryProById(@RequestParam("id") String id) {
|
Result<ProProject> result = new Result<ProProject>();
|
ProProject byId = proProjectService.getById(id);
|
if (byId == null) return result.error500("未查询匹配数据!");
|
QueryWrapper<ProSummary> summaryQueryWrapper = new QueryWrapper<>();
|
summaryQueryWrapper.lambda().eq(ProSummary::getPro, byId.getId());
|
summaryQueryWrapper.lambda().inSql(ProSummary::getCreateTime, "SELECT MAX(create_time) FROM pro_summary WHERE pro = " + byId.getId());
|
ProSummary summary = summaryService.getOne(summaryQueryWrapper);
|
byId.setSummary(summary);
|
Map<String, Object> map = new HashMap<>();
|
map.put("pro", id);
|
List<ProProjectLink> linkList = proLinkService.listByMap(map);
|
Collections.sort(linkList, new Comparator<ProProjectLink>() {
|
@Override
|
public int compare(ProProjectLink o1, ProProjectLink o2) {
|
return o1.getSortNo().compareTo(o2.getSortNo());
|
}
|
});
|
|
List<ProProjectLinkTree> res = new ArrayList<>();
|
getTreeList(res, linkList, null);
|
byId.setLinkListTree(res);
|
result.setResult(byId);
|
return result.success("查询成功");
|
}
|
|
|
@GetMapping("/queryWbsId")
|
public Result<ProProjectLink> queryWbsId(@RequestParam("id") String id) {
|
ProProjectLink link = proLinkService.getById(id);
|
return Result.OK(link);
|
|
}
|
|
|
|
@RequestMapping(value = "/add", method = RequestMethod.POST)
|
@AutoLog(value = "添加项目")
|
public Result<ProProject> add(@RequestBody ProProject project, HttpServletRequest request) {
|
Result<ProProject> result = new Result<ProProject>();
|
LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
|
String orgCode = loginUser.getOrgCode();
|
if (StringUtils.isEmpty(orgCode)) {
|
return result.error500("请先设置用户部门信息,并重新登录!");
|
}
|
project.setSysOrgCode(orgCode);
|
proProjectService.save(project);
|
result.success("添加成功!");
|
result.setResult(project);
|
return result;
|
}
|
|
@RequestMapping(value = "/addLink", method = RequestMethod.POST)
|
@Transactional
|
public Result<ProProjectLink> add(@RequestBody ProProjectLink link, HttpServletRequest request) {
|
Result<ProProjectLink> result = new Result<ProProjectLink>();
|
proLinkService.save(link);
|
if (org.apache.commons.lang3.StringUtils.isEmpty(link.getPid())) {
|
|
} else {
|
//添加子节点时设置父节点 不为叶子节点
|
ProProjectLink byId = proLinkService.getById(link.getPid());
|
byId.setLeaf(false);
|
proLinkService.updateById(byId);
|
proProjectService.updateProjectByLink(byId.getId());
|
}
|
|
result.success("添加成功!");
|
result.setResult(link);
|
return result;
|
}
|
|
/**
|
* 删除用户
|
*/
|
@RequestMapping(value = "/deleteLink", method = RequestMethod.DELETE)
|
public Result<?> deleteLink(@RequestParam(name = "id", required = true) String id) {
|
proProjectService.updateProjectByLink(id);
|
proLinkService.removeById(id);
|
return Result.ok("删除成功");
|
}
|
|
@RequestMapping(value = "/deleteLinkBatch", method = RequestMethod.DELETE)
|
public Result<ProProjectLink> deleteLinkBatch(@RequestParam(name = "ids", required = true) String ids) {
|
|
Result<ProProjectLink> result = new Result<ProProjectLink>();
|
if (ids == null || "".equals(ids.trim())) {
|
result.error500("参数不识别!");
|
} else {
|
List<String> asList = Arrays.asList(ids.split(","));
|
proProjectService.updateProjectByLink(asList.get(0));
|
proLinkService.removeByIds(asList);
|
result.success("删除成功!");
|
}
|
return result;
|
}
|
|
|
@RequestMapping(value = "/editLink", method = RequestMethod.PUT)
|
public Result<ProProjectLink> editLink(@RequestBody ProProjectLink link) {
|
Result<ProProjectLink> result = new Result<ProProjectLink>();
|
proLinkService.updateById(link);
|
if (org.apache.commons.lang3.StringUtils.isEmpty(link.getPid())) {
|
proProjectService.updateProjectByLink(link.getId());
|
} else {
|
ProProjectLink byId = proLinkService.getById(link.getPid());
|
byId.setLeaf(false);
|
proLinkService.updateById(byId);
|
proProjectService.updateProjectByLink(byId.getId());
|
}
|
|
result.success("修改成功!");
|
result.setResult(link);
|
return result;
|
}
|
|
|
@RequestMapping(value = "/edit", method = RequestMethod.PUT)
|
public Result<ProProject> edit(@RequestBody ProProject project) {
|
Result<ProProject> result = new Result<ProProject>();
|
|
//TODO 生成项目实际完成时间
|
if (project.getXmzt() != null && project.getXmzt() == 0 && project.getSjwcsj() == null) {
|
project.setSjwcsj(new Date());
|
}
|
//设置本周更新状态
|
project.setRenewal(1);
|
project.setBgrq(new Date());
|
proProjectService.updateProject(project);
|
result.success("修改成功!");
|
result.setResult(project);
|
return result;
|
}
|
|
@RequestMapping(value = "/editBatch", method = RequestMethod.PUT)
|
@Transactional
|
public Result<ProProject> editBatch(@RequestBody ProProject project) {
|
QueryWrapper<ProProject> queryWrapper = new QueryWrapper<>();
|
queryWrapper.lambda().eq(ProProject::getGroupCode, project.getGroupCode());
|
List<ProProject> list = proProjectService.list(queryWrapper);
|
list.forEach(item -> item.setGroupCode(null));
|
proProjectService.saveOrUpdateBatch(list);
|
|
QueryWrapper<ProProject> queryWrapper2 = new QueryWrapper<>();
|
queryWrapper2.lambda().in(ProProject::getId, Arrays.asList(project.getId().split(",")));
|
List<ProProject> list2 = proProjectService.list(queryWrapper2);
|
list2.forEach(item -> item.setGroupCode(project.getGroupCode()));
|
proProjectService.saveOrUpdateBatch(list2);
|
return Result.OK("操作成功!");
|
}
|
|
/**
|
*
|
*/
|
@RequestMapping(value = "/delete", method = RequestMethod.DELETE)
|
@Transactional
|
public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
|
proProjectService.removeById(id);
|
Map<String, Object> map = new HashMap<>();
|
map.put("pro", id);
|
//删除项目时删除任务
|
proLinkService.removeByMap(map);
|
summaryService.removeByMap(map);
|
return Result.ok("删除成功");
|
}
|
|
@RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE)
|
@Transactional
|
public Result<ProProject> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
|
|
Result<ProProject> result = new Result<ProProject>();
|
if (ids == null || "".equals(ids.trim())) {
|
result.error500("参数不识别!");
|
} else {
|
List<String> asList = Arrays.asList(ids.split(","));
|
proProjectService.removeByIds(asList);
|
for (int i = 0; i < asList.size(); i++) {
|
Map<String, Object> map = new HashMap<>();
|
map.put("pro", asList.get(i));
|
//删除项目时删除任务
|
proLinkService.removeByMap(map);
|
}
|
result.success("删除成功!");
|
}
|
return result;
|
}
|
|
|
@PostMapping(value = "/importExcel")
|
public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
|
int success = 0;
|
int fail = 0;
|
int exist = 0;
|
|
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
|
Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
|
for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
|
MultipartFile file = entity.getValue();// 获取上传文件对象
|
try {
|
|
ExcelReaderBuilder excelReaderBuilder = EasyExcel.read(file.getInputStream());
|
ExcelReader excelReader = excelReaderBuilder.build();
|
List<ReadSheet> sheets = excelReader.excelExecutor().sheetList();
|
|
for (int i = 0; i < sheets.size(); i++) {
|
List<Map<Integer, String>> listMap = new ArrayList<>();
|
// EasyExcel.read(file.getInputStream(), new ExcelService(listMap)).sheet().doReadSync();
|
EasyExcel.read(file.getInputStream(), new ExcelService(listMap)).sheet(i).doReadSync();
|
|
|
Integer integer = proProjectService.importExcel(listMap);
|
if (integer == 0) {
|
exist++;
|
} else {
|
success++;
|
}
|
}
|
|
} catch (Exception e) {
|
e.printStackTrace();
|
return Result.error(e.getMessage());
|
|
}
|
}
|
return Result.ok("导入完成:成功导入项目" + success + "个;忽略重复项目" + exist + "个");
|
}
|
|
/**
|
* 生成前端table三级tree数据
|
*
|
* @param treeList
|
* @param metaList
|
* @param temp
|
*/
|
private void getTreeList(List<ProProjectLinkTree> treeList, List<ProProjectLink> metaList, ProProjectLinkTree temp) {
|
for (int i = 0; i < metaList.size(); i++) {
|
ProProjectLink permission = metaList.get(i);
|
String tempPid = permission.getPid();
|
ProProjectLinkTree tree = new ProProjectLinkTree(permission);
|
if (temp == null && oConvertUtils.isEmpty(tempPid)) {
|
treeList.add(tree);
|
if (!tree.isLeaf()) {
|
getTreeList(treeList, metaList, tree);
|
}
|
} else if (temp != null && tempPid != null && tempPid.equals(temp.getId())) {
|
temp.getChildren().add(tree);
|
if (!tree.isLeaf()) {
|
getTreeList(treeList, metaList, tree);
|
}
|
}
|
|
}
|
}
|
|
|
/**
|
* 递归计算序号
|
*
|
* @param treeList
|
* @param pidMap 父节点序号map
|
*/
|
private void getSxh(List<ProProjectLinkTree> treeList, Map<String, String> pidMap) {
|
for (int i = 0; i < treeList.size(); i++) {
|
ProProjectLinkTree tree = treeList.get(i);
|
if (tree.getPid() == null) {
|
tree.setSxh((i + 1) + "");
|
} else {
|
String sxh = pidMap.get(tree.getPid());
|
tree.setSxh(sxh + "." + (i + 1));
|
}
|
if (tree.getChildren() != null && tree.getChildren().size() > 0) {
|
pidMap.put(tree.getId(), tree.getSxh());
|
getSxh(tree.getChildren(), pidMap);
|
}
|
|
}
|
}
|
|
/**
|
* 导出excel
|
*
|
* @param request
|
* @param
|
*/
|
@RequestMapping(value = "/exportXls")
|
public ModelAndView exportXls(ProProject project, HttpServletRequest request) {
|
// Step.1 组装查询条件
|
QueryWrapper<ProProject> queryWrapper = QueryGenerator.initQueryWrapper(project, request.getParameterMap());
|
//Step.2 AutoPoi 导出Excel
|
ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
|
//update-begin--Author:kangxiaolin Date:20180825 for:[03]用户导出,如果选择数据则只导出相关数据--------------------
|
String selections = request.getParameter("selections");
|
if (!oConvertUtils.isEmpty(selections)) {
|
queryWrapper.in("id", selections.split(","));
|
}
|
//update-end--Author:kangxiaolin Date:20180825 for:[03]用户导出,如果选择数据则只导出相关数据----------------------
|
List<ProProject> pageList = proProjectService.list(queryWrapper);
|
|
//导出文件名称
|
mv.addObject(NormalExcelConstants.FILE_NAME, "项目列表");
|
mv.addObject(NormalExcelConstants.CLASS, ProProject.class);
|
LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
|
ExportParams exportParams = new ExportParams("项目列表数据", "导出人:" + user.getRealname(), "导出信息");
|
exportParams.setImageBasePath(upLoadPath);
|
mv.addObject(NormalExcelConstants.PARAMS, exportParams);
|
mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
|
return mv;
|
}
|
|
|
/**
|
* 自定义一键导出工作看板
|
*/
|
@RequestMapping(value = "/customExport", method = RequestMethod.GET)
|
public Result<?> customExport(@RequestParam(name = "ids", required = true) String ids, @RequestParam(name = "base", required = true) String downloadBaseUrl, HttpServletRequest req) {
|
Result<?> result = new Result<>();
|
Map<String, Object> root = new HashMap<>();
|
if (StringUtils.isEmpty(ids)) {
|
return Result.error("请选择项目!");
|
}
|
|
String starttime = DateUtils.date2Str(new Date(), DateUtils.datetimeFormat.get());
|
|
QueryWrapper<ProProject> queryWrapper = new QueryWrapper<>();
|
queryWrapper.lambda().in(ProProject::getId, Arrays.asList(ids.split(",")));
|
List<ProProject> projectList = proProjectService.list(queryWrapper);
|
List<ProjectVo> projectVoList = new ArrayList<>();
|
|
|
comp(projectList, projectVoList);
|
projectVoList.sort((o1, o2) -> o1.getXmfzz().compareTo(o2.getXmfzz()));
|
|
|
//1.pmo
|
Map<String, List<ProjectVo>> proGroupMap = projectVoList.stream().collect(Collectors.groupingBy(i -> i.getXmfzz()));
|
|
List<Map<String, Object>> pmo = new ArrayList<>();
|
List<String> sheetNames = new ArrayList<>();
|
proGroupMap.forEach((key, value) -> {
|
Map<String, Object> group = new HashMap<>();
|
sheetNames.add("PMO-" + key);
|
group.put("depart", key);
|
group.put("projectList", value);
|
List<SysUser> allUserList = new ArrayList<>();
|
AtomicInteger sort = new AtomicInteger(1);
|
value.forEach(pro -> {
|
if (pro.getWcjd() != null && pro.getWcjd() > 0) {
|
Double wcjd = pro.getWcjd();
|
Double jd = wcjd / 100;
|
BigDecimal bjd = new BigDecimal(jd);
|
double j = bjd.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
|
pro.setWcjd(j);
|
}
|
if (!pro.getUserList().isEmpty()) {
|
allUserList.addAll(pro.getUserList());
|
}
|
pro.setSortNo(sort.getAndIncrement());
|
|
});
|
List<SysUser> allUser = allUserList.stream().distinct().collect(Collectors.toList());
|
group.put("allUserList", allUser);
|
pmo.add(group);
|
});
|
root.put("pmo_sheet", sheetNames);
|
root.put("pmo", pmo);
|
//2.项目里程碑
|
List<String> lcbSheetNames = new ArrayList<>();
|
List<Map<String, Object>> lcb = new ArrayList<>();
|
AtomicInteger lcbMax = new AtomicInteger();
|
proGroupMap.forEach((key, value) -> {
|
Map<String, Object> group = new HashMap<>();
|
lcbSheetNames.add("项目里程碑-" + key);
|
Map<Integer, List<ProjectVo>> lcbMap = value.stream().map(i -> {
|
if (i.getMilepost() == null) {
|
ProMilepost milepost = new ProMilepost();
|
milepost.setMilepost(0);
|
i.setMilepost(milepost);
|
}
|
|
//特殊符号作为判定项目状态标记(符号取于输入法V6 - page6)
|
//搭配excel 条件规则 修改背景色
|
String tag = "γ";
|
Integer xmzt = i.getXmzt();
|
if (xmzt != null) {
|
switch (xmzt) {
|
case 0:
|
tag = "γ";
|
break;
|
case 1:
|
tag = "δ";
|
break;
|
case 2:
|
tag = "ε";
|
break;
|
case 3:
|
tag = "ζ";
|
break;
|
case 4:
|
tag = "η";
|
break;
|
case 5:
|
tag = "ι";
|
break;
|
}
|
}
|
|
i.setXmmc(i.getXmmc() + tag);
|
return i;
|
}).collect(Collectors.groupingBy(i -> i.getMilepost().getMilepost()));
|
lcbMap.forEach((k, v) -> {
|
if (v.size() > lcbMax.get()) lcbMax.set(v.size());
|
});
|
//excel 导出特殊配置(list长度需要一致,类似木桶原理),补齐list空数据
|
for (int i = 0; i <= 6; i++) {
|
if (!lcbMap.containsKey(i)) {
|
List<ProjectVo> emptyList = new ArrayList<>();
|
for (int j = 0; j < lcbMax.get(); j++) {
|
ProjectVo v = new ProjectVo();
|
v.setXmmc("-");
|
ProMilepost milepost = new ProMilepost();
|
milepost.setMilepost(i);
|
v.setMilepost(milepost);
|
emptyList.add(v);
|
}
|
lcbMap.put(i, emptyList);
|
} else {
|
List<ProjectVo> voList = lcbMap.get(i);
|
int nedSize = lcbMax.get() - voList.size();
|
for (int j = 0; j < nedSize; j++) {
|
ProjectVo v = new ProjectVo();
|
v.setXmmc("-");
|
ProMilepost milepost = new ProMilepost();
|
milepost.setMilepost(i);
|
v.setMilepost(milepost);
|
voList.add(v);
|
}
|
lcbMap.put(i, voList);
|
}
|
}
|
|
lcbMap.forEach((k, v) -> {
|
group.put("lcb" + k, v);
|
});
|
lcb.add(group);
|
});
|
|
|
root.put("lcb_sheet", lcbSheetNames);
|
root.put("lcb", lcb);
|
|
//3.项目一览表
|
List<String> ylbSheetNames = new ArrayList<>();
|
List<Map<String, Object>> ylb = new ArrayList<>();
|
List<ProjectVo> allProList = new ArrayList<>();
|
proGroupMap.forEach((key, value) -> {
|
Map<String, Object> group = new HashMap<>();
|
ylbSheetNames.add("项目一览表-" + key);
|
value.forEach(item -> {
|
String xmfzr = item.getXmfzr();
|
if (StringUtils.isEmpty(xmfzr)) {
|
item.setXmfzr("未分配");
|
item.setFzrname("empty");
|
}
|
});
|
group.put("sheetName", key);
|
Map<String, List<ProjectVo>> fzrMap = value.stream().collect(Collectors.groupingBy(i -> i.getXmfzr()));
|
List<Map<String, Object>> fzrList = new ArrayList<>();
|
List<Map<String, Object>> proList = new ArrayList<>();
|
|
//项目负责人
|
AtomicInteger index = new AtomicInteger();
|
fzrMap.forEach((fzr, pro) -> {
|
index.addAndGet(1);
|
Map<String, Object> map = new HashMap<>();
|
map.put("realname", fzr);
|
map.put("username", pro.get(0).getFzrname());
|
map.put("index", index.get());
|
fzrList.add(map);
|
|
});
|
Map<String, Object> tMap = new HashMap<>();
|
tMap.put("realname", "项目总数");
|
tMap.put("username", "total");
|
tMap.put("index", 0);
|
fzrList.add(tMap);
|
fzrList.sort(Comparator.comparing(o -> ((Integer) o.get("index"))));
|
//生成项目状态列表
|
List<ProjectVo> statList1 = new ArrayList<>();//进行中
|
List<ProjectVo> statList2 = new ArrayList<>();//已完成
|
List<ProjectVo> statList3 = new ArrayList<>();//异常
|
List<ProjectVo> statList4 = new ArrayList<>();//未启动、规划中
|
|
value.stream().forEach(i -> {
|
if (i.getXmzt() == null) {
|
statList4.add(i);
|
} else if (i.getXmzt() == 1) {
|
statList1.add(i);
|
} else if (i.getXmzt() == 0) {
|
statList2.add(i);
|
} else if (i.getXmzt() == 2 | i.getXmzt() == 3 | i.getXmzt() == 4) {
|
statList3.add(i);
|
}
|
});
|
|
|
List<Map<String, Object>> stat1 = getStat(statList1, fzrList);
|
List<Map<String, Object>> stat2 = getStat(statList2, fzrList);
|
List<Map<String, Object>> stat3 = getStat(statList3, fzrList);
|
List<Map<String, Object>> stat4 = getStat(statList4, fzrList);
|
List<Map<String, Object>> stat5 = getStat(value, fzrList);
|
|
group.put("fzrList", fzrList);
|
group.put("stat1", stat1);
|
group.put("stat2", stat2);
|
group.put("stat3", stat3);
|
group.put("stat4", stat4);
|
group.put("stat5", stat5);
|
group.put("proList", proList);
|
group.put("allProList", value);
|
ylb.add(group);
|
|
});
|
|
root.put("ylb_sheet", ylbSheetNames);
|
root.put("ylb", ylb);
|
|
//4.项目detail
|
List<String> dtSheetNames = new ArrayList<>();
|
projectVoList.forEach(item -> {
|
String sheet = item.getXmfzz();
|
if (sheet.length() > 7) {
|
sheet = sheet.substring(0, 4);
|
}
|
//解决特殊字符不能导出问题
|
String sheetName = sheet + "-" + item.getXmmc().replaceAll("[^\\u4E00-\\u9FA5\\d]", "");
|
dtSheetNames.add(sheetName);
|
compProLink(item);
|
|
});
|
root.put("detail_sheet", dtSheetNames);
|
root.put("detail", projectVoList);
|
|
|
/* try {
|
String filePath = excelUtils.exportProject(pmo, sheetNames, lcb, lcbSheetNames, projectVoList, dtSheetNames);
|
root.put("filePath", filePath);
|
} catch (Exception e) {
|
e.printStackTrace();
|
return Result.OK("导出异常,请联系管理官!");
|
}*/
|
//后台生成报告,完成后再推送
|
ThreadUtil.execute(() -> {
|
try {
|
String filePath = excelUtils.exportProject(pmo, sheetNames, lcb, lcbSheetNames, ylb, ylbSheetNames, projectVoList, dtSheetNames);
|
System.err.println(filePath);
|
//获取当前用户
|
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
|
TemplateMessageDTO dto = new TemplateMessageDTO();
|
dto.setTitle("项目看板导出通知");
|
dto.setFromUser("系统");
|
dto.setToUser(sysUser.getUsername());
|
dto.setTemplateCode("pro_custom_export");
|
Map<String, String> map = new HashMap<>();
|
map.put("real_name", sysUser.getRealname());
|
map.put("create_time", starttime);
|
String start = DateUtils.weekToDayStartStr(DateUtils.getCurYear(), DateUtils.getCurWeek(), "yyyy-MM-dd");
|
String weekInMonth = DateUtils.getWeekInMonth(DateUtils.str2Date(start, DateUtils.date_sdf.get()));
|
String file_name = "项目工作看板-" + weekInMonth + ".xlsx";
|
map.put("file_name", file_name);
|
map.put("file_path", downloadBaseUrl + filePath);
|
dto.setTemplateParam(map);
|
//sysBaseAPI.sendTemplateAnnouncement(dto);
|
CustomMessage message = new CustomMessage();
|
map.put("model", "pro_download");
|
map.put("cmd", WebsocketConst.CMD_CUSTOM);
|
message.setUserId(sysUser.getId());
|
message.setBaseMap(map);
|
sysBaseAPI.sendCustomMsg(message);
|
} catch (Exception e) {
|
//获取当前用户
|
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
|
TemplateMessageDTO dto = new TemplateMessageDTO();
|
dto.setTitle("项目看板导出通知");
|
dto.setFromUser("系统");
|
dto.setToUser(sysUser.getUsername());
|
dto.setTemplateCode("pro_custom_export");
|
Map<String, String> map = new HashMap<>();
|
map.put("real_name", sysUser.getRealname());
|
map.put("create_time", starttime);
|
map.put("file_name", "导出失败,请重试或联系管理员!");
|
map.put("file_path", "导出失败,请重试或联系管理员!");
|
dto.setTemplateParam(map);
|
//sysBaseAPI.sendTemplateAnnouncement(dto);
|
CustomMessage message = new CustomMessage();
|
map.put("model", "pro_download");
|
map.put("cmd", WebsocketConst.CMD_CUSTOM);
|
message.setUserId(sysUser.getId());
|
message.setBaseMap(map);
|
sysBaseAPI.sendCustomMsg(message);
|
e.printStackTrace();
|
}
|
});
|
|
|
return result.OK("操作成功!", root);
|
|
}
|
|
private List<Map<String, Object>> getStat(List<ProjectVo> proList, List<Map<String, Object>> fzrList) {
|
List<Map<String, Object>> list = new ArrayList<>();
|
|
// Map<String, Object> result = new HashMap<>();
|
//
|
// for (int j = 0; j < fzrList.size(); j++) {
|
// Map<String, Object> map = fzrList.get(j);
|
// String fzr = map.get("username").toString();
|
// for (int i = 0; i < proList.size(); i++) {
|
// ProjectVo pro = proList.get(i);
|
// if (pro.getFzrname().equals(fzr)) {
|
// if (result.containsKey(fzr)) {
|
// Integer count = (Integer) result.get(fzr);
|
// count += 1;
|
// result.put(fzr, count);
|
// } else {
|
// result.put(fzr, 1);
|
// }
|
// } else {
|
// if (!result.containsKey(fzr)) {
|
// result.put(fzr, 0);
|
// }
|
// }
|
// }
|
//
|
// if (!result.containsKey(fzr)) {
|
// result.put(fzr, 0);
|
// }
|
// }
|
// result.put("total", proList.size());
|
for (int i = 0; i < fzrList.size(); i++) {
|
Map<String, Object> fzrMap = fzrList.get(i);
|
Map<String, Object> map = new HashMap<>();
|
String username = fzrMap.get("username").toString();
|
for (int j = 0; j < proList.size(); j++) {
|
ProjectVo vo = proList.get(j);
|
if (username.equals(vo.getFzrname())) {
|
if (map.containsKey("sum")) {
|
Integer sum = (Integer) map.get("sum");
|
sum++;
|
map.put("sum", sum);
|
} else {
|
map.put("sum", 1);
|
map.put("index", fzrMap.get("index"));
|
}
|
|
} else {
|
if (username.equals("total")) {
|
map.put("sum", proList.size());
|
map.put("index", fzrMap.get("index"));
|
}
|
}
|
|
}
|
|
if (map.isEmpty()) {
|
map.put("sum", 0);
|
map.put("index", fzrMap.get("index"));
|
}
|
list.add(map);
|
|
|
}
|
list.sort(Comparator.comparing(o -> ((Integer) o.get("index"))));
|
|
return list;
|
|
}
|
|
private void comp(List<ProProject> projectList, List<ProjectVo> projectVoList) {
|
//补全项目部门信息
|
List<SysDepart> departList = systemClient.queryDepartList(null).getResult();
|
//补全项目负责人信息
|
List<SysUser> userList = systemClient.queryUserList();
|
|
projectList.stream().forEach(item -> {
|
ProjectVo vo = new ProjectVo();
|
BeanUtils.copyProperties(item, vo);
|
Optional<SysDepart> first = departList.stream().filter(depart -> depart.getId().equals(vo.getXmfzz())).findFirst();
|
if (first.isPresent()) {
|
vo.setXmfzz(first.get().getDepartName());
|
}
|
if (StringUtils.isEmpty(vo.getXmfzz())) {
|
vo.setXmfzz("未分配");
|
}
|
String sheet = vo.getXmfzz();
|
if (sheet.length() > 7) {
|
sheet = sheet.substring(0, 4);
|
}
|
//解决特殊字符不能导出问题
|
String sheetName = "#'" + sheet + "-" + item.getXmmc().replaceAll("[^\\u4E00-\\u9FA5\\d]", "") + "'!A1";
|
vo.setLink(sheetName);
|
|
//获取项目成员数据
|
String users = "";
|
String xmfzr = vo.getXmfzr();
|
String xmcy = vo.getXmcy();
|
if (StringUtils.isNotEmpty(xmfzr)) {
|
users += xmfzr;
|
users += ",";
|
}
|
if (StringUtils.isNotEmpty(xmcy)) {
|
users += xmcy;
|
}
|
//有项目成员
|
if (users.length() > 1) {
|
String finalUsers = users;
|
List<SysUser> proUserList = userList.stream().filter(i -> finalUsers.contains(i.getUsername())).distinct().collect(Collectors.toList());
|
Map<String, String> map = new HashMap<>();
|
proUserList.stream().forEach(i -> {
|
map.put(i.getUsername(), i.getRealname());
|
|
});
|
vo.setUserList(proUserList);
|
vo.setUserMap(map);
|
//项目负责人
|
List<String> realnames = new ArrayList<>();
|
if (StringUtils.isNotEmpty(xmfzr)) {
|
String[] split = xmfzr.split(",");
|
for (int i = 0; i < split.length; i++) {
|
String username = split[i];
|
if (map.containsKey(username)) {
|
realnames.add(map.get(username));
|
}
|
}
|
}
|
vo.setFzrname(vo.getXmfzr());
|
vo.setXmfzr(String.join(",", realnames));
|
try {
|
//项目类型
|
List<DictModel> xmlx = sysBaseAPI.queryDictItemsByCode("xmlx");
|
Optional<DictModel> xmlxo = xmlx.stream().filter(i -> i.getValue() != null && vo.getXmlx() == Integer.parseInt(i.getValue())).findFirst();
|
String xmlxText = xmlxo.get().getText();
|
vo.setXmlxText(xmlxText);
|
//项目状态
|
List<DictModel> xmzt = sysBaseAPI.queryDictItemsByCode("xmzt");
|
Optional<DictModel> xmzto = xmzt.stream().filter(i -> i.getValue() != null && vo.getXmzt() == Integer.parseInt(i.getValue())).findFirst();
|
String xmztText = xmzto.get().getText();
|
vo.setXmztText(xmztText);
|
|
//项目来源
|
List<DictModel> xmly = sysBaseAPI.queryDictItemsByCode("xmly");
|
Optional<DictModel> xmlyo = xmly.stream().filter(i -> i.getValue() != null && vo.getXmly() == Integer.parseInt(i.getValue())).findFirst();
|
String xmlyText = xmlyo.get().getText();
|
vo.setXmlyText(xmlyText);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
|
}
|
|
//本周与下周等动态数据
|
QueryWrapper<ProSummary> summaryQueryWrapper = new QueryWrapper<>();
|
summaryQueryWrapper.lambda().eq(ProSummary::getPro, vo.getId());
|
summaryQueryWrapper.lambda().inSql(ProSummary::getCreateTime, "SELECT MAX(create_time) FROM pro_summary WHERE pro = " + vo.getId());
|
ProSummary summary = summaryService.getOne(summaryQueryWrapper);
|
vo.setSummary(summary);
|
|
//里程碑
|
QueryWrapper<ProMilepost> milepostQueryWrapper = new QueryWrapper<>();
|
milepostQueryWrapper.lambda().eq(ProMilepost::getPro, vo.getId());
|
milepostQueryWrapper.lambda().inSql(ProMilepost::getMilepost, "SELECT MAX(milepost) FROM pro_milepost WHERE pro = " + vo.getId());
|
ProMilepost milepost = milepostService.getOne(milepostQueryWrapper);
|
vo.setMilepost(milepost);
|
|
projectVoList.add(vo);
|
|
});
|
|
|
}
|
|
/**
|
* 补充项目的明细信息
|
*
|
* @param pro
|
*/
|
private void compProLink(ProjectVo pro) {
|
Map<String, Object> map = new HashMap<>();
|
map.put("pro", pro.getId());
|
List<ProProjectLink> list = proLinkService.listByMap(map);
|
Collections.sort(list, (o1, o2) -> {
|
if (o1.getSortNo() == null || o1.getSortNo() == null) {
|
return -1;
|
}
|
return o1.getSortNo().compareTo(o2.getSortNo());
|
});
|
List<ProProjectLinkTree> res = new ArrayList<>();
|
getTreeList(res, list, null);
|
Map<String, String> pidMap = new HashMap<>();
|
getSxh(res, pidMap);
|
|
Map<String, String> userMap = pro.getUserMap();
|
List<ProProjectLink> flatList = new ArrayList<>();
|
for (int i = 0; i < res.size(); i++) {
|
ProProjectLinkTree tree = res.get(i);
|
convertNode(tree, flatList, userMap);
|
}
|
pro.setLinkList(flatList);
|
|
|
}
|
|
private void convertNode(ProProjectLinkTree node, List<ProProjectLink> flatList, Map<String, String> userMap) {
|
ProProjectLink link = new ProProjectLink();
|
BeanUtils.copyProperties(node, link);
|
String zymc = link.getZymc();
|
List<String> realnames = new ArrayList<>();
|
if (StringUtils.isNotEmpty(zymc)) {
|
String[] split = zymc.split(",");
|
for (int i = 0; i < split.length; i++) {
|
String username = split[i];
|
if (userMap.containsKey(username)) {
|
realnames.add(userMap.get(username));
|
}
|
}
|
}
|
link.setZymc(String.join(",", realnames));
|
flatList.add(link);
|
if (node.getChildren() != null && node.getChildren().size() > 0) {
|
for (ProProjectLinkTree child : node.getChildren()) {
|
convertNode(child, flatList, userMap);
|
}
|
}
|
|
}
|
|
}
|