().lambda().eq(ZtProject::getType, "program")
.in(ZtProject::getId,authList)
.eq(ZtProject::getStatus,"doing")
diff --git a/src/main/java/com/sa/zentao/controller/ZtProjectController.java b/src/main/java/com/sa/zentao/controller/ZtProjectController.java
index f9322fb..af3bc50 100644
--- a/src/main/java/com/sa/zentao/controller/ZtProjectController.java
+++ b/src/main/java/com/sa/zentao/controller/ZtProjectController.java
@@ -13,6 +13,7 @@ import com.sa.zentao.service.IZtKanbancolumnService;
import com.sa.zentao.service.IZtKanbanlaneService;
import com.sa.zentao.service.IZtProductService;
import com.sa.zentao.service.IZtProjectService;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.RequestBody;
@@ -22,7 +23,9 @@ import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
/**
*
@@ -34,6 +37,7 @@ import java.util.List;
*/
@RestController
@RequestMapping("/zt-project")
+@Slf4j
public class ZtProjectController {
@Autowired
diff --git a/src/main/java/com/sa/zentao/controller/ZtStoryFeedbackController.java b/src/main/java/com/sa/zentao/controller/ZtStoryFeedbackController.java
index af31a44..b59c2fe 100644
--- a/src/main/java/com/sa/zentao/controller/ZtStoryFeedbackController.java
+++ b/src/main/java/com/sa/zentao/controller/ZtStoryFeedbackController.java
@@ -105,14 +105,14 @@ public class ZtStoryFeedbackController {
//提交验收
@RequestMapping(value = "/submitVerified", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
- public Result submitVerified(@RequestBody ZtStoryDTO dto){
+ public Result submitVerified(@RequestBody ZtStoryFeedbackDTO dto){
storyFeedbackService.submitVerified(dto);
return Result.success();
}
//提交验收
@RequestMapping(value = "/storyYs", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
- public Result storyYs(@RequestBody ZtStoryDTO dto){
+ public Result storyYs(@RequestBody ZtStoryFeedbackDTO dto){
storyFeedbackService.storyYs(dto);
return Result.success();
}
diff --git a/src/main/java/com/sa/zentao/controller/ZtStoryUserController.java b/src/main/java/com/sa/zentao/controller/ZtStoryUserController.java
index 4131a7c..d57146b 100644
--- a/src/main/java/com/sa/zentao/controller/ZtStoryUserController.java
+++ b/src/main/java/com/sa/zentao/controller/ZtStoryUserController.java
@@ -7,11 +7,13 @@ import com.github.pagehelper.PageInfo;
import com.sa.zentao.dao.Result;
import com.sa.zentao.dao.ZtStoryDTO;
import com.sa.zentao.dao.ZtStoryUserDTO;
+import com.sa.zentao.entity.ZtStory;
import com.sa.zentao.entity.ZtStoryUser;
import com.sa.zentao.enums.UserStoryEnums;
import com.sa.zentao.qo.StoryQo;
import com.sa.zentao.qo.ZtProjectQo;
import com.sa.zentao.service.IZtStoryUserService;
+import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
@@ -23,6 +25,7 @@ import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
import java.util.List;
+import java.util.Map;
/**
*
@@ -34,6 +37,7 @@ import java.util.List;
*/
@RestController
@RequestMapping("/zt-story-user")
+@Slf4j
public class ZtStoryUserController {
@Autowired
@@ -68,7 +72,11 @@ public class ZtStoryUserController {
@RequestMapping(value = "/pageList", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
public Result pageList(@RequestBody StoryQo qo){
+ Long l = System.currentTimeMillis();
+ Long l2 = System.currentTimeMillis();
+
PageInfo p = storyUserService.pageList(qo);
+ log.info("总耗时---------------------------------- {}",l2-l);
return Result.success(p);
}
diff --git a/src/main/java/com/sa/zentao/controller/ZtStoryUserspecController.java b/src/main/java/com/sa/zentao/controller/ZtStoryUserspecController.java
new file mode 100644
index 0000000..9b8b859
--- /dev/null
+++ b/src/main/java/com/sa/zentao/controller/ZtStoryUserspecController.java
@@ -0,0 +1,20 @@
+package com.sa.zentao.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ *
+ * 前端控制器
+ *
+ *
+ * @author gqb
+ * @since 2025-04-15
+ */
+@RestController
+@RequestMapping("/zt-story-userspec")
+public class ZtStoryUserspecController {
+
+}
diff --git a/src/main/java/com/sa/zentao/controller/ZtUserController.java b/src/main/java/com/sa/zentao/controller/ZtUserController.java
index 0a72984..bdeaf2c 100644
--- a/src/main/java/com/sa/zentao/controller/ZtUserController.java
+++ b/src/main/java/com/sa/zentao/controller/ZtUserController.java
@@ -24,6 +24,7 @@ import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.sms.v20190711.SmsClient;
import com.tencentcloudapi.sms.v20190711.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20190711.models.SendSmsResponse;
+import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -49,6 +50,7 @@ import java.util.stream.Collectors;
*/
@RestController
@RequestMapping("/zt-user")
+@Slf4j
public class ZtUserController {
@Autowired
@@ -177,24 +179,8 @@ public class ZtUserController {
@RequestMapping(value = "/add", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
public Result add(@RequestBody ZtUserDTO user){
- ZtUser login = userService.getOne(new QueryWrapper().lambda().eq(ZtUser::getAccount, user.getAccount()));
- if(login!=null){
- throw new BusinessException("存在");
- }
- ZtUser ztUser = new ZtUser();
- BeanUtils.copyProperties(user,ztUser);
- List productList = user.getProductList();
- if(!CollectionUtils.isEmpty(productList)){
- ztUser.setProductIds(StringUtils.join(productList,","));
- }
- ztUser.setPinyin(ChineseUtil.getFirst(ztUser.getNickname()));
- if(!StringUtils.isEmpty(ztUser.getVx())){
- ztUser.setVx(CryptoUtils.aesEncryptForFront(ztUser.getVx(), CryptoUtils.KEY_DES));
- }
-
- this.userService.save(ztUser);
- this.actionService.addAction(ActionType.USER, ActionStatus.XJ,ztUser.getId(),null,null,null, RiskUserThreadLocal.get().getName(),null,ztUser.getAccount());
+ userService.addUser(user);
return Result.success();
}
@@ -234,53 +220,24 @@ public class ZtUserController {
@RequestMapping(value = "/modify", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
public Result modify(@RequestBody ZtUserDTO user){
- ZtUser ztUser = userService.getById(user.getId());
+ userService.modifyUser(user);
- if(ztUser==null){
- throw new BusinessException("不存在");
- }
- List list = userService.list(new QueryWrapper().lambda().eq(ZtUser::getAccount, user.getAccount())
- .ne(ZtUser::getId, user.getId())
- );
-
- if(!CollectionUtils.isEmpty(list)){
- throw new BusinessException("请检查用户");
- }
- if(!ztUser.getNickname().equals(user.getNickname())){
- ztUser.setPinyin(ChineseUtil.getFirst(ztUser.getNickname()));
- }
-
- if(!StringUtils.isEmpty(user.getVx())){
- ztUser.setVx(CryptoUtils.aesEncryptForFront(user.getVx(), CryptoUtils.KEY_DES));
- }
-
- ztUser.setAccount(user.getAccount());
-
- ztUser.setPassword(user.getPassword());
- ztUser.setUserType(user.getUserType());
- ztUser.setEmail(user.getEmail());
- ztUser.setPhone(user.getPhone());
- if(!CollectionUtils.isEmpty(user.getProductList())){
- ztUser.setProductIds(StringUtils.join(user.getProductList(),","));
- }
- ztUser.setNickname(user.getNickname());
- ztUser.setColor(user.getColor());
- ztUser.setDeptName(user.getDeptName());
- this.userService.updateById(ztUser);
-// this.userService.update(new UpdateWrapper().lambda()
-// .set(ZtUser::getPassword,user.getPassword())
-// .set(ZtUser::getUserType,user.getUserType())
-// .set(ZtUser::getEmail,user.getEmail())
-// .set(ZtUser::getProductIds,ztUser.getProductIds())
-// .set(ZtUser::getColor,user.getColor())
-// .set(ZtUser::getPhone,user.getPhone())
-// .set(ZtUser::getNickname,user.getNickname())
-// .eq(ZtUser::getId,ztUser.getId())
-// );
- this.actionService.addAction(ActionType.USER, ActionStatus.BJ,ztUser.getId(),null,null,null,RiskUserThreadLocal.get().getName(),null,user.getAccount());
return Result.success();
}
+ @RequestMapping(value = "/updateVx", method = RequestMethod.GET, produces = "application/json; charset=UTF-8")
+ public Result updateVx(){
+ List list = this.userService.list();
+ for (ZtUser u:list) {
+ if(!StringUtils.isEmpty(u.getVx())){
+ u.setVx(CryptoUtils.aesEncryptForFront(u.getVx(), CryptoUtils.KEY_DES));
+ }
+
+ }
+ userService.saveOrUpdateBatch(list);
+ log.info("",list);
+ return Result.success();
+ }
}
diff --git a/src/main/java/com/sa/zentao/dao/BaseMenuDTO.java b/src/main/java/com/sa/zentao/dao/BaseMenuDTO.java
new file mode 100644
index 0000000..0c07d61
--- /dev/null
+++ b/src/main/java/com/sa/zentao/dao/BaseMenuDTO.java
@@ -0,0 +1,71 @@
+package com.sa.zentao.dao;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author jiangheng
+ * @CreateDate in 2021/5/28 16:10
+ */
+@Data
+public class BaseMenuDTO implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+ /**
+ * 主键
+ */
+ private Integer id;
+
+ /**
+ * 父id
+ */
+ private Integer parentId;
+
+ /**
+ * 名称
+ */
+ private String name;
+ /**
+ * 路径
+ */
+ private String action;
+ /**
+ * 排序
+ */
+ private Integer sort;
+
+ private Integer isSys;
+ /**
+ * 样式
+ */
+ private String icon;
+
+ /**
+ * 更新时间
+ */
+ private Date createTime;
+
+ /**
+ * 更新时间
+ */
+ private Date updateTime;
+
+ /**
+ * 级别 1父菜单 2子菜单 3按钮
+ */
+ private Integer level;
+ private Integer menuType;
+
+ private List menuList;
+
+ public void add(BaseMenuDTO t) {
+ if (menuList == null) {
+ menuList = new ArrayList<>();
+ }
+ menuList.add(t);
+ }
+}
diff --git a/src/main/java/com/sa/zentao/dao/BaseRoleDTO.java b/src/main/java/com/sa/zentao/dao/BaseRoleDTO.java
new file mode 100644
index 0000000..d5df23a
--- /dev/null
+++ b/src/main/java/com/sa/zentao/dao/BaseRoleDTO.java
@@ -0,0 +1,79 @@
+package com.sa.zentao.dao;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ *
+ *
+ *
+ *
+ * @author jobob
+ * @since 2021-05-28
+ */
+@Data
+public class BaseRoleDTO implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ /**
+ * 名称
+ */
+ private String name;
+
+ private Integer roleType;
+
+ /**
+ * 创建时间
+ */
+ private Date createTime;
+
+ /**
+ * 更新时间
+ */
+ private Date updateTime;
+
+ /**
+ * 角色备注
+ */
+ private String remark;
+
+ /**
+ * 1删除 0有效
+ */
+ private Integer deleteFlag;
+
+ /**
+ * 创建时间
+ */
+ private String createUser;
+
+ /**
+ * 更新时间
+ */
+ private String updateUser;
+
+
+// private List listMenu;
+
+
+ /**
+ * 全选菜单id
+ */
+ private String allPickMenuIds;
+
+ /**
+ * 半选菜单id
+ */
+ private String halfPickMenuIds;
+
+ private Integer menuType;
+
+}
diff --git a/src/main/java/com/sa/zentao/dao/PerformanceDTO.java b/src/main/java/com/sa/zentao/dao/PerformanceDTO.java
index 670cc9e..f2d232d 100644
--- a/src/main/java/com/sa/zentao/dao/PerformanceDTO.java
+++ b/src/main/java/com/sa/zentao/dao/PerformanceDTO.java
@@ -23,6 +23,16 @@ public class PerformanceDTO implements Serializable {
// 小时
@ExcelIgnore
private BigDecimal approvalDays;
+ //发布验收绩效
+ @ExcelIgnore
+ private BigDecimal releaseScore=BigDecimal.ZERO;
+ //会议绩效
+ @ExcelIgnore
+ private BigDecimal meetScore=BigDecimal.ZERO;
+
+ //拆分任务工时
+ @ExcelIgnore
+ private BigDecimal splitTimeScore=BigDecimal.ZERO;
//实际产出工时
@ExcelProperty(value = "可用工时",index =3)
private BigDecimal totalTime;
@@ -47,15 +57,20 @@ public class PerformanceDTO implements Serializable {
@ExcelProperty(value = "完成准时率 ",index =11)
private BigDecimal finishPunctuality;
@ExcelProperty(value = "准时率得分 ",index =12)
- private BigDecimal punctualityScore;
+ private BigDecimal punctualityScore=BigDecimal.ZERO;
@ExcelProperty(value = "线上严重bug ",index =13)
private BigDecimal seriousBug;
+ //缺陷检出率
+ @ExcelIgnore
+ private BigDecimal bugFindScore;
//产出线上Bug
@ExcelProperty(value = "线上普通bug ",index =14)
private BigDecimal slightBug;
+ @ExcelIgnore
+ private BigDecimal bugCount=BigDecimal.ZERO;
//线上Bug得分
@ExcelProperty(value = "线上Bug得分 ",index =15)
- private BigDecimal bugScore;
+ private BigDecimal bugScore=BigDecimal.ZERO;
//产出线上Bug
@ExcelProperty(value = "总分 ",index =16)
private BigDecimal score;
diff --git a/src/main/java/com/sa/zentao/dao/ZtComputerSourceDTO.java b/src/main/java/com/sa/zentao/dao/ZtComputerSourceDTO.java
index d6d0883..1d7b02b 100644
--- a/src/main/java/com/sa/zentao/dao/ZtComputerSourceDTO.java
+++ b/src/main/java/com/sa/zentao/dao/ZtComputerSourceDTO.java
@@ -100,5 +100,6 @@ public class ZtComputerSourceDTO implements Serializable {
private Date updateDate;
+ private String code;
}
diff --git a/src/main/java/com/sa/zentao/dao/ZtMeetingDTO.java b/src/main/java/com/sa/zentao/dao/ZtMeetingDTO.java
index 445fa59..735997a 100644
--- a/src/main/java/com/sa/zentao/dao/ZtMeetingDTO.java
+++ b/src/main/java/com/sa/zentao/dao/ZtMeetingDTO.java
@@ -71,7 +71,8 @@ public class ZtMeetingDTO implements Serializable {
private String title;
- private Integer userStory;
private String userStoryName;
+
+ private String storyIds;
}
diff --git a/src/main/java/com/sa/zentao/dao/ZtReleaseDTO.java b/src/main/java/com/sa/zentao/dao/ZtReleaseDTO.java
index 3f0ce1e..5e4144b 100644
--- a/src/main/java/com/sa/zentao/dao/ZtReleaseDTO.java
+++ b/src/main/java/com/sa/zentao/dao/ZtReleaseDTO.java
@@ -88,6 +88,8 @@ public class ZtReleaseDTO implements Serializable {
private String assignedToName;
private Date releaseDate;
+ //真实发布时间
+ private Date realReleaseDate;
private String noticeTitle;
diff --git a/src/main/java/com/sa/zentao/dao/ZtStoryDTO.java b/src/main/java/com/sa/zentao/dao/ZtStoryDTO.java
index f98b0a9..77be092 100644
--- a/src/main/java/com/sa/zentao/dao/ZtStoryDTO.java
+++ b/src/main/java/com/sa/zentao/dao/ZtStoryDTO.java
@@ -141,7 +141,7 @@ public class ZtStoryDTO implements Serializable {
@TableField("releasedDate")
private Date releaseddate;
-
+ private Date planYsDate;
@TableField("closedBy")
private String closedby;
diff --git a/src/main/java/com/sa/zentao/dao/ZtStoryFeedbackDTO.java b/src/main/java/com/sa/zentao/dao/ZtStoryFeedbackDTO.java
index 1c63255..73b2faa 100644
--- a/src/main/java/com/sa/zentao/dao/ZtStoryFeedbackDTO.java
+++ b/src/main/java/com/sa/zentao/dao/ZtStoryFeedbackDTO.java
@@ -116,4 +116,8 @@ public class ZtStoryFeedbackDTO implements Serializable {
//1通过 2不通过
private Integer ysFlag;
+ private String desc;
+ // 1通过 2不通过
+ private Integer revieweResult;
+
}
diff --git a/src/main/java/com/sa/zentao/dao/ZtUserDTO.java b/src/main/java/com/sa/zentao/dao/ZtUserDTO.java
index 7ca86e0..6382ae9 100644
--- a/src/main/java/com/sa/zentao/dao/ZtUserDTO.java
+++ b/src/main/java/com/sa/zentao/dao/ZtUserDTO.java
@@ -130,7 +130,12 @@ public class ZtUserDTO implements Serializable {
private String userTypeValue;
+ private String roleTypeValue;
+
private List productList;
+
+ private List roleList;
+
private String productIds;
private String productNames;
diff --git a/src/main/java/com/sa/zentao/entity/BaseMenu.java b/src/main/java/com/sa/zentao/entity/BaseMenu.java
new file mode 100644
index 0000000..388bb0f
--- /dev/null
+++ b/src/main/java/com/sa/zentao/entity/BaseMenu.java
@@ -0,0 +1,70 @@
+package com.sa.zentao.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ *
+ *
+ *
+ *
+ * @author jobob
+ * @since 2021-05-28
+ */
+@Data
+public class BaseMenu implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ /**
+ * 父id
+ */
+ private Integer parentId;
+
+ /**
+ * 名称
+ */
+ private String name;
+ /**
+ * 路径
+ */
+ private String action;
+ /**
+ * 排序
+ */
+ private Integer sort;
+
+ private Integer isSys;
+ /**
+ * 样式
+ */
+ private String icon;
+
+ /**
+ * 更新时间
+ */
+ private Date createTime;
+
+ /**
+ * 更新时间
+ */
+ private Date updateTime;
+
+ /**
+ * 级别 1父菜单 2子菜单 3按钮
+ */
+ private Integer level;
+
+ // 1菜单 2.按钮
+ private Integer menuType;
+}
diff --git a/src/main/java/com/sa/zentao/entity/BaseRole.java b/src/main/java/com/sa/zentao/entity/BaseRole.java
new file mode 100644
index 0000000..6d6aa6c
--- /dev/null
+++ b/src/main/java/com/sa/zentao/entity/BaseRole.java
@@ -0,0 +1,64 @@
+package com.sa.zentao.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ *
+ *
+ *
+ *
+ * @author jobob
+ * @since 2021-05-28
+ */
+@Data
+public class BaseRole implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ /**
+ * 名称
+ */
+ private String name;
+
+ private Integer roleType;
+
+ /**
+ * 创建时间
+ */
+ private Date createTime;
+
+ /**
+ * 更新时间
+ */
+ private Date updateTime;
+
+ /**
+ * 角色备注
+ */
+ private String remark;
+
+ /**
+ * 1删除 0有效
+ */
+ private Integer deleteFlag;
+
+ /**
+ * 创建者
+ */
+ private String createUser;
+
+ /**
+ * 修改者
+ */
+ private String updateUser;
+
+
+}
diff --git a/src/main/java/com/sa/zentao/entity/BaseRoleAuthority.java b/src/main/java/com/sa/zentao/entity/BaseRoleAuthority.java
new file mode 100644
index 0000000..9d5723b
--- /dev/null
+++ b/src/main/java/com/sa/zentao/entity/BaseRoleAuthority.java
@@ -0,0 +1,57 @@
+package com.sa.zentao.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.sa.zentao.enums.PickEnum;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ *
+ *
+ *
+ *
+ * @author jobob
+ * @since 2021-05-31
+ */
+@Data
+public class BaseRoleAuthority implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * id
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 角色id
+ */
+ private Integer roleId;
+
+ /**
+ * 菜单id
+ */
+ private Integer menuId;
+
+ /**
+ * 1、全选 2、半选
+ */
+ private PickEnum type;
+
+ /**
+ * 创建时间
+ */
+ private Date createTime;
+
+ /**
+ * 更新时间
+ */
+ private Date updateTime;
+
+
+}
diff --git a/src/main/java/com/sa/zentao/entity/BaseUserRole.java b/src/main/java/com/sa/zentao/entity/BaseUserRole.java
new file mode 100644
index 0000000..ca3cb08
--- /dev/null
+++ b/src/main/java/com/sa/zentao/entity/BaseUserRole.java
@@ -0,0 +1,41 @@
+package com.sa.zentao.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import java.util.Date;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ *
+ *
+ *
+ *
+ * @author gqb
+ * @since 2025-04-16
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class BaseUserRole implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ private Integer roleId;
+
+ /**
+ * 门店用户
+ */
+ private String userId;
+
+ private Date createTime;
+
+ private Date updateTime;
+
+
+}
diff --git a/src/main/java/com/sa/zentao/entity/ZtActionrecent.java b/src/main/java/com/sa/zentao/entity/ZtActionrecent.java
index 1f9182a..93dbb4c 100644
--- a/src/main/java/com/sa/zentao/entity/ZtActionrecent.java
+++ b/src/main/java/com/sa/zentao/entity/ZtActionrecent.java
@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.TableField;
import java.io.Serializable;
+import java.util.Date;
+
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -41,7 +43,7 @@ public class ZtActionrecent implements Serializable {
private String action;
- private LocalDateTime date;
+ private Date date;
private String comment;
diff --git a/src/main/java/com/sa/zentao/entity/ZtBug.java b/src/main/java/com/sa/zentao/entity/ZtBug.java
index 781ecad..4fac4ba 100644
--- a/src/main/java/com/sa/zentao/entity/ZtBug.java
+++ b/src/main/java/com/sa/zentao/entity/ZtBug.java
@@ -194,13 +194,12 @@ public class ZtBug implements Serializable {
private String fileUrl;
-
+ // dev prod
private String bugType;
private String ysUser;
//1 通过 2不通过
private Integer ysFlag;
private String ysRemark;
- @TableField(exist = false)
private Integer releaseFlag;
}
diff --git a/src/main/java/com/sa/zentao/entity/ZtComputerSource.java b/src/main/java/com/sa/zentao/entity/ZtComputerSource.java
index 6763bfd..b658f1f 100644
--- a/src/main/java/com/sa/zentao/entity/ZtComputerSource.java
+++ b/src/main/java/com/sa/zentao/entity/ZtComputerSource.java
@@ -101,5 +101,5 @@ public class ZtComputerSource implements Serializable {
private Date updateDate;
-
+ private String code;
}
diff --git a/src/main/java/com/sa/zentao/entity/ZtMeeting.java b/src/main/java/com/sa/zentao/entity/ZtMeeting.java
index e0a8289..033401e 100644
--- a/src/main/java/com/sa/zentao/entity/ZtMeeting.java
+++ b/src/main/java/com/sa/zentao/entity/ZtMeeting.java
@@ -66,6 +66,8 @@ public class ZtMeeting implements Serializable {
private String address;
private String title;
- private Integer userStory;
+// private Integer userStory;
+
+ private String storyIds;
}
diff --git a/src/main/java/com/sa/zentao/entity/ZtRelease.java b/src/main/java/com/sa/zentao/entity/ZtRelease.java
index 9366dc6..1a50cab 100644
--- a/src/main/java/com/sa/zentao/entity/ZtRelease.java
+++ b/src/main/java/com/sa/zentao/entity/ZtRelease.java
@@ -80,7 +80,9 @@ public class ZtRelease implements Serializable {
private String executions;
@TableField("`level`")
private String level;
-
+ //真实发布时间
+ @TableField(exist = false)
+ private Date realReleaseDate;
private String danger;
private String assignedTo;
diff --git a/src/main/java/com/sa/zentao/entity/ZtStoryFeedback.java b/src/main/java/com/sa/zentao/entity/ZtStoryFeedback.java
index f2c99cb..45d422b 100644
--- a/src/main/java/com/sa/zentao/entity/ZtStoryFeedback.java
+++ b/src/main/java/com/sa/zentao/entity/ZtStoryFeedback.java
@@ -70,7 +70,7 @@ public class ZtStoryFeedback implements Serializable {
private String spec;
- // wait doing finished submitVerified 提交验收 closed reviewing verified 验收 dontHand 无需处理
+ // wait doing finished submitVerified 提交验收 closed reviewing verified 验收 dontHand 无需处理 (查询用noVerified 验收不通过)
private String status;
diff --git a/src/main/java/com/sa/zentao/entity/ZtStoryUserspec.java b/src/main/java/com/sa/zentao/entity/ZtStoryUserspec.java
new file mode 100644
index 0000000..005bdb6
--- /dev/null
+++ b/src/main/java/com/sa/zentao/entity/ZtStoryUserspec.java
@@ -0,0 +1,35 @@
+package com.sa.zentao.entity;
+
+import java.sql.Blob;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ *
+ *
+ *
+ *
+ * @author gqb
+ * @since 2025-04-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class ZtStoryUserspec implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ private Integer story;
+
+ private Integer version;
+
+ private String title;
+
+ private String spec;
+
+ private String verify;
+
+ private String files;
+
+
+}
diff --git a/src/main/java/com/sa/zentao/enums/ActionStatus.java b/src/main/java/com/sa/zentao/enums/ActionStatus.java
index 3dbcd12..61bafb6 100644
--- a/src/main/java/com/sa/zentao/enums/ActionStatus.java
+++ b/src/main/java/com/sa/zentao/enums/ActionStatus.java
@@ -12,7 +12,7 @@ public enum ActionStatus {
SC(6, "deleted","删除"),
JH(7, "activated","激活"),
GQ(8, "suspended","挂起"),
- PS(9, "submitreview","提交评审人"),
+ PS(9, "submitreview","提交至评审"),
CX(9, "recalled","撤销评审"),
WC(10, "finished","完成"),
QX(11, "canceled","取消"),
diff --git a/src/main/java/com/sa/zentao/enums/BaseMenuLevelEnum.java b/src/main/java/com/sa/zentao/enums/BaseMenuLevelEnum.java
new file mode 100644
index 0000000..83dc434
--- /dev/null
+++ b/src/main/java/com/sa/zentao/enums/BaseMenuLevelEnum.java
@@ -0,0 +1,31 @@
+package com.sa.zentao.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+
+/**
+ * @author jiangheng
+ * @CreateDate in 2021/5/28 15:14
+ */
+public enum BaseMenuLevelEnum {
+
+ PARENT_MENU(1, "父菜单"),
+ CHILD_MENU(2,"二级子菜单"),
+ BUTTON(2,"按钮");
+
+ @EnumValue//标记数据库存的值是code
+ private int code;
+ private String value;
+
+ BaseMenuLevelEnum(int code, String value) {
+ this.code = code;
+ this.value = value;
+ }
+
+ public int getCode() {
+ return code;
+ }
+
+ public String getValue() {
+ return value;
+ }
+}
diff --git a/src/main/java/com/sa/zentao/enums/PickEnum.java b/src/main/java/com/sa/zentao/enums/PickEnum.java
new file mode 100644
index 0000000..2583b9a
--- /dev/null
+++ b/src/main/java/com/sa/zentao/enums/PickEnum.java
@@ -0,0 +1,30 @@
+//
+// Source code recreated from a .class file by IntelliJ IDEA
+// (powered by Fernflower decompiler)
+//
+
+package com.sa.zentao.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+
+public enum PickEnum {
+ ALL_PICK(1, "全选"),
+ HALF_PICK(2, "半选");
+
+ @EnumValue
+ private int code;
+ private String value;
+
+ private PickEnum(int code, String value) {
+ this.code = code;
+ this.value = value;
+ }
+
+ public int getCode() {
+ return this.code;
+ }
+
+ public String getValue() {
+ return this.value;
+ }
+}
diff --git a/src/main/java/com/sa/zentao/enums/UserStoryEnums.java b/src/main/java/com/sa/zentao/enums/UserStoryEnums.java
index 9f08f06..a7e2429 100644
--- a/src/main/java/com/sa/zentao/enums/UserStoryEnums.java
+++ b/src/main/java/com/sa/zentao/enums/UserStoryEnums.java
@@ -7,7 +7,7 @@ public enum UserStoryEnums {
DPS("reviewing", "待评审",0),
CG("draft", "草稿",1),
JH("active", "激活",2),
- UNCFM("unconfirmed", "产品确认中",3),
+ UNCFM("unconfirmed", "需求明确中",3),
DGT("waitcommunicate", "待沟通",4),
DSJ("waitdesign","需求待设计",5),
diff --git a/src/main/java/com/sa/zentao/enums/UserType.java b/src/main/java/com/sa/zentao/enums/UserType.java
index ccbe2b2..b6ea646 100644
--- a/src/main/java/com/sa/zentao/enums/UserType.java
+++ b/src/main/java/com/sa/zentao/enums/UserType.java
@@ -4,12 +4,15 @@ import com.baomidou.mybatisplus.annotation.EnumValue;
public enum UserType {
- CP(1,"产品"),
+ CP(1,"需求"),
XMGLY(2, "项目管理员"),
KFZ(3, "开发者"),
GSGC(4, "公司高层"),
CS(5, "测试人员"),
YW(6, "运维"),
+ UI(7, "UI工程师"),
+ XMJL(8, "项目经理"),
+ XMZL(9, "项目助理"),
;
@EnumValue
diff --git a/src/main/java/com/sa/zentao/mapper/BaseMenuMapper.java b/src/main/java/com/sa/zentao/mapper/BaseMenuMapper.java
new file mode 100644
index 0000000..acf8e50
--- /dev/null
+++ b/src/main/java/com/sa/zentao/mapper/BaseMenuMapper.java
@@ -0,0 +1,30 @@
+package com.sa.zentao.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sa.zentao.entity.BaseMenu;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author jobob
+ * @since 2021-05-28
+ */
+public interface BaseMenuMapper extends BaseMapper {
+
+ List findAll();
+
+ void deleteWithChild(Integer id);
+
+ List selectMenuByParentId(@Param("parentId") Integer parentId);
+
+ List queryListByLoginUser(@Param("riskUserId") String riskUserId);
+
+ List findMenuIds(Integer id);
+
+ List queryAllList();
+}
diff --git a/src/main/java/com/sa/zentao/mapper/BaseRoleAuthorityMapper.java b/src/main/java/com/sa/zentao/mapper/BaseRoleAuthorityMapper.java
new file mode 100644
index 0000000..6d0a579
--- /dev/null
+++ b/src/main/java/com/sa/zentao/mapper/BaseRoleAuthorityMapper.java
@@ -0,0 +1,25 @@
+package com.sa.zentao.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sa.zentao.entity.BaseRoleAuthority;
+import com.sa.zentao.enums.PickEnum;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author jobob
+ * @since 2021-05-31
+ */
+public interface BaseRoleAuthorityMapper extends BaseMapper {
+
+ Integer deleteByRoleId(@Param("roleId") Integer roleId);
+
+ void deleteRoleAndMenu(@Param("roleIds") List roleIds, @Param("menuIds") List menuIds);
+
+ String findMenuIdById(@Param("roleId") Integer id, @Param("pickEnum") PickEnum pickEnum);
+}
diff --git a/src/main/java/com/sa/zentao/mapper/BaseRoleMapper.java b/src/main/java/com/sa/zentao/mapper/BaseRoleMapper.java
new file mode 100644
index 0000000..c2ab2aa
--- /dev/null
+++ b/src/main/java/com/sa/zentao/mapper/BaseRoleMapper.java
@@ -0,0 +1,24 @@
+package com.sa.zentao.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sa.zentao.dao.BaseRoleDTO;
+import com.sa.zentao.entity.BaseRole;
+import com.sa.zentao.qo.BaseRoleQo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author jobob
+ * @since 2021-05-28
+ */
+public interface BaseRoleMapper extends BaseMapper {
+
+ List selectRoleByVo(@Param("vo") BaseRoleQo vo);
+
+ BaseRoleDTO findRoleById(@Param("id") Integer id);
+}
diff --git a/src/main/java/com/sa/zentao/mapper/BaseUserRoleMapper.java b/src/main/java/com/sa/zentao/mapper/BaseUserRoleMapper.java
new file mode 100644
index 0000000..cd8a92a
--- /dev/null
+++ b/src/main/java/com/sa/zentao/mapper/BaseUserRoleMapper.java
@@ -0,0 +1,20 @@
+package com.sa.zentao.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sa.zentao.entity.BaseUserRole;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author jobob
+ * @since 2021-06-01
+ */
+public interface BaseUserRoleMapper extends BaseMapper {
+
+ void insertUserRole(@Param("id") Long id, @Param("roleId") String[] roleId);
+
+ String getRoleIdsById(@Param("id") Long id);
+}
diff --git a/src/main/java/com/sa/zentao/mapper/ZtStoryUserspecMapper.java b/src/main/java/com/sa/zentao/mapper/ZtStoryUserspecMapper.java
new file mode 100644
index 0000000..4b23a67
--- /dev/null
+++ b/src/main/java/com/sa/zentao/mapper/ZtStoryUserspecMapper.java
@@ -0,0 +1,16 @@
+package com.sa.zentao.mapper;
+
+import com.sa.zentao.entity.ZtStoryUserspec;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author gqb
+ * @since 2025-04-15
+ */
+public interface ZtStoryUserspecMapper extends BaseMapper {
+
+}
diff --git a/src/main/java/com/sa/zentao/qo/BaseMenuQo.java b/src/main/java/com/sa/zentao/qo/BaseMenuQo.java
new file mode 100644
index 0000000..067afdf
--- /dev/null
+++ b/src/main/java/com/sa/zentao/qo/BaseMenuQo.java
@@ -0,0 +1,58 @@
+package com.sa.zentao.qo;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author jiangheng
+ * @CreateDate in 2021/5/28 15:21
+ */
+@Data
+public class BaseMenuQo extends BaseQo {
+
+ /**
+ * 主键
+ */
+ private Integer id;
+ /**
+ * 父id
+ */
+ private Integer parentId;
+
+ /**
+ * 名称
+ */
+ private String name;
+ /**
+ * 路径
+ */
+ private String action;
+ /**
+ * 排序
+ */
+ private Integer sort;
+
+ private Integer isSys;
+ /**
+ * 样式
+ */
+ private String icon;
+
+ /**
+ * 更新时间
+ */
+ private Date createTime;
+
+ /**
+ * 更新时间
+ */
+ private Date updateTime;
+
+ /**
+ * 级别 1父菜单 2子菜单 3按钮
+ */
+ private Integer level;
+ // 1菜单 2.按钮
+ private Integer menuType;
+}
diff --git a/src/main/java/com/sa/zentao/qo/BaseRoleQo.java b/src/main/java/com/sa/zentao/qo/BaseRoleQo.java
new file mode 100644
index 0000000..297916a
--- /dev/null
+++ b/src/main/java/com/sa/zentao/qo/BaseRoleQo.java
@@ -0,0 +1,60 @@
+package com.sa.zentao.qo;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class BaseRoleQo implements Serializable {
+ @ExcelIgnore
+ private Integer currentPage = 1;
+ @ExcelIgnore
+ private Integer pageSize = 20;
+ @ExcelIgnore
+ private Date startDate;
+ @ExcelIgnore
+ private Date endDate;
+
+ private Integer userId;
+ private String account;
+ private Integer roleId;
+ /**
+ * 名称
+ */
+ private String name;
+
+ private Integer roleType;
+
+ /**
+ * 创建时间
+ */
+ private Date createTime;
+
+ /**
+ * 更新时间
+ */
+ private Date updateTime;
+
+ /**
+ * 角色备注
+ */
+ private String remark;
+
+ /**
+ * 1删除 0有效
+ */
+ private Integer deleteFlag;
+
+ /**
+ * 创建者
+ */
+ private String createUser;
+
+ /**
+ * 修改者
+ */
+ private String updateUser;
+
+}
diff --git a/src/main/java/com/sa/zentao/service/IBaseMenuService.java b/src/main/java/com/sa/zentao/service/IBaseMenuService.java
new file mode 100644
index 0000000..57982d8
--- /dev/null
+++ b/src/main/java/com/sa/zentao/service/IBaseMenuService.java
@@ -0,0 +1,36 @@
+package com.sa.zentao.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.sa.zentao.conf.LoginRiskUser;
+import com.sa.zentao.dao.BaseMenuDTO;
+import com.sa.zentao.entity.BaseMenu;
+import com.sa.zentao.qo.BaseMenuQo;
+
+import java.util.List;
+
+/**
+ *
+ * 服务类
+ *
+ *
+ * @author jobob
+ * @since 2021-05-28
+ */
+public interface IBaseMenuService extends IService {
+
+ String saveMenu(BaseMenuQo vo, LoginRiskUser loginRiskUser);
+
+ BaseMenu selectById(Integer id);
+
+ String deleteMenu(Integer id, LoginRiskUser loginRiskUser);
+
+ String moveUp(Integer id);
+
+ String moveDown(Integer id);
+
+ List queryListByLoginUser(String riskUserId);
+
+ List menuTree(LoginRiskUser loginRiskUser);
+
+ List baseMenuTree();
+}
diff --git a/src/main/java/com/sa/zentao/service/IBaseRoleAuthorityService.java b/src/main/java/com/sa/zentao/service/IBaseRoleAuthorityService.java
new file mode 100644
index 0000000..76d3cc8
--- /dev/null
+++ b/src/main/java/com/sa/zentao/service/IBaseRoleAuthorityService.java
@@ -0,0 +1,18 @@
+package com.sa.zentao.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.sa.zentao.entity.BaseRoleAuthority;
+
+/**
+ *
+ * 服务类
+ *
+ *
+ * @author jobob
+ * @since 2021-05-31
+ */
+public interface IBaseRoleAuthorityService extends IService {
+
+ Integer deleteByRoleId(Integer roleId);
+
+}
diff --git a/src/main/java/com/sa/zentao/service/IBaseRoleService.java b/src/main/java/com/sa/zentao/service/IBaseRoleService.java
new file mode 100644
index 0000000..8953e89
--- /dev/null
+++ b/src/main/java/com/sa/zentao/service/IBaseRoleService.java
@@ -0,0 +1,35 @@
+package com.sa.zentao.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.github.pagehelper.PageInfo;
+import com.sa.zentao.dao.BaseRoleDTO;
+import com.sa.zentao.entity.BaseRole;
+import com.sa.zentao.qo.BaseRoleQo;
+
+import java.util.List;
+
+/**
+ *
+ * 服务类
+ *
+ *
+ * @author jobob
+ * @since 2021-05-28
+ */
+public interface IBaseRoleService extends IService {
+
+ void modify(BaseRoleDTO baseRoleDTO, BaseRole baseRole);
+
+ void add(BaseRoleDTO baseRoleDTO);
+
+ PageInfo selectPageList(BaseRoleQo vo);
+
+ BaseRoleDTO getInfoById(Integer id);
+
+ void delete(BaseRole baseRole, BaseRoleQo baseRoleVo);
+
+ List getUserRoleIds(String account);
+
+
+
+}
diff --git a/src/main/java/com/sa/zentao/service/IBaseUserRoleService.java b/src/main/java/com/sa/zentao/service/IBaseUserRoleService.java
new file mode 100644
index 0000000..6a533fb
--- /dev/null
+++ b/src/main/java/com/sa/zentao/service/IBaseUserRoleService.java
@@ -0,0 +1,21 @@
+package com.sa.zentao.service;
+
+import com.sa.zentao.entity.BaseUserRole;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ *
+ * 服务类
+ *
+ *
+ * @author gqb
+ * @since 2025-04-16
+ */
+public interface IBaseUserRoleService extends IService {
+
+ void addUserRole(String account, List roleList);
+
+ void modifyUserRole(String account, List roleList);
+}
diff --git a/src/main/java/com/sa/zentao/service/IZtStoryFeedbackService.java b/src/main/java/com/sa/zentao/service/IZtStoryFeedbackService.java
index 077e7e1..e0fe23f 100644
--- a/src/main/java/com/sa/zentao/service/IZtStoryFeedbackService.java
+++ b/src/main/java/com/sa/zentao/service/IZtStoryFeedbackService.java
@@ -45,11 +45,11 @@ public interface IZtStoryFeedbackService extends IService {
void feedbackFinished(Integer feedbackId);
- void submitVerified(ZtStoryDTO dto);
+ void submitVerified(ZtStoryFeedbackDTO dto);
void ysFeedback(Integer feedbackId);
- void storyYs(ZtStoryDTO dto);
+ void storyYs(ZtStoryFeedbackDTO dto);
void dontHand(ZtStoryFeedbackDTO dto);
diff --git a/src/main/java/com/sa/zentao/service/IZtStoryUserspecService.java b/src/main/java/com/sa/zentao/service/IZtStoryUserspecService.java
new file mode 100644
index 0000000..e9a6830
--- /dev/null
+++ b/src/main/java/com/sa/zentao/service/IZtStoryUserspecService.java
@@ -0,0 +1,16 @@
+package com.sa.zentao.service;
+
+import com.sa.zentao.entity.ZtStoryUserspec;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ *
+ * 服务类
+ *
+ *
+ * @author gqb
+ * @since 2025-04-15
+ */
+public interface IZtStoryUserspecService extends IService {
+
+}
diff --git a/src/main/java/com/sa/zentao/service/IZtTaskService.java b/src/main/java/com/sa/zentao/service/IZtTaskService.java
index 3cdb26c..fdeaddd 100644
--- a/src/main/java/com/sa/zentao/service/IZtTaskService.java
+++ b/src/main/java/com/sa/zentao/service/IZtTaskService.java
@@ -58,4 +58,12 @@ public interface IZtTaskService extends IService {
List itApprovalByUserName(String s, Date firstDayOfMonth, Date lastDayOfMonth);
+ /**
+ *
+ * @param firstDayOfMonth 开始
+ * @param lastDayOfMonth 结束
+ * @param eIds 迭代
+ * @return
+ */
+ List taskListByEIdsAndDate(Date firstDayOfMonth, Date lastDayOfMonth, List eIds);
}
diff --git a/src/main/java/com/sa/zentao/service/IZtUserService.java b/src/main/java/com/sa/zentao/service/IZtUserService.java
index 9a68d16..ff58889 100644
--- a/src/main/java/com/sa/zentao/service/IZtUserService.java
+++ b/src/main/java/com/sa/zentao/service/IZtUserService.java
@@ -51,4 +51,8 @@ public interface IZtUserService extends IService {
BaseDepartment getDepart(Integer departId);
ZtUser getByAccount(String openedby);
+
+ void addUser(ZtUserDTO user);
+
+ void modifyUser(ZtUserDTO user);
}
diff --git a/src/main/java/com/sa/zentao/service/impl/BaseMenuServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/BaseMenuServiceImpl.java
new file mode 100644
index 0000000..9c957e7
--- /dev/null
+++ b/src/main/java/com/sa/zentao/service/impl/BaseMenuServiceImpl.java
@@ -0,0 +1,209 @@
+package com.sa.zentao.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sa.zentao.conf.LoginRiskUser;
+import com.sa.zentao.dao.BaseMenuDTO;
+import com.sa.zentao.dao.BusinessException;
+import com.sa.zentao.entity.BaseMenu;
+import com.sa.zentao.entity.BaseRoleAuthority;
+import com.sa.zentao.entity.BaseUserRole;
+import com.sa.zentao.enums.BaseMenuLevelEnum;
+import com.sa.zentao.mapper.BaseMenuMapper;
+import com.sa.zentao.mapper.BaseRoleAuthorityMapper;
+import com.sa.zentao.mapper.BaseUserRoleMapper;
+import com.sa.zentao.qo.BaseMenuQo;
+import com.sa.zentao.service.IBaseMenuService;
+import com.sa.zentao.utils.BeanCopyUtil;
+import com.sa.zentao.utils.TreeUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ *
+ * 服务实现类
+ *
+ *
+ * @author jobob
+ * @since 2021-05-28
+ */
+@Service
+public class BaseMenuServiceImpl extends ServiceImpl implements IBaseMenuService {
+
+ @Autowired
+ private BaseMenuMapper baseMenuMapper;
+ @Autowired
+ private BaseUserRoleMapper baseUserRoleMapper;
+ @Autowired
+ private BaseRoleAuthorityMapper baseRoleAuthorityMapper;
+
+
+ @Override
+ public String saveMenu(BaseMenuQo vo, LoginRiskUser loginRiskUser) {
+ //按钮
+ if (2 == vo.getMenuType()){
+ Boolean result = checkAction(vo.getId(),vo.getAction());
+ if (!result){
+ throw new BusinessException("菜单路径重复");
+ }
+ }
+ BaseMenu bm = new BaseMenu();
+ bm.setParentId(vo.getParentId());
+ bm.setAction(vo.getAction());
+ bm.setIcon(vo.getIcon());
+ bm.setName(vo.getName());
+ bm.setCreateTime(new Date());
+ bm.setUpdateTime(new Date());
+ bm.setIsSys(vo.getIsSys());
+ bm.setMenuType(vo.getMenuType());
+ if (Objects.isNull(vo.getParentId())){
+ bm.setLevel(1);
+ }else if (Objects.nonNull(vo.getParentId()) ){
+ BaseMenu baseMenu = this.baseMenuMapper.selectById(vo.getParentId());
+ bm.setLevel(baseMenu.getLevel()+1);
+ }
+
+ if (Objects.isNull(vo.getId())){
+
+ List baseMenus = baseMenuMapper.findAll();
+ Integer max = CollectionUtils.isEmpty(baseMenus)?1:baseMenus.stream().map(BaseMenu::getSort).max(Integer::compareTo).get();
+ bm.setSort(max + 1);
+ this.baseMenuMapper.insert(bm);
+
+ List baseUserRoleList = baseUserRoleMapper.selectList(new QueryWrapper().eq("user_id",loginRiskUser.getRiskUserId()));
+ for (BaseUserRole baseUserRole : baseUserRoleList) {
+ BaseRoleAuthority bra = new BaseRoleAuthority();
+ bra.setMenuId(bm.getId());
+ bra.setRoleId(baseUserRole.getRoleId());
+ baseRoleAuthorityMapper.insert(bra);
+ }
+ return "新增成功";
+ }else {
+ bm.setId(vo.getId());
+ bm.setSort(vo.getSort());
+ bm.setUpdateTime(new Date());
+ this.baseMenuMapper.updateById(bm);
+ return "修改成功";
+ }
+
+ }
+
+ @Override
+ public BaseMenu selectById(Integer id) {
+ return this.baseMenuMapper.selectById(id);
+ }
+
+ @Override
+ public String deleteMenu(Integer id, LoginRiskUser loginRiskUser) {
+ //this.baseMenuMapper.deleteWithChild(id);
+ List menuIds = baseMenuMapper.findMenuIds(id);
+ if (!CollectionUtils.isEmpty(menuIds)){
+ this.baseMenuMapper.deleteBatchIds(menuIds);
+ }
+ List baseUserRoleList = baseUserRoleMapper.selectList(new QueryWrapper().eq("user_id",loginRiskUser.getRiskUserId()));
+ List roleIds = new ArrayList<>();
+ if (!CollectionUtils.isEmpty(baseUserRoleList)){
+ roleIds = baseUserRoleList.stream().map(o -> o.getRoleId()).collect(Collectors.toList());
+ }
+ this.baseRoleAuthorityMapper.deleteRoleAndMenu(roleIds,menuIds);
+
+ return "删除成功";
+ }
+
+ @Override
+ public String moveUp(Integer id) {
+ BaseMenu baseMenu = baseMenuMapper.selectById(id);
+ if (Objects.nonNull(baseMenu)){
+ List list = baseMenuMapper.selectMenuByParentId(baseMenu.getParentId());
+ list.sort(((o1, o2) -> o1.getSort().compareTo(o2.getSort())));
+ int index = list.lastIndexOf(baseMenu);
+ if (index > 0){
+ BaseMenu preMenu = list.get(index - 1);
+ Integer preSort = preMenu.getSort();
+ preMenu.setSort(baseMenu.getSort());
+ baseMenuMapper.updateById(preMenu);
+ baseMenu.setSort(preSort);
+ baseMenuMapper.updateById(baseMenu);
+ }
+ }
+ return "上移成功";
+ }
+
+ @Override
+ public String moveDown(Integer id) {
+ BaseMenu baseMenu = baseMenuMapper.selectById(id);
+ if(Objects.nonNull(baseMenu)){
+ List list = baseMenuMapper.selectMenuByParentId(baseMenu.getParentId());
+ list.sort((o1, o2) -> o2.getSort().compareTo(o1.getSort()));
+ int index = list.lastIndexOf(baseMenu);
+ if(index > 0){
+ BaseMenu preMenu = list.get(index - 1);
+ Integer preSort = preMenu.getSort();
+ preMenu.setSort(baseMenu.getSort());
+ baseMenuMapper.updateById(preMenu);
+ baseMenu.setSort(preSort);
+ baseMenuMapper.updateById(baseMenu);
+ }
+ }
+ return "下移成功";
+ }
+
+ @Override
+ public List queryListByLoginUser(String riskUserId) {
+
+ return this.baseMenuMapper.queryListByLoginUser(riskUserId);
+ }
+
+
+ private Boolean checkAction(Integer id, String action) {
+ if (StringUtils.isEmpty(action) || Objects.equals(action,"#")){
+ return true;
+ }
+
+ List baseMenus = new ArrayList<>();
+ if (Objects.nonNull(id)){
+ baseMenus = baseMenuMapper.selectList(new QueryWrapper().lambda().eq(BaseMenu::getAction, action).notIn(BaseMenu::getId, id));
+ }else {
+ baseMenus = baseMenuMapper.selectList(new QueryWrapper().lambda().eq(BaseMenu::getAction, action));
+ }
+ if (!CollectionUtils.isEmpty(baseMenus)){
+ return false;
+ }
+ return true;
+
+ }
+
+ /**
+ * 根据当前登录用户来获取页面权限、数据权限
+ * @param loginRiskUser
+ * @return
+ */
+ @Override
+ public List menuTree(LoginRiskUser loginRiskUser) {
+ List baseMenuList = new ArrayList<>();
+ baseMenuList = this.queryListByLoginUser(loginRiskUser.getRiskUserId()).stream().sorted(Comparator.comparing(BaseMenu::getSort)).collect(Collectors.toList());
+
+ List baseMenuDTOS = TreeUtils.buildByRecursive(BeanCopyUtil.copyListProperties(baseMenuList, BaseMenuDTO::new), null);
+ return baseMenuDTOS;
+ }
+
+ /**
+ * 获取所有菜单及权限
+ * @return
+ */
+ @Override
+ public List baseMenuTree() {
+ List baseMenuList = this.queryAllList().stream().sorted(Comparator.comparing(BaseMenu::getSort)).collect(Collectors.toList());
+ List baseMenuDTOS = TreeUtils.buildByRecursive(BeanCopyUtil.copyListProperties(baseMenuList, BaseMenuDTO::new), null);
+ return baseMenuDTOS;
+ }
+
+ public List queryAllList(){
+ return this.baseMenuMapper.queryAllList();
+ }
+}
diff --git a/src/main/java/com/sa/zentao/service/impl/BaseRoleAuthorityServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/BaseRoleAuthorityServiceImpl.java
new file mode 100644
index 0000000..6ffa913
--- /dev/null
+++ b/src/main/java/com/sa/zentao/service/impl/BaseRoleAuthorityServiceImpl.java
@@ -0,0 +1,25 @@
+package com.sa.zentao.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sa.zentao.entity.BaseRoleAuthority;
+import com.sa.zentao.mapper.BaseRoleAuthorityMapper;
+import com.sa.zentao.service.IBaseRoleAuthorityService;
+import org.springframework.stereotype.Service;
+
+/**
+ *
+ * 服务实现类
+ *
+ *
+ * @author jobob
+ * @since 2021-05-31
+ */
+@Service
+public class BaseRoleAuthorityServiceImpl extends ServiceImpl implements IBaseRoleAuthorityService {
+
+ @Override
+ public Integer deleteByRoleId(Integer roleId) {
+
+ return this.baseMapper.deleteByRoleId(roleId);
+ }
+}
diff --git a/src/main/java/com/sa/zentao/service/impl/BaseRoleServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/BaseRoleServiceImpl.java
new file mode 100644
index 0000000..97c72ae
--- /dev/null
+++ b/src/main/java/com/sa/zentao/service/impl/BaseRoleServiceImpl.java
@@ -0,0 +1,147 @@
+package com.sa.zentao.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.Page;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.sa.zentao.dao.BaseRoleDTO;
+import com.sa.zentao.dao.BusinessException;
+import com.sa.zentao.entity.BaseRole;
+import com.sa.zentao.entity.BaseRoleAuthority;
+import com.sa.zentao.entity.BaseUserRole;
+import com.sa.zentao.enums.PickEnum;
+import com.sa.zentao.mapper.BaseRoleAuthorityMapper;
+import com.sa.zentao.mapper.BaseRoleMapper;
+import com.sa.zentao.mapper.BaseUserRoleMapper;
+import com.sa.zentao.qo.BaseRoleQo;
+import com.sa.zentao.service.IBaseRoleAuthorityService;
+import com.sa.zentao.service.IBaseRoleService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ *
+ * 服务实现类
+ *
+ *
+ * @author jobob
+ * @since 2021-05-28
+ */
+@Service
+public class BaseRoleServiceImpl extends ServiceImpl implements IBaseRoleService {
+
+ @Autowired
+ private IBaseRoleAuthorityService baseRoleAuthorityService;
+ @Autowired
+ private BaseUserRoleMapper baseUserRoleMapper;
+ @Autowired
+ private BaseRoleMapper baseRoleMapper;
+ @Autowired
+ private BaseRoleAuthorityMapper baseRoleAuthorityMapper;
+
+ @Override
+ @Transactional
+ public void modify(BaseRoleDTO baseRoleDTO, BaseRole baseRole) {
+ baseRole.setName(baseRoleDTO.getName());
+ baseRole.setRemark(baseRoleDTO.getRemark());
+ baseRole.setUpdateTime(new Date());
+ this.baseMapper.updateById(baseRole);
+
+ baseRoleAuthorityService.deleteByRoleId(baseRole.getId());
+
+ batchSaveAndUpdate(baseRoleDTO, baseRole.getId());
+ }
+
+ @Override
+ @Transactional
+ public void add(BaseRoleDTO baseRoleDTO) {
+ BaseRole baseRole = new BaseRole();
+
+ BeanUtils.copyProperties(baseRoleDTO, baseRole);
+ this.baseMapper.insert(baseRole);
+
+ batchSaveAndUpdate(baseRoleDTO, baseRole.getId());
+ }
+
+ private void batchSaveAndUpdate(BaseRoleDTO baseRoleDTO, Integer roleId){
+ List baseRoleAuthority = new ArrayList();
+ if (!StringUtils.isEmpty(baseRoleDTO.getAllPickMenuIds())) {
+ Arrays.stream(baseRoleDTO.getAllPickMenuIds().split(",")).forEach(a ->{
+ BaseRoleAuthority auth = new BaseRoleAuthority();
+ auth.setCreateTime(new Date());
+ auth.setMenuId(Integer.valueOf(a));
+ auth.setRoleId(roleId);
+ auth.setUpdateTime(new Date());
+ auth.setType(PickEnum.ALL_PICK);
+ baseRoleAuthority.add(auth);
+ });
+ }
+ if (!StringUtils.isEmpty(baseRoleDTO.getHalfPickMenuIds())) {
+ Arrays.stream(baseRoleDTO.getHalfPickMenuIds().split(",")).forEach(a -> {
+ BaseRoleAuthority auth = new BaseRoleAuthority();
+ auth.setCreateTime(new Date());
+ auth.setMenuId(Integer.valueOf(a));
+ auth.setRoleId(roleId);
+ auth.setUpdateTime(new Date());
+ auth.setType(PickEnum.HALF_PICK);
+ baseRoleAuthority.add(auth);
+ });
+ }
+ baseRoleAuthorityService.saveBatch(baseRoleAuthority);
+ }
+
+ @Override
+ public PageInfo selectPageList(BaseRoleQo vo) {
+ Page page = PageHelper.startPage(vo.getCurrentPage(),vo.getPageSize());
+ List baseRoleDTOList = baseRoleMapper.selectRoleByVo(vo);
+// baseRoleDTOList=baseRoleDTOList.stream().filter(o->!o.getName().equalsIgnoreCase("系统管理员")).collect(Collectors.toList());
+ return new PageInfo<>(baseRoleDTOList);
+ }
+
+ @Override
+ public BaseRoleDTO getInfoById(Integer id) {
+ if (Objects.isNull(id)){
+ throw new BusinessException("id不能为空");
+ }
+ BaseRoleDTO baseRoleDTO = baseRoleMapper.findRoleById(id);
+ String menuIds = baseRoleAuthorityMapper.findMenuIdById(id, PickEnum.ALL_PICK);
+ baseRoleDTO.setAllPickMenuIds(menuIds);
+
+ return baseRoleDTO;
+ }
+
+ @Override
+ @Transactional
+ public void delete(BaseRole baseRole, BaseRoleQo baseRoleVo) {
+ //删除角色
+ this.removeById(baseRoleVo.getRoleId());
+
+ //删除角色权限
+ baseRoleAuthorityService.deleteByRoleId(baseRoleVo.getRoleId());
+ //删除角色数据权限
+// baseRoleAccountService.deleteByRoleId(baseRoleVo.getRoleId());
+ }
+
+ @Override
+ public List getUserRoleIds(String account) {
+// LoginRiskUser loginRiskUser = RiskUserThreadLocal.get();
+// if(loginRiskUser==null){
+// return new ArrayList<>();
+// }
+ List baseUserRoles = this.baseUserRoleMapper.selectList(new QueryWrapper()
+ .lambda().eq(BaseUserRole::getUserId, account));
+ if(CollectionUtils.isEmpty(baseUserRoles)){
+ return new ArrayList<>();
+ }else{
+ return baseUserRoles.stream().map(o->o.getRoleId()).collect(Collectors.toList());
+ }
+ }
+}
diff --git a/src/main/java/com/sa/zentao/service/impl/BaseUserRoleServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/BaseUserRoleServiceImpl.java
new file mode 100644
index 0000000..89532a2
--- /dev/null
+++ b/src/main/java/com/sa/zentao/service/impl/BaseUserRoleServiceImpl.java
@@ -0,0 +1,69 @@
+package com.sa.zentao.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.sa.zentao.entity.BaseRole;
+import com.sa.zentao.entity.BaseUserRole;
+import com.sa.zentao.mapper.BaseUserRoleMapper;
+import com.sa.zentao.service.IBaseRoleService;
+import com.sa.zentao.service.IBaseUserRoleService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ *
+ * 服务实现类
+ *
+ *
+ * @author gqb
+ * @since 2025-04-16
+ */
+@Service
+public class BaseUserRoleServiceImpl extends ServiceImpl implements IBaseUserRoleService {
+
+ @Autowired
+ private IBaseRoleService baseRoleService;
+
+ @Override
+ public void addUserRole(String account, List roleList) {
+
+ List baseRoles = this.baseRoleService.listByIds(roleList);
+
+ List saveList=new ArrayList();
+ for (Integer roleId:roleList) {
+ BaseUserRole r=new BaseUserRole();
+ r.setCreateTime(new Date());
+ r.setUpdateTime(new Date());
+ r.setRoleId(roleId);
+ r.setUserId(account);
+ saveList.add(r);
+ }
+ this.saveBatch(saveList);
+ }
+
+ @Override
+ @Transactional
+ public void modifyUserRole(String account, List roleList) {
+ this.remove(new QueryWrapper().lambda().eq(BaseUserRole::getUserId,account));
+
+ if(!CollectionUtils.isEmpty(roleList)){
+ List saveList=new ArrayList();
+ for (Integer roleId:roleList) {
+ BaseUserRole r=new BaseUserRole();
+ r.setCreateTime(new Date());
+ r.setUpdateTime(new Date());
+ r.setRoleId(roleId);
+ r.setUserId(account);
+ saveList.add(r);
+ }
+ this.saveBatch(saveList);
+ }
+
+ }
+}
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 4ff77b5..de55930 100644
--- a/src/main/java/com/sa/zentao/service/impl/IZtCountService.java
+++ b/src/main/java/com/sa/zentao/service/impl/IZtCountService.java
@@ -22,8 +22,10 @@ import com.sa.zentao.qo.ZtCountQo;
import com.sa.zentao.qo.ZtProjectQo;
import com.sa.zentao.qo.ZtUserQo;
import com.sa.zentao.service.*;
+import com.sa.zentao.utils.BigDecimalUtils;
import com.sa.zentao.utils.DateUtils;
import com.sa.zentao.utils.ExcelUtil;
+import com.tencentcloudapi.ses.v20201002.models.EmailSender;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
@@ -189,6 +191,9 @@ public class IZtCountService {
UserType userType = loginRiskUser.getUserType();
ZtStoryCountDTO result = new ZtStoryCountDTO();
List pIds = this.projectService.authProductList();
+ if(CollectionUtils.isEmpty(pIds)){
+ return new ZtStoryCountDTO();
+ }
if (loginRiskUser.getName().equals("admin")||userType == UserType.GSGC) {
List list =null;
@@ -296,7 +301,7 @@ public class IZtCountService {
List feedbacks = this.storyFeedbackService.list(new QueryWrapper().lambda()
.in(ZtStoryFeedback::getProduct,pIds)
- .ne(ZtStoryFeedback::getStatus, "closed"));
+ );
result= setFeedback(result,feedbacks);
} else if (userType == UserType.CP ) {
@@ -379,8 +384,8 @@ public class IZtCountService {
.map(o->o.getId()+"").collect(Collectors.joining(",")));
- List feedbacks = this.storyFeedbackService.list(new QueryWrapper()
- .lambda().ne(ZtStoryFeedback::getStatus, "closed")
+ List feedbacks = this.storyFeedbackService.list(new QueryWrapper().lambda()
+
.in(ZtStoryFeedback::getProduct,pIds)
.eq(ZtStoryFeedback::getAssignedTo,loginRiskUser.getName()).or().eq(ZtStoryFeedback::getOpenedBy,loginRiskUser.getName())
@@ -471,7 +476,7 @@ public class IZtCountService {
List feedbacks = this.storyFeedbackService.list(new QueryWrapper()
- .lambda().ne(ZtStoryFeedback::getStatus, "closed")
+ .lambda()
.in(ZtStoryFeedback::getProduct,pList.stream().map(o->o.getId()).collect(Collectors.toList()))
);
@@ -517,17 +522,22 @@ public class IZtCountService {
@Autowired
private IZtTeamService teamService;
+ @Autowired
+ private IZtMeetingService meetingService;;
+
// @Autowired
// private IZtBugService bugService;
public void exportScope(ZtCountQo qo, ServletRequest request, HttpServletResponse response) {
+
+
try {
- List perList =performanceCount(qo);
+ List perList =newPerformanceCount(qo);
if(CollectionUtils.isEmpty(perList)){
throw new BusinessException("未查询到数据");
}
@@ -537,23 +547,42 @@ public class IZtCountService {
Map userMap = userService.userMapByIds(null);
+ List list = new ArrayList<>();
//生成模板
for (int i = 0; i < perList.size(); i++) {
PerformanceDTO performanceDTO = perList.get(i);
ZtUser ztUser = userMap.get(performanceDTO.getAccount());
+ if(ztUser.getAccount().equals("liyuyan")){
+ generatorXMZLExcel(performanceDTO.getUserName(),performanceDTO,qo.getDate());
+ list.add(performanceDTO.getUserName()+"项目助理考核.xlsx");
+ }else
+ if(ztUser.getAccount().equals("liushengqing")){
+ generatorUiExcel(performanceDTO.getUserName(),performanceDTO,qo.getDate());
+ list.add(performanceDTO.getUserName()+"UI工程师.xlsx");
+ }else
if(ztUser.getUserType()==UserType.CS){
generatorTestExcel(performanceDTO.getUserName(),performanceDTO,qo.getDate());
+ list.add(performanceDTO.getUserName()+"测试.xlsx");
}else if(ztUser.getUserType()==UserType.KFZ){
generatorDevlopExcel(performanceDTO.getUserName(),performanceDTO,qo.getDate());
- }else if(ztUser.getUserType()==UserType.XMGLY){
- }else{
+ list.add(performanceDTO.getUserName()+"开发.xlsx");
+ }else if(ztUser.getUserType()==UserType.UI){
+ generatorUiExcel(performanceDTO.getUserName(),performanceDTO,qo.getDate());
+ list.add(performanceDTO.getUserName()+"UI工程师.xlsx");
+ }else if(ztUser.getUserType()==UserType.XMZL||"liyuyan".equals(ztUser.getAccount())){
+ generatorXMZLExcel(performanceDTO.getUserName(),performanceDTO,qo.getDate());
+ list.add(performanceDTO.getUserName()+"项目助理考核.xlsx");
+ }else if(ztUser.getUserType()==UserType.XMJL||ztUser.getUserType()==UserType.XMGLY||ztUser.getUserType()==UserType.GSGC){
+ generatorXMJLExcel(qo,performanceDTO.getUserName(),performanceDTO,qo.getDate(),perList);
+ list.add(performanceDTO.getUserName()+"项目经理考核.xlsx");
}
}
String dir=System.getProperty("user.dir")+"/";
//生成多sheetexcel
String fileName=dir+DateUtils.formatDate(new Date(),"yyyyMMddHHmmss")+".xlsx";
+// list.add(fileName);
FileOutputStream stream = new FileOutputStream(fileName);
try {
exportProjectCount(qo,request,stream);
@@ -564,22 +593,23 @@ public class IZtCountService {
}
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
- List list = new ArrayList<>();
- list.add(fileName);
- for (int i = 0; i < perList.size(); i++) {
- PerformanceDTO performanceDTO = perList.get(i);
- ZtUser ztUser = userMap.get(performanceDTO.getAccount());
+// 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());
+// }
+// }
- 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);
@@ -736,14 +766,622 @@ public class IZtCountService {
}
return result;
}
- PerformanceDTO buildCsScore(ZtUser u ,List approvalList,Date firstDayOfMonth,Date lastDayOfMonth,List taskList,Date d ){
- if(u.getUserType()==UserType.CS){
- }else if(u.getUserType()==UserType.KFZ){
-
- }else if(u.getUserType()==UserType.XMGLY){
+ private List newPerformanceCount(ZtCountQo qo) {
+ Date d = qo.getDate();
+ if(d==null){
+ d=new Date();
}
+ Date firstDayOfMonth = DateUtils.getFirstDayOfMonth(d);
+ Date lastDayOfMonth = DateUtils.getLastDayOfMonth(d);
+ //产品集
+ Integer project = qo.getProject();
+// if(qo.){
+//
+// }
+ List productList = this.productService.list(new QueryWrapper().lambda().eq(ZtProduct::getProgram, project));
+ if (CollectionUtils.isEmpty(productList)) {
+ return new ArrayList<>();
+ }
+ List projectproducts = this.projectproductService.list(new QueryWrapper().lambda()
+ .in(ZtProjectproduct::getProduct, productList.stream().map(o -> o.getId()).collect(Collectors.toList())));
+ if (CollectionUtils.isEmpty(projectproducts)) {
+ return new ArrayList<>();
+ }
+ List execList = executionprojectService.list(new QueryWrapper().lambda()
+ .in(ZtExecutionproject::getProject, projectproducts.stream().map(o->o.getProject()).collect(Collectors.toList())));
+ if (CollectionUtils.isEmpty(execList)) {
+ return new ArrayList<>();
+ }
+ List taskList =this.taskService.taskListByEIdsAndDate(firstDayOfMonth,lastDayOfMonth,execList.stream().map(o -> o.getExecution())
+ .collect(Collectors.toList()));
+
+
+ if (CollectionUtils.isEmpty(taskList)) {
+ return new ArrayList<>();
+ }
+ List ztProjects = this.projectService.listByIds(execList.stream().map(o -> o.getExecution()).collect(Collectors.toList()));
+
+
+ ztProjects = ztProjects.stream().filter(o -> (o.getBegin().getTime() >= firstDayOfMonth.getTime()
+ && o.getBegin().getTime() <= lastDayOfMonth.getTime()) || (
+ o.getEnd().getTime() >= firstDayOfMonth.getTime()
+ && o.getEnd().getTime() <= lastDayOfMonth.getTime()
+ )).collect(Collectors.toList());
+ 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 result =new ArrayList<>();
+
+ for (ZtUser u:ztUsers) {
+
+ List approvalList = this.taskService.itApprovalByUserName(u.getNickname(),firstDayOfMonth, lastDayOfMonth);
+ if(u.getAccount().equals("liyuyan")){
+ result.add(buildXMZLScore(u,approvalList,firstDayOfMonth,lastDayOfMonth,taskList,d));
+ }else
+ if("liushengqing".equals(u.getAccount())){
+ result.add(buildUiScore(u,approvalList,firstDayOfMonth,lastDayOfMonth,taskList,d));
+ }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));
+ }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){
+ result.add(buildXMJLScore(u,approvalList,firstDayOfMonth,lastDayOfMonth,taskList,d));
+ }else if(u.getUserType()==UserType.XMZL){
+ result.add(buildXMZLScore(u,approvalList,firstDayOfMonth,lastDayOfMonth,taskList,d));
+ }
+ }
+ return result;
+ }
+ //新的
+ PerformanceDTO buildKFZScore(ZtUser u ,List approvalList,Date firstDayOfMonth,Date lastDayOfMonth,List taskList,Date d ){
+
+ PerformanceDTO dto=new PerformanceDTO();
+ dto.setUserName(u.getNickname());
+ dto.setAccount(u.getAccount());
+ //本月天数
+ int workDaysInCurrentMonth = DateUtils.getWorkDaysInCurrentMonth(d);
+ //获取本月请假
+ Integer applyTime=0;
+ if(!CollectionUtils.isEmpty(approvalList)){
+ applyTime=getApprovalTime(approvalList,firstDayOfMonth);;
+ }
+ //本月天数
+ dto.setDays(BigDecimal.valueOf(workDaysInCurrentMonth));
+ //本月天数 请假天数
+ dto.setApprovalDays(applyTime<1?BigDecimal.ZERO:BigDecimal.valueOf(applyTime).divide(BigDecimal.valueOf(60),2,BigDecimal.ROUND_HALF_UP));
+ //可用工时 6小时算
+ dto.setTotalTime(dto.getDays().multiply(BigDecimal.valueOf(8)).multiply(BigDecimal.valueOf(0.75)));
+ //达标工时
+ dto.setExamineTime(dto.getTotalTime().subtract(BigDecimal.valueOf(applyTime)));
+
+ //产出工时 算task
+ List taskTimeList = taskList.stream().filter(o->!o.getStatus().equals("closed")&&!o.getStatus().equals("cancel")).filter(o->u.getAccount().equals(o.getAssignedTo())).collect(Collectors.toList());
+
+ //分配总工时
+ dto.setAllocationTime(floatBatchAdd(taskTimeList.stream().map(o->o.getEstimate()).collect(Collectors.toList())));
+
+ dto.setWorkTime(floatBatchAdd(taskList.stream().filter(o->u.getAccount().equals(o.getAssignedTo())).map(o -> o.getConsumed()).collect(Collectors.toList())));
+
+ //工作饱和度
+ dto.setSaturation(dto.getTotalTime().floatValue()==0?BigDecimal.ZERO:dto.getAllocationTime().divide(dto.getExamineTime(),2,BigDecimal.ROUND_HALF_UP));
+ float saturation = dto.getSaturation().floatValue();
+ //完成准时率 TODO 延期 / 总完成
+ //准时任务
+ BigDecimal onTime = floatBatchAdd(taskTimeList.stream().filter(o -> o.getFinishedDate() != null
+ && o.getFinishedDate().getTime() <= DateUtils.getDayLast(o.getDeadline()).getTime()).map(o -> o.getEstimate()).collect(Collectors.toList()));
+ //全部完成
+ BigDecimal finishAllTime = floatBatchAdd(taskTimeList.stream().map(o -> o.getEstimate()).collect(Collectors.toList()));
+
+// List finishAllTime = ;
+ //准时完成率
+ BigDecimal onTimeFinishRate = BigDecimalUtils.isZero(finishAllTime) ? finishAllTime : onTime.divide(finishAllTime, 2, BigDecimal.ROUND_HALF_UP);
+ dto.setFinishPunctuality(onTimeFinishRate);
+ /**准时率得分
+ * 1. =100%,得满分;
+ * 2. <100%,每减少1%,扣3分,扣完截止。
+ *
+ */
+ dto.setPunctualityScore(onTimeFinishRate.equals(BigDecimal.valueOf(1))?BigDecimal.valueOf(25)
+ :BigDecimal.valueOf(25).subtract(BigDecimal.valueOf(1).subtract(onTimeFinishRate).multiply(BigDecimal.valueOf(300))).floatValue()<=0?BigDecimal.ZERO:
+ BigDecimal.valueOf(25).subtract(BigDecimal.valueOf(1).subtract(onTimeFinishRate).multiply(BigDecimal.valueOf(300)))
+ );
+
+
+
+ //bug得分
+ List bugList = this.bugService.list(new QueryWrapper().lambda().between(ZtBug::getOpeneddate, firstDayOfMonth, lastDayOfMonth)
+ .eq(ZtBug::getAssignedTo,u.getAccount()));
+ BigDecimal bugScore = BigDecimal.valueOf(30);
+ bugScore= BigDecimalUtils.isZero(finishAllTime) ?BigDecimal.ZERO: CollectionUtils.isEmpty(bugList)?bugScore:
+ BigDecimal.valueOf(bugList.size()).divide(finishAllTime,2,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).intValue()<=15?bugScore:
+ BigDecimal.valueOf(bugList.size()).divide(finishAllTime,2,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).intValue()>25?BigDecimal.ZERO:
+ bugScore.subtract(BigDecimal.valueOf(bugList.size()).divide(finishAllTime,2,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).subtract(BigDecimal.valueOf(15)).multiply(BigDecimal.valueOf(3)));
+ dto.setBugCount(BigDecimal.valueOf(bugList.size()));
+ dto.setBugScore(bugScore);
+ //工作质量 1. 全月Bug总数<6个
+ //2. 当月绩效考核成绩95分以上
+ //工作质量1. 全月Bug总数<6个
+
+ BigDecimal saturationScore=saturation>=1?BigDecimal.valueOf(20):saturation<0.9?BigDecimal.ZERO:BigDecimal.valueOf(20).subtract(BigDecimal.valueOf(1)
+ .subtract(BigDecimal.valueOf(saturation)).multiply(BigDecimal.valueOf(100)).multiply(BigDecimal.valueOf(2)));
+ //饱和率 分数 每天6小时 需求总工时 20分 一个扣2分
+ if(BigDecimalUtils.isZero(dto.getExamineTime())||BigDecimalUtils.isZero(dto.getAllocationTime())){
+ dto.setSaturationScore(BigDecimal.ZERO);
+ }else{
+ int allocationTime = dto.getAllocationTime().intValue();
+ int examineTime = dto.getExamineTime().intValue();
+ dto.setSaturationScore(BigDecimal.valueOf(allocationTime>=examineTime?20:(20-(examineTime-allocationTime)*2)<=0?0:(20-(examineTime-allocationTime)*2)));
+ }
+
+ return dto;
+ }
+ PerformanceDTO buildCScore(ZtUser u ,List approvalList,Date firstDayOfMonth,Date lastDayOfMonth,List taskList,Date d ){
+
+ PerformanceDTO dto=new PerformanceDTO();
+ dto.setUserName(u.getNickname());
+ dto.setAccount(u.getAccount());
+
+ //本月天数
+ int workDaysInCurrentMonth = DateUtils.getWorkDaysInCurrentMonth(d);
+ //获取本月请假
+ Integer applyTime=0;
+ if(!CollectionUtils.isEmpty(approvalList)){
+ applyTime=getApprovalTime(approvalList,firstDayOfMonth);;
+ }
+ //本月天数
+ dto.setDays(BigDecimal.valueOf(workDaysInCurrentMonth));
+ //本月天数 请假天数
+ dto.setApprovalDays(applyTime<1?BigDecimal.ZERO:BigDecimal.valueOf(applyTime).divide(BigDecimal.valueOf(60),2,BigDecimal.ROUND_HALF_UP));
+ //可用工时 6小时算
+ dto.setTotalTime(dto.getDays().multiply(BigDecimal.valueOf(8)).multiply(BigDecimal.valueOf(0.75)));
+ //达标工时
+ dto.setExamineTime(dto.getTotalTime().subtract(BigDecimal.valueOf(applyTime)));
+
+ //产出工时 算task
+ List taskTimeList = taskList.stream().filter(o->!o.getStatus().equals("closed")&&!o.getStatus().equals("cancel")
+ ).filter(o->o.getAssignedTo().equals(u.getAccount())).collect(Collectors.toList());
+
+ BigDecimal finishAllTime = floatBatchAdd(taskTimeList.stream().map(o->o.getEstimate()).collect(Collectors.toList()));
+ List onTimeTask = taskList.stream().filter(o->u.getAccount().equals(o.getAssignedTo())).filter(o -> o.getFinishedDate() != null
+ && o.getFinishedDate().getTime() <= DateUtils.getDayLast(o.getDeadline()).getTime()).collect(Collectors.toList());
+ BigDecimal onTime=floatBatchAdd(onTimeTask.stream().map(o->o.getEstimate())
+ .collect(Collectors.toList()));
+ //准时完成率
+ BigDecimal onTimeFinishRate = BigDecimalUtils.isZero(finishAllTime) ? finishAllTime : onTime.divide(finishAllTime, 2, BigDecimal.ROUND_HALF_UP);
+ BigDecimal finishScope=BigDecimal.valueOf(20);
+ dto.setPunctualityScore(onTimeFinishRate.equals(BigDecimal.valueOf(1))?finishScope:
+ onTimeFinishRate.multiply(BigDecimal.valueOf(100)).intValue()<90?BigDecimal.ZERO:
+ finishScope.subtract(BigDecimal.valueOf(1).subtract(onTimeFinishRate).multiply(BigDecimal.valueOf(2)).multiply(BigDecimal.valueOf(100))) );
+
+ long seriousBug = this.bugService.count(new QueryWrapper().lambda().between(ZtBug::getOpeneddate, firstDayOfMonth, lastDayOfMonth)
+ .in(ZtBug::getSeverity, 1));
+
+ //轻微
+ long slightBug = this.bugService.count(new QueryWrapper().lambda().between(ZtBug::getOpeneddate, firstDayOfMonth, lastDayOfMonth)
+ .in(ZtBug::getSeverity, 2,3, 4));
+ long totalBug = seriousBug*5+slightBug*1;
+ //缺陷检出率 TODO bug 数量 / 可用工时 250418尹工说的
+ int bugFindScore=BigDecimalUtils.isZero( dto.getExamineTime()) ?0:BigDecimal.valueOf(totalBug).divide(dto.getExamineTime(),2,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).intValue()>20?30:
+ (30-(20-BigDecimal.valueOf(totalBug).divide(dto.getExamineTime(),2,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).intValue())*2);
+ dto.setBugFindScore(BigDecimal.valueOf(bugFindScore<0?0:bugFindScore));
+ //TODO 加分项1. 全月无Bug
+ //2. 当月绩效考核成绩95分以上 +10分
+
+ //线上bug 当月上线需求的线上Bug数量 TODO 待明确
+
+
+
+
+ //分配总工时
+ taskTimeList = taskList.stream().filter(o->u.getAccount().equals(o.getAssignedTo())).collect(Collectors.toList());
+ dto.setAllocationTime(floatBatchAdd(taskTimeList.stream().map(o->o.getEstimate()).collect(Collectors.toList())));
+
+ dto.setWorkTime(floatBatchAdd(taskList.stream().filter(o->u.getAccount().equals(o.getAssignedTo())).map(o -> o.getConsumed()).collect(Collectors.toList())));
+
+ return dto;
+ }
+ PerformanceDTO buildUiScore(ZtUser u ,List approvalList,Date firstDayOfMonth,Date lastDayOfMonth,List taskList,Date d ){
+
+ PerformanceDTO dto=new PerformanceDTO();
+ dto.setUserName(u.getNickname());
+ dto.setAccount(u.getAccount());
+
+ //本月天数
+ int workDaysInCurrentMonth = DateUtils.getWorkDaysInCurrentMonth(d);
+ //获取本月请假
+ Integer applyTime=0;
+ if(!CollectionUtils.isEmpty(approvalList)){
+ applyTime=getApprovalTime(approvalList,firstDayOfMonth);;
+ }
+ //本月天数
+ dto.setDays(BigDecimal.valueOf(workDaysInCurrentMonth));
+ //本月天数 请假天数
+ dto.setApprovalDays(applyTime<1?BigDecimal.ZERO:BigDecimal.valueOf(applyTime).divide(BigDecimal.valueOf(60),2,BigDecimal.ROUND_HALF_UP));
+ //可用工时 6小时算
+ dto.setTotalTime(
+ dto.getApprovalDays().intValue()==0?dto.getDays().multiply(BigDecimal.valueOf(8)).setScale(2,BigDecimal.ROUND_HALF_UP)
+ :dto.getDays().multiply(BigDecimal.valueOf(8)).subtract(dto.getApprovalDays()).setScale(2,BigDecimal.ROUND_HALF_UP));
+ //达标工时
+ dto.setExamineTime(dto.getTotalTime().multiply(BigDecimal.valueOf(0.75)));
+
+ //产出工时 算task
+ List taskTimeList = taskList.stream()
+ .filter(o->o.getFinishedDate()!=null&&
+ o.getFinishedDate().getTime()<=lastDayOfMonth.getTime() &&firstDayOfMonth.getTime()<=o.getFinishedDate().getTime()
+ ).collect(Collectors.toList());
+
+ BigDecimal finishAllTime = floatBatchAdd(taskTimeList.stream().map(o->o.getConsumed()).collect(Collectors.toList()));
+ List onTimeTask = taskList.stream().filter(o->u.getAccount().equals(o.getAssignedTo())).filter(o -> o.getFinishedDate() != null
+ && o.getFinishedDate().getTime() < DateUtils.getDayLast(o.getDeadline()).getTime()).collect(Collectors.toList());
+ BigDecimal onTime=floatBatchAdd(onTimeTask.stream().map(o->o.getConsumed()).collect(Collectors.toList()));
+ //准时完成率
+ BigDecimal onTimeFinishRate = BigDecimalUtils.isZero(finishAllTime) ? finishAllTime : onTime.divide(finishAllTime, 2, BigDecimal.ROUND_HALF_UP);
+ BigDecimal finishScope=BigDecimal.valueOf(20);
+ dto.setPunctualityScore(onTimeFinishRate.equals(BigDecimal.valueOf(1))?finishScope:
+ onTimeFinishRate.multiply(BigDecimal.valueOf(100)).intValue()<80?BigDecimal.ZERO:
+ finishScope.subtract(BigDecimal.valueOf(1).subtract(onTimeFinishRate).multiply(BigDecimal.valueOf(2)).multiply(BigDecimal.valueOf(100))) );
+// taskList
+ // punctualityScore 准时率得分
+ // 1 2 严重
+ long seriousBug = this.bugService.count(new QueryWrapper().lambda().between(ZtBug::getOpeneddate, firstDayOfMonth, lastDayOfMonth)
+ .in(ZtBug::getSeverity, 1));
+
+ //轻微
+ long slightBug = this.bugService.count(new QueryWrapper().lambda().between(ZtBug::getOpeneddate, firstDayOfMonth, lastDayOfMonth)
+ .in(ZtBug::getSeverity, 2,3, 4));
+ long totalBug = seriousBug*5+slightBug*1;
+ //缺陷检出率 TODO bug 数量 / 可用工时 250418尹工说的
+ int bugFindScore=BigDecimalUtils.isZero(dto.getExamineTime()) ?0:BigDecimal.valueOf(totalBug).divide(dto.getExamineTime(),2,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).intValue()>20?30:
+ (30-(BigDecimal.valueOf(totalBug).divide(dto.getExamineTime(),2,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).intValue()-20)*2);
+ dto.setBugFindScore(BigDecimal.valueOf(bugFindScore<0?0:bugFindScore));
+ //TODO 加分项1. 全月无Bug
+ //2. 当月绩效考核成绩95分以上 +10分
+
+ //线上bug 当月上线需求的线上Bug数量 TODO
+
+
+
+
+ //分配总工时
+ taskTimeList = taskList.stream().filter(o->u.getAccount().equals(o.getAssignedTo())).collect(Collectors.toList());
+ dto.setAllocationTime(floatBatchAdd(taskTimeList.stream().map(o->o.getEstimate()).collect(Collectors.toList())));
+
+ dto.setWorkTime(floatBatchAdd(taskList.stream().filter(o->u.getAccount().equals(o.getAssignedTo())).map(o -> o.getConsumed()).collect(Collectors.toList())));
+
+ //工作饱和度
+ dto.setSaturation(dto.getTotalTime().floatValue()==0?BigDecimal.ZERO:dto.getAllocationTime().divide(dto.getExamineTime(),2,BigDecimal.ROUND_HALF_UP));
+ float saturation = dto.getSaturation().floatValue();
+ //完成准时率 TODO 延期 / 总完成
+ List delayTaskList =null;
+ try {
+ delayTaskList = taskList.stream().filter(o->u.getAccount().equals(o.getAssignedTo())).filter(o -> o.getFinishedDate() != null
+ && o.getFinishedDate().getTime() > DateUtils.getDayLast(o.getDeadline()).getTime()).collect(Collectors.toList());
+ }catch (Exception e){
+ log.error("",e);
+ }
+
+ dto.setFinishTask(BigDecimal.valueOf(taskTimeList.stream().filter(o->o.getFinishedDate()!=null).map(o->o.getEstimate()).collect(Collectors.toList()).size()));
+ dto.setDelayTask(BigDecimal.valueOf(delayTaskList.size()));
+ //准时完成率
+ dto.setFinishPunctuality(taskTimeList.size()==0?BigDecimal.valueOf(0):
+ CollectionUtils.isEmpty(delayTaskList)?BigDecimal.valueOf(1):
+ BigDecimal.valueOf(1).subtract(BigDecimal.valueOf(delayTaskList.size())
+ .divide(dto.getFinishTask(),2,BigDecimal.ROUND_HALF_UP)));
+ //工作饱和度
+ if(saturation<0.7){
+ // = 0
+ dto.setSaturationScore(BigDecimal.ZERO);
+ }else{
+ if(saturation<0.9){
+ dto.setSaturationScore(BigDecimal.valueOf(40 - ( 0.9 - saturation ) * 100 * 1).setScale(2,BigDecimal.ROUND_HALF_UP));
+ }else{
+ dto.setSaturationScore(BigDecimal.valueOf(40));
+ }
+ }
+ BigDecimal finishPunctuality = dto.getFinishPunctuality();
+ // 准时率得分 ( `完成准时率` < 1 , 25 - (1 - `完成准时率`) * 100 * 1, 25 )) `准时率得分`,
+ if(finishPunctuality.floatValue()<1){
+ //TODO 完成准时率 0.8
+ if(finishPunctuality.floatValue()<0.8){
+ dto.setPunctualityScore(BigDecimal.ZERO);
+ }else{
+ dto.setPunctualityScore(BigDecimal.valueOf(25 - (1 - finishPunctuality.floatValue()) * 100 * 1).setScale(2,BigDecimal.ROUND_HALF_UP));
+
+ }
+ }else{
+ //饱和率得分
+ dto.setPunctualityScore(BigDecimal.valueOf(25));
+ }
+// if(CollectionUtils.isEmpty(taskTimeList)){
+// bugList=new ArrayList<>();
+// }else{
+// bugList = this.bugService.list(new QueryWrapper().lambda().between(ZtBug::getOpeneddate, firstDayOfMonth, lastDayOfMonth)
+// .in(ZtBug::getSeverity, 1, 2).eq(ZtBug::getResolvedby,u.getAccount()));
+// }
+ List bugList = this.bugService.list(new QueryWrapper().lambda().between(ZtBug::getOpeneddate, firstDayOfMonth, lastDayOfMonth)
+ .in(ZtBug::getSeverity, 1, 2).eq(ZtBug::getResolvedby,u.getAccount()));
+// if(!CollectionUtils.isEmpty(fTask)){
+// count = bugService.count(new QueryWrapper().lambda().in(ZtBug::getTotask, fTask.stream().map(o -> o.getId()).collect(Collectors.toList())));
+// }
+
+// if(CollectionUtils.isEmpty(bugList)){
+// dto.setSeriousBug(BigDecimal.ZERO);
+// dto.setSlightBug(BigDecimal.ZERO);
+// dto.setBugScore(BigDecimal.valueOf(10));
+// }else{
+// Long seriousBug = bugList.stream().filter(o -> o.getSeverity() == 1).count();
+// dto.setSeriousBug(BigDecimal.valueOf(seriousBug));
+// Long slightBug = bugList.stream().filter(o -> o.getSeverity() == 1).count();
+// dto.setSlightBug(BigDecimal.valueOf(slightBug));
+//
+//
+// //测试 if(`线上严重bug` = 0 AND `线上普通bug` = 0, 20, 20 - `线上严重bug` * 20 - `线上普通bug` * 5 )
+// if(u.getUserType()==UserType.CS){
+// dto.setBugScore(
+// (seriousBug==0l&&slightBug==0l)?BigDecimal.valueOf(20):BigDecimal.valueOf(20).subtract(BigDecimal.valueOf(seriousBug).multiply(BigDecimal.valueOf(20).subtract(BigDecimal.valueOf(slightBug).multiply(BigDecimal.valueOf(5)))))
+// );
+// }else{
+// dto.setBugScore((seriousBug==0l&&slightBug==0l)?BigDecimal.valueOf(10):BigDecimal.valueOf(10).subtract(BigDecimal.valueOf(seriousBug).multiply(BigDecimal.valueOf(10).subtract(BigDecimal.valueOf(slightBug).multiply(BigDecimal.valueOf(3))))));
+// }
+// //其余 if(`线上严重bug` = 0 AND `线上普通bug` = 0, 10, 10 - `线上严重bug` * 10 - `线上普通bug` * 3 )
+// }
+// if(u.getUserType()==UserType.CS){
+// //算绩效 `线上bug得分` + `准时率得分` + 50,
+// dto.setScore(dto.getBugScore() .add(dto.getPunctualityScore()).add(BigDecimal.valueOf(50)) );
+// }else{
+// //`饱和率得分`+ `线上bug得分` + `准时率得分` + 25
+// dto.setScore(dto.getSaturationScore() .add(dto.getBugScore()).add(dto.getPunctualityScore()).add(BigDecimal.valueOf(25)));
+// }
+ return dto;
+ }
+ PerformanceDTO buildXMJLScore(ZtUser u ,List approvalList,Date firstDayOfMonth,Date lastDayOfMonth,List taskList,Date d ){
+
+ PerformanceDTO dto=new PerformanceDTO();
+ dto.setUserName(u.getNickname());
+ dto.setAccount(u.getAccount());
+
+ dto.setMeetScore(getMeetScore(u,firstDayOfMonth,lastDayOfMonth));
+// //拆分任务工时
+// dto.setSplitTimeScore(s);
+
+ //本月天数
+ int workDaysInCurrentMonth = DateUtils.getWorkDaysInCurrentMonth(d);
+ //获取本月请假
+ Integer applyTime=0;
+ if(!CollectionUtils.isEmpty(approvalList)){
+ applyTime=getApprovalTime(approvalList,firstDayOfMonth);;
+ }
+ //本月天数
+ dto.setDays(BigDecimal.valueOf(workDaysInCurrentMonth));
+ //本月天数 请假天数
+ dto.setApprovalDays(applyTime<1?BigDecimal.ZERO:BigDecimal.valueOf(applyTime).divide(BigDecimal.valueOf(60),2,BigDecimal.ROUND_HALF_UP));
+
+
+ dto.setMeetScore(getSearchMeetScore(u,firstDayOfMonth,lastDayOfMonth));
+
+ return dto;
+ }
+
+ private BigDecimal getSearchMeetScore(ZtUser u, Date start, Date end) {
+ List pIds = this.projectService.authProductList();
+ if(CollectionUtils.isEmpty(pIds)){
+ return BigDecimal.ZERO;
+ }
+ List list = this.meetingService.list(new QueryWrapper().lambda().in(ZtMeeting::getProductId, pIds)
+ .ge(ZtMeeting::getMeetingDate, start).le(ZtMeeting::getMeetingDate, end));
+ if(CollectionUtils.isEmpty(list)){
+ return BigDecimal.ZERO;
+ }
+ long weekCount = list.stream().filter(o -> o.getType() == MeetingTypeEnums.week).count();
+ int weekMeetScore = (int)(weekCount==0?0:(weekCount>=4)?8:2*weekCount);
+ long storyCount = list.stream().filter(o -> o.getType() == MeetingTypeEnums.story).count();
+ int storyScore= storyCount>0?2:0;
+ return BigDecimal.valueOf(storyScore+weekMeetScore);
+
+ }
+
+ PerformanceDTO buildXMZLScore(ZtUser u ,List approvalList,Date firstDayOfMonth,Date lastDayOfMonth,List taskList,Date d ){
+
+ PerformanceDTO dto=new PerformanceDTO();
+ dto.setUserName(u.getNickname());
+ dto.setAccount(u.getAccount());
+
+ //本月天数
+ int workDaysInCurrentMonth = DateUtils.getWorkDaysInCurrentMonth(d);
+ //获取本月请假
+ Integer applyTime=0;
+ if(!CollectionUtils.isEmpty(approvalList)){
+ applyTime=getApprovalTime(approvalList,firstDayOfMonth);;
+ }
+ //本月天数
+ dto.setDays(BigDecimal.valueOf(workDaysInCurrentMonth));
+ //本月天数 请假天数
+ dto.setApprovalDays(applyTime<1?BigDecimal.ZERO:BigDecimal.valueOf(applyTime).divide(BigDecimal.valueOf(60),2,BigDecimal.ROUND_HALF_UP));
+ //可用工时 6小时算
+ dto.setTotalTime(
+ dto.getApprovalDays().intValue()==0?dto.getDays().multiply(BigDecimal.valueOf(8)).setScale(2,BigDecimal.ROUND_HALF_UP)
+ :dto.getDays().multiply(BigDecimal.valueOf(8)).subtract(dto.getApprovalDays()).setScale(2,BigDecimal.ROUND_HALF_UP));
+ //达标工时
+ dto.setExamineTime(dto.getTotalTime().multiply(BigDecimal.valueOf(0.75)));
+
+
+ dto.setReleaseScore(getReleaseScore(u,firstDayOfMonth));
+
+ dto.setMeetScore(getMeetScore(u,firstDayOfMonth,lastDayOfMonth));
+
+
+ //产出工时 算task
+ List taskTimeList = taskList.stream()
+ .filter(o->o.getFinishedDate()!=null&&
+ o.getFinishedDate().getTime()<=lastDayOfMonth.getTime() &&firstDayOfMonth.getTime()<=o.getFinishedDate().getTime()
+ ).collect(Collectors.toList());
+
+ BigDecimal finishAllTime = floatBatchAdd(taskTimeList.stream().map(o->o.getConsumed()).collect(Collectors.toList()));
+ List onTimeTask = taskList.stream().filter(o->u.getAccount().equals(o.getAssignedTo())).filter(o -> o.getFinishedDate() != null
+ && o.getFinishedDate().getTime() < DateUtils.getDayLast(o.getDeadline()).getTime()).collect(Collectors.toList());
+ BigDecimal onTime=floatBatchAdd(onTimeTask.stream().map(o->o.getConsumed()).collect(Collectors.toList()));
+ //准时完成率
+ BigDecimal onTimeFinishRate = BigDecimalUtils.isZero(finishAllTime) ? finishAllTime : onTime.divide(finishAllTime, 2, BigDecimal.ROUND_HALF_UP);
+ BigDecimal finishScope=BigDecimal.valueOf(20);
+ dto.setPunctualityScore(onTimeFinishRate.equals(BigDecimal.valueOf(1))?finishScope:
+ onTimeFinishRate.multiply(BigDecimal.valueOf(100)).intValue()<80?BigDecimal.ZERO:
+ finishScope.subtract(BigDecimal.valueOf(1).subtract(onTimeFinishRate).multiply(BigDecimal.valueOf(2)).multiply(BigDecimal.valueOf(100))) );
+// taskList
+ // punctualityScore 准时率得分
+ // 1 2 严重
+ long seriousBug = this.bugService.count(new QueryWrapper().lambda().between(ZtBug::getOpeneddate, firstDayOfMonth, lastDayOfMonth)
+ .in(ZtBug::getSeverity, 1));
+
+ //轻微
+ long slightBug = this.bugService.count(new QueryWrapper().lambda().between(ZtBug::getOpeneddate, firstDayOfMonth, lastDayOfMonth)
+ .in(ZtBug::getSeverity, 2,3, 4));
+ long totalBug = seriousBug*5+slightBug*1;
+ //缺陷检出率 TODO bug 数量 / 可用工时 250418尹工说的
+ int bugFindScore=BigDecimalUtils.isZero(dto.getExamineTime()) ?0:BigDecimal.valueOf(totalBug).divide(dto.getExamineTime(),2,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).intValue()>20?30:
+ (30-(BigDecimal.valueOf(totalBug).divide(dto.getExamineTime(),2,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).intValue()-20)*2);
+ dto.setBugFindScore(BigDecimal.valueOf(bugFindScore<0?0:bugFindScore));
+ //TODO 加分项1. 全月无Bug
+ //2. 当月绩效考核成绩95分以上 +10分
+
+ //线上bug 当月上线需求的线上Bug数量 TODO
+
+
+
+
+ //分配总工时
+ taskTimeList = taskList.stream().filter(o->u.getAccount().equals(o.getAssignedTo())).collect(Collectors.toList());
+ dto.setAllocationTime(floatBatchAdd(taskTimeList.stream().map(o->o.getEstimate()).collect(Collectors.toList())));
+
+ dto.setWorkTime(floatBatchAdd(taskList.stream().filter(o->u.getAccount().equals(o.getAssignedTo())).map(o -> o.getConsumed()).collect(Collectors.toList())));
+
+ //工作饱和度
+ dto.setSaturation(dto.getTotalTime().floatValue()==0?BigDecimal.ZERO:dto.getAllocationTime().divide(dto.getExamineTime(),2,BigDecimal.ROUND_HALF_UP));
+ float saturation = dto.getSaturation().floatValue();
+ //完成准时率 TODO 延期 / 总完成
+ List delayTaskList =null;
+ try {
+ delayTaskList = taskList.stream().filter(o->u.getAccount().equals(o.getAssignedTo())).filter(o -> o.getFinishedDate() != null
+ && o.getFinishedDate().getTime() > DateUtils.getDayLast(o.getDeadline()).getTime()).collect(Collectors.toList());
+ }catch (Exception e){
+ log.error("",e);
+ }
+
+ dto.setFinishTask(BigDecimal.valueOf(taskTimeList.stream().filter(o->o.getFinishedDate()!=null).map(o->o.getEstimate()).collect(Collectors.toList()).size()));
+ dto.setDelayTask(BigDecimal.valueOf(delayTaskList.size()));
+ //准时完成率
+ dto.setFinishPunctuality(taskTimeList.size()==0?BigDecimal.valueOf(0):
+ CollectionUtils.isEmpty(delayTaskList)?BigDecimal.valueOf(1):
+ BigDecimal.valueOf(1).subtract(BigDecimal.valueOf(delayTaskList.size())
+ .divide(dto.getFinishTask(),2,BigDecimal.ROUND_HALF_UP)));
+ //工作饱和度
+// if(saturation<0.7){
+// // = 0
+// dto.setSaturationScore(BigDecimal.ZERO);
+// }else{
+// if(saturation<0.9){
+// dto.setSaturationScore(BigDecimal.valueOf(40 - ( 0.9 - saturation ) * 100 * 1).setScale(2,BigDecimal.ROUND_HALF_UP));
+// }else{
+// dto.setSaturationScore(BigDecimal.valueOf(40));
+// }
+// }
+// BigDecimal finishPunctuality = dto.getFinishPunctuality();
+// // 准时率得分 ( `完成准时率` < 1 , 25 - (1 - `完成准时率`) * 100 * 1, 25 )) `准时率得分`,
+// if(finishPunctuality.floatValue()<1){
+// //TODO 完成准时率 0.8
+// if(finishPunctuality.floatValue()<0.8){
+// dto.setPunctualityScore(BigDecimal.ZERO);
+// }else{
+// dto.setPunctualityScore(BigDecimal.valueOf(25 - (1 - finishPunctuality.floatValue()) * 100 * 1).setScale(2,BigDecimal.ROUND_HALF_UP));
+//
+// }
+// }else{
+// //饱和率得分
+// dto.setPunctualityScore(BigDecimal.valueOf(25));
+// }
+ List bugList = this.bugService.list(new QueryWrapper().lambda().between(ZtBug::getOpeneddate, firstDayOfMonth, lastDayOfMonth)
+ .in(ZtBug::getSeverity, 1, 2).eq(ZtBug::getResolvedby,u.getAccount()));
+ return dto;
+ }
+ //满分30
+ private BigDecimal getMeetScore(ZtUser u, Date start, Date end) {
+ List pIds = this.projectService.authProductList();
+ if(CollectionUtils.isEmpty(pIds)){
+ return BigDecimal.ZERO;
+ }
+ List list = this.meetingService.list(new QueryWrapper().lambda().in(ZtMeeting::getProductId, pIds)
+ .ge(ZtMeeting::getMeetingDate, start).le(ZtMeeting::getMeetingDate, end));
+ if(CollectionUtils.isEmpty(list)){
+ return BigDecimal.ZERO;
+ }
+ long weekCount = list.stream().filter(o -> o.getType() == MeetingTypeEnums.week).count();
+ int weekMeetScore = (int)(weekCount==0?0:(weekCount>=4)?4*6:(24-(4-weekCount)*6));
+ long storyCount = list.stream().filter(o -> o.getType() == MeetingTypeEnums.story).count();
+ int storyScore= storyCount>0?6:0;
+ return BigDecimal.valueOf(storyScore+weekMeetScore);
+ }
+
+ //默认20分
+ private BigDecimal getReleaseScore(ZtUser u, Date firstDayOfMonth) {
+ //发布
+ List authList = this.projectService.projectAuthList();
+ if(CollectionUtils.isEmpty(authList)){
+ return BigDecimal.valueOf(20);
+ }
+ Calendar dateInstance = Calendar.getInstance();
+ dateInstance.setTime(firstDayOfMonth);
+// Clead
+ Calendar start = Calendar.getInstance();
+ int year = dateInstance.get(Calendar.YEAR);
+ int month = dateInstance.get(Calendar.MONTH); // 1代表一月份
+ start.set(year, month -1, 15); // 设置年份和月份
+
+ Calendar end = Calendar.getInstance();
+ end.set(year, month , 15); // 设置年份和月份
+ List releasesList = this.releaseService.list(new QueryWrapper().lambda().in(ZtRelease::getProject, authList)
+ .ge(ZtRelease::getReleaseDate, start.getTime()).le(ZtRelease::getReleaseDate, end.getTime()));
+ if(!CollectionUtils.isEmpty(releasesList)){
+ List details = this.releaseDetailsService.list(new QueryWrapper().lambda().in(ZtReleaseDetails::getReleaseId, releasesList.stream().map(o -> o.getId()).collect(Collectors.toList())));
+ if(!CollectionUtils.isEmpty(details)){
+ List storyIds = details.stream().filter(o -> o.getObjectType().equals("story")).map(o->o.getObjectId()).collect(Collectors.toList());
+ if(!CollectionUtils.isEmpty(storyIds)){
+ List storyList = this.storyService.listByIds(storyIds);
+ int i =0;
+ for (ZtStory st:storyList) {
+ Date releaseddate = st.getReleaseddate();
+ Date ysDate = st.getYsDate();
+ int days = DateUtils.daysBetween(releaseddate, ysDate==null?new Date():ysDate);
+ //超过14天扣钱 发布后超过14天未验收
+ if(days>13){
+ i+=1;
+ }
+ }
+ return BigDecimal.valueOf((20-i*5)<0?0:(20-i*5)) ;
+ }
+ }
+ }
+ return BigDecimal.valueOf(20);
+ }
+
+ //老的
+ PerformanceDTO buildCsScore(ZtUser u ,List approvalList,Date firstDayOfMonth,Date lastDayOfMonth,List taskList,Date d ){
PerformanceDTO dto=new PerformanceDTO();
dto.setUserName(u.getNickname());
@@ -933,13 +1571,6 @@ public class IZtCountService {
return value/60;
}
- public static void main(String[] args) {
- Date thisDay = new Date();
- thisDay.setHours(17);
- thisDay.setMinutes(30);
- thisDay.setSeconds(0);
- System.out.print(thisDay);
- }
private List workTaskCounts(ZtCountQo qo) {
@@ -1035,7 +1666,7 @@ public class IZtCountService {
dto.setStartDate(DateUtils.formatDate(t.getRealstarted()));
dto.setEndDate(DateUtils.formatDate(t.getFinishedDate()));
dto.setPlanEndDate(DateUtils.formatDate(t.getDeadline()));
- dto.setKeepTime(t.getFinishedDate()==null?(DateUtils.daysBetween(t.getRealstarted(),t.getFinishedDate())):(DateUtils.daysBetween(t.getEstStarted(),t.getDeadline())));
+ dto.setKeepTime(t.getFinishedDate()!=null?(DateUtils.daysBetween(t.getRealstarted(),t.getFinishedDate())):(DateUtils.daysBetween(t.getEstStarted(),t.getDeadline())));
dto.setDelayRemark(((t.getFinishedDate()==null?new Date():t.getFinishedDate()).getTime()>DateUtils.getDayLast(t.getDeadline()).getTime())?"是":"否");
result.add(dto);
}
@@ -1554,39 +2185,148 @@ public class IZtCountService {
}
void generatorDevlopExcel(String name,PerformanceDTO performanceDTO,Date d){
- try (FileInputStream templateFile =new FileInputStream("scope开发.xlsx")) {
- Map dataMap = new HashMap<>();
- dataMap.put("name", name);
- dataMap.put("date", DateUtils.formatDate(d,"yyyy-MM"));
- dataMap.put("准时率得分", performanceDTO.getPunctualityScore().toString());
- dataMap.put("代码质量", "10");
- dataMap.put("文档质量", "10");
- dataMap.put("饱和度得分", performanceDTO.getSaturationScore().toString());
- dataMap.put("线上bug得分", performanceDTO.getBugScore().toString());
- dataMap.put("工作态度", "5");
- dataMap.put("创新贡献", "0");
- dataMap.put("总分", devlopTotal(
- dataMap.get("准时率得分"),
- dataMap.get("线上bug得分"),
- dataMap.get("代码质量"),
- dataMap.get("文档质量"),
- dataMap.get("饱和度得分"),
- dataMap.get("工作态度")
- ));
+ Map dataMap = new HashMap<>();
+ dataMap.put("name", name);
+ dataMap.put("date", DateUtils.formatDate(d,"yyyy-MM"));
+ dataMap.put("准时率得分", performanceDTO.getPunctualityScore().toString());
+ dataMap.put("Bug密度", performanceDTO.getBugScore().toString());
+ dataMap.put("工作量饱和度", performanceDTO.getSaturationScore().toString());
+
+ dataMap.put("代码质量", "5");
+ dataMap.put("工作质量", "5");
+ dataMap.put("文档质量", "15");
+ dataMap.put("工作态度和责任感", "5");
+ dataMap.put("创新贡献", "0");
+ dataMap.put("质量贡献", "0");
+ dataMap.put("总分", devlopTotal(
+ dataMap.get("准时率得分"),
+ dataMap.get("Bug密度"),
+ dataMap.get("代码质量"),
+ dataMap.get("文档质量"),
+ dataMap.get("工作量饱和度"),
+ dataMap.get("工作态度和责任感")
+ ));
+ writeXlsx(name,"templates/scope/开发工程师.xlsx",name+"开发.xlsx",dataMap);
+
+ }
+
+ void generatorUiExcel(String name,PerformanceDTO performanceDTO,Date d){
+ Map dataMap = new HashMap<>();
+ dataMap.put("name", name);
+ dataMap.put("date", DateUtils.formatDate(d,"yyyy-MM"));
+ dataMap.put("总分","100");
+ writeXlsx(name,"templates/scope/UI工程师.xlsx",name+"UI工程师.xlsx",dataMap);
+ InputStream templateFile =null;
+// try {
+// templateFile=IZtCountService.class.getClassLoader().getResourceAsStream("templates/scope/UI工程师.xlsx");
+//// templateFile = IZtCountService.class.getClassLoader().getResourceAsStream("templates/scope/开发工程师.xlsx");
+//
+//
+// //测试方案
+// // 读取模板
+//
+// Workbook workbook = WorkbookFactory.create(templateFile);
+//
+// Sheet sheet = workbook.getSheetAt(0);
+// workbook.setSheetName(0,name);
+// // 替换占位符
+// for (Row row : sheet) {
+// for (Cell cell : row) {
+// if (cell.getCellType() == CellType.STRING) {
+// String cellValue = cell.getStringCellValue();
+// for (Map.Entry entry : dataMap.entrySet()) {
+// cellValue = cellValue.replace("{" + entry.getKey() + "}", entry.getValue());
+// }
+// cell.setCellValue(cellValue);
+// }
+// }
+// }
+//
+// // 生成新文件
+// try (FileOutputStream outputStream = new FileOutputStream(name+"UI工程师.xlsx")) {
+// workbook.write(outputStream);
+// }
+// workbook.close();
+// }catch (Exception e){
+// log.error("",e);
+// }finally {
+// try {
+// templateFile.close();
+// } catch (IOException e) {
+// e.printStackTrace();
+// }
+// }
+
+ }
+ void generatorXMJLExcel(ZtCountQo qo,String name,PerformanceDTO performanceDTO,Date d, List perList){
+ Map userMap = userService.userMapByIds(null);
+ Map dataMap = new HashMap<>();
+
+ dataMap.put("name", name);
+ dataMap.put("date", DateUtils.formatDate(d,"yyyy-MM"));
+
+ dataMap.put("任务管理",taskManageScore(perList,userMap));
+ dataMap.put("bug",bugManageScore(qo,perList,userMap));
+
+ dataMap.put("版本计划完成率",versionPlanScore(qo,perList,userMap));
+ dataMap.put("项目文档","10");
+ dataMap.put("会议管理",performanceDTO.getMeetScore()+"");
+ dataMap.put("问题管理","5");
+ dataMap.put("系统稳定性","10");
+ dataMap.put("专业技能提升","5");
+
+
+
+ dataMap.put("总分",devlopTotal(
+ dataMap.get("版本计划完成率"),
+ dataMap.get("任务管理"),
+ dataMap.get("bug"),
+ dataMap.get("项目文档"),
+ dataMap.get("会议管理"),
+ dataMap.get("问题管理"),
+ dataMap.get("系统稳定性"),
+ dataMap.get("专业技能提升")
+ ));
+
+ writeXlsx(name,"templates/scope/项目经理考核.xlsx",name+"项目经理考核.xlsx",dataMap);
+
+ }
+
+ private String versionPlanScore(ZtCountQo qo, List perList, Map userMap) {
+ return "20";
+// BigDecimal allocationTime =BigDecimal.ZERO;
+// for (PerformanceDTO d:perList) {
+// ZtUser ztUser = userMap.get(d.getAccount());
+// if(ztUser!=null&&ztUser.getUserType()==UserType.KFZ){
+// //可用工时
+// allocationTime=allocationTime.add(d.getAllocationTime());
+// }
+// }
+// return "0";
+
+ }
+
+ private void writeXlsx(String name,String source, String toSource, Map dataMap) {
+ InputStream templateFile=null;
+ try {
+ templateFile=IZtCountService.class.getClassLoader().getResourceAsStream(source);
+// templateFile = IZtCountService.class.getClassLoader().getResourceAsStream("templates/scope/开发工程师.xlsx");
+
+
//测试方案
// 读取模板
Workbook workbook = WorkbookFactory.create(templateFile);
- workbook.setSheetName(0,name);
- Sheet sheet = workbook.getSheetAt(0);
+ Sheet sheet = workbook.getSheetAt(0);
+ workbook.setSheetName(0,name);
// 替换占位符
for (Row row : sheet) {
for (Cell cell : row) {
if (cell.getCellType() == CellType.STRING) {
String cellValue = cell.getStringCellValue();
for (Map.Entry entry : dataMap.entrySet()) {
- cellValue = cellValue.replace("${" + entry.getKey() + "}", entry.getValue());
+ cellValue = cellValue.replace("{" + entry.getKey() + "}", entry.getValue());
}
cell.setCellValue(cellValue);
}
@@ -1594,14 +2334,154 @@ public class IZtCountService {
}
// 生成新文件
- try (FileOutputStream outputStream = new FileOutputStream(name+"开发.xlsx")) {
+ FileOutputStream outputStream =null;
+ try {
+ outputStream = new FileOutputStream(toSource);
workbook.write(outputStream);
+ }catch (Exception e){
+ log.error("",e);
+ }finally {
+ if(outputStream!=null){
+ outputStream.close();
+ }
}
workbook.close();
- } catch (Exception e) {
- e.printStackTrace();
+
+ }catch (Exception e){
+ log.error("",e);
+ }finally {
+ try {
+ templateFile.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ }
+
+ //项目管理员 线上BUG得分 满分20分
+ private String bugManageScore(ZtCountQo qo,List perList,Map userMap) {
+ List pIds = this.projectService.authProductList();
+ Date date = qo.getDate();
+ Date firstDayOfMonth = DateUtils.getFirstDayOfMonth(date);
+ Date lastDayOfMonth = DateUtils.getLastDayOfMonth(date);
+ //线上bug
+ List bList = this.bugService.list(new QueryWrapper().lambda().in(ZtBug::getProduct, pIds)
+ .ge(ZtBug::getOpeneddate, firstDayOfMonth).le(ZtBug::getOpeneddate, lastDayOfMonth)
+ .eq(ZtBug::getBugType,"prod")
+ );
+ if(CollectionUtils.isEmpty(bList)){
+ return "20";
+ }
+
+ BigDecimal allocationTime =BigDecimal.ZERO;
+ for (PerformanceDTO d:perList) {
+ ZtUser ztUser = userMap.get(d.getAccount());
+ if(ztUser!=null&&ztUser.getUserType()==UserType.KFZ){
+ //可用工时
+ allocationTime=allocationTime.add(d.getAllocationTime());
+ }
+ }
+
+ int i = BigDecimal.valueOf(bList.size()).divide(allocationTime,2,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).intValue();
+ if(i<=5){
+ return "20";
+ }
+ //严重10 分 轻微3分一个
+ int bugScore=0;
+ for (ZtBug b:bList) {
+ bugScore+=b.getSeverity()!=1?3:10;
+ }
+ if(bugScore>20){
+ return "0";
+ }else{
+ return (20-bugScore)+"";
+ }
+
+ }
+
+ private String taskManageScore(List perList,Map userMap) {
+
+ BigDecimal totalTime =BigDecimal.ZERO;
+ BigDecimal allocationTime =BigDecimal.ZERO;
+ for (PerformanceDTO d:perList) {
+ ZtUser ztUser = userMap.get(d.getAccount());
+ if(ztUser!=null&&ztUser.getUserType()==UserType.KFZ){
+ //可用工时
+ totalTime=totalTime.add(d.getTotalTime()) ;
+ allocationTime=allocationTime.add(d.getAllocationTime());
+ }
+ }
+ BigDecimal taskManageRate = BigDecimalUtils.isZero(allocationTime) ?BigDecimal.ZERO:totalTime.divide(allocationTime, 2, BigDecimal.ROUND_HALF_UP);
+ if(BigDecimalUtils.isZero(taskManageRate) ){
+ return "0";
+ }
+ BigDecimal taskRate = taskManageRate.multiply(BigDecimal.valueOf(100));
+ int i = taskRate.intValue();
+ if(i>95){
+ return "20";
+ }else if(91 dataMap = new HashMap<>();
+ dataMap.put("name", name);
+ dataMap.put("date", DateUtils.formatDate(d,"yyyy-MM"));
+ dataMap.put("项目绩效",performanceDTO.getReleaseScore().toString());
+ dataMap.put("项目文档","50");
+ dataMap.put("会议管理",performanceDTO.getMeetScore().toString());
+ dataMap.put("总分",devlopTotal(dataMap.get("项目绩效"),dataMap.get("项目文档"),dataMap.get("会议管理")));
+ writeXlsx(name,"templates/scope/项目助理考核.xlsx",name+"项目助理考核.xlsx",dataMap);
+
+
+// InputStream templateFile =null;
+// try {
+// templateFile=IZtCountService.class.getClassLoader().getResourceAsStream("templates/scope/项目助理考核.xlsx");
+//// templateFile = IZtCountService.class.getClassLoader().getResourceAsStream("templates/scope/开发工程师.xlsx");
+//
+//
+//
+// //测试方案
+// // 读取模板
+//
+// Workbook workbook = WorkbookFactory.create(templateFile);
+//
+// Sheet sheet = workbook.getSheetAt(0);
+// workbook.setSheetName(0,name);
+// // 替换占位符
+// for (Row row : sheet) {
+// for (Cell cell : row) {
+// if (cell.getCellType() == CellType.STRING) {
+// String cellValue = cell.getStringCellValue();
+// for (Map.Entry entry : dataMap.entrySet()) {
+// cellValue = cellValue.replace("{" + entry.getKey() + "}", entry.getValue());
+// }
+// cell.setCellValue(cellValue);
+// }
+// }
+// }
+//
+// // 生成新文件
+// try (FileOutputStream outputStream = new FileOutputStream(name+"项目助理考核.xlsx")) {
+// workbook.write(outputStream);
+// }
+// workbook.close();
+// }catch (Exception e){
+// log.error("",e);
+// }finally {
+// try {
+// templateFile.close();
+// } catch (IOException e) {
+// e.printStackTrace();
+// }
+// }
+
+ }
+
String devlopTotal(String ...args){
int i =0;
for (String s:args) {
@@ -1615,53 +2495,19 @@ public class IZtCountService {
return i+"";
}
void generatorTestExcel(String name,PerformanceDTO performanceDTO,Date d){
- try (FileInputStream templateFile =new FileInputStream("scope测试.xlsx")) {
- Map dataMap = new HashMap<>();
- dataMap.put("name", name);
- dataMap.put("date", DateUtils.formatDate(d,"yyyy-MM"));
- dataMap.put("准时率得分",performanceDTO.getPunctualityScore().toString());
- dataMap.put("测试方案", "20");
- dataMap.put("缺陷管理", "10");
-
- dataMap.put("线上bug得分", performanceDTO.getBugScore().toString());
- dataMap.put("测试报告编写", "10");
- dataMap.put("测试技能", "5");
- dataMap.put("态度", "5");
- dataMap.put("创新贡献", "0");
- dataMap.put("总分", devlopTotal(dataMap.get("准时率得分")
- ,dataMap.get("缺陷管理")
- ,dataMap.get("线上bug得分")
- ,dataMap.get("线上bug得分")
- ,dataMap.get("测试技能")
- ,dataMap.get("态度")
- ,dataMap.get("创新贡献") ));
- //测试方案
- // 读取模板
-
- Workbook workbook = WorkbookFactory.create(templateFile);
- Sheet sheet = workbook.getSheetAt(0);
- workbook.setSheetName(0,name);
- // 替换占位符
- for (Row row : sheet) {
- for (Cell cell : row) {
- if (cell.getCellType() == CellType.STRING) {
- String cellValue = cell.getStringCellValue();
- for (Map.Entry entry : dataMap.entrySet()) {
- cellValue = cellValue.replace("${" + entry.getKey() + "}", entry.getValue());
- }
- cell.setCellValue(cellValue);
- }
- }
- }
-
- // 生成新文件
- try (FileOutputStream outputStream = new FileOutputStream(name+"测试.xlsx")) {
- workbook.write(outputStream);
- }
- workbook.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
+ Map dataMap = new HashMap<>();
+ dataMap.put("name", name);
+ dataMap.put("date", DateUtils.formatDate(d,"yyyy-MM"));
+ dataMap.put("准时率得分",performanceDTO.getPunctualityScore().toString());
+ dataMap.put("缺陷检出率", performanceDTO.getBugFindScore().toString());
+ dataMap.put("测试文档", "20");
+ dataMap.put("工作态度", "5");
+ dataMap.put("质量贡献", "5");
+ dataMap.put("线上Bug", "20");
+ dataMap.put("总分", devlopTotal(dataMap.get("准时率得分")
+ ,dataMap.get("缺陷检出率"), dataMap.get("测试文档"), dataMap.get("工作态度"), dataMap.get("质量贡献"), dataMap.get("线上Bug"))
+ );
+ writeXlsx(name,"templates/scope/测试工程师.xlsx",name+"测试.xlsx",dataMap);
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 8e95f43..78d3658 100644
--- a/src/main/java/com/sa/zentao/service/impl/ZtMeetingServiceImpl.java
+++ b/src/main/java/com/sa/zentao/service/impl/ZtMeetingServiceImpl.java
@@ -85,6 +85,8 @@ public class ZtMeetingServiceImpl extends ServiceImpl userMap = userService.userMapByIds(null);
Map map = getProductMap();
+ Map sMap=getUserStoryMap(list);
+
for (ZtMeetingDTO d:list) {
StringBuilder b=new StringBuilder();
if(!StringUtils.isEmpty(d.getUsers())){
@@ -97,6 +99,19 @@ public class ZtMeetingServiceImpl extends ServiceImpl(list);
}
+ private Map getUserStoryMap(List list) {
+ List storyMeetList = list.stream().filter(o -> !StringUtils.isEmpty(o.getStoryIds())).collect(Collectors.toList());
+ if(!CollectionUtils.isEmpty(storyMeetList)){
+ List sIds =new ArrayList();
+ for (ZtMeetingDTO d:storyMeetList) {
+ sIds.addAll(Arrays.asList(d.getStoryIds().split(",")));
+ }
+ List storyUsers = this.storyUserService.listByIds(sIds);
+ return storyUsers.stream().collect(Collectors.toMap(ZtStoryUser::getId,o->o));
+ }
+ return new HashMap<>();
+ }
+
private Map getProductMap() {
List list = productService.list();
if(CollectionUtils.isEmpty(list)){
@@ -172,11 +200,9 @@ public class ZtMeetingServiceImpl extends ServiceImpl storyUsers = this.storyUserService.listByIds(Arrays.asList(ztMeeting.getStoryIds().split(",")));
+ ztMeetingDTO.setUserStoryName(storyUsers.stream().map(o->o.getTitle()).collect(Collectors.joining(",")));
}
if(ztMeetingDTO.getProductId()!=null){
@@ -215,7 +241,7 @@ public class ZtMeetingServiceImpl extends ServiceImpl{meetType}记录 {titleDate} \n" +
"\n" +
- "会议名称: {name}
\n" +
+ "会议主题: {name}
\n" +
"会议时间: {meetingDate}
\n" +
"会议地点: {address}
\n" +
"参会人员: {usersName}
\n" +
@@ -226,7 +252,7 @@ public class ZtMeetingServiceImpl extends ServiceImpl textMap = new LinkedHashMap<>();
textMap.put("titleDate", DateUtils.formatDate(ztMeeting.getMeetingDate(),"yyyy-MM-dd"));
- textMap.put("name", ztMeeting.getName());
+ textMap.put("name", ztMeeting.getTitle());
pfdStr=pfdStr.replace("{meetType}",ztMeeting.getType().getValue());
pfdStr=pfdStr.replace("{titleDate}",DateUtils.formatDate(ztMeeting.getMeetingDate(),"yyyy-MM-dd "));
@@ -329,9 +355,4 @@ public class ZtMeetingServiceImpl extends ServiceImpl authList() {
+ LoginRiskUser loginRiskUser = RiskUserThreadLocal.get();
+ if(loginRiskUser==null){
+ throw new BusinessException("请登录");
+ }
+
ZtUser user = userService.selectByName(RiskUserThreadLocal.get().getName());
if (user.getAccount().equals("admin")) {
return this.baseMapper.selectList(new QueryWrapper()
@@ -1473,20 +1476,24 @@ public class ZtProjectServiceImpl extends ServiceImpl teams = this.teamService.list(new QueryWrapper().lambda().eq(ZtTeam::getType, "execution")
+ .eq(ZtTeam::getRoot, execution));
+ if(CollectionUtils.isEmpty(teams)){
+ return new ArrayList<>();
+ }
List list = this.taskService.list(new QueryWrapper().lambda()
.notIn(ZtTask::getStatus,"cancel","closed","reviewing" ,"draft")
.ge(ZtTask::getEstStarted, firstDayOfMonth)
- .le(ZtTask::getEstStarted, lastDayOfMonth)
- .eq(ZtTask::getExecution, execution));
+ .le(ZtTask::getEstStarted, lastDayOfMonth).in(ZtTask::getAssignedTo,teams.stream().map(o->o.getAccount()).collect(Collectors.toList())));
if (CollectionUtils.isEmpty(list)) {
return new ArrayList<>();
}
+
List effList = this.effortService.list(new QueryWrapper().lambda()
.in(ZtEffort::getObjectid, list.stream().map(o -> o.getId()).collect(Collectors.toList())));
- List teams = this.teamService.list(new QueryWrapper().lambda().eq(ZtTeam::getType, "execution")
- .eq(ZtTeam::getRoot, execution));
+
List accountIds = teams.stream().map(o -> o.getAccount()).distinct().collect(Collectors.toList());
if (CollectionUtils.isEmpty(accountIds)) {
@@ -1774,12 +1781,15 @@ public class ZtProjectServiceImpl extends ServiceImpl products =null;
if(project==null||project==0){
List productIds = authProductList();
+ if(CollectionUtils.isEmpty(productIds)){
+ return new PageInfo();
+ }
products=this.productService.listByIds(productIds);
}else{
//产品
@@ -1801,12 +1811,20 @@ public class ZtProjectServiceImpl extends ServiceImpl();
}
+ List ztProjects = this.listByIds(execList.stream().map(o -> o.getExecution()).collect(Collectors.toList()));
+ ztProjects = ztProjects.stream().filter(o -> (o.getBegin().getTime() >= firstDayOfMonth.getTime()
+ && o.getBegin().getTime() <= lastDayOfMonth.getTime()) || (
+ o.getEnd().getTime() >= firstDayOfMonth.getTime()
+ && o.getEnd().getTime() <= lastDayOfMonth.getTime()
+ )).collect(Collectors.toList());
+ if (CollectionUtils.isEmpty(ztProjects)) {
+ return new PageInfo<>();
+ }
+
+ List list =this.taskService.taskListByEIdsAndDate(firstDayOfMonth,lastDayOfMonth,execList.stream().map(o -> o.getExecution())
+ .collect(Collectors.toList()));
- List list = this.taskService.list(new QueryWrapper().lambda()
- .between(ZtTask::getEstStarted, firstDayOfMonth, lastDayOfMonth)
- .in(ZtTask::getExecution, execList.stream().map(o -> o.getExecution())
- .collect(Collectors.toList())));
if (CollectionUtils.isEmpty(list)) {
return new PageInfo<>();
}
@@ -1821,27 +1839,10 @@ public class ZtProjectServiceImpl extends ServiceImpl();
}
-// 时间 T1 T2
-// 任务 T3 T4
- List ztProjects = this.listByIds(execList.stream().map(o -> o.getExecution()).collect(Collectors.toList()));
- if (CollectionUtils.isEmpty(ztProjects)) {
- return new PageInfo<>();
- }
- // 查询日期范围内的迭代
- List execFilterList = ztProjects.stream().filter(o -> (o.getBegin().getTime() >= firstDayOfMonth.getTime()
- && o.getBegin().getTime() <= lastDayOfMonth.getTime()) || (
- o.getEnd().getTime() >= firstDayOfMonth.getTime()
- && o.getEnd().getTime() <= lastDayOfMonth.getTime()
- )
-
- )
- .map(o -> o.getId()).collect(Collectors.toList());
- if(CollectionUtils.isEmpty(execFilterList)){
- return new PageInfo<>();
- }
List teams = this.teamService.list(new QueryWrapper().lambda().eq(ZtTeam::getType, "execution")
- .in(ZtTeam::getRoot, execFilterList));
+ .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)) {
@@ -1855,23 +1856,12 @@ public class ZtProjectServiceImpl extends ServiceImpl closeStatus = Arrays.asList("closed", "cancel");
for (String account :accountIds) {
- List taskList = list.stream().filter(o->account.equals(o.getAssignedTo()))
- .filter(o ->
- (
- o.getFinishedDate()!=null
- && (o.getFinishedDate().getTime() >= firstDayOfMonth.getTime()
- && o.getFinishedDate().getTime() <= lastDayOfMonth.getTime()))
- ||
- (o.getEstStarted()!=null&&o.getDeadline()!=null)&&
- (( o.getDeadline().getTime()<=lastDayOfMonth.getTime()&& o.getDeadline().getTime()>=firstDayOfMonth.getTime())
- ||
- ( o.getEstStarted().getTime()<=lastDayOfMonth.getTime()&& o.getEstStarted().getTime()>=firstDayOfMonth.getTime()))
- ).filter(o->o.getStatus().equals("done"))
- .collect(Collectors.toList());
+ List taskList = list.stream().filter(o->account.equals(o.getAssignedTo())).filter(o-> !closeStatus.contains(o.getStatus())).collect(Collectors.toList());
var d=new WorkDetailsDTO();
ZtUser ztUser = uMap.get(account);
@@ -1887,45 +1877,36 @@ public class ZtProjectServiceImpl extends ServiceImpl taskCountList = list.stream().filter(o->account.equals(o.getAssignedTo()))
- .filter(o ->
- ( o.getFinishedDate()!=null&& (o.getFinishedDate().getTime() >= firstDayOfMonth.getTime()
- && o.getFinishedDate().getTime() <= lastDayOfMonth.getTime()))
- ||
- (o.getEstStarted()!=null&&o.getDeadline()!=null)&&
- (( DateUtils.getDayLast(o.getDeadline()).getTime()<=lastDayOfMonth.getTime()&& DateUtils.getDayLast(o.getDeadline()).getTime()>=firstDayOfMonth.getTime())
- ||
- ( o.getEstStarted().getTime()<=lastDayOfMonth.getTime()&& o.getEstStarted().getTime()>=firstDayOfMonth.getTime()))
- ).filter(o->!o.getStatus().equals("closed"))
- .collect(Collectors.toList());
- d.setTaskCount(BigDecimal.valueOf(taskCountList.size()));
+ BigDecimal haveTime = BigDecimal.valueOf(DateUtils.getWorkDaysInCurrentMonth(date) * 6).subtract(applyTime < 1 ? BigDecimal.ZERO : d.getQjTime());
+ d.setHaveTime(haveTime.intValue()<0?BigDecimal.ZERO:haveTime);
- List delayList = list.stream().filter(o->account.equals(o.getAssignedTo()))
- .filter(o ->
- ( o.getFinishedDate()!=null&& (o.getFinishedDate().getTime() >= firstDayOfMonth.getTime()
- && o.getFinishedDate().getTime() <= lastDayOfMonth.getTime()))
- ||
- (o.getEstStarted()!=null&&o.getDeadline()!=null)&&
- (( o.getDeadline().getTime()<=lastDayOfMonth.getTime()&& o.getDeadline().getTime()>=firstDayOfMonth.getTime())
- ||
- ( o.getEstStarted().getTime()<=lastDayOfMonth.getTime()&& o.getEstStarted().getTime()>=firstDayOfMonth.getTime()))
- )
- .filter(o->
+ //工作饱和度
+ d.setSaturation(BigDecimalUtils.isZero(d.getHaveTime())?BigDecimal.valueOf(1):d.getWorkTime().compareTo(BigDecimal.ZERO)==0?BigDecimal.ZERO:d.getStoryTotalTime().divide(d.getHaveTime(),2,BigDecimal.ROUND_HALF_UP));
+ // 任务总量
+ d.setTaskCount(BigDecimal.valueOf(taskList.size()));
+
+ List delayList = taskList.stream().filter(o->
((o.getFinishedDate()!=null &&DateUtils.getDayLast(o.getFinishedDate()).getTime()>DateUtils.getDayLast(o.getDeadline()).getTime()) ) //实际完成大于预计完成 延期
||o.getFinishedDate()==null &&lastDayOfMonth.getTime()>DateUtils.getDayLast(o.getDeadline()).getTime()
- )
- .filter(o->!o.getStatus().equals("closed"))
- .collect(Collectors.toList());
+ ).collect(Collectors.toList());
//任务延期量
d.setTaskDelayCount(BigDecimal.valueOf(delayList.size()));
+ if(ztUser.getUserType()==UserType.CS||ztUser.getUserType()==UserType.KFZ){
+ BigDecimal finishAllTime = BigDecimal.valueOf(floatBatchAdd(taskList.stream().map(o->o.getEstimate()).collect(Collectors.toList())));
+ List onTimeTask = taskList.stream().filter(o -> o.getFinishedDate() != null
+ && o.getFinishedDate().getTime() <= DateUtils.getDayLast(o.getDeadline()).getTime()).collect(Collectors.toList());
+ BigDecimal onTime=BigDecimal.valueOf(floatBatchAdd(onTimeTask.stream().map(o->o.getEstimate())
+ .collect(Collectors.toList())));
+ //准时完成率
+ BigDecimal onTimeFinishRate = BigDecimalUtils.isZero(finishAllTime) ? finishAllTime : onTime.divide(finishAllTime, 2, BigDecimal.ROUND_HALF_UP);
+ d.setTaskFinishOnTimeRate(onTimeFinishRate.multiply(BigDecimal.valueOf(100)) );
+ }else{
+ d.setTaskFinishOnTimeRate(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(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))));
List bugList = this.bugService.list(new QueryWrapper().lambda().in(ZtBug::getProduct, products.stream().map(o -> o.getId()).collect(Collectors.toList()))
+ .eq(ZtBug::getBugType,"prod")
.between(ZtBug::getOpeneddate, firstDayOfMonth, lastDayOfMonth).eq(ZtBug::getResolvedby, account));
d.setBugCount(BigDecimal.valueOf(bugList.size()));
@@ -2017,7 +1998,9 @@ public class ZtProjectServiceImpl extends ServiceImpl parentList(ZtProjectDTO dto) {
List pIds = authList();
-
+ if(CollectionUtils.isEmpty(pIds)){
+ return new ArrayList<>();
+ }
List ztProjects = this.baseMapper.selectList(new QueryWrapper().lambda()
.eq(ZtProject::getType, "program")
.eq(ZtProject::getDeleted, "0")
@@ -2565,6 +2548,9 @@ public class ZtProjectServiceImpl extends ServiceImpl list) {
BigDecimal f = BigDecimal.ZERO;
for (Float i : list) {
+ if(i==null){
+ continue;
+ }
f = f.add(BigDecimal.valueOf(i));
}
f = f.setScale(1, BigDecimal.ROUND_HALF_UP);
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 f2b4ae2..dd1e181 100644
--- a/src/main/java/com/sa/zentao/service/impl/ZtReleaseServiceImpl.java
+++ b/src/main/java/com/sa/zentao/service/impl/ZtReleaseServiceImpl.java
@@ -320,6 +320,7 @@ public class ZtReleaseServiceImpl extends ServiceImpl userMap = this.userService.userMapByIds(null);
- List mailTo =new ArrayList<>();
- StringBuilder b=new StringBuilder();
- b.append("