add:首页、任务、需求

This commit is contained in:
2025-01-20 10:07:22 +08:00
parent bf0248478c
commit e97a32433b
15 changed files with 410 additions and 57 deletions

View File

@@ -78,4 +78,10 @@ public class DemanDmanageController {
return new ResponseEntity<>(HttpStatus.OK);
}
@PostMapping({"/queryHomeUiData"})
@Log("首页需求查询")
public ResponseEntity<Object> homeQuery(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(demanDmanageService.homeQuery(whereJson),HttpStatus.OK);
}
}

View File

@@ -90,4 +90,11 @@ public class DemandTaskController {
return new ResponseEntity<>(HttpStatus.OK);
}
@PostMapping("/confirmTask")
@Log("完成任务")
public ResponseEntity<Object> confrimTask(@RequestBody DemandTask dao) {
demandTaskService.confirmTask(dao);
return new ResponseEntity<>(HttpStatus.OK);
}
}

View File

@@ -10,15 +10,15 @@ import lombok.Getter;
@AllArgsConstructor
public enum NeedTypeEnum {
/**
* 生成
* 项目
*/
ITEM("1", "项目"),
/**
* 开发中
* 研发
*/
DEVELOP("2", "研发"),
/**
* 完成
* 其他
*/
OTHER("3", "其他"),
/**

View File

@@ -17,7 +17,7 @@ import org.springframework.stereotype.Component;
import java.util.List;
@Slf4j
@Component
@Component("autoUpdateTaskDate")
@RequiredArgsConstructor
public class AutoUpdateTaskDate {

View File

@@ -84,4 +84,35 @@ public interface DemanDmanageService extends IService<DemanDmanage> {
* @param id 需求id
*/
void updateStatus(String id);
/**
* 首页查询
* @param whereJson 入参
* @return JSONObject {
* userInfo:{
* // 用户信息
* userName:用户名称,
* confirmTaskPer: 已完成任务百分比,
* // 剩余工作
* item: 项目,
* develop: 研发,
* other: 其他,
* // 我的贡献
* createItem: 创建项目,
* confirmItem: 完成项目,
* submitFile: 提交文档,
* createTask: 创建任务,
* confirmTask: 完成任务,
* // 单个项目贡献度(只有入参有值的时候才会查询)
* oneConfirmTask: 完成任务,
* oneUnConfirmTask: 未完成任务,
* oneTotalTask: 任务数,
* },
*
* tableItemData[{id,projectName,itemConfirmPer,onlineDate}],本月上线项目
* tableTaskData[{任务实体类}],未完成任务列表
* tableItemNumData[projectName,allTaskNum,ConfirmTaskNum,UnConfirmTaskNum]未完成项目统计
* }
*/
JSONObject homeQuery(JSONObject whereJson);
}

View File

@@ -1,8 +1,12 @@
package org.nl.work.service.demandmanage.dao.mapper;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.nl.work.service.demandmanage.dao.DemanDmanage;
import java.util.List;
/**
* <p>
* Mapper 接口
@@ -13,4 +17,18 @@ import org.nl.work.service.demandmanage.dao.DemanDmanage;
*/
public interface DemanDmanageMapper extends BaseMapper<DemanDmanage> {
/**
* 根据此人员查询参与的项目
* @param userId人员id
* @return List<JSONObject>
*/
List<JSONObject> getItemUser(String userId);
/**
* 根据此人员查询查询本月上线项目
* @param query查询条件
* @return List<JSONObject>
*/
List<JSONObject> getOnlineItem(@Param("query") JSONObject query);
}

View File

@@ -2,4 +2,44 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.nl.work.service.demandmanage.dao.mapper.DemanDmanageMapper">
<select id="getItemUser" resultType="com.alibaba.fastjson.JSONObject">
SELECT
task.demandId,
MAX(deman.demandType) AS demandType,
MAX(deman.projectName) AS projectName
FROM
nl_demandtask task
INNER JOIN nl_demandmanage deman ON task.demandId = deman.id
<where>
deman.developStatus != '3'
<if test="userId != null and userId != ''">
and task.developId = #{userId}
</if>
group by task.demandId
</where>
</select>
<select id="getOnlineItem" resultType="com.alibaba.fastjson.JSONObject">
SELECT
task.demandId AS id,
MAX(deman.projectName) AS projectName,
MAX(deman.onlineDate) AS onlineDate
FROM
nl_demandtask task
INNER JOIN nl_demandmanage deman ON task.demandId = deman.id
<where>
(deman.onlineDate >= #{query.startDate} AND
#{query.endDate} >= deman.onlineDate)
<if test="query.userId != null and query.userId != ''">
AND task.developId = #{query.userId}
</if>
group by task.demandId
</where>
</select>
</mapper>

View File

@@ -1,6 +1,8 @@
package org.nl.work.service.demandmanage.impl;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -226,6 +228,200 @@ public class DemanDmanageServiceImpl extends ServiceImpl<DemanDmanageMapper, Dem
this.baseMapper.updateById(demanDmanageDao);
}
@Override
public JSONObject homeQuery(JSONObject whereJson) {
JSONObject result = new JSONObject();
// 1.查询个人信息/个人贡献/单个个人项目贡献
JSONObject userInfo = queryUserInfo(whereJson);
result.put("userInfo",userInfo);
// 2.查询本月上线项目
List<JSONObject> tableItemData = queryOnlineItem();
result.put("tableItemData",tableItemData);
// 3.查询未完成任务列表
List<DemandTask> tableTaskData = queryUnConfirmTask();
result.put("tableTaskData",tableTaskData);
// 4.查询未完成项目统计
List<JSONObject> tableItemNumData = queryUnConfirmItem();
result.put("tableItemNumData",tableItemNumData);
return result;
}
/**
* 首页查询:
* 查询个人信息/个人贡献/单个个人项目贡献
* @param whereJson 入参:如果有值则查询【单个个人项目贡献】
* @return JSONObject
*/
private JSONObject queryUserInfo(JSONObject whereJson) {
JSONObject userInfo = new JSONObject();
// 1.查询个人信息
userInfo.put("userName", SecurityUtils.getCurrentNickName());
// 已完成任务百分比: 已完成任务数 / 总任务数
List<DemandTask> allTaskList = demandTaskService.list(
new QueryWrapper<DemandTask>().lambda()
.eq(DemandTask::getDevelopId, SecurityUtils.getCurrentUserId())
);
if (ObjectUtil.isEmpty(allTaskList)) {
userInfo.put("confirmTaskPer",100);
} else {
// 已完成任务数
long confirmTaskNum = allTaskList
.stream()
.filter(row -> row.getTaskStatus().equals(NeedStatusEnum.CONFIRM.getValue())).count();
double confirmTaskPer = NumberUtil.div(confirmTaskNum, allTaskList.size());
userInfo.put("confirmTaskPer",NumberUtil.round(NumberUtil.mul(confirmTaskPer, 100), 1));
}
// 剩余工作
List<JSONObject> itemUserList = this.baseMapper.getItemUser(SecurityUtils.getCurrentUserId());
// 项目
userInfo.put("item",itemUserList.stream()
.filter(row -> row.getString("demandType").equals(NeedTypeEnum.ITEM.getValue()))
.count());
// 研发
userInfo.put("develop",itemUserList.stream()
.filter(row -> row.getString("demandType").equals(NeedTypeEnum.DEVELOP.getValue()))
.count());
// 其他
userInfo.put("other",itemUserList.stream()
.filter(row -> row.getString("demandType").equals(NeedTypeEnum.OTHER.getValue()))
.count());
// 2.查询我的贡献
// 创建项目
userInfo.put("createItem", this.baseMapper.selectList(
new QueryWrapper<DemanDmanage>().lambda()
.eq(DemanDmanage::getCreateId,SecurityUtils.getCurrentUserId())
).size());
// 完成项目
userInfo.put("confirmItem", this.baseMapper.selectList(
new QueryWrapper<DemanDmanage>().lambda()
.eq(DemanDmanage::getConfirmId,SecurityUtils.getCurrentUserId())
).size());
// 提交文档
userInfo.put("submitFile", iToolLocalStorageService.list(
new QueryWrapper<ToolLocalStorage>().lambda()
.eq(ToolLocalStorage::getCreate_id, SecurityUtils.getCurrentUserId())
).size());
// 创建任务
userInfo.put("createTask", allTaskList.size());
// 完成任务
userInfo.put("confirmTask", allTaskList.stream()
.filter(row -> row.getTaskStatus().equals(NeedStatusEnum.CONFIRM.getValue())).count());
// 3.单个项目贡献度(只有入参有值的时候才会查询)
if (ObjectUtil.isNotEmpty(whereJson.getString("id"))) {
List<DemandTask> oneItemTaskList = allTaskList.stream()
.filter(row -> row.getDemandId().equals(whereJson.getString("id")))
.collect(Collectors.toList());
// 已完成任务
userInfo.put("oneConfirmTask", oneItemTaskList.stream()
.filter(row -> row.getTaskStatus().equals(NeedStatusEnum.CONFIRM.getValue())).count());
// 未完成任务
userInfo.put("oneUnConfirmTask", oneItemTaskList.stream()
.filter(row -> !row.getTaskStatus().equals(NeedStatusEnum.CONFIRM.getValue())).count());
// 总任务数
userInfo.put("oneTotalTask", oneItemTaskList.size());
}
return userInfo;
}
/**
* 首页查询:
* 查询本月上线项目
* @return List<JSONObject>
*/
private List<JSONObject> queryOnlineItem() {
// 查询本月需上线的项目
JSONObject param = new JSONObject();
param.put("userId", SecurityUtils.getCurrentUserId());
Date date = DateUtil.parse(DateUtil.today());
param.put("startDate", DateUtil.beginOfMonth(date).toString().substring(0,10));
param.put("endDate", DateUtil.endOfMonth(date).toString().substring(0,10));
List<JSONObject> onlineItemList = this.baseMapper.getOnlineItem(param);
// 查询所有任务
List<String> queryId = onlineItemList.stream()
.map(row -> row.getString("id"))
.collect(Collectors.toList());
List<DemandTask> taskList = new ArrayList<>();
if (ObjectUtil.isNotEmpty(queryId)) {
taskList = demandTaskService.list(
new QueryWrapper<DemandTask>().lambda()
.in(DemandTask::getDemandId, queryId)
);
}
// 计算完成度:完成任务 / 总任务数
for (JSONObject json : onlineItemList) {
// 当前项目总任务集合
List<DemandTask> itemTskList = taskList.stream()
.filter(row -> row.getDemandId().equals(json.getString("id")))
.collect(Collectors.toList());
// 当前项目已完成任务数
long confirmTskNum = itemTskList.stream()
.filter(row -> row.getTaskStatus().equals(NeedStatusEnum.CONFIRM.getValue())).count();
double div = NumberUtil.div(confirmTskNum, itemTskList.size());
json.put("itemConfirmPer", NumberUtil.round(NumberUtil.mul(div,100), 1));
}
return onlineItemList;
}
/**
* 首页查询:
* 未完成任务列表
* @return List<DemandTask>
*/
private List<DemandTask> queryUnConfirmTask() {
return demandTaskService.list(
new QueryWrapper<DemandTask>().lambda()
.eq(DemandTask::getDevelopId, SecurityUtils.getCurrentUserId())
.ne(DemandTask::getTaskStatus, NeedStatusEnum.CONFIRM.getValue())
);
}
/**
* 首页查询:
* 未完成项目统计
* @return List<JSONObject>
*/
private List<JSONObject> queryUnConfirmItem() {
// 查询人员未完成项目
List<JSONObject> itemUserList = this.baseMapper.getItemUser(SecurityUtils.getCurrentUserId());
// 查询未完成项目对应的任务
List<String> queryId = itemUserList.stream()
.map(row -> row.getString("demandId"))
.collect(Collectors.toList());
List<DemandTask> taskList = new ArrayList<>();
if (ObjectUtil.isNotEmpty(queryId)) {
taskList = demandTaskService.list(
new QueryWrapper<DemandTask>().lambda()
.in(DemandTask::getDemandId, queryId)
);
}
for (JSONObject json : itemUserList) {
// 总任务
List<DemandTask> allTsk = taskList.stream()
.filter(row -> row.getDemandId().equals(json.getString("demandId")))
.collect(Collectors.toList());
json.put("allTaskNum",allTsk.size());
// 已完成
long count = allTsk.stream()
.filter(row -> row.getTaskStatus().equals(NeedStatusEnum.CONFIRM.getValue()))
.count();
json.put("ConfirmTaskNum",count);
// 未完成
json.put("UnConfirmTaskNum",NumberUtil.sub(allTsk.size(),count));
}
return itemUserList;
}
/**
* 新增修改时校验需求是否重复
* @param dao 需求实体类
@@ -241,6 +437,5 @@ public class DemanDmanageServiceImpl extends ServiceImpl<DemanDmanageMapper, Dem
if (ObjectUtil.isNotEmpty(collect)) {
throw new BadRequestException("当前项目编码【"+dao.getProjectCode()+"】存在相同版本的需求!");
}
}
}

View File

@@ -92,4 +92,10 @@ public interface DemandTaskService extends IService<DemandTask> {
* @param dao 任务实体类
*/
void startTask(DemandTask dao);
/**
* 完成任务
* @param dao 任务实体类
*/
void confirmTask(DemandTask dao);
}

View File

@@ -47,6 +47,7 @@
<where>
1 = 1
and roles.role_id = '1873638956067852288'
and a.user_id != '1'
</where>
</select>

View File

@@ -162,4 +162,23 @@ public class DemandTaskServiceImpl extends ServiceImpl<DemandTaskMapper, DemandT
dao.setTaskStatus(NeedStatusEnum.DEVELOPING.getValue());
this.baseMapper.updateById(dao);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void confirmTask(DemandTask dao) {
// 计算消耗时间:当前时间 - 开始时间
DateTime nowDate = DateUtil.parse(DateUtil.now());
DateTime startDate = DateUtil.parse(dao.getStartDate());
long useDate = DateUtil.between(nowDate, startDate, DateUnit.HOUR);
// 计算剩余时间:预计完成时间 -消耗时间
String surplusDate = NumberUtil.sub(dao.getPlanDate(), String.valueOf(useDate)).toString();
dao.setUseDate(String.valueOf(useDate));
dao.setSurplusDate(surplusDate);
dao.setTaskStatus(NeedStatusEnum.CONFIRM.getValue());
dao.setConfirmId(SecurityUtils.getCurrentUserId());
dao.setConfirmName(SecurityUtils.getCurrentNickName());
dao.setConfirmDate(DateUtil.now());
this.updateById(dao);
}
}