USE [ERPTOOL_JY_20250826Back]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- 完成过程表补充计价字段，工时统计按当次完成记录判断计件或计时；修改人:Ld 修改时间:2026-07-06 15:18:06;
IF OBJECT_ID(N'[dbo].[设备管理_零件工序_工序完成过程情况]', N'U') IS NOT NULL
AND COL_LENGTH(N'[dbo].[设备管理_零件工序_工序完成过程情况]', N'计价方式') IS NULL
  ALTER TABLE [dbo].[设备管理_零件工序_工序完成过程情况] ADD [计价方式] NVARCHAR(20) NULL CONSTRAINT [DF_设备管理_零件工序_工序完成过程情况_计价方式] DEFAULT (N'计件');
GO

IF OBJECT_ID(N'[dbo].[设备管理_零件工序_工序完成过程情况]', N'U') IS NOT NULL
AND COL_LENGTH(N'[dbo].[设备管理_零件工序_工序完成过程情况]', N'单件工价') IS NULL
  ALTER TABLE [dbo].[设备管理_零件工序_工序完成过程情况] ADD [单件工价] DECIMAL(18, 4) NULL CONSTRAINT [DF_设备管理_零件工序_工序完成过程情况_单件工价] DEFAULT ((0));
GO

IF OBJECT_ID(N'[dbo].[设备管理_零件工序_工序完成过程情况]', N'U') IS NOT NULL
AND COL_LENGTH(N'[dbo].[设备管理_零件工序_工序完成过程情况]', N'单时工价') IS NULL
  ALTER TABLE [dbo].[设备管理_零件工序_工序完成过程情况] ADD [单时工价] DECIMAL(18, 4) NULL CONSTRAINT [DF_设备管理_零件工序_工序完成过程情况_单时工价] DEFAULT ((0));
GO

-- 旧完成记录默认计件，单件工价按工序工价当前启用价格回填；修改人:Ld 修改时间:2026-07-06 15:18:06;
UPDATE finishData
SET 计价方式 = ISNULL(NULLIF(finishData.计价方式, N''), N'计件'),
    单件工价 = CASE
      WHEN ISNULL(finishData.单件工价, 0) <> 0 THEN finishData.单件工价
      ELSE ISNULL(priceData.单件工价, 0)
    END,
    单时工价 = ISNULL(finishData.单时工价, 0)
FROM [dbo].[设备管理_零件工序_工序完成过程情况] finishData
OUTER APPLY (
  SELECT TOP 1
    CASE
      WHEN ISNULL(price.[单件工价], 0) <> 0 THEN price.[单件工价]
      ELSE ISNULL(price.[最终单价(元/件)], 0)
    END AS 单件工价
  FROM [dbo].[车间生产管理工艺_工序工价] price
  WHERE price.工序流水号 = finishData.工序流水号
    AND ISNULL(price.是否启用, 1) = 1
  ORDER BY ISNULL(price.生效日期, CONVERT(DATE, '1900-01-01')) DESC, price.修改时间 DESC, price.工价流水号 DESC
) priceData
WHERE finishData.计价方式 IS NULL
   OR finishData.计价方式 = N''
   OR finishData.单件工价 IS NULL
   OR finishData.单时工价 IS NULL;
GO

-- 工时统计明细视图补充完成过程流水号和计价字段，便于计时单价编辑回写；修改人:Ld 修改时间:2026-07-06 15:18:06;
ALTER VIEW [dbo].[车间生产管理_零件工序加工时长_视图]
AS
SELECT
  dbo.车间生产管理_零件工序_视图.工序,
  dbo.车间生产管理_零件工序_视图.加工设备,
  dbo.车间生产管理_零件工序_视图.零件名称,
  dbo.车间生产管理_零件工序_视图.零件图号 AS 图号,
  dbo.车间生产管理_零件工序_视图.数量,
  dbo.设备管理_零件工序_工序完成过程情况.完成数量 AS 完成数,
  dbo.设备管理_零件工序_工序完成过程情况.加工开始时间 AS 开始加工,
  dbo.设备管理_零件工序_工序完成过程情况.加工完成时间 AS 结束加工,
  ISNULL(dbo.设备管理_零件工序_工序完成过程情况.扫码工时, 0) AS 加工时长,
  dbo.车间生产管理_零件工序_视图.订单号 AS 订单编号,
  dbo.车间生产管理_零件工序_视图.产品名称,
  dbo.设备管理_零件工序_工序完成过程情况.操作者编号,
  CONVERT(VARCHAR(10), dbo.车间生产管理_零件工序_视图.派工日期, 23) AS 任务下达,
  dbo.基础数据_设备工位点检表.设备名称 + N'-' + dbo.设备管理_零件工序_工序完成过程情况.工位号 AS 工位号,
  dbo.人事档案管理_人员名单.姓名 AS 操作者,
  dbo.车间生产管理_零件工序_视图.订单流水号,
  dbo.车间生产管理_零件工序_视图.定额工时,
  dbo.车间生产管理_零件工序_视图.准结工时,
  dbo.车间生产管理_零件工序_视图.工艺计划流水号,
  dbo.车间生产管理_零件工序_视图.物料编码,
  dbo.车间生产管理_零件工序_视图.工序顺序,
  dbo.设备管理_零件工序_工序完成过程情况.暂停时间,
  dbo.设备管理_零件工序_工序完成过程情况.完成过程流水号,
  ISNULL(NULLIF(dbo.设备管理_零件工序_工序完成过程情况.计价方式, N''), N'计件') AS 计价方式,
  ISNULL(dbo.设备管理_零件工序_工序完成过程情况.单件工价, 0) AS 单件工价,
  ISNULL(dbo.设备管理_零件工序_工序完成过程情况.单时工价, 0) AS 单时工价
FROM dbo.车间生产管理_零件工序_视图
  INNER JOIN dbo.设备管理_零件工序_工序完成过程情况
    ON dbo.车间生产管理_零件工序_视图.工序流水号 = dbo.设备管理_零件工序_工序完成过程情况.工序流水号
  INNER JOIN dbo.基础数据_设备工位点检表
    ON dbo.设备管理_零件工序_工序完成过程情况.工位号 = dbo.基础数据_设备工位点检表.工位号
  INNER JOIN dbo.人事档案管理_人员名单
    ON dbo.设备管理_零件工序_工序完成过程情况.操作者编号 = dbo.人事档案管理_人员名单.人员编号
GO

-- 员工工时汇总增加单价总价，计件按单件工价*数量，计时按单时工价*加工分钟/60；修改人:Ld 修改时间:2026-07-06 15:18:06;
ALTER PROCEDURE [dbo].[车间生产管理_工人工时统计_查询数据]
  @开始时间 DATETIME = NULL,
  @结束时间 DATETIME = NULL
AS
BEGIN
  SET NOCOUNT ON;

  SELECT
    SUM(a.工时) AS 加工工时,
    SUM(a.完成数量) AS 总数量,
    SUM(a.总价) AS 总价,
    a.姓名 AS 操作者,
    a.操作者编号
  FROM (
    SELECT
      ISNULL(f.扫码工时, 0) AS 工时,
      p.姓名,
      f.操作者编号,
      f.完成日期,
      f.完成数量,
      CASE
        WHEN ISNULL(NULLIF(f.计价方式, N''), N'计件') = N'计时'
          THEN ROUND(ISNULL(f.扫码工时, 0) / 60.0 * ISNULL(f.单时工价, 0), 4)
        ELSE ROUND(ISNULL(f.完成数量, 0) * CASE WHEN ISNULL(f.单件工价, 0) <> 0 THEN f.单件工价 ELSE ISNULL(priceData.单件工价, 0) END, 4)
      END AS 总价
    FROM dbo.设备管理_零件工序_工序完成过程情况 f
      INNER JOIN dbo.人事档案管理_人员名单 p ON f.操作者编号 = p.人员编号
      OUTER APPLY (
        SELECT TOP 1
          CASE
            WHEN ISNULL(price.[单件工价], 0) <> 0 THEN price.[单件工价]
            ELSE ISNULL(price.[最终单价(元/件)], 0)
          END AS 单件工价
        FROM dbo.车间生产管理工艺_工序工价 price
        WHERE price.工序流水号 = f.工序流水号
          AND ISNULL(price.是否启用, 1) = 1
        ORDER BY ISNULL(price.生效日期, CONVERT(DATE, '1900-01-01')) DESC, price.修改时间 DESC, price.工价流水号 DESC
      ) priceData
    WHERE f.完成日期 >= @开始时间
      AND f.完成日期 <= @结束时间
  ) a
  GROUP BY a.姓名, a.操作者编号;
END
GO

-- 员工工时明细返回单价，计时记录允许前端编辑单时工价；修改人:Ld 修改时间:2026-07-06 15:18:06;
ALTER PROCEDURE [dbo].[精工车间_员工工时统计_详情_查询数据]
  @操作者编号 INT = 62,
  @开始时间 DATETIME = NULL,
  @结束时间 DATETIME = NULL,
  @排序名称 INT = NULL,
  @排序方式 INT = NULL
AS
BEGIN
  SET NOCOUNT ON;

  ;WITH PriceData AS (
    SELECT
      data.*,
      data.加工时长 / NULLIF(data.完成数, 0) AS 单个工时,
      CASE WHEN data.计价方式 = N'计时' THEN ISNULL(data.单时工价, 0) ELSE CASE WHEN ISNULL(data.单件工价, 0) <> 0 THEN data.单件工价 ELSE ISNULL(priceData.单件工价, 0) END END AS 单价,
      CASE
        WHEN data.计价方式 = N'计时' THEN ROUND(ISNULL(data.加工时长, 0) / 60.0 * ISNULL(data.单时工价, 0), 4)
        ELSE ROUND(ISNULL(data.完成数, 0) * CASE WHEN ISNULL(data.单件工价, 0) <> 0 THEN data.单件工价 ELSE ISNULL(priceData.单件工价, 0) END, 4)
      END AS 总价
    FROM dbo.车间生产管理_零件工序加工时长_视图 data
      OUTER APPLY (
        SELECT TOP 1
          CASE
            WHEN ISNULL(price.[单件工价], 0) <> 0 THEN price.[单件工价]
            ELSE ISNULL(price.[最终单价(元/件)], 0)
          END AS 单件工价
        FROM dbo.车间生产管理工艺_工序工价 price
        WHERE price.零件名称 = data.零件名称
          AND price.图号 = data.图号
          AND price.工序名称 = data.工序
          AND ISNULL(price.是否启用, 1) = 1
        ORDER BY ISNULL(price.生效日期, CONVERT(DATE, '1900-01-01')) DESC, price.修改时间 DESC, price.工价流水号 DESC
      ) priceData
    WHERE data.操作者编号 = @操作者编号
      AND data.结束加工 >= @开始时间
      AND data.结束加工 < DATEADD(DAY, 1, @结束时间)
  )
  SELECT *
  FROM PriceData
  ORDER BY
    CASE WHEN @排序名称 = 1 AND @排序方式 = 1 THEN 结束加工 END DESC,
    CASE WHEN @排序名称 = 1 AND @排序方式 <> 1 THEN 结束加工 END ASC,
    CASE WHEN ISNULL(@排序名称, 0) <> 1 THEN 结束加工 END DESC;
END
GO

-- 设备工时汇总增加单价总价，计件按单件工价*数量，计时按单时工价*加工分钟/60；修改人:Ld 修改时间:2026-07-06 15:18:06;
ALTER PROCEDURE [dbo].[车间生产管理_设备工时统计_查询数据]
  @开始时间 DATETIME = NULL,
  @结束时间 DATETIME = NULL
AS
BEGIN
  SET NOCOUNT ON;

  SELECT
    SUM(a.工时) AS 加工工时,
    a.工位号 AS 设备,
    SUM(a.完成数量) AS 总数量,
    SUM(a.总价) AS 总价
  FROM (
    SELECT
      ISNULL(f.扫码工时, 0) AS 工时,
      e.设备名称 + N'-' + f.工位号 AS 工位号,
      f.完成数量,
      CASE
        WHEN ISNULL(NULLIF(f.计价方式, N''), N'计件') = N'计时'
          THEN ROUND(ISNULL(f.扫码工时, 0) / 60.0 * ISNULL(f.单时工价, 0), 4)
        ELSE ROUND(ISNULL(f.完成数量, 0) * CASE WHEN ISNULL(f.单件工价, 0) <> 0 THEN f.单件工价 ELSE ISNULL(priceData.单件工价, 0) END, 4)
      END AS 总价
    FROM dbo.设备管理_零件工序_工序完成过程情况 f
      INNER JOIN dbo.基础数据_设备工位点检表 e ON f.工位号 = e.工位号
      OUTER APPLY (
        SELECT TOP 1
          CASE
            WHEN ISNULL(price.[单件工价], 0) <> 0 THEN price.[单件工价]
            ELSE ISNULL(price.[最终单价(元/件)], 0)
          END AS 单件工价
        FROM dbo.车间生产管理工艺_工序工价 price
        WHERE price.工序流水号 = f.工序流水号
          AND ISNULL(price.是否启用, 1) = 1
        ORDER BY ISNULL(price.生效日期, CONVERT(DATE, '1900-01-01')) DESC, price.修改时间 DESC, price.工价流水号 DESC
      ) priceData
    WHERE f.完成日期 >= @开始时间
      AND f.完成日期 <= @结束时间
  ) a
  GROUP BY a.工位号;
END
GO

-- 设备工时明细返回单价，计时记录允许前端编辑单时工价；修改人:Ld 修改时间:2026-07-06 15:18:06;
ALTER PROCEDURE [dbo].[精工车间_设备工时统计_详情_查询数据]
  @设备 NVARCHAR(50) = NULL,
  @开始时间 DATETIME = NULL,
  @结束时间 DATETIME = NULL,
  @排序名称 INT = NULL,
  @排序方式 INT = NULL
AS
BEGIN
  SET NOCOUNT ON;

  ;WITH PriceData AS (
    SELECT
      data.*,
      CASE WHEN data.计价方式 = N'计时' THEN ISNULL(data.单时工价, 0) ELSE CASE WHEN ISNULL(data.单件工价, 0) <> 0 THEN data.单件工价 ELSE ISNULL(priceData.单件工价, 0) END END AS 单价,
      CASE
        WHEN data.计价方式 = N'计时' THEN ROUND(ISNULL(data.加工时长, 0) / 60.0 * ISNULL(data.单时工价, 0), 4)
        ELSE ROUND(ISNULL(data.完成数, 0) * CASE WHEN ISNULL(data.单件工价, 0) <> 0 THEN data.单件工价 ELSE ISNULL(priceData.单件工价, 0) END, 4)
      END AS 总价
    FROM dbo.车间生产管理_零件工序加工时长_视图 data
      OUTER APPLY (
        SELECT TOP 1
          CASE
            WHEN ISNULL(price.[单件工价], 0) <> 0 THEN price.[单件工价]
            ELSE ISNULL(price.[最终单价(元/件)], 0)
          END AS 单件工价
        FROM dbo.车间生产管理工艺_工序工价 price
        WHERE price.零件名称 = data.零件名称
          AND price.图号 = data.图号
          AND price.工序名称 = data.工序
          AND ISNULL(price.是否启用, 1) = 1
        ORDER BY ISNULL(price.生效日期, CONVERT(DATE, '1900-01-01')) DESC, price.修改时间 DESC, price.工价流水号 DESC
      ) priceData
    WHERE data.工位号 = @设备
      AND data.结束加工 >= @开始时间
      AND data.结束加工 <= @结束时间
  )
  SELECT *
  FROM PriceData
  ORDER BY
    CASE WHEN @排序名称 = 1 AND @排序方式 = 1 THEN 结束加工 END DESC,
    CASE WHEN @排序名称 = 1 AND @排序方式 <> 1 THEN 结束加工 END ASC,
    CASE WHEN ISNULL(@排序名称, 0) <> 1 THEN 结束加工 END DESC;
END
GO

-- 计时记录单时工价编辑保存；修改人:Ld 修改时间:2026-07-06 15:18:06;
IF OBJECT_ID(N'[dbo].[车间生产管理_工时统计_单时工价_修改数据]', N'P') IS NOT NULL
  DROP PROCEDURE [dbo].[车间生产管理_工时统计_单时工价_修改数据];
GO

CREATE PROCEDURE [dbo].[车间生产管理_工时统计_单时工价_修改数据]
  @完成过程流水号 NVARCHAR(50) = N'',
  @单时工价 NVARCHAR(50) = N''
AS
BEGIN
  SET NOCOUNT ON;

  DECLARE @Id INT;
  DECLARE @Safe单时工价 DECIMAL(18, 4);

  SET @Id = CASE WHEN ISNUMERIC(NULLIF(@完成过程流水号, N'')) = 1 THEN CONVERT(INT, @完成过程流水号) ELSE NULL END;
  SET @Safe单时工价 = CASE WHEN ISNUMERIC(NULLIF(@单时工价, N'')) = 1 THEN CONVERT(DECIMAL(18, 4), @单时工价) ELSE 0 END;

  IF @Id IS NULL
  BEGIN
    SELECT N'0' AS result, N'完成过程流水号不能为空' AS message;
    RETURN;
  END;

  UPDATE [dbo].[设备管理_零件工序_工序完成过程情况]
  SET 计价方式 = N'计时',
      单时工价 = @Safe单时工价,
      修改时间 = GETDATE()
  WHERE 完成过程流水号 = @Id;

  SELECT N'1' AS result;
END
GO

-- 员工工时导出增加计价方式、单价和总价列；修改人:Ld 修改时间:2026-07-06 15:18:06;
ALTER PROCEDURE [dbo].[报表_精工车间_员工工时统计_查询数据]
  @开始时间 DATETIME = NULL,
  @结束时间 DATETIME = NULL,
  @排序名称 INT = NULL,
  @排序方式 INT = NULL
AS
BEGIN
  SET NOCOUNT ON;

  -- 修正导出文件名前缀，避免工时统计导出显示库存文件名；修改人:Ld 修改时间:2026-07-17 07:53:49;
  -- 后端导出处理器未支持 tabletype=18，使用通用导出类型 15 防止返回 NULL；修改人:Ld 修改时间:2026-07-17 07:58:30;
  SELECT N'员工工时统计_' + REPLACE(REPLACE(REPLACE(CONVERT(NVARCHAR(19), GETDATE(), 21), ':', ''), '-', ''), ' ', '-') AS tablename, '15' AS tabletype;

  SELECT
    256 * 15 AS 工序,
    256 * 10 AS 工序顺序,
    256 * 30 AS 零件名称,
    256 * 30 AS 零件图号,
    256 * 20 AS 物料编码,
    256 * 10 AS 加工数,
    256 * 12 AS 计价方式,
    256 * 10 AS 单价,
    256 * 12 AS 总价,
    256 * 15 AS 加工工时M,
    256 * 10 AS 暂停时长,
    256 * 30 AS 开始加工时间,
    256 * 30 AS 完成时间,
    256 * 10 AS 操作者,
    256 * 25 AS 设备,
    246 * 25 AS 订单编号,
    246 * 25 AS 产品名称;

  SELECT
    0 AS 工序,
    1 AS 工序顺序,
    0 AS 零件名称,
    0 AS 零件图号,
    -- 修正导出元数据列名需与字段宽度和数据列一致；修改人:Ld 修改时间:2026-07-17 07:53:49;
    0 AS 物料编码,
    1 AS 加工数,
    0 AS 计价方式,
    1 AS 单价,
    1 AS 总价,
    1 AS 加工工时M,
    1 AS 暂停时长,
    0 AS 开始加工时间,
    0 AS 完成时间,
    0 AS 操作者,
    0 AS 设备,
    0 AS 订单编号,
    0 AS 产品名称;

  ;WITH PriceData AS (
    SELECT
      data.*,
      CASE WHEN data.计价方式 = N'计时' THEN ISNULL(data.单时工价, 0) ELSE CASE WHEN ISNULL(data.单件工价, 0) <> 0 THEN data.单件工价 ELSE ISNULL(priceData.单件工价, 0) END END AS 单价,
      CASE
        WHEN data.计价方式 = N'计时' THEN ROUND(ISNULL(data.加工时长, 0) / 60.0 * ISNULL(data.单时工价, 0), 4)
        ELSE ROUND(ISNULL(data.完成数, 0) * CASE WHEN ISNULL(data.单件工价, 0) <> 0 THEN data.单件工价 ELSE ISNULL(priceData.单件工价, 0) END, 4)
      END AS 总价
    FROM dbo.车间生产管理_零件工序加工时长_视图 data
      OUTER APPLY (
        SELECT TOP 1
          CASE
            WHEN ISNULL(price.[单件工价], 0) <> 0 THEN price.[单件工价]
            ELSE ISNULL(price.[最终单价(元/件)], 0)
          END AS 单件工价
        FROM dbo.车间生产管理工艺_工序工价 price
        WHERE price.零件名称 = data.零件名称
          AND price.图号 = data.图号
          AND price.工序名称 = data.工序
          AND ISNULL(price.是否启用, 1) = 1
        ORDER BY ISNULL(price.生效日期, CONVERT(DATE, '1900-01-01')) DESC, price.修改时间 DESC, price.工价流水号 DESC
      ) priceData
    WHERE data.结束加工 >= @开始时间
      AND data.结束加工 <= @结束时间
  )
  SELECT
    工序,
    工序顺序,
    零件名称,
    图号 AS 零件图号,
    物料编码,
    完成数 AS 加工数,
    计价方式,
    单价,
    总价,
    加工时长 AS 加工工时M,
    暂停时间 AS 暂停时长,
    开始加工 AS 开始加工时间,
    结束加工 AS 完成时间,
    操作者,
    工位号 AS 设备,
    订单编号,
    产品名称
  FROM PriceData
  ORDER BY
    CASE WHEN @排序名称 = 1 AND @排序方式 = 1 THEN 结束加工 END DESC,
    CASE WHEN @排序名称 = 1 AND @排序方式 <> 1 THEN 结束加工 END ASC,
    CASE WHEN ISNULL(@排序名称, 0) <> 1 THEN 结束加工 END DESC;
END
GO
