diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/customer/domain/CustomerQuery.java b/ruoyi-service/src/main/java/com/ruoyi/bst/customer/domain/CustomerQuery.java index 5751b62..5716064 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/customer/domain/CustomerQuery.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/customer/domain/CustomerQuery.java @@ -1,6 +1,7 @@ package com.ruoyi.bst.customer.domain; import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.List; import org.springframework.format.annotation.DateTimeFormat; @@ -30,7 +31,23 @@ public class CustomerQuery extends CustomerVO{ @ApiModelProperty("参与人ID") private Long joinUserId; + @ApiModelProperty("上次跟进日期") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate lastFollowDate; + + @ApiModelProperty("下次跟进日期") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate nextFollowDate; + @ApiModelProperty("创建日期范围") @DateTimeFormat(pattern = "yyyy-MM-dd") private List createDateRange; + + @ApiModelProperty("下次跟进时间开始") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime nextFollowTimeStart; + + @ApiModelProperty("下次跟进时间结束") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime nextFollowTimeEnd; } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/customer/mapper/CustomerMapper.java b/ruoyi-service/src/main/java/com/ruoyi/bst/customer/mapper/CustomerMapper.java index ad300bb..e950559 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/customer/mapper/CustomerMapper.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/customer/mapper/CustomerMapper.java @@ -69,9 +69,8 @@ public interface CustomerMapper * 更新客户跟进时间 */ int updateFollowTime(@Param("customerId") Long customerId, - @Param("lastFollowTime") LocalDateTime lastFollowTime, - @Param("nextFollowTime") LocalDateTime nextFollowTime - ); + @Param("lastFollowTime") LocalDateTime lastFollowTime + ); /** * 逻辑删除 diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/customer/mapper/CustomerMapper.xml b/ruoyi-service/src/main/java/com/ruoyi/bst/customer/mapper/CustomerMapper.xml index 7526dc1..4b08260 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/customer/mapper/CustomerMapper.xml +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/customer/mapper/CustomerMapper.xml @@ -61,13 +61,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and bc.pain like concat('%', #{query.pain}, '%') and bc.attention like concat('%', #{query.attention}, '%') and bc.demand like concat('%', #{query.demand}, '%') + and date(bc.last_follow_time) = #{query.lastFollowDate} + and date(bc.next_follow_time) = #{query.nextFollowDate} + and bc.next_follow_time >= #{query.nextFollowTimeStart} + and bc.next_follow_time <= #{query.nextFollowTimeEnd} and date(bc.create_time) >= #{query.createDateRange[0]} and date(bc.create_time) <= #{query.createDateRange[1]} - + and ( - bc.create_id = #{query.joinUserId} + bc.create_id = #{query.joinUserId} or bc.follow_id = #{query.joinUserId} ) @@ -202,18 +206,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - update bst_customer + update bst_customer bc - last_follow_time = if (last_follow_time is null or (#{lastFollowTime} >= last_follow_time), - #{lastFollowTime}, + bc.last_follow_time = if (last_follow_time is null or (#{lastFollowTime} >= last_follow_time), + #{lastFollowTime}, last_follow_time), - - next_follow_time = if (next_follow_time is null or (#{nextFollowTime} < next_follow_time and #{nextFollowTime} > now()), - #{nextFollowTime}, - next_follow_time), - + bc.next_follow_time = ( + select min(bcf.next_follow_time) from bst_customer_follow bcf + where bcf.customer_id = #{customerId} + and bcf.next_follow_time > now() + ) where id = #{customerId} @@ -230,7 +234,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and deleted = false - + - + diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/customer/service/CustomerService.java b/ruoyi-service/src/main/java/com/ruoyi/bst/customer/service/CustomerService.java index dffc156..2639e0c 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/customer/service/CustomerService.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/customer/service/CustomerService.java @@ -78,10 +78,9 @@ public interface CustomerService * * @param customerId 客户ID * @param lastFollowTime 新的跟进时间 - * @param nextFollowTime 新的下次跟进时间 * @return */ - int updateFollowTime(Long customerId, LocalDateTime lastFollowTime, LocalDateTime nextFollowTime); + int updateFollowTime(Long customerId, LocalDateTime lastFollowTime); /** * 逻辑删除 diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/customer/service/impl/CustomerServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/customer/service/impl/CustomerServiceImpl.java index 829cc5d..52bd406 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/customer/service/impl/CustomerServiceImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/customer/service/impl/CustomerServiceImpl.java @@ -146,11 +146,11 @@ public class CustomerServiceImpl implements CustomerService } @Override - public int updateFollowTime(Long customerId, LocalDateTime lastFollowTime, LocalDateTime nextFollowTime) { + public int updateFollowTime(Long customerId, LocalDateTime lastFollowTime) { if (customerId == null) { return 0; } - return customerMapper.updateFollowTime(customerId, lastFollowTime, nextFollowTime); + return customerMapper.updateFollowTime(customerId, lastFollowTime); } @Override diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/customerFollow/service/impl/CustomerFollowServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/customerFollow/service/impl/CustomerFollowServiceImpl.java index a5ad79f..679747c 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/customerFollow/service/impl/CustomerFollowServiceImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/customerFollow/service/impl/CustomerFollowServiceImpl.java @@ -82,7 +82,7 @@ public class CustomerFollowServiceImpl implements CustomerFollowService if (insert > 0) { // 更新客户最近跟进时间 - customerService.updateFollowTime(data.getCustomerId(), data.getFollowTime(), data.getNextFollowTime()); + customerService.updateFollowTime(data.getCustomerId(), data.getFollowTime()); } return insert; @@ -104,7 +104,7 @@ public class CustomerFollowServiceImpl implements CustomerFollowService if (update > 0) { // 更新客户最近跟进时间 - customerService.updateFollowTime(data.getCustomerId(), data.getFollowTime(), data.getNextFollowTime()); + customerService.updateFollowTime(data.getCustomerId(), data.getFollowTime()); } return update; diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/project/domain/Project.java b/ruoyi-service/src/main/java/com/ruoyi/bst/project/domain/Project.java index afbfad9..019506e 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/project/domain/Project.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/project/domain/Project.java @@ -86,8 +86,8 @@ public class Project extends BaseEntity @ApiModelProperty("完成时间") private LocalDateTime completeTime; - @Excel(name = "预计完成日期", width = 30, dateFormat = "yyyy-MM-dd") - @ApiModelProperty("预计完成日期") + @Excel(name = "预计开发完成日期", width = 30, dateFormat = "yyyy-MM-dd") + @ApiModelProperty("预计开发完成日期") private LocalDate expectedCompleteDate; @Excel(name = "开始时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/project/domain/ProjectQuery.java b/ruoyi-service/src/main/java/com/ruoyi/bst/project/domain/ProjectQuery.java index cfde49f..2f5f5d5 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/project/domain/ProjectQuery.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/project/domain/ProjectQuery.java @@ -3,6 +3,8 @@ package com.ruoyi.bst.project.domain; import java.time.LocalDate; import java.util.List; +import org.springframework.format.annotation.DateTimeFormat; + import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -31,16 +33,20 @@ public class ProjectQuery extends ProjectVO { @ApiModelProperty("开始年份") private Integer startYear; - @ApiModelProperty("预计完成日期开始") + @ApiModelProperty("预计开发完成日期开始") + @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate expectedCompleteDateStart; - @ApiModelProperty("预计完成日期结束") + @ApiModelProperty("预计开发完成日期结束") + @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate expectedCompleteDateEnd; @ApiModelProperty("维护到期日期开始") + @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate maintenanceEndDateStart; @ApiModelProperty("维护到期日期结束") + @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate maintenanceEndDateEnd; @ApiModelProperty("参与人ID") diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/project/domain/ProjectVO.java b/ruoyi-service/src/main/java/com/ruoyi/bst/project/domain/ProjectVO.java index e8144ea..3d856d3 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/project/domain/ProjectVO.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/project/domain/ProjectVO.java @@ -32,8 +32,8 @@ public class ProjectVO extends Project{ @ApiModelProperty("任务通过数量(需组装)") private Integer taskPassCount; - @ApiModelProperty("任务待确认数量(需组装)") - private Integer taskWaitConfirmCount; + @ApiModelProperty("任务进行中数量(需组装)") + private Integer taskProcessCount; @ApiModelProperty("项目成员列表(需组装)") private List memberList; diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/project/domain/enums/ProjectStatus.java b/ruoyi-service/src/main/java/com/ruoyi/bst/project/domain/enums/ProjectStatus.java index afcfec7..0f3d7ac 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/project/domain/enums/ProjectStatus.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/project/domain/enums/ProjectStatus.java @@ -60,7 +60,7 @@ public enum ProjectStatus { * @return */ public static List completedList() { - return CollectionUtils.map(ProjectStatus::getStatus, + return CollectionUtils.map(ProjectStatus::getStatus, COMPLETED, ACCEPTED, MAINTENANCE, @@ -71,8 +71,8 @@ public enum ProjectStatus { /** * 未完成开发的项目状态 */ - public static List devNotFinish() { - return CollectionUtils.map(ProjectStatus::getStatus, + public static List devUnCompleted() { + return CollectionUtils.map(ProjectStatus::getStatus, WAIT_START, IN_PROGRESS ); @@ -83,7 +83,7 @@ public enum ProjectStatus { * @return */ public static List canMaintenanceOverdue() { - return CollectionUtils.map(ProjectStatus::getStatus, + return CollectionUtils.map(ProjectStatus::getStatus, MAINTENANCE ); } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/project/service/ProjectAssembler.java b/ruoyi-service/src/main/java/com/ruoyi/bst/project/service/ProjectAssembler.java index a6d80e7..34273ef 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/project/service/ProjectAssembler.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/project/service/ProjectAssembler.java @@ -22,7 +22,7 @@ public interface ProjectAssembler { * 组装任务待确认数量 * @param list */ - void assembleTaskWaitConfirmCount(List list); + void assembleTaskProcessCount(List list); /** * 组装项目成员列表 diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/project/service/impl/ProjectAssemblerImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/project/service/impl/ProjectAssemblerImpl.java index 0c1d192..7685308 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/project/service/impl/ProjectAssemblerImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/project/service/impl/ProjectAssemblerImpl.java @@ -61,18 +61,18 @@ public class ProjectAssemblerImpl implements ProjectAssembler { } @Override - public void assembleTaskWaitConfirmCount(List list) { + public void assembleTaskProcessCount(List list) { if (CollectionUtils.isEmptyElement(list)) { return; } - Map taskCountMap = this.selectTaskCountByProjects(list, TaskStatus.WAIT_CONFIRM.getStatus()); + Map taskCountMap = this.selectTaskCountByProjects(list, TaskStatus.PROCESSING.getStatus()); for (ProjectVO project : list) { Integer count = taskCountMap.get(project.getId()); if (count == null) { count = 0; } - project.setTaskWaitConfirmCount(count); + project.setTaskProcessCount(count); } } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/project/service/impl/ProjectServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/project/service/impl/ProjectServiceImpl.java index aeeca7e..b2decf6 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/project/service/impl/ProjectServiceImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/project/service/impl/ProjectServiceImpl.java @@ -151,7 +151,7 @@ public class ProjectServiceImpl implements ProjectService } return list; } - + @Override public int selectCount(ProjectQuery query) { return projectMapper.selectCount(query); @@ -260,7 +260,7 @@ public class ProjectServiceImpl implements ProjectService data.setStatus(ProjectStatus.DEVELOPMENT_OVERDUE.getStatus()); // 查询所有未完成开发的项目 - query.setStatusList(ProjectStatus.devNotFinish()); + query.setStatusList(ProjectStatus.devUnCompleted()); query.setExpectedCompleteDateEnd(LocalDate.now()); query.setDevOverdue(false); return this.updateByQuery(data, query); diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/task/domain/TaskQuery.java b/ruoyi-service/src/main/java/com/ruoyi/bst/task/domain/TaskQuery.java index 6b9eee6..86f35b8 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/task/domain/TaskQuery.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/task/domain/TaskQuery.java @@ -1,7 +1,11 @@ package com.ruoyi.bst.task.domain; +import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.List; +import org.springframework.format.annotation.DateTimeFormat; + import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -20,4 +24,20 @@ public class TaskQuery extends TaskVO{ @ApiModelProperty("任务id列表") private List ids; + @ApiModelProperty("完成日期") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate passDate; + + @ApiModelProperty("完成日期范围") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private List passDateRange; + + @ApiModelProperty("过期时间开始") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime expireTimeStart; + + @ApiModelProperty("过期时间结束") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime expireTimeEnd; + } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/task/mapper/TaskMapper.xml b/ruoyi-service/src/main/java/com/ruoyi/bst/task/mapper/TaskMapper.xml index b9bddc4..c49c9e2 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/task/mapper/TaskMapper.xml +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/task/mapper/TaskMapper.xml @@ -69,6 +69,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and bp.owner_id = #{query.projectOwnerId} and bp.follow_id = #{query.projectFollowId} + and date(bt.pass_time) = #{query.passDate} + and bt.expire_time >= #{query.expireTimeStart} + and bt.expire_time <= #{query.expireTimeEnd} + + and date(bt.pass_time) >= #{query.passDateRange[0]} + and date(bt.pass_time) <= #{query.passDateRange[1]} + and bt.status in diff --git a/ruoyi-service/src/main/java/com/ruoyi/dashboard/customer/service/DashboardCustomerService.java b/ruoyi-service/src/main/java/com/ruoyi/dashboard/customer/service/DashboardCustomerService.java index 8514ab3..33a1a38 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/dashboard/customer/service/DashboardCustomerService.java +++ b/ruoyi-service/src/main/java/com/ruoyi/dashboard/customer/service/DashboardCustomerService.java @@ -1,6 +1,7 @@ package com.ruoyi.dashboard.customer.service; import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; @@ -8,8 +9,9 @@ import org.springframework.stereotype.Service; import com.ruoyi.bst.customer.domain.CustomerQuery; import com.ruoyi.bst.customer.service.CustomerService; +import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.common.vo.StringIntegerVO; -import com.ruoyi.dashboard.customer.mapper.DashboardCustomerMapper; +import com.ruoyi.dashboard.index.domain.brief.BriefKeys; import com.ruoyi.dashboard.index.domain.brief.CustomerBriefVO; @Service @@ -18,23 +20,72 @@ public class DashboardCustomerService { @Autowired private CustomerService customerService; - @Autowired - private DashboardCustomerMapper dashboardCustomerMapper; - public CustomerBriefVO selectCustomerBrief(CustomerQuery query) { - List customerMap = customerService.selectCountGroupByStatus(query); - CustomerBriefVO customerBriefVO = new CustomerBriefVO(customerMap); - // 今日新增客户 - customerBriefVO.setToday(this.selectTodayCustomerCount(query)); - return customerBriefVO; + public CustomerBriefVO selectCustomerBrief(CustomerQuery query, List keyList) { + CustomerBriefVO vo = new CustomerBriefVO(); + + if (keyList != null) { + // 状态Map + if (keyList.contains(BriefKeys.CUSTOMER_STATUS)) { + List customerMap = this.selectCountGroupByStatus(query); + vo.setStatus(customerMap); + } + // 今日新增客户 + if (keyList.contains(BriefKeys.CUSTOMER_TODAY_CREATE)) { + vo.setToday(this.selectTodayCustomerCount(query)); + } + // 今日已跟进客户 + if (keyList.contains(BriefKeys.CUSTOMER_TODAY_FOLLOWED)) { + vo.setTodayFollowed(this.selectTodayFollowedCustomerCount(query)); + } + // 今日待跟进客户 + if (keyList.contains(BriefKeys.CUSTOMER_TODAY_WAIT_FOLLOW)) { + vo.setTodayWaitFollow(this.selectTodayWaitFollowCustomerCount(query)); + } + // 即将跟进客户 + if (keyList.contains(BriefKeys.CUSTOMER_SOON_FOLLOW)) { + vo.setSoonFollow(this.selectSoonFollowCustomerCount(query)); + } + } + return vo; } + // 查询即将跟进客户数(下次跟进时间在1~2天) + private int selectSoonFollowCustomerCount(CustomerQuery customerQuery) { + CustomerQuery query = new CustomerQuery(); + BeanUtils.copyBeanProp(query, customerQuery); + query.setNextFollowTimeStart(LocalDate.now().plusDays(1).atStartOfDay()); + query.setNextFollowTimeEnd(LocalDateTime.now().plusDays(2)); + return customerService.selectCount(query); + } - /** - * 查询今日新增客户数 - * @return - */ - private int selectTodayCustomerCount(CustomerQuery query) { + // 查询今日待跟进客户数 + private int selectTodayWaitFollowCustomerCount(CustomerQuery customerQuery) { + CustomerQuery query = new CustomerQuery(); + BeanUtils.copyBeanProp(query, customerQuery); + query.setNextFollowDate(LocalDate.now()); + return customerService.selectCount(query); + } + + // 查询客户状态数量 + private List selectCountGroupByStatus(CustomerQuery customerQuery) { + CustomerQuery query = new CustomerQuery(); + BeanUtils.copyBeanProp(query, customerQuery); + return customerService.selectCountGroupByStatus(query); + } + + // 查询今日已跟进客户数 + private int selectTodayFollowedCustomerCount(CustomerQuery customerQuery) { + CustomerQuery query = new CustomerQuery(); + BeanUtils.copyBeanProp(query, customerQuery); + query.setLastFollowDate(LocalDate.now()); + return customerService.selectCount(query); + } + + // 查询今日新增客户数 + private int selectTodayCustomerCount(CustomerQuery customerQuery) { + CustomerQuery query = new CustomerQuery(); + BeanUtils.copyBeanProp(query, customerQuery); query.setCreateDate(LocalDate.now()); return customerService.selectCount(query); } diff --git a/ruoyi-service/src/main/java/com/ruoyi/dashboard/index/domain/brief/BriefKeys.java b/ruoyi-service/src/main/java/com/ruoyi/dashboard/index/domain/brief/BriefKeys.java new file mode 100644 index 0000000..408adb3 --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/dashboard/index/domain/brief/BriefKeys.java @@ -0,0 +1,51 @@ +package com.ruoyi.dashboard.index.domain.brief; + +import lombok.Data; + +/** + * @author wjh + * 2025/2/24 + */ +@Data +public class BriefKeys { + + // 项目 + // 项目状态 + public static final String PROJECT_STATUS = "projectStatus"; + // 项目开发完成 + public static final String PROJECT_DEV_COMPLETED = "projectDevCompleted"; + // 项目逾期开发未完成 + public static final String PROJECT_OVERDUE_DEV_UNCOMPLETED = "projectOverdueDevUncompleted"; + // 项目逾期开发完成 + public static final String PROJECT_OVERDUE_DEV_COMPLETED = "projectOverdueDevCompleted"; + // 项目开发逾期 + public static final String PROJECT_DEV_OVERDUE = "projectDevOverdue"; + // 开发即将到期项目 + public static final String PROJECT_DEV_SOON_EXPIRE = "projectDevSoonExpire"; + + // 任务 + // 状态数据 + public static final String TASK_STATUS = "taskStatus"; + // 类型分组数据 + public static final String TASK_TYPE = "taskType"; + // 逾期未完成 + public static final String TASK_OVERDUE_UNCOMPLETED = "taskOverdueUncompleted"; + // 逾期完成 + public static final String TASK_OVERDUE_COMPLETED = "taskOverdueCompleted"; + // 今日完成任务 + public static final String TASK_TODAY_COMPLETED = "taskTodayCompleted"; + // 即将到期任务 + public static final String TASK_SOON_EXPIRE = "taskSoonExpire"; + + // 客户 + // 状态分组数据 + public static final String CUSTOMER_STATUS = "customerStatus"; + // 今日新增客户 + public static final String CUSTOMER_TODAY_CREATE = "customerTodayCreate"; + // 今日已跟进客户 + public static final String CUSTOMER_TODAY_FOLLOWED = "customerTodayFollowed"; + // 今日待跟进客户 + public static final String CUSTOMER_TODAY_WAIT_FOLLOW = "customerTodayWaitFollow"; + // 即将跟进客户 + public static final String CUSTOMER_SOON_FOLLOW = "customerSoonFollow"; +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/dashboard/index/domain/brief/BriefQuery.java b/ruoyi-service/src/main/java/com/ruoyi/dashboard/index/domain/brief/BriefQuery.java index 9186092..285d767 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/dashboard/index/domain/brief/BriefQuery.java +++ b/ruoyi-service/src/main/java/com/ruoyi/dashboard/index/domain/brief/BriefQuery.java @@ -7,6 +7,8 @@ import com.ruoyi.bst.task.domain.TaskQuery; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.util.List; + @Data public class BriefQuery { @@ -16,6 +18,9 @@ public class BriefQuery { @ApiModelProperty("数据隔离") private Boolean scope; + @ApiModelProperty("统计数据键值") + private List keys; + public ProjectQuery toProjectQuery() { ProjectQuery projectQuery = new ProjectQuery(); projectQuery.setJoinUserId(joinUserId); @@ -36,5 +41,5 @@ public class BriefQuery { customerQuery.setScope(scope); return customerQuery; } - + } diff --git a/ruoyi-service/src/main/java/com/ruoyi/dashboard/index/domain/brief/CustomerBriefVO.java b/ruoyi-service/src/main/java/com/ruoyi/dashboard/index/domain/brief/CustomerBriefVO.java index 32370fa..db999f7 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/dashboard/index/domain/brief/CustomerBriefVO.java +++ b/ruoyi-service/src/main/java/com/ruoyi/dashboard/index/domain/brief/CustomerBriefVO.java @@ -7,31 +7,36 @@ import com.ruoyi.common.vo.StringIntegerVO; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import lombok.NoArgsConstructor; @Data -@NoArgsConstructor public class CustomerBriefVO { @ApiModelProperty("客户总数") private Integer total; - @ApiModelProperty("今日新增客户数") - private Integer today; - + //状态 @ApiModelProperty("潜在客户") private Integer potential; - @ApiModelProperty("意向客户") private Integer intention; - @ApiModelProperty("已成交") private Integer transaction; - @ApiModelProperty("失效客户") private Integer invalid; - public CustomerBriefVO(List statusMap) { + @ApiModelProperty("今日新增客户数") + private Integer today; + + @ApiModelProperty("今日已跟进客户数") + private Integer todayFollowed; + + @ApiModelProperty("今日待跟进客户数") + private Integer todayWaitFollow; + + @ApiModelProperty("即将跟进客户数") + private Integer soonFollow; + + public void setStatus(List statusMap) { this.potential = statusMap.stream() .filter(vo -> CustomerStatus.POTENTIAL.getStatus().equals(vo.getKey())) .findFirst().map(StringIntegerVO::getValue).orElse(0); diff --git a/ruoyi-service/src/main/java/com/ruoyi/dashboard/index/domain/brief/ProjectBriefVO.java b/ruoyi-service/src/main/java/com/ruoyi/dashboard/index/domain/brief/ProjectBriefVO.java index 1897af3..a24ac85 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/dashboard/index/domain/brief/ProjectBriefVO.java +++ b/ruoyi-service/src/main/java/com/ruoyi/dashboard/index/domain/brief/ProjectBriefVO.java @@ -36,6 +36,12 @@ public class ProjectBriefVO { @ApiModelProperty("开发逾期完成") private Integer devOverdueCompleted; + @ApiModelProperty("开发逾期") + private Integer devOverdue; + + @ApiModelProperty("开发即将到期") + private Integer devSoonExpire; + public void setStatusGroup(List statusMap) { this.completed = statusMap.stream() .filter(vo -> ProjectStatus.COMPLETED.getStatus().equals(vo.getKey())) diff --git a/ruoyi-service/src/main/java/com/ruoyi/dashboard/index/domain/brief/TaskBriefVO.java b/ruoyi-service/src/main/java/com/ruoyi/dashboard/index/domain/brief/TaskBriefVO.java index a63b607..21a8688 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/dashboard/index/domain/brief/TaskBriefVO.java +++ b/ruoyi-service/src/main/java/com/ruoyi/dashboard/index/domain/brief/TaskBriefVO.java @@ -13,7 +13,7 @@ public class TaskBriefVO { @ApiModelProperty("任务总数") private Integer total; - + // 状态分组 @ApiModelProperty("待完成") private Integer waitCompleted; @@ -40,6 +40,12 @@ public class TaskBriefVO { @ApiModelProperty("逾期完成") private Integer overdueCompleted; + @ApiModelProperty("今日完成数") + private Integer todayCompleted; + + @ApiModelProperty("即将到期数") + private Integer soonExpire; + // 设置状态分组数据 public void setStatusGroup(List statusMap) { this.waitCompleted = statusMap.stream() diff --git a/ruoyi-service/src/main/java/com/ruoyi/dashboard/index/service/DashboardService.java b/ruoyi-service/src/main/java/com/ruoyi/dashboard/index/service/DashboardService.java index 310890b..2efd4fe 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/dashboard/index/service/DashboardService.java +++ b/ruoyi-service/src/main/java/com/ruoyi/dashboard/index/service/DashboardService.java @@ -1,5 +1,12 @@ package com.ruoyi.dashboard.index.service; +import com.ruoyi.bst.customer.domain.CustomerQuery; +import com.ruoyi.bst.project.domain.ProjectQuery; +import com.ruoyi.bst.task.domain.TaskQuery; +import com.ruoyi.dashboard.customer.service.DashboardCustomerService; +import com.ruoyi.dashboard.project.service.DashboardProjectService; +import com.ruoyi.dashboard.task.service.DashboardTaskService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.dashboard.index.domain.brief.BriefQuery; @@ -8,7 +15,30 @@ import com.ruoyi.dashboard.index.domain.brief.BriefVO; @Service public class DashboardService { + @Autowired + private DashboardProjectService dashboardProjectService; + @Autowired + private DashboardTaskService dashboardTaskService; + @Autowired + private DashboardCustomerService dashboardCustomerService; + public BriefVO selectBrief(BriefQuery query) { + BriefVO result = new BriefVO(); + + // 项目概览 + ProjectQuery projectQuery = query.toProjectQuery(); + result.setProject(dashboardProjectService.selectProjectBrief(projectQuery, query.getKeys())); + + // 任务概览 + TaskQuery taskQuery = query.toTaskQuery(); + result.setTask(dashboardTaskService.selectTaskBrief(taskQuery, query.getKeys())); + + // 客户概览 + CustomerQuery customerQuery = query.toCustomerQuery(); + result.setCustomer(dashboardCustomerService.selectCustomerBrief(customerQuery, query.getKeys())); + + return result; + } } diff --git a/ruoyi-service/src/main/java/com/ruoyi/dashboard/project/domain/brief/ProjectBriefKeys.java b/ruoyi-service/src/main/java/com/ruoyi/dashboard/project/domain/brief/ProjectBriefKeys.java deleted file mode 100644 index 5bc78ba..0000000 --- a/ruoyi-service/src/main/java/com/ruoyi/dashboard/project/domain/brief/ProjectBriefKeys.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.ruoyi.dashboard.project.domain.brief; - - -public class ProjectBriefKeys { - - // 项目状态 - public static final String STATUS = "status"; - - // 项目开发完成 - public static final String DEV_COMPLETED = "devCompleted"; - - // 项目逾期开发未完成 - public static final String OVERDUE_DEV_UNCOMPLETED = "overdueDevUncompleted"; - - // 项目逾期开发完成 - public static final String OVERDUE_DEV_COMPLETED = "overdueDevCompleted"; - - -} diff --git a/ruoyi-service/src/main/java/com/ruoyi/dashboard/project/service/DashboardProjectService.java b/ruoyi-service/src/main/java/com/ruoyi/dashboard/project/service/DashboardProjectService.java index 5ec4e73..0aee2cb 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/dashboard/project/service/DashboardProjectService.java +++ b/ruoyi-service/src/main/java/com/ruoyi/dashboard/project/service/DashboardProjectService.java @@ -1,7 +1,7 @@ package com.ruoyi.dashboard.project.service; +import java.time.LocalDate; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Objects; @@ -14,8 +14,8 @@ import com.ruoyi.bst.project.service.ProjectService; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.common.vo.IntegerIntegerVO; import com.ruoyi.common.vo.StringIntegerVO; +import com.ruoyi.dashboard.index.domain.brief.BriefKeys; import com.ruoyi.dashboard.index.domain.brief.ProjectBriefVO; -import com.ruoyi.dashboard.project.domain.brief.ProjectBriefKeys; import com.ruoyi.dashboard.project.domain.monthProject.MonthProjectQuery; import com.ruoyi.dashboard.project.domain.monthProject.MonthProjectVO; import com.ruoyi.dashboard.project.domain.projectRate.ProjectRateVO; @@ -64,34 +64,57 @@ public class DashboardProjectService { } // 查询项目概览 - public ProjectBriefVO selectProjectBrief(ProjectQuery query, String ...keys) { + public ProjectBriefVO selectProjectBrief(ProjectQuery query, List keyList) { ProjectBriefVO vo = new ProjectBriefVO(); - if (keys != null) { - List keyList = Arrays.asList(keys); - - if (keyList.contains(ProjectBriefKeys.STATUS)) { + if (keyList != null) { + if (keyList.contains(BriefKeys.PROJECT_STATUS)) { List projectMap = projectService.selectCountGroupByStatus(query); vo.setStatusGroup(projectMap); } - if (keyList.contains(ProjectBriefKeys.DEV_COMPLETED)) { + if (keyList.contains(BriefKeys.PROJECT_DEV_COMPLETED)) { int devCompleted = this.selectDevCompletedCount(query); vo.setDevCompleted(devCompleted); } - if (keyList.contains(ProjectBriefKeys.OVERDUE_DEV_UNCOMPLETED)) { + if (keyList.contains(BriefKeys.PROJECT_OVERDUE_DEV_UNCOMPLETED)) { int devOverdueUncompleted = this.selectDevOverdueUncompletedCount(query); vo.setDevOverdueUncompleted(devOverdueUncompleted); } - if (keyList.contains(ProjectBriefKeys.OVERDUE_DEV_COMPLETED)) { + if (keyList.contains(BriefKeys.PROJECT_OVERDUE_DEV_COMPLETED)) { int devOverdueCompleted = this.selectDevOverdueCompletedCount(query); vo.setDevOverdueCompleted(devOverdueCompleted); } + if (keyList.contains(BriefKeys.PROJECT_DEV_OVERDUE)) { + int devOverdue = this.selectDevOverdueCount(query); + vo.setDevOverdue(devOverdue); + } + if (keyList.contains(BriefKeys.PROJECT_DEV_SOON_EXPIRE)) { + int soonExpire = this.selectDevSoonExpireCount(query); + vo.setDevSoonExpire(soonExpire); + } } return vo; } + // 查询开发即将到期项目数 + private int selectDevSoonExpireCount(ProjectQuery projectQuery) { + ProjectQuery query = new ProjectQuery(); + BeanUtils.copyBeanProp(query, projectQuery); + query.setStatusList(ProjectStatus.devUnCompleted()); + query.setExpectedCompleteDateEnd(LocalDate.now().plusDays(2)); // 剩余2天,即视为即将到期 + return projectService.selectCount(query); + } + + // 查询开发逾期项目数 + private int selectDevOverdueCount(ProjectQuery projectQuery) { + ProjectQuery query = new ProjectQuery(); + BeanUtils.copyBeanProp(query, projectQuery); + query.setDevOverdue(true); + return projectService.selectCount(query); + } + // 按月查询新增项目数 public List selectCountGroupByCreateMonth(MonthProjectQuery query) { ProjectQuery projectQuery = new ProjectQuery(); @@ -162,7 +185,7 @@ public class DashboardProjectService { ProjectQuery query = new ProjectQuery(); BeanUtils.copyBeanProp(query, projectQuery); query.setDevOverdue(true); - query.setStatusList(ProjectStatus.devNotFinish()); + query.setStatusList(ProjectStatus.devUnCompleted()); return projectService.selectCount(query); } diff --git a/ruoyi-service/src/main/java/com/ruoyi/dashboard/task/domain/brief/TaskBriefKeys.java b/ruoyi-service/src/main/java/com/ruoyi/dashboard/task/domain/brief/TaskBriefKeys.java deleted file mode 100644 index 814ef82..0000000 --- a/ruoyi-service/src/main/java/com/ruoyi/dashboard/task/domain/brief/TaskBriefKeys.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.ruoyi.dashboard.task.domain.brief; - -public class TaskBriefKeys { - - // 状态数据 - public static final String STATUS = "status"; - - // 类型分组数据 - public static final String TYPE = "type"; - - // 逾期未完成 - public static final String OVERDUE_UNCOMPLETED = "overdueUncompleted"; - - // 逾期完成 - public static final String OVERDUE_COMPLETED = "overdueCompleted"; - -} diff --git a/ruoyi-service/src/main/java/com/ruoyi/dashboard/task/service/DashboardTaskService.java b/ruoyi-service/src/main/java/com/ruoyi/dashboard/task/service/DashboardTaskService.java index 6c2ca47..ba2bccd 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/dashboard/task/service/DashboardTaskService.java +++ b/ruoyi-service/src/main/java/com/ruoyi/dashboard/task/service/DashboardTaskService.java @@ -1,48 +1,79 @@ package com.ruoyi.dashboard.task.service; -import java.util.Arrays; +import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.List; -import com.ruoyi.common.utils.bean.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.bst.task.domain.TaskQuery; import com.ruoyi.bst.task.domain.enums.TaskStatus; import com.ruoyi.bst.task.service.TaskService; +import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.common.vo.StringIntegerVO; +import com.ruoyi.dashboard.index.domain.brief.BriefKeys; import com.ruoyi.dashboard.index.domain.brief.TaskBriefVO; -import com.ruoyi.dashboard.task.domain.brief.TaskBriefKeys; - @Service public class DashboardTaskService { @Autowired private TaskService taskService; - public TaskBriefVO selectTaskBrief(TaskQuery query, String ...keys) { + public TaskBriefVO selectTaskBrief(TaskQuery query, List keyList) { TaskBriefVO vo = new TaskBriefVO(); - if (keys != null) { - List keyList = Arrays.asList(keys); - if (keyList.contains(TaskBriefKeys.STATUS)) { + if (keyList != null) { + if (keyList.contains(BriefKeys.TASK_STATUS)) { List statusMap = taskService.selectCountGroupByStatus(query); vo.setStatusGroup(statusMap); } - if (keyList.contains(TaskBriefKeys.TYPE)) { + if (keyList.contains(BriefKeys.TASK_TYPE)) { List typeMap = taskService.selectCountGroupByType(query); vo.setTypeGroup(typeMap); } - if (keyList.contains(TaskBriefKeys.OVERDUE_UNCOMPLETED)) { + if (keyList.contains(BriefKeys.TASK_OVERDUE_UNCOMPLETED)) { vo.setOverdueUncompleted(this.selectCountOverdueUncompleted(query)); } - if (keyList.contains(TaskBriefKeys.OVERDUE_COMPLETED)) { + if (keyList.contains(BriefKeys.TASK_OVERDUE_COMPLETED)) { vo.setOverdueCompleted(this.selectCountOverdueCompleted(query)); } + if (keyList.contains(BriefKeys.TASK_TODAY_COMPLETED)) { + vo.setTodayCompleted(this.selectCountTodayCompleted(query)); + } + if (keyList.contains(BriefKeys.TASK_SOON_EXPIRE)) { + vo.setSoonExpire(this.selectCountSoonExpire(query)); + } } return vo; } + /** + * 查询即将过期的任务数 + * @param taskQuery + * @return + */ + private int selectCountSoonExpire(TaskQuery taskQuery) { + TaskQuery query = new TaskQuery (); + BeanUtils.copyBeanProp(query, taskQuery); + query.setStatusList(TaskStatus.unComplete()); + query.setExpireTimeEnd(LocalDateTime.now().plusDays(2)); // 查询剩余过期时间小于48小时,且未完成的任务 + return taskService.selectCount(query); + } + + /** + * 查询今日完成任务数 + * @param taskQuery + * @return + */ + private int selectCountTodayCompleted(TaskQuery taskQuery) { + TaskQuery query = new TaskQuery(); + BeanUtils.copyBeanProp(query, taskQuery); + query.setStatusList(TaskStatus.complete()); + query.setPassDate(LocalDate.now()); + return taskService.selectCount(query); + } + /** * 查询逾期未完成任务数 * @param taskQuery diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/bst/NoticeController.java b/ruoyi-web/src/main/java/com/ruoyi/web/bst/NoticeController.java index ae734b9..3b15832 100644 --- a/ruoyi-web/src/main/java/com/ruoyi/web/bst/NoticeController.java +++ b/ruoyi-web/src/main/java/com/ruoyi/web/bst/NoticeController.java @@ -16,6 +16,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.github.pagehelper.PageHelper; import com.ruoyi.bst.notice.domain.Notice; import com.ruoyi.bst.notice.domain.NoticeQuery; import com.ruoyi.bst.notice.domain.NoticeVO; @@ -53,6 +54,7 @@ public class NoticeController extends BaseController public TableDataInfo list(NoticeQuery query) { startPage(); + PageHelper.orderBy("top desc, create_time desc"); startOrderBy(); List list = noticeService.selectNoticeListScope(query); noticeAssembler.assembleReceiveUserList(list); diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/bst/ProjectController.java b/ruoyi-web/src/main/java/com/ruoyi/web/bst/ProjectController.java index d4cb71e..da78ce2 100644 --- a/ruoyi-web/src/main/java/com/ruoyi/web/bst/ProjectController.java +++ b/ruoyi-web/src/main/java/com/ruoyi/web/bst/ProjectController.java @@ -65,7 +65,7 @@ public class ProjectController extends BaseController List list = projectService.selectProjectList(query); projectAssembler.assembleTaskCount(list); projectAssembler.assembleTaskPassCount(list); - projectAssembler.assembleTaskWaitConfirmCount(list); + projectAssembler.assembleTaskProcessCount(list); return getDataTable(list); } diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/dashboard/DashboardController.java b/ruoyi-web/src/main/java/com/ruoyi/web/dashboard/DashboardController.java index a1a34d5..c4c11ee 100644 --- a/ruoyi-web/src/main/java/com/ruoyi/web/dashboard/DashboardController.java +++ b/ruoyi-web/src/main/java/com/ruoyi/web/dashboard/DashboardController.java @@ -5,19 +5,10 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.ruoyi.bst.customer.domain.CustomerQuery; -import com.ruoyi.bst.project.domain.ProjectQuery; -import com.ruoyi.bst.task.domain.TaskQuery; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.dashboard.customer.service.DashboardCustomerService; import com.ruoyi.dashboard.index.domain.brief.BriefQuery; -import com.ruoyi.dashboard.index.domain.brief.BriefVO; import com.ruoyi.dashboard.index.service.DashboardService; -import com.ruoyi.dashboard.project.domain.brief.ProjectBriefKeys; -import com.ruoyi.dashboard.project.service.DashboardProjectService; -import com.ruoyi.dashboard.task.domain.brief.TaskBriefKeys; -import com.ruoyi.dashboard.task.service.DashboardTaskService; @RestController @RequestMapping("/dashboard") @@ -26,62 +17,11 @@ public class DashboardController extends BaseController { @Autowired private DashboardService dashboardService; - @Autowired - private DashboardProjectService dashboardProjectService; - - @Autowired - private DashboardTaskService dashboardTaskService; - - @Autowired - private DashboardCustomerService dashboardCustomerService; - - // 获取本人的统计数据 - @GetMapping("/mineBrief") - public AjaxResult mineBrief(BriefQuery query) { - query.setJoinUserId(getUserId()); - query.setScope(true); - - BriefVO result = new BriefVO(); - - // 项目概览 - ProjectQuery projectQuery = query.toProjectQuery(); - result.setProject(dashboardProjectService.selectProjectBrief(projectQuery, ProjectBriefKeys.STATUS)); - - // 任务概览 - TaskQuery taskQuery = query.toTaskQuery(); - result.setTask(dashboardTaskService.selectTaskBrief(taskQuery, TaskBriefKeys.STATUS)); - - // 客户概览 - CustomerQuery customerQuery = query.toCustomerQuery(); - result.setCustomer(dashboardCustomerService.selectCustomerBrief(customerQuery)); - - return AjaxResult.success(result); - } - // 获取统计数据 @GetMapping("/brief") public AjaxResult brief(BriefQuery query) { - BriefVO result = new BriefVO(); - - // 项目概览 - ProjectQuery projectQuery = query.toProjectQuery(); - result.setProject(dashboardProjectService.selectProjectBrief(projectQuery, - ProjectBriefKeys.STATUS, - ProjectBriefKeys.DEV_COMPLETED, - ProjectBriefKeys.OVERDUE_DEV_UNCOMPLETED, - ProjectBriefKeys.OVERDUE_DEV_COMPLETED - )); - - // 任务概览 - TaskQuery taskQuery = query.toTaskQuery(); - result.setTask(dashboardTaskService.selectTaskBrief(taskQuery, - TaskBriefKeys.STATUS, - TaskBriefKeys.TYPE, - TaskBriefKeys.OVERDUE_UNCOMPLETED, - TaskBriefKeys.OVERDUE_COMPLETED - )); - - return AjaxResult.success(result); + query.setScope(true); + return AjaxResult.success(dashboardService.selectBrief(query)); }