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 { @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> queryPageList(ProProject project, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest req) { Result> result = new Result>(); QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(project, req.getParameterMap()); Page page = new Page(pageNo, pageSize); IPage 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> queryListTree(ProProject project, HttpServletRequest req) { Result> result = new Result<>(); QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(project, req.getParameterMap()); List list = proProjectService.list(queryWrapper); List listTree = new ArrayList<>(); listToTree(list, listTree); result.setSuccess(true); result.setResult(listTree); return result; } private void listToTree(List proProjects, List result) { ProjectTreeVo treeVo = new ProjectTreeVo(); Map slotMap = new HashMap<>(); slotMap.put("icon", "proGroup"); treeVo.setId("0"); treeVo.setTitle("项目列表"); treeVo.setValue("0"); treeVo.setType(1); treeVo.setScopedSlots(slotMap); List subList = new ArrayList<>(); for (int i = 0; i < proProjects.size(); i++) { ProProject proProject = proProjects.get(i); ProjectTreeVo vo = new ProjectTreeVo(proProject); Map 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> queryPageList(ProProjectLink link) { Result> result = new Result>(); Map map = new HashMap<>(); map.put("pro", link.getPro()); List list = proLinkService.listByMap(map); Collections.sort(list, (o1, o2) -> o1.getSortNo().compareTo(o2.getSortNo())); List res = new ArrayList<>(); getTreeList(res, list, null); Map pidMap = new HashMap<>(); getSxh(res, pidMap); result.setSuccess(true); result.setResult(res); return result; } @RequestMapping(value = "/linkListWbs", method = RequestMethod.GET) public Result> linkListWbs(ProProjectLink link) { Result> result = new Result>(); Map map = new HashMap<>(); map.put("pro", link.getPro()); List list = proLinkService.listByMap(map); Collections.sort(list, (o1, o2) -> o1.getSortNo().compareTo(o2.getSortNo())); List treeList = new ArrayList<>(); List res = new ArrayList<>(); getTreeList(treeList, list, null); Map pidMap = new HashMap<>(); getSxh(treeList, pidMap); treeToList(treeList, res); result.setSuccess(true); result.setResult(res); return result; } private void treeToList(List treeList, List 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 queryProById(@RequestParam("id") String id) { Result result = new Result(); ProProject byId = proProjectService.getById(id); if (byId == null) return result.error500("未查询匹配数据!"); QueryWrapper 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 map = new HashMap<>(); map.put("pro", id); List linkList = proLinkService.listByMap(map); Collections.sort(linkList, new Comparator() { @Override public int compare(ProProjectLink o1, ProProjectLink o2) { return o1.getSortNo().compareTo(o2.getSortNo()); } }); List res = new ArrayList<>(); getTreeList(res, linkList, null); byId.setLinkListTree(res); result.setResult(byId); return result.success("查询成功"); } @GetMapping("/queryWbsId") public Result queryWbsId(@RequestParam("id") String id) { ProProjectLink link = proLinkService.getById(id); return Result.OK(link); } @RequestMapping(value = "/add", method = RequestMethod.POST) @AutoLog(value = "添加项目") public Result add(@RequestBody ProProject project, HttpServletRequest request) { Result result = new Result(); 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 add(@RequestBody ProProjectLink link, HttpServletRequest request) { Result result = new Result(); 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 deleteLinkBatch(@RequestParam(name = "ids", required = true) String ids) { Result result = new Result(); if (ids == null || "".equals(ids.trim())) { result.error500("参数不识别!"); } else { List 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 editLink(@RequestBody ProProjectLink link) { Result result = new Result(); 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 edit(@RequestBody ProProject project) { Result result = new Result(); //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 editBatch(@RequestBody ProProject project) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(ProProject::getGroupCode, project.getGroupCode()); List list = proProjectService.list(queryWrapper); list.forEach(item -> item.setGroupCode(null)); proProjectService.saveOrUpdateBatch(list); QueryWrapper queryWrapper2 = new QueryWrapper<>(); queryWrapper2.lambda().in(ProProject::getId, Arrays.asList(project.getId().split(","))); List 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 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 deleteBatch(@RequestParam(name = "ids", required = true) String ids) { Result result = new Result(); if (ids == null || "".equals(ids.trim())) { result.error500("参数不识别!"); } else { List asList = Arrays.asList(ids.split(",")); proProjectService.removeByIds(asList); for (int i = 0; i < asList.size(); i++) { Map 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 fileMap = multipartRequest.getFileMap(); for (Map.Entry entity : fileMap.entrySet()) { MultipartFile file = entity.getValue();// 获取上传文件对象 try { ExcelReaderBuilder excelReaderBuilder = EasyExcel.read(file.getInputStream()); ExcelReader excelReader = excelReaderBuilder.build(); List sheets = excelReader.excelExecutor().sheetList(); for (int i = 0; i < sheets.size(); i++) { List> 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 treeList, List 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 treeList, Map 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 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 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 root = new HashMap<>(); if (StringUtils.isEmpty(ids)) { return Result.error("请选择项目!"); } String starttime = DateUtils.date2Str(new Date(), DateUtils.datetimeFormat.get()); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().in(ProProject::getId, Arrays.asList(ids.split(","))); List projectList = proProjectService.list(queryWrapper); List projectVoList = new ArrayList<>(); comp(projectList, projectVoList); projectVoList.sort((o1, o2) -> o1.getXmfzz().compareTo(o2.getXmfzz())); //1.pmo Map> proGroupMap = projectVoList.stream().collect(Collectors.groupingBy(i -> i.getXmfzz())); List> pmo = new ArrayList<>(); List sheetNames = new ArrayList<>(); proGroupMap.forEach((key, value) -> { Map group = new HashMap<>(); sheetNames.add("PMO-" + key); group.put("depart", key); group.put("projectList", value); List 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 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 lcbSheetNames = new ArrayList<>(); List> lcb = new ArrayList<>(); AtomicInteger lcbMax = new AtomicInteger(); proGroupMap.forEach((key, value) -> { Map group = new HashMap<>(); lcbSheetNames.add("项目里程碑-" + key); Map> 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 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 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 ylbSheetNames = new ArrayList<>(); List> ylb = new ArrayList<>(); List allProList = new ArrayList<>(); proGroupMap.forEach((key, value) -> { Map 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> fzrMap = value.stream().collect(Collectors.groupingBy(i -> i.getXmfzr())); List> fzrList = new ArrayList<>(); List> proList = new ArrayList<>(); //项目负责人 AtomicInteger index = new AtomicInteger(); fzrMap.forEach((fzr, pro) -> { index.addAndGet(1); Map map = new HashMap<>(); map.put("realname", fzr); map.put("username", pro.get(0).getFzrname()); map.put("index", index.get()); fzrList.add(map); }); Map 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 statList1 = new ArrayList<>();//进行中 List statList2 = new ArrayList<>();//已完成 List statList3 = new ArrayList<>();//异常 List 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> stat1 = getStat(statList1, fzrList); List> stat2 = getStat(statList2, fzrList); List> stat3 = getStat(statList3, fzrList); List> stat4 = getStat(statList4, fzrList); List> 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 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 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 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> getStat(List proList, List> fzrList) { List> list = new ArrayList<>(); // Map result = new HashMap<>(); // // for (int j = 0; j < fzrList.size(); j++) { // Map 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 fzrMap = fzrList.get(i); Map 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 projectList, List projectVoList) { //补全项目部门信息 List departList = systemClient.queryDepartList(null).getResult(); //补全项目负责人信息 List userList = systemClient.queryUserList(); projectList.stream().forEach(item -> { ProjectVo vo = new ProjectVo(); BeanUtils.copyProperties(item, vo); Optional 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 proUserList = userList.stream().filter(i -> finalUsers.contains(i.getUsername())).distinct().collect(Collectors.toList()); Map map = new HashMap<>(); proUserList.stream().forEach(i -> { map.put(i.getUsername(), i.getRealname()); }); vo.setUserList(proUserList); vo.setUserMap(map); //项目负责人 List 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 xmlx = sysBaseAPI.queryDictItemsByCode("xmlx"); Optional xmlxo = xmlx.stream().filter(i -> i.getValue() != null && vo.getXmlx() == Integer.parseInt(i.getValue())).findFirst(); String xmlxText = xmlxo.get().getText(); vo.setXmlxText(xmlxText); //项目状态 List xmzt = sysBaseAPI.queryDictItemsByCode("xmzt"); Optional xmzto = xmzt.stream().filter(i -> i.getValue() != null && vo.getXmzt() == Integer.parseInt(i.getValue())).findFirst(); String xmztText = xmzto.get().getText(); vo.setXmztText(xmztText); //项目来源 List xmly = sysBaseAPI.queryDictItemsByCode("xmly"); Optional 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 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 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 map = new HashMap<>(); map.put("pro", pro.getId()); List 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 res = new ArrayList<>(); getTreeList(res, list, null); Map pidMap = new HashMap<>(); getSxh(res, pidMap); Map userMap = pro.getUserMap(); List 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 flatList, Map userMap) { ProProjectLink link = new ProProjectLink(); BeanUtils.copyProperties(node, link); String zymc = link.getZymc(); List 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); } } } }