From 8ee3f2b86b9a0bb12c54b8057c1f8863c92f1e14 Mon Sep 17 00:00:00 2001 From: bupengxiang Date: Wed, 26 Apr 2023 10:05:40 +0800 Subject: [PATCH 01/46] =?UTF-8?q?[=E4=BF=AE=E6=94=B9]=20=E6=8A=A5=E5=91=8A?= =?UTF-8?q?=E5=88=97=E8=A1=A8sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ReportManageConroller.java | 13 +++++ .../adc/da/report/dao/mysql/ReportDao.java | 2 + .../adc/da/report/service/IReportService.java | 2 + .../service/impl/IReportServiceImpl.java | 24 +++++++++ .../java/com/adc/da/report/vo/ReportVo.java | 5 +- .../mapper/mysql/ReportManageMapper.xml | 52 +++++++++++++++++++ 6 files changed, 97 insertions(+), 1 deletion(-) diff --git a/adc-da-report/src/main/java/com/adc/da/report/controller/ReportManageConroller.java b/adc-da-report/src/main/java/com/adc/da/report/controller/ReportManageConroller.java index 280152d..0910740 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/controller/ReportManageConroller.java +++ b/adc-da-report/src/main/java/com/adc/da/report/controller/ReportManageConroller.java @@ -96,6 +96,19 @@ public class ReportManageConroller { return Result.success(list); } + /** + * 报告列表 + * @param vo + * @return + * @throws Exception + */ + @ApiOperation("报告列表") + @PostMapping("/page") + public ResponseMessage page(@RequestBody ReportQueryVo vo) throws Exception { + IPage list = reportService.page(vo); + return Result.success(list); + } + /** * 报告列表(带权限验证) * @param vo diff --git a/adc-da-report/src/main/java/com/adc/da/report/dao/mysql/ReportDao.java b/adc-da-report/src/main/java/com/adc/da/report/dao/mysql/ReportDao.java index 90a0d73..1d9fc2b 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/dao/mysql/ReportDao.java +++ b/adc-da-report/src/main/java/com/adc/da/report/dao/mysql/ReportDao.java @@ -34,4 +34,6 @@ public interface ReportDao extends BaseMapper { List getReportDateList(@Param("usid")String usid); IPage getAddReportPage(IPage page, @Param("pageVO") ReportQueryVo vo); + + IPage page(IPage page,@Param("pageVO") ReportQueryVo vo); } diff --git a/adc-da-report/src/main/java/com/adc/da/report/service/IReportService.java b/adc-da-report/src/main/java/com/adc/da/report/service/IReportService.java index 83d2904..11da10c 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/service/IReportService.java +++ b/adc-da-report/src/main/java/com/adc/da/report/service/IReportService.java @@ -49,4 +49,6 @@ public interface IReportService { String reportHtml(String id); IPage addReportPage(ReportQueryVo vo) throws Exception; + + IPage page(ReportQueryVo vo); } diff --git a/adc-da-report/src/main/java/com/adc/da/report/service/impl/IReportServiceImpl.java b/adc-da-report/src/main/java/com/adc/da/report/service/impl/IReportServiceImpl.java index 751275c..36a8088 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/service/impl/IReportServiceImpl.java +++ b/adc-da-report/src/main/java/com/adc/da/report/service/impl/IReportServiceImpl.java @@ -372,6 +372,30 @@ public class IReportServiceImpl extends ServiceImpl return list; } + @Override + public IPage page(ReportQueryVo vo) { + IPage page = new Page<>(); + page.setCurrent(vo.getPageNo()); + page.setSize(vo.getPageSize()); + //判断是不是管理员 + boolean admin = false; + List roleEOList = roleEODao.selectByuserId(UserUtils.getUserId()); + for (RoleEO roleEO : roleEOList) { + if ("管理员".equals(roleEO.getName())){ + admin= !admin; + } + } + if (admin) { + vo.setUsid(null); + } else { + vo.setUsid(UserUtils.getUserId()); + } + + IPage list = reportDao.page(page, vo); + + return list; + } + /** * 创建htmlstring * diff --git a/adc-da-report/src/main/java/com/adc/da/report/vo/ReportVo.java b/adc-da-report/src/main/java/com/adc/da/report/vo/ReportVo.java index 66cfeb7..e108dc8 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/vo/ReportVo.java +++ b/adc-da-report/src/main/java/com/adc/da/report/vo/ReportVo.java @@ -1,6 +1,5 @@ package com.adc.da.report.vo; -import com.baomidou.mybatisplus.annotation.TableField; import lombok.Data; import java.util.List; @@ -27,6 +26,10 @@ public class ReportVo { */ private String keyContent; + /** + * 权限 + */ + private Integer power; /** * 主要内容 */ diff --git a/adc-da-report/src/main/resources/mybatis/mapper/mysql/ReportManageMapper.xml b/adc-da-report/src/main/resources/mybatis/mapper/mysql/ReportManageMapper.xml index d877337..f4103a8 100644 --- a/adc-da-report/src/main/resources/mybatis/mapper/mysql/ReportManageMapper.xml +++ b/adc-da-report/src/main/resources/mybatis/mapper/mysql/ReportManageMapper.xml @@ -223,6 +223,58 @@ + + From 7819bc6c0cf2bb9702ea62ddb74b55eabcb25572 Mon Sep 17 00:00:00 2001 From: bupengxiang Date: Wed, 26 Apr 2023 10:29:01 +0800 Subject: [PATCH 02/46] =?UTF-8?q?[=E6=96=B0=E5=A2=9E]=20=E5=AE=A1=E6=89=B9?= =?UTF-8?q?=E5=8E=86=E5=8F=B2=E7=9A=84=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../task/TaskController.java | 25 +++++++++++++------ .../wkflow/util/activiti/ActivitiTools.java | 14 +++++++++-- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/report-activity/src/main/java/com/adc/da/wkflow/business_activiti/task/TaskController.java b/report-activity/src/main/java/com/adc/da/wkflow/business_activiti/task/TaskController.java index e6a8c37..c718409 100644 --- a/report-activity/src/main/java/com/adc/da/wkflow/business_activiti/task/TaskController.java +++ b/report-activity/src/main/java/com/adc/da/wkflow/business_activiti/task/TaskController.java @@ -28,10 +28,13 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Duration; +import java.time.LocalDateTime; +import java.time.ZoneId; import java.util.*; -import static com.adc.da.wkflow.util.date.DateTools.disposeApprovalTime; - @Api(tags = "流程明细管理") @RestController @RequestMapping("/${restPath}/task") @@ -58,7 +61,7 @@ public class TaskController { @ApiOperation(value = "流程实例明细列表") @ApiImplicitParam(name = "prcNum", value = "流程实例id") @GetMapping("/get_list_by_instance") - public List> get_list_by_instance(String prcNum,String sortWord,String shunxu) { + public List> get_list_by_instance(String prcNum,String sortWord,String shunxu) throws ParseException { QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("PRC_NUM",prcNum); BusProcessName one = iBusProcessNameService.getOne(queryWrapper); @@ -130,11 +133,17 @@ public class TaskController { historicTaskInstance.put("approvalResult",formValsJsonMap.get("flag")!=null ? formValsJsonMap.get("flag"):""); historicTaskInstance.put("approvalFile",formValsJsonMap.get("approvalFile")!=null ? formValsJsonMap.get("approvalFile"):""); } - Date createTime = (Date) historicTaskInstance.get("createTime"); - Date endTime = (Date) historicTaskInstance.get("endTime"); - if(endTime!=null){ - long approvalTime = disposeApprovalTime(createTime,endTime); - historicTaskInstance.put("approvalTime",approvalTime + "小时"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date createTime = sdf.parse((String)historicTaskInstance.get("createTime")); + Object endTime1 = historicTaskInstance.get("endTime"); + if(endTime1!=null){ + Date endTime = sdf.parse((String)endTime1); +// long approvalTime = disposeApprovalTime(createTime,endTime); + LocalDateTime startDateTime = LocalDateTime.ofInstant(createTime.toInstant(), ZoneId.systemDefault()); + LocalDateTime endDateTime = LocalDateTime.ofInstant(endTime.toInstant(), ZoneId.systemDefault()); + + long days = Duration.between(startDateTime.toLocalDate().atStartOfDay(), endDateTime.toLocalDate().atStartOfDay()).toDays() + 1; + historicTaskInstance.put("approvalTime",days + "天"); } } if(StringUtils.isNotBlank(sortWord)){ diff --git a/report-activity/src/main/java/com/adc/da/wkflow/util/activiti/ActivitiTools.java b/report-activity/src/main/java/com/adc/da/wkflow/util/activiti/ActivitiTools.java index b26134e..bfe2cc6 100644 --- a/report-activity/src/main/java/com/adc/da/wkflow/util/activiti/ActivitiTools.java +++ b/report-activity/src/main/java/com/adc/da/wkflow/util/activiti/ActivitiTools.java @@ -10,6 +10,9 @@ import org.activiti.engine.repository.ProcessDefinition; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -177,12 +180,19 @@ public class ActivitiTools { map.put("assignee", model.getAssignee()); map.put("category", model.getCategory()); map.put("claimTime", model.getClaimTime()); - map.put("createTime", model.getCreateTime()); + LocalDateTime dt = LocalDateTime.ofInstant(model.getCreateTime().toInstant(), ZoneId.systemDefault()); + String createTime = dt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + map.put("createTime",createTime); map.put("deleteReason", model.getDeleteReason()); map.put("description", model.getDescription()); map.put("dueDate", model.getDueDate()); map.put("drationInMillis", model.getDurationInMillis()); - map.put("endTime", model.getEndTime()); + String endTime = null; + if (model.getEndTime() != null){ + LocalDateTime end = LocalDateTime.ofInstant(model.getEndTime().toInstant(), ZoneId.systemDefault()); + endTime = end.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + } + map.put("endTime", endTime); map.put("executionId", model.getExecutionId()); map.put("formKey", model.getFormKey()); map.put("id", model.getId()); From 6ed1a2d06150df04828790ceef6b829e588bbcc8 Mon Sep 17 00:00:00 2001 From: bupengxiang Date: Wed, 26 Apr 2023 10:51:30 +0800 Subject: [PATCH 03/46] =?UTF-8?q?[=E4=BF=AE=E6=94=B9]=20=E6=8A=A5=E5=91=8A?= =?UTF-8?q?=E5=88=97=E8=A1=A8sql=20=E5=A2=9E=E5=8A=A0=E5=85=B3=E9=94=AE?= =?UTF-8?q?=E8=AF=8D=E6=A8=A1=E7=B3=8A=E6=90=9C=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybatis/mapper/mysql/ReportManageMapper.xml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/adc-da-report/src/main/resources/mybatis/mapper/mysql/ReportManageMapper.xml b/adc-da-report/src/main/resources/mybatis/mapper/mysql/ReportManageMapper.xml index f4103a8..c455718 100644 --- a/adc-da-report/src/main/resources/mybatis/mapper/mysql/ReportManageMapper.xml +++ b/adc-da-report/src/main/resources/mybatis/mapper/mysql/ReportManageMapper.xml @@ -246,16 +246,20 @@ WHERE eo.DEL_FLAG = 0 - and ru.userId = #{pageVO.usid} + and (ru.userId = #{pageVO.usid} + or eo.id in ( + SELECT tt.report_id from power_apply tt WHERE tt.user_id = #{pageVO.usid}) + ) - or eo.id in ( - SELECT tt.report_id from power_apply tt WHERE tt.user_id = #{pageVO.usid} - ) + and name like CONCAT(CONCAT('%',#{pageVO.name}),'%') + + and keycontent like CONCAT(CONCAT('%',#{pageVO.keyContent}),'%') + and year in From d658eb1c23988a7ac83c2e4b62b0af7771343038 Mon Sep 17 00:00:00 2001 From: bupengxiang Date: Wed, 26 Apr 2023 13:37:46 +0800 Subject: [PATCH 04/46] =?UTF-8?q?[=E4=BF=AE=E6=94=B9]=20=E6=8A=A5=E5=91=8A?= =?UTF-8?q?=E5=88=97=E8=A1=A8sql=20=E5=A2=9E=E5=8A=A0=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=E6=90=9C=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adc/da/report/dao/mysql/ReportDao.java | 2 +- .../service/impl/IReportServiceImpl.java | 54 ++++++++++++++++++- .../mapper/mysql/ReportManageMapper.xml | 13 +++++ 3 files changed, 67 insertions(+), 2 deletions(-) diff --git a/adc-da-report/src/main/java/com/adc/da/report/dao/mysql/ReportDao.java b/adc-da-report/src/main/java/com/adc/da/report/dao/mysql/ReportDao.java index 1d9fc2b..788b975 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/dao/mysql/ReportDao.java +++ b/adc-da-report/src/main/java/com/adc/da/report/dao/mysql/ReportDao.java @@ -35,5 +35,5 @@ public interface ReportDao extends BaseMapper { IPage getAddReportPage(IPage page, @Param("pageVO") ReportQueryVo vo); - IPage page(IPage page,@Param("pageVO") ReportQueryVo vo); + IPage page(IPage page,@Param("pageVO") ReportQueryVo vo,@Param("idSet")Set idSet); } diff --git a/adc-da-report/src/main/java/com/adc/da/report/service/impl/IReportServiceImpl.java b/adc-da-report/src/main/java/com/adc/da/report/service/impl/IReportServiceImpl.java index 36a8088..75658bd 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/service/impl/IReportServiceImpl.java +++ b/adc-da-report/src/main/java/com/adc/da/report/service/impl/IReportServiceImpl.java @@ -283,6 +283,9 @@ public class IReportServiceImpl extends ServiceImpl labelList = labelList.stream() .sorted(Comparator.comparingInt(List::size).reversed()) .collect(Collectors.toList()); + if (labelList.size() == 0){ + return null; + } return labelList.get(0); } @@ -391,8 +394,57 @@ public class IReportServiceImpl extends ServiceImpl vo.setUsid(UserUtils.getUserId()); } - IPage list = reportDao.page(page, vo); + //按照labelId筛选 + Set idSet = new HashSet<>(); + if (Objects.nonNull(vo.getLabelId()) && !vo.getLabelId().isEmpty()) { + LambdaQueryWrapper reportLabelEntityWrapper = new LambdaQueryWrapper<>(); + reportLabelEntityWrapper.eq(ReportLabelEntity::getLabelId, vo.getLabelId().get(vo.getLabelId().size() - 1)); + List reportLabelEntities = reportLabelDao.selectList(reportLabelEntityWrapper); + reportLabelEntities.forEach(reportLabelEntity -> { + idSet.add(reportLabelEntity.getReportId()); + }); + idSet.add("1"); + } + + IPage list = reportDao.page(page, vo,idSet); + //获取所有报告的labelId + list.getRecords().forEach((reportVo) -> { + reportVo.setLabelList(findLabelList(reportVo.getId())); + }); + list.getRecords().forEach(c -> { + FileEntity fileEntity = Optional.ofNullable(fileDao.selectById(c.getFileId())).orElse(new FileEntity()); + if (StringUtils.isEmpty(fileEntity.getFileType())) { + c.setFileType(null); + } + //ppt文件 + else if (ReportConstants.FILE_EXTENSIONS_PPT.equalsIgnoreCase(fileEntity.getFileType()) || + ReportConstants.FILE_EXTENSIONS_PPTX.equalsIgnoreCase(fileEntity.getFileType())) { + c.setFileType("1"); + } + //excel文件 + else if (ReportConstants.FILE_EXTENSIONS_XLS.equalsIgnoreCase(fileEntity.getFileType()) || + ReportConstants.FILE_EXTENSIONS_XLSX.equalsIgnoreCase(fileEntity.getFileType())) { + c.setFileType("2"); + } + //pdf文件 + else if (ReportConstants.FILE_EXTENSIONS_PDF.equalsIgnoreCase(fileEntity.getFileType())) { + c.setFileType("3"); + } + //word文件 + else { + c.setFileType("4"); + } + + //文件大小 + c.setFileSize(StringUtils.isNotEmpty(fileEntity.getFileSize()) + ? String.valueOf(Integer.parseInt(fileEntity.getFileSize()) / 1024) + "kb" : "0kb"); + c.setFileName(fileEntity.getFileName()); + List userIdList = reportUserDao.selectList( + new QueryWrapper().eq("reportId", c.getId())) + .stream().map(ReportUserEntity::getUserId).collect(Collectors.toList()); + c.setReportUserIdList(userIdList); + }); return list; } diff --git a/adc-da-report/src/main/resources/mybatis/mapper/mysql/ReportManageMapper.xml b/adc-da-report/src/main/resources/mybatis/mapper/mysql/ReportManageMapper.xml index c455718..049f5fc 100644 --- a/adc-da-report/src/main/resources/mybatis/mapper/mysql/ReportManageMapper.xml +++ b/adc-da-report/src/main/resources/mybatis/mapper/mysql/ReportManageMapper.xml @@ -274,6 +274,19 @@ #{id} + + and eo.id in + + #{id} + + + + + and eo.id in + + #{id} + + GROUP BY eo.id ORDER BY From 774c70c3c86416c9924c4a0ac79e8e5a2a5b238a Mon Sep 17 00:00:00 2001 From: bupengxiang Date: Thu, 27 Apr 2023 10:39:36 +0800 Subject: [PATCH 05/46] =?UTF-8?q?[=E4=BF=AE=E6=94=B9]=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?hutool=E4=BE=9D=E8=B5=96=20=E4=BB=8E=E4=BB=93=E5=BA=93=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E8=BD=AC=E5=88=B0=E6=9C=AC=E5=9C=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/hutool-all-4.5.11.jar | Bin 0 -> 1457288 bytes pom.xml | 2 ++ 2 files changed, 2 insertions(+) create mode 100644 libs/hutool-all-4.5.11.jar diff --git a/libs/hutool-all-4.5.11.jar b/libs/hutool-all-4.5.11.jar new file mode 100644 index 0000000000000000000000000000000000000000..6c7e44f939b8f76f8fa860c6f4164c1e37cc5169 GIT binary patch literal 1457288 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