From 607da4dfea884f73c0620d723a11d686340373ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=AD=E5=85=B6=E5=85=B5?= Date: Tue, 22 Apr 2025 16:01:17 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E7=89=88=E7=BB=A9=E6=95=88=E8=80=83?= =?UTF-8?q?=E6=A0=B8=E6=96=B9=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sa/zentao/conf/CodeGenerator.java | 2 +- .../com/sa/zentao/conf/LoginRiskUser.java | 5 +- .../com/sa/zentao/conf/ParamOutAspect.java | 12 +- .../sa/zentao/conf/RiskUserThreadLocal.java | 10 +- .../zentao/controller/BaseMenuController.java | 119 ++ .../zentao/controller/BaseRoleController.java | 151 +++ .../controller/BaseUserRoleController.java | 20 + .../zentao/controller/ZtCountController.java | 5 +- .../controller/ZtProjectController.java | 4 + .../controller/ZtStoryFeedbackController.java | 4 +- .../controller/ZtStoryUserController.java | 8 + .../controller/ZtStoryUserspecController.java | 20 + .../zentao/controller/ZtUserController.java | 77 +- .../java/com/sa/zentao/dao/BaseMenuDTO.java | 71 ++ .../java/com/sa/zentao/dao/BaseRoleDTO.java | 79 ++ .../com/sa/zentao/dao/PerformanceDTO.java | 19 +- .../sa/zentao/dao/ZtComputerSourceDTO.java | 1 + .../java/com/sa/zentao/dao/ZtMeetingDTO.java | 3 +- .../java/com/sa/zentao/dao/ZtReleaseDTO.java | 2 + .../java/com/sa/zentao/dao/ZtStoryDTO.java | 2 +- .../com/sa/zentao/dao/ZtStoryFeedbackDTO.java | 4 + .../java/com/sa/zentao/dao/ZtUserDTO.java | 5 + .../java/com/sa/zentao/entity/BaseMenu.java | 70 ++ .../java/com/sa/zentao/entity/BaseRole.java | 64 + .../sa/zentao/entity/BaseRoleAuthority.java | 57 + .../com/sa/zentao/entity/BaseUserRole.java | 41 + .../com/sa/zentao/entity/ZtActionrecent.java | 4 +- src/main/java/com/sa/zentao/entity/ZtBug.java | 3 +- .../sa/zentao/entity/ZtComputerSource.java | 2 +- .../java/com/sa/zentao/entity/ZtMeeting.java | 4 +- .../java/com/sa/zentao/entity/ZtRelease.java | 4 +- .../com/sa/zentao/entity/ZtStoryFeedback.java | 2 +- .../com/sa/zentao/entity/ZtStoryUserspec.java | 35 + .../com/sa/zentao/enums/ActionStatus.java | 2 +- .../sa/zentao/enums/BaseMenuLevelEnum.java | 31 + .../java/com/sa/zentao/enums/PickEnum.java | 30 + .../com/sa/zentao/enums/UserStoryEnums.java | 2 +- .../java/com/sa/zentao/enums/UserType.java | 5 +- .../com/sa/zentao/mapper/BaseMenuMapper.java | 30 + .../mapper/BaseRoleAuthorityMapper.java | 25 + .../com/sa/zentao/mapper/BaseRoleMapper.java | 24 + .../sa/zentao/mapper/BaseUserRoleMapper.java | 20 + .../zentao/mapper/ZtStoryUserspecMapper.java | 16 + .../java/com/sa/zentao/qo/BaseMenuQo.java | 58 + .../java/com/sa/zentao/qo/BaseRoleQo.java | 60 + .../sa/zentao/service/IBaseMenuService.java | 36 + .../service/IBaseRoleAuthorityService.java | 18 + .../sa/zentao/service/IBaseRoleService.java | 35 + .../zentao/service/IBaseUserRoleService.java | 21 + .../service/IZtStoryFeedbackService.java | 4 +- .../service/IZtStoryUserspecService.java | 16 + .../com/sa/zentao/service/IZtTaskService.java | 8 + .../com/sa/zentao/service/IZtUserService.java | 4 + .../service/impl/BaseMenuServiceImpl.java | 209 ++++ .../impl/BaseRoleAuthorityServiceImpl.java | 25 + .../service/impl/BaseRoleServiceImpl.java | 147 +++ .../service/impl/BaseUserRoleServiceImpl.java | 69 ++ .../zentao/service/impl/IZtCountService.java | 1058 +++++++++++++++-- .../service/impl/ZtMeetingServiceImpl.java | 45 +- .../service/impl/ZtProjectServiceImpl.java | 140 +-- .../service/impl/ZtReleaseServiceImpl.java | 106 +- .../impl/ZtStoryFeedbackServiceImpl.java | 24 +- .../service/impl/ZtStoryServiceImpl.java | 14 +- .../service/impl/ZtStoryUserServiceImpl.java | 155 ++- .../impl/ZtStoryUserTaskServiceImpl.java | 2 +- .../impl/ZtStoryUserspecServiceImpl.java | 20 + .../service/impl/ZtTaskServiceImpl.java | 21 +- .../service/impl/ZtUserServiceImpl.java | 151 ++- .../com/sa/zentao/utils/BigDecimalUtils.java | 21 + .../java/com/sa/zentao/utils/DateUtils.java | 66 +- .../java/com/sa/zentao/utils/ExcelUtil.java | 7 +- .../java/com/sa/zentao/utils/SendEmail.java | 2 + .../java/com/sa/zentao/utils/TreeUtils.java | 51 + src/main/resources/mapper/BaseMenuMapper.xml | 49 + .../mapper/BaseRoleAuthorityMapper.xml | 45 + src/main/resources/mapper/BaseRoleMapper.xml | 26 + .../resources/mapper/BaseUserRoleMapper.xml | 12 + src/main/resources/mapper/ZtMeetingMapper.xml | 4 +- .../mapper/ZtStoryFeedbackMapper.xml | 12 +- .../mapper/ZtStoryUserspecMapper.xml | 13 + .../resources/templates/scope/UI工程师.xlsx | Bin 0 -> 12677 bytes .../resources/templates/scope/开发工程师.xlsx | Bin 0 -> 13196 bytes .../resources/templates/scope/测试工程师.xlsx | Bin 0 -> 13152 bytes .../templates/scope/项目助理考核.xlsx | Bin 0 -> 12403 bytes .../templates/scope/项目经理考核.xlsx | Bin 0 -> 13983 bytes 85 files changed, 3415 insertions(+), 433 deletions(-) create mode 100644 src/main/java/com/sa/zentao/controller/BaseMenuController.java create mode 100644 src/main/java/com/sa/zentao/controller/BaseRoleController.java create mode 100644 src/main/java/com/sa/zentao/controller/BaseUserRoleController.java create mode 100644 src/main/java/com/sa/zentao/controller/ZtStoryUserspecController.java create mode 100644 src/main/java/com/sa/zentao/dao/BaseMenuDTO.java create mode 100644 src/main/java/com/sa/zentao/dao/BaseRoleDTO.java create mode 100644 src/main/java/com/sa/zentao/entity/BaseMenu.java create mode 100644 src/main/java/com/sa/zentao/entity/BaseRole.java create mode 100644 src/main/java/com/sa/zentao/entity/BaseRoleAuthority.java create mode 100644 src/main/java/com/sa/zentao/entity/BaseUserRole.java create mode 100644 src/main/java/com/sa/zentao/entity/ZtStoryUserspec.java create mode 100644 src/main/java/com/sa/zentao/enums/BaseMenuLevelEnum.java create mode 100644 src/main/java/com/sa/zentao/enums/PickEnum.java create mode 100644 src/main/java/com/sa/zentao/mapper/BaseMenuMapper.java create mode 100644 src/main/java/com/sa/zentao/mapper/BaseRoleAuthorityMapper.java create mode 100644 src/main/java/com/sa/zentao/mapper/BaseRoleMapper.java create mode 100644 src/main/java/com/sa/zentao/mapper/BaseUserRoleMapper.java create mode 100644 src/main/java/com/sa/zentao/mapper/ZtStoryUserspecMapper.java create mode 100644 src/main/java/com/sa/zentao/qo/BaseMenuQo.java create mode 100644 src/main/java/com/sa/zentao/qo/BaseRoleQo.java create mode 100644 src/main/java/com/sa/zentao/service/IBaseMenuService.java create mode 100644 src/main/java/com/sa/zentao/service/IBaseRoleAuthorityService.java create mode 100644 src/main/java/com/sa/zentao/service/IBaseRoleService.java create mode 100644 src/main/java/com/sa/zentao/service/IBaseUserRoleService.java create mode 100644 src/main/java/com/sa/zentao/service/IZtStoryUserspecService.java create mode 100644 src/main/java/com/sa/zentao/service/impl/BaseMenuServiceImpl.java create mode 100644 src/main/java/com/sa/zentao/service/impl/BaseRoleAuthorityServiceImpl.java create mode 100644 src/main/java/com/sa/zentao/service/impl/BaseRoleServiceImpl.java create mode 100644 src/main/java/com/sa/zentao/service/impl/BaseUserRoleServiceImpl.java create mode 100644 src/main/java/com/sa/zentao/service/impl/ZtStoryUserspecServiceImpl.java create mode 100644 src/main/java/com/sa/zentao/utils/BigDecimalUtils.java create mode 100644 src/main/java/com/sa/zentao/utils/TreeUtils.java create mode 100644 src/main/resources/mapper/BaseMenuMapper.xml create mode 100644 src/main/resources/mapper/BaseRoleAuthorityMapper.xml create mode 100644 src/main/resources/mapper/BaseRoleMapper.xml create mode 100644 src/main/resources/mapper/BaseUserRoleMapper.xml create mode 100644 src/main/resources/mapper/ZtStoryUserspecMapper.xml create mode 100644 src/main/resources/templates/scope/UI工程师.xlsx create mode 100644 src/main/resources/templates/scope/开发工程师.xlsx create mode 100644 src/main/resources/templates/scope/测试工程师.xlsx create mode 100644 src/main/resources/templates/scope/项目助理考核.xlsx create mode 100644 src/main/resources/templates/scope/项目经理考核.xlsx diff --git a/src/main/java/com/sa/zentao/conf/CodeGenerator.java b/src/main/java/com/sa/zentao/conf/CodeGenerator.java index ad189b3..e2c59fb 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_computer_source"; + public static String tableName = "base_user_role"; /** *

diff --git a/src/main/java/com/sa/zentao/conf/LoginRiskUser.java b/src/main/java/com/sa/zentao/conf/LoginRiskUser.java index 57a7f97..1987f58 100644 --- a/src/main/java/com/sa/zentao/conf/LoginRiskUser.java +++ b/src/main/java/com/sa/zentao/conf/LoginRiskUser.java @@ -76,10 +76,11 @@ public class LoginRiskUser implements Serializable { * 联系电话 */ private String contactTel; + //用户属性 private UserType userType; - public int getRiskUserId(){ + public String getRiskUserId(){ - return userId; + return name; } } diff --git a/src/main/java/com/sa/zentao/conf/ParamOutAspect.java b/src/main/java/com/sa/zentao/conf/ParamOutAspect.java index dc6dc6d..04fec5f 100644 --- a/src/main/java/com/sa/zentao/conf/ParamOutAspect.java +++ b/src/main/java/com/sa/zentao/conf/ParamOutAspect.java @@ -95,9 +95,17 @@ public class ParamOutAspect { // } // } - //17462126 + //17462126 proceed,proceed==null?null:proceed.toString().length() + try { + int length = proceed==null?null:proceed.toString().length(); //分页日志太多不打印 + if(length<59591){ + log.info("[AOP-LOG-END-返回 ]\n\t{} {} size=", proceed,proceed==null?null:proceed.toString().length()); + } + }catch (Exception e){ + + } + - log.info("[AOP-LOG-END-返回 ]\n\t{} {} size=", proceed,proceed==null?null:proceed.toString().length()); return proceed; } diff --git a/src/main/java/com/sa/zentao/conf/RiskUserThreadLocal.java b/src/main/java/com/sa/zentao/conf/RiskUserThreadLocal.java index f3f7726..eaee7bd 100644 --- a/src/main/java/com/sa/zentao/conf/RiskUserThreadLocal.java +++ b/src/main/java/com/sa/zentao/conf/RiskUserThreadLocal.java @@ -37,11 +37,11 @@ public class RiskUserThreadLocal { if(loginRiskUser==null){ return false; } - if(loginRiskUser.getRiskUserId()==2){ - return true; - }else{ - return false; - } + if("admin".equals(loginRiskUser.getAccount())){ + return true; + }else{ + return false; + } } } diff --git a/src/main/java/com/sa/zentao/controller/BaseMenuController.java b/src/main/java/com/sa/zentao/controller/BaseMenuController.java new file mode 100644 index 0000000..db01529 --- /dev/null +++ b/src/main/java/com/sa/zentao/controller/BaseMenuController.java @@ -0,0 +1,119 @@ +package com.sa.zentao.controller; + + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.sa.zentao.conf.LoginRiskUser; +import com.sa.zentao.conf.RiskUserThreadLocal; +import com.sa.zentao.dao.BusinessException; +import com.sa.zentao.dao.Result; +import com.sa.zentao.entity.BaseMenu; +import com.sa.zentao.entity.BaseRoleAuthority; +import com.sa.zentao.qo.BaseMenuQo; +import com.sa.zentao.service.IBaseMenuService; +import com.sa.zentao.service.IBaseRoleAuthorityService; +import com.sa.zentao.service.IBaseRoleService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.stream.Collectors; + +/** + *

+ * 前端控制器 + *

+ * + * @author jobob + * @since 2021-05-28 + */ +@Slf4j +@RestController +@RequestMapping("/base-menu") +public class BaseMenuController { + + @Autowired + private IBaseMenuService baseMenuService; + + @Autowired + private IBaseRoleAuthorityService baseRoleAuthorityService; + + @Autowired + private IBaseRoleService baseRoleService; + + + @RequestMapping("/insertMenu") + public Result insertMenu(@RequestBody BaseMenuQo vo){ + log.info("--- 新增菜单 param --{}", JSON.toJSONString(vo)); + LoginRiskUser loginRiskUser = RiskUserThreadLocal.risk.get(); + return Result.success(baseMenuService.saveMenu(vo,loginRiskUser)); + } + @RequestMapping("/getInfoById") + public Result getInfoById(@RequestParam("id") Integer id){ + log.info("--- 通过ID获取菜单信息 param --{}", id); + return Result.success(baseMenuService.selectById(id)); + } + @RequestMapping("/updateMenu") + public Result updateMenu(@RequestBody BaseMenuQo vo){ + log.info("--- 修改菜单 param --{}", JSON.toJSONString(vo)); + LoginRiskUser loginRiskUser = RiskUserThreadLocal.risk.get(); + return Result.success(baseMenuService.saveMenu(vo, loginRiskUser)); + } + + @RequestMapping("/deleteMenu") + public Result deleteMenu(@RequestParam("id") Integer id){ + log.info("--- 删除菜单 param --{}", id); + LoginRiskUser loginRiskUser = RiskUserThreadLocal.risk.get(); + return Result.success(baseMenuService.deleteMenu(id,loginRiskUser)); + } + + @RequestMapping("/moveUp") + public Result moveUp(@RequestParam("id") Integer id){ + log.info("--- 上移菜单 param --{}", id); + return Result.success(baseMenuService.moveUp(id)); + } + + @RequestMapping("/moveDown") + public Result moveDown(@RequestParam("id") Integer id){ + log.info("--- 下移菜单 param --{}", id); + return Result.success(baseMenuService.moveDown(id)); + } + + + @PostMapping("/menuTree") + public Result menuTree(){ + log.info("--- Tree param --{}"); + List list = baseMenuService.list(); + LoginRiskUser loginRiskUser = RiskUserThreadLocal.risk.get(); + if(loginRiskUser==null){ + throw new BusinessException("未登录"); + } +// if(loginRiskUser.getUserId()==1){ +// return Result.success(list); +// } + return Result.success(baseMenuService.menuTree(loginRiskUser)); + } + + @GetMapping("/baseMenuTree") + public Result baseMenuTree(){ + return Result.success(baseMenuService.baseMenuTree()); + } + + @GetMapping("/roleMenuIds") + public Result roleMenuIds(@RequestParam("roleId") Long roleId){ + log.info("--- Tree param --{}"); + List list = baseMenuService.list(); + LoginRiskUser loginRiskUser = RiskUserThreadLocal.risk.get(); + if(loginRiskUser==null){ + throw new BusinessException("未登录"); + } + + List listAuth = baseRoleAuthorityService.list(new QueryWrapper().lambda().eq(BaseRoleAuthority::getRoleId, roleId)); + + + return Result.success(listAuth.stream().map(o->o.getMenuId()).collect(Collectors.toList())); + } + + +} diff --git a/src/main/java/com/sa/zentao/controller/BaseRoleController.java b/src/main/java/com/sa/zentao/controller/BaseRoleController.java new file mode 100644 index 0000000..f1beb25 --- /dev/null +++ b/src/main/java/com/sa/zentao/controller/BaseRoleController.java @@ -0,0 +1,151 @@ +package com.sa.zentao.controller; + + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.github.pagehelper.PageInfo; +import com.sa.zentao.conf.LoginRiskUser; +import com.sa.zentao.conf.RiskUserThreadLocal; +import com.sa.zentao.dao.BaseRoleDTO; +import com.sa.zentao.dao.BusinessException; +import com.sa.zentao.dao.Result; +import com.sa.zentao.entity.BaseRole; +import com.sa.zentao.qo.BaseRoleQo; +import com.sa.zentao.service.IBaseRoleService; +import lombok.extern.slf4j.Slf4j; +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.RestController; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.Objects; + +/** + *

+ * 前端控制器 + *

+ * + * @author jobob + * @since 2021-05-28 + */ +@Slf4j +@RestController +@RequestMapping("/base-role") +public class BaseRoleController { + + + @Autowired + private IBaseRoleService baseRoleService; + + /** + * 新增 + */ + @RequestMapping("add") + public Result add(@RequestBody BaseRoleDTO baseRoleDTO) { + LoginRiskUser loginRiskUser = RiskUserThreadLocal.risk.get(); + log.info("新增角色 --{},操作人--{}", JSON.toJSONString(baseRoleDTO), JSON.toJSONString(loginRiskUser)); + if (Objects.isNull(loginRiskUser)){ + throw new BusinessException("未登录"); + } + ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + jakarta.servlet.http.HttpServletRequest request = servletRequestAttributes.getRequest(); + + BaseRole oldName = baseRoleService.getOne(new QueryWrapper().eq("name", baseRoleDTO.getName())); + + if (oldName != null) { + throw new BusinessException("重复"); + } + + baseRoleService.add(baseRoleDTO); + + return Result.success(); + } + + + /** + * 删除 + */ + @RequestMapping("delete") + public Result delete(@RequestBody BaseRoleQo baseRoleVo) { + LoginRiskUser loginRiskUser = RiskUserThreadLocal.risk.get(); + if (Objects.isNull(loginRiskUser)){ + throw new BusinessException("未登录"); + } + ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + + if (baseRoleVo.getRoleId()==null) { + throw new BusinessException("当前不存在"); + } + BaseRole baseRole = baseRoleService.getById(baseRoleVo.getRoleId()); + log.info("删除角色 --{},操作人--{}", JSON.toJSONString(baseRole), JSON.toJSONString(loginRiskUser)); + baseRoleService.delete(baseRole,baseRoleVo); + + return Result.success(); + } + + /** + * 修改 + */ + @RequestMapping("modify") + public Result modify(@RequestBody BaseRoleDTO baseRoleDTO) { + LoginRiskUser loginRiskUser = RiskUserThreadLocal.risk.get(); + log.info("修改角色 --{},操作人--{}", JSON.toJSONString(baseRoleDTO), JSON.toJSONString(loginRiskUser)); + if (Objects.isNull(loginRiskUser)){ + throw new BusinessException("请登录"); + } + ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + + + BaseRole oldName = baseRoleService.getOne(new QueryWrapper().eq("name", baseRoleDTO.getName())); + + BaseRole baseRole = baseRoleService.getById(baseRoleDTO.getId()); + if (Objects.nonNull(oldName) && !Objects.equals(oldName.getId(),baseRole.getId())){ + throw new BusinessException("数据重复"); + } + baseRoleService.modify(baseRoleDTO, baseRole); + + return Result.success(); + } + + /** + * 角色列表 + */ + @RequestMapping("/pageList") + public Result> pageList(@RequestBody BaseRoleQo vo){ + log.info("--- 用户列表 param --{}", JSON.toJSONString(vo)); + LoginRiskUser loginRiskUser = RiskUserThreadLocal.risk.get(); + if (Objects.isNull(loginRiskUser)){ + throw new BusinessException("请登录"); + } + PageInfo list = baseRoleService.selectPageList(vo); + return Result.success(list); + } + + /** + * 根据角色id查询对应信息 + * @return + */ + @RequestMapping("/getInfoById") + public Result getInfoById(Integer id){ + log.info("--- 据角色id查询对应信息 param --{}", JSON.toJSONString(id)); + BaseRoleDTO baseRoleDTO = baseRoleService.getInfoById(id); + return Result.success(baseRoleDTO); + } + + /** + * 根据角色id查询对应信息 + * @return + */ + @RequestMapping("/getUserRoleIds") + public Result getUserRoleIds(@RequestBody BaseRoleQo vo ){ + List userRoles= baseRoleService.getUserRoleIds(vo.getAccount()); + return Result.success(userRoles); + } + + + +} diff --git a/src/main/java/com/sa/zentao/controller/BaseUserRoleController.java b/src/main/java/com/sa/zentao/controller/BaseUserRoleController.java new file mode 100644 index 0000000..9e092bb --- /dev/null +++ b/src/main/java/com/sa/zentao/controller/BaseUserRoleController.java @@ -0,0 +1,20 @@ +package com.sa.zentao.controller; + + +import org.springframework.web.bind.annotation.RequestMapping; + +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 前端控制器 + *

+ * + * @author gqb + * @since 2025-04-16 + */ +@RestController +@RequestMapping("/base-user-role") +public class BaseUserRoleController { + +} diff --git a/src/main/java/com/sa/zentao/controller/ZtCountController.java b/src/main/java/com/sa/zentao/controller/ZtCountController.java index cc72bc6..0f5e3de 100644 --- a/src/main/java/com/sa/zentao/controller/ZtCountController.java +++ b/src/main/java/com/sa/zentao/controller/ZtCountController.java @@ -20,6 +20,7 @@ import jakarta.servlet.http.HttpServletResponse; import lombok.SneakyThrows; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -133,7 +134,9 @@ public class ZtCountController { public Result projectListAsc(@RequestBody ZtCaseDTO dto){ List authList = this.projectService.authList(); - + if(CollectionUtils.isEmpty(authList)){ + return Result.success() ; + } List project = projectService.list(new QueryWrapper().lambda().eq(ZtProject::getType, "program") .in(ZtProject::getId,authList) .eq(ZtProject::getStatus,"doing") diff --git a/src/main/java/com/sa/zentao/controller/ZtProjectController.java b/src/main/java/com/sa/zentao/controller/ZtProjectController.java index f9322fb..af3bc50 100644 --- a/src/main/java/com/sa/zentao/controller/ZtProjectController.java +++ b/src/main/java/com/sa/zentao/controller/ZtProjectController.java @@ -13,6 +13,7 @@ import com.sa.zentao.service.IZtKanbancolumnService; import com.sa.zentao.service.IZtKanbanlaneService; import com.sa.zentao.service.IZtProductService; import com.sa.zentao.service.IZtProjectService; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.RequestBody; @@ -22,7 +23,9 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** *

@@ -34,6 +37,7 @@ import java.util.List; */ @RestController @RequestMapping("/zt-project") +@Slf4j public class ZtProjectController { @Autowired diff --git a/src/main/java/com/sa/zentao/controller/ZtStoryFeedbackController.java b/src/main/java/com/sa/zentao/controller/ZtStoryFeedbackController.java index af31a44..b59c2fe 100644 --- a/src/main/java/com/sa/zentao/controller/ZtStoryFeedbackController.java +++ b/src/main/java/com/sa/zentao/controller/ZtStoryFeedbackController.java @@ -105,14 +105,14 @@ public class ZtStoryFeedbackController { //提交验收 @RequestMapping(value = "/submitVerified", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") - public Result submitVerified(@RequestBody ZtStoryDTO dto){ + public Result submitVerified(@RequestBody ZtStoryFeedbackDTO dto){ storyFeedbackService.submitVerified(dto); return Result.success(); } //提交验收 @RequestMapping(value = "/storyYs", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") - public Result storyYs(@RequestBody ZtStoryDTO dto){ + public Result storyYs(@RequestBody ZtStoryFeedbackDTO dto){ storyFeedbackService.storyYs(dto); return Result.success(); } diff --git a/src/main/java/com/sa/zentao/controller/ZtStoryUserController.java b/src/main/java/com/sa/zentao/controller/ZtStoryUserController.java index 4131a7c..d57146b 100644 --- a/src/main/java/com/sa/zentao/controller/ZtStoryUserController.java +++ b/src/main/java/com/sa/zentao/controller/ZtStoryUserController.java @@ -7,11 +7,13 @@ import com.github.pagehelper.PageInfo; import com.sa.zentao.dao.Result; import com.sa.zentao.dao.ZtStoryDTO; import com.sa.zentao.dao.ZtStoryUserDTO; +import com.sa.zentao.entity.ZtStory; import com.sa.zentao.entity.ZtStoryUser; import com.sa.zentao.enums.UserStoryEnums; import com.sa.zentao.qo.StoryQo; import com.sa.zentao.qo.ZtProjectQo; import com.sa.zentao.service.IZtStoryUserService; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -23,6 +25,7 @@ import org.springframework.web.bind.annotation.RestController; import java.util.Arrays; import java.util.List; +import java.util.Map; /** *

@@ -34,6 +37,7 @@ import java.util.List; */ @RestController @RequestMapping("/zt-story-user") +@Slf4j public class ZtStoryUserController { @Autowired @@ -68,7 +72,11 @@ public class ZtStoryUserController { @RequestMapping(value = "/pageList", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") public Result pageList(@RequestBody StoryQo qo){ + Long l = System.currentTimeMillis(); + Long l2 = System.currentTimeMillis(); + PageInfo p = storyUserService.pageList(qo); + log.info("总耗时---------------------------------- {}",l2-l); return Result.success(p); } diff --git a/src/main/java/com/sa/zentao/controller/ZtStoryUserspecController.java b/src/main/java/com/sa/zentao/controller/ZtStoryUserspecController.java new file mode 100644 index 0000000..9b8b859 --- /dev/null +++ b/src/main/java/com/sa/zentao/controller/ZtStoryUserspecController.java @@ -0,0 +1,20 @@ +package com.sa.zentao.controller; + + +import org.springframework.web.bind.annotation.RequestMapping; + +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 前端控制器 + *

+ * + * @author gqb + * @since 2025-04-15 + */ +@RestController +@RequestMapping("/zt-story-userspec") +public class ZtStoryUserspecController { + +} diff --git a/src/main/java/com/sa/zentao/controller/ZtUserController.java b/src/main/java/com/sa/zentao/controller/ZtUserController.java index 0a72984..bdeaf2c 100644 --- a/src/main/java/com/sa/zentao/controller/ZtUserController.java +++ b/src/main/java/com/sa/zentao/controller/ZtUserController.java @@ -24,6 +24,7 @@ import com.tencentcloudapi.common.exception.TencentCloudSDKException; import com.tencentcloudapi.sms.v20190711.SmsClient; import com.tencentcloudapi.sms.v20190711.models.SendSmsRequest; import com.tencentcloudapi.sms.v20190711.models.SendSmsResponse; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -49,6 +50,7 @@ import java.util.stream.Collectors; */ @RestController @RequestMapping("/zt-user") +@Slf4j public class ZtUserController { @Autowired @@ -177,24 +179,8 @@ public class ZtUserController { @RequestMapping(value = "/add", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") public Result add(@RequestBody ZtUserDTO user){ - ZtUser login = userService.getOne(new QueryWrapper().lambda().eq(ZtUser::getAccount, user.getAccount())); - if(login!=null){ - throw new BusinessException("存在"); - } - ZtUser ztUser = new ZtUser(); - BeanUtils.copyProperties(user,ztUser); - List productList = user.getProductList(); - if(!CollectionUtils.isEmpty(productList)){ - ztUser.setProductIds(StringUtils.join(productList,",")); - } - ztUser.setPinyin(ChineseUtil.getFirst(ztUser.getNickname())); - if(!StringUtils.isEmpty(ztUser.getVx())){ - ztUser.setVx(CryptoUtils.aesEncryptForFront(ztUser.getVx(), CryptoUtils.KEY_DES)); - } - - this.userService.save(ztUser); - this.actionService.addAction(ActionType.USER, ActionStatus.XJ,ztUser.getId(),null,null,null, RiskUserThreadLocal.get().getName(),null,ztUser.getAccount()); + userService.addUser(user); return Result.success(); } @@ -234,53 +220,24 @@ public class ZtUserController { @RequestMapping(value = "/modify", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") public Result modify(@RequestBody ZtUserDTO user){ - ZtUser ztUser = userService.getById(user.getId()); + userService.modifyUser(user); - if(ztUser==null){ - throw new BusinessException("不存在"); - } - List list = userService.list(new QueryWrapper().lambda().eq(ZtUser::getAccount, user.getAccount()) - .ne(ZtUser::getId, user.getId()) - ); - - if(!CollectionUtils.isEmpty(list)){ - throw new BusinessException("请检查用户"); - } - if(!ztUser.getNickname().equals(user.getNickname())){ - ztUser.setPinyin(ChineseUtil.getFirst(ztUser.getNickname())); - } - - if(!StringUtils.isEmpty(user.getVx())){ - ztUser.setVx(CryptoUtils.aesEncryptForFront(user.getVx(), CryptoUtils.KEY_DES)); - } - - ztUser.setAccount(user.getAccount()); - - ztUser.setPassword(user.getPassword()); - ztUser.setUserType(user.getUserType()); - ztUser.setEmail(user.getEmail()); - ztUser.setPhone(user.getPhone()); - if(!CollectionUtils.isEmpty(user.getProductList())){ - ztUser.setProductIds(StringUtils.join(user.getProductList(),",")); - } - ztUser.setNickname(user.getNickname()); - ztUser.setColor(user.getColor()); - ztUser.setDeptName(user.getDeptName()); - this.userService.updateById(ztUser); -// this.userService.update(new UpdateWrapper().lambda() -// .set(ZtUser::getPassword,user.getPassword()) -// .set(ZtUser::getUserType,user.getUserType()) -// .set(ZtUser::getEmail,user.getEmail()) -// .set(ZtUser::getProductIds,ztUser.getProductIds()) -// .set(ZtUser::getColor,user.getColor()) -// .set(ZtUser::getPhone,user.getPhone()) -// .set(ZtUser::getNickname,user.getNickname()) -// .eq(ZtUser::getId,ztUser.getId()) -// ); - this.actionService.addAction(ActionType.USER, ActionStatus.BJ,ztUser.getId(),null,null,null,RiskUserThreadLocal.get().getName(),null,user.getAccount()); return Result.success(); } + @RequestMapping(value = "/updateVx", method = RequestMethod.GET, produces = "application/json; charset=UTF-8") + public Result updateVx(){ + List list = this.userService.list(); + for (ZtUser u:list) { + if(!StringUtils.isEmpty(u.getVx())){ + u.setVx(CryptoUtils.aesEncryptForFront(u.getVx(), CryptoUtils.KEY_DES)); + } + + } + userService.saveOrUpdateBatch(list); + log.info("",list); + return Result.success(); + } } diff --git a/src/main/java/com/sa/zentao/dao/BaseMenuDTO.java b/src/main/java/com/sa/zentao/dao/BaseMenuDTO.java new file mode 100644 index 0000000..0c07d61 --- /dev/null +++ b/src/main/java/com/sa/zentao/dao/BaseMenuDTO.java @@ -0,0 +1,71 @@ +package com.sa.zentao.dao; + +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @author jiangheng + * @CreateDate in 2021/5/28 16:10 + */ +@Data +public class BaseMenuDTO implements Serializable { + + private static final long serialVersionUID = 1L; + /** + * 主键 + */ + private Integer id; + + /** + * 父id + */ + private Integer parentId; + + /** + * 名称 + */ + private String name; + /** + * 路径 + */ + private String action; + /** + * 排序 + */ + private Integer sort; + + private Integer isSys; + /** + * 样式 + */ + private String icon; + + /** + * 更新时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 级别 1父菜单 2子菜单 3按钮 + */ + private Integer level; + private Integer menuType; + + private List menuList; + + public void add(BaseMenuDTO t) { + if (menuList == null) { + menuList = new ArrayList<>(); + } + menuList.add(t); + } +} diff --git a/src/main/java/com/sa/zentao/dao/BaseRoleDTO.java b/src/main/java/com/sa/zentao/dao/BaseRoleDTO.java new file mode 100644 index 0000000..d5df23a --- /dev/null +++ b/src/main/java/com/sa/zentao/dao/BaseRoleDTO.java @@ -0,0 +1,79 @@ +package com.sa.zentao.dao; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author jobob + * @since 2021-05-28 + */ +@Data +public class BaseRoleDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 名称 + */ + private String name; + + private Integer roleType; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 角色备注 + */ + private String remark; + + /** + * 1删除 0有效 + */ + private Integer deleteFlag; + + /** + * 创建时间 + */ + private String createUser; + + /** + * 更新时间 + */ + private String updateUser; + + +// private List listMenu; + + + /** + * 全选菜单id + */ + private String allPickMenuIds; + + /** + * 半选菜单id + */ + private String halfPickMenuIds; + + private Integer menuType; + +} diff --git a/src/main/java/com/sa/zentao/dao/PerformanceDTO.java b/src/main/java/com/sa/zentao/dao/PerformanceDTO.java index 670cc9e..f2d232d 100644 --- a/src/main/java/com/sa/zentao/dao/PerformanceDTO.java +++ b/src/main/java/com/sa/zentao/dao/PerformanceDTO.java @@ -23,6 +23,16 @@ public class PerformanceDTO implements Serializable { // 小时 @ExcelIgnore private BigDecimal approvalDays; + //发布验收绩效 + @ExcelIgnore + private BigDecimal releaseScore=BigDecimal.ZERO; + //会议绩效 + @ExcelIgnore + private BigDecimal meetScore=BigDecimal.ZERO; + + //拆分任务工时 + @ExcelIgnore + private BigDecimal splitTimeScore=BigDecimal.ZERO; //实际产出工时 @ExcelProperty(value = "可用工时",index =3) private BigDecimal totalTime; @@ -47,15 +57,20 @@ public class PerformanceDTO implements Serializable { @ExcelProperty(value = "完成准时率 ",index =11) private BigDecimal finishPunctuality; @ExcelProperty(value = "准时率得分 ",index =12) - private BigDecimal punctualityScore; + private BigDecimal punctualityScore=BigDecimal.ZERO; @ExcelProperty(value = "线上严重bug ",index =13) private BigDecimal seriousBug; + //缺陷检出率 + @ExcelIgnore + private BigDecimal bugFindScore; //产出线上Bug @ExcelProperty(value = "线上普通bug ",index =14) private BigDecimal slightBug; + @ExcelIgnore + private BigDecimal bugCount=BigDecimal.ZERO; //线上Bug得分 @ExcelProperty(value = "线上Bug得分 ",index =15) - private BigDecimal bugScore; + private BigDecimal bugScore=BigDecimal.ZERO; //产出线上Bug @ExcelProperty(value = "总分 ",index =16) private BigDecimal score; diff --git a/src/main/java/com/sa/zentao/dao/ZtComputerSourceDTO.java b/src/main/java/com/sa/zentao/dao/ZtComputerSourceDTO.java index d6d0883..1d7b02b 100644 --- a/src/main/java/com/sa/zentao/dao/ZtComputerSourceDTO.java +++ b/src/main/java/com/sa/zentao/dao/ZtComputerSourceDTO.java @@ -100,5 +100,6 @@ public class ZtComputerSourceDTO implements Serializable { private Date updateDate; + private String code; } diff --git a/src/main/java/com/sa/zentao/dao/ZtMeetingDTO.java b/src/main/java/com/sa/zentao/dao/ZtMeetingDTO.java index 445fa59..735997a 100644 --- a/src/main/java/com/sa/zentao/dao/ZtMeetingDTO.java +++ b/src/main/java/com/sa/zentao/dao/ZtMeetingDTO.java @@ -71,7 +71,8 @@ public class ZtMeetingDTO implements Serializable { private String title; - private Integer userStory; private String userStoryName; + + private String storyIds; } diff --git a/src/main/java/com/sa/zentao/dao/ZtReleaseDTO.java b/src/main/java/com/sa/zentao/dao/ZtReleaseDTO.java index 3f0ce1e..5e4144b 100644 --- a/src/main/java/com/sa/zentao/dao/ZtReleaseDTO.java +++ b/src/main/java/com/sa/zentao/dao/ZtReleaseDTO.java @@ -88,6 +88,8 @@ public class ZtReleaseDTO implements Serializable { private String assignedToName; private Date releaseDate; + //真实发布时间 + private Date realReleaseDate; private String noticeTitle; diff --git a/src/main/java/com/sa/zentao/dao/ZtStoryDTO.java b/src/main/java/com/sa/zentao/dao/ZtStoryDTO.java index f98b0a9..77be092 100644 --- a/src/main/java/com/sa/zentao/dao/ZtStoryDTO.java +++ b/src/main/java/com/sa/zentao/dao/ZtStoryDTO.java @@ -141,7 +141,7 @@ public class ZtStoryDTO implements Serializable { @TableField("releasedDate") private Date releaseddate; - + private Date planYsDate; @TableField("closedBy") private String closedby; diff --git a/src/main/java/com/sa/zentao/dao/ZtStoryFeedbackDTO.java b/src/main/java/com/sa/zentao/dao/ZtStoryFeedbackDTO.java index 1c63255..73b2faa 100644 --- a/src/main/java/com/sa/zentao/dao/ZtStoryFeedbackDTO.java +++ b/src/main/java/com/sa/zentao/dao/ZtStoryFeedbackDTO.java @@ -116,4 +116,8 @@ public class ZtStoryFeedbackDTO implements Serializable { //1通过 2不通过 private Integer ysFlag; + private String desc; + // 1通过 2不通过 + private Integer revieweResult; + } diff --git a/src/main/java/com/sa/zentao/dao/ZtUserDTO.java b/src/main/java/com/sa/zentao/dao/ZtUserDTO.java index 7ca86e0..6382ae9 100644 --- a/src/main/java/com/sa/zentao/dao/ZtUserDTO.java +++ b/src/main/java/com/sa/zentao/dao/ZtUserDTO.java @@ -130,7 +130,12 @@ public class ZtUserDTO implements Serializable { private String userTypeValue; + private String roleTypeValue; + private List productList; + + private List roleList; + private String productIds; private String productNames; diff --git a/src/main/java/com/sa/zentao/entity/BaseMenu.java b/src/main/java/com/sa/zentao/entity/BaseMenu.java new file mode 100644 index 0000000..388bb0f --- /dev/null +++ b/src/main/java/com/sa/zentao/entity/BaseMenu.java @@ -0,0 +1,70 @@ +package com.sa.zentao.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author jobob + * @since 2021-05-28 + */ +@Data +public class BaseMenu implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 父id + */ + private Integer parentId; + + /** + * 名称 + */ + private String name; + /** + * 路径 + */ + private String action; + /** + * 排序 + */ + private Integer sort; + + private Integer isSys; + /** + * 样式 + */ + private String icon; + + /** + * 更新时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 级别 1父菜单 2子菜单 3按钮 + */ + private Integer level; + + // 1菜单 2.按钮 + private Integer menuType; +} diff --git a/src/main/java/com/sa/zentao/entity/BaseRole.java b/src/main/java/com/sa/zentao/entity/BaseRole.java new file mode 100644 index 0000000..6d6aa6c --- /dev/null +++ b/src/main/java/com/sa/zentao/entity/BaseRole.java @@ -0,0 +1,64 @@ +package com.sa.zentao.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author jobob + * @since 2021-05-28 + */ +@Data +public class BaseRole implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 名称 + */ + private String name; + + private Integer roleType; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 角色备注 + */ + private String remark; + + /** + * 1删除 0有效 + */ + private Integer deleteFlag; + + /** + * 创建者 + */ + private String createUser; + + /** + * 修改者 + */ + private String updateUser; + + +} diff --git a/src/main/java/com/sa/zentao/entity/BaseRoleAuthority.java b/src/main/java/com/sa/zentao/entity/BaseRoleAuthority.java new file mode 100644 index 0000000..9d5723b --- /dev/null +++ b/src/main/java/com/sa/zentao/entity/BaseRoleAuthority.java @@ -0,0 +1,57 @@ +package com.sa.zentao.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.sa.zentao.enums.PickEnum; +import lombok.Builder; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author jobob + * @since 2021-05-31 + */ +@Data +public class BaseRoleAuthority implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 角色id + */ + private Integer roleId; + + /** + * 菜单id + */ + private Integer menuId; + + /** + * 1、全选 2、半选 + */ + private PickEnum type; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + +} diff --git a/src/main/java/com/sa/zentao/entity/BaseUserRole.java b/src/main/java/com/sa/zentao/entity/BaseUserRole.java new file mode 100644 index 0000000..ca3cb08 --- /dev/null +++ b/src/main/java/com/sa/zentao/entity/BaseUserRole.java @@ -0,0 +1,41 @@ +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-16 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class BaseUserRole implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + private Integer roleId; + + /** + * 门店用户 + */ + private String userId; + + private Date createTime; + + private Date updateTime; + + +} diff --git a/src/main/java/com/sa/zentao/entity/ZtActionrecent.java b/src/main/java/com/sa/zentao/entity/ZtActionrecent.java index 1f9182a..93dbb4c 100644 --- a/src/main/java/com/sa/zentao/entity/ZtActionrecent.java +++ b/src/main/java/com/sa/zentao/entity/ZtActionrecent.java @@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.annotation.TableId; import java.time.LocalDateTime; import com.baomidou.mybatisplus.annotation.TableField; import java.io.Serializable; +import java.util.Date; + import lombok.Data; import lombok.EqualsAndHashCode; @@ -41,7 +43,7 @@ public class ZtActionrecent implements Serializable { private String action; - private LocalDateTime date; + private Date date; private String comment; diff --git a/src/main/java/com/sa/zentao/entity/ZtBug.java b/src/main/java/com/sa/zentao/entity/ZtBug.java index 781ecad..4fac4ba 100644 --- a/src/main/java/com/sa/zentao/entity/ZtBug.java +++ b/src/main/java/com/sa/zentao/entity/ZtBug.java @@ -194,13 +194,12 @@ public class ZtBug implements Serializable { private String fileUrl; - + // dev prod private String bugType; private String ysUser; //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 index 6763bfd..b658f1f 100644 --- a/src/main/java/com/sa/zentao/entity/ZtComputerSource.java +++ b/src/main/java/com/sa/zentao/entity/ZtComputerSource.java @@ -101,5 +101,5 @@ public class ZtComputerSource implements Serializable { private Date updateDate; - + private String code; } diff --git a/src/main/java/com/sa/zentao/entity/ZtMeeting.java b/src/main/java/com/sa/zentao/entity/ZtMeeting.java index e0a8289..033401e 100644 --- a/src/main/java/com/sa/zentao/entity/ZtMeeting.java +++ b/src/main/java/com/sa/zentao/entity/ZtMeeting.java @@ -66,6 +66,8 @@ public class ZtMeeting implements Serializable { private String address; private String title; - private Integer userStory; +// private Integer userStory; + + private String storyIds; } diff --git a/src/main/java/com/sa/zentao/entity/ZtRelease.java b/src/main/java/com/sa/zentao/entity/ZtRelease.java index 9366dc6..1a50cab 100644 --- a/src/main/java/com/sa/zentao/entity/ZtRelease.java +++ b/src/main/java/com/sa/zentao/entity/ZtRelease.java @@ -80,7 +80,9 @@ public class ZtRelease implements Serializable { private String executions; @TableField("`level`") private String level; - + //真实发布时间 + @TableField(exist = false) + private Date realReleaseDate; private String danger; private String assignedTo; diff --git a/src/main/java/com/sa/zentao/entity/ZtStoryFeedback.java b/src/main/java/com/sa/zentao/entity/ZtStoryFeedback.java index f2c99cb..45d422b 100644 --- a/src/main/java/com/sa/zentao/entity/ZtStoryFeedback.java +++ b/src/main/java/com/sa/zentao/entity/ZtStoryFeedback.java @@ -70,7 +70,7 @@ public class ZtStoryFeedback implements Serializable { private String spec; - // wait doing finished submitVerified 提交验收 closed reviewing verified 验收 dontHand 无需处理 + // wait doing finished submitVerified 提交验收 closed reviewing verified 验收 dontHand 无需处理 (查询用noVerified 验收不通过) private String status; diff --git a/src/main/java/com/sa/zentao/entity/ZtStoryUserspec.java b/src/main/java/com/sa/zentao/entity/ZtStoryUserspec.java new file mode 100644 index 0000000..005bdb6 --- /dev/null +++ b/src/main/java/com/sa/zentao/entity/ZtStoryUserspec.java @@ -0,0 +1,35 @@ +package com.sa.zentao.entity; + +import java.sql.Blob; +import java.io.Serializable; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * + *

+ * + * @author gqb + * @since 2025-04-15 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class ZtStoryUserspec implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer story; + + private Integer version; + + private String title; + + private String spec; + + private String verify; + + private String files; + + +} diff --git a/src/main/java/com/sa/zentao/enums/ActionStatus.java b/src/main/java/com/sa/zentao/enums/ActionStatus.java index 3dbcd12..61bafb6 100644 --- a/src/main/java/com/sa/zentao/enums/ActionStatus.java +++ b/src/main/java/com/sa/zentao/enums/ActionStatus.java @@ -12,7 +12,7 @@ public enum ActionStatus { SC(6, "deleted","删除"), JH(7, "activated","激活"), GQ(8, "suspended","挂起"), - PS(9, "submitreview","提交评审人"), + PS(9, "submitreview","提交至评审"), CX(9, "recalled","撤销评审"), WC(10, "finished","完成"), QX(11, "canceled","取消"), diff --git a/src/main/java/com/sa/zentao/enums/BaseMenuLevelEnum.java b/src/main/java/com/sa/zentao/enums/BaseMenuLevelEnum.java new file mode 100644 index 0000000..83dc434 --- /dev/null +++ b/src/main/java/com/sa/zentao/enums/BaseMenuLevelEnum.java @@ -0,0 +1,31 @@ +package com.sa.zentao.enums; + +import com.baomidou.mybatisplus.annotation.EnumValue; + +/** + * @author jiangheng + * @CreateDate in 2021/5/28 15:14 + */ +public enum BaseMenuLevelEnum { + + PARENT_MENU(1, "父菜单"), + CHILD_MENU(2,"二级子菜单"), + BUTTON(2,"按钮"); + + @EnumValue//标记数据库存的值是code + private int code; + private String value; + + BaseMenuLevelEnum(int code, String value) { + this.code = code; + this.value = value; + } + + public int getCode() { + return code; + } + + public String getValue() { + return value; + } +} diff --git a/src/main/java/com/sa/zentao/enums/PickEnum.java b/src/main/java/com/sa/zentao/enums/PickEnum.java new file mode 100644 index 0000000..2583b9a --- /dev/null +++ b/src/main/java/com/sa/zentao/enums/PickEnum.java @@ -0,0 +1,30 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by Fernflower decompiler) +// + +package com.sa.zentao.enums; + +import com.baomidou.mybatisplus.annotation.EnumValue; + +public enum PickEnum { + ALL_PICK(1, "全选"), + HALF_PICK(2, "半选"); + + @EnumValue + private int code; + private String value; + + private PickEnum(int code, String value) { + this.code = code; + this.value = value; + } + + public int getCode() { + return this.code; + } + + public String getValue() { + return this.value; + } +} diff --git a/src/main/java/com/sa/zentao/enums/UserStoryEnums.java b/src/main/java/com/sa/zentao/enums/UserStoryEnums.java index 9f08f06..a7e2429 100644 --- a/src/main/java/com/sa/zentao/enums/UserStoryEnums.java +++ b/src/main/java/com/sa/zentao/enums/UserStoryEnums.java @@ -7,7 +7,7 @@ public enum UserStoryEnums { DPS("reviewing", "待评审",0), CG("draft", "草稿",1), JH("active", "激活",2), - UNCFM("unconfirmed", "产品确认中",3), + UNCFM("unconfirmed", "需求明确中",3), DGT("waitcommunicate", "待沟通",4), DSJ("waitdesign","需求待设计",5), diff --git a/src/main/java/com/sa/zentao/enums/UserType.java b/src/main/java/com/sa/zentao/enums/UserType.java index ccbe2b2..b6ea646 100644 --- a/src/main/java/com/sa/zentao/enums/UserType.java +++ b/src/main/java/com/sa/zentao/enums/UserType.java @@ -4,12 +4,15 @@ import com.baomidou.mybatisplus.annotation.EnumValue; public enum UserType { - CP(1,"产品"), + CP(1,"需求"), XMGLY(2, "项目管理员"), KFZ(3, "开发者"), GSGC(4, "公司高层"), CS(5, "测试人员"), YW(6, "运维"), + UI(7, "UI工程师"), + XMJL(8, "项目经理"), + XMZL(9, "项目助理"), ; @EnumValue diff --git a/src/main/java/com/sa/zentao/mapper/BaseMenuMapper.java b/src/main/java/com/sa/zentao/mapper/BaseMenuMapper.java new file mode 100644 index 0000000..acf8e50 --- /dev/null +++ b/src/main/java/com/sa/zentao/mapper/BaseMenuMapper.java @@ -0,0 +1,30 @@ +package com.sa.zentao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.sa.zentao.entity.BaseMenu; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * Mapper 接口 + *

+ * + * @author jobob + * @since 2021-05-28 + */ +public interface BaseMenuMapper extends BaseMapper { + + List findAll(); + + void deleteWithChild(Integer id); + + List selectMenuByParentId(@Param("parentId") Integer parentId); + + List queryListByLoginUser(@Param("riskUserId") String riskUserId); + + List findMenuIds(Integer id); + + List queryAllList(); +} diff --git a/src/main/java/com/sa/zentao/mapper/BaseRoleAuthorityMapper.java b/src/main/java/com/sa/zentao/mapper/BaseRoleAuthorityMapper.java new file mode 100644 index 0000000..6d0a579 --- /dev/null +++ b/src/main/java/com/sa/zentao/mapper/BaseRoleAuthorityMapper.java @@ -0,0 +1,25 @@ +package com.sa.zentao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.sa.zentao.entity.BaseRoleAuthority; +import com.sa.zentao.enums.PickEnum; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * Mapper 接口 + *

+ * + * @author jobob + * @since 2021-05-31 + */ +public interface BaseRoleAuthorityMapper extends BaseMapper { + + Integer deleteByRoleId(@Param("roleId") Integer roleId); + + void deleteRoleAndMenu(@Param("roleIds") List roleIds, @Param("menuIds") List menuIds); + + String findMenuIdById(@Param("roleId") Integer id, @Param("pickEnum") PickEnum pickEnum); +} diff --git a/src/main/java/com/sa/zentao/mapper/BaseRoleMapper.java b/src/main/java/com/sa/zentao/mapper/BaseRoleMapper.java new file mode 100644 index 0000000..c2ab2aa --- /dev/null +++ b/src/main/java/com/sa/zentao/mapper/BaseRoleMapper.java @@ -0,0 +1,24 @@ +package com.sa.zentao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.sa.zentao.dao.BaseRoleDTO; +import com.sa.zentao.entity.BaseRole; +import com.sa.zentao.qo.BaseRoleQo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * Mapper 接口 + *

+ * + * @author jobob + * @since 2021-05-28 + */ +public interface BaseRoleMapper extends BaseMapper { + + List selectRoleByVo(@Param("vo") BaseRoleQo vo); + + BaseRoleDTO findRoleById(@Param("id") Integer id); +} diff --git a/src/main/java/com/sa/zentao/mapper/BaseUserRoleMapper.java b/src/main/java/com/sa/zentao/mapper/BaseUserRoleMapper.java new file mode 100644 index 0000000..cd8a92a --- /dev/null +++ b/src/main/java/com/sa/zentao/mapper/BaseUserRoleMapper.java @@ -0,0 +1,20 @@ +package com.sa.zentao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.sa.zentao.entity.BaseUserRole; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * Mapper 接口 + *

+ * + * @author jobob + * @since 2021-06-01 + */ +public interface BaseUserRoleMapper extends BaseMapper { + + void insertUserRole(@Param("id") Long id, @Param("roleId") String[] roleId); + + String getRoleIdsById(@Param("id") Long id); +} diff --git a/src/main/java/com/sa/zentao/mapper/ZtStoryUserspecMapper.java b/src/main/java/com/sa/zentao/mapper/ZtStoryUserspecMapper.java new file mode 100644 index 0000000..4b23a67 --- /dev/null +++ b/src/main/java/com/sa/zentao/mapper/ZtStoryUserspecMapper.java @@ -0,0 +1,16 @@ +package com.sa.zentao.mapper; + +import com.sa.zentao.entity.ZtStoryUserspec; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author gqb + * @since 2025-04-15 + */ +public interface ZtStoryUserspecMapper extends BaseMapper { + +} diff --git a/src/main/java/com/sa/zentao/qo/BaseMenuQo.java b/src/main/java/com/sa/zentao/qo/BaseMenuQo.java new file mode 100644 index 0000000..067afdf --- /dev/null +++ b/src/main/java/com/sa/zentao/qo/BaseMenuQo.java @@ -0,0 +1,58 @@ +package com.sa.zentao.qo; + +import lombok.Data; + +import java.util.Date; + +/** + * @author jiangheng + * @CreateDate in 2021/5/28 15:21 + */ +@Data +public class BaseMenuQo extends BaseQo { + + /** + * 主键 + */ + private Integer id; + /** + * 父id + */ + private Integer parentId; + + /** + * 名称 + */ + private String name; + /** + * 路径 + */ + private String action; + /** + * 排序 + */ + private Integer sort; + + private Integer isSys; + /** + * 样式 + */ + private String icon; + + /** + * 更新时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 级别 1父菜单 2子菜单 3按钮 + */ + private Integer level; + // 1菜单 2.按钮 + private Integer menuType; +} diff --git a/src/main/java/com/sa/zentao/qo/BaseRoleQo.java b/src/main/java/com/sa/zentao/qo/BaseRoleQo.java new file mode 100644 index 0000000..297916a --- /dev/null +++ b/src/main/java/com/sa/zentao/qo/BaseRoleQo.java @@ -0,0 +1,60 @@ +package com.sa.zentao.qo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +@Data +public class BaseRoleQo implements Serializable { + @ExcelIgnore + private Integer currentPage = 1; + @ExcelIgnore + private Integer pageSize = 20; + @ExcelIgnore + private Date startDate; + @ExcelIgnore + private Date endDate; + + private Integer userId; + private String account; + private Integer roleId; + /** + * 名称 + */ + private String name; + + private Integer roleType; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 角色备注 + */ + private String remark; + + /** + * 1删除 0有效 + */ + private Integer deleteFlag; + + /** + * 创建者 + */ + private String createUser; + + /** + * 修改者 + */ + private String updateUser; + +} diff --git a/src/main/java/com/sa/zentao/service/IBaseMenuService.java b/src/main/java/com/sa/zentao/service/IBaseMenuService.java new file mode 100644 index 0000000..57982d8 --- /dev/null +++ b/src/main/java/com/sa/zentao/service/IBaseMenuService.java @@ -0,0 +1,36 @@ +package com.sa.zentao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.sa.zentao.conf.LoginRiskUser; +import com.sa.zentao.dao.BaseMenuDTO; +import com.sa.zentao.entity.BaseMenu; +import com.sa.zentao.qo.BaseMenuQo; + +import java.util.List; + +/** + *

+ * 服务类 + *

+ * + * @author jobob + * @since 2021-05-28 + */ +public interface IBaseMenuService extends IService { + + String saveMenu(BaseMenuQo vo, LoginRiskUser loginRiskUser); + + BaseMenu selectById(Integer id); + + String deleteMenu(Integer id, LoginRiskUser loginRiskUser); + + String moveUp(Integer id); + + String moveDown(Integer id); + + List queryListByLoginUser(String riskUserId); + + List menuTree(LoginRiskUser loginRiskUser); + + List baseMenuTree(); +} diff --git a/src/main/java/com/sa/zentao/service/IBaseRoleAuthorityService.java b/src/main/java/com/sa/zentao/service/IBaseRoleAuthorityService.java new file mode 100644 index 0000000..76d3cc8 --- /dev/null +++ b/src/main/java/com/sa/zentao/service/IBaseRoleAuthorityService.java @@ -0,0 +1,18 @@ +package com.sa.zentao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.sa.zentao.entity.BaseRoleAuthority; + +/** + *

+ * 服务类 + *

+ * + * @author jobob + * @since 2021-05-31 + */ +public interface IBaseRoleAuthorityService extends IService { + + Integer deleteByRoleId(Integer roleId); + +} diff --git a/src/main/java/com/sa/zentao/service/IBaseRoleService.java b/src/main/java/com/sa/zentao/service/IBaseRoleService.java new file mode 100644 index 0000000..8953e89 --- /dev/null +++ b/src/main/java/com/sa/zentao/service/IBaseRoleService.java @@ -0,0 +1,35 @@ +package com.sa.zentao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.github.pagehelper.PageInfo; +import com.sa.zentao.dao.BaseRoleDTO; +import com.sa.zentao.entity.BaseRole; +import com.sa.zentao.qo.BaseRoleQo; + +import java.util.List; + +/** + *

+ * 服务类 + *

+ * + * @author jobob + * @since 2021-05-28 + */ +public interface IBaseRoleService extends IService { + + void modify(BaseRoleDTO baseRoleDTO, BaseRole baseRole); + + void add(BaseRoleDTO baseRoleDTO); + + PageInfo selectPageList(BaseRoleQo vo); + + BaseRoleDTO getInfoById(Integer id); + + void delete(BaseRole baseRole, BaseRoleQo baseRoleVo); + + List getUserRoleIds(String account); + + + +} diff --git a/src/main/java/com/sa/zentao/service/IBaseUserRoleService.java b/src/main/java/com/sa/zentao/service/IBaseUserRoleService.java new file mode 100644 index 0000000..6a533fb --- /dev/null +++ b/src/main/java/com/sa/zentao/service/IBaseUserRoleService.java @@ -0,0 +1,21 @@ +package com.sa.zentao.service; + +import com.sa.zentao.entity.BaseUserRole; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + *

+ * 服务类 + *

+ * + * @author gqb + * @since 2025-04-16 + */ +public interface IBaseUserRoleService extends IService { + + void addUserRole(String account, List roleList); + + void modifyUserRole(String account, List roleList); +} diff --git a/src/main/java/com/sa/zentao/service/IZtStoryFeedbackService.java b/src/main/java/com/sa/zentao/service/IZtStoryFeedbackService.java index 077e7e1..e0fe23f 100644 --- a/src/main/java/com/sa/zentao/service/IZtStoryFeedbackService.java +++ b/src/main/java/com/sa/zentao/service/IZtStoryFeedbackService.java @@ -45,11 +45,11 @@ public interface IZtStoryFeedbackService extends IService { void feedbackFinished(Integer feedbackId); - void submitVerified(ZtStoryDTO dto); + void submitVerified(ZtStoryFeedbackDTO dto); void ysFeedback(Integer feedbackId); - void storyYs(ZtStoryDTO dto); + void storyYs(ZtStoryFeedbackDTO dto); void dontHand(ZtStoryFeedbackDTO dto); diff --git a/src/main/java/com/sa/zentao/service/IZtStoryUserspecService.java b/src/main/java/com/sa/zentao/service/IZtStoryUserspecService.java new file mode 100644 index 0000000..e9a6830 --- /dev/null +++ b/src/main/java/com/sa/zentao/service/IZtStoryUserspecService.java @@ -0,0 +1,16 @@ +package com.sa.zentao.service; + +import com.sa.zentao.entity.ZtStoryUserspec; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author gqb + * @since 2025-04-15 + */ +public interface IZtStoryUserspecService extends IService { + +} diff --git a/src/main/java/com/sa/zentao/service/IZtTaskService.java b/src/main/java/com/sa/zentao/service/IZtTaskService.java index 3cdb26c..fdeaddd 100644 --- a/src/main/java/com/sa/zentao/service/IZtTaskService.java +++ b/src/main/java/com/sa/zentao/service/IZtTaskService.java @@ -58,4 +58,12 @@ public interface IZtTaskService extends IService { List itApprovalByUserName(String s, Date firstDayOfMonth, Date lastDayOfMonth); + /** + * + * @param firstDayOfMonth 开始 + * @param lastDayOfMonth 结束 + * @param eIds 迭代 + * @return + */ + List taskListByEIdsAndDate(Date firstDayOfMonth, Date lastDayOfMonth, List eIds); } diff --git a/src/main/java/com/sa/zentao/service/IZtUserService.java b/src/main/java/com/sa/zentao/service/IZtUserService.java index 9a68d16..ff58889 100644 --- a/src/main/java/com/sa/zentao/service/IZtUserService.java +++ b/src/main/java/com/sa/zentao/service/IZtUserService.java @@ -51,4 +51,8 @@ public interface IZtUserService extends IService { BaseDepartment getDepart(Integer departId); ZtUser getByAccount(String openedby); + + void addUser(ZtUserDTO user); + + void modifyUser(ZtUserDTO user); } diff --git a/src/main/java/com/sa/zentao/service/impl/BaseMenuServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/BaseMenuServiceImpl.java new file mode 100644 index 0000000..9c957e7 --- /dev/null +++ b/src/main/java/com/sa/zentao/service/impl/BaseMenuServiceImpl.java @@ -0,0 +1,209 @@ +package com.sa.zentao.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.sa.zentao.conf.LoginRiskUser; +import com.sa.zentao.dao.BaseMenuDTO; +import com.sa.zentao.dao.BusinessException; +import com.sa.zentao.entity.BaseMenu; +import com.sa.zentao.entity.BaseRoleAuthority; +import com.sa.zentao.entity.BaseUserRole; +import com.sa.zentao.enums.BaseMenuLevelEnum; +import com.sa.zentao.mapper.BaseMenuMapper; +import com.sa.zentao.mapper.BaseRoleAuthorityMapper; +import com.sa.zentao.mapper.BaseUserRoleMapper; +import com.sa.zentao.qo.BaseMenuQo; +import com.sa.zentao.service.IBaseMenuService; +import com.sa.zentao.utils.BeanCopyUtil; +import com.sa.zentao.utils.TreeUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.*; +import java.util.stream.Collectors; + +/** + *

+ * 服务实现类 + *

+ * + * @author jobob + * @since 2021-05-28 + */ +@Service +public class BaseMenuServiceImpl extends ServiceImpl implements IBaseMenuService { + + @Autowired + private BaseMenuMapper baseMenuMapper; + @Autowired + private BaseUserRoleMapper baseUserRoleMapper; + @Autowired + private BaseRoleAuthorityMapper baseRoleAuthorityMapper; + + + @Override + public String saveMenu(BaseMenuQo vo, LoginRiskUser loginRiskUser) { + //按钮 + if (2 == vo.getMenuType()){ + Boolean result = checkAction(vo.getId(),vo.getAction()); + if (!result){ + throw new BusinessException("菜单路径重复"); + } + } + BaseMenu bm = new BaseMenu(); + bm.setParentId(vo.getParentId()); + bm.setAction(vo.getAction()); + bm.setIcon(vo.getIcon()); + bm.setName(vo.getName()); + bm.setCreateTime(new Date()); + bm.setUpdateTime(new Date()); + bm.setIsSys(vo.getIsSys()); + bm.setMenuType(vo.getMenuType()); + if (Objects.isNull(vo.getParentId())){ + bm.setLevel(1); + }else if (Objects.nonNull(vo.getParentId()) ){ + BaseMenu baseMenu = this.baseMenuMapper.selectById(vo.getParentId()); + bm.setLevel(baseMenu.getLevel()+1); + } + + if (Objects.isNull(vo.getId())){ + + List baseMenus = baseMenuMapper.findAll(); + Integer max = CollectionUtils.isEmpty(baseMenus)?1:baseMenus.stream().map(BaseMenu::getSort).max(Integer::compareTo).get(); + bm.setSort(max + 1); + this.baseMenuMapper.insert(bm); + + List baseUserRoleList = baseUserRoleMapper.selectList(new QueryWrapper().eq("user_id",loginRiskUser.getRiskUserId())); + for (BaseUserRole baseUserRole : baseUserRoleList) { + BaseRoleAuthority bra = new BaseRoleAuthority(); + bra.setMenuId(bm.getId()); + bra.setRoleId(baseUserRole.getRoleId()); + baseRoleAuthorityMapper.insert(bra); + } + return "新增成功"; + }else { + bm.setId(vo.getId()); + bm.setSort(vo.getSort()); + bm.setUpdateTime(new Date()); + this.baseMenuMapper.updateById(bm); + return "修改成功"; + } + + } + + @Override + public BaseMenu selectById(Integer id) { + return this.baseMenuMapper.selectById(id); + } + + @Override + public String deleteMenu(Integer id, LoginRiskUser loginRiskUser) { + //this.baseMenuMapper.deleteWithChild(id); + List menuIds = baseMenuMapper.findMenuIds(id); + if (!CollectionUtils.isEmpty(menuIds)){ + this.baseMenuMapper.deleteBatchIds(menuIds); + } + List baseUserRoleList = baseUserRoleMapper.selectList(new QueryWrapper().eq("user_id",loginRiskUser.getRiskUserId())); + List roleIds = new ArrayList<>(); + if (!CollectionUtils.isEmpty(baseUserRoleList)){ + roleIds = baseUserRoleList.stream().map(o -> o.getRoleId()).collect(Collectors.toList()); + } + this.baseRoleAuthorityMapper.deleteRoleAndMenu(roleIds,menuIds); + + return "删除成功"; + } + + @Override + public String moveUp(Integer id) { + BaseMenu baseMenu = baseMenuMapper.selectById(id); + if (Objects.nonNull(baseMenu)){ + List list = baseMenuMapper.selectMenuByParentId(baseMenu.getParentId()); + list.sort(((o1, o2) -> o1.getSort().compareTo(o2.getSort()))); + int index = list.lastIndexOf(baseMenu); + if (index > 0){ + BaseMenu preMenu = list.get(index - 1); + Integer preSort = preMenu.getSort(); + preMenu.setSort(baseMenu.getSort()); + baseMenuMapper.updateById(preMenu); + baseMenu.setSort(preSort); + baseMenuMapper.updateById(baseMenu); + } + } + return "上移成功"; + } + + @Override + public String moveDown(Integer id) { + BaseMenu baseMenu = baseMenuMapper.selectById(id); + if(Objects.nonNull(baseMenu)){ + List list = baseMenuMapper.selectMenuByParentId(baseMenu.getParentId()); + list.sort((o1, o2) -> o2.getSort().compareTo(o1.getSort())); + int index = list.lastIndexOf(baseMenu); + if(index > 0){ + BaseMenu preMenu = list.get(index - 1); + Integer preSort = preMenu.getSort(); + preMenu.setSort(baseMenu.getSort()); + baseMenuMapper.updateById(preMenu); + baseMenu.setSort(preSort); + baseMenuMapper.updateById(baseMenu); + } + } + return "下移成功"; + } + + @Override + public List queryListByLoginUser(String riskUserId) { + + return this.baseMenuMapper.queryListByLoginUser(riskUserId); + } + + + private Boolean checkAction(Integer id, String action) { + if (StringUtils.isEmpty(action) || Objects.equals(action,"#")){ + return true; + } + + List baseMenus = new ArrayList<>(); + if (Objects.nonNull(id)){ + baseMenus = baseMenuMapper.selectList(new QueryWrapper().lambda().eq(BaseMenu::getAction, action).notIn(BaseMenu::getId, id)); + }else { + baseMenus = baseMenuMapper.selectList(new QueryWrapper().lambda().eq(BaseMenu::getAction, action)); + } + if (!CollectionUtils.isEmpty(baseMenus)){ + return false; + } + return true; + + } + + /** + * 根据当前登录用户来获取页面权限、数据权限 + * @param loginRiskUser + * @return + */ + @Override + public List menuTree(LoginRiskUser loginRiskUser) { + List baseMenuList = new ArrayList<>(); + baseMenuList = this.queryListByLoginUser(loginRiskUser.getRiskUserId()).stream().sorted(Comparator.comparing(BaseMenu::getSort)).collect(Collectors.toList()); + + List baseMenuDTOS = TreeUtils.buildByRecursive(BeanCopyUtil.copyListProperties(baseMenuList, BaseMenuDTO::new), null); + return baseMenuDTOS; + } + + /** + * 获取所有菜单及权限 + * @return + */ + @Override + public List baseMenuTree() { + List baseMenuList = this.queryAllList().stream().sorted(Comparator.comparing(BaseMenu::getSort)).collect(Collectors.toList()); + List baseMenuDTOS = TreeUtils.buildByRecursive(BeanCopyUtil.copyListProperties(baseMenuList, BaseMenuDTO::new), null); + return baseMenuDTOS; + } + + public List queryAllList(){ + return this.baseMenuMapper.queryAllList(); + } +} diff --git a/src/main/java/com/sa/zentao/service/impl/BaseRoleAuthorityServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/BaseRoleAuthorityServiceImpl.java new file mode 100644 index 0000000..6ffa913 --- /dev/null +++ b/src/main/java/com/sa/zentao/service/impl/BaseRoleAuthorityServiceImpl.java @@ -0,0 +1,25 @@ +package com.sa.zentao.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.sa.zentao.entity.BaseRoleAuthority; +import com.sa.zentao.mapper.BaseRoleAuthorityMapper; +import com.sa.zentao.service.IBaseRoleAuthorityService; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author jobob + * @since 2021-05-31 + */ +@Service +public class BaseRoleAuthorityServiceImpl extends ServiceImpl implements IBaseRoleAuthorityService { + + @Override + public Integer deleteByRoleId(Integer roleId) { + + return this.baseMapper.deleteByRoleId(roleId); + } +} diff --git a/src/main/java/com/sa/zentao/service/impl/BaseRoleServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/BaseRoleServiceImpl.java new file mode 100644 index 0000000..97c72ae --- /dev/null +++ b/src/main/java/com/sa/zentao/service/impl/BaseRoleServiceImpl.java @@ -0,0 +1,147 @@ +package com.sa.zentao.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.sa.zentao.dao.BaseRoleDTO; +import com.sa.zentao.dao.BusinessException; +import com.sa.zentao.entity.BaseRole; +import com.sa.zentao.entity.BaseRoleAuthority; +import com.sa.zentao.entity.BaseUserRole; +import com.sa.zentao.enums.PickEnum; +import com.sa.zentao.mapper.BaseRoleAuthorityMapper; +import com.sa.zentao.mapper.BaseRoleMapper; +import com.sa.zentao.mapper.BaseUserRoleMapper; +import com.sa.zentao.qo.BaseRoleQo; +import com.sa.zentao.service.IBaseRoleAuthorityService; +import com.sa.zentao.service.IBaseRoleService; +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 jobob + * @since 2021-05-28 + */ +@Service +public class BaseRoleServiceImpl extends ServiceImpl implements IBaseRoleService { + + @Autowired + private IBaseRoleAuthorityService baseRoleAuthorityService; + @Autowired + private BaseUserRoleMapper baseUserRoleMapper; + @Autowired + private BaseRoleMapper baseRoleMapper; + @Autowired + private BaseRoleAuthorityMapper baseRoleAuthorityMapper; + + @Override + @Transactional + public void modify(BaseRoleDTO baseRoleDTO, BaseRole baseRole) { + baseRole.setName(baseRoleDTO.getName()); + baseRole.setRemark(baseRoleDTO.getRemark()); + baseRole.setUpdateTime(new Date()); + this.baseMapper.updateById(baseRole); + + baseRoleAuthorityService.deleteByRoleId(baseRole.getId()); + + batchSaveAndUpdate(baseRoleDTO, baseRole.getId()); + } + + @Override + @Transactional + public void add(BaseRoleDTO baseRoleDTO) { + BaseRole baseRole = new BaseRole(); + + BeanUtils.copyProperties(baseRoleDTO, baseRole); + this.baseMapper.insert(baseRole); + + batchSaveAndUpdate(baseRoleDTO, baseRole.getId()); + } + + private void batchSaveAndUpdate(BaseRoleDTO baseRoleDTO, Integer roleId){ + List baseRoleAuthority = new ArrayList(); + if (!StringUtils.isEmpty(baseRoleDTO.getAllPickMenuIds())) { + Arrays.stream(baseRoleDTO.getAllPickMenuIds().split(",")).forEach(a ->{ + BaseRoleAuthority auth = new BaseRoleAuthority(); + auth.setCreateTime(new Date()); + auth.setMenuId(Integer.valueOf(a)); + auth.setRoleId(roleId); + auth.setUpdateTime(new Date()); + auth.setType(PickEnum.ALL_PICK); + baseRoleAuthority.add(auth); + }); + } + if (!StringUtils.isEmpty(baseRoleDTO.getHalfPickMenuIds())) { + Arrays.stream(baseRoleDTO.getHalfPickMenuIds().split(",")).forEach(a -> { + BaseRoleAuthority auth = new BaseRoleAuthority(); + auth.setCreateTime(new Date()); + auth.setMenuId(Integer.valueOf(a)); + auth.setRoleId(roleId); + auth.setUpdateTime(new Date()); + auth.setType(PickEnum.HALF_PICK); + baseRoleAuthority.add(auth); + }); + } + baseRoleAuthorityService.saveBatch(baseRoleAuthority); + } + + @Override + public PageInfo selectPageList(BaseRoleQo vo) { + Page page = PageHelper.startPage(vo.getCurrentPage(),vo.getPageSize()); + List baseRoleDTOList = baseRoleMapper.selectRoleByVo(vo); +// baseRoleDTOList=baseRoleDTOList.stream().filter(o->!o.getName().equalsIgnoreCase("系统管理员")).collect(Collectors.toList()); + return new PageInfo<>(baseRoleDTOList); + } + + @Override + public BaseRoleDTO getInfoById(Integer id) { + if (Objects.isNull(id)){ + throw new BusinessException("id不能为空"); + } + BaseRoleDTO baseRoleDTO = baseRoleMapper.findRoleById(id); + String menuIds = baseRoleAuthorityMapper.findMenuIdById(id, PickEnum.ALL_PICK); + baseRoleDTO.setAllPickMenuIds(menuIds); + + return baseRoleDTO; + } + + @Override + @Transactional + public void delete(BaseRole baseRole, BaseRoleQo baseRoleVo) { + //删除角色 + this.removeById(baseRoleVo.getRoleId()); + + //删除角色权限 + baseRoleAuthorityService.deleteByRoleId(baseRoleVo.getRoleId()); + //删除角色数据权限 +// baseRoleAccountService.deleteByRoleId(baseRoleVo.getRoleId()); + } + + @Override + public List getUserRoleIds(String account) { +// LoginRiskUser loginRiskUser = RiskUserThreadLocal.get(); +// if(loginRiskUser==null){ +// return new ArrayList<>(); +// } + List baseUserRoles = this.baseUserRoleMapper.selectList(new QueryWrapper() + .lambda().eq(BaseUserRole::getUserId, account)); + if(CollectionUtils.isEmpty(baseUserRoles)){ + return new ArrayList<>(); + }else{ + return baseUserRoles.stream().map(o->o.getRoleId()).collect(Collectors.toList()); + } + } +} diff --git a/src/main/java/com/sa/zentao/service/impl/BaseUserRoleServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/BaseUserRoleServiceImpl.java new file mode 100644 index 0000000..89532a2 --- /dev/null +++ b/src/main/java/com/sa/zentao/service/impl/BaseUserRoleServiceImpl.java @@ -0,0 +1,69 @@ +package com.sa.zentao.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.sa.zentao.entity.BaseRole; +import com.sa.zentao.entity.BaseUserRole; +import com.sa.zentao.mapper.BaseUserRoleMapper; +import com.sa.zentao.service.IBaseRoleService; +import com.sa.zentao.service.IBaseUserRoleService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +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.ArrayList; +import java.util.Date; +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * + * @author gqb + * @since 2025-04-16 + */ +@Service +public class BaseUserRoleServiceImpl extends ServiceImpl implements IBaseUserRoleService { + + @Autowired + private IBaseRoleService baseRoleService; + + @Override + public void addUserRole(String account, List roleList) { + + List baseRoles = this.baseRoleService.listByIds(roleList); + + List saveList=new ArrayList(); + for (Integer roleId:roleList) { + BaseUserRole r=new BaseUserRole(); + r.setCreateTime(new Date()); + r.setUpdateTime(new Date()); + r.setRoleId(roleId); + r.setUserId(account); + saveList.add(r); + } + this.saveBatch(saveList); + } + + @Override + @Transactional + public void modifyUserRole(String account, List roleList) { + this.remove(new QueryWrapper().lambda().eq(BaseUserRole::getUserId,account)); + + if(!CollectionUtils.isEmpty(roleList)){ + List saveList=new ArrayList(); + for (Integer roleId:roleList) { + BaseUserRole r=new BaseUserRole(); + r.setCreateTime(new Date()); + r.setUpdateTime(new Date()); + r.setRoleId(roleId); + r.setUserId(account); + saveList.add(r); + } + this.saveBatch(saveList); + } + + } +} 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 4ff77b5..de55930 100644 --- a/src/main/java/com/sa/zentao/service/impl/IZtCountService.java +++ b/src/main/java/com/sa/zentao/service/impl/IZtCountService.java @@ -22,8 +22,10 @@ import com.sa.zentao.qo.ZtCountQo; import com.sa.zentao.qo.ZtProjectQo; import com.sa.zentao.qo.ZtUserQo; import com.sa.zentao.service.*; +import com.sa.zentao.utils.BigDecimalUtils; import com.sa.zentao.utils.DateUtils; import com.sa.zentao.utils.ExcelUtil; +import com.tencentcloudapi.ses.v20201002.models.EmailSender; import jakarta.servlet.ServletOutputStream; import jakarta.servlet.ServletRequest; import jakarta.servlet.ServletResponse; @@ -189,6 +191,9 @@ public class IZtCountService { UserType userType = loginRiskUser.getUserType(); ZtStoryCountDTO result = new ZtStoryCountDTO(); List pIds = this.projectService.authProductList(); + if(CollectionUtils.isEmpty(pIds)){ + return new ZtStoryCountDTO(); + } if (loginRiskUser.getName().equals("admin")||userType == UserType.GSGC) { List list =null; @@ -296,7 +301,7 @@ public class IZtCountService { List feedbacks = this.storyFeedbackService.list(new QueryWrapper().lambda() .in(ZtStoryFeedback::getProduct,pIds) - .ne(ZtStoryFeedback::getStatus, "closed")); + ); result= setFeedback(result,feedbacks); } else if (userType == UserType.CP ) { @@ -379,8 +384,8 @@ public class IZtCountService { .map(o->o.getId()+"").collect(Collectors.joining(","))); - List feedbacks = this.storyFeedbackService.list(new QueryWrapper() - .lambda().ne(ZtStoryFeedback::getStatus, "closed") + List feedbacks = this.storyFeedbackService.list(new QueryWrapper().lambda() + .in(ZtStoryFeedback::getProduct,pIds) .eq(ZtStoryFeedback::getAssignedTo,loginRiskUser.getName()).or().eq(ZtStoryFeedback::getOpenedBy,loginRiskUser.getName()) @@ -471,7 +476,7 @@ public class IZtCountService { List feedbacks = this.storyFeedbackService.list(new QueryWrapper() - .lambda().ne(ZtStoryFeedback::getStatus, "closed") + .lambda() .in(ZtStoryFeedback::getProduct,pList.stream().map(o->o.getId()).collect(Collectors.toList())) ); @@ -517,17 +522,22 @@ public class IZtCountService { @Autowired private IZtTeamService teamService; + @Autowired + private IZtMeetingService meetingService;; + // @Autowired // private IZtBugService bugService; public void exportScope(ZtCountQo qo, ServletRequest request, HttpServletResponse response) { + + try { - List perList =performanceCount(qo); + List perList =newPerformanceCount(qo); if(CollectionUtils.isEmpty(perList)){ throw new BusinessException("未查询到数据"); } @@ -537,23 +547,42 @@ public class IZtCountService { Map userMap = userService.userMapByIds(null); + List list = new ArrayList<>(); //生成模板 for (int i = 0; i < perList.size(); i++) { PerformanceDTO performanceDTO = perList.get(i); ZtUser ztUser = userMap.get(performanceDTO.getAccount()); + if(ztUser.getAccount().equals("liyuyan")){ + generatorXMZLExcel(performanceDTO.getUserName(),performanceDTO,qo.getDate()); + list.add(performanceDTO.getUserName()+"项目助理考核.xlsx"); + }else + if(ztUser.getAccount().equals("liushengqing")){ + generatorUiExcel(performanceDTO.getUserName(),performanceDTO,qo.getDate()); + list.add(performanceDTO.getUserName()+"UI工程师.xlsx"); + }else if(ztUser.getUserType()==UserType.CS){ generatorTestExcel(performanceDTO.getUserName(),performanceDTO,qo.getDate()); + list.add(performanceDTO.getUserName()+"测试.xlsx"); }else if(ztUser.getUserType()==UserType.KFZ){ generatorDevlopExcel(performanceDTO.getUserName(),performanceDTO,qo.getDate()); - }else if(ztUser.getUserType()==UserType.XMGLY){ - }else{ + list.add(performanceDTO.getUserName()+"开发.xlsx"); + }else if(ztUser.getUserType()==UserType.UI){ + generatorUiExcel(performanceDTO.getUserName(),performanceDTO,qo.getDate()); + list.add(performanceDTO.getUserName()+"UI工程师.xlsx"); + }else if(ztUser.getUserType()==UserType.XMZL||"liyuyan".equals(ztUser.getAccount())){ + generatorXMZLExcel(performanceDTO.getUserName(),performanceDTO,qo.getDate()); + list.add(performanceDTO.getUserName()+"项目助理考核.xlsx"); + }else if(ztUser.getUserType()==UserType.XMJL||ztUser.getUserType()==UserType.XMGLY||ztUser.getUserType()==UserType.GSGC){ + generatorXMJLExcel(qo,performanceDTO.getUserName(),performanceDTO,qo.getDate(),perList); + list.add(performanceDTO.getUserName()+"项目经理考核.xlsx"); } } String dir=System.getProperty("user.dir")+"/"; //生成多sheetexcel String fileName=dir+DateUtils.formatDate(new Date(),"yyyyMMddHHmmss")+".xlsx"; +// list.add(fileName); FileOutputStream stream = new FileOutputStream(fileName); try { exportProjectCount(qo,request,stream); @@ -564,22 +593,23 @@ public class IZtCountService { } response.setContentType("application/vnd.ms-excel;charset=UTF-8"); - List list = new ArrayList<>(); - list.add(fileName); - for (int i = 0; i < perList.size(); i++) { - PerformanceDTO performanceDTO = perList.get(i); - ZtUser ztUser = userMap.get(performanceDTO.getAccount()); +// list.add(fileName); +// for (int i = 0; i < perList.size(); i++) { +// PerformanceDTO performanceDTO = perList.get(i); +// ZtUser ztUser = userMap.get(performanceDTO.getAccount()); +// +// +// if(ztUser.getUserType()==UserType.CS){ +// list.add(performanceDTO.getUserName()+"测试.xlsx"); +// +// generatorTestExcel(performanceDTO.getUserName(),performanceDTO,qo.getDate()); +// }else if(ztUser.getUserType()==UserType.KFZ){ +// list.add(performanceDTO.getUserName()+"开发.xlsx"); +// generatorDevlopExcel(performanceDTO.getUserName(),performanceDTO,qo.getDate()); +// } +// } - if(ztUser.getUserType()==UserType.CS){ - list.add(performanceDTO.getUserName()+"测试.xlsx"); - - generatorTestExcel(performanceDTO.getUserName(),performanceDTO,qo.getDate()); - }else if(ztUser.getUserType()==UserType.KFZ){ - list.add(performanceDTO.getUserName()+"开发.xlsx"); - generatorDevlopExcel(performanceDTO.getUserName(),performanceDTO,qo.getDate()); - } - } String excelName=DateUtils.formatDate(qo.getDate(),"yyyy-MM-dd")+"绩效"+".xlsx"; ExcelUtil.mergexcel(list,excelName, dir); @@ -736,14 +766,622 @@ public class IZtCountService { } return result; } - PerformanceDTO buildCsScore(ZtUser u ,List approvalList,Date firstDayOfMonth,Date lastDayOfMonth,List taskList,Date d ){ - if(u.getUserType()==UserType.CS){ - }else if(u.getUserType()==UserType.KFZ){ - - }else if(u.getUserType()==UserType.XMGLY){ + private List newPerformanceCount(ZtCountQo qo) { + Date d = qo.getDate(); + if(d==null){ + d=new Date(); } + Date firstDayOfMonth = DateUtils.getFirstDayOfMonth(d); + Date lastDayOfMonth = DateUtils.getLastDayOfMonth(d); + //产品集 + Integer project = qo.getProject(); +// if(qo.){ +// +// } + List productList = this.productService.list(new QueryWrapper().lambda().eq(ZtProduct::getProgram, project)); + if (CollectionUtils.isEmpty(productList)) { + return new ArrayList<>(); + } + List projectproducts = this.projectproductService.list(new QueryWrapper().lambda() + .in(ZtProjectproduct::getProduct, productList.stream().map(o -> o.getId()).collect(Collectors.toList()))); + if (CollectionUtils.isEmpty(projectproducts)) { + return new ArrayList<>(); + } + List execList = executionprojectService.list(new QueryWrapper().lambda() + .in(ZtExecutionproject::getProject, projectproducts.stream().map(o->o.getProject()).collect(Collectors.toList()))); + if (CollectionUtils.isEmpty(execList)) { + return new ArrayList<>(); + } + List taskList =this.taskService.taskListByEIdsAndDate(firstDayOfMonth,lastDayOfMonth,execList.stream().map(o -> o.getExecution()) + .collect(Collectors.toList())); + + + if (CollectionUtils.isEmpty(taskList)) { + return new ArrayList<>(); + } + List ztProjects = this.projectService.listByIds(execList.stream().map(o -> o.getExecution()).collect(Collectors.toList())); + + + ztProjects = ztProjects.stream().filter(o -> (o.getBegin().getTime() >= firstDayOfMonth.getTime() + && o.getBegin().getTime() <= lastDayOfMonth.getTime()) || ( + o.getEnd().getTime() >= firstDayOfMonth.getTime() + && o.getEnd().getTime() <= lastDayOfMonth.getTime() + )).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(ztProjects)) { + return new ArrayList<>(); + } + + List teams = this.teamService.list(new QueryWrapper().lambda().eq(ZtTeam::getType, "execution") + .in(ZtTeam::getRoot, ztProjects.stream().map(o -> o.getId()).collect(Collectors.toList()))); + + List accountIds = teams.stream().map(o -> o.getAccount()).distinct().collect(Collectors.toList()); + if (CollectionUtils.isEmpty(accountIds)) { + return new ArrayList<>(); + } + //accountIds 成员 + + List ztUsers = this.userService.list(new QueryWrapper().lambda().in(ZtUser::getAccount,accountIds)); + + + List result =new ArrayList<>(); + + for (ZtUser u:ztUsers) { + + List approvalList = this.taskService.itApprovalByUserName(u.getNickname(),firstDayOfMonth, lastDayOfMonth); + if(u.getAccount().equals("liyuyan")){ + result.add(buildXMZLScore(u,approvalList,firstDayOfMonth,lastDayOfMonth,taskList,d)); + }else + if("liushengqing".equals(u.getAccount())){ + result.add(buildUiScore(u,approvalList,firstDayOfMonth,lastDayOfMonth,taskList,d)); + }else + if(u.getUserType()==UserType.KFZ){ + result.add(buildKFZScore(u,approvalList,firstDayOfMonth,lastDayOfMonth,taskList,d)); + }else if(u.getUserType()==UserType.CS){ + result.add(buildCScore(u,approvalList,firstDayOfMonth,lastDayOfMonth,taskList,d)); + }else if(u.getUserType()==UserType.UI){ + result.add(buildUiScore(u,approvalList,firstDayOfMonth,lastDayOfMonth,taskList,d)); + }else if(u.getUserType()==UserType.XMJL||u.getUserType()==UserType.XMGLY||u.getUserType()==UserType.GSGC){ + result.add(buildXMJLScore(u,approvalList,firstDayOfMonth,lastDayOfMonth,taskList,d)); + }else if(u.getUserType()==UserType.XMZL){ + result.add(buildXMZLScore(u,approvalList,firstDayOfMonth,lastDayOfMonth,taskList,d)); + } + } + return result; + } + //新的 + PerformanceDTO buildKFZScore(ZtUser u ,List approvalList,Date firstDayOfMonth,Date lastDayOfMonth,List taskList,Date d ){ + + PerformanceDTO dto=new PerformanceDTO(); + dto.setUserName(u.getNickname()); + dto.setAccount(u.getAccount()); + //本月天数 + int workDaysInCurrentMonth = DateUtils.getWorkDaysInCurrentMonth(d); + //获取本月请假 + Integer applyTime=0; + if(!CollectionUtils.isEmpty(approvalList)){ + applyTime=getApprovalTime(approvalList,firstDayOfMonth);; + } + //本月天数 + dto.setDays(BigDecimal.valueOf(workDaysInCurrentMonth)); + //本月天数 请假天数 + dto.setApprovalDays(applyTime<1?BigDecimal.ZERO:BigDecimal.valueOf(applyTime).divide(BigDecimal.valueOf(60),2,BigDecimal.ROUND_HALF_UP)); + //可用工时 6小时算 + dto.setTotalTime(dto.getDays().multiply(BigDecimal.valueOf(8)).multiply(BigDecimal.valueOf(0.75))); + //达标工时 + dto.setExamineTime(dto.getTotalTime().subtract(BigDecimal.valueOf(applyTime))); + + //产出工时 算task + List taskTimeList = taskList.stream().filter(o->!o.getStatus().equals("closed")&&!o.getStatus().equals("cancel")).filter(o->u.getAccount().equals(o.getAssignedTo())).collect(Collectors.toList()); + + //分配总工时 + dto.setAllocationTime(floatBatchAdd(taskTimeList.stream().map(o->o.getEstimate()).collect(Collectors.toList()))); + + dto.setWorkTime(floatBatchAdd(taskList.stream().filter(o->u.getAccount().equals(o.getAssignedTo())).map(o -> o.getConsumed()).collect(Collectors.toList()))); + + //工作饱和度 + dto.setSaturation(dto.getTotalTime().floatValue()==0?BigDecimal.ZERO:dto.getAllocationTime().divide(dto.getExamineTime(),2,BigDecimal.ROUND_HALF_UP)); + float saturation = dto.getSaturation().floatValue(); + //完成准时率 TODO 延期 / 总完成 + //准时任务 + BigDecimal onTime = floatBatchAdd(taskTimeList.stream().filter(o -> o.getFinishedDate() != null + && o.getFinishedDate().getTime() <= DateUtils.getDayLast(o.getDeadline()).getTime()).map(o -> o.getEstimate()).collect(Collectors.toList())); + //全部完成 + BigDecimal finishAllTime = floatBatchAdd(taskTimeList.stream().map(o -> o.getEstimate()).collect(Collectors.toList())); + +// List finishAllTime = ; + //准时完成率 + BigDecimal onTimeFinishRate = BigDecimalUtils.isZero(finishAllTime) ? finishAllTime : onTime.divide(finishAllTime, 2, BigDecimal.ROUND_HALF_UP); + dto.setFinishPunctuality(onTimeFinishRate); + /**准时率得分 + * 1. =100%,得满分; + * 2. <100%,每减少1%,扣3分,扣完截止。 + * + */ + dto.setPunctualityScore(onTimeFinishRate.equals(BigDecimal.valueOf(1))?BigDecimal.valueOf(25) + :BigDecimal.valueOf(25).subtract(BigDecimal.valueOf(1).subtract(onTimeFinishRate).multiply(BigDecimal.valueOf(300))).floatValue()<=0?BigDecimal.ZERO: + BigDecimal.valueOf(25).subtract(BigDecimal.valueOf(1).subtract(onTimeFinishRate).multiply(BigDecimal.valueOf(300))) + ); + + + + //bug得分 + List bugList = this.bugService.list(new QueryWrapper().lambda().between(ZtBug::getOpeneddate, firstDayOfMonth, lastDayOfMonth) + .eq(ZtBug::getAssignedTo,u.getAccount())); + BigDecimal bugScore = BigDecimal.valueOf(30); + bugScore= BigDecimalUtils.isZero(finishAllTime) ?BigDecimal.ZERO: CollectionUtils.isEmpty(bugList)?bugScore: + BigDecimal.valueOf(bugList.size()).divide(finishAllTime,2,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).intValue()<=15?bugScore: + BigDecimal.valueOf(bugList.size()).divide(finishAllTime,2,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).intValue()>25?BigDecimal.ZERO: + bugScore.subtract(BigDecimal.valueOf(bugList.size()).divide(finishAllTime,2,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).subtract(BigDecimal.valueOf(15)).multiply(BigDecimal.valueOf(3))); + dto.setBugCount(BigDecimal.valueOf(bugList.size())); + dto.setBugScore(bugScore); + //工作质量 1. 全月Bug总数<6个 + //2. 当月绩效考核成绩95分以上 + //工作质量1. 全月Bug总数<6个 + + BigDecimal saturationScore=saturation>=1?BigDecimal.valueOf(20):saturation<0.9?BigDecimal.ZERO:BigDecimal.valueOf(20).subtract(BigDecimal.valueOf(1) + .subtract(BigDecimal.valueOf(saturation)).multiply(BigDecimal.valueOf(100)).multiply(BigDecimal.valueOf(2))); + //饱和率 分数 每天6小时 需求总工时 20分 一个扣2分 + if(BigDecimalUtils.isZero(dto.getExamineTime())||BigDecimalUtils.isZero(dto.getAllocationTime())){ + dto.setSaturationScore(BigDecimal.ZERO); + }else{ + int allocationTime = dto.getAllocationTime().intValue(); + int examineTime = dto.getExamineTime().intValue(); + dto.setSaturationScore(BigDecimal.valueOf(allocationTime>=examineTime?20:(20-(examineTime-allocationTime)*2)<=0?0:(20-(examineTime-allocationTime)*2))); + } + + return dto; + } + PerformanceDTO buildCScore(ZtUser u ,List approvalList,Date firstDayOfMonth,Date lastDayOfMonth,List taskList,Date d ){ + + PerformanceDTO dto=new PerformanceDTO(); + dto.setUserName(u.getNickname()); + dto.setAccount(u.getAccount()); + + //本月天数 + int workDaysInCurrentMonth = DateUtils.getWorkDaysInCurrentMonth(d); + //获取本月请假 + Integer applyTime=0; + if(!CollectionUtils.isEmpty(approvalList)){ + applyTime=getApprovalTime(approvalList,firstDayOfMonth);; + } + //本月天数 + dto.setDays(BigDecimal.valueOf(workDaysInCurrentMonth)); + //本月天数 请假天数 + dto.setApprovalDays(applyTime<1?BigDecimal.ZERO:BigDecimal.valueOf(applyTime).divide(BigDecimal.valueOf(60),2,BigDecimal.ROUND_HALF_UP)); + //可用工时 6小时算 + dto.setTotalTime(dto.getDays().multiply(BigDecimal.valueOf(8)).multiply(BigDecimal.valueOf(0.75))); + //达标工时 + dto.setExamineTime(dto.getTotalTime().subtract(BigDecimal.valueOf(applyTime))); + + //产出工时 算task + List taskTimeList = taskList.stream().filter(o->!o.getStatus().equals("closed")&&!o.getStatus().equals("cancel") + ).filter(o->o.getAssignedTo().equals(u.getAccount())).collect(Collectors.toList()); + + BigDecimal finishAllTime = floatBatchAdd(taskTimeList.stream().map(o->o.getEstimate()).collect(Collectors.toList())); + List onTimeTask = 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()); + BigDecimal onTime=floatBatchAdd(onTimeTask.stream().map(o->o.getEstimate()) + .collect(Collectors.toList())); + //准时完成率 + BigDecimal onTimeFinishRate = BigDecimalUtils.isZero(finishAllTime) ? finishAllTime : onTime.divide(finishAllTime, 2, BigDecimal.ROUND_HALF_UP); + BigDecimal finishScope=BigDecimal.valueOf(20); + dto.setPunctualityScore(onTimeFinishRate.equals(BigDecimal.valueOf(1))?finishScope: + onTimeFinishRate.multiply(BigDecimal.valueOf(100)).intValue()<90?BigDecimal.ZERO: + finishScope.subtract(BigDecimal.valueOf(1).subtract(onTimeFinishRate).multiply(BigDecimal.valueOf(2)).multiply(BigDecimal.valueOf(100))) ); + + long seriousBug = this.bugService.count(new QueryWrapper().lambda().between(ZtBug::getOpeneddate, firstDayOfMonth, lastDayOfMonth) + .in(ZtBug::getSeverity, 1)); + + //轻微 + long slightBug = this.bugService.count(new QueryWrapper().lambda().between(ZtBug::getOpeneddate, firstDayOfMonth, lastDayOfMonth) + .in(ZtBug::getSeverity, 2,3, 4)); + long totalBug = seriousBug*5+slightBug*1; + //缺陷检出率 TODO bug 数量 / 可用工时 250418尹工说的 + int bugFindScore=BigDecimalUtils.isZero( dto.getExamineTime()) ?0:BigDecimal.valueOf(totalBug).divide(dto.getExamineTime(),2,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).intValue()>20?30: + (30-(20-BigDecimal.valueOf(totalBug).divide(dto.getExamineTime(),2,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).intValue())*2); + dto.setBugFindScore(BigDecimal.valueOf(bugFindScore<0?0:bugFindScore)); + //TODO 加分项1. 全月无Bug + //2. 当月绩效考核成绩95分以上 +10分 + + //线上bug 当月上线需求的线上Bug数量 TODO 待明确 + + + + + //分配总工时 + taskTimeList = taskList.stream().filter(o->u.getAccount().equals(o.getAssignedTo())).collect(Collectors.toList()); + dto.setAllocationTime(floatBatchAdd(taskTimeList.stream().map(o->o.getEstimate()).collect(Collectors.toList()))); + + dto.setWorkTime(floatBatchAdd(taskList.stream().filter(o->u.getAccount().equals(o.getAssignedTo())).map(o -> o.getConsumed()).collect(Collectors.toList()))); + + return dto; + } + PerformanceDTO buildUiScore(ZtUser u ,List approvalList,Date firstDayOfMonth,Date lastDayOfMonth,List taskList,Date d ){ + + PerformanceDTO dto=new PerformanceDTO(); + dto.setUserName(u.getNickname()); + dto.setAccount(u.getAccount()); + + //本月天数 + int workDaysInCurrentMonth = DateUtils.getWorkDaysInCurrentMonth(d); + //获取本月请假 + Integer applyTime=0; + if(!CollectionUtils.isEmpty(approvalList)){ + applyTime=getApprovalTime(approvalList,firstDayOfMonth);; + } + //本月天数 + dto.setDays(BigDecimal.valueOf(workDaysInCurrentMonth)); + //本月天数 请假天数 + dto.setApprovalDays(applyTime<1?BigDecimal.ZERO:BigDecimal.valueOf(applyTime).divide(BigDecimal.valueOf(60),2,BigDecimal.ROUND_HALF_UP)); + //可用工时 6小时算 + dto.setTotalTime( + dto.getApprovalDays().intValue()==0?dto.getDays().multiply(BigDecimal.valueOf(8)).setScale(2,BigDecimal.ROUND_HALF_UP) + :dto.getDays().multiply(BigDecimal.valueOf(8)).subtract(dto.getApprovalDays()).setScale(2,BigDecimal.ROUND_HALF_UP)); + //达标工时 + dto.setExamineTime(dto.getTotalTime().multiply(BigDecimal.valueOf(0.75))); + + //产出工时 算task + List taskTimeList = taskList.stream() + .filter(o->o.getFinishedDate()!=null&& + o.getFinishedDate().getTime()<=lastDayOfMonth.getTime() &&firstDayOfMonth.getTime()<=o.getFinishedDate().getTime() + ).collect(Collectors.toList()); + + BigDecimal finishAllTime = floatBatchAdd(taskTimeList.stream().map(o->o.getConsumed()).collect(Collectors.toList())); + List onTimeTask = 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()); + BigDecimal onTime=floatBatchAdd(onTimeTask.stream().map(o->o.getConsumed()).collect(Collectors.toList())); + //准时完成率 + BigDecimal onTimeFinishRate = BigDecimalUtils.isZero(finishAllTime) ? finishAllTime : onTime.divide(finishAllTime, 2, BigDecimal.ROUND_HALF_UP); + BigDecimal finishScope=BigDecimal.valueOf(20); + dto.setPunctualityScore(onTimeFinishRate.equals(BigDecimal.valueOf(1))?finishScope: + onTimeFinishRate.multiply(BigDecimal.valueOf(100)).intValue()<80?BigDecimal.ZERO: + finishScope.subtract(BigDecimal.valueOf(1).subtract(onTimeFinishRate).multiply(BigDecimal.valueOf(2)).multiply(BigDecimal.valueOf(100))) ); +// taskList + // punctualityScore 准时率得分 + // 1 2 严重 + long seriousBug = this.bugService.count(new QueryWrapper().lambda().between(ZtBug::getOpeneddate, firstDayOfMonth, lastDayOfMonth) + .in(ZtBug::getSeverity, 1)); + + //轻微 + long slightBug = this.bugService.count(new QueryWrapper().lambda().between(ZtBug::getOpeneddate, firstDayOfMonth, lastDayOfMonth) + .in(ZtBug::getSeverity, 2,3, 4)); + long totalBug = seriousBug*5+slightBug*1; + //缺陷检出率 TODO bug 数量 / 可用工时 250418尹工说的 + int bugFindScore=BigDecimalUtils.isZero(dto.getExamineTime()) ?0:BigDecimal.valueOf(totalBug).divide(dto.getExamineTime(),2,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).intValue()>20?30: + (30-(BigDecimal.valueOf(totalBug).divide(dto.getExamineTime(),2,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).intValue()-20)*2); + dto.setBugFindScore(BigDecimal.valueOf(bugFindScore<0?0:bugFindScore)); + //TODO 加分项1. 全月无Bug + //2. 当月绩效考核成绩95分以上 +10分 + + //线上bug 当月上线需求的线上Bug数量 TODO + + + + + //分配总工时 + taskTimeList = taskList.stream().filter(o->u.getAccount().equals(o.getAssignedTo())).collect(Collectors.toList()); + dto.setAllocationTime(floatBatchAdd(taskTimeList.stream().map(o->o.getEstimate()).collect(Collectors.toList()))); + + dto.setWorkTime(floatBatchAdd(taskList.stream().filter(o->u.getAccount().equals(o.getAssignedTo())).map(o -> o.getConsumed()).collect(Collectors.toList()))); + + //工作饱和度 + dto.setSaturation(dto.getTotalTime().floatValue()==0?BigDecimal.ZERO:dto.getAllocationTime().divide(dto.getExamineTime(),2,BigDecimal.ROUND_HALF_UP)); + float saturation = dto.getSaturation().floatValue(); + //完成准时率 TODO 延期 / 总完成 + 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())); + //准时完成率 + dto.setFinishPunctuality(taskTimeList.size()==0?BigDecimal.valueOf(0): + CollectionUtils.isEmpty(delayTaskList)?BigDecimal.valueOf(1): + BigDecimal.valueOf(1).subtract(BigDecimal.valueOf(delayTaskList.size()) + .divide(dto.getFinishTask(),2,BigDecimal.ROUND_HALF_UP))); + //工作饱和度 + if(saturation<0.7){ + // = 0 + dto.setSaturationScore(BigDecimal.ZERO); + }else{ + if(saturation<0.9){ + dto.setSaturationScore(BigDecimal.valueOf(40 - ( 0.9 - saturation ) * 100 * 1).setScale(2,BigDecimal.ROUND_HALF_UP)); + }else{ + dto.setSaturationScore(BigDecimal.valueOf(40)); + } + } + BigDecimal finishPunctuality = dto.getFinishPunctuality(); + // 准时率得分 ( `完成准时率` < 1 , 25 - (1 - `完成准时率`) * 100 * 1, 25 )) `准时率得分`, + if(finishPunctuality.floatValue()<1){ + //TODO 完成准时率 0.8 + if(finishPunctuality.floatValue()<0.8){ + dto.setPunctualityScore(BigDecimal.ZERO); + }else{ + dto.setPunctualityScore(BigDecimal.valueOf(25 - (1 - finishPunctuality.floatValue()) * 100 * 1).setScale(2,BigDecimal.ROUND_HALF_UP)); + + } + }else{ + //饱和率得分 + dto.setPunctualityScore(BigDecimal.valueOf(25)); + } +// if(CollectionUtils.isEmpty(taskTimeList)){ +// bugList=new ArrayList<>(); +// }else{ +// bugList = this.bugService.list(new QueryWrapper().lambda().between(ZtBug::getOpeneddate, firstDayOfMonth, lastDayOfMonth) +// .in(ZtBug::getSeverity, 1, 2).eq(ZtBug::getResolvedby,u.getAccount())); +// } + List bugList = this.bugService.list(new QueryWrapper().lambda().between(ZtBug::getOpeneddate, firstDayOfMonth, lastDayOfMonth) + .in(ZtBug::getSeverity, 1, 2).eq(ZtBug::getResolvedby,u.getAccount())); +// if(!CollectionUtils.isEmpty(fTask)){ +// count = bugService.count(new QueryWrapper().lambda().in(ZtBug::getTotask, fTask.stream().map(o -> o.getId()).collect(Collectors.toList()))); +// } + +// if(CollectionUtils.isEmpty(bugList)){ +// dto.setSeriousBug(BigDecimal.ZERO); +// dto.setSlightBug(BigDecimal.ZERO); +// dto.setBugScore(BigDecimal.valueOf(10)); +// }else{ +// Long seriousBug = bugList.stream().filter(o -> o.getSeverity() == 1).count(); +// dto.setSeriousBug(BigDecimal.valueOf(seriousBug)); +// Long slightBug = bugList.stream().filter(o -> o.getSeverity() == 1).count(); +// dto.setSlightBug(BigDecimal.valueOf(slightBug)); +// +// +// //测试 if(`线上严重bug` = 0 AND `线上普通bug` = 0, 20, 20 - `线上严重bug` * 20 - `线上普通bug` * 5 ) +// if(u.getUserType()==UserType.CS){ +// dto.setBugScore( +// (seriousBug==0l&&slightBug==0l)?BigDecimal.valueOf(20):BigDecimal.valueOf(20).subtract(BigDecimal.valueOf(seriousBug).multiply(BigDecimal.valueOf(20).subtract(BigDecimal.valueOf(slightBug).multiply(BigDecimal.valueOf(5))))) +// ); +// }else{ +// dto.setBugScore((seriousBug==0l&&slightBug==0l)?BigDecimal.valueOf(10):BigDecimal.valueOf(10).subtract(BigDecimal.valueOf(seriousBug).multiply(BigDecimal.valueOf(10).subtract(BigDecimal.valueOf(slightBug).multiply(BigDecimal.valueOf(3)))))); +// } +// //其余 if(`线上严重bug` = 0 AND `线上普通bug` = 0, 10, 10 - `线上严重bug` * 10 - `线上普通bug` * 3 ) +// } +// if(u.getUserType()==UserType.CS){ +// //算绩效 `线上bug得分` + `准时率得分` + 50, +// dto.setScore(dto.getBugScore() .add(dto.getPunctualityScore()).add(BigDecimal.valueOf(50)) ); +// }else{ +// //`饱和率得分`+ `线上bug得分` + `准时率得分` + 25 +// dto.setScore(dto.getSaturationScore() .add(dto.getBugScore()).add(dto.getPunctualityScore()).add(BigDecimal.valueOf(25))); +// } + return dto; + } + PerformanceDTO buildXMJLScore(ZtUser u ,List approvalList,Date firstDayOfMonth,Date lastDayOfMonth,List taskList,Date d ){ + + PerformanceDTO dto=new PerformanceDTO(); + dto.setUserName(u.getNickname()); + dto.setAccount(u.getAccount()); + + dto.setMeetScore(getMeetScore(u,firstDayOfMonth,lastDayOfMonth)); +// //拆分任务工时 +// dto.setSplitTimeScore(s); + + //本月天数 + int workDaysInCurrentMonth = DateUtils.getWorkDaysInCurrentMonth(d); + //获取本月请假 + Integer applyTime=0; + if(!CollectionUtils.isEmpty(approvalList)){ + applyTime=getApprovalTime(approvalList,firstDayOfMonth);; + } + //本月天数 + dto.setDays(BigDecimal.valueOf(workDaysInCurrentMonth)); + //本月天数 请假天数 + dto.setApprovalDays(applyTime<1?BigDecimal.ZERO:BigDecimal.valueOf(applyTime).divide(BigDecimal.valueOf(60),2,BigDecimal.ROUND_HALF_UP)); + + + dto.setMeetScore(getSearchMeetScore(u,firstDayOfMonth,lastDayOfMonth)); + + return dto; + } + + private BigDecimal getSearchMeetScore(ZtUser u, Date start, Date end) { + List pIds = this.projectService.authProductList(); + if(CollectionUtils.isEmpty(pIds)){ + return BigDecimal.ZERO; + } + List list = this.meetingService.list(new QueryWrapper().lambda().in(ZtMeeting::getProductId, pIds) + .ge(ZtMeeting::getMeetingDate, start).le(ZtMeeting::getMeetingDate, end)); + if(CollectionUtils.isEmpty(list)){ + return BigDecimal.ZERO; + } + long weekCount = list.stream().filter(o -> o.getType() == MeetingTypeEnums.week).count(); + int weekMeetScore = (int)(weekCount==0?0:(weekCount>=4)?8:2*weekCount); + long storyCount = list.stream().filter(o -> o.getType() == MeetingTypeEnums.story).count(); + int storyScore= storyCount>0?2:0; + return BigDecimal.valueOf(storyScore+weekMeetScore); + + } + + PerformanceDTO buildXMZLScore(ZtUser u ,List approvalList,Date firstDayOfMonth,Date lastDayOfMonth,List taskList,Date d ){ + + PerformanceDTO dto=new PerformanceDTO(); + dto.setUserName(u.getNickname()); + dto.setAccount(u.getAccount()); + + //本月天数 + int workDaysInCurrentMonth = DateUtils.getWorkDaysInCurrentMonth(d); + //获取本月请假 + Integer applyTime=0; + if(!CollectionUtils.isEmpty(approvalList)){ + applyTime=getApprovalTime(approvalList,firstDayOfMonth);; + } + //本月天数 + dto.setDays(BigDecimal.valueOf(workDaysInCurrentMonth)); + //本月天数 请假天数 + dto.setApprovalDays(applyTime<1?BigDecimal.ZERO:BigDecimal.valueOf(applyTime).divide(BigDecimal.valueOf(60),2,BigDecimal.ROUND_HALF_UP)); + //可用工时 6小时算 + dto.setTotalTime( + dto.getApprovalDays().intValue()==0?dto.getDays().multiply(BigDecimal.valueOf(8)).setScale(2,BigDecimal.ROUND_HALF_UP) + :dto.getDays().multiply(BigDecimal.valueOf(8)).subtract(dto.getApprovalDays()).setScale(2,BigDecimal.ROUND_HALF_UP)); + //达标工时 + dto.setExamineTime(dto.getTotalTime().multiply(BigDecimal.valueOf(0.75))); + + + dto.setReleaseScore(getReleaseScore(u,firstDayOfMonth)); + + dto.setMeetScore(getMeetScore(u,firstDayOfMonth,lastDayOfMonth)); + + + //产出工时 算task + List taskTimeList = taskList.stream() + .filter(o->o.getFinishedDate()!=null&& + o.getFinishedDate().getTime()<=lastDayOfMonth.getTime() &&firstDayOfMonth.getTime()<=o.getFinishedDate().getTime() + ).collect(Collectors.toList()); + + BigDecimal finishAllTime = floatBatchAdd(taskTimeList.stream().map(o->o.getConsumed()).collect(Collectors.toList())); + List onTimeTask = 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()); + BigDecimal onTime=floatBatchAdd(onTimeTask.stream().map(o->o.getConsumed()).collect(Collectors.toList())); + //准时完成率 + BigDecimal onTimeFinishRate = BigDecimalUtils.isZero(finishAllTime) ? finishAllTime : onTime.divide(finishAllTime, 2, BigDecimal.ROUND_HALF_UP); + BigDecimal finishScope=BigDecimal.valueOf(20); + dto.setPunctualityScore(onTimeFinishRate.equals(BigDecimal.valueOf(1))?finishScope: + onTimeFinishRate.multiply(BigDecimal.valueOf(100)).intValue()<80?BigDecimal.ZERO: + finishScope.subtract(BigDecimal.valueOf(1).subtract(onTimeFinishRate).multiply(BigDecimal.valueOf(2)).multiply(BigDecimal.valueOf(100))) ); +// taskList + // punctualityScore 准时率得分 + // 1 2 严重 + long seriousBug = this.bugService.count(new QueryWrapper().lambda().between(ZtBug::getOpeneddate, firstDayOfMonth, lastDayOfMonth) + .in(ZtBug::getSeverity, 1)); + + //轻微 + long slightBug = this.bugService.count(new QueryWrapper().lambda().between(ZtBug::getOpeneddate, firstDayOfMonth, lastDayOfMonth) + .in(ZtBug::getSeverity, 2,3, 4)); + long totalBug = seriousBug*5+slightBug*1; + //缺陷检出率 TODO bug 数量 / 可用工时 250418尹工说的 + int bugFindScore=BigDecimalUtils.isZero(dto.getExamineTime()) ?0:BigDecimal.valueOf(totalBug).divide(dto.getExamineTime(),2,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).intValue()>20?30: + (30-(BigDecimal.valueOf(totalBug).divide(dto.getExamineTime(),2,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).intValue()-20)*2); + dto.setBugFindScore(BigDecimal.valueOf(bugFindScore<0?0:bugFindScore)); + //TODO 加分项1. 全月无Bug + //2. 当月绩效考核成绩95分以上 +10分 + + //线上bug 当月上线需求的线上Bug数量 TODO + + + + + //分配总工时 + taskTimeList = taskList.stream().filter(o->u.getAccount().equals(o.getAssignedTo())).collect(Collectors.toList()); + dto.setAllocationTime(floatBatchAdd(taskTimeList.stream().map(o->o.getEstimate()).collect(Collectors.toList()))); + + dto.setWorkTime(floatBatchAdd(taskList.stream().filter(o->u.getAccount().equals(o.getAssignedTo())).map(o -> o.getConsumed()).collect(Collectors.toList()))); + + //工作饱和度 + dto.setSaturation(dto.getTotalTime().floatValue()==0?BigDecimal.ZERO:dto.getAllocationTime().divide(dto.getExamineTime(),2,BigDecimal.ROUND_HALF_UP)); + float saturation = dto.getSaturation().floatValue(); + //完成准时率 TODO 延期 / 总完成 + 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())); + //准时完成率 + dto.setFinishPunctuality(taskTimeList.size()==0?BigDecimal.valueOf(0): + CollectionUtils.isEmpty(delayTaskList)?BigDecimal.valueOf(1): + BigDecimal.valueOf(1).subtract(BigDecimal.valueOf(delayTaskList.size()) + .divide(dto.getFinishTask(),2,BigDecimal.ROUND_HALF_UP))); + //工作饱和度 +// if(saturation<0.7){ +// // = 0 +// dto.setSaturationScore(BigDecimal.ZERO); +// }else{ +// if(saturation<0.9){ +// dto.setSaturationScore(BigDecimal.valueOf(40 - ( 0.9 - saturation ) * 100 * 1).setScale(2,BigDecimal.ROUND_HALF_UP)); +// }else{ +// dto.setSaturationScore(BigDecimal.valueOf(40)); +// } +// } +// BigDecimal finishPunctuality = dto.getFinishPunctuality(); +// // 准时率得分 ( `完成准时率` < 1 , 25 - (1 - `完成准时率`) * 100 * 1, 25 )) `准时率得分`, +// if(finishPunctuality.floatValue()<1){ +// //TODO 完成准时率 0.8 +// if(finishPunctuality.floatValue()<0.8){ +// dto.setPunctualityScore(BigDecimal.ZERO); +// }else{ +// dto.setPunctualityScore(BigDecimal.valueOf(25 - (1 - finishPunctuality.floatValue()) * 100 * 1).setScale(2,BigDecimal.ROUND_HALF_UP)); +// +// } +// }else{ +// //饱和率得分 +// dto.setPunctualityScore(BigDecimal.valueOf(25)); +// } + List bugList = this.bugService.list(new QueryWrapper().lambda().between(ZtBug::getOpeneddate, firstDayOfMonth, lastDayOfMonth) + .in(ZtBug::getSeverity, 1, 2).eq(ZtBug::getResolvedby,u.getAccount())); + return dto; + } + //满分30 + private BigDecimal getMeetScore(ZtUser u, Date start, Date end) { + List pIds = this.projectService.authProductList(); + if(CollectionUtils.isEmpty(pIds)){ + return BigDecimal.ZERO; + } + List list = this.meetingService.list(new QueryWrapper().lambda().in(ZtMeeting::getProductId, pIds) + .ge(ZtMeeting::getMeetingDate, start).le(ZtMeeting::getMeetingDate, end)); + if(CollectionUtils.isEmpty(list)){ + return BigDecimal.ZERO; + } + long weekCount = list.stream().filter(o -> o.getType() == MeetingTypeEnums.week).count(); + int weekMeetScore = (int)(weekCount==0?0:(weekCount>=4)?4*6:(24-(4-weekCount)*6)); + long storyCount = list.stream().filter(o -> o.getType() == MeetingTypeEnums.story).count(); + int storyScore= storyCount>0?6:0; + return BigDecimal.valueOf(storyScore+weekMeetScore); + } + + //默认20分 + private BigDecimal getReleaseScore(ZtUser u, Date firstDayOfMonth) { + //发布 + List authList = this.projectService.projectAuthList(); + if(CollectionUtils.isEmpty(authList)){ + return BigDecimal.valueOf(20); + } + Calendar dateInstance = Calendar.getInstance(); + dateInstance.setTime(firstDayOfMonth); +// Clead + Calendar start = Calendar.getInstance(); + int year = dateInstance.get(Calendar.YEAR); + int month = dateInstance.get(Calendar.MONTH); // 1代表一月份 + start.set(year, month -1, 15); // 设置年份和月份 + + Calendar end = Calendar.getInstance(); + end.set(year, month , 15); // 设置年份和月份 + List releasesList = this.releaseService.list(new QueryWrapper().lambda().in(ZtRelease::getProject, authList) + .ge(ZtRelease::getReleaseDate, start.getTime()).le(ZtRelease::getReleaseDate, end.getTime())); + if(!CollectionUtils.isEmpty(releasesList)){ + List details = this.releaseDetailsService.list(new QueryWrapper().lambda().in(ZtReleaseDetails::getReleaseId, releasesList.stream().map(o -> o.getId()).collect(Collectors.toList()))); + if(!CollectionUtils.isEmpty(details)){ + List storyIds = details.stream().filter(o -> o.getObjectType().equals("story")).map(o->o.getObjectId()).collect(Collectors.toList()); + if(!CollectionUtils.isEmpty(storyIds)){ + List storyList = this.storyService.listByIds(storyIds); + int i =0; + for (ZtStory st:storyList) { + Date releaseddate = st.getReleaseddate(); + Date ysDate = st.getYsDate(); + int days = DateUtils.daysBetween(releaseddate, ysDate==null?new Date():ysDate); + //超过14天扣钱 发布后超过14天未验收 + if(days>13){ + i+=1; + } + } + return BigDecimal.valueOf((20-i*5)<0?0:(20-i*5)) ; + } + } + } + return BigDecimal.valueOf(20); + } + + //老的 + PerformanceDTO buildCsScore(ZtUser u ,List approvalList,Date firstDayOfMonth,Date lastDayOfMonth,List taskList,Date d ){ PerformanceDTO dto=new PerformanceDTO(); dto.setUserName(u.getNickname()); @@ -933,13 +1571,6 @@ public class IZtCountService { return value/60; } - public static void main(String[] args) { - Date thisDay = new Date(); - thisDay.setHours(17); - thisDay.setMinutes(30); - thisDay.setSeconds(0); - System.out.print(thisDay); - } private List workTaskCounts(ZtCountQo qo) { @@ -1035,7 +1666,7 @@ public class IZtCountService { dto.setStartDate(DateUtils.formatDate(t.getRealstarted())); dto.setEndDate(DateUtils.formatDate(t.getFinishedDate())); dto.setPlanEndDate(DateUtils.formatDate(t.getDeadline())); - dto.setKeepTime(t.getFinishedDate()==null?(DateUtils.daysBetween(t.getRealstarted(),t.getFinishedDate())):(DateUtils.daysBetween(t.getEstStarted(),t.getDeadline()))); + dto.setKeepTime(t.getFinishedDate()!=null?(DateUtils.daysBetween(t.getRealstarted(),t.getFinishedDate())):(DateUtils.daysBetween(t.getEstStarted(),t.getDeadline()))); dto.setDelayRemark(((t.getFinishedDate()==null?new Date():t.getFinishedDate()).getTime()>DateUtils.getDayLast(t.getDeadline()).getTime())?"是":"否"); result.add(dto); } @@ -1554,39 +2185,148 @@ public class IZtCountService { } void generatorDevlopExcel(String name,PerformanceDTO performanceDTO,Date d){ - try (FileInputStream templateFile =new FileInputStream("scope开发.xlsx")) { - Map dataMap = new HashMap<>(); - dataMap.put("name", name); - dataMap.put("date", DateUtils.formatDate(d,"yyyy-MM")); - dataMap.put("准时率得分", performanceDTO.getPunctualityScore().toString()); - dataMap.put("代码质量", "10"); - dataMap.put("文档质量", "10"); - dataMap.put("饱和度得分", performanceDTO.getSaturationScore().toString()); - dataMap.put("线上bug得分", performanceDTO.getBugScore().toString()); - dataMap.put("工作态度", "5"); - dataMap.put("创新贡献", "0"); - dataMap.put("总分", devlopTotal( - dataMap.get("准时率得分"), - dataMap.get("线上bug得分"), - dataMap.get("代码质量"), - dataMap.get("文档质量"), - dataMap.get("饱和度得分"), - dataMap.get("工作态度") - )); + Map dataMap = new HashMap<>(); + dataMap.put("name", name); + dataMap.put("date", DateUtils.formatDate(d,"yyyy-MM")); + dataMap.put("准时率得分", performanceDTO.getPunctualityScore().toString()); + dataMap.put("Bug密度", performanceDTO.getBugScore().toString()); + dataMap.put("工作量饱和度", performanceDTO.getSaturationScore().toString()); + + dataMap.put("代码质量", "5"); + dataMap.put("工作质量", "5"); + dataMap.put("文档质量", "15"); + dataMap.put("工作态度和责任感", "5"); + dataMap.put("创新贡献", "0"); + dataMap.put("质量贡献", "0"); + dataMap.put("总分", devlopTotal( + dataMap.get("准时率得分"), + dataMap.get("Bug密度"), + dataMap.get("代码质量"), + dataMap.get("文档质量"), + dataMap.get("工作量饱和度"), + dataMap.get("工作态度和责任感") + )); + writeXlsx(name,"templates/scope/开发工程师.xlsx",name+"开发.xlsx",dataMap); + + } + + void generatorUiExcel(String name,PerformanceDTO performanceDTO,Date d){ + Map dataMap = new HashMap<>(); + dataMap.put("name", name); + dataMap.put("date", DateUtils.formatDate(d,"yyyy-MM")); + dataMap.put("总分","100"); + writeXlsx(name,"templates/scope/UI工程师.xlsx",name+"UI工程师.xlsx",dataMap); + InputStream templateFile =null; +// try { +// templateFile=IZtCountService.class.getClassLoader().getResourceAsStream("templates/scope/UI工程师.xlsx"); +//// templateFile = IZtCountService.class.getClassLoader().getResourceAsStream("templates/scope/开发工程师.xlsx"); +// +// +// //测试方案 +// // 读取模板 +// +// Workbook workbook = WorkbookFactory.create(templateFile); +// +// Sheet sheet = workbook.getSheetAt(0); +// workbook.setSheetName(0,name); +// // 替换占位符 +// for (Row row : sheet) { +// for (Cell cell : row) { +// if (cell.getCellType() == CellType.STRING) { +// String cellValue = cell.getStringCellValue(); +// for (Map.Entry entry : dataMap.entrySet()) { +// cellValue = cellValue.replace("{" + entry.getKey() + "}", entry.getValue()); +// } +// cell.setCellValue(cellValue); +// } +// } +// } +// +// // 生成新文件 +// try (FileOutputStream outputStream = new FileOutputStream(name+"UI工程师.xlsx")) { +// workbook.write(outputStream); +// } +// workbook.close(); +// }catch (Exception e){ +// log.error("",e); +// }finally { +// try { +// templateFile.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } + + } + void generatorXMJLExcel(ZtCountQo qo,String name,PerformanceDTO performanceDTO,Date d, List perList){ + Map userMap = userService.userMapByIds(null); + Map dataMap = new HashMap<>(); + + dataMap.put("name", name); + dataMap.put("date", DateUtils.formatDate(d,"yyyy-MM")); + + dataMap.put("任务管理",taskManageScore(perList,userMap)); + dataMap.put("bug",bugManageScore(qo,perList,userMap)); + + dataMap.put("版本计划完成率",versionPlanScore(qo,perList,userMap)); + dataMap.put("项目文档","10"); + dataMap.put("会议管理",performanceDTO.getMeetScore()+""); + dataMap.put("问题管理","5"); + dataMap.put("系统稳定性","10"); + dataMap.put("专业技能提升","5"); + + + + dataMap.put("总分",devlopTotal( + dataMap.get("版本计划完成率"), + dataMap.get("任务管理"), + dataMap.get("bug"), + dataMap.get("项目文档"), + dataMap.get("会议管理"), + dataMap.get("问题管理"), + dataMap.get("系统稳定性"), + dataMap.get("专业技能提升") + )); + + writeXlsx(name,"templates/scope/项目经理考核.xlsx",name+"项目经理考核.xlsx",dataMap); + + } + + private String versionPlanScore(ZtCountQo qo, List perList, Map userMap) { + return "20"; +// BigDecimal allocationTime =BigDecimal.ZERO; +// for (PerformanceDTO d:perList) { +// ZtUser ztUser = userMap.get(d.getAccount()); +// if(ztUser!=null&&ztUser.getUserType()==UserType.KFZ){ +// //可用工时 +// allocationTime=allocationTime.add(d.getAllocationTime()); +// } +// } +// return "0"; + + } + + private void writeXlsx(String name,String source, String toSource, Map dataMap) { + InputStream templateFile=null; + try { + templateFile=IZtCountService.class.getClassLoader().getResourceAsStream(source); +// templateFile = IZtCountService.class.getClassLoader().getResourceAsStream("templates/scope/开发工程师.xlsx"); + + //测试方案 // 读取模板 Workbook workbook = WorkbookFactory.create(templateFile); - workbook.setSheetName(0,name); - Sheet sheet = workbook.getSheetAt(0); + Sheet sheet = workbook.getSheetAt(0); + workbook.setSheetName(0,name); // 替换占位符 for (Row row : sheet) { for (Cell cell : row) { if (cell.getCellType() == CellType.STRING) { String cellValue = cell.getStringCellValue(); for (Map.Entry entry : dataMap.entrySet()) { - cellValue = cellValue.replace("${" + entry.getKey() + "}", entry.getValue()); + cellValue = cellValue.replace("{" + entry.getKey() + "}", entry.getValue()); } cell.setCellValue(cellValue); } @@ -1594,14 +2334,154 @@ public class IZtCountService { } // 生成新文件 - try (FileOutputStream outputStream = new FileOutputStream(name+"开发.xlsx")) { + FileOutputStream outputStream =null; + try { + outputStream = new FileOutputStream(toSource); workbook.write(outputStream); + }catch (Exception e){ + log.error("",e); + }finally { + if(outputStream!=null){ + outputStream.close(); + } } workbook.close(); - } catch (Exception e) { - e.printStackTrace(); + + }catch (Exception e){ + log.error("",e); + }finally { + try { + templateFile.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + } + + //项目管理员 线上BUG得分 满分20分 + private String bugManageScore(ZtCountQo qo,List perList,Map userMap) { + List pIds = this.projectService.authProductList(); + Date date = qo.getDate(); + Date firstDayOfMonth = DateUtils.getFirstDayOfMonth(date); + Date lastDayOfMonth = DateUtils.getLastDayOfMonth(date); + //线上bug + List bList = this.bugService.list(new QueryWrapper().lambda().in(ZtBug::getProduct, pIds) + .ge(ZtBug::getOpeneddate, firstDayOfMonth).le(ZtBug::getOpeneddate, lastDayOfMonth) + .eq(ZtBug::getBugType,"prod") + ); + if(CollectionUtils.isEmpty(bList)){ + return "20"; + } + + BigDecimal allocationTime =BigDecimal.ZERO; + for (PerformanceDTO d:perList) { + ZtUser ztUser = userMap.get(d.getAccount()); + if(ztUser!=null&&ztUser.getUserType()==UserType.KFZ){ + //可用工时 + allocationTime=allocationTime.add(d.getAllocationTime()); + } + } + + int i = BigDecimal.valueOf(bList.size()).divide(allocationTime,2,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).intValue(); + if(i<=5){ + return "20"; + } + //严重10 分 轻微3分一个 + int bugScore=0; + for (ZtBug b:bList) { + bugScore+=b.getSeverity()!=1?3:10; + } + if(bugScore>20){ + return "0"; + }else{ + return (20-bugScore)+""; + } + + } + + private String taskManageScore(List perList,Map userMap) { + + BigDecimal totalTime =BigDecimal.ZERO; + BigDecimal allocationTime =BigDecimal.ZERO; + for (PerformanceDTO d:perList) { + ZtUser ztUser = userMap.get(d.getAccount()); + if(ztUser!=null&&ztUser.getUserType()==UserType.KFZ){ + //可用工时 + totalTime=totalTime.add(d.getTotalTime()) ; + allocationTime=allocationTime.add(d.getAllocationTime()); + } + } + BigDecimal taskManageRate = BigDecimalUtils.isZero(allocationTime) ?BigDecimal.ZERO:totalTime.divide(allocationTime, 2, BigDecimal.ROUND_HALF_UP); + if(BigDecimalUtils.isZero(taskManageRate) ){ + return "0"; + } + BigDecimal taskRate = taskManageRate.multiply(BigDecimal.valueOf(100)); + int i = taskRate.intValue(); + if(i>95){ + return "20"; + }else if(91 dataMap = new HashMap<>(); + dataMap.put("name", name); + dataMap.put("date", DateUtils.formatDate(d,"yyyy-MM")); + dataMap.put("项目绩效",performanceDTO.getReleaseScore().toString()); + dataMap.put("项目文档","50"); + dataMap.put("会议管理",performanceDTO.getMeetScore().toString()); + dataMap.put("总分",devlopTotal(dataMap.get("项目绩效"),dataMap.get("项目文档"),dataMap.get("会议管理"))); + writeXlsx(name,"templates/scope/项目助理考核.xlsx",name+"项目助理考核.xlsx",dataMap); + + +// InputStream templateFile =null; +// try { +// templateFile=IZtCountService.class.getClassLoader().getResourceAsStream("templates/scope/项目助理考核.xlsx"); +//// templateFile = IZtCountService.class.getClassLoader().getResourceAsStream("templates/scope/开发工程师.xlsx"); +// +// +// +// //测试方案 +// // 读取模板 +// +// Workbook workbook = WorkbookFactory.create(templateFile); +// +// Sheet sheet = workbook.getSheetAt(0); +// workbook.setSheetName(0,name); +// // 替换占位符 +// for (Row row : sheet) { +// for (Cell cell : row) { +// if (cell.getCellType() == CellType.STRING) { +// String cellValue = cell.getStringCellValue(); +// for (Map.Entry entry : dataMap.entrySet()) { +// cellValue = cellValue.replace("{" + entry.getKey() + "}", entry.getValue()); +// } +// cell.setCellValue(cellValue); +// } +// } +// } +// +// // 生成新文件 +// try (FileOutputStream outputStream = new FileOutputStream(name+"项目助理考核.xlsx")) { +// workbook.write(outputStream); +// } +// workbook.close(); +// }catch (Exception e){ +// log.error("",e); +// }finally { +// try { +// templateFile.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } + + } + String devlopTotal(String ...args){ int i =0; for (String s:args) { @@ -1615,53 +2495,19 @@ public class IZtCountService { return i+""; } void generatorTestExcel(String name,PerformanceDTO performanceDTO,Date d){ - try (FileInputStream templateFile =new FileInputStream("scope测试.xlsx")) { - Map dataMap = new HashMap<>(); - dataMap.put("name", name); - dataMap.put("date", DateUtils.formatDate(d,"yyyy-MM")); - dataMap.put("准时率得分",performanceDTO.getPunctualityScore().toString()); - dataMap.put("测试方案", "20"); - dataMap.put("缺陷管理", "10"); - - dataMap.put("线上bug得分", performanceDTO.getBugScore().toString()); - dataMap.put("测试报告编写", "10"); - dataMap.put("测试技能", "5"); - dataMap.put("态度", "5"); - dataMap.put("创新贡献", "0"); - dataMap.put("总分", devlopTotal(dataMap.get("准时率得分") - ,dataMap.get("缺陷管理") - ,dataMap.get("线上bug得分") - ,dataMap.get("线上bug得分") - ,dataMap.get("测试技能") - ,dataMap.get("态度") - ,dataMap.get("创新贡献") )); - //测试方案 - // 读取模板 - - Workbook workbook = WorkbookFactory.create(templateFile); - Sheet sheet = workbook.getSheetAt(0); - workbook.setSheetName(0,name); - // 替换占位符 - for (Row row : sheet) { - for (Cell cell : row) { - if (cell.getCellType() == CellType.STRING) { - String cellValue = cell.getStringCellValue(); - for (Map.Entry entry : dataMap.entrySet()) { - cellValue = cellValue.replace("${" + entry.getKey() + "}", entry.getValue()); - } - cell.setCellValue(cellValue); - } - } - } - - // 生成新文件 - try (FileOutputStream outputStream = new FileOutputStream(name+"测试.xlsx")) { - workbook.write(outputStream); - } - workbook.close(); - } catch (Exception e) { - e.printStackTrace(); - } + Map dataMap = new HashMap<>(); + dataMap.put("name", name); + dataMap.put("date", DateUtils.formatDate(d,"yyyy-MM")); + dataMap.put("准时率得分",performanceDTO.getPunctualityScore().toString()); + dataMap.put("缺陷检出率", performanceDTO.getBugFindScore().toString()); + dataMap.put("测试文档", "20"); + dataMap.put("工作态度", "5"); + dataMap.put("质量贡献", "5"); + dataMap.put("线上Bug", "20"); + dataMap.put("总分", devlopTotal(dataMap.get("准时率得分") + ,dataMap.get("缺陷检出率"), dataMap.get("测试文档"), dataMap.get("工作态度"), dataMap.get("质量贡献"), dataMap.get("线上Bug")) + ); + writeXlsx(name,"templates/scope/测试工程师.xlsx",name+"测试.xlsx",dataMap); 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 8e95f43..78d3658 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtMeetingServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtMeetingServiceImpl.java @@ -85,6 +85,8 @@ public class ZtMeetingServiceImpl extends ServiceImpl userMap = userService.userMapByIds(null); Map map = getProductMap(); + Map sMap=getUserStoryMap(list); + for (ZtMeetingDTO d:list) { StringBuilder b=new StringBuilder(); if(!StringUtils.isEmpty(d.getUsers())){ @@ -97,6 +99,19 @@ public class ZtMeetingServiceImpl extends ServiceImpl(list); } + private Map getUserStoryMap(List list) { + List storyMeetList = list.stream().filter(o -> !StringUtils.isEmpty(o.getStoryIds())).collect(Collectors.toList()); + if(!CollectionUtils.isEmpty(storyMeetList)){ + List sIds =new ArrayList(); + for (ZtMeetingDTO d:storyMeetList) { + sIds.addAll(Arrays.asList(d.getStoryIds().split(","))); + } + List storyUsers = this.storyUserService.listByIds(sIds); + return storyUsers.stream().collect(Collectors.toMap(ZtStoryUser::getId,o->o)); + } + return new HashMap<>(); + } + private Map getProductMap() { List list = productService.list(); if(CollectionUtils.isEmpty(list)){ @@ -172,11 +200,9 @@ public class ZtMeetingServiceImpl extends ServiceImpl storyUsers = this.storyUserService.listByIds(Arrays.asList(ztMeeting.getStoryIds().split(","))); + ztMeetingDTO.setUserStoryName(storyUsers.stream().map(o->o.getTitle()).collect(Collectors.joining(","))); } if(ztMeetingDTO.getProductId()!=null){ @@ -215,7 +241,7 @@ public class ZtMeetingServiceImpl extends ServiceImpl{meetType}记录 {titleDate} \n" + "\n" + - "
会议名称: {name}
\n" + + "
会议主题: {name}
\n" + "
会议时间: {meetingDate}
\n" + "
会议地点: {address}
\n" + "
参会人员: {usersName}
\n" + @@ -226,7 +252,7 @@ public class ZtMeetingServiceImpl extends ServiceImpl textMap = new LinkedHashMap<>(); textMap.put("titleDate", DateUtils.formatDate(ztMeeting.getMeetingDate(),"yyyy-MM-dd")); - textMap.put("name", ztMeeting.getName()); + textMap.put("name", ztMeeting.getTitle()); pfdStr=pfdStr.replace("{meetType}",ztMeeting.getType().getValue()); pfdStr=pfdStr.replace("{titleDate}",DateUtils.formatDate(ztMeeting.getMeetingDate(),"yyyy-MM-dd ")); @@ -329,9 +355,4 @@ public class ZtMeetingServiceImpl extends ServiceImpl authList() { + LoginRiskUser loginRiskUser = RiskUserThreadLocal.get(); + if(loginRiskUser==null){ + throw new BusinessException("请登录"); + } + ZtUser user = userService.selectByName(RiskUserThreadLocal.get().getName()); if (user.getAccount().equals("admin")) { return this.baseMapper.selectList(new QueryWrapper() @@ -1473,20 +1476,24 @@ public class ZtProjectServiceImpl extends ServiceImpl teams = this.teamService.list(new QueryWrapper().lambda().eq(ZtTeam::getType, "execution") + .eq(ZtTeam::getRoot, execution)); + if(CollectionUtils.isEmpty(teams)){ + return new ArrayList<>(); + } List list = this.taskService.list(new QueryWrapper().lambda() .notIn(ZtTask::getStatus,"cancel","closed","reviewing" ,"draft") .ge(ZtTask::getEstStarted, firstDayOfMonth) - .le(ZtTask::getEstStarted, lastDayOfMonth) - .eq(ZtTask::getExecution, execution)); + .le(ZtTask::getEstStarted, lastDayOfMonth).in(ZtTask::getAssignedTo,teams.stream().map(o->o.getAccount()).collect(Collectors.toList()))); if (CollectionUtils.isEmpty(list)) { return new ArrayList<>(); } + List effList = this.effortService.list(new QueryWrapper().lambda() .in(ZtEffort::getObjectid, list.stream().map(o -> o.getId()).collect(Collectors.toList()))); - List teams = this.teamService.list(new QueryWrapper().lambda().eq(ZtTeam::getType, "execution") - .eq(ZtTeam::getRoot, execution)); + List accountIds = teams.stream().map(o -> o.getAccount()).distinct().collect(Collectors.toList()); if (CollectionUtils.isEmpty(accountIds)) { @@ -1774,12 +1781,15 @@ public class ZtProjectServiceImpl extends ServiceImpl products =null; if(project==null||project==0){ List productIds = authProductList(); + if(CollectionUtils.isEmpty(productIds)){ + return new PageInfo(); + } products=this.productService.listByIds(productIds); }else{ //产品 @@ -1801,12 +1811,20 @@ public class ZtProjectServiceImpl extends ServiceImpl(); } + List ztProjects = this.listByIds(execList.stream().map(o -> o.getExecution()).collect(Collectors.toList())); + ztProjects = ztProjects.stream().filter(o -> (o.getBegin().getTime() >= firstDayOfMonth.getTime() + && o.getBegin().getTime() <= lastDayOfMonth.getTime()) || ( + o.getEnd().getTime() >= firstDayOfMonth.getTime() + && o.getEnd().getTime() <= lastDayOfMonth.getTime() + )).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(ztProjects)) { + return new PageInfo<>(); + } + + List list =this.taskService.taskListByEIdsAndDate(firstDayOfMonth,lastDayOfMonth,execList.stream().map(o -> o.getExecution()) + .collect(Collectors.toList())); - List list = this.taskService.list(new QueryWrapper().lambda() - .between(ZtTask::getEstStarted, firstDayOfMonth, lastDayOfMonth) - .in(ZtTask::getExecution, execList.stream().map(o -> o.getExecution()) - .collect(Collectors.toList()))); if (CollectionUtils.isEmpty(list)) { return new PageInfo<>(); } @@ -1821,27 +1839,10 @@ public class ZtProjectServiceImpl extends ServiceImpl(); } -// 时间 T1 T2 -// 任务 T3 T4 - List ztProjects = this.listByIds(execList.stream().map(o -> o.getExecution()).collect(Collectors.toList())); - if (CollectionUtils.isEmpty(ztProjects)) { - return new PageInfo<>(); - } - // 查询日期范围内的迭代 - 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, execFilterList)); + .in(ZtTeam::getRoot, ztProjects.stream().map(o -> o.getId()) + .collect(Collectors.toList()))); List accountIds = teams.stream().map(o -> o.getAccount()).distinct().collect(Collectors.toList()); if (CollectionUtils.isEmpty(accountIds)) { @@ -1855,23 +1856,12 @@ public class ZtProjectServiceImpl extends ServiceImpl closeStatus = Arrays.asList("closed", "cancel"); for (String account :accountIds) { - List taskList = list.stream().filter(o->account.equals(o.getAssignedTo())) - .filter(o -> - ( - o.getFinishedDate()!=null - && (o.getFinishedDate().getTime() >= firstDayOfMonth.getTime() - && o.getFinishedDate().getTime() <= lastDayOfMonth.getTime())) - || - (o.getEstStarted()!=null&&o.getDeadline()!=null)&& - (( o.getDeadline().getTime()<=lastDayOfMonth.getTime()&& o.getDeadline().getTime()>=firstDayOfMonth.getTime()) - || - ( o.getEstStarted().getTime()<=lastDayOfMonth.getTime()&& o.getEstStarted().getTime()>=firstDayOfMonth.getTime())) - ).filter(o->o.getStatus().equals("done")) - .collect(Collectors.toList()); + List taskList = list.stream().filter(o->account.equals(o.getAssignedTo())).filter(o-> !closeStatus.contains(o.getStatus())).collect(Collectors.toList()); var d=new WorkDetailsDTO(); ZtUser ztUser = uMap.get(account); @@ -1887,45 +1877,36 @@ public class ZtProjectServiceImpl extends ServiceImpl taskCountList = list.stream().filter(o->account.equals(o.getAssignedTo())) - .filter(o -> - ( o.getFinishedDate()!=null&& (o.getFinishedDate().getTime() >= firstDayOfMonth.getTime() - && o.getFinishedDate().getTime() <= lastDayOfMonth.getTime())) - || - (o.getEstStarted()!=null&&o.getDeadline()!=null)&& - (( DateUtils.getDayLast(o.getDeadline()).getTime()<=lastDayOfMonth.getTime()&& DateUtils.getDayLast(o.getDeadline()).getTime()>=firstDayOfMonth.getTime()) - || - ( o.getEstStarted().getTime()<=lastDayOfMonth.getTime()&& o.getEstStarted().getTime()>=firstDayOfMonth.getTime())) - ).filter(o->!o.getStatus().equals("closed")) - .collect(Collectors.toList()); - d.setTaskCount(BigDecimal.valueOf(taskCountList.size())); + BigDecimal haveTime = BigDecimal.valueOf(DateUtils.getWorkDaysInCurrentMonth(date) * 6).subtract(applyTime < 1 ? BigDecimal.ZERO : d.getQjTime()); + d.setHaveTime(haveTime.intValue()<0?BigDecimal.ZERO:haveTime); - List delayList = list.stream().filter(o->account.equals(o.getAssignedTo())) - .filter(o -> - ( o.getFinishedDate()!=null&& (o.getFinishedDate().getTime() >= firstDayOfMonth.getTime() - && o.getFinishedDate().getTime() <= lastDayOfMonth.getTime())) - || - (o.getEstStarted()!=null&&o.getDeadline()!=null)&& - (( o.getDeadline().getTime()<=lastDayOfMonth.getTime()&& o.getDeadline().getTime()>=firstDayOfMonth.getTime()) - || - ( o.getEstStarted().getTime()<=lastDayOfMonth.getTime()&& o.getEstStarted().getTime()>=firstDayOfMonth.getTime())) - ) - .filter(o-> + //工作饱和度 + d.setSaturation(BigDecimalUtils.isZero(d.getHaveTime())?BigDecimal.valueOf(1):d.getWorkTime().compareTo(BigDecimal.ZERO)==0?BigDecimal.ZERO:d.getStoryTotalTime().divide(d.getHaveTime(),2,BigDecimal.ROUND_HALF_UP)); + // 任务总量 + d.setTaskCount(BigDecimal.valueOf(taskList.size())); + + List delayList = taskList.stream().filter(o-> ((o.getFinishedDate()!=null &&DateUtils.getDayLast(o.getFinishedDate()).getTime()>DateUtils.getDayLast(o.getDeadline()).getTime()) ) //实际完成大于预计完成 延期 ||o.getFinishedDate()==null &&lastDayOfMonth.getTime()>DateUtils.getDayLast(o.getDeadline()).getTime() - ) - .filter(o->!o.getStatus().equals("closed")) - .collect(Collectors.toList()); + ).collect(Collectors.toList()); //任务延期量 d.setTaskDelayCount(BigDecimal.valueOf(delayList.size())); + if(ztUser.getUserType()==UserType.CS||ztUser.getUserType()==UserType.KFZ){ + BigDecimal finishAllTime = BigDecimal.valueOf(floatBatchAdd(taskList.stream().map(o->o.getEstimate()).collect(Collectors.toList()))); + List onTimeTask = taskList.stream().filter(o -> o.getFinishedDate() != null + && o.getFinishedDate().getTime() <= DateUtils.getDayLast(o.getDeadline()).getTime()).collect(Collectors.toList()); + BigDecimal onTime=BigDecimal.valueOf(floatBatchAdd(onTimeTask.stream().map(o->o.getEstimate()) + .collect(Collectors.toList()))); + //准时完成率 + BigDecimal onTimeFinishRate = BigDecimalUtils.isZero(finishAllTime) ? finishAllTime : onTime.divide(finishAllTime, 2, BigDecimal.ROUND_HALF_UP); + d.setTaskFinishOnTimeRate(onTimeFinishRate.multiply(BigDecimal.valueOf(100)) ); + }else{ + d.setTaskFinishOnTimeRate(delayList.size()==0?BigDecimal.valueOf(100):BigDecimal.valueOf(100).subtract(BigDecimal.valueOf(delayList.size()).divide(d.getTaskCount(),2,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)))); + } //任务及时完成率 - d.setTaskFinishOnTimeRate(delayList.size()==0?BigDecimal.valueOf(100):BigDecimal.valueOf(100).subtract(BigDecimal.valueOf(delayList.size()).divide(d.getTaskCount(),2,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)))); List bugList = this.bugService.list(new QueryWrapper().lambda().in(ZtBug::getProduct, products.stream().map(o -> o.getId()).collect(Collectors.toList())) + .eq(ZtBug::getBugType,"prod") .between(ZtBug::getOpeneddate, firstDayOfMonth, lastDayOfMonth).eq(ZtBug::getResolvedby, account)); d.setBugCount(BigDecimal.valueOf(bugList.size())); @@ -2017,7 +1998,9 @@ public class ZtProjectServiceImpl extends ServiceImpl parentList(ZtProjectDTO dto) { List pIds = authList(); - + if(CollectionUtils.isEmpty(pIds)){ + return new ArrayList<>(); + } List ztProjects = this.baseMapper.selectList(new QueryWrapper().lambda() .eq(ZtProject::getType, "program") .eq(ZtProject::getDeleted, "0") @@ -2565,6 +2548,9 @@ public class ZtProjectServiceImpl extends ServiceImpl list) { BigDecimal f = BigDecimal.ZERO; for (Float i : list) { + if(i==null){ + continue; + } f = f.add(BigDecimal.valueOf(i)); } f = f.setScale(1, BigDecimal.ROUND_HALF_UP); 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 f2b4ae2..dd1e181 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtReleaseServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtReleaseServiceImpl.java @@ -320,6 +320,7 @@ public class ZtReleaseServiceImpl extends ServiceImpl 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()); + sendMail(ztStories); - //{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()); - } } - - - -// 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(), "", ""); @@ -445,6 +393,47 @@ public class ZtReleaseServiceImpl extends ServiceImpl ztStories) { + Map userMap = this.userService.userMapByIds(null); + Set mailTo =new HashSet<>(); + StringBuilder b=new StringBuilder(); + b.append("
Dear all:
"); + String title="{date} {productName}进行了系统迭代升级,请大家登录\"IT服务台\"及时完成需求验收。"; + title=title.replace("{date}",DateUtils.formatDate(new Date(),"yyyy-MM-dd")); + ZtProduct ztProduct = this.productService.getById(ztStories.get(0).getProduct()); + + title=title.replace("{productName}",ztProduct==null?"":ztProduct.getName()); + b.append("

"); + + b.append(title); + + b.append("

"); + b.append(""); + b.append("" + + "" + + "" ); + for (ZtStory s:ztStories) { + ZtUser ztUser = userMap.get(s.getYsUser()); + if(ztUser!=null&&!StringUtils.isEmpty(ztUser.getEmail())){ + String str= "" + + ""; + str=str.replace("{nickName}",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}
{nickName}
"); + if(!CollectionUtils.isEmpty(mailTo)){ + SendEmail.sendMessage("需求发布提醒:",mailTo.stream().collect(Collectors.toList()), + null, + b.toString()); + } + } + @Override public List> execMenu(ZtReleaseQo qo) { @@ -486,6 +475,15 @@ public class ZtReleaseServiceImpl extends ServiceImpl ztProject = executionMapByStory.get(d.getId()); // if(ztProject!=null){ // d.setExecution(ztProject.getId()); diff --git a/src/main/java/com/sa/zentao/service/impl/ZtStoryFeedbackServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtStoryFeedbackServiceImpl.java index 927398a..2c23d24 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtStoryFeedbackServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtStoryFeedbackServiceImpl.java @@ -146,6 +146,10 @@ public class ZtStoryFeedbackServiceImpl extends ServiceImpl处理描述:

"+dto.getDontHandRemark() , null); } @Override 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 cc6826a..78130c8 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtStoryServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtStoryServiceImpl.java @@ -1251,6 +1251,10 @@ public class ZtStoryServiceImpl extends ServiceImpl impl } @Override public void taskFinishChangeStatus(Integer story, String finishBy,TaskType type,Boolean cancelFlag) { + ZtStory ztStory = this.getById(story); + if(ztStory!=null&&ztStory.getStatus().equals("closed")){ + return; + } if(type!=TaskType.test&&type!=TaskType.devel){ return; } @@ -1847,6 +1851,7 @@ public class ZtStoryServiceImpl extends ServiceImpl impl this.closeTaskBug(ztStory.getId()); if(ztStory.getUserStory()!=null&&ztStory.getUserStory()!=0){ + //研发需求关闭去验收用户需求 storyUserService.storyFinishedChangeStatus(ztStory.getUserStory(),UserStoryEnums.YWC); // storyUserService.storyFinishedChangeStatus(ztStory.getUserStory(),UserStoryEnums.CFM); } @@ -2178,6 +2183,12 @@ public class ZtStoryServiceImpl extends ServiceImpl impl } d.setBugList(ztBugDTOS); } + List specList = this.storyspecService.list(new QueryWrapper().lambda().eq(ZtStoryspec::getStory, d.getId())); + if(!CollectionUtils.isEmpty(specList)){ + ZtStoryspec ztStoryspec = specList.get(0); + d.setSpec(ztStoryspec.getSpec()); + d.setVerify(ztStoryspec.getVerify()); + } return d; } @@ -2287,7 +2298,8 @@ public class ZtStoryServiceImpl extends ServiceImpl impl public List storyListByProductId(ZtProjectQo qo) { LambdaQueryWrapper eq = new QueryWrapper() .lambda().eq(ZtStory::getProduct, qo.getProductId()) - .eq(ZtStory::getDeleted, "0"); + .eq(ZtStory::getDeleted, "0") + .orderByDesc(ZtStory::getId); if (qo.getProject() != null) { List list = taskService.list(new QueryWrapper().lambda() .eq(ZtTask::getExecution, qo.getProject())); 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 b6eae8a..4ebb548 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtStoryUserServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtStoryUserServiceImpl.java @@ -22,6 +22,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.SendEmail; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -41,6 +42,7 @@ import java.util.stream.Collectors; * @since 2024-10-21 */ @Service +@Slf4j public class ZtStoryUserServiceImpl extends ServiceImpl implements IZtStoryUserService { @Autowired @@ -68,27 +70,21 @@ public class ZtStoryUserServiceImpl extends ServiceImpl 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++) { @@ -168,27 +195,47 @@ public class ZtStoryUserServiceImpl extends ServiceImpl().lambda().eq(ZtStoryUserspec::getStory, id)); + if (spec == null) { + spec = new ZtStoryUserspec(); + spec.setStory(id); + spec.setVersion(1); + spec.setTitle(ztStory.getTitle()); + spec.setSpec(dto.getSpec()); + spec.setVerify(dto.getVerify()); + spec.setFiles(dto.getFileUrl()); + storyUserspecService.save(spec); + } else { + spec.setVersion(1); + spec.setTitle(ztStory.getTitle()); + spec.setSpec(dto.getSpec()); + spec.setVerify(dto.getVerify()); + spec.setFiles(dto.getFileUrl()); + storyUserspecService.update(new UpdateWrapper().lambda().eq(ZtStoryUserspec::getStory, id) + .set(ZtStoryUserspec::getSpec, dto.getSpec()) + .set(ZtStoryUserspec::getVerify, dto.getVerify()) + .set(ZtStoryUserspec::getFiles, dto.getFileUrl()) + ); + } + 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(), ""); + } @@ -202,21 +249,36 @@ public class ZtStoryUserServiceImpl extends ServiceImpl(Arrays.asList(split))); } - List integers = this.projectService.authProductList(); + long l = System.currentTimeMillis(); + + List pIds = this.projectService.authProductList(); + long l2 = System.currentTimeMillis(); + log.info("耗时---------------------------------- {}",l2-l); + if(CollectionUtils.isEmpty(pIds)&&CollectionUtils.isEmpty(qo.getStoryIds())){ + return new PageInfo(); + } + + qo.setProductIds(pIds); + l = System.currentTimeMillis(); Page page = PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize()); - qo.setProductIds(integers); List list = this.baseMapper.pageList(qo); + l2 = System.currentTimeMillis(); + log.info("耗时----------------------------------2222 {}",l2-l); if (!CollectionUtils.isEmpty(list)) { List userIds = list.stream().map(o -> o.getOpenedby()).collect(Collectors.toList()); userIds.addAll(list.stream().map(o -> o.getLasteditedby()).collect(Collectors.toList())); - + l = System.currentTimeMillis(); Map userMap = this.userService.userMapByIds(null); + l2 = System.currentTimeMillis(); + log.info("耗时---------------------------------- {}",l2-l); + l = System.currentTimeMillis(); Map> storyUserMap = getStoryUserMap(list); - + l2 = System.currentTimeMillis(); + log.info("耗时---------------------------------- {}",l2-l); Map> rMap = getReviewMap(list); for (ZtStoryUserDTO d : list) { @@ -283,7 +345,9 @@ public class ZtStoryUserServiceImpl extends ServiceImpl storyListByProductId(ZtProjectQo qo) { LambdaQueryWrapper eq = new QueryWrapper() .lambda().eq(ZtStoryUser::getProduct, qo.getProductId()) - .eq(ZtStoryUser::getDeleted, "0"); + .eq(ZtStoryUser::getDeleted, "0") + + .orderByDesc(ZtStoryUser::getId); List ztStories = this.baseMapper.selectList(eq); if (CollectionUtils.isEmpty(ztStories)) { @@ -339,16 +403,24 @@ public class ZtStoryUserServiceImpl extends ServiceImpl你好: {userName}

"); - b.append("

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

"); - b.append("

需求编号: {storyId}

"); - b.append("

需求名称: {storyName}

"); - b.append("

 

"); - b.append("

 

"); - b.append("

 

"); - b.append("

 

"); - b.append("

 

"); - b.append("

谢谢。

"); + b.append("

"); + b.append("

您好:{userName}

"); + b.append("


"); + b.append("

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

"); + b.append("


"); + b.append("

    需求编号: {storyId}

"); + b.append("

    需求名称: {storyName}

"); + +// 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(); @@ -531,6 +603,13 @@ public class ZtStoryUserServiceImpl extends ServiceImpl specList = this.storyUserspecService.list(new QueryWrapper().lambda().eq(ZtStoryUserspec::getStory, dto.getId())); + if(!CollectionUtils.isEmpty(specList)){ + ZtStoryUserspec ztStoryUserspec = specList.get(0); + dto.setSpec(ztStoryUserspec.getSpec()); + dto.setVerify(ztStoryUserspec.getVerify()); + } + return dto; } diff --git a/src/main/java/com/sa/zentao/service/impl/ZtStoryUserTaskServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtStoryUserTaskServiceImpl.java index cc6fb3e..d385ade 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtStoryUserTaskServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtStoryUserTaskServiceImpl.java @@ -268,7 +268,7 @@ public class ZtStoryUserTaskServiceImpl extends ServiceImpl + * 服务实现类 + *

+ * + * @author gqb + * @since 2025-04-15 + */ +@Service +public class ZtStoryUserspecServiceImpl extends ServiceImpl implements IZtStoryUserspecService { + +} diff --git a/src/main/java/com/sa/zentao/service/impl/ZtTaskServiceImpl.java b/src/main/java/com/sa/zentao/service/impl/ZtTaskServiceImpl.java index b5b0d47..30fdec1 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtTaskServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtTaskServiceImpl.java @@ -311,6 +311,23 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme return this.baseMapper.itApprovalByUserName(s, firstDayOfMonth, lastDayOfMonth); } + @Override + public List taskListByEIdsAndDate(Date firstDayOfMonth, Date lastDayOfMonth, List eIds) { + if(CollectionUtils.isEmpty(eIds)){ + return new ArrayList<>(); + } + if(firstDayOfMonth==null||lastDayOfMonth==null){ + return new ArrayList<>(); + } + List taskList = this.list(new QueryWrapper().lambda() + .and(o->o.between(ZtTask::getDeadline, firstDayOfMonth,lastDayOfMonth) + .or() + .between(ZtTask::getFinishedDate, firstDayOfMonth,lastDayOfMonth) + ) + .in(ZtTask::getExecution, eIds)); + return taskList; + } + @Override public PageInfo myTaskPageList(ZtProjectQo qo) { @@ -750,9 +767,7 @@ public class ZtTaskServiceImpl extends ServiceImpl impleme } ztTask.setConsumed(dto.getConsumed() + ztTask.getConsumed()); ztTask.setLeft(ztTask.getEstimate() - ztTask.getConsumed()); - if(ztTask.getLeft()<0){ - ztTask.setLeft(0f); - } + ztTask.setLeft(0f); ztTask.setStatus("done"); if(ztTask.getFinishedFlag()!=null&&ztTask.getFinishedFlag()==1){ ztTask.setFinishedby(ztTask.getAssignedTo()); 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 d2b7123..98788ab 100644 --- a/src/main/java/com/sa/zentao/service/impl/ZtUserServiceImpl.java +++ b/src/main/java/com/sa/zentao/service/impl/ZtUserServiceImpl.java @@ -7,10 +7,7 @@ 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.entity.*; import com.sa.zentao.enums.ActionStatus; import com.sa.zentao.enums.ActionType; import com.sa.zentao.mapper.ZtUserMapper; @@ -18,6 +15,7 @@ import com.sa.zentao.qo.ZtUserQo; import com.sa.zentao.service.*; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.sa.zentao.utils.BeanCopyUtil; +import com.sa.zentao.utils.ChineseUtil; import com.sa.zentao.utils.CryptoUtils; import com.tencentcloudapi.common.Credential; import com.tencentcloudapi.common.exception.TencentCloudSDKException; @@ -25,6 +23,7 @@ import com.tencentcloudapi.sms.v20190711.SmsClient; import com.tencentcloudapi.sms.v20190711.models.SendSmsRequest; import com.tencentcloudapi.sms.v20190711.models.SendSmsResponse; 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; @@ -61,6 +60,10 @@ public class ZtUserServiceImpl extends ServiceImpl impleme @Autowired private IZtActionService actionService; + @Autowired + private IBaseUserRoleService userRoleService; + @Autowired + private IBaseRoleService baseRoleService; @Override @@ -76,25 +79,63 @@ public class ZtUserServiceImpl extends ServiceImpl impleme List ztUserDTOS = BeanCopyUtil.copyListProperties(list, ZtUserDTO::new); PageInfo ztUserDTOPageInfo = new PageInfo<>(ztUserDTOS); ztUserDTOPageInfo.setTotal(page.getTotal()); - for (ZtUserDTO dto:ztUserDTOS) { - if(!StringUtils.isEmpty(dto.getVx())){ - dto.setVx(CryptoUtils.aesDecryptForFront(dto.getVx(), CryptoUtils.KEY_DES)); - } + if(!CollectionUtils.isEmpty(ztUserDTOS)){ + Map> roleMap= getUserRoleMap(ztUserDTOS); - if(dto.getUserType()!=null){ - dto.setUserTypeValue(dto.getUserType().getValue()); - } - if(!StringUtils.isEmpty(dto.getProductIds())){ - String[] split = dto.getProductIds().split(","); - List ztProjects = projectService.listByIds(Arrays.asList(split)); - dto.setProductNames(ztProjects.stream().map(o->o.getName()).collect(Collectors.joining(","))); + for (ZtUserDTO dto:ztUserDTOS) { + if(!StringUtils.isEmpty(dto.getVx())){ + dto.setVx(CryptoUtils.aesDecryptForFront(dto.getVx(), CryptoUtils.KEY_DES)); + } + if(dto.getUserType()!=null){ + dto.setUserTypeValue(dto.getUserType().getValue()); + } + if(!StringUtils.isEmpty(dto.getProductIds())){ + String[] split = dto.getProductIds().split(","); + List ztProjects = projectService.listByIds(Arrays.asList(split)); + dto.setProductNames(ztProjects.stream().map(o->o.getName()).collect(Collectors.joining(","))); + } + List baseUserRoles = roleMap.get(dto.getAccount()); + if(!CollectionUtils.isEmpty(baseUserRoles)){ + dto.setRoleTypeValue(baseUserRoles.stream().map(o->o.getName()).collect(Collectors.joining(","))); + dto.setRoleList(baseUserRoles.stream().map(o->o.getId()).collect(Collectors.toList())); + } } } + return ztUserDTOPageInfo; } + private Map> getUserRoleMap(List ztUserDTOS) { + List uRoleList = this.userRoleService.list(new QueryWrapper().lambda().in(BaseUserRole::getUserId, + ztUserDTOS.stream().map(o -> o.getAccount()).collect(Collectors.toList()))); + + if(CollectionUtils.isEmpty(uRoleList)){ + return new HashMap<>(); + } + List baseRoles = this.baseRoleService.listByIds(uRoleList.stream().map(o -> o.getRoleId()).collect(Collectors.toList())); + Map rMap = baseRoles.stream().collect(Collectors.toMap(BaseRole::getId, o -> o)); + Map> result=new HashMap<>(); + for (BaseUserRole baseUserRole:uRoleList) { + + String userId = baseUserRole.getUserId(); + List exitsList = result.get(userId); + if(CollectionUtils.isEmpty(exitsList)){ + exitsList=new ArrayList<>(); + } + BaseRole baseRole = rMap.get(baseUserRole.getRoleId()); + if(baseRole==null){ + continue; + } + exitsList.add(baseRole); + result.put(userId,exitsList); + } + return result; + + + } + @Override public ZtUser selectByName(String name) { ZtUser ztUser = this.baseMapper.selectOne(new QueryWrapper().lambda().eq(ZtUser::getAccount, name)); @@ -300,6 +341,86 @@ public class ZtUserServiceImpl extends ServiceImpl impleme return this.baseMapper.selectOne(new QueryWrapper().lambda().eq(ZtUser::getAccount, openedby)); } + @Override + public void addUser(ZtUserDTO user) { + ZtUser login = this.getOne(new QueryWrapper().lambda().eq(ZtUser::getAccount, user.getAccount())); + if(login!=null){ + throw new BusinessException("存在"); + } + ZtUser ztUser = new ZtUser(); + BeanUtils.copyProperties(user,ztUser); + List productList = user.getProductList(); + if(!CollectionUtils.isEmpty(productList)){ + ztUser.setProductIds(StringUtils.join(productList,",")); + } + + ztUser.setPinyin(ChineseUtil.getFirst(ztUser.getNickname())); + if(!StringUtils.isEmpty(ztUser.getVx())){ + ztUser.setVx(CryptoUtils.aesEncryptForFront(ztUser.getVx(), CryptoUtils.KEY_DES)); + } + + this.save(ztUser); + + List roleList = user.getRoleList(); + if(!CollectionUtils.isEmpty(roleList)){ + userRoleService.addUserRole(ztUser.getAccount(),roleList); + } + this.actionService.addAction(ActionType.USER, ActionStatus.XJ,ztUser.getId(),null,null,null, RiskUserThreadLocal.get().getName(),null,ztUser.getAccount()); + + } + + @Override + @Transactional + public void modifyUser(ZtUserDTO user) { + ZtUser ztUser = getById(user.getId()); + + if(ztUser==null){ + throw new BusinessException("不存在"); + } + List list = list(new QueryWrapper().lambda().eq(ZtUser::getAccount, user.getAccount()) + .ne(ZtUser::getId, user.getId()) + ); + + if(!CollectionUtils.isEmpty(list)){ + throw new BusinessException("请检查用户"); + } + if(!ztUser.getNickname().equals(user.getNickname())){ + ztUser.setPinyin(ChineseUtil.getFirst(ztUser.getNickname())); + } + + if(!StringUtils.isEmpty(user.getVx())){ + ztUser.setVx(CryptoUtils.aesEncryptForFront(user.getVx(), CryptoUtils.KEY_DES)); + } + + ztUser.setAccount(user.getAccount()); + + ztUser.setPassword(user.getPassword()); + ztUser.setUserType(user.getUserType()); + ztUser.setEmail(user.getEmail()); + ztUser.setPhone(user.getPhone()); + if(!CollectionUtils.isEmpty(user.getProductList())){ + ztUser.setProductIds(StringUtils.join(user.getProductList(),",")); + } + ztUser.setNickname(user.getNickname()); + ztUser.setColor(user.getColor()); + ztUser.setDeptName(user.getDeptName()); + this.updateById(ztUser); +// this.userService.update(new UpdateWrapper().lambda() +// .set(ZtUser::getPassword,user.getPassword()) +// .set(ZtUser::getUserType,user.getUserType()) +// .set(ZtUser::getEmail,user.getEmail()) +// .set(ZtUser::getProductIds,ztUser.getProductIds()) +// .set(ZtUser::getColor,user.getColor()) +// .set(ZtUser::getPhone,user.getPhone()) +// .set(ZtUser::getNickname,user.getNickname()) +// .eq(ZtUser::getId,ztUser.getId()) +// ); + userRoleService.modifyUserRole(ztUser.getAccount(),user.getRoleList()); + + this.actionService.addAction(ActionType.USER, ActionStatus.BJ,ztUser.getId(),null,null,null,RiskUserThreadLocal.get().getName(),null,user.getAccount()); + + } + public boolean sendSms(String phoneNumber, String verificationCode) { try { // 初始化腾讯云短信服务客户端 diff --git a/src/main/java/com/sa/zentao/utils/BigDecimalUtils.java b/src/main/java/com/sa/zentao/utils/BigDecimalUtils.java new file mode 100644 index 0000000..cbbd866 --- /dev/null +++ b/src/main/java/com/sa/zentao/utils/BigDecimalUtils.java @@ -0,0 +1,21 @@ +package com.sa.zentao.utils; + +import java.math.BigDecimal; + +public class BigDecimalUtils { + + + public static boolean isZero(BigDecimal v){ + if(v==null){ + return true; + } + + int i = v.compareTo(BigDecimal.ZERO); + if(i==0){ + return true; + }else{ + return false; + } + + } +} diff --git a/src/main/java/com/sa/zentao/utils/DateUtils.java b/src/main/java/com/sa/zentao/utils/DateUtils.java index 5f466a8..237d563 100644 --- a/src/main/java/com/sa/zentao/utils/DateUtils.java +++ b/src/main/java/com/sa/zentao/utils/DateUtils.java @@ -12,6 +12,7 @@ import java.time.ZoneId; import java.time.temporal.ChronoUnit; import java.util.*; + @Slf4j public class DateUtils { static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); @@ -88,13 +89,20 @@ public class DateUtils { if(smdate==null||bdate==null){ return 0; } - Calendar cal = Calendar.getInstance(); - cal.setTime(smdate); - long time1 = cal.getTimeInMillis(); - cal.setTime(bdate); - long time2 = cal.getTimeInMillis(); - long between_days = (time2 - time1) / 86400000L; - return Integer.parseInt(String.valueOf(between_days)); +// log.info("smdate = {} , bdate = {} ,getYear = {} getMonth = {} getDay ={} ", +// DateUtils.formatDate(smdate), DateUtils.formatDate(bdate),smdate.getYear(),smdate.getMonth(),smdate.getDay()); + LocalDate date1 = smdate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + LocalDate date2 = bdate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); +// LocalDate date1 = LocalDate.of(smdate.getYear(), smdate.getMonth(), smdate.getDay()); +// LocalDate date2 = LocalDate.of(bdate.getYear(), bdate.getMonth(), bdate.getDay()); + return (int)ChronoUnit.DAYS.between(date1, date2); +// Calendar cal = Calendar.getInstance(); +// cal.setTime(smdate); +// long time1 = cal.getTimeInMillis(); +// cal.setTime(bdate); +// long time2 = cal.getTimeInMillis(); +// long between_days = (time2 - time1) / 86400000L; +// return Integer.parseInt(String.valueOf(between_days)); } public static int secondBetween(Date smdate, Date bdate) { @@ -115,10 +123,12 @@ public class DateUtils { public static String formatDate(Date smdate) { //todo s Index 14 out of bounds for length 13 - return smdate == null ? "" : sdf.format(smdate); + synchronized (Object.class){ + return smdate == null ? "" : sdf.format(smdate); + } } public static Date parseDate(String smdate, String f) { - SimpleDateFormat sdf = new SimpleDateFormat(f); + SimpleDateFormat sdf = new SimpleDateFormat(f); try { return sdf.parse(smdate); } catch (ParseException e) { @@ -509,25 +519,25 @@ public class DateUtils { } public static int getAge(Date birthDay){ - Calendar cal = Calendar.getInstance(); - if (cal.before(birthDay)) { //出生日期晚于当前时间,无法计算 - throw new IllegalArgumentException( - "The birthDay is before Now.It's unbelievable!"); - } - int yearNow = cal.get(Calendar.YEAR); //当前年份 - int monthNow = cal.get(Calendar.MONTH); //当前月份 - int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH); //当前日期 - cal.setTime(birthDay); - int yearBirth = cal.get(Calendar.YEAR); - int monthBirth = cal.get(Calendar.MONTH); - int dayOfMonthBirth = cal.get(Calendar.DAY_OF_MONTH); - int age = yearNow - yearBirth; //计算整岁数 - if (monthNow <= monthBirth) { - if (monthNow == monthBirth) { - if (dayOfMonthNow < dayOfMonthBirth) age--;//当前日期在生日之前,年龄减一 - }else{ - age--;//当前月份在生日之前,年龄减一 - } } return age; + Calendar cal = Calendar.getInstance(); + if (cal.before(birthDay)) { //出生日期晚于当前时间,无法计算 + throw new IllegalArgumentException( + "The birthDay is before Now.It's unbelievable!"); + } + int yearNow = cal.get(Calendar.YEAR); //当前年份 + int monthNow = cal.get(Calendar.MONTH); //当前月份 + int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH); //当前日期 + cal.setTime(birthDay); + int yearBirth = cal.get(Calendar.YEAR); + int monthBirth = cal.get(Calendar.MONTH); + int dayOfMonthBirth = cal.get(Calendar.DAY_OF_MONTH); + int age = yearNow - yearBirth; //计算整岁数 + if (monthNow <= monthBirth) { + if (monthNow == monthBirth) { + if (dayOfMonthNow < dayOfMonthBirth) age--;//当前日期在生日之前,年龄减一 + }else{ + age--;//当前月份在生日之前,年龄减一 + } } return age; } public static Date parse(String date, String format){ SimpleDateFormat f=new SimpleDateFormat(format); diff --git a/src/main/java/com/sa/zentao/utils/ExcelUtil.java b/src/main/java/com/sa/zentao/utils/ExcelUtil.java index 7e1e511..d287c25 100644 --- a/src/main/java/com/sa/zentao/utils/ExcelUtil.java +++ b/src/main/java/com/sa/zentao/utils/ExcelUtil.java @@ -115,7 +115,12 @@ public class ExcelUtil { } // 不同数据类型处理 CellType fromCellType = fromCell.getCellType(); - toCell.setCellType(fromCellType); + try { + toCell.setCellType(fromCellType); + }catch (Exception e){ + toCell.setCellType(CellType.STRING); + } + if (fromCellType == CellType.NUMERIC) { if (DateUtil.isCellDateFormatted(fromCell)) { toCell.setCellValue(fromCell.getDateCellValue()); diff --git a/src/main/java/com/sa/zentao/utils/SendEmail.java b/src/main/java/com/sa/zentao/utils/SendEmail.java index 4f8e77a..35dd86f 100644 --- a/src/main/java/com/sa/zentao/utils/SendEmail.java +++ b/src/main/java/com/sa/zentao/utils/SendEmail.java @@ -135,8 +135,10 @@ public class SendEmail { System.out.println("邮件发送成功!"); } catch (UnsupportedEncodingException e) { + log.error("",e); throw new BusinessException("邮件发送失败"); }catch (MessagingException e) { + log.error("",e); throw new BusinessException("邮件发送失败"); } } diff --git a/src/main/java/com/sa/zentao/utils/TreeUtils.java b/src/main/java/com/sa/zentao/utils/TreeUtils.java new file mode 100644 index 0000000..c6403c4 --- /dev/null +++ b/src/main/java/com/sa/zentao/utils/TreeUtils.java @@ -0,0 +1,51 @@ +package com.sa.zentao.utils; + + + + + +import com.sa.zentao.dao.BaseMenuDTO; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @athor wangyuhang + */ +public class TreeUtils { + + /** + * 使用递归方法建树 + * + * @param treeNodes + * @return + */ + public static List buildByRecursive(List treeNodes, Object root) { + List trees = new ArrayList<>(); + treeNodes = treeNodes.stream().distinct().collect(Collectors.toList()); + + for (BaseMenuDTO treeNode : treeNodes) { + if (Objects.equals(root, treeNode.getParentId())) { + trees.add(findChildren(treeNode, treeNodes)); + } + } + return trees; + } + + /** + * 递归查找子节点 + * + * @param treeNodes + * @return + */ + public static BaseMenuDTO findChildren(BaseMenuDTO treeNode, List treeNodes) { + for (BaseMenuDTO it : treeNodes) { + if (treeNode.getId().equals(it.getParentId())) { + treeNode.add(findChildren(it, treeNodes)); + } + } + return treeNode; + } +} \ No newline at end of file diff --git a/src/main/resources/mapper/BaseMenuMapper.xml b/src/main/resources/mapper/BaseMenuMapper.xml new file mode 100644 index 0000000..538178c --- /dev/null +++ b/src/main/resources/mapper/BaseMenuMapper.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + delete from base_menu where id=#{id} or parent_id=#{id} + + + + + + + + + + diff --git a/src/main/resources/mapper/BaseRoleAuthorityMapper.xml b/src/main/resources/mapper/BaseRoleAuthorityMapper.xml new file mode 100644 index 0000000..c6187ef --- /dev/null +++ b/src/main/resources/mapper/BaseRoleAuthorityMapper.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + DELETE from base_role_authority where role_id =#{roleId} + + + + delete from base_role_authority where 1=1 + + and role_id in + + #{item} + + + + and menu_id in + + #{item} + + + + + diff --git a/src/main/resources/mapper/BaseRoleMapper.xml b/src/main/resources/mapper/BaseRoleMapper.xml new file mode 100644 index 0000000..e25ab1f --- /dev/null +++ b/src/main/resources/mapper/BaseRoleMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/mapper/BaseUserRoleMapper.xml b/src/main/resources/mapper/BaseUserRoleMapper.xml new file mode 100644 index 0000000..bade3ca --- /dev/null +++ b/src/main/resources/mapper/BaseUserRoleMapper.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/main/resources/mapper/ZtMeetingMapper.xml b/src/main/resources/mapper/ZtMeetingMapper.xml index 92de9a9..27d6622 100644 --- a/src/main/resources/mapper/ZtMeetingMapper.xml +++ b/src/main/resources/mapper/ZtMeetingMapper.xml @@ -17,8 +17,8 @@