From 81cf5bd74e6a25f73718296e7cea2b2b67eb1856 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=AD=E5=85=B6=E5=85=B5?= Date: Tue, 13 May 2025 14:09:46 +0800 Subject: [PATCH] =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=9D=A1=E4=BB=B6=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sa/zentao/conf/CodeGenerator.java | 4 +- .../com/sa/zentao/dao/PerformanceDTO.java | 2 +- .../sa/zentao/dao/ProjectWorkDetailsDTO.java | 13 +- .../com/sa/zentao/dao/WorkDetailsDTO.java | 3 + .../com/sa/zentao/dao/ZtBugBoundUserDTO.java | 35 + src/main/java/com/sa/zentao/dao/ZtBugDTO.java | 2 + .../com/sa/zentao/dao/ZtStoryFeedbackDTO.java | 1 + .../java/com/sa/zentao/dao/ZtTaskDTO.java | 5 + .../java/com/sa/zentao/entity/ZtMeeting.java | 2 - .../com/sa/zentao/entity/ZtStoryFeedback.java | 3 +- .../java/com/sa/zentao/entity/ZtTask.java | 3 +- .../com/sa/zentao/enums/ActionStatus.java | 4 +- .../com/sa/zentao/mapper/ZtBugMapper.java | 4 + .../com/sa/zentao/mapper/ZtStoryMapper.java | 5 + .../java/com/sa/zentao/qo/ZtProjectQo.java | 2 + .../java/com/sa/zentao/qo/ZtReleaseQo.java | 1 + .../com/sa/zentao/service/IZtBugService.java | 9 + .../service/IZtStoryFeedbackService.java | 2 +- .../sa/zentao/service/IZtStoryService.java | 3 + .../java/com/sa/zentao/service/VxService.java | 32 +- .../zentao/service/impl/IZtCountService.java | 296 +++++-- .../zentao/service/impl/ZtBugServiceImpl.java | 76 +- .../service/impl/ZtMeetingServiceImpl.java | 8 +- .../service/impl/ZtProjectServiceImpl.java | 38 +- .../service/impl/ZtReleaseServiceImpl.java | 5 +- .../service/impl/ZtStoryCaseServiceImpl.java | 10 +- .../impl/ZtStoryFeedbackServiceImpl.java | 39 +- .../service/impl/ZtStoryServiceImpl.java | 9 +- .../service/impl/ZtTaskServiceImpl.java | 33 +- .../com/sa/zentao/utils/SFunctionColums.java | 34 +- .../java/com/sa/zentao/utils/SendEmail.java | 22 +- src/main/resources/application-dev.yml | 13 +- src/main/resources/application-local.yml | 34 +- src/main/resources/mapper/ZtBugMapper.xml | 747 +++++++++++------- .../mapper/ZtReleaseDetailsMapper.xml | 5 + .../mapper/ZtStoryFeedbackMapper.xml | 4 +- src/main/resources/mapper/ZtStoryMapper.xml | 90 ++- .../resources/mapper/ZtStoryUserMapper.xml | 12 +- src/main/resources/mapper/ZtTaskMapper.xml | 12 + .../resources/mapper/ZtYwBackupsMapper.xml | 10 + .../resources/mapper/ZtYwChangeMapper.xml | 9 + .../resources/mapper/ZtYwFwqsearchMapper.xml | 9 + .../mapper/ZtYwMachineRoomMapper.xml | 8 + .../resources/mapper/ZtYwPatrolMapper.xml | 7 + src/main/resources/mapper/ZtYwTaskMapper.xml | 9 + .../resources/templates/scope/UI工程师.xlsx | Bin 12677 -> 12797 bytes .../resources/templates/scope/开发工程师.xlsx | Bin 13196 -> 13448 bytes .../resources/templates/scope/测试工程师.xlsx | Bin 13152 -> 13344 bytes .../templates/scope/项目助理考核.xlsx | Bin 12403 -> 12546 bytes .../templates/scope/项目经理考核.xlsx | Bin 13983 -> 14185 bytes src/main/resources/templates/scope测试.xlsx | Bin 10725 -> 0 bytes 51 files changed, 1196 insertions(+), 478 deletions(-) create mode 100644 src/main/java/com/sa/zentao/dao/ZtBugBoundUserDTO.java diff --git a/src/main/java/com/sa/zentao/conf/CodeGenerator.java b/src/main/java/com/sa/zentao/conf/CodeGenerator.java index 2fe084d..6e7196c 100644 --- a/src/main/java/com/sa/zentao/conf/CodeGenerator.java +++ b/src/main/java/com/sa/zentao/conf/CodeGenerator.java @@ -22,7 +22,7 @@ public class CodeGenerator { //自己的名字 static String Author = "gqb"; - public static String tableName = "zt_story_case"; + public static String tableName = "zt_bug_bound_user"; /** *

@@ -53,7 +53,7 @@ public class CodeGenerator { mpg.setGlobalConfig(gc); // 数据源配置 DataSourceConfig dsc = new DataSourceConfig(); - dsc.setUrl("jdbc:mysql://192.168.1.161:3306/zentao?useUnicode=true&useSSL=false&characterEncoding=utf8"); + dsc.setUrl("jdbc:mysql://192.168.1.161:3306/zentao_dev?useUnicode=true&useSSL=false&characterEncoding=utf8"); // dsc.setSchemaName("public"); dsc.setDriverName("com.mysql.cj.jdbc.Driver"); // dsc.setUsername("root"); diff --git a/src/main/java/com/sa/zentao/dao/PerformanceDTO.java b/src/main/java/com/sa/zentao/dao/PerformanceDTO.java index 210f4fb..adfb7ea 100644 --- a/src/main/java/com/sa/zentao/dao/PerformanceDTO.java +++ b/src/main/java/com/sa/zentao/dao/PerformanceDTO.java @@ -136,7 +136,7 @@ public class PerformanceDTO implements Serializable { // private BigDecimal projectScore=BigDecimal.ZERO; //项目文档 -// private BigDecimal projectDocumentScore=BigDecimal.ZERO; + private BigDecimal projectDocumentScore=BigDecimal.ZERO; // //会议管理 // private BigDecimal meetDocumentScore=BigDecimal.ZERO; diff --git a/src/main/java/com/sa/zentao/dao/ProjectWorkDetailsDTO.java b/src/main/java/com/sa/zentao/dao/ProjectWorkDetailsDTO.java index c1c11c8..872c068 100644 --- a/src/main/java/com/sa/zentao/dao/ProjectWorkDetailsDTO.java +++ b/src/main/java/com/sa/zentao/dao/ProjectWorkDetailsDTO.java @@ -30,11 +30,20 @@ public class ProjectWorkDetailsDTO implements Serializable { //已验收需求总量 @ExcelProperty(value = "已验收需求总量",index =5) private BigDecimal ysStoryCount; + //验收通过率 - @ExcelProperty(value = "验收通过率",index =6) + @ExcelProperty(value = "检出bug量",index =6) + private BigDecimal findBugCount; + //验收不通过数量 + @ExcelProperty(value = "检出bug率",index =7) + private BigDecimal findBugRate; + + + //验收通过率 + @ExcelProperty(value = "验收通过率",index =8) private BigDecimal ysYesRate; //验收不通过数量 - @ExcelProperty(value = "验收不通过数量",index =7) + @ExcelProperty(value = "验收不通过数量",index =9) private BigDecimal ysNoCount; //验收情况备注 } diff --git a/src/main/java/com/sa/zentao/dao/WorkDetailsDTO.java b/src/main/java/com/sa/zentao/dao/WorkDetailsDTO.java index 0f21ac8..f081073 100644 --- a/src/main/java/com/sa/zentao/dao/WorkDetailsDTO.java +++ b/src/main/java/com/sa/zentao/dao/WorkDetailsDTO.java @@ -44,6 +44,9 @@ public class WorkDetailsDTO implements Serializable { @ExcelProperty(value = "产出线上Bug ",index =6) private BigDecimal bugCount; + @ExcelProperty(value = "任务及时完成率 ",index =7) + private BigDecimal finishPunctuality=BigDecimal.ZERO;; + @ExcelIgnore private UserType userType; @ExcelIgnore diff --git a/src/main/java/com/sa/zentao/dao/ZtBugBoundUserDTO.java b/src/main/java/com/sa/zentao/dao/ZtBugBoundUserDTO.java new file mode 100644 index 0000000..ee735c6 --- /dev/null +++ b/src/main/java/com/sa/zentao/dao/ZtBugBoundUserDTO.java @@ -0,0 +1,35 @@ +package com.sa.zentao.dao; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + *

+ * + *

+ * + * @author gqb + * @since 2025-05-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class ZtBugBoundUserDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + private Integer bugId; + + /** + * 责任人 + */ + private String assignedTo; + + +} diff --git a/src/main/java/com/sa/zentao/dao/ZtBugDTO.java b/src/main/java/com/sa/zentao/dao/ZtBugDTO.java index cd1d535..395f6bc 100644 --- a/src/main/java/com/sa/zentao/dao/ZtBugDTO.java +++ b/src/main/java/com/sa/zentao/dao/ZtBugDTO.java @@ -215,4 +215,6 @@ public class ZtBugDTO implements Serializable { private String releaseName; private String feedbackSpec; + //关联责任人list + private List boundList; } diff --git a/src/main/java/com/sa/zentao/dao/ZtStoryFeedbackDTO.java b/src/main/java/com/sa/zentao/dao/ZtStoryFeedbackDTO.java index c212f3c..0e6fe8c 100644 --- a/src/main/java/com/sa/zentao/dao/ZtStoryFeedbackDTO.java +++ b/src/main/java/com/sa/zentao/dao/ZtStoryFeedbackDTO.java @@ -122,4 +122,5 @@ public class ZtStoryFeedbackDTO implements Serializable { private String oaName; + private String finishedRemark; } diff --git a/src/main/java/com/sa/zentao/dao/ZtTaskDTO.java b/src/main/java/com/sa/zentao/dao/ZtTaskDTO.java index 49509ff..694d09e 100644 --- a/src/main/java/com/sa/zentao/dao/ZtTaskDTO.java +++ b/src/main/java/com/sa/zentao/dao/ZtTaskDTO.java @@ -203,4 +203,9 @@ public class ZtTaskDTO implements Serializable { private List bugList; private String feedbackSpec; + + //问题反馈处理结果 + private String feedbackRemark; + + private Integer delayFlag=0; } diff --git a/src/main/java/com/sa/zentao/entity/ZtMeeting.java b/src/main/java/com/sa/zentao/entity/ZtMeeting.java index b606f29..b2e9045 100644 --- a/src/main/java/com/sa/zentao/entity/ZtMeeting.java +++ b/src/main/java/com/sa/zentao/entity/ZtMeeting.java @@ -70,9 +70,7 @@ public class ZtMeeting implements Serializable { // private Integer userStory; private String storyIds; - @TableField(exist = false) private String result; - @TableField(exist = false) private String meetingAfter; } diff --git a/src/main/java/com/sa/zentao/entity/ZtStoryFeedback.java b/src/main/java/com/sa/zentao/entity/ZtStoryFeedback.java index 542d46c..8177a6a 100644 --- a/src/main/java/com/sa/zentao/entity/ZtStoryFeedback.java +++ b/src/main/java/com/sa/zentao/entity/ZtStoryFeedback.java @@ -72,7 +72,8 @@ public class ZtStoryFeedback implements Serializable { // wait doing finished submitVerified 提交验收 closed reviewing verified 验收 dontHand 无需处理 (查询用noVerified 验收不通过) private String status; - + //处理完成描述 + private String finishedRemark; private String fileUrl; diff --git a/src/main/java/com/sa/zentao/entity/ZtTask.java b/src/main/java/com/sa/zentao/entity/ZtTask.java index 92a3f10..06786f5 100644 --- a/src/main/java/com/sa/zentao/entity/ZtTask.java +++ b/src/main/java/com/sa/zentao/entity/ZtTask.java @@ -194,5 +194,6 @@ public class ZtTask implements Serializable { private String approvalRemark; - + //问题反馈处理结果 + private String feedbackRemark; } diff --git a/src/main/java/com/sa/zentao/enums/ActionStatus.java b/src/main/java/com/sa/zentao/enums/ActionStatus.java index 16184a2..32a4485 100644 --- a/src/main/java/com/sa/zentao/enums/ActionStatus.java +++ b/src/main/java/com/sa/zentao/enums/ActionStatus.java @@ -45,8 +45,8 @@ public enum ActionStatus { CASESUBREVIEW(52, "caseSubmitreview","需求用例提交至评审"), CASEPSTG(53, "reviewpassed","评审通过"), - CASEPSYDMQ(54, "reviewclarified","评审有待明确"), - CASEPSBTG(55, "reviewrejected","评审不通过"), + CASEPSYDMQ(54, "reviewclarified","测试用例评审有待明确"), + CASEPSBTG(55, "reviewrejected","测试用例评审不通过"), CASEBJ(4, "caseEdited","编辑需求用例"), CASEXJ(1, "casePpened","新建用例"), diff --git a/src/main/java/com/sa/zentao/mapper/ZtBugMapper.java b/src/main/java/com/sa/zentao/mapper/ZtBugMapper.java index 518724b..aa3f93d 100644 --- a/src/main/java/com/sa/zentao/mapper/ZtBugMapper.java +++ b/src/main/java/com/sa/zentao/mapper/ZtBugMapper.java @@ -26,4 +26,8 @@ public interface ZtBugMapper extends BaseMapper { List bugListByIds(@Param("ids")List ids); List bugListByProductAndDate(@Param("pIds")List pIds, @Param("start")Date start,@Param("end") Date lastDayOfMonth); + + List bugListByProjectAndDate(@Param("pIds")List pIds, @Param("start")Date start,@Param("end") Date lastDayOfMonth); + + List bugBoundsListByProjectAndDate(@Param("pIds")List pIds,@Param("start") Date firstDayOfMonth, @Param("end")Date lastDayOfMonth,@Param("account") String account); } diff --git a/src/main/java/com/sa/zentao/mapper/ZtStoryMapper.java b/src/main/java/com/sa/zentao/mapper/ZtStoryMapper.java index 5a9c930..1b15264 100644 --- a/src/main/java/com/sa/zentao/mapper/ZtStoryMapper.java +++ b/src/main/java/com/sa/zentao/mapper/ZtStoryMapper.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.sa.zentao.qo.ZtProjectQo; import org.apache.ibatis.annotations.Param; +import java.util.Date; import java.util.List; /** @@ -32,4 +33,8 @@ public interface ZtStoryMapper extends BaseMapper { List storyPageListByIds(@Param("ids") List ids); + + //pids 产品id + List getStoryListByDatePidsProject(@Param("ids")List pids, @Param("project")Integer project + , @Param("start")Date firstDayOfMonth, @Param("end")Date lastDayOfMonth); } diff --git a/src/main/java/com/sa/zentao/qo/ZtProjectQo.java b/src/main/java/com/sa/zentao/qo/ZtProjectQo.java index df26def..aefe172 100644 --- a/src/main/java/com/sa/zentao/qo/ZtProjectQo.java +++ b/src/main/java/com/sa/zentao/qo/ZtProjectQo.java @@ -107,4 +107,6 @@ public class ZtProjectQo extends BaseQo { private String bugType; private String account; + //1 延期 2不延期 + private Integer delayFlag=0 ; } diff --git a/src/main/java/com/sa/zentao/qo/ZtReleaseQo.java b/src/main/java/com/sa/zentao/qo/ZtReleaseQo.java index 1212799..7c0b8aa 100644 --- a/src/main/java/com/sa/zentao/qo/ZtReleaseQo.java +++ b/src/main/java/com/sa/zentao/qo/ZtReleaseQo.java @@ -63,4 +63,5 @@ public class ZtReleaseQo extends BaseQo { //验收结果 1.通过 2不通过 private Integer ysFlag; // + private String ysUser; } diff --git a/src/main/java/com/sa/zentao/service/IZtBugService.java b/src/main/java/com/sa/zentao/service/IZtBugService.java index 9fa7ccd..cfa21fb 100644 --- a/src/main/java/com/sa/zentao/service/IZtBugService.java +++ b/src/main/java/com/sa/zentao/service/IZtBugService.java @@ -53,4 +53,13 @@ public interface IZtBugService extends IService { List getNormalBugList(List bugList); List bugListByProductAndDate(List pIds, Date firstDayOfMonth, Date lastDayOfMonth); + + List bugListByProjectAndDate(List pIds, Date firstDayOfMonth, Date lastDayOfMonth); + + + List bugBoundsListByProjectAndDate(List pIds, Date firstDayOfMonth, Date lastDayOfMonth,String account); + + List getDevBugList(List bugList); + + } diff --git a/src/main/java/com/sa/zentao/service/IZtStoryFeedbackService.java b/src/main/java/com/sa/zentao/service/IZtStoryFeedbackService.java index e0fe23f..284d826 100644 --- a/src/main/java/com/sa/zentao/service/IZtStoryFeedbackService.java +++ b/src/main/java/com/sa/zentao/service/IZtStoryFeedbackService.java @@ -43,7 +43,7 @@ public interface IZtStoryFeedbackService extends IService { void feedbackStart(Integer feedbackId); - void feedbackFinished(Integer feedbackId); + void feedbackFinished(Integer feedbackId,String finishedRemark); void submitVerified(ZtStoryFeedbackDTO dto); diff --git a/src/main/java/com/sa/zentao/service/IZtStoryService.java b/src/main/java/com/sa/zentao/service/IZtStoryService.java index 25e0f3e..86a7393 100644 --- a/src/main/java/com/sa/zentao/service/IZtStoryService.java +++ b/src/main/java/com/sa/zentao/service/IZtStoryService.java @@ -12,6 +12,7 @@ import com.sa.zentao.enums.TaskType; import com.sa.zentao.qo.ZtProjectQo; import org.apache.ibatis.annotations.Param; +import java.util.Date; import java.util.List; import java.util.Map; @@ -97,4 +98,6 @@ public interface IZtStoryService extends IService { List getNormalStory(List sList); public Map getStoryCaseMap(List list); + + List getStoryListByDatePidsProject(List pids, Integer id, Date firstDayOfMonth, Date lastDayOfMonth); } diff --git a/src/main/java/com/sa/zentao/service/VxService.java b/src/main/java/com/sa/zentao/service/VxService.java index 606a414..39c13a6 100644 --- a/src/main/java/com/sa/zentao/service/VxService.java +++ b/src/main/java/com/sa/zentao/service/VxService.java @@ -27,18 +27,22 @@ import java.util.Map; public class VxService { @Value("${vx.corpid}") - private static String corpid; + private String corpid; - @Value("${vx.dkcorpsecret}") - private static String dkcorpsecret; @Value("${vx.salaryCorpsecretApp}") - private static String salaryCorpsecretApp; + private String salaryCorpsecretApp; + + @Value("${vx.agentld}") + private String agentid; + @Autowired private IZtUserService userService; + + // public void sendMessageToVx(String vxId, String text, Date date) { // Environment bean = SpringUtil.getBean(Environment.class); // @@ -83,7 +87,6 @@ public class VxService { if (corpid == null) { corpid = bean.getProperty("vx.corpid"); - dkcorpsecret = bean.getProperty("vx.dkcorpsecret"); salaryCorpsecretApp = bean.getProperty("vx.salaryCorpsecretApp"); } String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + corpid + "&corpsecret=" + salaryCorpsecretApp; @@ -96,7 +99,7 @@ public class VxService { Map map = new HashMap(); map.put("touser", vxId); - map.put("agentid", 3010185); + map.put("agentid", agentid); map.put("safe", 0); map.put("enable_id_trans", 0); map.put("enable_duplicate_check", 0); @@ -115,18 +118,17 @@ public class VxService { public void sendMessageToVx(String account, String text, Date date) { // -// ZtUser ztUser = this.userService.selectByName(account); -// if(ztUser==null||StringUtils.isEmpty(ztUser.getVx())){ -// return; -// } - String vxId = "lisi";//CryptoUtils.aesDecryptForFront(ztUser.getVx(), CryptoUtils.KEY_DES); + ZtUser ztUser = this.userService.selectByName(account); + if(ztUser==null||StringUtils.isEmpty(ztUser.getVx())){ + return; + } + String vxId = CryptoUtils.aesDecryptForFront(ztUser.getVx(), CryptoUtils.KEY_DES); Environment bean = SpringUtil.getBean(Environment.class); if (corpid == null) { corpid = bean.getProperty("vx.corpid"); - dkcorpsecret = bean.getProperty("vx.dkcorpsecret"); salaryCorpsecretApp = bean.getProperty("vx.salaryCorpsecretApp"); } String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + corpid + "&corpsecret=" + salaryCorpsecretApp; @@ -140,7 +142,7 @@ public class VxService { Map map = new HashMap(); map.put("touser", vxId); // - map.put("agentid", 1000002); + map.put("agentid", agentid); // map.put("agentid", 3010185); map.put("safe", 0); map.put("enable_id_trans", 0); @@ -149,9 +151,9 @@ public class VxService { Map texts = new HashMap(); texts.put("content", text); map.put("text", texts); - log.info("调用微信start==",JSON.toJSONString(map)); + log.info("调用微信start=={}",JSON.toJSONString(map)); String s = JSONPost(url, map); - log.info("调用微信end==",s); + log.info("调用微信end=={}",s); } catch (IOException e) { e.printStackTrace(); log.error("",e); diff --git a/src/main/java/com/sa/zentao/service/impl/IZtCountService.java b/src/main/java/com/sa/zentao/service/impl/IZtCountService.java index a4600ea..e6d62f7 100644 --- a/src/main/java/com/sa/zentao/service/impl/IZtCountService.java +++ b/src/main/java/com/sa/zentao/service/impl/IZtCountService.java @@ -497,12 +497,15 @@ public class IZtCountService { //问题反馈 未受理 result.setFeedbackWslCount(feedbacks.stream().filter(o -> "wait".equals(o.getStatus())).map(o -> o.getId() + "").collect(Collectors.joining(","))); //处理中的 wait doing finished submitVerified 提交验收 closed reviewing verified 验收 dontHand 无需处理 - result.setFeedbackClzCount(feedbacks.stream().filter(o -> Arrays.asList("doing", "finished", "submitVerified").contains(o.getStatus())).map(o -> o.getId() + "").collect(Collectors.joining(","))); - //处理完的 - result.setFeedbackClwCount(feedbacks.stream().filter(o -> Arrays.asList("verified").contains(o.getStatus())).map(o -> o.getId() + "").collect(Collectors.joining(","))); + result.setFeedbackClzCount(feedbacks.stream() + .filter(o -> Arrays.asList("doing", "finished") + .contains(o.getStatus())).map(o -> o.getId() + "").collect(Collectors.joining(","))); + //处理完的 改完待验收 250512 + result.setFeedbackClwCount(feedbacks.stream().filter(o -> Arrays.asList("submitVerified").contains(o.getStatus())).map(o -> o.getId() + "").collect(Collectors.joining(","))); //延期的 result.setFeedbackYqCount(feedbacks.stream().filter(o -> Arrays.asList("doing", "wait").contains(o.getStatus())).filter(o -> o.getPlanFinishDate() != null && o.getPlanFinishDate().getTime() < new Date().getTime()).map(o -> o.getId() + "").collect(Collectors.joining(","))); - result.setFeedbackGbCount(feedbacks.stream().filter(o -> "closed".equals(o.getStatus())).map(o -> o.getId() + "").collect(Collectors.joining(","))); + + result.setFeedbackGbCount(feedbacks.stream().filter(o -> "closed".equals(o.getStatus())||"verified".equals(o.getStatus())).map(o -> o.getId() + "").collect(Collectors.joining(","))); return result; } @@ -547,12 +550,16 @@ public class IZtCountService { Map userMap = userService.userMapByIds(null); List list = new ArrayList<>(); - + String sDate = DateUtils.formatDate(qo.getDate(), "yyyy-MM"); //生成模板 for (int i = 0; i < perList.size(); i++) { PerformanceDTO performanceDTO = perList.get(i); ZtUser ztUser = userMap.get(performanceDTO.getAccount()); - + ZtMonthScore ztMonthScore = this.monthScoreService.getOne(new QueryWrapper().lambda().eq(ZtMonthScore::getDateStr, sDate).eq(ZtMonthScore::getAccount, performanceDTO.getAccount())); + if(ztMonthScore==null){ + continue; + } + performanceDTO=JSON.parseObject(ztMonthScore.getScopeJson(),PerformanceDTO.class); if (ztUser.getAccount().equals("liyuyan")) { generatorXMZLExcel(performanceDTO.getUserName(), performanceDTO, qo.getDate()); list.add(performanceDTO.getUserName() + "项目助理考核.xlsx"); @@ -591,27 +598,11 @@ public class IZtCountService { response.setContentType("application/vnd.ms-excel;charset=UTF-8"); -// list.add(fileName); -// for (int i = 0; i < perList.size(); i++) { -// PerformanceDTO performanceDTO = perList.get(i); -// ZtUser ztUser = userMap.get(performanceDTO.getAccount()); -// -// -// if(ztUser.getUserType()==UserType.CS){ -// list.add(performanceDTO.getUserName()+"测试.xlsx"); -// -// generatorTestExcel(performanceDTO.getUserName(),performanceDTO,qo.getDate()); -// }else if(ztUser.getUserType()==UserType.KFZ){ -// list.add(performanceDTO.getUserName()+"开发.xlsx"); -// generatorDevlopExcel(performanceDTO.getUserName(),performanceDTO,qo.getDate()); -// } -// } String excelName = DateUtils.formatDate(qo.getDate(), "yyyy-MM-dd") + "绩效" + ".xlsx"; ExcelUtil.mergexcel(list, excelName, dir); - File f = new File(dir + excelName); InputStream fis = new BufferedInputStream(new FileInputStream(f)); // InputStream fis = new BufferedInputStream(new FileInputStream("D:\\1.bmp")); @@ -775,7 +766,9 @@ public class IZtCountService { if (CollectionUtils.isEmpty(projectproducts)) { return new ArrayList<>(); } - List taskList = this.taskService.taskListByEIdsAndDate(firstDayOfMonth, lastDayOfMonth, productList.stream().map(o->o.getId()).collect(Collectors.toList())); + List pids = productList.stream().map(o -> o.getId()).collect(Collectors.toList()); + + List taskList = this.taskService.taskListByEIdsAndDate(firstDayOfMonth, lastDayOfMonth,pids); List ztProjects = this.projectService.getExecutionsListByProjectAndDate(projectproducts.stream().map(o->o.getProject()).collect(Collectors.toList()), firstDayOfMonth, lastDayOfMonth); @@ -790,6 +783,7 @@ public class IZtCountService { if (CollectionUtils.isEmpty(accountIds)) { return new ArrayList<>(); } + Map userMap = this.userService.userMapByIds(accountIds); //accountIds 成员 List ztUsers = this.userService.list(new QueryWrapper().lambda() @@ -808,7 +802,7 @@ public class IZtCountService { } else if (u.getUserType() == UserType.KFZ) { result.add(buildKFZScore(u, approvalList, firstDayOfMonth, lastDayOfMonth, taskList, d)); } else if (u.getUserType() == UserType.CS) { - result.add(buildCScore(u, approvalList, firstDayOfMonth, lastDayOfMonth, taskList, d)); + result.add(buildCScore(userMap,pids,u, approvalList, firstDayOfMonth, lastDayOfMonth, taskList, d)); } else if (u.getUserType() == UserType.UI) { result.add(buildUiScore(u, approvalList, firstDayOfMonth, lastDayOfMonth, taskList, d)); } else if (u.getUserType() == UserType.XMJL || u.getUserType() == UserType.XMGLY || u.getUserType() == UserType.GSGC) { @@ -863,17 +857,16 @@ public class IZtCountService { * 2. <100%,每减少1%,扣3分,扣完截止。 * */ - dto.setPunctualityScore(onTimeFinishRate.intValue() == 1 ? BigDecimal.valueOf(25) - : BigDecimal.valueOf(25).subtract((BigDecimal.valueOf(1).subtract(onTimeFinishRate).multiply(BigDecimal.valueOf(100))).multiply(BigDecimal.valueOf(3))).floatValue() <= 0 ? BigDecimal.ZERO : - BigDecimal.valueOf(BigDecimal.valueOf(25).subtract((BigDecimal.valueOf(1).subtract(onTimeFinishRate).multiply(BigDecimal.valueOf(100))).multiply(BigDecimal.valueOf(3))).floatValue()) - ); + dto.setPunctualityScore( + getKFZPunctualityScore(onTimeFinishRate) ); //bug得分 + List bugList = this.bugService.bugBoundsListByProjectAndDate(null, firstDayOfMonth, lastDayOfMonth, u.getAccount()); - List bugList = this.bugService.list(new QueryWrapper().lambda(). - ge(ZtBug::getOpeneddate, firstDayOfMonth).le(ZtBug::getOpeneddate, lastDayOfMonth) - .eq(ZtBug::getAssignedTo, u.getAccount())); +// List bugList = this.bugService.list(new QueryWrapper().lambda(). +// ge(ZtBug::getOpeneddate, firstDayOfMonth).le(ZtBug::getOpeneddate, lastDayOfMonth) +// .eq(ZtBug::getAssignedTo, u.getAccount())); bugList=this.bugService.getNormalBugList(bugList); //bug密度 int bugSize = bugList.size(); @@ -913,6 +906,22 @@ public class IZtCountService { return dto; } + private BigDecimal getKFZPunctualityScore(BigDecimal onTimeFinishRate) { + + if(BigDecimalUtils.isZero(onTimeFinishRate)){ + return BigDecimal.ZERO; + } + int onTimeRate = onTimeFinishRate.multiply(BigDecimal.valueOf(100)).intValue(); + if(onTimeRate>=100){ + return BigDecimal.valueOf(25); + }else if(onTimeRate>=95){ + return BigDecimal.valueOf(20+(100-onTimeRate)); + }else{ + int scope = (20-(94-onTimeRate)*2); + return scope<0?BigDecimal.ZERO:BigDecimal.valueOf(scope); + } + } + public PerformanceDTO setUserWorkTime(PerformanceDTO dto, Date d, List approvalList, Date firstDayOfMonth) { //本月天数 int workDaysInCurrentMonth = DateUtils.getWorkDaysInCurrentMonth(d); @@ -931,10 +940,12 @@ public class IZtCountService { dto.setTotalTime(totalTime.multiply(BigDecimal.valueOf(0.75))); //达标工时 dto.setExamineTime(totalTime.subtract(applyTime).multiply(BigDecimal.valueOf(0.75))); + + return dto; } - PerformanceDTO buildCScore(ZtUser u, List approvalList, Date firstDayOfMonth, Date lastDayOfMonth, List taskList, Date d) { + PerformanceDTO buildCScore( Map userMap,List pids,ZtUser u, List approvalList, Date firstDayOfMonth, Date lastDayOfMonth, List taskList, Date d) { PerformanceDTO dto = new PerformanceDTO(); dto.setUserName(u.getNickname()); @@ -976,14 +987,17 @@ public class IZtCountService { //轻微 long slightBug = allBugList.stream().filter(o -> Arrays.asList(4, 2, 3).contains(o.getSeverity())).count(); long totalBug = seriousBug * 5 + slightBug * 1; - dto.setBugFindRate(BigDecimalUtils.isZero(dto.getExamineTime()) ? BigDecimal.ZERO : BigDecimal.valueOf(totalBug).divide(dto.getExamineTime(), 2, BigDecimal.ROUND_UP)); //缺陷检出率 TODO bug 数量 / 可用工时 250418尹工说的 - int bugFindScore = dto.getBugFindRate().multiply(BigDecimal.valueOf(100)).intValue() > 20 ? 30 : - (30 - (20 - BigDecimal.valueOf(totalBug).divide(dto.getExamineTime(), 2, BigDecimal.ROUND_UP).multiply(BigDecimal.valueOf(100)).intValue()) * 2); + // 2025-05-12 尹工说的 测试在指定时间完成 并且指派给他 的开发任务工时 + + + + dto.setDevSeriousBug(BigDecimal.valueOf(seriousBug)); dto.setDevSlightBug(BigDecimal.valueOf(slightBug)); //bug检出率 - dto.setBugFindScore(BigDecimal.valueOf(bugFindScore < 0 ? 0 : bugFindScore)); + dto =getBugFindScore(dto,u,userMap,pids,firstDayOfMonth,lastDayOfMonth,totalBug); + //暂未定义 dto.setSlightBug(BigDecimal.ZERO); dto.setSeriousBug(BigDecimal.ZERO); @@ -1023,6 +1037,43 @@ public class IZtCountService { return dto; } + private PerformanceDTO getBugFindScore(PerformanceDTO dto,ZtUser u, Map userMap,List pids, Date firstDayOfMonth, Date lastDayOfMonth,long totalBug) { + + List list = this.storyService.list(new QueryWrapper().lambda().in(ZtStory::getProduct, pids) + .eq(ZtStory::getAssignedTo, u.getAccount()).ge(ZtStory::getEndDate, firstDayOfMonth).le(ZtStory::getEndDate, lastDayOfMonth)); + if(CollectionUtils.isEmpty(list)){ + return dto; + } + List accountIds = userMap.values().stream().filter(o -> o.getUserType() == UserType.KFZ).map(o -> o.getAccount()).collect(Collectors.toList()); + if(CollectionUtils.isEmpty(accountIds)){ + return dto; + } + + List taskList = this.taskService.list(new QueryWrapper().lambda() + .eq(ZtTask::getType,"devel") + .in(ZtTask::getAssignedTo,accountIds) + .in(ZtTask::getStory, list.stream().map(o -> o.getId()).collect(Collectors.toList()))); + if(CollectionUtils.isEmpty(taskList)){ + return dto; + } + + //开发总工时 + BigDecimal totalTimeWorkHours = floatBatchAdd(taskList.stream().map(o -> o.getEstimate()).collect(Collectors.toList())); + + BigDecimal bugRate= BigDecimalUtils.isZero(totalTimeWorkHours)?BigDecimal.ZERO: + BigDecimal.valueOf(totalBug).divide(totalTimeWorkHours,2,BigDecimal.ROUND_UP); + int i = bugRate.multiply(BigDecimal.valueOf(100)).intValue(); + dto.setBugFindRate(bugRate); + if(i<=0){ + + }else if(i>20){ + dto.setBugFindScore(BigDecimal.valueOf(30)); + }else{ + dto.setBugFindScore((30-(20-i)*2)<=0?BigDecimal.ZERO:BigDecimal.valueOf((30-(20-i)*2))); + } + return dto; + } + PerformanceDTO buildUiScore(ZtUser u, List approvalList, Date firstDayOfMonth, Date lastDayOfMonth, List taskList, Date d) { PerformanceDTO dto = new PerformanceDTO(); @@ -1133,7 +1184,7 @@ public class IZtCountService { dto = getMeetScore(u, firstDayOfMonth, lastDayOfMonth, dto); dto.setDocumentQualityScore(BigDecimal.valueOf(50)); - + dto.setProjectDocumentScore(BigDecimal.valueOf(50)); return dto; } @@ -1150,8 +1201,7 @@ public class IZtCountService { if (CollectionUtils.isEmpty(list)) { return dto; } - long weekCount = 1; - list.stream().filter(o -> o.getType() == MeetingTypeEnums.week).count(); + long weekCount =list.stream().filter(o -> o.getType() == MeetingTypeEnums.week).count(); dto.setMeetWeek(BigDecimal.valueOf(weekCount)); int weekMeetScore = (int) (weekCount == 0 ? 0 : (weekCount >= 4) ? 4 * 6 : (24 - (4 - weekCount) * 6)); @@ -1159,6 +1209,8 @@ public class IZtCountService { dto.setMeetStory(BigDecimal.valueOf(storyCount)); int storyScore = storyCount > 0 ? 6 : 0; dto.setMeetScore(BigDecimal.valueOf(storyScore + weekMeetScore)); + dto.setDocumentQualityScore(BigDecimal.valueOf(50)); + dto.setDocumentQualityProblem(BigDecimal.ZERO); return dto; } @@ -1562,13 +1614,64 @@ public class IZtCountService { return result; } - List pList = this.projectService.listByIds(projectproducts.stream().map(o -> o.getProject()).collect(Collectors.toList())); - + List projectIds = projectproducts.stream().map(o -> o.getProject()).collect(Collectors.toList()); + List pList = this.projectService.listByIds(projectIds); + pList=pList.stream().filter(o->!"1".equals(o.getDeleted())).filter(o->o.getRealEnd()==null|| + (o.getRealEnd()!=null&&DateUtils.getDayLast(o.getRealEnd()).getTime()>firstDayOfMonth.getTime())).collect(Collectors.toList()); //完成任务总量 开发 List taskList =this.taskService.taskListByEIdsAndDate(firstDayOfMonth,lastDayOfMonth,pids); + Map userMap = userService.userMapByIds(null); + + List bugList = this.bugService.bugListByProductAndDate(pids,firstDayOfMonth,lastDayOfMonth); + bugList = bugService.getNormalBugList(bugList); + + bugList = bugService.getDevBugList(bugList); + + + + List ztProjects = this.projectService.getExecutionsListByProjectAndDate(projectproducts.stream().map(o->o.getProject()).collect(Collectors.toList()), firstDayOfMonth, lastDayOfMonth); + + if (CollectionUtils.isEmpty(ztProjects)) { + return new ArrayList<>(); + } + + List teams = this.teamService.list(new QueryWrapper().lambda().eq(ZtTeam::getType, "execution") + .in(ZtTeam::getRoot, ztProjects.stream().map(o -> o.getId()).collect(Collectors.toList()))); + + List accountIds = teams.stream().map(o -> o.getAccount()).distinct().collect(Collectors.toList()); + if (CollectionUtils.isEmpty(accountIds)) { + return new ArrayList<>(); + } + //accountIds 成员 + + List ztUsers = this.userService.list(new QueryWrapper().lambda() + .in(ZtUser::getAccount, accountIds)); + + + List multipleUserList= getmultipleDepartProjectTeam(firstDayOfMonth,lastDayOfMonth); + + for (ZtProject p : pList) { + BigDecimal examineTime =BigDecimal.valueOf(0); + for (ZtUser u:ztUsers ) { + List approvalList = this.taskService.itApprovalByUserName(u.getNickname(), firstDayOfMonth, lastDayOfMonth); + + PerformanceDTO performanceDTO = buildKFZScore(u, approvalList, firstDayOfMonth, lastDayOfMonth, + taskList.stream().filter(o->o.getProject().equals(p.getId())).collect(Collectors.toList()), d); + + if (u != null && u.getUserType() == UserType.KFZ) { + //如果多项目组 那么 分配任务工时占 总工时的% TODO + if(multipleUserList.contains(u.getAccount())){ + examineTime = examineTime.add(performanceDTO.getAllocationTime()); + }else{ + examineTime = examineTime.add(performanceDTO.getExamineTime()); + } + } + } + + ProjectWorkDetailsDTO dto = new ProjectWorkDetailsDTO(); result.add(dto); @@ -1582,14 +1685,14 @@ public class IZtCountService { continue; } //项目的需求 - List storyIds = getStoryIds(project); - - +// List storyIds = getStoryIds(project); + List storyList = this.storyService.getStoryListByDatePidsProject(pids,p.getId(),firstDayOfMonth,lastDayOfMonth); // //完成需求总量 - List storyList = this.storyService.list(new QueryWrapper().lambda().in(ZtStory::getProduct, pids) - .ge(ZtStory::getEndDate, firstDayOfMonth).le(ZtStory::getEndDate, lastDayOfMonth)); +// List storyList = this.storyService.list(new QueryWrapper().lambda().in(ZtStory::getProduct, pids) +// +// .ge(ZtStory::getEndDate, firstDayOfMonth).le(ZtStory::getEndDate, lastDayOfMonth)); dto.setFinishCount(storyList.size()); // //上线的需求数量 @@ -1601,9 +1704,10 @@ public class IZtCountService { - +// .filter(o->o.getProject().equals(p.getId())) // 完成后可能会被关闭 List done = taskList.stream() + .filter(o->userMap.get(o.getAssignedTo())!=null&&userMap.get(o.getAssignedTo()).getUserType()==UserType.KFZ) .filter(o->o.getStatus().equals("done")).collect(Collectors.toList()); @@ -1636,6 +1740,14 @@ public class IZtCountService { } List noTg = releaseStoryList.stream().filter(o -> o.getStage().equals("verified") && o.getYsFlag().intValue() == 2).collect(Collectors.toList()); dto.setYsNoCount(BigDecimal.valueOf(noTg.size())); + + int bugSize = (int)bugList.stream().filter(o->o.getProject().equals(p.getId())).count(); + dto.setFindBugCount(BigDecimal.valueOf(bugSize)); + if(BigDecimalUtils.isZero(examineTime)){ + examineTime=BigDecimal.valueOf(1); + } + dto.setFindBugRate(dto.getFindBugCount().divide(examineTime,3,BigDecimal.ROUND_DOWN)); + } @@ -1736,6 +1848,15 @@ public class IZtCountService { dto.setSaturation(dto.getWorkTime().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO : dto.getStoryTotalTime().divide(dto.getHaveTime(), 2, BigDecimal.ROUND_HALF_UP)); dto.setBugCount(BigDecimal.valueOf(prodBugList.stream().filter(o -> u.getAccount().equals(o.getAssignedTo())).count())); + + + BigDecimal onTime = floatBatchAdd(fTask.stream().filter(o -> o.getFinishedDate() != null && o.getFinishedDate().getTime() <= DateUtils.getDayLast(o.getDeadline()).getTime()).map(o -> o.getEstimate()).collect(Collectors.toList())); + + + BigDecimal onTimeFinishRate = BigDecimalUtils.isZero(dto.getStoryTotalTime()) ? onTime : onTime.divide(dto.getStoryTotalTime(), 2, BigDecimal.ROUND_UP); + + dto.setFinishPunctuality(onTimeFinishRate); + result.add(dto); } } @@ -1993,6 +2114,19 @@ public class IZtCountService { dataMap.put("工作态度和责任感", "5"); dataMap.put("创新贡献", "0"); dataMap.put("质量贡献", "0"); + + dataMap.put("totalTask", performanceDTO.getTotalTask().toString()); + dataMap.put("delayTask", performanceDTO.getDelayTask().toString()); + dataMap.put("finishPunctuality", performanceDTO.getFinishPunctuality().multiply(BigDecimal.valueOf(100)).toString()); + + dataMap.put("workTime", performanceDTO.getWorkTime().toString()); + dataMap.put("saturation", performanceDTO.getSaturation().multiply(BigDecimal.valueOf(100)).toString()); + dataMap.put("examineTime", performanceDTO.getExamineTime().toString()); + + dataMap.put("bugCount", performanceDTO.getBugCount().toString()); + dataMap.put("bugDensity", performanceDTO.getBugDensity().multiply(BigDecimal.valueOf(100)).toString()); + + dataMap.put("总分", devlopTotal( dataMap.get("准时率得分"), dataMap.get("Bug密度"), @@ -2010,6 +2144,11 @@ public class IZtCountService { dataMap.put("name", name); dataMap.put("date", DateUtils.formatDate(d, "yyyy-MM")); dataMap.put("总分", "100"); + + dataMap.put("任务总量", performanceDTO.getTotalTask().toString()); + dataMap.put("超期数量", performanceDTO.getDelayTask().toString()); + dataMap.put("及时完成率", performanceDTO.getFinishPunctuality().toString()); + writeXlsx(name, "templates/scope/UI工程师.xlsx", name + "UI工程师.xlsx", dataMap); InputStream templateFile = null; // try { @@ -2072,6 +2211,17 @@ public class IZtCountService { dataMap.put("专业技能提升", "5"); + dataMap.put("普通bug",performanceDTO.getSlightBug().toString()); + dataMap.put("重大bug", performanceDTO.getSeriousBug().toString()); + dataMap.put("线上bug率", performanceDTO.getBugDensity().multiply(BigDecimal.valueOf(100)).toString()); + dataMap.put("分配工时", performanceDTO.getAllocationTime().toString()); + dataMap.put("可用工时", performanceDTO.getExamineTime().toString()); + dataMap.put("分配工时占比", performanceDTO.getAllocationTimeManageRate().multiply(BigDecimal.valueOf(100)).toString()); + dataMap.put("召开周会数量", performanceDTO.getMeetWeek().toString()); + dataMap.put("召开需求会议数量", performanceDTO.getMeetStory().toString()); + + + dataMap.put("总分", devlopTotal( dataMap.get("版本计划完成率"), dataMap.get("任务管理"), @@ -2315,8 +2465,18 @@ public class IZtCountService { dataMap.put("name", name); dataMap.put("date", DateUtils.formatDate(d, "yyyy-MM")); dataMap.put("项目绩效", performanceDTO.getReleaseScore().toString()); - dataMap.put("项目文档", "50"); + dataMap.put("项目文档", performanceDTO.getProjectDocumentScore().toString()); dataMap.put("会议管理", performanceDTO.getMeetScore().toString()); + + + dataMap.put("上线需求数量", performanceDTO.getReleaseCount().toString()); + dataMap.put("及时验收数量", performanceDTO.getReleaseOnTimeCount().toString()); + dataMap.put("及时验收率", performanceDTO.getReleaseOnTimeRate().multiply(BigDecimal.valueOf(100)).toString()); + dataMap.put("召开周会数量", performanceDTO.getMeetWeek().toString()); + dataMap.put("召开需求数量", performanceDTO.getMeetStory().toString()); + + + dataMap.put("总分", devlopTotal(dataMap.get("项目绩效"), dataMap.get("项目文档"), dataMap.get("会议管理"))); writeXlsx(name, "templates/scope/项目助理考核.xlsx", name + "项目助理考核.xlsx", dataMap); @@ -2346,6 +2506,21 @@ public class IZtCountService { dataMap.put("工作态度", "5"); dataMap.put("质量贡献", "5"); dataMap.put("线上Bug", "20"); + + + + + dataMap.put("任务总量", performanceDTO.getTotalTask().toString()); + dataMap.put("延期数量", performanceDTO.getDelayTask().toString()); + dataMap.put("及时完成率", performanceDTO.getFinishPunctuality().multiply(BigDecimal.valueOf(100)).toString()); + + + dataMap.put("测试普通bug", performanceDTO.getDevSlightBug().toString()); + dataMap.put("测试重大bug", performanceDTO.getDevSeriousBug().toString()); + dataMap.put("缺陷检出率", performanceDTO.getBugFindRate().multiply(BigDecimal.valueOf(100)).toString()); + dataMap.put("线上普通bug", performanceDTO.getSlightBug().toString()); + dataMap.put("线上重大bug", performanceDTO.getSeriousBug().toString()); + dataMap.put("总分", devlopTotal(dataMap.get("准时率得分") , dataMap.get("缺陷检出率"), dataMap.get("测试文档"), dataMap.get("工作态度"), dataMap.get("质量贡献"), dataMap.get("线上Bug")) ); @@ -2382,17 +2557,13 @@ public class IZtCountService { Date firstDayOfMonth = DateUtils.getFirstDayOfMonth(d); Date lastDayOfMonth = DateUtils.getLastDayOfMonth(d); - List pIds = this.projectService.authProductList(); - if (CollectionUtils.isEmpty(pIds)) { + List pids = this.projectService.authProductList(); + if (CollectionUtils.isEmpty(pids)) { return result; } - List productList = this.productService.listByIds(pIds); - if (CollectionUtils.isEmpty(productList)) { - return result; - } List projectproducts = this.projectproductService.list(new QueryWrapper().lambda() - .in(ZtProjectproduct::getProduct, productList.stream().map(o -> o.getId()).collect(Collectors.toList()))); + .in(ZtProjectproduct::getProduct, pids)); if (CollectionUtils.isEmpty(projectproducts)) { return result; } @@ -2401,12 +2572,14 @@ public class IZtCountService { if (CollectionUtils.isEmpty(execList)) { return result; } - List taskList = this.taskService.taskListByEIdsAndDate(firstDayOfMonth, lastDayOfMonth, pIds); - + List taskList = this.taskService.taskListByEIdsAndDate(firstDayOfMonth, lastDayOfMonth, pids); + taskList=taskService.getNormalTaskList(taskList); if (CollectionUtils.isEmpty(taskList)) { return result; } + + List ztProjects = this.projectService.listByIds(execList.stream().map(o -> o.getExecution()).collect(Collectors.toList())); @@ -2429,8 +2602,9 @@ public class IZtCountService { //accountIds 成员 - UserType userType = RiskUserThreadLocal.get().getUserType(); List approvalList = this.taskService.itApprovalByUserName(u.getNickname(), firstDayOfMonth, lastDayOfMonth); + Map userMap = this.userService.userMapByIds(accountIds); + if (name.equals("liyuyan")) { result = buildXMZLScore(u, approvalList, firstDayOfMonth, lastDayOfMonth, taskList, d); @@ -2439,7 +2613,7 @@ public class IZtCountService { } else if (u.getUserType() == UserType.KFZ) { result = buildKFZScore(u, approvalList, firstDayOfMonth, lastDayOfMonth, taskList, d); } else if (u.getUserType() == UserType.CS) { - result = buildCScore(u, approvalList, firstDayOfMonth, lastDayOfMonth, taskList, d); + result = buildCScore(userMap,pids,u, approvalList, firstDayOfMonth, lastDayOfMonth, taskList, d); } else if (u.getUserType() == UserType.UI) { result = buildUiScore(u, approvalList, firstDayOfMonth, lastDayOfMonth, taskList, d); } else if (u.getUserType() == UserType.XMJL || u.getUserType() == UserType.XMGLY || u.getUserType() == UserType.GSGC) { @@ -2447,7 +2621,6 @@ public class IZtCountService { ZtCountQo ztCountQo = new ZtCountQo(); BeanUtils.copyProperties(qo, ztCountQo); List perList = this.newPerformanceCount(ztCountQo); - Map userMap = this.userService.userMapByIds(accountIds); result = buildTaskManage(result, perList, userMap); result = buildBugManage(result, ztCountQo, perList, userMap); @@ -2678,8 +2851,7 @@ public class IZtCountService { } } dto.setAllocationTime(allocationTime); - - List devBugList = bugList.stream().filter(o -> o.getBugType().equals("dev")).collect(Collectors.toList()); + List devBugList = this.bugService.getDevBugList(bugList); int devBugCount = devBugList.size(); dto.setBugCount(BigDecimal.valueOf(devBugCount)); dto.setBugDensity((dto.getAllocationTime() == null || BigDecimalUtils.isZero(dto.getAllocationTime())) ? BigDecimal.ZERO : BigDecimal.valueOf(devBugCount).divide(dto.getAllocationTime(), 3, BigDecimal.ROUND_DOWN)); diff --git a/src/main/java/com/sa/zentao/service/impl/ZtBugServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtBugServiceImpl.java index a5c6d74..af34428 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtBugServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtBugServiceImpl.java @@ -8,10 +8,7 @@ import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.sa.zentao.conf.LoginRiskUser; import com.sa.zentao.conf.RiskUserThreadLocal; -import com.sa.zentao.dao.BusinessException; -import com.sa.zentao.dao.ZtBugDTO; -import com.sa.zentao.dao.ZtCaseDTO; -import com.sa.zentao.dao.ZtTaskDTO; +import com.sa.zentao.dao.*; import com.sa.zentao.entity.*; import com.sa.zentao.enums.ActionStatus; import com.sa.zentao.enums.ActionType; @@ -90,6 +87,8 @@ public class ZtBugServiceImpl extends ServiceImpl implements @Autowired private IZtReleaseService releaseService; + @Autowired + private IZtBugBoundUserService bugBoundUserService; @Override @@ -328,6 +327,8 @@ public class ZtBugServiceImpl extends ServiceImpl implements if (d.getDeadline() != null) { d.setDeadline(DateUtils.getDayLast(d.getDeadline())); } + List boundList = this.bugBoundUserService.listByBugId(d.getId()); + d.setBoundList(BeanCopyUtil.copyListProperties(boundList,ZtBugBoundUserDTO::new)); return d; } @@ -383,6 +384,7 @@ public class ZtBugServiceImpl extends ServiceImpl implements ZtProjectproduct projectproduct = this.projectproductService.getOne(new QueryWrapper().lambda().eq(ZtProjectproduct::getProject, dto.getProject())); Integer product = projectproduct.getProduct(); //项目bug + List bountSaveList=new ArrayList<>(); for (ZtBugDTO d:list) { ZtBug b=new ZtBug(); BeanUtils.copyProperties(d,b); @@ -393,9 +395,17 @@ public class ZtBugServiceImpl extends ServiceImpl implements b.setOpeneddate(new Date()); b.setOpenedby(loginRiskUser.getName()); b.setStatus("active"); + saveBatch.add(b); } this.saveBatch(saveBatch); + for (ZtBug b:saveBatch) { + ZtBugBoundUser ztBugBoundUser = new ZtBugBoundUser(); + ztBugBoundUser.setBugId(b.getId()); + ztBugBoundUser.setAssignedTo(b.getAssignedTo()); + bountSaveList.add(ztBugBoundUser); + } + bugBoundUserService.saveBatch(bountSaveList); Map> eMap = saveBatch.stream().filter(o->o.getExecution()!=null&&o.getExecution()!=0).collect(Collectors.groupingBy(ZtBug::getExecution)); for (Integer e:eMap.keySet()) { @@ -571,6 +581,21 @@ public class ZtBugServiceImpl extends ServiceImpl implements return this.baseMapper.bugListByProductAndDate(pIds,firstDayOfMonth,lastDayOfMonth); } + @Override + public List bugListByProjectAndDate(List pIds, Date firstDayOfMonth, Date lastDayOfMonth) { + return this.baseMapper.bugListByProjectAndDate(pIds,firstDayOfMonth,lastDayOfMonth); + } + + @Override + public List bugBoundsListByProjectAndDate(List pIds, Date firstDayOfMonth, Date lastDayOfMonth, String account) { + return this.baseMapper.bugBoundsListByProjectAndDate(pIds,firstDayOfMonth,lastDayOfMonth,account); + } + + @Override + public List getDevBugList(List bugList) { + return bugList.stream().filter(o->"dev".equals(o.getBugType())||"releaseBug".equals(o.getBugType())).collect(Collectors.toList()); + } + @Override @Transactional @@ -599,6 +624,23 @@ public class ZtBugServiceImpl extends ServiceImpl implements } this.baseMapper.insert(ztBug); + List boundSaveList=new ArrayList<>(); + List boundList = dto.getBoundList(); + if(!CollectionUtils.isEmpty(boundList)){ + for (ZtBugBoundUserDTO ztBugBoundUserDTO:boundList ) { + ZtBugBoundUser bound = new ZtBugBoundUser(); + bound.setBugId(ztBug.getId()); + bound.setAssignedTo(ztBugBoundUserDTO.getAssignedTo()); + boundSaveList.add(bound); + } + }else{ + ZtBugBoundUser bound = new ZtBugBoundUser(); + bound.setBugId(ztBug.getId()); + bound.setAssignedTo(ztBug.getAssignedTo()); + boundSaveList.add(bound); + } + this.bugBoundUserService.saveBatch(boundSaveList); + fileService.updateFile(dto.getFiles(),ztBug.getId(), FileTypes.bug); if(dto.getExecution()!=null&&dto.getExecution()!=0){ kanbanlaneService.addBug(dto.getExecution(), Arrays.asList(ztBug)); @@ -628,6 +670,30 @@ public class ZtBugServiceImpl extends ServiceImpl implements ztBug.setLastediteddate(new Date()); ztBug.setStatus("active"); this.baseMapper.updateById(ztBug); + + //删除老的 + this.bugBoundUserService.remove(new QueryWrapper().lambda() + .eq(ZtBugBoundUser::getBugId,ztBug.getId())); + List boundSaveList=new ArrayList<>(); + List boundList = dto.getBoundList(); + if(!CollectionUtils.isEmpty(boundList)){ + for (ZtBugBoundUserDTO ztBugBoundUserDTO:boundList ) { + ZtBugBoundUser bound = new ZtBugBoundUser(); + bound.setBugId(ztBug.getId()); + bound.setAssignedTo(ztBugBoundUserDTO.getAssignedTo()); + boundSaveList.add(bound); + } + }else{ + ZtBugBoundUser bound = new ZtBugBoundUser(); + bound.setBugId(ztBug.getId()); + bound.setAssignedTo(ztBug.getAssignedTo()); + boundSaveList.add(bound); + } + this.bugBoundUserService.saveBatch(boundSaveList); + + + + if(dto.getReleaseId()!=null&&dto.getReleaseId()!=0){ this.releaseService.changeRelease(dto.getReleaseId(),ztBug.getId(),"bug"); }else{ @@ -744,7 +810,7 @@ public class ZtBugServiceImpl extends ServiceImpl implements } if(ztBug.getFeedback()!=null&&ztBug.getFeedback()!=0){ this.storyFeedbackService.feedbackStart(ztBug.getFeedback()); - this.storyFeedbackService.feedbackFinished(ztBug.getFeedback()); + this.storyFeedbackService.feedbackFinished(ztBug.getFeedback(),null); } diff --git a/src/main/java/com/sa/zentao/service/impl/ZtMeetingServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtMeetingServiceImpl.java index 15c1609..db22a79 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtMeetingServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtMeetingServiceImpl.java @@ -267,10 +267,10 @@ public class ZtMeetingServiceImpl extends ServiceImpl userMap = this.userService.userMapByIds(null); diff --git a/src/main/java/com/sa/zentao/service/impl/ZtProjectServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtProjectServiceImpl.java index 92dac80..f78d16f 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtProjectServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtProjectServiceImpl.java @@ -3,6 +3,8 @@ package com.sa.zentao.service.impl; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; @@ -84,6 +86,12 @@ public class ZtProjectServiceImpl extends ServiceImpl pLis = new ArrayList<>() {{ add("develop"); add("test"); @@ -309,6 +317,9 @@ public class ZtProjectServiceImpl extends ServiceImpl updateWrapper = new UpdateWrapper().lambda().set(ZtProject::getStatus, "doing") + .set(ZtProject::getRealEnd,null) + .set(ZtProject::getLastEditedBy, RiskUserThreadLocal.get().getName()) + .set(ZtProject::getLastEditedDate, new Date()) + .eq(ZtProject::getId,dto.getId()) ; + this.baseMapper.update(updateWrapper); ActionType type = null; String product = null; Integer project = null; @@ -1211,8 +1227,6 @@ public class ZtProjectServiceImpl extends ServiceImpl>(workBuildResult(firstDayOfMonth,lastDayOfMonth, uList,list,effList,uMap,qo.getNeedWeek())); } - @Autowired - private IZtCountService countService; @Override public PageInfo pageMonthReport(ZtProjectQo qo) { @@ -1943,18 +1955,16 @@ public class ZtProjectServiceImpl extends ServiceImplo.getEstimate()) .collect(Collectors.toList()))); //准时完成率 - BigDecimal onTimeFinishRate = BigDecimalUtils.isZero(finishAllTime) ? finishAllTime : onTime.divide(finishAllTime, 2, BigDecimal.ROUND_HALF_UP); + BigDecimal onTimeFinishRate = BigDecimalUtils.isZero(finishAllTime) ? finishAllTime : onTime.divide(finishAllTime, 2, BigDecimal.ROUND_UP); d.setTaskFinishOnTimeRate(onTimeFinishRate.multiply(BigDecimal.valueOf(100)) ); }else{ - d.setTaskFinishOnTimeRate(BigDecimalUtils.isZero(d.getTaskCount())?BigDecimal.ZERO:delayList.size()==0?BigDecimal.valueOf(100):BigDecimal.valueOf(100).subtract(BigDecimal.valueOf(delayList.size()).divide(d.getTaskCount(),2,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)))); + d.setTaskFinishOnTimeRate(BigDecimalUtils.isZero(d.getTaskCount())?BigDecimal.ZERO:delayList.size()==0?BigDecimal.valueOf(100):BigDecimal.valueOf(100).subtract(BigDecimal.valueOf(delayList.size()).divide(d.getTaskCount(),2,BigDecimal.ROUND_UP).multiply(BigDecimal.valueOf(100)))); } //任务及时完成率 - List bugList = this.bugService.list(new QueryWrapper().lambda().in(ZtBug::getProduct, products.stream().map(o -> o.getId()).collect(Collectors.toList())) - .eq(ZtBug::getBugType,"prod") - .ge(ZtBug::getOpeneddate, firstDayOfMonth) - .le(ZtBug::getOpeneddate, lastDayOfMonth) - .eq(ZtBug::getAssignedTo, account)); + + List bugList = this.bugService.bugBoundsListByProjectAndDate(products.stream().map(o -> o.getId()).collect(Collectors.toList()), firstDayOfMonth, lastDayOfMonth, account); + bugList =bugList.stream().filter(o->o.getBugType().equals("prod")).collect(Collectors.toList()); d.setBugCount(BigDecimal.valueOf(bugList.size())); result.add(d); diff --git a/src/main/java/com/sa/zentao/service/impl/ZtReleaseServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtReleaseServiceImpl.java index 2f12809..56d28a2 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtReleaseServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtReleaseServiceImpl.java @@ -66,6 +66,8 @@ public class ZtReleaseServiceImpl extends ServiceImpl execStoryPageList(ZtReleaseQo qo) { diff --git a/src/main/java/com/sa/zentao/service/impl/ZtStoryCaseServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtStoryCaseServiceImpl.java index 809572d..f622f85 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtStoryCaseServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtStoryCaseServiceImpl.java @@ -50,7 +50,7 @@ public class ZtStoryCaseServiceImpl extends ServiceImpl myPageList(ZtProjectQo qo) { LambdaQueryWrapper query = new QueryWrapper().lambda(); - query.select(ZtStoryFeedback::getId, - ZtStoryFeedback::getName, - ZtStoryFeedback::getOpenedBy, - ZtStoryFeedback::getFiles, - ZtStoryFeedback::getOpenedDate, - ZtStoryFeedback::getSource, - ZtStoryFeedback::getStatus, - ZtStoryFeedback::getOpenSource, - ZtStoryFeedback::getPlanEndDate, - ZtStoryFeedback::getAssignedTo, - ZtStoryFeedback::getSpec, - ZtStoryFeedback::getFinishDate, - ZtStoryFeedback::getType, - ZtStoryFeedback::getCloseRemark, - ZtStoryFeedback::getProduct, - ZtStoryFeedback::getPlanFinishDate, - ZtStoryFeedback::getHandDate, - ZtStoryFeedback::getCloseDate, - ZtStoryFeedback::getClosedBy, - ZtStoryFeedback::getApprovalRemark, - ZtStoryFeedback::getYsFlag, - ZtStoryFeedback::getDontHandSelect, - ZtStoryFeedback::getDontHandRemark - ); + query.select(SFunctionColums.feedbackColumes()); if (!org.apache.commons.lang3.StringUtils.isEmpty(qo.getSearchVal())) { if ("ALL".equals(qo.getSearchVal())) { } @@ -543,7 +521,7 @@ public class ZtStoryFeedbackServiceImpl extends ServiceImpl"; + } + } + + ztStoryFeedback.setFinishedRemark(buff); + + } this.baseMapper.updateById(ztStoryFeedback); //添加action actionService.addAction(ActionType.WTFK, ActionStatus.CLWC, ztStoryFeedback.getId(), ztStoryFeedback.getProduct() + "", null, null, diff --git a/src/main/java/com/sa/zentao/service/impl/ZtStoryServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtStoryServiceImpl.java index a75420f..e21d44a 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtStoryServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtStoryServiceImpl.java @@ -832,6 +832,11 @@ public class ZtStoryServiceImpl extends ServiceImpl impl } } + @Override + public List getStoryListByDatePidsProject(List pids, Integer id, Date firstDayOfMonth, Date lastDayOfMonth) { + return this.baseMapper.getStoryListByDatePidsProject(pids,id,firstDayOfMonth,lastDayOfMonth); + } + private Map> getTaskCountMap(List list) { List tList = this.taskService.list(new QueryWrapper().lambda() @@ -1133,7 +1138,7 @@ public class ZtStoryServiceImpl extends ServiceImpl impl ZtStory ztStory = this.baseMapper.selectById(story); if (ztStory.getFeedback() != null && ztStory.getFeedback() != 0) { - this.storyFeedbackService.feedbackFinished(ztStory.getFeedback()); + this.storyFeedbackService.feedbackFinished(ztStory.getFeedback(),null); } if (ztStory == null) { @@ -1196,7 +1201,7 @@ public class ZtStoryServiceImpl extends ServiceImpl impl } if (ztStory.getFeedback() != null && ztStory.getFeedback() != 0) { - this.storyFeedbackService.feedbackFinished(ztStory.getFeedback()); + this.storyFeedbackService.feedbackFinished(ztStory.getFeedback(),null); } diff --git a/src/main/java/com/sa/zentao/service/impl/ZtTaskServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtTaskServiceImpl.java index 353bc7f..160e046 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtTaskServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtTaskServiceImpl.java @@ -329,6 +329,7 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme } List taskList = this.list(new QueryWrapper().lambda() .select(SFunctionColums.taskColumes()) + .in(ZtTask::getProduct,pids) .ge(ZtTask::getFinishedDate, firstDayOfMonth).le(ZtTask::getFinishedDate, lastDayOfMonth)); // return this.baseMapper.taskListByPIdsAndDate(pids,firstDayOfMonth,lastDayOfMonth); @@ -492,7 +493,7 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme List userIds = list.stream().map(o -> o.getFinishedby()).collect(Collectors.toList()); userIds.addAll(list.stream().map(o -> o.getAssignedTo()).collect(Collectors.toList())); Map userMap = this.userService.userMapByIds(null); - + Date d=new Date(); for (ZtTaskDTO task : list) { ZtUser ztUser = userMap.get(task.getFinishedby()); if (ztUser != null) { @@ -505,6 +506,20 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme if (task.getDeadline() != null) { task.setDeadline(DateUtils.getDayLast(task.getDeadline())); } + if(task.getFinishedDate()!=null){ + if(task.getFinishedDate().getTime()>DateUtils.getDayLast(task.getDeadline()).getTime()){ + task.setDelayFlag(1); + }else{ + task.setDelayFlag(2); + } + }else{ + if(d.getTime()>DateUtils.getDayLast(task.getDeadline()).getTime()){ + task.setDelayFlag(1); + }else{ + task.setDelayFlag(2); + } + } + } @@ -785,6 +800,7 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme ztTask.setLastediteddate(new Date()); ztTask.setConsumed(dto.getConsumed()); ztTask.setLeft(dto.getLeft() - dto.getConsumed()); + ztTask.setFeedbackRemark(dto.getFeedbackRemark()); if (ztTask.getLeft() < 0) { ztTask.setLeft(0f); } @@ -793,7 +809,7 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme if ("doing".equals(ztTask.getStatus())) { this.storyFeedbackService.feedbackStart(ztTask.getFeedback()); } else { - this.storyFeedbackService.feedbackFinished(ztTask.getFeedback()); + this.storyFeedbackService.feedbackFinished(ztTask.getFeedback(),ztTask.getFeedbackRemark()); } } @@ -907,17 +923,6 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme StringUtils.isEmpty(finishBy) ? RiskUserThreadLocal.get().getName() : finishBy, dto.getRemark(), null); if (ztTask.getExecution() != null && ztTask.getExecution() != 0) { if (StringUtils.isEmpty(dto.getTabType())) { -// KanbanQo qo = new KanbanQo(); -// qo.setStatusType("developed"); -// qo.setTabType("task"); -// qo.setId(dto.getId()); -// //查 -// ZtKanbancell ztKanbanlane = this.kanbanlaneService.getZtKanbanlane("task", "developing", ztTask.getExecution()); -// -// qo.setFromId(ztKanbanlane.getColumn()); -// //查 -// ztKanbanlane = this.kanbanlaneService.getZtKanbanlane("task", "developed", ztTask.getExecution()); -// qo.setToId(ztKanbanlane.getColumn()); kanbanlaneService.changeStatus(ztTask.getExecution(), ztTask.getId(), "task", "developed"); } else { KanbanQo qo = new KanbanQo(); @@ -948,7 +953,7 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme // } } if (ztTask.getFeedback() != null && ztTask.getFeedback() != 0) { - this.storyFeedbackService.feedbackFinished(ztTask.getFeedback()); + this.storyFeedbackService.feedbackFinished(ztTask.getFeedback(),ztTask.getFeedbackRemark()); } } diff --git a/src/main/java/com/sa/zentao/utils/SFunctionColums.java b/src/main/java/com/sa/zentao/utils/SFunctionColums.java index 2eabfd5..74888b0 100644 --- a/src/main/java/com/sa/zentao/utils/SFunctionColums.java +++ b/src/main/java/com/sa/zentao/utils/SFunctionColums.java @@ -63,13 +63,33 @@ public class SFunctionColums { public static List> feedbackColumes(){ List> result=new ArrayList<>(); - result.add(ZtStoryFeedback::getId); - result.add(ZtStoryFeedback::getAssignedTo); - result.add(ZtStoryFeedback::getProduct); - result.add(ZtStoryFeedback::getName); - result.add(ZtStoryFeedback::getStatus); - result.add(ZtStoryFeedback::getSource); - result.add(ZtStoryFeedback::getType); + + + result.add(ZtStoryFeedback::getId); + result.add(ZtStoryFeedback::getName); + result.add(ZtStoryFeedback::getOpenedBy); + result.add(ZtStoryFeedback::getFiles); + result.add(ZtStoryFeedback::getOpenedDate); + result.add(ZtStoryFeedback::getSource); + result.add(ZtStoryFeedback::getStatus); + result.add(ZtStoryFeedback::getOpenSource); + result.add(ZtStoryFeedback::getPlanEndDate); + result.add(ZtStoryFeedback::getAssignedTo); + result.add(ZtStoryFeedback::getSpec); + result.add(ZtStoryFeedback::getFinishDate); + result.add(ZtStoryFeedback::getType); + result.add(ZtStoryFeedback::getCloseRemark); + result.add(ZtStoryFeedback::getProduct); + result.add(ZtStoryFeedback::getPlanFinishDate); + result.add(ZtStoryFeedback::getHandDate); + result.add(ZtStoryFeedback::getCloseDate); + result.add(ZtStoryFeedback::getClosedBy); + result.add(ZtStoryFeedback::getApprovalRemark); + result.add(ZtStoryFeedback::getYsFlag); + result.add(ZtStoryFeedback::getDontHandSelect); + result.add(ZtStoryFeedback::getDontHandRemark); + result.add(ZtStoryFeedback::getFinishedRemark); + return result; } diff --git a/src/main/java/com/sa/zentao/utils/SendEmail.java b/src/main/java/com/sa/zentao/utils/SendEmail.java index 1cb3247..640ffc0 100644 --- a/src/main/java/com/sa/zentao/utils/SendEmail.java +++ b/src/main/java/com/sa/zentao/utils/SendEmail.java @@ -43,8 +43,14 @@ public class SendEmail { String host = "smtp.qiye.163.com"; String port = "587"; - String username = "sino-employee@sino-assistance.com"; - String password = "A112233a"; + String username = "itsm@sino-assistance.com"; + String password = "GKXL@650"; + + +// String host = "smtp.qiye.163.com"; +// String port = "587"; +// String username = "sino-employee@sino-assistance.com"; +// String password = "A112233a"; Properties props = new Properties(); props.put("mail.smtp.host", host); @@ -57,7 +63,7 @@ public class SendEmail { return new PasswordAuthentication(username, password); } }); - + session.setDebug(true); try { MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(username)); @@ -91,13 +97,17 @@ public class SendEmail { // String host = "smtp.qiye.163.com"; // String port = "587"; // String username = "qinglin.yin@do-tec.com.cn"; +// String password = "A112233a"; + +// String host = "smtp.qiye.163.com"; +// String port = "587"; +// String username = "sino-employee@sino-assistance.com"; // String password = "A112233a"; String host = "smtp.qiye.163.com"; String port = "587"; - String username = "sino-employee@sino-assistance.com"; - String password = "A112233a"; - + String username = "itsm@sino-assistance.com"; + String password = "GKXL@650"; // 创建Properties对象,设置SMTP服务器相关信息 Properties props = new Properties(); diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 1ca8788..184c651 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -34,13 +34,24 @@ file: baseUrl: http://192.168.3.200:8013 meeting: /data/buildzentao/meeting.docx +#vx: +# token: vTniTyOG4csBmAnMr +# encodingAesKey : gCmhw7vKLcZwsDszILPNSEqyjgRKODemkYmRFdfelmk +# receiveid: wwa7cc4743271d6055 +# corpid: wwa7cc4743271d6055 +# corpsecret: qQNdRmtanymbshPOLgWTgB-TzX9QmNpVCpOx5suJ2xA +# dkCorpsecret: 1MWQxoL8QtypfdnKJqdo3pGdZDAmdhqTF_MaWm3rVjs +# salaryCorpsecretApp: ib0GyrjV573QdczASCeB-QmCsp0t_QpjsbnQwKBr-Os +# salaryCorpsecretAppUrl: https://qyapi.weixin.qq.com/cgi-bin/message/send +# dkcorpsecret: 1MWQxoL8QtypfdnKJqdo3pGdZDAmdhqTF_MaWm3rVjs vx: + agentld: 1000059 token: vTniTyOG4csBmAnMr encodingAesKey : gCmhw7vKLcZwsDszILPNSEqyjgRKODemkYmRFdfelmk receiveid: wwa7cc4743271d6055 corpid: wwa7cc4743271d6055 corpsecret: qQNdRmtanymbshPOLgWTgB-TzX9QmNpVCpOx5suJ2xA dkCorpsecret: 1MWQxoL8QtypfdnKJqdo3pGdZDAmdhqTF_MaWm3rVjs - salaryCorpsecretApp: ib0GyrjV573QdczASCeB-QmCsp0t_QpjsbnQwKBr-Os + salaryCorpsecretApp: BsgdcmLV5L1jbO7uro9QqdgGQaGItVb_tvfaasAq_3w salaryCorpsecretAppUrl: https://qyapi.weixin.qq.com/cgi-bin/message/send dkcorpsecret: 1MWQxoL8QtypfdnKJqdo3pGdZDAmdhqTF_MaWm3rVjs \ No newline at end of file diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index 76336e5..65f8742 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -52,15 +52,27 @@ file: # #file: # baseUrl: http://127.0.0.1:8085 -vx: - token: DGkygyJELpIY2 - encodingAesKey: Pp2D1vttrxVMoTzocD1SukkRe3IYXQjW5nuOjvc2JRE - receiveid: ww0b2dc90421854148 - corpid: ww0b2dc90421854148 - corpsecret: LRVwfc11K-JQS2nJC8xTPrZLBKmMRZ7nPyGchsVfKF4 -# salaryCorpsecretApp: KlE8J0rMS3W8Hprztl_EnCfAonm34mPpS1B6vaOmzBc - salaryCorpsecretApp: biYcz9e1gIJSsAaTgCZXbcO8Vh9YT11JtaFeZPaPmtU - salaryCorpsecretAppUrl: https://qyapi.weixin.qq.com/cgi-bin/message/send - dkcorpsecret: fMf4nGnkpcYMHq0JzEXx-LcyGvgoxX-DbbCjIjaHqZ0 +#vx: +# agentld: 1000002 +# token: DGkygyJELpIY2 +# encodingAesKey: Pp2D1vttrxVMoTzocD1SukkRe3IYXQjW5nuOjvc2JRE +# receiveid: ww0b2dc90421854148 +# corpid: ww0b2dc90421854148 +# corpsecret: LRVwfc11K-JQS2nJC8xTPrZLBKmMRZ7nPyGchsVfKF4 +# salaryCorpsecretApp: biYcz9e1gIJSsAaTgCZXbcO8Vh9YT11JtaFeZPaPmtU +# salaryCorpsecretAppUrl: https://qyapi.weixin.qq.com/cgi-bin/message/send +# dkcorpsecret: biYcz9e1gIJSsAaTgCZXbcO8Vh9YT11JtaFeZPaPmtU #书籍 -# dkcorpsecret: biYcz9e1gIJSsAaTgCZXbcO8Vh9YT11JtaFeZPaPmtU #书籍 \ No newline at end of file + + +vx: + agentld: 1000059 + token: vTniTyOG4csBmAnMr + encodingAesKey : gCmhw7vKLcZwsDszILPNSEqyjgRKODemkYmRFdfelmk + receiveid: wwa7cc4743271d6055 + corpid: wwa7cc4743271d6055 + corpsecret: qQNdRmtanymbshPOLgWTgB-TzX9QmNpVCpOx5suJ2xA + dkCorpsecret: 1MWQxoL8QtypfdnKJqdo3pGdZDAmdhqTF_MaWm3rVjs + salaryCorpsecretApp: BsgdcmLV5L1jbO7uro9QqdgGQaGItVb_tvfaasAq_3w + salaryCorpsecretAppUrl: https://qyapi.weixin.qq.com/cgi-bin/message/send + dkcorpsecret: 1MWQxoL8QtypfdnKJqdo3pGdZDAmdhqTF_MaWm3rVjs \ No newline at end of file diff --git a/src/main/resources/mapper/ZtBugMapper.xml b/src/main/resources/mapper/ZtBugMapper.xml index b2430bc..3a34f6d 100644 --- a/src/main/resources/mapper/ZtBugMapper.xml +++ b/src/main/resources/mapper/ZtBugMapper.xml @@ -2,295 +2,295 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - SELECT b.id, - b.project, - b.product, - b.injection, - b.identify, - b.branch, - b.module, - b.execution, - b.plan, - b.story, - b.storyVersion, - b.task, - b.toTask, - b.toStory, - b.title, - b.keywords, - b.severity, - b.pri, - b.type, - b.os, - b.browser, - b.hardware, - b.found, - b.`status`, - b.subStatus, - b.color, - b.confirmed, - b.activatedCount, - b.activatedDate, - b.feedbackBy, - b.notifyEmail, - b.mailto, - b.openedBy, - b.openedDate, - b.assignedTo, - b.openedBuild, - b.assignedDate, - b.deadline, - b.resolvedBy, - b.resolution, - b.resolvedBuild, - b.resolvedDate, - b.closedBy, - b.closedDate, - b.duplicateBug, - b.linkBug, - b.caseId, - b.caseVersion, - b.feedback, - b.result, - b.repo, - b.mr, - b.entry, - b.`lines`, - b.v1, - b.v2, - b.repoType, - b.testtask, - b.issueKey, - b.lastEditedBy, - b.lastEditedDate, - b.deleted, - b.file_url, - b.bug_type, - b.ys_user, - b.ys_flag, - b.ys_remark, - b.release_flag, - p.name productName - from zt_bug b left join zt_product p on b.product = p.id - WHERE 1=1 - - and b.project =#{qo.project} - - - and b.bug_type =#{qo.bugType} - + SELECT b.id, + b.project, + b.product, + b.injection, + b.identify, + b.branch, + b.module, + b.execution, + b.plan, + b.story, + b.storyVersion, + b.task, + b.toTask, + b.toStory, + b.title, + b.keywords, + b.severity, + b.pri, + b.type, + b.os, + b.browser, + b.hardware, + b.found, + b.`status`, + b.subStatus, + b.color, + b.confirmed, + b.activatedCount, + b.activatedDate, + b.feedbackBy, + b.notifyEmail, + b.mailto, + b.openedBy, + b.openedDate, + b.assignedTo, + b.openedBuild, + b.assignedDate, + b.deadline, + b.resolvedBy, + b.resolution, + b.resolvedBuild, + b.resolvedDate, + b.closedBy, + b.closedDate, + b.duplicateBug, + b.linkBug, + b.caseId, + b.caseVersion, + b.feedback, + b.result, + b.repo, + b.mr, + b.entry, + b.`lines`, + b.v1, + b.v2, + b.repoType, + b.testtask, + b.issueKey, + b.lastEditedBy, + b.lastEditedDate, + b.deleted, + b.file_url, + b.bug_type, + b.ys_user, + b.ys_flag, + b.ys_remark, + b.release_flag, + p.name productName + from zt_bug b left join zt_product p on b.product = p.id + WHERE 1=1 + + and b.project =#{qo.project} + + + and b.bug_type =#{qo.bugType} + - - and b.id = #{qo.id} - + + and b.id = #{qo.id} + - - and b.title like concat('%', #{qo.name}, '%') - - - and b.severity = #{qo.severity} - + + and b.title like concat('%', #{qo.name}, '%') + + + and b.severity = #{qo.severity} + - - and b.status = #{qo.status} - + + and b.status = #{qo.status} + - - and b.pri = #{qo.pri} - + + and b.pri = #{qo.pri} + - - and b.`type` = #{qo.type} - - - and b.assignedTo = #{qo.assignedTo} - - - and b.openedDate =]]> #{qo.startDate} - - - and b.openedDate #{qo.endDate} - - - and b.openedby = #{qo.openedby} - + + and b.`type` = #{qo.type} + + + and b.assignedTo = #{qo.assignedTo} + + + and b.openedDate =]]> #{qo.startDate} + + + and b.openedDate #{qo.endDate} + + + and b.openedby = #{qo.openedby} + - - and b.openedDate =]]> #{qo.openStartDate} - - - and b.openedDate #{qo.openEndDate} - - - and b.execution =#{qo.execution} - + + and b.openedDate =]]> #{qo.openStartDate} + + + and b.openedDate #{qo.openEndDate} + + + and b.execution =#{qo.execution} + - - and b.product in - - #{id} - + + and b.product in + + #{id} + - + - - and b.id in - - #{id} - + + and b.id in + + #{id} + - + - + - - --- 未关闭 - and b.status !='closed' - - --- 由我创建 - and b.openedBy =#{qo.userName} - - --- 指派给我 - and b.assignedTo =#{qo.userName} - - - -- 由我解决 - and b.resolvedBy =#{qo.userName} - and b.status= 'resolved' - - --- 由我指派 - and b.openedBy =#{qo.userName} - - --- //未解决 - and b.status= 'active' - + + + -- 未关闭 + and b.status !='closed' + + + -- 由我创建 + and b.openedBy =#{qo.userName} + + + -- 指派给我 + and b.assignedTo =#{qo.userName} + + + -- 由我解决 + and b.resolvedBy =#{qo.userName} + and b.status= 'resolved' + + + -- 由我指派 + and b.openedBy =#{qo.userName} + + + -- //未解决 + and b.status= 'active' + - - -- //未确认 - and b.confirmed= 0 - + + -- //未确认 + and b.confirmed= 0 + - - -- //未指派 - and b.assignedTo is null - + + -- //未指派 + and b.assignedTo is null + - - -- //久未处理 + + -- //久未处理 - + - - -- //待关闭 + + -- //待关闭 - - - -- //被延期 - + + + -- //被延期 + - - -- //过期BUG - + + -- //过期BUG + - - -- //研发需求变动 - + + -- //研发需求变动 + - - - - - order by ${qo.orderName} ${qo.orderSort} - - - order by id desc - - - - - order by id desc - - + + + + + order by ${qo.orderName} ${qo.orderSort} + + + order by id desc + + + + + order by id desc + + - + + + SELECT s.id, + s.project, + s.product, + s.injection, + s.identify, + s.branch, + s.module, + s.execution, + s.plan, + s.story, + s.storyVersion, + s.task, + s.toTask, + s.toStory, + s.title, + s.keywords, + s.severity, + s.pri, + s.type, + s.os, + s.browser, + s.hardware, + s.found, + s.`status`, + s.subStatus, + s.color, + s.confirmed, + s.activatedCount, + s.activatedDate, + s.feedbackBy, + s.notifyEmail, + s.mailto, + s.openedBy, + s.openedDate, + s.assignedTo, + s.openedBuild, + s.assignedDate, + s.deadline, + s.resolvedBy, + s.resolution, + s.resolvedBuild, + s.resolvedDate, + s.closedBy, + s.closedDate, + s.duplicateBug, + s.linkBug, + s.caseId, + s.caseVersion, + s.feedback, + s.result, + s.repo, + s.mr, + s.entry, + s.`lines`, + s.v1, + s.v2, + s.repoType, + s.testtask, + s.issueKey, + s.lastEditedBy, + s.lastEditedDate, + s.deleted, + s.file_url, + s.bug_type, + s.ys_user, + s.ys_flag, + s.ys_remark, + s.release_flag + from zt_bug s + WHERE 1=1 + + and s.project in + + #{id} + + + + and openedDate =]]> #{start} + and openedDate #{end} + + + diff --git a/src/main/resources/mapper/ZtReleaseDetailsMapper.xml b/src/main/resources/mapper/ZtReleaseDetailsMapper.xml index 4306b9e..bd39d9a 100644 --- a/src/main/resources/mapper/ZtReleaseDetailsMapper.xml +++ b/src/main/resources/mapper/ZtReleaseDetailsMapper.xml @@ -22,6 +22,11 @@ and details.release_id = #{qo.id} and details.status != 'closed' + + + and s.ys_user = #{qo.ysUser} + + and s.title like concat('%', #{qo.name}, '%') diff --git a/src/main/resources/mapper/ZtStoryFeedbackMapper.xml b/src/main/resources/mapper/ZtStoryFeedbackMapper.xml index 62ee271..6d59641 100644 --- a/src/main/resources/mapper/ZtStoryFeedbackMapper.xml +++ b/src/main/resources/mapper/ZtStoryFeedbackMapper.xml @@ -42,8 +42,8 @@ business_id, ys_flag, dont_hand_select, - dont_hand_remark - + dont_hand_remark, + finished_remark from zt_story_feedback s WHERE 1 = 1 diff --git a/src/main/resources/mapper/ZtStoryMapper.xml b/src/main/resources/mapper/ZtStoryMapper.xml index 906d198..4c9e0a4 100644 --- a/src/main/resources/mapper/ZtStoryMapper.xml +++ b/src/main/resources/mapper/ZtStoryMapper.xml @@ -1105,7 +1105,7 @@ s.user_story, s.ys_user, s.task_count, - s.ys_date, + s.ys_date from zt_story s left join zt_storyreview v on s.id = v.story and s.version = v.version @@ -1121,4 +1121,92 @@ order by s.id desc + diff --git a/src/main/resources/mapper/ZtStoryUserMapper.xml b/src/main/resources/mapper/ZtStoryUserMapper.xml index d037157..66540ff 100644 --- a/src/main/resources/mapper/ZtStoryUserMapper.xml +++ b/src/main/resources/mapper/ZtStoryUserMapper.xml @@ -161,8 +161,18 @@ and s.openedBy = #{qo.openedby} + + - and s.status = #{qo.status} +-- 需求明确中、详细设计、详细设计中、产品已设计、需求待确认 这些查询状态合并成 “需求明确中” + + and s.status in ('unconfirmed' + ,'waitcommunicate' + ,'waitdesign','designdoing','designdone','storyunconfirmed') + + + and s.status = #{qo.status} + diff --git a/src/main/resources/mapper/ZtTaskMapper.xml b/src/main/resources/mapper/ZtTaskMapper.xml index b44b20a..27c0182 100644 --- a/src/main/resources/mapper/ZtTaskMapper.xml +++ b/src/main/resources/mapper/ZtTaskMapper.xml @@ -127,6 +127,18 @@ where 1= 1 + + + + and (date(deadline ) date(finishedDate ) or( finishedDate is null and date(deadline) date(now()))) + + + and (date(deadline ) =]]> date(finishedDate ) or( finishedDate is null and date(deadline) =]]> date(now()))) + + + + + and s.id = #{qo.id} diff --git a/src/main/resources/mapper/ZtYwBackupsMapper.xml b/src/main/resources/mapper/ZtYwBackupsMapper.xml index 1ee95b7..2944696 100644 --- a/src/main/resources/mapper/ZtYwBackupsMapper.xml +++ b/src/main/resources/mapper/ZtYwBackupsMapper.xml @@ -15,6 +15,16 @@ diff --git a/src/main/resources/mapper/ZtYwChangeMapper.xml b/src/main/resources/mapper/ZtYwChangeMapper.xml index 45dd5ac..356556e 100644 --- a/src/main/resources/mapper/ZtYwChangeMapper.xml +++ b/src/main/resources/mapper/ZtYwChangeMapper.xml @@ -24,6 +24,15 @@ SELECT * from zt_yw_change WHERE 1=1 + + and change_effect_date =]]> #{qo.startDate} + + + + and change_effect_date #{qo.endDate} + + + order by id desc diff --git a/src/main/resources/mapper/ZtYwFwqsearchMapper.xml b/src/main/resources/mapper/ZtYwFwqsearchMapper.xml index 00a9757..528797d 100644 --- a/src/main/resources/mapper/ZtYwFwqsearchMapper.xml +++ b/src/main/resources/mapper/ZtYwFwqsearchMapper.xml @@ -17,6 +17,15 @@ diff --git a/src/main/resources/mapper/ZtYwMachineRoomMapper.xml b/src/main/resources/mapper/ZtYwMachineRoomMapper.xml index b0b9db3..7caf033 100644 --- a/src/main/resources/mapper/ZtYwMachineRoomMapper.xml +++ b/src/main/resources/mapper/ZtYwMachineRoomMapper.xml @@ -19,6 +19,14 @@ diff --git a/src/main/resources/mapper/ZtYwPatrolMapper.xml b/src/main/resources/mapper/ZtYwPatrolMapper.xml index b2cc2a2..b537081 100644 --- a/src/main/resources/mapper/ZtYwPatrolMapper.xml +++ b/src/main/resources/mapper/ZtYwPatrolMapper.xml @@ -19,6 +19,13 @@ diff --git a/src/main/resources/mapper/ZtYwTaskMapper.xml b/src/main/resources/mapper/ZtYwTaskMapper.xml index ad1dd36..ba83fdb 100644 --- a/src/main/resources/mapper/ZtYwTaskMapper.xml +++ b/src/main/resources/mapper/ZtYwTaskMapper.xml @@ -18,6 +18,15 @@ diff --git a/src/main/resources/templates/scope/UI工程师.xlsx b/src/main/resources/templates/scope/UI工程师.xlsx index 3d65ac9b4622c5e471508e01361d703d17fd5033..f0662907596277c2e33512f317c3c50e3136ff5b 100644 GIT binary patch delta 3830 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 m?XN@sr>-W99h6d~pb^1V3yWfSyz6dAk# delta 3707 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 diff --git a/src/main/resources/templates/scope/测试工程师.xlsx b/src/main/resources/templates/scope/测试工程师.xlsx index eab7a105f6e9fa6e857026793b0f40bcbffbc56f..92b82747873bcb145e68cd04221af3c80e648fe9 100644 GIT binary patch delta 4416 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 delta 4205 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 diff --git a/src/main/resources/templates/scope/项目助理考核.xlsx b/src/main/resources/templates/scope/项目助理考核.xlsx index d4fd9a2d1afda283b388063179e9106603f8ec5a..37b9d673b04d308bd8275e43939542a392c4638e 100644 GIT binary patch delta 3576 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 delta 3426 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 E0FN$Z5dZ)H diff --git a/src/main/resources/templates/scope/项目经理考核.xlsx b/src/main/resources/templates/scope/项目经理考核.xlsx index e01e98da0d406405e80790decd10b2839edec576..2bb81a8aef35993a8e955231f536a8e16cd90498 100644 GIT binary patch delta 5047 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 NcQzsh?=t`Z004j*U3CBe delta 4823 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 diff --git a/src/main/resources/templates/scope测试.xlsx b/src/main/resources/templates/scope测试.xlsx index 604a9c5e0cfc8a044cccba2920c209ae06f7e142..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 10725 zcmeHNWm{a?(rvtPg1b8e4esvlmf#TF-91Q<;K7~X?(Tu$PH=Y!?r+b`y>~L1d4IvZ z`@`we&*@c9pS@SruG*^=qh)@6k8UP5cBVudgWMbp= zPSxGc#8HpI&Dx4M2NIk*3jhxK{r|>)@eGv4kJ)rHA@rYqx<*nfSHYV%NTq}eed4l_ zG(wJ{V2G0ZM9q${;`1KPT$ljZm9K>N@ZfEK97%cDZ%hX)N`JjjiCu|M>Lk77KGbe% zdq*}L6QtJ72~V*Es2;k#Hhr_?)=6)wL$4*bmB}fgB|=tdM`-oESl1k~Z;omA?O<>+ zLlEL47yco1&eQ!Y7$ zgLS|xewyB)#%BMH#R0G0_7vz{W_d-wi;_ybSazNpB_R0wd1R?~HOC+9??+(>op@?5 z$^_Gg6J^NfbR$oVJ=S>jOgG;HW7zt|yvdiBz{G5Ma~d{eSjB>v&RhB#<^Qjaok8HE;EAN3}Bv0o`p=;j)d95O+? z1!7=6Q{d&1W@(x8awE#ie1W!U)PZKug1xLP!Hb4S<3>3sY*v3PF`ic`re)*a;z5?L z{|$QTEL5znm16aW2|fVi^0*&~kp#Ol?KMRIEG{G$7XWkBomn9KQGzEJm>HEN@ z*c{%bTK9#|C0}N0&Ajmk`&sGy`Xy&$w74?oy{x9#azx*$s7_Y;NN)r7bQ3En(x?`7 z+y3oDV4w{SSVnJ;d-hMH%pR27=SvE7<+p=?(f=${kQEyELZ=P6Ej!!J{ zdtoRK0yPvdD1eug^DC}!E2+DmVNiM(b@(8o;V8-HXXZ4Pu<+mP%52?BlD4=huO)Bh z#v9{*Obthw*pyALt(H2`fiH1KZa3?&!fTBx<*2uTcF4MI{{EPx*cma(V7 z_K^(h<{f7TjJDqp08@H~P?+VlWbk&-T+sffv-CV$9&oL>y)U7>OZ5-72 z42eJ-mY?}SQFcDRo~#^R&ROvgPj+DW5&?z89oDJv_zBJMEwi783-Z|Y0O87%ECyJu zoCFc_IFB%L@Z?m+0+vk@G~cI_-CUJRI(_f+XaQf|=lim#JyX}R!y0;Eki?a|u9-Tc zeS6XdOB-62jz_^}qf2H`?Sc50@i{tkNW`^7>Asl6N8dpwV!6>_L8GTKCkd&>xp{Nd5NXE+fb1?ZV@OO)jYW zUBTFE?T+%Ai@is)9s$sj|D6;WLhX=dkN^N5C}T$dgA|VD1`a01DozgXZOj~hizD&s zGPbxH=x^tgpL@)w>G3K{#FZdLE%MYCoMRsWh6+~Xtcs@iY+q=j5ZNJiw#oIGTt;r8 zoIm5_aGJQK5PfPwR)2=)b7hd95X7u&P4*mnco^kM>daluIqa69$rd$qP}FVR#e$N0 z`>{-PYbNXVXkTHK4+TmLahPuXDw!UtPa}?$A8uI-NF7e=S5^wy$EFq~aCsNM%|?T( ze$uxQhY*KVCHkhco4M*hWdoL`HK$Z64p;By_1)8r_k^7&X7KiWNGWvRDala?{++Xk z$Ky6Bx*}<|A8w8|D#uaP1cfu}nu-V*QA_4vDf*;q+6qJ1?ywi9BOLA9bxu9eCODfs zB@gkC=(tU%70dH2ntd#(_b?pIoVFWJj>bzxjwcAn#S^5#>;yB#u{|jqH51tK$O&$4 zIA;*V=rrfbs3HM^_r4p|qlXtEWNooVX1-q6ti}fkBqcK6EG=*wvHx47@fuiqSuFi^oGrP1i1Um)|+~rs%6tEH%weh42({h zhVR5FCL7&!ax~934D;Lq9uFmM$Ah*khpy2)Kio29zjv)3Qdwe z@v4qpOKzL4l&vjMaHesVqyVgJJ3+{d_%In_>(ax#;w#W;ir7|Xv~Jj}U}&-2B6|{Q z(IzTdK4!%w#9e&$@Ov+hX45`X0r$Xkdra#+*$;E9#&Sm<;XRhh4Z}wG^ z64vE@$JV-*fm|bq%p+WgK{t4UfvofbtD1U0AU>{s*Xm?*EG6iKdV}06+_rIR9i@$F zl=nTv{{D1+FH7i^27IH(H%1c3T;p4?wjrKtu+5t%nh`>R1oNTe8=c*NhKAsmI~bMd z(Nx}VOMY4iMsIz05pa1`LP|cvw{aUZHSYINWNIi^n!CWK0g##SbH?3yD}7iXm}&b@h)ia(mvrI>q+RNLE&Q+qzZVp(ViyKP1prA=ct zo^irE&-FM+;7_r@)vtq-Gzx!qh#)Z@k3wW}sL1d@t>=fdPt^oWP|i!qbOEm#@KvLN zO>j=W<+3{?7}h`vTK^1P__57|wCy9EwTDSenmg;bQa#vN_eK-WNGVwnR0shj%!a9LYk1rk?kt1CqrcNL6c(V_a7o4Hk{M9nD6%XN0|r9FoBx4#^L|Th21&?;7oD zBWQhx%UsttTaA~h@LmH~v__A$FpO#@FG{>-g1ht)51{h7QOI)~x0coy+OG#iUE8k8 zn?0Ia;>q+wonW6r^r=rvhlcA};!7LiXsFzi^BJ`2t*zBsXb++2L>Hc-zpc$0UevWs z#rhgzQD+1D+3})5$ArrnbUah)H}>&5Q_G45U2CWm2bYat*VHHj&jzPTnEYIXj zZwKDaR}O>1iFa$~pMvZv`W=NIEsL0c?ffyg$2mT%DJLU^h`bnrcQcK^ejTwBf-ebU z{hT-A=~F~glxM(slkExNXc{E)4wod=RnrkgZ}wgCy6k$gu_%dm^ce8G^n@#4UU$r# zx^YV-I77uLsF;J?h}$0Sy@`{s%HVLf1d8%;@6Hhp_r^%W0Y8^(?3t$i4v7He2<#?v z23^{{?nnEtM}C=x3Ad6TF-dFfA&QBom<{j|NlEj^c4Gamw55Cj2kQzCI68R@%GBH! zcf5URON0EGSEy+_{6}G?AEKUgN3%qkJw_6cefpQFMBj-J+SRiyk5SuCdN-l)Lao=* zl);IvrobyOM8mosxYp{c$VPtkE9Y@YpFC1NW-x7(o4K}YCuqCoaUu1Q%jZX*erQcA z-M?V}?yH#a;FiHhc}8sIk{_M(s1zUg(nf9TnP~eiT;l+~yY$Alk8tUzajFdOgvP`w z4>K}Nx@I?V+%bm)!Ggzeo_q$3USX}!C(ZyI1`FQGDrW6K=1ZJXfa83{9K zBnEOjaq|~3=8Q1TF(V&v19nIZ)LrQ4xd|~{>mE$LuxkS9Xz40xgewycpua&U`@O=C zXCjLoRf#11uWORF820 znX-BzVH;f3;ZAdnbg_s+Xij9XSg!YtH@!`&Wu?v>bmD?^7mL#bqPC|TbqdPvvOe6d z^KHtGB9F4IDRabnzDAMgdFQIAmIH|z(QqEH@m0DoqVkt8!N`JTLBWJ3x$0c_3Wvo2` z;CD}Q&!dzoORgd_Lt;T~^mJIoti6Cl>d#@KaOiwhDo#oC%}32d<7%I+W3rCtAf=vj zlBOLk-jlZ^sxZ>W<{*vnwch;5J`Z$W!)p)~jc3JkR-iXV*|AHi4vxzBKEjPP7)EZ& zaLq-=z8C}KOZIwR;Ecn|)MbQ?g%+$F6qljtiG43V8VAYAy-s3q*1JjCi5hNbAf8P; zA2luGZ+lIDID)`rLM@IBC65*Zh$t+n+&m-hjTN`GcmiU)dbiTWq|%kPbS{L@YtAwAv< z2(Y9OjpYWM#P$(49WRg1-&UJvP$Pi-ls@OR6$h7t^4)^TgwYAI-c zWT z*JAigu~NGj*qVOtgUQYZ#8YF&5dp}M&LhByJNVYXc9r35;r4Y!F3r@w1-9;A*WM4o z--ADmHrbIhaKNLeCKeCu_LW%Riyf*K+YNdJ#kZ% z$ZG}wYfTuY5thE^uID@ zS<8AWNX%2%Ebhc1vy2oM`2n(=0YO6P4=+vxlU+m;@DMk;B7o6+t<=7=A#dG?W5 zGcBQ?b3T=tDMWK-BoJ!S>iZifcnLnA{9wnjh#m~xFQ!=p$agD4J;-6u6D=v=P>HeP zTI$+}*Zq*=UWoIVlZP9fyr#{?HVW0eSBFLRnVBYlpVi0~T4{%ov(+^y(VjL=3LM#h$X@45X`nBCq_W2)AV@$EOtu;Ym>>DVCVgC`vemjkEG&eDEa%BAd zgPt<-7AWExwEIgN7d?9f_nO4nLAa74hojXOJ zL91wBI~HB8g1-Z+>7w5<<%7d<$lEpUR@puhIt9y{(~fqp)RvE`rM#88@m|M1cKbdn zkN3j|v5p+xRXxGbjgT`TV$|8oew*z56x=F@*9=wUmfP($A{;Dqdm}%O^31{ zaEmoRdeDk}yXHFcK^~yDwmuZ#*omMo3r3gN_UFn3Z`*D?!{XOmEJea$>a68q6DVI! zvTK4Tn_De)3TQWbq>WnrX!s!DKC04(tVlK2^>`ZWCbp)50;R8P0Z272{<`8ea^ZD+ zLQ1_Zun7AI3FEWd^|ygBnE3rv0YpnAw>o`a6Pe46z+sa zimn1IvcNT9(8tAaqin(5dhdaydEnGHQhZp=XY>4}~fXlhxHFqJ?J*%kBJz%{)O_&94G4W-^1;gXTxhu9~U6f z*|oKo;ofFm?$D*H>e^ut_^VT~)m!5u*7It2TU?;sx!tiyG_BHfYU`x0r%Rg9&<{%} z(dzb85ffpwGR2c(np_wLhhy-ZuWEUJmEPZa1R6jQj&!Ehn?LD%ke10l^UT)Avw2Bh zulvyR5jf_E#S1(0+~wDdRrT$kt8F$$0iFazL%6+>BFZ*!^w{%TU z31u00>CDs^Q@pmU9$8y$C)i)D$R4m(;?D`D7Rs(lDM~|&ubMRxN}k$*zQit5t{Q|( zWt0FX&P878QD&XGnD{Et>+a_4@#W;|S;=m4NlV2=qor;k;mOoL{Hkv;Yn#|0-Og%U zn3pkxc8#O+iNUUCe50Pzwt>UeRpH%jD&CY-W~)Nf0~+JkDgjmC@ZM~w;TttD2WijZ z3h0d>W%zn_u4Gycf3KzswIZVX>Zfnj9ZNE<${szVvS%|L38$b1`Fnj326+PG0itpy zh{~^irm~T(gUSE644Sil4X?Nf`EDlc;8QuT(EOX+V?oky*dK7q$w>^LH}s~S1vh73 zTic&O^ZOyMEyJPYOR(%;a67__H$`T_?7*8$MT<}oS zg+xsk1(t#r1ShF+n4_Jp!@&6~>_mcBY?3tG#!akRh%w+I&|Kzb%*RTP$Iki=54(b8 zXwhr7jzAKxZh2ZZU@c$-wE4Rn0~_uA}lh9u%IrbKVz?vv!j!( z_5UdQZ^8lqd9iYqfr2O@r@_xK3lGgi;x*80qEU(-=2`E{#b()Feb=*}tIfXba1}{S zB=mS6-NVCsF(O;-mC)vjp1WTw4R+3a7PQg4Kg|!Nums1lhNDwba8id#!wCzKxNt02 zjdMjTz686;6~scrsmVi+!tzLLZ0&_bmsIN!U+28tDA8=q!yx^QiY8tReG_;-r1^UN zEEoc7WyAa>-0F?MQp)o68;~k-7nIqmzF02RrGtZMg0q1#>8vXlAceF^oFOv8RKWH6 zi(8!!%!-{&L8nTcQ^~3TKc^L|{bvQe)uZ0Mafz0_P%NW?$c>op!OVwVv&d>lZwc6D z+{Y=3#^&!BEkr#K&7>3tB(K5M%j}qPBR8m1H7unaLKZIQZ{>jLw$69P*Z-+Fz`$RF zWW9gxhx>C{|G4{y?l?u6zZ&>!v(C>3@<5{UPpvz@0{_~t@H21``uDT_|EGK5S3AFI z*ne6=g8kjj&x-c1;9s@QKfz@1zk~m#eEw?TS5e|m3#}kU9VDp#DpCAu;Mc>eKMl-a z{P7q5bCmTf^w)y%PiPwMe_s7><>Rkb{+j6hX#)VDB?16`P5XXD|8;Nu8GS|a6Z+pf m?XU2^M!KKj1>`@&{}cBVWuQRx_^mMv9?%5}k4RL%efvM-nJ3Qx