3 Commits

Author SHA1 Message Date
3e864a5770 Merge branch 'refs/heads/dev-2025-temporary' into storymuchexec_250108
# Conflicts:
#	src/main/java/com/sa/zentao/service/impl/ZtTaskServiceImpl.java
#	src/main/resources/mapper/ZtStoryMapper.xml
2025-12-30 09:28:18 +08:00
0f1c7b02fe 产品角色等 2025-12-25 14:02:41 +08:00
8f0c7a020c 产品角色等 2025-12-25 13:46:26 +08:00
28 changed files with 151 additions and 655 deletions

11
pom.xml
View File

@@ -18,17 +18,6 @@
<boot.version>3.3.0</boot.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.6.3</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>

View File

@@ -8,13 +8,11 @@ import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.github.pagehelper.PageInfo;
import com.sa.zentao.dao.*;
import com.sa.zentao.entity.ZtProject;
import com.sa.zentao.entity.ZtProjectproduct;
import com.sa.zentao.entity.ZtStoryFeedback;
import com.sa.zentao.entity.ZtStoryUser;
import com.sa.zentao.enums.StoryStageEnums;
import com.sa.zentao.enums.StoryStatusEnums;
import com.sa.zentao.enums.UserStoryEnums;
@@ -28,7 +26,6 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -185,27 +182,6 @@ public class ZtStoryController {
}
/**
* 测试提交验收
* @param qo
* @return
*/
@RequestMapping(value = "/testSubmitVerified", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
public Result<ZtStoryDTO> testSubmitVerified(@RequestBody ZtStoryDTO qo){
ztStoryService.testSubmitVerified(qo);
return Result.success();
}
/**
* 产品验收通过
* @param qo
* @return
*/
@RequestMapping(value = "/storyProductUserYs", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
public Result<ZtStoryDTO> storyProductUserYs(@RequestBody ZtStoryDTO qo){
ztStoryService.storyProductUserYs(qo);
return Result.success();
}
@RequestMapping(value = "/storyListByProject", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
public Result<ZtStoryDTO> storyListByProject(@RequestBody ZtProjectQo qo){
@@ -360,26 +336,6 @@ public class ZtStoryController {
List<ZtProject> list = ztStoryService.execListByProject(dto);
return Result.success(list);
}
/**
* 指派产品人
* @param dto
* @return
*/
@RequestMapping(value = "/assignedToProductUser", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
public Result assignedToProductUser(@RequestBody @Validated ZtStoryDTO dto){
this.ztStoryService.assignedToProductUser(dto);
return Result.success();
}
/**
* 指派测试人
* @param dto
* @return
*/
@RequestMapping(value = "/assignedToTestUser", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
public Result assignedToTestUser(@RequestBody @Validated ZtStoryDTO dto){
this.ztStoryService.assignedToTestUser(dto);
return Result.success();
}

View File

@@ -7,14 +7,10 @@ import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.github.pagehelper.PageInfo;
import com.sa.zentao.conf.RiskUserThreadLocal;
import com.sa.zentao.dao.*;
import com.sa.zentao.entity.ZtStory;
import com.sa.zentao.entity.ZtStoryUser;
import com.sa.zentao.enums.ActionStatus;
import com.sa.zentao.enums.ActionType;
import com.sa.zentao.enums.UserStoryEnums;
import com.sa.zentao.qo.StoryQo;
import com.sa.zentao.qo.ZtProjectQo;
@@ -23,7 +19,6 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
@@ -61,17 +56,6 @@ public class ZtStoryUserController {
return Result.success();
}
/**
* 指派产品人
* @param dto
* @return
*/
@RequestMapping(value = "/assignedToProductUser", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
public Result assignedToProductUser(@RequestBody @Validated ZtStoryUserDTO dto){
this.storyUserService.assignedToProductUser(dto);
return Result.success();
}
@RequestMapping(value = "/addStory", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
public Result addStory(@RequestBody ZtStoryUserDTO dto){

View File

@@ -135,11 +135,11 @@ public class ZtUserController {
}
eq.in(ZtUser::getAccount,execution.stream().map(o->o.getAccount()).collect(Collectors.toList()));
}else{
this.userMapper.selectOne(new QueryWrapper<ZtUser>().lambda()
.eq(ZtUser::getAccount,RiskUserThreadLocal.get().getName()));
this.userMapper.selectOne(new QueryWrapper<ZtUser>().lambda().eq(ZtUser::getAccount,RiskUserThreadLocal.get().getName()));
}
eq.eq(dto.getUserType()!=null,ZtUser::getUserType,dto.getUserType());
return Result.success(userService.list(eq));
return Result.success(userService.list(eq
));
}
@RequestMapping(value = "/storyReviewList", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")

View File

@@ -160,26 +160,4 @@ public class PerformanceDTO implements Serializable {
private BigDecimal professionalSkillEnhancementScore=BigDecimal.ZERO;
//问题管理得分
private BigDecimal developFeedbackStory=BigDecimal.valueOf(10);
/**
* 产品经理
*/
// 产品缺陷率
private BigDecimal productBugRate=BigDecimal.ZERO;
//项目准时率 需求发布准时率 研发需求/用户需求
private BigDecimal productProjectOnTimeRateScore=BigDecimal.ZERO;
//主动性责任感
private BigDecimal productResponsibilityScore=BigDecimal.valueOf(5);
//需求会议
private BigDecimal productMeetScore=BigDecimal.valueOf(10);
//问题响应
private BigDecimal productProblemResponse=BigDecimal.valueOf(15);
//需求准确性
private BigDecimal accurateDemand=BigDecimal.valueOf(20);;
//产品规划
private BigDecimal productPlanning=BigDecimal.valueOf(10);;
//本阶段计划发布数量
private BigDecimal productPlanStoryNum;
//本阶段准时发布研发数量
private BigDecimal productPlanStoryOnTimeNum;
}

View File

@@ -3,7 +3,6 @@ package com.sa.zentao.dao;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.sa.zentao.enums.UserType;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -206,8 +205,6 @@ public class ZtProjectDTO<T> implements Serializable {
private String deleted;
private UserType userType;
private List<T> children;
private List<Integer> storyIds;

View File

@@ -8,7 +8,6 @@ import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.sa.zentao.entity.ZtStoryCase;
import com.sa.zentao.entity.ZtStoryreview;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -32,7 +31,6 @@ public class ZtStoryDTO implements Serializable {
private static final long serialVersionUID = 1L;
@NotNull(message = "请录入ID")
@ExcelProperty(value = "ID",index =0)
private Integer id;
@ExcelProperty(value = "研发需求名称",index =1)
@@ -50,8 +48,6 @@ public class ZtStoryDTO implements Serializable {
private Date planEndDate;
@ExcelProperty(value = "阶段",index =6)
private String stage;
@ExcelIgnore
private String stageName;
@ExcelProperty(value = "指派给",index =7)
private String assignedToName;
@@ -156,32 +152,8 @@ public class ZtStoryDTO implements Serializable {
private Integer frombug;
@ExcelIgnore
private Integer feedback;
/**
* 产品人
*/
@ExcelIgnore
private String productUser;
/**
* 产品人
*/
@ExcelIgnore
private String productUserName;
/**
* 产品人
*/
@ExcelIgnore
private String testUser;
/**
* 产品人
*/
@ExcelIgnore
private String testUserName;
/**
* 1是否内部验收 0不需要
*/
@ExcelIgnore
private Integer innerYsFlag;
@ExcelIgnore
private String keywords;
@@ -245,6 +217,7 @@ public class ZtStoryDTO implements Serializable {
private Date planYsDate;
@ExcelIgnore
private Date activateddate;
@ExcelIgnore

View File

@@ -6,11 +6,8 @@ import com.alibaba.excel.metadata.data.WriteCellData;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NonNull;
import java.io.Serializable;
import java.time.LocalDate;
@@ -34,7 +31,6 @@ public class ZtStoryUserDTO implements Serializable {
// @TableId(value = "id", type = IdType.AUTO)
// @ExcelProperty
@NotNull(message = "ID不能为空")
@ExcelProperty(value = "ID",index =0)
private Integer id;
@@ -134,10 +130,6 @@ public class ZtStoryUserDTO implements Serializable {
@ExcelIgnore
private String color;
@ExcelIgnore
private String productUserName;
@ExcelIgnore
private String productUserColor;
@ExcelIgnore
private String stage;
@ExcelIgnore
@@ -155,7 +147,7 @@ public class ZtStoryUserDTO implements Serializable {
private String openedby;
@NotBlank(message = "指派??")
@ExcelIgnore
private String assignedto;
@ExcelIgnore
@@ -281,10 +273,4 @@ public class ZtStoryUserDTO implements Serializable {
//1.需要 2.不需要
@ExcelIgnore
private Integer needImprove;
/**
* 产品用户
*/
@ExcelIgnore
private String productUser;
}

View File

@@ -212,8 +212,4 @@ public class ZtTaskDTO implements Serializable {
* 交付物
*/
private String deliverContent;
/**
* 1提交 0不提交
*/
private Integer innerYsFlag;
}

View File

@@ -190,12 +190,7 @@ public class ZtStory implements Serializable {
private Date developedDate;
//结束日期 测试结束
private Date endDate;
//内部验收时间
@TableField(exist = false)
private Date innerYsTime;
//测试提交验收时间
@TableField(exist = false)
private Date testSubmitYsTime;
private Integer project;
//1通过 2不通过
private Integer ysFlag;
@@ -228,16 +223,5 @@ public class ZtStory implements Serializable {
// private Date develDate;
// //测试完成时间
// private Date testedDate;
/**
* 内部验收标识 1需要内部验收 0不需要
*/
private Integer innerYsFlag;
/**
* 产品人员
*/
private String productUser;
/**
* 测试人员
*/
private String testUser;
}

View File

@@ -225,8 +225,4 @@ public class ZtStoryUser implements Serializable {
private String deliverRemark;
private String oldStatus;
/**
* 产品用户
*/
private String productUser;
}

View File

@@ -62,12 +62,6 @@ public enum ActionStatus {
XGMM(101, "xgmm","修改密码"),
CZMM(102, "czmm","重置密码"),
CZINFO(103, "czmm","重置"),
//测试提交验收
TESTSUBMITYS(200, "testSubmitYs","测试提交验收"),
PRODUCTYS(201, "productYs","产品验收"),
ASSIGNTOPRODUCTUSER(202, "assignProductUser","指派产品人"),
ASSIGNTOTESTUSER(203, "assignTestUser","指派测试人"),
;
@EnumValue

View File

@@ -16,8 +16,6 @@ public enum StoryStageEnums {
developed(10, "developed","研发完毕"),
testing(5, "testing","测试中"),
tested(6, "tested","测试完毕"),
productWaitVerified(9, "productWaitVerified","产品验收中"),
productVerified(10, "productVerified","产品已验收"),
released(7, "released","已发布"),
verified(8, "verified","已验收"),
;

View File

@@ -10,7 +10,6 @@ import org.apache.ibatis.annotations.Param;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* <p>
@@ -60,7 +59,4 @@ public interface ZtStoryMapper extends BaseMapper<ZtStory> {
* @return
*/
List<SearchDTO> searchAll(@Param("keyword") String keyword,@Param("pIds")List<Integer> pIds);
Map<String, Object> storyReleaseOnTimeByProducts(@Param("pIds") List<Integer> pids,
@Param("startTime") Date firstDayOfMonth,@Param("endTime") Date lastDayOfMonth);
}

View File

@@ -22,10 +22,6 @@ public class StoryQo extends BaseQo {
private Integer productId;
private String openedby;
private String status;
/**
* 用户产品
*/
private String productUser;
private List<Integer> productIds;
private List<String> statusList;

View File

@@ -37,11 +37,7 @@ public class ZtProjectQo extends BaseQo {
private String severity;
private String productName;
/**
* 产品人
*/
private String productUser;
private String testUser;
private Integer productId;
private List<Integer> productIds;
@@ -111,6 +107,14 @@ public class ZtProjectQo extends BaseQo {
private String spec;
private String bugType;
/**
* 测试人员
*/
private String testUser;
/**
* 产品人员
*/
private String productUser;
private String account;
//1 延期 2不延期

View File

@@ -57,7 +57,7 @@ public interface IZtStoryService extends IService<ZtStory> {
void waitStory(Integer story);
void startStory(Integer story);
//开发完成
void develFinishStory(Integer story,String finishBy);
void finishStory(Integer story,String finishBy);
//测试完毕
void testedStory(Integer story,String finishBy);
//测试中
@@ -105,15 +105,4 @@ public interface IZtStoryService extends IService<ZtStory> {
List<ZtStory> getStoryListByDatePidsProject(List<Integer> pids, Integer id, Date firstDayOfMonth, Date lastDayOfMonth);
PageInfo<SearchDTO> searchByName(SearchQo qo);
void testSubmitVerified(ZtStoryDTO qo);
void storyProductUserYs(ZtStoryDTO qo);
Map<String, Object> storyReleaseOnTimeByProducts(@Param("pids") List<Integer> pids, @Param("startTime")Date firstDayOfMonth,
@Param("endTime")Date lastDayOfMonth);
void assignedToProductUser(ZtStoryDTO dto);
void assignedToTestUser(ZtStoryDTO dto);
}

View File

@@ -54,7 +54,4 @@ public interface IZtStoryUserService extends IService<ZtStoryUser> {
void confirmStory(ZtStoryUserDTO dto);
void needMeetOrDesign(ZtStoryUserDTO dto);
void assignedToProductUser(ZtStoryUserDTO dto);
}

View File

@@ -1,6 +1,5 @@
package com.sa.zentao.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.annotation.ExcelIgnore;
@@ -243,10 +242,7 @@ public class IZtCountService {
.map(o -> o.getId() + "").collect(Collectors.joining(",")));
result.setTestingCount(ztStory.stream().filter(o -> "active".equals(o.getStatus()))
.filter(o -> Arrays.asList("testing", "tested"
,StoryStageEnums.productWaitVerified.getValue()
,StoryStageEnums.productVerified.getValue()
).contains(o.getStage())).map(o -> o.getId() + "").collect(Collectors.joining(",")));
.filter(o -> Arrays.asList("testing", "tested").contains(o.getStage())).map(o -> o.getId() + "").collect(Collectors.joining(",")));
// developing 研发中 developed 研发完毕 testing 测试中 tested测试完毕
result.setJxzCount(ztStory.stream().filter(o -> "active".equals(o.getStatus()))
@@ -354,10 +350,7 @@ public class IZtCountService {
//0825 计划中和研发中合并
result.setJxzCount(ztStory.stream().filter(o -> "active".equals(o.getStatus()))
.filter(o -> Arrays.asList("wait","tested", "testing", "developed", "developing"
,StoryStageEnums.productWaitVerified.getValue()
,StoryStageEnums.productVerified.getValue()).contains(o.getStage()
)
.filter(o -> Arrays.asList("wait","tested", "testing", "developed", "developing").contains(o.getStage())
).map(o -> o.getId() + "").collect(Collectors.joining(",")));
result.setCswbCount(ztStory.stream().filter(o -> "active".equals(o.getStatus()))
@@ -387,7 +380,7 @@ public class IZtCountService {
result = setFeedback(result, feedbacks);
} else if (userType == UserType.XMGLY || userType == UserType.XMZL||userType == UserType.CPJL) {
} else if (userType == UserType.XMGLY || userType == UserType.XMZL) {
List<ZtProduct> pList = this.productService.listByIds(pIds);
@@ -419,9 +412,7 @@ public class IZtCountService {
.map(o -> o.getId() + "").collect(Collectors.joining(",")));
result.setTestingCount(ztStory.stream().filter(o -> "active".equals(o.getStatus()))
.filter(o -> Arrays.asList("testing", "tested",StoryStageEnums.productVerified.getValue()
,StoryStageEnums.productWaitVerified.getValue()
).contains(o.getStage())).map(o -> o.getId() + "").collect(Collectors.joining(",")));
.filter(o -> Arrays.asList("testing", "tested").contains(o.getStage())).map(o -> o.getId() + "").collect(Collectors.joining(",")));
result.setJxzCount(ztStory.stream().filter(o -> "active".equals(o.getStatus()))
.filter(o -> Arrays.asList("developing", "developed").contains(o.getStage())).map(o -> o.getId() + "").collect(Collectors.joining(",")));
@@ -552,10 +543,6 @@ public class IZtCountService {
continue;
}
performanceDTO=JSON.parseObject(ztMonthScore.getScopeJson(),PerformanceDTO.class);
if (ztUser.getAccount().equals("weidongxia")) {
generatorCPJLExcel(qo, performanceDTO.getUserName(), performanceDTO, qo.getDate(), perList);
list.add(performanceDTO.getUserName() + "产品经理考核.xlsx");
} else
if (ztUser.getAccount().equals("liyuyan")) {
generatorXMZLExcel(performanceDTO.getUserName(), performanceDTO, qo.getDate());
list.add(performanceDTO.getUserName() + "项目助理考核.xlsx");
@@ -577,9 +564,6 @@ public class IZtCountService {
} else if (ztUser.getUserType() == UserType.XMJL || ztUser.getUserType() == UserType.XMGLY || ztUser.getUserType() == UserType.GSGC) {
generatorXMJLExcel(qo, performanceDTO.getUserName(), performanceDTO, qo.getDate(), perList);
list.add(performanceDTO.getUserName() + "项目经理考核.xlsx");
}else if (ztUser.getUserType() == UserType.CPJL ) {
generatorCPJLExcel(qo, performanceDTO.getUserName(), performanceDTO, qo.getDate(), perList);
list.add(performanceDTO.getUserName() + "产品经理考核.xlsx");
}
}
String dir = System.getProperty("user.dir") + "/";
@@ -1183,69 +1167,6 @@ public class IZtCountService {
return dto;
}
PerformanceDTO buildCPJLScore(ZtUser u,Map<String, ZtUser> userMap,ZtProjectQo qo, List<ItApproval> approvalList, Date firstDayOfMonth, Date lastDayOfMonth, List<ZtTask> taskList, Date d,List<Integer> pids) {
/**
* 产品经理
*/
PerformanceDTO dto = new PerformanceDTO();
dto.setUserName(u.getNickname());
dto.setAccount(u.getAccount());
//项目准时率 Σ (当月上线准时上线的需求量) / Σ (当月规划上线的需求总量) * 100≥95%
// dto.setProjectOnTimeRate();
//产品缺陷率
// dto.setProductBugRate();
Map<String,Object> map=this.storyService.storyReleaseOnTimeByProducts(pids,firstDayOfMonth,lastDayOfMonth);
Integer planReleaseStoryNum = Integer.valueOf(map.getOrDefault("planReleaseStoryNum", 0).toString());
Integer storyOnTimeNum = Integer.valueOf(map.getOrDefault("onTimeNum", 0).toString());
dto.setProductPlanStoryNum(BigDecimal.valueOf(planReleaseStoryNum));
dto.setProductPlanStoryOnTimeNum(BigDecimal.valueOf(storyOnTimeNum));
int storyOnTimeRate = ObjectUtil.equal(planReleaseStoryNum, 0) ? 0 :
(BigDecimal.valueOf(storyOnTimeNum*100).divide(BigDecimal.valueOf(planReleaseStoryNum), 0, BigDecimal.ROUND_UP)).intValue();
int productProjectOnTimeRateScore=storyOnTimeRate==0?0: (storyOnTimeRate>=95)? 20:
(storyOnTimeRate>=90&&storyOnTimeRate<95)?(20-(95-storyOnTimeRate)):
((90-storyOnTimeRate)*2+5>20)? 0:(20-((90-storyOnTimeRate)*2+5));
dto.setProductProjectOnTimeRateScore(BigDecimal.valueOf(productProjectOnTimeRateScore));
List<ZtBug> allBugList = this.bugService.list(new QueryWrapper<ZtBug>().lambda().select(SFunctionColums.bugColumes())
.eq(ZtBug::getOpenedby, u.getAccount())
.in(ZtBug::getBugType,"releaseBug","prod")
.ge(ZtBug::getOpeneddate,firstDayOfMonth)
.le(ZtBug::getOpeneddate,lastDayOfMonth)
.in(ZtBug::getProduct,pids));
allBugList = this.bugService.getNormalBugList(allBugList);
//开发分配工时
ZtCountQo ztCountQo = new ZtCountQo();
BeanUtils.copyProperties(qo, ztCountQo);
List<ZtProduct> ztProducts = this.productService.listByIds(pids);
List<PerformanceDTO> perList = this.programCount(ztCountQo,ztProducts.stream().map(o->o.getProgram()).collect(Collectors.toList()));
dto = buildTaskManage(dto, perList, userMap,firstDayOfMonth,lastDayOfMonth,pids);
//开发任务分配工时
BigDecimal allocationTime = dto.getAllocationTime();
double bugRate=(allocationTime.doubleValue()==0||allBugList.size()==0)?0:BigDecimal.valueOf(allBugList.size()*1000).divide(allocationTime,2,BigDecimal.ROUND_HALF_UP).doubleValue();
dto.setBugDensity(BigDecimal.valueOf(bugRate));
if(bugRate<=5){
dto.setBugScore(BigDecimal.valueOf(20));
}else{
// long deductBugScore = Math.min(seriousBug * 10L + slightBug * 3L, 20L);
// dto.setBugScore(BigDecimal.valueOf(20L-deductBugScore));
//严重10 分 轻微3分一个
int bugScore = 0;
for (ZtBug b : allBugList) {
bugScore += b.getSeverity() != 1 ? 3 : 10;
}
dto.setBugScore(bugScore>20?BigDecimal.ZERO:BigDecimal.valueOf((20 - bugScore)));
}
//线上重大
dto.setSeriousBug(BigDecimal.valueOf(allBugList.stream().filter(o -> Arrays.asList(1).contains(o.getSeverity())).count()));
//线上轻微
dto.setSlightBug( BigDecimal.valueOf(allBugList.stream().filter(o -> Arrays.asList(4, 2, 3).contains(o.getSeverity())).count()));
return dto;
}
//满分30
private PerformanceDTO getMeetScore(ZtUser u, Date start, Date end, PerformanceDTO dto) {
List<Integer> pIds = this.projectService.authProductList();
@@ -2276,52 +2197,7 @@ public class IZtCountService {
writeXlsx(name, "templates/scope/项目经理考核.xlsx", name + "项目经理考核.xlsx", dataMap);
}
void generatorCPJLExcel(ZtCountQo qo, String name, PerformanceDTO performanceDTO, Date d, List<PerformanceDTO> perList) {
Map<String, ZtUser> userMap = userService.userMapByIds(null);
Map<String, String> dataMap = new HashMap<>();
dataMap.put("name", name);
dataMap.put("date", DateUtils.formatDate(d, "yyyy-MM"));
//产品规划
dataMap.put("productPlanning",performanceDTO.getProductPlanning()==null?"0":performanceDTO.getProductPlanning().toString());
//需求准确性
dataMap.put("accurateDemand", performanceDTO.getAccurateDemand()==null?"0": performanceDTO.getAccurateDemand().toString());
//项目准时率
dataMap.put("productProjectOnTimeRateScore",performanceDTO.getProductProjectOnTimeRateScore()==null?"0": performanceDTO.getProductProjectOnTimeRateScore().multiply(BigDecimal.valueOf(100)).toString());
//线上Bug得分 缺陷
dataMap.put("bugScope", performanceDTO.getBugScore()==null?"0": performanceDTO.getBugScore().toString());
//开发分配工时
dataMap.put("allocationTime", performanceDTO.getBugScore()==null?"0": performanceDTO.getAllocationTime().toString());
//轻微
dataMap.put("slightBug", performanceDTO.getSlightBug()==null?"0": performanceDTO.getSlightBug().toString());
dataMap.put("seriousBug", performanceDTO.getSeriousBug()==null?"0": performanceDTO.getSeriousBug().toString());
//问题响应
dataMap.put("productProblemResponse", performanceDTO.getProductProblemResponse()==null?"0": performanceDTO.getProductProblemResponse().toString());
//会议管理
dataMap.put("productMeetScore", performanceDTO.getProductMeetScore()==null?"0": performanceDTO.getProductMeetScore().toString());
//主动性责任感
dataMap.put("productResponsibilityScore", performanceDTO.getProductResponsibilityScore()==null?"0": performanceDTO.getProductResponsibilityScore().toString());
dataMap.put("productPlanStoryNum", performanceDTO.getProductPlanStoryNum()==null?"0": performanceDTO.getProductPlanStoryNum().toString());
dataMap.put("productPlanStoryOnTimeNum", performanceDTO.getProductPlanStoryOnTimeNum()==null?"0": performanceDTO.getProductPlanStoryOnTimeNum().toString());
dataMap.put("allocationTime", performanceDTO.getAllocationTime()==null?"0": performanceDTO.getAllocationTime().toString());
dataMap.put("slightBug", performanceDTO.getSlightBug()==null?"0": performanceDTO.getSlightBug().toString());
dataMap.put("seriousBug", performanceDTO.getSeriousBug()==null?"0": performanceDTO.getSeriousBug().toString());
dataMap.put("bugDensity", performanceDTO.getBugDensity()==null?"0": performanceDTO.getBugDensity().toString());
dataMap.put("总分", devlopTotal(
dataMap.get("productPlanning"),
dataMap.get("accurateDemand"),
dataMap.get("productProjectOnTimeRateScore"),
dataMap.get("bugScope"),
dataMap.get("productProblemResponse"),
dataMap.get("productMeetScore"),
dataMap.get("productResponsibilityScore")
));
writeXlsx(name, "templates/scope/产品经理考核.xlsx", name + "产品经理考核.xlsx", dataMap);
}
private String versionPlanScore(ZtCountQo qo, List<PerformanceDTO> perList, Map<String, ZtUser> userMap) {
return "20";
// BigDecimal allocationTime =BigDecimal.ZERO;
@@ -2404,7 +2280,7 @@ public class IZtCountService {
//线上bug
List<ZtBug> bList = this.bugService.list(new QueryWrapper<ZtBug>().lambda().in(ZtBug::getProject, projectIds)
.ge(ZtBug::getOpeneddate, firstDayOfMonth).le(ZtBug::getOpeneddate, lastDayOfMonth)
.in(ZtBug::getBugType, "prod","releaseBug")
.eq(ZtBug::getBugType, "prod")
);
if (CollectionUtils.isEmpty(bList)) {
result.setBugScore(BigDecimal.valueOf(20));
@@ -2427,9 +2303,9 @@ public class IZtCountService {
List<ZtBug> slightBugList = bList.stream().filter(o -> slights.contains(o.getSeverity())).collect(Collectors.toList());
result.setSlightBug(BigDecimal.valueOf(slightBugList.size()));
BigDecimal bugRate = BigDecimal.valueOf(bList.size()).divide(BigDecimalUtils.isZero(allocationTime) ? BigDecimal.valueOf(1) : allocationTime, 3, BigDecimal.ROUND_HALF_UP);
BigDecimal bugRate = BigDecimal.valueOf(bList.size()).divide(BigDecimalUtils.isZero(allocationTime) ? BigDecimal.valueOf(1) : allocationTime, 2, BigDecimal.ROUND_HALF_UP);
result.setBugDensity(bugRate);
int i = bugRate.multiply(BigDecimal.valueOf(1000)).intValue();
int i = bugRate.multiply(BigDecimal.valueOf(100)).intValue();
if (i <= 5) {
result.setBugScore(BigDecimal.valueOf(20));
return result;
@@ -2491,6 +2367,10 @@ public class IZtCountService {
}
private PerformanceDTO buildTaskManage(PerformanceDTO result, List<PerformanceDTO> perList, Map<String, ZtUser> userMap,Date startDate,Date endDate,List<Integer> pids) {
//多个项目组人员
List multipUser = this.getmultipleDepartProjectTeam(startDate, endDate);
//分配总工时
@@ -2708,9 +2588,7 @@ public class IZtCountService {
//获取测试需求
List<ZtStory> cswcStoryList = this.storyService.list(new QueryWrapper<ZtStory>().lambda().in(ZtStory::getProduct, pids)
.in(ZtStory::getAssignedTo, Arrays.asList(u.getAccount())).ge(ZtStory::getReleaseddate, firstDayOfMonth).le(ZtStory::getReleaseddate, lastDayOfMonth));
if (name.equals("weidongxia")) {
result = buildCPJLScore(u, userMap , qo,approvalList, firstDayOfMonth, lastDayOfMonth, taskList, d,pids);
} else
if (name.equals("liyuyan")) {
result = buildXMZLScore(u, approvalList, firstDayOfMonth, lastDayOfMonth, taskList, d);
} else if ("liushengqing".equals(name)) {
@@ -2738,9 +2616,6 @@ public class IZtCountService {
result.setProfessionalSkillEnhancementScore(BigDecimal.valueOf(0));
} else if (u.getUserType() == UserType.XMZL) {
result = buildXMZLScore(u, approvalList, firstDayOfMonth, lastDayOfMonth, taskList, d);
} else if (u.getUserType() == UserType.CPJL) {
//产品经理
result = buildCPJLScore(u, userMap , qo,approvalList, firstDayOfMonth, lastDayOfMonth, taskList, d,pids);
}
return result;

View File

@@ -260,6 +260,7 @@ public class ZtProjectServiceImpl extends ServiceImpl<ZtProjectMapper, ZtProject
cell.setColumn(ztKanbancolumn.getId());
cell.setType(ztKanbanlane.getType());
kanbancellService.save(cell);
}
}
}
@@ -1940,9 +1941,9 @@ public class ZtProjectServiceImpl extends ServiceImpl<ZtProjectMapper, ZtProject
List<ZtTask> allTaskList =this.taskService.taskListByEIdsAndDate(firstDayOfMonth,lastDayOfMonth,products.stream().map(o->o.getId()).collect(Collectors.toList()));
// if (CollectionUtils.isEmpty(allTaskList)) {
// return new PageInfo<>();
// }
if (CollectionUtils.isEmpty(allTaskList)) {
return new PageInfo<>();
}
List<ZtTeam> teams = this.teamService.list(new QueryWrapper<ZtTeam>().lambda().eq(ZtTeam::getType, "execution")

View File

@@ -112,7 +112,7 @@ public class ZtReleaseServiceImpl extends ServiceImpl<ZtReleaseMapper, ZtRelease
List<ZtStory> sList = this.storyService.list(new QueryWrapper<ZtStory>()
.lambda().eq(ZtStory::getStatus, "active")
.in(ZtStory::getId, list.stream().map(o -> o.getStory()).distinct().collect(Collectors.toList()))
.eq(ZtStory::getStage, StoryStageEnums.productVerified.getValue()));
.eq(ZtStory::getStage, StoryStageEnums.tested.getValue()));
if (!CollectionUtils.isEmpty(sList)) {
//没有被关联的需求 测试完成的
List<ZtReleaseDetails> releaseStoryList = this.releaseDetailsService.list(new QueryWrapper<ZtReleaseDetails>().lambda()
@@ -368,7 +368,7 @@ public class ZtReleaseServiceImpl extends ServiceImpl<ZtReleaseMapper, ZtRelease
List<ZtStory> ztStories = CollectionUtils.isEmpty(storyList)?new ArrayList<>():storyService.listByIds(storyList);
List<ZtBug> bugs =CollectionUtils.isEmpty(bugList)?new ArrayList<>(): bugService.listByIds(bugList);
long notTested = ztStories.stream().filter(o -> !o.getStage().equals(StoryStageEnums.productVerified.getValue())).count();
long notTested = ztStories.stream().filter(o -> !o.getStage().equals("tested")).count();
if(notTested>0){
throw new BusinessException("当前需求存在未测试完成的请检查");
}
@@ -378,7 +378,7 @@ public class ZtReleaseServiceImpl extends ServiceImpl<ZtReleaseMapper, ZtRelease
throw new BusinessException("当前bug存在未完成请检查");
}
for (ZtStory st : ztStories) {
if (! StoryStageEnums.productVerified.getValue().equals(st.getStage())) {
if (!"tested".equals(st.getStage())) {
throw new BusinessException(st.getTitle() + " 当前需求无法发布,请检查");
}
this.storyService.releaseStory(st.getId());

View File

@@ -1,6 +1,5 @@
package com.sa.zentao.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -157,10 +156,6 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
if (ztUser != null) {
d.setUserStoryCreateUser(ztUser.getNickname());
}
ztUser = userMap.get(d.getProductUser());
if (ztUser != null) {
d.setProductUserName(ztUser.getNickname());
}
List<ZtProject> ztProjectList = executionMapByStory.get(d.getId());
if (!CollectionUtils.isEmpty(ztProjectList)) {
// d.setExecution(ztProject.getId());
@@ -813,8 +808,6 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
for (ZtStoryDTO d : list) {
d.setRevieweUser(d.getReviewedby().replaceAll(",", ""));
d.setViews(rMap.get(d.getId()));
StoryStageEnums stageEnums = StoryStageEnums.transfer(d.getStage());
d.setStageName(stageEnums==null?null:stageEnums.getDesc());
List<ZtTask> ztTasks = taskCountMap.get(d.getId());
ZtStoryCaseDTO ztStoryCaseDTO = caseMap.get(d.getId());
if (ztStoryCaseDTO != null) {
@@ -856,14 +849,6 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
if (ztUser != null) {
d.setYsUserName(ztUser.getNickname());
}
ztUser = userMap.get(d.getProductUser());
if (ztUser != null) {
d.setProductUserName(ztUser.getNickname());
}
ztUser = userMap.get(d.getTestUser());
if (ztUser != null) {
d.setTestUserName(ztUser.getNickname());
}
}
}
@@ -971,105 +956,6 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
return searchDTOPageInfo;
}
@Override
@Transactional
public void testSubmitVerified(ZtStoryDTO qo) {
ZtStory ztStory = this.baseMapper.selectById(qo.getId());
if(ztStory==null){
throw new BusinessException("未查询到需求");
}
if(!StoryStatusEnums.active.getValue().equals(ztStory.getStatus())){
throw new BusinessException("需求状态不对");
}
if(!StoryStageEnums.tested.getValue().equals(ztStory.getStage())){
throw new BusinessException("需求状态不对");
}
if(ObjectUtil.equal(ztStory.getInnerYsFlag(),1)){
throw new BusinessException("无需内部验收,不需要提交");
}
//产品验收中
ztStory.setStage(StoryStageEnums.productWaitVerified.getValue());
ztStory.setTestSubmitYsTime(new Date());
ztStory.setLasteditedby(RiskUserThreadLocal.get().getName());
ztStory.setLastediteddate(new Date());
this.baseMapper.updateById(ztStory);
List<ZtProjectstory> ztProjectstories = this.projectstoryService.projectListByStory(Arrays.asList(ztStory.getId()), ProjectTypeEnums.execution);
//更改看板
if(!CollectionUtils.isEmpty(ztProjectstories)){
for(ZtProjectstory ztProjectstory:ztProjectstories){
kanbanlaneService.changeStatus(ztProjectstory.getProject(),ztStory.getId(),"story",StoryStageEnums.productWaitVerified.getValue());
}
}
actionService.addAction(ActionType.XQ, ActionStatus.TESTSUBMITYS, ztStory.getId(), ztStory.getProduct() + "", null, null,
RiskUserThreadLocal.get().getName(), "", "");
}
@Override
public void storyProductUserYs(ZtStoryDTO qo) {
ZtStory ztStory = this.baseMapper.selectById(qo.getId());
if(ztStory==null){
throw new BusinessException("未查询到需求");
}
if(!StoryStatusEnums.active.getValue().equals(ztStory.getStatus())){
throw new BusinessException("需求状态不对");
}
if(!StoryStageEnums.productWaitVerified.getValue().equals(ztStory.getStage())){
throw new BusinessException("需求状态不对");
}
//产品验收中
ztStory.setStage(StoryStageEnums.productWaitVerified.getValue());
ztStory.setLasteditedby(RiskUserThreadLocal.get().getName());
ztStory.setLastediteddate(new Date());
ztStory.setInnerYsTime(new Date());
this.baseMapper.updateById(ztStory);
List<ZtProjectstory> ztProjectstories = this.projectstoryService.projectListByStory(Arrays.asList(ztStory.getId()), ProjectTypeEnums.execution);
//更改看板
if(!CollectionUtils.isEmpty(ztProjectstories)){
for(ZtProjectstory ztProjectstory:ztProjectstories){
kanbanlaneService.changeStatus(ztProjectstory.getProject(),ztStory.getId(),"story",StoryStageEnums.productVerified.getValue());
}
}
actionService.addAction(ActionType.XQ, ActionStatus.PRODUCTYS, ztStory.getId(), ztStory.getProduct() + "", null, null,
RiskUserThreadLocal.get().getName(), "", "");
}
@Override
public Map<String, Object> storyReleaseOnTimeByProducts(List<Integer> pids, Date firstDayOfMonth, Date lastDayOfMonth) {
return this.baseMapper.storyReleaseOnTimeByProducts(pids,firstDayOfMonth,lastDayOfMonth);
}
@Override
public void assignedToProductUser(ZtStoryDTO dto) {
ZtStory ztStory = this.baseMapper.selectById(dto.getId());
if(ztStory==null){
throw new BusinessException("未查询到数据");
}
ztStory.setProductUser(dto.getAssignedTo());
ztStory.setLastediteddate(new Date());
ztStory.setLasteditedby(RiskUserThreadLocal.get().getName());
this.baseMapper.updateById(ztStory);
actionService.addAction(ActionType.XQ, ActionStatus.ASSIGNTOPRODUCTUSER, ztStory.getId(), ztStory.getProduct() + "", null, null,
RiskUserThreadLocal.get().getName(), "", "");
}
@Override
public void assignedToTestUser(ZtStoryDTO dto) {
ZtStory ztStory = this.baseMapper.selectById(dto.getId());
if(ztStory==null){
throw new BusinessException("未查询到数据");
}
ztStory.setTestUser(dto.getAssignedTo());
ztStory.setLastediteddate(new Date());
ztStory.setLasteditedby(RiskUserThreadLocal.get().getName());
this.baseMapper.updateById(ztStory);
actionService.addAction(ActionType.XQ, ActionStatus.ASSIGNTOTESTUSER, ztStory.getId(), ztStory.getProduct() + "", null, null,
RiskUserThreadLocal.get().getName(), "", "");
}
private List<SearchDTO> searchBug(SearchQo qo) {
return this.baseMapper.searchBug(qo.getKeyword());
}
@@ -1267,14 +1153,9 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
}
}
/**
* 开发完成
* @param id
* @param finishBy
*/
@Override
@Transactional
public void develFinishStory(Integer id, String finishBy) {
public void finishStory(Integer id, String finishBy) {
if (id == null || id == 0) {
return;
@@ -1326,7 +1207,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
throw new BusinessException("未查询到数据-需求");
}
if (!Arrays.asList("wait", "projected", "developing", "developed", "testing",StoryStageEnums.productWaitVerified.getValue(),StoryStageEnums.productVerified.getValue()).contains(ztStory.getStage())) {
if (!Arrays.asList("wait", "projected", "developing", "developed", "testing").contains(ztStory.getStage())) {
return;
}
@@ -1361,13 +1242,6 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
actionService.addAction(ActionType.XQ, ActionStatus.CSWC, ztStory.getId(), ztStory.getProduct() + "", ztStory.getProject(), null,
RiskUserThreadLocal.get().getName(), null, "");
}
//不需要内部验收 产品已验收
if(!ObjectUtil.equal(ztStory.getInnerYsFlag(),1)){
newStatus = StoryStageEnums.productVerified.getValue();
ztStory.setStage(newStatus);
ztStory.setInnerYsTime(new Date());
}
if (ztStory.getStartDate() == null) {
ztStory.setStartDate(new Date());
}
@@ -1379,7 +1253,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
for (Integer execId : execIds) {
if (execId != null) {
this.kanbanlaneService.changeStatus(execId, ztStory.getId(), "story", newStatus);
this.kanbanlaneService.changeStatus(execId, ztStory.getId(), "story", "tested");
if (!oldStatus.equalsIgnoreCase(newStatus) && ztStory.getProduct() != 0) {
ProductStoryStatus oldPStatus = null;
@@ -1396,6 +1270,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
}
//发布
@Override
@Transactional
@@ -1405,25 +1280,22 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
}
ZtStory ztStory = this.baseMapper.selectById(story);
if (ztStory == null) {
throw new BusinessException("未查询到数据-需求");
}
if (ztStory.getFeedback() != null && ztStory.getFeedback() != 0) {
this.storyFeedbackService.feedbackFinished(ztStory.getFeedback(), null);
}
if (ztStory == null) {
throw new BusinessException("未查询到数据-需求");
}
if (!Arrays.asList("wait", "projected", "developing", "developed", "testing", "tested",
StoryStageEnums.productWaitVerified.getValue()
,StoryStageEnums.productVerified.getValue()).contains(ztStory.getStage())) {
if (!Arrays.asList("wait", "projected", "developing", "developed", "testing", "tested").contains(ztStory.getStage())) {
return;
}
if ("closed".equals(ztStory.getStatus())) {
throw new BusinessException("当前已关闭");
}
if (!StoryStageEnums.productVerified.getValue().equals(ztStory.getStage())) {
if (!"tested".equals(ztStory.getStage())) {
throw new BusinessException("当前无法更改发布状态");
}
//这个需求被多少执行关联
@@ -1525,7 +1397,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
if (!CollectionUtils.isEmpty(testedList)) {
testedStory(story, finishBy);
} else {
this.develFinishStory(story, finishBy);
this.finishStory(story, finishBy);
}
}
@@ -1566,7 +1438,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
.eq(ZtTask::getType, TaskType.devel.getCode())
.in(ZtTask::getStatus, Arrays.asList("done")));
if (!CollectionUtils.isEmpty(develedList)) {
this.develFinishStory(story, finishBy);
this.finishStory(story, finishBy);
return;
}
return;
@@ -1614,7 +1486,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
if (done < 1) {
} else {
this.develFinishStory(story, finishBy);
this.finishStory(story, finishBy);
}
}
} else {
@@ -2278,14 +2150,6 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
if (ztUser != null) {
d.setYsUserName(ztUser.getNickname());
}
ztUser = userMap.get(d.getProductUser());
if (ztUser != null) {
d.setProductUserName(ztUser.getNickname());
}
ztUser = userMap.get(d.getTestUser());
if (ztUser != null) {
d.setTestUserName(ztUser.getNickname());
}
ZtStoryspec storyspec = this.storyspecService.getOne(new QueryWrapper<ZtStoryspec>().lambda().eq(ZtStoryspec::getStory, d.getId()));
if (storyspec != null) {
@@ -2585,7 +2449,6 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
ProductStoryStatus oldPStatus = null;
if (status.equalsIgnoreCase("developing") || status.equalsIgnoreCase("testing")
|| status.equalsIgnoreCase("tested") || status.equalsIgnoreCase("developed")
|| status.equalsIgnoreCase(StoryStageEnums.productWaitVerified.getValue())|| status.equalsIgnoreCase(StoryStageEnums.productVerified.getValue())
) {
oldPStatus = ProductStoryStatus.JH;

View File

@@ -252,10 +252,10 @@ public class ZtStoryUserServiceImpl extends ServiceImpl<ZtStoryUserMapper, ZtSto
@Override
public Map<String, List<ZtStoryUserDTO>> getKanban(Integer productId) {
List<ZtStoryUser> ztStoryUsers = this.baseMapper.selectList(new QueryWrapper<ZtStoryUser>()
.lambda().select(ZtStoryUser::getId,ZtStoryUser::getPri,ZtStoryUser::getTitle,ZtStoryUser::getStage,ZtStoryUser::getStatus,ZtStoryUser::getOpenedby,ZtStoryUser::getOpeneddate,ZtStoryUser::getLastediteddate,ZtStoryUser::getProductUser)
.lambda().select(ZtStoryUser::getId,ZtStoryUser::getPri,ZtStoryUser::getTitle,ZtStoryUser::getStage,ZtStoryUser::getStatus,ZtStoryUser::getOpenedby,ZtStoryUser::getOpeneddate,ZtStoryUser::getLastediteddate)
.eq(ZtStoryUser::getProduct, productId).orderByDesc(ZtStoryUser::getId));
Map<String, List<ZtStoryUserDTO>> map = new HashMap<>();
Map<String, ZtUser> stringZtUserMap = this.userService.userMapByIds(null);
Map<String, ZtUser> stringZtUserMap = this.userService.userMapByIds(ztStoryUsers.stream().map(o -> o.getOpenedby()).collect(Collectors.toList()));
List<ZtStoryUserDTO> ztStoryUserDTOS = BeanCopyUtil.copyListProperties(ztStoryUsers, ZtStoryUserDTO::new, new BeanCopyUtilCallBack<ZtStoryUser, ZtStoryUserDTO>() {
@Override
@@ -265,11 +265,6 @@ public class ZtStoryUserServiceImpl extends ServiceImpl<ZtStoryUserMapper, ZtSto
s.setOpenedbyName(ztUser.getNickname());
s.setColor(ztUser.getColor());
}
ztUser = stringZtUserMap.get(t.getProductUser());
if(ztUser!=null){
s.setProductUserName(ztUser.getNickname());
s.setProductUserColor(ztUser.getColor());
}
}
});
@@ -364,11 +359,6 @@ public class ZtStoryUserServiceImpl extends ServiceImpl<ZtStoryUserMapper, ZtSto
if (ztUser != null) {
d.setYsUserName(ztUser.getNickname());
}
ztUser = userMap.get(d.getProductUser());
if (ztUser != null) {
d.setProductUserName(ztUser.getNickname());
}
List<ZtStory> ztStories = storyUserMap.get(d.getId());
if (!CollectionUtils.isEmpty(ztStories)) {
d.setStoryList(ztStories.stream().map(o ->o.getId()+":"+o.getTitle()).collect(Collectors.joining(",")));
@@ -387,6 +377,7 @@ public class ZtStoryUserServiceImpl extends ServiceImpl<ZtStoryUserMapper, ZtSto
d.setUrl(hyperlink );
} catch (Exception e) {
log.error(e.getMessage(), e);
d.setUrl(null );
}
}
@@ -558,10 +549,6 @@ public class ZtStoryUserServiceImpl extends ServiceImpl<ZtStoryUserMapper, ZtSto
if (ztUser != null) {
dto.setYsUserName(ztUser.getNickname());
}
ztUser = userMap.get(dto.getProductUser());
if (ztUser != null) {
dto.setProductUserName(ztUser.getNickname());
}
Map<Integer, List<ZtStory>> storyUserMap = getStoryUserMap(Arrays.asList(dto));
List<ZtStory> ztStories = storyUserMap.get(d.getId());
if (!CollectionUtils.isEmpty(ztStories)) {
@@ -880,18 +867,6 @@ public class ZtStoryUserServiceImpl extends ServiceImpl<ZtStoryUserMapper, ZtSto
}
}
@Override
public void assignedToProductUser(ZtStoryUserDTO dto) {
ZtStoryUser ztStoryUser = this.baseMapper.selectById(dto.getId());
if(ztStoryUser==null){
throw new BusinessException("未查询到数据");
}
ztStoryUser.setProductUser(dto.getAssignedto());
this.baseMapper.updateById(ztStoryUser);
actionService.addAction(ActionType.USERXQ, ActionStatus.ASSIGNTOPRODUCTUSER, ztStoryUser.getId(), ztStoryUser.getProduct() + "", null, null,
RiskUserThreadLocal.get().getName(), "", "");
}
private Map<Integer, List<ZtStory>> getStoryUserMap(List<ZtStoryUserDTO> list) {
List<Integer> ids = list.stream().map(o -> o.getId()).collect(Collectors.toList());

View File

@@ -1,6 +1,5 @@
package com.sa.zentao.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -519,7 +518,7 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
List<String> userIds = list.stream().map(o -> o.getFinishedby()).collect(Collectors.toList());
userIds.addAll(list.stream().map(o -> o.getAssignedTo()).collect(Collectors.toList()));
Map<String, ZtUser> userMap = this.userService.userMapByIds(null);
Date d = new Date();
Date d=new Date();
for (ZtTaskDTO task : list) {
ZtUser ztUser = userMap.get(task.getFinishedby());
if (ztUser != null) {
@@ -532,16 +531,16 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
if (task.getDeadline() != null) {
task.setDeadline(DateUtils.getDayLast(task.getDeadline()));
}
if (task.getFinishedDate() != null) {
if (task.getFinishedDate().getTime() > DateUtils.getDayLast(task.getDeadline()).getTime()) {
if(task.getFinishedDate()!=null){
if(task.getFinishedDate().getTime()>DateUtils.getDayLast(task.getDeadline()).getTime()){
task.setDelayFlag(1);
} else {
}else{
task.setDelayFlag(2);
}
} else {
if (d.getTime() > DateUtils.getDayLast(task.getDeadline()).getTime()) {
}else{
if(d.getTime()>DateUtils.getDayLast(task.getDeadline()).getTime()){
task.setDelayFlag(1);
} else {
}else{
task.setDelayFlag(2);
}
}
@@ -578,8 +577,7 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
if (story != null && story != 0) {
ZtStory ztStory = this.storyService.getById(story);
// wait 初始化 projected 已立项 developing 研发中 developed 研发完毕 testing 测试中 tested
if (!Arrays.asList("wait", "projected", "developing", "developed", "testing", "tested",StoryStageEnums.productWaitVerified.getValue()
,StoryStageEnums.productVerified.getValue()).contains(ztStory.getStage())) {
if (!Arrays.asList("wait", "projected", "developing", "developed", "testing", "tested").contains(ztStory.getStage())) {
throw new BusinessException("当前状态无法添加任务");
}
if (ztStory.getStatus().equals("closed")) {
@@ -646,16 +644,16 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
ztTask.setEstimate(ztTask.getUseTime().floatValue());
ztTask.setLeft(ztTask.getUseTime().floatValue());
}
if (ztTask.getDeadline() == null) {
if(ztTask.getDeadline()==null){
throw new BusinessException("当前环境异常请联系管理员");
}
this.baseMapper.insert(ztTask);
if (ztTask.getDeadline() != null && ztTask.getStory() != null && ztTask.getStory() != 0) {
if(ztTask.getDeadline()!=null&&ztTask.getStory()!=null&&ztTask.getStory()!=0){
ZtStory ztStory = this.storyService.getById(ztTask.getStory());
if (ztTask.getType().equals("devel") && (ztStory.getDevelPlanEndTime() == null || ztTask.getDeadline().after(ztStory.getDevelPlanEndTime()))) {
if(ztTask.getType().equals("devel")&&(ztStory.getDevelPlanEndTime()==null||ztTask.getDeadline().after(ztStory.getDevelPlanEndTime()))){
ztStory.setDevelPlanEndTime(ztTask.getDeadline());
}
if (ztTask.getType().equals("test") && (ztStory.getTestPlanEndTime() == null || ztTask.getDeadline().after(ztStory.getTestPlanEndTime()))) {
if(ztTask.getType().equals("test")&&(ztStory.getTestPlanEndTime()==null||ztTask.getDeadline().after(ztStory.getTestPlanEndTime()))){
ztStory.setTestPlanEndTime(ztTask.getDeadline());
}
this.storyService.updateById(ztStory);
@@ -705,7 +703,7 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
@Override
@Transactional
public void modifyTask(ZtTaskDTO dto) {
if (dto.getDeadline() == null || dto.getEstStarted() == null) {
if(dto.getDeadline()==null||dto.getEstStarted()==null){
throw new BusinessException("请录入开始结束日期");
}
ZtTask ztTask = this.baseMapper.selectById(dto.getId());
@@ -852,7 +850,7 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
this.storyService.taskFinishChangeStatus(ztTask.getStory(), null, TaskType.transferType(ztTask.getType()), false);
}
if (ObjectUtils.notEqual(oldExecution, newExecution)) {
if(ObjectUtils.notEqual(oldExecution,newExecution)){
//迭代切换了
this.kanbanlaneService.removeKanbanCell(oldExecution, ztTask.getId(), KanbanCellType.TASK);
//添加新的看板迭代
@@ -929,26 +927,26 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
actionService.addAction(ActionType.RW, ActionStatus.KS, dto.getId(), projectproduct == null ? null : projectproduct.getProduct().toString(), projectproduct == null ? null : projectproduct.getProject(), ztTask.getExecution(),
RiskUserThreadLocal.get().getName(), "", null);
if ("done".equals(ztTask.getStatus())) {
String finishBy = StringUtils.isEmpty(ztTask.getFinishedby()) ? RiskUserThreadLocal.get().getName() : ztTask.getFinishedby();
if("done".equals(ztTask.getStatus())){
String finishBy = StringUtils.isEmpty(ztTask.getFinishedby())?RiskUserThreadLocal.get().getName():ztTask.getFinishedby();
//如果是测试任务 提交交付物
if ("test".equals(ztTask.getType()) && !StringUtils.isEmpty(ztTask.getDeliverContent())) {
actionService.addAction(ActionType.RW, ActionStatus.TJJFW, ztTask.getId(), projectproduct == null ? null : projectproduct.getProduct().toString(), projectproduct == null ? null : projectproduct.getProject(), ztTask.getExecution(),
if("test".equals(ztTask.getType())&&!StringUtils.isEmpty(ztTask.getDeliverContent())){
actionService.addAction(ActionType.RW, ActionStatus.TJJFW, dto.getId(), projectproduct == null ? null : projectproduct.getProduct().toString(), projectproduct == null ? null : projectproduct.getProject(), ztTask.getExecution(),
StringUtils.isEmpty(finishBy) ? RiskUserThreadLocal.get().getName() : finishBy, dto.getDeliverContent(), null);
if (ztTask.getStory() != null && ztTask.getStory() != 0) {
actionService.addAction(ActionType.XQ, ActionStatus.TJJFW, ztTask.getStory(), projectproduct == null ? null : projectproduct.getProduct().toString(), projectproduct == null ? null : projectproduct.getProject(), ztTask.getExecution(),
if(ztTask.getStory()!=null&&ztTask.getStory()!=0){
actionService.addAction(ActionType.XQ, ActionStatus.TJJFW, dto.getId(), projectproduct == null ? null : projectproduct.getProduct().toString(), projectproduct == null ? null : projectproduct.getProject(), ztTask.getExecution(),
StringUtils.isEmpty(finishBy) ? RiskUserThreadLocal.get().getName() : finishBy, dto.getDeliverContent(), null);
}
if (ztTask.getStory() != null && ztTask.getStory() != 0) {
if(ztTask.getStory()!=null&&ztTask.getStory()!=0){
//更新需求交付物
ZtStory ztStory = this.storyService.getById(ztTask.getStory());
if (ztStory != null) {
if(ztStory!=null){
ztStory.setDeliverContent(ztTask.getDeliverContent());
this.storyService.updateById(ztStory);
}
}
}
if (!StringUtils.isEmpty(dto.getRemark())) {
if(!StringUtils.isEmpty(dto.getRemark())){
actionService.addAction(ActionType.RW, ActionStatus.TJBZ, dto.getId(), projectproduct == null ? null : projectproduct.getProduct().toString(), projectproduct == null ? null : projectproduct.getProject(), ztTask.getExecution(),
StringUtils.isEmpty(finishBy) ? RiskUserThreadLocal.get().getName() : finishBy, dto.getRemark(), null);
}
@@ -1032,22 +1030,21 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
//添加action
ZtProjectproduct projectproduct = projectproductService.getOne(new QueryWrapper<ZtProjectproduct>().lambda().eq(ZtProjectproduct::getProject, ztTask.getProject()));
//如果是测试任务 提交交付物
if ("test".equals(ztTask.getType()) && !StringUtils.isEmpty(ztTask.getDeliverContent())) {
if("test".equals(ztTask.getType())&&!StringUtils.isEmpty(ztTask.getDeliverContent())){
actionService.addAction(ActionType.RW, ActionStatus.TJJFW, dto.getId(), projectproduct == null ? null : projectproduct.getProduct().toString(), projectproduct == null ? null : projectproduct.getProject(), ztTask.getExecution(),
StringUtils.isEmpty(finishBy) ? RiskUserThreadLocal.get().getName() : finishBy, dto.getDeliverContent(), null);
if (ztTask.getStory() != null && ztTask.getStory() != 0) {
if(ztTask.getStory()!=null&&ztTask.getStory()!=0){
//更新需求交付物
ZtStory ztStory = this.storyService.getById(ztTask.getStory());
if(ztStory!=null){
ztStory.setDeliverContent(dto.getDeliverContent());
ztStory.setLasteditedby(RiskUserThreadLocal.get().getName());
ztStory.setLastediteddate(new Date());
ztStory.setDeliverContent(ztTask.getDeliverContent());
this.storyService.updateById(ztStory);
}
actionService.addAction(ActionType.XQ, ActionStatus.TJJFW, ztTask.getStory(), projectproduct == null ? null : projectproduct.getProduct().toString(), projectproduct == null ? null : projectproduct.getProject(), ztTask.getExecution(),
actionService.addAction(ActionType.XQ, ActionStatus.TJJFW, dto.getId(), projectproduct == null ? null : projectproduct.getProduct().toString(), projectproduct == null ? null : projectproduct.getProject(), ztTask.getExecution(),
StringUtils.isEmpty(finishBy) ? RiskUserThreadLocal.get().getName() : finishBy, dto.getDeliverContent(), null);
}
}
if (!StringUtils.isEmpty(dto.getRemark())) {
if(!StringUtils.isEmpty(dto.getRemark())){
actionService.addAction(ActionType.RW, ActionStatus.TJBZ, dto.getId(), projectproduct == null ? null : projectproduct.getProduct().toString(), projectproduct == null ? null : projectproduct.getProject(), ztTask.getExecution(),
StringUtils.isEmpty(finishBy) ? RiskUserThreadLocal.get().getName() : finishBy, dto.getRemark(), null);
}
@@ -1080,13 +1077,9 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
this.storyService.taskFinishChangeStatus(ztTask.getStory(), finishBy, TaskType.transferType(type), false);
}
if (ztTask.getFeedback() != null && ztTask.getFeedback() != 0) {
this.storyFeedbackService.feedbackFinished(ztTask.getFeedback(), ztTask.getFeedbackRemark());
}
if(ztTask.getStory()!=null&&ztTask.getStory()!=0&& ObjectUtil.equal(dto.getInnerYsFlag(),1)){
ZtStoryDTO qo=new ZtStoryDTO();
qo.setId(ztTask.getStory());
this.storyService.testSubmitVerified(qo);
this.storyFeedbackService.feedbackFinished(ztTask.getFeedback(),ztTask.getFeedbackRemark());
}
}
@Override
@@ -1103,9 +1096,9 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
ztTask.setLastediteddate(new Date());
this.baseMapper.updateById(ztTask);
if (ztTask.getDeadline() != null && ztTask.getStory() != null && ztTask.getStory() != 0) {
if(ztTask.getDeadline()!=null&&ztTask.getStory()!=null&&ztTask.getStory()!=0){
ZtStory ztStory = this.storyService.getById(ztTask.getStory());
if (ztTask.getType().equals("devel") && ztStory.getDevelPlanEndTime() != null) {
if(ztTask.getType().equals("devel")&&ztStory.getDevelPlanEndTime()!=null){
//查找最大时间那个
ztStory.setDevelPlanEndTime(ztTask.getDeadline());
List<ZtTask> ztTasks = this.baseMapper.selectList(new QueryWrapper<ZtTask>().lambda()
@@ -1116,10 +1109,10 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
.in(ZtTask::getStatus, "pause", "done", "wait", "reviewing", "doing", "draft")
.eq(ZtTask::getStory, ztTask.getStory()).orderByDesc(ZtTask::getDeadline));
this.storyService.update(new UpdateWrapper<ZtStory>().lambda()
.eq(ZtStory::getId, ztTask.getStory())
.set(ZtStory::getDevelPlanEndTime, CollectionUtils.isEmpty(ztTasks) ? null : DateUtils.getDayLast(ztTasks.get(0).getDeadline())));
.eq(ZtStory::getId, ztTask.getStory())
.set(ZtStory::getDevelPlanEndTime,CollectionUtils.isEmpty(ztTasks)?null:DateUtils.getDayLast(ztTasks.get(0).getDeadline())));
}
if (ztTask.getType().equals("test") && ztStory.getTestPlanEndTime() != null) {
if(ztTask.getType().equals("test")&&ztStory.getTestPlanEndTime()!=null){
//查找最大时间那个
ztStory.setDevelPlanEndTime(ztTask.getDeadline());
List<ZtTask> ztTasks = this.baseMapper.selectList(new QueryWrapper<ZtTask>().lambda()
@@ -1131,11 +1124,12 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
.eq(ZtTask::getStory, ztTask.getStory()).orderByDesc(ZtTask::getDeadline));
this.storyService.update(new UpdateWrapper<ZtStory>().lambda()
.eq(ZtStory::getId, ztTask.getStory())
.set(ZtStory::getTestPlanEndTime, CollectionUtils.isEmpty(ztTasks) ? null : DateUtils.getDayLast(ztTasks.get(0).getDeadline())));
.set(ZtStory::getTestPlanEndTime,CollectionUtils.isEmpty(ztTasks)?null:DateUtils.getDayLast(ztTasks.get(0).getDeadline())));
}
}
ZtProjectproduct projectproduct = projectproductService.getOne(new QueryWrapper<ZtProjectproduct>().lambda().eq(ZtProjectproduct::getProject, ztTask.getProject()));
//添加action
@@ -1181,9 +1175,9 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
//添加action
actionService.addAction(ActionType.RW, ActionStatus.QX, dto.getId(), projectproduct == null ? null : projectproduct.getProduct().toString(), ztTask.getProject(), ztTask.getExecution(),
RiskUserThreadLocal.get().getName(), dto.getDesc(), null);
if (ztTask.getDeadline() != null && ztTask.getStory() != null && ztTask.getStory() != 0) {
if(ztTask.getDeadline()!=null&&ztTask.getStory()!=null&&ztTask.getStory()!=0){
ZtStory ztStory = this.storyService.getById(ztTask.getStory());
if (ztTask.getType().equals("devel") && ztStory.getDevelPlanEndTime() != null) {
if(ztTask.getType().equals("devel")&&ztStory.getDevelPlanEndTime()!=null){
//查找最大时间那个
ztStory.setDevelPlanEndTime(ztTask.getDeadline());
List<ZtTask> ztTasks = this.baseMapper.selectList(new QueryWrapper<ZtTask>().lambda()
@@ -1195,9 +1189,9 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
.eq(ZtTask::getStory, ztTask.getStory()).orderByDesc(ZtTask::getDeadline));
this.storyService.update(new UpdateWrapper<ZtStory>().lambda()
.eq(ZtStory::getId, ztTask.getStory())
.set(ZtStory::getDevelPlanEndTime, CollectionUtils.isEmpty(ztTasks) ? null : DateUtils.getDayLast(ztTasks.get(0).getDeadline())));
.set(ZtStory::getDevelPlanEndTime,CollectionUtils.isEmpty(ztTasks)?null:DateUtils.getDayLast(ztTasks.get(0).getDeadline())));
}
if (ztTask.getType().equals("test") && ztStory.getTestPlanEndTime() != null) {
if(ztTask.getType().equals("test")&&ztStory.getTestPlanEndTime()!=null){
//查找最大时间那个
ztStory.setDevelPlanEndTime(ztTask.getDeadline());
List<ZtTask> ztTasks = this.baseMapper.selectList(new QueryWrapper<ZtTask>().lambda()
@@ -1209,7 +1203,7 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
.eq(ZtTask::getStory, ztTask.getStory()).orderByDesc(ZtTask::getDeadline));
this.storyService.update(new UpdateWrapper<ZtStory>().lambda()
.eq(ZtStory::getId, ztTask.getStory())
.set(ZtStory::getTestPlanEndTime, CollectionUtils.isEmpty(ztTasks) ? null : DateUtils.getDayLast(ztTasks.get(0).getDeadline())));
.set(ZtStory::getTestPlanEndTime,CollectionUtils.isEmpty(ztTasks)?null:DateUtils.getDayLast(ztTasks.get(0).getDeadline())));
}
}
if (ztTask.getExecution() != null && ztTask.getExecution() != 0) {
@@ -1257,7 +1251,7 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
List<ZtTaskDTO> list = dto.getList();
long nullDeadlineCount = list.stream().filter(o -> o.getDeadline() == null || o.getEstStarted() == null).count();
if (nullDeadlineCount > 0) {
if(nullDeadlineCount>0){
throw new BusinessException("请录入开始结束日期");
}
@@ -1304,13 +1298,13 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
}
saveList.add(ztTask);
if (ztTask.getDeadline() != null && ztTask.getStory() != null && ztTask.getStory() != 0) {
if(ztTask.getDeadline()!=null&&ztTask.getStory()!=null&&ztTask.getStory()!=0){
ZtStory ztStory = this.storyService.getById(ztTask.getStory());
if (ztTask.getType().equals("devel") && (ztStory.getDevelPlanEndTime() == null || ztTask.getDeadline().getTime() >= ztStory.getDevelPlanEndTime().getTime()
)) {
if(ztTask.getType().equals("devel")&&(ztStory.getDevelPlanEndTime()==null||ztTask.getDeadline().getTime()>=ztStory.getDevelPlanEndTime().getTime()
)){
ztStory.setDevelPlanEndTime(ztTask.getDeadline());
}
if (ztTask.getType().equals("test") && (ztStory.getTestPlanEndTime() == null || ztTask.getDeadline().getTime() >= ztStory.getTestPlanEndTime().getTime())) {
if(ztTask.getType().equals("test")&&(ztStory.getTestPlanEndTime()==null||ztTask.getDeadline().getTime()>=ztStory.getTestPlanEndTime().getTime())){
ztStory.setTestPlanEndTime(ztTask.getDeadline());
}
this.storyService.updateById(ztStory);
@@ -1325,7 +1319,7 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
this.storyService.taskFinishChangeStatus(ztTask.getStory(), null, TaskType.transferType(ztTask.getType()), false);
taskSendZpMessage(ztTask.getId(), null, ztTask.getAssignedTo());
} else {
taskSendPsMessage(ztTask.getId(), ztProject.getPm(), ztTask.getOpenedby());
taskSendPsMessage(ztTask.getId(), ztProject.getPm(),ztTask.getOpenedby());
}
}

View File

@@ -22,8 +22,6 @@ public class KanBanConstant {
put("test","测试");
put("testing","进行中");
put("tested","完成");
put("productWaitVerified","产品验收中");
put("productVerified","产品已验收");
put("released","已发布");
put("verified","已验收");
put("closed","已关闭");
@@ -72,8 +70,6 @@ public class KanBanConstant {
put("story-test","test");
put("story-testing","test");
put("story-tested","test");
put("story-productWaitVerified","productWaitVerified");
put("story-productVerified","productVerified");
put("story-verified","verified");
put("story-released","released");
put("story-closed","closed");

View File

@@ -136,8 +136,6 @@
s.ys_user,
s.task_count,
s.ys_date,
s.inner_ys_flag,
s.product_user,
su.title userStoryName,
su.id userStoryId,
ps.title parentName,
@@ -162,10 +160,6 @@
<if test="qo.searchVal != null and qo.searchVal == 'ZGW' ">
and s.assignedTo= #{qo.userName}
</if>
<if test="qo.searchVal != null and qo.searchVal == 'WDCP' ">
and s.product_user= #{qo.userName}
</if>
<if test="qo.searchVal != null and qo.searchVal == 'WCJ' ">
and s.openedBy= #{qo.userName}
</if>
@@ -219,15 +213,19 @@
and s.title like concat('%', #{qo.title}, '%')
</if>
<if test="qo.testUser != null and qo.testUser != '' ">
and s.test_user like concat('%', #{qo.testUser}, '%')
</if>
<if test="qo.productUser != null and qo.productUser != '' ">
and s.product_user like concat('%', #{qo.productUser}, '%')
</if>
<if test="qo.id != null ">
and s.id = #{qo.id}
</if>
<if test="qo.title != null and qo.title != '' ">
and s.title like concat('%', #{qo.title}, '%')
</if>
<if test="qo.productUser != null and qo.productUser != '' ">
and s.product_user like concat('%', #{qo.productUser}, '%')
</if>
<if test="qo.module != null and qo.module != '' ">
and s.module = #{qo.module}
</if>
@@ -366,9 +364,6 @@
s.ys_date,
s.devel_plan_end_time,
s.test_plan_end_time,
s.inner_ys_flag,
s.product_user,
s.test_user,
pt.name productName
from zt_story s
@@ -386,6 +381,18 @@
<!-- <if test="qo.endDate !=null">-->
<!-- and s.openedDate <![CDATA[<=]]> #{qo.endDate}-->
<!-- </if>-->
<!-- <if test="qo.startDate !=null">-->
<!-- and s.openedDate <![CDATA[>=]]> #{qo.startDate}-->
<!-- </if>-->
<!-- <if test="qo.endDate !=null">-->
<!-- and s.openedDate <![CDATA[<=]]> #{qo.endDate}-->
<!-- </if>-->
<if test="qo.testUser != null and qo.testUser != '' ">
and s.test_user like concat('%', #{qo.testUser}, '%')
</if>
<if test="qo.productUser != null and qo.productUser != '' ">
and s.product_user like concat('%', #{qo.productUser}, '%')
</if>
<if test="qo.pri != null and qo.pri != '' ">
and s.pri = #{qo.pri}
</if>
@@ -422,12 +429,7 @@
<if test="qo.name != null and qo.name != '' ">
and s.title like concat('%', #{qo.name}, '%')
</if>
<if test="qo.productUser != null and qo.productUser != '' ">
and s.product_user like concat('%', #{qo.productUser}, '%')
</if>
<if test="qo.testUser != null and qo.testUser != '' ">
and s.assignedTo like concat('%', #{qo.testUser}, '%')
</if>
<if test="qo.productName != null and qo.productName != '' ">
and pt.name like concat('%', #{qo.productName}, '%')
</if>
@@ -472,12 +474,7 @@
and s.status ='reviewing'
and v.result = ''
</if>
<if test="qo.searchVal != null and qo.searchVal == 'WDCP' ">
and s.product_user = #{qo.userName}
</if>
<if test="qo.searchVal != null and qo.searchVal == 'WCC' ">
and s.assignedTo = #{qo.userName}
</if>
<if test="qo.searchVal == 'JH' ">
and s.status = 'active'
@@ -524,49 +521,49 @@
<if test="qo.searchCode=='xmmc' and qo.searchValue != null and qo.searchValue != '' ">
and pj.name like concat('%', #{qo.searchValue}, '%')
</if>
-- 项目id
-- 项目id
<if test="qo.searchCode=='xmid' and qo.searchValue != null and qo.searchValue != '' ">
and pj.id =#{qo.searchValue}
and pj.id =#{qo.searchValue}
</if>
-- //需求名称
-- //需求名称
<if test="qo.searchCode=='xqmc' and qo.searchValue != null and qo.searchValue != '' ">
and s.title like concat('%', #{qo.searchValue}, '%')
and s.title like concat('%', #{qo.searchValue}, '%')
</if>
-- 需求id
-- 需求id
<if test="qo.searchCode=='xqid' and qo.searchValue != null and qo.searchValue != '' ">
and s.id =#{qo.searchValue}
and s.id =#{qo.searchValue}
</if>
-- 状态
-- 状态
<if test="qo.searchCode=='zt' and qo.searchValue != null and qo.searchValue != '' ">
and s.stage =#{qo.searchValue}
and s.stage =#{qo.searchValue}
</if>
-- 项目描述
-- 项目描述
<if test="qo.searchCode=='xmms' and qo.searchValue != null and qo.searchValue != '' ">
and sp.`spec` =#{qo.searchValue}
and sp.`spec` =#{qo.searchValue}
</if>
-- 负责人
-- 负责人
<if test="qo.searchCode=='fzr' and qo.searchValue != null and qo.searchValue != '' ">
and s.assignedTo =#{qo.searchValue}
and s.assignedTo =#{qo.searchValue}
</if>
<if test="qo.searchCode=='jhwc' and qo.searchValue != null and qo.searchValue != '' ">
and s.plan_end_date ${qo.searchValue}
and s.plan_end_date ${qo.searchValue}
</if>
<if test="qo.searchCode=='sjks' and qo.searchValue != null and qo.searchValue != '' ">
and s.start_date ${qo.searchValue}
and s.start_date ${qo.searchValue}
</if>
<if test="qo.searchCode=='sjwc' and qo.searchValue != null and qo.searchValue != '' ">
and s.end_date ${qo.searchValue}
and s.end_date ${qo.searchValue}
</if>
<if test="qo.searchCode=='yscj' and qo.searchValue != null and qo.searchValue != '' ">
and s.openedBy = #{qo.searchValue}
and s.openedBy = #{qo.searchValue}
</if>
<if test="qo.searchCode=='ysgb' and qo.searchValue != null and qo.searchValue != '' ">
and s.closedBy = #{qo.searchValue}
and s.closedBy = #{qo.searchValue}
</if>
</if>
@@ -901,7 +898,12 @@
WHERE 1=1
<if test="qo.testUser != null and qo.testUser != '' ">
and s.test_user like concat('%', #{qo.testUser}, '%')
</if>
<if test="qo.productUser != null and qo.productUser != '' ">
and s.product_user like concat('%', #{qo.productUser}, '%')
</if>
<if test="qo.pri != null and qo.pri != '' ">
and s.pri = #{qo.pri}
@@ -1314,25 +1316,4 @@
and (spc.spec like concat('%', #{keyword}, '%') or spc.verify like concat('%', #{keyword}, '%') or st.title like concat('%', #{keyword}, '%') ) order by id desc )
</select>
<select id="storyReleaseOnTimeByProducts" resultType="java.util.Map">
select (SELECT count(1) waitRelease from zt_story
WHERE plan_end_date >=#{startTime} and plan_end_date &lt;= #{endTime} AND product in
<foreach collection="pIds" item="id" index="index"
open="(" close=")" separator=",">
#{id}
</foreach>) planReleaseStoryNum,
(SELECT count(1) waitRelease from zt_story
WHERE plan_end_date >=#{startTime} and plan_end_date &lt;=#{endTime} and releasedDate >=#{startTime}
and releasedDate &lt;=#{endTime}
AND product in
<foreach collection="pIds" item="id" index="index"
open="(" close=")" separator=",">
#{id}
</foreach>
) onTimeNum
from dual;
</select>
</mapper>

View File

@@ -140,7 +140,7 @@
s.deliver_remark,
s.old_status,
s.ys_user,
s.product_user,
pt.name productName from zt_story_user s LEFT JOIN zt_product pt on s.product = pt.id WHERE 1=1
<if test="qo.productIds != null and qo.productIds.size() > 0">
@@ -188,9 +188,9 @@
<if test="qo.productName != null and qo.productName != '' ">
and pt.name like concat('%', #{qo.productName}, '%')
</if>
<if test="qo.productUser != null and qo.productUser != '' ">
and s.product_user like concat('%', #{qo.productUser}, '%')
</if>
<if test="qo.searchVal == 'ALL' ">
@@ -199,12 +199,10 @@
and s.status != 'closed'
</if>
<if test="qo.searchVal == 'WDCP' ">
and s.product_user = #{qo.userName}
</if>
<if test="qo.searchVal == 'WCJ' ">
and s.openedby= #{qo.userName}
</if>
<if test="qo.id != null ">
and s.id = #{qo.id}
</if>