任务未开始开始中也计算工时,测试任务提出率修改为按照需求来

This commit is contained in:
2025-07-24 13:30:24 +08:00
parent 28e4e83342
commit c68b6951e1
26 changed files with 587 additions and 416 deletions

View File

@ -1,42 +1,10 @@
package com.sa.zentao;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.tencentcloudapi.ses.v20201002.models.EmailSender;
import lombok.SneakyThrows;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.scheduling.annotation.EnableScheduling;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Iterator;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
//,exclude = DataSourceAutoConfiguration.class
@SpringBootApplication(scanBasePackages = {"com.sa.zentao"})
@ -49,41 +17,4 @@ public class ZentaoApplication {
SpringApplication.run(ZentaoApplication.class, args);
}
// public static void main(String[] args) {
// // 定义数据
// Map<String, String> dataMap = new HashMap<>();
// dataMap.put("name", "张三");
// dataMap.put("age", "28");
//
// // 读取模板
// try (FileInputStream templateFile =(FileInputStream)ZentaoApplication.class.getClassLoader().getResourceAsStream("templates/scope测试.xlsx")) {
// Workbook workbook = WorkbookFactory.create(templateFile);
// Sheet sheet = workbook.getSheetAt(0);
//
// // 替换占位符
// for (Row row : sheet) {
// for (Cell cell : row) {
// if (cell.getCellType() == CellType.STRING) {
// String cellValue = cell.getStringCellValue();
// for (Map.Entry<String, String> entry : dataMap.entrySet()) {
// cellValue = cellValue.replace("${" + entry.getKey() + "}", entry.getValue());
// }
// cell.setCellValue(cellValue);
// }
// }
// }
//
// // 生成新文件
// try (FileOutputStream outputStream = new FileOutputStream("output.xlsx")) {
// workbook.write(outputStream);
// }
// workbook.close();
// } catch (Exception e) {
// e.printStackTrace();
// }
//
// }
}

View File

@ -39,14 +39,14 @@ public class CarManageController {
* @return
*/
@GetMapping("/searchFive")
public Result removeFile(@RequestParam(value = "plate",required = true)String plate,@RequestParam(value = "model",required = false)String model){
public Result removeFile(@RequestParam(value = "plate",required = true)String plate,@RequestParam(value = "model",required = false)String model,@RequestParam(value = "userName",required = false)String userName){
if(plate.length()==8&&"02".equals(model)){
model="52";
}
if(plate.length()==8&&"01".equals(model)){
model="51";
}
CarFiveType carFiveType = carManageService.searchFive(plate, model);
CarFiveType carFiveType = carManageService.searchFive(plate, model,userName);
if(carFiveType!=null){
CarFiveTypeDTO carFiveTypeDTO = new CarFiveTypeDTO();
BeanUtils.copyProperties(carFiveType,carFiveTypeDTO);

View File

@ -1,6 +1,9 @@
package com.sa.zentao.controller;
import com.sa.zentao.dao.Result;
import com.sa.zentao.dao.UploadDTO;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@ -15,6 +18,12 @@ import org.springframework.web.bind.annotation.RestController;
*/
@RestController
@RequestMapping("/zt-bug-bound-user")
public class ZtBugBoundUserController {
public class ZtBugBindUserController {
@PostMapping("/test")
public Result<String> upload(String name1,String name2){
return Result.success("<UNK>");
}
}

View File

@ -1,25 +1,16 @@
package com.sa.zentao.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.sa.zentao.conf.LoginRiskUser;
import com.sa.zentao.conf.RiskUserThreadLocal;
import com.sa.zentao.dao.*;
import com.sa.zentao.entity.ZtBug;
import com.sa.zentao.entity.ZtProject;
import com.sa.zentao.entity.ZtStory;
import com.sa.zentao.entity.ZtTask;
import com.sa.zentao.qo.ZtCountQo;
import com.sa.zentao.qo.ZtProjectQo;
import com.sa.zentao.service.IZtBugService;
import com.sa.zentao.service.IZtProjectService;
import com.sa.zentao.service.IZtStoryService;
import com.sa.zentao.service.IZtTaskService;
import com.sa.zentao.service.impl.IZtCountService;
import com.sa.zentao.utils.DateUtils;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import lombok.SneakyThrows;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.RequestBody;

View File

@ -158,6 +158,4 @@ public class ZtReleaseController {
}
}

View File

@ -80,4 +80,6 @@ public class CarFiveTypeDTO implements Serializable {
*/
private Integer status;
private String userName;
}

View File

@ -88,4 +88,6 @@ public class CarFiveType implements Serializable {
private Integer status;
private String model;
private String userName;
}

View File

@ -2,9 +2,7 @@ package com.sa.zentao.entity;
import com.baomidou.mybatisplus.annotation.FieldStrategy;
import com.baomidou.mybatisplus.annotation.IdType;
import java.time.LocalDate;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.TableField;
import java.io.Serializable;
import java.util.Date;
@ -78,17 +76,11 @@ public class ZtBug implements Serializable {
private String steps;
// unconfirmed
// confirmed
// fixing
// fixed
// testing
// tested
// closed
// ZtBug 已完成
//1.active 2.confire=1 3.解决进行中 不变 4 resolved 完成 5.测试中不变 6.测试完毕不变 verified验收
// 'active','resolved','closed'? cancel
// active 激活
/**
* active 2.confire=1 3.解决进行中 不变 4 resolved 完成 5.测试中不变 6.测试完毕不变 verified验收
* 'active','resolved','closed'? cancel
* active 激活
*/
@TableField("`status`")
private String status;
@ -199,7 +191,7 @@ public class ZtBug implements Serializable {
private String fileUrl;
// dev prod
// dev prod releaseBug
private String bugType;
private String ysUser;
@ -207,4 +199,7 @@ public class ZtBug implements Serializable {
private Integer ysFlag;
private String ysRemark;
private Integer releaseFlag;
//关联用户
@TableField(exist = false)
private String bindUser;
}

View File

@ -17,7 +17,7 @@ import lombok.EqualsAndHashCode;
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class ZtBugBoundUser implements Serializable {
public class ZtBugBindUser implements Serializable {
private static final long serialVersionUID = 1L;

View File

@ -0,0 +1,30 @@
package com.sa.zentao.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
public enum BugTypeEnums {
DEV(1, "dev"),
PROD(2, "prod"),
RELEASE(3, "releaseBug"),
;
private int code;
@EnumValue
private String value;
private BugTypeEnums(int code, String value) {
this.code = code;
this.value = value;
}
public int getCode() {
return this.code;
}
public String getValue() {
return this.value;
}
}

View File

@ -1,6 +1,6 @@
package com.sa.zentao.mapper;
import com.sa.zentao.entity.ZtBugBoundUser;
import com.sa.zentao.entity.ZtBugBindUser;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
@ -11,6 +11,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
* @author gqb
* @since 2025-05-13
*/
public interface ZtBugBoundUserMapper extends BaseMapper<ZtBugBoundUser> {
public interface ZtBugBindUserMapper extends BaseMapper<ZtBugBindUser> {
}

View File

@ -3,6 +3,7 @@ package com.sa.zentao.mapper;
import com.sa.zentao.dao.ZtBugDTO;
import com.sa.zentao.entity.ZtBug;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sa.zentao.enums.BugTypeEnums;
import com.sa.zentao.qo.ZtProjectQo;
import org.apache.ibatis.annotations.Param;
@ -29,5 +30,15 @@ public interface ZtBugMapper extends BaseMapper<ZtBug> {
List<ZtBug> bugListByProjectAndDate(@Param("pIds")List<Integer> pIds, @Param("start")Date start,@Param("end") Date lastDayOfMonth);
List<ZtBug> bugBoundsListByProjectAndDate(@Param("pIds")List<Integer> pIds,@Param("start") Date firstDayOfMonth, @Param("end")Date lastDayOfMonth,@Param("account") String account);
/**
*
* @param pIds 产品及
* @param firstDayOfMonth 开始
* @param lastDayOfMonth 结束
* @param account 账户
* @return
*/
List<ZtBug> bugBindsListByProjectAndDate(@Param("pIds")List<Integer> pIds, @Param("start") Date firstDayOfMonth, @Param("end")Date lastDayOfMonth, @Param("account") String account, @Param("bugType") BugTypeEnums bugType);
List<ZtBug> bugListByTestUser(@Param("pIds")List<Integer> pIds, @Param("start") Date firstDayOfMonth, @Param("end")Date lastDayOfMonth, @Param("accounts") List<String> accounts, @Param("bugType") BugTypeEnums bugType);
}

View File

@ -1,6 +1,6 @@
package com.sa.zentao.service;
import com.sa.zentao.entity.ZtBugBoundUser;
import com.sa.zentao.entity.ZtBugBindUser;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
@ -13,7 +13,7 @@ import java.util.List;
* @author gqb
* @since 2025-05-13
*/
public interface IZtBugBoundUserService extends IService<ZtBugBoundUser> {
public interface IZtBugBindUserService extends IService<ZtBugBindUser> {
List<ZtBugBoundUser> listByBugId(Integer id);
List<ZtBugBindUser> listByBugId(Integer id);
}

View File

@ -4,6 +4,7 @@ import com.github.pagehelper.PageInfo;
import com.sa.zentao.dao.ZtBugDTO;
import com.sa.zentao.entity.ZtBug;
import com.baomidou.mybatisplus.extension.service.IService;
import com.sa.zentao.enums.BugTypeEnums;
import com.sa.zentao.qo.ZtBugQo;
import com.sa.zentao.qo.ZtProjectQo;
@ -57,7 +58,18 @@ public interface IZtBugService extends IService<ZtBug> {
List<ZtBug> bugListByProjectAndDate(List<Integer> pIds, Date firstDayOfMonth, Date lastDayOfMonth);
List<ZtBug> bugBoundsListByProjectAndDate(List<Integer> pIds, Date firstDayOfMonth, Date lastDayOfMonth,String account);
List<ZtBug> bugBindsListByProjectAndDate(List<Integer> pIds, Date firstDayOfMonth, Date lastDayOfMonth,String account, BugTypeEnums bugType);
/**
*
* @param pIds 产品
* @param firstDayOfMonth 开始
* @param lastDayOfMonth 结束
* @param accounts 用户
* @param bugType bug类型
* @return
*/
List<ZtBug> bugListByTestUser(List<Integer> pIds, Date firstDayOfMonth, Date lastDayOfMonth,List<String> accounts, BugTypeEnums bugType);
List<ZtBug> getDevBugList(List<ZtBug> bugList);

View File

@ -2,15 +2,11 @@ package com.sa.zentao.service;
import com.github.pagehelper.PageInfo;
import com.sa.zentao.dao.ItApproval;
import com.sa.zentao.dao.ZtProjectDTO;
import com.sa.zentao.dao.ZtTaskDTO;
import com.sa.zentao.dao.ZtYwTaskDTO;
import com.sa.zentao.entity.ZtTask;
import com.baomidou.mybatisplus.extension.service.IService;
import com.sa.zentao.qo.ZtProjectQo;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@ -88,7 +84,6 @@ public interface IZtTaskService extends IService<ZtTask> {
List<ZtTask> getNormalTaskList(List<ZtTask> tList);
List<ZtTask> getDevelAllocation(List<ZtTask> tList);
/**
*

View File

@ -12,6 +12,7 @@ import com.sa.zentao.service.ICarDrivingLicenseService;
import com.sa.zentao.service.ICarFiveTypeService;
import com.sa.zentao.service.ICarOperatingVehicleLevelService;
import com.sa.zentao.utils.DateUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.*;
@ -45,11 +46,12 @@ public class CarManageService {
* @param model
* @return
*/
public CarFiveType searchFive(String plate,String model){
public CarFiveType searchFive(String plate,String model,String userName){
LambdaQueryWrapper<CarFiveType> eq = new QueryWrapper<CarFiveType>().lambda().eq(CarFiveType::getPlate, plate);
if(!StringUtils.isEmpty(model)){
eq.eq(CarFiveType::getModel, model);
}
List<CarFiveType> list = carFiveTypeService.list(eq);
if(!CollectionUtils.isEmpty(list)){
CarFiveType carFiveType = list.get(0);
@ -57,6 +59,15 @@ public class CarManageService {
if(i>90){
carFiveTypeService.removeById(carFiveType.getId());
}else{
//查询车主
if(StringUtils.isEmpty(carFiveType.getUserName())&&!StringUtils.isEmpty(userName)){
if(getUserYzFlag(plate,model,userName)){
for (CarFiveType t:list){
t.setUserName(userName);
}
this.carFiveTypeService.saveOrUpdateBatch(list);
}
}
return carFiveType;
}
}
@ -85,7 +96,14 @@ public class CarManageService {
carFiveType.setCreateTime(new Date());
carFiveType.setPlate(plate);
carFiveType.setModel(model);
//查询车主
if(!StringUtils.isEmpty(userName)){
if(getUserYzFlag(plate,model,userName)){
carFiveType.setUserName(userName);
}
}
this.carFiveTypeService.save(carFiveType);
return carFiveType;
}
@ -95,6 +113,26 @@ public class CarManageService {
}
private boolean getUserYzFlag(String plate, String model, String userName) {
StringBuffer buffer = new StringBuffer();
if(!StringUtils.isEmpty(plate)){
buffer.append("&plateNumber=").append(plate);
}
if(!StringUtils.isEmpty(model)){
buffer.append("&model=").append(model);
}
if(!StringUtils.isEmpty(userName)){
buffer.append("&name=").append(userName);
}
ResponseEntity<String> forEntity = rest.getForEntity("https://api.chequan.cn/?a=vehicleOwnerCheck&user=dgkjshdxm&token=eab3335e2ffe15b8410553cedc1f589a"+buffer.toString() , String.class);
com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(forEntity.getBody());
if("一致".equals(jsonObject.getString("data"))){
return true;
}else{
return false;
}
}
/**
* 查询行驶证 driving_license

View File

@ -202,7 +202,7 @@ public class IZtCountService {
ztStory = storyService.list(new QueryWrapper<ZtStory>()
.lambda().eq(ZtStory::getDeleted, "0")
.in(ZtStory::getProduct, pIds)
.ne(ZtStory::getStatus, "closed")
.notIn(ZtStory::getStatus, "closed","finished")
);
} else {
list = new ArrayList<>();
@ -267,6 +267,7 @@ public class IZtCountService {
} else {
//延期需求改成延期任务
List<ZtTask> tList = this.taskService.list(new QueryWrapper<ZtTask>().lambda()
.select(SFunctionColums.taskColumes())
.in(ZtTask::getStory, ztStory.stream().map(o -> o.getId()).collect(Collectors.toList()))
.notIn(ZtTask::getStatus, "pause", "cancel", "closed", "done", "reviewing")
.last(" and DATE(now()) > DATE(deadline) "));
@ -295,7 +296,7 @@ public class IZtCountService {
.filter(o -> o.getYsFlag() == 1 || o.getYsFlag() == 0)
.map(o -> o.getId() + "").collect(Collectors.joining(",")));
List<ZtStoryFeedback> feedbacks = this.storyFeedbackService.list(new QueryWrapper<ZtStoryFeedback>().lambda()
List<ZtStoryFeedback> feedbacks = this.storyFeedbackService.list(new QueryWrapper<ZtStoryFeedback>().lambda().select(SFunctionColums.feedbackColumes())
.in(ZtStoryFeedback::getProduct, pIds)
);
@ -671,66 +672,6 @@ public class IZtCountService {
}
}
private List<PerformanceDTO> performanceCount(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<ZtProduct> productList = this.productService.list(new QueryWrapper<ZtProduct>().lambda().eq(ZtProduct::getProgram, project));
if (CollectionUtils.isEmpty(productList)) {
return new ArrayList<>();
}
List<ZtProjectproduct> projectproducts = this.projectproductService.list(new QueryWrapper<ZtProjectproduct>().lambda()
.in(ZtProjectproduct::getProduct, productList.stream().map(o -> o.getId()).collect(Collectors.toList())));
if (CollectionUtils.isEmpty(projectproducts)) {
return new ArrayList<>();
}
List<ZtExecutionproject> execList = executionprojectService.list(new QueryWrapper<ZtExecutionproject>().lambda()
.in(ZtExecutionproject::getProject, projectproducts.stream().map(o -> o.getProject()).collect(Collectors.toList())));
if (CollectionUtils.isEmpty(execList)) {
return new ArrayList<>();
}
List<ZtTask> taskList = this.taskService.list(new QueryWrapper<ZtTask>().lambda()
.and(o -> o.between(ZtTask::getDeadline, firstDayOfMonth, lastDayOfMonth)
.or()
.between(ZtTask::getFinishedDate, firstDayOfMonth, lastDayOfMonth)
)
.in(ZtTask::getExecution, execList.stream().map(o -> o.getExecution())
.collect(Collectors.toList())));
if (CollectionUtils.isEmpty(taskList)) {
return new ArrayList<>();
}
List<ZtProject> ztProjects = this.projectService.listByIds(execList.stream().map(o -> o.getExecution()).collect(Collectors.toList()));
List<ZtTeam> teams = this.teamService.list(new QueryWrapper<ZtTeam>().lambda().eq(ZtTeam::getType, "execution")
.in(ZtTeam::getRoot, ztProjects.stream().map(o -> o.getId()).collect(Collectors.toList())));
List<String> accountIds = teams.stream().map(o -> o.getAccount()).distinct().collect(Collectors.toList());
if (CollectionUtils.isEmpty(accountIds)) {
return new ArrayList<>();
}
//accountIds 成员
List<ZtUser> ztUsers = this.userService.list(new QueryWrapper<ZtUser>().lambda().in(ZtUser::getAccount, accountIds));
List<PerformanceDTO> result = new ArrayList<>();
for (ZtUser u : ztUsers) {
List<ItApproval> approvalList = this.taskService.itApprovalByUserName(u.getNickname(), firstDayOfMonth, lastDayOfMonth);
result.add(buildCsScore(u, approvalList, firstDayOfMonth, lastDayOfMonth, taskList, d));
}
return result;
}
private List<PerformanceDTO> newPerformanceCount(ZtCountQo qo) {
@ -783,6 +724,13 @@ public class IZtCountService {
List<PerformanceDTO> result = new ArrayList<>();
List<String> csAccountIds = ztUsers.stream().filter(o -> o.getUserType() == UserType.CS).map(o -> o.getAccount()).collect(Collectors.toList());
//获取测试产生的线上bug
List<ZtBug> releaseBugs = this.bugService.bugListByTestUser(null, firstDayOfMonth, lastDayOfMonth,csAccountIds, BugTypeEnums.RELEASE);
//获取测试需求
List<ZtStory> cswcStoryList = CollectionUtils.isEmpty(csAccountIds)?Collections.EMPTY_LIST:this.storyService.list(new QueryWrapper<ZtStory>().lambda().in(ZtStory::getProduct, pids)
.in(ZtStory::getAssignedTo, csAccountIds).ge(ZtStory::getEndDate, firstDayOfMonth).le(ZtStory::getEndDate, lastDayOfMonth));
for (ZtUser u : ztUsers) {
@ -794,7 +742,7 @@ public class IZtCountService {
} else if (u.getUserType() == UserType.KFZ) {
result.add(buildKFZScore(u, approvalList, firstDayOfMonth, lastDayOfMonth, taskList, d));
} else if (u.getUserType() == UserType.CS) {
result.add(buildCScore(userMap,pids,u, approvalList, firstDayOfMonth, lastDayOfMonth, taskList, d));
result.add(buildCScore(userMap,pids,u, approvalList, firstDayOfMonth, lastDayOfMonth, taskList, d,releaseBugs.stream().filter(o->u.getAccount().equals(o.getBindUser())).collect(Collectors.toList()), cswcStoryList.stream().filter(o->u.getAccount().equals(o.getAssignedTo())).collect(Collectors.toList())));
} 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) {
@ -856,6 +804,14 @@ public class IZtCountService {
List<PerformanceDTO> result = new ArrayList<>();
//计算测试线上bug
List<String> csAccountIds = ztUsers.stream().filter(o -> o.getUserType() == UserType.CS).map(o -> o.getAccount()).collect(Collectors.toList());
List<ZtBug> releaseBugs = this.bugService.bugListByTestUser(null, firstDayOfMonth, lastDayOfMonth,csAccountIds , BugTypeEnums.RELEASE);
//获取测试需求
List<ZtStory> cswcStoryList = CollectionUtils.isEmpty(csAccountIds)?Collections.EMPTY_LIST:this.storyService.list(new QueryWrapper<ZtStory>().lambda().in(ZtStory::getProduct, pids)
.in(ZtStory::getAssignedTo, csAccountIds).ge(ZtStory::getEndDate, firstDayOfMonth).le(ZtStory::getEndDate, lastDayOfMonth));
for (ZtUser u : ztUsers) {
List<ItApproval> approvalList = this.taskService.itApprovalByUserName(u.getNickname(), firstDayOfMonth, lastDayOfMonth);
@ -866,7 +822,7 @@ public class IZtCountService {
} else if (u.getUserType() == UserType.KFZ) {
result.add(buildKFZScore(u, approvalList, firstDayOfMonth, lastDayOfMonth, taskList, d));
} else if (u.getUserType() == UserType.CS) {
result.add(buildCScore(userMap,pids,u, approvalList, firstDayOfMonth, lastDayOfMonth, taskList, d));
result.add(buildCScore(userMap,pids,u, approvalList, firstDayOfMonth, lastDayOfMonth, taskList, d,releaseBugs.stream().filter(o->u.getAccount().equals(o.getBindUser())).collect(Collectors.toList()), cswcStoryList.stream().filter(o->u.getAccount().equals(o.getAssignedTo())).collect(Collectors.toList())));
} 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) {
@ -889,21 +845,21 @@ public class IZtCountService {
//产出工时 算task
List<ZtTask> taskTimeList = this.taskService.getDevelAllocation(taskList.stream().filter(o -> u.getAccount().equals(o.getAssignedTo())).collect(Collectors.toList()));
List<ZtTask> taskTimeList = this.taskService.getNormalTaskList(taskList.stream().filter(o -> u.getAccount().equals(o.getAssignedTo())).collect(Collectors.toList()));
dto.setTotalTask(BigDecimal.valueOf(taskTimeList.stream().filter(o->o.getStatus().equals("done")).collect(Collectors.toList()).size()));
dto.setTotalTask(BigDecimal.valueOf(taskTimeList.stream().collect(Collectors.toList()).size()));
//延期任务
List<ZtTask> delayTaskList = this.taskService.getDelayTask(taskTimeList);
dto.setDelayTask(BigDecimal.valueOf(delayTaskList.size()));
//分配总工时
dto.setAllocationTime(floatBatchAdd(taskTimeList.stream().filter(o->o.getStatus().equals("done")).map(o -> o.getEstimate()).collect(Collectors.toList())));
dto.setAllocationTime(floatBatchAdd(taskTimeList.stream().map(o -> o.getEstimate()).collect(Collectors.toList())));
dto.setWorkTime(floatBatchAdd(taskTimeList.stream().map(o -> o.getConsumed()).collect(Collectors.toList())));
//工作饱和度
dto.setSaturation(dto.getTotalTime().floatValue() == 0 ? BigDecimal.ZERO : dto.getAllocationTime().divide(dto.getExamineTime(), 2, BigDecimal.ROUND_UP));
dto.setSaturation(BigDecimalUtils.isZero(dto.getExamineTime()) ? BigDecimal.ZERO : dto.getAllocationTime().divide(dto.getExamineTime(), 2, BigDecimal.ROUND_UP));
//完成准时率 TODO 延期 / 总完成
@ -911,25 +867,19 @@ public class IZtCountService {
//全部完成
BigDecimal finishAllTime = dto.getAllocationTime();
// List<Float> finishAllTime = ;
//准时完成率
BigDecimal onTimeFinishRate = BigDecimalUtils.isZero(finishAllTime) ? finishAllTime : onTime.divide(finishAllTime, 2, BigDecimal.ROUND_UP);
dto.setFinishPunctuality(onTimeFinishRate);
/**准时率得分
* 1. =100%,得满分;
* 2. <100%每减少1%扣3分扣完截止。
*
*/
dto.setPunctualityScore(
getKFZPunctualityScore(onTimeFinishRate) );
//bug得分
List<ZtBug> bugList = this.bugService.bugBoundsListByProjectAndDate(null, firstDayOfMonth, lastDayOfMonth, u.getAccount());
// List<ZtBug> bugList = this.bugService.list(new QueryWrapper<ZtBug>().lambda().
// ge(ZtBug::getOpeneddate, firstDayOfMonth).le(ZtBug::getOpeneddate, lastDayOfMonth)
// .eq(ZtBug::getAssignedTo, u.getAccount()));
List<ZtBug> bugList = this.bugService.bugBindsListByProjectAndDate(null, firstDayOfMonth, lastDayOfMonth, u.getAccount(),null);
bugList=this.bugService.getNormalBugList(bugList);
//bug密度
int bugSize = bugList.size();
@ -992,7 +942,6 @@ public class IZtCountService {
BigDecimal applyTime = BigDecimal.ZERO;
if (!CollectionUtils.isEmpty(approvalList)) {
applyTime = getApprovalTime(approvalList, firstDayOfMonth);
;
}
//本月天数
dto.setDays(BigDecimal.valueOf(workDaysInCurrentMonth));
@ -1008,7 +957,7 @@ public class IZtCountService {
return dto;
}
PerformanceDTO buildCScore( Map<String, ZtUser> userMap,List<Integer> pids,ZtUser u, List<ItApproval> approvalList, Date firstDayOfMonth, Date lastDayOfMonth, List<ZtTask> taskList, Date d) {
PerformanceDTO buildCScore( Map<String, ZtUser> userMap,List<Integer> pids,ZtUser u, List<ItApproval> approvalList, Date firstDayOfMonth, Date lastDayOfMonth, List<ZtTask> taskList, Date d,List<ZtBug> releaseBugs,List<ZtStory> testedStory) {
PerformanceDTO dto = new PerformanceDTO();
dto.setUserName(u.getNickname());
@ -1040,26 +989,9 @@ public class IZtCountService {
onTimeFinishRate.multiply(BigDecimal.valueOf(100)).intValue() < 90 ? BigDecimal.ZERO :
finishScope.subtract(BigDecimal.valueOf(1).subtract(onTimeFinishRate).multiply(BigDecimal.valueOf(2)).multiply(BigDecimal.valueOf(100))));
List<ZtBug> allBugList = this.bugService.list(new QueryWrapper<ZtBug>().lambda()
.eq(ZtBug::getOpenedby, u.getAccount())
.ge(ZtBug::getOpeneddate, firstDayOfMonth).le(ZtBug::getOpeneddate, lastDayOfMonth));
allBugList = allBugList.stream().filter(o -> ("closed".equals(o.getStatus())||"cancel".equals(o.getStatus()) ?
((!StringUtils.isEmpty(o.getResolvedby())) ? true : false) : true)).collect(Collectors.toList());
//严重
long seriousBug = allBugList.stream().filter(o -> Integer.valueOf(1).equals(o.getSeverity())).count();
//轻微
long slightBug = allBugList.stream().filter(o -> Arrays.asList(4, 2, 3).contains(o.getSeverity())).count();
long totalBug = seriousBug * 5 + slightBug * 1;
//缺陷检出率 TODO bug 数量 / 可用工时 250418尹工说的
// 2025-05-12 尹工说的 测试在指定时间完成 并且指派给他 的开发任务工时
dto.setDevSeriousBug(BigDecimal.valueOf(seriousBug));
dto.setDevSlightBug(BigDecimal.valueOf(slightBug));
//bug检出率
dto =getBugFindScore(dto,u,userMap,pids,firstDayOfMonth,lastDayOfMonth,totalBug);
getBugFindScore(dto,u,firstDayOfMonth,lastDayOfMonth,testedStory);
//暂未定义
dto.setSlightBug(BigDecimal.ZERO);
@ -1071,57 +1003,48 @@ public class IZtCountService {
dto.setWorkTime(BigDecimal.ZERO);
dto.setExcellentShare(BigDecimal.ZERO);
dto.setQuality(BigDecimal.ZERO);
//TODO 加分项1. 全月无Bug
//2. 当月绩效考核成绩95分以上 +10分
//线上bug 当月上线需求的线上Bug数量 TODO 待明确
List<ZtBug> prodBugList = this.bugService.list(new QueryWrapper<ZtBug>().lambda()
.eq(ZtBug::getAssignedTo, u.getAccount())
.ge(ZtBug::getOpeneddate, firstDayOfMonth).le(ZtBug::getOpeneddate, lastDayOfMonth));
prodBugList = allBugList.stream().filter(o -> o.getBugType().equals("prod")).filter(o -> ("closed".equals(o.getStatus()) ?
((!StringUtils.isEmpty(o.getResolvedby())) ? true : false) : true)).collect(Collectors.toList());
prodBugList.add(new ZtBug());
if (CollectionUtils.isEmpty(prodBugList)) {
dto.setBugScore(BigDecimal.valueOf(20));
} else {
//严重
long prodSeriousBug = prodBugList.stream().filter(o -> Integer.valueOf(1).equals(o.getSeverity())).count();
//轻微
long prodSlightBug = prodBugList.stream().filter(o -> Arrays.asList(4, 2, 3).contains(o.getSeverity())).count();
if (prodSeriousBug > 0) {
dto.setBugScore(BigDecimal.valueOf(0));
} else {
dto.setBugScore(BigDecimal.valueOf((20 - prodSlightBug * 5) <= 0 ? 0 : (20 - prodSlightBug * 5)));
}
}
dto.setBugScore(BigDecimal.valueOf(20));
//计算线上bug 严重
long seriousCount = releaseBugs.stream().filter(o -> o.getSeverity().equals(1)).count();
//轻微
long slightCount = releaseBugs.stream().filter(o -> Arrays.asList(2, 3, 4).contains(o.getSeverity())).count();
int bugScore =(int)(seriousCount>0?0:(slightCount>3)?0:(20-slightCount*5));
//bug得分
dto.setSeriousBug(BigDecimal.valueOf(seriousCount));
dto.setSlightBug(BigDecimal.valueOf(slightCount));
dto.setBugScore(BigDecimal.valueOf(bugScore));
dto.setDocumentQualityScore(BigDecimal.valueOf(25));
dto.setWorkAttitude(BigDecimal.valueOf(5));
return dto;
}
private PerformanceDTO getBugFindScore(PerformanceDTO dto,ZtUser u, Map<String, ZtUser> userMap,List<Integer> pids, Date firstDayOfMonth, Date lastDayOfMonth,long totalBug) {
private PerformanceDTO getBugFindScore(PerformanceDTO dto,ZtUser u,Date firstDayOfMonth,Date lastDayOfMonth,List<ZtStory> testedStory) {
List<ZtStory> list = this.storyService.list(new QueryWrapper<ZtStory>().lambda().in(ZtStory::getProduct, pids)
.eq(ZtStory::getAssignedTo, u.getAccount()).ge(ZtStory::getEndDate, firstDayOfMonth).le(ZtStory::getEndDate, lastDayOfMonth));
if(CollectionUtils.isEmpty(list)){
return dto;
}
List<String> accountIds = userMap.values().stream().filter(o -> o.getUserType() == UserType.KFZ).map(o -> o.getAccount()).collect(Collectors.toList());
if(CollectionUtils.isEmpty(accountIds)){
if(CollectionUtils.isEmpty(testedStory)){
return dto;
}
List<ZtTask> taskList = this.taskService.list(new QueryWrapper<ZtTask>().lambda()
.select(SFunctionColums.taskColumes())
.eq(ZtTask::getType,"devel")
.in(ZtTask::getAssignedTo,accountIds)
.notIn(ZtTask::getStatus,"cancel","closed")
.in(ZtTask::getStory, list.stream().map(o -> o.getId()).collect(Collectors.toList())));
.select(SFunctionColums.taskColumes()).eq(ZtTask::getType,"devel")
.notIn(ZtTask::getStatus,"cancel","closed")
.in(ZtTask::getStory, testedStory.stream().map(o -> o.getId()).collect(Collectors.toList())));
if(CollectionUtils.isEmpty(taskList)){
return dto;
}
List<ZtBug> allBugList = this.bugService.list(new QueryWrapper<ZtBug>().lambda().select(SFunctionColums.bugColumes())
.eq(ZtBug::getOpenedby, u.getAccount())
.in(ZtBug::getTostory,testedStory.stream().map(o -> o.getId()).collect(Collectors.toList())));
allBugList = allBugList.stream().filter(o -> ("closed".equals(o.getStatus())||"cancel".equals(o.getStatus()) ?
((!StringUtils.isEmpty(o.getResolvedby())) ? true : false) : true)).collect(Collectors.toList());
//严重
long seriousBug = allBugList.stream().filter(o -> Integer.valueOf(1).equals(o.getSeverity())).count();
//轻微
long slightBug = allBugList.stream().filter(o -> Arrays.asList(4, 2, 3).contains(o.getSeverity())).count();
long totalBug = seriousBug * 5 + slightBug * 1;
//缺陷检出率 TODO bug 数量 / 可用工时 250418尹工说的
// 2025-05-12 尹工说的 测试在指定时间完成 并且指派给他 的开发任务工时
dto.setDevSeriousBug(BigDecimal.valueOf(seriousBug));
dto.setDevSlightBug(BigDecimal.valueOf(slightBug));
//开发总工时
BigDecimal totalTimeWorkHours = floatBatchAdd(taskList.stream().map(o -> o.getEstimate()).collect(Collectors.toList()));
@ -1578,7 +1501,6 @@ public class IZtCountService {
if (CollectionUtils.isEmpty(ztProjects)) {
return new ArrayList<>();
}
List<Integer> executionIds = ztProjects.stream().map(o -> o.getId()).collect(Collectors.toList());
//所有任务
List<ZtTask> taskList = this.taskService.taskListByEIdsAndDate(firstDayOfMonth, lastDayOfMonth, pids);
if (CollectionUtils.isEmpty(taskList)) {
@ -1696,6 +1618,7 @@ public class IZtCountService {
List<ZtProject> ztProjects = this.projectService.getExecutionsListByProjectAndDate(projectproducts.stream().map(o->o.getProject()).collect(Collectors.toList()), firstDayOfMonth, lastDayOfMonth);
if (CollectionUtils.isEmpty(ztProjects)) {
@ -1714,7 +1637,7 @@ public class IZtCountService {
List<ZtUser> ztUsers = this.userService.list(new QueryWrapper<ZtUser>().lambda()
.in(ZtUser::getAccount, accountIds));
//多个项目组成员
List multipleUserList= getmultipleDepartProjectTeam(firstDayOfMonth,lastDayOfMonth);
@ -1781,9 +1704,7 @@ public class IZtCountService {
// .filter(o->o.getProject().equals(p.getId()))
// 完成后可能会被关闭
List<ZtTask> done = taskList.stream()
.filter(o->userMap.get(o.getAssignedTo())!=null&&userMap.get(o.getAssignedTo()).getUserType()==UserType.KFZ)
List<ZtTask> done = taskList.stream().filter(o->userMap.get(o.getAssignedTo())!=null&&userMap.get(o.getAssignedTo()).getUserType()==UserType.KFZ)
.filter(o->o.getStatus().equals("done")).collect(Collectors.toList());
@ -1832,7 +1753,9 @@ public class IZtCountService {
private BigDecimal floatBatchAdd(List<Float> list) {
BigDecimal f = BigDecimal.ZERO;
for (Float i : list) {
f = f.add(BigDecimal.valueOf(i));
if(i!=null){
f = f.add(BigDecimal.valueOf(i));
}
}
BigDecimal decimal = f.setScale(2, BigDecimal.ROUND_HALF_UP);
@ -1891,7 +1814,7 @@ public class IZtCountService {
//项目
//迭代
int time = DateUtils.getWorkDaysInCurrentMonth(d) * 8;
// int time = DateUtils.getWorkDaysInCurrentMonth(d) * 8;
List<ZtBug> prodBugList = this.bugService.list(new QueryWrapper<ZtBug>().lambda().in(ZtBug::getProduct, pids)
.eq(ZtBug::getBugType, "prod")
.ge(ZtBug::getOpeneddate, firstDayOfMonth)
@ -1901,14 +1824,14 @@ public class IZtCountService {
if(u.getUserType()==UserType.KFZ){
List<ItApproval> approvalList = this.taskService.itApprovalByUserName(u.getNickname(), firstDayOfMonth, lastDayOfMonth);
List<ZtTask> fTask = this.taskService.getDevelAllocation(taskList.stream().filter(o -> o.getAssignedTo().equals(u.getAccount())).collect(Collectors.toList()));
List<ZtTask> fTask = this.taskService.getNormalTaskList(taskList.stream().filter(o -> o.getAssignedTo().equals(u.getAccount())).collect(Collectors.toList()));
PerformanceDTO performanceDTO = new PerformanceDTO();
performanceDTO = setUserWorkTime(performanceDTO, d, approvalList, firstDayOfMonth);
WorkDetailsDTO dto = new WorkDetailsDTO();
dto.setUserName(u.getNickname());
fTask=fTask.stream().filter(o->o.getStatus().equals("done")).collect(Collectors.toList());
// fTask=fTask.stream().filter(o->o.getStatus().equals("done")).collect(Collectors.toList());
dto.setTaskCount(BigDecimal.valueOf(fTask.size()));
@ -1992,7 +1915,7 @@ public class IZtCountService {
return zeroTaskMap(map, objMap);
}
List<ZtTask> taskList = this.taskService.list(new QueryWrapper<ZtTask>().lambda()
List<ZtTask> taskList = this.taskService.list(new QueryWrapper<ZtTask>().lambda().select(SFunctionColums.taskColumes())
.in(ZtTask::getExecution, exexList.stream().map(o -> o.getExecution()).collect(Collectors.toList())));
if (CollectionUtils.isEmpty(taskList)) {
return zeroTaskMap(map, objMap);
@ -2018,7 +1941,7 @@ public class IZtCountService {
objMap.put("totalCount", taskList.size());
map.put("task", objMap);
List<ZtBug> bugList = this.bugService.list(new QueryWrapper<ZtBug>().lambda().in(ZtBug::getProduct, products.stream().map(o -> o.getId()).collect(Collectors.toList())));
List<ZtBug> bugList = this.bugService.list(new QueryWrapper<ZtBug>().lambda().select(SFunctionColums.bugColumes()).in(ZtBug::getProduct, products.stream().map(o -> o.getId()).collect(Collectors.toList())));
objMap = new HashMap<>();
@ -2660,32 +2583,20 @@ public class IZtCountService {
return result;
}
List<ZtProject> 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 result;
}
List<ZtTeam> teams = this.teamService.list(new QueryWrapper<ZtTeam>().lambda().eq(ZtTeam::getType, "execution")
.in(ZtTeam::getRoot, ztProjects.stream().map(o -> o.getId()).collect(Collectors.toList())));
List<String> accountIds = teams.stream().map(o -> o.getAccount()).distinct().collect(Collectors.toList());
//accountIds 成员
List<String> accountIds =getTeamAccountByExecutionIds(execList.stream().map(o -> o.getExecution()).collect(Collectors.toList()),firstDayOfMonth,lastDayOfMonth);
if (CollectionUtils.isEmpty(accountIds)) {
return result;
}
//accountIds 成员
List<ItApproval> approvalList = this.taskService.itApprovalByUserName(u.getNickname(), firstDayOfMonth, lastDayOfMonth);
Map<String, ZtUser> userMap = this.userService.userMapByIds(accountIds);
//正线bug
List<ZtBug> releaseBugs = this.bugService.bugListByTestUser(null, firstDayOfMonth, lastDayOfMonth, Arrays.asList(u.getAccount()), BugTypeEnums.RELEASE);
//获取测试需求
List<ZtStory> cswcStoryList = this.storyService.list(new QueryWrapper<ZtStory>().lambda().in(ZtStory::getProduct, pids)
.in(ZtStory::getAssignedTo, Arrays.asList(u.getAccount())).ge(ZtStory::getEndDate, firstDayOfMonth).le(ZtStory::getEndDate, lastDayOfMonth));
if (name.equals("liyuyan")) {
result = buildXMZLScore(u, approvalList, firstDayOfMonth, lastDayOfMonth, taskList, d);
@ -2694,11 +2605,11 @@ public class IZtCountService {
} else if (u.getUserType() == UserType.KFZ) {
result = buildKFZScore(u, approvalList, firstDayOfMonth, lastDayOfMonth, taskList, d);
} else if (u.getUserType() == UserType.CS) {
result = buildCScore(userMap,pids,u, approvalList, firstDayOfMonth, lastDayOfMonth, taskList, d);
result = buildCScore(userMap,pids,u, approvalList, firstDayOfMonth, lastDayOfMonth, taskList, d,releaseBugs.stream().filter(o->u.getAccount().equals(o.getBindUser())).collect(Collectors.toList()),cswcStoryList.stream().filter(o->u.getAccount().equals(o.getAssignedTo())).collect(Collectors.toList()));
} else if (u.getUserType() == UserType.UI) {
result = buildUiScore(u, approvalList, firstDayOfMonth, lastDayOfMonth, taskList, d);
} else if (u.getUserType() == UserType.XMJL || u.getUserType() == UserType.XMGLY || u.getUserType() == UserType.GSGC) {
List<ZtProject> list = projectService.list(new QueryWrapper<ZtProject>().lambda().eq(ZtProject::getPm, result.getAccount()));
// List<ZtProject> list = projectService.list(new QueryWrapper<ZtProject>().lambda().eq(ZtProject::getPm, result.getAccount()));
result = buildXMJLScore(u, approvalList, firstDayOfMonth, lastDayOfMonth, taskList, d);
ZtCountQo ztCountQo = new ZtCountQo();
BeanUtils.copyProperties(qo, ztCountQo);
@ -2720,6 +2631,26 @@ public class IZtCountService {
}
private List<String> getTeamAccountByExecutionIds(List<Integer> execIds,Date firstDayOfMonth,Date lastDayOfMonth) {
List<ZtProject> ztProjects = this.projectService.listByIds(execIds);
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 Collections.emptyList();
}
List<ZtTeam> teams = this.teamService.list(new QueryWrapper<ZtTeam>().lambda().eq(ZtTeam::getType, "execution")
.in(ZtTeam::getRoot, ztProjects.stream().map(o -> o.getId()).collect(Collectors.toList())));
return teams.stream().map(o -> o.getAccount()).distinct().collect(Collectors.toList());
}
public Map<String, Object> storyBarChart(ZtProjectQo qo) {
Integer id = qo.getId();
Map<String, Object> map = new HashMap<>();
@ -2876,11 +2807,11 @@ public class IZtCountService {
}
}
BigDecimal Density = BigDecimalUtils.isZero(allocationTime) ? BigDecimal.valueOf(devBugList.size()) : BigDecimal.valueOf(devBugList.size()).divide(allocationTime, 2, BigDecimal.ROUND_HALF_UP);
BigDecimal density = BigDecimalUtils.isZero(allocationTime) ? BigDecimal.valueOf(devBugList.size()) : BigDecimal.valueOf(devBugList.size()).divide(allocationTime, 2, BigDecimal.ROUND_HALF_UP);
//bug率
List<ZtBug> prodBugList = bugList.stream().filter(o -> o.getBugType().equals("prod")).collect(Collectors.toList());
obj.put("devBugCount", Density);
obj.put("devBugCount", density);
obj.put("prodBugCount", BigDecimalUtils.isZero(allocationTime) ? 0 : BigDecimal.valueOf(prodBugList.size()).divide(allocationTime, 2, BigDecimal.ROUND_HALF_UP));
map.put(DateUtils.formatDate(d, "yyyy-MM"), obj);
@ -2979,7 +2910,7 @@ public class IZtCountService {
dto.setFinishPunctuality(kfzCount<=0?BigDecimal.ZERO:finishPunctuality.divide(BigDecimal.valueOf(kfzCount),3,BigDecimal.ROUND_UP));
// //处理问题数量
List<ZtStoryFeedback> feedbackList = this.storyFeedbackService.list(new QueryWrapper<ZtStoryFeedback>()
.lambda().in(ZtStoryFeedback::getProduct, pIds)
.lambda().select(SFunctionColums.feedbackColumes()).in(ZtStoryFeedback::getProduct, pIds)
.ge(ZtStoryFeedback::getOpenedDate, firstDayOfMonth).le(ZtStoryFeedback::getOpenedDate, lastDayOfMonth));
List<ZtStoryFeedback> feedbacks = feedbackList.stream().filter(o -> !o.getStatus().equals("closed")).collect(Collectors.toList());

View File

@ -1,10 +1,10 @@
package com.sa.zentao.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.sa.zentao.entity.ZtBugBoundUser;
import com.sa.zentao.mapper.ZtBugBoundUserMapper;
import com.sa.zentao.service.IZtBugBoundUserService;
import com.sa.zentao.entity.ZtBugBindUser;
import com.sa.zentao.mapper.ZtBugBindUserMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sa.zentao.service.IZtBugBindUserService;
import org.springframework.stereotype.Service;
import java.util.List;
@ -18,10 +18,10 @@ import java.util.List;
* @since 2025-05-13
*/
@Service
public class ZtBugBoundUserServiceImpl extends ServiceImpl<ZtBugBoundUserMapper, ZtBugBoundUser> implements IZtBugBoundUserService {
public class ZtBugBindUserServiceImpl extends ServiceImpl<ZtBugBindUserMapper, ZtBugBindUser> implements IZtBugBindUserService {
@Override
public List<ZtBugBoundUser> listByBugId(Integer id) {
return this.baseMapper.selectList(new QueryWrapper<ZtBugBoundUser>().lambda().eq(ZtBugBoundUser::getBugId, id));
public List<ZtBugBindUser> listByBugId(Integer id) {
return this.baseMapper.selectList(new QueryWrapper<ZtBugBindUser>().lambda().eq(ZtBugBindUser::getBugId, id));
}
}

View File

@ -1,6 +1,5 @@
package com.sa.zentao.service.impl;
import ch.qos.logback.core.util.StringUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.github.pagehelper.Page;
@ -10,10 +9,7 @@ import com.sa.zentao.conf.LoginRiskUser;
import com.sa.zentao.conf.RiskUserThreadLocal;
import com.sa.zentao.dao.*;
import com.sa.zentao.entity.*;
import com.sa.zentao.enums.ActionStatus;
import com.sa.zentao.enums.ActionType;
import com.sa.zentao.enums.FileTypes;
import com.sa.zentao.enums.UserType;
import com.sa.zentao.enums.*;
import com.sa.zentao.mapper.ZtBugMapper;
import com.sa.zentao.qo.ZtBugQo;
import com.sa.zentao.qo.ZtProjectQo;
@ -88,7 +84,7 @@ public class ZtBugServiceImpl extends ServiceImpl<ZtBugMapper, ZtBug> implements
private IZtReleaseService releaseService;
@Autowired
private IZtBugBoundUserService bugBoundUserService;
private IZtBugBindUserService bugBindUserService;
@Autowired
private VxService vxService;
@ -330,7 +326,7 @@ public class ZtBugServiceImpl extends ServiceImpl<ZtBugMapper, ZtBug> implements
if (d.getDeadline() != null) {
d.setDeadline(DateUtils.getDayLast(d.getDeadline()));
}
List<ZtBugBoundUser> boundList = this.bugBoundUserService.listByBugId(d.getId());
List<ZtBugBindUser> boundList = this.bugBindUserService.listByBugId(d.getId());
List<ZtBugBoundUserDTO> ztBugBoundUserDTOS = BeanCopyUtil.copyListProperties(boundList, ZtBugBoundUserDTO::new);
ztBugBoundUserDTOS = ztBugBoundUserDTOS.stream().peek(o->{
ZtUser u = userMap.get(o.getAssignedTo());
@ -395,7 +391,7 @@ public class ZtBugServiceImpl extends ServiceImpl<ZtBugMapper, ZtBug> implements
ZtProjectproduct projectproduct = this.projectproductService.getOne(new QueryWrapper<ZtProjectproduct>().lambda().eq(ZtProjectproduct::getProject, dto.getProject()));
Integer product = projectproduct.getProduct();
//项目bug
List<ZtBugBoundUser> bountSaveList=new ArrayList<>();
List<ZtBugBindUser> bountSaveList=new ArrayList<>();
for (ZtBugDTO d:list) {
ZtBug b=new ZtBug();
BeanUtils.copyProperties(d,b);
@ -411,12 +407,12 @@ public class ZtBugServiceImpl extends ServiceImpl<ZtBugMapper, ZtBug> implements
}
this.saveBatch(saveBatch);
for (ZtBug b:saveBatch) {
ZtBugBoundUser ztBugBoundUser = new ZtBugBoundUser();
ZtBugBindUser ztBugBoundUser = new ZtBugBindUser();
ztBugBoundUser.setBugId(b.getId());
ztBugBoundUser.setAssignedTo(b.getAssignedTo());
bountSaveList.add(ztBugBoundUser);
}
bugBoundUserService.saveBatch(bountSaveList);
bugBindUserService.saveBatch(bountSaveList);
Map<Integer, List<ZtBug>> eMap = saveBatch.stream().filter(o->o.getExecution()!=null&&o.getExecution()!=0).collect(Collectors.groupingBy(ZtBug::getExecution));
for (Integer e:eMap.keySet()) {
@ -598,13 +594,21 @@ public class ZtBugServiceImpl extends ServiceImpl<ZtBugMapper, ZtBug> implements
}
@Override
public List<ZtBug> bugBoundsListByProjectAndDate(List<Integer> pIds, Date firstDayOfMonth, Date lastDayOfMonth, String account) {
return this.baseMapper.bugBoundsListByProjectAndDate(pIds,firstDayOfMonth,lastDayOfMonth,account);
public List<ZtBug> bugBindsListByProjectAndDate(List<Integer> pIds, Date firstDayOfMonth, Date lastDayOfMonth, String account, BugTypeEnums bugType) {
return this.baseMapper.bugBindsListByProjectAndDate(pIds,firstDayOfMonth,lastDayOfMonth,account,bugType);
}
@Override
public List<ZtBug> bugListByTestUser(List<Integer> pIds, Date firstDayOfMonth, Date lastDayOfMonth, List<String> accounts, BugTypeEnums bugType) {
if(CollectionUtils.isEmpty(accounts)){
return Collections.emptyList();
}
return this.baseMapper.bugListByTestUser(pIds,firstDayOfMonth,lastDayOfMonth,accounts,bugType);
}
@Override
public List<ZtBug> getDevBugList(List<ZtBug> bugList) {
return bugList.stream().filter(o->"dev".equals(o.getBugType())||"releaseBug".equals(o.getBugType())).collect(Collectors.toList());
return bugList.stream().filter(o->BugTypeEnums.DEV.getValue().equals(o.getBugType())||BugTypeEnums.RELEASE.getValue().equals(o.getBugType())).collect(Collectors.toList());
}
@Override
@ -646,22 +650,22 @@ public class ZtBugServiceImpl extends ServiceImpl<ZtBugMapper, ZtBug> implements
}
this.baseMapper.insert(ztBug);
List<ZtBugBoundUser> boundSaveList=new ArrayList<>();
List<ZtBugBindUser> boundSaveList=new ArrayList<>();
List<ZtBugBoundUserDTO> boundList = dto.getBoundList();
if(!CollectionUtils.isEmpty(boundList)){
for (ZtBugBoundUserDTO ztBugBoundUserDTO:boundList ) {
ZtBugBoundUser bound = new ZtBugBoundUser();
ZtBugBindUser bound = new ZtBugBindUser();
bound.setBugId(ztBug.getId());
bound.setAssignedTo(ztBugBoundUserDTO.getAssignedTo());
boundSaveList.add(bound);
}
}else{
ZtBugBoundUser bound = new ZtBugBoundUser();
ZtBugBindUser bound = new ZtBugBindUser();
bound.setBugId(ztBug.getId());
bound.setAssignedTo(ztBug.getAssignedTo());
boundSaveList.add(bound);
}
this.bugBoundUserService.saveBatch(boundSaveList);
this.bugBindUserService.saveBatch(boundSaveList);
fileService.updateFile(dto.getFiles(),ztBug.getId(), FileTypes.bug);
if(dto.getExecution()!=null&&dto.getExecution()!=0){
@ -695,24 +699,24 @@ public class ZtBugServiceImpl extends ServiceImpl<ZtBugMapper, ZtBug> implements
this.baseMapper.updateById(ztBug);
//删除老的
this.bugBoundUserService.remove(new QueryWrapper<ZtBugBoundUser>().lambda()
.eq(ZtBugBoundUser::getBugId,ztBug.getId()));
List<ZtBugBoundUser> boundSaveList=new ArrayList<>();
this.bugBindUserService.remove(new QueryWrapper<ZtBugBindUser>().lambda()
.eq(ZtBugBindUser::getBugId,ztBug.getId()));
List<ZtBugBindUser> boundSaveList=new ArrayList<>();
List<ZtBugBoundUserDTO> boundList = dto.getBoundList();
if(!CollectionUtils.isEmpty(boundList)){
for (ZtBugBoundUserDTO ztBugBoundUserDTO:boundList ) {
ZtBugBoundUser bound = new ZtBugBoundUser();
ZtBugBindUser bound = new ZtBugBindUser();
bound.setBugId(ztBug.getId());
bound.setAssignedTo(ztBugBoundUserDTO.getAssignedTo());
boundSaveList.add(bound);
}
}else{
ZtBugBoundUser bound = new ZtBugBoundUser();
ZtBugBindUser bound = new ZtBugBindUser();
bound.setBugId(ztBug.getId());
bound.setAssignedTo(ztBug.getAssignedTo());
boundSaveList.add(bound);
}
this.bugBoundUserService.saveBatch(boundSaveList);
this.bugBindUserService.saveBatch(boundSaveList);
@ -837,8 +841,7 @@ public class ZtBugServiceImpl extends ServiceImpl<ZtBugMapper, ZtBug> implements
this.actionService.addAction(ActionType.BUG, ActionStatus.WC,ztBug.getId(),ztBug.getProject()+"",ztBug.getProject(),ztBug.getExecution()
,RiskUserThreadLocal.get().getName(),dto.getRemark(),""
);
,RiskUserThreadLocal.get().getName(),dto.getRemark(),"");
this.bugFinishedSendMessage(ztBug.getId(),ztBug.getOpenedby());

View File

@ -1935,9 +1935,9 @@ public class ZtProjectServiceImpl extends ServiceImpl<ZtProjectMapper, ZtProject
return new PageInfo<>();
}
List<ZtTask> list =this.taskService.taskListByEIdsAndDate(firstDayOfMonth,lastDayOfMonth,products.stream().map(o->o.getId()).collect(Collectors.toList()));
List<ZtTask> allTaskList =this.taskService.taskListByEIdsAndDate(firstDayOfMonth,lastDayOfMonth,products.stream().map(o->o.getId()).collect(Collectors.toList()));
if (CollectionUtils.isEmpty(list)) {
if (CollectionUtils.isEmpty(allTaskList)) {
return new PageInfo<>();
}
@ -1963,12 +1963,8 @@ public class ZtProjectServiceImpl extends ServiceImpl<ZtProjectMapper, ZtProject
for (String account :accountIds) {
ZtUser ztUser = uMap.get(account);
List<ZtTask> taskList =null;
if(ztUser.getUserType()==UserType.KFZ){
taskList = this.taskService.getDevelAllocation(list.stream().filter(o->account.equals(o.getAssignedTo())).collect(Collectors.toList()));
}else{
taskList = this.taskService.getNormalTaskList(list.stream().filter(o->account.equals(o.getAssignedTo())).collect(Collectors.toList()));
}
List<ZtTask> taskList = this.taskService.getNormalTaskList(allTaskList.stream().filter(o->account.equals(o.getAssignedTo())).collect(Collectors.toList()));
var d=new WorkDetailsDTO();
ZtMonthScore ztMonthScore = scoreMap.get(account);
@ -1981,7 +1977,7 @@ public class ZtProjectServiceImpl extends ServiceImpl<ZtProjectMapper, ZtProject
d.setUserName(ztUser.getNickname());
d.setAccount(account);
//需求总工时
d.setStoryTotalTime(floatToBigDecimal(floatBatchAdd(taskList.stream().filter(o->o.getStatus().equals("done")).map(o -> o.getEstimate()).collect(Collectors.toList()))));
d.setStoryTotalTime(floatToBigDecimal(floatBatchAdd(taskList.stream().map(o -> o.getEstimate()).collect(Collectors.toList()))));
//实际产出工时
d.setWorkTime(floatToBigDecimal(floatBatchAdd(taskList.stream().map(o -> o.getConsumed()).collect(Collectors.toList()))));
@ -1996,15 +1992,15 @@ public class ZtProjectServiceImpl extends ServiceImpl<ZtProjectMapper, ZtProject
d.setHaveTime(dto.getExamineTime());
//工作饱和度
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.stream().filter(o->o.getStatus().equals("done")).collect(Collectors.toList()).size()));
d.setSaturation(BigDecimalUtils.isZero(d.getHaveTime())?BigDecimal.valueOf(1):BigDecimalUtils.isZero(d.getWorkTime())?BigDecimal.ZERO:d.getStoryTotalTime().divide(d.getHaveTime(),2,BigDecimal.ROUND_UP));
// 任务总量 .filter(o->o.getStatus().equals("done"))
d.setTaskCount(BigDecimal.valueOf(taskList.stream().collect(Collectors.toList()).size()));
List<ZtTask> delayList =this.taskService.getDelayTask(taskList);
//任务延期量
d.setTaskDelayCount(BigDecimal.valueOf(delayList.size()));
if(ztUser.getUserType()==UserType.CS||ztUser.getUserType()==UserType.KFZ){
BigDecimal finishAllTime = BigDecimal.valueOf(floatBatchAdd(taskList.stream().filter(o->o.getStatus().equals("done")).map(o->o.getEstimate()).collect(Collectors.toList())));
BigDecimal finishAllTime = BigDecimal.valueOf(floatBatchAdd(taskList.stream().map(o->o.getEstimate()).collect(Collectors.toList())));
List<ZtTask> 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())
@ -2018,7 +2014,7 @@ public class ZtProjectServiceImpl extends ServiceImpl<ZtProjectMapper, ZtProject
//任务及时完成率
List<ZtBug> bugList = this.bugService.bugBoundsListByProjectAndDate(products.stream().map(o -> o.getId()).collect(Collectors.toList()), firstDayOfMonth, lastDayOfMonth, account);
List<ZtBug> bugList = this.bugService.bugBindsListByProjectAndDate(products.stream().map(o -> o.getId()).collect(Collectors.toList()), firstDayOfMonth, lastDayOfMonth, account,null);
bugList =bugList.stream().filter(o->o.getBugType().equals("prod")).collect(Collectors.toList());
d.setBugCount(BigDecimal.valueOf(bugList.size()));
@ -2451,11 +2447,6 @@ public class ZtProjectServiceImpl extends ServiceImpl<ZtProjectMapper, ZtProject
return new PageInfo<ZtProjectDTO>(result);
}
private List<Integer> userAuth() {
return null;
}
private Map<Integer, List<ZtProjectproduct>> getZtProjectproductMap(List<ZtProjectDTO> result) {
List<ZtProjectproduct> list = this.projectproductService.list(new QueryWrapper<ZtProjectproduct>()
.lambda().in(ZtProjectproduct::getProject, result.stream().map(o -> o.getId()).collect(Collectors.toList())));

View File

@ -346,10 +346,6 @@ public class ZtReleaseServiceImpl extends ServiceImpl<ZtReleaseMapper, ZtRelease
List<ZtReleaseDetails> details = this.releaseDetailsService.list(new QueryWrapper<ZtReleaseDetails>().lambda().eq(ZtReleaseDetails::getReleaseId, ztRelease.getId())
.ne(ZtReleaseDetails::getStatus, "closed"));
if (dto.getRevieweResult() == 1) {
List<Integer> storyList = new ArrayList<Integer>();
List<Integer> bugList = new ArrayList<Integer>();
@ -418,16 +414,20 @@ public class ZtReleaseServiceImpl extends ServiceImpl<ZtReleaseMapper, ZtRelease
b.append("<div style=\"font-family: -apple-system, system-ui; font-size: 14px; color: rgb(0, 0, 0);\"><span style=\"line-height: 1.6;\"><br></span></div>");
b.append("<table id=\"table_0\" data-editing-info=\"{&quot;topBorderColor&quot;:&quot;#ABABAB&quot;,&quot;bottomBorderColor&quot;:&quot;#ABABAB&quot;,&quot;verticalBorderColor&quot;:&quot;#ABABAB&quot;,&quot;hasHeaderRow&quot;:false,&quot;hasFirstColumn&quot;:false,&quot;hasBandedRows&quot;:false,&quot;hasBandedColumns&quot;:false,&quot;bgColorEven&quot;:null,&quot;bgColorOdd&quot;:&quot;#ABABAB20&quot;,&quot;headerRowColor&quot;:&quot;#ABABAB&quot;,&quot;tableBorderFormat&quot;:0,&quot;verticalAlign&quot;:&quot;middle&quot;}\" style=\"box-sizing: border-box; border-collapse: collapse; border-spacing: 0px;\">");
b.append("<tbody>" +
"<tr><td style=\"width: 78.25px; height: 31.8118px; border-width: 1px; border-style: solid; border-color: rgb(171, 171, 171); padding: 4px 8px; vertical-align: middle; box-sizing: border-box;\"><div style=\"font-family: -apple-system, system-ui; font-size: 14px; color: rgb(0, 0, 0);\"><span style=\"line-height: 1.6;\">需求编号</span></div></td><td style=\"width: 996.266px; height: 31.8118px; border-width: 1px; border-style: solid; border-color: rgb(171, 171, 171); padding: 4px 8px; vertical-align: middle; box-sizing: border-box;\"><div style=\"font-family: -apple-system, system-ui; font-size: 14px; color: rgb(0, 0, 0);\">研发需求名称</div></td><td style=\"width: 108.266px; height: 31.8118px; border-width: 1px; border-style: solid; border-color: rgb(171, 171, 171); padding: 4px 8px; vertical-align: middle; box-sizing: border-box;\"><div style=\"font-family: -apple-system, system-ui; font-size: 14px; color: rgb(0, 0, 0);\">验收人</div></td>" +
"</tr>" );
// "<tr><td style=\"width: 78.25px; height: 31.8118px; border-width: 1px; border-style: solid; border-color: rgb(171, 171, 171); padding: 4px 8px; vertical-align: middle; box-sizing: border-box;\"><div style=\"font-family: -apple-system, system-ui; font-size: 14px; color: rgb(0, 0, 0);\"><span style=\"line-height: 1.6;\">需求编号</span></div></td><td style=\"width: 996.266px; height: 31.8118px; border-width: 1px; border-style: solid; border-color: rgb(171, 171, 171); padding: 4px 8px; vertical-align: middle; box-sizing: border-box;\"><div style=\"font-family: -apple-system, system-ui; font-size: 14px; color: rgb(0, 0, 0);\">研发需求名称</div></td><td style=\"width: 108.266px; height: 31.8118px; border-width: 1px; border-style: solid; border-color: rgb(171, 171, 171); padding: 4px 8px; vertical-align: middle; box-sizing: border-box;\"><div style=\"font-family: -apple-system, system-ui; font-size: 14px; color: rgb(0, 0, 0);\">验收人</div></td>" +
// "</tr>"
"<tr><td style=\"border-width: 1px; border-style: solid; border-color: rgb(171, 171, 171); padding: 4px 8px; vertical-align: middle; width: 83.6094px; height: 31.8118px; box-sizing: border-box;\"><div style=\"font-family: -apple-system, system-ui; font-size: 14px; color: rgb(0, 0, 0);\"><span style=\"line-height: 1.6;\">需求编号</span></div></td><td style=\"border-width: 1px; border-style: solid; border-color: rgb(171, 171, 171); padding: 4px 8px; vertical-align: middle; width: 759.484px; height: 31.8118px; box-sizing: border-box;\"><div style=\"font-family: -apple-system, system-ui; font-size: 14px; color: rgb(0, 0, 0);\">研发需求名称</div></td><td style=\"border-width: 1px; border-style: solid; border-color: rgb(171, 171, 171); padding: 4px 8px; vertical-align: middle; width: 258.656px; height: 31.8118px; box-sizing: border-box;\"><div style=\"font-family: -apple-system, system-ui; font-size: 14px; color: rgb(0, 0, 0);\">来源部门</div></td><td style=\"border-width: 1px; border-style: solid; border-color: rgb(171, 171, 171); padding: 4px 8px; vertical-align: middle; width: 158.25px; height: 31.8118px; box-sizing: border-box;\"><div style=\"font-family: -apple-system, system-ui; font-size: 14px; color: rgb(0, 0, 0);\">验收人</div></td></tr>"
);
for (ZtStory s:ztStories) {
ZtUser ztUser = userMap.get(s.getYsUser());
if(ztUser!=null&&!StringUtils.isEmpty(ztUser.getEmail())){
String str= "<tr><td style=\"width: 78.25px; height: 31.8118px; border-width: 1px; border-style: solid; border-color: rgb(171, 171, 171); padding: 4px 8px; vertical-align: middle; box-sizing: border-box;\"><div style=\"font-family: -apple-system, system-ui; font-size: 14px; color: rgb(0, 0, 0);\"><span style=\"line-height: 1.6;\">{id}</span></div></td><td style=\"width: 996.266px; height: 31.8118px; border-width: 1px; border-style: solid; border-color: rgb(171, 171, 171); padding: 4px 8px; vertical-align: middle; box-sizing: border-box;\"><div style=\"font-family: -apple-system, system-ui; font-size: 14px; color: rgb(0, 0, 0);\"><span style=\"line-height: 1.6;\">{title}</span></div></td><td style=\"width: 108.266px; height: 31.8118px; border-width: 1px; border-style: solid; border-color: rgb(171, 171, 171); padding: 4px 8px; vertical-align: middle; box-sizing: border-box;\"><div style=\"font-family: -apple-system, system-ui; font-size: 14px; color: rgb(0, 0, 0);\"><span style=\"line-height: 1.6;\">{nickName}</span></div></td>" +
"</tr>";
// String str= "<tr><td style=\"width: 78.25px; height: 31.8118px; border-width: 1px; border-style: solid; border-color: rgb(171, 171, 171); padding: 4px 8px; vertical-align: middle; box-sizing: border-box;\"><div style=\"font-family: -apple-system, system-ui; font-size: 14px; color: rgb(0, 0, 0);\"><span style=\"line-height: 1.6;\">{id}</span></div></td><td style=\"width: 996.266px; height: 31.8118px; border-width: 1px; border-style: solid; border-color: rgb(171, 171, 171); padding: 4px 8px; vertical-align: middle; box-sizing: border-box;\"><div style=\"font-family: -apple-system, system-ui; font-size: 14px; color: rgb(0, 0, 0);\"><span style=\"line-height: 1.6;\">{title}</span></div></td><td style=\"width: 108.266px; height: 31.8118px; border-width: 1px; border-style: solid; border-color: rgb(171, 171, 171); padding: 4px 8px; vertical-align: middle; box-sizing: border-box;\"><div style=\"font-family: -apple-system, system-ui; font-size: 14px; color: rgb(0, 0, 0);\"><span style=\"line-height: 1.6;\">{nickName}</span></div></td>" +
// "</tr>";
String str="<tr><td style=\"border-width: 1px; border-style: solid; border-color: rgb(171, 171, 171); padding: 4px 8px; vertical-align: middle; width: 83.6094px; height: 31.8118px; box-sizing: border-box;\"><div style=\"font-family: -apple-system, system-ui; font-size: 14px; color: rgb(0, 0, 0);\"><span style=\"line-height: 1.6;\">{id}</span></div></td><td style=\"border-width: 1px; border-style: solid; border-color: rgb(171, 171, 171); padding: 4px 8px; vertical-align: middle; width: 759.484px; height: 31.8118px; box-sizing: border-box;\"><div style=\"font-family: -apple-system, system-ui; font-size: 14px; color: rgb(0, 0, 0);\"><span style=\"line-height: 1.6;\">{title}</span></div></td><td style=\"border-width: 1px; border-style: solid; border-color: rgb(171, 171, 171); padding: 4px 8px; vertical-align: middle; width: 258.656px; height: 31.8118px; box-sizing: border-box;\"><div style=\"font-family: -apple-system, system-ui; font-size: 14px; color: rgb(0, 0, 0);\">{dept}</div></td><td style=\"border-width: 1px; border-style: solid; border-color: rgb(171, 171, 171); padding: 4px 8px; vertical-align: middle; width: 158.25px; height: 31.8118px; box-sizing: border-box;\"><div style=\"font-family: -apple-system, system-ui; font-size: 14px; color: rgb(0, 0, 0);\"><span style=\"line-height: 1.6;\">{nickName}</span></div></td></tr>";
str=str.replace("{nickName}",ztUser.getNickname());
str=str.replace("{title}",s.getTitle());
str=str.replace("{id}",s.getId().toString());
str=str.replace("{dept}",s.getSource());
b.append(str);
mailTo.add(ztUser.getEmail());
}
@ -473,7 +473,7 @@ public class ZtReleaseServiceImpl extends ServiceImpl<ZtReleaseMapper, ZtRelease
str=str.replace("{nikename}",ztUser.getNickname());
str=str.replace("{title}",s.getTitle());
str=str.replace("{id}",s.getId().toString());
str=str.replace("{dept}",ztUser.getDeptName());
str=str.replace("{dept}",s.getSource());
str=str.replace("{status}","已发布");
str=str.replace("{releaseDate}",DateUtils.formatDate(release.getRealReleaseDate()==null?release.getReleaseDate():release.getRealReleaseDate(),"yyyy-MM-dd"));
str=str.replace("{endDate}",DateUtils.formatDate(DateUtils.dateAddDay(release.getRealReleaseDate()==null?release.getReleaseDate():release.getRealReleaseDate(),14)));

View File

@ -333,13 +333,43 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
if (firstDayOfMonth == null || lastDayOfMonth == null) {
return new ArrayList<>();
}
List<ZtTask> taskList = this.list(new QueryWrapper<ZtTask>().lambda()
.select(SFunctionColums.taskColumes())
.in(ZtTask::getProduct,pids)
.ge(ZtTask::getFinishedDate, firstDayOfMonth).le(ZtTask::getFinishedDate, lastDayOfMonth));
// List<ZtTask> taskList = this.list(new QueryWrapper<ZtTask>().lambda()
// .select(SFunctionColums.taskColumes())
// .in(ZtTask::getProduct,pids)
// .and(e->e.ge(ZtTask::getFinishedDate, firstDayOfMonth).le(ZtTask::getFinishedDate, lastDayOfMonth))
// .and(e->e.or().)
// );
// return this.baseMapper.taskListByPIdsAndDate(pids,firstDayOfMonth,lastDayOfMonth);
return taskList;
return this.baseMapper.taskListByPIdsAndDate(pids,firstDayOfMonth,lastDayOfMonth);
// return taskList;
}
@Override
public List<ZtTask> getDelayTask(List<ZtTask> t) {
if (CollectionUtils.isEmpty(t)) {
return new ArrayList<>();
}
List delayList = new ArrayList();
for (ZtTask task : t) {
//完成延期
if (task.getFinishedDate() != null && task.getFinishedDate().getTime() > DateUtils.getDayLast(task.getDeadline()).getTime()) {
delayList.add(task);
} else {
if (task.getFinishedDate() == null) {
//直接完成任务等待审核不需要管
if (task.getFinishedFlag() == 1) {
//直接完成任务的不管
} else {
//当前时间大于预计完成时间
if (new Date().getTime() > DateUtils.getDayLast(task.getDeadline()).getTime()) {
delayList.add(task);
}
}
}
}
}
return delayList;
}
@Override
@ -356,40 +386,12 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
List<ZtTask> taskList = this.list(new QueryWrapper<ZtTask>().lambda()
.select(SFunctionColums.taskColumes())
.in(ZtTask::getProduct,pids)
.in(ZtTask::getAssignedTo,uids)
.in(ZtTask::getAssignedTo,uids)
.ge(ZtTask::getFinishedDate, firstDayOfMonth).le(ZtTask::getFinishedDate, lastDayOfMonth));
return taskList;
}
@Override
public List<ZtTask> getDelayTask(List<ZtTask> t) {
if (CollectionUtils.isEmpty(t)) {
return new ArrayList<>();
}
List delayList = new ArrayList();
for (ZtTask task : t) {
//完成延期
if (task.getFinishedDate() != null && task.getFinishedDate().getTime() > DateUtils.getDayLast(task.getDeadline()).getTime()) {
delayList.add(task);
} else {
if (task.getFinishedDate() == null) {
//直接完成任务等待审核不需要管
// if (task.getFinishedFlag() == 1) {
// //直接完成任务的不管
// } else {
// //当前时间大于预计完成时间
// if (new Date().getTime() > DateUtils.getDayLast(task.getDeadline()).getTime()) {
// delayList.add(task);
// }
// }
}
}
}
return delayList;
}
@Override
public List<ZtTask> getOnTimeTask(List<ZtTask> t) {
if (CollectionUtils.isEmpty(t)) {
@ -425,10 +427,6 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
return result;
}
@Override
public List<ZtTask> getDevelAllocation(List<ZtTask> tList) {
return getNormalTaskList(tList);
}
@Override
public List<ZtTask> develTaskListByExecutions(Date firstDayOfMonth, Date lastDayOfMonth, List<Integer> eIds) {
@ -1166,7 +1164,7 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
for (ZtTask ztTask : saveList) {
if (!ztTask.getStatus().equals("reviewing")) {
this.storyService.taskFinishChangeStatus(ztTask.getStory(), null, TaskType.transferType(ztTask.getType()), false);
taskSendZpMessage(ztTask.getId(), null, ztProject.getPm());
taskSendZpMessage(ztTask.getId(), null, ztTask.getAssignedTo());
} else {
taskSendPsMessage(ztTask.getId(), ztProject.getPm(),ztTask.getOpenedby());

View File

@ -1,19 +1,24 @@
package com.sa.zentao.utils;
import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.sa.zentao.dao.ZtStoryCaseDTO;
import com.sa.zentao.entity.ZtBug;
import com.sa.zentao.entity.ZtStoryCase;
import com.sa.zentao.entity.ZtStoryFeedback;
import com.sa.zentao.entity.ZtTask;
import java.lang.invoke.CallSite;
import java.lang.invoke.LambdaMetafactory;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class SFunctionColums {
public static List<SFunction<ZtTask, ?>> taskColumes(){
List<SFunction<ZtTask, ?>> result=new ArrayList<>();
public static List<SFunction<ZtTask, ?>> taskColumes() {
List<SFunction<ZtTask, ?>> result = new ArrayList<>();
result.add(ZtTask::getId);
result.add(ZtTask::getAssignedTo);
result.add(ZtTask::getProduct);
@ -45,8 +50,8 @@ public class SFunctionColums {
}
public static List<SFunction<ZtStoryCase, ?>> caseColumes(){
List<SFunction<ZtStoryCase, ?>> result=new ArrayList<>();
public static List<SFunction<ZtStoryCase, ?>> caseColumes() {
List<SFunction<ZtStoryCase, ?>> result = new ArrayList<>();
result.add(ZtStoryCase::getId);
@ -65,36 +70,148 @@ public class SFunctionColums {
}
public static List<SFunction<ZtStoryFeedback, ?>> feedbackColumes(){
List<SFunction<ZtStoryFeedback, ?>> result=new ArrayList<>();
result.add(ZtStoryFeedback::getId);
result.add(ZtStoryFeedback::getName);
result.add(ZtStoryFeedback::getOpenedBy);
result.add(ZtStoryFeedback::getFiles);
result.add(ZtStoryFeedback::getOpenedDate);
result.add(ZtStoryFeedback::getSource);
result.add(ZtStoryFeedback::getStatus);
result.add(ZtStoryFeedback::getOpenSource);
result.add(ZtStoryFeedback::getPlanEndDate);
result.add(ZtStoryFeedback::getAssignedTo);
result.add(ZtStoryFeedback::getSpec);
result.add(ZtStoryFeedback::getFinishDate);
result.add(ZtStoryFeedback::getType);
result.add(ZtStoryFeedback::getCloseRemark);
result.add(ZtStoryFeedback::getProduct);
result.add(ZtStoryFeedback::getPlanFinishDate);
result.add(ZtStoryFeedback::getHandDate);
result.add(ZtStoryFeedback::getCloseDate);
result.add(ZtStoryFeedback::getClosedBy);
result.add(ZtStoryFeedback::getApprovalRemark);
result.add(ZtStoryFeedback::getYsFlag);
result.add(ZtStoryFeedback::getDontHandSelect);
result.add(ZtStoryFeedback::getDontHandRemark);
result.add(ZtStoryFeedback::getFinishedRemark);
public static List<SFunction<ZtStoryFeedback, ?>> feedbackColumes() {
List<SFunction<ZtStoryFeedback, ?>> result = new ArrayList<>();
result.add(ZtStoryFeedback::getId);
result.add(ZtStoryFeedback::getName);
result.add(ZtStoryFeedback::getOpenedBy);
result.add(ZtStoryFeedback::getFiles);
result.add(ZtStoryFeedback::getOpenedDate);
result.add(ZtStoryFeedback::getSource);
result.add(ZtStoryFeedback::getStatus);
result.add(ZtStoryFeedback::getOpenSource);
result.add(ZtStoryFeedback::getPlanEndDate);
result.add(ZtStoryFeedback::getAssignedTo);
result.add(ZtStoryFeedback::getSpec);
result.add(ZtStoryFeedback::getFinishDate);
result.add(ZtStoryFeedback::getType);
result.add(ZtStoryFeedback::getCloseRemark);
result.add(ZtStoryFeedback::getProduct);
result.add(ZtStoryFeedback::getPlanFinishDate);
result.add(ZtStoryFeedback::getHandDate);
result.add(ZtStoryFeedback::getCloseDate);
result.add(ZtStoryFeedback::getClosedBy);
result.add(ZtStoryFeedback::getApprovalRemark);
result.add(ZtStoryFeedback::getYsFlag);
result.add(ZtStoryFeedback::getDontHandSelect);
result.add(ZtStoryFeedback::getDontHandRemark);
result.add(ZtStoryFeedback::getFinishedRemark);
return result;
}
public static List<SFunction<ZtBug, ?>> bugColumes() {
List<SFunction<ZtBug, ?>> result = new ArrayList<>();
// 基础ID和关联ID字段
result.add(ZtBug::getId);
result.add(ZtBug::getProject);
result.add(ZtBug::getProduct);
result.add(ZtBug::getInjection);
result.add(ZtBug::getIdentify);
result.add(ZtBug::getBranch);
result.add(ZtBug::getModule);
result.add(ZtBug::getExecution);
result.add(ZtBug::getPlan);
result.add(ZtBug::getStory);
result.add(ZtBug::getStoryversion);
result.add(ZtBug::getTask);
result.add(ZtBug::getTotask);
result.add(ZtBug::getTostory);
// 描述性字段
result.add(ZtBug::getTitle);
result.add(ZtBug::getKeywords);
result.add(ZtBug::getSeverity);
result.add(ZtBug::getPri);
result.add(ZtBug::getType);
result.add(ZtBug::getOs);
result.add(ZtBug::getBrowser);
result.add(ZtBug::getHardware);
result.add(ZtBug::getFound);
// result.add(ZtBug::getSteps);
// 状态相关字段
result.add(ZtBug::getStatus);
result.add(ZtBug::getSubstatus);
result.add(ZtBug::getColor);
result.add(ZtBug::getConfirmed);
result.add(ZtBug::getActivatedcount);
result.add(ZtBug::getActivateddate);
// 人员相关字段
result.add(ZtBug::getFeedbackby);
result.add(ZtBug::getNotifyemail);
result.add(ZtBug::getMailto);
result.add(ZtBug::getOpenedby);
result.add(ZtBug::getOpeneddate);
result.add(ZtBug::getOpenedbuild);
result.add(ZtBug::getAssignedTo);
result.add(ZtBug::getAssigneddate);
result.add(ZtBug::getDeadline);
result.add(ZtBug::getResolvedby);
result.add(ZtBug::getResolution);
return result;
}
public static SFunction getSFunction(Class<?> entityClass, String fieldName) {
// 获取实体类中名为 fieldName 的字段。
Field field = getDeclaredField(entityClass, fieldName);
if (field == null) {
//如果字段不存在,使用 ExceptionUtils 抛出一个异常,指出实体类中没有找到该字段。
throw ExceptionUtils.mpe("This class %s is not have field %s ", entityClass.getName(), fieldName);
}
SFunction func = null;
// 获取 MethodHandles.Lookup 实例,用于反射操作。
final MethodHandles.Lookup lookup = MethodHandles.lookup();
// 定义方法类型,表示实体类的实例方法,该方法返回字段的类型。
MethodType methodType = MethodType.methodType(field.getType(), entityClass);
// 用于存储 LambdaMetafactory 创建的 CallSite 对象。
final CallSite site;
// 构造标准的 Java getter 方法名。
String getFunName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
try {
// 使用 LambdaMetafactory 创建一个动态的 SFunction 实例。
site = LambdaMetafactory.altMetafactory(
lookup,
"invoke",
MethodType.methodType(SFunction.class),
methodType,
lookup.findVirtual(entityClass, getFunName, MethodType.methodType(field.getType())),
methodType
);
// 使用 CallSite 来获取 SFunction 实例。
func = (SFunction) site.getTarget().invokeExact();
// 将生成的 SFunction 实例存储到缓存中。
return func;
} catch (Throwable e) {
// 如果在创建 SFunction 过程中发生异常,抛出异常,指出实体类中没有找到对应的 getter 方法。
throw ExceptionUtils.mpe("This class %s is not have method %s ", entityClass.getName(), getFunName);
}
}
/**
* 递归获取类中声明的字段,包括私有字段。
* @param clazz 要检查的类。
* @param fieldName 要查找的字段名。
* @return 返回找到的 Field 对象,如果没有找到则返回 null。
*/
public static Field getDeclaredField(Class<?> clazz, String fieldName) {
Field field = null;
// 遍历类及其父类,直到到达 Object 类。
for (; clazz != Object.class; clazz = clazz.getSuperclass()) {
try {
// 尝试获取声明的字段。
field = clazz.getDeclaredField(fieldName);
// 如果找到字段,返回该字段。
return field;
} catch (NoSuchFieldException e) {
// 如果没有找到字段,继续查找父类。
// 这里不处理异常,让其继续执行循环。
}
}
// 如果没有找到字段,返回 null。
return null;
}
}

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sa.zentao.mapper.ZtBugBoundUserMapper">
<resultMap id="BaseResultMap" type="com.sa.zentao.entity.ZtBugBoundUser">
<mapper namespace="com.sa.zentao.mapper.ZtBugBindUserMapper">
<resultMap id="BaseResultMap" type="com.sa.zentao.entity.ZtBugBindUser">
<result column="id" property="id" />
<result column="bug_id" property="bugId" />
<result column="assigned_to" property="assignedTo" />

View File

@ -743,7 +743,7 @@
and openedDate <![CDATA[<=]]> #{end}
</select>
<select id="bugBoundsListByProjectAndDate" resultType="com.sa.zentao.entity.ZtBug">
<select id="bugBindsListByProjectAndDate" resultType="com.sa.zentao.entity.ZtBug">
SELECT s.id,
s.project,
@ -814,7 +814,7 @@
s.ys_remark,
s.release_flag
from zt_bug s
LEFT JOIN zt_bug_bound_user u on s.id = u.bug_id
LEFT JOIN zt_bug_bind_user u on s.id = u.bug_id
WHERE 1= 1 and u.assigned_to = #{account}
@ -825,11 +825,124 @@
#{id}
</foreach>
</if>
<if test="bugType != null ">
and s.bug_type = #{bugType.value }
</if>
and openedDate <![CDATA[>=]]> #{start}
and openedDate <![CDATA[<=]]> #{end}
group by s.id
</select>
<select id="bugListByTestUser" resultType="com.sa.zentao.entity.ZtBug">
SELECT s.id,
s.project,
s.product,
s.injection,
s.identify,
s.branch,
s.module,
s.execution,
s.plan,
s.story,
s.storyVersion,
s.task,
s.toTask,
s.toStory,
s.title,
s.keywords,
s.severity,
s.pri,
s.type,
s.os,
s.browser,
s.hardware,
s.found,
s.`status`,
s.subStatus,
s.color,
s.confirmed,
s.activatedCount,
s.activatedDate,
s.feedbackBy,
s.notifyEmail,
s.mailto,
s.openedBy,
s.openedDate,
s.assignedTo,
s.openedBuild,
s.assignedDate,
s.deadline,
s.resolvedBy,
s.resolution,
s.resolvedBuild,
s.resolvedDate,
s.closedBy,
s.closedDate,
s.duplicateBug,
s.linkBug,
s.caseId,
s.caseVersion,
s.feedback,
s.result,
s.repo,
s.mr,
s.entry,
s.`lines`,
s.v1,
s.v2,
s.repoType,
s.testtask,
s.issueKey,
s.lastEditedBy,
s.lastEditedDate,
s.deleted,
s.file_url,
s.bug_type,
s.ys_user,
s.ys_flag,
s.ys_remark,
s.release_flag,
u.assigned_to bindUser
from zt_bug s
LEFT JOIN zt_bug_bind_user u on s.id = u.bug_id
WHERE 1= 1
<if test="pIds != null and pIds.size() > 0">
and s.product in
<foreach collection="pIds" item="id" index="index"
open="(" close=")" separator=",">
#{id}
</foreach>
</if>
<if test="accounts != null and accounts.size() > 0">
and u.assigned_to in
<foreach collection="accounts" item="id" index="index"
open="(" close=")" separator=",">
#{id}
</foreach>
</if>
<if test="bugType != null ">
and s.bug_type = #{bugType.value }
</if>
<if test="start != null ">
and openedDate <![CDATA[>=]]> #{start}
</if>
<if test="end != null ">
and openedDate <![CDATA[<=]]> #{end}
</if>
group by s.id
</select>
</mapper>

View File

@ -644,8 +644,12 @@
#{id}
</foreach>
and (
(openedDate >= #{start} and s.openedDate <![CDATA[<=]]> #{end})
(
s.status in ('wait','doing') and s.deadline >= #{start}
and DATE_ADD(deadline, INTERVAL 1 DAY) <![CDATA[<]]> #{end}
)
or
( finishedDate >= #{start} and s.finishedDate <![CDATA[<=]]> #{end})
)