diff --git a/src/main/java/com/sa/zentao/conf/CodeGenerator.java b/src/main/java/com/sa/zentao/conf/CodeGenerator.java index 8e631ea..ad189b3 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_story_user_task"; + public static String tableName = "zt_computer_source"; /** *

diff --git a/src/main/java/com/sa/zentao/controller/ZtComputerSourceController.java b/src/main/java/com/sa/zentao/controller/ZtComputerSourceController.java new file mode 100644 index 0000000..7842273 --- /dev/null +++ b/src/main/java/com/sa/zentao/controller/ZtComputerSourceController.java @@ -0,0 +1,47 @@ +package com.sa.zentao.controller; + + +import com.sa.zentao.dao.Result; +import com.sa.zentao.dao.ZtComputerSourceDTO; +import com.sa.zentao.dao.ZtStoryDTO; +import com.sa.zentao.qo.ZtComputerSourceQo; +import com.sa.zentao.qo.ZtProjectQo; +import com.sa.zentao.service.IZtComputerSourceService; +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-04-07 + */ +@RestController +@RequestMapping("/zt-computer-source") +public class ZtComputerSourceController { + + @Autowired + private IZtComputerSourceService computerSourceService; + + @RequestMapping(value = "/pageList", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result storyPageList(@RequestBody ZtComputerSourceQo qo){ + return Result.success(computerSourceService.pageList(qo)); + } + + @RequestMapping(value = "/add", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result add(@RequestBody ZtComputerSourceDTO dto){ + computerSourceService.addComputerSource(dto); + return Result.success(); + } + @RequestMapping(value = "/modify", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result modify(@RequestBody ZtComputerSourceDTO dto){ + computerSourceService.modify(dto); + return Result.success(); + } +} diff --git a/src/main/java/com/sa/zentao/controller/ZtReleaseController.java b/src/main/java/com/sa/zentao/controller/ZtReleaseController.java index 1dfef7e..2711672 100644 --- a/src/main/java/com/sa/zentao/controller/ZtReleaseController.java +++ b/src/main/java/com/sa/zentao/controller/ZtReleaseController.java @@ -2,10 +2,8 @@ package com.sa.zentao.controller; import com.github.pagehelper.PageInfo; -import com.sa.zentao.dao.Result; -import com.sa.zentao.dao.ZtReleaseDTO; -import com.sa.zentao.dao.ZtStoryDTO; -import com.sa.zentao.dao.ZtTaskDTO; +import com.sa.zentao.dao.*; +import com.sa.zentao.entity.ZtBug; import com.sa.zentao.entity.ZtStory; import com.sa.zentao.qo.ZtProjectQo; import com.sa.zentao.qo.ZtReleaseQo; @@ -39,6 +37,25 @@ public class ZtReleaseController { releaseService.addRelease(dto); return Result.success(); } + //提交评审 + @RequestMapping(value = "/submitReviewing", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result submitReviewing(@RequestBody ZtReleaseDTO dto){ + releaseService.submitReviewing(dto); + return Result.success(); + } + //提交重新评审 + @RequestMapping(value = "/submitAgainReviewing", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result submitAgainReviewing(@RequestBody ZtReleaseDTO dto){ + releaseService.submitAgainReviewing(dto); + return Result.success(); + } + + @RequestMapping(value = "/releaseList", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result releaseList(@RequestBody ZtReleaseDTO dto){ + List list= releaseService.releaseList(dto); + return Result.success(list); + } + @RequestMapping(value = "/getById", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") public Result getById(@RequestBody ZtReleaseQo qo){ @@ -57,13 +74,24 @@ public class ZtReleaseController { public Result pageList(@RequestBody ZtReleaseQo qo){ return Result.success(releaseService.pageList(qo)); } - + //发布下已关联的需求 @RequestMapping(value = "/releaseStoryPageList", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") public Result releaseStoryPageList(@RequestBody ZtReleaseQo qo){ PageInfo info=releaseService.releaseStoryPageList(qo); return Result.success(info); } + @RequestMapping(value = "/releaseBugPageList", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result releaseBugPageList(@RequestBody ZtReleaseQo qo){ + PageInfo info=releaseService.releaseBugPageList(qo); + return Result.success(info); + } + @RequestMapping(value = "/releaseNotSyncBugPageList", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result releaseNotSyncBugPageList(@RequestBody ZtReleaseQo qo){ + PageInfo info=releaseService.releaseNotSyncBugPageList(qo); + return Result.success(info); + } + //迭代下需求 @RequestMapping(value = "/projectStoryPageList", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") public Result projectStoryPageList(@RequestBody ZtReleaseQo qo){ PageInfo info=releaseService.projectStoryPageList(qo); @@ -75,12 +103,23 @@ public class ZtReleaseController { releaseService.removeStory(qo); return Result.success(); } + + @RequestMapping(value = "/removeBug", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result removeBug(@RequestBody ZtReleaseQo qo){ + releaseService.removeBug(qo); + return Result.success(); + } + @RequestMapping(value = "/batchSyncStory", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") public Result batchSyncStory(@RequestBody ZtReleaseQo qo){ releaseService.batchSyncStory(qo); return Result.success(); } - + @RequestMapping(value = "/batchSyncBug", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result batchSyncBug(@RequestBody ZtReleaseQo qo){ + releaseService.batchSyncBug(qo); + return Result.success(); + } @RequestMapping(value = "/assignedTo", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") public Result assignedTo(@RequestBody ZtReleaseQo dto){ @@ -101,6 +140,12 @@ public class ZtReleaseController { return Result.success(); } + @RequestMapping(value = "/closeRelease", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result closeRelease(@RequestBody ZtReleaseQo dto){ + releaseService.closeRelease(dto); + return Result.success(); + } + @RequestMapping(value = "/execMenu", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") public Result execMenu(@RequestBody ZtReleaseQo dto){ return Result.success(releaseService.execMenu(dto)); diff --git a/src/main/java/com/sa/zentao/controller/ZtTaskController.java b/src/main/java/com/sa/zentao/controller/ZtTaskController.java index 1f05b07..48d6e43 100644 --- a/src/main/java/com/sa/zentao/controller/ZtTaskController.java +++ b/src/main/java/com/sa/zentao/controller/ZtTaskController.java @@ -309,15 +309,15 @@ public class ZtTaskController { } List listSpec = storyspecService.getPrdById(oldStory.getId()); -// ZtStory newStory = storyService.getById(oldStory.getId()); -// if(newStory!=null){ -// continue; -// } -// if(!CollectionUtils.isEmpty(listSpec)){ -// ZtStoryspec ztStoryspec = listSpec.get(0); -// ztStoryspec.setFiles(null); -// storyspecService.save(ztStoryspec); -// } + ZtStory newStory = storyService.getById(oldStory.getId()); + if(newStory!=null){ + continue; + } + if(!CollectionUtils.isEmpty(listSpec)){ + ZtStoryspec ztStoryspec = listSpec.get(0); + ztStoryspec.setFiles(null); + storyspecService.save(ztStoryspec); + } List userList=new ArrayList(); @@ -409,10 +409,10 @@ public class ZtTaskController { //创建新的需求 -// oldStory.setProduct(product); -// oldStory.setStage("wait"); -// oldStory.setStatus("active"); -// storyService.save(oldStory); + oldStory.setProduct(product); + oldStory.setStage("wait"); + oldStory.setStatus("active"); + storyService.save(oldStory); //项目关联需求 ZtProjectDTO dto=new ZtProjectDTO(); dto.setStoryIds(new ArrayList<>(){ diff --git a/src/main/java/com/sa/zentao/controller/ZtUserController.java b/src/main/java/com/sa/zentao/controller/ZtUserController.java index e8ef3f7..0a72984 100644 --- a/src/main/java/com/sa/zentao/controller/ZtUserController.java +++ b/src/main/java/com/sa/zentao/controller/ZtUserController.java @@ -6,10 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.github.pagehelper.PageInfo; import com.sa.zentao.conf.RiskUserThreadLocal; -import com.sa.zentao.dao.BusinessException; -import com.sa.zentao.dao.Result; -import com.sa.zentao.dao.ZtProjectDTO; -import com.sa.zentao.dao.ZtUserDTO; +import com.sa.zentao.dao.*; import com.sa.zentao.entity.ZtTeam; import com.sa.zentao.entity.ZtUser; import com.sa.zentao.enums.ActionStatus; @@ -70,8 +67,40 @@ public class ZtUserController { @RequestMapping(value = "/allList", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") public Result allList(@RequestBody ZtUser user){ List ztUserDTOS = userMapper.listAll(null); + return Result.success(); + } + @RequestMapping(value = "/syncOldZentaoUser", method = RequestMethod.GET, produces = "application/json; charset=UTF-8") + public Result allList(){ + List ztUserDTOS = userMapper.listAll(null); + //老的禅道 新的禅道 + List result=new ArrayList(); + for (ZtUserDTO u:ztUserDTOS) { + ZtUser ztUser = new ZtUser(); + List list = this.userService.list(new QueryWrapper().lambda().eq(ZtUser::getAccount, u.getAccount())); + if(!CollectionUtils.isEmpty(list)){ + continue; + } + BeanUtils.copyProperties(u,ztUser); + ztUser.setPassword("e10adc3949ba59abbe56e057f20f883e"); + ztUser.setNickname(u.getRealname()); + List staff = this.userService.oaUserByNikeName(u.getRealname()); + if(!CollectionUtils.isEmpty(staff)){ + String vxId = staff.get(0).getVxId(); + ztUser.setVx(vxId); + Integer departId = staff.get(0).getDepartId(); + + BaseDepartment depart =this.userService.getDepart(departId); + Integer level = depart.getLevel(); + while (level.intValue()>1){ + depart=this.userService.getDepart(depart.getParentId()); + level =depart.getLevel(); + } + ztUser.setDeptName(depart.getName()); + } + result.add(ztUser); + } return Result.success(); } @@ -190,6 +219,18 @@ public class ZtUserController { return Result.success(); } + @RequestMapping(value = "/resetPassword", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result resetPassword(@RequestBody ZtUserDTO user){ + this.userService.resetPassword(user); + return Result.success(); + } + @RequestMapping(value = "/deleteUser", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public Result deleteUser(@RequestBody ZtUserDTO user){ + this.userService.deleteUser(user); + return Result.success(); + } + + @RequestMapping(value = "/modify", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") public Result modify(@RequestBody ZtUserDTO user){ diff --git a/src/main/java/com/sa/zentao/dao/BaseDepartment.java b/src/main/java/com/sa/zentao/dao/BaseDepartment.java new file mode 100644 index 0000000..cb7650c --- /dev/null +++ b/src/main/java/com/sa/zentao/dao/BaseDepartment.java @@ -0,0 +1,114 @@ +package com.sa.zentao.dao; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author gqb + * @since 2024-04-29 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("base_department") +public class BaseDepartment implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 部门名 + */ + private String name; + + /** + * 负责人名 + */ + private String manageName; + + /** + * 负责人手机 + */ + private String managePhone; + + /** + * 负责人邮箱 + */ + private String manageMail; + + /** + * 父节点 + */ + private Integer parentId; + + /** + * 级别 + */ + private Integer level; + + /** + * 公司 + */ + private Integer companyId; + + private Date createDate; + + private Date updateDate; + + private Integer createUser; + + private Integer updateUser; + + /** + * 0正常1.删除 + */ + private String deleteFlag; + + /** + * 编制用户数量 + */ + private BigDecimal bzUserCount; + + /** + * 是否需要验证用户 1.需要 + */ + private Integer checkUser; + + private String dkStart; + + private String dkEnd; + + /** + * 部门,级别,岗位 + */ + private String departmentType; + + /** + * 部门id + */ + private Integer departmentId; + + private String workingHoursType; + + private Integer parentDepartId; + + private Integer parentCompanyId; + //排序 + private Integer sortIndex; + +} diff --git a/src/main/java/com/sa/zentao/dao/BaseStaff.java b/src/main/java/com/sa/zentao/dao/BaseStaff.java new file mode 100644 index 0000000..1f55699 --- /dev/null +++ b/src/main/java/com/sa/zentao/dao/BaseStaff.java @@ -0,0 +1,290 @@ +package com.sa.zentao.dao; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.sa.zentao.utils.CryptoUtils; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.util.StringUtils; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author + * @since 2022-11-08 + */ +@Data +@EqualsAndHashCode(callSuper = false) + +public class BaseStaff implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + private Integer companyId; + + //微信id + private String vxId; + + /** + * 名称 + */ + private String name; + + /** + * 员工号 + */ + private String staffNo; + + /** + * 部门id + */ + private Integer departId; + private String departName; + /** + * 职位 + */ + private String position; + + /** + * 1.男 2女 + */ + private String gender; + + /** + * 出生日期 + */ + private Date birthday; + + /** + * 入职日期 + */ + private Date workDate; + + /** + * 年龄 + */ + private Integer age; + /** + * 上海社保缴纳年数 + */ + private BigDecimal shSocSecYears; + + /** + * 1.试用期 2见习 3.正式 4.退休期 5.离职员工 + */ + private String staffStatus; + + /** + * 邮箱 + */ + private String mail; + + /** + * 手机 + */ + private String phone; + + /** + * 身份证号 + */ + private String idNo; + + /** + * 户籍 + */ + private String births; + + /** + * 户籍地址 + */ + private String birthsAddress; + + /** + * 居住地址 + */ + private String liveAddress; + + /** + * 0 未婚 1.已婚 + */ + private String marriageType; + + /** + * 学历 + */ + private String education; + + /** + * 毕业学校 + */ + private String school; + + /** + * 专业 + */ + private String major; + + /** + * 毕业时间 + */ + private String graduationDate; + + /** + * 紧急联系人 + */ + private String emergencyUser; + + /** + * 紧急联系人关系 + */ + private String emergencyRelationship; + + /** + * 紧急联人电话 + */ + private String emergencyPhone; + + /** + * 创建日期 + */ + private Date createDate; + + /** + * 创建人 + */ + private Integer createUser; + + /** + * 更新日期 + */ + private Date updateDate; + + /** + * 更新人 + */ + private Integer updateUser; + + //政治面貌1.党员2.团员3.群众4.其他 + private String politicalOutlook; + //级别 + private String level; + //职称 + private String workName; + // 上海户籍 + private String shBirths; + //邮编 + private String postalCode; + + private String maxEducation; + + private String header; + //全日制 1.是 0否 + private Integer qrz; + + private String gjjAccount; + + private String bankNo; + private String zpType; + //所在编制公司 + private String bzCompany; + + //职业资格 + private String zyzg; + //家人手机 + private String familyPhone; + //家人关系 + private String familyRelationship; + //家人姓名 + private String familyName; + //户口类型 + private String hkType; + // 首次工作日起 + private Date firstWorkDate; + + //打卡机id + private String dkId; + + private String deleteFlagEnum; + + //独身子女 1 是 0 否 + private Integer dszvFlag; + //独生子女多少钱 + private BigDecimal dszvMoney; + //独生子女多少钱到期时间 + private Date dszvExpireTime; + //银行名称 + private String bankName; + //财务编号 + private String financeNo; + //发薪公司 + private Integer fxCompany; + //合同公司 + private Integer contactCompany; + //1.是工会会员 0不是 + private Integer tradeUnionVip; + //入职推荐人 + private String recommend; + //所属中心 + private String belongTo; + //业务系统账号 + private String accountId; + + + //其他信息 + private String otherData; + //项目群组 + private String projectGroup; + //驾驶证 + private String driverLicense; + + //用工性质 + private String workType; + + //工作地点 + private String workAddress; + + //民族 + private String nation; + + //身份证到期时间 + private Date idExpireDate; + + //司龄校正值 + private BigDecimal workYearAdd; + //预算部门 + private Integer budgetDepartId; + //是否计算工龄工资 1.计算 0不计算 + private Integer computeWorkYear; + //是否开启信息缺省提醒 0不开 1 开 + private Integer reminderEnabledStatus; + //最后提醒时间 + private Date lastReminderTime; + + + + public Integer getBzCompanyInter(){ + if(StringUtils.isEmpty(bzCompany)){ + return null; + } + return Integer.valueOf(bzCompany); + } + + public String getVxidAesValue(){ + if(vxId==null){ + return null; + } + try { + return CryptoUtils.aesDecryptForFront(vxId, CryptoUtils.KEY_DES); + }catch (Exception e){ + return null; + } + } +} diff --git a/src/main/java/com/sa/zentao/dao/ZtBugDTO.java b/src/main/java/com/sa/zentao/dao/ZtBugDTO.java index f27c13b..9670af4 100644 --- a/src/main/java/com/sa/zentao/dao/ZtBugDTO.java +++ b/src/main/java/com/sa/zentao/dao/ZtBugDTO.java @@ -209,4 +209,7 @@ public class ZtBugDTO implements Serializable { private Integer reviewerResult; private String desc; + + private Integer releaseId; + private String releaseName; } diff --git a/src/main/java/com/sa/zentao/dao/ZtComputerSourceDTO.java b/src/main/java/com/sa/zentao/dao/ZtComputerSourceDTO.java new file mode 100644 index 0000000..d6d0883 --- /dev/null +++ b/src/main/java/com/sa/zentao/dao/ZtComputerSourceDTO.java @@ -0,0 +1,104 @@ +package com.sa.zentao.dao; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author gqb + * @since 2025-04-07 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class ZtComputerSourceDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 服务器/网络设备/安全设备/语音网关 + */ + private String sourceType; + + /** + * 内网ip + */ + private String innerIp; + + /** + * 品牌 + */ + private String bread; + + /** + * cpu核心数 + */ + private String cpuCore; + + /** + * 内存 + */ + private String memory; + + /** + * 硬盘 + */ + private String disk; + + /** + * 道路救援/飞侠车服/小仟安行/OA系统/财务系统/其他 + */ + private String systemType; + + /** + * 用途 + */ + private String purpose; + + /** + * 服务名称 + */ + private String serverName; + + /** + * 宝山机房/高科西路机房/其他 + */ + private String house; + + /** + * 机柜编号 + */ + private String idNo; + + /** + * 地址 + */ + private String address; + + private Date buyDate; + + /** + * 未启用/启用中/报废 + */ + private String status; + + private String createUser; + + private Date createDate; + + private String updateUser; + + private Date updateDate; + + +} diff --git a/src/main/java/com/sa/zentao/dao/ZtMeetingDTO.java b/src/main/java/com/sa/zentao/dao/ZtMeetingDTO.java index 97a797e..445fa59 100644 --- a/src/main/java/com/sa/zentao/dao/ZtMeetingDTO.java +++ b/src/main/java/com/sa/zentao/dao/ZtMeetingDTO.java @@ -68,4 +68,10 @@ public class ZtMeetingDTO implements Serializable { private String files; private String address; + + private String title; + + private Integer userStory; + + private String userStoryName; } diff --git a/src/main/java/com/sa/zentao/dao/ZtReleaseDTO.java b/src/main/java/com/sa/zentao/dao/ZtReleaseDTO.java index a44292f..3f0ce1e 100644 --- a/src/main/java/com/sa/zentao/dao/ZtReleaseDTO.java +++ b/src/main/java/com/sa/zentao/dao/ZtReleaseDTO.java @@ -76,7 +76,7 @@ public class ZtReleaseDTO implements Serializable { private String deleted; private String executions; - + private Integer execution; private String executionsName; private String level; diff --git a/src/main/java/com/sa/zentao/dao/ZtStoryDTO.java b/src/main/java/com/sa/zentao/dao/ZtStoryDTO.java index 5f91b75..f98b0a9 100644 --- a/src/main/java/com/sa/zentao/dao/ZtStoryDTO.java +++ b/src/main/java/com/sa/zentao/dao/ZtStoryDTO.java @@ -256,7 +256,9 @@ public class ZtStoryDTO implements Serializable { private Integer taskCount; private Integer releaseFlag=0; - + //发布id + private Integer releaseId; + private String releaseName; private List bugList; diff --git a/src/main/java/com/sa/zentao/entity/ZtBug.java b/src/main/java/com/sa/zentao/entity/ZtBug.java index 68ea79c..781ecad 100644 --- a/src/main/java/com/sa/zentao/entity/ZtBug.java +++ b/src/main/java/com/sa/zentao/entity/ZtBug.java @@ -201,4 +201,6 @@ public class ZtBug implements Serializable { //1 通过 2不通过 private Integer ysFlag; private String ysRemark; + @TableField(exist = false) + private Integer releaseFlag; } diff --git a/src/main/java/com/sa/zentao/entity/ZtComputerSource.java b/src/main/java/com/sa/zentao/entity/ZtComputerSource.java new file mode 100644 index 0000000..6763bfd --- /dev/null +++ b/src/main/java/com/sa/zentao/entity/ZtComputerSource.java @@ -0,0 +1,105 @@ +package com.sa.zentao.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import java.time.LocalDateTime; +import java.io.Serializable; +import java.util.Date; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * + *

+ * + * @author gqb + * @since 2025-04-07 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class ZtComputerSource implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 服务器/网络设备/安全设备/语音网关 + */ + private String sourceType; + + /** + * 内网ip + */ + private String innerIp; + + /** + * 品牌 + */ + private String bread; + + /** + * cpu核心数 + */ + private String cpuCore; + + /** + * 内存 + */ + private String memory; + + /** + * 硬盘 + */ + private String disk; + + /** + * 道路救援/飞侠车服/小仟安行/OA系统/财务系统/其他 + */ + private String systemType; + + /** + * 用途 + */ + private String purpose; + + /** + * 服务名称 + */ + private String serverName; + + /** + * 宝山机房/高科西路机房/其他 + */ + private String house; + + /** + * 机柜编号 + */ + private String idNo; + + /** + * 地址 + */ + private String address; + + private Date buyDate; + + /** + * 未启用/启用中/报废 + */ + private String status; + + private String createUser; + + private Date createDate; + + private String updateUser; + + private Date updateDate; + + +} diff --git a/src/main/java/com/sa/zentao/entity/ZtMeeting.java b/src/main/java/com/sa/zentao/entity/ZtMeeting.java index 928526c..e0a8289 100644 --- a/src/main/java/com/sa/zentao/entity/ZtMeeting.java +++ b/src/main/java/com/sa/zentao/entity/ZtMeeting.java @@ -64,5 +64,8 @@ public class ZtMeeting implements Serializable { private Date updateDate; private String address; + private String title; + + private Integer userStory; } diff --git a/src/main/java/com/sa/zentao/entity/ZtRelease.java b/src/main/java/com/sa/zentao/entity/ZtRelease.java index 5a74375..9366dc6 100644 --- a/src/main/java/com/sa/zentao/entity/ZtRelease.java +++ b/src/main/java/com/sa/zentao/entity/ZtRelease.java @@ -1,5 +1,6 @@ package com.sa.zentao.entity; +import com.baomidou.mybatisplus.annotation.FieldStrategy; import com.baomidou.mybatisplus.annotation.IdType; import java.time.LocalDate; import com.baomidou.mybatisplus.annotation.TableId; @@ -58,9 +59,10 @@ public class ZtRelease implements Serializable { private String notify; //active 激活 //reviewing待评审 + //reviewingError 评审失败 //waitRelease 待发布 //released 发不成功 - //close 发布失败 + //close 关闭 @TableField("`status`") private String status; @@ -89,7 +91,7 @@ public class ZtRelease implements Serializable { private String noticeContent; - + @TableField(updateStrategy = FieldStrategy.IGNORED) private String failRemark; private String releaseFailRemark; diff --git a/src/main/java/com/sa/zentao/entity/ZtReleaseDetails.java b/src/main/java/com/sa/zentao/entity/ZtReleaseDetails.java index e739410..160cad5 100644 --- a/src/main/java/com/sa/zentao/entity/ZtReleaseDetails.java +++ b/src/main/java/com/sa/zentao/entity/ZtReleaseDetails.java @@ -29,7 +29,7 @@ public class ZtReleaseDetails implements Serializable { private Integer objectId; //story bug private String objectType; - // released已发布 closed 关闭 + // closed 关闭 wait private String status; diff --git a/src/main/java/com/sa/zentao/entity/ZtStoryUser.java b/src/main/java/com/sa/zentao/entity/ZtStoryUser.java index ddcf8db..61b24f1 100644 --- a/src/main/java/com/sa/zentao/entity/ZtStoryUser.java +++ b/src/main/java/com/sa/zentao/entity/ZtStoryUser.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import java.io.Serializable; import java.util.Date; +import com.sa.zentao.enums.UserStoryEnums; import lombok.Data; import lombok.EqualsAndHashCode; @@ -64,6 +65,21 @@ public class ZtStoryUser implements Serializable { private Float estimate; // active finished closed //reviewing 评审中 active 激活 draft 草稿 + /// DPS("reviewing", "待评审",0), + // CG("draft", "草稿",1), + // JH("active", "激活",2), + // UNCFM("unconfirmed", "产品确认中",3), + // DGT("waitcommunicate", "待沟通",4), + // + // DSJ("waitdesign","需求待设计",5), + // XXSJZ("designdoing","详细设计中",6), + // CPYSJ("designdone","产品已设计",7), + // //待确认 + // DQR("storyunconfirmed","需求待确认",8), + // CFM("confirmed","需求已确认",9), + // KFZ("developing","研发中",10), + // YWC("finished","已完成",11), + // CLOSED("closed","已关闭",12), private String status; // reviewing @TableField("subStatus") diff --git a/src/main/java/com/sa/zentao/enums/ActionStatus.java b/src/main/java/com/sa/zentao/enums/ActionStatus.java index 9328ae6..3dbcd12 100644 --- a/src/main/java/com/sa/zentao/enums/ActionStatus.java +++ b/src/main/java/com/sa/zentao/enums/ActionStatus.java @@ -27,11 +27,13 @@ public enum ActionStatus { FBSB(30, "fb","发布不通过"), QR(19, "qr","确认"), KSCE(21, "testing","开始测试"), + SUBPS(23, "submitreview","提交评审"), + CSWC(20, "tested","测试完成"), KFWC(41, "developed","开发完成"), - ZTBG(41, "changeStatus","状态变更"), - MQXU(41, "mqxu","明确需求"), + ZTBG(42, "changeStatus","状态变更"), + MQXU(43, "mqxu","明确需求"), TJYS(51, "verified","提交验收"), @@ -42,6 +44,7 @@ public enum ActionStatus { LOGIN(100, "login","登录"), XGMM(101, "xgmm","修改密码"), + CZMM(101, "czmm","重置密码"), ; @EnumValue diff --git a/src/main/java/com/sa/zentao/enums/ActionType.java b/src/main/java/com/sa/zentao/enums/ActionType.java index 5e44963..019cf94 100644 --- a/src/main/java/com/sa/zentao/enums/ActionType.java +++ b/src/main/java/com/sa/zentao/enums/ActionType.java @@ -29,7 +29,7 @@ public enum ActionType { LOGIN(7, "LOGIN","登录"), USER(8, "user","用户"), - + SOURCE(9, "source","服务器资源"), ; diff --git a/src/main/java/com/sa/zentao/mapper/ZtComputerSourceMapper.java b/src/main/java/com/sa/zentao/mapper/ZtComputerSourceMapper.java new file mode 100644 index 0000000..ae1f30e --- /dev/null +++ b/src/main/java/com/sa/zentao/mapper/ZtComputerSourceMapper.java @@ -0,0 +1,22 @@ +package com.sa.zentao.mapper; + +import com.sa.zentao.dao.ZtComputerSourceDTO; +import com.sa.zentao.entity.ZtComputerSource; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.sa.zentao.qo.ZtComputerSourceQo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * Mapper 接口 + *

+ * + * @author gqb + * @since 2025-04-07 + */ +public interface ZtComputerSourceMapper extends BaseMapper { + + List pageList(@Param("qo") ZtComputerSourceQo qo); +} diff --git a/src/main/java/com/sa/zentao/mapper/ZtReleaseDetailsMapper.java b/src/main/java/com/sa/zentao/mapper/ZtReleaseDetailsMapper.java index 548ed7d..8b0c145 100644 --- a/src/main/java/com/sa/zentao/mapper/ZtReleaseDetailsMapper.java +++ b/src/main/java/com/sa/zentao/mapper/ZtReleaseDetailsMapper.java @@ -1,5 +1,6 @@ package com.sa.zentao.mapper; +import com.sa.zentao.dao.ZtBugDTO; import com.sa.zentao.dao.ZtStoryDTO; import com.sa.zentao.entity.ZtReleaseDetails; import com.baomidou.mybatisplus.core.mapper.BaseMapper; @@ -18,7 +19,11 @@ import java.util.List; */ public interface ZtReleaseDetailsMapper extends BaseMapper { - List releasePageList(@Param("qo") ZtReleaseQo qo); + List releaseStoryPageList(@Param("qo") ZtReleaseQo qo); List storyPageList(@Param("qo") ZtReleaseQo qo); + + List releaseBugPageList(@Param("qo") ZtReleaseQo qo); + + List releaseNotSyncBugPageList(@Param("qo") ZtReleaseQo qo); } diff --git a/src/main/java/com/sa/zentao/mapper/ZtUserMapper.java b/src/main/java/com/sa/zentao/mapper/ZtUserMapper.java index ca4ca4c..35a2dcf 100644 --- a/src/main/java/com/sa/zentao/mapper/ZtUserMapper.java +++ b/src/main/java/com/sa/zentao/mapper/ZtUserMapper.java @@ -1,6 +1,8 @@ package com.sa.zentao.mapper; import com.baomidou.dynamic.datasource.annotation.DS; +import com.sa.zentao.dao.BaseDepartment; +import com.sa.zentao.dao.BaseStaff; import com.sa.zentao.dao.DkInfo; import com.sa.zentao.dao.ZtUserDTO; import com.sa.zentao.entity.ZtUser; @@ -34,5 +36,7 @@ public interface ZtUserMapper extends BaseMapper { ZtUser selectPrdByName(@Param("name")String userName); + List oaUserByNikeName(@Param("nickname") String nickname); + BaseDepartment getDepart(@Param("departId") Integer departId); } diff --git a/src/main/java/com/sa/zentao/qo/ZtComputerSourceQo.java b/src/main/java/com/sa/zentao/qo/ZtComputerSourceQo.java new file mode 100644 index 0000000..04cf592 --- /dev/null +++ b/src/main/java/com/sa/zentao/qo/ZtComputerSourceQo.java @@ -0,0 +1,105 @@ +package com.sa.zentao.qo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author gqb + * @since 2025-04-07 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class ZtComputerSourceQo extends BaseQo { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 服务器/网络设备/安全设备/语音网关 + */ + private String sourceType; + + /** + * 内网ip + */ + private String innerIp; + + /** + * 品牌 + */ + private String bread; + + /** + * cpu核心数 + */ + private String cpuCore; + + /** + * 内存 + */ + private String memory; + + /** + * 硬盘 + */ + private String disk; + + /** + * 道路救援/飞侠车服/小仟安行/OA系统/财务系统/其他 + */ + private String systemType; + + /** + * 用途 + */ + private String purpose; + + /** + * 服务名称 + */ + private String serverName; + + /** + * 宝山机房/高科西路机房/其他 + */ + private String house; + + /** + * 机柜编号 + */ + private String idNo; + + /** + * 地址 + */ + private String address; + + private Date buyDate; + + /** + * 未启用/启用中/报废 + */ + private String status; + + private String createUser; + + private Date createDate; + + private String updateUser; + + private Date updateDate; +//1年内、3年内、3~5年、5~7年,7年以上 1 2 3 4 5 + private String yearSearch; + +} diff --git a/src/main/java/com/sa/zentao/qo/ZtMeetingQo.java b/src/main/java/com/sa/zentao/qo/ZtMeetingQo.java index d3e90ee..86b5924 100644 --- a/src/main/java/com/sa/zentao/qo/ZtMeetingQo.java +++ b/src/main/java/com/sa/zentao/qo/ZtMeetingQo.java @@ -30,4 +30,6 @@ public class ZtMeetingQo extends BaseQo { private String title; private Integer productId; + + } diff --git a/src/main/java/com/sa/zentao/qo/ZtProjectQo.java b/src/main/java/com/sa/zentao/qo/ZtProjectQo.java index 11d8faf..09eda4c 100644 --- a/src/main/java/com/sa/zentao/qo/ZtProjectQo.java +++ b/src/main/java/com/sa/zentao/qo/ZtProjectQo.java @@ -103,4 +103,6 @@ public class ZtProjectQo extends BaseQo { //如果查询 execution 迭代里面加的 private String source; private String spec; + + private String bugType; } diff --git a/src/main/java/com/sa/zentao/qo/ZtReleaseQo.java b/src/main/java/com/sa/zentao/qo/ZtReleaseQo.java index 81dfc8f..8738f6d 100644 --- a/src/main/java/com/sa/zentao/qo/ZtReleaseQo.java +++ b/src/main/java/com/sa/zentao/qo/ZtReleaseQo.java @@ -54,5 +54,9 @@ public class ZtReleaseQo extends BaseQo { private Integer storyId; + private Integer bugId; + private List storyList; + private List bugList; + } diff --git a/src/main/java/com/sa/zentao/service/IZtComputerSourceService.java b/src/main/java/com/sa/zentao/service/IZtComputerSourceService.java new file mode 100644 index 0000000..bf35133 --- /dev/null +++ b/src/main/java/com/sa/zentao/service/IZtComputerSourceService.java @@ -0,0 +1,26 @@ +package com.sa.zentao.service; + +import com.github.pagehelper.PageInfo; +import com.sa.zentao.dao.ZtComputerSourceDTO; +import com.sa.zentao.entity.ZtComputerSource; +import com.baomidou.mybatisplus.extension.service.IService; +import com.sa.zentao.qo.ZtComputerSourceQo; +import com.sa.zentao.qo.ZtProjectQo; + +/** + *

+ * 服务类 + *

+ * + * @author gqb + * @since 2025-04-07 + */ +public interface IZtComputerSourceService extends IService { + + PageInfo pageList(ZtComputerSourceQo qo); + + void addComputerSource(ZtComputerSourceDTO dto); + + void modify(ZtComputerSourceDTO dto); + +} diff --git a/src/main/java/com/sa/zentao/service/IZtReleaseDetailsService.java b/src/main/java/com/sa/zentao/service/IZtReleaseDetailsService.java index a94dc1c..9d73482 100644 --- a/src/main/java/com/sa/zentao/service/IZtReleaseDetailsService.java +++ b/src/main/java/com/sa/zentao/service/IZtReleaseDetailsService.java @@ -1,5 +1,6 @@ package com.sa.zentao.service; +import com.sa.zentao.dao.ZtBugDTO; import com.sa.zentao.dao.ZtStoryDTO; import com.sa.zentao.entity.ZtReleaseDetails; import com.baomidou.mybatisplus.extension.service.IService; @@ -17,7 +18,11 @@ import java.util.List; */ public interface IZtReleaseDetailsService extends IService { - List releasePageList(ZtReleaseQo qo); + List releaseStoryPageList(ZtReleaseQo qo); List storyPageList(ZtReleaseQo qo); + + List releaseBugPageList(ZtReleaseQo qo); + + List releaseNotSyncBugPageList(ZtReleaseQo qo); } diff --git a/src/main/java/com/sa/zentao/service/IZtReleaseService.java b/src/main/java/com/sa/zentao/service/IZtReleaseService.java index 1765a5c..b2eca23 100644 --- a/src/main/java/com/sa/zentao/service/IZtReleaseService.java +++ b/src/main/java/com/sa/zentao/service/IZtReleaseService.java @@ -2,6 +2,7 @@ package com.sa.zentao.service; import com.github.pagehelper.PageInfo; import com.sa.zentao.dao.Result; +import com.sa.zentao.dao.ZtBugDTO; import com.sa.zentao.dao.ZtReleaseDTO; import com.sa.zentao.dao.ZtStoryDTO; import com.sa.zentao.entity.ZtRelease; @@ -48,4 +49,26 @@ public interface IZtReleaseService extends IService { void batchSyncStory(ZtReleaseQo qo); ZtReleaseDTO getReleaseById(Integer id); + + List releaseList(ZtReleaseDTO dto); + + void batchSyncBug(ZtReleaseQo qo); + + void removeBug(ZtReleaseQo qo); + + //id 业务id type story bug + void changeRelease(Integer releaseId,Integer id, String type); + + PageInfo releaseBugPageList(ZtReleaseQo qo); + + PageInfo releaseNotSyncBugPageList(ZtReleaseQo qo); + + void closeRelease(ZtReleaseQo dto); + + void submitReviewing(ZtReleaseDTO dto); + + void submitAgainReviewing(ZtReleaseDTO dto); + + ZtRelease getReleaseByStory(Integer id); + ZtRelease getReleaseByBug(Integer id); } diff --git a/src/main/java/com/sa/zentao/service/IZtUserService.java b/src/main/java/com/sa/zentao/service/IZtUserService.java index 6eabe17..9a68d16 100644 --- a/src/main/java/com/sa/zentao/service/IZtUserService.java +++ b/src/main/java/com/sa/zentao/service/IZtUserService.java @@ -1,9 +1,7 @@ package com.sa.zentao.service; import com.github.pagehelper.PageInfo; -import com.sa.zentao.dao.DkInfo; -import com.sa.zentao.dao.ZtProjectDTO; -import com.sa.zentao.dao.ZtUserDTO; +import com.sa.zentao.dao.*; import com.sa.zentao.entity.ZtUser; import com.baomidou.mybatisplus.extension.service.IService; import com.sa.zentao.qo.ZtUserQo; @@ -43,4 +41,14 @@ public interface IZtUserService extends IService { ZtUser getbyVxId(String vx); List dkList(@Param("ids") List account, @Param("startDate") Date startDate, @Param("endDate")Date endDate); + + void resetPassword(ZtUserDTO user); + + void deleteUser(ZtUserDTO user); + + List oaUserByNikeName(String nickname); + + BaseDepartment getDepart(Integer departId); + + ZtUser getByAccount(String openedby); } 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 f18c1c3..4ff77b5 100644 --- a/src/main/java/com/sa/zentao/service/impl/IZtCountService.java +++ b/src/main/java/com/sa/zentao/service/impl/IZtCountService.java @@ -196,7 +196,8 @@ public class IZtCountService { if(!loginRiskUser.getName().equals("admin")){ if(!CollectionUtils.isEmpty(pIds)){ - list = this.storyUserService.list(new QueryWrapper().lambda().in(ZtStoryUser::getProduct,pIds).in(ZtStoryUser::getStatus, "active", "reviewing")); + list = this.storyUserService.list(new QueryWrapper().lambda().in(ZtStoryUser::getProduct,pIds) + .in(ZtStoryUser::getStatus, "active", "reviewing","active","unconfirmed","waitcommunicate","waitdesign","designdoing","designdone","storyunconfirmed","confirmed")); ztStory = storyService.list(new QueryWrapper() .lambda().eq(ZtStory::getDeleted, "0") .in(ZtStory::getProduct,pIds) @@ -207,7 +208,7 @@ public class IZtCountService { ztStory=new ArrayList<>(); } }else{ - list = this.storyUserService.list(new QueryWrapper().lambda().in(ZtStoryUser::getStatus, "active", "reviewing")); + 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<>(); @@ -244,18 +245,19 @@ public class IZtCountService { } - - result.setPstgCount(list.stream().filter(o -> "active".equals(o.getStatus())) - .filter(o -> o.getStage().equals("wait")).map(o->o.getId()+"").collect(Collectors.joining(","))); + result.setPstgCount(list.stream().filter(o -> + Arrays.asList("active","unconfirmed","waitcommunicate","waitdesign","designdoing","designdone","storyunconfirmed","confirmed").contains(o.getStatus())) + .map(o->o.getId()+"").collect(Collectors.joining(","))); result.setPlanCount(ztStory.stream().filter(o -> "active".equals(o.getStatus())) .filter(o -> o.getStage().equals("wait")).map(o->o.getId()+"").collect(Collectors.joining(","))); result.setTestingCount(ztStory.stream().filter(o -> "active".equals(o.getStatus())) - .filter(o -> o.getStage().equals("testing")).map(o->o.getId()+"").collect(Collectors.joining(","))); + .filter(o -> Arrays.asList("testing","tested").contains(o.getStage()) ).map(o->o.getId()+"").collect(Collectors.joining(","))); // developing 研发中 developed 研发完毕 testing 测试中 tested测试完毕 + result.setJxzCount(ztStory.stream().filter(o -> "active".equals(o.getStatus())) - .filter(o -> Arrays.asList("developing").contains(o.getStage()) + .filter(o -> Arrays.asList("developing","developed").contains(o.getStage()) ).map(o->o.getId()+"").collect(Collectors.joining(","))); @@ -349,8 +351,9 @@ public class IZtCountService { result.setDpsCount(storyUsers.stream().filter(o -> "reviewing".equals(o.getStatus())) .map(o->o.getId()+"").collect(Collectors.joining(","))); - result.setPstgCount(storyUsers.stream().filter(o -> "active".equals(o.getStatus())) - .filter(o -> o.getStage().equals("wait")) .map(o->o.getId()+"").collect(Collectors.joining(","))); + result.setPstgCount(storyUsers.stream().filter(o -> + Arrays.asList("active","unconfirmed","waitcommunicate","waitdesign","designdoing","designdone","storyunconfirmed","confirmed").contains(o.getStatus())) + .map(o->o.getId()+"").collect(Collectors.joining(","))); result.setPlanCount(ztStory.stream().filter(o -> "active".equals(o.getStatus())) .filter(o -> o.getStage().equals("wait")) .map(o->o.getId()+"").collect(Collectors.joining(","))); @@ -392,7 +395,7 @@ public class IZtCountService { List pList = this.productService.listByIds(pIds); List storyUsers = this.storyUserService.list(new QueryWrapper().lambda() - .in(ZtStoryUser::getStatus, "active", "reviewing") + .in(ZtStoryUser::getStatus, "active", "reviewing","active","unconfirmed","waitcommunicate","waitdesign","designdoing","designdone","storyunconfirmed","confirmed") .in(ZtStoryUser::getProduct,pList.stream().map(o->o.getId()).collect(Collectors.toList())) ); @@ -412,9 +415,11 @@ public class IZtCountService { } result.setDpsCount(storyUsers.stream().filter(o -> "reviewing".equals(o.getStatus())) .map(o->o.getId()+"").collect(Collectors.joining(","))); - result.setPstgCount(storyUsers.stream().filter(o -> "active".equals(o.getStatus())) - .filter(o -> o.getStage().equals("wait")) .map(o->o.getId()+"").collect(Collectors.joining(","))); - +// result.setPstgCount(storyUsers.stream().filter(o -> "active".equals(o.getStatus())) +// .filter(o -> o.getStage().equals("wait")) .map(o->o.getId()+"").collect(Collectors.joining(","))); + result.setPstgCount(storyUsers.stream().filter(o -> + Arrays.asList("active","unconfirmed","waitcommunicate","waitdesign","designdoing","designdone","storyunconfirmed","confirmed").contains(o.getStatus())) + .map(o->o.getId()+"").collect(Collectors.joining(","))); result.setPlanCount(ztStory.stream().filter(o -> "active".equals(o.getStatus())) .filter(o -> o.getStage().equals("wait")) .map(o->o.getId()+"").collect(Collectors.joining(","))); @@ -776,8 +781,14 @@ public class IZtCountService { dto.setSaturation(dto.getTotalTime().floatValue()==0?BigDecimal.ZERO:dto.getAllocationTime().divide(dto.getExamineTime(),2,BigDecimal.ROUND_HALF_UP)); float saturation = dto.getSaturation().floatValue(); //完成准时率 TODO 延期 / 总完成 - List delayTaskList = taskList.stream().filter(o->u.getAccount().equals(o.getAssignedTo())).filter(o -> o.getFinishedDate() != null - && o.getFinishedDate().getTime() > DateUtils.getDayLast(o.getDeadline()).getTime()).collect(Collectors.toList()); + List delayTaskList =null; + try { + delayTaskList = taskList.stream().filter(o->u.getAccount().equals(o.getAssignedTo())).filter(o -> o.getFinishedDate() != null + && o.getFinishedDate().getTime() > DateUtils.getDayLast(o.getDeadline()).getTime()).collect(Collectors.toList()); + }catch (Exception e){ + log.error("",e); + } + dto.setFinishTask(BigDecimal.valueOf(taskTimeList.stream().filter(o->o.getFinishedDate()!=null).map(o->o.getEstimate()).collect(Collectors.toList()).size())); dto.setDelayTask(BigDecimal.valueOf(delayTaskList.size())); //准时完成率 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 0854802..088773c 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtBugServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtBugServiceImpl.java @@ -2,6 +2,7 @@ package com.sa.zentao.service.impl; import ch.qos.logback.core.util.StringUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; @@ -19,6 +20,7 @@ import com.sa.zentao.enums.UserType; import com.sa.zentao.mapper.ZtBugMapper; import com.sa.zentao.qo.ZtBugQo; import com.sa.zentao.qo.ZtProjectQo; +import com.sa.zentao.qo.ZtReleaseQo; import com.sa.zentao.service.*; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.sa.zentao.utils.BeanCopyUtil; @@ -83,6 +85,9 @@ public class ZtBugServiceImpl extends ServiceImpl implements @Autowired private IZtStoryFeedbackService storyFeedbackService; + @Autowired + private IZtReleaseService releaseService; + @Override @@ -137,6 +142,9 @@ public class ZtBugServiceImpl extends ServiceImpl implements if(ztUser!=null){ bug.setYsUserName(ztUser.getNickname()); } + if(bug.getDeadline()!=null){ + bug.setDeadline(DateUtils.getDayLast(bug.getDeadline())); + } } } PageInfo ztBugDTOPageInfo = new PageInfo<>(result); @@ -217,6 +225,9 @@ public class ZtBugServiceImpl extends ServiceImpl implements if(ztUser!=null){ bug.setYsUserName(ztUser.getNickname()); } + if(bug.getDeadline()!=null){ + bug.setDeadline(DateUtils.getDayLast(bug.getDeadline())); + } } } @@ -242,6 +253,11 @@ public class ZtBugServiceImpl extends ServiceImpl implements Integer tostory = ztBug.getTostory(); ZtBugDTO d=new ZtBugDTO(); BeanUtils.copyProperties(ztBug,d); + ZtRelease release = this.releaseService.getReleaseByBug(id); + if(release!=null){ + d.setReleaseId(release.getId()); + d.setReleaseName(release.getName()); + } if(project!=null&&project!=0){ d.setZtProject(this.projectService.getById(project)); } @@ -562,7 +578,13 @@ public class ZtBugServiceImpl extends ServiceImpl implements ztBug.setLastediteddate(new Date()); ztBug.setStatus("active"); this.baseMapper.updateById(ztBug); - + if(dto.getReleaseId()!=null&&dto.getReleaseId()!=0){ + this.releaseService.changeRelease(dto.getReleaseId(),ztBug.getId(),"bug"); + }else{ + ZtReleaseQo qo =new ZtReleaseQo(); + qo.setBugList(Arrays.asList(ztBug.getId())); + this.releaseService.removeBug(qo); + } fileService.updateFile(dto.getFiles(),ztBug.getId(), FileTypes.bug); this.actionService.addAction(ActionType.BUG, ActionStatus.BJ,ztBug.getId(),ztBug.getProject()+"",ztBug.getProject(),ztBug.getExecution() @@ -670,12 +692,20 @@ public class ZtBugServiceImpl extends ServiceImpl implements if(ztBug.getStatus().equals("closed")){ throw new BusinessException("已关闭"); } - ztBug.setStatus("active"); - ztBug.setLastediteddate(new Date()); - ztBug.setLasteditedby(RiskUserThreadLocal.get().getName()); - this.baseMapper.updateById(ztBug); + if(ztBug.getReleaseFlag().equals(1)){ + throw new BusinessException("已发布的bug无法重新激活"); + } +// ztBug.setStatus("active"); +// ztBug.setLastediteddate(new Date()); +// ztBug.setLasteditedby(RiskUserThreadLocal.get().getName()); +// this.baseMapper.updateById(ztBug); + this.baseMapper.update(new UpdateWrapper().lambda().set(ZtBug::getStatus,"active").set(ZtBug::getLastediteddate,new Date()) + .set(ZtBug::getLasteditedby,RiskUserThreadLocal.get().getName()) + .set(ZtBug::getResolvedby,"") + .set(ZtBug::getResolveddate,null) + .eq(ZtBug::getId,ztBug.getId())); if(ztBug.getExecution()!=null&&ztBug.getExecution()!=0) { - kanbanlaneService.changeStatus(ztBug.getExecution(), ztBug.getId(), "bug", "fixing"); + kanbanlaneService.changeStatus(ztBug.getExecution(), ztBug.getId(), "bug", "unconfirmed"); } this.actionService.addAction(ActionType.BUG, ActionStatus.JH,ztBug.getId(),ztBug.getProject()+"",ztBug.getProject(),ztBug.getExecution() diff --git a/src/main/java/com/sa/zentao/service/impl/ZtComputerSourceServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtComputerSourceServiceImpl.java new file mode 100644 index 0000000..e55a280 --- /dev/null +++ b/src/main/java/com/sa/zentao/service/impl/ZtComputerSourceServiceImpl.java @@ -0,0 +1,92 @@ +package com.sa.zentao.service.impl; + +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.sa.zentao.conf.RiskUserThreadLocal; +import com.sa.zentao.dao.BusinessException; +import com.sa.zentao.dao.ZtBugDTO; +import com.sa.zentao.dao.ZtComputerSourceDTO; +import com.sa.zentao.entity.ZtComputerSource; +import com.sa.zentao.entity.ZtUser; +import com.sa.zentao.enums.ActionStatus; +import com.sa.zentao.enums.ActionType; +import com.sa.zentao.mapper.ZtComputerSourceMapper; +import com.sa.zentao.qo.ZtComputerSourceQo; +import com.sa.zentao.qo.ZtProjectQo; +import com.sa.zentao.service.IZtActionService; +import com.sa.zentao.service.IZtComputerSourceService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.sa.zentao.service.IZtUserService; +import com.sa.zentao.utils.DateUtils; +import org.apache.commons.lang3.StringUtils; +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.*; +import java.util.stream.Collectors; + +/** + *

+ * 服务实现类 + *

+ * + * @author gqb + * @since 2025-04-07 + */ +@Service +public class ZtComputerSourceServiceImpl extends ServiceImpl implements IZtComputerSourceService { + + @Autowired + private IZtUserService userService; + + @Autowired + private IZtActionService actionService; + + @Override + public PageInfo pageList(ZtComputerSourceQo qo) { + + ////1年内、3年内、3~5年、5~7年,7年以上 1 2 3 4 5 + String yearSearch = qo.getYearSearch(); + + + Page page = PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize()); + List list = this.baseMapper.pageList(qo); + PageInfo ztBugDTOPageInfo = new PageInfo<>(list); + return ztBugDTOPageInfo; + } + + @Override + @Transactional + public void addComputerSource(ZtComputerSourceDTO dto) { + + ZtComputerSource info=new ZtComputerSource(); + BeanUtils.copyProperties(dto,info); + info.setCreateDate(new Date()); + info.setCreateUser(RiskUserThreadLocal.get().getName()); + info.setUpdateDate(new Date()); + info.setUpdateUser(RiskUserThreadLocal.get().getName()); + this.baseMapper.insert(info); + this.actionService.addAction(ActionType.SOURCE, ActionStatus.XJ,info.getId(),"",null,null + ,RiskUserThreadLocal.get().getName(),null,null + ); + } + + @Override + public void modify(ZtComputerSourceDTO dto) { + ZtComputerSource ztComputerSource = this.baseMapper.selectById(dto.getId()); + if(ztComputerSource==null){ + throw new BusinessException("未查询到数据"); + } + BeanUtils.copyProperties(dto,ztComputerSource); + ztComputerSource.setUpdateUser(RiskUserThreadLocal.get().getName()); + ztComputerSource.setUpdateDate(new Date()); + this.baseMapper.updateById(ztComputerSource); + this.actionService.addAction(ActionType.SOURCE, ActionStatus.XJ,ztComputerSource.getId(),"",null,null + ,RiskUserThreadLocal.get().getName(),null,null + ); + } +} diff --git a/src/main/java/com/sa/zentao/service/impl/ZtEffortServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtEffortServiceImpl.java index f9004ad..c728923 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtEffortServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtEffortServiceImpl.java @@ -52,9 +52,12 @@ public class ZtEffortServiceImpl extends ServiceImpl i } List saveList=new ArrayList(); - Float consumed =0f; + //剩余工时 + BigDecimal left = BigDecimal.valueOf(ztTask.getLeft()); + + BigDecimal consumed =BigDecimal.ZERO; for (ZtEffortDTO d:list) { - if(d.getLeft()==0&&d.getConsumed()==0){ + if(d.getConsumed()==0){ continue; } ZtEffort ztEffort = new ZtEffort(); @@ -65,8 +68,11 @@ public class ZtEffortServiceImpl extends ServiceImpl i ztEffort.setAccount(RiskUserThreadLocal.get().getName()); ztEffort.setDeleted("0"); ztEffort.setProject(ztTask.getProject()); + left =left.subtract(BigDecimal.valueOf(ztEffort.getConsumed())); + float fLeft = left.floatValue(); + ztEffort.setLeft(fLeft<0?0:fLeft); saveList.add(ztEffort); - consumed=d.getLeft(); + consumed=consumed.add(BigDecimal.valueOf(ztEffort.getConsumed())); } if(CollectionUtils.isEmpty(saveList)){ throw new BusinessException("请检查工时"); @@ -86,9 +92,10 @@ public class ZtEffortServiceImpl extends ServiceImpl i } } //剩余 - ztTask.setLeft(max.getLeft()); - if(ztTask.getLeft()<0){ + if(left.floatValue()<0){ ztTask.setLeft(0f); + }else{ + ztTask.setLeft(left.floatValue()); } ztTask.setConsumed(ztTask.getConsumed()+f); this.saveBatch(saveList); 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 ce1a8c9..832c37d 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtKanbanlaneServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtKanbanlaneServiceImpl.java @@ -311,19 +311,47 @@ public class ZtKanbanlaneServiceImpl extends ServiceImpl ztKanbancolumnDTOS = this.kanbancolumnMapper.listByLaneIds(Arrays.asList(lane.getId())); - List backlog = ztKanbancolumnDTOS.stream().filter(o -> o.getType().equals("backlog")).collect(Collectors.toList()); - ZtKanbancolumnDTO ztKanbancolumnDTO = backlog.get(0); + for (ZtStory st:ztStories ) { - ZtKanbancell kanbancell = this.kanbancellService.getOne(new QueryWrapper().lambda() - .eq(ZtKanbancell::getKanban, id).eq(ZtKanbancell::getColumn, ztKanbancolumnDTO.getId())); - if(StringUtils.isEmpty(kanbancell.getCards())){ - kanbancell.setCards(StringUtils.join(ztStories.stream().map(o->o.getId()).collect(Collectors.toList()),",")); - }else{ - kanbancell.setCards(kanbancell.getCards()+","+StringUtils.join(ztStories.stream().map(o->o.getId()).collect(Collectors.toList()),",")); + ZtKanbancolumnDTO ztKanbancolumnDTO =null; + if("closed".equals(st.getStage())){ + ztKanbancolumnDTO = ztKanbancolumnDTOS.stream().filter(o -> o.getType().equals("closed")).collect(Collectors.toList()).get(0); + }else if ("wait".equals(st.getStage())){ + ztKanbancolumnDTO = ztKanbancolumnDTOS.stream().filter(o -> o.getType().equals("backlog")).collect(Collectors.toList()).get(0); + }else if ("projected".equals(st.getStage())){ + ztKanbancolumnDTO = ztKanbancolumnDTOS.stream().filter(o -> o.getType().equals("backlog")).collect(Collectors.toList()).get(0); + }else if ("developing".equals(st.getStage())){ + ztKanbancolumnDTO = ztKanbancolumnDTOS.stream().filter(o -> o.getType().equals("developing")).collect(Collectors.toList()).get(0); + + }else if ("developed".equals(st.getStage())){ + ztKanbancolumnDTO = ztKanbancolumnDTOS.stream().filter(o -> o.getType().equals("developed")).collect(Collectors.toList()).get(0); + + }else if ("testing".equals(st.getStage())){ + ztKanbancolumnDTO = ztKanbancolumnDTOS.stream().filter(o -> o.getType().equals("testing")).collect(Collectors.toList()).get(0); + + }else if ("tested".equals(st.getStage())){ + ztKanbancolumnDTO = ztKanbancolumnDTOS.stream().filter(o -> o.getType().equals("tested")).collect(Collectors.toList()).get(0); + + }else if ("released".equals(st.getStage())){ + ztKanbancolumnDTO = ztKanbancolumnDTOS.stream().filter(o -> o.getType().equals("released")).collect(Collectors.toList()).get(0); + + }else if ("verified".equals(st.getStage())){ + ztKanbancolumnDTO = ztKanbancolumnDTOS.stream().filter(o -> o.getType().equals("verified")).collect(Collectors.toList()).get(0); + + } + ZtKanbancell kanbancell = this.kanbancellService.getOne(new QueryWrapper().lambda() + .eq(ZtKanbancell::getKanban, id).eq(ZtKanbancell::getColumn, ztKanbancolumnDTO.getId())); + if(StringUtils.isEmpty(kanbancell.getCards())){ + kanbancell.setCards(StringUtils.join(ztStories.stream().map(o->o.getId()).collect(Collectors.toList()),",")); + }else{ + kanbancell.setCards(kanbancell.getCards()+","+StringUtils.join(ztStories.stream().map(o->o.getId()).collect(Collectors.toList()),",")); + } + + kanbancellService.updateById(kanbancell); } - kanbancellService.updateById(kanbancell); + } diff --git a/src/main/java/com/sa/zentao/service/impl/ZtMeetingServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtMeetingServiceImpl.java index 14b68d5..8e95f43 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtMeetingServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtMeetingServiceImpl.java @@ -21,6 +21,7 @@ import com.sa.zentao.dao.ZtMeetingDTO; import com.sa.zentao.dao.ZtStoryDTO; import com.sa.zentao.entity.ZtMeeting; import com.sa.zentao.entity.ZtProduct; +import com.sa.zentao.entity.ZtStoryUser; import com.sa.zentao.entity.ZtUser; import com.sa.zentao.enums.ActionStatus; import com.sa.zentao.enums.ActionType; @@ -73,6 +74,9 @@ public class ZtMeetingServiceImpl extends ServiceImpl pageList(ZtMeetingQo qo) { Page page = PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize()); @@ -168,7 +172,13 @@ public class ZtMeetingServiceImpl extends ServiceImpl(); } + // 查询日期范围内的迭代 + List execFilterList = ztProjects.stream().filter(o -> (o.getBegin().getTime() >= firstDayOfMonth.getTime() + && o.getBegin().getTime() <= lastDayOfMonth.getTime()) || ( + o.getEnd().getTime() >= firstDayOfMonth.getTime() + && o.getEnd().getTime() <= lastDayOfMonth.getTime() + ) + + ) + .map(o -> o.getId()).collect(Collectors.toList()); + if(CollectionUtils.isEmpty(execFilterList)){ + return new PageInfo<>(); + } List teams = this.teamService.list(new QueryWrapper().lambda().eq(ZtTeam::getType, "execution") - .in(ZtTeam::getRoot, ztProjects.stream().map(o -> o.getId()).collect(Collectors.toList()))); + .in(ZtTeam::getRoot, execFilterList)); List accountIds = teams.stream().map(o -> o.getAccount()).distinct().collect(Collectors.toList()); if (CollectionUtils.isEmpty(accountIds)) { diff --git a/src/main/java/com/sa/zentao/service/impl/ZtReleaseDetailsServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtReleaseDetailsServiceImpl.java index eec18c7..7e957b4 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtReleaseDetailsServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtReleaseDetailsServiceImpl.java @@ -1,5 +1,6 @@ package com.sa.zentao.service.impl; +import com.sa.zentao.dao.ZtBugDTO; import com.sa.zentao.dao.ZtStoryDTO; import com.sa.zentao.entity.ZtReleaseDetails; import com.sa.zentao.mapper.ZtReleaseDetailsMapper; @@ -22,12 +23,22 @@ import java.util.List; public class ZtReleaseDetailsServiceImpl extends ServiceImpl implements IZtReleaseDetailsService { @Override - public List releasePageList(ZtReleaseQo qo) { - return this.baseMapper.releasePageList(qo); + public List releaseStoryPageList(ZtReleaseQo qo) { + return this.baseMapper.releaseStoryPageList(qo); } @Override public List storyPageList(ZtReleaseQo qo) { return this.baseMapper.storyPageList(qo); } + + @Override + public List releaseBugPageList(ZtReleaseQo qo) { + return this.baseMapper.releaseBugPageList(qo); + } + + @Override + public List releaseNotSyncBugPageList(ZtReleaseQo qo) { + return this.baseMapper.releaseNotSyncBugPageList(qo); + } } diff --git a/src/main/java/com/sa/zentao/service/impl/ZtReleaseServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtReleaseServiceImpl.java index 243d57c..f2b4ae2 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtReleaseServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtReleaseServiceImpl.java @@ -18,6 +18,7 @@ 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.SendEmail; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -30,7 +31,7 @@ import java.util.stream.Collectors; /** *

- * 服务实现类 + * 服务实现类 *

* * @author gqb @@ -62,25 +63,29 @@ public class ZtReleaseServiceImpl extends ServiceImpl().lambda() .eq(ZtProjectproduct::getProject, project)); - if(projectproduct!=null){ + if (projectproduct != null) { ztRelease.setProduct(projectproduct.getProduct()); } @@ -88,43 +93,47 @@ public class ZtReleaseServiceImpl extends ServiceImpl execIds = new ArrayList(Arrays.asList(execStr.split(","))); List list = this.projectstoryService.list(new QueryWrapper().lambda() .in(ZtProjectstory::getProject, execIds) .eq(ZtProjectstory::getType, ProjectTypeEnums.execution.getValue()) ); - if(!CollectionUtils.isEmpty(list)){ + if (!CollectionUtils.isEmpty(list)) { + //当前迭代下所有 测试完成的任务 List sList = this.storyService.list(new QueryWrapper() .lambda().eq(ZtStory::getStatus, "active") - .in(ZtStory::getId,list.stream().map(o->o.getStory()).distinct().collect(Collectors.toList())) + .in(ZtStory::getId, list.stream().map(o -> o.getStory()).distinct().collect(Collectors.toList())) .eq(ZtStory::getStage, StoryStageEnums.tested.getValue())); - if(!CollectionUtils.isEmpty(sList)){ + if (!CollectionUtils.isEmpty(sList)) { + //没有被关联的需求 测试完成的 List releaseStoryList = this.releaseDetailsService.list(new QueryWrapper().lambda() - .ne(ZtReleaseDetails::getStatus,"closed") - .eq(ZtReleaseDetails::getObjectType,"story") + .ne(ZtReleaseDetails::getStatus, "closed") + .eq(ZtReleaseDetails::getObjectType, "story") .in(ZtReleaseDetails::getObjectId, sList.stream().map(o -> o.getId()).collect(Collectors.toList()))); List sIds = releaseStoryList.stream().map(o -> o.getObjectId().intValue()).collect(Collectors.toList()); - List saveBatch=new ArrayList<>(); - for (ZtStory s:sList) { - if(!sIds.contains(s.getId())){ - ZtReleaseDetails e=new ZtReleaseDetails(); - e.setObjectId(s.getId()); - e.setObjectType("story"); - e.setReleaseId(ztRelease.getId()); - e.setStatus("wait"); - saveBatch.add(e); + List saveBatch = new ArrayList<>(); + for (ZtStory s : sList) { + if (!sIds.contains(s.getId())) { + ZtReleaseDetails e = new ZtReleaseDetails(); + e.setObjectId(s.getId()); + e.setObjectType("story"); + e.setReleaseId(ztRelease.getId()); + e.setStatus("wait"); + saveBatch.add(e); } } - if(CollectionUtils.isEmpty(saveBatch)){ - throw new BusinessException("当前没有符合发布的需求,请检查"); + if (CollectionUtils.isEmpty(saveBatch)) { +// throw new BusinessException("当前没有符合发布的需求,请检查"); + } else { + releaseDetailsService.saveBatch(saveBatch); } - releaseDetailsService.saveBatch(saveBatch); - }else{ - throw new BusinessException("当前没有符合发布的需求,请检查"); + + } else { +// throw new BusinessException("当前没有符合发布的需求,请检查"); } } } @@ -137,45 +146,54 @@ public class ZtReleaseServiceImpl extends ServiceImpl execIds = new ArrayList(Arrays.asList(execStr.split(","))); - - List list = this.projectstoryService.list(new QueryWrapper().lambda() - .in(ZtProjectstory::getProject, execIds) - .eq(ZtProjectstory::getType, ProjectTypeEnums.execution.getValue()) - ); + List eIds = new ArrayList<>(); + for (String s : execIds) { + eIds.add(Integer.valueOf(s)); + } + List list = this.projectstoryService.projectListByStory(eIds, ProjectTypeEnums.execution); - if(!CollectionUtils.isEmpty(list)){ + if (!CollectionUtils.isEmpty(list)) { + //迭代下所有的测试完成需求 List sList = this.storyService.list(new QueryWrapper() .lambda().eq(ZtStory::getStatus, "active") - .in(ZtStory::getId,list.stream().map(o->o.getStory()).distinct().collect(Collectors.toList())) + .in(ZtStory::getId, list.stream().map(o -> o.getStory()).distinct().collect(Collectors.toList())) .eq(ZtStory::getStage, StoryStageEnums.tested.getValue())); - if(!CollectionUtils.isEmpty(sList)){ + if (!CollectionUtils.isEmpty(sList)) { List releaseStoryList = this.releaseDetailsService.list(new QueryWrapper().lambda() - .in(ZtReleaseDetails::getObjectId, sList.stream().map(o -> o.getId()).collect(Collectors.toList()))); + .in(ZtReleaseDetails::getObjectId, sList.stream().map(o -> o.getId()).collect(Collectors.toList())) + .eq(ZtReleaseDetails::getObjectType, "story") + .ne(ZtReleaseDetails::getStatus, "closed") + ); List sIds = releaseStoryList.stream().map(o -> o.getObjectId().intValue()).collect(Collectors.toList()); - this.releaseDetailsService.remove(new QueryWrapper().lambda().eq(ZtReleaseDetails::getReleaseId,ztRelease.getId())); + this.releaseDetailsService.remove(new QueryWrapper().lambda().eq(ZtReleaseDetails::getReleaseId, ztRelease.getId()) + .ne(ZtReleaseDetails::getObjectType, "bug") + ); - List saveBatch=new ArrayList<>(); - for (ZtStory s:sList) { - if(!sIds.contains(s.getId())){ - ZtReleaseDetails e=new ZtReleaseDetails(); + List saveBatch = new ArrayList<>(); + for (ZtStory s : sList) { + if (!sIds.contains(s.getId())) { + ZtReleaseDetails e = new ZtReleaseDetails(); e.setObjectId(s.getId()); e.setObjectType("story"); e.setReleaseId(ztRelease.getId()); @@ -189,7 +207,7 @@ public class ZtReleaseServiceImpl extends ServiceImpl list = this.baseMapper.pageList(qo); - if(!CollectionUtils.isEmpty(list)){ + if (!CollectionUtils.isEmpty(list)) { Map userMap = userService.userMapByIds(null); List details = this.releaseDetailsService.list(new QueryWrapper().lambda().in(ZtReleaseDetails::getReleaseId, list.stream().map(o -> o.getId()).collect(Collectors.toList()))); - - for (ZtReleaseDTO dto:list) { + for (ZtReleaseDTO dto : list) { // ZtReleaseDetailsDTO List fDetails = details.stream().filter(o -> o.getReleaseId().intValue() == dto.getId().intValue()).collect(Collectors.toList()); - if(!CollectionUtils.isEmpty(fDetails)){ + if (!CollectionUtils.isEmpty(fDetails)) { dto.setDetails(BeanCopyUtil.copyListProperties(fDetails, ZtReleaseDetailsDTO::new)); } ZtUser ztUser = userMap.get(dto.getAssignedTo()); - if(ztUser!=null){ + if (ztUser != null) { dto.setAssignedToName(ztUser.getNickname()); } ztUser = userMap.get(dto.getCreatedby()); - if(ztUser!=null){ + if (ztUser != null) { dto.setCreatedbyName(ztUser.getNickname()); } } @@ -231,7 +248,7 @@ public class ZtReleaseServiceImpl extends ServiceImpl executions = releaseDetailsService.list(new QueryWrapper().lambda() - .eq(ZtReleaseDetails::getReleaseId,ztRelease.getId()) - ); - for (ZtReleaseDetails s:executions ) { - s.setStatus("closed"); - releaseDetailsService.updateById(s); - } +// String project = ztRelease.getExecutions(); +// String[] split = project.split(","); +// List executions = releaseDetailsService.list(new QueryWrapper().lambda() +// .eq(ZtReleaseDetails::getReleaseId, ztRelease.getId()) +// ); +// for (ZtReleaseDetails s : executions) { +// s.setStatus("closed"); +// releaseDetailsService.updateById(s); +// } } - this.baseMapper.updateById(ztRelease); actionService.addAction(ActionType.FB, ActionStatus.PS, ztRelease.getId(), ztRelease.getProduct() + "", ztRelease.getProject(), null, @@ -280,90 +296,162 @@ public class ZtReleaseServiceImpl extends ServiceImpl executions = releaseDetailsService.list(new QueryWrapper().lambda() - .eq(ZtReleaseDetails::getReleaseId,ztRelease.getId()) + .eq(ZtReleaseDetails::getReleaseId, ztRelease.getId()) ); - for (ZtReleaseDetails s:executions ) { + for (ZtReleaseDetails s : executions) { s.setStatus("closed"); releaseDetailsService.updateById(s); } - }else{ + } else { ztRelease.setStatus("released"); } this.baseMapper.updateById(ztRelease); - if(1==dto.getPushFlag()){ + if (1 == dto.getPushFlag()) { //推送 - ZtNotice notice=new ZtNotice(); + ZtNotice notice = new ZtNotice(); notice.setName(dto.getTitle()); notice.setTitle(dto.getTitle()); notice.setRemark(dto.getRemark()); notice.setCreateDate(new Date()); notice.setCreateUser(RiskUserThreadLocal.get().getName()); - notice.setLoseDate(DateUtils.dateAddDay(new Date(),30)); + notice.setLoseDate(DateUtils.dateAddDay(new Date(), 30)); notice.setObjectType("release"); notice.setObjectId(ztRelease.getId()); notice.setFlag(0); noticeService.save(notice); } - List details = this.releaseDetailsService.list(new QueryWrapper().lambda().eq(ZtReleaseDetails::getReleaseId, ztRelease.getId()).ne(ZtReleaseDetails::getStatus,"closed").eq(ZtReleaseDetails::getObjectType, "story")); + List details = this.releaseDetailsService.list(new QueryWrapper().lambda().eq(ZtReleaseDetails::getReleaseId, ztRelease.getId()) + .ne(ZtReleaseDetails::getStatus, "closed")); - List storyList=new ArrayList(); - for (ZtReleaseDetails d:details ) { - storyList.add(d.getObjectId()); + List storyList = new ArrayList(); + List bugList = new ArrayList(); + for (ZtReleaseDetails d : details) { + if(d.getObjectType().equals("bug")){ + bugList.add(d.getObjectId()); + }else if(d.getObjectType().equals("story")){ + storyList.add(d.getObjectId()); + } } - -// List list = this.projectstoryService.list(new QueryWrapper().lambda() -// .in(ZtProjectstory::getStory, split).ne(ZtProjectstory::getExecution,0)); - if(CollectionUtils.isEmpty(storyList)){ + if (CollectionUtils.isEmpty(storyList) &&CollectionUtils.isEmpty(bugList) ) { throw new BusinessException("当前迭代无需求无法发布"); } - List ztStories = storyService.listByIds(storyList); - ZtProduct product = this.productService.getById(ztRelease.getProduct()); - if(dto.getRevieweResult()==1){ - for (ZtStory st:ztStories) { - if("active".equals(st.getStatus())&&"wait".equals(st.getStage())){ - continue; - } - if("closed".equals(st.getStatus())||"closed".equals(st.getStage())){ - continue; - } - if(!"tested".equals(st.getStage())){ - throw new BusinessException(st.getTitle()+" 当前需求无法发布,请检查"); + List ztStories = CollectionUtils.isEmpty(storyList)?new ArrayList<>():storyService.listByIds(storyList); + + List bugs =CollectionUtils.isEmpty(bugList)?new ArrayList<>(): bugService.listByIds(bugList); + + + + if (dto.getRevieweResult() == 1) { + long notTested = ztStories.stream().filter(o -> !o.getStage().equals("tested")).count(); + if(notTested>0){ + throw new BusinessException("当前需求存在未测试完成的请检查"); + } + //'active','resolved','closed'? + long count = bugs.stream().filter(o -> !Arrays.asList("resolved","closed").contains(o.getStatus())).count(); + if(count>0){ + throw new BusinessException("当前bug存在未完成请检查"); + } + for (ZtStory st : ztStories) { + if (!"tested".equals(st.getStage())) { + throw new BusinessException(st.getTitle() + " 当前需求无法发布,请检查"); } this.storyService.releaseStory(st.getId()); } - product.setReleases(product.getReleases()+ztStories.size()); - this.productService.updateById(product); + for (ZtBug b : bugs) { + b.setReleaseFlag(1); + b.setLasteditedby(RiskUserThreadLocal.get().getName()); + b.setLastediteddate(new Date()); + this.bugService.updateById(b); + } + if(!CollectionUtils.isEmpty(ztStories)){ + Map userMap = this.userService.userMapByIds(null); + List mailTo =new ArrayList<>(); + StringBuilder b=new StringBuilder(); + b.append("" + + "" + + "" + ); + for (ZtStory s:ztStories) { + ZtUser ztUser = userMap.get(s.getYsUser()); + if(ztUser!=null&&!StringUtils.isEmpty(ztUser.getEmail())){ +// String str="
需求编号: {id}  需求名称 : {name}      验收人 : {userName}

"; +// str=str.replace("{id}",s.getId().toString()); +// str= str.replace("{name}",s.getTitle()); +// str= str.replace("{userName}",ztUser.getNickname()); + + //{userName} {title} {id} + String str= "" ; + str=str.replace("{userName}",ztUser.getNickname()); + str=str.replace("{title}",s.getTitle()); + str=str.replace("{id}",s.getId().toString()); + b.append(str); + mailTo.add(ztUser.getEmail()); + } + + } + b.append( "" ); + b.append( "
编号
标题
验收人
{id}
{title}
{userName}
"); + if(!CollectionUtils.isEmpty(mailTo)){ + SendEmail.sendMessage("需求发布提醒:",mailTo, + null, + b.toString()); + } + + } - }else{ + +// if(!StringUtils.isEmpty(ysUser)){ +// ZtUser ztUser = this.userService.selectByName(ysUser); +// if(ztUser!=null&&!StringUtils.isEmpty(ztUser.getEmail())){ +// try { +// StringBuilder b=new StringBuilder(); +// b.append("
尊敬的{userName}:
"); +// b.append("
您的需求 \"{id} {name}\"、\"{id} {name}\" 已发布,请及时登录系统验收。
"); +// String str = b.toString(); +// str= str.replace("{userName}",ztUser.getNickname()); +// str=str.replace("{id}",ztStory.getId().toString()); +// str=str.replace("{name}",ztStory.getTitle()); +// SendEmail.sendMail(ztUser.getEmail(),str,"需求发布提醒"); +// }catch (Exception e){ +// log.error("",e); +// } +// } +// } +// + } else { actionService.addAction(ActionType.FB, ActionStatus.FBSB, ztRelease.getId(), ztRelease.getProduct() + "", ztRelease.getProject(), null, RiskUserThreadLocal.get().getName(), "", ""); } - } @Override - public List> execMenu(ZtReleaseQo qo) { + public List> execMenu(ZtReleaseQo qo) { return null; } + @Autowired private IZtExecutionprojectService executionprojectService; @@ -379,24 +467,23 @@ public class ZtReleaseServiceImpl extends ServiceImpl page = PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize()); - List list = this.releaseDetailsService.releasePageList(qo); + List list = this.releaseDetailsService.releaseStoryPageList(qo); Map userMap = this.userService.userMapByIds(null); - // Map> executionMapByStory = this.storyService.getExecutionMapByStory(list); for (ZtStoryDTO d : list) { d.setRevieweUser(d.getReviewedby().replaceAll(",", "")); ZtUser ztUser = userMap.get(d.getAssignedTo()); - if(ztUser!=null){ + if (ztUser != null) { d.setAssignedToName(ztUser.getNickname()); } ztUser = userMap.get(d.getOpenedby()); - if(ztUser!=null){ + if (ztUser != null) { d.setOpenedbyName(ztUser.getNickname()); } // List ztProject = executionMapByStory.get(d.getId()); @@ -407,71 +494,208 @@ public class ZtReleaseServiceImpl extends ServiceImpl(list); } + @Override + public PageInfo releaseBugPageList(ZtReleaseQo qo) { + Integer id = qo.getId(); + Page page = PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize()); + + List list = this.releaseDetailsService.releaseBugPageList(qo); + + Map userMap = this.userService.userMapByIds(null); + + + for (ZtBugDTO d : list) { +// d.setRevieweUser(d.getReviewedby().replaceAll(",", "")); + ZtUser ztUser = userMap.get(d.getAssignedTo()); + if (ztUser != null) { + d.setAssignedToName(ztUser.getNickname()); + } + + ztUser = userMap.get(d.getOpenedby()); + if (ztUser != null) { + d.setOpenedbyName(ztUser.getNickname()); + } + } + return new PageInfo(list); + } + + @Override + public PageInfo releaseNotSyncBugPageList(ZtReleaseQo qo) { + Integer id = qo.getId(); + + ZtRelease ztRelease = this.baseMapper.selectById(qo.getId()); + if(ztRelease==null){ + throw new BusinessException("未查询到数据"); + } + Page page = PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize()); + qo.setProject(ztRelease.getProject()); + List list = this.releaseDetailsService.releaseNotSyncBugPageList(qo); + + Map userMap = this.userService.userMapByIds(null); + + + for (ZtBugDTO d : list) { +// d.setRevieweUser(d.getReviewedby().replaceAll(",", "")); + ZtUser ztUser = userMap.get(d.getAssignedTo()); + if (ztUser != null) { + d.setAssignedToName(ztUser.getNickname()); + } + + ztUser = userMap.get(d.getOpenedby()); + if (ztUser != null) { + d.setOpenedbyName(ztUser.getNickname()); + } + } + return new PageInfo(list); + } + + @Override + @Transactional + public void closeRelease(ZtReleaseQo dto) { + ZtRelease ztRelease = this.baseMapper.selectById(dto.getId()); + if(ztRelease==null){ + throw new BusinessException("未查询到数据"); + } + if(Arrays.asList("released","closed").contains(ztRelease.getStatus())){ + throw new BusinessException("当前无法关闭"); + } + ztRelease.setStatus("closed"); + List releaseDetails = this.releaseDetailsService.list(new QueryWrapper().lambda() + .eq(ZtReleaseDetails::getReleaseId, ztRelease.getId())); + if(!CollectionUtils.isEmpty(releaseDetails)){ + for (ZtReleaseDetails r:releaseDetails ) { + r.setStatus("closed"); + } + this.releaseDetailsService.saveOrUpdateBatch(releaseDetails); + } + this.baseMapper.updateById(ztRelease); + actionService.addAction(ActionType.FB, ActionStatus.GB, ztRelease.getId(), ztRelease.getProduct() + "", ztRelease.getProject(), null, + RiskUserThreadLocal.get().getName(), dto.getRemark(), ""); + } + + @Override + @Transactional + public void submitReviewing(ZtReleaseDTO dto) { + ZtRelease ztRelease = this.baseMapper.selectById(dto.getId()); + if(ztRelease==null){ + throw new BusinessException("未查询到数据"); + } + if(!ztRelease.getStatus().equals("active")){ + throw new BusinessException("当前无法提交评审"); + } + ztRelease.setStatus("reviewing"); + this.baseMapper.updateById(ztRelease); + actionService.addAction(ActionType.FB, ActionStatus.SUBPS, ztRelease.getId(), ztRelease.getProduct() + "", ztRelease.getProject(), null, + RiskUserThreadLocal.get().getName(),"", ""); + } + + @Override + @Transactional + public void submitAgainReviewing(ZtReleaseDTO dto) { + ZtRelease ztRelease = this.baseMapper.selectById(dto.getId()); + if(ztRelease==null){ + throw new BusinessException("未查询到数据"); + } + if(!ztRelease.getStatus().equals("reviewingError")){ + throw new BusinessException("当前无法提交评审"); + } + ztRelease.setFailRemark(null); + ztRelease.setStatus("reviewing"); + this.baseMapper.updateById(ztRelease); + actionService.addAction(ActionType.FB, ActionStatus.SUBPS, ztRelease.getId(), ztRelease.getProduct() + "", ztRelease.getProject(), null, + RiskUserThreadLocal.get().getName(),"", ""); + } + + @Override + public ZtRelease getReleaseByStory(Integer id) { + List list = this.releaseDetailsService.list(new QueryWrapper().lambda().eq(ZtReleaseDetails::getObjectId, id) + .eq(ZtReleaseDetails::getObjectType, "story").ne(ZtReleaseDetails::getStatus, "closed") + ); + if(CollectionUtils.isEmpty(list)){ + return null; + } + return this.baseMapper.selectById(list.get(0).getReleaseId()); + } + + @Override + public ZtRelease getReleaseByBug(Integer id) { + List list = this.releaseDetailsService.list(new QueryWrapper().lambda().eq(ZtReleaseDetails::getObjectId, id) + .eq(ZtReleaseDetails::getObjectType, "bug").ne(ZtReleaseDetails::getStatus, "closed") + ); + if(CollectionUtils.isEmpty(list)){ + return null; + } + return this.baseMapper.selectById(list.get(0).getReleaseId()); + } @Override public PageInfo projectStoryPageList(ZtReleaseQo qo) { ZtRelease ztRelease = this.baseMapper.selectById(qo.getId()); Integer project = ztRelease.getProject(); + String executions = ztRelease.getExecutions(); + String[] split = executions.split(","); + List execIds = new ArrayList(); + for (String s : split) { + execIds.add(Integer.valueOf(s)); + } // 项目查找所有迭代 - List execList = this.executionprojectService.list(new QueryWrapper().lambda().eq(ZtExecutionproject::getProject, project)); - if(CollectionUtils.isEmpty(execList)){ - return new PageInfo(); - } +// List execList = this.executionprojectService.list(new QueryWrapper().lambda().eq(ZtExecutionproject::getProject, project)); +// if(CollectionUtils.isEmpty(execList)){ +// return new PageInfo(); +// } //迭代查找所有需求 - List execStorys = projectstoryService.projectStoryList(execList.stream().map(o -> o.getExecution()).collect(Collectors.toList()),ProjectTypeEnums.execution); + List execStorys = projectstoryService.projectStoryList(execIds, ProjectTypeEnums.execution); - if(CollectionUtils.isEmpty(execStorys)){ + if (CollectionUtils.isEmpty(execStorys)) { return new PageInfo(); } //过滤掉已关联的迭代需求 List storyIdList = execStorys.stream().map(o -> o.getStory()).collect(Collectors.toList()); - List ztReleases = this.baseMapper.selectList(new QueryWrapper().lambda().eq(ZtRelease::getProject, project)); +// List ztReleases = this.baseMapper.selectList(new QueryWrapper().lambda().eq(ZtRelease::getProject, project)); List list = this.releaseDetailsService.list(new QueryWrapper().lambda() .ne(ZtReleaseDetails::getStatus, "closed") - .in(ZtReleaseDetails::getObjectId,storyIdList) + .in(ZtReleaseDetails::getObjectId, storyIdList) .eq(ZtReleaseDetails::getObjectType, "story") ); - if(!CollectionUtils.isEmpty(list)){ + if (!CollectionUtils.isEmpty(list)) { List fIds = list.stream().map(o -> o.getObjectId()).collect(Collectors.toList()); Iterator iterator = execStorys.iterator(); - while (iterator.hasNext()){ + while (iterator.hasNext()) { ZtProjectstory next = iterator.next(); - if(fIds.contains(next.getStory())){ + if (fIds.contains(next.getStory())) { iterator.remove(); } } } - qo.setStoryList(execStorys.stream().map(o->o.getStory()).collect(Collectors.toList())); - if(CollectionUtils.isEmpty(execStorys)){ + qo.setStoryList(execStorys.stream().map(o -> o.getStory()).collect(Collectors.toList())); + if (CollectionUtils.isEmpty(execStorys)) { return new PageInfo(); } + Map userMap = this.userService.userMapByIds(null); Page page = PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize()); List storyList = this.releaseDetailsService.storyPageList(qo); - Map userMap = this.userService.userMapByIds(null); - - // Map executionMapByStory = this.storyService.getExecutionMapByStory(storyList); for (ZtStoryDTO d : storyList) { ZtUser ztUser = userMap.get(d.getAssignedTo()); - if(ztUser!=null){ + if (ztUser != null) { d.setAssignedToName(ztUser.getNickname()); } ztUser = userMap.get(d.getOpenedby()); - if(ztUser!=null){ + if (ztUser != null) { d.setOpenedbyName(ztUser.getNickname()); } ztUser = userMap.get(d.getYsUser()); - if(ztUser!=null){ + if (ztUser != null) { d.setYsUserName(ztUser.getNickname()); } // ZtProject ztProject = executionMapByStory.get(d.getId()); @@ -486,15 +710,25 @@ public class ZtReleaseServiceImpl extends ServiceImpl releaseDetails = this.releaseDetailsService.list(new QueryWrapper().lambda() - .eq(ZtReleaseDetails::getReleaseId, id) - .in(ZtReleaseDetails::getObjectId, qo.getStoryList()).eq(ZtReleaseDetails::getObjectType,"story")); - for (ZtReleaseDetails d:releaseDetails) { + .in(ZtReleaseDetails::getObjectId, qo.getStoryList()).eq(ZtReleaseDetails::getObjectType, "story") .ne(ZtReleaseDetails::getStatus,"closed")); + if(CollectionUtils.isEmpty(releaseDetails)){ + return; + } + + Integer id = qo.getId(); + if(id==null||id==0){ + id=releaseDetails.get(0).getReleaseId(); + } + ZtRelease ztRelease = this.baseMapper.selectById(id); + if (!Arrays.asList("active").contains(ztRelease.getStatus())) { + throw new BusinessException("当前无法更新发布"); + } +// if(ztRelease.getStatus().equals("active")){ + +// } + for (ZtReleaseDetails d : releaseDetails) { d.setStatus("closed"); } this.releaseDetailsService.saveOrUpdateBatch(releaseDetails); @@ -503,13 +737,130 @@ public class ZtReleaseServiceImpl extends ServiceImpl releaseDetails = this.releaseDetailsService.list(new QueryWrapper().lambda() + .in(ZtReleaseDetails::getObjectId, qo.getBugList()).eq(ZtReleaseDetails::getObjectType, "bug").ne(ZtReleaseDetails::getStatus,"closed")); + if(CollectionUtils.isEmpty(releaseDetails)){ + return; + } + + Integer id = qo.getId(); + if(id==null||id==0){ + id=releaseDetails.get(0).getReleaseId(); + } + ZtRelease ztRelease = this.baseMapper.selectById(id); + if (!Arrays.asList("active").contains(ztRelease.getStatus())) { + throw new BusinessException("当前无法更新发布"); + } + + for (ZtReleaseDetails d : releaseDetails) { + d.setStatus("closed"); + } + this.releaseDetailsService.saveOrUpdateBatch(releaseDetails); + + actionService.addAction(ActionType.FB, ActionStatus.BJ, ztRelease.getId(), ztRelease.getProduct() + "", ztRelease.getProject(), null, + RiskUserThreadLocal.get().getName(), "", ""); + } + + // releaseId 新发布id + @Override + public void changeRelease(Integer releaseId, Integer id, String type) { + ZtRelease ztRelease = this.baseMapper.selectById(releaseId); + List sList = this.releaseDetailsService.list(new QueryWrapper().lambda() + .eq(ZtReleaseDetails::getObjectId, id).eq(ZtReleaseDetails::getObjectType, type).ne(ZtReleaseDetails::getStatus, "closed")); + if(!CollectionUtils.isEmpty(sList)){ + + Integer oldReleaseId = sList.get(0).getReleaseId(); + if(releaseId.equals(oldReleaseId)){ + return; + } + ZtRelease oldRelease = this.baseMapper.selectById(oldReleaseId); + if (!Arrays.asList("active").contains(oldRelease.getStatus())) { + throw new BusinessException("当前无法更新发布"); + } + } + if (!Arrays.asList("active").contains(ztRelease.getStatus())) { + throw new BusinessException("当前无法更新发布"); + } + + + if (!CollectionUtils.isEmpty(sList)) { + ZtReleaseDetails ztReleaseDetails = sList.get(0); + //没有修改直接返回 + if (ztReleaseDetails.getReleaseId().equals(releaseId)) { + return; + } else { + //改变了先移除 + ZtReleaseQo qo = new ZtReleaseQo(); + qo.setId(releaseId); + if ("story".equals(type)) { + qo.setStoryList(Arrays.asList(id)); + this.removeStory(qo); + } else if ("bug".equals(type)) { + qo.setBugList(Arrays.asList(id)); + this.removeBug(qo); + } + + } + } + ZtReleaseQo qo = new ZtReleaseQo(); + qo.setId(releaseId); + if ("story".equals(type)) { + qo.setStoryList(Arrays.asList(id)); + this.batchSyncStory(qo); + } else if ("bug".equals(type)) { + qo.setBugList(Arrays.asList(id)); + this.batchSyncBug(qo); + } + + + } + + + + @Override + public void batchSyncBug(ZtReleaseQo qo) { + ZtRelease ztRelease = this.baseMapper.selectById(qo.getId()); + //released 发不成功 + //close 发布失败 + if (!Arrays.asList("active").contains(ztRelease.getStatus())) { + throw new BusinessException("当前无法更新发布"); + } + List bugList = qo.getBugList(); + List list = this.releaseDetailsService.list(new QueryWrapper().lambda() + .eq(ZtReleaseDetails::getObjectType, "bug") + .ne(ZtReleaseDetails::getStatus, "closed") + .in(ZtReleaseDetails::getObjectId, bugList) + ); + if (!CollectionUtils.isEmpty(list)) { + throw new BusinessException("BUG已被关联id :" + list.get(0).getObjectId()); + } + List saveBatch = new ArrayList<>(); + for (Integer story : bugList) { + ZtReleaseDetails e = new ZtReleaseDetails(); + e.setObjectId(story); + e.setObjectType("bug"); + e.setReleaseId(qo.getId()); + e.setStatus("wait"); + saveBatch.add(e); + } + + releaseDetailsService.saveBatch(saveBatch); + + + actionService.addAction(ActionType.FB, ActionStatus.BJ, ztRelease.getId(), ztRelease.getProduct() + "", ztRelease.getProject(), null, + RiskUserThreadLocal.get().getName(), "", ""); + } + + @Override @Transactional public void batchSyncStory(ZtReleaseQo qo) { ZtRelease ztRelease = this.baseMapper.selectById(qo.getId()); //released 发不成功 //close 发布失败 - if(Arrays.asList("released","closed").contains(ztRelease.getStatus())){ + if (!Arrays.asList("active").contains(ztRelease.getStatus())) { throw new BusinessException("当前无法更新发布"); } List storyList = qo.getStoryList(); @@ -518,12 +869,12 @@ public class ZtReleaseServiceImpl extends ServiceImpl saveBatch=new ArrayList<>(); - for (Integer story:storyList) { - ZtReleaseDetails e=new ZtReleaseDetails(); + List saveBatch = new ArrayList<>(); + for (Integer story : storyList) { + ZtReleaseDetails e = new ZtReleaseDetails(); e.setObjectId(story); e.setObjectType("story"); e.setReleaseId(qo.getId()); @@ -534,7 +885,6 @@ public class ZtReleaseServiceImpl extends ServiceImpl userMap = this.userService.userMapByIds(null); - - - ZtUser ztUser = userMap.get(d.getAssignedTo()); - if(ztUser!=null){ + if (ztUser != null) { d.setAssignedToName(ztUser.getNickname()); } Integer productId = d.getProduct(); - if(productId!=null&&productId!=0){ + if (productId != null && productId != 0) { ZtProduct p = this.productService.getById(productId); d.setProductName(p.getName()); } ZtProject ztProject = this.projectService.getById(d.getProject()); - if(ztProject!=null){ + if (ztProject != null) { d.setProjectName(ztProject.getName()); } ztUser = userMap.get(d.getCreatedby()); - if(ztUser!=null){ + if (ztUser != null) { d.setCreatedby(ztUser.getNickname()); } return d; } + + @Override + public List releaseList(ZtReleaseDTO dto) { + + Integer product = dto.getProduct(); + Integer project = dto.getProject(); + Integer execution = dto.getExecution(); + if (project != null && project != 0) { + List activeList = this.list(new QueryWrapper().lambda().eq(ZtRelease::getProject, project).eq(ZtRelease::getStatus, "active")); + if (CollectionUtils.isEmpty(activeList)) { + return Arrays.asList(); + } + return BeanCopyUtil.copyListProperties(activeList, ZtReleaseDTO::new); + } + if (execution != null && execution != 0) { + ZtExecutionproject executionproject = this.executionprojectService.getOne(new QueryWrapper().lambda().eq(ZtExecutionproject::getExecution, execution)); + + List activeList = this.list(new QueryWrapper().lambda().eq(ZtRelease::getProject, executionproject.getProject()).eq(ZtRelease::getStatus, "active")); + if (CollectionUtils.isEmpty(activeList)) { + return Arrays.asList(); + } + return BeanCopyUtil.copyListProperties(activeList, ZtReleaseDTO::new); + } + if (product != null && product != 0) { + List list = this.projectproductService.list(new QueryWrapper().lambda().eq(ZtProjectproduct::getProduct, product)); + if (CollectionUtils.isEmpty(list)) { + return Arrays.asList(); + } + + List activeList = this.list(new QueryWrapper().lambda() + .in(ZtRelease::getProject, list.stream().map(o -> o.getProject()).collect(Collectors.toList())).eq(ZtRelease::getStatus, "active")); + if (CollectionUtils.isEmpty(activeList)) { + return Arrays.asList(); + } + return BeanCopyUtil.copyListProperties(activeList, ZtReleaseDTO::new); + } + return Arrays.asList(); + } + + } diff --git a/src/main/java/com/sa/zentao/service/impl/ZtStoryServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtStoryServiceImpl.java index 5fc1bc2..cc6826a 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtStoryServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtStoryServiceImpl.java @@ -17,6 +17,7 @@ import com.sa.zentao.mapper.ZtStoryMapper; import com.sa.zentao.qo.KanbanQo; import com.sa.zentao.qo.ZtBugQo; import com.sa.zentao.qo.ZtProjectQo; +import com.sa.zentao.qo.ZtReleaseQo; import com.sa.zentao.service.*; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.sa.zentao.utils.BeanCopyUtil; @@ -96,6 +97,9 @@ public class ZtStoryServiceImpl extends ServiceImpl impl @Autowired private IZtStoryUserService storyUserService; + @Autowired + private IZtReleaseService releaseService; + @Override public PageInfo pageList(ZtProjectQo qo) { @@ -486,6 +490,7 @@ public class ZtStoryServiceImpl extends ServiceImpl impl executionUnBindStory(storyId, execList.stream().map(o -> o.getProject()).collect(Collectors.toList())); } } + //old userStory Integer userStory = ztStory.getUserStory(); //new @@ -525,6 +530,16 @@ public class ZtStoryServiceImpl extends ServiceImpl impl } + + + this.baseMapper.updateById(ztStory); + if(dto.getReleaseId()!=null&&dto.getReleaseId()!=0){ + this.releaseService.changeRelease(dto.getReleaseId(),ztStory.getId(),"story"); + }else{ + ZtReleaseQo qo =new ZtReleaseQo(); + qo.setStoryList(Arrays.asList(id)); + this.releaseService.removeStory(qo); + } String stage = ztStory.getStage(); if (!StringUtils.isEmpty(stage) && !StringUtils.isEmpty(dto.getStage()) && !stage.equals(dto.getStage())) { ZtStoryDTO s = new ZtStoryDTO(); @@ -532,8 +547,6 @@ public class ZtStoryServiceImpl extends ServiceImpl impl s.setStage(dto.getStage()); this.changeStatus(s); } - this.baseMapper.updateById(ztStory); - if(ObjectUtils.notEqual(userStory,newUserStory)){ if(userStory!=null&&userStory!=0){ this.storyUserService.storyFinishedChangeStatus(userStory,UserStoryEnums.YWC); @@ -976,7 +989,9 @@ public class ZtStoryServiceImpl extends ServiceImpl impl if ("closed".equals(ztStory.getStatus())) { throw new BusinessException("需求当前已关闭"); } - + if("developing".equals(ztStory.getStage())){ + return; + } // List stateList = Arrays.asList("wait", "projected"); // // @@ -998,10 +1013,6 @@ public class ZtStoryServiceImpl extends ServiceImpl impl if (ztStory.getFeedback() != null && ztStory.getFeedback() != 0) { this.storyFeedbackService.feedbackStart(ztStory.getFeedback()); } - - actionService.addAction(ActionType.XQ, ActionStatus.KS, ztStory.getId(), ztStory.getProduct() + "", ztStory.getProject(), null, - RiskUserThreadLocal.get().getName(), null, ""); - } @Override @@ -1017,7 +1028,9 @@ public class ZtStoryServiceImpl extends ServiceImpl impl if (ztStory == null) { throw new BusinessException("未查询到需求"); } - + if(ztStory.getStatus().equals("developed")){ + return; + } if (ztStory.getFeedback() != null && ztStory.getFeedback() != 0) { this.storyFeedbackService.feedbackStart(ztStory.getFeedback()); } @@ -1201,28 +1214,13 @@ public class ZtStoryServiceImpl extends ServiceImpl impl String newStatus = "released"; ztStory.setStage(newStatus); + ztStory.setReleaseddate(new Date()); if (ztStory.getEndDate() == null) { ztStory.setEndDate(new Date()); } this.baseMapper.updateById(ztStory); String ysUser = ztStory.getYsUser(); - if(!StringUtils.isEmpty(ysUser)){ - ZtUser ztUser = this.userService.selectByName(ysUser); - if(ztUser!=null&&!StringUtils.isEmpty(ztUser.getEmail())){ - try { - StringBuilder b=new StringBuilder(); - b.append("
尊敬的{userName}:
"); - b.append("
您的需求 \"{id} {name}\"、\"{id} {name}\" 已发布,请及时登录系统验收。
"); - String str = b.toString(); - str= str.replace("{userName}",ztUser.getNickname()); - str=str.replace("{id}",ztStory.getId().toString()); - str=str.replace("{name}",ztStory.getTitle()); - SendEmail.sendMail(ztUser.getEmail(),str,"需求发布提醒"); - }catch (Exception e){ - log.error("",e); - } - } - } + for (Integer execId : execIds) { @@ -1466,6 +1464,9 @@ public class ZtStoryServiceImpl extends ServiceImpl impl if (ztStory == null) { throw new BusinessException("未查询到数据-需求"); } + if(ztStory.getStatus().equals("testing")){ + return; + } if (ztStory.getFeedback() != null && ztStory.getFeedback() != 0) { this.storyFeedbackService.feedbackStart(ztStory.getFeedback()); } @@ -1995,6 +1996,12 @@ public class ZtStoryServiceImpl extends ServiceImpl impl ZtStoryDTO d = new ZtStoryDTO(); BeanUtils.copyProperties(ztStory, d); + + ZtRelease release = releaseService.getReleaseByStory(ztStory.getId()); + if(release!=null){ + d.setReleaseId(release.getId()); + d.setReleaseName(release.getName()); + } if (d.getProduct() != null && d.getProduct() != 0) { ZtProduct product = this.productService.getById(d.getProduct()); diff --git a/src/main/java/com/sa/zentao/service/impl/ZtStoryUserServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtStoryUserServiceImpl.java index 3ce5352..b6eae8a 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtStoryUserServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtStoryUserServiceImpl.java @@ -21,6 +21,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.SendEmail; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -33,7 +34,7 @@ import java.util.stream.Collectors; /** *

- * 服务实现类 + * 服务实现类 *

* * @author gqb @@ -80,15 +81,15 @@ public class ZtStoryUserServiceImpl extends ServiceImpl().lambda().eq(ZtStoryreview::getStory, ztStory.getId()).eq(ZtStoryreview::getType, "userStory")); + + for (String str : dto.getUserViewId()) { + ZtStoryreview v = new ZtStoryreview(); + v.setStory(ztStory.getId()); + v.setVersion(ztStory.getVersion()); + v.setReviewer(str); + v.setType("userStory"); + this.storyreviewService.save(v); + } + + } + + + if ("draft".equals(dto.getStatus())) { ztStory.setStatus("draft"); - }else{ - if("draft".equals(status)){ + } else { + if ("draft".equals(status)) { ztStory.setStatus("reviewing"); + // + List userStory = this.storyreviewService.list(new QueryWrapper().lambda().eq(ZtStoryreview::getStory, ztStory.getId()) + .eq(ZtStoryreview::getType, "userStory")); + if (!CollectionUtils.isEmpty(userStory)) { + StringBuilder b = new StringBuilder(); + Map userMap = this.userService.userMapByIds(null); + + for (int i = 0; i < userStory.size(); i++) { + ZtStoryreview v = userStory.get(i); + + ZtUser ztUser = userMap.get(v.getReviewer()); + if (ztUser != null) { + b.append(ztUser.getNickname()); + } + if (i != (userStory.size() - 1)) { + b.append(","); + } + + } + actionService.addAction(ActionType.USERXQ, ActionStatus.PS, ztStory.getId(), ztStory.getProduct() + "", ztStory.getProject(), null, + RiskUserThreadLocal.get().getName(), "", b.toString()); + } + } } } this.baseMapper.updateById(ztStory); - fileService.updateFile(dto.getFiles(),ztStory.getId(), FileTypes.userStory); + fileService.updateFile(dto.getFiles(), ztStory.getId(), FileTypes.userStory); actionService.addAction(ActionType.USERXQ, ActionStatus.BJ, dto.getId(), dto.getProduct() + "", dto.getProject(), null, - RiskUserThreadLocal.get().getName(), dto.getRemark(), ""); + RiskUserThreadLocal.get().getName(), dto.getRemark(), ""); } @@ -155,7 +198,7 @@ public class ZtStoryUserServiceImpl extends ServiceImpl(Arrays.asList(split))); } @@ -177,13 +220,13 @@ public class ZtStoryUserServiceImpl extends ServiceImpl> rMap = getReviewMap(list); for (ZtStoryUserDTO d : list) { - if(!StringUtils.isEmpty(d.getReviewedby())){ + if (!StringUtils.isEmpty(d.getReviewedby())) { String[] split = d.getReviewedby().split(","); - StringBuilder b=new StringBuilder(); - for (String s:split) { + StringBuilder b = new StringBuilder(); + for (String s : split) { ZtUser u = userMap.get(s); - if(u!=null){ - b.append(u.getNickname()+","); + if (u != null) { + b.append(u.getNickname() + ","); } } @@ -194,21 +237,21 @@ public class ZtStoryUserServiceImpl extends ServiceImpl ztStories = storyUserMap.get(d.getId()); - if(!CollectionUtils.isEmpty(ztStories)){ - d.setStoryList(ztStories.stream().map(o->o.getTitle()).collect(Collectors.joining(","))); + if (!CollectionUtils.isEmpty(ztStories)) { + d.setStoryList(ztStories.stream().map(o -> o.getTitle()).collect(Collectors.joining(","))); } } @@ -221,8 +264,8 @@ public class ZtStoryUserServiceImpl extends ServiceImpl().lambda() .eq(ZtStoryreview::getStory, ztStory.getId()) .eq(ZtStoryreview::getReviewer, RiskUserThreadLocal.get().getName()) - .eq(ZtStoryreview::getType,"userStory") + .eq(ZtStoryreview::getType, "userStory") ); if (view == null) { throw new BusinessException("当前无评审"); @@ -271,24 +314,65 @@ public class ZtStoryUserServiceImpl extends ServiceImpl需求编号: {id}  需求名称 : {name}      验收人 : {userName}

"; +// str=str.replace("{id}",s.getId().toString()); +// str= str.replace("{name}",s.getTitle()); +// str= str.replace("{userName}",ztUser.getNickname()); +// mailTo.add(ztUser.getEmail()); +// content.append(str); +// } +// +// } + if (dto.getRevieweResult() != 1){ + ZtUser u = this.userService.getByAccount(ztStory.getOpenedby()); + if (u != null && !StringUtils.isEmpty(u.getEmail())) { + StringBuilder b = new StringBuilder(); + b.append("

你好: {userName}

"); + b.append("

  您的需求评审没有通过,请及时处理:

"); + b.append("

需求编号: {storyId}

"); + b.append("

需求名称: {storyName}

"); + b.append("

 

"); + b.append("

 

"); + b.append("

 

"); + b.append("

 

"); + b.append("

 

"); + b.append("

谢谢。

"); + String str = b.toString(); + + + str = str.replace("{userName}", u.getNickname()); + str = str.replace("{storyId}", ztStory.getId().toString()); + str = str.replace("{storyName}", ztStory.getTitle()); + SendEmail.sendMessage("需求评审通知:", Arrays.asList(u.getEmail()), + null, + str); + } + } + + + lambda.set(ZtStoryreview::getReviewdate, new Date()); lambda.eq(ZtStoryreview::getStory, ztStory.getId()); lambda.eq(ZtStoryreview::getReviewer, RiskUserThreadLocal.get().getName()); - lambda.eq(ZtStoryreview::getType,"userStory"); + lambda.eq(ZtStoryreview::getType, "userStory"); this.storyreviewService.update(lambda); ztStory.setReviewedby(StringUtils.isEmpty(ztStory.getReviewedby()) ? "," + RiskUserThreadLocal.get().getName() : ztStory.getReviewedby() + "," + RiskUserThreadLocal.get().getName()); List list = this.storyreviewService.list(new QueryWrapper().lambda() - .eq(ZtStoryreview::getStory, ztStory.getId()).eq(ZtStoryreview::getType,"userStory") + .eq(ZtStoryreview::getStory, ztStory.getId()).eq(ZtStoryreview::getType, "userStory") ); if (list.stream().filter(o -> o.getReviewdate() != null).collect(Collectors.toList()).size() >= list.size()) { @@ -308,7 +392,7 @@ public class ZtStoryUserServiceImpl extends ServiceImpl userMap = userService.userMapByIds(null); String openedby = dto.getOpenedby(); ZtUser ztUser = userMap.get(openedby); - if(ztUser!=null){ + if (ztUser != null) { dto.setOpenedbyName(ztUser.getNickname()); } ztUser = userMap.get(dto.getClosedby()); - if(ztUser!=null){ + if (ztUser != null) { dto.setClosedbyName(ztUser.getNickname()); } Map> storyUserMap = getStoryUserMap(Arrays.asList(dto)); List ztStories = storyUserMap.get(d.getId()); - if(!CollectionUtils.isEmpty(ztStories)){ - dto.setStoryList(ztStories.stream().map(o->o.getTitle()).collect(Collectors.joining(","))); + if (!CollectionUtils.isEmpty(ztStories)) { + dto.setStoryList(ztStories.stream().map(o -> o.getTitle()).collect(Collectors.joining(","))); } - if(!StringUtils.isEmpty(dto.getReviewedby())){ + if (!StringUtils.isEmpty(dto.getReviewedby())) { String[] split = dto.getReviewedby().split(","); - StringBuilder b=new StringBuilder(); - for (String s:split) { + StringBuilder b = new StringBuilder(); + for (String s : split) { ZtUser u = userMap.get(s); - if(u!=null){ - b.append(u.getNickname()+","); + if (u != null) { + b.append(u.getNickname() + ","); } } } - if(dto.getParent()!=null&&dto.getParent()!=0){ + if (dto.getParent() != null && dto.getParent() != 0) { ZtStoryUser pStory = this.getById(dto.getParent()); - if(pStory!=null){ + if (pStory != null) { dto.setParentName(pStory.getTitle()); } } - if(dto.getModule()!=null&&dto.getModule()!=0){ + if (dto.getModule() != null && dto.getModule() != 0) { ZtModule ztModule = this.moduleService.getById(dto.getModule()); - if(ztModule!=null){ + if (ztModule != null) { dto.setModuleName(ztModule.getName()); } } Map> rMap = getReviewMap(Arrays.asList(dto)); - if(!StringUtils.isEmpty(dto.getReviewedby())){ + if (!StringUtils.isEmpty(dto.getReviewedby())) { String[] split = dto.getReviewedby().split(","); - StringBuilder b=new StringBuilder(); - for ( int i =0 ;i list = this.storyService.list(new QueryWrapper().lambda().eq(ZtStory::getUserStory, dto.getId())); - if(!CollectionUtils.isEmpty(list)){ + if (!CollectionUtils.isEmpty(list)) { List storyDTOList = BeanCopyUtil.copyListProperties(list, ZtStoryDTO::new); - if(!CollectionUtils.isEmpty(storyDTOList)){ + if (!CollectionUtils.isEmpty(storyDTOList)) { - for (ZtStoryDTO storyDTO:storyDTOList) { + for (ZtStoryDTO storyDTO : storyDTOList) { ztUser = userMap.get(storyDTO.getAssignedTo()); - if(ztUser!=null){ + if (ztUser != null) { storyDTO.setAssignedToName(ztUser.getNickname()); } ztUser = userMap.get(storyDTO.getOpenedby()); - if(ztUser!=null){ + if (ztUser != null) { storyDTO.setOpenedbyName(ztUser.getNickname()); } } @@ -429,15 +513,15 @@ public class ZtStoryUserServiceImpl extends ServiceImpl tasks = this.storyUserTaskService.list(new QueryWrapper().lambda().eq(ZtStoryUserTask::getUserStoryId, dto.getId())); - if(!CollectionUtils.isEmpty(tasks)){ + if (!CollectionUtils.isEmpty(tasks)) { List ztStoryUserTaskDTOS = BeanCopyUtil.copyListProperties(tasks, ZtStoryUserTaskDTO::new); - for (ZtStoryUserTaskDTO t:ztStoryUserTaskDTOS) { + for (ZtStoryUserTaskDTO t : ztStoryUserTaskDTOS) { ztUser = userMap.get(t.getAssignedTo()); - if(ztUser!=null){ + if (ztUser != null) { t.setAssignedToName(ztUser.getNickname()); } ztUser = userMap.get(t.getOpenedby()); - if(ztUser!=null){ + if (ztUser != null) { t.setOpenedbyName(ztUser.getNickname()); } } @@ -445,7 +529,6 @@ public class ZtStoryUserServiceImpl extends ServiceImplstatus.getIndex()){ + if (userStoryEnums.getIndex() > status.getIndex()) { return; } - if(status==UserStoryEnums.UNCFM){ + if (status == UserStoryEnums.UNCFM) { List list = storyUserTaskService.list(new QueryWrapper().lambda().eq(ZtStoryUserTask::getUserStoryId, id)); - if(list.size()>1){ + if (list.size() > 1) { return; } } - if(UserStoryEnums.CFM==status){ + if (UserStoryEnums.CFM == status) { //需求已确认 } @@ -527,60 +611,60 @@ public class ZtStoryUserServiceImpl extends ServiceImpl activeList = this.storyService.list(new QueryWrapper().lambda().eq(ZtStory::getUserStory, id) .in(ZtStory::getStatus, "active") ); - if(CollectionUtils.isEmpty(activeList)||storyUser.getStatus().equals(UserStoryEnums.KFZ.getCode())){ + if (CollectionUtils.isEmpty(activeList) || storyUser.getStatus().equals(UserStoryEnums.KFZ.getCode())) { return; } - }else if(status==UserStoryEnums.CFM){ + } else if (status == UserStoryEnums.CFM) { // wait 初始化 projected 已立项 developing 研发中 developed 研发完毕 testing 测试中 tested测试完毕 released已发布 verified List activeList = this.storyService.list(new QueryWrapper().lambda().eq(ZtStory::getUserStory, id) .eq(ZtStory::getStatus, "active") - .in(ZtStory::getStage,"wait","projected","developing","developed","testing","tested","released","verified") + .in(ZtStory::getStage, "wait", "projected", "developing", "developed", "testing", "tested", "released", "verified") ); - if(!CollectionUtils.isEmpty(activeList)){ + if (!CollectionUtils.isEmpty(activeList)) { return; } - }else if(status==UserStoryEnums.YWC){ + } else if (status == UserStoryEnums.YWC) { // wait 初始化 projected 已立项 developing 研发中 developed 研发完毕 testing 测试中 tested测试完毕 released已发布 verified List activeList = this.storyService.list(new QueryWrapper().lambda().eq(ZtStory::getUserStory, id) .eq(ZtStory::getStatus, "active") - .in(ZtStory::getStage,"wait","projected","developing","developed","testing","tested","verified","released") + .in(ZtStory::getStage, "wait", "projected", "developing", "developed", "testing", "tested", "verified", "released") ); //如果完成先查看相关需求是否以全部完成 - if(!CollectionUtils.isEmpty(activeList)){ + if (!CollectionUtils.isEmpty(activeList)) { return; - }else{ + } else { List finishList = this.storyService.list(new QueryWrapper().lambda().eq(ZtStory::getUserStory, id) .eq(ZtStory::getStatus, "finished") ); //如果没有进行中 那么查询是否有完成的研发需求 - if(CollectionUtils.isEmpty(finishList)){ + if (CollectionUtils.isEmpty(finishList)) { return; } } - }else{ + } else { return; } String oldStatus = storyUser.getStatus(); @@ -594,7 +678,7 @@ public class ZtStoryUserServiceImpl extends ServiceImpl> getStoryUserMap(List list) { List ids = list.stream().map(o -> o.getId()).collect(Collectors.toList()); - List list1 = storyService.list(new QueryWrapper().lambda().in(ZtStory::getUserStory,ids )); - if(CollectionUtils.isEmpty(list1)){ + List list1 = storyService.list(new QueryWrapper().lambda().in(ZtStory::getUserStory, ids)); + if (CollectionUtils.isEmpty(list1)) { return new HashMap<>(); - }else{ - return list1.stream().collect(Collectors.groupingBy(ZtStory::getUserStory)); + } else { + return list1.stream().collect(Collectors.groupingBy(ZtStory::getUserStory)); } } - private Map> getReviewMap(List list) { List list1 = storyreviewService.list(new QueryWrapper().lambda().in(ZtStoryreview::getStory , list.stream().map(o -> o.getId()).collect(Collectors.toList()) - ).eq(ZtStoryreview::getType,"userStory")); + ).eq(ZtStoryreview::getType, "userStory")); if (CollectionUtils.isEmpty(list1)) { return new HashMap<>(); } else { list1 = list1.stream().filter(o -> StringUtils.isEmpty(o.getResult())).collect(Collectors.toList()); - if(CollectionUtils.isEmpty(list1)){ + if (CollectionUtils.isEmpty(list1)) { return new HashMap<>(); } Map userMap = this.userService.userMapByIds(null); List ztStoryreviewDTOS = BeanCopyUtil.copyListProperties(list1, ZtStoryreviewDTO::new); - for (ZtStoryreviewDTO view:ztStoryreviewDTOS) { + for (ZtStoryreviewDTO view : ztStoryreviewDTOS) { ZtUser ztUser = userMap.get(view.getReviewer()); - if(ztUser!=null){ + if (ztUser != null) { view.setReviewerName(ztUser.getNickname()); } } - return ztStoryreviewDTOS.stream().collect(Collectors.groupingBy(ZtStoryreviewDTO::getStory)); + return ztStoryreviewDTOS.stream().collect(Collectors.groupingBy(ZtStoryreviewDTO::getStory)); } } diff --git a/src/main/java/com/sa/zentao/service/impl/ZtUserServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtUserServiceImpl.java index 8b165d8..d2b7123 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtUserServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtUserServiceImpl.java @@ -5,11 +5,14 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; +import com.sa.zentao.conf.RiskUserThreadLocal; import com.sa.zentao.dao.*; import com.sa.zentao.entity.VerificationCode; import com.sa.zentao.entity.ZtProduct; import com.sa.zentao.entity.ZtProject; import com.sa.zentao.entity.ZtUser; +import com.sa.zentao.enums.ActionStatus; +import com.sa.zentao.enums.ActionType; import com.sa.zentao.mapper.ZtUserMapper; import com.sa.zentao.qo.ZtUserQo; import com.sa.zentao.service.*; @@ -55,6 +58,8 @@ public class ZtUserServiceImpl extends ServiceImpl impleme @Autowired private IVerificationCodeService verificationCodeService; + @Autowired + private IZtActionService actionService; @@ -192,6 +197,9 @@ public class ZtUserServiceImpl extends ServiceImpl impleme if(login==null){ throw new BusinessException("未查询到"); } + if(login.getDeleted().equals("1")){ + throw new BusinessException("已经删除"); + } String userPass = login.getPassword(); String loginPass = user.getPassword(); if(!userPass.equalsIgnoreCase(loginPass)){ @@ -239,6 +247,59 @@ public class ZtUserServiceImpl extends ServiceImpl impleme return this.baseMapper.dkList(account,startDate,endDate); } + @Override + @Transactional + public void resetPassword(ZtUserDTO user) { + String name = RiskUserThreadLocal.get().getName(); + if(!"admin".equals(name)){ + throw new BusinessException("没有权限"); + } + Integer id = user.getId(); + ZtUser ztUser = this.getById(id); + if(ztUser==null){ + throw new BusinessException("未查询到数据"); + } + //123456 + ztUser.setPassword("e10adc3949ba59abbe56e057f20f883e"); + this.updateById(ztUser); + this.actionService.addAction(ActionType.LOGIN, ActionStatus.CZMM,user.getId(),null,null,null,RiskUserThreadLocal.get().getAccount(),null,ztUser.getAccount()); + + } + + @Override + @Transactional + public void deleteUser(ZtUserDTO user) { + String name = RiskUserThreadLocal.get().getName(); + if(!"admin".equals(name)){ + throw new BusinessException("没有权限"); + } + Integer id = user.getId(); + ZtUser ztUser = this.getById(id); + if(ztUser==null){ + throw new BusinessException("未查询到数据"); + } + //123456 + ztUser.setDeleted("1"); + this.updateById(ztUser); + this.actionService.addAction(ActionType.LOGIN, ActionStatus.SC,user.getId(),null,null,null,RiskUserThreadLocal.get().getAccount(),null,ztUser.getAccount()); + + } + + @Override + public List oaUserByNikeName(String nickname) { + return this.baseMapper.oaUserByNikeName(nickname); + } + + @Override + public BaseDepartment getDepart(Integer departId) { + return this.baseMapper.getDepart(departId); + } + + @Override + public ZtUser getByAccount(String openedby) { + return this.baseMapper.selectOne(new QueryWrapper().lambda().eq(ZtUser::getAccount, openedby)); + } + public boolean sendSms(String phoneNumber, String verificationCode) { try { // 初始化腾讯云短信服务客户端 diff --git a/src/main/java/com/sa/zentao/service/impl/ZtYwTaskServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtYwTaskServiceImpl.java index 87a7049..1bbb88a 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtYwTaskServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtYwTaskServiceImpl.java @@ -156,9 +156,10 @@ public class ZtYwTaskServiceImpl extends ServiceImpl i }catch (Exception e){ log.error("",e); } + t.setTaskStatus(2); + this.baseMapper.updateById(t); } - t.setTaskStatus(2); - this.baseMapper.updateById(t); + } } diff --git a/src/main/java/com/sa/zentao/utils/KanBanConstant.java b/src/main/java/com/sa/zentao/utils/KanBanConstant.java index 132a69d..21af141 100644 --- a/src/main/java/com/sa/zentao/utils/KanBanConstant.java +++ b/src/main/java/com/sa/zentao/utils/KanBanConstant.java @@ -43,7 +43,7 @@ public class KanBanConstant { // put("confirmed","已确认"); // put("resolving","解决中"); // put("fixing","进行中"); - put("fixed","完成"); + put("fixed","已解决"); // put("test","测试"); // put("testing","测试中"); // put("tested","测试完毕"); diff --git a/src/main/resources/mapper/ZtBugMapper.xml b/src/main/resources/mapper/ZtBugMapper.xml index 13915e0..652c1d9 100644 --- a/src/main/resources/mapper/ZtBugMapper.xml +++ b/src/main/resources/mapper/ZtBugMapper.xml @@ -73,6 +73,9 @@ and project =#{qo.project} + + and bug_type =#{qo.bugType} + and id = #{qo.id} diff --git a/src/main/resources/mapper/ZtComputerSourceMapper.xml b/src/main/resources/mapper/ZtComputerSourceMapper.xml new file mode 100644 index 0000000..071d819 --- /dev/null +++ b/src/main/resources/mapper/ZtComputerSourceMapper.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/mapper/ZtMeetingMapper.xml b/src/main/resources/mapper/ZtMeetingMapper.xml index 26db9e7..92de9a9 100644 --- a/src/main/resources/mapper/ZtMeetingMapper.xml +++ b/src/main/resources/mapper/ZtMeetingMapper.xml @@ -17,8 +17,8 @@ + + + + + + diff --git a/src/main/resources/mapper/ZtUserMapper.xml b/src/main/resources/mapper/ZtUserMapper.xml index 442b6ed..3afdda7 100644 --- a/src/main/resources/mapper/ZtUserMapper.xml +++ b/src/main/resources/mapper/ZtUserMapper.xml @@ -55,6 +55,7 @@ or account like concat('%', #{qo.account}, '%') or pinyin like concat('%', #{qo.account}, '%') + and deleted = '0' order by id desc @@ -82,5 +83,13 @@ GROUP BY date_str,u.account + +