From 4d0bb07b0b0aca108e133b71192e2ac89f006580 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=AD=E5=85=B6=E5=85=B5?= Date: Fri, 9 May 2025 11:39:30 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 0 .../com/sa/zentao/conf/CodeGenerator.java | 2 +- .../controller/ZtProjectController.java | 9 +- .../controller/ZtStoryCaseController.java | 62 ++++ .../zentao/controller/ZtTaskController.java | 10 + .../com/sa/zentao/dao/ZtStoryCaseDTO.java | 59 ++++ .../java/com/sa/zentao/dao/ZtStoryDTO.java | 4 + src/main/java/com/sa/zentao/entity/ZtBug.java | 2 +- .../java/com/sa/zentao/entity/ZtMeeting.java | 5 +- .../com/sa/zentao/entity/ZtStoryCase.java | 55 +++ .../com/sa/zentao/enums/ActionStatus.java | 12 + .../java/com/sa/zentao/enums/ActionType.java | 1 + .../sa/zentao/mapper/ZtStoryCaseMapper.java | 16 + .../java/com/sa/zentao/qo/ZtStoryCaseQo.java | 14 + .../sa/zentao/service/IZtProjectService.java | 3 + .../zentao/service/IZtStoryCaseService.java | 26 ++ .../sa/zentao/service/IZtStoryService.java | 3 + .../java/com/sa/zentao/service/VxService.java | 94 ++++- .../zentao/service/impl/IZtCountService.java | 53 +-- .../zentao/service/impl/ZtBugServiceImpl.java | 36 +- .../service/impl/ZtKanbanlaneServiceImpl.java | 20 +- .../service/impl/ZtProjectServiceImpl.java | 40 ++- .../service/impl/ZtStoryCaseServiceImpl.java | 133 +++++++ .../impl/ZtStoryFeedbackServiceImpl.java | 31 +- .../service/impl/ZtStoryServiceImpl.java | 89 ++++- .../service/impl/ZtTaskServiceImpl.java | 333 +++++++++--------- .../com/sa/zentao/utils/SFunctionColums.java | 29 ++ .../com/sa/zentao/utils/VxMessageUtils.java | 141 ++++++++ src/main/resources/application-local.yml | 18 +- .../resources/mapper/ZtStoryCaseMapper.xml | 17 + .../mapper/ZtStoryUserTaskMapper.xml | 4 +- 31 files changed, 1093 insertions(+), 228 deletions(-) delete mode 100644 README.md create mode 100644 src/main/java/com/sa/zentao/controller/ZtStoryCaseController.java create mode 100644 src/main/java/com/sa/zentao/dao/ZtStoryCaseDTO.java create mode 100644 src/main/java/com/sa/zentao/entity/ZtStoryCase.java create mode 100644 src/main/java/com/sa/zentao/mapper/ZtStoryCaseMapper.java create mode 100644 src/main/java/com/sa/zentao/qo/ZtStoryCaseQo.java create mode 100644 src/main/java/com/sa/zentao/service/IZtStoryCaseService.java create mode 100644 src/main/java/com/sa/zentao/service/impl/ZtStoryCaseServiceImpl.java create mode 100644 src/main/java/com/sa/zentao/utils/VxMessageUtils.java create mode 100644 src/main/resources/mapper/ZtStoryCaseMapper.xml 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'