进度+文件上传重构+文件权限控制

This commit is contained in:
2025-05-10 22:17:04 +08:00
parent ca3724ff32
commit 9825e0ba1d
49 changed files with 758 additions and 664 deletions

View File

@@ -22,57 +22,53 @@
<select id="selectVoPagePlus" resultType="com.ruoyi.oa.domain.vo.OaProjectScheduleVo">
SELECT
ops.schedule_id,
ops.project_id,
ops.template_id,
ops.current_step,
opss.step_name AS currentStepName,
ops.start_time,
ops.end_time,
ops.status,
ops.remark,
SELECT ops.schedule_id,
ops.project_id,
ops.template_id,
ops.current_step,
opss.step_name AS currentStepName,
ops.start_time,
ops.end_time,
ops.status,
ops.remark,
-- 项目信息
op.project_id AS opProjectId,
op.project_name,
op.project_num,
op.project_type,
op.address,
op.funds,
op.functionary,
op.begin_time,
op.finish_time,
op.introduction,
op.project_grade,
op.project_status,
op.trade_type,
op.pre_pay,
opss.plan_end,
/* ======================== 项目信息 ==================== */
op.project_id AS opProjectId,
op.project_name,
op.project_num,
op.project_type,
op.address,
op.funds,
op.functionary,
op.begin_time,
op.finish_time,
op.introduction,
op.project_grade,
op.project_status,
op.trade_type,
op.pre_pay,
opss.plan_end,
TIMESTAMPDIFF(DAY, NOW(), opss.plan_end) AS remainTime,
ROUND(
(
(ops.current_step - CASE WHEN opss.status = 0 THEN 1 ELSE 0 END)
/ NULLIF(maxs.max_order, 0)
) * 100,
2
) AS schedulePercentage
-- 剩余天数
TIMESTAMPDIFF(DAY, NOW(), opss.plan_end) AS remainTime,
-- 进度百分比:当 current_step=1 时强制为0否则按公式计算
CASE
WHEN ops.current_step = 1 THEN 0
ELSE ROUND((ops.current_step / NULLIF(maxs.max_order,0)) * 100, 2)
END AS schedulePercentage -- 添加 NULLIF 防止除以0
FROM oa_project_schedule ops
LEFT JOIN sys_oa_project op ON ops.project_id = op.project_id
LEFT JOIN oa_project_schedule_step opss
FROM oa_project_schedule AS ops
LEFT JOIN sys_oa_project AS op ON ops.project_id = op.project_id
LEFT JOIN oa_project_schedule_step AS opss
ON ops.schedule_id = opss.schedule_id
AND opss.step_order = ops.current_step
LEFT JOIN (
SELECT
schedule_id,
MAX(step_order) AS max_order
FROM oa_project_schedule_step
GROUP BY schedule_id
) maxs ON maxs.schedule_id = ops.schedule_id
AND opss.use_flag = '1'
LEFT JOIN (SELECT schedule_id,
MAX(step_order) AS max_order
FROM oa_project_schedule_step
WHERE use_flag = '1'
GROUP BY schedule_id) AS maxs ON maxs.schedule_id = ops.schedule_id
${ew.getCustomSqlSegment}
</select>

View File

@@ -20,17 +20,29 @@
<result property="actualEnd" column="actual_end"/>
<result property="status" column="status"/>
<result property="expectedDays" column="expected_days"/>
<result property="useFlag" column="use_flag"/>
<!-- ========== 附件列表:多对一 折叠 ========= -->
<collection property="fileList"
ofType="com.ruoyi.system.domain.SysOss"
javaType="java.util.ArrayList">
<result property="ossId" column="attach_oss_id"/>
<result property="ossId" column="oss_id"/>
<result property="url" column="attach_url"/>
<result property="fileName" column="attach_file_name"/>
<result property="createBy" column="create_by"/>
<result property="isPublic" column="is_public"/>
<result property="ownerId" column="owner_id"/>
</collection>
</resultMap>
<sql id="OssVisibleCondition">
( so.is_public = 1
OR so.owner_id = #{userId}
OR EXISTS (SELECT 1 FROM sys_oss_acl a
WHERE a.oss_id = so.oss_id
AND a.user_id = #{userId}) )
</sql>
<update id="updateByStepAndScheduleId">
UPDATE oa_project_schedule_step
SET
@@ -40,6 +52,7 @@
schedule_id = #{scheduleId}
AND step_order = #{currentStep}
AND del_flag = '0'
and use_flag = '1'
</update>
<select id="maxStepByScheduleId" resultMap="OaProjectScheduleStepResult">
SELECT opss.track_id,
@@ -54,6 +67,7 @@
opss.status,
opss.del_flag,
opss.header,
opss.use_flag,
osts.expected_days,
osts.description
FROM oa_project_schedule_step opss
@@ -61,12 +75,15 @@
LEFT JOIN fad_oa.oa_schedule_template_step osts ON osts.template_id = ops.template_id AND osts.step_order = opss.step_order
WHERE opss.schedule_id = #{scheduleId}
AND opss.del_flag = '0'
and opss.use_flag = '1'
AND opss.step_order = (
SELECT MAX(step_order)
FROM oa_project_schedule_step
WHERE schedule_id = #{scheduleId}
AND del_flag = '0'
and use_flag = '1'
)
</select>
<select id="selectVoPagePlus" resultMap="OaProjectScheduleStepResult">
select opss.track_id,
@@ -81,42 +98,53 @@
opss.status,
opss.del_flag,
opss.header,
opss.use_flag,
osts.expected_days,
osts.description,
so.oss_id AS oss_id,
so.url AS attach_url,
so.original_name AS attach_file_name, -- 如有需要
so.create_by
so.create_by,
so.is_public,
so.owner_id,
batch_id
from oa_project_schedule_step opss
left join fad_oa.oa_project_schedule ops on ops.schedule_id = opss.schedule_id
left join fad_oa.oa_schedule_template_step osts on osts.template_id = ops.template_id and osts.step_order = opss.step_order
LEFT JOIN sys_oss so ON FIND_IN_SET(so.oss_id, opss.accessory)
LEFT JOIN sys_oss so ON FIND_IN_SET(so.oss_id, opss.accessory)
AND <include refid="OssVisibleCondition"/>
${ew.getCustomSqlSegment}
</select>
<select id="selectVoPlusById" resultMap="OaProjectScheduleStepResult">
select opss.track_id,
opss.accessory,
opss.schedule_id,
opss.step_order,
opss.step_name,
opss.plan_start,
opss.plan_end,
opss.actual_start,
opss.actual_end,
opss.status,
opss.del_flag,
opss.header,
osts.expected_days,
osts.description,
so.oss_id AS oss_id,
so.url AS attach_url,
so.original_name AS attach_file_name, -- 如有需要
so.create_by
opss.accessory,
opss.schedule_id,
opss.step_order,
opss.step_name,
opss.plan_start,
opss.plan_end,
opss.actual_start,
opss.actual_end,
opss.status,
opss.use_flag,
opss.del_flag,
opss.header,
osts.expected_days,
osts.description,
so.oss_id AS oss_id,
so.url AS attach_url,
so.original_name AS attach_file_name, -- 如有需要
so.create_by,
so.owner_id,
so.is_public
from oa_project_schedule_step opss
left join fad_oa.oa_project_schedule ops on ops.schedule_id = opss.schedule_id
left join fad_oa.oa_schedule_template_step osts on osts.template_id = ops.template_id and osts.step_order = opss.step_order
LEFT JOIN sys_oss so ON FIND_IN_SET(so.oss_id, opss.accessory)
where opss.track_id = #{trackId} and opss.del_flag='0'
left join fad_oa.oa_project_schedule ops on ops.schedule_id = opss.schedule_id
left join fad_oa.oa_schedule_template_step osts on osts.template_id = ops.template_id and osts.step_order =
opss.step_order
LEFT JOIN sys_oss so ON FIND_IN_SET(so.oss_id, opss.accessory)
AND
<include refid="OssVisibleCondition"/>
where opss.track_id = #{trackId} and opss.del_flag='0' and opss.use_flag = '1'
</select>
@@ -130,11 +158,13 @@
plan_end,
actual_start,
actual_end,
opss.use_flag,
status,
header
from oa_project_schedule_step opss
WHERE schedule_id = #{scheduleId}
AND step_order = #{currentStep}
and use_flag = '1'
AND del_flag = '0'
</select>

View File

@@ -20,17 +20,12 @@
</resultMap>
<select id="selectVoPagePlus" resultType="com.ruoyi.oa.domain.vo.OaScheduleTemplateStepVo">
select ANY_VALUE(step_id),
template_id,
step_order,
select max(step_id) as stepId,
max(template_id) as templateId,
max(step_order) as stepOrder,
step_name,
expected_days,
header,
create_by,
create_time,
update_by,
update_time,
del_flag,
description
from oa_schedule_template_step
${ew.getCustomSqlSegment}

View File

@@ -26,7 +26,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="projectName" column="project_name"/>
<result property="address" column="address"/>
<collection property="detailList" javaType="list" resultMap="SysOaClaimDetailResult"/>
<collection property="fileList" javaType="list" resultMap="SysOaFileResult"/>
<collection property="fileList" javaType="list" resultMap="SysOssResult"/>
</resultMap>
<resultMap type="com.ruoyi.oa.domain.SysOaClaimDetail" id="SysOaClaimDetailResult">
@@ -42,16 +42,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</resultMap>
<resultMap type="com.ruoyi.oa.domain.SysOaFile" id="SysOaFileResult">
<result property="fileId" column="file_id"/>
<result property="fileUrl" column="file_url"/>
<result property="status" column="status"/>
<resultMap type="com.ruoyi.system.domain.SysOss" id="SysOssResult">
<result property="ossId" column="oss_id"/>
<result property="url" column="file_url"/>
<result property="fileName" column="file_name"/>
<result property="createTime" column="create_time"/>
<result property="updateTime" column="update_time"/>
<result property="createBy" column="create_by"/>
<result property="updateBy" column="update_by"/>
<result property="delFlag" column="del_flag"/>
<result property="remark" column="remark"/>
</resultMap>
<select id="selectSysOaClaimVoById" resultMap="SysOaClaimResult" parameterType="Long">
@@ -73,9 +71,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
soc.del_flag,
soc.proc_ins_id,
soc.completed_time,
sof.file_id,
file_url,
status,
so.oss_id,
url,
so.file_name,
socd.claim_detail_id,
claim_type,
socd.begin_time ,
@@ -93,7 +91,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
sop.project_name
FROM sys_oa_claim soc
left join sys_oa_claim_detail socd on soc.claim_id = socd.claim_id
left JOIN sys_oa_file sof ON FIND_IN_SET(sof.file_id, soc.file_ids) > 0
left join sys_oss so on FIND_IN_SET(so.oss_id, soc.file_ids) > 0
left join sys_oa_project sop on soc.project_id = sop.project_id
where soc.claim_id = #{claimId}
</select>
@@ -144,9 +142,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
soc.del_flag,
soc.proc_ins_id,
soc.completed_time,
sof.file_id,
file_url,
status,
so.oss_id,
url,
so.file_name,
socd.claim_detail_id,
claim_type,
socd.begin_time ,
@@ -164,7 +162,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
sop.project_name
FROM sys_oa_claim soc
left join sys_oa_claim_detail socd on soc.claim_id = socd.claim_id
left JOIN sys_oa_file sof ON FIND_IN_SET(sof.file_id, soc.file_ids) > 0
left join sys_oss so on FIND_IN_SET(so.oss_id, soc.file_ids) > 0
left join sys_oa_project sop on soc.project_id = sop.project_id
where soc.proc_ins_id = #{procInsId}
</select>

View File

@@ -356,7 +356,7 @@
end AS sign_time,
GROUP_CONCAT(
f.file_url
so.url
SEPARATOR ','
) AS file_urls
@@ -373,11 +373,11 @@
LEFT JOIN sys_oa_task_item ti
ON t.task_id = ti.task_id
LEFT JOIN sys_oa_file f
LEFT JOIN sys_oss so
ON (
(t.status = 0 AND FIND_IN_SET(CONCAT(f.file_id, ''), t.files) > 0)
(t.status = 0 AND FIND_IN_SET(CONCAT(so.oss_id, ''), t.files) > 0)
OR
(t.status = 1 AND FIND_IN_SET(CONCAT(f.file_id, ''), ti.files) > 0)
(t.status = 1 AND FIND_IN_SET(CONCAT(so.oss_id, ''), ti.files) > 0)
)
${ew.getCustomSqlSegment}
</select>

View File

@@ -62,9 +62,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
sot.completed_time,
sot.content,
(
SELECT GROUP_CONCAT(sof.file_url SEPARATOR ',')
FROM sys_oa_file sof
WHERE FIND_IN_SET(sof.file_id, sot.accessory) > 0
SELECT GROUP_CONCAT(so.url SEPARATOR ',')
FROM sys_oss so
WHERE FIND_IN_SET(so.oss_id, sot.accessory) > 0
) AS accessory,
sot.rank_number,
@@ -90,9 +90,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
ELSE 0
END AS overDays,
(
SELECT GROUP_CONCAT(sof.file_url SEPARATOR ',')
FROM sys_oa_file sof
WHERE FIND_IN_SET(sof.file_id, soti.files) > 0
SELECT GROUP_CONCAT(so.url SEPARATOR ',')
FROM sys_oss so
WHERE FIND_IN_SET(so.oss_id, soti.files) > 0
) AS files
FROM sys_oa_task sot
@@ -148,9 +149,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
su2.nick_name AS workerNickName,
(
SELECT GROUP_CONCAT(sof.file_url SEPARATOR ',')
FROM sys_oa_file sof
WHERE FIND_IN_SET(sof.file_id, sot.accessory) > 0
SELECT GROUP_CONCAT(so.url SEPARATOR ',')
FROM sys_oss so
WHERE FIND_IN_SET(so.oss_id, sot.accessory) > 0
) AS accessory,
sot.rank_number,
@@ -177,9 +178,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
soti.end_time AS itemEndTime,
soti.remark AS itemRemark,
(
SELECT GROUP_CONCAT(sof.file_url SEPARATOR ',')
FROM sys_oa_file sof
WHERE FIND_IN_SET(sof.file_id, soti.files) > 0
SELECT GROUP_CONCAT(so.url SEPARATOR ',')
FROM sys_oss so
WHERE FIND_IN_SET(so.oss_id, soti.files) > 0
) AS files,
CASE
WHEN sot.completed_time IS NULL
@@ -325,9 +326,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
sot.completed_time,
sot.content,
(
SELECT GROUP_CONCAT(sof.file_url SEPARATOR ',')
FROM sys_oa_file sof
WHERE FIND_IN_SET(sof.file_id, sot.accessory) > 0
SELECT GROUP_CONCAT(so.url SEPARATOR ',')
FROM sys_oss so
WHERE FIND_IN_SET(so.oss_id, sot.accessory) > 0
) AS accessory,
sot.rank_number,
@@ -353,9 +354,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
ELSE 0
END AS overDays,
(
SELECT GROUP_CONCAT(sof.file_url SEPARATOR ',')
FROM sys_oa_file sof
WHERE FIND_IN_SET(sof.file_id, soti.files) > 0
SELECT GROUP_CONCAT(so.url SEPARATOR ',')
FROM sys_oss so
WHERE FIND_IN_SET(so.oss_id, soti.files) > 0
) AS files
FROM sys_oa_task_user sotu
@@ -378,16 +379,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
sot.create_user_id,
sot.worker_id,
(
SELECT GROUP_CONCAT(sof.file_url SEPARATOR ',')
FROM sys_oa_file sof
WHERE FIND_IN_SET(sof.file_id, sot.accessory) > 0
SELECT GROUP_CONCAT(so.url SEPARATOR ',')
FROM sys_oss so
WHERE FIND_IN_SET(so.oss_id, sot.accessory) > 0
) AS accessory,
su1.nick_name AS createUserNickName,
su2.nick_name AS workerNickName,
(
SELECT GROUP_CONCAT(sof.file_url SEPARATOR ',')
FROM sys_oa_file sof
WHERE FIND_IN_SET(sof.file_id, soti.files) > 0
SELECT GROUP_CONCAT(so.url SEPARATOR ',')
FROM sys_oss so
WHERE FIND_IN_SET(so.oss_id, soti.files) > 0
) AS files
FROM sys_oa_task sot
LEFT JOIN sys_user su1 ON su1.user_id = sot.create_user_id
@@ -399,14 +400,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
AND sot.del_flag = '0'
AND (
IFNULL((
SELECT GROUP_CONCAT(sof.file_url SEPARATOR ',')
FROM sys_oa_file sof
WHERE FIND_IN_SET(sof.file_id, sot.accessory) > 0
SELECT GROUP_CONCAT(so.url SEPARATOR ',')
FROM sys_oss so
WHERE FIND_IN_SET(so.oss_id, sot.accessory) > 0
), '') != ''
OR IFNULL((
SELECT GROUP_CONCAT(sof.file_url SEPARATOR ',')
FROM sys_oa_file sof
WHERE FIND_IN_SET(sof.file_id, soti.files) > 0
SELECT GROUP_CONCAT(so.url SEPARATOR ',')
FROM sys_oss so
WHERE FIND_IN_SET(so.oss_id, soti.files) > 0
), '') != ''
)

View File

@@ -106,4 +106,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</select>
</mapper>

View File

@@ -4,69 +4,101 @@
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.oa.mapper.SysOaWarehouseMasterMapper">
<resultMap type="com.ruoyi.oa.domain.vo.SysOaWarehouseMasterVo" id="SysOaWarehouseMasterResult">
<result property="masterId" column="master_id"/>
<result property="masterNum" column="master_num"/>
<result property="type" column="type"/>
<result property="projectId" column="project_id"/>
<result property="signTime" column="sign_time"/>
<result property="signUser" column="sign_user"/>
<result property="remark" column="remark"/>
<!-- ===================================================== -->
<!-- 主表 + 子表 统一 ResultMap -->
<!-- ===================================================== -->
<resultMap id="SysOaWarehouseMasterResult"
type="com.ruoyi.oa.domain.vo.SysOaWarehouseMasterVo">
<id property="masterId" column="master_id"/>
<result property="masterNum" column="master_num"/>
<result property="type" column="type"/>
<result property="projectId" column="project_id"/>
<result property="signTime" column="sign_time"/>
<result property="signUser" column="sign_user"/>
<result property="remark" column="remark"/>
<result property="projectName" column="project_name"/>
<result property="status" column="status"/>
<collection property="warehouseList" ofType="com.ruoyi.oa.domain.vo.SysOaWarehouseDetailVo" javaType="list">
<result property="signPrice" column="sign_price"/>
<result property="id" column="outId"/>
<result property="projectName" column="project_name"/>
<result property="model" column="model"/>
<result property="specifications" column="specifications"/>
<result property="projectId" column="project_id"/>
<result property="amount" column="amount"/>
<result property="warehouseName" column="warehouseName"/>
</collection>
<collection property="warehouseTaskList" resultMap="SysOaWarehouseTaskResult" javaType="list"/>
<result property="status" column="status"/>
<collection property="warehouseList"
column="master_id"
javaType="list"
ofType="com.ruoyi.oa.domain.vo.SysOaWarehouseDetailVo"
select="selectDetailByMasterId"/>
<collection property="warehouseTaskList"
column="master_id"
javaType="list"
ofType="com.ruoyi.oa.domain.SysOaWarehouseTask"
select="selectTaskByMasterId"/>
</resultMap>
<resultMap type="com.ruoyi.oa.domain.SysOaWarehouseTask" id="SysOaWarehouseTaskResult">
<result property="taskId" column="task_id"/>
<result property="masterId" column="master_id"/>
<result property="name" column="name"/>
<result property="model" column="model"/>
<result property="taskInventory" column="task_inventory"/>
<result property="brand" column="brand"/>
<result property="specifications" column="specifications"/>
</resultMap>
<select id="selectVoPagePlus" resultMap="SysOaWarehouseMasterResult">
select sowm.master_id,
sowm.sign_time,
sowm.sign_user,
sowd.sign_price,
sowm.master_num,
sowm.type,
sowd.amount,
sow.name as warehouseName,
sowm.remark,
sop.project_id,
sop.project_name,
sowm.status,
sowd.id as outId,
task_id,
sowt.name,
COALESCE(sow.model,sowt.model) as model,
task_inventory,
COALESCE(sow.brand,sowt.brand) as brand,
COALESCE(sow.specifications,sowt.specifications) as specifications
from sys_oa_warehouse_master sowm
left join sys_oa_warehouse_detail sowd on sowd.master_id = sowm.master_id and sowd.del_flag='0'
left join sys_oa_warehouse sow on sow.id = sowd.warehouse_id
left join sys_oa_warehouse_task sowt on sowm.master_id = sowt.master_id
left join sys_oa_project sop on sowm.project_id = sop.project_id
<!-- ===================================================== -->
<!-- 分页查询(只查主表字段,真正参与 LIMIT / OFFSET -->
<!-- ===================================================== -->
<select id="selectVoPagePlus"
resultMap="SysOaWarehouseMasterResult">
SELECT
sowm.master_id,
sowm.master_num,
sowm.type,
sowm.project_id,
sowm.sign_time,
sowm.sign_user,
sowm.remark,
sowm.status,
sop.project_name
FROM sys_oa_warehouse_master sowm
LEFT JOIN sys_oa_project sop
ON sop.project_id = sowm.project_id
${ew.getCustomSqlSegment}
</select>
<!-- ===================================================== -->
<!-- 子查询:明细列表 by masterId -->
<!-- ===================================================== -->
<select id="selectDetailByMasterId"
parameterType="long"
resultType="com.ruoyi.oa.domain.vo.SysOaWarehouseDetailVo">
SELECT
sowd.id AS outId,
sowd.master_id,
sowd.sign_price,
sowd.amount,
sowd.project_id,
sow.name AS warehouseName,
COALESCE(sow.model, sowt.model) AS model,
COALESCE(sow.brand, sowt.brand) AS brand,
COALESCE(sow.specifications, sowt.specifications) AS specifications,
sowt.task_inventory,
sop.project_name
FROM sys_oa_warehouse_detail sowd
LEFT JOIN sys_oa_warehouse sow ON sow.id = sowd.warehouse_id
LEFT JOIN sys_oa_warehouse_task sowt ON sowt.master_id = sowd.master_id
LEFT JOIN sys_oa_project sop ON sop.project_id = sowd.project_id
WHERE sowd.del_flag = '0'
AND sowd.master_id = #{masterId}
ORDER BY sowd.id
</select>
<!-- ===================================================== -->
<!-- 子查询:任务列表 by masterId -->
<!-- ===================================================== -->
<select id="selectTaskByMasterId"
parameterType="long"
resultType="com.ruoyi.oa.domain.SysOaWarehouseTask">
SELECT
task_id,
master_id,
name,
model,
task_inventory,
brand,
specifications
FROM sys_oa_warehouse_task
WHERE master_id = #{masterId}
ORDER BY task_id
</select>
</mapper>