Files
JY1.0/sql/工序工价_存储过程.sql

1038 lines
40 KiB
Transact-SQL

USE [ERPTOOL_JY_20250826Back]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- 工序工价基础表,维护现场确认的 9 个工价字段;修改人:Ld 修改时间:2026-07-03 08:02:29;
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价]', N'U') IS NULL
BEGIN
CREATE TABLE [dbo].[车间生产管理工艺_工序工价](
[工价流水号] [int] IDENTITY(1,1) NOT NULL,
[工序流水号] [int] NULL,
[工艺名称] [nvarchar](100) NOT NULL,
[工序名称] [nvarchar](100) NOT NULL,
[零件名称] [nvarchar](100) NOT NULL,
[图号] [nvarchar](100) NOT NULL,
[机动时间s] [decimal](18, 4) NOT NULL CONSTRAINT [DF_车间生产管理工艺_工序工价_机动时间s] DEFAULT ((0)),
[辅助时间s] [decimal](18, 4) NOT NULL CONSTRAINT [DF_车间生产管理工艺_工序工价_辅助时间s] DEFAULT ((0)),
[总时间s] [decimal](18, 4) NOT NULL CONSTRAINT [DF_车间生产管理工艺_工序工价_总时间s] DEFAULT ((0)),
[单装数量(件)] [decimal](18, 4) NOT NULL CONSTRAINT [DF_车间生产管理工艺_工序工价_单装数量件] DEFAULT ((0)),
[操作台数] [decimal](18, 4) NOT NULL CONSTRAINT [DF_车间生产管理工艺_工序工价_操作台数] DEFAULT ((0)),
[日产能(件)] [decimal](18, 4) NOT NULL CONSTRAINT [DF_车间生产管理工艺_工序工价_日产能件] DEFAULT ((0)),
[最终单价(元/件)] [decimal](18, 4) NOT NULL CONSTRAINT [DF_车间生产管理工艺_工序工价_最终单价元件] DEFAULT ((0)),
[生效日期] [date] NULL,
[变更次数] [int] NOT NULL CONSTRAINT [DF_车间生产管理工艺_工序工价_变更次数] DEFAULT ((0)),
[是否启用] [bit] NOT NULL CONSTRAINT [DF_车间生产管理工艺_工序工价_是否启用] DEFAULT ((1)),
[备注] [nvarchar](500) NULL,
[创建人] [nvarchar](50) NULL,
[创建时间] [datetime] NOT NULL CONSTRAINT [DF_车间生产管理工艺_工序工价_创建时间] DEFAULT (GETDATE()),
[修改人] [nvarchar](50) NULL,
[修改时间] [datetime] NOT NULL CONSTRAINT [DF_车间生产管理工艺_工序工价_修改时间] DEFAULT (GETDATE()),
[计价方式] [nvarchar](20) NOT NULL CONSTRAINT [DF_车间生产管理工艺_工序工价_计价方式] DEFAULT (N'按件'),
[单件工价] [decimal](18, 4) NOT NULL CONSTRAINT [DF_车间生产管理工艺_工序工价_单件工价] DEFAULT ((0)),
[单时工价] [decimal](18, 4) NOT NULL CONSTRAINT [DF_车间生产管理工艺_工序工价_单时工价] DEFAULT ((0)),
[准结工价] [decimal](18, 4) NOT NULL CONSTRAINT [DF_车间生产管理工艺_工序工价_准结工价] DEFAULT ((0)),
[难度系数] [decimal](18, 4) NOT NULL CONSTRAINT [DF_车间生产管理工艺_工序工价_难度系数] DEFAULT ((1)),
[质量系数] [decimal](18, 4) NOT NULL CONSTRAINT [DF_车间生产管理工艺_工序工价_质量系数] DEFAULT ((1)),
[设备系数] [decimal](18, 4) NOT NULL CONSTRAINT [DF_车间生产管理工艺_工序工价_设备系数] DEFAULT ((1)),
[失效日期] [date] NULL,
CONSTRAINT [PK_车间生产管理工艺_工序工价] PRIMARY KEY CLUSTERED ([工价流水号] ASC)
);
END
GO
-- 兼容已建旧表,补齐现场确认字段;修改人:Ld 修改时间:2026-07-03 08:02:29;
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价]', N'U') IS NOT NULL AND COL_LENGTH(N'[dbo].[车间生产管理工艺_工序工价]', N'机动时间s') IS NULL
ALTER TABLE [dbo].[车间生产管理工艺_工序工价] ADD [机动时间s] [decimal](18, 4) NOT NULL CONSTRAINT [DF_车间生产管理工艺_工序工价_机动时间s] DEFAULT ((0));
GO
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价]', N'U') IS NOT NULL AND COL_LENGTH(N'[dbo].[车间生产管理工艺_工序工价]', N'辅助时间s') IS NULL
ALTER TABLE [dbo].[车间生产管理工艺_工序工价] ADD [辅助时间s] [decimal](18, 4) NOT NULL CONSTRAINT [DF_车间生产管理工艺_工序工价_辅助时间s] DEFAULT ((0));
GO
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价]', N'U') IS NOT NULL AND COL_LENGTH(N'[dbo].[车间生产管理工艺_工序工价]', N'总时间s') IS NULL
ALTER TABLE [dbo].[车间生产管理工艺_工序工价] ADD [总时间s] [decimal](18, 4) NOT NULL CONSTRAINT [DF_车间生产管理工艺_工序工价_总时间s] 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) NOT 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) NOT 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) NOT 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) NOT 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 [变更次数] [int] NOT NULL CONSTRAINT [DF_车间生产管理工艺_工序工价_变更次数] DEFAULT ((0));
GO
-- 工序流水号唯一索引,避免同一工序重复维护当前工价;修改人:Ld 修改时间:2026-07-03 08:02:29;
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价]', N'U') IS NOT NULL
AND NOT EXISTS (
SELECT 1
FROM sys.indexes
WHERE name = N'UX_车间生产管理工艺_工序工价_工序流水号'
AND object_id = OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价]')
)
BEGIN
CREATE UNIQUE NONCLUSTERED INDEX [UX_车间生产管理工艺_工序工价_工序流水号]
ON [dbo].[车间生产管理工艺_工序工价]([工序流水号])
WHERE [工序流水号] IS NOT NULL;
END
GO
-- 工序工价历史表,仅记录最终单价前后数据;修改人:Ld 修改时间:2026-07-06 09:27:09;
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价历史记录]', N'U') IS NULL
BEGIN
CREATE TABLE [dbo].[车间生产管理工艺_工序工价历史记录](
[历史流水号] [int] IDENTITY(1,1) NOT NULL,
[工价流水号] [int] NULL,
[工序流水号] [int] NULL,
[工艺名称] [nvarchar](100) NULL,
[工序名称] [nvarchar](100) NULL,
[零件名称] [nvarchar](100) NULL,
[图号] [nvarchar](100) NULL,
[操作类型] [nvarchar](20) NOT NULL,
[变更前] [nvarchar](max) NULL,
[变更后] [nvarchar](max) NULL,
[操作人] [nvarchar](50) NULL,
[操作时间] [datetime] NOT NULL CONSTRAINT [DF_车间生产管理工艺_工序工价历史记录_操作时间] DEFAULT (GETDATE()),
[备注] [nvarchar](500) NULL,
CONSTRAINT [PK_车间生产管理工艺_工序工价历史记录] PRIMARY KEY CLUSTERED ([历史流水号] ASC)
);
END
GO
-- 清理旧历史中的多字段内容,历史弹窗只保留最终单价数据;修改人:Ld 修改时间:2026-07-06 09:27:09;
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价历史记录]', N'U') IS NOT NULL
BEGIN
UPDATE [dbo].[车间生产管理工艺_工序工价历史记录]
SET 变更前 = CASE
WHEN 变更前 IS NULL OR 变更前 = N'' THEN 变更前
WHEN CHARINDEX(N'最终单价(元/件)=', 变更前) > 0 THEN
SUBSTRING(
变更前,
CHARINDEX(N'最终单价(元/件)=', 变更前),
CASE
WHEN CHARINDEX(N';', 变更前 + N';', CHARINDEX(N'最终单价(元/件)=', 变更前)) > 0
THEN CHARINDEX(N';', 变更前 + N';', CHARINDEX(N'最终单价(元/件)=', 变更前)) - CHARINDEX(N'最终单价(元/件)=', 变更前)
ELSE LEN(变更前)
END
)
ELSE 变更前
END,
变更后 = CASE
WHEN 变更后 IS NULL OR 变更后 = N'' THEN 变更后
WHEN CHARINDEX(N'最终单价(元/件)=', 变更后) > 0 THEN
SUBSTRING(
变更后,
CHARINDEX(N'最终单价(元/件)=', 变更后),
CASE
WHEN CHARINDEX(N';', 变更后 + N';', CHARINDEX(N'最终单价(元/件)=', 变更后)) > 0
THEN CHARINDEX(N';', 变更后 + N';', CHARINDEX(N'最终单价(元/件)=', 变更后)) - CHARINDEX(N'最终单价(元/件)=', 变更后)
ELSE LEN(变更后)
END
)
ELSE 变更后
END
WHERE (变更前 LIKE N'%最终单价(元/件)=%' AND 变更前 LIKE N'%;%')
OR (变更后 LIKE N'%最终单价(元/件)=%' AND 变更后 LIKE N'%;%');
-- 修改人:Ld 修改时间:2026-07-06 09:27:09; 兼容早期历史中的单件工价字段并统一为最终单价
UPDATE [dbo].[车间生产管理工艺_工序工价历史记录]
SET 变更前 = CASE
WHEN 变更前 IS NULL OR 变更前 = N'' THEN 变更前
WHEN CHARINDEX(N'单件工价=', 变更前) > 0 THEN
N'最终单价(元/件)=' + SUBSTRING(
变更前,
CHARINDEX(N'单件工价=', 变更前) + LEN(N'单件工价='),
CASE
WHEN CHARINDEX(N';', 变更前 + N';', CHARINDEX(N'单件工价=', 变更前)) > 0
THEN CHARINDEX(N';', 变更前 + N';', CHARINDEX(N'单件工价=', 变更前)) - CHARINDEX(N'单件工价=', 变更前) - LEN(N'单件工价=')
ELSE LEN(变更前)
END
)
ELSE 变更前
END,
变更后 = CASE
WHEN 变更后 IS NULL OR 变更后 = N'' THEN 变更后
WHEN CHARINDEX(N'单件工价=', 变更后) > 0 THEN
N'最终单价(元/件)=' + SUBSTRING(
变更后,
CHARINDEX(N'单件工价=', 变更后) + LEN(N'单件工价='),
CASE
WHEN CHARINDEX(N';', 变更后 + N';', CHARINDEX(N'单件工价=', 变更后)) > 0
THEN CHARINDEX(N';', 变更后 + N';', CHARINDEX(N'单件工价=', 变更后)) - CHARINDEX(N'单件工价=', 变更后) - LEN(N'单件工价=')
ELSE LEN(变更后)
END
)
ELSE 变更后
END
WHERE 变更前 LIKE N'%单件工价=%'
OR 变更后 LIKE N'%单件工价=%';
END
GO
-- 工序工价分页查询,参考制定工艺组件订单、产品、零件数据源后再展开有工序名称的数据;修改人:Ld 修改时间:2026-07-06 09:00:29;
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价_查询数据]', N'P') IS NOT NULL
DROP PROCEDURE [dbo].[车间生产管理工艺_工序工价_查询数据];
GO
CREATE PROCEDURE [dbo].[车间生产管理工艺_工序工价_查询数据]
@订单流水号_check INT = 0,
@订单流水号 INT = NULL,
@组件流水号_check INT = 0,
@组件流水号 INT = NULL,
@工艺计划流水号_check INT = 0,
@工艺计划流水号 INT = NULL,
@工艺名称_check INT = 0,
@工艺名称 NVARCHAR(100) = N'',
@工序名称_check INT = 0,
@工序名称 NVARCHAR(100) = N'',
@零件名称_check INT = 0,
@零件名称 NVARCHAR(100) = N'',
@图号_check INT = 0,
@图号 NVARCHAR(100) = N'',
@是否启用_check INT = 0,
@是否启用 NVARCHAR(20) = N'',
@PageCurrent INT = 1,
@PageSize INT = 1000
AS
BEGIN
SET NOCOUNT ON;
IF @PageCurrent IS NULL OR @PageCurrent < 1 SET @PageCurrent = 1;
-- 修改人:Ld 修改时间:2026-07-06 08:52:37;
-- 工序工价数据超过 100 条,默认页大小放大,页面仍可按分页参数控制
IF @PageSize IS NULL OR @PageSize < 1 SET @PageSize = 1000;
;WITH PlanData AS (
-- 修改人:Ld 修改时间:2026-07-06 08:36:02;
-- 与制定工艺组件订单、产品、零件选择保持同一工艺计划来源口径
SELECT gp.*
FROM [dbo].[车间生产管理_零件工艺计划_视图] gp
WHERE gp.考核状态 >= 1
AND (@订单流水号_check = 0 OR gp.订单流水号 = @订单流水号)
AND (@组件流水号_check = 0 OR gp.组件流水号 = @组件流水号)
AND (@工艺计划流水号_check = 0 OR gp.工艺计划流水号 = @工艺计划流水号)
AND (@零件名称_check = 0 OR gp.零件名称 + gp.零件图号 LIKE N'%' + @零件名称 + N'%')
AND (@图号_check = 0 OR gp.零件图号 LIKE N'%' + @图号 + N'%')
),
ProcessData AS (
SELECT
ROW_NUMBER() OVER (
ORDER BY gp.工艺更新时间 DESC, gp.工艺计划流水号 DESC, gx.工序顺序 ASC, gx.工序流水号 ASC
) AS RowNum,
price.工价流水号,
gx.工序流水号,
gx.工艺计划流水号,
gp.订单号,
gp.产品名称,
base.工艺名称 AS 工艺名称,
base.工艺名称 AS 工序名称,
gp.零件名称,
gp.零件图号 AS 图号,
gx.工序顺序,
gx.定额工时,
gx.准结工时,
ISNULL(price.[机动时间s], 0) AS [机动时间s],
ISNULL(price.[辅助时间s], 0) AS [辅助时间s],
ISNULL(price.[总时间s], 0) AS [总时间s],
ISNULL(price.[单装数量(件)], 0) AS [单装数量(件)],
ISNULL(price.[操作台数], 0) AS [操作台数],
ISNULL(price.[日产能(件)], 0) AS [日产能(件)],
ISNULL(price.[最终单价(元/件)], 0) AS [最终单价(元/件)],
CONVERT(VARCHAR(10), price.生效日期, 23) AS 生效日期,
ISNULL(price.变更次数, 0) AS 变更次数,
ISNULL(price.是否启用, 1) AS 是否启用,
price.备注,
price.创建人,
CONVERT(VARCHAR(19), price.创建时间, 120) AS 创建时间,
price.修改人,
CONVERT(VARCHAR(19), price.修改时间, 120) AS 修改时间
FROM PlanData gp
INNER JOIN [dbo].[车间生产管理工艺_零件工序] gx ON gp.工艺计划流水号 = gx.工艺计划流水号
LEFT JOIN [dbo].[车间生产管理工艺_基础表_工艺名称] base ON gx.工艺编号 = base.工艺编号
LEFT JOIN [dbo].[车间生产管理工艺_工序工价] price ON gx.工序流水号 = price.工序流水号
WHERE NULLIF(LTRIM(RTRIM(base.工艺名称)), N'') IS NOT NULL
AND (@工艺名称_check = 0 OR base.工艺名称 LIKE N'%' + @工艺名称 + N'%')
AND (@工序名称_check = 0 OR base.工艺名称 LIKE N'%' + @工序名称 + N'%')
AND (@是否启用_check = 0 OR CAST(ISNULL(price.是否启用, 1) AS NVARCHAR(20)) = @是否启用)
)
SELECT
工价流水号,
工序流水号,
工艺计划流水号,
订单号,
产品名称,
工艺名称,
工序名称,
零件名称,
图号,
工序顺序,
定额工时,
准结工时,
[机动时间s],
[辅助时间s],
[总时间s],
[单装数量(件)],
操作台数,
[日产能(件)],
[最终单价(元/件)],
生效日期,
变更次数,
是否启用,
备注,
创建人,
创建时间,
修改人,
修改时间
FROM ProcessData
WHERE RowNum BETWEEN ((@PageCurrent - 1) * @PageSize + 1) AND (@PageCurrent * @PageSize)
ORDER BY RowNum;
SELECT COUNT(1) AS total
FROM [dbo].[车间生产管理_零件工艺计划_视图] gp
INNER JOIN [dbo].[车间生产管理工艺_零件工序] gx ON gp.工艺计划流水号 = gx.工艺计划流水号
LEFT JOIN [dbo].[车间生产管理工艺_基础表_工艺名称] base ON gx.工艺编号 = base.工艺编号
LEFT JOIN [dbo].[车间生产管理工艺_工序工价] price ON gx.工序流水号 = price.工序流水号
WHERE gp.考核状态 >= 1
AND (@订单流水号_check = 0 OR gp.订单流水号 = @订单流水号)
AND (@组件流水号_check = 0 OR gp.组件流水号 = @组件流水号)
AND (@工艺计划流水号_check = 0 OR gp.工艺计划流水号 = @工艺计划流水号)
AND NULLIF(LTRIM(RTRIM(base.工艺名称)), N'') IS NOT NULL
AND (@工艺名称_check = 0 OR base.工艺名称 LIKE N'%' + @工艺名称 + N'%')
AND (@工序名称_check = 0 OR base.工艺名称 LIKE N'%' + @工序名称 + N'%')
AND (@零件名称_check = 0 OR gp.零件名称 + gp.零件图号 LIKE N'%' + @零件名称 + N'%')
AND (@图号_check = 0 OR gp.零件图号 LIKE N'%' + @图号 + N'%')
AND (@是否启用_check = 0 OR CAST(ISNULL(price.是否启用, 1) AS NVARCHAR(20)) = @是否启用);
END
GO
-- 工序工价新增;修改人:Ld 修改时间:2026-07-03 08:02:29;
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价_增加数据]', N'P') IS NOT NULL
DROP PROCEDURE [dbo].[车间生产管理工艺_工序工价_增加数据];
GO
CREATE PROCEDURE [dbo].[车间生产管理工艺_工序工价_增加数据]
@工价流水号 NVARCHAR(50) = N'',
@工艺名称 NVARCHAR(100) = N'',
@工序名称 NVARCHAR(100) = N'',
@零件名称 NVARCHAR(100) = N'',
@图号 NVARCHAR(100) = N'',
@机动时间s NVARCHAR(50) = N'',
@辅助时间s NVARCHAR(50) = N'',
@总时间s NVARCHAR(50) = N'',
@单装数量件 NVARCHAR(50) = N'',
@操作台数 NVARCHAR(50) = N'',
@日产能件 NVARCHAR(50) = N'',
@最终单价元件 NVARCHAR(50) = N'',
@生效日期 NVARCHAR(50) = N'',
@变更次数 NVARCHAR(50) = N'',
@是否启用 NVARCHAR(20) = N'',
@备注 NVARCHAR(500) = N'',
@工序流水号 NVARCHAR(50) = N'',
@创建人 NVARCHAR(50) = N'',
@修改人 NVARCHAR(50) = N''
AS
BEGIN
EXEC [dbo].[车间生产管理工艺_工序工价_编辑数据]
@工价流水号 = @工价流水号,
@工艺名称 = @工艺名称,
@工序名称 = @工序名称,
@零件名称 = @零件名称,
@图号 = @图号,
@机动时间s = @机动时间s,
@辅助时间s = @辅助时间s,
@总时间s = @总时间s,
@单装数量件 = @单装数量件,
@操作台数 = @操作台数,
@日产能件 = @日产能件,
@最终单价元件 = @最终单价元件,
@生效日期 = @生效日期,
@变更次数 = @变更次数,
@是否启用 = @是否启用,
@备注 = @备注,
@工序流水号 = @工序流水号,
@修改人 = @修改人;
END
GO
-- 工序工价编辑,按已有工序流水号新增或更新工价记录;修改人:Ld 修改时间:2026-07-03 08:02:29;
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价_编辑数据]', N'P') IS NOT NULL
DROP PROCEDURE [dbo].[车间生产管理工艺_工序工价_编辑数据];
GO
CREATE PROCEDURE [dbo].[车间生产管理工艺_工序工价_编辑数据]
@工价流水号 NVARCHAR(50) = N'',
@工艺名称 NVARCHAR(100) = N'',
@工序名称 NVARCHAR(100) = N'',
@零件名称 NVARCHAR(100) = N'',
@图号 NVARCHAR(100) = N'',
@机动时间s NVARCHAR(50) = N'',
@辅助时间s NVARCHAR(50) = N'',
@总时间s NVARCHAR(50) = N'',
@单装数量件 NVARCHAR(50) = N'',
@操作台数 NVARCHAR(50) = N'',
@日产能件 NVARCHAR(50) = N'',
@最终单价元件 NVARCHAR(50) = N'',
@生效日期 NVARCHAR(50) = N'',
@变更次数 NVARCHAR(50) = N'',
@是否启用 NVARCHAR(20) = N'',
@备注 NVARCHAR(500) = N'',
@工序流水号 NVARCHAR(50) = N'',
@修改人 NVARCHAR(50) = N''
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Id INT;
DECLARE @Safe工序流水号 INT;
DECLARE @Safe机动时间s DECIMAL(18, 4);
DECLARE @Safe辅助时间s DECIMAL(18, 4);
DECLARE @Safe总时间s DECIMAL(18, 4);
DECLARE @Safe单装数量件 DECIMAL(18, 4);
DECLARE @Safe操作台数 DECIMAL(18, 4);
DECLARE @Safe日产能件 DECIMAL(18, 4);
DECLARE @Safe最终单价元件 DECIMAL(18, 4);
DECLARE @Safe生效日期 DATE;
DECLARE @Safe变更次数 INT;
DECLARE @Safe是否启用 BIT = CASE WHEN NULLIF(@是否启用, N'') IS NULL THEN 1 WHEN @是否启用 = N'1' THEN 1 ELSE 0 END;
DECLARE @操作人 NVARCHAR(50) = NULLIF(@修改人, N'');
DECLARE @当前时间 DATETIME = GETDATE();
DECLARE @旧数据 NVARCHAR(MAX);
DECLARE @新数据 NVARCHAR(MAX);
DECLARE @Old工序流水号 INT;
SET @Id = CASE WHEN ISNUMERIC(NULLIF(@工价流水号, N'')) = 1 THEN CONVERT(INT, @工价流水号) ELSE NULL END;
SET @Safe工序流水号 = CASE WHEN ISNUMERIC(NULLIF(@工序流水号, N'')) = 1 THEN CONVERT(INT, @工序流水号) ELSE NULL END;
SET @Safe机动时间s = CASE WHEN ISNUMERIC(NULLIF(@机动时间s, N'')) = 1 THEN CONVERT(DECIMAL(18, 4), @机动时间s) ELSE 0 END;
SET @Safe辅助时间s = CASE WHEN ISNUMERIC(NULLIF(@辅助时间s, N'')) = 1 THEN CONVERT(DECIMAL(18, 4), @辅助时间s) ELSE 0 END;
SET @Safe总时间s = CASE WHEN ISNUMERIC(NULLIF(@总时间s, N'')) = 1 THEN CONVERT(DECIMAL(18, 4), @总时间s) ELSE 0 END;
SET @Safe单装数量件 = CASE WHEN ISNUMERIC(NULLIF(@单装数量件, N'')) = 1 THEN CONVERT(DECIMAL(18, 4), @单装数量件) ELSE 0 END;
SET @Safe操作台数 = CASE WHEN ISNUMERIC(NULLIF(@操作台数, N'')) = 1 THEN CONVERT(DECIMAL(18, 4), @操作台数) ELSE 0 END;
SET @Safe日产能件 = CASE WHEN ISNUMERIC(NULLIF(@日产能件, N'')) = 1 THEN CONVERT(DECIMAL(18, 4), @日产能件) ELSE 0 END;
SET @Safe最终单价元件 = CASE WHEN ISNUMERIC(NULLIF(@最终单价元件, N'')) = 1 THEN CONVERT(DECIMAL(18, 4), @最终单价元件) ELSE 0 END;
SET @Safe生效日期 = CASE WHEN ISDATE(NULLIF(@生效日期, N'')) = 1 THEN CONVERT(DATE, @生效日期) ELSE NULL END;
SET @Safe变更次数 = CASE WHEN ISNUMERIC(NULLIF(@变更次数, N'')) = 1 THEN CONVERT(INT, @变更次数) ELSE 0 END;
IF @Safe工序流水号 IS NULL
BEGIN
SELECT N'0' AS result, N'工序流水号不能为空' AS message;
RETURN;
END;
IF NULLIF(LTRIM(RTRIM(@工艺名称)), N'') IS NULL
OR NULLIF(LTRIM(RTRIM(@工序名称)), N'') IS NULL
OR NULLIF(LTRIM(RTRIM(@零件名称)), N'') IS NULL
OR NULLIF(LTRIM(RTRIM(@图号)), N'') IS NULL
BEGIN
SELECT N'0' AS result, N'工艺名称、工序名称、零件名称和图号不能为空' AS message;
RETURN;
END;
IF @Id IS NULL
BEGIN
SELECT TOP 1 @Id = 工价流水号
FROM [dbo].[车间生产管理工艺_工序工价]
WHERE 工序流水号 = @Safe工序流水号;
END;
IF @Id IS NOT NULL
AND NOT EXISTS (
SELECT 1
FROM [dbo].[车间生产管理工艺_工序工价]
WHERE 工价流水号 = @Id
)
BEGIN
SELECT N'0' AS result, N'工序工价记录不存在' AS message;
RETURN;
END;
BEGIN TRY
BEGIN TRAN;
IF @Id IS NOT NULL
BEGIN
SELECT
@Old工序流水号 = 工序流水号,
-- 修改人:Ld 修改时间:2026-07-06 09:27:09; 历史数据只存储最终单价
@旧数据 = N'最终单价(元/件)=' + CONVERT(NVARCHAR(50), ISNULL([最终单价(元/件)], 0))
FROM [dbo].[车间生产管理工艺_工序工价]
WHERE 工价流水号 = @Id;
UPDATE [dbo].[车间生产管理工艺_工序工价]
SET 工序流水号 = @Safe工序流水号,
工艺名称 = LTRIM(RTRIM(@工艺名称)),
工序名称 = LTRIM(RTRIM(@工序名称)),
零件名称 = LTRIM(RTRIM(@零件名称)),
图号 = LTRIM(RTRIM(@图号)),
[机动时间s] = @Safe机动时间s,
[辅助时间s] = @Safe辅助时间s,
[总时间s] = @Safe总时间s,
[单装数量(件)] = @Safe单装数量件,
[操作台数] = @Safe操作台数,
[日产能(件)] = @Safe日产能件,
[最终单价(元/件)] = @Safe最终单价元件,
生效日期 = @Safe生效日期,
变更次数 = @Safe变更次数,
是否启用 = @Safe是否启用,
备注 = NULLIF(@备注, N''),
计价方式 = N'按件',
单件工价 = @Safe最终单价元件,
修改人 = @操作人,
修改时间 = @当前时间
WHERE 工价流水号 = @Id;
END
ELSE
BEGIN
INSERT INTO [dbo].[车间生产管理工艺_工序工价](
工序流水号,
工艺名称,
工序名称,
零件名称,
图号,
[机动时间s],
[辅助时间s],
[总时间s],
[单装数量(件)],
[操作台数],
[日产能(件)],
[最终单价(元/件)],
生效日期,
变更次数,
是否启用,
备注,
创建人,
创建时间,
修改人,
修改时间,
计价方式,
单件工价
)
VALUES (
@Safe工序流水号,
LTRIM(RTRIM(@工艺名称)),
LTRIM(RTRIM(@工序名称)),
LTRIM(RTRIM(@零件名称)),
LTRIM(RTRIM(@图号)),
@Safe机动时间s,
@Safe辅助时间s,
@Safe总时间s,
@Safe单装数量件,
@Safe操作台数,
@Safe日产能件,
@Safe最终单价元件,
@Safe生效日期,
@Safe变更次数,
@Safe是否启用,
NULLIF(@备注, N''),
@操作人,
@当前时间,
@操作人,
@当前时间,
N'按件',
@Safe最终单价元件
);
SET @Id = SCOPE_IDENTITY();
SET @Old工序流水号 = @Safe工序流水号;
SET @旧数据 = N'';
END;
-- 修改人:Ld 修改时间:2026-07-06 09:27:09; 历史数据只存储最终单价
SET @新数据 = N'最终单价(元/件)=' + CONVERT(NVARCHAR(50), @Safe最终单价元件);
INSERT INTO [dbo].[车间生产管理工艺_工序工价历史记录](
工价流水号,
工序流水号,
工艺名称,
工序名称,
零件名称,
图号,
操作类型,
变更前,
变更后,
操作人,
操作时间,
备注
)
VALUES (
@Id,
ISNULL(@Safe工序流水号, @Old工序流水号),
LTRIM(RTRIM(@工艺名称)),
LTRIM(RTRIM(@工序名称)),
LTRIM(RTRIM(@零件名称)),
LTRIM(RTRIM(@图号)),
CASE WHEN @旧数据 = N'' THEN N'新增' ELSE N'编辑' END,
@旧数据,
@新数据,
@操作人,
@当前时间,
NULLIF(@备注, N'')
);
COMMIT TRAN;
SELECT N'1' AS result, @Id AS 工价流水号;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRAN;
SELECT N'0' AS result, ERROR_MESSAGE() AS message;
END CATCH;
END
GO
-- 工序工价停用;修改人:Ld 修改时间:2026-07-03 08:02:29;
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 @操作人 NVARCHAR(50) = NULLIF(@修改人, N'');
DECLARE @当前时间 DATETIME = GETDATE();
DECLARE @旧数据 NVARCHAR(MAX);
DECLARE @工序流水号 INT;
DECLARE @工艺名称 NVARCHAR(100);
DECLARE @工序名称 NVARCHAR(100);
DECLARE @零件名称 NVARCHAR(100);
DECLARE @图号 NVARCHAR(100);
DECLARE @变更后 NVARCHAR(MAX);
SET @Id = CASE WHEN ISNUMERIC(NULLIF(@工价流水号, N'')) = 1 THEN CONVERT(INT, @工价流水号) ELSE NULL END;
IF @Id IS NULL
BEGIN
SELECT N'0' AS result, N'工价流水号不能为空' AS message;
RETURN;
END;
IF NOT EXISTS (
SELECT 1
FROM [dbo].[车间生产管理工艺_工序工价]
WHERE 工价流水号 = @Id
)
BEGIN
SELECT N'0' AS result, N'工序工价记录不存在' AS message;
RETURN;
END;
BEGIN TRY
BEGIN TRAN;
SELECT
@工序流水号 = 工序流水号,
@工艺名称 = 工艺名称,
@工序名称 = 工序名称,
@零件名称 = 零件名称,
@图号 = 图号,
-- 修改人:Ld 修改时间:2026-07-06 09:27:09; 停用历史只记录最终单价
@旧数据 = N'最终单价(元/件)=' + CONVERT(NVARCHAR(50), ISNULL([最终单价(元/件)], 0))
FROM [dbo].[车间生产管理工艺_工序工价]
WHERE 工价流水号 = @Id;
UPDATE [dbo].[车间生产管理工艺_工序工价]
SET 是否启用 = 0,
修改人 = @操作人,
修改时间 = @当前时间
WHERE 工价流水号 = @Id;
-- 修改人:Ld 修改时间:2026-07-06 09:27:09; 停用历史只记录最终单价
SET @变更后 = @旧数据;
INSERT INTO [dbo].[车间生产管理工艺_工序工价历史记录](
工价流水号,
工序流水号,
工艺名称,
工序名称,
零件名称,
图号,
操作类型,
变更前,
变更后,
操作人,
操作时间,
备注
)
VALUES (
@Id,
@工序流水号,
@工艺名称,
@工序名称,
@零件名称,
@图号,
N'停用',
@旧数据,
@变更后,
@操作人,
@当前时间,
N''
);
COMMIT TRAN;
SELECT N'1' AS result;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRAN;
SELECT N'0' AS result, ERROR_MESSAGE() AS message;
END CATCH;
END
GO
-- 工序工价复制源查询,仅返回零件名称、工序号和工艺名称;修改人:Ld 修改时间:2026-07-06 08:45:45;
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价_复制源_查询数据]', N'P') IS NOT NULL
DROP PROCEDURE [dbo].[车间生产管理工艺_工序工价_复制源_查询数据];
GO
CREATE PROCEDURE [dbo].[车间生产管理工艺_工序工价_复制源_查询数据]
@零件图号 NVARCHAR(100) = N''
AS
BEGIN
SET NOCOUNT ON;
DECLARE @源工艺计划流水号 INT;
SELECT TOP 1 @源工艺计划流水号 = 工艺计划流水号
FROM [dbo].[车间生产管理_零件工艺计划_视图]
WHERE 零件图号 = @零件图号
AND 考核状态 >= 1
ORDER BY 工艺更新时间 DESC, 工艺计划流水号 DESC;
SELECT
gp.零件名称,
gx.工序顺序,
ISNULL(base.工艺名称, N'未设置工序') AS 工艺名称
FROM [dbo].[车间生产管理工艺_零件工序] gx
LEFT JOIN [dbo].[车间生产管理工艺_基础表_工艺名称] base ON gx.工艺编号 = base.工艺编号
LEFT JOIN [dbo].[车间生产管理_零件工艺计划_视图] gp ON gx.工艺计划流水号 = gp.工艺计划流水号
WHERE gx.工艺计划流水号 = @源工艺计划流水号
ORDER BY gx.工序顺序;
END
GO
-- 工序工价复制,按工序号和工艺名称匹配源零件已维护工价;修改人:Ld 修改时间:2026-07-06 08:45:45;
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价_复制数据]', N'P') IS NOT NULL
DROP PROCEDURE [dbo].[车间生产管理工艺_工序工价_复制数据];
GO
CREATE PROCEDURE [dbo].[车间生产管理工艺_工序工价_复制数据]
@目标工艺计划流水号 NVARCHAR(50) = N'',
@源零件图号 NVARCHAR(100) = N'',
@修改人 NVARCHAR(50) = N''
AS
BEGIN
SET NOCOUNT ON;
DECLARE @TargetPlanId INT;
DECLARE @SourcePlanId INT;
DECLARE @操作人 NVARCHAR(50) = NULLIF(@修改人, N'');
DECLARE @当前时间 DATETIME = GETDATE();
SET @TargetPlanId = CASE WHEN ISNUMERIC(NULLIF(@目标工艺计划流水号, N'')) = 1 THEN CONVERT(INT, @目标工艺计划流水号) ELSE NULL END;
IF @TargetPlanId IS NULL
BEGIN
SELECT N'0' AS result, N'目标零件不能为空' AS message;
RETURN;
END;
SELECT TOP 1 @SourcePlanId = 工艺计划流水号
FROM [dbo].[车间生产管理_零件工艺计划_视图]
WHERE 零件图号 = @源零件图号
AND 考核状态 >= 1
ORDER BY 工艺更新时间 DESC, 工艺计划流水号 DESC;
IF @SourcePlanId IS NULL
BEGIN
SELECT N'0' AS result, N'源零件没有可复制的工序数据' AS message;
RETURN;
END;
IF @SourcePlanId = @TargetPlanId
BEGIN
SELECT N'0' AS result, N'不能复制当前零件自身' AS message;
RETURN;
END;
IF OBJECT_ID(N'tempdb..#CopyRows') IS NOT NULL DROP TABLE #CopyRows;
CREATE TABLE #CopyRows(
工序流水号 INT NOT NULL,
工艺名称 NVARCHAR(100) NOT NULL,
工序名称 NVARCHAR(100) NOT NULL,
零件名称 NVARCHAR(100) NOT NULL,
图号 NVARCHAR(100) NOT NULL,
[机动时间s] DECIMAL(18, 4) NOT NULL,
[辅助时间s] DECIMAL(18, 4) NOT NULL,
[总时间s] DECIMAL(18, 4) NOT NULL,
[单装数量(件)] DECIMAL(18, 4) NOT NULL,
[操作台数] DECIMAL(18, 4) NOT NULL,
[日产能(件)] DECIMAL(18, 4) NOT NULL,
[最终单价(元/件)] DECIMAL(18, 4) NOT NULL,
生效日期 DATE NULL,
变更次数 INT NOT NULL,
是否启用 BIT NOT NULL,
备注 NVARCHAR(500) NULL
);
-- 修改人:Ld 修改时间:2026-07-06 08:45:45;
-- 源与目标仅按工序号和工艺名称匹配,避免带入制定工艺的其他工艺编辑数据
INSERT INTO #CopyRows(
工序流水号,
工艺名称,
工序名称,
零件名称,
图号,
[机动时间s],
[辅助时间s],
[总时间s],
[单装数量(件)],
[操作台数],
[日产能(件)],
[最终单价(元/件)],
生效日期,
变更次数,
是否启用,
备注
)
SELECT
targetGx.工序流水号,
ISNULL(targetBase.工艺名称, N'未设置工序') AS 工艺名称,
ISNULL(targetBase.工艺名称, N'未设置工序') AS 工序名称,
targetGp.零件名称,
targetGp.零件图号 AS 图号,
sourcePrice.[机动时间s],
sourcePrice.[辅助时间s],
sourcePrice.[总时间s],
sourcePrice.[单装数量(件)],
sourcePrice.[操作台数],
sourcePrice.[日产能(件)],
sourcePrice.[最终单价(元/件)],
sourcePrice.生效日期,
sourcePrice.变更次数,
sourcePrice.是否启用,
sourcePrice.备注
FROM [dbo].[车间生产管理工艺_零件工序] targetGx
LEFT JOIN [dbo].[车间生产管理工艺_基础表_工艺名称] targetBase ON targetGx.工艺编号 = targetBase.工艺编号
LEFT JOIN [dbo].[车间生产管理_零件工艺计划_视图] targetGp ON targetGx.工艺计划流水号 = targetGp.工艺计划流水号
INNER JOIN [dbo].[车间生产管理工艺_零件工序] sourceGx ON sourceGx.工艺计划流水号 = @SourcePlanId
AND sourceGx.工序顺序 = targetGx.工序顺序
LEFT JOIN [dbo].[车间生产管理工艺_基础表_工艺名称] sourceBase ON sourceGx.工艺编号 = sourceBase.工艺编号
INNER JOIN [dbo].[车间生产管理工艺_工序工价] sourcePrice ON sourceGx.工序流水号 = sourcePrice.工序流水号
WHERE targetGx.工艺计划流水号 = @TargetPlanId
AND ISNULL(sourceBase.工艺名称, N'未设置工序') = ISNULL(targetBase.工艺名称, N'未设置工序');
IF NOT EXISTS (SELECT 1 FROM #CopyRows)
BEGIN
SELECT N'0' AS result, N'源零件没有可匹配的工价记录' AS message;
RETURN;
END;
BEGIN TRY
BEGIN TRAN;
UPDATE price
SET price.工艺名称 = copyData.工艺名称,
price.工序名称 = copyData.工序名称,
price.零件名称 = copyData.零件名称,
price.图号 = copyData.图号,
price.[机动时间s] = copyData.[机动时间s],
price.[辅助时间s] = copyData.[辅助时间s],
price.[总时间s] = copyData.[总时间s],
price.[单装数量(件)] = copyData.[单装数量(件)],
price.[操作台数] = copyData.[操作台数],
price.[日产能(件)] = copyData.[日产能(件)],
price.[最终单价(元/件)] = copyData.[最终单价(元/件)],
price.生效日期 = copyData.生效日期,
price.变更次数 = copyData.变更次数,
price.是否启用 = copyData.是否启用,
price.备注 = copyData.备注,
price.计价方式 = N'按件',
price.单件工价 = copyData.[最终单价(元/件)],
price.修改人 = @操作人,
price.修改时间 = @当前时间
FROM [dbo].[车间生产管理工艺_工序工价] price
INNER JOIN #CopyRows copyData ON price.工序流水号 = copyData.工序流水号;
INSERT INTO [dbo].[车间生产管理工艺_工序工价](
工序流水号,
工艺名称,
工序名称,
零件名称,
图号,
[机动时间s],
[辅助时间s],
[总时间s],
[单装数量(件)],
[操作台数],
[日产能(件)],
[最终单价(元/件)],
生效日期,
变更次数,
是否启用,
备注,
创建人,
创建时间,
修改人,
修改时间,
计价方式,
单件工价
)
SELECT
copyData.工序流水号,
copyData.工艺名称,
copyData.工序名称,
copyData.零件名称,
copyData.图号,
copyData.[机动时间s],
copyData.[辅助时间s],
copyData.[总时间s],
copyData.[单装数量(件)],
copyData.[操作台数],
copyData.[日产能(件)],
copyData.[最终单价(元/件)],
copyData.生效日期,
copyData.变更次数,
copyData.是否启用,
copyData.备注,
@操作人,
@当前时间,
@操作人,
@当前时间,
N'按件',
copyData.[最终单价(元/件)]
FROM #CopyRows copyData
WHERE NOT EXISTS (
SELECT 1
FROM [dbo].[车间生产管理工艺_工序工价] price
WHERE price.工序流水号 = copyData.工序流水号
);
INSERT INTO [dbo].[车间生产管理工艺_工序工价历史记录](
工价流水号,
工序流水号,
工艺名称,
工序名称,
零件名称,
图号,
操作类型,
变更前,
变更后,
操作人,
操作时间,
备注
)
SELECT
price.工价流水号,
price.工序流水号,
price.工艺名称,
price.工序名称,
price.零件名称,
price.图号,
N'拷贝',
N'源零件图号=' + ISNULL(@源零件图号, N''),
N'最终单价(元/件)=' + CONVERT(NVARCHAR(50), price.[最终单价(元/件)]),
@操作人,
@当前时间,
N'工序工价拷贝'
FROM [dbo].[车间生产管理工艺_工序工价] price
INNER JOIN #CopyRows copyData ON price.工序流水号 = copyData.工序流水号;
COMMIT TRAN;
SELECT N'1' AS result, COUNT(1) AS 复制数量
FROM #CopyRows;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRAN;
SELECT N'0' AS result, ERROR_MESSAGE() AS message;
END CATCH;
END
GO
-- 工序工价历史查询,按该零件的该工序名称查看历史;修改人:Ld 修改时间:2026-07-06 09:00:29;
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价_历史_查询数据]', N'P') IS NOT NULL
DROP PROCEDURE [dbo].[车间生产管理工艺_工序工价_历史_查询数据];
GO
CREATE PROCEDURE [dbo].[车间生产管理工艺_工序工价_历史_查询数据]
@零件名称_check INT = 0,
@零件名称 NVARCHAR(100) = N'',
@图号_check INT = 0,
@图号 NVARCHAR(100) = N'',
@工序名称_check INT = 0,
@工序名称 NVARCHAR(100) = N'',
@PageCurrent INT = 1,
@PageSize INT = 100
AS
BEGIN
SET NOCOUNT ON;
IF @PageCurrent IS NULL OR @PageCurrent < 1 SET @PageCurrent = 1;
IF @PageSize IS NULL OR @PageSize < 1 SET @PageSize = 100;
;WITH HistoryData AS (
SELECT
ROW_NUMBER() OVER (ORDER BY 操作时间 DESC, 历史流水号 DESC) AS RowNum,
历史流水号,
工价流水号,
工序流水号,
工艺名称,
工序名称,
零件名称,
图号,
操作类型,
变更前,
变更后,
操作人,
CONVERT(VARCHAR(19), 操作时间, 120) AS 操作时间,
备注
FROM [dbo].[车间生产管理工艺_工序工价历史记录]
WHERE (@零件名称_check = 0 OR 零件名称 = @零件名称)
AND (@图号_check = 0 OR 图号 = @图号)
AND (@工序名称_check = 0 OR 工序名称 = @工序名称)
)
SELECT
历史流水号,
工价流水号,
工序流水号,
工艺名称,
工序名称,
零件名称,
图号,
操作类型,
变更前,
变更后,
操作人,
操作时间,
备注
FROM HistoryData
WHERE RowNum BETWEEN ((@PageCurrent - 1) * @PageSize + 1) AND (@PageCurrent * @PageSize)
ORDER BY RowNum;
SELECT COUNT(1) AS total
FROM [dbo].[车间生产管理工艺_工序工价历史记录]
WHERE (@零件名称_check = 0 OR 零件名称 = @零件名称)
AND (@图号_check = 0 OR 图号 = @图号)
AND (@工序名称_check = 0 OR 工序名称 = @工序名称);
END
GO