Browse Source

conflict

master
zhizhi wu 5 years ago
parent
commit
d439bae8da
  1. 4
      cloudutil/src/main/resources/application-util-test.yml
  2. 54
      tall/src/main/java/com/ccsens/tall/bean/dto/MemberDto.java
  3. 4
      tall/src/main/java/com/ccsens/tall/bean/dto/ProjectDto.java
  4. 6
      tall/src/main/java/com/ccsens/tall/bean/dto/RingDto.java
  5. 46
      tall/src/main/java/com/ccsens/tall/bean/dto/UserDto.java
  6. 15
      tall/src/main/java/com/ccsens/tall/bean/vo/ProjectVo.java
  7. 27
      tall/src/main/java/com/ccsens/tall/bean/vo/RingVo.java
  8. 55
      tall/src/main/java/com/ccsens/tall/bean/vo/UserVo.java
  9. 1
      tall/src/main/java/com/ccsens/tall/config/SpringConfig.java
  10. 2
      tall/src/main/java/com/ccsens/tall/persist/dao/SysRingMsgDao.java
  11. 23
      tall/src/main/java/com/ccsens/tall/persist/dao/SysUserDao.java
  12. 6
      tall/src/main/java/com/ccsens/tall/persist/dao/TaskSubTimeDao.java
  13. 24
      tall/src/main/java/com/ccsens/tall/service/IProMemberService.java
  14. 4
      tall/src/main/java/com/ccsens/tall/service/IProTaskDetailService.java
  15. 32
      tall/src/main/java/com/ccsens/tall/service/IRingService.java
  16. 4
      tall/src/main/java/com/ccsens/tall/service/ITaskSubTimeService.java
  17. 41
      tall/src/main/java/com/ccsens/tall/service/IUserInfoService.java
  18. 26
      tall/src/main/java/com/ccsens/tall/service/IUserService.java
  19. 1
      tall/src/main/java/com/ccsens/tall/service/LabelService.java
  20. 176
      tall/src/main/java/com/ccsens/tall/service/ProMemberService.java
  21. 14
      tall/src/main/java/com/ccsens/tall/service/ProTaskDetailService.java
  22. 60
      tall/src/main/java/com/ccsens/tall/service/ProjectService.java
  23. 149
      tall/src/main/java/com/ccsens/tall/service/RingService.java
  24. 17
      tall/src/main/java/com/ccsens/tall/service/TaskDeliverService.java
  25. 18
      tall/src/main/java/com/ccsens/tall/service/TaskSubTimeService.java
  26. 173
      tall/src/main/java/com/ccsens/tall/service/UserInfoService.java
  27. 135
      tall/src/main/java/com/ccsens/tall/service/UserService.java
  28. 12
      tall/src/main/java/com/ccsens/tall/util/TallConstant.java
  29. 2
      tall/src/main/java/com/ccsens/tall/web/ExcelController.java
  30. 59
      tall/src/main/java/com/ccsens/tall/web/MemberController.java
  31. 2
      tall/src/main/java/com/ccsens/tall/web/MemberRoleController.java
  32. 17
      tall/src/main/java/com/ccsens/tall/web/ProjectController.java
  33. 22
      tall/src/main/java/com/ccsens/tall/web/RingController.java
  34. 12
      tall/src/main/java/com/ccsens/tall/web/TaskController.java
  35. 12
      tall/src/main/java/com/ccsens/tall/web/UserController.java
  36. 82
      tall/src/main/java/com/ccsens/tall/web/UserInfoController.java
  37. 2
      tall/src/main/java/com/ccsens/tall/web/WpsController.java
  38. 3
      tall/src/main/resources/application-dev.yml
  39. 2
      tall/src/main/resources/application-prod.yml
  40. 12
      tall/src/main/resources/application-test.yml
  41. 8
      tall/src/main/resources/druid-test.yml
  42. 3
      tall/src/main/resources/mapper_dao/DeliverDao.xml
  43. 2
      tall/src/main/resources/mapper_dao/SysOperationDao.xml
  44. 6
      tall/src/main/resources/mapper_dao/SysProjectDao.xml
  45. 60
      tall/src/main/resources/mapper_dao/SysRingMsgDao.xml
  46. 38
      tall/src/main/resources/mapper_dao/SysUserDao.xml
  47. 5
      tall/src/main/resources/mapper_dao/TaskDetailDao.xml
  48. 23
      tall/src/main/resources/mapper_dao/TaskSubTimeDao.xml
  49. 15
      util/src/main/java/com/ccsens/util/CodeEnum.java
  50. 3
      util/src/main/java/com/ccsens/util/UploadFileUtil_Servlet3.java
  51. 7
      util/src/main/java/com/ccsens/util/WebConstant.java
  52. 8
      util/src/test/java/com/ccsens/util/Base64Test.java

4
cloudutil/src/main/resources/application-util-test.yml

@ -20,8 +20,8 @@ eureka:
service-url: service-url:
# 指定eureka server通信地址,注意/eureka/小尾巴不能少 # 指定eureka server通信地址,注意/eureka/小尾巴不能少
#defaultZone: http://admin:admin@peer1:8761/eureka/,http://admin:admin@peer2:8762/eureka/ #defaultZone: http://admin:admin@peer1:8761/eureka/,http://admin:admin@peer2:8762/eureka/
defaultZone: http://admin:admin@192.168.0.99:7010/eureka/ # defaultZone: http://admin:admin@192.168.0.99:7010/eureka/
# defaultZone: http://admin:admin@test.tall.wiki:7010/eureka/ defaultZone: http://admin:admin@test.tall.wiki:7010/eureka/
instance: instance:
# 是否注册IP到eureka server,如不指定或设为false,那就回注册主机名到eureka server # 是否注册IP到eureka server,如不指定或设为false,那就回注册主机名到eureka server
prefer-ip-address: true prefer-ip-address: true

54
tall/src/main/java/com/ccsens/tall/bean/dto/MemberDto.java

@ -0,0 +1,54 @@
package com.ccsens.tall.bean.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.List;
/**
* @author
*/
@Data
public class MemberDto {
@Data
@ApiModel("添加成员")
public static class SaveMember{
@ApiModelProperty("项目id")
private Long projectId;
@ApiModelProperty("成员名")
private String memberName;
@ApiModelProperty("成员手机号")
private String phone;
@ApiModelProperty("所属角色的id")
private List<Long> roleId;
@ApiModelProperty("奖惩干系人id")
private Long stakeholderId;
}
@Data
@ApiModel("删除成员")
public static class DeleteMember{
@ApiModelProperty("成员id")
private Long memberId;
}
@Data
@ApiModel("修改成员信息")
public static class UpdateMemberInfo{
@ApiModelProperty("成员id")
private Long memberId;
@ApiModelProperty("成员名")
private String memberName;
@ApiModelProperty("成员手机号")
private String phone;
@ApiModelProperty("所属角色的id")
private List<Long> roleId;
@ApiModelProperty("奖惩干系人id")
private Long stakeholderId;
}
}

4
tall/src/main/java/com/ccsens/tall/bean/dto/ProjectDto.java

@ -66,5 +66,9 @@ public class ProjectDto {
private String description; private String description;
@ApiModelProperty("被修改的项目的地址") @ApiModelProperty("被修改的项目的地址")
private String address; private String address;
@ApiModelProperty("项目开始时间")
private String beginTime;
@ApiModelProperty("项目结束时间")
private String endTime;
} }
} }

6
tall/src/main/java/com/ccsens/tall/bean/dto/RingDto.java

@ -42,4 +42,10 @@ public class RingDto {
@ApiModelProperty("消息id") @ApiModelProperty("消息id")
private List<Long> messageIdList; private List<Long> messageIdList;
} }
@Data
@ApiModel("将项目内的消息设为已读")
public static class ReadMessageByProjectId{
@ApiModelProperty("项目id")
private Long projectId;
}
} }

46
tall/src/main/java/com/ccsens/tall/bean/dto/UserDto.java

@ -75,9 +75,24 @@ public class UserDto {
private String password; private String password;
} }
//注册
@Data @Data
@ApiModel @ApiModel("通过账号修改密码")
public static class UpdatePasswordByAccount{
@ApiModelProperty("账号")
@NotEmpty(message = "账号不能为空")
private String account;
@ApiModelProperty("旧密码")
@NotEmpty(message = "旧密码不能为空.")
@Pattern(regexp="^[a-zA-Z0-9._-]{6,20}$",message="密码长度需在6~20之间,不能使用汉字,不能包含特殊字符")
private String passwordOld;
@ApiModelProperty("新密码")
@NotEmpty(message = "新密码不能为空")
@Pattern(regexp="^[a-zA-Z0-9._-]{6,20}$",message="密码长度需在6~20之间,不能使用汉字,不能包含特殊字符")
private String passwordNew;
}
@Data
@ApiModel("手机号注册")
public static class UserSignup{ public static class UserSignup{
@ApiModelProperty("手机号") @ApiModelProperty("手机号")
@NotEmpty(message = "手机号不能为空") @NotEmpty(message = "手机号不能为空")
@ -97,9 +112,9 @@ public class UserDto {
@ApiModelProperty("来源 0:默认注册,1:HT病人注册") @ApiModelProperty("来源 0:默认注册,1:HT病人注册")
private byte source = WebConstant.Regist.SOURCE; private byte source = WebConstant.Regist.SOURCE;
} }
//注册
@Data @Data
@ApiModel @ApiModel("注册")
public static class UserSignupSystem{ public static class UserSignupSystem{
@ApiModelProperty("账号") @ApiModelProperty("账号")
private String account; private String account;
@ -144,4 +159,27 @@ public class UserDto {
@ApiModelProperty("语言") @ApiModelProperty("语言")
private String language; private String language;
} }
@Data
@ApiModel("修改登录账号")
public static class UpdateAccount{
@ApiModelProperty("手机号")
@NotEmpty(message = "手机号不能为空")
@Pattern(regexp="^[1]([3-9])[0-9]{9}$",message="请输入正确的手机号")
private String phone;
@ApiModelProperty("验证码")
@NotEmpty(message = "验证码不能为空.")
private String smsCode;
@ApiModelProperty("账号")
@NotEmpty(message = "新账号不能为空.")
private String account;
}
@Data
@ApiModel("修改昵称")
public static class UpdateNickname{
@ApiModelProperty("昵称")
@NotEmpty(message = "新昵称不能为空.")
private String nickname;
}
} }

15
tall/src/main/java/com/ccsens/tall/bean/vo/ProjectVo.java

@ -40,6 +40,8 @@ public class ProjectVo {
private ProjectConfig projectConfig; private ProjectConfig projectConfig;
@ApiModelProperty("标签信息") @ApiModelProperty("标签信息")
private List<LabelVo.SelectLabel> labelList; private List<LabelVo.SelectLabel> labelList;
@ApiModelProperty("未处理信息的数量")
private ProjectUnreadMsg projectUnreadMsg;
public Long getTotalDuration(){ public Long getTotalDuration(){
if(ObjectUtil.isNotNull(endTime) && ObjectUtil.isNotNull(beginTime)){ if(ObjectUtil.isNotNull(endTime) && ObjectUtil.isNotNull(beginTime)){
@ -84,6 +86,19 @@ public class ProjectVo {
} }
} }
@Data
@ApiModel("项目下未处理的消息数量")
public static class ProjectUnreadMsg{
@ApiModelProperty("未处理的消息总数")
private Integer totalNum;
@ApiModelProperty("ring消息")
private Integer ringNum;
@ApiModelProperty("check消息")
private Integer checkNum;
@ApiModelProperty("交付物消息")
private Integer deliverNum;
}
@ApiModel @ApiModel
@Data @Data
public static class ProjectConfig{ public static class ProjectConfig{

27
tall/src/main/java/com/ccsens/tall/bean/vo/RingVo.java

@ -21,16 +21,16 @@ public class RingVo {
private Integer size ; private Integer size ;
} }
@Data @Data
@ApiModel("返回ring消息") @ApiModel("查找ring消息")
public static class RingInfo{ public static class RingInfo{
@ApiModelProperty("消息id") @ApiModelProperty("消息id")
private Long messageId; private Long messageId;
@ApiModelProperty("消息内容") @ApiModelProperty("消息内容")
private String value ; private String value;
@ApiModelProperty("消息发送时间") @ApiModelProperty("消息发送时间")
private Long time ; private Long time;
@ApiModelProperty("是否是自己发送的消息") @ApiModelProperty("是否是自己发送的消息")
private Integer mine ; private Integer mine;
@ApiModelProperty("未读数量") @ApiModelProperty("未读数量")
private Integer unread; private Integer unread;
@ApiModelProperty("发送者信息") @ApiModelProperty("发送者信息")
@ -40,7 +40,7 @@ public class RingVo {
} }
@Data @Data
@ApiModel("接收/发送者信息") @ApiModel("发送者信息")
public static class MsgReceiveRole{ public static class MsgReceiveRole{
@ApiModelProperty("接收者的角色id") @ApiModelProperty("接收者的角色id")
private Long id; private Long id;
@ -51,11 +51,26 @@ public class RingVo {
} }
@Data @Data
@ApiModel("接收/发送者信息") @ApiModel("接收者信息")
public static class MsgSender{ public static class MsgSender{
@ApiModelProperty("发送者的id") @ApiModelProperty("发送者的id")
private Long id; private Long id;
@ApiModelProperty("发送者的名字") @ApiModelProperty("发送者的名字")
private String name; private String name;
@ApiModelProperty("发送者的头像")
private String avatarUrl;
}
@Data
@ApiModel("发送后返回消息详情")
public static class RingInfoByReturn{
@ApiModelProperty("消息id")
private Long messageId;
@ApiModelProperty("消息内容")
private String value;
@ApiModelProperty("消息发送时间")
private Long time;
@ApiModelProperty("接收角色的信息")
private List<MsgReceiveRole> roleList = new ArrayList<>();
} }
} }

55
tall/src/main/java/com/ccsens/tall/bean/vo/UserVo.java

@ -6,6 +6,10 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import java.util.Date;
import java.util.List;
@Data @Data
public class UserVo { public class UserVo {
@Data @Data
@ -93,7 +97,7 @@ public class UserVo {
@Data @Data
@ApiModel("用户信息") @ApiModel("用户信息")
public static class UserInfo{ public static class UserInfo {
@ApiModelProperty("用户id") @ApiModelProperty("用户id")
private Long id; private Long id;
@ApiModelProperty("昵称") @ApiModelProperty("昵称")
@ -101,4 +105,53 @@ public class UserVo {
@ApiModelProperty("头像") @ApiModelProperty("头像")
private String avatarUrl; private String avatarUrl;
} }
@ApiModel("查询个人信息")
public static class SelectUserInfo{
@ApiModelProperty("userId")
private Long id;
@ApiModelProperty("账号")
private String account;
@ApiModelProperty("手机号")
private String phone;
@ApiModelProperty("昵称")
private String nickname;
@ApiModelProperty("头像")
private String avatarUrl;
@ApiModelProperty("个人签名")
private String signature;
@ApiModelProperty("个人简介")
private String introduction;
@ApiModelProperty("生日")
private String birthday;
@ApiModelProperty("所在地")
private String address;
@ApiModelProperty("网页")
private String webPath;
@ApiModelProperty("公司")
private String company;
@ApiModelProperty("职位")
private String position;
@ApiModelProperty("已使用tall多少天")
private Integer dayOfUseTall;
@JsonIgnore // 已使用tall多少天
private Date createdAt;
@ApiModelProperty("空间使用情况")
private Interspace interspace;
@ApiModelProperty("标签信息")
private List<LabelVo.SelectLabel> labelList;
}
@Data
@ApiModel("空间使用信息")
public static class Interspace{
@ApiModelProperty("空间已有项目")
private Integer projectNum;
@ApiModelProperty("空间总项目(目前写无限制)")
private Integer projectTotal;
@ApiModelProperty("空间剩余(目前写无限制)")
private Integer interspaceResidue;
@ApiModelProperty("总空间(目前写无限制)")
private Integer interspaceTotal;
}
} }

1
tall/src/main/java/com/ccsens/tall/config/SpringConfig.java

@ -137,6 +137,7 @@ public class SpringConfig implements WebMvcConfigurer {
.excludePathPatterns("/users/smscode") .excludePathPatterns("/users/smscode")
.excludePathPatterns("/users/signup/**") .excludePathPatterns("/users/signup/**")
.excludePathPatterns("/users/password") .excludePathPatterns("/users/password")
.excludePathPatterns("/users/password/account")
.excludePathPatterns("/users/account") .excludePathPatterns("/users/account")
.excludePathPatterns("/users/token") .excludePathPatterns("/users/token")
.excludePathPatterns("/users/claims") .excludePathPatterns("/users/claims")

2
tall/src/main/java/com/ccsens/tall/persist/dao/SysRingMsgDao.java

@ -15,4 +15,6 @@ public interface SysRingMsgDao extends SysRingMsgMapper {
List<Long> selectRoleIdByUserId(@Param("userId")Long userId, @Param("projectId")Long projectId); List<Long> selectRoleIdByUserId(@Param("userId")Long userId, @Param("projectId")Long projectId);
List<RingVo.MsgReceiveRole> ringReceiveRole(@Param("messageId")Long messageId); List<RingVo.MsgReceiveRole> ringReceiveRole(@Param("messageId")Long messageId);
List<RingVo.RingInfo> selectRingInfoByRingMsgId(@Param("userId")Long userId, @Param("projectId")Long projectId, @Param("msgId")Long msgId);
} }

23
tall/src/main/java/com/ccsens/tall/persist/dao/SysUserDao.java

@ -30,15 +30,28 @@ public interface SysUserDao extends SysUserMapper {
/** /**
* 查询用户信息 * 查询用户信息
* @param userId * @param userId 用户id
* @return * @return 用户信息
*/ */
UserVo.UserInfo getUserInfoByUserId(Long userId); UserVo.UserInfo getUserInfoByUserId(Long userId);
/** /**
* 根据id查询用户信息 * 根据id查询用户信息
* @param ids * @param ids 用户id数组
* @return * @return 用户信息列表
*/ */
List<UserVo.UserInfo> listUserInfos(Long[] ids); List<UserVo.UserInfo> queryUserInfos(Long[] ids);
/**
* 查找个人详细信息
* @param currentUserId userId
* @return 个人信息
*/
UserVo.SelectUserInfo selectUserInfo(@Param("userId")Long currentUserId);
/**
* 获取空间使用信息
* @param currentUserId userId
* @return 目前只查询用户创建了几个项目
*/
UserVo.Interspace selectInterspace(@Param("userId")Long currentUserId);
} }

6
tall/src/main/java/com/ccsens/tall/persist/dao/TaskSubTimeDao.java

@ -14,7 +14,9 @@ public interface TaskSubTimeDao extends ProTaskSubTimeMapper{
void clearTaskRealTime(@Param("projectId")Long projectId); void clearTaskRealTime(@Param("projectId")Long projectId);
List<TaskVo.KanBanTask> getKanbanTake(@Param("userId")Long userId,@Param("projectId")Long projectId, @Param("roleId")Long roleId,@Param("type") Integer type,@Param("memberId")Long memberId); List<TaskVo.KanBanTask> getKanbanTake(@Param("userId")Long userId,@Param("projectId")Long projectId, @Param("roleId")Long roleId,
@Param("type") Integer type,@Param("memberId")Long memberId,@Param("orderType")Integer orderType,@Param("order")Integer order);
List<TaskVo.KanBanTask> getKanbanTakeByType(@Param("userId")Long userId,@Param("projectId")Long projectId, @Param("roleId")Long roleId, @Param("type")Integer type); List<TaskVo.KanBanTask> getKanbanTakeByType(@Param("userId")Long userId,@Param("projectId")Long projectId, @Param("roleId")Long roleId,
@Param("type")Integer type,@Param("orderType")Integer orderType,@Param("order")Integer order);
} }

24
tall/src/main/java/com/ccsens/tall/service/IProMemberService.java

@ -1,5 +1,6 @@
package com.ccsens.tall.service; package com.ccsens.tall.service;
import com.ccsens.tall.bean.dto.MemberDto;
import com.ccsens.tall.bean.po.ProMember; import com.ccsens.tall.bean.po.ProMember;
import com.ccsens.tall.bean.po.ProRole; import com.ccsens.tall.bean.po.ProRole;
import com.ccsens.tall.bean.vo.MemberVo; import com.ccsens.tall.bean.vo.MemberVo;
@ -29,4 +30,27 @@ public interface IProMemberService {
List<Long> getMemberIdByProjectId(Long projectId); List<Long> getMemberIdByProjectId(Long projectId);
MemberVo.MemberInfo getUserInfoByUserId(Long userId); MemberVo.MemberInfo getUserInfoByUserId(Long userId);
/**
* 添加成员
* @param currentUserId userId
* @param saveMember 项目id角色id成员姓名和手机号等
* @throws Exception 权限不足异常
*/
void saveProMember(Long currentUserId, MemberDto.SaveMember saveMember) throws Exception;
/**
* 删除成员
* @param currentUserId userId
* @param deleteMember 被删除的成员的id
*/
void deleteMember(Long currentUserId, MemberDto.DeleteMember deleteMember);
/**
* 修改成员的信息
* @param currentUserId userId
* @param updateMemberInfo 需要修改的信息
* @return 返回修改后的成员信息
*/
ProjectVo.MembersByProject updateMemberInfo(Long currentUserId, MemberDto.UpdateMemberInfo updateMemberInfo);
} }

4
tall/src/main/java/com/ccsens/tall/service/IProTaskDetailService.java

@ -4,13 +4,15 @@ import com.ccsens.tall.bean.dto.TaskDto;
import com.ccsens.tall.bean.po.ProSubTimeMember; import com.ccsens.tall.bean.po.ProSubTimeMember;
import com.ccsens.tall.bean.po.ProTaskDetail; import com.ccsens.tall.bean.po.ProTaskDetail;
import com.ccsens.tall.bean.vo.TaskVo; import com.ccsens.tall.bean.vo.TaskVo;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List; import java.util.List;
public interface IProTaskDetailService { public interface IProTaskDetailService {
void saveTaskDetail(ProTaskDetail taskDetail); void saveTaskDetail(ProTaskDetail taskDetail);
Object getTasksByRoleId(Long currentUserId, Long projectId, Long roleId, Long startTime, Long endTime, Integer process, Integer page, Integer pageSize) throws Exception; Object getTasksByRoleId(Long currentUserId, Long projectId, Long roleId, Long startTime, Long endTime, Integer process,
Integer page, Integer pageSize) throws Exception;
TaskVo.NormalTask getTaskInfoByTaskId(Long currentUserId, Long projectId, Long taskId) throws Exception; TaskVo.NormalTask getTaskInfoByTaskId(Long currentUserId, Long projectId, Long taskId) throws Exception;

32
tall/src/main/java/com/ccsens/tall/service/IRingService.java

@ -8,9 +8,37 @@ import com.github.pagehelper.PageInfo;
import java.util.List; import java.util.List;
public interface IRingService { public interface IRingService {
void sendRingMsg(Long currentUserId, RingDto.RingSendDto ringSendDto) throws Exception; /**
* 发送消息
* @param currentUserId userId
* @param ringSendDto 发送的消息内容
* @return 返回发送的消息详细信息
* @throws Exception json异常
*/
RingVo.RingInfoByReturn sendRingMsg(Long currentUserId, RingDto.RingSendDto ringSendDto) throws Exception;
/**
* 查找ring消息
* @param currentUserId userId
* @param getRingDto 项目id和分页信息
* @return 分页查找的消息详情
*/
PageInfo<RingVo.RingInfo> getRingInfo(Long currentUserId, RingDto.GetRingDto getRingDto); PageInfo<RingVo.RingInfo> getRingInfo(Long currentUserId, RingDto.GetRingDto getRingDto);
void readRingMsg(Long currentUserId, RingDto.MessageId message) throws JsonProcessingException; /**
* 阅读消息
* @param currentUserId userId
* @param message 消息id
* @return 返回已读的消息的信息
* @throws JsonProcessingException json异常
*/
List<RingVo.RingInfo> readRingMsg(Long currentUserId, RingDto.MessageId message) throws JsonProcessingException;
/**
* 将项目下的消息全部已读
* @param currentUserId userId
* @param projectId 项目id
* @throws Exception json异常
*/
void readRingMsgByProjectId(Long currentUserId, Long projectId) throws Exception;
} }

4
tall/src/main/java/com/ccsens/tall/service/ITaskSubTimeService.java

@ -4,6 +4,7 @@ import com.ccsens.tall.bean.dto.TaskDto;
import com.ccsens.tall.bean.po.ProTaskSubTime; import com.ccsens.tall.bean.po.ProTaskSubTime;
import com.ccsens.tall.bean.vo.TaskVo; import com.ccsens.tall.bean.vo.TaskVo;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List; import java.util.List;
@ -18,7 +19,8 @@ public interface ITaskSubTimeService {
void clearTaskRealTime(Long projectId); void clearTaskRealTime(Long projectId);
List<TaskVo.KanBan> getKanbanTake(Long currentUserId, Long projectId, Long roleId, Integer type, Integer page, Integer pageSize) throws Exception; List<TaskVo.KanBan> getKanbanTake(Long currentUserId, Long projectId, Long roleId, Integer type,
Integer page, Integer pageSize, Integer orderType, Integer order) throws Exception;
void changeKanbanTake(Long currentUserId, TaskDto.ChangeKanbanTask changeKanbanTask) throws Exception; void changeKanbanTake(Long currentUserId, TaskDto.ChangeKanbanTask changeKanbanTask) throws Exception;
} }

41
tall/src/main/java/com/ccsens/tall/service/IUserInfoService.java

@ -0,0 +1,41 @@
package com.ccsens.tall.service;
import com.ccsens.tall.bean.dto.UserDto;
import com.ccsens.tall.bean.vo.UserVo;
import com.ccsens.util.NotSupportedFileTypeException;
import javax.servlet.http.Part;
/**
* @author
*/
public interface IUserInfoService {
/**
* 修改登录的账号
* @param userId 用户id
* @param changeAccount 验证码和新账号
*/
void updateAccount(Long userId, UserDto.UpdateAccount changeAccount);
/**
* 修改昵称
* @param userId 用户id
* @param updateNickname 新昵称
*/
void updateNickname(Long userId, UserDto.UpdateNickname updateNickname);
/**
* 上传头像
* @param currentUserId userId
* @param file 上传的文件
* @throws Exception 文件异常
*/
void uploadAvatarUrl(Long currentUserId, Part file) throws Exception;
/**
* 查找全部个人信息
* @param currentUserId userId
* @return 个人信息
*/
UserVo.SelectUserInfo selectUserInfo(Long currentUserId);
}

26
tall/src/main/java/com/ccsens/tall/service/IUserService.java

@ -1,17 +1,19 @@
package com.ccsens.tall.service; package com.ccsens.tall.service;
import com.ccsens.tall.bean.dto.ProjectDto; import com.ccsens.tall.bean.dto.ProjectDto;
import com.ccsens.tall.bean.dto.UserDto; import com.ccsens.tall.bean.dto.UserDto;
import com.ccsens.tall.bean.po.SysUser; import com.ccsens.tall.bean.po.SysUser;
import com.ccsens.tall.bean.vo.UserVo; import com.ccsens.tall.bean.vo.UserVo;
import com.ccsens.util.WebConstant; import com.ccsens.util.WebConstant;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
/**
* @author
*/
public interface IUserService { public interface IUserService {
UserVo.UserSign signin(WebConstant.CLIENT_TYPE clientType, WebConstant.IDENTIFY_TYPE identifyType, UserVo.UserSign signin(WebConstant.CLIENT_TYPE clientType, WebConstant.IDENTIFY_TYPE identifyType,
String identifier, String credential, String clientIp, String redirect) throws Exception; String identifier, String credential, String clientIp, String redirect) throws Exception;
@ -42,8 +44,23 @@ public interface IUserService {
void updateAccount(UserDto.Account account); void updateAccount(UserDto.Account account);
/**
* 通过手机号修改密码
* @param passwordDto 手机号验证码
*/
void updatePassword(UserDto.UpdatePassword passwordDto) throws Exception; void updatePassword(UserDto.UpdatePassword passwordDto) throws Exception;
/**
* 通过账号密码修改密码
* @param passwordDto 账号旧密码和新密码
*/
void updatePasswordByAccount(UserDto.UpdatePasswordByAccount passwordDto) throws Exception;
/**
* 通过手机号查找userId
* @param phoneCell 手机号
* @return userId
*/
Long selectUserIdByPhone(String phoneCell)throws Exception; Long selectUserIdByPhone(String phoneCell)throws Exception;
String selectAccountByPhone(String phone)throws Exception; String selectAccountByPhone(String phone)throws Exception;
@ -86,5 +103,6 @@ public interface IUserService {
* @param ids * @param ids
* @return * @return
*/ */
List<UserVo.UserInfo> listUserInfos(Long[] ids); List<UserVo.UserInfo> queryUserInfos(Long[] ids);
} }

1
tall/src/main/java/com/ccsens/tall/service/LabelService.java

@ -58,6 +58,7 @@ public class LabelService implements ILabelService{
/** /**
* 查找此用户的所有标签 * 查找此用户的所有标签
* @param currentUserId userId * @param currentUserId userId
* @param key 标签名包含的关键字
* @return 返回该用户添加的所有标签 * @return 返回该用户添加的所有标签
*/ */
@Override @Override

176
tall/src/main/java/com/ccsens/tall/service/ProMemberService.java

@ -2,7 +2,10 @@ package com.ccsens.tall.service;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.ccsens.tall.bean.dto.MemberDto;
import com.ccsens.tall.bean.dto.MemberRoleDto;
import com.ccsens.tall.bean.po.*; import com.ccsens.tall.bean.po.*;
import com.ccsens.tall.bean.vo.MemberVo; import com.ccsens.tall.bean.vo.MemberVo;
import com.ccsens.tall.bean.vo.ProjectVo; import com.ccsens.tall.bean.vo.ProjectVo;
@ -11,12 +14,11 @@ import com.ccsens.util.CodeEnum;
import com.ccsens.util.WebConstant; import com.ccsens.util.WebConstant;
import com.ccsens.util.exception.BaseException; import com.ccsens.util.exception.BaseException;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.lang.reflect.Member; import javax.annotation.Resource;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -24,18 +26,24 @@ import java.util.List;
@Service @Service
@Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class) @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
public class ProMemberService implements IProMemberService { public class ProMemberService implements IProMemberService {
@Autowired @Resource
private ProMemberDao proMemberDao; private ProMemberDao proMemberDao;
@Autowired @Resource
private ProRoleDao proRoleDao; private ProRoleDao proRoleDao;
@Autowired @Resource
private ProMemberRoleDao proMemberRoleDao; private ProMemberRoleDao proMemberRoleDao;
@Autowired @Resource
private IUserService userService;
@Autowired
private SysUserDao userDao; private SysUserDao userDao;
@Autowired @Resource
private SysAuthDao authDao; private SysAuthDao authDao;
@Resource
private ProRoleService proRoleService;
@Resource
private IUserService userService;
@Resource
private Snowflake snowflake;
@Resource
private UserAttentionDao userAttentionDao;
@Override @Override
@ -46,75 +54,6 @@ public class ProMemberService implements IProMemberService {
@Override @Override
public List<ProjectVo.MembersByProject> selectMembersByProjectId(Long projectId) throws Exception { public List<ProjectVo.MembersByProject> selectMembersByProjectId(Long projectId) throws Exception {
List<ProjectVo.MembersByProject> members = proMemberDao.selectMembersByProjectId(projectId); List<ProjectVo.MembersByProject> members = proMemberDao.selectMembersByProjectId(projectId);
// List<ProjectVo.MembersByProject> members = new ArrayList<>();
// ProjectVo.MembersByProject member = null;
// List<ProjectVo.MembersByProject.BelongRole> belongRoleList = null;
// ProjectVo.MembersByProject.BelongRole belongRole = null;
// ProMemberExample memberExample = new ProMemberExample();
// memberExample.createCriteria().andProjectIdEqualTo(projectId).andStakeholderIdIsNull();
// List<ProMember> memberList = proMemberDao.selectByExample(memberExample);
// if(CollectionUtil.isNotEmpty(memberList)){
// for(ProMember proMember:memberList){
// member = new ProjectVo.MembersByProject();
// member.setMemberId(proMember.getId());
// member.setName(proMember.getNickname());
// member.setPhone(proMember.getPhone());
// member.setUserId(proMember.getUserId());
// }
// }
//
// //查找所有角色
// ProRoleExample roleExample = new ProRoleExample();
// roleExample.createCriteria().andProjectIdEqualTo(projectId);
// List<ProRole> roleList = proRoleDao.selectByExample(roleExample);
// if(CollectionUtil.isNotEmpty(roleList)){
// for(ProRole role :roleList){
// if(!role.getName().equals(WebConstant.ROLE_NAME.AllMember.phase)&&!role.getName().equals(WebConstant.ROLE_NAME.MVP.phase)) {
// //查找角色下所有成员
// ProMemberRoleExample memberRoleExample = new ProMemberRoleExample();
// memberRoleExample.createCriteria().andRoleIdEqualTo(role.getId());
// List<ProMemberRole> memberRoleList = proMemberRoleDao.selectByExample(memberRoleExample);
// if(CollectionUtil.isNotEmpty(memberRoleList)){
// for (ProMemberRole memberRole:memberRoleList){
// ProMember proMember = proMemberDao.selectByPrimaryKey(memberRole.getMemberId());
// if(ObjectUtil.isNotNull(proMember)){
// boolean flag = false;
// if (CollectionUtil.isNotEmpty(members)) {
// for (ProjectVo.MembersByProject membersByProject : members) {
// if (membersByProject.getPhone().equals(proMember.getPhone())) {
// belongRole = new ProjectVo.MembersByProject.BelongRole();
// belongRole.setRoleId(role.getId());
// belongRole.setRoleName(role.getName());
// membersByProject.getBelongRole().add(belongRole);
// flag = true;
// break;
// }
// }
// }
// if (!flag) {
// member = new ProjectVo.MembersByProject();
// member.setMemberId(proMember.getId());
// member.setName(proMember.getNickname());
// member.setPhone(proMember.getPhone());
// member.setUserId(proMember.getUserId());
// String mAccount = userService.selectAccountByPhone(member.getPhone());
// member.setAccount(mAccount);
//
// belongRoleList = new ArrayList<>();
// belongRole = new ProjectVo.MembersByProject.BelongRole();
// belongRole.setRoleId(role.getId());
// belongRole.setRoleName(role.getName());
// belongRoleList.add(belongRole);
// member.setBelongRole(belongRoleList);
//
// members.add(member);
// }
// }
// }
// }
// }
// }
// }
return members; return members;
} }
@ -289,4 +228,85 @@ public class ProMemberService implements IProMemberService {
} }
return memberIdList; return memberIdList;
} }
@Override
public void saveProMember(Long currentUserId, MemberDto.SaveMember saveMember) throws Exception {
int power = proRoleService.selectPowerByRoleName(currentUserId, saveMember.getProjectId());
if (power > 1) {
//通过手机号查找用户
Long userId = userService.selectUserIdByPhone(saveMember.getPhone());
//添加成员
ProMember proMember = new ProMember();
proMember.setId(snowflake.nextId());
proMember.setProjectId(saveMember.getProjectId());
proMember.setNickname(saveMember.getMemberName());
proMember.setUserId(userId);
proMember.setStakeholderId(saveMember.getStakeholderId());
proMemberDao.insertSelective(proMember);
//添加成员与角色的关联
if(CollectionUtil.isNotEmpty(saveMember.getRoleId())){
saveMember.getRoleId().forEach(roleId -> {
ProMemberRole proMemberRole = new MemberRoleDto();
proMemberRole.setId(snowflake.nextId());
proMemberRole.setRoleId(roleId);
proMemberRole.setMemberId(proMember.getId());
proMemberRoleDao.insertSelective(proMemberRole);
});
}
//添加用户关注项目信息
if(ObjectUtil.isNotNull(userId)) {
UserAttention userAttention = new UserAttention();
userAttention.setId(snowflake.nextId());
userAttention.setUserId(userId);
userAttention.setProjectId(saveMember.getProjectId());
userAttentionDao.insertSelective(userAttention);
}
} else {
throw new BaseException(CodeEnum.NOT_POWER);
}
}
@Override
public void deleteMember(Long currentUserId, MemberDto.DeleteMember deleteMember) {
//查找要删除的成员
ProMember proMember = proMemberDao.selectByPrimaryKey(deleteMember.getMemberId());
if(ObjectUtil.isNull(proMember)){
throw new BaseException(CodeEnum.NOT_MEMBER);
}
//检查操作者的权限
int power = proRoleService.selectPowerByRoleName(currentUserId, proMember.getProjectId());
// if (power < 2) {
// throw new BaseException(CodeEnum.NOT_POWER);
// }
//修改成员状态来删除
proMember.setRecStatus((byte) 2);
proMemberDao.updateByPrimaryKeySelective(proMember);
//删除成员和角色关联信息
ProMemberRoleExample proMemberRoleExample = new ProMemberRoleExample();
proMemberRoleExample.createCriteria().andMemberIdEqualTo(proMember.getId());
List<ProMemberRole> proMemberRoleList = proMemberRoleDao.selectByExample(proMemberRoleExample);
if(CollectionUtil.isNotEmpty(proMemberRoleList)){
proMemberRoleList.forEach(proMemberRole -> {
proMemberRole.setRecStatus((byte) 2);
proMemberRoleDao.updateByPrimaryKeySelective(proMemberRole);
});
}
//删除成员关注项目的信息
UserAttentionExample userAttentionExample = new UserAttentionExample();
userAttentionExample.createCriteria().andUserIdEqualTo(proMember.getUserId()).andProjectIdEqualTo(proMember.getProjectId());
List<UserAttention> userAttentionList = userAttentionDao.selectByExample(userAttentionExample);
if(CollectionUtil.isNotEmpty(userAttentionList)){
userAttentionList.forEach(userAttention -> {
userAttention.setRecStatus((byte) 2);
userAttentionDao.updateByPrimaryKeySelective(userAttention);
});
}
}
@Override
public ProjectVo.MembersByProject updateMemberInfo(Long currentUserId, MemberDto.UpdateMemberInfo updateMemberInfo) {
return null;
}
} }

14
tall/src/main/java/com/ccsens/tall/service/ProTaskDetailService.java

@ -81,7 +81,8 @@ public class ProTaskDetailService implements IProTaskDetailService {
} }
@Override @Override
public Object getTasksByRoleId(Long currentUserId, Long projectId, Long roleId, Long startTime, Long endTime, Integer process, Integer page, Integer pageSize) throws Exception { public Object getTasksByRoleId(Long currentUserId, Long projectId, Long roleId, Long startTime, Long endTime, Integer process,
Integer page, Integer pageSize) throws Exception {
SysProject sysProject = sysProjectDao.selectByPrimaryKey(projectId); SysProject sysProject = sysProjectDao.selectByPrimaryKey(projectId);
if (ObjectUtil.isNull(sysProject)) { if (ObjectUtil.isNull(sysProject)) {
throw new BaseException(CodeEnum.NOT_PROJECT); throw new BaseException(CodeEnum.NOT_PROJECT);
@ -134,7 +135,8 @@ public class ProTaskDetailService implements IProTaskDetailService {
/** /**
* 查看任务 项目经理 * 查看任务 项目经理
*/ */
private TaskVo.ProTaskInfo getTaskInfoByProjectIdAndPM(Long currentUserId, Long projectId,Long roleId, Long startTime, Long endTime, Integer process, Integer page, Integer pageSize) throws Exception { private TaskVo.ProTaskInfo getTaskInfoByProjectIdAndPM(Long currentUserId, Long projectId,Long roleId, Long startTime, Long endTime,
Integer process, Integer page, Integer pageSize) throws Exception {
TaskVo.ProTaskInfo proTaskInfo = new TaskVo.ProTaskInfo(); TaskVo.ProTaskInfo proTaskInfo = new TaskVo.ProTaskInfo();
List<TaskVo.GlobalTask> globalTaskList = new ArrayList<>(); List<TaskVo.GlobalTask> globalTaskList = new ArrayList<>();
@ -233,7 +235,8 @@ public class ProTaskDetailService implements IProTaskDetailService {
/** /**
* 查看任务 项目成员 * 查看任务 项目成员
*/ */
private TaskVo.ProTaskInfo getTaskInfoByProjectIdAndRoleId(Long currentUserId, Long projectId, Long roleId, Long startTime, Long endTime, Integer process, Integer page, Integer pageSize) throws Exception { private TaskVo.ProTaskInfo getTaskInfoByProjectIdAndRoleId(Long currentUserId, Long projectId, Long roleId, Long startTime,
Long endTime, Integer process, Integer page, Integer pageSize) throws Exception {
TaskVo.ProTaskInfo proTaskInfo = new TaskVo.ProTaskInfo(); TaskVo.ProTaskInfo proTaskInfo = new TaskVo.ProTaskInfo();
List<TaskVo.GlobalTask> globalTaskList = new ArrayList<>(); List<TaskVo.GlobalTask> globalTaskList = new ArrayList<>();
@ -246,7 +249,8 @@ public class ProTaskDetailService implements IProTaskDetailService {
allMemberId = allMember.getId(); allMemberId = allMember.getId();
} }
//查找该角色的所有任务(全体成员的任务也是这个角色的任务) //查找该角色的所有任务(全体成员的任务也是这个角色的任务)
List<TaskVo.NormalTask> secondTaskVoList = taskDetailDao.selectTaskByRoleAndAllMembers(projectId, roleId,allMemberId, startTime, endTime); List<TaskVo.NormalTask> secondTaskVoList = taskDetailDao.selectTaskByRoleAndAllMembers(projectId, roleId,
allMemberId, startTime, endTime);
if (CollectionUtil.isNotEmpty(secondTaskVoList)) { if (CollectionUtil.isNotEmpty(secondTaskVoList)) {
for (TaskVo.NormalTask normalTask : secondTaskVoList) { for (TaskVo.NormalTask normalTask : secondTaskVoList) {
@ -285,7 +289,7 @@ public class ProTaskDetailService implements IProTaskDetailService {
} }
} }
if (CollectionUtil.isNotEmpty(task.getCommonTask())) { if (CollectionUtil.isNotEmpty(task.getCommonTask())) {
normalTaskList = sortTaskTime(task.getCommonTask()); normalTaskList = sortTaskTime(task.getCommonTask());
} }
} }

60
tall/src/main/java/com/ccsens/tall/service/ProjectService.java

@ -7,7 +7,6 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.ccsens.tall.bean.dto.ProjectDto; import com.ccsens.tall.bean.dto.ProjectDto;
import com.ccsens.tall.bean.po.*; import com.ccsens.tall.bean.po.*;
import com.ccsens.tall.bean.vo.DomainVo;
import com.ccsens.tall.bean.vo.LabelVo; import com.ccsens.tall.bean.vo.LabelVo;
import com.ccsens.tall.bean.vo.ProjectVo; import com.ccsens.tall.bean.vo.ProjectVo;
import com.ccsens.tall.persist.dao.*; import com.ccsens.tall.persist.dao.*;
@ -20,11 +19,11 @@ import com.ccsens.util.exception.BaseException;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
@ -32,31 +31,31 @@ import java.util.*;
@Service @Service
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public class ProjectService implements IProjectService { public class ProjectService implements IProjectService {
@Autowired @Resource
private SysProjectDao sysProjectDao; private SysProjectDao sysProjectDao;
@Autowired @Resource
private ProShowDao proShowDao; private ProShowDao proShowDao;
@Autowired @Resource
private ProRoleExcludeDao roleExcludeDao; private ProRoleExcludeDao roleExcludeDao;
@Autowired @Resource
private ProRoleDao proRoleDao; private ProRoleDao proRoleDao;
@Autowired @Resource
private TaskDetailDao taskDetailDao; private TaskDetailDao taskDetailDao;
@Autowired @Resource
private TaskSubTimeDao taskSubTimeDao; private TaskSubTimeDao taskSubTimeDao;
@Autowired @Resource
private UserAttentionDao attentionDao; private UserAttentionDao attentionDao;
@Autowired @Resource
private TaskPluginDao pluginDao; private TaskPluginDao pluginDao;
@Autowired @Resource
private TaskDeliverDao taskDeliverDao; private TaskDeliverDao taskDeliverDao;
@Autowired @Resource
private IProRoleService proRoleService; private IProRoleService proRoleService;
@Autowired @Resource
private Snowflake snowflake; private Snowflake snowflake;
@Autowired @Resource
private SysDomainDao sysDomainDao; private SysDomainDao sysDomainDao;
@Autowired @Resource
private SysLabelDao sysLabelDao; private SysLabelDao sysLabelDao;
@Override @Override
@ -71,13 +70,12 @@ public class ProjectService implements IProjectService {
/** /**
* 根据名字查找此用户创建的项目 * 根据名字查找此用户创建的项目
* * @param subProject 项目名
* @param subProject * @param currentUserId userId
* @param currentUserId * @return 项目信息
* @return
*/ */
@Override @Override
public SysProject selectByNameAndUserId(String subProject, Long currentUserId) throws Exception { public SysProject selectByNameAndUserId(String subProject, Long currentUserId) {
SysProject project = new SysProject(); SysProject project = new SysProject();
SysProjectExample projectExample = new SysProjectExample(); SysProjectExample projectExample = new SysProjectExample();
projectExample.createCriteria().andCreatorIdEqualTo(currentUserId).andNameEqualTo(subProject); projectExample.createCriteria().andCreatorIdEqualTo(currentUserId).andNameEqualTo(subProject);
@ -90,10 +88,9 @@ public class ProjectService implements IProjectService {
/** /**
* 查找本月哪一天有项目 * 查找本月哪一天有项目
* * @param currentUserId userId
* @param currentUserId * @param date 日期
* @param date * @return 返回有项目的日期
* @return
*/ */
@Override @Override
public List<String> haveProjectDay(Long currentUserId, String date) throws Exception { public List<String> haveProjectDay(Long currentUserId, String date) throws Exception {
@ -109,13 +106,13 @@ public class ProjectService implements IProjectService {
for (SysProject sysProject : projectList) { for (SysProject sysProject : projectList) {
startMillisTime = sysProject.getBeginTime() > startMillisTime ? sysProject.getBeginTime() : startMillisTime; startMillisTime = sysProject.getBeginTime() > startMillisTime ? sysProject.getBeginTime() : startMillisTime;
endMillisTime = sysProject.getEndTime() < endMillisTime ? sysProject.getEndTime() : endMillisTime; endMillisTime = sysProject.getEndTime() < endMillisTime ? sysProject.getEndTime() : endMillisTime;
dateList = getTimeList(dateList, startMillisTime, endMillisTime); getTimeList(dateList, startMillisTime, endMillisTime);
} }
} }
return dateList; return dateList;
} }
private List<String> getTimeList(List<String> dateList, Long startTime, Long endTime) { private void getTimeList(List<String> dateList, Long startTime, Long endTime) {
SimpleDateFormat sdf = new SimpleDateFormat("dd"); SimpleDateFormat sdf = new SimpleDateFormat("dd");
Date s = new Date(startTime); Date s = new Date(startTime);
Date e = new Date(endTime); Date e = new Date(endTime);
@ -133,7 +130,6 @@ public class ProjectService implements IProjectService {
} }
curr.add(Calendar.DATE, 1); curr.add(Calendar.DATE, 1);
} }
return dateList;
} }
/** /**
@ -193,10 +189,18 @@ public class ProjectService implements IProjectService {
ProjectVo.ProjectConfig projectConfig = new ProjectVo.ProjectConfig(); ProjectVo.ProjectConfig projectConfig = new ProjectVo.ProjectConfig();
projectInfo.setProjectConfig(projectConfig); projectInfo.setProjectConfig(projectConfig);
} }
//查找项目未处理的消息数量
ProjectVo.ProjectUnreadMsg unreadMsg = getUnreadMsgByProject(currentUserId,projectInfo.getId());
projectInfo.setProjectUnreadMsg(unreadMsg);
}); });
} }
} }
private ProjectVo.ProjectUnreadMsg getUnreadMsgByProject(Long userId,Long projectId) {
return null;
}
private List<ProjectVo.ProjectInfo> projectInfoByProject(List<SysProject> projectList, Long currentUserId) { private List<ProjectVo.ProjectInfo> projectInfoByProject(List<SysProject> projectList, Long currentUserId) {
List<ProjectVo.ProjectInfo> projectInfoList = new ArrayList<>(); List<ProjectVo.ProjectInfo> projectInfoList = new ArrayList<>();
if (CollectionUtil.isNotEmpty(projectList)) { if (CollectionUtil.isNotEmpty(projectList)) {
@ -587,6 +591,7 @@ public class ProjectService implements IProjectService {
if (CollectionUtil.isNotEmpty(roleExecludeList)) { if (CollectionUtil.isNotEmpty(roleExecludeList)) {
for (ProRoleExclude roleExeclude : roleExecludeList) { for (ProRoleExclude roleExeclude : roleExecludeList) {
ProRoleExclude newRoleExeclude = new ProRoleExclude(); ProRoleExclude newRoleExeclude = new ProRoleExclude();
newRoleExeclude.setId(snowflake.nextId());
newRoleExeclude.setRoleId(newRoleMap.get(oldRoleMap.get(roleExeclude.getRoleId()))); newRoleExeclude.setRoleId(newRoleMap.get(oldRoleMap.get(roleExeclude.getRoleId())));
newRoleExeclude.setOtherRoleId(newRoleMap.get(oldRoleMap.get(roleExeclude.getRoleId()))); newRoleExeclude.setOtherRoleId(newRoleMap.get(oldRoleMap.get(roleExeclude.getRoleId())));
roleExcludeDao.insertSelective(newRoleExeclude); roleExcludeDao.insertSelective(newRoleExeclude);
@ -757,6 +762,7 @@ public class ProjectService implements IProjectService {
sysProjectDao.updateByPrimaryKeySelective(project); sysProjectDao.updateByPrimaryKeySelective(project);
} else { } else {
throw new BaseException(CodeEnum.NOT_POWER); throw new BaseException(CodeEnum.NOT_POWER);
} }
} else { } else {
throw new BaseException(CodeEnum.NOT_PROJECT); throw new BaseException(CodeEnum.NOT_PROJECT);

149
tall/src/main/java/com/ccsens/tall/service/RingService.java

@ -3,6 +3,7 @@ package com.ccsens.tall.service;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Snowflake; import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.ccsens.tall.bean.dto.RingDto; import com.ccsens.tall.bean.dto.RingDto;
import com.ccsens.tall.bean.dto.message.BaseMessageDto; import com.ccsens.tall.bean.dto.message.BaseMessageDto;
import com.ccsens.tall.bean.dto.message.RingMessageWithReadDto; import com.ccsens.tall.bean.dto.message.RingMessageWithReadDto;
@ -10,11 +11,14 @@ import com.ccsens.tall.bean.dto.message.RingMessageWithSendDto;
import com.ccsens.tall.bean.po.SysRingMsg; import com.ccsens.tall.bean.po.SysRingMsg;
import com.ccsens.tall.bean.po.SysRingSend; import com.ccsens.tall.bean.po.SysRingSend;
import com.ccsens.tall.bean.po.SysRingSendExample; import com.ccsens.tall.bean.po.SysRingSendExample;
import com.ccsens.tall.bean.po.SysUser;
import com.ccsens.tall.bean.vo.RingVo; import com.ccsens.tall.bean.vo.RingVo;
import com.ccsens.tall.persist.dao.SysRingMsgDao; import com.ccsens.tall.persist.dao.SysRingMsgDao;
import com.ccsens.tall.persist.dao.SysRingSendDao; import com.ccsens.tall.persist.dao.SysRingSendDao;
import com.ccsens.tall.persist.dao.SysUserDao;
import com.ccsens.util.CodeEnum; import com.ccsens.util.CodeEnum;
import com.ccsens.util.JacksonUtil; import com.ccsens.util.JacksonUtil;
import com.ccsens.util.PropUtil;
import com.ccsens.util.config.RabbitMQConfig; import com.ccsens.util.config.RabbitMQConfig;
import com.ccsens.util.exception.BaseException; import com.ccsens.util.exception.BaseException;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
@ -22,13 +26,12 @@ import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.*; import java.util.*;
import java.util.function.Consumer;
/** /**
* @author * @author
@ -36,26 +39,29 @@ import java.util.function.Consumer;
@Slf4j @Slf4j
@Service @Service
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public class RingService implements IRingService{ public class RingService implements IRingService {
@Autowired @Resource
private Snowflake snowflake; private Snowflake snowflake;
@Autowired @Resource
private SysRingMsgDao sysRingMsgDao; private SysRingMsgDao sysRingMsgDao;
@Autowired @Resource
private SysRingSendDao sysRingSendDao; private SysRingSendDao sysRingSendDao;
@Autowired @Resource
private IUserService userService; private IUserService userService;
@Autowired @Resource
private SysUserDao userDao;
@Resource
private RabbitTemplate rabbitTemplate; private RabbitTemplate rabbitTemplate;
/** /**
* 发送ring消息 * 发送ring消息
*
* @param currentUserId 当前用户userid * @param currentUserId 当前用户userid
* @param ringSendDto 发送的消息内容 * @param ringSendDto 发送的消息内容
*/ */
@Override @Override
public void sendRingMsg(Long currentUserId, RingDto.RingSendDto ringSendDto) throws Exception { public RingVo.RingInfoByReturn sendRingMsg(Long currentUserId, RingDto.RingSendDto ringSendDto) throws Exception {
//获取当前时间 //获取当前时间
Long time = System.currentTimeMillis(); Long time = System.currentTimeMillis();
//将消息详情保存至数据库 //将消息详情保存至数据库
@ -65,17 +71,17 @@ public class RingService implements IRingService{
ringMsg.setSenderId(currentUserId); ringMsg.setSenderId(currentUserId);
ringMsg.setTime(time); ringMsg.setTime(time);
ringMsg.setValueText(ringSendDto.getValue()); ringMsg.setValueText(ringSendDto.getValue());
if(ringSendDto.getValue().length() > 20){ if (ringSendDto.getValue().length() > 20) {
ringMsg.setValue(ringSendDto.getValue().substring(0,20)); ringMsg.setValue(ringSendDto.getValue().substring(0, 20));
}else { } else {
ringMsg.setValue(ringSendDto.getValue()); ringMsg.setValue(ringSendDto.getValue());
} }
sysRingMsgDao.insertSelective(ringMsg); sysRingMsgDao.insertSelective(ringMsg);
//所有接收者的userId //所有接收者的userId
Set<Long> userIdSet = new HashSet<>(); Set<Long> userIdSet = new HashSet<>();
//添加消息详情与接收角色的关联信息 //添加消息详情与接收角色的关联信息
if(CollectionUtil.isNotEmpty(ringSendDto.getRoleList())){ if (CollectionUtil.isNotEmpty(ringSendDto.getRoleList())) {
for(Long roleId :ringSendDto.getRoleList()){ for (Long roleId : ringSendDto.getRoleList()) {
SysRingSend sysRingSend = new SysRingSend(); SysRingSend sysRingSend = new SysRingSend();
sysRingSend.setId(snowflake.nextId()); sysRingSend.setId(snowflake.nextId());
sysRingSend.setRingId(ringMsg.getId()); sysRingSend.setRingId(ringMsg.getId());
@ -88,16 +94,25 @@ public class RingService implements IRingService{
List<Long> userIdList = new ArrayList<>(userIdSet); List<Long> userIdList = new ArrayList<>(userIdSet);
//发送消息 //发送消息
RingMessageWithSendDto ringMessageWithSendDto = new RingMessageWithSendDto( RingMessageWithSendDto ringMessageWithSendDto = new RingMessageWithSendDto(
ringMsg.getId(),ringSendDto.getProjectId(),ringMsg.getValue(),time); ringMsg.getId(), ringSendDto.getProjectId(), ringMsg.getValue(), time);
ringMessageWithSendDto.setReceivers(BaseMessageDto.MessageUser.userIdToUsers(userIdList)); ringMessageWithSendDto.setReceivers(BaseMessageDto.MessageUser.userIdToUsers(userIdList));
rabbitTemplate.convertAndSend(RabbitMQConfig.RabbitMQ_QUEUE_NAME, rabbitTemplate.convertAndSend(RabbitMQConfig.RabbitMQ_QUEUE_NAME,
JacksonUtil.beanToJson(ringMessageWithSendDto)); JacksonUtil.beanToJson(ringMessageWithSendDto));
//返回消息的详细信息
RingVo.RingInfoByReturn ringInfoByReturn = new RingVo.RingInfoByReturn();
ringInfoByReturn.setMessageId(ringMsg.getId());
ringInfoByReturn.setTime(ringMsg.getTime());
ringInfoByReturn.setValue(ringMsg.getValueText());
List<RingVo.MsgReceiveRole> msgReceiveRole = sysRingMsgDao.ringReceiveRole(ringMsg.getId());
ringInfoByReturn.setRoleList(msgReceiveRole);
return ringInfoByReturn;
} }
/** /**
* 查询ring消息 * 查询ring消息
*
* @param currentUserId userId * @param currentUserId userId
* @param getRingDto 查询条件 * @param getRingDto 查询条件
* @return 时间倒叙查询最近10条信息在返回的结果中需时间正序展示 * @return 时间倒叙查询最近10条信息在返回的结果中需时间正序展示
*/ */
@Override @Override
@ -107,18 +122,28 @@ public class RingService implements IRingService{
getRingDto.setPageSize(getRingDto.getPageSize() == null ? 10 : getRingDto.getPageSize()); getRingDto.setPageSize(getRingDto.getPageSize() == null ? 10 : getRingDto.getPageSize());
PageHelper.startPage(getRingDto.getPage(), getRingDto.getPageSize()); PageHelper.startPage(getRingDto.getPage(), getRingDto.getPageSize());
List<RingVo.RingInfo> ringInfoList = sysRingMsgDao.selectRingInfoByProject(currentUserId,getRingDto.getProjectId()); List<RingVo.RingInfo> ringInfoList = sysRingMsgDao.selectRingInfoByProject(currentUserId, getRingDto.getProjectId());
if(CollectionUtil.isNotEmpty(ringInfoList)){ if (CollectionUtil.isNotEmpty(ringInfoList)) {
ringInfoList.forEach(ringInfo -> { ringInfoList.forEach(ringInfo -> {
//添加接收角色的信息
List<RingVo.MsgReceiveRole> msgReceiveRole = sysRingMsgDao.ringReceiveRole(ringInfo.getMessageId()); List<RingVo.MsgReceiveRole> msgReceiveRole = sysRingMsgDao.ringReceiveRole(ringInfo.getMessageId());
ringInfo.setRoleList(msgReceiveRole); ringInfo.setRoleList(msgReceiveRole);
//添加发送者的头像
if (ObjectUtil.isNotNull(ringInfo.getSender())) {
SysUser user = userDao.selectByPrimaryKey(ringInfo.getSender().getId());
if (ObjectUtil.isNotNull(user) && StrUtil.isNotEmpty(user.getAvatarUrl())) {
ringInfo.getSender().setAvatarUrl(user.getAvatarUrl());
} else {
ringInfo.getSender().setAvatarUrl(PropUtil.notGatewayUrl + "staticrec/logo.png");
}
}
}); });
} }
CollectionUtil.sort(ringInfoList,new Comparator<RingVo.RingInfo>(){ CollectionUtil.sort(ringInfoList, new Comparator<RingVo.RingInfo>() {
@Override @Override
public int compare(RingVo.RingInfo o1, RingVo.RingInfo o2) { public int compare(RingVo.RingInfo o1, RingVo.RingInfo o2) {
return (int)(o1.getTime() - o2.getTime()); return (int) (o1.getTime() - o2.getTime());
} }
}); });
@ -127,28 +152,30 @@ public class RingService implements IRingService{
/** /**
* 阅读消息将消息设为已读 * 阅读消息将消息设为已读
*
* @param currentUserId userId * @param currentUserId userId
* @param message 项目id和消息id可以多个同时将多个消息设为已读 * @param message 项目id和消息id可以多个同时将多个消息设为已读
*/ */
@Override @Override
public void readRingMsg(Long currentUserId, RingDto.MessageId message) throws JsonProcessingException { public List<RingVo.RingInfo> readRingMsg(Long currentUserId, RingDto.MessageId message) throws JsonProcessingException {
List<RingVo.RingInfo> ringInfoList = new ArrayList<>();
//获取当前用户在项目内的角色 //获取当前用户在项目内的角色
List<Long> roleIdList = sysRingMsgDao.selectRoleIdByUserId(currentUserId,message.getProjectId()); List<Long> roleIdList = sysRingMsgDao.selectRoleIdByUserId(currentUserId, message.getProjectId());
log.info("阅读者的角色:{}",roleIdList.toString()); log.info("阅读者的角色:{}", roleIdList.toString());
//将每条消息的状态设为已读 //将每条消息的状态设为已读
if(CollectionUtil.isNotEmpty(roleIdList) && CollectionUtil.isNotEmpty(message.getMessageIdList())){ if (CollectionUtil.isNotEmpty(roleIdList) && CollectionUtil.isNotEmpty(message.getMessageIdList())) {
for(Long roleId : roleIdList){ for (Long msgId : message.getMessageIdList()) {
for(Long msgId : message.getMessageIdList()){ for (Long roleId : roleIdList) {
//查找消息 //查找消息
SysRingMsg sysRingMsg = sysRingMsgDao.selectByPrimaryKey(msgId); SysRingMsg sysRingMsg = sysRingMsgDao.selectByPrimaryKey(msgId);
if(ObjectUtil.isNull(sysRingMsg)){ if (ObjectUtil.isNull(sysRingMsg)) {
throw new BaseException(CodeEnum.PARAM_ERROR); throw new BaseException(CodeEnum.PARAM_ERROR);
} }
SysRingSendExample sysRingSendExample = new SysRingSendExample(); SysRingSendExample sysRingSendExample = new SysRingSendExample();
sysRingSendExample.createCriteria().andRingIdEqualTo(msgId).andRoleIdEqualTo(roleId); sysRingSendExample.createCriteria().andRingIdEqualTo(msgId).andRoleIdEqualTo(roleId);
List<SysRingSend> sysRingSendList = sysRingSendDao.selectByExample(sysRingSendExample); List<SysRingSend> sysRingSendList = sysRingSendDao.selectByExample(sysRingSendExample);
if(CollectionUtil.isNotEmpty(sysRingSendList)){ if (CollectionUtil.isNotEmpty(sysRingSendList)) {
for(SysRingSend sysRingSend : sysRingSendList){ for (SysRingSend sysRingSend : sysRingSendList) {
sysRingSend.setReadStatus((byte) 1); sysRingSend.setReadStatus((byte) 1);
sysRingSend.setReadTime(System.currentTimeMillis()); sysRingSend.setReadTime(System.currentTimeMillis());
sysRingSendDao.updateByPrimaryKeySelective(sysRingSend); sysRingSendDao.updateByPrimaryKeySelective(sysRingSend);
@ -156,12 +183,70 @@ public class RingService implements IRingService{
//将已读消息返回给发送者 //将已读消息返回给发送者
List<Long> userIdList = new ArrayList<>(); List<Long> userIdList = new ArrayList<>();
userIdList.add(sysRingMsg.getSenderId()); userIdList.add(sysRingMsg.getSenderId());
RingMessageWithReadDto ringMessageWithReadDto = new RingMessageWithReadDto(msgId,message.getProjectId(),roleId); RingMessageWithReadDto ringMessageWithReadDto = new RingMessageWithReadDto(msgId, message.getProjectId(), roleId);
ringMessageWithReadDto.setReceivers(BaseMessageDto.MessageUser.userIdToUsers(userIdList)); ringMessageWithReadDto.setReceivers(BaseMessageDto.MessageUser.userIdToUsers(userIdList));
rabbitTemplate.convertAndSend(RabbitMQConfig.RabbitMQ_QUEUE_NAME, rabbitTemplate.convertAndSend(RabbitMQConfig.RabbitMQ_QUEUE_NAME,
JacksonUtil.beanToJson(ringMessageWithReadDto)); JacksonUtil.beanToJson(ringMessageWithReadDto));
} }
} }
//查询被读的信息返回
List<RingVo.RingInfo> ringInfos = sysRingMsgDao.selectRingInfoByRingMsgId(currentUserId, message.getProjectId(), msgId);
if (CollectionUtil.isNotEmpty(ringInfos)) {
ringInfos.forEach(ringInfo -> {
//添加接收角色的信息
List<RingVo.MsgReceiveRole> msgReceiveRole = sysRingMsgDao.ringReceiveRole(msgId);
ringInfo.setRoleList(msgReceiveRole);
//添加发送者的头像
if (ObjectUtil.isNotNull(ringInfo.getSender())) {
SysUser user = userDao.selectByPrimaryKey(ringInfo.getSender().getId());
if (ObjectUtil.isNotNull(user) && StrUtil.isNotEmpty(user.getAvatarUrl())) {
ringInfo.getSender().setAvatarUrl(user.getAvatarUrl());
} else {
ringInfo.getSender().setAvatarUrl(PropUtil.notGatewayUrl + "staticrec/logo.png");
}
}
});
}
ringInfoList.addAll(ringInfos);
}
}
return ringInfoList;
}
@Override
public void readRingMsgByProjectId(Long currentUserId, Long projectId) throws Exception {
log.info("读取消息的项目id:{}", projectId);
//获取当前用户在项目内的角色
List<Long> roleIdList = sysRingMsgDao.selectRoleIdByUserId(currentUserId, projectId);
log.info("阅读者的角色:{}", roleIdList.toString());
if (CollectionUtil.isNotEmpty(roleIdList)) {
for (Long roleId : roleIdList) {
//查找消息
SysRingSendExample sysRingSendExample = new SysRingSendExample();
sysRingSendExample.createCriteria().andRoleIdEqualTo(roleId);
List<SysRingSend> sysRingSendList = sysRingSendDao.selectByExample(sysRingSendExample);
if (CollectionUtil.isNotEmpty(sysRingSendList)) {
//循环已读消息
for (SysRingSend sysRingSend : sysRingSendList) {
if (sysRingSend.getReadStatus() != 1) {
sysRingSend.setReadStatus((byte) 1);
sysRingSend.setReadTime(System.currentTimeMillis());
sysRingSendDao.updateByPrimaryKeySelective(sysRingSend);
//获取消息
SysRingMsg sysRingMsg = sysRingMsgDao.selectByPrimaryKey(sysRingSend.getRingId());
//ws消息接收者的userId
Set<Long> userIdSet = new HashSet<>();
userIdSet.add(sysRingMsg.getSenderId());
List<Long> userIdList = new ArrayList<>(userIdSet);
//将已读消息返回给发送者
RingMessageWithReadDto ringMessageWithReadDto = new RingMessageWithReadDto(sysRingMsg.getId(), projectId, roleId);
ringMessageWithReadDto.setReceivers(BaseMessageDto.MessageUser.userIdToUsers(userIdList));
rabbitTemplate.convertAndSend(RabbitMQConfig.RabbitMQ_QUEUE_NAME,
JacksonUtil.beanToJson(ringMessageWithReadDto));
}
}
}
} }
} }
} }

17
tall/src/main/java/com/ccsens/tall/service/TaskDeliverService.java

@ -24,6 +24,7 @@ import com.ccsens.util.config.RabbitMQConfig;
import com.ccsens.util.exception.BaseException; import com.ccsens.util.exception.BaseException;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.omg.CORBA.OBJ_ADAPTER; import org.omg.CORBA.OBJ_ADAPTER;
import org.omg.CORBA.StructMember;
import org.springframework.amqp.core.AmqpTemplate; import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -208,7 +209,11 @@ public class TaskDeliverService implements ITaskDeliverService {
if (CollectionUtil.isNotEmpty(uploadDeliver.getFileInfo())) { if (CollectionUtil.isNotEmpty(uploadDeliver.getFileInfo())) {
for (DeliverDto.fileInfo fileInfo : uploadDeliver.getFileInfo()) { for (DeliverDto.fileInfo fileInfo : uploadDeliver.getFileInfo()) {
SysCommitedFile file = commitedFileDao.selectByPrimaryKey(fileInfo.getId()); SysCommitedFile file = commitedFileDao.selectByPrimaryKey(fileInfo.getId());
deliverPostLog.setFileId(fileInfo.getId()); if(ObjectUtil.isNotNull(file)){
deliverPostLog.setFileId(file.getId());
}else {
throw new BaseException(CodeEnum.NOT_DELIVER_FILE);
}
} }
} }
deliverPostLog.setUserId(currentUserId); deliverPostLog.setUserId(currentUserId);
@ -281,12 +286,6 @@ public class TaskDeliverService implements ITaskDeliverService {
rabbitTemplate.convertAndSend(RabbitMQConfig.RabbitMQ_QUEUE_NAME, rabbitTemplate.convertAndSend(RabbitMQConfig.RabbitMQ_QUEUE_NAME,
JacksonUtil.beanToJson(uploadMessage)); JacksonUtil.beanToJson(uploadMessage));
// MessageRule messageRule = MessageRule.defaultRule(MessageConstant.DomainType.User);
// String s = JacksonUtil.beanToJson(uploadMessage);
// InMessage inMessage = InMessage.newToUserMessage(currentUserId.toString(),userIdSet,null,messageRule,s);
// String j = JacksonUtil.beanToJson(inMessage);
// System.out.println(j);
// messageService.sendDeliverMessageWithUpload(inMessage);
} else { } else {
throw new BaseException(CodeEnum.IS_NOT_EXECUTOR); throw new BaseException(CodeEnum.IS_NOT_EXECUTOR);
} }
@ -429,7 +428,9 @@ public class TaskDeliverService implements ITaskDeliverService {
filePath.setDeleteTime(filePath.getUpdateTime().getTime()); filePath.setDeleteTime(filePath.getUpdateTime().getTime());
} }
//修改文件路径为可下载路径 //修改文件路径为可下载路径
filePath.setUrl(WebConstant.TEST_URL_BASE + filePath.getUrl()); if(StrUtil.isNotEmpty(filePath.getUrl())) {
filePath.setUrl(WebConstant.TEST_URL_BASE + filePath.getUrl());
}
if (ObjectUtil.isNotNull(filePath.getUploaderId())) { if (ObjectUtil.isNotNull(filePath.getUploaderId())) {
//添加上传人的姓名信息 //添加上传人的姓名信息
ProMember member = proMemberService.selectByUserId(filePath.getUploaderId(), task.getProjectId()); ProMember member = proMemberService.selectByUserId(filePath.getUploaderId(), task.getProjectId());

18
tall/src/main/java/com/ccsens/tall/service/TaskSubTimeService.java

@ -392,6 +392,7 @@ public class TaskSubTimeService implements ITaskSubTimeService {
ProTaskDeliver deliver = new ProTaskDeliver(); ProTaskDeliver deliver = new ProTaskDeliver();
deliver.setId(snowflake.nextId()); deliver.setId(snowflake.nextId());
deliver.setTaskDetailId(detail.getId()); deliver.setTaskDetailId(detail.getId());
deliver.setName(addTask.getTaskDeliver());
deliver.setIsInput(0); deliver.setIsInput(0);
taskDeliverDao.insertSelective(deliver); taskDeliverDao.insertSelective(deliver);
} }
@ -446,7 +447,8 @@ public class TaskSubTimeService implements ITaskSubTimeService {
* @return 任务列表 * @return 任务列表
*/ */
@Override @Override
public List<TaskVo.KanBan> getKanbanTake(Long currentUserId, Long projectId, Long roleId, Integer type, Integer page, Integer pageSize) throws Exception { public List<TaskVo.KanBan> getKanbanTake(Long currentUserId, Long projectId, Long roleId, Integer type,
Integer page, Integer pageSize, Integer orderType, Integer order) throws Exception {
//返回的list //返回的list
List<TaskVo.KanBan> kanBans = new ArrayList<>(); List<TaskVo.KanBan> kanBans = new ArrayList<>();
//查找此用户在任务下的成员 //查找此用户在任务下的成员
@ -456,7 +458,7 @@ public class TaskSubTimeService implements ITaskSubTimeService {
} }
//TODO 暂时确定三个状态 //TODO 暂时确定三个状态
Map<Integer, String> typeMap = new HashMap<>(); Map<Integer, String> typeMap = new HashMap<>(0);
typeMap.put(0, "未开始"); typeMap.put(0, "未开始");
typeMap.put(1, "进行中"); typeMap.put(1, "进行中");
typeMap.put(2, "已完成"); typeMap.put(2, "已完成");
@ -469,10 +471,10 @@ public class TaskSubTimeService implements ITaskSubTimeService {
kanBan.setTypeName(entry.getValue()); kanBan.setTypeName(entry.getValue());
PageHelper.startPage(page, pageSize); PageHelper.startPage(page, pageSize);
if (kanBan.getCode() <= 2) { if (kanBan.getCode() <= 2) {
List<TaskVo.KanBanTask> kanBanTaskList = taskSubTimeDao.getKanbanTake(currentUserId,projectId, roleId, kanBan.getCode(), member.getId()); List<TaskVo.KanBanTask> kanBanTaskList = taskSubTimeDao.getKanbanTake(currentUserId,projectId, roleId, kanBan.getCode(), member.getId(),orderType,order);
kanBan.setTaskList(new PageInfo<>(kanBanTaskList)); kanBan.setTaskList(new PageInfo<>(kanBanTaskList));
} else { } else {
List<TaskVo.KanBanTask> kanBanTaskList = taskSubTimeDao.getKanbanTakeByType(currentUserId,projectId, roleId, kanBan.getCode()); List<TaskVo.KanBanTask> kanBanTaskList = taskSubTimeDao.getKanbanTakeByType(currentUserId,projectId, roleId, kanBan.getCode(),orderType,order);
kanBan.setTaskList(new PageInfo<>(kanBanTaskList)); kanBan.setTaskList(new PageInfo<>(kanBanTaskList));
} }
kanBans.add(kanBan); kanBans.add(kanBan);
@ -483,10 +485,10 @@ public class TaskSubTimeService implements ITaskSubTimeService {
kanBan.setTypeName(typeMap.get(type)); kanBan.setTypeName(typeMap.get(type));
PageHelper.startPage(page, pageSize); PageHelper.startPage(page, pageSize);
if (kanBan.getCode() <= 2) { if (kanBan.getCode() <= 2) {
List<TaskVo.KanBanTask> kanBanTaskList = taskSubTimeDao.getKanbanTake(currentUserId,projectId, roleId, type, member.getId()); List<TaskVo.KanBanTask> kanBanTaskList = taskSubTimeDao.getKanbanTake(currentUserId,projectId, roleId, type, member.getId(),orderType,order);
kanBan.setTaskList(new PageInfo<>(kanBanTaskList)); kanBan.setTaskList(new PageInfo<>(kanBanTaskList));
} else { } else {
List<TaskVo.KanBanTask> kanBanTaskList = taskSubTimeDao.getKanbanTakeByType(currentUserId,projectId, roleId, type); List<TaskVo.KanBanTask> kanBanTaskList = taskSubTimeDao.getKanbanTakeByType(currentUserId,projectId, roleId, type,orderType,order);
kanBan.setTaskList(new PageInfo<>(kanBanTaskList)); kanBan.setTaskList(new PageInfo<>(kanBanTaskList));
} }
kanBans.add(kanBan); kanBans.add(kanBan);
@ -498,8 +500,8 @@ public class TaskSubTimeService implements ITaskSubTimeService {
/** /**
* 修改看板上的任务状态 * 修改看板上的任务状态
* *
* @param currentUserId * @param currentUserId userId
* @param changeKanbanTask * @param changeKanbanTask 任务状态
*/ */
@Override @Override
public void changeKanbanTake(Long currentUserId, TaskDto.ChangeKanbanTask changeKanbanTask) throws Exception { public void changeKanbanTake(Long currentUserId, TaskDto.ChangeKanbanTask changeKanbanTask) throws Exception {

173
tall/src/main/java/com/ccsens/tall/service/UserInfoService.java

@ -0,0 +1,173 @@
package com.ccsens.tall.service;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ImageUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.ccsens.tall.bean.dto.UserDto;
import com.ccsens.tall.bean.po.*;
import com.ccsens.tall.bean.vo.UserVo;
import com.ccsens.tall.persist.dao.SysAuthDao;
import com.ccsens.tall.persist.dao.SysLabelDao;
import com.ccsens.tall.persist.dao.SysUserDao;
import com.ccsens.tall.util.TallConstant;
import com.ccsens.util.*;
import com.ccsens.util.exception.BaseException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import javax.servlet.http.Part;
import java.io.File;
import java.util.Date;
import java.util.List;
/**
* @author
*/
@Slf4j
@Service
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public class UserInfoService implements IUserInfoService{
@Resource
private RedisUtil redisUtil;
@Resource
private SysAuthDao sysAuthDao;
@Resource
private SysUserDao sysUserDao;
@Resource
private SysLabelDao sysLabelDao;
@Override
public void updateAccount(Long userId, UserDto.UpdateAccount changeAccount) {
//判断验证码是否正确
if (redisUtil.hasKey(RedisKeyManager.getSigninSmsKey(changeAccount.getPhone()))) {
if (changeAccount.getSmsCode().equals(redisUtil.get(RedisKeyManager.getSigninSmsKey(changeAccount.getPhone())).toString())) {
//查找redis该账号是否正在使用
String accountKey = TallConstant.getUpdateAccount(changeAccount.getAccount());
if(redisUtil.hasKey(accountKey)){
throw new BaseException(CodeEnum.ALREADY_EXIST_ACCOUNT);
}
//未查到则存进redis时效一分钟
redisUtil.set(accountKey,changeAccount.getAccount(),60);
//检查数据库内账号是否存在
SysAuthExample sysAuthExample = new SysAuthExample();
sysAuthExample.createCriteria().andIdentifyTypeEqualTo((byte) WebConstant.IDENTIFY_TYPE.Account.value)
.andIdentifierEqualTo(changeAccount.getAccount());
List<SysAuth> sysAuthList = sysAuthDao.selectByExample(sysAuthExample);
if(CollectionUtil.isNotEmpty(sysAuthList)){
throw new BaseException(CodeEnum.ALREADY_EXIST_ACCOUNT);
}
//修改账号
SysAuthExample authAccountExample = new SysAuthExample();
authAccountExample.createCriteria().andUserIdEqualTo(userId).andIdentifyTypeEqualTo((byte) WebConstant.IDENTIFY_TYPE.Account.value);
List<SysAuth> authList = sysAuthDao.selectByExample(authAccountExample);
if(CollectionUtil.isNotEmpty(authList)){
authList.forEach(sysAuth -> {
sysAuth.setIdentifier(changeAccount.getAccount());
sysAuthDao.updateByPrimaryKeySelective(sysAuth);
});
}
//修改完删除redis
redisUtil.del(accountKey);
}else {
throw new BaseException(CodeEnum.SMS_CODE_CORRECT);
}
}else {
throw new BaseException(CodeEnum.SMS_CODE_CORRECT);
}
}
@Override
public void updateNickname(Long userId, UserDto.UpdateNickname updateNickname) {
//查找redis该昵称是否正在使用
String nicknameKey = TallConstant.getUpdateNickname(updateNickname.getNickname());
if(redisUtil.hasKey(nicknameKey)){
throw new BaseException(CodeEnum.NICKNAME_REPEAT);
}
//未查到则存进redis时效一分钟
redisUtil.set(nicknameKey,updateNickname.getNickname(),60);
//查找数据库此昵称是否存在
SysUserExample sysUserExample = new SysUserExample();
sysUserExample.createCriteria().andNicknameEqualTo(updateNickname.getNickname());
List<SysUser> userList = sysUserDao.selectByExample(sysUserExample);
if(CollectionUtil.isNotEmpty(userList)){
throw new BaseException(CodeEnum.NICKNAME_REPEAT);
}
SysUser user = sysUserDao.selectByPrimaryKey(userId);
if(ObjectUtil.isNotNull(user)){
user.setNickname(updateNickname.getNickname());
sysUserDao.updateByPrimaryKeySelective(user);
}
redisUtil.del(nicknameKey);
}
@Override
public void uploadAvatarUrl(Long currentUserId, Part file) throws Exception {
//获取文件大小
float fileSize = (float) file.getSize();
System.out.println(fileSize);
//计算出倍数
float a = (float)(80 * 1024) / fileSize;
System.out.println(a);
//限制文件格式
String allowedExts = "png,jpg,jpeg";
String original = UploadFileUtil_Servlet3.getFileNameByPart(file);
String ext = FileUtil.extName(original);
if (StrUtil.isEmpty(ext) || !allowedExts.contains(ext)){
throw new NotSupportedFileTypeException("不支持的格式类型: " + ext);
}
//创建文件目录及名字
String extraPath = DateUtil.format(new Date(), "yyyyMMdd");
//上传的文件
String temporaryFilePath = File.separator + IdUtil.simpleUUID() + "." + ext;
File temporaryFile = new File(WebConstant.UPLOAD_AVATAR_URL + extraPath + temporaryFilePath);
FileUtils.copyInputStreamToFile(file.getInputStream(), temporaryFile);
//压缩后的文件
String compressFilePath = File.separator + IdUtil.simpleUUID() + "." + ext;
File compressFile = new File(WebConstant.UPLOAD_AVATAR_URL+ extraPath + compressFilePath);
//文件大于80k则进行压缩,否则不压缩
if(a < 1) {
ImageUtil.scale(temporaryFile, compressFile, a);
}
//获取文件的压缩前的文件名
String fullPath = WebConstant.UPLOAD_PATH_AVATAR_URL + File.separator + extraPath + temporaryFilePath;
//压缩前和压缩后的文件都存在则删除压缩前的文件
if(temporaryFile.exists() && compressFile.exists()){
FileUtil.del(temporaryFile);
//压缩成功后获取压缩后的文件名
fullPath = WebConstant.UPLOAD_PATH_AVATAR_URL + File.separator + extraPath + compressFilePath;
}
//查找到当前的用户,修改头像路径信息
SysUser sysUser = sysUserDao.selectByPrimaryKey(currentUserId);
sysUser.setAvatarUrl(PropUtil.gatewayUrl + WebConstant.TALL_UPLOADS + fullPath);
sysUserDao.updateByPrimaryKeySelective(sysUser);
}
@Override
public UserVo.SelectUserInfo selectUserInfo(Long currentUserId){
UserVo.SelectUserInfo selectUserInfo = sysUserDao.selectUserInfo(currentUserId);
if(ObjectUtil.isNotNull(selectUserInfo)){
//计算注册时长
if(ObjectUtil.isNotNull(selectUserInfo.getCreatedAt())){
long now = System.currentTimeMillis();
selectUserInfo.setDayOfUseTall((int) ((now - selectUserInfo.getCreatedAt().getTime()) / 1000 / 3600 / 24));
}
//获取标签信息
selectUserInfo.setLabelList(sysLabelDao.selectLabelByUserId(currentUserId,null));
//获取空间使用信息
UserVo.Interspace interspace = sysUserDao.selectInterspace(currentUserId);
selectUserInfo.setInterspace(interspace);
}
return selectUserInfo;
}
}

135
tall/src/main/java/com/ccsens/tall/service/UserService.java

@ -1,11 +1,9 @@
package com.ccsens.tall.service; package com.ccsens.tall.service;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Snowflake; import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
@ -23,18 +21,14 @@ import com.ccsens.util.enterprisewx.vo.WeiXinVo;
import com.ccsens.util.exception.BaseException; import com.ccsens.util.exception.BaseException;
import com.ccsens.util.wx.WxGzhUtil; import com.ccsens.util.wx.WxGzhUtil;
import com.ccsens.util.wx.WxXcxUtil; import com.ccsens.util.wx.WxXcxUtil;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.RandomStringUtils;
import org.eclipse.jetty.http.HttpStatus;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.xhtmlrenderer.css.parser.property.PrimitivePropertyBuilders;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -376,10 +370,10 @@ public class UserService implements IUserService {
userSignVo.setUserId(theAuth.getUserId()); userSignVo.setUserId(theAuth.getUserId());
userSignVo.setAuthId(theAuth.getId()); userSignVo.setAuthId(theAuth.getId());
} else { } else {
throw new BaseException("密码错误"); throw new BaseException(CodeEnum.PASSWORD_ERROR);
} }
} else { } else {
throw new BaseException("找不到该用户"); throw new BaseException(CodeEnum.NOT_ACCOUNT);
} }
return userSignVo; return userSignVo;
} }
@ -508,7 +502,7 @@ public class UserService implements IUserService {
/** /**
* 微信登陆后天添加用户和认证方式 * 微信登陆后天添加用户和认证方式
* *
* @return * @return 认证信息
*/ */
private SysAuth wxRegist(String identifier, String credential, WebConstant.IDENTIFY_TYPE identifyType) { private SysAuth wxRegist(String identifier, String credential, WebConstant.IDENTIFY_TYPE identifyType) {
//1.添加user //1.添加user
@ -549,19 +543,19 @@ public class UserService implements IUserService {
Long refreshTokenExpired = null; Long refreshTokenExpired = null;
switch (clientType) { switch (clientType) {
case Wxmp: //token(2hours) refreshToken(null) case Wxmp:
//tokenExpired = 3600 * 1000L * 2; //tokenExpired = 3600 * 1000L * 2;
tokenExpired = 3600 * 1000L * 24; tokenExpired = 3600 * 1000L * 24;
break; break;
case H5: //token(2hours) refreshToken(null) case H5:
// tokenExpired = 3600 * 1000L * 2; // tokenExpired = 3600 * 1000L * 2;
tokenExpired = 3600 * 1000L * 24; tokenExpired = 3600 * 1000L * 24;
break; break;
case Android: //token(2hours) refreshToken(30天) case Android:
tokenExpired = 3600 * 1000L * 2; tokenExpired = 3600 * 1000L * 2;
refreshTokenExpired = 3600 * 1000L * 24 * 30; refreshTokenExpired = 3600 * 1000L * 24 * 30;
break; break;
case IOS: //token(2hours) refreshToken(30天) case IOS:
tokenExpired = 3600 * 1000L * 2; tokenExpired = 3600 * 1000L * 2;
refreshTokenExpired = 3600 * 1000L * 24 * 30; refreshTokenExpired = 3600 * 1000L * 24 * 30;
break; break;
@ -601,7 +595,7 @@ public class UserService implements IUserService {
* 发送验证码 * 发送验证码
*/ */
@Override @Override
public UserVo.SmsCode getSignInSmsCode(String phone, Integer client) throws Exception { public UserVo.SmsCode getSignInSmsCode(String phone, Integer client) {
//获取登陆客户端类型 //获取登陆客户端类型
WebConstant.CLIENT_TYPE client_type = null; WebConstant.CLIENT_TYPE client_type = null;
if (ObjectUtil.isNotNull(client)) { if (ObjectUtil.isNotNull(client)) {
@ -809,20 +803,19 @@ public class UserService implements IUserService {
} }
@Override @Override
public boolean tokenNotExistInCache(Long authId) throws Exception { public boolean tokenNotExistInCache(Long authId) {
return !redisUtil.hasKey(RedisKeyManager.getTokenCachedKey(authId)); return !redisUtil.hasKey(RedisKeyManager.getTokenCachedKey(authId));
} }
/** /**
* 微信绑定新手机号没有账号注册 * 微信绑定新手机号没有账号注册
* *
* @param currentUserId * @param currentUserId userId
* @param wxPhone * @param wxPhone 手机号和验证码
* @return * @return 用户id和认证类型
* @throws Exception
*/ */
@Override @Override
public UserVo.UserSign bindingNewPhone(Long currentUserId, UserDto.WxBindingPhone wxPhone) throws Exception { public UserVo.UserSign bindingNewPhone(Long currentUserId, UserDto.WxBindingPhone wxPhone) {
if (isSmsCodeCorrect(wxPhone.getPhone(), wxPhone.getSmsCode())) { if (isSmsCodeCorrect(wxPhone.getPhone(), wxPhone.getSmsCode())) {
//查找该用户以前绑定的手机 //查找该用户以前绑定的手机
SysAuthExample authExample = new SysAuthExample(); SysAuthExample authExample = new SysAuthExample();
@ -833,7 +826,7 @@ public class UserService implements IUserService {
throw new BaseException(CodeEnum.ALREADY_BINDING_PHONE); throw new BaseException(CodeEnum.ALREADY_BINDING_PHONE);
} else { } else {
//改手机对应账户,如果有,提示 //改手机对应账户,如果有,提示
List<SysAuth> phoneList = null; List<SysAuth> phoneList;
SysAuth theAuth = null; SysAuth theAuth = null;
SysAuthExample phoneExample = new SysAuthExample(); SysAuthExample phoneExample = new SysAuthExample();
phoneExample.createCriteria().andIdentifyTypeEqualTo((byte) WebConstant.IDENTIFY_TYPE.Phone.value) phoneExample.createCriteria().andIdentifyTypeEqualTo((byte) WebConstant.IDENTIFY_TYPE.Phone.value)
@ -842,7 +835,6 @@ public class UserService implements IUserService {
if (CollectionUtil.isNotEmpty(phoneList)) { if (CollectionUtil.isNotEmpty(phoneList)) {
throw new BaseException(CodeEnum.MERGE_WX_PHONE); throw new BaseException(CodeEnum.MERGE_WX_PHONE);
} else { } else {
// throw new BaseException(CodeEnum.NOT_REGISTER);
//绑定 添加auth //绑定 添加auth
SysAuth auth = new SysAuth(); SysAuth auth = new SysAuth();
auth.setId(snowflake.nextId()); auth.setId(snowflake.nextId());
@ -920,8 +912,8 @@ public class UserService implements IUserService {
/** /**
* 判断验证码是否有效 * 判断验证码是否有效
*/ */
private Boolean isSmsCodeCorrect(String phone, String smsCode) throws Exception { private Boolean isSmsCodeCorrect(String phone, String smsCode) {
Boolean correct = false; boolean correct = false;
if (redisUtil.hasKey(RedisKeyManager.getSigninSmsKey(phone))) { if (redisUtil.hasKey(RedisKeyManager.getSigninSmsKey(phone))) {
if (smsCode.equals(redisUtil.get(RedisKeyManager.getSigninSmsKey(phone)).toString())) { if (smsCode.equals(redisUtil.get(RedisKeyManager.getSigninSmsKey(phone)).toString())) {
correct = true; correct = true;
@ -950,25 +942,48 @@ public class UserService implements IUserService {
auth.setCredential(ShiroKit.md5(passwordDto.getPassword(), auth.getSalt())); auth.setCredential(ShiroKit.md5(passwordDto.getPassword(), auth.getSalt()));
authDao.updateByPrimaryKeySelective(auth); authDao.updateByPrimaryKeySelective(auth);
} else { } else {
throw new BaseException("新密码不能和旧密码相同"); throw new BaseException(CodeEnum.NEW_PASSWORD_REPEAT_OLD);
} }
} else { } else {
throw new BaseException("该手机号未绑定账号"); throw new BaseException(CodeEnum.PHONE_ERR);
} }
} else { } else {
throw new BaseException("该手机号未注册"); throw new BaseException(CodeEnum.PHONE_ERR);
} }
} else { } else {
throw new BaseException("验证信息错误"); throw new BaseException(CodeEnum.SMS_CODE_CORRECT);
} }
} }
} }
@Override
public void updatePasswordByAccount(UserDto.UpdatePasswordByAccount passwordDto) throws Exception{
if (passwordDto.getPasswordOld().equalsIgnoreCase(passwordDto.getPasswordNew())){
throw new BaseException(CodeEnum.NEW_PASSWORD_REPEAT_OLD);
}
//检查账号和密码是否正确
SysAuthExample authExample = new SysAuthExample();
authExample.createCriteria()
.andIdentifyTypeEqualTo((byte) WebConstant.IDENTIFY_TYPE.Account.value)
.andIdentifierEqualTo(passwordDto.getAccount());
List<SysAuth> authList = authDao.selectByExample(authExample);
if (CollectionUtil.isEmpty(authList)) {
throw new BaseException(CodeEnum.NOT_ACCOUNT);
}
SysAuth sysAuth = authList.get(0);
if (ShiroKit.authenticate(passwordDto.getPasswordOld(), sysAuth.getCredential(), sysAuth.getSalt())) {
//修改密码
sysAuth.setCredential(ShiroKit.md5(passwordDto.getPasswordNew(), sysAuth.getSalt()));
authDao.updateByPrimaryKeySelective(sysAuth);
} else {
throw new BaseException(CodeEnum.PASSWORD_ERROR);
}
}
/** /**
* 通过用户查找手机号 * 通过用户查找手机号
* * @param userId userId
* @param userId * @return 用户名
* @return
*/ */
@Override @Override
public String getPhone(Long userId) { public String getPhone(Long userId) {
@ -1031,36 +1046,25 @@ public class UserService implements IUserService {
if(ObjectUtil.isNull(role)){ if(ObjectUtil.isNull(role)){
return null; return null;
} }
List<Long> userIdList = new ArrayList<>(); List<Long> userIdList;
if(role.getName().equalsIgnoreCase(WebConstant.ROLE_NAME.AllMember.phase)){ if(role.getName().equalsIgnoreCase(WebConstant.ROLE_NAME.AllMember.phase)){
userIdList = memberRoleDao.selectUserIdByProjectId(role.getProjectId()); userIdList = memberRoleDao.selectUserIdByProjectId(role.getProjectId());
}else { }else {
userIdList = memberRoleDao.selectUserIdByRoleId(roleId); userIdList = memberRoleDao.selectUserIdByRoleId(roleId);
} }
// List<Long> userIdList = new ArrayList<>();
// ProMemberRoleExample proMemberRoleExample = new ProMemberRoleExample();
// proMemberRoleExample.createCriteria().andRoleIdEqualTo(roleId);
// List<ProMemberRole> memberRoleList = memberRoleDao.selectByExample(proMemberRoleExample);
// if (CollectionUtil.isNotEmpty(memberRoleList)) {
// for (ProMemberRole memberRole : memberRoleList) {
// ProMember member = memberDao.selectByPrimaryKey(memberRole.getMemberId());
// Long userId = member.getUserId();
// userIdList.add(userId);
// }
// }
return userIdList; return userIdList;
} }
/** /**
* 查询用户是否关注此项目 * 查询用户是否关注此项目
* *
* @param currentUserId * @param currentUserId userId
* @param projectId * @param projectId 项目id
* @return * @return 是否关注此项目
*/ */
@Override @Override
public Boolean getIsAttention(Long currentUserId, Long projectId) { public Boolean getIsAttention(Long currentUserId, Long projectId) {
Boolean isAttention = false; boolean isAttention = false;
if (ObjectUtil.isNotNull(sysProjectDao.selectByPrimaryKey(projectId))) { if (ObjectUtil.isNotNull(sysProjectDao.selectByPrimaryKey(projectId))) {
UserAttentionExample attentionExample = new UserAttentionExample(); UserAttentionExample attentionExample = new UserAttentionExample();
attentionExample.createCriteria().andProjectIdEqualTo(projectId).andUserIdEqualTo(currentUserId); attentionExample.createCriteria().andProjectIdEqualTo(projectId).andUserIdEqualTo(currentUserId);
@ -1077,8 +1081,8 @@ public class UserService implements IUserService {
/** /**
* 用户关注某个项目 * 用户关注某个项目
* *
* @param currentUserId * @param currentUserId userId
* @param projectIdDto * @param projectIdDto 项目id
*/ */
@Override @Override
public void userAttentionProject(Long currentUserId, ProjectDto.ProjectIdDto projectIdDto) { public void userAttentionProject(Long currentUserId, ProjectDto.ProjectIdDto projectIdDto) {
@ -1122,12 +1126,6 @@ public class UserService implements IUserService {
log.info("用户已存在,直接返回user"); log.info("用户已存在,直接返回user");
return userDao.selectByPrimaryKey(authList.get(0).getUserId()).getId(); return userDao.selectByPrimaryKey(authList.get(0).getUserId()).getId();
} }
// int i = 0;
// 用户已存在 = true
// boolean userExist = userService.findAccount(signup.getAccount());
// while (userExist) {
// userExist = userService.findAccount(signup.getAccount() + "_" + (++i));
// }
UserDto.UserSignup up = new UserDto.UserSignup(); UserDto.UserSignup up = new UserDto.UserSignup();
up.setAccount(signup.getAccount()); up.setAccount(signup.getAccount());
up.setPassword(WebConstant.Regist.PASSWORD); up.setPassword(WebConstant.Regist.PASSWORD);
@ -1165,8 +1163,8 @@ public class UserService implements IUserService {
/** /**
* 通过userId查找账号 * 通过userId查找账号
* @param userId * @param userId userId
* @return * @return 账号
*/ */
private String selectAccountByUserId(Long userId) { private String selectAccountByUserId(Long userId) {
String account = null; String account = null;
@ -1212,9 +1210,9 @@ public class UserService implements IUserService {
/** /**
* 合并账号 * 合并账号
* *
* @param currentUserId * @param currentUserId userId
* @param wxPhone * @param wxPhone 手机号和合并方式
* @return * @return 用户id
*/ */
@Override @Override
public UserVo.UserSign mergeByPhone(Long currentUserId, UserDto.WxMergePhone wxPhone) { public UserVo.UserSign mergeByPhone(Long currentUserId, UserDto.WxMergePhone wxPhone) {
@ -1237,16 +1235,16 @@ public class UserService implements IUserService {
userDao.replaceAuth(userId, currentUserId); userDao.replaceAuth(userId, currentUserId);
//查询所有关联userId的数据库表 auth表 attention表 balance表 project表 member表 DeliverPostLog表 proLog表 //查询所有关联userId的数据库表 auth表 attention表 balance表 project表 member表 DeliverPostLog表 proLog表
//依次将查出的数据的旧userId 替换成新的userId //依次将查出的数据的旧userId 替换成新的userId
userDao.replaceProject(userId, currentUserId);
userDao.replaceAttention(userId, currentUserId); userDao.replaceAttention(userId, currentUserId);
userDao.replaceBalance(userId, currentUserId); userDao.replaceBalance(userId, currentUserId);
userDao.replaceProject(userId, currentUserId);
userDao.replaceMember(userId, currentUserId); userDao.replaceMember(userId, currentUserId);
userDao.replaceDeliverPostLog(userId, currentUserId); userDao.replaceDeliverPostLog(userId, currentUserId);
userDao.replaceProLog(userId, currentUserId); userDao.replaceProLog(userId, currentUserId);
userDao.replaceComment(userId, currentUserId); userDao.replaceComment(userId, currentUserId);
//将以前的余额添加至此账号 //将以前的余额添加至此账号
SysUser oldUser = userDao.selectByPrimaryKey(userId);
SysUser newUser = userDao.selectByPrimaryKey(currentUserId); SysUser newUser = userDao.selectByPrimaryKey(currentUserId);
SysUser oldUser = userDao.selectByPrimaryKey(userId);
if(ObjectUtil.isNotNull(oldUser) && ObjectUtil.isNotNull(newUser)) { if(ObjectUtil.isNotNull(oldUser) && ObjectUtil.isNotNull(newUser)) {
updateBalance(oldUser, newUser); updateBalance(oldUser, newUser);
} }
@ -1335,7 +1333,7 @@ public class UserService implements IUserService {
*/ */
@Override @Override
public UserVo.WxInfo updateUserInfo(Long currentUserId, UserDto.WxInfo userInfo) { public UserVo.WxInfo updateUserInfo(Long currentUserId, UserDto.WxInfo userInfo) {
//通过userid查找到用户 //通过userId查找到用户
SysUser user = userDao.selectByPrimaryKey(currentUserId); SysUser user = userDao.selectByPrimaryKey(currentUserId);
if (ObjectUtil.isNull(user)) { if (ObjectUtil.isNull(user)) {
throw new BaseException(CodeEnum.NOT_LOGIN); throw new BaseException(CodeEnum.NOT_LOGIN);
@ -1393,12 +1391,11 @@ public class UserService implements IUserService {
/** /**
* 更改绑定手机号不要密码 * 更改绑定手机号不要密码
* *
* @param userId * @param userId userId
* @param phoneInfo * @param phoneInfo 手机号和验证码
* @throws Exception
*/ */
@Override @Override
public UserVo.UserSign changePhoneNotPassword(Long userId, UserDto.WxBindingPhone phoneInfo) throws Exception { public UserVo.UserSign changePhoneNotPassword(Long userId, UserDto.WxBindingPhone phoneInfo) {
UserVo.UserSign userSign = null; UserVo.UserSign userSign = null;
if (isSmsCodeCorrect(phoneInfo.getPhone(), phoneInfo.getSmsCode())) { if (isSmsCodeCorrect(phoneInfo.getPhone(), phoneInfo.getSmsCode())) {
//查找新手机号的的绑定信息 //查找新手机号的的绑定信息
@ -1575,9 +1572,9 @@ public class UserService implements IUserService {
} }
@Override @Override
public List<UserVo.UserInfo> listUserInfos(Long[] ids) { public List<UserVo.UserInfo> queryUserInfos(Long[] ids) {
List<UserVo.UserInfo> infos = userDao.listUserInfos(ids); List<UserVo.UserInfo> infos = userDao.queryUserInfos(ids);
return infos; return infos;
} }
} }

12
tall/src/main/java/com/ccsens/tall/util/TallConstant.java

@ -5,6 +5,11 @@ package com.ccsens.tall.util;
*/ */
public class TallConstant { public class TallConstant {
/*** redis key: 修改账号*/
public static final String UPDATE_ACCOUNT = "update_account_";
/*** redis key: 修改账号*/
public static final String UPDATE_NICKNAME = "update_nickname_";
/** /**
* 接口发送的信息模板 * 接口发送的信息模板
* @param operateType 接口code * @param operateType 接口code
@ -14,4 +19,11 @@ public class TallConstant {
return "operate_type_" + operateType; return "operate_type_" + operateType;
} }
public static String getUpdateAccount(String account){
return UPDATE_ACCOUNT + account;
}
public static String getUpdateNickname(String nickname){
return UPDATE_ACCOUNT + nickname;
}
} }

2
tall/src/main/java/com/ccsens/tall/web/ExcelController.java

@ -1,7 +1,6 @@
package com.ccsens.tall.web; package com.ccsens.tall.web;
import com.ccsens.tall.bean.vo.PluginVo;
import com.ccsens.tall.bean.vo.ProjectVo; import com.ccsens.tall.bean.vo.ProjectVo;
import com.ccsens.tall.service.IExcelService; import com.ccsens.tall.service.IExcelService;
import com.ccsens.tall.service.IExportWbsService; import com.ccsens.tall.service.IExportWbsService;
@ -20,7 +19,6 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part; import javax.servlet.http.Part;
import java.io.File; import java.io.File;
import java.util.List;
@Api(tags = "Excel" , description = "") @Api(tags = "Excel" , description = "")
@RestController @RestController

59
tall/src/main/java/com/ccsens/tall/web/MemberController.java

@ -0,0 +1,59 @@
package com.ccsens.tall.web;
import com.ccsens.tall.bean.dto.MemberDto;
import com.ccsens.tall.bean.vo.ProjectVo;
import com.ccsens.tall.service.IProMemberService;
import com.ccsens.util.JsonResponse;
import com.ccsens.util.WebConstant;
import io.jsonwebtoken.Claims;
import io.swagger.annotations.*;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
/**
* @author
*/
@Api(tags = "成员操作相关api" )
@RestController
@RequestMapping("/members")
public class MemberController {
@Resource
private IProMemberService proMemberService;
@ApiOperation(value = "添加成员",notes = "")
@ApiImplicitParams({
})
@RequestMapping(value = "/save", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse saveMember(HttpServletRequest request,
@ApiParam @Validated @RequestBody MemberDto.SaveMember saveMember) throws Exception {
Long currentUserId = Long.valueOf(((Claims) request.getAttribute(WebConstant.REQUEST_KEY_CLAIMS)).getSubject());
proMemberService.saveProMember(currentUserId,saveMember);
return JsonResponse.newInstance().ok();
}
@ApiOperation(value = "删除成员",notes = "")
@ApiImplicitParams({
})
@RequestMapping(value = "/delete", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse deleteMember(HttpServletRequest request,
@ApiParam @Validated @RequestBody MemberDto.DeleteMember deleteMember) throws Exception {
Long currentUserId = Long.valueOf(((Claims) request.getAttribute(WebConstant.REQUEST_KEY_CLAIMS)).getSubject());
proMemberService.deleteMember(currentUserId,deleteMember);
return JsonResponse.newInstance().ok();
}
@ApiOperation(value = "修改成员信息",notes = "")
@ApiImplicitParams({
})
@RequestMapping(value = "/update", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse<ProjectVo.MembersByProject> updateMemberInfo(HttpServletRequest request,
@ApiParam @Validated @RequestBody MemberDto.UpdateMemberInfo updateMemberInfo) throws Exception {
Long currentUserId = Long.valueOf(((Claims) request.getAttribute(WebConstant.REQUEST_KEY_CLAIMS)).getSubject());
ProjectVo.MembersByProject membersInfo = proMemberService.updateMemberInfo(currentUserId,updateMemberInfo);
return JsonResponse.newInstance().ok(membersInfo);
}
}

2
tall/src/main/java/com/ccsens/tall/web/MemberRoleController.java

@ -78,7 +78,7 @@ public class MemberRoleController {
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "roleId", value = "角色Id", required = true, paramType = "query") @ApiImplicitParam(name = "roleId", value = "角色Id", required = true, paramType = "query")
}) })
@RequestMapping(value = "", method = RequestMethod.DELETE, produces = {"application/json;charset=UTF-8"}) @RequestMapping(value = "/role/delete", method = RequestMethod.DELETE, produces = {"application/json;charset=UTF-8"})
public JsonResponse deleteTask(HttpServletRequest request, public JsonResponse deleteTask(HttpServletRequest request,
@RequestParam(required = false)Long roleId) throws Exception { @RequestParam(required = false)Long roleId) throws Exception {
Long currentUserId = Long.valueOf(((Claims) request.getAttribute(WebConstant.REQUEST_KEY_CLAIMS)).getSubject()); Long currentUserId = Long.valueOf(((Claims) request.getAttribute(WebConstant.REQUEST_KEY_CLAIMS)).getSubject());

17
tall/src/main/java/com/ccsens/tall/web/ProjectController.java

@ -1,6 +1,5 @@
package com.ccsens.tall.web; package com.ccsens.tall.web;
import com.ccsens.tall.bean.dto.LabelDto;
import com.ccsens.tall.bean.dto.ProjectDto; import com.ccsens.tall.bean.dto.ProjectDto;
import com.ccsens.tall.bean.vo.ProjectVo; import com.ccsens.tall.bean.vo.ProjectVo;
import com.ccsens.tall.bean.vo.TaskVo; import com.ccsens.tall.bean.vo.TaskVo;
@ -15,24 +14,27 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.List; import java.util.List;
@Api(tags = "项目相关API" , description = "") /**
* @author
*/
@Api(tags = "项目相关API")
@RestController @RestController
@RequestMapping("/projects") @RequestMapping("/projects")
public class ProjectController { public class ProjectController {
@Autowired @Resource
private IProjectService projectService; private IProjectService projectService;
@Autowired @Resource
private IProRoleService proRoleService; private IProRoleService proRoleService;
@Autowired @Resource
private IProMemberService proMemberService; private IProMemberService proMemberService;
@Autowired @Resource
private IProTaskDetailService taskDetailService; private IProTaskDetailService taskDetailService;
@ApiOperation(value = "获取日历上哪天有小红点",notes = "按照优先级倒序+时间正序排序") @ApiOperation(value = "获取日历上哪天有小红点",notes = "按照优先级倒序+时间正序排序")
@ -116,6 +118,7 @@ public class ProjectController {
Integer pageSize = 10; Integer pageSize = 10;
page = page == null ? 1 : page; page = page == null ? 1 : page;
process = process == null ? 0 : process; process = process == null ? 0 : process;
Long currentUserId = Long.valueOf(((Claims) request.getAttribute(WebConstant.REQUEST_KEY_CLAIMS)).getSubject()); Long currentUserId = Long.valueOf(((Claims) request.getAttribute(WebConstant.REQUEST_KEY_CLAIMS)).getSubject());
Object proTaskInfo = taskDetailService.getTasksByRoleId(currentUserId,projectId,roleId,startTime,endTime,process,page,pageSize); Object proTaskInfo = taskDetailService.getTasksByRoleId(currentUserId,projectId,roleId,startTime,endTime,process,page,pageSize);
return JsonResponse.newInstance().ok(proTaskInfo); return JsonResponse.newInstance().ok(proTaskInfo);

22
tall/src/main/java/com/ccsens/tall/web/RingController.java

@ -31,11 +31,11 @@ public class RingController {
@ApiImplicitParams({ @ApiImplicitParams({
}) })
@RequestMapping(value = "/send", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) @RequestMapping(value = "/send", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse sendRingMsg(HttpServletRequest request, public JsonResponse<RingVo.RingInfoByReturn> sendRingMsg(HttpServletRequest request,
@ApiParam @Validated @RequestBody RingDto.RingSendDto ringSendDto) throws Exception { @ApiParam @Validated @RequestBody RingDto.RingSendDto ringSendDto) throws Exception {
Long currentUserId = Long.valueOf(((Claims) request.getAttribute(WebConstant.REQUEST_KEY_CLAIMS)).getSubject()); Long currentUserId = Long.valueOf(((Claims) request.getAttribute(WebConstant.REQUEST_KEY_CLAIMS)).getSubject());
ringService.sendRingMsg(currentUserId,ringSendDto); RingVo.RingInfoByReturn ringInfo = ringService.sendRingMsg(currentUserId,ringSendDto);
return JsonResponse.newInstance().ok(); return JsonResponse.newInstance().ok(ringInfo);
} }
@ -56,11 +56,21 @@ public class RingController {
@ApiImplicitParams({ @ApiImplicitParams({
}) })
@RequestMapping(value = "/read", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) @RequestMapping(value = "/read", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse readRingMsg(HttpServletRequest request, public JsonResponse<List<RingVo.RingInfo>> readRingMsg(HttpServletRequest request,
@ApiParam @Validated @RequestBody RingDto.MessageId message) throws Exception { @ApiParam @Validated @RequestBody RingDto.MessageId message) throws Exception {
Long currentUserId = Long.valueOf(((Claims) request.getAttribute(WebConstant.REQUEST_KEY_CLAIMS)).getSubject()); Long currentUserId = Long.valueOf(((Claims) request.getAttribute(WebConstant.REQUEST_KEY_CLAIMS)).getSubject());
ringService.readRingMsg(currentUserId,message); List<RingVo.RingInfo> ringInfoList = ringService.readRingMsg(currentUserId,message);
return JsonResponse.newInstance().ok(); return JsonResponse.newInstance().ok(ringInfoList);
} }
@ApiOperation(value = "将项目内的消息全部已读", notes = "")
@ApiImplicitParams({
})
@RequestMapping(value = "/read/projectId", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse readRingMsgByProjectId(HttpServletRequest request,
@ApiParam @Validated @RequestBody RingDto.ReadMessageByProjectId projectId) throws Exception {
Long currentUserId = Long.valueOf(((Claims) request.getAttribute(WebConstant.REQUEST_KEY_CLAIMS)).getSubject());
ringService.readRingMsgByProjectId(currentUserId,projectId.getProjectId());
return JsonResponse.newInstance().ok();
}
} }

12
tall/src/main/java/com/ccsens/tall/web/TaskController.java

@ -126,7 +126,9 @@ public class TaskController {
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "projectId", value = "项目id 必填", required = true, paramType = "query"), @ApiImplicitParam(name = "projectId", value = "项目id 必填", required = true, paramType = "query"),
@ApiImplicitParam(name = "type", value = "任务状态 0未开始 1进行中 2已完成", required = true, paramType = "query"), @ApiImplicitParam(name = "type", value = "任务状态 0未开始 1进行中 2已完成", required = true, paramType = "query"),
@ApiImplicitParam(name = "roleId", value = "角色id 不传则查找全部", required = true, paramType = "query") @ApiImplicitParam(name = "roleId", value = "角色id 不传则查找全部", required = true, paramType = "query"),
@ApiImplicitParam(name = "orderType", value = "排序方式 0时间排序 1优先级排序 没有则默认时间排序",paramType = "query",dataType = "string"),
@ApiImplicitParam(name = "order", value = "排序方式 0倒序 1正序 默认倒序",paramType = "query")
}) })
@RequestMapping(value = "kanban", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"}) @RequestMapping(value = "kanban", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})
public JsonResponse<List<TaskVo.KanBan>> getKanbanTake(HttpServletRequest request, public JsonResponse<List<TaskVo.KanBan>> getKanbanTake(HttpServletRequest request,
@ -134,11 +136,15 @@ public class TaskController {
@RequestParam(required = false)Long roleId, @RequestParam(required = false)Long roleId,
@RequestParam(required = false)Integer type, @RequestParam(required = false)Integer type,
@RequestParam(required = false)Integer page, @RequestParam(required = false)Integer page,
@RequestParam(required = false)Integer pageSize) throws Exception { @RequestParam(required = false)Integer pageSize,
@RequestParam(required = false)Integer orderType,
@RequestParam(required = false)Integer order) throws Exception {
page = page == null ? 1 : page; page = page == null ? 1 : page;
pageSize = pageSize == null ? 10 : pageSize; pageSize = pageSize == null ? 10 : pageSize;
orderType = orderType == null ? 0 : orderType;
order = order == null ? 0 : order;
Long currentUserId = Long.valueOf(((Claims) request.getAttribute(WebConstant.REQUEST_KEY_CLAIMS)).getSubject()); Long currentUserId = Long.valueOf(((Claims) request.getAttribute(WebConstant.REQUEST_KEY_CLAIMS)).getSubject());
List<TaskVo.KanBan> kanbanList = subTimeService.getKanbanTake(currentUserId,projectId,roleId,type,page,pageSize); List<TaskVo.KanBan> kanbanList = subTimeService.getKanbanTake(currentUserId,projectId,roleId,type,page,pageSize,orderType,order);
return JsonResponse.newInstance().ok(kanbanList); return JsonResponse.newInstance().ok(kanbanList);
} }

12
tall/src/main/java/com/ccsens/tall/web/UserController.java

@ -240,7 +240,7 @@ public class UserController {
return JsonResponse.newInstance().ok(wxInfo); return JsonResponse.newInstance().ok(wxInfo);
} }
@ApiOperation(value = "修改密码", notes = "") @ApiOperation(value = "通过手机号修改密码", notes = "")
@ApiImplicitParams({ @ApiImplicitParams({
}) })
@RequestMapping(value = "/password", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) @RequestMapping(value = "/password", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
@ -250,6 +250,16 @@ public class UserController {
return JsonResponse.newInstance().ok(); return JsonResponse.newInstance().ok();
} }
@ApiOperation(value = "通过账号密码修改密码", notes = "")
@ApiImplicitParams({
})
@RequestMapping(value = "/password/account", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse updatePasswordByAccount(HttpServletRequest request,
@ApiParam @Validated @RequestBody UserDto.UpdatePasswordByAccount passwordDto) throws Exception {
userService.updatePasswordByAccount(passwordDto);
return JsonResponse.newInstance().ok();
}
@ApiOperation(value = "解绑手机号", notes = "") @ApiOperation(value = "解绑手机号", notes = "")
@ApiImplicitParams({ @ApiImplicitParams({
}) })

82
tall/src/main/java/com/ccsens/tall/web/UserInfoController.java

@ -0,0 +1,82 @@
package com.ccsens.tall.web;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ImageUtil;
import com.ccsens.tall.bean.dto.UserDto;
import com.ccsens.tall.bean.vo.UserVo;
import com.ccsens.tall.service.IUserInfoService;
import com.ccsens.util.JsonResponse;
import com.ccsens.util.UploadFileUtil_Servlet3;
import com.ccsens.util.WebConstant;
import io.jsonwebtoken.Claims;
import io.swagger.annotations.*;
import org.apache.commons.io.FileUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.Part;
import java.awt.*;
import java.io.File;
/**
* @author
*/
@Api(tags = "用户详细信息操作API")
@RestController
@RequestMapping("/users/info")
public class UserInfoController {
@Resource
private IUserInfoService userInfoService;
@ApiOperation(value = "修改登录账号")
@ApiImplicitParams({
})
@RequestMapping(value = "/account", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse updateAccount(HttpServletRequest request,
@ApiParam @Validated @RequestBody UserDto.UpdateAccount updateAccount) throws Exception {
Long currentUserId = Long.valueOf(((Claims) request.getAttribute(WebConstant.REQUEST_KEY_CLAIMS)).getSubject());
userInfoService.updateAccount(currentUserId, updateAccount);
return JsonResponse.newInstance().ok();
}
@ApiOperation(value = "修改昵称")
@ApiImplicitParams({
})
@RequestMapping(value = "/nickname", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse updateNickname(HttpServletRequest request,
@ApiParam @Validated @RequestBody UserDto.UpdateNickname updateNickname) throws Exception {
Long currentUserId = Long.valueOf(((Claims) request.getAttribute(WebConstant.REQUEST_KEY_CLAIMS)).getSubject());
userInfoService.updateNickname(currentUserId, updateNickname);
return JsonResponse.newInstance().ok();
}
@ApiOperation(value = "上传头像")
@ApiImplicitParams({
})
@RequestMapping(value = "/avatarUrl", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse uploadAvatarUrl(HttpServletRequest request,
@ApiParam @Validated @RequestBody Part file) throws Exception {
Long currentUserId = Long.valueOf(((Claims) request.getAttribute(WebConstant.REQUEST_KEY_CLAIMS)).getSubject());
userInfoService.uploadAvatarUrl(currentUserId,file);
return JsonResponse.newInstance().ok();
}
@ApiOperation(value = "查找用户详细信息")
@ApiImplicitParams({
})
@RequestMapping(value = "", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})
public JsonResponse<UserVo.SelectUserInfo> selectUserInfo(HttpServletRequest request) throws Exception {
Long currentUserId = Long.valueOf(((Claims) request.getAttribute(WebConstant.REQUEST_KEY_CLAIMS)).getSubject());
UserVo.SelectUserInfo selectUserInfo = userInfoService.selectUserInfo(currentUserId);
return JsonResponse.newInstance().ok(selectUserInfo);
}
}

2
tall/src/main/java/com/ccsens/tall/web/WpsController.java

@ -68,7 +68,7 @@ public class WpsController {
throw new BaseException(CodeEnum.PARAM_ERROR); throw new BaseException(CodeEnum.PARAM_ERROR);
} }
WpsHeader header = checkSignature(request, userInfo.getSignature()); WpsHeader header = checkSignature(request, userInfo.getSignature());
List<UserVo.UserInfo> infos = userService.listUserInfos(body.getIds()); List<UserVo.UserInfo> infos = userService.queryUserInfos(body.getIds());
log.info("获取用户信息:{}", infos); log.info("获取用户信息:{}", infos);
return WpsVo.UserInfo.getInstance(infos); return WpsVo.UserInfo.getInstance(infos);
} }

3
tall/src/main/resources/application-dev.yml

@ -11,7 +11,7 @@ spring:
datasource: datasource:
type: com.alibaba.druid.pool.DruidDataSource type: com.alibaba.druid.pool.DruidDataSource
rabbitmq: rabbitmq:
host: 192.168.0.99 host: api.ccsens.com
password: 111111 password: 111111
port: 5672 port: 5672
username: admin username: admin
@ -29,6 +29,7 @@ spring:
timeout: 1000ms timeout: 1000ms
swagger: swagger:
enable: true enable: true
gatewayUrl: https://test.tall.wiki/gateway/
notGatewayUrl: /home/staticrec/logo.png notGatewayUrl: /home/staticrec/logo.png
wx: wx:
prefixUrl: https://test.tall.wiki/wxconfigurer-api/ prefixUrl: https://test.tall.wiki/wxconfigurer-api/

2
tall/src/main/resources/application-prod.yml

@ -38,4 +38,4 @@ eureka:
gatewayUrl: https://www.tall.wiki/gateway/ gatewayUrl: https://www.tall.wiki/gateway/
notGatewayUrl: https://www.tall.wiki/ notGatewayUrl: https://www.tall.wiki/
wx: wx:
prefixUrl: https://test.tall.wiki/wxconfigurer-api prefixUrl: https://test.tall.wiki/wxconfigurer-api/

12
tall/src/main/resources/application-test.yml

@ -32,9 +32,11 @@ swagger:
enable: true enable: true
eureka: eureka:
instance: instance:
ip-address: 192.168.0.99 # ip-address: 192.168.0.99
# ip-address: 49.233.89.188 ip-address: 49.233.89.188
gatewayUrl: http://192.168.0.99/gateway/ #gatewayUrl: http://192.168.0.99/gateway/
notGatewayUrl: http://192.168.0.99/ #notGatewayUrl: http://192.168.0.99/
gatewayUrl: https://test.tall.wiki/gateway/
notGatewayUrl: https://test.tall.wiki/
wx: wx:
prefixUrl: https://test.tall.wiki/wxconfigurer-api prefixUrl: https://test.tall.wiki/wxconfigurer-api/

8
tall/src/main/resources/druid-test.yml

@ -15,8 +15,8 @@ spring:
maxWait: 60000 maxWait: 60000
minEvictableIdleTimeMillis: 300000 minEvictableIdleTimeMillis: 300000
minIdle: 5 minIdle: 5
# password: password:
password: 68073a279b399baa1fa12cf39bfbb65bfc1480ffee7b659ccc81cf19be8c4473 # password: 68073a279b399baa1fa12cf39bfbb65bfc1480ffee7b659ccc81cf19be8c4473
poolPreparedStatements: true poolPreparedStatements: true
servletLogSlowSql: true servletLogSlowSql: true
servletLoginPassword: 111111 servletLoginPassword: 111111
@ -28,8 +28,8 @@ spring:
testOnReturn: false testOnReturn: false
testWhileIdle: true testWhileIdle: true
timeBetweenEvictionRunsMillis: 60000 timeBetweenEvictionRunsMillis: 60000
# url: jdbc:mysql://127.0.0.1/tall?useUnicode=true&characterEncoding=UTF-8 url: jdbc:mysql://127.0.0.1/tall?useUnicode=true&characterEncoding=UTF-8
url: jdbc:mysql://test.tall.wiki/tall?useUnicode=true&characterEncoding=UTF-8 # url: jdbc:mysql://test.tall.wiki/tall?useUnicode=true&characterEncoding=UTF-8
username: root username: root
validationQuery: SELECT 1 FROM DUAL validationQuery: SELECT 1 FROM DUAL
env: CCSENS_TALL env: CCSENS_TALL

3
tall/src/main/resources/mapper_dao/DeliverDao.xml

@ -148,10 +148,9 @@
l.is_history as history, l.is_history as history,
l.user_id as userId l.user_id as userId
FROM FROM
`t_pro_task_deliver_post_log` l JOIN t_sys_commited_file f on l.file_id = f.id `t_pro_task_deliver_post_log` l LEFT JOIN t_sys_commited_file f on l.file_id = f.id
WHERE WHERE
l.task_sub_time_id = #{subTimeId} l.task_sub_time_id = #{subTimeId}
group by l.file_id
ORDER BY l.time DESC ORDER BY l.time DESC
</select> </select>

2
tall/src/main/resources/mapper_dao/SysOperationDao.xml

@ -38,7 +38,7 @@
AND s.receiver_id = #{userId} AND s.receiver_id = #{userId}
AND s.send_type = #{sendType} AND s.send_type = #{sendType}
AND s.init_read =0 AND s.init_read =0
AND s.rec_status = 0e AND s.rec_status = 0
AND o.rec_status = 0 AND o.rec_status = 0
</select> </select>
<select id="queryMsg" resultMap="MessageQuery"> <select id="queryMsg" resultMap="MessageQuery">

6
tall/src/main/resources/mapper_dao/SysProjectDao.xml

@ -139,8 +139,8 @@
l.level as lLevle, l.level as lLevle,
l.description as lDescription l.description as lDescription
FROM FROM
t_sys_user_attention a t_sys_project p
left JOIN t_sys_project p ON a.project_id = p.id LEFT JOIN t_sys_user_attention a ON a.project_id = p.id
left join t_sys_project_label pl on pl.project_id = p.id left join t_sys_project_label pl on pl.project_id = p.id
left join t_sys_label l on pl.label_id = l.id and left join t_sys_label l on pl.label_id = l.id and
l.user_id = #{userId} l.user_id = #{userId}
@ -148,6 +148,8 @@
a.user_id = #{userId} a.user_id = #{userId}
AND AND
p.rec_status = 0 p.rec_status = 0
and
a.rec_status = 0
and and
(l.rec_status = 0 or l.rec_status is null) (l.rec_status = 0 or l.rec_status is null)
and and

60
tall/src/main/resources/mapper_dao/SysRingMsgDao.xml

@ -46,6 +46,10 @@
FROM FROM
t_sys_ring_msg m LEFT JOIN t_sys_ring_send s on m.id = s.ring_id t_sys_ring_msg m LEFT JOIN t_sys_ring_send s on m.id = s.ring_id
WHERE WHERE
m.rec_status = 0
and
s.rec_status = 0
and
( (
m.sender_id = #{userId} m.sender_id = #{userId}
or or
@ -98,4 +102,60 @@
m.id = #{messageId} m.id = #{messageId}
</select> </select>
<select id="selectRingInfoByRingMsgId" parameterType="java.util.Map" resultMap="ring_message">
SELECT
*
FROM
(
SELECT
m.id as messageId,
m.`value` as `value`,
m.`value_text` as `valueText`,
m.`time` as time,
if(m.sender_id = #{userId},1,0) as mine,
m.sender_id as senderId,
(
SELECT
IF( u.nickname = '', a.identifier, u.nickname ) AS userName
FROM
t_sys_user u
LEFT JOIN t_sys_auth a ON u.id = a.user_id
AND a.identify_type = 3
WHERE
u.rec_status = 0
and
a.rec_status = 0
and
u.id = m.sender_id
limit 1
) as senderName,
(SELECT count(read_status) FROM t_sys_ring_send WHERE ring_id = m.id and read_status = 0) as unread
FROM
t_sys_ring_msg m LEFT JOIN t_sys_ring_send s on m.id = s.ring_id
WHERE
(
m.sender_id = #{userId}
or
s.role_id in (
SELECT
r.id as rId
FROM
t_pro_role r LEFT JOIN t_pro_member_role mr on r.id = mr.role_id
LEFT JOIN t_pro_member m on mr.member_id = m.id
WHERE
(m.user_id = #{userId}
or
r.`name` = '全体成员'
)
AND
r.project_id = #{projectId}
)
)
and
m.id = #{msgId}
GROUP BY m.id
)a
ORDER BY a.time DESC
</select>
</mapper> </mapper>

38
tall/src/main/resources/mapper_dao/SysUserDao.xml

@ -91,6 +91,7 @@
u.id = #{userId} u.id = #{userId}
limit 1 limit 1
</select> </select>
<select id="getUserInfoByUserId" resultType="com.ccsens.tall.bean.vo.UserVo$UserInfo"> <select id="getUserInfoByUserId" resultType="com.ccsens.tall.bean.vo.UserVo$UserInfo">
SELECT SELECT
u.id, u.id,
@ -108,7 +109,7 @@
u.id = #{userId} u.id = #{userId}
limit 1 limit 1
</select> </select>
<select id="listUserInfos" resultType="com.ccsens.tall.bean.vo.UserVo$UserInfo"> <select id="queryUserInfos" resultType="com.ccsens.tall.bean.vo.UserVo$UserInfo">
SELECT SELECT
u.id, u.id,
IF( u.nickname = '', a.identifier, u.nickname ) AS nickname, IF( u.nickname = '', a.identifier, u.nickname ) AS nickname,
@ -127,4 +128,39 @@
#{item} #{item}
</foreach> </foreach>
</select> </select>
<select id="selectUserInfo" parameterType="java.util.Map" resultType="com.ccsens.tall.bean.vo.UserVo$SelectUserInfo">
SELECT
u.id as id,
(SELECT identifier FROM t_sys_auth WHERE rec_status = 0 AND user_id = #{userId} and identify_type = 3) as account,
(SELECT identifier FROM t_sys_auth WHERE rec_status = 0 AND user_id = #{userId} and identify_type = 1) as phone,
u.nickname as nickname,
u.avatar_url as avatarUrl,
i.signature as signature,
i.introduction as introduction,
i.birthday as birthday,
i.address as address,
i.web_path as webPath,
i.company as company,
i.position as `position`,
u.created_at as createdAt
FROM
t_sys_user u LEFT JOIN t_sys_user_info i on u.id = i.user_id
WHERE
u.rec_status = 0
and
u.id = #{userId}
GROUP BY u.id
</select>
<select id="selectInterspace" parameterType="java.util.Map" resultType="com.ccsens.tall.bean.vo.UserVo$Interspace">
SELECT
count(id) as projectNum
FROM
t_sys_project
WHERE
rec_status = 0
and
creator_id = #{userId}
</select>
</mapper> </mapper>

5
tall/src/main/resources/mapper_dao/TaskDetailDao.xml

@ -89,7 +89,8 @@
p.id as p_id, p.id as p_id,
sp.description as spDescription, sp.description as spDescription,
sp.id as spid, sp.id as spid,
sp.show_type as spShowType sp.show_type as spShowType,
d.priority as priority
FROM FROM
t_pro_task_sub_time s LEFT JOIN t_pro_task_detail d ON s.task_detail_id = d.id t_pro_task_sub_time s LEFT JOIN t_pro_task_detail d ON s.task_detail_id = d.id
LEFT JOIN t_pro_task_plugin p ON p.task_detail_id = d.id LEFT JOIN t_pro_task_plugin p ON p.task_detail_id = d.id
@ -117,7 +118,6 @@
AND AND
s.end_time &gt; #{startTime} s.end_time &gt; #{startTime}
</if> </if>
AND AND
d.Level in (2,3) d.Level in (2,3)
AND AND
@ -128,6 +128,7 @@
)t )t
GROUP BY t.tSubTimeId GROUP BY t.tSubTimeId
order by t.tDetailId order by t.tDetailId
</select> </select>

23
tall/src/main/resources/mapper_dao/TaskSubTimeDao.xml

@ -73,6 +73,8 @@
d.rec_status = 0 d.rec_status = 0
and and
d.level != 0 d.level != 0
and
d.level != 1
<if test="roleId != null"> <if test="roleId != null">
and and
r.id = #{roleId} r.id = #{roleId}
@ -93,7 +95,15 @@
t.mid > 0 t.mid > 0
) )
) )
ORDER BY s.begin_time DESC ORDER BY
<if test="orderType == 0">
s.begin_time DESC
</if>
<if test="orderType == 1">
d.priority DESC
,s.begin_time DESC
</if>
</select> </select>
<select id="getKanbanTakeByType" parameterType="java.util.Map" resultType="com.ccsens.tall.bean.vo.TaskVo$KanBanTask"> <select id="getKanbanTakeByType" parameterType="java.util.Map" resultType="com.ccsens.tall.bean.vo.TaskVo$KanBanTask">
@ -127,6 +137,8 @@
d.rec_status = 0 d.rec_status = 0
and and
d.level != 0 d.level != 0
and
d.level != 1
<if test="roleId != null"> <if test="roleId != null">
and and
r.id = #{roleId} r.id = #{roleId}
@ -135,6 +147,13 @@
s.complated_status = #{type} s.complated_status = #{type}
and and
FROM_UNIXTIME(s.begin_time/1000,'%Y-%m-%d %H:%m:%s') &lt; NOW() FROM_UNIXTIME(s.begin_time/1000,'%Y-%m-%d %H:%m:%s') &lt; NOW()
ORDER BY s.begin_time DESC ORDER BY
<if test="orderType == 0">
s.begin_time DESC
</if>
<if test="orderType == 1">
d.priority DESC
,s.begin_time DESC
</if>
</select> </select>
</mapper> </mapper>

15
util/src/main/java/com/ccsens/util/CodeEnum.java

@ -49,7 +49,7 @@ public enum CodeEnum {
NOT_ROLE(37,"对不起,找不到该角色",true), NOT_ROLE(37,"对不起,找不到该角色",true),
NOT_DELIVER(38,"对不起,找不到对应的交付物",true), NOT_DELIVER(38,"对不起,找不到对应的交付物",true),
NOT_TASK(39,"对不起,找不到对应的任务",true), NOT_TASK(39,"对不起,找不到对应的任务",true),
NOT_DELIVER_FILE(40,"上传文件信息错误,请重试",true), NOT_DELIVER_FILE(40,"文件信息错误,请重试",true),
IS_NOT_EXECUTOR(41,"对不起,您不是该任务负责人",true), IS_NOT_EXECUTOR(41,"对不起,您不是该任务负责人",true),
NOT_CHECKER(42,"请选择检查人",true), NOT_CHECKER(42,"请选择检查人",true),
SUB_TASK_IS_NOT_FINISH(43,"分组内任务未全部完成,无法完成任务",true), SUB_TASK_IS_NOT_FINISH(43,"分组内任务未全部完成,无法完成任务",true),
@ -117,8 +117,17 @@ public enum CodeEnum {
NOT_MESSAGE_TYPE(99,"找不到消息类型,请检查名称是否正确",true), NOT_MESSAGE_TYPE(99,"找不到消息类型,请检查名称是否正确",true),
NOT_LABEL(100,"标签不存在,请检查后操作",true), NOT_LABEL(100,"标签不存在,请检查后操作",true),
REPEAT_LABEL(101,"标签已存在,请勿重复添加",true), REPEAT_LABEL(101,"标签已存在,请勿重复添加",true),
FILE_NOT_FOUND(102,"未找到对应的文件,请检查后操作",true),
SIGNATURE_FAIL(103,"签名验证失败",true), NICKNAME_REPEAT(102,"改名字已经存在,请换一个再试",true),
NEW_PASSWORD_REPEAT_OLD(103,"新密码不能和旧密码相同",true),
PASSWORD_ERROR(104,"密码错误",true),
NOT_ACCOUNT(105,"未找到该账号",true),
FILE_NOT_FOUND(106,"未找到对应的文件,请检查后操作",true),
SIGNATURE_FAIL(107,"签名验证失败",true),
; ;
public CodeEnum addMsg(String msg){ public CodeEnum addMsg(String msg){

3
util/src/main/java/com/ccsens/util/UploadFileUtil_Servlet3.java

@ -2,6 +2,7 @@ package com.ccsens.util;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.SecureUtil;
@ -36,7 +37,7 @@ public class UploadFileUtil_Servlet3 {
if (StrUtil.isEmpty(ext) || !allowedExts.contains(ext)){ if (StrUtil.isEmpty(ext) || !allowedExts.contains(ext)){
throw new NotSupportedFileTypeException("不支持的格式类型: " + ext); throw new NotSupportedFileTypeException("不支持的格式类型: " + ext);
} }
String path = extraPath + File.separator + SecureUtil.simpleUUID() + "." + ext; String path = extraPath + File.separator + IdUtil.simpleUUID() + "." + ext;
//3.创建必要的目录 //3.创建必要的目录
File tmpFile = new File(dir); File tmpFile = new File(dir);
if (!tmpFile.exists()) { if (!tmpFile.exists()) {

7
util/src/main/java/com/ccsens/util/WebConstant.java

@ -155,15 +155,20 @@ public class WebConstant {
public static final String UPLOAD_PATH_DELIVER = UPLOAD_PATH_BASE + File.separator + "delivers"; public static final String UPLOAD_PATH_DELIVER = UPLOAD_PATH_BASE + File.separator + "delivers";
public static final String UPLOAD_PATH_DELIVER1 ="delivers"; public static final String UPLOAD_PATH_DELIVER1 ="delivers";
public static final String UPLOAD_PATH_WPS ="wps"; public static final String UPLOAD_PATH_WPS ="wps";
public static final String UPLOAD_PATH_AVATAR_URL ="avatarUrl";
public static final String UPLOAD_PATH_REMARK ="remarks"; public static final String UPLOAD_PATH_REMARK ="remarks";
public static final String UPLOAD_PROJECT_WBS = UPLOAD_PATH_BASE + File.separator + "project"; public static final String UPLOAD_PROJECT_WBS = UPLOAD_PATH_BASE + File.separator + "project";
public static final String UPLOAD_AVATAR_URL = UPLOAD_PATH_BASE + File.separator + "avatarUrl/";
// public static final String URL_BASE = "https://api.ccsens.com/ptpro/uploads/"; // public static final String URL_BASE = "https://api.ccsens.com/ptpro/uploads/";
public static final String TEST_URL = "https://test.tall.wiki/"; public static final String TEST_URL = "https://test.tall.wiki/";
public static final String TEST_URL_GAME_SQ = TEST_URL + "game-dev/"; public static final String TEST_URL_GAME_SQ = TEST_URL + "game-dev/";
public static final String TEST_URL_GAME_SP = TEST_URL + "game-sp/"; public static final String TEST_URL_GAME_SP = TEST_URL + "game-sp/";
public static final String TEST_URL_GAME_BH = TEST_URL + "game-bh/"; public static final String TEST_URL_GAME_BH = TEST_URL + "game-bh/";
public static final String TEST_URL_BASE = TEST_URL + "gateway/tall/v1.0/uploads/"; public static final String TALL_UPLOADS = "tall/v1.0/uploads/";
public static final String TEST_URL_BASE = TEST_URL + "gateway/" + TALL_UPLOADS;
public static final String TEST_URL_BASE_MT = TEST_URL + "gateway/mt/uploads/"; public static final String TEST_URL_BASE_MT = TEST_URL + "gateway/mt/uploads/";
public static final String TEST_URL_BASE_HEALTH = TEST_URL + "gateway/health/uploads/"; public static final String TEST_URL_BASE_HEALTH = TEST_URL + "gateway/health/uploads/";

8
util/src/test/java/com/ccsens/util/Base64Test.java

@ -13,7 +13,9 @@ import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* @description: * @description:
@ -38,11 +40,9 @@ public class Base64Test {
@Test @Test
public void test02() throws Exception { public void test02() throws Exception {
String a = "112233445566";
String b = a.substring(0,12);
System.out.println(a.length());
System.out.println(b);
} }
} }

Loading…
Cancel
Save