From ea16c9ae1039cf7a63866298380b0457f02f1357 Mon Sep 17 00:00:00 2001 From: guo Date: Tue, 10 Oct 2023 19:19:02 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E8=BF=9B=E5=BA=A6=E7=94=98?= =?UTF-8?q?=E7=89=B9=E5=9B=BE=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xml/SafeEducationQuestionMapper.xml | 40 +-- .../TaskProgressAlarmController.java | 320 +++++++++--------- .../controller/TaskProgressController.java | 71 ++-- .../TaskProgressMaterialRelController.java | 318 ++++++++--------- .../taskprogress/entity/TaskProgress.java | 14 +- .../entity/TaskProgressAlarm.java | 108 +++--- .../entity/TaskProgressMaterialRel.java | 9 +- .../mapper/TaskProgressMaterialRelMapper.java | 6 + .../xml/TaskProgressMaterialRelMapper.xml | 36 +- .../ITaskProgressMaterialRelService.java | 8 + .../service/ITaskProgressService.java | 3 + .../TaskProgressMaterialRelServiceImpl.java | 41 ++- .../service/impl/TaskProgressServiceImpl.java | 84 ++++- .../template/任务进度甘特图上传模板.mpp | Bin 0 -> 265216 bytes 14 files changed, 625 insertions(+), 433 deletions(-) create mode 100644 src/main/resources/template/任务进度甘特图上传模板.mpp diff --git a/src/main/java/com/zhgd/xmgl/modules/edu/mapper/xml/SafeEducationQuestionMapper.xml b/src/main/java/com/zhgd/xmgl/modules/edu/mapper/xml/SafeEducationQuestionMapper.xml index 3c7340303..8ba5c55e6 100644 --- a/src/main/java/com/zhgd/xmgl/modules/edu/mapper/xml/SafeEducationQuestionMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/edu/mapper/xml/SafeEducationQuestionMapper.xml @@ -67,26 +67,28 @@ diff --git a/src/main/java/com/zhgd/xmgl/modules/taskprogress/controller/TaskProgressAlarmController.java b/src/main/java/com/zhgd/xmgl/modules/taskprogress/controller/TaskProgressAlarmController.java index 8e7089b0e..645c8634e 100644 --- a/src/main/java/com/zhgd/xmgl/modules/taskprogress/controller/TaskProgressAlarmController.java +++ b/src/main/java/com/zhgd/xmgl/modules/taskprogress/controller/TaskProgressAlarmController.java @@ -1,38 +1,35 @@ package com.zhgd.xmgl.modules.taskprogress.controller; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; - -import java.util.HashMap; -import java.util.List; -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import com.zhgd.jeecg.common.api.vo.Result; -import com.zhgd.jeecg.common.system.query.QueryGenerator; -import com.zhgd.jeecg.common.util.oConvertUtils; -import org.apache.commons.collections.MapUtils; -import com.zhgd.xmgl.modules.taskprogress.entity.TaskProgressAlarm; -import com.zhgd.xmgl.modules.taskprogress.service.ITaskProgressAlarmService; - +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.zhgd.jeecg.common.api.vo.Result; +import com.zhgd.jeecg.common.system.query.QueryGenerator; +import com.zhgd.jeecg.common.util.oConvertUtils; +import com.zhgd.xmgl.modules.taskprogress.entity.TaskProgressAlarm; +import com.zhgd.xmgl.modules.taskprogress.service.ITaskProgressAlarmService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; - +import org.apache.commons.collections.MapUtils; 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.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; -import com.alibaba.fastjson.JSON; import springfox.documentation.annotations.ApiIgnore; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.util.HashMap; +import java.util.List; + /** * @Title: Controller @@ -46,151 +43,158 @@ import springfox.documentation.annotations.ApiIgnore; @Slf4j @Api(tags = "任务进度甘特图-报警信息相关Api") public class TaskProgressAlarmController { - @Autowired - private ITaskProgressAlarmService taskProgressAlarmService; + @Autowired + private ITaskProgressAlarmService taskProgressAlarmService; - /** - * 分页列表查询 - * - * @param taskProgressAlarm - * @param pageNo - * @param pageSize - * @param req - * @return - */ - @ApiOperation(value = "分页列表查询任务进度甘特图-报警信息信息", notes = "分页列表查询任务进度甘特图-报警信息信息", httpMethod = "GET") - @GetMapping(value = "/page") - public Result> queryPageList(TaskProgressAlarm taskProgressAlarm, - @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, - @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, - HttpServletRequest req) { - Result> result = new Result>(); - QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(taskProgressAlarm, req.getParameterMap()); - Page page = new Page(pageNo, pageSize); - IPage pageList = taskProgressAlarmService.page(page, queryWrapper); - result.setSuccess(true); - result.setResult(pageList); - return result; - } + /** + * 分页列表查询 + * + * @param taskProgressAlarm + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @ApiOperation(value = "分页列表查询任务进度甘特图-报警信息信息", notes = "分页列表查询任务进度甘特图-报警信息信息", httpMethod = "GET") + @ApiImplicitParams({ + @ApiImplicitParam(name = "projectSn", value = "项目sn", paramType = "query", required = true, dataType = "String"), + @ApiImplicitParam(name = "taskName", value = "任务名称", paramType = "query", dataType = "String"), + @ApiImplicitParam(name = "createDate_begin", value = "报警时间开始", paramType = "query", dataType = "String"), + @ApiImplicitParam(name = "createDate_end", value = "报警时间结束", paramType = "query", dataType = "String"), + }) + @GetMapping(value = "/page") + public Result> queryPageList(TaskProgressAlarm taskProgressAlarm, + @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, + HttpServletRequest req) { + Result> result = new Result>(); + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(taskProgressAlarm, req.getParameterMap()); + queryWrapper.lambda().orderByDesc(TaskProgressAlarm::getCreateDate); + Page page = new Page(pageNo, pageSize); + IPage pageList = taskProgressAlarmService.page(page, queryWrapper); + result.setSuccess(true); + result.setResult(pageList); + return result; + } - /** - * 列表查询 - * - * @param taskProgressAlarm - * @param req - * @return - */ - @ApiOperation(value = "列表查询任务进度甘特图-报警信息信息", notes = "列表查询任务进度甘特图-报警信息信息", httpMethod = "GET") - @GetMapping(value = "/list") - public Result> queryList(TaskProgressAlarm taskProgressAlarm, - HttpServletRequest req) { - QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(taskProgressAlarm, req.getParameterMap()); - return Result.success(taskProgressAlarmService.list(queryWrapper)); - } + /** + * 列表查询 + * + * @param taskProgressAlarm + * @param req + * @return + */ + @ApiOperation(value = "列表查询任务进度甘特图-报警信息信息", notes = "列表查询任务进度甘特图-报警信息信息", httpMethod = "GET") + @GetMapping(value = "/list") + public Result> queryList(TaskProgressAlarm taskProgressAlarm, + HttpServletRequest req) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(taskProgressAlarm, req.getParameterMap()); + return Result.success(taskProgressAlarmService.list(queryWrapper)); + } - /** - * 添加 - * - * @param taskProgressAlarm - * @return - */ - @ApiOperation(value = "添加任务进度甘特图-报警信息信息", notes = "添加任务进度甘特图-报警信息信息", httpMethod = "POST") - @PostMapping(value = "/add") - public Result add(@RequestBody TaskProgressAlarm taskProgressAlarm) { - taskProgressAlarmService.save(taskProgressAlarm); - return Result.ok(); - } + /** + * 添加 + * + * @param taskProgressAlarm + * @return + */ + @ApiOperation(value = "添加任务进度甘特图-报警信息信息", notes = "添加任务进度甘特图-报警信息信息", httpMethod = "POST") + @PostMapping(value = "/add") + public Result add(@RequestBody TaskProgressAlarm taskProgressAlarm) { + taskProgressAlarmService.save(taskProgressAlarm); + return Result.ok(); + } - /** - * 编辑 - * - * @param taskProgressAlarm - * @return - */ - @ApiOperation(value = "编辑任务进度甘特图-报警信息信息", notes = "编辑任务进度甘特图-报警信息信息", httpMethod = "POST") - @PostMapping(value = "/edit") - public Result edit(@RequestBody TaskProgressAlarm taskProgressAlarm) { - taskProgressAlarmService.updateById(taskProgressAlarm); - return Result.ok(); - } + /** + * 编辑 + * + * @param taskProgressAlarm + * @return + */ + @ApiOperation(value = "编辑任务进度甘特图-报警信息信息", notes = "编辑任务进度甘特图-报警信息信息", httpMethod = "POST") + @PostMapping(value = "/edit") + public Result edit(@RequestBody TaskProgressAlarm taskProgressAlarm) { + taskProgressAlarmService.updateById(taskProgressAlarm); + return Result.ok(); + } - /** - * 通过id删除 - * - * @param id - * @return - */ - @ApiOperation(value = "删除任务进度甘特图-报警信息信息", notes = "删除任务进度甘特图-报警信息信息", httpMethod = "POST") - @ApiImplicitParam(name = "id", value = "任务进度甘特图-报警信息ID", paramType = "body", required = true, dataType = "String", example = "{\"id\":\"1\"}") - @PostMapping(value = "/delete") - public Result delete(@ApiIgnore @RequestBody HashMap map) { - String id = MapUtils.getString(map, "id"); - Result result = new Result(); - TaskProgressAlarm taskProgressAlarm = taskProgressAlarmService.getById(id); - if (taskProgressAlarm == null) { - result.error500("未找到对应实体"); - } else { - boolean ok = taskProgressAlarmService.removeById(id); - if (ok) { - result.success("删除成功!"); - } - } + /** + * 通过id删除 + * + * @param id + * @return + */ + @ApiOperation(value = "删除任务进度甘特图-报警信息信息", notes = "删除任务进度甘特图-报警信息信息", httpMethod = "POST") + @ApiImplicitParam(name = "id", value = "任务进度甘特图-报警信息ID", paramType = "body", required = true, dataType = "String", example = "{\"id\":\"1\"}") + @PostMapping(value = "/delete") + public Result delete(@ApiIgnore @RequestBody HashMap map) { + String id = MapUtils.getString(map, "id"); + Result result = new Result(); + TaskProgressAlarm taskProgressAlarm = taskProgressAlarmService.getById(id); + if (taskProgressAlarm == null) { + result.error500("未找到对应实体"); + } else { + boolean ok = taskProgressAlarmService.removeById(id); + if (ok) { + result.success("删除成功!"); + } + } - return result; - } + return result; + } - /** - * 通过id查询 - * - * @param id - * @return - */ - @ApiOperation(value = "通过id查询任务进度甘特图-报警信息信息", notes = "通过id查询任务进度甘特图-报警信息信息", httpMethod = "GET") - @ApiImplicitParam(name = "id", value = "任务进度甘特图-报警信息ID", paramType = "query", required = true, dataType = "Integer") - @GetMapping(value = "/queryById") - public Result queryById(@RequestParam(name = "id", required = true) String id) { - Result result = new Result(); - TaskProgressAlarm taskProgressAlarm = taskProgressAlarmService.getById(id); - if (taskProgressAlarm == null) { - result.error500("未找到对应实体"); - } else { - result.setResult(taskProgressAlarm); - result.setSuccess(true); - } - return result; - } + /** + * 通过id查询 + * + * @param id + * @return + */ + @ApiOperation(value = "通过id查询任务进度甘特图-报警信息信息", notes = "通过id查询任务进度甘特图-报警信息信息", httpMethod = "GET") + @ApiImplicitParam(name = "id", value = "任务进度甘特图-报警信息ID", paramType = "query", required = true, dataType = "Integer") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name = "id", required = true) String id) { + Result result = new Result(); + TaskProgressAlarm taskProgressAlarm = taskProgressAlarmService.getById(id); + if (taskProgressAlarm == null) { + result.error500("未找到对应实体"); + } else { + result.setResult(taskProgressAlarm); + result.setSuccess(true); + } + return result; + } - /** - * 导出excel - * - * @param request - * @param response - */ - @ApiOperation(value = "导出excel任务进度甘特图-报警信息信息", notes = "导出excel任务进度甘特图-报警信息信息", httpMethod = "POST") - @RequestMapping(value = "/exportXls") - public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) { - // Step.1 组装查询条件 - QueryWrapper queryWrapper = null; - try { - String paramsStr = request.getParameter("paramsStr"); - if (oConvertUtils.isNotEmpty(paramsStr)) { - String deString = URLDecoder.decode(paramsStr, "UTF-8"); - TaskProgressAlarm taskProgressAlarm = JSON.parseObject(deString, TaskProgressAlarm.class); - queryWrapper = QueryGenerator.initQueryWrapper(taskProgressAlarm, request.getParameterMap()); - } - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } + /** + * 导出excel + * + * @param request + * @param response + */ + @ApiOperation(value = "导出excel任务进度甘特图-报警信息信息", notes = "导出excel任务进度甘特图-报警信息信息", httpMethod = "POST") + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) { + // Step.1 组装查询条件 + QueryWrapper queryWrapper = null; + try { + String paramsStr = request.getParameter("paramsStr"); + if (oConvertUtils.isNotEmpty(paramsStr)) { + String deString = URLDecoder.decode(paramsStr, "UTF-8"); + TaskProgressAlarm taskProgressAlarm = JSON.parseObject(deString, TaskProgressAlarm.class); + queryWrapper = QueryGenerator.initQueryWrapper(taskProgressAlarm, request.getParameterMap()); + } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } - //Step.2 AutoPoi 导出Excel - ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); - List pageList = taskProgressAlarmService.list(queryWrapper); - //导出文件名称 - mv.addObject(NormalExcelConstants.FILE_NAME, "任务进度甘特图-报警信息列表"); - mv.addObject(NormalExcelConstants.CLASS, TaskProgressAlarm.class); - mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("任务进度甘特图-报警信息列表数据", "导出人:Jeecg", "导出信息")); - mv.addObject(NormalExcelConstants.DATA_LIST, pageList); - return mv; - } + //Step.2 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + List pageList = taskProgressAlarmService.list(queryWrapper); + //导出文件名称 + mv.addObject(NormalExcelConstants.FILE_NAME, "任务进度甘特图-报警信息列表"); + mv.addObject(NormalExcelConstants.CLASS, TaskProgressAlarm.class); + mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("任务进度甘特图-报警信息列表数据", "导出人:Jeecg", "导出信息")); + mv.addObject(NormalExcelConstants.DATA_LIST, pageList); + return mv; + } } diff --git a/src/main/java/com/zhgd/xmgl/modules/taskprogress/controller/TaskProgressController.java b/src/main/java/com/zhgd/xmgl/modules/taskprogress/controller/TaskProgressController.java index f50f542da..3aef204a2 100644 --- a/src/main/java/com/zhgd/xmgl/modules/taskprogress/controller/TaskProgressController.java +++ b/src/main/java/com/zhgd/xmgl/modules/taskprogress/controller/TaskProgressController.java @@ -1,12 +1,10 @@ package com.zhgd.xmgl.modules.taskprogress.controller; -import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.zhgd.jeecg.common.api.vo.Result; import com.zhgd.jeecg.common.system.query.QueryGenerator; -import com.zhgd.jeecg.common.util.oConvertUtils; import com.zhgd.xmgl.modules.taskprogress.entity.TaskProgress; import com.zhgd.xmgl.modules.taskprogress.service.ITaskProgressService; import io.swagger.annotations.Api; @@ -14,19 +12,19 @@ import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.collections.MapUtils; -import org.jeecgframework.poi.excel.def.NormalExcelConstants; -import org.jeecgframework.poi.excel.entity.ExportParams; -import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.apache.poi.util.IOUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.ClassPathResource; import org.springframework.web.bind.annotation.*; -import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.multipart.MultipartFile; import springfox.documentation.annotations.ApiIgnore; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URLEncoder; import java.util.HashMap; import java.util.List; @@ -166,36 +164,39 @@ public class TaskProgressController { } /** - * 导出excel - * - * @param request - * @param response + * 下载mpp文件模板 */ - @ApiOperation(value = "导出excel任务进度甘特图信息", notes = "导出excel任务进度甘特图信息", httpMethod = "POST") - @RequestMapping(value = "/exportXls") - public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) { - // Step.1 组装查询条件 - QueryWrapper queryWrapper = null; + @GetMapping(value = "/downloadTemplate") + @ApiOperation(value = "下载mpp文件模板") + public void downloadTemplate(HttpServletResponse response) { try { - String paramsStr = request.getParameter("paramsStr"); - if (oConvertUtils.isNotEmpty(paramsStr)) { - String deString = URLDecoder.decode(paramsStr, "UTF-8"); - TaskProgress taskProgress = JSON.parseObject(deString, TaskProgress.class); - queryWrapper = QueryGenerator.initQueryWrapper(taskProgress, request.getParameterMap()); - } - } catch (UnsupportedEncodingException e) { + OutputStream out = response.getOutputStream(); + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/vnd.ms-project"); + response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode("任务进度甘特图上传模板.mpp.mpp", "UTF-8")); + InputStream fis = new ClassPathResource("template/任务进度甘特图上传模板.mpp.mpp").getInputStream(); + IOUtils.copy(fis, out); + out.flush(); + out.close(); + } catch (IOException e) { e.printStackTrace(); } - - //Step.2 AutoPoi 导出Excel - ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); - List pageList = taskProgressService.list(queryWrapper); - //导出文件名称 - mv.addObject(NormalExcelConstants.FILE_NAME, "任务进度甘特图列表"); - mv.addObject(NormalExcelConstants.CLASS, TaskProgress.class); - mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("任务进度甘特图列表数据", "导出人:Jeecg", "导出信息")); - mv.addObject(NormalExcelConstants.DATA_LIST, pageList); - return mv; } + /** + * 导入mpp文件解析对应的数据(增量覆盖) + * + * @param mppFile + * @return 删除结果 + */ + @PostMapping(value = "/importData") + @ApiOperation(value = "导入mpp文件解析对应的数据(增量覆盖)") + @ApiImplicitParams({ + @ApiImplicitParam(name = "mppUrl", value = "mpp甘特图文件路径", dataType = "string", dataTypeClass = String.class, required = true, paramType = "query"), + @ApiImplicitParam(name = "projectSn", value = "项目sn", dataType = "string", dataTypeClass = String.class, required = true, paramType = "query"), + }) + public Result importData(@RequestParam(value = "mppFile") MultipartFile mppFile, String projectSn, Long createUserId) { + taskProgressService.importData(mppFile, projectSn, createUserId); + return Result.ok(); + } } diff --git a/src/main/java/com/zhgd/xmgl/modules/taskprogress/controller/TaskProgressMaterialRelController.java b/src/main/java/com/zhgd/xmgl/modules/taskprogress/controller/TaskProgressMaterialRelController.java index 401105f9b..d02682065 100644 --- a/src/main/java/com/zhgd/xmgl/modules/taskprogress/controller/TaskProgressMaterialRelController.java +++ b/src/main/java/com/zhgd/xmgl/modules/taskprogress/controller/TaskProgressMaterialRelController.java @@ -1,39 +1,36 @@ package com.zhgd.xmgl.modules.taskprogress.controller; -import com.zhgd.xmgl.util.PageUtil; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiOperation; - -import java.util.HashMap; -import java.util.List; -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import com.zhgd.jeecg.common.api.vo.Result; -import com.zhgd.jeecg.common.system.query.QueryGenerator; -import com.zhgd.jeecg.common.util.oConvertUtils; -import org.apache.commons.collections.MapUtils; -import com.zhgd.xmgl.modules.taskprogress.entity.TaskProgressMaterialRel; -import com.zhgd.xmgl.modules.taskprogress.service.ITaskProgressMaterialRelService; - +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.zhgd.jeecg.common.api.vo.Result; +import com.zhgd.jeecg.common.system.query.QueryGenerator; +import com.zhgd.jeecg.common.util.oConvertUtils; +import com.zhgd.xmgl.modules.taskprogress.entity.TaskProgress; +import com.zhgd.xmgl.modules.taskprogress.entity.TaskProgressMaterialRel; +import com.zhgd.xmgl.modules.taskprogress.service.ITaskProgressMaterialRelService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; - +import org.apache.commons.collections.MapUtils; 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.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; -import com.alibaba.fastjson.JSON; import springfox.documentation.annotations.ApiIgnore; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.util.HashMap; +import java.util.List; + /** * @Title: Controller @@ -47,151 +44,154 @@ import springfox.documentation.annotations.ApiIgnore; @Slf4j @Api(tags = "任务进度甘特图-材料类型-关联相关Api") public class TaskProgressMaterialRelController { - @Autowired - private ITaskProgressMaterialRelService taskProgressMaterialRelService; + @Autowired + private ITaskProgressMaterialRelService taskProgressMaterialRelService; - /** - * 分页列表查询 - * - * @param taskProgressMaterialRel - * @param pageNo - * @param pageSize - * @param req - * @return - */ - @ApiOperation(value = "分页列表查询任务进度甘特图-材料类型-关联信息", notes = "分页列表查询任务进度甘特图-材料类型-关联信息", httpMethod = "GET") - @GetMapping(value = "/page") - public Result> queryPageList(TaskProgressMaterialRel taskProgressMaterialRel, - @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, - @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, - HttpServletRequest req) { - Result> result = new Result>(); - QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(taskProgressMaterialRel, req.getParameterMap()); - Page page = new Page(pageNo, pageSize); - IPage pageList = taskProgressMaterialRelService.page(page, queryWrapper); - result.setSuccess(true); - result.setResult(pageList); - return result; - } + /** + * 分页列表查询 + * + * @param taskProgressMaterialRel + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @ApiOperation(value = "分页列表查询任务进度甘特图-计划材料工程列表", notes = "分页列表查询任务进度甘特图-计划材料工程列表", httpMethod = "GET") + @GetMapping(value = "/page") + public Result> queryPageList(TaskProgressMaterialRel taskProgressMaterialRel, + @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, + HttpServletRequest req) { + Result> result = new Result>(); + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(taskProgressMaterialRel, req.getParameterMap()); + Page page = new Page<>(pageNo, pageSize); + IPage pageList = taskProgressMaterialRelService.page(page, queryWrapper); + result.setSuccess(true); + result.setResult(pageList); + return result; + } - /** - * 列表查询 - * - * @param taskProgressMaterialRel - * @param req - * @return - */ - @ApiOperation(value = "列表查询任务进度甘特图-材料类型-关联信息", notes = "列表查询任务进度甘特图-材料类型-关联信息", httpMethod = "GET") - @GetMapping(value = "/list") - public Result> queryList(TaskProgressMaterialRel taskProgressMaterialRel, - HttpServletRequest req) { - QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(taskProgressMaterialRel, req.getParameterMap()); - return Result.success(taskProgressMaterialRelService.list(queryWrapper)); - } + @ApiOperation(value = "树形列表查询任务进度甘特图-计划材料工程列表", notes = "树形列表查询任务进度甘特图-计划材料工程列表", httpMethod = "GET") + @ApiImplicitParams({ + @ApiImplicitParam(name = "projectSn", value = "项目sn", paramType = "query", required = true, dataType = "String"), + }) + @GetMapping(value = "/tree/list") + public Result> queryTreeList(@ApiIgnore @RequestBody HashMap paramMap) { + return Result.success(taskProgressMaterialRelService.queryTreeList(paramMap)); + } - /** - * 添加 - * - * @param taskProgressMaterialRel - * @return - */ - @ApiOperation(value = "添加任务进度甘特图-材料类型-关联信息", notes = "添加任务进度甘特图-材料类型-关联信息", httpMethod = "POST") - @PostMapping(value = "/add") - public Result add(@RequestBody TaskProgressMaterialRel taskProgressMaterialRel) { - taskProgressMaterialRelService.save(taskProgressMaterialRel); - return Result.ok(); - } + @ApiOperation(value = "查询任务进度甘特图-最新的材料用量", notes = "查询任务进度甘特图-最新的材料用量", httpMethod = "GET") + @ApiImplicitParams({ + @ApiImplicitParam(name = "taskProgressId", value = "任务进度甘特图id", paramType = "query", required = true, dataType = "String"), + }) + @GetMapping(value = "/detailList") + public Result> queryDetailList(@ApiIgnore @RequestBody HashMap paramMap) { + return Result.success(taskProgressMaterialRelService.queryDetailList(paramMap)); + } - /** - * 编辑 - * - * @param taskProgressMaterialRel - * @return - */ - @ApiOperation(value = "编辑任务进度甘特图-材料类型-关联信息", notes = "编辑任务进度甘特图-材料类型-关联信息", httpMethod = "POST") - @PostMapping(value = "/edit") - public Result edit(@RequestBody TaskProgressMaterialRel taskProgressMaterialRel) { - taskProgressMaterialRelService.updateById(taskProgressMaterialRel); - return Result.ok(); - } + /** + * 添加 + * + * @param taskProgressMaterialRel + * @return + */ + @ApiOperation(value = "添加任务进度甘特图-材料类型-关联信息", notes = "添加任务进度甘特图-材料类型-关联信息", httpMethod = "POST") + @PostMapping(value = "/add") + public Result add(@RequestBody TaskProgressMaterialRel taskProgressMaterialRel) { + taskProgressMaterialRelService.save(taskProgressMaterialRel); + return Result.ok(); + } - /** - * 通过id删除 - * - * @param id - * @return - */ - @ApiOperation(value = "删除任务进度甘特图-材料类型-关联信息", notes = "删除任务进度甘特图-材料类型-关联信息", httpMethod = "POST") - @ApiImplicitParam(name = "id", value = "任务进度甘特图-材料类型-关联ID", paramType = "body", required = true, dataType = "String", example = "{\"id\":\"1\"}") - @PostMapping(value = "/delete") - public Result delete(@ApiIgnore @RequestBody HashMap map) { - String id = MapUtils.getString(map, "id"); - Result result = new Result(); - TaskProgressMaterialRel taskProgressMaterialRel = taskProgressMaterialRelService.getById(id); - if (taskProgressMaterialRel == null) { - result.error500("未找到对应实体"); - } else { - boolean ok = taskProgressMaterialRelService.removeById(id); - if (ok) { - result.success("删除成功!"); - } - } + /** + * 编辑 + * + * @param taskProgressMaterialRel + * @return + */ + @ApiOperation(value = "编辑任务进度甘特图-材料类型-关联信息", notes = "编辑任务进度甘特图-材料类型-关联信息", httpMethod = "POST") + @PostMapping(value = "/edit") + public Result edit(@RequestBody TaskProgressMaterialRel taskProgressMaterialRel) { + taskProgressMaterialRelService.updateById(taskProgressMaterialRel); + return Result.ok(); + } - return result; - } + /** + * 通过id删除 + * + * @param id + * @return + */ + @ApiOperation(value = "删除任务进度甘特图-材料类型-关联信息", notes = "删除任务进度甘特图-材料类型-关联信息", httpMethod = "POST") + @ApiImplicitParam(name = "id", value = "任务进度甘特图-材料类型-关联ID", paramType = "body", required = true, dataType = "String", example = "{\"id\":\"1\"}") + @PostMapping(value = "/delete") + public Result delete(@ApiIgnore @RequestBody HashMap map) { + String id = MapUtils.getString(map, "id"); + Result result = new Result(); + TaskProgressMaterialRel taskProgressMaterialRel = taskProgressMaterialRelService.getById(id); + if (taskProgressMaterialRel == null) { + result.error500("未找到对应实体"); + } else { + boolean ok = taskProgressMaterialRelService.removeById(id); + if (ok) { + result.success("删除成功!"); + } + } - /** - * 通过id查询 - * - * @param id - * @return - */ - @ApiOperation(value = "通过id查询任务进度甘特图-材料类型-关联信息", notes = "通过id查询任务进度甘特图-材料类型-关联信息", httpMethod = "GET") - @ApiImplicitParam(name = "id", value = "任务进度甘特图-材料类型-关联ID", paramType = "query", required = true, dataType = "Integer") - @GetMapping(value = "/queryById") - public Result queryById(@RequestParam(name = "id", required = true) String id) { - Result result = new Result(); - TaskProgressMaterialRel taskProgressMaterialRel = taskProgressMaterialRelService.getById(id); - if (taskProgressMaterialRel == null) { - result.error500("未找到对应实体"); - } else { - result.setResult(taskProgressMaterialRel); - result.setSuccess(true); - } - return result; - } + return result; + } - /** - * 导出excel - * - * @param request - * @param response - */ - @ApiOperation(value = "导出excel任务进度甘特图-材料类型-关联信息", notes = "导出excel任务进度甘特图-材料类型-关联信息", httpMethod = "POST") - @RequestMapping(value = "/exportXls") - public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) { - // Step.1 组装查询条件 - QueryWrapper queryWrapper = null; - try { - String paramsStr = request.getParameter("paramsStr"); - if (oConvertUtils.isNotEmpty(paramsStr)) { - String deString = URLDecoder.decode(paramsStr, "UTF-8"); - TaskProgressMaterialRel taskProgressMaterialRel = JSON.parseObject(deString, TaskProgressMaterialRel.class); - queryWrapper = QueryGenerator.initQueryWrapper(taskProgressMaterialRel, request.getParameterMap()); - } - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } + /** + * 通过id查询 + * + * @param id + * @return + */ + @ApiOperation(value = "通过id查询任务进度甘特图-材料类型-关联信息", notes = "通过id查询任务进度甘特图-材料类型-关联信息", httpMethod = "GET") + @ApiImplicitParam(name = "id", value = "任务进度甘特图-材料类型-关联ID", paramType = "query", required = true, dataType = "Integer") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name = "id", required = true) String id) { + Result result = new Result(); + TaskProgressMaterialRel taskProgressMaterialRel = taskProgressMaterialRelService.getById(id); + if (taskProgressMaterialRel == null) { + result.error500("未找到对应实体"); + } else { + result.setResult(taskProgressMaterialRel); + result.setSuccess(true); + } + return result; + } - //Step.2 AutoPoi 导出Excel - ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); - List pageList = taskProgressMaterialRelService.list(queryWrapper); - //导出文件名称 - mv.addObject(NormalExcelConstants.FILE_NAME, "任务进度甘特图-材料类型-关联列表"); - mv.addObject(NormalExcelConstants.CLASS, TaskProgressMaterialRel.class); - mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("任务进度甘特图-材料类型-关联列表数据", "导出人:Jeecg", "导出信息")); - mv.addObject(NormalExcelConstants.DATA_LIST, pageList); - return mv; - } + /** + * 导出excel + * + * @param request + * @param response + */ + @ApiOperation(value = "导出excel任务进度甘特图-材料类型-关联信息", notes = "导出excel任务进度甘特图-材料类型-关联信息", httpMethod = "POST") + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) { + // Step.1 组装查询条件 + QueryWrapper queryWrapper = null; + try { + String paramsStr = request.getParameter("paramsStr"); + if (oConvertUtils.isNotEmpty(paramsStr)) { + String deString = URLDecoder.decode(paramsStr, "UTF-8"); + TaskProgressMaterialRel taskProgressMaterialRel = JSON.parseObject(deString, TaskProgressMaterialRel.class); + queryWrapper = QueryGenerator.initQueryWrapper(taskProgressMaterialRel, request.getParameterMap()); + } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + //Step.2 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + List pageList = taskProgressMaterialRelService.list(queryWrapper); + //导出文件名称 + mv.addObject(NormalExcelConstants.FILE_NAME, "任务进度甘特图-材料类型-关联列表"); + mv.addObject(NormalExcelConstants.CLASS, TaskProgressMaterialRel.class); + mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("任务进度甘特图-材料类型-关联列表数据", "导出人:Jeecg", "导出信息")); + mv.addObject(NormalExcelConstants.DATA_LIST, pageList); + return mv; + } } diff --git a/src/main/java/com/zhgd/xmgl/modules/taskprogress/entity/TaskProgress.java b/src/main/java/com/zhgd/xmgl/modules/taskprogress/entity/TaskProgress.java index 3d39ee0da..c2533f460 100644 --- a/src/main/java/com/zhgd/xmgl/modules/taskprogress/entity/TaskProgress.java +++ b/src/main/java/com/zhgd/xmgl/modules/taskprogress/entity/TaskProgress.java @@ -1,9 +1,6 @@ package com.zhgd.xmgl.modules.taskprogress.entity; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -135,12 +132,21 @@ public class TaskProgress implements Serializable { @TableField(value = "remark") @ApiModelProperty(value = "备注") private String remark; + /** + * 负责人名称 + */ + @TableField(value = "duty_user_name", updateStrategy = FieldStrategy.IGNORED) + @ApiModelProperty(value = "负责人名称") + private String dutyUserName; /** * 子节点列表 */ @TableField(exist = false) @ApiModelProperty(value = "子节点列表") private List children; + @TableField(exist = false) + @ApiModelProperty(value = "任务进度甘特图-材料类型数量") + private List relList; /** * 开始预警:1提前2正常3逾期 diff --git a/src/main/java/com/zhgd/xmgl/modules/taskprogress/entity/TaskProgressAlarm.java b/src/main/java/com/zhgd/xmgl/modules/taskprogress/entity/TaskProgressAlarm.java index 2c68802e3..9fb77a781 100644 --- a/src/main/java/com/zhgd/xmgl/modules/taskprogress/entity/TaskProgressAlarm.java +++ b/src/main/java/com/zhgd/xmgl/modules/taskprogress/entity/TaskProgressAlarm.java @@ -1,16 +1,17 @@ package com.zhgd.xmgl.modules.taskprogress.entity; -import java.io.Serializable; - import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; import com.fasterxml.jackson.annotation.JsonFormat; -import org.springframework.format.annotation.DateTimeFormat; -import org.jeecgframework.poi.excel.annotation.Excel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; /** * @Description: 任务进度甘特图-报警信息 @@ -22,52 +23,55 @@ import io.swagger.annotations.ApiModelProperty; @TableName("task_progress_alarm") @ApiModel(value = "TaskProgressAlarm实体类", description = "TaskProgressAlarm") public class TaskProgressAlarm implements Serializable { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - /** - * id - */ - @TableId(type = IdType.ASSIGN_ID) - @ApiModelProperty(value = "id") - private java.lang.Long id; - /** - * 所属项目SN - */ - @Excel(name = "所属项目SN", width = 15) - @ApiModelProperty(value = "所属项目SN") - private java.lang.String projectSn; - /** - * 任务进度甘特图id - */ - @Excel(name = "任务进度甘特图id", width = 15) - @ApiModelProperty(value = "任务进度甘特图id") - private java.lang.Long taskProgressId; - /** - * 报警详情 - */ - @Excel(name = "报警详情", width = 15) - @ApiModelProperty(value = "报警详情") - private java.lang.String alarmDetails; - /** - * 报警类型 1:逾期未开始 2:逾期未完成 - */ - @Excel(name = "报警类型 1:逾期未开始 2:逾期未完成", width = 15) - @ApiModelProperty(value = "报警类型 1:逾期未开始 2:逾期未完成") - private java.lang.Integer alarmType; - /** - * 创建时间 - */ - @Excel(name = "创建时间", width = 20, format = "yyyy-MM-dd HH:mm:ss") - @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") - @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @ApiModelProperty(value = "创建时间") - private java.util.Date createDate; - /** - * 更新时间 - */ - @Excel(name = "更新时间", width = 20, format = "yyyy-MM-dd HH:mm:ss") - @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") - @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @ApiModelProperty(value = "更新时间") - private java.util.Date updateDate; + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "id") + private java.lang.Long id; + /** + * 所属项目SN + */ + @Excel(name = "所属项目SN", width = 15) + @ApiModelProperty(value = "所属项目SN") + private java.lang.String projectSn; + /** + * 任务进度甘特图id + */ + @Excel(name = "任务进度甘特图id", width = 15) + @ApiModelProperty(value = "任务进度甘特图id") + private java.lang.Long taskProgressId; + /** + * 报警详情 + */ + @Excel(name = "报警详情", width = 15) + @ApiModelProperty(value = "报警详情") + private java.lang.String alarmDetails; + /** + * 报警类型 1:逾期未开始 2:逾期未完成 + */ + @Excel(name = "报警类型 1:逾期未开始 2:逾期未完成", width = 15) + @ApiModelProperty(value = "报警类型 1:逾期未开始 2:逾期未完成") + private java.lang.Integer alarmType; + /** + * 报警时间 + */ + @Excel(name = "报警时间", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "报警时间") + private java.util.Date createDate; + /** + * 更新时间 + */ + @Excel(name = "更新时间", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "更新时间") + private java.util.Date updateDate; + + @ApiModelProperty(value = "任务名称") + private java.lang.String taskName; } diff --git a/src/main/java/com/zhgd/xmgl/modules/taskprogress/entity/TaskProgressMaterialRel.java b/src/main/java/com/zhgd/xmgl/modules/taskprogress/entity/TaskProgressMaterialRel.java index 595f3c742..98077f617 100644 --- a/src/main/java/com/zhgd/xmgl/modules/taskprogress/entity/TaskProgressMaterialRel.java +++ b/src/main/java/com/zhgd/xmgl/modules/taskprogress/entity/TaskProgressMaterialRel.java @@ -32,10 +32,9 @@ public class TaskProgressMaterialRel implements Serializable { @ApiModelProperty(value = "id") private java.lang.Long id; /** - * taskProgressId + * 任务进度甘特图id */ - @Excel(name = "taskProgressId", width = 15) - @ApiModelProperty(value = "taskProgressId") + @ApiModelProperty(value = "任务进度甘特图id") private java.lang.Long taskProgressId; /** * taskProgressMaterialTypeId @@ -81,4 +80,8 @@ public class TaskProgressMaterialRel implements Serializable { @TableField(exist = false) @ApiModelProperty(value = "名称(如工种、材料、设备名称等)") private java.lang.String name; + + @TableField(exist = false) + @ApiModelProperty(value = "类型:1工种2材料3设备") + private java.lang.Integer type; } diff --git a/src/main/java/com/zhgd/xmgl/modules/taskprogress/mapper/TaskProgressMaterialRelMapper.java b/src/main/java/com/zhgd/xmgl/modules/taskprogress/mapper/TaskProgressMaterialRelMapper.java index 07dd7affc..409f73523 100644 --- a/src/main/java/com/zhgd/xmgl/modules/taskprogress/mapper/TaskProgressMaterialRelMapper.java +++ b/src/main/java/com/zhgd/xmgl/modules/taskprogress/mapper/TaskProgressMaterialRelMapper.java @@ -1,10 +1,12 @@ package com.zhgd.xmgl.modules.taskprogress.mapper; +import com.zhgd.xmgl.modules.taskprogress.entity.TaskProgress; import com.zhgd.xmgl.modules.taskprogress.entity.TaskProgressMaterialType; import org.apache.ibatis.annotations.Mapper; import com.zhgd.xmgl.modules.taskprogress.entity.TaskProgressMaterialRel; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.HashMap; import java.util.List; /** @@ -17,4 +19,8 @@ import java.util.List; public interface TaskProgressMaterialRelMapper extends BaseMapper { List queryDetailListByContentIds(List ids); + + List queryDetailList(HashMap paramMap); + + List queryList(HashMap paramMap); } diff --git a/src/main/java/com/zhgd/xmgl/modules/taskprogress/mapper/xml/TaskProgressMaterialRelMapper.xml b/src/main/java/com/zhgd/xmgl/modules/taskprogress/mapper/xml/TaskProgressMaterialRelMapper.xml index 075fa4b2a..eb7bbc46b 100644 --- a/src/main/java/com/zhgd/xmgl/modules/taskprogress/mapper/xml/TaskProgressMaterialRelMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/taskprogress/mapper/xml/TaskProgressMaterialRelMapper.xml @@ -3,7 +3,7 @@ + + + + diff --git a/src/main/java/com/zhgd/xmgl/modules/taskprogress/service/ITaskProgressMaterialRelService.java b/src/main/java/com/zhgd/xmgl/modules/taskprogress/service/ITaskProgressMaterialRelService.java index 73c090aa8..fdfd4fcec 100644 --- a/src/main/java/com/zhgd/xmgl/modules/taskprogress/service/ITaskProgressMaterialRelService.java +++ b/src/main/java/com/zhgd/xmgl/modules/taskprogress/service/ITaskProgressMaterialRelService.java @@ -1,8 +1,13 @@ package com.zhgd.xmgl.modules.taskprogress.service; +import com.zhgd.xmgl.modules.taskprogress.entity.TaskProgress; import com.zhgd.xmgl.modules.taskprogress.entity.TaskProgressMaterialRel; import com.baomidou.mybatisplus.extension.service.IService; +import javax.servlet.http.HttpServletRequest; +import java.util.HashMap; +import java.util.List; + /** * @Description: 任务进度甘特图-材料类型-关联 * @author: pds @@ -11,4 +16,7 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface ITaskProgressMaterialRelService extends IService { + List queryDetailList(HashMap paramMap); + + List queryTreeList(HashMap paramMap); } diff --git a/src/main/java/com/zhgd/xmgl/modules/taskprogress/service/ITaskProgressService.java b/src/main/java/com/zhgd/xmgl/modules/taskprogress/service/ITaskProgressService.java index ffaf19717..425be0a41 100644 --- a/src/main/java/com/zhgd/xmgl/modules/taskprogress/service/ITaskProgressService.java +++ b/src/main/java/com/zhgd/xmgl/modules/taskprogress/service/ITaskProgressService.java @@ -3,6 +3,7 @@ package com.zhgd.xmgl.modules.taskprogress.service; import com.zhgd.xmgl.modules.project.entity.ProgressTask; import com.zhgd.xmgl.modules.taskprogress.entity.TaskProgress; import com.baomidou.mybatisplus.extension.service.IService; +import org.springframework.web.multipart.MultipartFile; import java.util.HashMap; import java.util.List; @@ -20,4 +21,6 @@ public interface ITaskProgressService extends IService { void add(TaskProgress taskProgress); void delete(HashMap map); + + void importData(MultipartFile mppFile, String projectSn, Long createUserId); } diff --git a/src/main/java/com/zhgd/xmgl/modules/taskprogress/service/impl/TaskProgressMaterialRelServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/taskprogress/service/impl/TaskProgressMaterialRelServiceImpl.java index dcba7afa3..2c33ac5cb 100644 --- a/src/main/java/com/zhgd/xmgl/modules/taskprogress/service/impl/TaskProgressMaterialRelServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/taskprogress/service/impl/TaskProgressMaterialRelServiceImpl.java @@ -1,11 +1,22 @@ package com.zhgd.xmgl.modules.taskprogress.service.impl; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.zhgd.xmgl.modules.taskprogress.entity.TaskProgress; import com.zhgd.xmgl.modules.taskprogress.entity.TaskProgressMaterialRel; +import com.zhgd.xmgl.modules.taskprogress.mapper.TaskProgressMapper; import com.zhgd.xmgl.modules.taskprogress.mapper.TaskProgressMaterialRelMapper; import com.zhgd.xmgl.modules.taskprogress.service.ITaskProgressMaterialRelService; +import org.apache.commons.collections.MapUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * @Description: 任务进度甘特图-材料类型-关联 @@ -16,4 +27,32 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @Service public class TaskProgressMaterialRelServiceImpl extends ServiceImpl implements ITaskProgressMaterialRelService { + @Autowired + TaskProgressMaterialRelMapper taskProgressMaterialRelMapper; + @Autowired + TaskProgressMapper taskProgressMapper; + @Autowired + TaskProgressServiceImpl taskProgressService; + + @Override + public List queryDetailList(HashMap paramMap) { + return taskProgressMaterialRelMapper.queryDetailList(paramMap); + } + + @Override + public List queryTreeList(HashMap paramMap) { + String projectSn = MapUtils.getString(paramMap, "projectSn"); + List progressTaskList = taskProgressMapper.selectList(Wrappers.lambdaQuery(TaskProgress.class).eq(TaskProgress::getProjectSn, projectSn)); + List ids = progressTaskList.stream().map(TaskProgress::getId).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(ids)) { + paramMap.put("list", ids); + List taskProgresses = taskProgressMaterialRelMapper.queryList(paramMap); + Map> taskProgressIdMap = taskProgresses.stream().collect(Collectors.groupingBy(TaskProgressMaterialRel::getTaskProgressId)); + for (TaskProgress taskProgress : progressTaskList) { + taskProgress.setRelList(taskProgressIdMap.get(taskProgress.getId())); + } + } + Map> parentIdTaskListMap = progressTaskList.stream().collect(Collectors.groupingBy(TaskProgress::getParentId)); + return taskProgressService.getChild(parentIdTaskListMap, 0L); + } } diff --git a/src/main/java/com/zhgd/xmgl/modules/taskprogress/service/impl/TaskProgressServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/taskprogress/service/impl/TaskProgressServiceImpl.java index 2cc497487..b82374795 100644 --- a/src/main/java/com/zhgd/xmgl/modules/taskprogress/service/impl/TaskProgressServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/taskprogress/service/impl/TaskProgressServiceImpl.java @@ -9,9 +9,12 @@ import com.zhgd.jeecg.common.execption.OpenAlertException; import com.zhgd.xmgl.modules.taskprogress.entity.TaskProgress; import com.zhgd.xmgl.modules.taskprogress.mapper.TaskProgressMapper; import com.zhgd.xmgl.modules.taskprogress.service.ITaskProgressService; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.MapUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; import java.util.*; import java.util.stream.Collectors; @@ -23,6 +26,8 @@ import java.util.stream.Collectors; * @version: V1.0 */ @Service +@Transactional(rollbackFor = Exception.class) +@Slf4j public class TaskProgressServiceImpl extends ServiceImpl implements ITaskProgressService { @Autowired TaskProgressMapper taskProgressMapper; @@ -35,6 +40,7 @@ public class TaskProgressServiceImpl extends ServiceImpl getParentChildList(HashMap paramMap) { String projectSn = MapUtils.getString(paramMap, "projectSn"); + //to do 人名 // 查询项目下的节点集合,通过父节点分组 List progressTaskList = baseMapper.selectList(Wrappers.lambdaQuery(TaskProgress.class).eq(TaskProgress::getProjectSn, projectSn)); for (TaskProgress taskProgress : progressTaskList) { @@ -107,6 +113,82 @@ public class TaskProgressServiceImpl extends ServiceImpl progressTasks = taskProgressMapper.selectList(Wrappers.lambdaQuery(TaskProgress.class).eq(TaskProgress::getProjectSn, projectSn)); + //log.info("原progressTasks:{}", JSON.toJSONString(progressTasks)); + // + //Collection progressTaskList = analysisMpp(mppFile, projectSn, createUserId); + //log.info("importData的新增数据:{}", progressTaskList); + // + //if (CollUtil.isNotEmpty(progressTaskList)) { + // insertBatch(progressTaskList); + //} + } + + ///** + // * 解析mpp文件 + // * + // * @param mppFile 文件 + // * @param projectSn 项目sn + // * @param createUserId 上传用户 + // * @return + // */ + //private Collection analysisMpp(MultipartFile mppFile, String projectSn, Long createUserId) { + // List projectTaskList = new LinkedList<>(); + // Set userNameSet = new LinkedHashSet<>(); + // // + // Map uniqueIdTaskProgressMap = new LinkedHashMap<>(); + // // 前置任务列表 + // List progressTaskPredecessorList = new LinkedList<>(); + // try { + // // 读取文件 + // MPPReader mppRead = new MPPReader(); + // String fileName = ((HashMap) ((ArrayList) uploadFileService.uploadImage(new MultipartFile[]{mppFile}).get("data")).get(0)).get("filename").toString(); + // ProjectFile pf = mppRead.read(new File(basePath + fileName)); + // // 递归拿到对应的数据, 跳过第0级无用数据 + // List childTasks = pf.getChildTasks(); + // if (CollUtil.isNotEmpty(childTasks)) { + // structureTaskDataList(projectTaskList, userNameSet, childTasks.get(0).getChildTasks(), uniqueIdTaskProgressMap, progressTaskPredecessorList, 0L, projectSn, createUserId); + // // 判断是否具有负责人 + // if (CollUtil.isNotEmpty(userNameSet)) { + // List dutyUserList = systemUserMapper.selectBySnAndNumberOneList(projectSn, userNameSet); + // + // // 用户不为空时,进行负责人id赋值 + // if (CollUtil.isNotEmpty(dutyUserList)) { + // Map userMap = dutyUserList.stream().collect(Collectors.toMap(SystemUser::getRealName, SystemUser::getUserId)); + // for (TaskProgress progressTask : projectTaskList) { + // progressTask.setDutyUserId(userMap.get(progressTask.getDutyUserName())); + // } + // } + // } + // + // Map progressTaskMap = projectTaskList.stream().collect(Collectors.toMap(TaskProgress::getId, Function.identity())); + // // 赋值前置任务 + // if (CollUtil.isNotEmpty(progressTaskPredecessorList)) { + // for (TaskProgressPredecessorDTO progressTaskPredecessor : progressTaskPredecessorList) { + // TaskProgress progressTask = progressTaskMap.get(progressTaskPredecessor.getTaskId()); + // String predecessorIds = progressTask.getPredecessorIds(); + // if (CharSequenceUtil.isBlank(predecessorIds)) { + // progressTask.setPredecessorIds(uniqueIdTaskProgressMap.get(progressTaskPredecessor.getPredecessorId()).getId() + ""); + // } else { + // progressTask.setPredecessorIds(predecessorIds + "," + uniqueIdTaskProgressMap.get(progressTaskPredecessor.getPredecessorId()).getId()); + // } + // } + // } + // return progressTaskMap.values(); + // } + // throw new RuntimeException("mpp文件数据为空!"); + // + // } catch (MPXJException e) { + // throw new OpenAlertException("上传甘特图失败,请上传.mpp文件"); + // } catch (Exception e) { + // log.error("解析文件错误!", e); + // throw new RuntimeException("上传甘特图失败,失败原因为:" + e.getMessage()); + // } + //} + /** * 递归设置子节点列表 @@ -115,7 +197,7 @@ public class TaskProgressServiceImpl extends ServiceImpl getChild(Map> parentIdTaskListMap, Long parentId) { + public List getChild(Map> parentIdTaskListMap, Long parentId) { List parentList = parentIdTaskListMap.getOrDefault(parentId, Collections.emptyList()); if (CollUtil.isNotEmpty(parentList)) { for (TaskProgress progressTask : parentList) { diff --git a/src/main/resources/template/任务进度甘特图上传模板.mpp b/src/main/resources/template/任务进度甘特图上传模板.mpp new file mode 100644 index 0000000000000000000000000000000000000000..1c95836476f53594c13c239a42e7d268f878cb42 GIT binary patch literal 265216 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%0DYEY@3#Q9jvhP(lpJx1i0834mXUKk3 z**dbHRQ4?W``P*zOqca!zo={j*{_xb)8#p`-&FQI*&mh#)8z%SKP?NU%Zp@j)y<8J zUnEmYmzT&gRQ57irpjKSe_3Fu@6jf*Y?ZxAmSb5kT{e>yQ`u`|B`gc3%j;w%Eeod0 z8)T(aH{WFZa=}u|%UfinRrWSn8I`?5|H@kbg5~91vT`bWkF309!F1U|RzYR&lU1@T zm@XfXRkkdcE+3LrQQiEA@v91!nl2xcRa4m~WYtynDgBFD|AOhVm8_o1J|oMsESN6a z$m*-?bFzk(1=HmVvPPB#)8$LD#;TiNF@8=F81(upFzmT<4*{@{nRrVYG z>tOv0rpxbS9aZ)RStrYa>GCJp-YSceb+#;+E)lYQEeobg2HAe9o0*K?{$Q!;l10`< zW!YpgmF3XCuGYU`x|lOTx~a^Z3DVuNV7izyL3*gHB>n4USukBnk@dDLm@c_weN;Ei zT9v+Fsp(?Q1nH+Tb0$cCm6fA^1FV0+bSY1EfXXV64YVwnE)~fJsjL#&5X*w;QkiV1 zWx;f*LN-iw)0_!194s|ms_NXVJPELdL5nIIEX){yols;m*&B$YKL zo2;@XWK&eulx(WXnvqRY*`8$6Ro0wrhRRxy%~V-SvRNu?MK)Vyt;y!7tPR;=Dl=;` z=BjKj+B;lj?a1b-tUcL$m31Inpt6o+N2sh5*^w&So9rl+nX@kzs;o2ZEmD~|`(m-m z_M^R{RklCbF)HgqcC5-`WXGwjE7|du1?$0XWce!VPIiLI%-I(ws?4m(I7wyZ?2D6C z)|>vFqOv|@r>d+k*=Z{4N47*|{mD+ZEZ7DNAUi{42aqjQ*+8;0RW^w1ER_u=J6mN# z$j(vOP_ktz8%B1n%7&Aj7h;(aGiFs4*Ym+v=10_hmlt?U?3D2AUFfkaJTLFDi#(Q% z=TVPc?6Dj?k9q78j}^o7e2-n~vEq1+;}JOSCULmTV-iLgn3FL%VV8TXq%Z`?u`4`Q zN*F9VcBRL1g&~5DUFEUT!lFrbwa3Z`izV4|kChdcpJdl~teh}J(D}E*W0KAiLC3E3 zSOv1=`4885tRk5?pHkB0dXH5iGiMPByTN0Xp+|Bi{JT*Y0-^2GUFk8gJr*u6_joK^ zUhef+xV+rwv2b}=<*{&ix!+^q^74Sk!sX>bkA=(2LmrdzA}Ssq!Mf*Rux8%6f0%FLRt$5b|&_8wQ6Ia_D7$_}QzCsbz6)>)&nLul_wm5n8PN@a(VtyS4L zvZqxxp6nTwO(0vRvWaBRs?40NvtDJBX>Wtd%-K56scb6kJ+HE9WG|>}I@yaVn?bfw zWi!cMQrRrBmsK{K>=l*GA={*~!^mD$*<7;CDm$F)HI>aHdtGJo$=*=e0)-Mmwy_mI4pQy~7 zA+uFw<_wu_Dl=!ue4#RPhRjzgGiS(bSD86O=3AASGi1J3nK?t|N0pf~WPVneIYZ`G zm65Dl=z-v{IQl6Qs4u%$XoIDqBs~LuF5p^;Fp!vR*2C zl5O}9F!>G$j(eN+1w&P~miC6J>}j&$Dtm@(gv!>Dja1pQWTRBJp6o!CZ6F)1vggPS zQrYul2U`{#_crSb#;EK?+B-yL8_CA1>?N{8RrWI3IF-FZHeO|$$R?=lRkDdH+e|h| zWv`J9tQ^Dgu*%AlJ)*J-WRI$>BH3dqt3>v=$|{qs zR#_FYCsbzE7pzg4Szqv^%FOzLr&Lyh{;gG6O|qv|R*UQzmDMI&7h>{(=;j}u1zU-J zoi-n^-eY1%#@d~|4IT^62R!Go@O;4Y9t+P0yx_6$e87ty3(p5^^q7QEzJOggU-DRZ zKHz1Kh35la@mP31V3Wtf^8v4VEIc2u*<)oTocYOczUHy;e8B4-3(p6<;j!?1z?&Wm z&j-BavG9Dr+a8no0KdGvBMgDi%FDYR3zwJoJQgl5TRavnFYkLSTwXr#Sh&1==&^8l z`N(78^766A!sX=?kA=(2rydKJm#rQPmzU2x7A`N_JQgl5pL;A^UcT^HxV(Jnv2c0$ z%46a3^0mjp6alJiG(*oJ=tCf|)YtUXYepyKg8$i7vXS-><^VSBl}Zjdy>Uf)|@PY zy*sIS)PgKSWi81vRo03uOJ%LevQ^fGEJtN+$%?6LFS6n)Ye!Z>W$npIs;mQ9DV233 z%T-w?veGKso2-n=_8}{)vd(1XRJJc!d6n%)RzYR^lT}oiS-(_CWoG?SWtExrOI1{6 z)-P36S$Bq|n#y{RRaaS0_HAl_tTB__|vQ{b^L)Kblhmf^V*;ul+Dm#>HFO`iWYp1gDWbIWp zfvkhdCX#hj*(9<~Dw|BUx5}oF?W3}(WSvzujci|)O()w=Wi!b3SJ_OmE-ITv7E_s7 zUvMaxw2i^>7qh-#g31n~n-j&&W#M^kv%X+Hn0#{u$I{LEf(0rw>kAfwZHWZ;0>|TK zeZgX|Z7IyGFE|?PX0Tu!%=&_S%Yx(AW_`g4Dl_W~mVs@}4~NC9FF03aW_`i=U@MU> z!ML0C1sABytS`7o+=RVgIL-Qki&b_k+m1^t3;K5)*`+Ewp80nfSZe;|lU=T|6X@m@ z*3DpApGbD4Wx+U{M0S>Rpzvvo5Vhh=29SQd=Kxn#Gh z>^!pDEDOfre6rhBX4V(n0hSsEv%cU?m0d(P@3L+N<8U$A-IfL8a0%HxD!Y{IUdw`U zxQy&Rm6`PgtH4s@VAdDhud*xY<^$HvU>vR@d(g6A9IhsNNM*~(9=0qPhik|lQJGm^ z@F-Yn9L)NH$5eJ5-F)1-8H~gAWUDO;#^DCCCscML*&54&aac+Aq{__tf~UYz<6zbo ztX0`9bn|KJW-t!7l09QtFb=noty9_UWY1a_jKdvd>s4mf7i<7aje}WV@SMu-rkl@O zH-mAwhwKH*f^oQ)>_wH`N4C+jU>sJFy`(a;zTjoB)Hs;+1+S>=LAtrgx*3eaLu9X7 z7L3EgWSdp?2-$0v1>^82+3PAZ>kHlhOO1nBU+|{NR@2S5tee3&JVExhWx+VCA$vz< zPm;ZBSuhSyk-ev~wQR?>fThOaX|nfK_6*tY!q6uQu9sRzmV>h}QrWX)#Z`k(|Dtn78sZ$AfDtn)-k;*@fRrUp08dU-k?p0jugN+I!+To?b&ON-_;#|rRc6)~oD8-V7J~2l zx2y|JQQ3E7r-I4%UzNZ(yIEgwn##=jf+Z^Zk#3%@vY!}-Gr%N%!TR%OvJX+WrvBd8 zFJvF7>{qgnLrms^GHgn`he;!&&*n7-X7oAsYV??Q%8=(WA0$`k={9byKA+d5K7)Gs zKDOqw<@$a?ALH{|p}(TKq%Q*GsZzX;m5$=-=b5-6tX2dJnj|xOxMY4MPZ+Lp=90{* zWI$xzQrHk-NZ;gnOlDu0u&cnDSZ3yF%-pQ_mn{s}DPB2%QHG@$SSQ@)cnnb@E3UAp zWw~IjaqqWX;)nQGT47>VSQ)S=uD(6-Uszd%#VjkYus)Vm1QR!WHwRl*2~5J}_e+La zRs}2^hl4Du8uCx_&gDZ5%OoFUPE*tbh{OTEoyYk3X+6WTMj;}tvfray7rDeUr zB>!A$mcYGB>!D(=yeaeMB{O>{rHl^;i{dKz03(V0s=^NO>`C5<>(0#!#h!K3%y*ji zPu{m{#U8Hi{S%uvLnLp@XN2OApA2U+%fz0{y+$FpHA4O=#lr;YOe&@o`|26<6s<0lHoVIm9Uf|E1|k+)-#n< zS!sq7zdc%dEBy28ka)Zd8Gd`Q^v@}*EdARl15XWCB~)6Aro{Ex@Y zdZztVX4W%xQJGoK6jPa5&(u|AW<666l~rRL@cS=HIIEM5QkhxLG+r3u6wF(*o@s*0 z%zCDYDl_YuCaJ6r!!lWAX1&1_ux$v7U!TR}X1&2wm6`Ph(^OWE3c%zA?vDl_X1 zW~!_K-JGQ|v)*8~%FKF$IVv;j4GvS8S#L1cvK+5p5RaSn28XN6tT&jaGPB-bzRH?2 zehXCAg6s&({PrjwH|q_KRGC?CaFoi-dV__Qxi-hVV`jaamGwThG4Kb;-rG1ck{W!3dxN2*w@Y}x$CU)>XCG6#UEWEbr1dmDE81?L(=&|tH zs*^kxUR!mt$HHr?PVtz8QCcMzzf(OHUR!mV$4ZGksCc{s)A}5+t*j&G8bD^&VO#>X z4J=q*%sPx4gu!eukIXuZ8&zi3VXRb{S%-0x%FH^9n^k7kVceoJvkv1{m6>%Iw^1;mGvQ8rLw+c z_gfas_kLs#sH{KPgDM+9_K?aBAbVJ41IZpy*&wnips{2ZBp4GWUs1hEZJt29ZL3^%EpnsuCnoDZ>Ven*_$ex zNcNV>CXu~uS@1oYO!kh-rjWg>vZ-Y6scahA7L`qB|MPvY^(=WPv{uFAGsr$rnOUFm zp~}qql#f(4n{IxrvN>d*sLZTS`BY_dX>Y5_4k!CeW%J0kscb&k=PFx3_JzuhAp25f zN0NP|vZKhpR@p+b?J8SD_KnIGlYOhQqshKg*)e3_tL#{or60hgehKzXk0bk0Wyh2K zq_TXnpH+4O*)J+Pk?dEMokaGV%1&nds>wHcG(6UQ3Rw-6ne{2PRA$zv;J48fH{jMGh_w~DZEZo=c?y+!RzlX=def^#u3-|SVd5nF1udmVDW8uC= zACHCm8ht$$?rZe(Sh%mz-(%sv#sH6n`x^LtsYL#T`x*m17Vc{d@>sa9G1z0tzQ)-s zXO;1eN!t;eGdhQCi7*5($d(ynw3{rAImC&rROPFD{wr*LC8GS2>brdg-$|6aMw#|V29tO>4(@AsHVGnsd}2P_X)S&Pki zAKX`mh&}w~0_QuDZszkFPwe4$4iam>t3fY=i}L*^Y>O~>E^f-)98`v5+dX^Yk8t@}6$O7^_&Pdsk)m zkiDm}d&#z_>^`#hRkn)k1C`xR_MyriAp1yVX3zP@Dtn0bKCvu0?<@70*>nD>%FLeg zttxwzZhoe+$H=y+>~XTsRkoV!3za=V_NB_!kbR}HC&|86*;8cOEeo#8Sxfef%AO|s zR%OqSeW$W@WZ$doS+XBgww~-qm2DvVNoCKG{j9R*$$kkj*EY%;^0M zu_NQEu5J9?W8rlxe|Rk1ANH*M9@yVaE8~dWOyt*_M7Rk@EY|jk4gVR zBIx3m?XmEhmK=|T*R&M#Sa?lKagT-9w3P5zcuh-5k4Ya&dN(edr92j1(~|2k=?6&! zoxRc?3$JM@<1ty&;+L1Q!Vn0pyp;1;xV)72Sh&1Y@L0IKRPjdc`UgG>IK$4d0^7tP4x9qp5pNr$?B_YBUuBLy+qbfWiOL8QrRnHja9aZ ztcl8AC2Oj(&1B6~_8QrqDtn!*xys%kYoW3?$y%!HEwWZBdz-Aa%HAPsqq29&+N$h5 zvb|Kcg{+;*-Y09XvJc2QsO&?sjw<_ztdq(LpRb^k1byL~bWZhM^oveq-z9H+WvTwdF+^qNOp9SE`^|j!tL%5OQ7Zd`Y_!V$ zBs*ATak4{HX3obrRApw5`FNF?J?0ZtX7-p*R+(A5HC1J1kNI?!6=NJ`s?6*$pRF>p z$NVsrnLXx*tIX^%pRY2r$NUJDm1a1PQdt?YMJh9U%#T)?*<*gJ%FG_~<5gz%n4h3B zv&Z}-m6<)}r>M;AF+Wup+G+HMr0Yf%kDEQ_r>V^BF<+uGvv%urm6<)}XQ<5VF<+`O zv&Z~Qm6<)}XQ|BWF+W>nW{>$fD%*p3yG&(u$<9?-lZ!kZn*|PqOD#){E>#mGx$tZ3L4v3(h0-A$v(> zW}o$|V3H5XITXnwv(I|7Wx+A{{&e$0u$z~K?U{Yn--v%;!LXQp*586XkiyJ9>+iwj z4CtUev(Nemu%A=dV5ZBDV5w(B4k7zVWkVT^GH}{lvek z{+a#6f2jT)NH_mf-5gC8SD9I-6TzHRYI>Ue#2H|z={bgOW`d=r=OJWSDjUl*%U1n6 zlq^T}Zyen$rn)(vthmZ1(9II6e-p_{s{T!)o267YCzIu>%02|4b?xhpSY&#rrA$iOJzsW&DyGeN0HT0{aeU5?4i23h^%gi`E6VjOzKEC zUo1^lJieIz%@kHXTz{Iq#`VNam<{&5kDhAn@_|{b<^xMK2~LC(#_*k|IQ*iUiHuH9X(Zb)9f8RO=ZjI<`UJv zbIDFu{X36&v`lsLe6n*@X4WN~r}}5sC7iGNcM;vZOm*{OvddLw)+Jn_`e)W9T&enZ z8Qr{2b@Otv>s59I)9eP-KeI03M%BNo=;rOJn^%+Fp)#{B;ZD^*vo7H-)xQ;V^8wY( zYsnr|nOT?cFxUsE8-nx2W?jM~VB5f4f6%Y%9ue}`0+{4$w!y&HN3bpu^Dp{ckH)ke)->3NKU3pZEMeGQOoLt zn3N6YU!Lb53nW=K^Q$JnQJA~nVr#=4+VVM&ZhIf<9@5|M;tdznUScbYF#a?sEN-M0LWjKF= z_FP`$aio)FRTQ?bWz~ftJ$-vI%kU1+O+Q_FScWp063zjZ;T=d}!!5%*z&vv4;__DV zq>0$`^46~hn|e&_NEvf^+stF`T^(cn>nIHO$?>NAguPy1Q7|blD2F)hH|b^{YfqT? z74=wOkKr{CmF>dP-(xia@*$255N6|t*Mp6YV*@=VWlz*th?J$l*3D!bB9U>H4FMYm zHxuXfBCz77l>cF1?p+agq)tUN_zI{iai?#DHCNp#yH^FEQs8f6^5%zml*Dyn^in}#qeA**Rkpz zlXux?b;1l-+FNl0ZFsqDxVo~7Td+*BGAc9eEzTiP?3ub9^>?`sQryg;n{`!Y>h|-% zw!)s5o(M~E+B;umW-blqbd>Y^WF`(~F0HM~%v{=DDl>Cwqf}<*(w3>L48w^tSQv+3 zdX^=Ns?5x#wNu?Rb7}2WX6Dj5sH`IWi-Ad>D43p=$hxYmGFf-aymtlpVCK>e6#tOG zc@7sxmW|Hcn+`E^WNZ z>N3qHfXRClOzSAwM3vPeo20TlGMpW)xLKcUipm<0O;uS#vS})7L^fSzjmc)HtO?mn zl{F=sWmyh;AM$2O{nCtVw#xP-o1?PkWQVD&1=(DcwIn;-vS7JxMTRpOnASnonryzx z+K?@<%+=Q>er?H)P}yE&N2;tH*-@4S>yY+j3su&EY*ComHV0kO$YQXSxXL%Jv@@Lba+wKB-n8tLogD34RP~$k4ax6261lYdraD= ze2<;rF~6@NZl35d38O^Nxp|VuIMhV!AzZDn6$k^y9$$j$-tzbTD9Gsk!V zn6x>;deF=$;QOsInepD^=E$>?W1_OTUBP}5pPqOnMb@`Wo91n4wadC z#5*ku)*)sd@h+8_dBnR_X66y^QQ2Uo%e^WaLUy0Z%sk>Mm6>_O`z;IR?QpvJfXYUY zJ*YA>kNA+v%sk@5VTKpVy|<5mt;D+`br$>cc;6g*)MM=LMw9F@kCl;^HkM?Md#tRm z{3KiLv2w!j747_c!edg;Nd@EB8jr~sgmm^Dd(va(8$G#({V9)`Z+r9GEK;AX^_YBr zi;Bk&WLiHBCUr=#O&v}4jLOXX>N=H~`PFAtHimAlSJ@$C8&qcISD#avnO}WgW#j1P z3o08=_M*zn{OU%PO{Be-R5pq1WtB}Pdqrha$Tq3W%&)#`S@1oYMthr8Hl6G>m6`d~ z*HvcbSKm;XnO}VqY(2_Lu&pxlt8b}n4#&gZR@q@>@2JeoufD4?Gr#(t%FKDqTU2Jw zYkps4W`6Ypm6`d~4^?&~DaU#cvhW$-I7sb7M9+7rmWR@sSU+f{ZF**7XXne1DYokI4V%1$Nw zUS(zu^%t$j5QyVY1U@?>%?WQRM@d#O>p&D)UxA*!JuRKK1N+` z_6nS2nXFkgi>l3>tjwjJ>@j~%R@hRH`E8?&dtUc$uF*tT zHiPBCBMD0tm=zU|n>|fYjN`8ZbK~)bnLSO|UsY~fet1s7>}kUODutcLaTM&YQrP)q z`6@Genodxe+0%5Q$}XatC#mdWvXfP2_B5TMGP9=%`@obqTt+vs4~#50PINgL_JJwP z>}kS2Fol^tO=qa=D!RE;Wml7(sj}r{XQ}KOva?mTg6tfXT}y`jYDyfgBg1|*g>8EbN47#`tH`cZ+5KeL|EI*^0W$3W zBXe_nrtW!=4Ez5S_7EBN|0(QYvXv@(gzP4jJxX@7${r)TMP-kZ-Kw(HWVfm82{PCJB2j6ZXREJ+ap^!LngC3UU5n zuVsRT*LyzZvG97&$2}Ha@44Dz5=KNN;olP;<9bg7$c1H%$2dO@%Z}kZ@kBVo>&>3> zSa`kJT91X-n?3EZ@OranJQiMWw$5XI-$wG`S¸)54`X8JbC^=2D97G7_L^TZQz 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