预设项目进度控制
This commit is contained in:
@@ -6,6 +6,7 @@ import java.util.Arrays;
|
|||||||
|
|
||||||
import com.baomidou.dynamic.datasource.annotation.DSTransactional;
|
import com.baomidou.dynamic.datasource.annotation.DSTransactional;
|
||||||
import com.ruoyi.oa.domain.bo.SysOaWarehouseDetailBo;
|
import com.ruoyi.oa.domain.bo.SysOaWarehouseDetailBo;
|
||||||
|
import com.ruoyi.oa.domain.vo.SysOaFileVo;
|
||||||
import com.ruoyi.oa.domain.vo.SysOaOutWarehouseListVo;
|
import com.ruoyi.oa.domain.vo.SysOaOutWarehouseListVo;
|
||||||
import com.ruoyi.oa.mapper.SysOaTaskMapper;
|
import com.ruoyi.oa.mapper.SysOaTaskMapper;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
@@ -130,9 +131,7 @@ public class SysOaProjectController extends BaseController {
|
|||||||
@DSTransactional
|
@DSTransactional
|
||||||
@DeleteMapping("/{projectIds}")
|
@DeleteMapping("/{projectIds}")
|
||||||
public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] projectIds) {
|
public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] projectIds) {
|
||||||
Arrays.asList(projectIds).forEach(v ->{
|
Arrays.asList(projectIds).forEach(sysOaTaskMapper::deleteSysOaTaskByProjectId);
|
||||||
sysOaTaskMapper.deleteSysOaTaskByProjectId(v);
|
|
||||||
});
|
|
||||||
return toAjax(iSysOaProjectService.deleteWithValidByIds(Arrays.asList(projectIds), true));
|
return toAjax(iSysOaProjectService.deleteWithValidByIds(Arrays.asList(projectIds), true));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,4 +143,10 @@ public class SysOaProjectController extends BaseController {
|
|||||||
public TableDataInfo<SysOaOutWarehouseListVo> outWareList(SysOaWarehouseDetailBo bo, PageQuery pageQuery) {
|
public TableDataInfo<SysOaOutWarehouseListVo> outWareList(SysOaWarehouseDetailBo bo, PageQuery pageQuery) {
|
||||||
return iSysOaProjectService.queryOutWarePageList(bo, pageQuery);
|
return iSysOaProjectService.queryOutWarePageList(bo, pageQuery);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@GetMapping("/files")
|
||||||
|
public TableDataInfo<SysOaProjectVo> files(SysOaWarehouseDetailBo bo, PageQuery pageQuery) {
|
||||||
|
return iSysOaProjectService.queryFiles(bo, pageQuery);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -81,27 +81,6 @@ public class SysOaTaskController extends BaseController {
|
|||||||
return R.ok(iSysOaTaskService.listDocumentProject(projectId));
|
return R.ok(iSysOaTaskService.listDocumentProject(projectId));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 根据工作类型字典查询任务列表
|
|
||||||
* @param pid
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@GetMapping("/getTaskByDictType/{pid}")
|
|
||||||
public R taskByDictType(@PathVariable Long pid){
|
|
||||||
R taskByDictList = iSysOaTaskService.queryTaskByDictList(pid);
|
|
||||||
return R.ok("ok", taskByDictList);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 根据工作类型查询列表
|
|
||||||
* @param bo
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@GetMapping("/listByType")
|
|
||||||
public List<SysOaTaskVo> listByType(SysOaTaskBo bo){
|
|
||||||
return iSysOaTaskService.queryListByType(bo);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 导出任务管理列表
|
* 导出任务管理列表
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -140,4 +140,9 @@ public class SysOaTask extends BaseEntity {
|
|||||||
*/
|
*/
|
||||||
private Date tempTime;
|
private Date tempTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件
|
||||||
|
*/
|
||||||
|
private String files;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -80,4 +80,5 @@ public class SysOaTaskItem extends BaseEntity {
|
|||||||
*/
|
*/
|
||||||
private String remark;
|
private String remark;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -182,4 +182,6 @@ public class SysOaTaskBo extends BaseEntity {
|
|||||||
|
|
||||||
|
|
||||||
private Long itemStatus;
|
private Long itemStatus;
|
||||||
|
|
||||||
|
private String files;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,9 +9,10 @@ import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
|||||||
import com.alibaba.excel.annotation.ExcelProperty;
|
import com.alibaba.excel.annotation.ExcelProperty;
|
||||||
import com.ruoyi.common.annotation.ExcelDictFormat;
|
import com.ruoyi.common.annotation.ExcelDictFormat;
|
||||||
import com.ruoyi.common.convert.ExcelDictConvert;
|
import com.ruoyi.common.convert.ExcelDictConvert;
|
||||||
|
import com.ruoyi.oa.domain.SysOaTask;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -212,4 +213,10 @@ public class SysOaProjectVo {
|
|||||||
* 项目剩余时间
|
* 项目剩余时间
|
||||||
*/
|
*/
|
||||||
private Long remainTime;
|
private Long remainTime;
|
||||||
|
|
||||||
|
private List<SysOaTaskVo> taskList;
|
||||||
|
/**
|
||||||
|
* 最近更新时间
|
||||||
|
*/
|
||||||
|
private Date updateTime;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,4 +107,7 @@ public class SysOaTaskItemVo {
|
|||||||
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
|
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
|
||||||
@DateTimeFormat(pattern = "yyyy-MM-dd")
|
@DateTimeFormat(pattern = "yyyy-MM-dd")
|
||||||
private Date completedTime;
|
private Date completedTime;
|
||||||
|
|
||||||
|
|
||||||
|
private String nickName;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ public class SysOaTaskVo {
|
|||||||
*/
|
*/
|
||||||
@ExcelProperty(value = "工作类型", converter = ExcelDictConvert.class)
|
@ExcelProperty(value = "工作类型", converter = ExcelDictConvert.class)
|
||||||
@ExcelDictFormat(dictType = "sys_work_type")
|
@ExcelDictFormat(dictType = "sys_work_type")
|
||||||
private String taskType;
|
private Long taskType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 优先级
|
* 优先级
|
||||||
|
|||||||
@@ -39,4 +39,7 @@ public interface SysOaProjectMapper extends BaseMapperPlus<SysOaProjectMapper, S
|
|||||||
Map<String, Object> selectProjectDetails(@Param("projectId") Long projectId);
|
Map<String, Object> selectProjectDetails(@Param("projectId") Long projectId);
|
||||||
|
|
||||||
Page<SysOaProjectVo> selectVoPlus(@Param("page") Page<SysOaProjectVo> build,@Param(Constants.WRAPPER) LambdaQueryWrapper<SysOaProject> lqw);
|
Page<SysOaProjectVo> selectVoPlus(@Param("page") Page<SysOaProjectVo> build,@Param(Constants.WRAPPER) LambdaQueryWrapper<SysOaProject> lqw);
|
||||||
|
|
||||||
|
Page<SysOaProjectVo> selectFileVoList(@Param("page") Page<Object> build, @Param(Constants.WRAPPER) QueryWrapper<SysOaProject> sysOaProjectQueryWrapper);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,4 +64,6 @@ public interface ISysOaProjectService {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
List<SysOaProjectVo> getProjectDataByMonthAndDate();
|
List<SysOaProjectVo> getProjectDataByMonthAndDate();
|
||||||
|
|
||||||
|
TableDataInfo<SysOaProjectVo> queryFiles(SysOaWarehouseDetailBo bo, PageQuery pageQuery);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,19 +33,6 @@ public interface ISysOaTaskService {
|
|||||||
*/
|
*/
|
||||||
List<SysOaTaskVo> queryList(SysOaTaskBo bo);
|
List<SysOaTaskVo> queryList(SysOaTaskBo bo);
|
||||||
|
|
||||||
/****
|
|
||||||
* 据工作类型字典查询任务列表
|
|
||||||
* @param pid
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
R queryTaskByDictList(Long pid);
|
|
||||||
/**
|
|
||||||
* 根据工作类型查询列表
|
|
||||||
* @param bo
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
List<SysOaTaskVo> queryListByType(SysOaTaskBo bo);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 新增任务管理
|
* 新增任务管理
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -79,9 +79,7 @@ public class SysOaHolidayServiceImpl implements ISysOaHolidayService {
|
|||||||
Map<String, Object> params = bo.getParams();
|
Map<String, Object> params = bo.getParams();
|
||||||
LambdaQueryWrapper<SysOaHoliday> lqw = Wrappers.lambdaQuery();
|
LambdaQueryWrapper<SysOaHoliday> lqw = Wrappers.lambdaQuery();
|
||||||
lqw.eq(bo.getType() != null, SysOaHoliday::getType, bo.getType());
|
lqw.eq(bo.getType() != null, SysOaHoliday::getType, bo.getType());
|
||||||
System.out.println(bo);
|
|
||||||
if (bo.getHolidayTime() != null) {
|
if (bo.getHolidayTime() != null) {
|
||||||
System.out.println("今年考了哈士大夫");
|
|
||||||
lqw.between(SysOaHoliday::getHolidayTime, getFirstDay(bo.getHolidayTime()),getLastDay(bo.getHolidayTime()));
|
lqw.between(SysOaHoliday::getHolidayTime, getFirstDay(bo.getHolidayTime()),getLastDay(bo.getHolidayTime()));
|
||||||
}
|
}
|
||||||
lqw.like(StringUtils.isNotBlank(bo.getName()), SysOaHoliday::getName, bo.getName());
|
lqw.like(StringUtils.isNotBlank(bo.getName()), SysOaHoliday::getName, bo.getName());
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
import com.ruoyi.oa.domain.bo.SysOaWarehouseDetailBo;
|
import com.ruoyi.oa.domain.bo.SysOaWarehouseDetailBo;
|
||||||
import com.ruoyi.oa.domain.vo.SysOaOutWarehouseListVo;
|
import com.ruoyi.oa.domain.vo.SysOaOutWarehouseListVo;
|
||||||
|
import com.ruoyi.oa.domain.vo.SysOaTaskVo;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import com.ruoyi.oa.domain.bo.SysOaProjectBo;
|
import com.ruoyi.oa.domain.bo.SysOaProjectBo;
|
||||||
@@ -20,6 +21,7 @@ import com.ruoyi.oa.mapper.SysOaProjectMapper;
|
|||||||
import com.ruoyi.oa.service.ISysOaProjectService;
|
import com.ruoyi.oa.service.ISysOaProjectService;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 项目管理Service业务层处理
|
* 项目管理Service业务层处理
|
||||||
@@ -153,6 +155,57 @@ public class SysOaProjectServiceImpl implements ISysOaProjectService {
|
|||||||
return projectVos;
|
return projectVos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TableDataInfo<SysOaProjectVo> queryFiles(SysOaWarehouseDetailBo bo, PageQuery pageQuery) {
|
||||||
|
QueryWrapper<SysOaProject> sysOaProjectQueryWrapper = buildOutWareQueryWrapper(bo);
|
||||||
|
sysOaProjectQueryWrapper.groupBy("sop.project_id","sop.project_name","t.task_id","t.task_type","t.status","nick_name","ti.item_id","ti.sign_time","sop.create_time");
|
||||||
|
// sysOaProjectQueryWrapper.having("file_urls IS NOT NULL");
|
||||||
|
Page<SysOaProjectVo> result = baseMapper.selectFileVoList(pageQuery.build(), sysOaProjectQueryWrapper);
|
||||||
|
List<SysOaProjectVo> projects = result.getRecords();
|
||||||
|
// 2) 遍历每个项目,对其 taskList 做补充
|
||||||
|
for (SysOaProjectVo project : projects) {
|
||||||
|
List<SysOaTaskVo> taskList = project.getTaskList();
|
||||||
|
if (taskList == null || taskList.isEmpty()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2.1 取出已经出现的 taskType
|
||||||
|
Set<Long> existingTypes = taskList.stream()
|
||||||
|
.map(SysOaTaskVo::getTaskType)
|
||||||
|
.filter(Objects::nonNull)
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
|
||||||
|
// 2.2 找出最大 taskType
|
||||||
|
Long maxType = existingTypes.stream().max(Long::compareTo).orElse(0L);
|
||||||
|
if (maxType <= 1) {
|
||||||
|
// 如果最大只有1,且你仍想补齐1..1,那其实啥都不补。
|
||||||
|
// 也可以补其它逻辑
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2.3 在 1..maxType 范围内检查是否缺失
|
||||||
|
for (Long type = 1L; type <= maxType; type++) {
|
||||||
|
if (!existingTypes.contains(type)) {
|
||||||
|
// 缺失则插入一个空对象
|
||||||
|
SysOaTaskVo emptyTask = new SysOaTaskVo();
|
||||||
|
emptyTask.setTaskType(type);
|
||||||
|
// 例如给 status 默认 0, 或者不赋值
|
||||||
|
emptyTask.setStatus(null);
|
||||||
|
// 任务item列表为空
|
||||||
|
emptyTask.setTaskItemVoList(new ArrayList<>());
|
||||||
|
// 其他字段如 nickName, createTime, etc. 也可设为空或默认值
|
||||||
|
|
||||||
|
taskList.add(emptyTask);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 此时taskList已经包含了 1..maxType 全部类型
|
||||||
|
// 如果你想让结果中的 taskType 从大到小排序或从小到大排序,再手动sort一下
|
||||||
|
taskList.sort(Comparator.comparing(SysOaTaskVo::getTaskType));
|
||||||
|
}
|
||||||
|
return TableDataInfo.build(result);
|
||||||
|
}
|
||||||
|
|
||||||
private QueryWrapper<SysOaProject> buildOutWareQueryWrapper(SysOaWarehouseDetailBo bo) {
|
private QueryWrapper<SysOaProject> buildOutWareQueryWrapper(SysOaWarehouseDetailBo bo) {
|
||||||
QueryWrapper<SysOaProject> lqw = Wrappers.query();
|
QueryWrapper<SysOaProject> lqw = Wrappers.query();
|
||||||
lqw.like(StringUtils.isNotBlank(bo.getProjectName()), "sop.projec_name", bo.getProjectName());
|
lqw.like(StringUtils.isNotBlank(bo.getProjectName()), "sop.projec_name", bo.getProjectName());
|
||||||
|
|||||||
@@ -107,60 +107,6 @@ public class SysOaTaskServiceImpl implements ISysOaTaskService {
|
|||||||
return TableDataInfo.build(result);
|
return TableDataInfo.build(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 据工作类型字典查询任务列表
|
|
||||||
* @param pid
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public R queryTaskByDictList(Long pid){
|
|
||||||
List<Object> objects = new ArrayList<>();
|
|
||||||
List<SysDictData> sysWorkType = dictTypeService.selectDictDataByType("sys_work_type");
|
|
||||||
sysWorkType.forEach(item -> {
|
|
||||||
SysOaTaskBo sysOaTaskBo = new SysOaTaskBo();
|
|
||||||
sysOaTaskBo.setProjectId(pid);
|
|
||||||
sysOaTaskBo.setTaskType(item.getDictValue());
|
|
||||||
List<SysOaTaskVo> sysOaTaskVos = this.queryListByType(sysOaTaskBo);
|
|
||||||
Map<String, Object> ajax = new HashMap<>();
|
|
||||||
ajax.put("dictLabel", item.getDictLabel());
|
|
||||||
ajax.put("dictValue", item.getDictValue());
|
|
||||||
ajax.put("taskList", sysOaTaskVos);
|
|
||||||
ajax.put("size", "large");
|
|
||||||
ajax.put("type", "primary");
|
|
||||||
ajax.put("icon", "el-icon-more");
|
|
||||||
ajax.put("color", "#cccccc");
|
|
||||||
objects.add(ajax);
|
|
||||||
});
|
|
||||||
//根据项目id获取任务列表类型属性最大的值
|
|
||||||
SysOaTaskBo task = new SysOaTaskBo();
|
|
||||||
task.setProjectId(pid);
|
|
||||||
List<SysOaTaskVo> taskVos = this.queryListByType(task);
|
|
||||||
List<Integer> collect = taskVos.stream().map(v -> Integer.parseInt(v.getTaskType())).collect(Collectors.toList());
|
|
||||||
OptionalInt max = collect.stream().mapToInt(Integer::intValue).max();
|
|
||||||
Map<String, Object> map = new HashMap<>();
|
|
||||||
if(max.isPresent()){
|
|
||||||
map.put("active", max.getAsInt());
|
|
||||||
}else {
|
|
||||||
map.put("active", 0);
|
|
||||||
}
|
|
||||||
map.put("taskList", objects);
|
|
||||||
return R.ok(map);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 根据工作类型查询列表
|
|
||||||
* @param bo
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public List<SysOaTaskVo> queryListByType(SysOaTaskBo bo){
|
|
||||||
LambdaQueryWrapper<SysOaTask> lqw = new LambdaQueryWrapper<>();
|
|
||||||
lqw.eq(bo.getProjectId()!=null, SysOaTask::getProjectId, bo.getProjectId());
|
|
||||||
lqw.like(bo.getTaskTitle()!=null, SysOaTask::getTaskTitle, bo.getTaskTitle());
|
|
||||||
lqw.eq(StringUtils.isNotBlank(bo.getTaskType()),SysOaTask::getTaskType, bo.getTaskType());
|
|
||||||
return baseMapper.selectVoList(lqw);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询任务管理列表
|
* 查询任务管理列表
|
||||||
*/
|
*/
|
||||||
@@ -197,7 +143,7 @@ public class SysOaTaskServiceImpl implements ISysOaTaskService {
|
|||||||
lqw.eq(bo.getState()!=null, "sot.state", bo.getState());
|
lqw.eq(bo.getState()!=null, "sot.state", bo.getState());
|
||||||
lqw.eq(bo.getItemStatus()!=null, "soti.status", bo.getItemStatus());
|
lqw.eq(bo.getItemStatus()!=null, "soti.status", bo.getItemStatus());
|
||||||
lqw.like(bo.getTaskTitle()!=null, "sot.task_title", bo.getTaskTitle());
|
lqw.like(bo.getTaskTitle()!=null, "sot.task_title", bo.getTaskTitle());
|
||||||
|
lqw.isNotNull("sot.task_title");
|
||||||
lqw.like(bo.getTaskTitle()!=null, "sot.task_title", bo.getTaskTitle());
|
lqw.like(bo.getTaskTitle()!=null, "sot.task_title", bo.getTaskTitle());
|
||||||
lqw.like(bo.getCreateUserNickName()!=null, "su1.nick_name", bo.getCreateUserNickName());
|
lqw.like(bo.getCreateUserNickName()!=null, "su1.nick_name", bo.getCreateUserNickName());
|
||||||
lqw.like(bo.getWorkerNickName()!=null, "su2.nick_name", bo.getWorkerNickName());
|
lqw.like(bo.getWorkerNickName()!=null, "su2.nick_name", bo.getWorkerNickName());
|
||||||
@@ -209,11 +155,19 @@ public class SysOaTaskServiceImpl implements ISysOaTaskService {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Boolean insertByBo(SysOaTaskBo bo) {
|
public Boolean insertByBo(SysOaTaskBo bo) {
|
||||||
|
List<Long> workerIdList = new ArrayList<>();
|
||||||
// 拿到所有的执行人id列表进行遍历添加
|
// 拿到所有的执行人id列表进行遍历添加
|
||||||
List<Long> workerIdList = Arrays.stream( bo.getWorkerIds().split(","))
|
if (bo.getWorkerId()!=null) {
|
||||||
.map(Long::valueOf)
|
workerIdList = Arrays.stream( bo.getWorkerIds().split(","))
|
||||||
.collect(Collectors.toList());
|
.map(Long::valueOf)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}else{
|
||||||
|
bo.setBeginTime(new Date());
|
||||||
|
bo.setCompletedTime(new Date());
|
||||||
|
bo.setFinishTime(new Date());
|
||||||
|
workerIdList.add(LoginHelper.getUserId());
|
||||||
|
}
|
||||||
|
|
||||||
boolean flag = false;
|
boolean flag = false;
|
||||||
for (Long workerId : workerIdList) {
|
for (Long workerId : workerIdList) {
|
||||||
if(Objects.nonNull(bo.getAccessory())){
|
if(Objects.nonNull(bo.getAccessory())){
|
||||||
@@ -221,8 +175,17 @@ public class SysOaTaskServiceImpl implements ISysOaTaskService {
|
|||||||
.map(String::valueOf)
|
.map(String::valueOf)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
String fileIds = fileService.insertFiles(fileUrls);
|
String fileIds = fileService.insertFiles(fileUrls);
|
||||||
|
|
||||||
bo.setAccessory(fileIds);
|
bo.setAccessory(fileIds);
|
||||||
}
|
}
|
||||||
|
if (Objects.nonNull(bo.getFiles())) {
|
||||||
|
List<String> fileUrls = Arrays.stream(bo.getFiles().split(","))
|
||||||
|
.map(String::valueOf)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
String fileIds = fileService.insertFiles(fileUrls);
|
||||||
|
|
||||||
|
bo.setFiles(fileIds);
|
||||||
|
}
|
||||||
SysOaTask add = BeanUtil.toBean(bo, SysOaTask.class);
|
SysOaTask add = BeanUtil.toBean(bo, SysOaTask.class);
|
||||||
add.setCreateUserId(LoginHelper.getUserId());
|
add.setCreateUserId(LoginHelper.getUserId());
|
||||||
validEntityBeforeSave(add);
|
validEntityBeforeSave(add);
|
||||||
|
|||||||
@@ -184,87 +184,73 @@
|
|||||||
SELECT JSON_OBJECT(
|
SELECT JSON_OBJECT(
|
||||||
'userCostList',
|
'userCostList',
|
||||||
COALESCE(
|
COALESCE(
|
||||||
(
|
(SELECT JSON_ARRAYAGG(
|
||||||
SELECT JSON_ARRAYAGG(
|
JSON_OBJECT(
|
||||||
JSON_OBJECT(
|
'userId', CAST(uc.userId AS CHAR),
|
||||||
'userId', CAST(uc.userId AS CHAR),
|
'nickName', COALESCE(uc.nickName, ''),
|
||||||
'nickName', COALESCE(uc.nickName, ''),
|
'laborCost', ROUND(COALESCE(uc.laborCost, 0), 1),
|
||||||
'laborCost', ROUND(COALESCE(uc.laborCost, 0), 1),
|
'attendenceNum', ROUND(COALESCE(uc.attendenceNum, 0), 1)
|
||||||
'attendenceNum', ROUND(COALESCE(uc.attendenceNum, 0), 1)
|
)
|
||||||
)
|
)
|
||||||
)
|
FROM (SELECT a.user_id AS userId,
|
||||||
FROM (
|
u.nick_name AS nickName,
|
||||||
SELECT
|
COALESCE(
|
||||||
a.user_id AS userId,
|
SUM(
|
||||||
u.nick_name AS nickName,
|
ROUND((a.day_length * 9 + a.hour) / 9, 1) * u.labor_cost
|
||||||
COALESCE(
|
),
|
||||||
SUM(
|
0
|
||||||
ROUND((a.day_length * 9 + a.hour) / 9, 1) * u.labor_cost
|
) AS laborCost,
|
||||||
),
|
COALESCE(
|
||||||
0
|
ROUND(
|
||||||
) AS laborCost,
|
SUM((a.day_length * 9 + a.hour) / 9), 1
|
||||||
COALESCE(
|
),
|
||||||
ROUND(
|
0
|
||||||
SUM((a.day_length * 9 + a.hour) / 9), 1
|
) AS attendenceNum
|
||||||
),
|
FROM sys_oa_attendance a
|
||||||
0
|
INNER JOIN sys_user u
|
||||||
) AS attendenceNum
|
ON a.user_id = u.user_id
|
||||||
FROM sys_oa_attendance a
|
WHERE a.project_id = #{projectId}
|
||||||
INNER JOIN sys_user u
|
AND a.del_flag = 0
|
||||||
ON a.user_id = u.user_id
|
GROUP BY a.user_id) uc),
|
||||||
WHERE a.project_id = #{projectId}
|
|
||||||
AND a.del_flag = 0
|
|
||||||
GROUP BY a.user_id
|
|
||||||
) uc
|
|
||||||
),
|
|
||||||
JSON_ARRAY()
|
JSON_ARRAY()
|
||||||
),
|
),
|
||||||
|
|
||||||
'materialList',
|
'materialList',
|
||||||
COALESCE(
|
COALESCE(
|
||||||
(
|
(SELECT JSON_ARRAYAGG(
|
||||||
SELECT JSON_ARRAYAGG(
|
JSON_OBJECT(
|
||||||
JSON_OBJECT(
|
'detailId', CAST(d.detail_id AS CHAR),
|
||||||
'detailId', CAST(d.detail_id AS CHAR),
|
'detailTitle', COALESCE(d.detail_title, ''),
|
||||||
'detailTitle', COALESCE(d.detail_title, ''),
|
'price', COALESCE(d.price, 0),
|
||||||
'price', COALESCE(d.price, 0),
|
'financeParties', COALESCE(f.finance_parties, ''),
|
||||||
'financeParties', COALESCE(f.finance_parties, ''),
|
'remark', COALESCE(f.remark, '')
|
||||||
'remark', COALESCE(f.remark, '')
|
)
|
||||||
)
|
)
|
||||||
)
|
FROM sys_oa_finance f
|
||||||
FROM sys_oa_finance f
|
INNER JOIN sys_oa_detail d
|
||||||
INNER JOIN sys_oa_detail d
|
ON f.finance_id = d.finance_id
|
||||||
ON f.finance_id = d.finance_id
|
WHERE f.project_id = #{projectId}
|
||||||
WHERE f.project_id = #{projectId}
|
AND f.finance_type = 0),
|
||||||
AND f.finance_type = 0
|
|
||||||
),
|
|
||||||
JSON_ARRAY()
|
JSON_ARRAY()
|
||||||
),
|
),
|
||||||
|
|
||||||
'claimList',
|
'claimList',
|
||||||
COALESCE(
|
COALESCE(
|
||||||
(
|
(SELECT JSON_ARRAYAGG(
|
||||||
SELECT JSON_ARRAYAGG(
|
JSON_OBJECT(
|
||||||
JSON_OBJECT(
|
'claimId', CAST(cl.claimId AS CHAR),
|
||||||
'claimId', CAST(cl.claimId AS CHAR),
|
'nickName', COALESCE(cl.nickName, ''),
|
||||||
'nickName', COALESCE(cl.nickName, ''),
|
'cost', COALESCE(cl.cost, 0),
|
||||||
'cost', COALESCE(cl.cost, 0),
|
'remark', COALESCE(cl.remark, '')
|
||||||
'remark', COALESCE(cl.remark, '')
|
)
|
||||||
)
|
)
|
||||||
)
|
FROM (SELECT c.claim_id AS claimId,
|
||||||
FROM (
|
COALESCE(u.nick_name, '') AS nickName,
|
||||||
SELECT
|
COALESCE(c.cost, 0) AS cost,
|
||||||
c.claim_id AS claimId,
|
COALESCE(c.remark, '') AS remark
|
||||||
COALESCE(u.nick_name, '') AS nickName,
|
FROM sys_oa_claim c
|
||||||
COALESCE(c.cost, 0) AS cost,
|
INNER JOIN sys_user u
|
||||||
COALESCE(c.remark, '') AS remark
|
ON c.user_id = u.user_id
|
||||||
FROM sys_oa_claim c
|
WHERE c.project_id = #{projectId}
|
||||||
INNER JOIN sys_user u
|
AND c.del_flag = 0) cl),
|
||||||
ON c.user_id = u.user_id
|
|
||||||
WHERE c.project_id = #{projectId}
|
|
||||||
AND c.del_flag = 0
|
|
||||||
) cl
|
|
||||||
),
|
|
||||||
JSON_ARRAY()
|
JSON_ARRAY()
|
||||||
)
|
)
|
||||||
) AS data
|
) AS data
|
||||||
@@ -310,4 +296,88 @@
|
|||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<!-- 最内层 TaskItem -->
|
||||||
|
<resultMap id="TaskItemResultMap" type="com.ruoyi.oa.domain.vo.SysOaTaskItemVo">
|
||||||
|
<id property="itemId" column="item_id"/>
|
||||||
|
<result property="files" column="file_urls"/>
|
||||||
|
<result property="nickName" column="nick_name"/>
|
||||||
|
<result property="signTime" column="sign_time"/>
|
||||||
|
</resultMap>
|
||||||
|
|
||||||
|
<!-- Task, 包含 List<TaskItem> -->
|
||||||
|
<resultMap id="TaskResultMap" type="com.ruoyi.oa.domain.vo.SysOaTaskVo">
|
||||||
|
<id property="taskId" column="task_id"/>
|
||||||
|
<result property="taskType" column="task_type"/>
|
||||||
|
<result property="status" column="task_status"/>
|
||||||
|
|
||||||
|
<collection property="taskItemVoList"
|
||||||
|
resultMap="TaskItemResultMap"
|
||||||
|
column="item_id"
|
||||||
|
javaType="ArrayList" />
|
||||||
|
</resultMap>
|
||||||
|
|
||||||
|
<!-- Project, 包含 List<Task> -->
|
||||||
|
<resultMap id="ProjectResultMap" type="com.ruoyi.oa.domain.vo.SysOaProjectVo">
|
||||||
|
<id property="projectId" column="p_id"/>
|
||||||
|
<result property="projectName" column="project_name"/>
|
||||||
|
<result property="updateTime" column="update_time"/>
|
||||||
|
|
||||||
|
<collection property="taskList"
|
||||||
|
resultMap="TaskResultMap"
|
||||||
|
column="task_id"
|
||||||
|
javaType="ArrayList" />
|
||||||
|
</resultMap>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<select id="selectFileVoList" resultMap="ProjectResultMap">
|
||||||
|
SELECT
|
||||||
|
sop.project_id AS p_id,
|
||||||
|
sop.project_name AS project_name,
|
||||||
|
sop.update_time,
|
||||||
|
t.task_id AS task_id,
|
||||||
|
t.task_type AS task_type,
|
||||||
|
t.status AS task_status,
|
||||||
|
|
||||||
|
CASE
|
||||||
|
WHEN t.status = 0 THEN u0.nick_name
|
||||||
|
WHEN t.status = 1 THEN u1.nick_name
|
||||||
|
ELSE ''
|
||||||
|
END AS nick_name,
|
||||||
|
|
||||||
|
ti.item_id AS item_id,
|
||||||
|
case
|
||||||
|
when ti.sign_time is not null then ti.sign_time
|
||||||
|
else t.finish_time
|
||||||
|
end AS sign_time,
|
||||||
|
|
||||||
|
GROUP_CONCAT(
|
||||||
|
f.file_url
|
||||||
|
SEPARATOR ','
|
||||||
|
) AS file_urls
|
||||||
|
|
||||||
|
FROM sys_oa_project sop
|
||||||
|
LEFT JOIN sys_oa_task t
|
||||||
|
ON sop.project_id = t.project_id
|
||||||
|
|
||||||
|
LEFT JOIN sys_user u0
|
||||||
|
ON t.create_user_id = u0.user_id
|
||||||
|
|
||||||
|
LEFT JOIN sys_user u1
|
||||||
|
ON t.worker_id = u1.user_id
|
||||||
|
|
||||||
|
LEFT JOIN sys_oa_task_item ti
|
||||||
|
ON t.task_id = ti.task_id
|
||||||
|
|
||||||
|
LEFT JOIN sys_oa_file f
|
||||||
|
ON (
|
||||||
|
(t.status = 0 AND FIND_IN_SET(CONCAT(f.file_id, ''), t.files) > 0)
|
||||||
|
OR
|
||||||
|
(t.status = 1 AND FIND_IN_SET(CONCAT(f.file_id, ''), ti.files) > 0)
|
||||||
|
)
|
||||||
|
${ew.getCustomSqlSegment}
|
||||||
|
</select>
|
||||||
|
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
||||||
|
|||||||
0
script/sql/mysql/enterprise.sql
Normal file
0
script/sql/mysql/enterprise.sql
Normal file
39
script/sql/mysql/progress.sql
Normal file
39
script/sql/mysql/progress.sql
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
CREATE TABLE `oa_progress` (
|
||||||
|
`progress_id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
|
||||||
|
`project_id` BIGINT NOT NULL DEFAULT 0 COMMENT '所属项目ID(可根据实际需要)',
|
||||||
|
`type` TINYINT NOT NULL DEFAULT 1 COMMENT '进度类型:1-项目进度;2-付款进度(可根据实际约定)',
|
||||||
|
`progress_name` VARCHAR(200) NOT NULL DEFAULT '' COMMENT '进度名称',
|
||||||
|
`parent_id` BIGINT NOT NULL DEFAULT 0 COMMENT '父进度ID,0或NULL表示没有父节点',
|
||||||
|
/* 审计字段 */
|
||||||
|
`create_by` VARCHAR(40) NOT NULL DEFAULT '' COMMENT '创建者',
|
||||||
|
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
`update_by` VARCHAR(40) NOT NULL DEFAULT '' COMMENT '更新者',
|
||||||
|
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
|
`del_flag` TINYINT NOT NULL DEFAULT 0 COMMENT '删除标志:0-正常;1-删除',
|
||||||
|
/* 其他可选字段,比如排序、备注等 */
|
||||||
|
`sort` INT NOT NULL DEFAULT 0 COMMENT '排序字段(如需)',
|
||||||
|
`remark` VARCHAR(500) NOT NULL DEFAULT '' COMMENT '备注(如需)',
|
||||||
|
KEY `idx_project_id` (`project_id`),
|
||||||
|
KEY `idx_parent_id` (`parent_id`),
|
||||||
|
KEY `idx_type` (`type`)
|
||||||
|
) COMMENT '项目进度主表';
|
||||||
|
|
||||||
|
CREATE TABLE `oa_progress_detail` (
|
||||||
|
`detail_id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
|
||||||
|
`progress_id` BIGINT NOT NULL COMMENT '关联的进度ID,关联 project_progress.id',
|
||||||
|
`plan_start_date` DATE DEFAULT NULL COMMENT '计划开始日期(项目进度)',
|
||||||
|
`plan_end_date` DATE DEFAULT NULL COMMENT '计划结束日期(项目进度)',
|
||||||
|
`actual_start_date` DATE DEFAULT NULL COMMENT '实际开始日期(项目进度)',
|
||||||
|
`actual_end_date` DATE DEFAULT NULL COMMENT '实际结束日期(项目进度)',
|
||||||
|
`complete_percent` DECIMAL(5,2) NOT NULL DEFAULT 0.00 COMMENT '完成百分比(项目进度)',
|
||||||
|
`plan_pay_date` DATE DEFAULT NULL COMMENT '计划付款日期(付款进度)',
|
||||||
|
`pay_amount` DECIMAL(18,2) NOT NULL DEFAULT 0.00 COMMENT '应付金额(付款进度)',
|
||||||
|
`paid_amount` DECIMAL(18,2) NOT NULL DEFAULT 0.00 COMMENT '已付金额(付款进度)',
|
||||||
|
`create_by` VARCHAR(40) NOT NULL DEFAULT '' COMMENT '创建者',
|
||||||
|
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
`update_by` VARCHAR(40) NOT NULL DEFAULT '' COMMENT '更新者',
|
||||||
|
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
|
`del_flag` TINYINT NOT NULL DEFAULT 0 COMMENT '删除标志:0-正常;1-删除',
|
||||||
|
`remark` VARCHAR(500) NOT NULL DEFAULT '' COMMENT '备注(如需)',
|
||||||
|
KEY `idx_progress_id` (`progress_id`)
|
||||||
|
) COMMENT '项目进度/付款进度扩展表';
|
||||||
Reference in New Issue
Block a user