This commit is contained in:
2025-05-09 11:39:30 +08:00
parent cba93c7d2b
commit 4d0bb07b0b
31 changed files with 1093 additions and 228 deletions

View File

View File

@ -22,7 +22,7 @@ public class CodeGenerator {
//自己的名字
static String Author = "gqb";
public static String tableName = "zt_month_scope";
public static String tableName = "zt_story_case";
/**
* <p>

View File

@ -56,13 +56,18 @@ public class ZtProjectController {
return Result.success();
}
//添加项目集
//获取项目信息
@RequestMapping(value = "/getProjectById", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
public Result getProjectById(@RequestBody ZtProjectDTO dto){
ZtProjectDTO p =ztProjectService.getProjectById(dto);
return Result.success(p);
}
//获取迭代信息
@RequestMapping(value = "/getExecutionById", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
public Result getExecutionById(@RequestBody ZtProjectDTO dto){
ZtProjectDTO p =ztProjectService.getExecutionById(dto);
return Result.success(p);
}
//修改执行
@RequestMapping(value = "/editImplement", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
public Result editImplement(@RequestBody ZtProjectDTO dto){

View File

@ -0,0 +1,62 @@
package com.sa.zentao.controller;
import com.sa.zentao.dao.Result;
import com.sa.zentao.dao.ZtStoryCaseDTO;
import com.sa.zentao.dao.ZtStoryDTO;
import com.sa.zentao.qo.ZtStoryCaseQo;
import com.sa.zentao.service.IZtStoryCaseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 前端控制器
* </p>
*
* @author gqb
* @since 2025-05-07
*/
@RestController
@RequestMapping("/zt-story-case")
public class ZtStoryCaseController {
@Autowired
private IZtStoryCaseService storyCaseService;
// ZtStoryCaseDTO
@RequestMapping(value = "/addCase", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
public Result addStory(@RequestBody ZtStoryCaseDTO dto) {
storyCaseService.addCase(dto);
return Result.success();
}
@RequestMapping(value = "/modifyCase", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
public Result modifyCase(@RequestBody ZtStoryCaseDTO dto) {
storyCaseService.modifyCase(dto);
return Result.success();
}
@RequestMapping(value = "/userReview", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
public Result userReview(@RequestBody ZtStoryCaseQo qo){
storyCaseService.userReview(qo);
return Result.success();
}
@RequestMapping(value = "/submitUserReview", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
public Result submitUserReview(@RequestBody ZtStoryCaseQo qo){
storyCaseService.submitUserReview(qo);
return Result.success();
}
@RequestMapping(value = "/getById", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
public Result getById(@RequestBody ZtStoryCaseQo qo){
return Result.success(storyCaseService.getById(qo.getId()));
}
}

View File

@ -621,4 +621,14 @@ public class ZtTaskController {
return Result.success();
}
@Autowired
private VxService vxService;
@RequestMapping(value = "/testMessage", method = RequestMethod.GET, produces = "application/json; charset=UTF-8")
public Result testMessage(@RequestParam("implementName")String implementName){
vxService.sendMessageToVx("guoqibing","测试",new Date());
return Result.success();
}
}

View File

@ -0,0 +1,59 @@
package com.sa.zentao.dao;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
/**
* <p>
*
* </p>
*
* @author gqb
* @since 2025-05-07
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class ZtStoryCaseDTO implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String remark;
private Integer story;
private Date openedDate;
private String openedUser;
private String openedUserName;
private Date updateDate;
private String updateUser;
private String updateUserName;
private String psUser;
private String psUserName;
private Date psDate;
/**
* wait reviewing refuse 拒绝 finished
*/
private String status;
private Integer product;
private Integer execution;
private Integer project;
}

View File

@ -3,6 +3,7 @@ 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.entity.ZtStoryCase;
import com.sa.zentao.entity.ZtStoryreview;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -270,4 +271,7 @@ public class ZtStoryDTO implements Serializable {
private Date develDate;
//测试完成时间
private Date testedDate;
private ZtStoryCaseDTO caseInfo;
}

View File

@ -87,7 +87,7 @@ public class ZtBug implements Serializable {
// closed
// ZtBug 已完成
//1.active 2.confire=1 3.解决进行中 不变 4 resolved 完成 5.测试中不变 6.测试完毕不变 verified验收
// 'active','resolved','closed'?
// 'active','resolved','closed'? cancel
// active 激活
@TableField("`status`")
private String status;

View File

@ -1,6 +1,7 @@
package com.sa.zentao.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import java.sql.Blob;
@ -69,9 +70,9 @@ public class ZtMeeting implements Serializable {
// private Integer userStory;
private String storyIds;
@TableField(exist = false)
private String result;
@TableField(exist = false)
private String meetingAfter;
}

View File

@ -0,0 +1,55 @@
package com.sa.zentao.entity;
import java.time.LocalDateTime;
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
*
* </p>
*
* @author gqb
* @since 2025-05-07
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class ZtStoryCase implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
private String remark;
private Integer story;
private Date openedDate;
private String openedUser;
private Date updateDate;
private String updateUser;
private String psUser;
private Date psDate;
/**
* wait reviewing refuse 拒绝 finished
*/
private String status;
private Integer product;
private Integer execution;
private Integer project;
}

View File

@ -21,6 +21,10 @@ public enum ActionStatus {
PSTG(13, "reviewpassed","评审通过"),
PSYDMQ(14, "reviewclarified","评审有待明确"),
PSBTG(15, "reviewrejected","评审不通过"),
YSTG(16, "ystg","验收通过"),
YSBTG(17, "ysbtg","验收不通过"),
FBCG(18, "fb","发布通过"),
@ -38,6 +42,14 @@ public enum ActionStatus {
STORYCCYS(44, "storyccys","发布催促验收"),
TJYS(51, "verified","提交验收"),
CASESUBREVIEW(52, "caseSubmitreview","需求用例提交至评审"),
CASEPSTG(53, "reviewpassed","评审通过"),
CASEPSYDMQ(54, "reviewclarified","评审有待明确"),
CASEPSBTG(55, "reviewrejected","评审不通过"),
CASEBJ(4, "caseEdited","编辑需求用例"),
CASEXJ(1, "casePpened","新建用例"),
KSCL(61, "startHand","开始处理"),
WXCL(62, "dontHand","无需处理"),

View File

@ -22,6 +22,7 @@ public enum ActionType {
WTFK(15, "story-feedback","问题反馈"),
RW(5, "task","任务"),
STORYUSERTASK(21, "user-story-task","用户需求任务"),

View File

@ -0,0 +1,16 @@
package com.sa.zentao.mapper;
import com.sa.zentao.entity.ZtStoryCase;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* Mapper 接口
* </p>
*
* @author gqb
* @since 2025-05-07
*/
public interface ZtStoryCaseMapper extends BaseMapper<ZtStoryCase> {
}

View File

@ -0,0 +1,14 @@
package com.sa.zentao.qo;
import lombok.Data;
@Data
public class ZtStoryCaseQo extends BaseQo {
//1 通过 2不通过
private Integer revieweResult;
private Integer id;
private String desc;
}

View File

@ -142,4 +142,7 @@ public interface IZtProjectService extends IService<ZtProject> {
List<ZtProject> projectListByProductIds(List<Integer> pIds);
List<ZtProject> getExecutionsListByProjectAndDate(List<Integer> projects, Date firstDayOfMonth, Date lastDayOfMonth);
ZtProjectDTO getExecutionById(ZtProjectDTO dto);
}

View File

@ -0,0 +1,26 @@
package com.sa.zentao.service;
import com.sa.zentao.dao.ZtStoryCaseDTO;
import com.sa.zentao.entity.ZtStoryCase;
import com.baomidou.mybatisplus.extension.service.IService;
import com.sa.zentao.qo.ZtStoryCaseQo;
/**
* <p>
* 服务类
* </p>
*
* @author gqb
* @since 2025-05-07
*/
public interface IZtStoryCaseService extends IService<ZtStoryCase> {
void addCase(ZtStoryCaseDTO dto);
void modifyCase(ZtStoryCaseDTO dto);
void userReview(ZtStoryCaseQo qo);
void submitUserReview(ZtStoryCaseQo qo);
}

View File

@ -1,11 +1,13 @@
package com.sa.zentao.service;
import com.github.pagehelper.PageInfo;
import com.sa.zentao.dao.ZtStoryCaseDTO;
import com.sa.zentao.dao.ZtStoryDTO;
import com.sa.zentao.dao.ZtStoryUserDTO;
import com.sa.zentao.entity.ZtProject;
import com.sa.zentao.entity.ZtStory;
import com.baomidou.mybatisplus.extension.service.IService;
import com.sa.zentao.entity.ZtStoryCase;
import com.sa.zentao.enums.TaskType;
import com.sa.zentao.qo.ZtProjectQo;
import org.apache.ibatis.annotations.Param;
@ -94,4 +96,5 @@ public interface IZtStoryService extends IService<ZtStory> {
List<ZtStory> getNormalStory(List<ZtStory> sList);
public Map<Integer, ZtStoryCaseDTO> getStoryCaseMap(List<ZtStoryDTO> list);
}

View File

@ -4,8 +4,11 @@ import com.alibaba.excel.util.StringUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.sa.zentao.conf.SpringUtil;
import com.sa.zentao.entity.ZtUser;
import com.sa.zentao.utils.CryptoUtils;
import com.sa.zentao.utils.HttpRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.http.HttpEntity;
@ -27,13 +30,54 @@ public class VxService {
private static String corpid;
@Value("${vx.dkcorpsecret}")
private static String dkcorpsecret="1MWQxoL8QtypfdnKJqdo3pGdZDAmdhqTF_MaWm3rVjs";
private static String dkcorpsecret;
@Value("${vx.salaryCorpsecretApp}")
private static String salaryCorpsecretApp;
@Autowired
private IZtUserService userService;
// public void sendMessageToVx(String vxId, String text, Date date) {
// Environment bean = SpringUtil.getBean(Environment.class);
//
//
// if (corpid == null) {
// corpid = bean.getProperty("vx.corpid");
// dkcorpsecret = bean.getProperty("vx.dkcorpsecret");
// salaryCorpsecretApp = bean.getProperty("vx.salaryCorpsecretApp");
// }
// String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + corpid + "&corpsecret=" + salaryCorpsecretApp;
// try {
// String data = HttpRequest.sendGet(url, null);
// JSONObject object = JSON.parseObject(data);
// String access_token = object.getString("access_token");
//
// url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + access_token;
//
// Map<String, Object> map = new HashMap<String, Object>();
// map.put("touser", vxId);
// map.put("agentid", 3010185);
// map.put("safe", 0);
// map.put("enable_id_trans", 0);
// map.put("enable_duplicate_check", 0);
// map.put("msgtype","text");
// Map<String, Object> texts = new HashMap<String, Object>();
// texts.put("content", text);
// map.put("text", texts);
// log.info("调用微信start==",JSON.toJSONString(map));
// String s = JSONPost(url, map);
// log.info("调用微信end==",s);
// } catch (IOException e) {
// e.printStackTrace();
// log.error("",e);
// }
// }
public void feedbackSendMessageToVx(String vxId, String text, Date date) {
public void sendMessageToVx(String vxId, String text, Date date) {
Environment bean = SpringUtil.getBean(Environment.class);
@ -69,6 +113,52 @@ public class VxService {
}
}
public void sendMessageToVx(String account, String text, Date date) {
//
// ZtUser ztUser = this.userService.selectByName(account);
// if(ztUser==null||StringUtils.isEmpty(ztUser.getVx())){
// return;
// }
String vxId = "lisi";//CryptoUtils.aesDecryptForFront(ztUser.getVx(), CryptoUtils.KEY_DES);
Environment bean = SpringUtil.getBean(Environment.class);
if (corpid == null) {
corpid = bean.getProperty("vx.corpid");
dkcorpsecret = bean.getProperty("vx.dkcorpsecret");
salaryCorpsecretApp = bean.getProperty("vx.salaryCorpsecretApp");
}
String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + corpid + "&corpsecret=" + salaryCorpsecretApp;
try {
String data = HttpRequest.sendGet(url, null);
JSONObject object = JSON.parseObject(data);
String access_token = object.getString("access_token");
url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + access_token;
Map<String, Object> map = new HashMap<String, Object>();
map.put("touser", vxId);
//
map.put("agentid", 1000002);
// map.put("agentid", 3010185);
map.put("safe", 0);
map.put("enable_id_trans", 0);
map.put("enable_duplicate_check", 0);
map.put("msgtype","text");
Map<String, Object> texts = new HashMap<String, Object>();
texts.put("content", text);
map.put("text", texts);
log.info("调用微信start==",JSON.toJSONString(map));
String s = JSONPost(url, map);
log.info("调用微信end==",s);
} catch (IOException e) {
e.printStackTrace();
log.error("",e);
}
}
public static String JSONPost(String url, Map<String, Object> map) {
RestTemplate restTemplate = new RestTemplate();
HttpHeaders requestHeaders = new HttpHeaders();

View File

@ -198,12 +198,12 @@ public class IZtCountService {
return new ZtStoryCountDTO();
}
String name = loginRiskUser.getName();
if (name.equals("admin") || userType == UserType.GSGC) {
if (userType == UserType.GSGC) {
List<ZtStoryUser> list = null;
List<ZtStory> ztStory = null;
if (!name.equals("admin")) {
// 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"));
@ -216,18 +216,18 @@ public class IZtCountService {
list = new ArrayList<>();
ztStory = new ArrayList<>();
}
} else {
list = this.storyUserService.list(new QueryWrapper<ZtStoryUser>().lambda().in(ZtStoryUser::getStatus, "active", "reviewing", "active", "unconfirmed", "waitcommunicate", "waitdesign", "designdoing", "designdone", "storyunconfirmed", "confirmed"));
if (CollectionUtils.isEmpty(list)) {
ztStory = new ArrayList<>();
} else {
ztStory = storyService.list(new QueryWrapper<ZtStory>()
.lambda().eq(ZtStory::getDeleted, "0")
.ne(ZtStory::getStatus, "closed")
);
}
}
// } else {
// list = this.storyUserService.list(new QueryWrapper<ZtStoryUser>().lambda().in(ZtStoryUser::getStatus, "active", "reviewing", "active", "unconfirmed", "waitcommunicate", "waitdesign", "designdoing", "designdone", "storyunconfirmed", "confirmed"));
//
// if (CollectionUtils.isEmpty(list)) {
// ztStory = new ArrayList<>();
// } else {
// ztStory = storyService.list(new QueryWrapper<ZtStory>()
// .lambda().eq(ZtStory::getDeleted, "0")
// .ne(ZtStory::getStatus, "closed")
// );
// }
// }
List<ZtProduct> products = this.productService.list(new QueryWrapper<ZtProduct>().lambda().eq(ZtProduct::getStatus, "normal").in(ZtProduct::getId, pIds));
@ -846,7 +846,7 @@ public class IZtCountService {
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_HALF_UP));
dto.setSaturation(dto.getTotalTime().floatValue() == 0 ? BigDecimal.ZERO : dto.getAllocationTime().divide(dto.getExamineTime(), 2, BigDecimal.ROUND_UP));
//完成准时率 TODO 延期 / 总完成
@ -856,7 +856,7 @@ public class IZtCountService {
// List<Float> finishAllTime = ;
//准时完成率
BigDecimal onTimeFinishRate = BigDecimalUtils.isZero(finishAllTime) ? finishAllTime : onTime.divide(finishAllTime, 2, BigDecimal.ROUND_HALF_UP);
BigDecimal onTimeFinishRate = BigDecimalUtils.isZero(finishAllTime) ? finishAllTime : onTime.divide(finishAllTime, 2, BigDecimal.ROUND_UP);
dto.setFinishPunctuality(onTimeFinishRate);
/**准时率得分
* 1. =100%,得满分;
@ -870,9 +870,11 @@ public class IZtCountService {
//bug得分
List<ZtBug> bugList = this.bugService.list(new QueryWrapper<ZtBug>().lambda().
ge(ZtBug::getOpeneddate, firstDayOfMonth).le(ZtBug::getOpeneddate, lastDayOfMonth)
.eq(ZtBug::getAssignedTo, u.getAccount()));
bugList=this.bugService.getNormalBugList(bugList);
//bug密度
int bugSize = bugList.size();
BigDecimal bugDensity = BigDecimalUtils.isZero(finishAllTime) ? finishAllTime : BigDecimal.valueOf(bugSize).divide(finishAllTime, 2, BigDecimal.ROUND_HALF_UP);
@ -956,7 +958,7 @@ public class IZtCountService {
BigDecimal onTime = floatBatchAdd(onTimeTask.stream().map(o -> o.getEstimate())
.collect(Collectors.toList()));
//准时完成率
BigDecimal onTimeFinishRate = BigDecimalUtils.isZero(finishAllTime) ? finishAllTime : onTime.divide(finishAllTime, 2, BigDecimal.ROUND_HALF_UP);
BigDecimal onTimeFinishRate = BigDecimalUtils.isZero(finishAllTime) ? finishAllTime : onTime.divide(finishAllTime, 2, BigDecimal.ROUND_UP);
onTimeFinishRate = onTimeFinishRate.floatValue() > 1 ? BigDecimal.valueOf(1) : onTimeFinishRate;
dto.setFinishPunctuality(onTimeFinishRate);
BigDecimal finishScope = BigDecimal.valueOf(20);
@ -974,10 +976,10 @@ public class IZtCountService {
//轻微
long slightBug = allBugList.stream().filter(o -> Arrays.asList(4, 2, 3).contains(o.getSeverity())).count();
long totalBug = seriousBug * 5 + slightBug * 1;
dto.setBugFindRate(BigDecimalUtils.isZero(dto.getExamineTime()) ? BigDecimal.ZERO : BigDecimal.valueOf(totalBug).divide(dto.getExamineTime(), 2, BigDecimal.ROUND_HALF_UP));
dto.setBugFindRate(BigDecimalUtils.isZero(dto.getExamineTime()) ? BigDecimal.ZERO : BigDecimal.valueOf(totalBug).divide(dto.getExamineTime(), 2, BigDecimal.ROUND_UP));
//缺陷检出率 TODO bug 数量 / 可用工时 250418尹工说的
int bugFindScore = dto.getBugFindRate().multiply(BigDecimal.valueOf(100)).intValue() > 20 ? 30 :
(30 - (20 - BigDecimal.valueOf(totalBug).divide(dto.getExamineTime(), 2, BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).intValue()) * 2);
(30 - (20 - BigDecimal.valueOf(totalBug).divide(dto.getExamineTime(), 2, BigDecimal.ROUND_UP).multiply(BigDecimal.valueOf(100)).intValue()) * 2);
dto.setDevSeriousBug(BigDecimal.valueOf(seriousBug));
dto.setDevSlightBug(BigDecimal.valueOf(slightBug));
//bug检出率
@ -2555,9 +2557,6 @@ public class IZtCountService {
List<ZtBug> list = this.bugService.list(new QueryWrapper<ZtBug>().lambda().in(ZtBug::getProduct, pIds)
.ge(ZtBug::getOpeneddate, start).le(ZtBug::getOpeneddate, end));
list=this.bugService.getNormalBugList(list);
List<ZtTask> tList = this.taskService.list(new QueryWrapper<ZtTask>().lambda().in(ZtTask::getProduct, pIds)
.ge(ZtTask::getOpeneddate, start).le(ZtTask::getOpeneddate, end));
tList = this.taskService.getNormalTaskList(tList);
if (CollectionUtils.isEmpty(list)) {
return map;
}
@ -2683,16 +2682,16 @@ public class IZtCountService {
List<ZtBug> devBugList = bugList.stream().filter(o -> o.getBugType().equals("dev")).collect(Collectors.toList());
int devBugCount = devBugList.size();
dto.setBugCount(BigDecimal.valueOf(devBugCount));
dto.setBugDensity((dto.getAllocationTime() == null || BigDecimalUtils.isZero(dto.getAllocationTime())) ? BigDecimal.ZERO : BigDecimal.valueOf(devBugCount).divide(dto.getAllocationTime(), 2, BigDecimal.ROUND_HALF_UP));
dto.setBugDensity((dto.getAllocationTime() == null || BigDecimalUtils.isZero(dto.getAllocationTime())) ? BigDecimal.ZERO : BigDecimal.valueOf(devBugCount).divide(dto.getAllocationTime(), 3, BigDecimal.ROUND_DOWN));
dto.setWorkTime(workTime);
// //完成任务总量
dto.setTaskCount(taskCount);
//分配公式/达标工时 分配任务工时占 总工时的% TODO
dto.setSaturation(BigDecimalUtils.isZero(examineTime) ? BigDecimal.ZERO : dto.getAllocationTime().divide(examineTime, 2, BigDecimal.ROUND_HALF_UP));
dto.setSaturation(BigDecimalUtils.isZero(examineTime) ? BigDecimal.ZERO : dto.getAllocationTime().divide(examineTime, 2, BigDecimal.ROUND_UP));
//完成准时率
dto.setFinishPunctuality(kfzCount<=0?BigDecimal.ZERO:finishPunctuality.divide(BigDecimal.valueOf(kfzCount),2,BigDecimal.ROUND_HALF_UP));
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)
@ -2705,7 +2704,7 @@ public class IZtCountService {
// 处理结果通过率
BigDecimal verifiedCount = BigDecimal.valueOf(feedbackList.stream().filter(o -> o.getStatus().equals("verified")).count());
dto.setPassFeedbackCountRate(BigDecimalUtils.isZero(dto.getHandFeedbackCount()) ? BigDecimal.ZERO : verifiedCount.divide(dto.getHandFeedbackCount(), 2, BigDecimal.ROUND_HALF_UP));
dto.setPassFeedbackCountRate(BigDecimalUtils.isZero(dto.getHandFeedbackCount()) ? BigDecimal.ZERO : verifiedCount.divide(dto.getHandFeedbackCount(), 2, BigDecimal.ROUND_UP));
// //上线的需求数量
List<ZtStory> releaseStoryList = monthReleaseBeforeAfterFifteen(firstDayOfMonth, pList.stream().map(o -> o.getId()).collect(Collectors.toList()));
@ -2732,4 +2731,6 @@ public class IZtCountService {
return multipleDepartProjectTeamList.stream().filter(o->!StringUtils.isEmpty(o.getAssignedTo())).map(o->o.getAssignedTo()).collect(Collectors.toList());
}
}
}

View File

@ -25,6 +25,8 @@ import com.sa.zentao.service.*;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sa.zentao.utils.BeanCopyUtil;
import com.sa.zentao.utils.DateUtils;
import com.sa.zentao.utils.VxMessageUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@ -338,7 +340,7 @@ public class ZtBugServiceImpl extends ServiceImpl<ZtBugMapper, ZtBug> implements
throw new BusinessException("未查询到数据");
}
ZtBug ztBug = this.baseMapper.selectById(qo.getId());
String oldAssignedTo = ztBug.getAssignedTo();
if(!ztBug.getOpenedby().equals(loginRiskUser.getName())){
if(!ztBug.getAssignedTo().equals(loginRiskUser.getName())){
if(loginRiskUser.getUserType()!=UserType.XMGLY&&loginRiskUser.getUserType()!=UserType.GSGC){
@ -362,6 +364,7 @@ public class ZtBugServiceImpl extends ServiceImpl<ZtBugMapper, ZtBug> implements
this.actionService.addAction(ActionType.BUG, ActionStatus.FP,ztBug.getId(),ztBug.getProject()+"",ztBug.getProject(),ztBug.getExecution()
,RiskUserThreadLocal.get().getName(),null,qo.getAssignedTo()
);
this.bugSendMessage(ztBug.getId(),oldAssignedTo,ztBug.getAssignedTo());
}
@Override
@ -434,6 +437,8 @@ public class ZtBugServiceImpl extends ServiceImpl<ZtBugMapper, ZtBug> implements
this.actionService.addAction(ActionType.BUG, ActionStatus.XJ,ztBug.getId(),ztBug.getProject()+"",ztBug.getProject(),ztBug.getExecution()
,RiskUserThreadLocal.get().getName(),ztBug.getSteps(),""
);
this.bugSendMessage(ztBug.getId(),null,ztBug.getAssignedTo());
}
}
@ -545,9 +550,14 @@ public class ZtBugServiceImpl extends ServiceImpl<ZtBugMapper, ZtBug> implements
public List<ZtBug> getNormalBugList(List<ZtBug> bugList) {
List<ZtBug> result=new ArrayList();
for (ZtBug b:bugList) {
if("cancel".equals(b.getStatus())){
continue;
}
if(!b.getStatus().equals("closed")){
result.add(b);
}
if(b.getStatus().equals("closed")&&!StringUtils.isEmpty(b.getResolvedby())){
result.add(b);
}
@ -600,12 +610,17 @@ public class ZtBugServiceImpl extends ServiceImpl<ZtBugMapper, ZtBug> implements
this.actionService.addAction(ActionType.BUG, ActionStatus.XJ,ztBug.getId(),ztBug.getProject()+"",ztBug.getProject(),ztBug.getExecution()
,RiskUserThreadLocal.get().getName(),"",""
);
this.bugSendMessage(ztBug.getId(),null,ztBug.getAssignedTo());
}
@Override
@Transactional
public void editBug(ZtBugDTO dto) {
ZtBug ztBug = this.baseMapper.selectById(dto.getId());
String oldAssignedTo = ztBug.getAssignedTo();
BeanUtils.copyProperties(dto,ztBug,"execution");
@ -625,6 +640,7 @@ public class ZtBugServiceImpl extends ServiceImpl<ZtBugMapper, ZtBug> implements
this.actionService.addAction(ActionType.BUG, ActionStatus.BJ,ztBug.getId(),ztBug.getProject()+"",ztBug.getProject(),ztBug.getExecution()
,RiskUserThreadLocal.get().getName(),ztBug.getSteps(),""
);
this.bugSendMessage(ztBug.getId(),oldAssignedTo,ztBug.getAssignedTo());
}
@Override
@ -735,6 +751,9 @@ 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(),""
);
this.bugFinishedSendMessage(ztBug.getId(),ztBug.getOpenedby());
}
@Override
@ -765,6 +784,19 @@ public class ZtBugServiceImpl extends ServiceImpl<ZtBugMapper, ZtBug> implements
);
}
@Autowired
private VxService vxService;
private void bugSendMessage(Integer id, String oldUser, String newUser) {
if (ObjectUtils.notEqual(oldUser, newUser) && !StringUtils.isEmpty(newUser)) {
if (!StringUtils.isEmpty(newUser)) {
this.vxService.sendMessageToVx(newUser, VxMessageUtils.bugMessage.assignToMessage(id), new Date());
}
}
}
private void bugFinishedSendMessage(Integer id, String newUser) {
if (!StringUtils.isEmpty(newUser)) {
this.vxService.sendMessageToVx(newUser, VxMessageUtils.bugMessage.bugFinished(id), new Date());
}
}
}

View File

@ -100,9 +100,10 @@ public class ZtKanbanlaneServiceImpl extends ServiceImpl<ZtKanbanlaneMapper, ZtK
List<ZtStoryDTO> ztStoryDTOS = BeanCopyUtil.copyListProperties(ztStories, ZtStoryDTO::new);
if(!CollectionUtils.isEmpty(ztStories)){
ZtProduct product = this.productService.getById(ztStoryDTOS.get(0).getProduct());
Map<Integer, ZtStoryCaseDTO> caseMap = this.storyService.getStoryCaseMap(ztStoryDTOS);
for (ZtStoryDTO st:ztStoryDTOS) {
ZtUser ztUser = userMap.get(st.getAssignedTo());
List<ZtProject> ztProjects = executionMapByStory.get(st.getId());
if(!CollectionUtils.isEmpty(ztProjects)){
st.setExecutionName(ztProjects.stream().map(o->o.getName()).collect(Collectors.joining(",")));
@ -116,6 +117,23 @@ public class ZtKanbanlaneServiceImpl extends ServiceImpl<ZtKanbanlaneMapper, ZtK
st.setProductName(product.getName());
}
ZtStoryCaseDTO ztStoryCaseDTO = caseMap.get(st.getId());
if(ztStoryCaseDTO!=null){
ztUser = userMap.get(ztStoryCaseDTO.getOpenedUser());
if(ztUser!=null){
ztStoryCaseDTO.setOpenedUserName(ztUser.getNickname());
}
ztUser = userMap.get(ztStoryCaseDTO.getUpdateUser());
if(ztUser!=null){
ztStoryCaseDTO.setUpdateUserName(ztUser.getNickname());
}
ztUser = userMap.get(ztStoryCaseDTO.getPsUser());
if(ztUser!=null){
ztStoryCaseDTO.setPsUserName(ztUser.getNickname());
}
st.setCaseInfo(ztStoryCaseDTO);
}
}
}
d.setList(ztStoryDTOS);

View File

@ -890,10 +890,10 @@ public class ZtProjectServiceImpl extends ServiceImpl<ZtProjectMapper, ZtProject
}
ZtUser user = userService.selectByName(RiskUserThreadLocal.get().getName());
if (user.getAccount().equals("admin")) {
return this.baseMapper.selectList(new QueryWrapper<ZtProject>()
.lambda().eq(ZtProject::getType, "program")).stream().map(o -> o.getId()).collect(Collectors.toList());
}
// if (user.getAccount().equals("admin")) {
// return this.baseMapper.selectList(new QueryWrapper<ZtProject>()
// .lambda().eq(ZtProject::getType, "program")).stream().map(o -> o.getId()).collect(Collectors.toList());
// }
String productIds = user.getProductIds();
if (StringUtils.isEmpty(productIds)) {
return new ArrayList<>();
@ -913,10 +913,10 @@ public class ZtProjectServiceImpl extends ServiceImpl<ZtProjectMapper, ZtProject
@Override
public List<Integer> projectAuthList() {
ZtUser user = userService.selectByName(RiskUserThreadLocal.get().getName());
if (user.getAccount().equals("admin")) {
return this.baseMapper.selectList(new QueryWrapper<ZtProject>()
.lambda().eq(ZtProject::getType, "project")).stream().map(o -> o.getId()).collect(Collectors.toList());
}
// if (user.getAccount().equals("admin")) {
// return this.baseMapper.selectList(new QueryWrapper<ZtProject>()
// .lambda().eq(ZtProject::getType, "project")).stream().map(o -> o.getId()).collect(Collectors.toList());
// }
String productIds = user.getProductIds();
if (StringUtils.isEmpty(productIds)) {
return new ArrayList<>();
@ -943,10 +943,10 @@ public class ZtProjectServiceImpl extends ServiceImpl<ZtProjectMapper, ZtProject
public List<Integer> execAuthList() {
ZtUser user = userService.selectByName(RiskUserThreadLocal.get().getName());
if (user.getAccount().equals("admin")) {
return this.baseMapper.selectList(new QueryWrapper<ZtProject>()
.lambda().eq(ZtProject::getType, "sprint")).stream().map(o -> o.getId()).collect(Collectors.toList());
}
// if (user.getAccount().equals("admin")) {
// return this.baseMapper.selectList(new QueryWrapper<ZtProject>()
// .lambda().eq(ZtProject::getType, "sprint")).stream().map(o -> o.getId()).collect(Collectors.toList());
// }
List<Integer> ids = null;
String productIds = user.getProductIds();
if (StringUtils.isEmpty(productIds)) {
@ -1101,6 +1101,22 @@ public class ZtProjectServiceImpl extends ServiceImpl<ZtProjectMapper, ZtProject
return ztProjects;
}
@Override
public ZtProjectDTO getExecutionById(ZtProjectDTO dto) {
ZtProject project = this.baseMapper.selectById(dto.getId());
if(project==null){
throw new BusinessException("未查询到数据");
}
ZtProjectDTO d=new ZtProjectDTO();
BeanUtils.copyProperties(project,d);
ZtUser account = this.userService.getByAccount(d.getPm());
if(account!=null){
d.setPmName(account.getNickname());
}
return d;
}
@Override
public void projectTeamUpdate(ZtProjectQo qo) {
List<String> teamList = qo.getTeamList();

View File

@ -0,0 +1,133 @@
package com.sa.zentao.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.sa.zentao.conf.RiskUserThreadLocal;
import com.sa.zentao.dao.BusinessException;
import com.sa.zentao.dao.ZtStoryCaseDTO;
import com.sa.zentao.entity.ZtStoryCase;
import com.sa.zentao.enums.ActionStatus;
import com.sa.zentao.enums.ActionType;
import com.sa.zentao.mapper.ZtStoryCaseMapper;
import com.sa.zentao.qo.ZtStoryCaseQo;
import com.sa.zentao.service.IZtActionService;
import com.sa.zentao.service.IZtStoryCaseService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
/**
* <p>
* 服务实现类
* </p>
*
* @author gqb
* @since 2025-05-07
*/
@Service
public class ZtStoryCaseServiceImpl extends ServiceImpl<ZtStoryCaseMapper, ZtStoryCase> implements IZtStoryCaseService {
@Autowired
private IZtActionService actionService;
@Override
public void addCase(ZtStoryCaseDTO dto) {
List<ZtStoryCase> ztStoryCases = this.baseMapper.selectList(new QueryWrapper<ZtStoryCase>().lambda().eq(ZtStoryCase::getStory, dto.getStory()));
if(!CollectionUtils.isEmpty(ztStoryCases)){
throw new BusinessException("重复提交");
}
ZtStoryCase ztStoryCase = new ZtStoryCase();
BeanUtils.copyProperties(dto,ztStoryCase);
ztStoryCase.setStatus("reviewing");
ztStoryCase.setOpenedDate(new Date());
ztStoryCase.setOpenedUser(RiskUserThreadLocal.get().getName());
this.baseMapper.insert(ztStoryCase);
actionService.addAction(ActionType.XQ, ActionStatus.CASEXJ, ztStoryCase.getId(), ztStoryCase.getProduct() + "", null, null,
RiskUserThreadLocal.get() == null ? "admin" : RiskUserThreadLocal.get().getName(), "", "");
}
@Override
@Transactional
public void modifyCase(ZtStoryCaseDTO dto) {
Integer id = dto.getId();
if(id==null){
throw new BusinessException("id为空");
}
ZtStoryCase ztStoryCase = this.baseMapper.selectById(dto.getId());
if(!Arrays.asList("reviewing","refuse").contains(ztStoryCase.getStatus())){
throw new BusinessException("无法编辑");
}
ztStoryCase.setPsUser(dto.getPsUser());
ztStoryCase.setStory(dto.getStory());
ztStoryCase.setExecution(dto.getExecution());
ztStoryCase.setRemark(dto.getRemark());
ztStoryCase.setUpdateDate(new Date());
ztStoryCase.setStatus("reviewing");
ztStoryCase.setUpdateUser(RiskUserThreadLocal.get().getName());
this.baseMapper.updateById(ztStoryCase);
actionService.addAction(ActionType.XQ, ActionStatus.CASEBJ, ztStoryCase.getId(), ztStoryCase.getProduct() + "", null, null,
RiskUserThreadLocal.get() == null ? "admin" : RiskUserThreadLocal.get().getName(), "", "");
}
@Override
public void userReview(ZtStoryCaseQo qo) {
Integer id = qo.getId();
ZtStoryCase ztStoryCase = this.baseMapper.selectById(id);
if(ztStoryCase==null){
throw new BusinessException("未查询到数据");
}
if(!RiskUserThreadLocal.get().getName().equals(ztStoryCase.getPsUser())){
throw new BusinessException("无需评审");
}
if(!ztStoryCase.getStatus().equals("reviewing")){
throw new BusinessException("无需评审");
}
if(qo.getRevieweResult().equals(1)){
//评审通过
ztStoryCase.setStatus("finished");
actionService.addAction(ActionType.XQ, ActionStatus.CASEPSTG, ztStoryCase.getId(), ztStoryCase.getProduct() + "", null, null,
RiskUserThreadLocal.get() == null ? "admin" : RiskUserThreadLocal.get().getName(), "", "");
}else{
//评审不通过
ztStoryCase.setStatus("refuse");
actionService.addAction(ActionType.XQ, ActionStatus.CASEPSBTG, ztStoryCase.getId(), ztStoryCase.getProduct() + "", null, null,
RiskUserThreadLocal.get() == null ? "admin" : RiskUserThreadLocal.get().getName(), qo.getDesc(), "");
}
ztStoryCase.setUpdateDate(new Date());
ztStoryCase.setUpdateUser(RiskUserThreadLocal.get().getName());
ztStoryCase.setPsDate(new Date());
this.baseMapper.updateById(ztStoryCase);
}
@Override
@Transactional
public void submitUserReview(ZtStoryCaseQo qo) {
ZtStoryCase ztStoryCase = this.baseMapper.selectById(qo.getId());
if(!Arrays.asList("wait","refuse").contains(ztStoryCase.getStatus())){
throw new BusinessException("当前无法提交评审");
}
ztStoryCase.setUpdateDate(new Date());
ztStoryCase.setUpdateUser(RiskUserThreadLocal.get().getName());
ztStoryCase.setStatus("reviewing");
this.baseMapper.updateById(ztStoryCase);
actionService.addAction(ActionType.XQ, ActionStatus.CASESUBREVIEW, ztStoryCase.getId(), ztStoryCase.getProduct() + "", null, null,
RiskUserThreadLocal.get() == null ? "admin" : RiskUserThreadLocal.get().getName(), "", "");
}
}

View File

@ -23,6 +23,7 @@ import com.sa.zentao.qo.ZtProjectQo;
import com.sa.zentao.service.*;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sa.zentao.utils.BeanCopyUtil;
import com.sa.zentao.utils.VxMessageUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -154,9 +155,15 @@ public class ZtStoryFeedbackServiceImpl extends ServiceImpl<ZtStoryFeedbackMappe
}
ztStoryFeedback.setFileUrl(dto.getUrls());
String addName = null;
if(org.apache.commons.lang3.StringUtils.isEmpty(name)&& !org.apache.commons.lang3.StringUtils.isEmpty(dto.getOaName())){
ztStoryFeedback.setSpec(ztStoryFeedback.getSpec()+" 提出人:"+dto.getOaName());
addName=dto.getOaName();
}else{
ZtUser account = this.userService.getByAccount(ztStoryFeedback.getOpenedBy());
addName=account==null?"":account.getNickname();
}
this.baseMapper.insert(ztStoryFeedback);
@ -176,6 +183,11 @@ public class ZtStoryFeedbackServiceImpl extends ServiceImpl<ZtStoryFeedbackMappe
}
}
ZtProduct ztProduct = this.productService.getById(ztStoryFeedback.getProduct());
ZtProject ztProject = this.projectService.getById(ztProduct);
addFeedbackMessage(ztStoryFeedback.getId(),addName,ztProject.getPm());
actionService.addAction(ActionType.WTFK, ActionStatus.XJ, ztStoryFeedback.getId(), ztStoryFeedback.getProduct() + "", null, null,
RiskUserThreadLocal.get() == null ? "admin" : RiskUserThreadLocal.get().getName(), "", "");
}
@ -220,7 +232,7 @@ public class ZtStoryFeedbackServiceImpl extends ServiceImpl<ZtStoryFeedbackMappe
//关闭
b.append("已关闭");
}
vxService.sendMessageToVx(ztStoryFeedback.getWeixin(), b.toString(), new Date());
vxService.feedbackSendMessageToVx(ztStoryFeedback.getWeixin(), b.toString(), new Date());
}
this.baseMapper.updateById(ztStoryFeedback);
@ -602,11 +614,13 @@ public class ZtStoryFeedbackServiceImpl extends ServiceImpl<ZtStoryFeedbackMappe
if (!org.apache.commons.lang3.StringUtils.isEmpty(ztStoryFeedback.getOpenSource()) && ztStoryFeedback.getOpenSource().equals("weixin")) {
StringBuilder b = new StringBuilder();
b.append("您反馈的").append(ztStoryFeedback.getName()).append(" 的问题已提交验收,请及时登陆系统验收。");
vxService.sendMessageToVx(ztStoryFeedback.getWeixin(), b.toString(), new Date());
vxService.feedbackSendMessageToVx(ztStoryFeedback.getWeixin(), b.toString(), new Date());
}
actionService.addAction(ActionType.WTFK, ActionStatus.TJYS, ztStoryFeedback.getId(), ztStoryFeedback.getProduct() + "", null, null,
RiskUserThreadLocal.get().getName(), dto.getDesc(), ztStoryFeedback.getAssignedTo());
waitYsMessage(ztStoryFeedback.getId(),ztStoryFeedback.getOpenedBy());
}
@Override
@ -816,4 +830,17 @@ public class ZtStoryFeedbackServiceImpl extends ServiceImpl<ZtStoryFeedbackMappe
actionService.addAction(ActionType.WTFK, ActionStatus.TJBZ, dto.getId(), ztStory.getProduct() + "", null, null,
RiskUserThreadLocal.get().getName(), dto.getRemark(), "");
}
private void addFeedbackMessage(Integer id,String openUser,String newUser) {
if (!org.apache.commons.lang3.StringUtils.isEmpty(newUser)) {
this.vxService.sendMessageToVx(newUser, VxMessageUtils.storyFeedbackMessage.addSendMessage(openUser, id), new Date());
}
}
private void waitYsMessage(Integer id,String openUser) {
if (!org.apache.commons.lang3.StringUtils.isEmpty(openUser)) {
this.vxService.sendMessageToVx(openUser, VxMessageUtils.storyFeedbackMessage.finishedFeedback( id), new Date());
}
}
}

View File

@ -20,9 +20,7 @@ import com.sa.zentao.qo.ZtProjectQo;
import com.sa.zentao.qo.ZtReleaseQo;
import com.sa.zentao.service.*;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sa.zentao.utils.BeanCopyUtil;
import com.sa.zentao.utils.BeanCopyUtilCallBack;
import com.sa.zentao.utils.SendEmail;
import com.sa.zentao.utils.*;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
@ -101,6 +99,9 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
private IZtReleaseService releaseService;
@Autowired
private IZtStoryCaseService storyCaseService;
@Override
public PageInfo<ZtStoryDTO> pageList(ZtProjectQo qo) {
Page<ZtStoryDTO> page = PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize());
@ -265,8 +266,18 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
this.executionBindStory(s, executions);
}
storySendZpMessage(s.getId(),"",s.getAssignedTo());
}
@Autowired
private VxService vxService;
private void storySendZpMessage(Integer id, String oldUser,String newUser) {
if(ObjectUtils.notEqual(oldUser, newUser)&&!StringUtils.isEmpty(newUser)){
this.vxService.sendMessageToVx(newUser, VxMessageUtils.storyMessage.assignToMessage(id),new Date());
}
}
private ZtStoryspec buildSpec(ZtStoryDTO dto, ZtStory s) {
@ -454,6 +465,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
public void editStory(ZtStoryDTO dto) {
Integer id = dto.getId();
ZtStory ztStory = this.baseMapper.selectById(id);
String oldAssignedTo = ztStory.getAssignedTo();
if ("closed".equals(ztStory.getStatus())) {
throw new BusinessException("当前已关闭");
}
@ -607,6 +619,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
RiskUserThreadLocal.get().getName(), dto.getRemark(), "");
}
storySendZpMessage(ztStory.getId(),oldAssignedTo,ztStory.getAssignedTo());
}
@ -747,10 +760,29 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
Map<Integer,List<ZtTask>> taskCountMap = getTaskCountMap(list);
Map<Integer,ZtStoryCaseDTO> caseMap = getStoryCaseMap(list);
for (ZtStoryDTO d : list) {
d.setRevieweUser(d.getReviewedby().replaceAll(",", ""));
d.setViews(rMap.get(d.getId()));
List<ZtTask> ztTasks = taskCountMap.get(d.getId());
ZtStoryCaseDTO ztStoryCaseDTO = caseMap.get(d.getId());
if(ztStoryCaseDTO!=null){
ZtUser ztUser = userMap.get(ztStoryCaseDTO.getOpenedUser());
if(ztUser!=null){
ztStoryCaseDTO.setOpenedUserName(ztUser.getNickname());
}
ztUser = userMap.get(ztStoryCaseDTO.getUpdateUser());
if(ztUser!=null){
ztStoryCaseDTO.setUpdateUserName(ztUser.getNickname());
}
ztUser = userMap.get(ztStoryCaseDTO.getPsUser());
if(ztUser!=null){
ztStoryCaseDTO.setPsUserName(ztUser.getNickname());
}
d.setCaseInfo(ztStoryCaseDTO);
}
d.setTaskCount(ztTasks==null?0:ztTasks.size());
@ -781,9 +813,30 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
return new PageInfo<ZtStoryDTO>(list);
}
public Map<Integer, ZtStoryCaseDTO> getStoryCaseMap(List<ZtStoryDTO> list) {
if(CollectionUtils.isEmpty(list)){
return new HashMap<>();
}
List<Integer> sIds = list.stream().map(o -> o.getId()).collect(Collectors.toList());
List<ZtStoryCase> caseList = this.storyCaseService.list(new QueryWrapper<ZtStoryCase>().lambda()
.select(SFunctionColums.caseColumes())
.in(ZtStoryCase::getStory, sIds));
if(CollectionUtils.isEmpty(caseList)){
return new HashMap<>();
}else{
List<ZtStoryCaseDTO> ztStoryCaseDTOS = BeanCopyUtil.copyListProperties(caseList, ZtStoryCaseDTO::new);
return ztStoryCaseDTOS.stream().collect(Collectors.toMap(ZtStoryCaseDTO::getStory, o -> o));
}
}
private Map<Integer, List<ZtTask>> getTaskCountMap(List<ZtStoryDTO> list) {
List<ZtTask> tList = this.taskService.list(new QueryWrapper<ZtTask>().lambda().in(ZtTask::getStory, list.stream().map(o -> o.getId()).collect(Collectors.toList())));
List<ZtTask> tList = this.taskService.list(new QueryWrapper<ZtTask>().lambda()
.select(SFunctionColums.taskColumes())
.in(ZtTask::getStory, list.stream().map(o -> o.getId()).collect(Collectors.toList())));
if(CollectionUtils.isEmpty(tList)){
return new HashMap<>();
}else{
@ -984,6 +1037,10 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
actionService.addAction(ActionType.XQ, ActionStatus.KFWC, ztStory.getId(), ztStory.getProduct() + "", ztStory.getProject(), null,
StringUtils.isEmpty(finishBy) ? RiskUserThreadLocal.get().getName() : finishBy, null, "");
//需求完成通知测试
this.vxService.sendMessageToVx(ztStory.getAssignedTo(), VxMessageUtils.storyMessage.finishedStory(id), new Date());
}
@Override
@ -1689,6 +1746,7 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
@Override
public void assignedTo(ZtStoryDTO dto) {
ZtStory ztStory = this.baseMapper.selectById(dto.getId());
String oldAssignedTo = ztStory.getAssignedTo();
if (ztStory == null) {
throw new BusinessException("未查询到");
}
@ -1701,6 +1759,8 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
actionService.addAction(ActionType.XQ, ActionStatus.FP, ztStory.getId(), ztStory.getProduct() + "", null, null,
RiskUserThreadLocal.get().getName(), dto.getDesc(), ztStory.getAssignedTo());
storySendZpMessage(ztStory.getId(),oldAssignedTo,ztStory.getAssignedTo());
}
@ -2011,6 +2071,27 @@ public class ZtStoryServiceImpl extends ServiceImpl<ZtStoryMapper, ZtStory> impl
d.setVerify(ztStoryspec.getVerify());
}
ZtStoryCase ztStoryCase = this.storyCaseService.getOne(new QueryWrapper<ZtStoryCase>().lambda().eq(ZtStoryCase::getStory, d.getId()));
if(ztStoryCase!=null){
ZtStoryCaseDTO ztStoryCaseDTO=new ZtStoryCaseDTO();
BeanUtils.copyProperties(ztStoryCase,ztStoryCaseDTO);
ztUser = userMap.get(ztStoryCaseDTO.getOpenedUser());
if(ztUser!=null){
ztStoryCaseDTO.setOpenedUserName(ztUser.getNickname());
}
ztUser = userMap.get(ztStoryCaseDTO.getUpdateUser());
if(ztUser!=null){
ztStoryCaseDTO.setUpdateUserName(ztUser.getNickname());
}
ztUser = userMap.get(ztStoryCaseDTO.getPsUser());
if(ztUser!=null){
ztStoryCaseDTO.setPsUserName(ztUser.getNickname());
}
d.setCaseInfo(ztStoryCaseDTO);
}
return d;
}

View File

@ -15,10 +15,7 @@ import com.sa.zentao.qo.KanbanQo;
import com.sa.zentao.qo.ZtProjectQo;
import com.sa.zentao.service.*;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sa.zentao.utils.BeanCopyUtil;
import com.sa.zentao.utils.DateUtils;
import com.sa.zentao.utils.KanBanConstant;
import com.sa.zentao.utils.SFunctionColums;
import com.sa.zentao.utils.*;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
@ -152,7 +149,7 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
ZtTaskDTO ztTaskDTO = new ZtTaskDTO();
ztTaskDTO.setApprovalStatus(dto.getApprovalStatus());
ztTaskDTO.setApprovalRemark(dto.getApprovalRemark());
BeanUtils.copyProperties(t,ztTaskDTO);
BeanUtils.copyProperties(t, ztTaskDTO);
this.approval(ztTaskDTO);
}
}
@ -161,7 +158,7 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
public List<ZtTaskDTO> myTaskList(ZtProjectQo qo) {
List<Integer> pList = this.ztProjectService.authProductList();
if(CollectionUtils.isEmpty(pList)){
if (CollectionUtils.isEmpty(pList)) {
return Arrays.asList();
}
@ -169,8 +166,8 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
List<ZtTask> taskList = this.baseMapper.selectList(new QueryWrapper<ZtTask>().lambda()
.select(SFunctionColums.taskColumes())
.in(ZtTask::getProduct, pList)
.notIn(ZtTask::getStatus, Arrays.asList("closed","cancel","done") )
.and(o->o.eq(ZtTask::getOpenedby, RiskUserThreadLocal.get().getName())
.notIn(ZtTask::getStatus, Arrays.asList("closed", "cancel", "done"))
.and(o -> o.eq(ZtTask::getOpenedby, RiskUserThreadLocal.get().getName())
.or().eq(ZtTask::getAssignedTo, RiskUserThreadLocal.get().getName()))
.orderByDesc(ZtTask::getDeadline)
@ -223,9 +220,9 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
dto.setImplementName(project.getName());
}
Integer story = dto.getStory();
if(story!=null&&story!=0){
if (story != null && story != 0) {
ZtStory ztStory = this.storyService.getById(story);
if(ztStory!=null){
if (ztStory != null) {
dto.setStoryName(ztStory.getTitle());
}
}
@ -246,15 +243,15 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
if (ztUser != null) {
dto.setFinishedbyName(ztUser.getNickname());
}
}
ztUser = userMap.get(ztTask.getClosedby());
if (ztUser != null) {
dto.setClosedbyName(ztUser.getNickname());
}
Integer feedback = ztTask.getFeedback();
if(feedback!=null&&feedback!=0){
if (feedback != null && feedback != 0) {
ZtStoryFeedback ztStoryFeedback = this.storyFeedbackService.getById(feedback);
if(ztStoryFeedback!=null){
if (ztStoryFeedback != null) {
dto.setFeedbackSpec(ztStoryFeedback.getSpec());
}
}
@ -264,51 +261,51 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
}
List<ZtBug> list = this.bugService.list(new QueryWrapper<ZtBug>().lambda().eq(ZtBug::getTotask, id));
if(!CollectionUtils.isEmpty(list)){
if (!CollectionUtils.isEmpty(list)) {
List<ZtBugDTO> ztBugDTOS = BeanCopyUtil.copyListProperties(list, ZtBugDTO::new);
for (ZtBugDTO bug:ztBugDTOS) {
for (ZtBugDTO bug : ztBugDTOS) {
ztUser = userMap.get(bug.getOpenedby());
if(ztUser!=null){
if (ztUser != null) {
bug.setOpenedbyName(ztUser.getNickname());
}
ztUser = userMap.get(bug.getAssignedTo());
if(ztUser!=null){
if (ztUser != null) {
bug.setAssignedToName(ztUser.getNickname());
}
ztUser = userMap.get(bug.getResolvedby());
if(ztUser!=null){
if (ztUser != null) {
bug.setResolvedbyName(ztUser.getNickname());
}
ztUser = userMap.get(bug.getYsUser());
if(ztUser!=null){
if (ztUser != null) {
bug.setYsUserName(ztUser.getNickname());
}
ztUser = userMap.get(bug.getLasteditedby());
if(ztUser!=null){
if (ztUser != null) {
bug.setLasteditedbyName(ztUser.getNickname());
}
ztUser = userMap.get(bug.getClosedby());
if(ztUser!=null){
if (ztUser != null) {
bug.setClosedbyName(ztUser.getNickname());
}
ztUser = userMap.get(bug.getLasteditedby());
if(ztUser!=null){
if (ztUser != null) {
bug.setLasteditedbyName(ztUser.getNickname());
}
if(bug.getDeadline()!=null){
if (bug.getDeadline() != null) {
bug.setDeadline(DateUtils.getDayLast(bug.getDeadline()));
}
}
dto.setBugList(ztBugDTOS);
}else{
} else {
dto.setBugList(Arrays.asList());
}
ZtProduct ztProduct = this.productService.getById(dto.getProduct());
dto.setProductName(ztProduct==null?null:ztProduct.getName());
dto.setProductName(ztProduct == null ? null : ztProduct.getName());
return dto;
}
@ -324,17 +321,15 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
@Override
public List<ZtTask> taskListByEIdsAndDate(Date firstDayOfMonth, Date lastDayOfMonth, List<Integer> pids) {
if(CollectionUtils.isEmpty(pids)){
if (CollectionUtils.isEmpty(pids)) {
return new ArrayList<>();
}
if(firstDayOfMonth==null||lastDayOfMonth==null){
if (firstDayOfMonth == null || lastDayOfMonth == null) {
return new ArrayList<>();
}
List<ZtTask> taskList = this.list(new QueryWrapper<ZtTask>().lambda()
.select(SFunctionColums.taskColumes())
.in(ZtTask::getProduct, pids).and(f->f
.and(o->o.ge(ZtTask::getDeadline,firstDayOfMonth).le(ZtTask::getDeadline,lastDayOfMonth))
.or(e->e.ge(ZtTask::getFinishedDate,firstDayOfMonth).le(ZtTask::getFinishedDate,lastDayOfMonth))));
.ge(ZtTask::getFinishedDate, firstDayOfMonth).le(ZtTask::getFinishedDate, lastDayOfMonth));
// return this.baseMapper.taskListByPIdsAndDate(pids,firstDayOfMonth,lastDayOfMonth);
return taskList;
@ -342,35 +337,35 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
@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);
}
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;
}
return delayList;
}
@Override
public List<ZtTask> getOnTimeTask(List<ZtTask> t) {
if(CollectionUtils.isEmpty(t)){
if (CollectionUtils.isEmpty(t)) {
return new ArrayList<>();
}
return t.stream().filter(o -> o.getFinishedDate() != null
@ -384,7 +379,7 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
@Override
public List<ZtTask> taskListByStoryIds(List<Integer> sIds) {
if(CollectionUtils.isEmpty(sIds)){
if (CollectionUtils.isEmpty(sIds)) {
return new ArrayList<>();
}
return this.baseMapper.taskListByStoryIds(sIds);
@ -392,10 +387,10 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
@Override
public List<ZtTask> getNormalTaskList(List<ZtTask> tList) {
List<ZtTask> result=new ArrayList();
List<ZtTask> result = new ArrayList();
for (ZtTask t:tList) {
if(!"closed".equals(t.getStatus())&&!"cancel".equals(t.getStatus())){
for (ZtTask t : tList) {
if (!"closed".equals(t.getStatus()) && !"cancel".equals(t.getStatus())) {
result.add(t);
}
}
@ -410,35 +405,35 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
@Override
public List<ZtTask> develTaskListByExecutions(Date firstDayOfMonth, Date lastDayOfMonth, List<Integer> eIds) {
if(CollectionUtils.isEmpty(eIds)){
if (CollectionUtils.isEmpty(eIds)) {
return new ArrayList<>();
}
List<ZtTeam> teamList = this.teamService.list(new QueryWrapper<ZtTeam>().lambda().in(ZtTeam::getRoot, eIds).eq(ZtTeam::getType, "execution"));
if(CollectionUtils.isEmpty(teamList)){
if (CollectionUtils.isEmpty(teamList)) {
return new ArrayList<>();
}
Map<String, ZtUser> userMap = this.userService.userMapByIds(teamList.stream().map(o -> o.getAccount()).collect(Collectors.toList()));
List<String> kfzList=new ArrayList<>();
for (ZtTeam t:teamList) {
List<String> kfzList = new ArrayList<>();
for (ZtTeam t : teamList) {
ZtUser ztUser = userMap.get(t.getAccount());
if(ztUser!=null&&ztUser.getUserType()==UserType.KFZ){
if (ztUser != null && ztUser.getUserType() == UserType.KFZ) {
kfzList.add(ztUser.getAccount());
}
}
if(CollectionUtils.isEmpty(kfzList)){
if (CollectionUtils.isEmpty(kfzList)) {
return new ArrayList<>();
}
List<ZtTask> taskList = this.list(new QueryWrapper<ZtTask>().lambda()
.in(ZtTask::getExecution, eIds)
.in(ZtTask::getAssignedTo,kfzList)
.in(ZtTask::getExecution, eIds)
.in(ZtTask::getAssignedTo, kfzList)
);
return taskList;
}
@Override
public List<ZtTask> multipleDepartProjectTeam(Date firstDayOfMonth, Date lastDayOfMonth) {
return this.baseMapper.multipleDepartProjectTeam(firstDayOfMonth,lastDayOfMonth);
return this.baseMapper.multipleDepartProjectTeam(firstDayOfMonth, lastDayOfMonth);
}
@ -484,9 +479,9 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
String[] split = qo.getIds().split(",");
qo.setObjIds(new ArrayList<>(Arrays.asList(split)));
}
if(qo.getProductId()!=null&&qo.getProductId()!=0){
if (qo.getProductId() != null && qo.getProductId() != 0) {
qo.setProductIds(Arrays.asList(qo.getProductId()));
}else{
} else {
qo.setProductIds(pids);
}
@ -539,10 +534,10 @@ 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").contains(ztStory.getStage())){
if (!Arrays.asList("wait", "projected", "developing", "developed", "testing", "tested").contains(ztStory.getStage())) {
throw new BusinessException("当前状态无法添加任务");
}
if(ztStory.getStatus().equals("closed")){
if (ztStory.getStatus().equals("closed")) {
throw new BusinessException("已关闭的需求无法拆分任务");
}
ztStory.setTaskCount(ztStory.getTaskCount() + 1);
@ -594,22 +589,22 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
if (ztProjectproduct != null) {
ztTask.setProduct(ztProjectproduct.getProduct());
}
if(dto.getFinishedFlag()==null||dto.getFinishedFlag()==0){
if (dto.getFinishedFlag() == null || dto.getFinishedFlag() == 0) {
//不完成任务
dto.setApplyDate(null);
}else{
} else {
//完成修补数据
ztTask.setRealstarted(new Date(ztTask.getApplyDate().getTime()-ztTask.getUseTime()
.multiply(BigDecimal.valueOf(60*60*1000)).longValue()));
ztTask.setRealstarted(new Date(ztTask.getApplyDate().getTime() - ztTask.getUseTime()
.multiply(BigDecimal.valueOf(60 * 60 * 1000)).longValue()));
ztTask.setEstStarted(ztTask.getRealstarted());
ztTask.setDeadline(new Date(DateUtils.getDayEndDate(ztTask.getApplyDate()).getTime()-1000*60*5));
ztTask.setDeadline(new Date(DateUtils.getDayEndDate(ztTask.getApplyDate()).getTime() - 1000 * 60 * 5));
ztTask.setEstimate(ztTask.getUseTime().floatValue());
ztTask.setLeft(ztTask.getUseTime().floatValue());
}
this.baseMapper.insert(ztTask);
if("wait".equals(ztTask.getStatus())){
this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.transferType(ztTask.getType()),false);
if ("wait".equals(ztTask.getStatus())) {
this.storyService.taskFinishChangeStatus(ztTask.getStory(), null, TaskType.transferType(ztTask.getType()), false);
}
fileService.updateFile(dto.getFiles(), ztTask.getId(), FileTypes.task);
@ -622,12 +617,12 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
actionService.addAction(ActionType.RW, ActionStatus.XJ, ztTask.getId()
, projectproduct == null ? null : projectproduct.getProduct().toString(), projectproduct == null ? null : projectproduct.getProject(), ztTask.getExecution(),
RiskUserThreadLocal.get().getName(),"", null);
RiskUserThreadLocal.get().getName(), "", null);
if(dto.getFinishedFlag()!=null&&dto.getFinishedFlag()==1){
if (dto.getFinishedFlag() != null && dto.getFinishedFlag() == 1) {
//如果选了完成并且不需要审核那么直接完成
if((userType==UserType.XMGLY||userType==UserType.GSGC)&&!ztTask.getStatus().equals("draft")){
if ((userType == UserType.XMGLY || userType == UserType.GSGC) && !ztTask.getStatus().equals("draft")) {
dto.setId(ztTask.getId());
dto.setConsumed(ztTask.getUseTime().floatValue());
dto.setLeft(ztTask.getUseTime().floatValue());
@ -636,6 +631,13 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
}
}
ZtProject ztProject = this.ztProjectService.getById(ztTask.getExecution());
if (ztTask.getStatus().equals("reviewing")) {
taskSendPsMessage(ztTask.getId(), null, ztProject.getPm());
}
taskSendZpMessage(ztTask.getId(), null, ztTask.getAssignedTo());
}
@Override
@ -645,12 +647,13 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
if (ztTask == null) {
throw new BusinessException("未查询到数据");
}
String oldAssignedTo = ztTask.getAssignedTo();
Integer s1 = ztTask.getStory();
Integer s2 = dto.getStory();
//cancel取消 closed 关闭 done
if(Arrays.asList("cancel","closed","done").contains(ztTask.getStatus())){
if (Arrays.asList("cancel", "closed", "done").contains(ztTask.getStatus())) {
throw new BusinessException("当前无法编辑");
}
String desc = ztTask.getDesc();
@ -667,12 +670,12 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
UserType userType = RiskUserThreadLocal.get().getUserType();
if (dto.getDraftFlag() != null && dto.getDraftFlag() == 1) {
if(status.equals("wait")){
if (status.equals("wait")) {
throw new BusinessException("开始后不可以存为草稿");
}
ztTask.setStatus("draft");
}else{
if(status.equals("draft")){
} else {
if (status.equals("draft")) {
//如果是开发人员 需要评审
if (userType == UserType.KFZ) {
@ -683,11 +686,11 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
ztTask.setStatus("wait");
ztTask.setReviewingUser(null);
}
}else if (status.equals("wait")){
} else if (status.equals("wait")) {
ztTask.setStatus("wait");
}else if (status.equals("doing")){
} else if (status.equals("doing")) {
ztTask.setStatus("doing");
}else{
} else {
ztTask.setStatus("reviewing");
ZtProject ztProject = this.ztProjectService.getById(ztTask.getExecution());
ztTask.setReviewingUser(ztProject.getPm());
@ -695,25 +698,25 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
}
}
if(dto.getFinishedFlag()==null||dto.getFinishedFlag()==0){
if (dto.getFinishedFlag() == null || dto.getFinishedFlag() == 0) {
//不完成任务
}else{
} else {
//完成修补数据
ztTask.setRealstarted(new Date(ztTask.getApplyDate().getTime()-ztTask.getUseTime()
.multiply(BigDecimal.valueOf(60*60*1000)).longValue()));
ztTask.setRealstarted(new Date(ztTask.getApplyDate().getTime() - ztTask.getUseTime()
.multiply(BigDecimal.valueOf(60 * 60 * 1000)).longValue()));
ztTask.setEstStarted(ztTask.getRealstarted());
ztTask.setDeadline(new Date(DateUtils.getDayEndDate(ztTask.getApplyDate()).getTime()-1000*60*5));
ztTask.setDeadline(new Date(DateUtils.getDayEndDate(ztTask.getApplyDate()).getTime() - 1000 * 60 * 5));
ztTask.setEstimate(ztTask.getUseTime().floatValue());
ztTask.setLeft(ztTask.getUseTime().floatValue());
}
this.baseMapper.updateById(ztTask);
if(ObjectUtils.notEqual(s1,s2)){
if(s1!=null&&s1.intValue()!=0){
this.storyService.taskFinishChangeStatus(s1,null,TaskType.transferType(ztTask.getType()),true);
if (ObjectUtils.notEqual(s1, s2)) {
if (s1 != null && s1.intValue() != 0) {
this.storyService.taskFinishChangeStatus(s1, null, TaskType.transferType(ztTask.getType()), true);
}
if(s2!=null&&s2.intValue()!=0){
this.storyService.taskFinishChangeStatus(s2,null,TaskType.transferType(ztTask.getType()),false);
if (s2 != null && s2.intValue() != 0) {
this.storyService.taskFinishChangeStatus(s2, null, TaskType.transferType(ztTask.getType()), false);
}
}
@ -738,6 +741,7 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
RiskUserThreadLocal.get().getName(), dto.getRemark(), null);
}
}
taskSendZpMessage(ztTask.getId(), oldAssignedTo, ztTask.getAssignedTo());
}
@ -752,10 +756,10 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
String name = RiskUserThreadLocal.get().getName();
ZtTask ztTask = this.baseMapper.selectById(dto.getId());
if(StringUtils.isEmpty(ztTask.getAssignedTo())){
if (StringUtils.isEmpty(ztTask.getAssignedTo())) {
throw new BusinessException("未指派任务无法开始");
}
if(!ztTask.getAssignedTo().equals(name)){
if (!ztTask.getAssignedTo().equals(name)) {
throw new BusinessException("无法开始");
}
String status = ztTask.getStatus();
@ -767,9 +771,9 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
if (dto.getFinishedFlag() == 0) {
ztTask.setStatus("doing");
} else {
if(ztTask.getFinishedFlag()!=null&&ztTask.getFinishedFlag()==1){
if (ztTask.getFinishedFlag() != null && ztTask.getFinishedFlag() == 1) {
ztTask.setFinishedDate(ztTask.getApplyDate());
}else{
} else {
ztTask.setFinishedDate(new Date());
}
ztTask.setStatus("done");
@ -781,14 +785,14 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
ztTask.setLastediteddate(new Date());
ztTask.setConsumed(dto.getConsumed());
ztTask.setLeft(dto.getLeft() - dto.getConsumed());
if(ztTask.getLeft()<0){
if (ztTask.getLeft() < 0) {
ztTask.setLeft(0f);
}
this.baseMapper.updateById(ztTask);
if(ztTask.getFeedback()!=null&&ztTask.getFeedback()!=0){
if("doing".equals(ztTask.getStatus())){
if (ztTask.getFeedback() != null && ztTask.getFeedback() != 0) {
if ("doing".equals(ztTask.getStatus())) {
this.storyFeedbackService.feedbackStart(ztTask.getFeedback());
}else{
} else {
this.storyFeedbackService.feedbackFinished(ztTask.getFeedback());
}
@ -838,24 +842,6 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
kanbanlaneService.changeStatus(qo);
}
}
// if ("devel".equals(ztTask.getType())) {
//处理需求
this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.transferType(ztTask.getType()),false);
// if ("done".equals(ztTask.getStatus())) {
// this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.devel,false);
// } else if ("doing".equals(ztTask.getStatus())) {
// this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.devel,false);
// }
// }
// if ("test".equals(ztTask.getType())) {
// //处理需求
// if ("done".equals(ztTask.getStatus())) {
// this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.test);
// } else if ("doing".equals(ztTask.getStatus())) {
// this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.test);
// }
//
// }
Integer execution = ztTask.getExecution();
@ -864,25 +850,28 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
project.setStatus("doing");
this.ztProjectService.updateById(project);
}
if (dto.getFinishedFlag() == 1) {
String type = ztTask.getType();
if (ztTask.getStory() != null && ztTask.getStory() != 0) {
// if ("test".equals(type)) {
// this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.test);
// } else if ("devel".equals(type)) {
// //开发
// this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.test);
// }
this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.transferType(type),false);
}
}
// if (dto.getFinishedFlag() == 1) {
// String type = ztTask.getType();
// if (ztTask.getStory() != null && ztTask.getStory() != 0) {
//// if ("test".equals(type)) {
//// this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.test);
//// } else if ("devel".equals(type)) {
//// //开发
//// this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.test);
//// }
// this.storyService.taskFinishChangeStatus(ztTask.getStory(), null, TaskType.transferType(type), false);
// }
// }else{
//
// }
this.storyService.taskFinishChangeStatus(ztTask.getStory(), null, TaskType.transferType(ztTask.getType()), false);
}
@Override
@Transactional
public void finishTask(ZtTaskDTO dto,String finishBy) {
public void finishTask(ZtTaskDTO dto, String finishBy) {
ZtTask ztTask = this.baseMapper.selectById(dto.getId());
if ("done".equalsIgnoreCase(ztTask.getStatus())) {
throw new BusinessException("未查询到数据");
@ -891,10 +880,10 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
ztTask.setLeft(ztTask.getEstimate() - ztTask.getConsumed());
ztTask.setLeft(0f);
ztTask.setStatus("done");
if(ztTask.getFinishedFlag()!=null&&ztTask.getFinishedFlag()==1){
if (ztTask.getFinishedFlag() != null && ztTask.getFinishedFlag() == 1) {
ztTask.setFinishedDate(ztTask.getApplyDate());
ztTask.setFinishedby(ztTask.getAssignedTo());
}else{
} else {
ztTask.setFinishedby(RiskUserThreadLocal.get().getName());
ztTask.setFinishedDate(new Date());
}
@ -909,13 +898,13 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
e.setObjectid(ztTask.getId());
e.setLeft(0F);
e.setConsumed(dto.getConsumed());
e.setAccount(StringUtils.isEmpty(finishBy)?RiskUserThreadLocal.get().getName():finishBy);
e.setAccount(StringUtils.isEmpty(finishBy) ? RiskUserThreadLocal.get().getName() : finishBy);
this.effortService.add(e);
//添加action
ZtProjectproduct projectproduct = projectproductService.getOne(new QueryWrapper<ZtProjectproduct>().lambda().eq(ZtProjectproduct::getProject, ztTask.getProject()));
actionService.addAction(ActionType.RW, ActionStatus.WC, 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);
StringUtils.isEmpty(finishBy) ? RiskUserThreadLocal.get().getName() : finishBy, dto.getRemark(), null);
if (ztTask.getExecution() != null && ztTask.getExecution() != 0) {
if (StringUtils.isEmpty(dto.getTabType())) {
// KanbanQo qo = new KanbanQo();
@ -929,7 +918,7 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
// //查
// ztKanbanlane = this.kanbanlaneService.getZtKanbanlane("task", "developed", ztTask.getExecution());
// qo.setToId(ztKanbanlane.getColumn());
kanbanlaneService.changeStatus(ztTask.getExecution(),ztTask.getId(),"task","developed");
kanbanlaneService.changeStatus(ztTask.getExecution(), ztTask.getId(), "task", "developed");
} else {
KanbanQo qo = new KanbanQo();
qo.setStatusType(dto.getStatusType());
@ -950,7 +939,7 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
// devel 开发 request 需求 test
String type = ztTask.getType();
if (ztTask.getStory() != null && ztTask.getStory() != 0) {
this.storyService.taskFinishChangeStatus(ztTask.getStory(),finishBy,TaskType.transferType(type),false);
this.storyService.taskFinishChangeStatus(ztTask.getStory(), finishBy, TaskType.transferType(type), false);
// if ("test".equals(type)) {
// this.storyService.taskFinishChangeStatus(ztTask.getStory(),finishBy,TaskType.test);
// } else if ("devel".equals(type)) {
@ -958,7 +947,7 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
// this.storyService.taskFinishChangeStatus(ztTask.getStory(),finishBy,TaskType.devel);
// }
}
if(ztTask.getFeedback()!=null&&ztTask.getFeedback()!=0){
if (ztTask.getFeedback() != null && ztTask.getFeedback() != 0) {
this.storyFeedbackService.feedbackFinished(ztTask.getFeedback());
}
@ -995,7 +984,7 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
kanbanlaneService.changeStatus(qo);
}
}
this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.transferType(ztTask.getType()),true);
this.storyService.taskFinishChangeStatus(ztTask.getStory(), null, TaskType.transferType(ztTask.getType()), true);
}
@ -1008,7 +997,7 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
if ("cancel".equalsIgnoreCase(ztTask.getStatus())) {
throw new BusinessException("未查询到数据");
}
if("done".equals(status)||"closed".equals(status)){
if ("done".equals(status) || "closed".equals(status)) {
throw new BusinessException("当前状态无法取消");
}
ztTask.setLeft(0f);
@ -1028,7 +1017,7 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
if (ztTask.getExecution() != null && ztTask.getExecution() != 0) {
if (StringUtils.isEmpty(dto.getTabType())) {
kanbanlaneService.changeStatus(ztTask.getExecution(),ztTask.getId(),"task","canceled");
kanbanlaneService.changeStatus(ztTask.getExecution(), ztTask.getId(), "task", "canceled");
} else {
KanbanQo qo = new KanbanQo();
qo.setStatusType(dto.getStatusType());
@ -1039,12 +1028,11 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
kanbanlaneService.changeStatus(qo);
}
}
if(ztTask.getStory()!=null&&ztTask.getStory()!=0){
this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.transferType(ztTask.getType()),true);
if (ztTask.getStory() != null && ztTask.getStory() != 0) {
this.storyService.taskFinishChangeStatus(ztTask.getStory(), null, TaskType.transferType(ztTask.getType()), true);
}
}
@ -1072,11 +1060,11 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
List<ZtTask> saveList = new ArrayList();
List<Integer> storyList = list.stream().filter(o -> o.getStory() != null && o.getStory() != 0).map(o -> o.getStory()).collect(Collectors.toList());
if(!CollectionUtils.isEmpty(storyList)){
if (!CollectionUtils.isEmpty(storyList)) {
List<ZtStory> sList = this.storyService.listByIds(storyList);
List<ZtStory> closedStoryList = sList.stream().filter(o -> o.getStatus().equals("closed")).collect(Collectors.toList());
if(!CollectionUtils.isEmpty(closedStoryList)){
throw new BusinessException(closedStoryList.get(0).getTitle()+"已关闭");
if (!CollectionUtils.isEmpty(closedStoryList)) {
throw new BusinessException(closedStoryList.get(0).getTitle() + "已关闭");
}
}
for (ZtTaskDTO d : list) {
@ -1115,9 +1103,14 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
this.saveBatch(saveList);
for (ZtTask ztTask:saveList) {
if(!ztTask.getStatus().equals("reviewing")){
this.storyService.taskFinishChangeStatus(ztTask.getStory(),null,TaskType.transferType(ztTask.getType()),false);
ZtProject ztProject = this.ztProjectService.getById(saveList.get(0).getExecution());
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());
} else {
taskSendPsMessage(ztTask.getId(), ztProject.getPm(),ztTask.getOpenedby());
}
}
@ -1144,20 +1137,18 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
LoginRiskUser loginRiskUser = RiskUserThreadLocal.get();
if(loginRiskUser==null){
if (loginRiskUser == null) {
throw new BusinessException("请登录");
}
String account = loginRiskUser.getName();
ZtTask t = this.baseMapper.selectById(dto.getId());
if (!t.getStatus().equals("reviewing")) {
throw new BusinessException("未查询到数据");
}
if(!account.equals(t.getReviewingUser())){
if (!account.equals(t.getReviewingUser())) {
throw new BusinessException("当前无法评审");
}
if (dto.getApprovalStatus() == 1) {
@ -1178,7 +1169,7 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
ZtProjectproduct projectproduct = projectproductService.getOne(new QueryWrapper<ZtProjectproduct>().lambda().eq(ZtProjectproduct::getProject, t.getProject()));
this.baseMapper.updateById(t);
if (dto.getApprovalStatus() == 1) {
this.storyService.taskFinishChangeStatus(t.getStory(),t.getAssignedTo(),TaskType.transferType(t.getType()),false);
this.storyService.taskFinishChangeStatus(t.getStory(), t.getAssignedTo(), TaskType.transferType(t.getType()), false);
actionService.addAction(ActionType.RW, ActionStatus.PSTG, t.getId(), projectproduct == null ? null : projectproduct.getProduct().toString(), projectproduct == null ? null : projectproduct.getProject(), t.getExecution(),
RiskUserThreadLocal.get().getName(), dto.getApprovalRemark(), null);
@ -1189,25 +1180,22 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
if (dto.getApprovalStatus() == 1) {
if(t.getFinishedFlag()!=null&&t.getFinishedFlag()==1){
if (t.getFinishedFlag() != null && t.getFinishedFlag() == 1) {
dto.setConsumed(t.getEstimate());
dto.setRealstarted(t.getRealstarted());
dto.setFinishedDate(t.getApplyDate());
this.finishTask(dto,t.getAssignedTo());
this.finishTask(dto, t.getAssignedTo());
}
}
}
@Override
public List<ZtTaskDTO> taskListByExecution(ZtTaskDTO dto) {
LambdaQueryWrapper<ZtTask> eq = new QueryWrapper<ZtTask>().lambda();
eq.select(SFunctionColums.taskColumes());
if (dto.getExecution() != null) {
eq.eq(ZtTask::getExecution, dto.getExecution());
}
@ -1224,5 +1212,22 @@ public class ZtTaskServiceImpl extends ServiceImpl<ZtTaskMapper, ZtTask> impleme
}
}
@Autowired
private VxService vxService;
private void taskSendZpMessage(Integer id, String oldUser, String newUser) {
if (ObjectUtils.notEqual(oldUser, newUser) && !StringUtils.isEmpty(newUser)) {
ZtTask ztTask = this.baseMapper.selectById(id);
if (!ztTask.getOpenedby().equals(newUser)) {
this.vxService.sendMessageToVx(newUser, VxMessageUtils.taskMessage.assignToMessage(id), new Date());
}
}
}
private void taskSendPsMessage(Integer id, String newUser, String openUser) {
if (!StringUtils.isEmpty(newUser)) {
// ZtUser u = this.userService.getByAccount(openUser);
// this.vxService.sendMessageToVx(newUser, VxMessageUtils.taskMessage.psMessage(u.getNickname(), id), new Date());
}
}
}

View File

@ -1,6 +1,8 @@
package com.sa.zentao.utils;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.sa.zentao.dao.ZtStoryCaseDTO;
import com.sa.zentao.entity.ZtStoryCase;
import com.sa.zentao.entity.ZtStoryFeedback;
import com.sa.zentao.entity.ZtTask;
@ -29,9 +31,36 @@ public class SFunctionColums {
result.add(ZtTask::getDeadline);
result.add(ZtTask::getCloseddate);
result.add(ZtTask::getClosedby);
result.add(ZtTask::getStory);
result.add(ZtTask::getFeedback);
result.add(ZtTask::getExecution);
result.add(ZtTask::getProject);
result.add(ZtTask::getCanceledby);
result.add(ZtTask::getCanceleddate);
return result;
}
public static List<SFunction<ZtStoryCase, ?>> caseColumes(){
List<SFunction<ZtStoryCase, ?>> result=new ArrayList<>();
result.add(ZtStoryCase::getId);
result.add(ZtStoryCase::getProduct);
result.add(ZtStoryCase::getStory);
result.add(ZtStoryCase::getStatus);
result.add(ZtStoryCase::getOpenedDate);
result.add(ZtStoryCase::getOpenedUser);
result.add(ZtStoryCase::getUpdateDate);
result.add(ZtStoryCase::getUpdateUser);
result.add(ZtStoryCase::getPsUser);
result.add(ZtStoryCase::getPsDate);
result.add(ZtStoryCase::getExecution);
result.add(ZtStoryCase::getProject);
return result;
}
public static List<SFunction<ZtStoryFeedback, ?>> feedbackColumes(){
List<SFunction<ZtStoryFeedback, ?>> result=new ArrayList<>();
result.add(ZtStoryFeedback::getId);

View File

@ -0,0 +1,141 @@
package com.sa.zentao.utils;
public class VxMessageUtils {
public static class taskMessage{
public static String assignToMessage(Integer id){
StringBuilder b=new StringBuilder();
b.append("任务分配提醒:项目经理分派了一个任务给您,任务编号{id},请及时处理。");
String str = b.toString();
str=str.replace("{id}",id.toString());
return str;
}
public static String psMessage(String userName,Integer id){
StringBuilder b=new StringBuilder();
b.append("自建任务评审:{userName}自建了一个任务,任务编号{id},请及时评审。");
String str = b.toString();
str=str.replace("{userName}",userName);
str=str.replace("{id}",id.toString());
return str;
}
public static String finish(String name,Integer id){
StringBuilder b=new StringBuilder();
b.append("当前有任务指派 id {id} 任务名称:{name}请及时登录IT服务台处理");
String str = b.toString();
str=str.replace("{id}",name);
str=str.replace("{name}",id.toString());
return str;
}
}
public static class storyMessage{
public static String assignToMessage(Integer id){
StringBuilder b=new StringBuilder();
b.append("需求指派提醒:项目经理指派了一个需求给您,需求编号{id},请及时处理。");
String str = b.toString();
str=str.replace("{id}",id.toString());
return str;
}
public static String finishedStory(Integer id){
StringBuilder b=new StringBuilder();
b.append("需求提测:需求编号{id},已经完成了开发,请及时测试。");
String str = b.toString();
str=str.replace("{id}",id.toString());
return str;
}
}
public static class storyFeedbackMessage{
public static String addSendMessage(String userName,Integer id){
StringBuilder b=new StringBuilder();
b.append("问题反馈提醒:需求部门{name}提交了问题反馈,编号{id}, 请及时处理。");
String str = b.toString();
str=str.replace("{id}",id.toString());
str=str.replace("{name}",userName);
return str;
}
public static String finishedFeedback(Integer id){
StringBuilder b=new StringBuilder();
b.append("问题反馈验收提醒:您提出的问题反馈已经处理完成,编号{id},请及时验收。");
String str = b.toString();
str=str.replace("{id}",id.toString());
return str;
}
}
public static class feedbackMessage{
public static String assignToMessage(String name,Integer id){
StringBuilder b=new StringBuilder();
b.append("当前有任务指派 id {id} 任务名称:{name}请及时登录IT服务台处理");
String str = b.toString();
str=str.replace("{id}",name);
str=str.replace("{name}",id.toString());
return str;
}
public static String finish(String name,Integer id){
StringBuilder b=new StringBuilder();
b.append("当前有任务指派 id {id} 任务名称:{name}请及时登录IT服务台处理");
String str = b.toString();
str=str.replace("{id}",name);
str=str.replace("{name}",id.toString());
return str;
}
}
public static class bugMessage{
public static String assignToMessage(Integer id){
StringBuilder b=new StringBuilder();
b.append("BUG修复提醒测试人员提交了BUG给你BUG编号{id},请及时修复。");
String str = b.toString();
str=str.replace("{id}",id.toString());
return str;
}
public static String bugFinished(Integer id){
StringBuilder b=new StringBuilder();
b.append("BUG复测提醒: 开发人员已经修复BUG, bug编号{id} 请及时复测。");
String str = b.toString();
str=str.replace("{id}",id.toString());
return str;
}
}
public static class storyUserMessage{
public static String assignToMessage(String name,Integer id){
StringBuilder b=new StringBuilder();
b.append("当前有任务指派 id {id} 任务名称:{name}请及时登录IT服务台处理");
String str = b.toString();
str=str.replace("{id}",name);
str=str.replace("{name}",id.toString());
return str;
}
}
}

View File

@ -53,12 +53,14 @@ file:
#file:
# baseUrl: http://127.0.0.1:8085
vx:
token: vTniTyOG4csBmAnMr
encodingAesKey : gCmhw7vKLcZwsDszILPNSEqyjgRKODemkYmRFdfelmk
receiveid: wwa7cc4743271d6055
corpid: wwa7cc4743271d6055
corpsecret: qQNdRmtanymbshPOLgWTgB-TzX9QmNpVCpOx5suJ2xA
dkCorpsecret: 1MWQxoL8QtypfdnKJqdo3pGdZDAmdhqTF_MaWm3rVjs
salaryCorpsecretApp: ib0GyrjV573QdczASCeB-QmCsp0t_QpjsbnQwKBr-Os
token: DGkygyJELpIY2
encodingAesKey: Pp2D1vttrxVMoTzocD1SukkRe3IYXQjW5nuOjvc2JRE
receiveid: ww0b2dc90421854148
corpid: ww0b2dc90421854148
corpsecret: LRVwfc11K-JQS2nJC8xTPrZLBKmMRZ7nPyGchsVfKF4
# salaryCorpsecretApp: KlE8J0rMS3W8Hprztl_EnCfAonm34mPpS1B6vaOmzBc
salaryCorpsecretApp: biYcz9e1gIJSsAaTgCZXbcO8Vh9YT11JtaFeZPaPmtU
salaryCorpsecretAppUrl: https://qyapi.weixin.qq.com/cgi-bin/message/send
dkcorpsecret: 1MWQxoL8QtypfdnKJqdo3pGdZDAmdhqTF_MaWm3rVjs
dkcorpsecret: fMf4nGnkpcYMHq0JzEXx-LcyGvgoxX-DbbCjIjaHqZ0
# dkcorpsecret: biYcz9e1gIJSsAaTgCZXbcO8Vh9YT11JtaFeZPaPmtU #书籍

View File

@ -0,0 +1,17 @@
<?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.ZtStoryCaseMapper">
<resultMap id="BaseResultMap" type="com.sa.zentao.entity.ZtStoryCase">
<result column="id" property="id" />
<result column="remark" property="remark" />
<result column="story" property="story" />
<result column="opened_date" property="openedDate" />
<result column="opened_user" property="openedUser" />
<result column="update_date" property="updateDate" />
<result column="update_user" property="updateUser" />
<result column="ps_user" property="psUser" />
<result column="ps_date" property="psDate" />
<result column="status" property="status" />
</resultMap>
</mapper>

View File

@ -96,7 +96,9 @@
<if test="qo.searchVal == 'ZGW' ">
and s.assigned_to= #{qo.userName}
</if>
<if test="qo.productId != null ">
and s.product= #{qo.productId}
</if>
<if test="qo.searchVal == 'YGB' ">
and s.status = 'closed'