diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/SysOaProjectController.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/SysOaProjectController.java index a35dc4b..2846ed0 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/SysOaProjectController.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/SysOaProjectController.java @@ -6,6 +6,7 @@ import java.util.Arrays; import com.baomidou.dynamic.datasource.annotation.DSTransactional; 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.mapper.SysOaTaskMapper; import lombok.RequiredArgsConstructor; @@ -130,9 +131,7 @@ public class SysOaProjectController extends BaseController { @DSTransactional @DeleteMapping("/{projectIds}") public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] projectIds) { - Arrays.asList(projectIds).forEach(v ->{ - sysOaTaskMapper.deleteSysOaTaskByProjectId(v); - }); + Arrays.asList(projectIds).forEach(sysOaTaskMapper::deleteSysOaTaskByProjectId); return toAjax(iSysOaProjectService.deleteWithValidByIds(Arrays.asList(projectIds), true)); } @@ -144,4 +143,10 @@ public class SysOaProjectController extends BaseController { public TableDataInfo outWareList(SysOaWarehouseDetailBo bo, PageQuery pageQuery) { return iSysOaProjectService.queryOutWarePageList(bo, pageQuery); } -} + + + @GetMapping("/files") + public TableDataInfo files(SysOaWarehouseDetailBo bo, PageQuery pageQuery) { + return iSysOaProjectService.queryFiles(bo, pageQuery); + } +} \ No newline at end of file diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/SysOaTaskController.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/SysOaTaskController.java index abc80b8..518b4d5 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/SysOaTaskController.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/SysOaTaskController.java @@ -81,27 +81,6 @@ public class SysOaTaskController extends BaseController { 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 listByType(SysOaTaskBo bo){ - return iSysOaTaskService.queryListByType(bo); - } - /** * 导出任务管理列表 */ diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/SysOaTask.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/SysOaTask.java index 6f42330..f7033d3 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/SysOaTask.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/SysOaTask.java @@ -140,4 +140,9 @@ public class SysOaTask extends BaseEntity { */ private Date tempTime; + /** + * 文件 + */ + private String files; + } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/SysOaTaskItem.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/SysOaTaskItem.java index c90b1b4..f9ee748 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/SysOaTaskItem.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/SysOaTaskItem.java @@ -80,4 +80,5 @@ public class SysOaTaskItem extends BaseEntity { */ private String remark; + } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/SysOaTaskBo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/SysOaTaskBo.java index 3ea67a4..c1ecfa4 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/SysOaTaskBo.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/SysOaTaskBo.java @@ -182,4 +182,6 @@ public class SysOaTaskBo extends BaseEntity { private Long itemStatus; + + private String files; } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaProjectVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaProjectVo.java index e3d4133..7964551 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaProjectVo.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaProjectVo.java @@ -9,9 +9,10 @@ import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; import com.ruoyi.common.annotation.ExcelDictFormat; import com.ruoyi.common.convert.ExcelDictConvert; +import com.ruoyi.oa.domain.SysOaTask; import lombok.Data; import java.util.Date; - +import java.util.List; /** @@ -212,4 +213,10 @@ public class SysOaProjectVo { * 项目剩余时间 */ private Long remainTime; + + private List taskList; + /** + * 最近更新时间 + */ + private Date updateTime; } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaTaskItemVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaTaskItemVo.java index 10d53da..92a8f2c 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaTaskItemVo.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaTaskItemVo.java @@ -107,4 +107,7 @@ public class SysOaTaskItemVo { @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") @DateTimeFormat(pattern = "yyyy-MM-dd") private Date completedTime; + + + private String nickName; } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaTaskVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaTaskVo.java index 35cb19d..2ca9840 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaTaskVo.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaTaskVo.java @@ -49,7 +49,7 @@ public class SysOaTaskVo { */ @ExcelProperty(value = "工作类型", converter = ExcelDictConvert.class) @ExcelDictFormat(dictType = "sys_work_type") - private String taskType; + private Long taskType; /** * 优先级 diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaProjectMapper.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaProjectMapper.java index c729345..a3b1c2f 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaProjectMapper.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaProjectMapper.java @@ -39,4 +39,7 @@ public interface SysOaProjectMapper extends BaseMapperPlus selectProjectDetails(@Param("projectId") Long projectId); Page selectVoPlus(@Param("page") Page build,@Param(Constants.WRAPPER) LambdaQueryWrapper lqw); + + Page selectFileVoList(@Param("page") Page build, @Param(Constants.WRAPPER) QueryWrapper sysOaProjectQueryWrapper); + } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaProjectService.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaProjectService.java index 711af0f..832dbe3 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaProjectService.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaProjectService.java @@ -64,4 +64,6 @@ public interface ISysOaProjectService { * @return */ List getProjectDataByMonthAndDate(); + + TableDataInfo queryFiles(SysOaWarehouseDetailBo bo, PageQuery pageQuery); } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaTaskService.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaTaskService.java index deb6252..256cfa6 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaTaskService.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaTaskService.java @@ -33,19 +33,6 @@ public interface ISysOaTaskService { */ List queryList(SysOaTaskBo bo); - /**** - * 据工作类型字典查询任务列表 - * @param pid - * @return - */ - R queryTaskByDictList(Long pid); - /** - * 根据工作类型查询列表 - * @param bo - * @return - */ - List queryListByType(SysOaTaskBo bo); - /** * 新增任务管理 */ diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaHolidayServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaHolidayServiceImpl.java index 3b02ed7..b8246fc 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaHolidayServiceImpl.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaHolidayServiceImpl.java @@ -79,9 +79,7 @@ public class SysOaHolidayServiceImpl implements ISysOaHolidayService { Map params = bo.getParams(); LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); lqw.eq(bo.getType() != null, SysOaHoliday::getType, bo.getType()); - System.out.println(bo); if (bo.getHolidayTime() != null) { - System.out.println("今年考了哈士大夫"); lqw.between(SysOaHoliday::getHolidayTime, getFirstDay(bo.getHolidayTime()),getLastDay(bo.getHolidayTime())); } lqw.like(StringUtils.isNotBlank(bo.getName()), SysOaHoliday::getName, bo.getName()); diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaProjectServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaProjectServiceImpl.java index f1e8ee5..83b45d7 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaProjectServiceImpl.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaProjectServiceImpl.java @@ -11,6 +11,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.oa.domain.bo.SysOaWarehouseDetailBo; import com.ruoyi.oa.domain.vo.SysOaOutWarehouseListVo; +import com.ruoyi.oa.domain.vo.SysOaTaskVo; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import com.ruoyi.oa.domain.bo.SysOaProjectBo; @@ -20,6 +21,7 @@ import com.ruoyi.oa.mapper.SysOaProjectMapper; import com.ruoyi.oa.service.ISysOaProjectService; import java.util.*; +import java.util.stream.Collectors; /** * 项目管理Service业务层处理 @@ -153,6 +155,57 @@ public class SysOaProjectServiceImpl implements ISysOaProjectService { return projectVos; } + @Override + public TableDataInfo queryFiles(SysOaWarehouseDetailBo bo, PageQuery pageQuery) { + QueryWrapper 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 result = baseMapper.selectFileVoList(pageQuery.build(), sysOaProjectQueryWrapper); + List projects = result.getRecords(); + // 2) 遍历每个项目,对其 taskList 做补充 + for (SysOaProjectVo project : projects) { + List taskList = project.getTaskList(); + if (taskList == null || taskList.isEmpty()) { + continue; + } + + // 2.1 取出已经出现的 taskType + Set 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 buildOutWareQueryWrapper(SysOaWarehouseDetailBo bo) { QueryWrapper lqw = Wrappers.query(); lqw.like(StringUtils.isNotBlank(bo.getProjectName()), "sop.projec_name", bo.getProjectName()); diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaTaskServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaTaskServiceImpl.java index c7c78b9..c6c06d5 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaTaskServiceImpl.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaTaskServiceImpl.java @@ -107,60 +107,6 @@ public class SysOaTaskServiceImpl implements ISysOaTaskService { return TableDataInfo.build(result); } - /** - * 据工作类型字典查询任务列表 - * @param pid - * @return - */ - @Override - public R queryTaskByDictList(Long pid){ - List objects = new ArrayList<>(); - List sysWorkType = dictTypeService.selectDictDataByType("sys_work_type"); - sysWorkType.forEach(item -> { - SysOaTaskBo sysOaTaskBo = new SysOaTaskBo(); - sysOaTaskBo.setProjectId(pid); - sysOaTaskBo.setTaskType(item.getDictValue()); - List sysOaTaskVos = this.queryListByType(sysOaTaskBo); - Map 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 taskVos = this.queryListByType(task); - List collect = taskVos.stream().map(v -> Integer.parseInt(v.getTaskType())).collect(Collectors.toList()); - OptionalInt max = collect.stream().mapToInt(Integer::intValue).max(); - Map 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 queryListByType(SysOaTaskBo bo){ - LambdaQueryWrapper 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.getItemStatus()!=null, "soti.status", bo.getItemStatus()); 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.getCreateUserNickName()!=null, "su1.nick_name", bo.getCreateUserNickName()); lqw.like(bo.getWorkerNickName()!=null, "su2.nick_name", bo.getWorkerNickName()); @@ -209,11 +155,19 @@ public class SysOaTaskServiceImpl implements ISysOaTaskService { */ @Override public Boolean insertByBo(SysOaTaskBo bo) { - + List workerIdList = new ArrayList<>(); // 拿到所有的执行人id列表进行遍历添加 - List workerIdList = Arrays.stream( bo.getWorkerIds().split(",")) - .map(Long::valueOf) - .collect(Collectors.toList()); + if (bo.getWorkerId()!=null) { + workerIdList = Arrays.stream( bo.getWorkerIds().split(",")) + .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; for (Long workerId : workerIdList) { if(Objects.nonNull(bo.getAccessory())){ @@ -221,8 +175,17 @@ public class SysOaTaskServiceImpl implements ISysOaTaskService { .map(String::valueOf) .collect(Collectors.toList()); String fileIds = fileService.insertFiles(fileUrls); + bo.setAccessory(fileIds); } + if (Objects.nonNull(bo.getFiles())) { + List 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); add.setCreateUserId(LoginHelper.getUserId()); validEntityBeforeSave(add); diff --git a/ruoyi-oa/src/main/resources/mapper/oa/SysOaProjectMapper.xml b/ruoyi-oa/src/main/resources/mapper/oa/SysOaProjectMapper.xml index 262a886..9e57c17 100644 --- a/ruoyi-oa/src/main/resources/mapper/oa/SysOaProjectMapper.xml +++ b/ruoyi-oa/src/main/resources/mapper/oa/SysOaProjectMapper.xml @@ -184,87 +184,73 @@ SELECT JSON_OBJECT( 'userCostList', COALESCE( - ( - SELECT JSON_ARRAYAGG( - JSON_OBJECT( - 'userId', CAST(uc.userId AS CHAR), - 'nickName', COALESCE(uc.nickName, ''), - 'laborCost', ROUND(COALESCE(uc.laborCost, 0), 1), - 'attendenceNum', ROUND(COALESCE(uc.attendenceNum, 0), 1) - ) - ) - FROM ( - SELECT - a.user_id AS userId, - u.nick_name AS nickName, - COALESCE( - SUM( - ROUND((a.day_length * 9 + a.hour) / 9, 1) * u.labor_cost - ), - 0 - ) AS laborCost, - COALESCE( - ROUND( - SUM((a.day_length * 9 + a.hour) / 9), 1 - ), - 0 - ) AS attendenceNum - FROM sys_oa_attendance a - INNER JOIN sys_user u - ON a.user_id = u.user_id - WHERE a.project_id = #{projectId} - AND a.del_flag = 0 - GROUP BY a.user_id - ) uc - ), + (SELECT JSON_ARRAYAGG( + JSON_OBJECT( + 'userId', CAST(uc.userId AS CHAR), + 'nickName', COALESCE(uc.nickName, ''), + 'laborCost', ROUND(COALESCE(uc.laborCost, 0), 1), + 'attendenceNum', ROUND(COALESCE(uc.attendenceNum, 0), 1) + ) + ) + FROM (SELECT a.user_id AS userId, + u.nick_name AS nickName, + COALESCE( + SUM( + ROUND((a.day_length * 9 + a.hour) / 9, 1) * u.labor_cost + ), + 0 + ) AS laborCost, + COALESCE( + ROUND( + SUM((a.day_length * 9 + a.hour) / 9), 1 + ), + 0 + ) AS attendenceNum + FROM sys_oa_attendance a + INNER JOIN sys_user u + ON a.user_id = u.user_id + WHERE a.project_id = #{projectId} + AND a.del_flag = 0 + GROUP BY a.user_id) uc), JSON_ARRAY() ), - 'materialList', COALESCE( - ( - SELECT JSON_ARRAYAGG( - JSON_OBJECT( - 'detailId', CAST(d.detail_id AS CHAR), - 'detailTitle', COALESCE(d.detail_title, ''), - 'price', COALESCE(d.price, 0), - 'financeParties', COALESCE(f.finance_parties, ''), - 'remark', COALESCE(f.remark, '') - ) - ) - FROM sys_oa_finance f - INNER JOIN sys_oa_detail d - ON f.finance_id = d.finance_id - WHERE f.project_id = #{projectId} - AND f.finance_type = 0 - ), + (SELECT JSON_ARRAYAGG( + JSON_OBJECT( + 'detailId', CAST(d.detail_id AS CHAR), + 'detailTitle', COALESCE(d.detail_title, ''), + 'price', COALESCE(d.price, 0), + 'financeParties', COALESCE(f.finance_parties, ''), + 'remark', COALESCE(f.remark, '') + ) + ) + FROM sys_oa_finance f + INNER JOIN sys_oa_detail d + ON f.finance_id = d.finance_id + WHERE f.project_id = #{projectId} + AND f.finance_type = 0), JSON_ARRAY() ), - 'claimList', COALESCE( - ( - SELECT JSON_ARRAYAGG( - JSON_OBJECT( - 'claimId', CAST(cl.claimId AS CHAR), - 'nickName', COALESCE(cl.nickName, ''), - 'cost', COALESCE(cl.cost, 0), - 'remark', COALESCE(cl.remark, '') - ) - ) - FROM ( - SELECT - c.claim_id AS claimId, - COALESCE(u.nick_name, '') AS nickName, - COALESCE(c.cost, 0) AS cost, - COALESCE(c.remark, '') AS remark - FROM sys_oa_claim c - INNER JOIN sys_user u - ON c.user_id = u.user_id - WHERE c.project_id = #{projectId} - AND c.del_flag = 0 - ) cl - ), + (SELECT JSON_ARRAYAGG( + JSON_OBJECT( + 'claimId', CAST(cl.claimId AS CHAR), + 'nickName', COALESCE(cl.nickName, ''), + 'cost', COALESCE(cl.cost, 0), + 'remark', COALESCE(cl.remark, '') + ) + ) + FROM (SELECT c.claim_id AS claimId, + COALESCE(u.nick_name, '') AS nickName, + COALESCE(c.cost, 0) AS cost, + COALESCE(c.remark, '') AS remark + FROM sys_oa_claim c + INNER JOIN sys_user u + ON c.user_id = u.user_id + WHERE c.project_id = #{projectId} + AND c.del_flag = 0) cl), JSON_ARRAY() ) ) AS data @@ -310,4 +296,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/script/sql/mysql/enterprise.sql b/script/sql/mysql/enterprise.sql new file mode 100644 index 0000000..e69de29 diff --git a/script/sql/mysql/progress.sql b/script/sql/mysql/progress.sql new file mode 100644 index 0000000..10a2334 --- /dev/null +++ b/script/sql/mysql/progress.sql @@ -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 '项目进度/付款进度扩展表';