2 Commits

Author SHA1 Message Date
0f1c7b02fe 产品角色等 2025-12-25 14:02:41 +08:00
8f0c7a020c 产品角色等 2025-12-25 13:46:26 +08:00
12 changed files with 181 additions and 240 deletions

View File

@@ -78,7 +78,6 @@ public class ZtStoryUser implements Serializable {
// DQR("storyunconfirmed","需求待确认",8),
// CFM("confirmed","需求已确认",9),
// KFZ("developing","研发中",10),
// KFZ("released","已发布",10),
// YWC("finished","已完成",11),
// CLOSED("closed","已关闭",12),
private String status;

View File

@@ -2,9 +2,6 @@ package com.sa.zentao.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import java.util.ArrayList;
import java.util.List;
public enum StoryStageEnums {
//closed 关闭 wait 初始化 projected 已立项 developing 研发中 developed 研发完毕 testing 测试中
// tested测试完毕 released已发布 verified已验收 closed 已关闭
@@ -31,17 +28,6 @@ public enum StoryStageEnums {
this.desc=desc;
}
public static List<String> beforeStatus(int code){
List<String> list=new ArrayList<String>();
StoryStageEnums[] values = values();
for (StoryStageEnums value : values) {
if (value.code<code&&value.code!=1){
list.add(value.value);
}
}
return list;
}
public int getCode() {
return this.code;
}

View File

@@ -17,7 +17,6 @@ public enum UserStoryEnums {
DQR("storyunconfirmed","需求待确认",8),
CFM("confirmed","需求已确认",9),
KFZ("developing","研发中",10),
RELEASED("released","已发布",15),
YWC("finished","已完成",11),
CLOSED("closed","已关闭",12),
;

View File

@@ -13,6 +13,7 @@ public enum UserType {
UI(7, "UI工程师"),
XMJL(8, "项目经理"),
XMZL(9, "项目助理"),
CPJL(10, "产品经理"),
;
@EnumValue

View File

@@ -64,8 +64,6 @@ public class ZtProjectQo extends BaseQo {
private String status;
private List<String> stageList;
private String title;
private Integer module;
@@ -107,6 +105,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

@@ -198,8 +198,7 @@ public class IZtCountService {
// if (!name.equals("admin")) {
if (!CollectionUtils.isEmpty(pIds)) {
list = this.storyUserService.list(new QueryWrapper<ZtStoryUser>().lambda().in(ZtStoryUser::getProduct, pIds)
.in(ZtStoryUser::getStatus, "active", "reviewing", "active",
"unconfirmed", "waitcommunicate", "waitdesign", "designdoing", "designdone", "storyunconfirmed", "confirmed"));
.in(ZtStoryUser::getStatus, "active", "reviewing", "active", "unconfirmed", "waitcommunicate", "waitdesign", "designdoing", "designdone", "storyunconfirmed", "confirmed"));
ztStory = storyService.list(new QueryWrapper<ZtStory>()
.lambda().eq(ZtStory::getDeleted, "0")
.in(ZtStory::getProduct, pIds)
@@ -2941,6 +2940,3 @@ public class IZtCountService {
}

View File

@@ -1321,10 +1321,6 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
ztStory.setEndDate(new Date());
}
this.baseMapper.updateById(ztStory);
//用户需求
if(ztStory.getUserStory()!=null&&ztStory.getUserStory().intValue()!=0){
this.storyUserService.changeStatus(ztStory.getUserStory(),UserStoryEnums.RELEASED);
}
String ysUser = ztStory.getYsUser();

View File

@@ -13,7 +13,10 @@ 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.*;
import com.sa.zentao.enums.ActionStatus;
import com.sa.zentao.enums.ActionType;
import com.sa.zentao.enums.FileTypes;
import com.sa.zentao.enums.UserStoryEnums;
import com.sa.zentao.mapper.ZtStoryUserMapper;
import com.sa.zentao.qo.StoryQo;
import com.sa.zentao.qo.ZtProjectQo;
@@ -302,11 +305,6 @@ public class ZtStoryUserServiceImpl extends ServiceImpl<ZtStoryUserMapper, ZtSto
qo.setProductIds(pIds);
}
if(!CollectionUtils.isEmpty(qo.getStatusList())&&qo.getStatusList().contains("unconfirmed")) {
qo.getStatusList().addAll(Arrays.asList("unconfirmed",
"waitcommunicate","waitdesign","designdoing","designdone","storyunconfirmed"));
}
Page<ZtStoryUserDTO> page = PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize());
List<ZtStoryUserDTO> list = this.baseMapper.pageList(qo);
if (!CollectionUtils.isEmpty(list)) {
@@ -728,15 +726,6 @@ public class ZtStoryUserServiceImpl extends ServiceImpl<ZtStoryUserMapper, ZtSto
//交付物确认
this.sendConfirmMessage(storyUser.getId(),ztProduct.getPo());
}
if(UserStoryEnums.RELEASED == status){
//如果研发需求已经全部发布,那么就发布
// wait 初始化 projected 已立项 developing 研发中 developed 研发完毕 testing 测试中 tested
List<ZtStory> storyList = this.storyService.list(new QueryWrapper<ZtStory>().lambda()
.ne(ZtStory::getStatus, "closed").in(ZtStory::getStage, StoryStageEnums.beforeStatus(7)).eq(ZtStory::getUserStory, id));
if(!CollectionUtils.isEmpty(storyList)){
return ;
}
}
storyUser.setStatus(status.getCode());
storyUser.setLasteditedby(RiskUserThreadLocal.get().getName());
storyUser.setLastediteddate(new Date());

View File

@@ -786,44 +786,6 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
}
}
if (ztTask.getDeadline() != null && ztTask.getStory() != null && ztTask.getStory() != 0) {
ZtStory ztStory = this.storyService.getById(ztTask.getStory());
ztStory.setDevelPlanEndTime(null);
if (ztTask.getType().equals("devel") && (ztStory.getDevelPlanEndTime() == null || ztTask.getDeadline().after(ztStory.getDevelPlanEndTime()))) {
ztStory.setDevelPlanEndTime(ztTask.getDeadline());
} else {
//查找最大时间那个
List<ZtTask> ztTasks = this.baseMapper.selectList(new QueryWrapper<ZtTask>().lambda()
.select(ZtTask::getDeadline)
.isNotNull(ZtTask::getDeadline)
.eq(ZtTask::getType, "devel")
.ne(ZtTask::getId, ztTask.getId())
.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())));
}
if (ztTask.getType().equals("test") && (ztStory.getTestPlanEndTime() == null || ztTask.getDeadline().after(ztStory.getTestPlanEndTime()))) {
ztStory.setTestPlanEndTime(ztTask.getDeadline());
} else {
if (ztTask.getType().equals("test") && ztStory.getTestPlanEndTime() != null) {
//查找最大时间那个
ztStory.setDevelPlanEndTime(ztTask.getDeadline());
List<ZtTask> ztTasks = this.baseMapper.selectList(new QueryWrapper<ZtTask>().lambda()
.select(ZtTask::getDeadline)
.isNotNull(ZtTask::getDeadline)
.eq(ZtTask::getType, "test")
.ne(ZtTask::getId, ztTask.getId())
.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::getTestPlanEndTime, CollectionUtils.isEmpty(ztTasks) ? null : DateUtils.getDayLast(ztTasks.get(0).getDeadline())));
}
}
this.storyService.updateById(ztStory);
}
fileService.updateFile(dto.getFiles(), ztTask.getId(), FileTypes.task);
@@ -931,10 +893,10 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
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(),
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(),
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){
@@ -1034,7 +996,13 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
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(),
//更新需求交付物
ZtStory ztStory = this.storyService.getById(ztTask.getStory());
if(ztStory!=null){
ztStory.setDeliverContent(ztTask.getDeliverContent());
this.storyService.updateById(ztStory);
}
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);
}
}
@@ -1123,6 +1091,7 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
}
ZtProjectproduct projectproduct = projectproductService.getOne(new QueryWrapper<ZtProjectproduct>().lambda().eq(ZtProjectproduct::getProject, ztTask.getProject()));
//添加action

View File

@@ -213,6 +213,13 @@
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>
@@ -257,16 +264,11 @@
and closedBy =#{qo.userName}
</if>
<if test="qo.stageList != null and qo.stageList.size() > 0">
and s.stage in
<foreach collection="qo.stageList" item="id" index="index"
open="(" close=")" separator=",">
#{id}
</foreach>
</if>
group by s.id
<choose>
<when test="qo.orderName != '' and qo.orderName != null ">
<choose>
@@ -282,9 +284,20 @@
order by s.id desc
</otherwise>
</choose>
-- order by id desc
</select>
<select id="projectStoryPageList" resultType="com.sa.zentao.dao.ZtStoryDTO">
select s.id,
s.vision,
s.parent,
@@ -374,6 +387,12 @@
<!-- <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>
@@ -457,6 +476,7 @@
</if>
<if test="qo.searchVal == 'JH' ">
and s.status = 'active'
</if>
@@ -557,14 +577,7 @@
</foreach>
</if>
<if test="qo.stageList != null and qo.stageList.size() > 0">
and s.stage in
<foreach collection="qo.stageList" item="id" index="index"
open="(" close=")" separator=",">
#{id}
</foreach>
</if>
group by s.id
@@ -879,7 +892,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}
@@ -1028,14 +1046,6 @@
</if>
<if test="qo.stageList != null and qo.stageList.size() > 0">
and s.stage in
<foreach collection="qo.stageList" item="id" index="index"
open="(" close=")" separator=",">
#{id}
</foreach>
</if>
group by s.id
<choose>

View File

@@ -162,16 +162,6 @@
and s.openedBy = #{qo.openedby}
</if>
<if test="qo.statusList != null and qo.statusList.size() > 0">
and s.status in
<foreach collection="qo.statusList" item="id" index="index"
open="(" close=")" separator=",">
#{id}
</foreach>
</if>
<if test="qo.status != null and qo.status != '' ">
-- 需求明确中、详细设计、详细设计中、产品已设计、需求待确认 这些查询状态合并成 “需求明确中”