diff --git a/README.md b/README.md
deleted file mode 100644
index e69de29..0000000
diff --git a/src/main/java/com/sa/zentao/conf/CodeGenerator.java b/src/main/java/com/sa/zentao/conf/CodeGenerator.java
index 2834484..2fe084d 100644
--- a/src/main/java/com/sa/zentao/conf/CodeGenerator.java
+++ b/src/main/java/com/sa/zentao/conf/CodeGenerator.java
@@ -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";
/**
*
diff --git a/src/main/java/com/sa/zentao/controller/ZtProjectController.java b/src/main/java/com/sa/zentao/controller/ZtProjectController.java
index af3bc50..9a33ce0 100644
--- a/src/main/java/com/sa/zentao/controller/ZtProjectController.java
+++ b/src/main/java/com/sa/zentao/controller/ZtProjectController.java
@@ -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){
diff --git a/src/main/java/com/sa/zentao/controller/ZtStoryCaseController.java b/src/main/java/com/sa/zentao/controller/ZtStoryCaseController.java
new file mode 100644
index 0000000..cbf410f
--- /dev/null
+++ b/src/main/java/com/sa/zentao/controller/ZtStoryCaseController.java
@@ -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;
+
+/**
+ *
+ * 前端控制器
+ *
+ *
+ * @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()));
+ }
+
+}
diff --git a/src/main/java/com/sa/zentao/controller/ZtTaskController.java b/src/main/java/com/sa/zentao/controller/ZtTaskController.java
index 48d6e43..259d091 100644
--- a/src/main/java/com/sa/zentao/controller/ZtTaskController.java
+++ b/src/main/java/com/sa/zentao/controller/ZtTaskController.java
@@ -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();
+ }
}
diff --git a/src/main/java/com/sa/zentao/dao/ZtStoryCaseDTO.java b/src/main/java/com/sa/zentao/dao/ZtStoryCaseDTO.java
new file mode 100644
index 0000000..b14b51b
--- /dev/null
+++ b/src/main/java/com/sa/zentao/dao/ZtStoryCaseDTO.java
@@ -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;
+
+/**
+ *
+ *
+ *
+ *
+ * @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;
+
+}
diff --git a/src/main/java/com/sa/zentao/dao/ZtStoryDTO.java b/src/main/java/com/sa/zentao/dao/ZtStoryDTO.java
index 8f680df..b34f160 100644
--- a/src/main/java/com/sa/zentao/dao/ZtStoryDTO.java
+++ b/src/main/java/com/sa/zentao/dao/ZtStoryDTO.java
@@ -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;
+
}
diff --git a/src/main/java/com/sa/zentao/entity/ZtBug.java b/src/main/java/com/sa/zentao/entity/ZtBug.java
index 90db922..3fa850d 100644
--- a/src/main/java/com/sa/zentao/entity/ZtBug.java
+++ b/src/main/java/com/sa/zentao/entity/ZtBug.java
@@ -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;
diff --git a/src/main/java/com/sa/zentao/entity/ZtMeeting.java b/src/main/java/com/sa/zentao/entity/ZtMeeting.java
index 3ff436c..b606f29 100644
--- a/src/main/java/com/sa/zentao/entity/ZtMeeting.java
+++ b/src/main/java/com/sa/zentao/entity/ZtMeeting.java
@@ -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;
}
diff --git a/src/main/java/com/sa/zentao/entity/ZtStoryCase.java b/src/main/java/com/sa/zentao/entity/ZtStoryCase.java
new file mode 100644
index 0000000..9d8a823
--- /dev/null
+++ b/src/main/java/com/sa/zentao/entity/ZtStoryCase.java
@@ -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;
+
+/**
+ *
+ *
+ *
+ *
+ * @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;
+
+}
diff --git a/src/main/java/com/sa/zentao/enums/ActionStatus.java b/src/main/java/com/sa/zentao/enums/ActionStatus.java
index c9699bb..16184a2 100644
--- a/src/main/java/com/sa/zentao/enums/ActionStatus.java
+++ b/src/main/java/com/sa/zentao/enums/ActionStatus.java
@@ -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","无需处理"),
diff --git a/src/main/java/com/sa/zentao/enums/ActionType.java b/src/main/java/com/sa/zentao/enums/ActionType.java
index 0d43e00..12887ae 100644
--- a/src/main/java/com/sa/zentao/enums/ActionType.java
+++ b/src/main/java/com/sa/zentao/enums/ActionType.java
@@ -22,6 +22,7 @@ public enum ActionType {
WTFK(15, "story-feedback","问题反馈"),
+
RW(5, "task","任务"),
STORYUSERTASK(21, "user-story-task","用户需求任务"),
diff --git a/src/main/java/com/sa/zentao/mapper/ZtStoryCaseMapper.java b/src/main/java/com/sa/zentao/mapper/ZtStoryCaseMapper.java
new file mode 100644
index 0000000..4e60eb4
--- /dev/null
+++ b/src/main/java/com/sa/zentao/mapper/ZtStoryCaseMapper.java
@@ -0,0 +1,16 @@
+package com.sa.zentao.mapper;
+
+import com.sa.zentao.entity.ZtStoryCase;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author gqb
+ * @since 2025-05-07
+ */
+public interface ZtStoryCaseMapper extends BaseMapper {
+
+}
diff --git a/src/main/java/com/sa/zentao/qo/ZtStoryCaseQo.java b/src/main/java/com/sa/zentao/qo/ZtStoryCaseQo.java
new file mode 100644
index 0000000..255ef92
--- /dev/null
+++ b/src/main/java/com/sa/zentao/qo/ZtStoryCaseQo.java
@@ -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;
+}
diff --git a/src/main/java/com/sa/zentao/service/IZtProjectService.java b/src/main/java/com/sa/zentao/service/IZtProjectService.java
index 516d5f9..3898a66 100644
--- a/src/main/java/com/sa/zentao/service/IZtProjectService.java
+++ b/src/main/java/com/sa/zentao/service/IZtProjectService.java
@@ -142,4 +142,7 @@ public interface IZtProjectService extends IService {
List projectListByProductIds(List pIds);
List getExecutionsListByProjectAndDate(List projects, Date firstDayOfMonth, Date lastDayOfMonth);
+
+ ZtProjectDTO getExecutionById(ZtProjectDTO dto);
+
}
diff --git a/src/main/java/com/sa/zentao/service/IZtStoryCaseService.java b/src/main/java/com/sa/zentao/service/IZtStoryCaseService.java
new file mode 100644
index 0000000..2406a20
--- /dev/null
+++ b/src/main/java/com/sa/zentao/service/IZtStoryCaseService.java
@@ -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;
+
+/**
+ *
+ * 服务类
+ *
+ *
+ * @author gqb
+ * @since 2025-05-07
+ */
+public interface IZtStoryCaseService extends IService {
+
+ void addCase(ZtStoryCaseDTO dto);
+
+
+ void modifyCase(ZtStoryCaseDTO dto);
+
+ void userReview(ZtStoryCaseQo qo);
+
+ void submitUserReview(ZtStoryCaseQo qo);
+}
diff --git a/src/main/java/com/sa/zentao/service/IZtStoryService.java b/src/main/java/com/sa/zentao/service/IZtStoryService.java
index eec4688..25e0f3e 100644
--- a/src/main/java/com/sa/zentao/service/IZtStoryService.java
+++ b/src/main/java/com/sa/zentao/service/IZtStoryService.java
@@ -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 {
List getNormalStory(List sList);
+ public Map getStoryCaseMap(List list);
}
diff --git a/src/main/java/com/sa/zentao/service/VxService.java b/src/main/java/com/sa/zentao/service/VxService.java
index 5c062ad..606a414 100644
--- a/src/main/java/com/sa/zentao/service/VxService.java
+++ b/src/main/java/com/sa/zentao/service/VxService.java
@@ -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 map = new HashMap();
+// 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 texts = new HashMap();
+// 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 map = new HashMap();
+ 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 texts = new HashMap();
+ 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 map) {
RestTemplate restTemplate = new RestTemplate();
HttpHeaders requestHeaders = new HttpHeaders();
diff --git a/src/main/java/com/sa/zentao/service/impl/IZtCountService.java b/src/main/java/com/sa/zentao/service/impl/IZtCountService.java
index bfd1273..a4600ea 100644
--- a/src/main/java/com/sa/zentao/service/impl/IZtCountService.java
+++ b/src/main/java/com/sa/zentao/service/impl/IZtCountService.java
@@ -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 list = null;
List ztStory = null;
- if (!name.equals("admin")) {
+// if (!name.equals("admin")) {
if (!CollectionUtils.isEmpty(pIds)) {
list = this.storyUserService.list(new QueryWrapper().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().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()
- .lambda().eq(ZtStory::getDeleted, "0")
- .ne(ZtStory::getStatus, "closed")
- );
- }
- }
+// } else {
+// list = this.storyUserService.list(new QueryWrapper().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()
+// .lambda().eq(ZtStory::getDeleted, "0")
+// .ne(ZtStory::getStatus, "closed")
+// );
+// }
+// }
List products = this.productService.list(new QueryWrapper().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 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 bugList = this.bugService.list(new QueryWrapper().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 list = this.bugService.list(new QueryWrapper().lambda().in(ZtBug::getProduct, pIds)
.ge(ZtBug::getOpeneddate, start).le(ZtBug::getOpeneddate, end));
list=this.bugService.getNormalBugList(list);
- List tList = this.taskService.list(new QueryWrapper().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 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 feedbackList = this.storyFeedbackService.list(new QueryWrapper()
.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 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());
}
}
+
+
}
diff --git a/src/main/java/com/sa/zentao/service/impl/ZtBugServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtBugServiceImpl.java
index b774a7f..a5c6d74 100644
--- a/src/main/java/com/sa/zentao/service/impl/ZtBugServiceImpl.java
+++ b/src/main/java/com/sa/zentao/service/impl/ZtBugServiceImpl.java
@@ -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 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 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 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 implements
public List getNormalBugList(List bugList) {
List 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 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 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 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 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());
+ }
+ }
}
diff --git a/src/main/java/com/sa/zentao/service/impl/ZtKanbanlaneServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtKanbanlaneServiceImpl.java
index 9fb8894..57bfdef 100644
--- a/src/main/java/com/sa/zentao/service/impl/ZtKanbanlaneServiceImpl.java
+++ b/src/main/java/com/sa/zentao/service/impl/ZtKanbanlaneServiceImpl.java
@@ -100,9 +100,10 @@ public class ZtKanbanlaneServiceImpl extends ServiceImpl ztStoryDTOS = BeanCopyUtil.copyListProperties(ztStories, ZtStoryDTO::new);
if(!CollectionUtils.isEmpty(ztStories)){
ZtProduct product = this.productService.getById(ztStoryDTOS.get(0).getProduct());
+ Map caseMap = this.storyService.getStoryCaseMap(ztStoryDTOS);
+
for (ZtStoryDTO st:ztStoryDTOS) {
ZtUser ztUser = userMap.get(st.getAssignedTo());
-
List 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()
- .lambda().eq(ZtProject::getType, "program")).stream().map(o -> o.getId()).collect(Collectors.toList());
- }
+// if (user.getAccount().equals("admin")) {
+// return this.baseMapper.selectList(new QueryWrapper()
+// .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 projectAuthList() {
ZtUser user = userService.selectByName(RiskUserThreadLocal.get().getName());
- if (user.getAccount().equals("admin")) {
- return this.baseMapper.selectList(new QueryWrapper()
- .lambda().eq(ZtProject::getType, "project")).stream().map(o -> o.getId()).collect(Collectors.toList());
- }
+// if (user.getAccount().equals("admin")) {
+// return this.baseMapper.selectList(new QueryWrapper()
+// .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 execAuthList() {
ZtUser user = userService.selectByName(RiskUserThreadLocal.get().getName());
- if (user.getAccount().equals("admin")) {
- return this.baseMapper.selectList(new QueryWrapper()
- .lambda().eq(ZtProject::getType, "sprint")).stream().map(o -> o.getId()).collect(Collectors.toList());
- }
+// if (user.getAccount().equals("admin")) {
+// return this.baseMapper.selectList(new QueryWrapper()
+// .lambda().eq(ZtProject::getType, "sprint")).stream().map(o -> o.getId()).collect(Collectors.toList());
+// }
List ids = null;
String productIds = user.getProductIds();
if (StringUtils.isEmpty(productIds)) {
@@ -1101,6 +1101,22 @@ public class ZtProjectServiceImpl extends ServiceImpl teamList = qo.getTeamList();
diff --git a/src/main/java/com/sa/zentao/service/impl/ZtStoryCaseServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtStoryCaseServiceImpl.java
new file mode 100644
index 0000000..809572d
--- /dev/null
+++ b/src/main/java/com/sa/zentao/service/impl/ZtStoryCaseServiceImpl.java
@@ -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;
+
+/**
+ *
+ * 服务实现类
+ *
+ *
+ * @author gqb
+ * @since 2025-05-07
+ */
+@Service
+public class ZtStoryCaseServiceImpl extends ServiceImpl implements IZtStoryCaseService {
+
+ @Autowired
+ private IZtActionService actionService;
+
+ @Override
+ public void addCase(ZtStoryCaseDTO dto) {
+ List ztStoryCases = this.baseMapper.selectList(new QueryWrapper().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(), "", "");
+ }
+}
diff --git a/src/main/java/com/sa/zentao/service/impl/ZtStoryFeedbackServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtStoryFeedbackServiceImpl.java
index 11bf8c0..ed3beb6 100644
--- a/src/main/java/com/sa/zentao/service/impl/ZtStoryFeedbackServiceImpl.java
+++ b/src/main/java/com/sa/zentao/service/impl/ZtStoryFeedbackServiceImpl.java
@@ -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 impl
private IZtReleaseService releaseService;
+ @Autowired
+ private IZtStoryCaseService storyCaseService;
+
@Override
public PageInfo pageList(ZtProjectQo qo) {
Page page = PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize());
@@ -265,8 +266,18 @@ public class ZtStoryServiceImpl extends ServiceImpl 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 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 impl
RiskUserThreadLocal.get().getName(), dto.getRemark(), "");
}
+ storySendZpMessage(ztStory.getId(),oldAssignedTo,ztStory.getAssignedTo());
}
@@ -747,10 +760,29 @@ public class ZtStoryServiceImpl extends ServiceImpl impl
Map> taskCountMap = getTaskCountMap(list);
+ Map caseMap = getStoryCaseMap(list);
+
+
for (ZtStoryDTO d : list) {
d.setRevieweUser(d.getReviewedby().replaceAll(",", ""));
d.setViews(rMap.get(d.getId()));
List 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 impl
return new PageInfo(list);
}
+
+ public Map getStoryCaseMap(List list) {
+
+ if(CollectionUtils.isEmpty(list)){
+ return new HashMap<>();
+ }
+ List sIds = list.stream().map(o -> o.getId()).collect(Collectors.toList());
+
+ List caseList = this.storyCaseService.list(new QueryWrapper().lambda()
+ .select(SFunctionColums.caseColumes())
+ .in(ZtStoryCase::getStory, sIds));
+ if(CollectionUtils.isEmpty(caseList)){
+ return new HashMap<>();
+ }else{
+ List ztStoryCaseDTOS = BeanCopyUtil.copyListProperties(caseList, ZtStoryCaseDTO::new);
+ return ztStoryCaseDTOS.stream().collect(Collectors.toMap(ZtStoryCaseDTO::getStory, o -> o));
+ }
+ }
+
private Map> getTaskCountMap(List list) {
- List tList = this.taskService.list(new QueryWrapper().lambda().in(ZtTask::getStory, list.stream().map(o -> o.getId()).collect(Collectors.toList())));
+ List tList = this.taskService.list(new QueryWrapper().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 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 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 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 impl
d.setVerify(ztStoryspec.getVerify());
}
+
+ ZtStoryCase ztStoryCase = this.storyCaseService.getOne(new QueryWrapper().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;
}
diff --git a/src/main/java/com/sa/zentao/service/impl/ZtTaskServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtTaskServiceImpl.java
index ec2567f..353bc7f 100644
--- a/src/main/java/com/sa/zentao/service/impl/ZtTaskServiceImpl.java
+++ b/src/main/java/com/sa/zentao/service/impl/ZtTaskServiceImpl.java
@@ -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 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 impleme
public List myTaskList(ZtProjectQo qo) {
List pList = this.ztProjectService.authProductList();
- if(CollectionUtils.isEmpty(pList)){
+ if (CollectionUtils.isEmpty(pList)) {
return Arrays.asList();
}
@@ -169,8 +166,8 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme
List taskList = this.baseMapper.selectList(new QueryWrapper().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 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 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 impleme
}
List list = this.bugService.list(new QueryWrapper().lambda().eq(ZtBug::getTotask, id));
- if(!CollectionUtils.isEmpty(list)){
+ if (!CollectionUtils.isEmpty(list)) {
List 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 impleme
@Override
public List taskListByEIdsAndDate(Date firstDayOfMonth, Date lastDayOfMonth, List 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 taskList = this.list(new QueryWrapper().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 impleme
@Override
public List getDelayTask(List 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 getOnTimeTask(List 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 impleme
@Override
public List taskListByStoryIds(List 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 impleme
@Override
public List getNormalTaskList(List tList) {
- List result=new ArrayList();
+ List 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 impleme
@Override
public List develTaskListByExecutions(Date firstDayOfMonth, Date lastDayOfMonth, List eIds) {
- if(CollectionUtils.isEmpty(eIds)){
+ if (CollectionUtils.isEmpty(eIds)) {
return new ArrayList<>();
}
List teamList = this.teamService.list(new QueryWrapper().lambda().in(ZtTeam::getRoot, eIds).eq(ZtTeam::getType, "execution"));
- if(CollectionUtils.isEmpty(teamList)){
+ if (CollectionUtils.isEmpty(teamList)) {
return new ArrayList<>();
}
Map userMap = this.userService.userMapByIds(teamList.stream().map(o -> o.getAccount()).collect(Collectors.toList()));
- List kfzList=new ArrayList<>();
- for (ZtTeam t:teamList) {
+ List 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 taskList = this.list(new QueryWrapper().lambda()
- .in(ZtTask::getExecution, eIds)
- .in(ZtTask::getAssignedTo,kfzList)
+ .in(ZtTask::getExecution, eIds)
+ .in(ZtTask::getAssignedTo, kfzList)
);
return taskList;
}
@Override
public List 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 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 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 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 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 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 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 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 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 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 impleme
RiskUserThreadLocal.get().getName(), dto.getRemark(), null);
}
}
+ taskSendZpMessage(ztTask.getId(), oldAssignedTo, ztTask.getAssignedTo());
}
@@ -752,10 +756,10 @@ public class ZtTaskServiceImpl extends ServiceImpl 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 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 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 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 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 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 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().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 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 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 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 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 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 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 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 impleme
List saveList = new ArrayList();
List 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 sList = this.storyService.listByIds(storyList);
List 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 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 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 impleme
ZtProjectproduct projectproduct = projectproductService.getOne(new QueryWrapper().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 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 taskListByExecution(ZtTaskDTO dto) {
LambdaQueryWrapper eq = new QueryWrapper().lambda();
-
+ eq.select(SFunctionColums.taskColumes());
if (dto.getExecution() != null) {
eq.eq(ZtTask::getExecution, dto.getExecution());
}
@@ -1224,5 +1212,22 @@ public class ZtTaskServiceImpl extends ServiceImpl 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());
+ }
+ }
}
diff --git a/src/main/java/com/sa/zentao/utils/SFunctionColums.java b/src/main/java/com/sa/zentao/utils/SFunctionColums.java
index 76d8b69..2eabfd5 100644
--- a/src/main/java/com/sa/zentao/utils/SFunctionColums.java
+++ b/src/main/java/com/sa/zentao/utils/SFunctionColums.java
@@ -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> caseColumes(){
+ List> 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> feedbackColumes(){
List> result=new ArrayList<>();
result.add(ZtStoryFeedback::getId);
diff --git a/src/main/java/com/sa/zentao/utils/VxMessageUtils.java b/src/main/java/com/sa/zentao/utils/VxMessageUtils.java
new file mode 100644
index 0000000..8a28cda
--- /dev/null
+++ b/src/main/java/com/sa/zentao/utils/VxMessageUtils.java
@@ -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;
+ }
+
+
+ }
+
+
+}
diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml
index ed82097..76336e5 100644
--- a/src/main/resources/application-local.yml
+++ b/src/main/resources/application-local.yml
@@ -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
\ No newline at end of file
+ dkcorpsecret: fMf4nGnkpcYMHq0JzEXx-LcyGvgoxX-DbbCjIjaHqZ0
+
+# dkcorpsecret: biYcz9e1gIJSsAaTgCZXbcO8Vh9YT11JtaFeZPaPmtU #书籍
\ No newline at end of file
diff --git a/src/main/resources/mapper/ZtStoryCaseMapper.xml b/src/main/resources/mapper/ZtStoryCaseMapper.xml
new file mode 100644
index 0000000..a9e50c5
--- /dev/null
+++ b/src/main/resources/mapper/ZtStoryCaseMapper.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/resources/mapper/ZtStoryUserTaskMapper.xml b/src/main/resources/mapper/ZtStoryUserTaskMapper.xml
index a75864c..73c2ce2 100644
--- a/src/main/resources/mapper/ZtStoryUserTaskMapper.xml
+++ b/src/main/resources/mapper/ZtStoryUserTaskMapper.xml
@@ -96,7 +96,9 @@
and s.assigned_to= #{qo.userName}
-
+
+ and s.product= #{qo.productId}
+
and s.status = 'closed'