diff --git a/mt/src/main/resources/application.yml b/mt/src/main/resources/application.yml index 5c2cd5c4..5889ff7f 100644 --- a/mt/src/main/resources/application.yml +++ b/mt/src/main/resources/application.yml @@ -1,4 +1,4 @@ spring: profiles: - active: dev - include: common, util-dev \ No newline at end of file + active: test + include: common, util-test \ No newline at end of file diff --git a/nullzzz/2020-10-22/1603333027707.xlsx b/nullzzz/2020-10-22/1603333027707.xlsx new file mode 100644 index 00000000..a99631e0 Binary files /dev/null and b/nullzzz/2020-10-22/1603333027707.xlsx differ diff --git a/tall/src/main/java/com/ccsens/tall/bean/dto/PluginDto.java b/tall/src/main/java/com/ccsens/tall/bean/dto/PluginDto.java index 536d2810..36fcb675 100644 --- a/tall/src/main/java/com/ccsens/tall/bean/dto/PluginDto.java +++ b/tall/src/main/java/com/ccsens/tall/bean/dto/PluginDto.java @@ -15,6 +15,20 @@ import java.util.List; */ @Data public class PluginDto { + @Data + @ApiModel("添加插件") + public static class SaveSysPlugin { + @NotEmpty + @ApiModelProperty("插件名(英文的code)") + private String name; + @NotEmpty + @ApiModelProperty("插件描述") + private String description; + @ApiModelProperty("插件展示位置 默认2:0不显示,1任务头上右侧图标,2任务详情显示按钮,3任务展开面板显示(特殊形式)") + private byte showType = 2; + } + + @Data @ApiModel("添加评论") public static class AddCommentPlugin { diff --git a/tall/src/main/java/com/ccsens/tall/bean/dto/RoleDto.java b/tall/src/main/java/com/ccsens/tall/bean/dto/RoleDto.java index 6fcfe1b4..173ca66a 100644 --- a/tall/src/main/java/com/ccsens/tall/bean/dto/RoleDto.java +++ b/tall/src/main/java/com/ccsens/tall/bean/dto/RoleDto.java @@ -6,6 +6,7 @@ import lombok.Data; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; +import java.util.List; @Data public class RoleDto { @@ -58,5 +59,19 @@ public class RoleDto { @NotNull(message = "项目Id") @ApiModelProperty("项目Id") private Long projectId; + @ApiModelProperty("开始时间") + private Long startTime; + @ApiModelProperty("结束时间") + private Long endTime; } + + @Data + @ApiModel("修改用户可见的角色的展示") + public static class UpdateRoleShow{ + @ApiModelProperty("项目id") + private Long projectId; + @ApiModelProperty("角色id") + private List roleIdList; + } + } diff --git a/tall/src/main/java/com/ccsens/tall/bean/dto/UserDto.java b/tall/src/main/java/com/ccsens/tall/bean/dto/UserDto.java index 6b4bd524..7482d60b 100644 --- a/tall/src/main/java/com/ccsens/tall/bean/dto/UserDto.java +++ b/tall/src/main/java/com/ccsens/tall/bean/dto/UserDto.java @@ -111,7 +111,7 @@ public class UserDto { @NotEmpty(message = "密码不能为空") @Pattern(regexp="^[a-zA-Z0-9._-]{6,20}$",message="密码长度需在6~20之间,不能使用汉字,不能包含特殊字符") private String password; - @ApiModelProperty("来源 0:默认注册,1:HT病人注册") + @ApiModelProperty("来源 0:默认注册,1:HT病人注册,2绿谷注册") private byte source = WebConstant.Regist.SOURCE; } diff --git a/tall/src/main/java/com/ccsens/tall/bean/dto/WeekMeetingDto.java b/tall/src/main/java/com/ccsens/tall/bean/dto/WeekMeetingDto.java new file mode 100644 index 00000000..ed48dbe2 --- /dev/null +++ b/tall/src/main/java/com/ccsens/tall/bean/dto/WeekMeetingDto.java @@ -0,0 +1,49 @@ +package com.ccsens.tall.bean.dto; + + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.NonNull; + +import java.util.List; + +/** + * @author 逗 + */ +@Data +public class WeekMeetingDto { + + @Data + @ApiModel("项目的id") + public static class WeekMeetingId{ + @ApiModelProperty("项目的id") + private Long projectId; + } + + @Data + @ApiModel("查找个人本周任务") + public static class WeekTaskByMemberAndProject{ + @NonNull + @ApiModelProperty("成员id") + private Long memberId; + @ApiModelProperty("“个人汇报”任务的id") + private Long taskId; + @ApiModelProperty("周会项目的id") + private Long projectId; + + public WeekTaskByMemberAndProject() { + } + } + + @Data + @ApiModel("项目的id") + public static class WeekMeetingMinutes{ + @ApiModelProperty("项目的id") + private Long projectId; + @ApiModelProperty("个人汇报任务的id") + private long taskId; + @ApiModelProperty("域名") + private String domainName; + } +} diff --git a/tall/src/main/java/com/ccsens/tall/bean/po/ProUserAttentionRole.java b/tall/src/main/java/com/ccsens/tall/bean/po/ProUserAttentionRole.java new file mode 100644 index 00000000..05a98797 --- /dev/null +++ b/tall/src/main/java/com/ccsens/tall/bean/po/ProUserAttentionRole.java @@ -0,0 +1,95 @@ +package com.ccsens.tall.bean.po; + +import java.io.Serializable; +import java.util.Date; + +public class ProUserAttentionRole implements Serializable { + private Long id; + + private Long projectId; + + private Long userId; + + private Long roleId; + + private Date createdAt; + + private Date updatedAt; + + private Byte recStatus; + + private static final long serialVersionUID = 1L; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getProjectId() { + return projectId; + } + + public void setProjectId(Long projectId) { + this.projectId = projectId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getRoleId() { + return roleId; + } + + public void setRoleId(Long roleId) { + this.roleId = roleId; + } + + public Date getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + public Date getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(Date updatedAt) { + this.updatedAt = updatedAt; + } + + public Byte getRecStatus() { + return recStatus; + } + + public void setRecStatus(Byte recStatus) { + this.recStatus = recStatus; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(getClass().getSimpleName()); + sb.append(" ["); + sb.append("Hash = ").append(hashCode()); + sb.append(", id=").append(id); + sb.append(", projectId=").append(projectId); + sb.append(", userId=").append(userId); + sb.append(", roleId=").append(roleId); + sb.append(", createdAt=").append(createdAt); + sb.append(", updatedAt=").append(updatedAt); + sb.append(", recStatus=").append(recStatus); + sb.append("]"); + return sb.toString(); + } +} \ No newline at end of file diff --git a/tall/src/main/java/com/ccsens/tall/bean/po/ProUserAttentionRoleExample.java b/tall/src/main/java/com/ccsens/tall/bean/po/ProUserAttentionRoleExample.java new file mode 100644 index 00000000..4aa103d5 --- /dev/null +++ b/tall/src/main/java/com/ccsens/tall/bean/po/ProUserAttentionRoleExample.java @@ -0,0 +1,621 @@ +package com.ccsens.tall.bean.po; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class ProUserAttentionRoleExample { + protected String orderByClause; + + protected boolean distinct; + + protected List oredCriteria; + + public ProUserAttentionRoleExample() { + oredCriteria = new ArrayList(); + } + + public void setOrderByClause(String orderByClause) { + this.orderByClause = orderByClause; + } + + public String getOrderByClause() { + return orderByClause; + } + + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + public boolean isDistinct() { + return distinct; + } + + public List getOredCriteria() { + return oredCriteria; + } + + public void or(Criteria criteria) { + oredCriteria.add(criteria); + } + + public Criteria or() { + Criteria criteria = createCriteriaInternal(); + oredCriteria.add(criteria); + return criteria; + } + + public Criteria createCriteria() { + Criteria criteria = createCriteriaInternal(); + if (oredCriteria.size() == 0) { + oredCriteria.add(criteria); + } + return criteria; + } + + protected Criteria createCriteriaInternal() { + Criteria criteria = new Criteria(); + return criteria; + } + + public void clear() { + oredCriteria.clear(); + orderByClause = null; + distinct = false; + } + + protected abstract static class GeneratedCriteria { + protected List criteria; + + protected GeneratedCriteria() { + super(); + criteria = new ArrayList(); + } + + public boolean isValid() { + return criteria.size() > 0; + } + + public List getAllCriteria() { + return criteria; + } + + public List getCriteria() { + return criteria; + } + + protected void addCriterion(String condition) { + if (condition == null) { + throw new RuntimeException("Value for condition cannot be null"); + } + criteria.add(new Criterion(condition)); + } + + protected void addCriterion(String condition, Object value, String property) { + if (value == null) { + throw new RuntimeException("Value for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value)); + } + + protected void addCriterion(String condition, Object value1, Object value2, String property) { + if (value1 == null || value2 == null) { + throw new RuntimeException("Between values for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value1, value2)); + } + + public Criteria andIdIsNull() { + addCriterion("id is null"); + return (Criteria) this; + } + + public Criteria andIdIsNotNull() { + addCriterion("id is not null"); + return (Criteria) this; + } + + public Criteria andIdEqualTo(Long value) { + addCriterion("id =", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotEqualTo(Long value) { + addCriterion("id <>", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThan(Long value) { + addCriterion("id >", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThanOrEqualTo(Long value) { + addCriterion("id >=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThan(Long value) { + addCriterion("id <", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThanOrEqualTo(Long value) { + addCriterion("id <=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdIn(List values) { + addCriterion("id in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdNotIn(List values) { + addCriterion("id not in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdBetween(Long value1, Long value2) { + addCriterion("id between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andIdNotBetween(Long value1, Long value2) { + addCriterion("id not between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andProjectIdIsNull() { + addCriterion("project_id is null"); + return (Criteria) this; + } + + public Criteria andProjectIdIsNotNull() { + addCriterion("project_id is not null"); + return (Criteria) this; + } + + public Criteria andProjectIdEqualTo(Long value) { + addCriterion("project_id =", value, "projectId"); + return (Criteria) this; + } + + public Criteria andProjectIdNotEqualTo(Long value) { + addCriterion("project_id <>", value, "projectId"); + return (Criteria) this; + } + + public Criteria andProjectIdGreaterThan(Long value) { + addCriterion("project_id >", value, "projectId"); + return (Criteria) this; + } + + public Criteria andProjectIdGreaterThanOrEqualTo(Long value) { + addCriterion("project_id >=", value, "projectId"); + return (Criteria) this; + } + + public Criteria andProjectIdLessThan(Long value) { + addCriterion("project_id <", value, "projectId"); + return (Criteria) this; + } + + public Criteria andProjectIdLessThanOrEqualTo(Long value) { + addCriterion("project_id <=", value, "projectId"); + return (Criteria) this; + } + + public Criteria andProjectIdIn(List values) { + addCriterion("project_id in", values, "projectId"); + return (Criteria) this; + } + + public Criteria andProjectIdNotIn(List values) { + addCriterion("project_id not in", values, "projectId"); + return (Criteria) this; + } + + public Criteria andProjectIdBetween(Long value1, Long value2) { + addCriterion("project_id between", value1, value2, "projectId"); + return (Criteria) this; + } + + public Criteria andProjectIdNotBetween(Long value1, Long value2) { + addCriterion("project_id not between", value1, value2, "projectId"); + return (Criteria) this; + } + + public Criteria andUserIdIsNull() { + addCriterion("user_id is null"); + return (Criteria) this; + } + + public Criteria andUserIdIsNotNull() { + addCriterion("user_id is not null"); + return (Criteria) this; + } + + public Criteria andUserIdEqualTo(Long value) { + addCriterion("user_id =", value, "userId"); + return (Criteria) this; + } + + public Criteria andUserIdNotEqualTo(Long value) { + addCriterion("user_id <>", value, "userId"); + return (Criteria) this; + } + + public Criteria andUserIdGreaterThan(Long value) { + addCriterion("user_id >", value, "userId"); + return (Criteria) this; + } + + public Criteria andUserIdGreaterThanOrEqualTo(Long value) { + addCriterion("user_id >=", value, "userId"); + return (Criteria) this; + } + + public Criteria andUserIdLessThan(Long value) { + addCriterion("user_id <", value, "userId"); + return (Criteria) this; + } + + public Criteria andUserIdLessThanOrEqualTo(Long value) { + addCriterion("user_id <=", value, "userId"); + return (Criteria) this; + } + + public Criteria andUserIdIn(List values) { + addCriterion("user_id in", values, "userId"); + return (Criteria) this; + } + + public Criteria andUserIdNotIn(List values) { + addCriterion("user_id not in", values, "userId"); + return (Criteria) this; + } + + public Criteria andUserIdBetween(Long value1, Long value2) { + addCriterion("user_id between", value1, value2, "userId"); + return (Criteria) this; + } + + public Criteria andUserIdNotBetween(Long value1, Long value2) { + addCriterion("user_id not between", value1, value2, "userId"); + return (Criteria) this; + } + + public Criteria andRoleIdIsNull() { + addCriterion("role_id is null"); + return (Criteria) this; + } + + public Criteria andRoleIdIsNotNull() { + addCriterion("role_id is not null"); + return (Criteria) this; + } + + public Criteria andRoleIdEqualTo(Long value) { + addCriterion("role_id =", value, "roleId"); + return (Criteria) this; + } + + public Criteria andRoleIdNotEqualTo(Long value) { + addCriterion("role_id <>", value, "roleId"); + return (Criteria) this; + } + + public Criteria andRoleIdGreaterThan(Long value) { + addCriterion("role_id >", value, "roleId"); + return (Criteria) this; + } + + public Criteria andRoleIdGreaterThanOrEqualTo(Long value) { + addCriterion("role_id >=", value, "roleId"); + return (Criteria) this; + } + + public Criteria andRoleIdLessThan(Long value) { + addCriterion("role_id <", value, "roleId"); + return (Criteria) this; + } + + public Criteria andRoleIdLessThanOrEqualTo(Long value) { + addCriterion("role_id <=", value, "roleId"); + return (Criteria) this; + } + + public Criteria andRoleIdIn(List values) { + addCriterion("role_id in", values, "roleId"); + return (Criteria) this; + } + + public Criteria andRoleIdNotIn(List values) { + addCriterion("role_id not in", values, "roleId"); + return (Criteria) this; + } + + public Criteria andRoleIdBetween(Long value1, Long value2) { + addCriterion("role_id between", value1, value2, "roleId"); + return (Criteria) this; + } + + public Criteria andRoleIdNotBetween(Long value1, Long value2) { + addCriterion("role_id not between", value1, value2, "roleId"); + return (Criteria) this; + } + + public Criteria andCreatedAtIsNull() { + addCriterion("created_at is null"); + return (Criteria) this; + } + + public Criteria andCreatedAtIsNotNull() { + addCriterion("created_at is not null"); + return (Criteria) this; + } + + public Criteria andCreatedAtEqualTo(Date value) { + addCriterion("created_at =", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtNotEqualTo(Date value) { + addCriterion("created_at <>", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtGreaterThan(Date value) { + addCriterion("created_at >", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtGreaterThanOrEqualTo(Date value) { + addCriterion("created_at >=", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtLessThan(Date value) { + addCriterion("created_at <", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtLessThanOrEqualTo(Date value) { + addCriterion("created_at <=", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtIn(List values) { + addCriterion("created_at in", values, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtNotIn(List values) { + addCriterion("created_at not in", values, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtBetween(Date value1, Date value2) { + addCriterion("created_at between", value1, value2, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtNotBetween(Date value1, Date value2) { + addCriterion("created_at not between", value1, value2, "createdAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtIsNull() { + addCriterion("updated_at is null"); + return (Criteria) this; + } + + public Criteria andUpdatedAtIsNotNull() { + addCriterion("updated_at is not null"); + return (Criteria) this; + } + + public Criteria andUpdatedAtEqualTo(Date value) { + addCriterion("updated_at =", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtNotEqualTo(Date value) { + addCriterion("updated_at <>", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtGreaterThan(Date value) { + addCriterion("updated_at >", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtGreaterThanOrEqualTo(Date value) { + addCriterion("updated_at >=", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtLessThan(Date value) { + addCriterion("updated_at <", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtLessThanOrEqualTo(Date value) { + addCriterion("updated_at <=", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtIn(List values) { + addCriterion("updated_at in", values, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtNotIn(List values) { + addCriterion("updated_at not in", values, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtBetween(Date value1, Date value2) { + addCriterion("updated_at between", value1, value2, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtNotBetween(Date value1, Date value2) { + addCriterion("updated_at not between", value1, value2, "updatedAt"); + return (Criteria) this; + } + + public Criteria andRecStatusIsNull() { + addCriterion("rec_status is null"); + return (Criteria) this; + } + + public Criteria andRecStatusIsNotNull() { + addCriterion("rec_status is not null"); + return (Criteria) this; + } + + public Criteria andRecStatusEqualTo(Byte value) { + addCriterion("rec_status =", value, "recStatus"); + return (Criteria) this; + } + + public Criteria andRecStatusNotEqualTo(Byte value) { + addCriterion("rec_status <>", value, "recStatus"); + return (Criteria) this; + } + + public Criteria andRecStatusGreaterThan(Byte value) { + addCriterion("rec_status >", value, "recStatus"); + return (Criteria) this; + } + + public Criteria andRecStatusGreaterThanOrEqualTo(Byte value) { + addCriterion("rec_status >=", value, "recStatus"); + return (Criteria) this; + } + + public Criteria andRecStatusLessThan(Byte value) { + addCriterion("rec_status <", value, "recStatus"); + return (Criteria) this; + } + + public Criteria andRecStatusLessThanOrEqualTo(Byte value) { + addCriterion("rec_status <=", value, "recStatus"); + return (Criteria) this; + } + + public Criteria andRecStatusIn(List values) { + addCriterion("rec_status in", values, "recStatus"); + return (Criteria) this; + } + + public Criteria andRecStatusNotIn(List values) { + addCriterion("rec_status not in", values, "recStatus"); + return (Criteria) this; + } + + public Criteria andRecStatusBetween(Byte value1, Byte value2) { + addCriterion("rec_status between", value1, value2, "recStatus"); + return (Criteria) this; + } + + public Criteria andRecStatusNotBetween(Byte value1, Byte value2) { + addCriterion("rec_status not between", value1, value2, "recStatus"); + return (Criteria) this; + } + } + + public static class Criteria extends GeneratedCriteria { + + protected Criteria() { + super(); + } + } + + public static class Criterion { + private String condition; + + private Object value; + + private Object secondValue; + + private boolean noValue; + + private boolean singleValue; + + private boolean betweenValue; + + private boolean listValue; + + private String typeHandler; + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } + + protected Criterion(String condition) { + super(); + this.condition = condition; + this.typeHandler = null; + this.noValue = true; + } + + protected Criterion(String condition, Object value, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.typeHandler = typeHandler; + if (value instanceof List) { + this.listValue = true; + } else { + this.singleValue = true; + } + } + + protected Criterion(String condition, Object value) { + this(condition, value, null); + } + + protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.secondValue = secondValue; + this.typeHandler = typeHandler; + this.betweenValue = true; + } + + protected Criterion(String condition, Object value, Object secondValue) { + this(condition, value, secondValue, null); + } + } +} \ No newline at end of file diff --git a/tall/src/main/java/com/ccsens/tall/bean/vo/PluginVo.java b/tall/src/main/java/com/ccsens/tall/bean/vo/PluginVo.java index 405a02e4..9ab4ceca 100644 --- a/tall/src/main/java/com/ccsens/tall/bean/vo/PluginVo.java +++ b/tall/src/main/java/com/ccsens/tall/bean/vo/PluginVo.java @@ -4,6 +4,8 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.util.List; + @Data public class PluginVo { @@ -92,5 +94,33 @@ public class PluginVo { private Long wpsFileId; } + @Data + @ApiModel("个人任务汇报插件的入参(包含成员id姓名,项目id姓名,话术)") + public static class PersonalTaskReport{ + @ApiModelProperty("话术") + private String verbalTrick; + @ApiModelProperty("成员信息") + private List memberList; + @ApiModelProperty("项目信息") + private List projectList; + } + @Data + @ApiModel("需要汇报的成员") + public static class ReportMember{ + @ApiModelProperty("成员id") + private Long memberId; + @ApiModelProperty("成员名") + private String memberName; + } + @Data + @ApiModel("需要汇报的项目") + public static class ReportProject{ + @ApiModelProperty("项目id") + private Long projectId; + @ApiModelProperty("项目名") + private String projectName; + } + + } diff --git a/tall/src/main/java/com/ccsens/tall/bean/vo/ProjectVo.java b/tall/src/main/java/com/ccsens/tall/bean/vo/ProjectVo.java index 4abbc5ba..5960b8a5 100644 --- a/tall/src/main/java/com/ccsens/tall/bean/vo/ProjectVo.java +++ b/tall/src/main/java/com/ccsens/tall/bean/vo/ProjectVo.java @@ -135,7 +135,7 @@ public class ProjectVo { @ApiModelProperty("是否展示MVP 0:不展示 1:展示") private int showMvp = 1; @JsonIgnore//0日程,1天,2周,3月 - private int selectTaskType = 1; + private int selectTaskType = 2; @ApiModelProperty("查询任务类型") private String selectType; @ApiModelProperty("第三列展示页面的路径") @@ -359,4 +359,15 @@ public class ProjectVo { private String phone; } + + @Data + @ApiModel("查找项目内所有的成员") + public static class MemberList{ + @ApiModelProperty("成员id") + private Long memberId; + @ApiModelProperty("成员名") + private String memberName; + } + + } diff --git a/tall/src/main/java/com/ccsens/tall/bean/vo/TaskVo.java b/tall/src/main/java/com/ccsens/tall/bean/vo/TaskVo.java index cc2161d0..4a009742 100644 --- a/tall/src/main/java/com/ccsens/tall/bean/vo/TaskVo.java +++ b/tall/src/main/java/com/ccsens/tall/bean/vo/TaskVo.java @@ -409,39 +409,55 @@ public class TaskVo { * 会议纪要里的任务信息 */ @Data + @ApiModel("每周的任务信息") public static class TaskMinutesWps{ + @ApiModelProperty("分解后的任务id") private Long taskSubTimeId; - //负责人角色名 + @ApiModelProperty("负责人角色名") private String executorRoleName; - //任务名 + @ApiModelProperty("任务名") private String taskName; - //计划开始时间 + @ApiModelProperty("计划开始时间") private String beginTime; - //计划结束时间 + @ApiModelProperty("计划结束时间") private String endTime; - //实际开始时间 + @ApiModelProperty("实际开始时间") private String realBeginTime; - //实际结束时间 + @ApiModelProperty("实际结束时间") private String realEndTime; - //评论 + @ApiModelProperty("是否是里程碑 0否 1是") + private Byte milestone; + @ApiModelProperty("状态:0-未开始,1-进行中,2-已完成") + private Byte process; + @ApiModelProperty("项目id") + private Long projectId; + @ApiModelProperty("项目名") + private String projectName; + @ApiModelProperty("评论") private List comment; - //交付物 + @ApiModelProperty("交付物") private List deliverList; @Data + @ApiModel("每周任务的评论") public static class CommentByMinutes{ + @ApiModelProperty("评论id") private Long commentId; - //发送者的名字 + @ApiModelProperty("发送者的名字") private String userName; - //评论内容 + @ApiModelProperty("评论内容") private String commentValue; } @Data + @ApiModel("每周任务的交付物") public static class DeliverByMinutes{ + @ApiModelProperty("交付物id") private Long deliverId; - //交付物名 + @ApiModelProperty("交付物名") private String deliverName; - //交付物文件地址,没有则为空 + @ApiModelProperty("交付物文件地址,没有则为空") private String deliverPath; + @ApiModelProperty("交付物分数") + private int score; } } diff --git a/tall/src/main/java/com/ccsens/tall/persist/dao/ProMemberDao.java b/tall/src/main/java/com/ccsens/tall/persist/dao/ProMemberDao.java index 4c5c134e..150514c9 100644 --- a/tall/src/main/java/com/ccsens/tall/persist/dao/ProMemberDao.java +++ b/tall/src/main/java/com/ccsens/tall/persist/dao/ProMemberDao.java @@ -2,6 +2,7 @@ package com.ccsens.tall.persist.dao; import com.ccsens.tall.bean.po.ProMember; import com.ccsens.tall.bean.vo.MemberVo; +import com.ccsens.tall.bean.vo.PluginVo; import com.ccsens.tall.bean.vo.ProjectVo; import com.ccsens.tall.bean.vo.WbsVo; import com.ccsens.tall.persist.mapper.ProMemberMapper; @@ -41,4 +42,14 @@ public interface ProMemberDao extends ProMemberMapper{ * @return 用户信息 */ MemberVo.MemberInfo getMemberByUserIdAndTaskId(@Param("userId") Long userId, @Param("taskId")Long taskId); + + + List queryMemberByProjectId(@Param("projectId")Long projectId); + + /** + * 根据项目id查询所有成员信息(不包含奖惩干系人) + * @param projectId + * @return + */ + List queryMembersByProjectId(@Param("projectId")Long projectId); } diff --git a/tall/src/main/java/com/ccsens/tall/persist/dao/SysProjectDao.java b/tall/src/main/java/com/ccsens/tall/persist/dao/SysProjectDao.java index 70a7ee7f..295c8adf 100644 --- a/tall/src/main/java/com/ccsens/tall/persist/dao/SysProjectDao.java +++ b/tall/src/main/java/com/ccsens/tall/persist/dao/SysProjectDao.java @@ -2,6 +2,7 @@ package com.ccsens.tall.persist.dao; import com.ccsens.tall.bean.po.SysProject; import com.ccsens.tall.bean.vo.ChartVo; +import com.ccsens.tall.bean.vo.PluginVo; import com.ccsens.tall.bean.vo.ProjectVo; import com.ccsens.tall.persist.mapper.SysProjectMapper; import org.apache.ibatis.annotations.Param; @@ -40,7 +41,15 @@ public interface SysProjectDao extends SysProjectMapper{ @Param("start")Long start, @Param("end")Long end, @Param("roleId")Long roleId,@Param("allMemberId")Long allMemberId,@Param("type") Integer type); - Integer getTaskTotalByProjectId(@Param("projectId")Long projectId, @Param("start")Long start, @Param("end")Long end, @Param("roleId")Long roleId); +// Integer getTaskTotalByProjectId(@Param("projectId")Long projectId, @Param("start")Long start, @Param("end")Long end, @Param("roleId")Long roleId); ChartVo.ProjectOverview getOverviewByToDay(@Param("projectId")Long projectId, @Param("startTime")Long startTime, @Param("endTime")Long endTime,@Param("roleIdList")List roleIdList); + + /** + * 根据父项目id查找项目,不包含当前项目 + * @param parentId 父项目id + * @param projectId 当前项目id + * @return + */ + List queryProjectByParentIdAndNotOwn(@Param("parentId")Long parentId, @Param("projectId")Long projectId); } diff --git a/tall/src/main/java/com/ccsens/tall/persist/dao/TaskDetailDao.java b/tall/src/main/java/com/ccsens/tall/persist/dao/TaskDetailDao.java index 0d0b3ffe..a59e7fef 100644 --- a/tall/src/main/java/com/ccsens/tall/persist/dao/TaskDetailDao.java +++ b/tall/src/main/java/com/ccsens/tall/persist/dao/TaskDetailDao.java @@ -52,5 +52,5 @@ public interface TaskDetailDao extends ProTaskDetailMapper { * @param parentTaskId * @return */ - List getTaskByParentId(@Param("parentTaskId")Long parentTaskId,@Param("milestone")Integer milestone); + List getTaskByParentId(@Param("parentTaskId")Long parentTaskId,@Param("milestone")Integer milestone,@Param("beginTime")Long beginTime,@Param("endTime")Long endTime); } diff --git a/tall/src/main/java/com/ccsens/tall/persist/dao/TaskSubTimeDao.java b/tall/src/main/java/com/ccsens/tall/persist/dao/TaskSubTimeDao.java index 5a75b779..b191ad15 100644 --- a/tall/src/main/java/com/ccsens/tall/persist/dao/TaskSubTimeDao.java +++ b/tall/src/main/java/com/ccsens/tall/persist/dao/TaskSubTimeDao.java @@ -21,5 +21,15 @@ public interface TaskSubTimeDao extends ProTaskSubTimeMapper{ @Param("type")Integer type,@Param("orderType")Integer orderType,@Param("order")Integer order); List queryMinutesTaskByTime(@Param("projectId")Long projectId, @Param("startTime")Long startTime, @Param("endTime")Long endTime); + + /** + * 根据成员和项目查看本周任务 + * @param projectId 项目id + * @param userId 用户id + * @param thisWeekStartTime 开始时间 + * @param thisWeekEndTime 结束时间 + * @return + */ + List queryWeekTaskByMemberAndProject(@Param("projectId")Long projectId, @Param("userId")Long userId, @Param("startTime")long thisWeekStartTime, @Param("endTime")long thisWeekEndTime); } diff --git a/tall/src/main/java/com/ccsens/tall/persist/mapper/ProUserAttentionRoleMapper.java b/tall/src/main/java/com/ccsens/tall/persist/mapper/ProUserAttentionRoleMapper.java new file mode 100644 index 00000000..517e3253 --- /dev/null +++ b/tall/src/main/java/com/ccsens/tall/persist/mapper/ProUserAttentionRoleMapper.java @@ -0,0 +1,30 @@ +package com.ccsens.tall.persist.mapper; + +import com.ccsens.tall.bean.po.ProUserAttentionRole; +import com.ccsens.tall.bean.po.ProUserAttentionRoleExample; +import java.util.List; +import org.apache.ibatis.annotations.Param; + +public interface ProUserAttentionRoleMapper { + long countByExample(ProUserAttentionRoleExample example); + + int deleteByExample(ProUserAttentionRoleExample example); + + int deleteByPrimaryKey(Long id); + + int insert(ProUserAttentionRole record); + + int insertSelective(ProUserAttentionRole record); + + List selectByExample(ProUserAttentionRoleExample example); + + ProUserAttentionRole selectByPrimaryKey(Long id); + + int updateByExampleSelective(@Param("record") ProUserAttentionRole record, @Param("example") ProUserAttentionRoleExample example); + + int updateByExample(@Param("record") ProUserAttentionRole record, @Param("example") ProUserAttentionRoleExample example); + + int updateByPrimaryKeySelective(ProUserAttentionRole record); + + int updateByPrimaryKey(ProUserAttentionRole record); +} \ No newline at end of file diff --git a/tall/src/main/java/com/ccsens/tall/service/ExcelService.java b/tall/src/main/java/com/ccsens/tall/service/ExcelService.java index 80e335a5..3fa11997 100644 --- a/tall/src/main/java/com/ccsens/tall/service/ExcelService.java +++ b/tall/src/main/java/com/ccsens/tall/service/ExcelService.java @@ -678,30 +678,22 @@ public class ExcelService implements IExcelService { firstTaskDetail.setVirtual((byte) WebConstant.TASK_VIRTUAL.Normal.value); firstTaskDetail.setLevel((byte) WebConstant.TASK_LEVEL.FirstTask.value); firstTaskDetail.setExecutorRole(pmRoleId); - if(ObjectUtil.isNotNull(firstStartTime)){ - firstTaskDetail.setBeginTime(firstStartTime); - }else{ +// if(ObjectUtil.isNotNull(firstStartTime)){ +// firstTaskDetail.setBeginTime(firstStartTime); +// }else{ if (StrUtil.isNotEmpty(beginTime)) { firstTaskDetail.setBeginTime(Long.valueOf(beginTime)); }else { firstTaskDetail.setBeginTime(sysProject.getBeginTime()); } - } +// } firstTaskDetail.setEndTime(sysProject.getEndTime()); - proTaskDetailService.saveTaskDetail(firstTaskDetail); taskDetails.add(firstTaskDetail); firstTaskDetailId = firstTaskDetail.getId(); -// if (CollectionUtil.isNotEmpty(taskDetails)) { -// for (ProTaskDetail proTask1 : taskDetails) { -// if (proTask1.getName().equals(task1)) { -// firstTaskDetailId = proTask1.getId(); -// break; -// } -// } -// } + } if (ObjectUtil.isNull(firstTaskDetailId)) { @@ -1171,9 +1163,10 @@ public class ExcelService implements IExcelService { } } } - } else { - throw new BaseException(CodeEnum.WBS_NOT_PLUGIN_SHEET); } +// else { +// throw new BaseException(CodeEnum.WBS_NOT_PLUGIN_SHEET); +// } } } diff --git a/tall/src/main/java/com/ccsens/tall/service/IProMemberService.java b/tall/src/main/java/com/ccsens/tall/service/IProMemberService.java index cb996d8d..4a31f126 100644 --- a/tall/src/main/java/com/ccsens/tall/service/IProMemberService.java +++ b/tall/src/main/java/com/ccsens/tall/service/IProMemberService.java @@ -70,4 +70,10 @@ public interface IProMemberService { */ MemberVo.MemberInfo getMemberByUserIdAndTaskId(Long userId, Long taskId); + /** + * 通过项目id获取所有的成员信息(不包含奖惩干系人) + * @param projectId 项目id + * @return 返回所有成员信息 + */ + List queryMembersByProjectId(Long projectId); } diff --git a/tall/src/main/java/com/ccsens/tall/service/IProRoleService.java b/tall/src/main/java/com/ccsens/tall/service/IProRoleService.java index eadf5e09..aab1043f 100644 --- a/tall/src/main/java/com/ccsens/tall/service/IProRoleService.java +++ b/tall/src/main/java/com/ccsens/tall/service/IProRoleService.java @@ -42,6 +42,13 @@ public interface IProRoleService { */ List queryByProjectVirtualRole(RoleDto.ProjectId projectId); + /** + * 修改该用户关注的角色(是否展示) + * @param currentUserId + * @param roleShow + */ + void updateRoleShow(Long currentUserId, RoleDto.UpdateRoleShow roleShow); + // /** // * 查找项目下的角色包含“全体成员” // * @param projectId 项目id diff --git a/tall/src/main/java/com/ccsens/tall/service/ISysPluginService.java b/tall/src/main/java/com/ccsens/tall/service/ISysPluginService.java index 947a99c8..f0e27b76 100644 --- a/tall/src/main/java/com/ccsens/tall/service/ISysPluginService.java +++ b/tall/src/main/java/com/ccsens/tall/service/ISysPluginService.java @@ -1,10 +1,14 @@ package com.ccsens.tall.service; +import com.ccsens.tall.bean.dto.PluginDto; import com.ccsens.tall.bean.vo.PluginVo; import java.util.List; public interface ISysPluginService { + + void saveSysPlugin(PluginDto.SaveSysPlugin saveSysPlugin); + List getPluginAll(); List getSignByPlugin(Long taskPluginId); @@ -12,4 +16,5 @@ public interface ISysPluginService { List getSignFuzzy(Long taskPluginId, String signinName, String key); Long getTaskDetailIdByPlugin(Long taskPluginId); + } diff --git a/tall/src/main/java/com/ccsens/tall/service/ITaskPluginService.java b/tall/src/main/java/com/ccsens/tall/service/ITaskPluginService.java index 6c0e9794..1437612b 100644 --- a/tall/src/main/java/com/ccsens/tall/service/ITaskPluginService.java +++ b/tall/src/main/java/com/ccsens/tall/service/ITaskPluginService.java @@ -65,6 +65,14 @@ public interface ITaskPluginService { /** * 修改插件配置 * @param updatePluginConfig 插件配置 + * @return */ - void updatePluginConfig(PluginDto.UpdatePluginConfig updatePluginConfig); + TaskVo.PluginVo updatePluginConfig(PluginDto.UpdatePluginConfig updatePluginConfig); + + /** + * 查找周会项目的父项目的成员和项目 + * @param projectId + * @return + */ + PluginVo.PersonalTaskReport getPersonalTaskReport(Long projectId); } diff --git a/tall/src/main/java/com/ccsens/tall/service/IWeekMeetingService.java b/tall/src/main/java/com/ccsens/tall/service/IWeekMeetingService.java new file mode 100644 index 00000000..da1bf5f9 --- /dev/null +++ b/tall/src/main/java/com/ccsens/tall/service/IWeekMeetingService.java @@ -0,0 +1,44 @@ +package com.ccsens.tall.service; + +import com.ccsens.tall.bean.dto.WeekMeetingDto; +import com.ccsens.tall.bean.vo.PluginVo; +import com.ccsens.tall.bean.vo.ProjectVo; +import com.ccsens.tall.bean.vo.TaskVo; + +import java.io.IOException; +import java.util.List; + +/** + * @author 逗 + */ +public interface IWeekMeetingService { + /** + * 查找周会要用到的项目 + * @param projectId 周会项目id + * @param userId userId + * @return 返回查询到的项目列表 + */ + List queryWeekUserProject(Long projectId, Long userId); + + /** + * 查找本周任务 + * @param projectId 项目id + * @return 本周任务 + */ + List queryWeekTaskByProject(Long projectId); + + /** + * 查找个人本周任务 + * @param param 成员id和项目id + * @return 返回本周任务 + */ + List queryWeekTaskByMemberAndProject(WeekMeetingDto.WeekTaskByMemberAndProject param) throws IOException; + + /** + * 生成会议记录表(传控模板) + * @param userId userId + * @param param 项目id和域名 + * @return + */ + String getCcMinutes(Long userId, WeekMeetingDto.WeekMeetingMinutes param) throws IOException; +} diff --git a/tall/src/main/java/com/ccsens/tall/service/ProMemberService.java b/tall/src/main/java/com/ccsens/tall/service/ProMemberService.java index 27a97c57..380c4091 100644 --- a/tall/src/main/java/com/ccsens/tall/service/ProMemberService.java +++ b/tall/src/main/java/com/ccsens/tall/service/ProMemberService.java @@ -221,24 +221,7 @@ public class ProMemberService implements IProMemberService { memberInfo.setUserId(user.getId()); memberInfo.setNickname(user.getNickname()); memberInfo.setAvatarUrl(user.getAvatarUrl()); -// //查询该用户的手机号 -// SysAuthExample authExample = new SysAuthExample(); -// authExample.createCriteria().andIdentifyTypeEqualTo((byte) WebConstant.IDENTIFY_TYPE.Phone.value) -// .andUserIdEqualTo(user.getId()); -// List authList = authDao.selectByExample(authExample); -// if(CollectionUtil.isNotEmpty(authList)){ -// memberInfo.setPhone(authList.get(0).getIdentifier()); -// } -// if(ObjectUtil.isNull(user.getNickname())){ -// //查找账号名 -// SysAuthExample sysAuthExample = new SysAuthExample(); -// sysAuthExample.createCriteria().andIdentifyTypeEqualTo((byte) WebConstant.IDENTIFY_TYPE.Account.value) -// .andUserIdEqualTo(user.getId()); -// List accountAuth = authDao.selectByExample(sysAuthExample); -// if(CollectionUtil.isNotEmpty(accountAuth)){ -// memberInfo.setNickname(accountAuth.get(0).getIdentifier()); -// } -// } + } return memberInfo; } @@ -449,4 +432,9 @@ public class ProMemberService implements IProMemberService { public MemberVo.MemberInfo getMemberByUserIdAndTaskId(Long userId, Long taskId) { return proMemberDao.getMemberByUserIdAndTaskId(userId, taskId); } + + @Override + public List queryMembersByProjectId(Long projectId) { + return proMemberDao.queryMembersByProjectId(projectId); + } } diff --git a/tall/src/main/java/com/ccsens/tall/service/ProRoleService.java b/tall/src/main/java/com/ccsens/tall/service/ProRoleService.java index 8f7ad1f2..62f27d48 100644 --- a/tall/src/main/java/com/ccsens/tall/service/ProRoleService.java +++ b/tall/src/main/java/com/ccsens/tall/service/ProRoleService.java @@ -11,6 +11,7 @@ import com.ccsens.tall.bean.po.*; import com.ccsens.tall.bean.vo.ProjectVo; import com.ccsens.tall.bean.vo.TaskVo; import com.ccsens.tall.persist.dao.*; +import com.ccsens.tall.persist.mapper.ProUserAttentionRoleMapper; import com.ccsens.util.CodeEnum; import com.ccsens.util.WebConstant; import com.ccsens.util.exception.BaseException; @@ -18,6 +19,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; +import org.w3c.dom.ls.LSInput; import javax.annotation.Resource; import java.util.ArrayList; @@ -52,6 +54,8 @@ public class ProRoleService implements IProRoleService { private SysProjectDao sysProjectDao; @Resource private TaskDetailDao taskDetailDao; + @Resource + private ProUserAttentionRoleMapper userAttentionRoleMapper; @Override public void saveProRole(ProRole proRole) { @@ -70,41 +74,27 @@ public class ProRoleService implements IProRoleService { * 根据项目id和用户Id查询项目下的所有二级角色的详细信息 */ @Override - public List getRolesByProjectIdAndUserId(Long projectId, Long currentUserId,Integer imitation) throws Exception { + public List getRolesByProjectIdAndUserId(Long projectId, Long currentUserId, Integer imitation) throws Exception { List memberRoleList; //获取用户在项目中的角色 - List roleList = proMemberService.selectRolesByUserIdAndProjectId(currentUserId, projectId,imitation); + List roleList = proMemberService.selectRolesByUserIdAndProjectId(currentUserId, projectId, imitation); //1.查询二级角色(项目经理+项目成员+mvp) memberRoleList = getRealMemberRolesByProjectId(projectId); + if (CollectionUtil.isNotEmpty(memberRoleList)) { -// //获取项目的配置(是否展示mvp) -// ProShowExample showExample = new ProShowExample(); -// showExample.createCriteria().andProjectIdEqualTo(projectId); -// List showList = proShowDao.selectByExample(showExample); -// if(CollectionUtil.isNotEmpty(showList)){ -// if(showList.get(0).getIsShowMvp() == 0){ -// for(int i = 0 ; i < memberRoleList.size() ; i++){ -// ProjectVo.RoleInfo roleInfo = memberRoleList.get(i); -// if(roleInfo.getName().equalsIgnoreCase(WebConstant.ROLE_NAME.MVP.phase)){ -// memberRoleList.remove(i); -// break; -// } -// } -// } -// } if (CollectionUtil.isNotEmpty(roleList)) { //用户是否只是关注者 boolean isAttention = false; - if(roleList.size() == 1){ + if (roleList.size() == 1) { ProRole role = roleList.get(0); - if(role.getName().equalsIgnoreCase(WebConstant.ROLE_NAME.Attention.phase)){ + if (role.getName().equalsIgnoreCase(WebConstant.ROLE_NAME.Attention.phase)) { isAttention = true; } } //是否mine(若是用户是关注者,则所有角色都暂时属于关注者) for (ProjectVo.RoleInfo memberRole : memberRoleList) { - if(isAttention){ + if (isAttention) { memberRole.setIsShow(true); continue; } @@ -112,13 +102,21 @@ public class ProRoleService implements IProRoleService { if (memberRole.getId().equals(role.getId())) { memberRole.setMine(true); memberRole.setIsShow(true); - if(imitation != null && imitation == 1){ + if (imitation != null && imitation == 1) { memberRole.setImitation((byte) 1); } break; } else { memberRole.setMine(false); - memberRole.setIsShow(false); + //查找当前用户是否关注此角色 + ProUserAttentionRoleExample userAttentionRoleExample = new ProUserAttentionRoleExample(); + userAttentionRoleExample.createCriteria().andProjectIdEqualTo(projectId) + .andUserIdEqualTo(currentUserId).andRoleIdEqualTo(memberRole.getId()); + if (userAttentionRoleMapper.countByExample(userAttentionRoleExample) != 0) { + memberRole.setIsShow(true); + } else { + memberRole.setIsShow(false); + } } } } @@ -139,9 +137,9 @@ public class ProRoleService implements IProRoleService { for (ProjectVo.RoleInfo memberRole : memberRoleList) { if (otherRoleId.longValue() == memberRole.getId().longValue()) { //若是关注者,正常删除。若不是关注者,不删除自己所属的角色 - if(isAttention){ + if (isAttention) { memberRoleList.remove(memberRole); - }else if (!memberRole.isMine()) { + } else if (!memberRole.isMine()) { memberRoleList.remove(memberRole); } break; @@ -185,6 +183,21 @@ public class ProRoleService implements IProRoleService { } } } +// //查找该项目的子项目,转换成项目角色返回 +// SysProjectExample projectExample = new SysProjectExample(); +// projectExample.createCriteria().andParentIdEqualTo(projectId).andParentIdNotEqualTo(0L); +// List sysProject = sysProjectDao.selectByExample(projectExample); +// if(CollectionUtil.isNotEmpty(sysProject)){ +// sysProject.forEach(project -> { +// ProjectVo.RoleInfo roleInfo = new ProjectVo.RoleInfo(); +// roleInfo.setName(project.getName()); +//// roleInfo.setIsShow(true); +// roleInfo.setProjectRole((byte) 1); +// roleInfo.setRelevanceProjectId(project.getId()); +// roleInfo.setRelevanceProjectName(project.getName()); +// memberRoleList.add(roleInfo); +// }); +// } return memberRoleList; } @@ -209,13 +222,14 @@ public class ProRoleService implements IProRoleService { /** * 获取用户在项目中的最高权限 + * * @return 返回权限 */ @Override public int selectPowerByRoleName(Long userId, Long projectId) { int power = 0; SysProject project = projectDao.selectByPrimaryKey(projectId); - if(ObjectUtil.isNotNull(project)) { + if (ObjectUtil.isNotNull(project)) { if (project.getCreatorId().longValue() == userId) { power = 2; } @@ -238,7 +252,7 @@ public class ProRoleService implements IProRoleService { TaskVo.RoleCheckList roleCheckList = null; if (roleId != 0 || ObjectUtil.isNotNull(roleId)) { ProRole role = proRoleDao.selectByPrimaryKey(roleId); - if(ObjectUtil.isNotNull(role)){ + if (ObjectUtil.isNotNull(role)) { roleCheckList = new TaskVo.RoleCheckList(); roleCheckList.setId(role.getId()); roleCheckList.setName(role.getName()); @@ -264,7 +278,7 @@ public class ProRoleService implements IProRoleService { private boolean isPmByRoleId(Long roleId) { Integer i = proRoleDao.isPmByRoleId(roleId); - if(ObjectUtil.isNull(i)){ + if (ObjectUtil.isNull(i)) { throw new BaseException(CodeEnum.NOT_ROLE); } return i == 1; @@ -281,7 +295,7 @@ public class ProRoleService implements IProRoleService { // //本用户在项目中的角色 // List proRoles = getProRoleByProjectIdAndUserId(role.getProjectId(), userId); //用户在项目中的最高权限 - if(ObjectUtil.isNotNull(role)) { + if (ObjectUtil.isNotNull(role)) { int power = selectPowerByRoleName(userId, role.getProjectId()); if (power > 1) { //修改删除状态 @@ -322,7 +336,7 @@ public class ProRoleService implements IProRoleService { if (CollectionUtil.isNotEmpty(memberRoleList)) { for (ProMemberRole memberRole : memberRoleList) { ProMember proMember = proMemberDao.selectByPrimaryKey(memberRole.getMemberId()); - if(ObjectUtil.isNotNull(proMember)) { + if (ObjectUtil.isNotNull(proMember)) { proMember.setRecStatus((byte) 2); proMemberDao.updateByPrimaryKeySelective(proMember); } @@ -334,8 +348,8 @@ public class ProRoleService implements IProRoleService { ProRoleExcludeExample excludeExample = new ProRoleExcludeExample(); excludeExample.createCriteria().andRoleIdEqualTo(roleId); List proRoleExcludeList = excludeDao.selectByExample(excludeExample); - if(CollectionUtil.isNotEmpty(proRoleExcludeList)){ - for(ProRoleExclude proRoleExclude : proRoleExcludeList){ + if (CollectionUtil.isNotEmpty(proRoleExcludeList)) { + for (ProRoleExclude proRoleExclude : proRoleExcludeList) { proRoleExclude.setRecStatus((byte) 2); excludeDao.updateByPrimaryKeySelective(proRoleExclude); } @@ -358,7 +372,7 @@ public class ProRoleService implements IProRoleService { ProRoleExample proRoleExample = new ProRoleExample(); proRoleExample.createCriteria().andProjectIdEqualTo(saveRole.getProjectId()).andNameEqualTo(WebConstant.ROLE_NAME.Member.value); List memberRoleList = proRoleDao.selectByExample(proRoleExample); - if(CollectionUtil.isNotEmpty(memberRoleList)){ + if (CollectionUtil.isNotEmpty(memberRoleList)) { parentId = memberRoleList.get(0).getId(); } //添加角色 @@ -374,7 +388,7 @@ public class ProRoleService implements IProRoleService { public ProjectVo.RoleInfo updateRole(Long currentUserId, RoleDto.UpdateRole updateRole) { //查找角色 ProRole proRole = proRoleDao.selectByPrimaryKey(updateRole.getRoleId()); - if(ObjectUtil.isNull(proRole)){ + if (ObjectUtil.isNull(proRole)) { throw new BaseException(CodeEnum.NOT_ROLE); } //检查操作者的权限 @@ -383,18 +397,18 @@ public class ProRoleService implements IProRoleService { throw new BaseException(CodeEnum.NOT_POWER); } //修改名字 - if(StrUtil.isNotEmpty(updateRole.getRoleName())){ + if (StrUtil.isNotEmpty(updateRole.getRoleName())) { proRole.setName(updateRole.getRoleName()); } //修改关联项目id - if(ObjectUtil.isNotNull(updateRole.getRelevanceProjectId())){ + if (ObjectUtil.isNotNull(updateRole.getRelevanceProjectId())) { SysProject project = sysProjectDao.selectByPrimaryKey(updateRole.getRelevanceProjectId()); - if(ObjectUtil.isNull(project)){ + if (ObjectUtil.isNull(project)) { throw new BaseException(CodeEnum.NOT_PROJECT); } //检查角色是否是角色项目 ProRole parentRole = proRoleDao.selectByPrimaryKey(proRole.getParentId()); - if(parentRole.getName().equalsIgnoreCase(WebConstant.ROLE_NAME.ProjectVirtualRole.value)){ + if (parentRole.getName().equalsIgnoreCase(WebConstant.ROLE_NAME.ProjectVirtualRole.value)) { proRole.setRelevanceProjectId(updateRole.getRelevanceProjectId()); } } @@ -405,8 +419,8 @@ public class ProRoleService implements IProRoleService { @Override public void saveMemberByRole(Long currentUserId, RoleDto.SaveMember saveMember) { //检查成员是否为空 - ProMember member = proMemberDao.selectByPrimaryKey(saveMember.getMemberId()); - if(ObjectUtil.isNull(member)){ + ProMember member = proMemberDao.selectByPrimaryKey(saveMember.getMemberId()); + if (ObjectUtil.isNull(member)) { throw new BaseException(CodeEnum.NOT_MEMBER); } //检查角色是否为PM 是的话则需要更高权限 @@ -427,8 +441,8 @@ public class ProRoleService implements IProRoleService { @Override public void deleteMemberByRole(Long currentUserId, RoleDto.SaveMember saveMember) { //检查参数是否正确 - ProMember member = proMemberDao.selectByPrimaryKey(saveMember.getMemberId()); - if(ObjectUtil.isNull(member)){ + ProMember member = proMemberDao.selectByPrimaryKey(saveMember.getMemberId()); + if (ObjectUtil.isNull(member)) { throw new BaseException(CodeEnum.NOT_MEMBER); } //检查被操作的角色是否是项目PM @@ -442,11 +456,11 @@ public class ProRoleService implements IProRoleService { ProMemberRoleExample memberRoleExample = new ProMemberRoleExample(); memberRoleExample.createCriteria().andRoleIdEqualTo(saveMember.getRoleId()).andMemberIdEqualTo(member.getId()); List memberRoleList = memberRoleDao.selectByExample(memberRoleExample); - if(CollectionUtil.isEmpty(memberRoleList)){ + if (CollectionUtil.isEmpty(memberRoleList)) { throw new BaseException(CodeEnum.NOT_MEMBER); } - for(ProMemberRole memberRole : memberRoleList){ - memberRole.setRecStatus((byte)2); + for (ProMemberRole memberRole : memberRoleList) { + memberRole.setRecStatus((byte) 2); memberRoleDao.updateByPrimaryKeySelective(memberRole); } } @@ -459,11 +473,15 @@ public class ProRoleService implements IProRoleService { if (ObjectUtil.isNull(project)) { throw new BaseException(CodeEnum.NOT_PROJECT); } + long beginTime = projectId.getStartTime() == null ? project.getBeginTime() : projectId.getStartTime(); + long endTime = projectId.getEndTime() == null ? project.getEndTime() : projectId.getEndTime(); //1、查找一级任务 ProTaskDetailExample proTaskDetailExample = new ProTaskDetailExample(); - proTaskDetailExample.createCriteria().andProjectIdEqualTo(projectId.getProjectId()).andLevelEqualTo((byte) 1); + proTaskDetailExample.createCriteria().andProjectIdEqualTo(projectId.getProjectId()) + .andLevelEqualTo((byte) 1).andBeginTimeLessThanOrEqualTo(endTime).andEndTimeGreaterThanOrEqualTo(beginTime); + proTaskDetailExample.setOrderByClause("begin_time"); List firstTaskDetailList = taskDetailDao.selectByExample(proTaskDetailExample); - log.info("查找到一级任务:{}",firstTaskDetailList); + log.info("查找到一级任务:{}", firstTaskDetailList); if (CollectionUtil.isNotEmpty(firstTaskDetailList)) { firstTaskDetailList.forEach(firstTaskDetail -> { int sequence = 1; @@ -472,11 +490,12 @@ public class ProRoleService implements IProRoleService { normalTask.setDetailId(firstTaskDetail.getId()); normalTask.setSequence(sequence); - List secondTaskList = taskDetailDao.getTaskByParentId(firstTaskDetail.getId(),1); + List secondTaskList = taskDetailDao.getTaskByParentId(firstTaskDetail.getId(), 1,beginTime,endTime); List secondList = new ArrayList<>(); - if(CollectionUtil.isNotEmpty(secondTaskList)){ + if (CollectionUtil.isNotEmpty(secondTaskList)) { secondTaskList.forEach(secondTask -> { TaskVo.NormalTask second = new TaskVo.NormalTask(); + second.setId(taskDetailDao.selectSubTimeByTaskIdAndTime(secondTask.getDetailId(), System.currentTimeMillis())); BeanUtil.copyProperties(secondTask, second); second.setParentName(firstTaskDetail.getName()); secondList.add(second); @@ -489,12 +508,33 @@ public class ProRoleService implements IProRoleService { return taskList; } - private ProjectVo.RoleInfo getRoleInfoByRoleId(Long roleId){ + private ProjectVo.RoleInfo getRoleInfoByRoleId(Long roleId) { return proRoleDao.getRoleInfoByRoleId(roleId); } - // @Override -// public RoleVo.RoleByProjectId queryRoleByProjectId(Long projectId) { -// return null; -// } + @Override + public void updateRoleShow(Long currentUserId, RoleDto.UpdateRoleShow roleShow) { + if (CollectionUtil.isNotEmpty(roleShow.getRoleIdList())) { + //查找该用户在项目下关注的角色 + ProUserAttentionRoleExample userAttentionRoleExample = new ProUserAttentionRoleExample(); + userAttentionRoleExample.createCriteria().andProjectIdEqualTo(roleShow.getProjectId()).andUserIdEqualTo(currentUserId); + List userAttentionRoleList = userAttentionRoleMapper.selectByExample(userAttentionRoleExample); + if (CollectionUtil.isNotEmpty(userAttentionRoleList)) { + //有则全部删除 + userAttentionRoleList.forEach(userAttentionRole -> { + userAttentionRole.setRecStatus((byte) 2); + userAttentionRoleMapper.updateByPrimaryKeySelective(userAttentionRole); + }); + } + //然后重新添加关注信息 + roleShow.getRoleIdList().forEach(roleId -> { + ProUserAttentionRole userAttentionRole = new ProUserAttentionRole(); + userAttentionRole.setId(snowflake.nextId()); + userAttentionRole.setProjectId(roleShow.getProjectId()); + userAttentionRole.setUserId(currentUserId); + userAttentionRole.setRoleId(roleId); + userAttentionRoleMapper.insertSelective(userAttentionRole); + }); + } + } } diff --git a/tall/src/main/java/com/ccsens/tall/service/ProTaskDetailService.java b/tall/src/main/java/com/ccsens/tall/service/ProTaskDetailService.java index 3d685d85..f67074cb 100644 --- a/tall/src/main/java/com/ccsens/tall/service/ProTaskDetailService.java +++ b/tall/src/main/java/com/ccsens/tall/service/ProTaskDetailService.java @@ -5,19 +5,23 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.lang.Snowflake; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; import com.ccsens.cloudutil.feign.MtFeignClient; import com.ccsens.tall.bean.dto.ProjectDto; import com.ccsens.tall.bean.dto.TaskDto; import com.ccsens.tall.bean.po.*; import com.ccsens.tall.bean.vo.MemberVo; +import com.ccsens.tall.bean.vo.PluginVo; import com.ccsens.tall.bean.vo.ProjectVo; import com.ccsens.tall.bean.vo.TaskVo; import com.ccsens.tall.persist.dao.*; import com.ccsens.tall.persist.dao.ProTaskShowDao; import com.ccsens.tall.persist.mapper.ProPluginConfigMapper; +import com.ccsens.tall.util.TallConstant; import com.ccsens.tall.util.TaskUtil; import com.ccsens.util.CodeEnum; import com.ccsens.util.DateUtil; +import com.ccsens.util.JacksonUtil; import com.ccsens.util.WebConstant; import com.ccsens.util.cron.CronConstant; import com.ccsens.util.cron.NatureToDate; @@ -71,7 +75,7 @@ public class ProTaskDetailService implements IProTaskDetailService { @Resource private MtFeignClient mtFeignClient; @Resource - private ProPluginConfigMapper proPluginConfigMapper; + private ProPluginConfigDao pluginConfigDao; @Resource private IRobotService robotService; @Resource @@ -80,6 +84,8 @@ public class ProTaskDetailService implements IProTaskDetailService { private TaskDeliverDao taskDeliverDao; @Resource private ProMemberRoleDao proMemberRoleDao; + @Resource + private TaskPluginService taskPluginService; @Override public void saveTaskDetail(ProTaskDetail taskDetail) { @@ -160,7 +166,9 @@ public class ProTaskDetailService implements IProTaskDetailService { return proTaskInfo; } ProTaskDetailExample proTaskDetailExample = new ProTaskDetailExample(); - proTaskDetailExample.createCriteria().andProjectIdEqualTo(projectId).andLevelEqualTo((byte) 1); + proTaskDetailExample.createCriteria().andProjectIdEqualTo(projectId).andLevelEqualTo((byte) 1) + .andLevelEqualTo((byte) 1).andBeginTimeLessThanOrEqualTo(endTime).andEndTimeGreaterThanOrEqualTo(startTime); + proTaskDetailExample.setOrderByClause("begin_time"); List firstTaskDetailList = taskDetailDao.selectByExample(proTaskDetailExample); if (CollectionUtil.isNotEmpty(firstTaskDetailList)) { int sequence = 1; @@ -173,7 +181,7 @@ public class ProTaskDetailService implements IProTaskDetailService { // 查询任务名对应的配置 ProPluginConfigExample configExample = new ProPluginConfigExample(); configExample.createCriteria().andTaskIdEqualTo(firstTaskDetail.getId()).andPlaceLocationEqualTo((byte) 0); - List proPluginConfigs = proPluginConfigMapper.selectByExample(configExample); + List proPluginConfigs = pluginConfigDao.selectByExample(configExample); if (CollectionUtil.isNotEmpty(proPluginConfigs)) { ProPluginConfig config = proPluginConfigs.get(0); normalTask.setImportParam(config.getImportParam()); @@ -466,7 +474,14 @@ public class ProTaskDetailService implements IProTaskDetailService { plugin.setShowType(pluginShowType[i]); //查找插件的配置信息 ProPluginConfig proPluginConfig = sysPluginDao.getPluginConfigByTaskPluginId(pluginIds[i], normalTask.getDetailId()); + if (ObjectUtil.isNotNull(proPluginConfig)) { + //如果是“个人任务汇报”插件,特殊查询 + if(pluginNames[i].equalsIgnoreCase(TallConstant.PERSONAL_TASK_REPORT) && StrUtil.isEmpty(proPluginConfig.getImportParam())){ + PluginVo.PersonalTaskReport personalTaskReport = taskPluginService.getPersonalTaskReport(normalTask.getProjectId()); + proPluginConfig.setImportParam(JacksonUtil.beanToJson(personalTaskReport)); +// pluginConfigDao.updateByPrimaryKeySelective(proPluginConfig); + } plugin.setWebPath(proPluginConfig.getWebPath()); plugin.setRoutineLocation(proPluginConfig.getRoutineLocation()); plugin.setImportParam(proPluginConfig.getImportParam()); @@ -479,6 +494,7 @@ public class ProTaskDetailService implements IProTaskDetailService { } } + /** * 点击MVP查看交付物 */ @@ -552,16 +568,22 @@ public class ProTaskDetailService implements IProTaskDetailService { */ @Override public TaskVo.NormalTask getTaskInfoByTaskId(Long currentUserId, Long projectId, Long taskId, Integer imitation) throws Exception { + TaskVo.NormalTask taskDetail; + Long taskSubTimeId = null; ProTaskSubTime subTime = taskSubTimeDao.selectByPrimaryKey(taskId); if (ObjectUtil.isNotNull(subTime)) { taskId = subTime.getTaskDetailId(); + taskSubTimeId = subTime.getId(); } - TaskVo.NormalTask taskDetail; ProTaskDetail task = taskDetailDao.selectByPrimaryKey(taskId); if (ObjectUtil.isNull(task)) { throw new BaseException(CodeEnum.NOT_TASK); } - taskDetail = taskDetailDao.selectTaskByTaskId(null, taskId, task.getExecutorRole()); + if(ObjectUtil.isNull(taskSubTimeId)){ + taskSubTimeId = taskDeliverService.isTaskOrSubTime(taskId); + } + + taskDetail = taskDetailDao.selectTaskByTaskId(taskSubTimeId, taskId, task.getExecutorRole()); if (ObjectUtil.isNotNull(taskDetail)) { //处理查询到的任务的插件 managePlugin(currentUserId, task.getExecutorRole(), taskDetail, imitation); @@ -1468,7 +1490,7 @@ public class ProTaskDetailService implements IProTaskDetailService { if (CollectionUtil.isNotEmpty(firstTaskDetailList)) { firstTaskDetailList.forEach(firstTaskDetail -> { TaskVo.TaskListByProjectId firstTask = taskDetailDao.getTaskById(firstTaskDetail.getId()); - List secondTaskList = taskDetailDao.getTaskByParentId(firstTaskDetail.getId(), null); + List secondTaskList = taskDetailDao.getTaskByParentId(firstTaskDetail.getId(), null,null,null); if (CollectionUtil.isNotEmpty(secondTaskList)) { secondTaskList.forEach(secondTask -> secondTask.setParentName(firstTaskDetail.getName())); } diff --git a/tall/src/main/java/com/ccsens/tall/service/ProjectService.java b/tall/src/main/java/com/ccsens/tall/service/ProjectService.java index b5e7619c..2f56e0ce 100644 --- a/tall/src/main/java/com/ccsens/tall/service/ProjectService.java +++ b/tall/src/main/java/com/ccsens/tall/service/ProjectService.java @@ -548,10 +548,31 @@ public class ProjectService implements IProjectService { if (power > 1) { //删除项目下的所有信息 deleteProjectById(projectId); + //将此项目的所有子项目解绑 + SysProjectExample projectExample = new SysProjectExample(); + projectExample.createCriteria().andParentIdEqualTo(projectId); + List sysProjectList = sysProjectDao.selectByExample(projectExample); + if(CollectionUtil.isNotEmpty(sysProjectList)){ + sysProjectList.forEach(sysProject -> { + sysProject.setParentId(0L); + sysProjectDao.updateByPrimaryKeySelective(sysProject); + }); + } + //将此项目从父项目的角色中删除 + ProRoleExample proRoleExample = new ProRoleExample(); + proRoleExample.createCriteria().andProjectIdEqualTo(project.getParentId()).andRelevanceProjectIdEqualTo(project.getId()); + List roleList = proRoleDao.selectByExample(proRoleExample); + if(CollectionUtil.isNotEmpty(roleList)){ + roleList.forEach(role -> { + role.setRecStatus((byte) 2); + proRoleDao.updateByPrimaryKeySelective(role); + }); + } //修改项目状态 project.setRecStatus(WebConstant.REC_STATUS.Deleted.value); sysProjectDao.updateByPrimaryKeySelective(project); + } else { throw new BaseException(CodeEnum.NOT_POWER); } @@ -871,8 +892,9 @@ public class ProjectService implements IProjectService { if (power > 1) { if (StrUtil.isNotEmpty(projectInfoDto.getName())) { SysProjectExample projectExample = new SysProjectExample(); - projectExample.createCriteria().andNameEqualTo(projectInfoDto.getName()); + projectExample.createCriteria().andNameEqualTo(projectInfoDto.getName()).andIdNotEqualTo(project.getId()).andCreatorIdEqualTo(currentUserId); List projectList = sysProjectDao.selectByExample(projectExample); + log.info("重名的项目:{}",projectList); if (CollectionUtil.isNotEmpty(projectList)) { throw new BaseException(CodeEnum.REPEAT_PROJECT_NAME); } else { @@ -895,6 +917,8 @@ public class ProjectService implements IProjectService { } if(ObjectUtil.isNotNull(projectInfoDto.getParentId())){ project.setParentId(projectInfoDto.getParentId()); + //将此项目添加为父项目的虚拟项目角色 + saveProjectVirtualRole(project,projectInfoDto.getParentId()); } if(ObjectUtil.isNotNull(projectInfoDto.getHomePageShow())){ project.setHomePageShow(projectInfoDto.getHomePageShow()); @@ -912,6 +936,36 @@ public class ProjectService implements IProjectService { } return getProjectInfoById(currentUserId, project.getId(),token); } + /** + * 将项目加到父项目的项目角色中 + */ + private void saveProjectVirtualRole(SysProject thisProject,Long projectParentId){ + //获取项目下的“普通成员”一级角色的id + Long parentId; + ProRoleExample proRoleExample = new ProRoleExample(); + proRoleExample.createCriteria().andProjectIdEqualTo(projectParentId).andNameEqualTo(WebConstant.ROLE_NAME.ProjectVirtualRole.value); + List memberRoleList = proRoleDao.selectByExample(proRoleExample); + if(CollectionUtil.isNotEmpty(memberRoleList)){ + parentId = memberRoleList.get(0).getId(); + }else { + //添加一个角色项目的一级角色 + ProRole firstRole = new ProRole(); + firstRole.setId(snowflake.nextId()); + firstRole.setProjectId(projectParentId); + firstRole.setName(WebConstant.ROLE_NAME.ProjectVirtualRole.value); + firstRole.setDescription(WebConstant.ROLE_NAME.ProjectVirtualRole.phase); + proRoleDao.insertSelective(firstRole); + parentId = firstRole.getId(); + } + //添加角色 + ProRole proRole = new ProRole(); + proRole.setId(snowflake.nextId()); + proRole.setName(thisProject.getName()); + proRole.setParentId(parentId); + proRole.setProjectId(projectParentId); + proRole.setRelevanceProjectId(thisProject.getId()); + proRoleDao.insertSelective(proRole); + } /** * 根据标签查找项目 diff --git a/tall/src/main/java/com/ccsens/tall/service/SysPluginService.java b/tall/src/main/java/com/ccsens/tall/service/SysPluginService.java index 717c5dc7..20482654 100644 --- a/tall/src/main/java/com/ccsens/tall/service/SysPluginService.java +++ b/tall/src/main/java/com/ccsens/tall/service/SysPluginService.java @@ -1,7 +1,9 @@ package com.ccsens.tall.service; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.lang.Snowflake; import cn.hutool.core.util.ObjectUtil; +import com.ccsens.tall.bean.dto.PluginDto; import com.ccsens.tall.bean.po.*; import com.ccsens.tall.bean.vo.PluginVo; import com.ccsens.tall.persist.dao.*; @@ -12,6 +14,7 @@ import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.context.ContextLoaderListener; +import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; @@ -29,6 +32,22 @@ public class SysPluginService implements ISysPluginService{ private ProPluginSigninDao pluginSigninDao; @Autowired private SigninFieldDao signinFieldDao; + @Resource + private Snowflake snowflake; + + /** + * 添加插件 + * @param saveSysPlugin + */ + @Override + public void saveSysPlugin(PluginDto.SaveSysPlugin saveSysPlugin) { + SysPlugin sysPlugin = new SysPlugin(); + sysPlugin.setId(snowflake.nextId()); + sysPlugin.setName(saveSysPlugin.getName()); + sysPlugin.setDescription(saveSysPlugin.getDescription()); + sysPlugin.setShowType(saveSysPlugin.getShowType()); + sysPluginDao.insertSelective(sysPlugin); + } @Override public List getPluginAll() { diff --git a/tall/src/main/java/com/ccsens/tall/service/TaskPluginService.java b/tall/src/main/java/com/ccsens/tall/service/TaskPluginService.java index 6eb1a9f6..b5596ba3 100644 --- a/tall/src/main/java/com/ccsens/tall/service/TaskPluginService.java +++ b/tall/src/main/java/com/ccsens/tall/service/TaskPluginService.java @@ -19,7 +19,6 @@ import com.ccsens.util.exception.BaseException; import lombok.extern.slf4j.Slf4j; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; -import org.eclipse.jetty.util.log.Log; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @@ -51,6 +50,8 @@ public class TaskPluginService implements ITaskPluginService{ @Resource private ProRoleDao roleDao; @Resource + private ProMemberDao memberDao; + @Resource private IProMemberService proMemberService; @Resource private Snowflake snowflake; @@ -124,7 +125,6 @@ public class TaskPluginService implements ITaskPluginService{ return pluginList; } - /** * 添加评论 * @param addCommentPlugin 评论信息 @@ -350,28 +350,6 @@ public class TaskPluginService implements ITaskPluginService{ } }); } -// SysProject sysProject = sysProjectDao.selectByPrimaryKey(projectId); -// if(ObjectUtil.isNull(sysProject)){ -// throw new BaseException(CodeEnum.NOT_PROJECT); -// } -// //获取本周和上周的时间 -// long thisWeekStartTime = DateUtil.beginOfWeek(new Date()).getTime(); -// long thisWeekEndTime = DateUtil.endOfWeek(new Date()).getTime(); -// long lastWeekStartTime = DateUtil.beginOfWeek(new Date(thisWeekStartTime - 1)).getTime(); -// long lastWeekEndTime = DateUtil.endOfWeek(new Date(thisWeekStartTime - 1)).getTime(); -// //查找上周任务 -// List lastWeekTask = taskSubTimeDao.queryMinutesTaskByTime(projectId,lastWeekStartTime,lastWeekEndTime); -// //查找本周任务 -// List thisWeekTask = taskSubTimeDao.queryMinutesTaskByTime(projectId,thisWeekStartTime,thisWeekEndTime); -// //生成excel写入的数据 -// List> minutes = writeMinutes(lastWeekTask,thisWeekTask,sysProject.getName()); - //写入WBS -// ResourceLoader resourceLoader = new DefaultResourceLoader(); -// InputStream is = resourceLoader.getResource("classpath:template/regularMeetingTemplate.xlsx").getInputStream(); -// XSSFWorkbook wb = new XSSFWorkbook(is); - -// PoiUtil.exportWB("会议记录", minutes, wb); -// PoiUtil.setImg(wb,"会议记录",logo,0,1,0,1); //生成文件 String name = "会议记录"+DateUtil.today() + ".xlsx"; @@ -738,9 +716,11 @@ public class TaskPluginService implements ITaskPluginService{ /** * 修改插件配置 * @param updatePluginConfig 插件配置 + * @return */ @Override - public void updatePluginConfig(PluginDto.UpdatePluginConfig updatePluginConfig) { + public TaskVo.PluginVo updatePluginConfig(PluginDto.UpdatePluginConfig updatePluginConfig) { + TaskVo.PluginVo pluginVo = new TaskVo.PluginVo(); //获取任务详情id Long taskDetailId = updatePluginConfig.getTaskId(); ProTaskSubTime taskSubTime = taskSubTimeDao.selectByPrimaryKey(updatePluginConfig.getTaskId()); @@ -752,6 +732,13 @@ public class TaskPluginService implements ITaskPluginService{ ProTaskPlugin taskPlugin = taskPluginDao.selectByPrimaryKey(updatePluginConfig.getTaskPluginId()); if(ObjectUtil.isNotNull(taskPlugin)){ sysPluginId = taskPlugin.getPluginId(); + SysPlugin sysPlugin = sysPluginDao.selectByPrimaryKey(sysPluginId); + if(ObjectUtil.isNotNull(sysPlugin)){ + pluginVo.setId(sysPlugin.getId().toString()); + pluginVo.setName(sysPlugin.getName()); + pluginVo.setDescription(sysPlugin.getDescription()); + pluginVo.setShowType(sysPlugin.getShowType().toString()); + } } //查找原来的插件配置 ProPluginConfigExample proPluginConfigExample = new ProPluginConfigExample(); @@ -775,6 +762,9 @@ public class TaskPluginService implements ITaskPluginService{ } proPluginConfigDao.updateByPrimaryKeySelective(pluginConfig); } + pluginVo.setWebPath(pluginConfig.getWebPath()); + pluginVo.setImportParam(pluginConfig.getImportParam()); + pluginVo.setRoutineLocation(pluginConfig.getRoutineLocation()); } else { //没有则添加 ProPluginConfig proPluginConfig = new ProPluginConfig(); @@ -794,7 +784,37 @@ public class TaskPluginService implements ITaskPluginService{ proPluginConfig.setRoutineLocation(updatePluginConfig.getRoutineLocation()); } proPluginConfigDao.insertSelective(proPluginConfig); + pluginVo.setWebPath(proPluginConfig.getWebPath()); + pluginVo.setImportParam(proPluginConfig.getImportParam()); + pluginVo.setRoutineLocation(proPluginConfig.getRoutineLocation()); } + return pluginVo; + } + /** + * (特殊处理插件)个人任务汇报插件 + * 当没有入参的时候默认查询管理者wbs项目理的所有的成员和项目 + */ + @Override + public PluginVo.PersonalTaskReport getPersonalTaskReport(Long projectId){ + PluginVo.PersonalTaskReport personalTaskReport = new PluginVo.PersonalTaskReport(); + + SysProject sysProject = sysProjectDao.selectByPrimaryKey(projectId); + if(ObjectUtil.isNotNull(sysProject) && ObjectUtil.isNotNull(sysProject.getParentId()) && sysProject.getParentId() != 0){ + //查找该项目(周会项目)的父项目的成员 + List reportMemberList = memberDao.queryMemberByProjectId(sysProject.getParentId()); + if(CollectionUtil.isNotEmpty(reportMemberList)){ + personalTaskReport.setMemberList(reportMemberList); + } + //查找父项目下的所有子项目除去当前项目 + List reportProjectList = sysProjectDao.queryProjectByParentIdAndNotOwn(sysProject.getParentId(),sysProject.getId()); + if(CollectionUtil.isNotEmpty(reportProjectList)){ + personalTaskReport.setProjectList(reportProjectList); + } + } + //添加一个默认话术“本周的第X个工作计划是XXX,重点是XXX” + personalTaskReport.setVerbalTrick("本周的第X个工作计划是XXX,重点是XXX"); + return personalTaskReport; } + } diff --git a/tall/src/main/java/com/ccsens/tall/service/WeekMeetingService.java b/tall/src/main/java/com/ccsens/tall/service/WeekMeetingService.java new file mode 100644 index 00000000..f1c823d2 --- /dev/null +++ b/tall/src/main/java/com/ccsens/tall/service/WeekMeetingService.java @@ -0,0 +1,355 @@ +package com.ccsens.tall.service; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.ccsens.tall.bean.dto.WeekMeetingDto; +import com.ccsens.tall.bean.po.*; +import com.ccsens.tall.bean.vo.PluginVo; +import com.ccsens.tall.bean.vo.TaskVo; +import com.ccsens.tall.persist.dao.*; +import com.ccsens.tall.util.TallConstant; +import com.ccsens.util.JacksonUtil; +import com.ccsens.util.PoiUtil; +import com.ccsens.util.PropUtil; +import com.ccsens.util.WebConstant; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @author 逗 + */ +@Slf4j +@Service +@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) +public class WeekMeetingService implements IWeekMeetingService{ + @Resource + private SysProjectDao sysProjectDao; + @Resource + private TaskSubTimeDao taskSubTimeDao; + @Resource + private ProMemberDao proMemberDao; + @Resource + private SysDomainDao sysDomainDao; + @Resource + private SysPluginDao sysPluginDao; + @Resource + private ProPluginConfigDao proPluginConfigDao; + @Resource + private ITaskPluginService taskPluginService; + + /** + * 查找周会要用到的项目 + * @param projectId 周会项目id + * @param userId userId + * @return 返回项目id和名字 + */ + @Override + public List queryWeekUserProject(Long projectId, Long userId) { + SysProject sysProject = sysProjectDao.selectByPrimaryKey(projectId); + List reportProjectList = null; + if(ObjectUtil.isNotNull(sysProject)){ + reportProjectList = sysProjectDao.queryProjectByParentIdAndNotOwn(sysProject.getParentId(),sysProject.getId()); + } + //查找父项目下的所有子项目除去当前项目 + return reportProjectList; + } + + /** + * 查找项目本周任务 + * @param projectId 项目id + * @return 返回项目的本周任务 + */ + @Override + public List queryWeekTaskByProject(Long projectId) { + long thisWeekStartTime = DateUtil.beginOfWeek(new Date()).getTime(); + long thisWeekEndTime = DateUtil.endOfWeek(new Date()).getTime(); + + return taskSubTimeDao.queryMinutesTaskByTime(projectId,thisWeekStartTime,thisWeekEndTime); + } + + /** + * 查找个人本周任务 + * @param param 成员id和项目id + * @return 返回当前成员在这些项目中本周的任务 + */ + @Override + public List queryWeekTaskByMemberAndProject(WeekMeetingDto.WeekTaskByMemberAndProject param) throws IOException { + List taskList = new ArrayList<>(); + long thisWeekStartTime = DateUtil.beginOfWeek(new Date()).getTime(); + long thisWeekEndTime = DateUtil.endOfWeek(new Date()).getTime(); + ProMember member = proMemberDao.selectByPrimaryKey(param.getMemberId()); + if(ObjectUtil.isNotNull(member) && ObjectUtil.isNotNull(member.getUserId()) && member.getUserId() != 0){ + //查找关联的项目(通过插件的入参查找) + PluginVo.PersonalTaskReport taskReportByTaskId = getTaskReportByTaskId(param.getTaskId(), param.getProjectId()); + //查找每个项目 + if(CollectionUtil.isNotEmpty(taskReportByTaskId.getProjectList())){ + taskReportByTaskId.getProjectList().forEach(project ->{ + List taskMinutesWpsList = taskSubTimeDao.queryWeekTaskByMemberAndProject(project.getProjectId(),member.getUserId(),thisWeekStartTime,thisWeekEndTime); + if(CollectionUtil.isNotEmpty(taskMinutesWpsList)){ + taskList.addAll(taskMinutesWpsList); + } + }); + } + } + return taskList; + } + + @Override + public String getCcMinutes(Long userId, WeekMeetingDto.WeekMeetingMinutes param) throws IOException { + //根据域名查找公司logo + String logo = "/home/staticrec/logo.png"; + if(StrUtil.isNotEmpty(param.getDomainName())) { + SysDomainExample domainExample = new SysDomainExample(); + domainExample.createCriteria().andDomainNameEqualTo(param.getDomainName()); + List sysDomainList = sysDomainDao.selectByExample(domainExample); + if (CollectionUtil.isNotEmpty(sysDomainList)) { + logo = sysDomainList.get(0).getLogoPath(); + } + } + log.info("获取公司logo:{}",logo); + //获取本周的开始和结束时间 + long thisWeekStartTime = DateUtil.beginOfWeek(new Date()).getTime(); + long thisWeekEndTime = DateUtil.endOfWeek(new Date()).getTime(); + + //生成一个excel文件 + XSSFWorkbook workbook = new XSSFWorkbook(); + //获取周会用到的项目 + List projectList = queryWeekUserProject(param.getProjectId(), userId); + log.info("导出模板-获取周会用到的项目:{}",projectList); + //生成第一个sheet(项目汇报) + List> projectMinutes = writeProjectMinutes(projectList,thisWeekStartTime,thisWeekEndTime); + PoiUtil.exportWB("项目汇报", projectMinutes, workbook); + PoiUtil.setImg(workbook,"项目汇报", logo,0,1,0,1); + + //通过个人汇报的任务id查找插件的入参(汇报的成员和项目id) + PluginVo.PersonalTaskReport taskReport = getTaskReportByTaskId(param.getTaskId(),param.getProjectId()); + if(CollectionUtil.isNotEmpty(taskReport.getMemberList())){ + taskReport.getMemberList().forEach(reportMember -> { + //生成每个成员汇报的任务 + List> memberMinutes = writeMemberTaskMinutes(reportMember,taskReport.getProjectList(),thisWeekStartTime,thisWeekEndTime); + PoiUtil.exportWB(reportMember.getMemberName(), memberMinutes, workbook); + }); + } + + //生成文件 + String fileName = "minutes/" + DateUtil.today() + "/" + System.currentTimeMillis() + ".xlsx"; + String path = PropUtil.path + fileName; + File tmpFile = new File(path); + if (!tmpFile.getParentFile().exists()) { + tmpFile.getParentFile().mkdirs(); + } + OutputStream stream = new FileOutputStream(tmpFile); + workbook.write(stream); + stream.close(); + + return PropUtil.imgDomain + "/" + fileName; + } + + /** + * 生成个人汇报的任务 + * @param reportMember + * @param projectList + * @param thisWeekStartTime + * @param thisWeekEndTime + * @return + */ + private List> writeMemberTaskMinutes(PluginVo.ReportMember reportMember, List projectList, long thisWeekStartTime, long thisWeekEndTime) { + List> sheet = new ArrayList<>(); + //logo 和标题 + List headerTitle = new ArrayList<>(); + headerTitle.add(new PoiUtil.PoiUtilCell("个人任务汇报-"+reportMember.getMemberName(),7,1)); + sheet.add(headerTitle); + //任务表头 + List projectTitle = new ArrayList<>(); + projectTitle.add(new PoiUtil.PoiUtilCell("项目名",1,1)); + projectTitle.add(new PoiUtil.PoiUtilCell("任务名",1,1)); + projectTitle.add(new PoiUtil.PoiUtilCell("计划开始时间",1,1)); + projectTitle.add(new PoiUtil.PoiUtilCell("计划结束时间",1,1)); + projectTitle.add(new PoiUtil.PoiUtilCell("实际开始时间",1,1)); + projectTitle.add(new PoiUtil.PoiUtilCell("实际结束时间",1,1)); + projectTitle.add(new PoiUtil.PoiUtilCell("负责人",1,1)); + sheet.add(projectTitle); + if(CollectionUtil.isNotEmpty(projectList)){ + projectList.forEach(project ->{ + SysProject sysProject = sysProjectDao.selectByPrimaryKey(project.getProjectId()); + if(ObjectUtil.isNotNull(sysProject)){ + //查找成员在这个项目内的任务 + List taskMinutesWpsList = new ArrayList<>(); + ProMember member = proMemberDao.selectByPrimaryKey(reportMember.getMemberId()); + if(ObjectUtil.isNotNull(member) && ObjectUtil.isNotNull(member.getUserId()) && member.getUserId() != 0) { + taskMinutesWpsList = taskSubTimeDao.queryWeekTaskByMemberAndProject(sysProject.getId(), member.getUserId(), thisWeekStartTime, thisWeekEndTime); + } + + if(CollectionUtil.isNotEmpty(taskMinutesWpsList)){ + int i = 0; + for (TaskVo.TaskMinutesWps weekTask : taskMinutesWpsList) { + List lastWeekValue = new ArrayList<>(); + if(i == 0){ + lastWeekValue.add(new PoiUtil.PoiUtilCell(project.getProjectName(),1,taskMinutesWpsList.size())); + }else { + lastWeekValue.add(new PoiUtil.PoiUtilCell()); + } + lastWeekValue.add(new PoiUtil.PoiUtilCell(weekTask.getTaskName())); + lastWeekValue.add(new PoiUtil.PoiUtilCell(weekTask.getBeginTime())); + lastWeekValue.add(new PoiUtil.PoiUtilCell(weekTask.getEndTime())); + lastWeekValue.add(new PoiUtil.PoiUtilCell(weekTask.getRealBeginTime())); + lastWeekValue.add(new PoiUtil.PoiUtilCell(weekTask.getRealEndTime())); + lastWeekValue.add(new PoiUtil.PoiUtilCell(weekTask.getExecutorRoleName())); + sheet.add(lastWeekValue); + i++; + } + } + } + }); + } + return sheet; + } + + /** + * 查找个人会报任务里的成员和项目 + * @param taskId + * @param projectId + * @return + */ + private PluginVo.PersonalTaskReport getTaskReportByTaskId(Long taskId,Long projectId) throws IOException { + PluginVo.PersonalTaskReport personalTaskReport = new PluginVo.PersonalTaskReport(); + //插件入参 + String importParam = null; + if(ObjectUtil.isNotNull(taskId)) { + //获取任务详情id + Long taskDetailId = taskId; + ProTaskSubTime proTaskSubTime = taskSubTimeDao.selectByPrimaryKey(taskId); + if (ObjectUtil.isNotNull(proTaskSubTime)) { + taskDetailId = proTaskSubTime.getTaskDetailId(); + } + //查找“个人汇报”插件 + long pluginId = 0; + SysPluginExample sysPluginExample = new SysPluginExample(); + sysPluginExample.createCriteria().andNameEqualTo(TallConstant.PERSONAL_TASK_REPORT); + List sysPluginList = sysPluginDao.selectByExample(sysPluginExample); + if (CollectionUtil.isNotEmpty(sysPluginList)) { + pluginId = sysPluginList.get(0).getId(); + } + + ProPluginConfigExample proPluginConfigExample = new ProPluginConfigExample(); + proPluginConfigExample.createCriteria().andTaskIdEqualTo(taskDetailId).andPluginIdEqualTo(pluginId); + List pluginConfigList = proPluginConfigDao.selectByExample(proPluginConfigExample); + if (CollectionUtil.isNotEmpty(pluginConfigList)) { + importParam = pluginConfigList.get(0).getImportParam(); + } + } + if(StrUtil.isNotEmpty(importParam)){ + personalTaskReport = JacksonUtil.jsonToBean(importParam,PluginVo.PersonalTaskReport.class); + }else { + taskPluginService.getPersonalTaskReport(projectId); + } + return personalTaskReport; + } + + /** + * 生成项目汇报的数据 + * @param projectList 项目列表 + * @return 返回写入的数据 + */ + private List> writeProjectMinutes(List projectList,long thisWeekStartTime,long thisWeekEndTime) { + List> sheet = new ArrayList<>(); + //logo 和标题 + List headerTitle = new ArrayList<>(); + headerTitle.add(new PoiUtil.PoiUtilCell("",1,1,1650,18)); + headerTitle.add(new PoiUtil.PoiUtilCell("项目汇报",7,1)); + sheet.add(headerTitle); + //会议时间和主持人 + List header1 = new ArrayList<>(); + header1.add(new PoiUtil.PoiUtilCell("会议时间")); + header1.add(new PoiUtil.PoiUtilCell("",3,1)); + header1.add(new PoiUtil.PoiUtilCell()); + header1.add(new PoiUtil.PoiUtilCell()); + header1.add(new PoiUtil.PoiUtilCell("主持人")); + header1.add(new PoiUtil.PoiUtilCell("",3,1)); + sheet.add(header1); + //参会人员 + List header2 = new ArrayList<>(); + header2.add(new PoiUtil.PoiUtilCell("参会人员",1,1)); + header2.add(new PoiUtil.PoiUtilCell("",7,1)); + sheet.add(header2); + //主题议题 + List header3 = new ArrayList<>(); + header3.add(new PoiUtil.PoiUtilCell("主题议题",1,1)); + header3.add(new PoiUtil.PoiUtilCell("",7,1)); + sheet.add(header3); + //再空一行 + List header4 = new ArrayList<>(); + header4.add(new PoiUtil.PoiUtilCell("",8,1)); + sheet.add(header4); +// //会议记录内容 +// List minutesValue = new ArrayList<>(); +// minutesValue.add(new PoiUtil.PoiUtilCell("会议记录内容",8,1)); +// sheet.add(minutesValue); + //任务表头 + List projectTitle = new ArrayList<>(); + projectTitle.add(new PoiUtil.PoiUtilCell("项目名",1,1)); + projectTitle.add(new PoiUtil.PoiUtilCell("任务名",1,1)); + projectTitle.add(new PoiUtil.PoiUtilCell("计划开始时间",1,1)); + projectTitle.add(new PoiUtil.PoiUtilCell("计划结束时间",1,1)); + projectTitle.add(new PoiUtil.PoiUtilCell("实际开始时间",1,1)); + projectTitle.add(new PoiUtil.PoiUtilCell("实际结束时间",1,1)); + projectTitle.add(new PoiUtil.PoiUtilCell("负责人",1,1)); + sheet.add(projectTitle); + if(CollectionUtil.isNotEmpty(projectList)){ + projectList.forEach(project ->{ + SysProject sysProject = sysProjectDao.selectByPrimaryKey(project.getProjectId()); + if(ObjectUtil.isNotNull(sysProject)){ + List weekTaskList = taskSubTimeDao.queryMinutesTaskByTime(sysProject.getId(), thisWeekStartTime, thisWeekEndTime); + log.info("查找项目内的本周任务:{}",weekTaskList); + if(CollectionUtil.isNotEmpty(weekTaskList)){ + int i = 0; + for (TaskVo.TaskMinutesWps weekTask : weekTaskList) { + List lastWeekValue = new ArrayList<>(); + if(i == 0){ + lastWeekValue.add(new PoiUtil.PoiUtilCell(project.getProjectName(),1,weekTaskList.size())); + }else { + lastWeekValue.add(new PoiUtil.PoiUtilCell()); + } + lastWeekValue.add(new PoiUtil.PoiUtilCell(weekTask.getTaskName())); + lastWeekValue.add(new PoiUtil.PoiUtilCell(weekTask.getBeginTime())); + lastWeekValue.add(new PoiUtil.PoiUtilCell(weekTask.getEndTime())); + lastWeekValue.add(new PoiUtil.PoiUtilCell(weekTask.getRealBeginTime())); + lastWeekValue.add(new PoiUtil.PoiUtilCell(weekTask.getRealEndTime())); + lastWeekValue.add(new PoiUtil.PoiUtilCell(weekTask.getExecutorRoleName())); + sheet.add(lastWeekValue); + i++; + } + } + } + }); + } + //会议记录人和领导签字 + List end = new ArrayList<>(); + end.add(new PoiUtil.PoiUtilCell("会议记录人",1,1)); + end.add(new PoiUtil.PoiUtilCell("",3,1)); + end.add(new PoiUtil.PoiUtilCell()); + end.add(new PoiUtil.PoiUtilCell()); + end.add(new PoiUtil.PoiUtilCell("负责人签字",1,1)); + end.add(new PoiUtil.PoiUtilCell("",3,1)); + sheet.add(end); + //备注留白 + List remark = new ArrayList<>(); + remark.add(new PoiUtil.PoiUtilCell("",8,8)); + sheet.add(remark); + return sheet; + } +} diff --git a/tall/src/main/java/com/ccsens/tall/util/TallConstant.java b/tall/src/main/java/com/ccsens/tall/util/TallConstant.java index 2d0d8543..69c3815e 100644 --- a/tall/src/main/java/com/ccsens/tall/util/TallConstant.java +++ b/tall/src/main/java/com/ccsens/tall/util/TallConstant.java @@ -11,6 +11,8 @@ public class TallConstant { public static final String UPDATE_NICKNAME = "update_nickname_"; /*** redis key: 查找登陆用户 格式 identifier_login_identifyType 有效期一天*/ public static final String LOGIN = "_login_"; + /*** (需要特殊处理的插件)个人任务汇报插件*/ + public static final String PERSONAL_TASK_REPORT = "personal_task_report"; /***一天 */ public static final long LOGIN_TIME = 60 * 60 * 24; diff --git a/tall/src/main/java/com/ccsens/tall/web/MemberController.java b/tall/src/main/java/com/ccsens/tall/web/MemberController.java index c9cbcc8a..0c2890c6 100644 --- a/tall/src/main/java/com/ccsens/tall/web/MemberController.java +++ b/tall/src/main/java/com/ccsens/tall/web/MemberController.java @@ -79,4 +79,16 @@ public class MemberController { return JsonResponse.newInstance().ok(attentionInfo); } + @ApiOperation(value = "查找项目内的所有成员(不包含奖惩干系人)",notes = "") + @ApiImplicitParams({ + }) + @RequestMapping(value = "/query/all", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) + public JsonResponse queryMembersByProjectId(HttpServletRequest request, + @ApiParam @Validated @RequestBody ProjectDto.ProjectIdDto projectIdDto) { + Long currentUserId = Long.valueOf(((Claims) request.getAttribute(WebConstant.REQUEST_KEY_CLAIMS)).getSubject()); + List membersInfo = proMemberService.queryMembersByProjectId(projectIdDto.getProjectId()); + return JsonResponse.newInstance().ok(membersInfo); + } + + } diff --git a/tall/src/main/java/com/ccsens/tall/web/PluginController.java b/tall/src/main/java/com/ccsens/tall/web/PluginController.java index 9381578f..3d120009 100644 --- a/tall/src/main/java/com/ccsens/tall/web/PluginController.java +++ b/tall/src/main/java/com/ccsens/tall/web/PluginController.java @@ -1,7 +1,9 @@ package com.ccsens.tall.web; import com.ccsens.tall.bean.dto.PluginDto; +import com.ccsens.tall.bean.dto.WeekMeetingDto; import com.ccsens.tall.bean.vo.PluginVo; +import com.ccsens.tall.bean.vo.TaskVo; import com.ccsens.tall.service.ISysPluginService; import com.ccsens.tall.service.ITaskPluginService; import com.ccsens.util.JsonResponse; @@ -9,13 +11,14 @@ import com.ccsens.util.WebConstant; import com.ccsens.util.annotation.OperateType; import io.jsonwebtoken.Claims; import io.swagger.annotations.*; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import java.util.List; - +@Slf4j @Api(tags = "插件相关", description = "") @RestController @RequestMapping("/plugins") @@ -25,6 +28,18 @@ public class PluginController { @Autowired private ISysPluginService sysPluginService; + @ApiOperation(value = "添加插件", notes = "") + @ApiImplicitParams({ + }) + @RequestMapping(value = "/save", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) + public JsonResponse saveSysPlugin(HttpServletRequest request, @ApiParam @Validated @RequestBody PluginDto.SaveSysPlugin saveSysPlugin) throws Exception { + log.info("添加一个插件:{}",saveSysPlugin); + sysPluginService.saveSysPlugin(saveSysPlugin); + return JsonResponse.newInstance().ok(); + } + + + @ApiOperation(value = "查询所有插件", notes = "按照优先级倒序+时间正序排序") @ApiImplicitParams({ }) @@ -187,8 +202,10 @@ public class PluginController { @ApiImplicitParams({ }) @RequestMapping(value = "/config", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) - public JsonResponse updatePluginConfig(HttpServletRequest request,@ApiParam @Validated @RequestBody PluginDto.UpdatePluginConfig updatePluginConfig) throws Exception { - taskPluginService.updatePluginConfig(updatePluginConfig); - return JsonResponse.newInstance().ok(); + public JsonResponse updatePluginConfig(HttpServletRequest request, @ApiParam @Validated @RequestBody PluginDto.UpdatePluginConfig updatePluginConfig) throws Exception { + TaskVo.PluginVo pluginVo = taskPluginService.updatePluginConfig(updatePluginConfig); + return JsonResponse.newInstance().ok(pluginVo); } + + } diff --git a/tall/src/main/java/com/ccsens/tall/web/ProjectController.java b/tall/src/main/java/com/ccsens/tall/web/ProjectController.java index 81790e45..8ba3206c 100644 --- a/tall/src/main/java/com/ccsens/tall/web/ProjectController.java +++ b/tall/src/main/java/com/ccsens/tall/web/ProjectController.java @@ -111,30 +111,6 @@ public class ProjectController { return JsonResponse.newInstance().ok(membersByProjects); } -// @ApiOperation(value = "根据角色id获取日程(任务列表 + 插件列表)",notes = "") -// @ApiImplicitParams({ -// @ApiImplicitParam(name = "id", value = "项目Id", required = true, paramType = "path"), -// @ApiImplicitParam(name = "roleId", value = "角色Id", required = true, paramType = "query"), -// @ApiImplicitParam(name = "startTime", value = "开始时间", required = true, paramType = "query"), -// @ApiImplicitParam(name = "endTime", value = "结束时间", required = true, paramType = "query"), -// @ApiImplicitParam(name = "process", value = "完成状态 0全部,1完成,2未完成", required = true, paramType = "query"), -// @ApiImplicitParam(name = "page", value = "页数", required = true, paramType = "query"), -// @ApiImplicitParam(name = "priority", value = "优先级排序 0无 1倒叙(优先级高的在前) 2正序", required = true, paramType = "query") -// }) -// @RequestMapping(value = "/{id}/tasks", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"}) -// public JsonResponse getTasksByRoleId(HttpServletRequest request, -// @PathVariable("id") Long projectId, -// @RequestParam(required = true) Long roleId, Integer page, -// Long startTime, Long endTime, Integer process,Integer priority) throws Exception{ -// Integer pageSize = 10; -// page = page == null ? 1 : page; -// process = process == null ? 0 : process; -// priority = priority == null ? 0 :priority; -// -// Long currentUserId = Long.valueOf(((Claims) request.getAttribute(WebConstant.REQUEST_KEY_CLAIMS)).getSubject()); -// Object proTaskInfo = taskDetailService.getTasksByRoleId(currentUserId,projectId,roleId,startTime,endTime,process,page,pageSize,priority); -// return JsonResponse.newInstance().ok(proTaskInfo); -// } @ApiOperation(value = "根据角色id获取日程(任务列表 + 插件列表)",notes = "") @ApiImplicitParams({ diff --git a/tall/src/main/java/com/ccsens/tall/web/RoleController.java b/tall/src/main/java/com/ccsens/tall/web/RoleController.java index 2544227f..29405bbe 100644 --- a/tall/src/main/java/com/ccsens/tall/web/RoleController.java +++ b/tall/src/main/java/com/ccsens/tall/web/RoleController.java @@ -103,5 +103,15 @@ public class RoleController { return JsonResponse.newInstance().ok(taskListByProjectIdList); } + @ApiOperation(value = "修改用户可见角色展示",notes = "") + @ApiImplicitParams({ + }) + @RequestMapping(value = "/update/show", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) + public JsonResponse updateRoleShow(HttpServletRequest request, + @ApiParam @Validated @RequestBody RoleDto.UpdateRoleShow roleShow) throws Exception { + Long currentUserId = Long.valueOf(((Claims) request.getAttribute(WebConstant.REQUEST_KEY_CLAIMS)).getSubject()); + proRoleService.updateRoleShow(currentUserId,roleShow); + return JsonResponse.newInstance().ok(); + } } diff --git a/tall/src/main/java/com/ccsens/tall/web/WeekMeetingController.java b/tall/src/main/java/com/ccsens/tall/web/WeekMeetingController.java new file mode 100644 index 00000000..557d620a --- /dev/null +++ b/tall/src/main/java/com/ccsens/tall/web/WeekMeetingController.java @@ -0,0 +1,79 @@ +package com.ccsens.tall.web; + +import com.ccsens.cloudutil.annotation.MustLogin; +import com.ccsens.tall.bean.dto.WeekMeetingDto; +import com.ccsens.tall.bean.vo.PluginVo; +import com.ccsens.tall.bean.vo.TaskVo; +import com.ccsens.tall.service.IWeekMeetingService; +import com.ccsens.util.JsonResponse; +import com.ccsens.util.bean.dto.QueryDto; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +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 java.io.IOException; +import java.util.List; + +/** + * @author 逗 + */ +@Slf4j +@Api(tags = "周会相关" , description = "") +@RestController +@RequestMapping("/weekMeeting") +public class WeekMeetingController { + @Resource + private IWeekMeetingService weekMeetingService; + + @MustLogin + @ApiOperation(value = "获取周会用的项目(管理者项目的子项目内的除了周会的所有项目)",notes = "") + @RequestMapping(value = "/project", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) + public JsonResponse> queryWeekUserProject(@ApiParam @Validated @RequestBody QueryDto param) { + log.info("获取周会用的项目:{}", param); + List projectInfoList = weekMeetingService.queryWeekUserProject(param.getParam().getProjectId(), param.getUserId()); + log.info("查询到的项目列表:{}", projectInfoList); + return JsonResponse.newInstance().ok(projectInfoList); + } + + @MustLogin + @ApiOperation(value = "查找项目本周的任务",notes = "获取未读消息数") + @RequestMapping(value = "/week/task", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) + public JsonResponse> queryWeekTaskByProject(@ApiParam @Validated @RequestBody QueryDto param) { + log.info("查找项目本周的任务:{}", param); + //查找本周任务 + List thisWeekTask = weekMeetingService.queryWeekTaskByProject(param.getParam().getProjectId()); + log.info("项目本周的任务:{}", thisWeekTask); + return JsonResponse.newInstance().ok(thisWeekTask); + } + + @MustLogin + @ApiOperation(value = "根据成员和项目查找本周任务",notes = "获取未读消息数") + @RequestMapping(value = "/member/task", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) + public JsonResponse> queryWeekTaskByMemberAndProject( + @ApiParam @Validated @RequestBody QueryDto param) throws IOException { + log.info("根据成员和项目查找本周任务:{}", param); + //查找本周任务 + List thisWeekTask = weekMeetingService.queryWeekTaskByMemberAndProject(param.getParam()); + log.info("根据成员和项目查找本周任务:{}", thisWeekTask); + return JsonResponse.newInstance().ok(thisWeekTask); + } + + + @MustLogin + @ApiOperation(value = "会议纪要表-传控模板", notes = "") + @RequestMapping(value = "/cc/minutes", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) + public JsonResponse getCcMinutes(@ApiParam @Validated @RequestBody QueryDto param) throws IOException { + log.info("生成会议纪要表-传控模板:{}", param); + String path = weekMeetingService.getCcMinutes(param.getUserId(),param.getParam()); + log.info("返回会议纪要表-传控模板路径:{}", path); + return JsonResponse.newInstance().ok(path); + } + +} diff --git a/tall/src/main/resources/application.yml b/tall/src/main/resources/application.yml index b2acd365..4fc2efe4 100644 --- a/tall/src/main/resources/application.yml +++ b/tall/src/main/resources/application.yml @@ -1,4 +1,4 @@ spring: profiles: - active: dev - include: util-dev,common + active: prod + include: util-prod,common diff --git a/tall/src/main/resources/mapper_dao/ProMemberDao.xml b/tall/src/main/resources/mapper_dao/ProMemberDao.xml index ac2771e7..5e2c6916 100644 --- a/tall/src/main/resources/mapper_dao/ProMemberDao.xml +++ b/tall/src/main/resources/mapper_dao/ProMemberDao.xml @@ -299,4 +299,38 @@ limit 1 + + + \ No newline at end of file diff --git a/tall/src/main/resources/mapper_dao/SysPluginDao.xml b/tall/src/main/resources/mapper_dao/SysPluginDao.xml index 147eb435..c684094e 100644 --- a/tall/src/main/resources/mapper_dao/SysPluginDao.xml +++ b/tall/src/main/resources/mapper_dao/SysPluginDao.xml @@ -98,6 +98,7 @@ + \ No newline at end of file diff --git a/tall/src/main/resources/mapper_dao/TaskDetailDao.xml b/tall/src/main/resources/mapper_dao/TaskDetailDao.xml index 8c62ff37..323ed68f 100644 --- a/tall/src/main/resources/mapper_dao/TaskDetailDao.xml +++ b/tall/src/main/resources/mapper_dao/TaskDetailDao.xml @@ -105,7 +105,7 @@ p.id IS NULL ) LEFT JOIN t_sys_plugin sp ON sp.id = p.plugin_id - left join t_pro_plugin_config c on d.id = c.task_id + left join t_pro_plugin_config c on d.id = c.task_id and c.plugin_id = 0 WHERE d.rec_status = 0 and @@ -190,7 +190,7 @@ p.id IS NULL ) LEFT JOIN t_sys_plugin sp ON sp.id = p.plugin_id - left join t_pro_plugin_config c on d.id = c.task_id + left join t_pro_plugin_config c on d.id = c.task_id and c.plugin_id = 0 WHERE d.rec_status = 0 and @@ -562,6 +562,12 @@ LEFT JOIN t_pro_task_deliver d on t.id = d.task_detail_id WHERE t.parent_id = #{parentTaskId} + + AND t.begin_time <= #{endTime} + + + AND t.end_time >= #{beginTime} + and t.milestone = #{milestone} diff --git a/tall/src/main/resources/mapper_dao/TaskSubTimeDao.xml b/tall/src/main/resources/mapper_dao/TaskSubTimeDao.xml index 1ad2a0f8..e1d7271c 100644 --- a/tall/src/main/resources/mapper_dao/TaskSubTimeDao.xml +++ b/tall/src/main/resources/mapper_dao/TaskSubTimeDao.xml @@ -10,6 +10,10 @@ + + + + @@ -17,8 +21,9 @@ - + + @@ -182,6 +187,7 @@ s.id as taskSubTimeId, r.`name` as executorRoleName, d.`name` as taskName, + d.milestone as milestone, FROM_UNIXTIME(s.begin_time/1000,'%Y-%m-%d %H:%m') as beginTime, FROM_UNIXTIME(s.end_time/1000,'%Y-%m-%d %H:%m') as endTime, if(s.real_begin_time = 0,'' ,FROM_UNIXTIME(s.real_begin_time/1000,'%Y-%m-%d %H:%m')) as realBeginTime, @@ -191,7 +197,8 @@ t.commentValue as commentValue, td.`name` as deliverName, n.deliverPath as deliverPath, - td.id as deliverId + td.id as deliverId, + s.complated_status as process FROM t_pro_task_sub_time s LEFT JOIN t_pro_task_detail d on s.task_detail_id = d.id LEFT JOIN t_pro_role r on d.executor_role = r.id @@ -216,9 +223,12 @@ SELECT dl.id as deliverLogPostId, dl.task_sub_time_id as taskId, - cf.path as deliverPath + cf.path as deliverPath, + AVG(ch.score) FROM t_pro_task_deliver_post_log dl LEFT JOIN t_sys_commited_file cf on cf.id = dl.file_id + LEFT JOIN t_pro_task_deliver_post_log_checker ch on ch.deliver_post_log_id = dl.id + GROUP BY dl.id )n on s.id = n.taskId WHERE d.rec_status = 0 @@ -230,5 +240,73 @@ s.end_time > #{startTime} and d.level != 1 + group by d.id + + \ No newline at end of file diff --git a/tall/src/main/resources/mapper_raw/ProUserAttentionRoleMapper.xml b/tall/src/main/resources/mapper_raw/ProUserAttentionRoleMapper.xml new file mode 100644 index 00000000..e7e77714 --- /dev/null +++ b/tall/src/main/resources/mapper_raw/ProUserAttentionRoleMapper.xml @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + id, project_id, user_id, role_id, created_at, updated_at, rec_status + + + + + delete from t_pro_user_attention_role + where id = #{id,jdbcType=BIGINT} + + + delete from t_pro_user_attention_role + + + + + + insert into t_pro_user_attention_role (id, project_id, user_id, + role_id, created_at, updated_at, + rec_status) + values (#{id,jdbcType=BIGINT}, #{projectId,jdbcType=BIGINT}, #{userId,jdbcType=BIGINT}, + #{roleId,jdbcType=BIGINT}, #{createdAt,jdbcType=TIMESTAMP}, #{updatedAt,jdbcType=TIMESTAMP}, + #{recStatus,jdbcType=TINYINT}) + + + insert into t_pro_user_attention_role + + + id, + + + project_id, + + + user_id, + + + role_id, + + + created_at, + + + updated_at, + + + rec_status, + + + + + #{id,jdbcType=BIGINT}, + + + #{projectId,jdbcType=BIGINT}, + + + #{userId,jdbcType=BIGINT}, + + + #{roleId,jdbcType=BIGINT}, + + + #{createdAt,jdbcType=TIMESTAMP}, + + + #{updatedAt,jdbcType=TIMESTAMP}, + + + #{recStatus,jdbcType=TINYINT}, + + + + + + update t_pro_user_attention_role + + + id = #{record.id,jdbcType=BIGINT}, + + + project_id = #{record.projectId,jdbcType=BIGINT}, + + + user_id = #{record.userId,jdbcType=BIGINT}, + + + role_id = #{record.roleId,jdbcType=BIGINT}, + + + created_at = #{record.createdAt,jdbcType=TIMESTAMP}, + + + updated_at = #{record.updatedAt,jdbcType=TIMESTAMP}, + + + rec_status = #{record.recStatus,jdbcType=TINYINT}, + + + + + + + + update t_pro_user_attention_role + set id = #{record.id,jdbcType=BIGINT}, + project_id = #{record.projectId,jdbcType=BIGINT}, + user_id = #{record.userId,jdbcType=BIGINT}, + role_id = #{record.roleId,jdbcType=BIGINT}, + created_at = #{record.createdAt,jdbcType=TIMESTAMP}, + updated_at = #{record.updatedAt,jdbcType=TIMESTAMP}, + rec_status = #{record.recStatus,jdbcType=TINYINT} + + + + + + update t_pro_user_attention_role + + + project_id = #{projectId,jdbcType=BIGINT}, + + + user_id = #{userId,jdbcType=BIGINT}, + + + role_id = #{roleId,jdbcType=BIGINT}, + + + created_at = #{createdAt,jdbcType=TIMESTAMP}, + + + updated_at = #{updatedAt,jdbcType=TIMESTAMP}, + + + rec_status = #{recStatus,jdbcType=TINYINT}, + + + where id = #{id,jdbcType=BIGINT} + + + update t_pro_user_attention_role + set project_id = #{projectId,jdbcType=BIGINT}, + user_id = #{userId,jdbcType=BIGINT}, + role_id = #{roleId,jdbcType=BIGINT}, + created_at = #{createdAt,jdbcType=TIMESTAMP}, + updated_at = #{updatedAt,jdbcType=TIMESTAMP}, + rec_status = #{recStatus,jdbcType=TINYINT} + where id = #{id,jdbcType=BIGINT} + + \ No newline at end of file diff --git a/util/src/main/java/com/ccsens/util/PoiUtil.java b/util/src/main/java/com/ccsens/util/PoiUtil.java index e16f4621..d7c0cd44 100644 --- a/util/src/main/java/com/ccsens/util/PoiUtil.java +++ b/util/src/main/java/com/ccsens/util/PoiUtil.java @@ -168,10 +168,11 @@ public class PoiUtil { newCell = row.createCell(j); } //查找当前单元格的样式 - CellStyle style = newCell.getCellStyle(); - if(ObjectUtil.isNull(style)){ - style = wb.createCellStyle(); - } +// CellStyle style = newCell.getCellStyle(); +// if(ObjectUtil.isNull(style)){ +// style = wb.createCellStyle(); +// } + CellStyle style = wb.createCellStyle(); //设置内容 if (!cell.value.equals(WebConstant.CELL_NULL)){ if(cell.num == 1){ @@ -623,7 +624,7 @@ public class PoiUtil { PoiUtilCell poiUtilCella = new PoiUtilCell(); PoiUtilCell poiUtilCellb = new PoiUtilCell(); PoiUtilCell poiUtilCell1 = new PoiUtilCell(); - poiUtilCell1.setValue("aaadddfff"); + poiUtilCell1.setValue("aaadddfffersdfsdfasftargadfgergsdfhasfgasfgaertagaergafdhsfgjfyk"); List cells = new ArrayList<>(); cells.add(poiUtilCell); @@ -655,9 +656,15 @@ public class PoiUtil { // cells5.add(new PoiUtilCell("9", 2, 2)); // cells5.add(new PoiUtilCell("9")); // list.add(cells5); + String fileName = "zzz/" + cn.hutool.core.date.DateUtil.today() + "/" + System.currentTimeMillis() + ".xlsx"; + String path = WebConstant.UPLOAD_PATH_BASE + fileName; + File tmpFile = new File(path); + if (!tmpFile.getParentFile().exists()) { + tmpFile.getParentFile().mkdirs(); + } Workbook wbs = exportWB("Sheet1", list, workbook); - OutputStream stream = new FileOutputStream(new File("F:\\wenjian\\"+System.currentTimeMillis()+".xlsx")); + OutputStream stream = new FileOutputStream(tmpFile); wbs.write(stream); stream.close(); diff --git a/util/src/main/java/com/ccsens/util/RedisUtil.java b/util/src/main/java/com/ccsens/util/RedisUtil.java index e4a9b300..eb416311 100644 --- a/util/src/main/java/com/ccsens/util/RedisUtil.java +++ b/util/src/main/java/com/ccsens/util/RedisUtil.java @@ -146,7 +146,7 @@ public class RedisUtil { * 递减 * * @param key 键 - * @param by 要减少几(小于0) + * @param delta 要减少几(小于0) * @return */ public long decr(String key, long delta) { @@ -496,7 +496,7 @@ public class RedisUtil { * @param time 时间(秒) * @return */ - public boolean lSet(String key, List value) { + public boolean lSet(String key, List value) { try { redisTemplate.opsForList().rightPushAll(key, value); return true;