From 4363831d801ee3e7a8a9032008f62856dc7e6a92 Mon Sep 17 00:00:00 2001 From: xiangZr-hhh <“2774915446@qq.com”> Date: Mon, 22 Apr 2024 20:15:54 +0800 Subject: [PATCH 1/8] =?UTF-8?q?patch=EF=BC=9A=E5=88=A0=E9=99=A4=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE/=E5=AD=90=E7=B3=BB=E7=BB=9F/=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 同时删除对应审核信息 --- src/main/java/com/jsl/oa/dao/ReviewDAO.java | 12 +++++ .../java/com/jsl/oa/mapper/ReviewMapper.java | 8 ++++ .../oa/services/impl/ModuleServiceImpl.java | 6 +++ .../oa/services/impl/ProjectServiceImpl.java | 8 ++++ .../oa/services/impl/ReviewServiceImpl.java | 45 +++++++++++++------ .../com/jsl/oa/mapper/ReviewMapper.xml | 20 +++++++++ 6 files changed, 86 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/jsl/oa/dao/ReviewDAO.java b/src/main/java/com/jsl/oa/dao/ReviewDAO.java index 8b1d8d7..f3f46b3 100644 --- a/src/main/java/com/jsl/oa/dao/ReviewDAO.java +++ b/src/main/java/com/jsl/oa/dao/ReviewDAO.java @@ -94,6 +94,18 @@ public class ReviewDAO { return ""; } + public void deleteReviewByProjectId(Long pid) { + reviewMapper.getAllReviewByProjectId(pid); + } + + public void deleteReviewByProjectChildId(Long cid) { + reviewMapper.getAllReviewByProjectId(cid); + } + + public void deleteReviewByProjectModuleId(Long mid) { + reviewMapper.getAllReviewByProjectId(mid); + } + } diff --git a/src/main/java/com/jsl/oa/mapper/ReviewMapper.java b/src/main/java/com/jsl/oa/mapper/ReviewMapper.java index f8468ac..3f98fd0 100644 --- a/src/main/java/com/jsl/oa/mapper/ReviewMapper.java +++ b/src/main/java/com/jsl/oa/mapper/ReviewMapper.java @@ -51,4 +51,12 @@ public interface ReviewMapper { @Select("SELECT * FROM organize_oa.oa_review WHERE sender_id = #{uid} AND " + "is_delete = 0 AND review_result = #{result}") List selectReviewByUserAndResult(Long uid, Short result); + + void deleteReview(Long id); + + List getAllReviewByProjectId(Long pid); + + List getAllReviewByProjectChildId(Long cid); + + List getAllReviewByProjectModuleId(Long mid); } diff --git a/src/main/java/com/jsl/oa/services/impl/ModuleServiceImpl.java b/src/main/java/com/jsl/oa/services/impl/ModuleServiceImpl.java index d249854..8012af0 100644 --- a/src/main/java/com/jsl/oa/services/impl/ModuleServiceImpl.java +++ b/src/main/java/com/jsl/oa/services/impl/ModuleServiceImpl.java @@ -3,6 +3,7 @@ package com.jsl.oa.services.impl; import com.google.gson.Gson; import com.google.gson.JsonObject; import com.jsl.oa.dao.ProjectDAO; +import com.jsl.oa.dao.ReviewDAO; import com.jsl.oa.dao.RoleDAO; import com.jsl.oa.dao.UserDAO; import com.jsl.oa.mapper.ModuleMapper; @@ -30,6 +31,7 @@ import static java.lang.System.*; @RequiredArgsConstructor public class ModuleServiceImpl implements ModuleService { private final ProjectDAO projectDAO; + private final ReviewDAO reviewDAO; private final ModuleMapper moduleMapper; private final UserDAO userDAO; private final RoleDAO roleDAO; @@ -120,8 +122,12 @@ public class ModuleServiceImpl implements ModuleService { for (ProjectModuleDO workDO : projectWorkDOS) { deleteMoudule(workDO.getId()); + + //同时删除对应审核信息 + reviewDAO.deleteReviewByProjectModuleId(id); } + moduleMapper.deleteMoudule(id); } diff --git a/src/main/java/com/jsl/oa/services/impl/ProjectServiceImpl.java b/src/main/java/com/jsl/oa/services/impl/ProjectServiceImpl.java index acdc889..96ca637 100644 --- a/src/main/java/com/jsl/oa/services/impl/ProjectServiceImpl.java +++ b/src/main/java/com/jsl/oa/services/impl/ProjectServiceImpl.java @@ -9,6 +9,7 @@ import com.google.gson.Gson; import com.google.gson.JsonObject; import com.jsl.oa.annotations.NeedPermission; import com.jsl.oa.dao.ProjectDAO; +import com.jsl.oa.dao.ReviewDAO; import com.jsl.oa.dao.RoleDAO; import com.jsl.oa.dao.UserDAO; import com.jsl.oa.mapper.ProjectMapper; @@ -58,6 +59,7 @@ public class ProjectServiceImpl implements ProjectService { private final UserMapper userMapper; private final ProjectMapper projectMapper; + private final ReviewDAO reviewDAO; private final ProjectDAO projectDAO; private final UserDAO userDAO; private final ObjectMapper objectMapper; @@ -210,6 +212,8 @@ public class ProjectServiceImpl implements ProjectService { return ResultUtil.error(ErrorCode.NOT_PERMISSION); } else { projectMapper.deleteProjectChild(id1); + //同时删除对应审核信息 + reviewDAO.deleteReviewByProjectChildId(id1); } } return ResultUtil.success(); @@ -622,7 +626,11 @@ public class ProjectServiceImpl implements ProjectService { if (!projectDAO.projectDelete(id1)) { return ResultUtil.error(ErrorCode.DATABASE_DELETE_ERROR); } + //同时删除所有对应审核信息 + reviewDAO.deleteReviewByProjectId(id1); } + + return ResultUtil.success(); } } diff --git a/src/main/java/com/jsl/oa/services/impl/ReviewServiceImpl.java b/src/main/java/com/jsl/oa/services/impl/ReviewServiceImpl.java index f9f656f..1ba72de 100644 --- a/src/main/java/com/jsl/oa/services/impl/ReviewServiceImpl.java +++ b/src/main/java/com/jsl/oa/services/impl/ReviewServiceImpl.java @@ -6,10 +6,7 @@ import com.jsl.oa.dao.ProjectDAO; import com.jsl.oa.dao.ReviewDAO; import com.jsl.oa.mapper.ProjectMapper; import com.jsl.oa.mapper.UserMapper; -import com.jsl.oa.model.dodata.ProjectChildDO; -import com.jsl.oa.model.dodata.ProjectDO; -import com.jsl.oa.model.dodata.ProjectModuleDO; -import com.jsl.oa.model.dodata.ReviewDO; +import com.jsl.oa.model.dodata.*; import com.jsl.oa.model.vodata.ReviewAddVO; import com.jsl.oa.model.vodata.ReviewDataVO; import com.jsl.oa.model.vodata.ReviewUpdateResultVO; @@ -386,20 +383,42 @@ public class ReviewServiceImpl implements ReviewService { Processing.copyProperties(reviewDO, reviewVO); // 赋值其他非空属性 reviewVO.setCategory(Processing.turnReviewCategory(reviewDO.getCategory())) - .setSenderName(userMapper.getUserById(Long.valueOf(reviewDO.getSenderId())).getNickname()) - .setProjectName(projectDAO.getProjectById(reviewDO.getProjectId()).getName()) - .setProjectChildName(projectMapper.getProjectChildById( - Math.toIntExact(reviewDO.getProjectChildId())).getName()) - .setResult(Processing.turnReviewResult(reviewDO.getReviewResult())) + .setSenderName(userMapper.getUserById(Long.valueOf(reviewDO.getSenderId())).getNickname()); + +// 获取审核的项目,设置项目名称 + ProjectDO project = projectDAO.getProjectById(reviewDO.getProjectId()); + if (project == null) { + reviewVO.setProjectName("无此项目"); + } else { + reviewVO.setProjectName(project.getName()); + } +// 获取审核的子系统,设置子系统名称 + ProjectChildDO projectChildDO = + projectMapper.getProjectChildById(Math.toIntExact(reviewDO.getProjectChildId())); + if (projectChildDO != null) { + reviewVO.setProjectChildName(projectChildDO.getName()); + } else { + reviewVO.setProjectChildName(projectChildDO.getName()); + } +// 设置结果、发送者id,接受者id + reviewVO.setResult(Processing.turnReviewResult(reviewDO.getReviewResult())) .setSenderId(Long.valueOf(reviewDO.getSenderId())) .setRecipientId(reviewDO.getRecipientId()); // 赋值可为空属性并进行判断 - if (reviewDO.getRecipientId() != null) { - reviewVO.setRecipientName(userMapper.getUserById(reviewDO.getRecipientId()).getNickname()); + UserDO recipientUserDO = userMapper.getUserById(reviewDO.getRecipientId()); + if (reviewDO.getRecipientId() != null || recipientUserDO != null) { + reviewVO.setRecipientName(recipientUserDO.getNickname()); } +// 获取该审核消息对应的模块信息 if (reviewDO.getProjectModuleId() != null) { - reviewVO.setProjectModuleName( - reviewDAO.getNameByModule(Math.toIntExact(reviewDO.getProjectModuleId()))); + ProjectModuleDO projectModuleDO = + projectMapper.getModuleById(Math.toIntExact(reviewDO.getProjectModuleId())); +// 如果模块存在,设置名称 + if (projectModuleDO != null) { + reviewVO.setProjectModuleName(projectModuleDO.getName()); + } else { + reviewVO.setProjectModuleName("模块不存在"); + } } else { reviewVO.setProjectModuleName("无"); } diff --git a/src/main/resources/com/jsl/oa/mapper/ReviewMapper.xml b/src/main/resources/com/jsl/oa/mapper/ReviewMapper.xml index 23a6f09..599da71 100644 --- a/src/main/resources/com/jsl/oa/mapper/ReviewMapper.xml +++ b/src/main/resources/com/jsl/oa/mapper/ReviewMapper.xml @@ -139,6 +139,26 @@ where id = #{id} + + delete organize_oa.oa_review + where id = ${id} + + + + + + + + From 5b7daf58249d929ec0cbe8f421ab801d09f3ab86 Mon Sep 17 00:00:00 2001 From: xiangZr-hhh <“2774915446@qq.com”> Date: Mon, 22 Apr 2024 20:29:33 +0800 Subject: [PATCH 2/8] =?UTF-8?q?fix:=E5=AE=A1=E6=A0=B8=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=AE=A1=E6=A0=B8sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修正为假删除 --- .../com/jsl/oa/services/impl/ProjectServiceImpl.java | 1 - src/main/resources/com/jsl/oa/mapper/ReviewMapper.xml | 9 +++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/jsl/oa/services/impl/ProjectServiceImpl.java b/src/main/java/com/jsl/oa/services/impl/ProjectServiceImpl.java index 96ca637..5315850 100644 --- a/src/main/java/com/jsl/oa/services/impl/ProjectServiceImpl.java +++ b/src/main/java/com/jsl/oa/services/impl/ProjectServiceImpl.java @@ -131,7 +131,6 @@ public class ProjectServiceImpl implements ProjectService { @Override public BaseResponse projectFileGet(HttpServletRequest request, Long projectId) { - // 判断项目是否存在 if (!projectDAO.isExistProjectById(projectId)) { return ResultUtil.error(ErrorCode.PROJECT_NOT_EXIST); diff --git a/src/main/resources/com/jsl/oa/mapper/ReviewMapper.xml b/src/main/resources/com/jsl/oa/mapper/ReviewMapper.xml index 599da71..bb521db 100644 --- a/src/main/resources/com/jsl/oa/mapper/ReviewMapper.xml +++ b/src/main/resources/com/jsl/oa/mapper/ReviewMapper.xml @@ -139,10 +139,11 @@ where id = #{id} - - delete organize_oa.oa_review - where id = ${id} - + + update organize_oa.oa_review + set is_deleted = 1 + where id = ${id} + - select * from organize_oa.oa_project_daily where user_id = #{pid} + select * from organize_oa.oa_project_daily where project_id = #{pid} and is_delete = 0 From cbcce7687ba65a0f04967a8aff6b9ea0c5ccc2a8 Mon Sep 17 00:00:00 2001 From: xiangZr-hhh <“2774915446@qq.com”> Date: Mon, 22 Apr 2024 21:54:18 +0800 Subject: [PATCH 5/8] =?UTF-8?q?fix:=E5=AE=A1=E6=A0=B8=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加删除 --- src/main/java/com/jsl/oa/dao/ReviewDAO.java | 15 ++++++++++++--- src/main/java/com/jsl/oa/utils/Processing.java | 2 +- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/jsl/oa/dao/ReviewDAO.java b/src/main/java/com/jsl/oa/dao/ReviewDAO.java index f3f46b3..81250e0 100644 --- a/src/main/java/com/jsl/oa/dao/ReviewDAO.java +++ b/src/main/java/com/jsl/oa/dao/ReviewDAO.java @@ -95,15 +95,24 @@ public class ReviewDAO { } public void deleteReviewByProjectId(Long pid) { - reviewMapper.getAllReviewByProjectId(pid); + List reviewDOS = reviewMapper.getAllReviewByProjectId(pid); + for (ReviewDO reviewDO :reviewDOS) { + reviewMapper.deleteReview(reviewDO.getId()); + } } public void deleteReviewByProjectChildId(Long cid) { - reviewMapper.getAllReviewByProjectId(cid); + List reviewDOS = reviewMapper.getAllReviewByProjectId(cid); + for (ReviewDO reviewDO :reviewDOS) { + reviewMapper.deleteReview(reviewDO.getId()); + } } public void deleteReviewByProjectModuleId(Long mid) { - reviewMapper.getAllReviewByProjectId(mid); + List reviewDOS = reviewMapper.getAllReviewByProjectId(mid); + for (ReviewDO reviewDO :reviewDOS) { + reviewMapper.deleteReview(reviewDO.getId()); + } } } diff --git a/src/main/java/com/jsl/oa/utils/Processing.java b/src/main/java/com/jsl/oa/utils/Processing.java index ab1cdcd..3ad1f55 100755 --- a/src/main/java/com/jsl/oa/utils/Processing.java +++ b/src/main/java/com/jsl/oa/utils/Processing.java @@ -183,7 +183,7 @@ public class Processing { } /** - * 检查用户是否是老师 + * 检查用户是否是负责人 * * @param request 请求 * @return 如果为 true 是老师,false 不是老师 From f9f35dd4a0423ce03b33214958b8c2f91ef62052 Mon Sep 17 00:00:00 2001 From: xiangZr-hhh <“2774915446@qq.com”> Date: Mon, 22 Apr 2024 22:06:48 +0800 Subject: [PATCH 6/8] =?UTF-8?q?fix:=E5=AE=A1=E6=A0=B8=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 禁止向已被删除的项目添加 --- src/main/java/com/jsl/oa/mapper/ProjectMapper.java | 3 +++ src/main/java/com/jsl/oa/services/impl/ReviewServiceImpl.java | 2 +- src/main/resources/com/jsl/oa/mapper/ReviewMapper.xml | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/jsl/oa/mapper/ProjectMapper.java b/src/main/java/com/jsl/oa/mapper/ProjectMapper.java index 24fba1e..4fa9e59 100644 --- a/src/main/java/com/jsl/oa/mapper/ProjectMapper.java +++ b/src/main/java/com/jsl/oa/mapper/ProjectMapper.java @@ -43,6 +43,9 @@ public interface ProjectMapper { @Select("select * from organize_oa.oa_project where id=#{id}") ProjectDO getProjectById(Long id); + @Select("select * from organize_oa.oa_project where id=#{id} and is_delete = 0") + ProjectDO getNotDeleteProjectById(Long id); + @Select("select * from organize_oa.oa_project where id=#{id}") ProjectDO tgetProjectById(Integer id); diff --git a/src/main/java/com/jsl/oa/services/impl/ReviewServiceImpl.java b/src/main/java/com/jsl/oa/services/impl/ReviewServiceImpl.java index 1ba72de..02385f6 100644 --- a/src/main/java/com/jsl/oa/services/impl/ReviewServiceImpl.java +++ b/src/main/java/com/jsl/oa/services/impl/ReviewServiceImpl.java @@ -179,7 +179,7 @@ public class ReviewServiceImpl implements ReviewService { Integer userId = Math.toIntExact(Processing.getAuthHeaderToUserId(request)); //检查对应项目,子系统,子模块是否存在 - if (!projectDAO.isExistProjectById(Long.valueOf(reviewAddVO.getProjectId()))) { + if (projectMapper.getNotDeleteProjectById(Long.valueOf(reviewAddVO.getProjectId())) == null) { return ResultUtil.error(ErrorCode.PROJECT_NOT_EXIST); } diff --git a/src/main/resources/com/jsl/oa/mapper/ReviewMapper.xml b/src/main/resources/com/jsl/oa/mapper/ReviewMapper.xml index bb521db..dff0972 100644 --- a/src/main/resources/com/jsl/oa/mapper/ReviewMapper.xml +++ b/src/main/resources/com/jsl/oa/mapper/ReviewMapper.xml @@ -141,7 +141,7 @@ update organize_oa.oa_review - set is_deleted = 1 + set is_delete = 1 where id = ${id} From 0c559f28abf099624005e483f82d5ed2423666a9 Mon Sep 17 00:00:00 2001 From: xiangZr-hhh <“2774915446@qq.com”> Date: Mon, 22 Apr 2024 22:13:47 +0800 Subject: [PATCH 7/8] =?UTF-8?q?fix:=E6=97=A5=E6=8A=A5=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 禁止向已删除的项目添加 项目只能删除未删除的项目 --- .../com/jsl/oa/services/impl/ProjectDailyServiceImpl.java | 6 ++++-- .../java/com/jsl/oa/services/impl/ProjectServiceImpl.java | 5 +++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/jsl/oa/services/impl/ProjectDailyServiceImpl.java b/src/main/java/com/jsl/oa/services/impl/ProjectDailyServiceImpl.java index 9946438..15207d4 100644 --- a/src/main/java/com/jsl/oa/services/impl/ProjectDailyServiceImpl.java +++ b/src/main/java/com/jsl/oa/services/impl/ProjectDailyServiceImpl.java @@ -7,6 +7,7 @@ import com.jsl.oa.dao.ProjectDAO; import com.jsl.oa.dao.ProjectDailyDAO; import com.jsl.oa.dao.UserDAO; import com.jsl.oa.mapper.ProjectDailyMapper; +import com.jsl.oa.mapper.ProjectMapper; import com.jsl.oa.model.dodata.ProjectDO; import com.jsl.oa.model.dodata.ProjectDailyDO; import com.jsl.oa.model.dodata.UserDO; @@ -48,6 +49,7 @@ public class ProjectDailyServiceImpl implements ProjectDailyService { private final UserDAO userDAO; private final ProjectDailyDAO projectDailyDAO; private final ProjectDailyMapper projectDailyMapper; + private final ProjectMapper projectMapper; private final MessageService messageService; @@ -59,9 +61,9 @@ public class ProjectDailyServiceImpl implements ProjectDailyService { // 从请求体中获取项目id Integer projectId = projectDailyAddVO.getProjectId(); // 检查项目是否存在 - if (!projectDAO.isExistProjectById(Long.valueOf(projectId))) { + if (projectMapper.getNotDeleteProjectById(Long.valueOf(projectId)) == null) { return ResultUtil.error(ErrorCode.PROJECT_NOT_EXIST); - } + } // 赋值数据库表实体类相关属性 ProjectDailyDO projectDailyDO = new ProjectDailyDO(); diff --git a/src/main/java/com/jsl/oa/services/impl/ProjectServiceImpl.java b/src/main/java/com/jsl/oa/services/impl/ProjectServiceImpl.java index 978b185..f446a0e 100644 --- a/src/main/java/com/jsl/oa/services/impl/ProjectServiceImpl.java +++ b/src/main/java/com/jsl/oa/services/impl/ProjectServiceImpl.java @@ -624,6 +624,11 @@ public class ProjectServiceImpl implements ProjectService { } for (Long id1 : id) { + + if (projectMapper.getNotDeleteProjectById(id1) == null) { + return ResultUtil.error(ErrorCode.PROJECT_NOT_EXIST); + } + if (!projectDAO.isPrincipalUser(Processing.getAuthHeaderToUserId(request), id1)) { return ResultUtil.error(ErrorCode.NOT_PERMISSION); } From ca68b6566b2208dd5a427cc9824fb2355393ecf2 Mon Sep 17 00:00:00 2001 From: xiangZr-hhh <“2774915446@qq.com”> Date: Mon, 22 Apr 2024 22:27:08 +0800 Subject: [PATCH 8/8] =?UTF-8?q?patch:=E6=97=A5=E5=BF=97=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 日期判空 --- .../java/com/jsl/oa/controllers/ProjectDailyController.java | 4 ---- .../java/com/jsl/oa/services/impl/ProjectServiceImpl.java | 1 - src/main/java/com/jsl/oa/utils/Processing.java | 2 +- 3 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/main/java/com/jsl/oa/controllers/ProjectDailyController.java b/src/main/java/com/jsl/oa/controllers/ProjectDailyController.java index 426ec89..4e398ab 100644 --- a/src/main/java/com/jsl/oa/controllers/ProjectDailyController.java +++ b/src/main/java/com/jsl/oa/controllers/ProjectDailyController.java @@ -106,10 +106,6 @@ public class ProjectDailyController { return ResultUtil.error(ErrorCode.PAGE_NUMBER_IS_NULL); } - if (projectId == null) { - return ResultUtil.error(ErrorCode.ID_NOT_EXIST); - } - return projectDailyService.searchMyDaily(projectId, page, pageSize, diff --git a/src/main/java/com/jsl/oa/services/impl/ProjectServiceImpl.java b/src/main/java/com/jsl/oa/services/impl/ProjectServiceImpl.java index f446a0e..47d9d60 100644 --- a/src/main/java/com/jsl/oa/services/impl/ProjectServiceImpl.java +++ b/src/main/java/com/jsl/oa/services/impl/ProjectServiceImpl.java @@ -641,7 +641,6 @@ public class ProjectServiceImpl implements ProjectService { projectDailyDAO.deleteDailyByProject(id1); } - return ResultUtil.success(); } } diff --git a/src/main/java/com/jsl/oa/utils/Processing.java b/src/main/java/com/jsl/oa/utils/Processing.java index 3ad1f55..4593799 100755 --- a/src/main/java/com/jsl/oa/utils/Processing.java +++ b/src/main/java/com/jsl/oa/utils/Processing.java @@ -416,7 +416,7 @@ public class Processing { * @Param dateString: **/ public static Date convertStringToDate(String dateString) { - if (dateString.isEmpty()) { + if (dateString == null || dateString.isEmpty()) { return null; // 如果字符串为空,返回空的Date对象 } else { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");