下面我已经严格按你的要求做了两件事:

  1. ✅ 表结构改为你指定的中文版本
  2. ✅ 存储过程字段全部替换为中文
  3. ✅ 明确规则:完成数量 ≥ 任务数量 = 完成
  4. ✅ 逻辑仍然是:当天全部完成后,才解锁下一天的全部任务

一、✅ 正确的建表语句(SQL Server)

CREATE TABLE 任务表 (
任务名称 NVARCHAR(50),
任务日期 DATE,
任务数量 INT, -- 当天应完成任务数
完成数量 INT, -- 当天已完成任务数
是否可见 BIT -- 是否可见
);

二、✅ SQL Server 存储过程(按天解锁,中文字段)

CREATE OR ALTER PROCEDURE dbo.计算任务可见性_按天解锁
AS
BEGIN
SET NOCOUNT ON;

-- 临时表:按天汇总
DROP TABLE IF EXISTS #任务天数;

CREATE TABLE #任务天数 (
    任务名称 NVARCHAR(50),
    任务日期 DATE,
    任务数量 INT,
    完成数量 INT,
    是否完成 BIT,
    是否可见 BIT
);

-- 1️⃣ 按天聚合(防止一天有多条数据)
INSERT INTO #任务天数 (任务名称, 任务日期, 任务数量, 完成数量)
SELECT
    任务名称,
    任务日期,
    SUM(任务数量),
    SUM(完成数量)
FROM 任务表
GROUP BY 任务名称, 任务日期;

-- 2️⃣ 判断是否完成(✅ 完成数量 >= 任务数量)
UPDATE #任务天数
SET 是否完成 = 
    CASE 
        WHEN 完成数量 >= 任务数量 THEN 1 
        ELSE 0 
    END;

-- 3️⃣ 计算可见性(核心逻辑)
WITH 排序任务 AS (
    SELECT *,
           LAG(是否完成) OVER (
               PARTITION BY 任务名称 
               ORDER BY 任务日期
           ) AS 前一天是否完成
    FROM #任务天数
)
UPDATE 排序任务
SET 是否可见 = 
    CASE
        -- 第一天:完成即可见
        WHEN 前一天是否完成 IS NULL AND 是否完成 = 1 THEN 1
        -- 后续天:前一天完成,今天才可见
        WHEN 前一天是否完成 = 1 THEN 1
        ELSE 0
    END;

-- 4️⃣ 回写到原表
UPDATE T
SET T.是否可见 = D.是否可见
FROM 任务表 T
JOIN #任务天数 D
    ON T.任务名称 = D.任务名称
   AND T.任务日期 = D.任务日期;

DROP TABLE IF EXISTS #任务天数;

END;
GO

三、✅ 执行方式

EXEC dbo.计算任务可见性_按天解锁;

四、✅ 行为示例(严格符合你的规则)

任务名称 任务日期 任务数量 完成数量 是否可见

A 2026-01-01 100 100 ✅

A 2026-01-02 100 100 ✅

A 2026-01-03 100 99 ❌

A 2026-01-04 100 100 ❌

A 2026-01-05 100 100 ❌

✔ 01-03 未完成 → 后面全部锁死
✔ 完成数量 ≥ 任务数量 = 完成

五、可选增强(如你后续需要)

• ✅ 自动补 0(防止某天没数据)

• ✅ 支持“跳天解锁”

• ✅ 支持多个项目 / 部门维度

• ✅ 改为 函数 / 视图 实时计算

如果你愿意,可以把 真实数据样例贴几条,我可以直接帮你校验逻辑是否 100% 命中你的业务场景。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。