任务未开始开始中也计算工时,测试任务提出率修改为按照需求来
This commit is contained in:
@ -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();
|
||||
// }
|
||||
//
|
||||
// }
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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>");
|
||||
}
|
||||
}
|
@ -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;
|
||||
|
@ -158,6 +158,4 @@ public class ZtReleaseController {
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@ -80,4 +80,6 @@ public class CarFiveTypeDTO implements Serializable {
|
||||
*/
|
||||
private Integer status;
|
||||
|
||||
private String userName;
|
||||
|
||||
}
|
||||
|
@ -88,4 +88,6 @@ public class CarFiveType implements Serializable {
|
||||
private Integer status;
|
||||
|
||||
private String model;
|
||||
|
||||
private String userName;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
30
src/main/java/com/sa/zentao/enums/BugTypeEnums.java
Normal file
30
src/main/java/com/sa/zentao/enums/BugTypeEnums.java
Normal 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;
|
||||
}
|
||||
}
|
@ -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> {
|
||||
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -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
|
||||
|
@ -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());
|
||||
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
@ -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());
|
||||
|
||||
|
@ -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())));
|
||||
|
@ -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=\"{"topBorderColor":"#ABABAB","bottomBorderColor":"#ABABAB","verticalBorderColor":"#ABABAB","hasHeaderRow":false,"hasFirstColumn":false,"hasBandedRows":false,"hasBandedColumns":false,"bgColorEven":null,"bgColorOdd":"#ABABAB20","headerRowColor":"#ABABAB","tableBorderFormat":0,"verticalAlign":"middle"}\" 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)));
|
||||
|
@ -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());
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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" />
|
@ -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>
|
||||
|
@ -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})
|
||||
)
|
||||
|
||||
|
Reference in New Issue
Block a user