diff --git a/db_backups/add_device_name_and_import_excel_20260629.sql b/db_backups/add_device_name_and_import_excel_20260629.sql new file mode 100644 index 0000000..f92ec90 --- /dev/null +++ b/db_backups/add_device_name_and_import_excel_20260629.sql @@ -0,0 +1,169 @@ +USE [YL_MESDB] +GO + +IF COL_LENGTH(N'dbo.基础数据_设备工位点检表', N'名称') IS NULL + ALTER TABLE [dbo].[基础数据_设备工位点检表] ADD [名称] nvarchar(100) NULL +GO + +ALTER PROCEDURE [dbo].[设备管理_设备信息_增加] + @名称 nvarchar(50) = NULL, + @公司编码 nvarchar(100) = NULL, + @设备名称 nvarchar(50) = NULL, + @设备型号 nvarchar(50) = NULL, + @设备类型 nvarchar(50) = NULL, + @设备信息 nvarchar(500) = NULL, + @使用部门 nvarchar(100) = NULL, + @入账日期 nvarchar(50) = NULL, + @单位 nvarchar(50) = NULL, + @数量 decimal(18, 4) = NULL, + @状态 nvarchar(50) = NULL, + @维修记录 nvarchar(1000) = NULL, + @维保记录 nvarchar(1000) = NULL, + @工位绑定 nvarchar(1000) = NULL, + @主要设备 nvarchar(10) = NULL, + @设备标准开机工时 decimal(18, 4) = NULL, + @特种设备 nvarchar(10) = NULL, + @证书有效期至 nvarchar(50) = NULL +AS +BEGIN + SET NOCOUNT ON; + IF ISNULL(@公司编码, N'') = N'' BEGIN SELECT '0' AS result, N'公司编码不能为空' AS message; RETURN; END + INSERT INTO [dbo].[基础数据_设备工位点检表] ([名称],[公司编码],[设备名称],[设备型号],[设备类型],[设备信息],[使用部门],[入账日期],[单位],[数量],[状态],[维修记录],[维保记录],[工位绑定],[主要设备],[设备标准开机工时],[特种设备],[证书有效期至]) + VALUES (@名称,@公司编码,@设备名称,@设备型号,@设备类型,@设备信息,@使用部门,TRY_CONVERT(date, NULLIF(@入账日期, N'')),@单位,@数量,@状态,@维修记录,@维保记录,@工位绑定,@主要设备,@设备标准开机工时,@特种设备,TRY_CONVERT(date, NULLIF(@证书有效期至, N''))); + SELECT '1' AS result; +END +GO + +ALTER PROCEDURE [dbo].[设备管理_设备信息_编辑] + @设备流水号 int = NULL, + @名称 nvarchar(50) = NULL, + @公司编码 nvarchar(100) = NULL, + @设备名称 nvarchar(50) = NULL, + @设备型号 nvarchar(50) = NULL, + @设备类型 nvarchar(50) = NULL, + @设备信息 nvarchar(500) = NULL, + @使用部门 nvarchar(100) = NULL, + @入账日期 nvarchar(50) = NULL, + @单位 nvarchar(50) = NULL, + @数量 decimal(18, 4) = NULL, + @状态 nvarchar(50) = NULL, + @维修记录 nvarchar(1000) = NULL, + @维保记录 nvarchar(1000) = NULL, + @工位绑定 nvarchar(1000) = NULL, + @主要设备 nvarchar(10) = NULL, + @设备标准开机工时 decimal(18, 4) = NULL, + @特种设备 nvarchar(10) = NULL, + @证书有效期至 nvarchar(50) = NULL +AS +BEGIN + SET NOCOUNT ON; + UPDATE [dbo].[基础数据_设备工位点检表] + SET [名称]=@名称,[设备名称]=@设备名称,[设备型号]=@设备型号,[设备类型]=@设备类型,[设备信息]=@设备信息,[使用部门]=@使用部门,[入账日期]=TRY_CONVERT(date, NULLIF(@入账日期, N'')),[单位]=@单位,[数量]=@数量,[状态]=@状态,[维修记录]=@维修记录,[维保记录]=@维保记录,[工位绑定]=@工位绑定,[主要设备]=@主要设备,[设备标准开机工时]=@设备标准开机工时,[特种设备]=@特种设备,[证书有效期至]=TRY_CONVERT(date, NULLIF(@证书有效期至, N'')) + WHERE [设备流水号]=@设备流水号; + SELECT '1' AS result; +END +GO + +DECLARE @导入设备 TABLE ([名称] nvarchar(100),[公司编码] nvarchar(100),[生产用名] nvarchar(50),[型号规格] nvarchar(50),[设备信息] nvarchar(500),[使用部门] nvarchar(100),[入账日期] date,[单位] nvarchar(50),[数量] decimal(18,4),[状态] nvarchar(50)); +INSERT INTO @导入设备 VALUES (N'气泵(空压机)',N'REALLY-11',N'气泵',N'1.4MPa/YT132S-4',N'最大压力0.8Mpa',N'一楼机加车间','2006-12-31',N'台',1,N'停用'); +INSERT INTO @导入设备 VALUES (N'台钻',N'REALLY-21',N'台钻',N'JW7114',N'φ2-12mm/0.1mm',N'二楼机加车间','2007-01-01',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'数控加工中心',N'REALLY-6',N'加1',N'VDL-600A',N'X600/Y420/Z520/',N'一楼机加车间','2008-12-23',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'普通车床',N'REALLY-1',N'普1',N'CD6240A',N'回转直径400/转速1400/0.04mm',N'一楼机加车间','2010-12-31',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'砂轮机',N'REALLY-19',N'砂轮机',N'MQ3225',N'转速3000/砂轮直径250',N'一楼机加车间','2010-12-31',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'数控车床',N'REALLY-3',N'数2',N'CAK5085di',N'床鞍直径280',N'一楼机加车间','2011-09-29',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'万能外圆磨床',N'REALLY-8',N'磨2',N'MG1420E',N'0.005mm',N'一楼机加车间','2012-03-29',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'数控车床',N'REALLY-2',N'数1',N'CAK3665DI',N'0.01mm',N'一楼机加车间','2013-12-31',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'数显鼓风干燥箱/烤箱',N'REALLY-14',N'烤箱',N'101A-0',NULL,N'二楼装配区','2014-06-05',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'数控车床',N'REALLY-4',N'数3',N'Viva T2c/500',N'0.01mm',N'一楼机加车间','2015-03-17',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'超声波清洗机',N'REALLY-16',N'清洗机',N'FRQ-20100ST',NULL,N'二楼清洗室','2015-04-12',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'抛光机',N'REALLY-44',N'抛光机',N'ZXH-Z615-1/ZXH-756',NULL,N'一楼机加车间','2015-05-17',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'激光打标机',N'REALLY-13',N'打标机',N'骄子LMK-F20',NULL,N'二楼装配区','2016-02-01',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'数控车床',N'REALLY-5',N'数4',N'Viva T2C/500',N'0.01mm',N'一楼机加车间','2018-05-11',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'锯床',N'REALLY-10',N'锯1',N'GZ4232',N'0.1mm',N'一楼机加车间','2018-08-26',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'内燃叉车',N'REALLY-33',N'油叉',N'CPCD30/3.0T',N'<3T',N'一楼机加车间','2020-04-15',N'辆',1,NULL); +INSERT INTO @导入设备 VALUES (N'螺杆空压机',N'REALLY-23',N'15KW空压机',N'LU15 Pmi',N'最大压力0.8Mpa',N'一楼空压机室','2020-06-29',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'冷干机',N'已报废',NULL,N'PRIMAK D21',NULL,N'一楼空压机室','2020-06-29',N'台',1,N'报废'); +INSERT INTO @导入设备 VALUES (N'数控车床',N'REALLY-25',N'数5',N'T55M含自动排屑器',N'0.01mm',N'一楼机加车间','2020-11-05',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'立卧两用数控台',N'加1#用',N'加1四轴',N'SKT13170F',N'0.05mm',N'加1设备内','2020-12-10',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'立式加工中心',N'REALLY-26',N'加3',N'VDF-850A',N'0.02mm',N'一楼机加车间','2020-12-10',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'立卧两用数控台',N'加3#用',NULL,N'SKT13200F',N'0.05mm',N'一楼机加车间','2020-12-10',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'带锯床',N'REALLY-31',N'锯2',N'B33',N'0.1mm',N'一楼机加车间','2021-02-01',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'电动攻丝机',N'RELLY-29',N'攻丝机2#',N'SW-U16-L',N'夹头范围M3-M16',N'一楼机加车间','2021-02-28',N'台',1,N'停用'); +INSERT INTO @导入设备 VALUES (N'自动数控穿孔机',N'REALLY-28',N'电火花',N'NC4030高精度线规结构',N'穿孔直径0.8-3.0mm/0.05mm',N'一楼机加车间','2021-03-03',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'立式加工中心',N'REALLY-27',N'加4',N'VDF-850A',N'0.02mm',N'一楼机加车间','2021-03-11',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'摇臂钻床',N'REALLY-30',N'钻床',N'Z3050/16',N'夹头范围3-50',N'一楼机加车间','2021-03-17',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'航车',N'起重机/吊车',N'5T吊',N'YLHC-27',N'<5T',N'一楼机加车间','2021-04-05',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'电动叉车',N'REALLY-34',N'1.5T电叉',N'CDD-1525/CPCZ1.5T',N'<1.5T',N'二楼机加车间','2021-04-05',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'普通车床',N'REALLY-32',N'普2',N'CDE6150A',N'0.03mm',N'一楼机加车间','2021-09-02',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'数控车床',N'REALLY-36',N'数7',N'T55S',N'0.01mm',N'一楼机加车间','2022-04-03',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'数控车床',N'REALLY-37',N'数8',N'T55S',N'0.01mm',N'一楼机加车间','2022-04-03',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'洗地机',N'RELLY-38',N'洗地机',N'YZ-X2',NULL,N'一楼机加车间','2022-04-29',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'自动上下料设备',N'REALLY-39',N'数8机械人',N'HY2119/HY-JCSXL1-2',NULL,N'一楼机加车间','2022-06-22',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'加工中心',N'REALLY-40',N'加5',N'V11L',N'0.02mm',N'一楼机加车间','2022-12-09',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'转台',N'加5#用',N'加5四轴',N'HR-255N-K',N'0.05mm',N'一楼机加车间','2022-12-22',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'旋转接头',N'数7#数#8用',NULL,N'YQXJ56M-20',N'0.1mm',N'一楼机加车间','2023-02-06',N'台',2,NULL); +INSERT INTO @导入设备 VALUES (N'中实三爪液压卡盘',N'数7#数#8用',N'液压卡盘',N'CL-06A5',NULL,N'一楼机加车间','2023-02-14',N'台',2,NULL); +INSERT INTO @导入设备 VALUES (N'套丝机',N'RELLY-41',N'套丝机',N'SQ-50B1',NULL,N'一楼机加车间','2023-03-12',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'线号机',N'REALLY-17',N'线号机',N'LM-550B/LM550E',NULL,N'二楼装配车间','2023-04-22',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'高频加热炉',N'REALLY-42',N'高频加热',N'TGG-35KW进品版',NULL,N'二楼装配车间','2023-08-06',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'普通车床',N'REALLY-43',N'普3',N'CW6163E/1000',N'0.03mm',N'一楼机加车间','2023-08-14',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'光栅尺数显系统',N'普3#用',N'普3数显',N'Z向1100mm,X向570mm',NULL,N'一楼机加车间','2023-08-16',N'套',1,NULL); +INSERT INTO @导入设备 VALUES (N'卧式加工中心',N'REALLY-45',N'卧加1',N'HCN-6000L',N'0.01mm',N'一楼机加车间','2023-11-27',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'姊妹刀功能软件',N'数7#数#8用',N'对刀仪',N'6FC5800-OAM78-OYB0',NULL,N'一楼机加车间','2023-12-03',N'套',2,NULL); +INSERT INTO @导入设备 VALUES (N'自动料仓',N'机器人用',N'机器人料仓',N'配机械手定制件',NULL,N'一楼机加车间','2024-01-28',N'套',1,NULL); +INSERT INTO @导入设备 VALUES (N'电动悬挂起重机(欧式)',N'REALLY-46',N'普车吊',N'LX2.8T-7.3M/LD2-70/YJ',N'<1.5T',N'一楼机加车间','2024-06-29',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'电动悬挂起重机(欧式)',N'REALLY-47',N'装配吊',N'LX2.8T-7M/LD2-40/OR6',N'<1.5T',N'二楼车间装配区','2024-06-29',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'多功能除渣除油一体机',N'REALLY-50',N'除渣除油机',N'FGB-4',NULL,N'一楼机加车间','2024-06-29',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'桥式悬挂起重机',N'REALLY-49',N'原料吊',N'LX2-7m/LD2-70Y/YK',N'<1.5T',N'一楼车间库房区','2024-06-29',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'切割剥皮两用机',N'REALLY-60',N'割管机',N'QB-51',NULL,N'二楼车间清洗间','2024-09-29',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'缩管机',N'REALLY-61',N'缩管机',N'KM-91C8-323',NULL,N'二楼车间清洗间','2024-09-29',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'冷冻式干燥机',N'REALLY-59',N'冷干机',N'AD2-10',NULL,N'一楼三坐标室','2024-11-25',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'工业脉冲集尘机',N'REALLY-52',N'磨床除尘机',N'FMCJC-2200',NULL,N'一楼机加车间','2024-11-25',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'闪链云智能物',N'REALLY-58',N'刀具柜',N'智能刀具柜主柜88货道+40侧边格/SCCM-03',NULL,N'一楼机加车间','2024-11-25',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'小锯床',N'REALLY-63',N'小带锯',N'DLY-18F1',N'切割范围45°φ100mm/90°180mm',N'二楼车间装配区','2024-11-25',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'车床桁架机械手',N'REALLY-51',N'数5机械手',N'CNPR-B02/CNPR-3000-B',NULL,N'一楼机加车间','2024-11-29',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'二氧焊机',N'REALLY-55',N'二氧焊机',N'YM-350FR2',NULL,N'一楼车间打磨间','2024-11-29',N'台',1,N'停用'); +INSERT INTO @导入设备 VALUES (N'弯管机',N'REALLY-62',N'弯管机',N'DW38NC',NULL,N'二楼车间装配区','2024-11-29',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'数控机床(多主轴车削中心)',N'REALLY-57',N'数9',N'DUAL TURN200/DT200',N'0.01mm',N'一楼机加车间','2024-12-10',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'外圆磨床',N'REALLY-53',N'磨1',N'M1332B/1000',N'0.005mm',N'一楼机加车间','2024-12-25',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'气动压力机',N'REALLY-64',N'压力机1',N'大双柱63型 推力200KG',NULL,N'二楼车间装配','2024-12-03',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'气动压力机',N'REALLY-65',N'压力机2',N'大双柱63型 推力200KG',NULL,N'二楼车间装配','2024-12-03',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'气动压力机',N'REALLY-66',N'压力机3',N'大双柱63型 推力200KG',NULL,N'二楼车间装配','2024-12-03',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'卡套预装机+模具四套',N'REALLY-67',N'卡套预装机',N'KC-A01',NULL,N'二楼车间装配区','2025-01-01',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'单臂移动式焊烟净化器',N'REALLY-56',N'焊烟净化器',N'LW1201L-030AF(LW-C-M1201-030A1)',N'3000m³/小时',N'一楼车间打磨间','2025-02-13',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'冷干机',N'REALLY-24(注:替换原冷干机)',N'冷干机',N'FX45-230/1/50-CN',NULL,N'一楼空压机室','2025-02-07',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'管型预绝缘端子压接机',N'REALLY-68',N'端子机1',N'MD-E(0.5-4平方)',N'压接端子范围0.5-4mm²',N'二楼装配车间','2025-08-29',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'OTUT端子压接机2#',N'REALLY-69',N'端子机2',N'MD-180S/MD-180TUT',N'截面积0.33-0.82mm²',N'二楼装配车间','2025-09-04',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'车床桁架机械手',N'REALLY-70',N'数7机械手',N'CNPR-B02/SX-621',NULL,N'一楼机加车间','2025-08-31',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'氩弧焊机',N'REALLY-71',N'氩弧焊机',N'WSE-315',N'使用焊丝规格φ1.0-3.0mm/电流范围20-315A',N'一楼焊接区','2014-06-03',N'台',1,N'停用'); +INSERT INTO @导入设备 VALUES (N'车床桁架机械手',N'REALLY-74',N'数9机械手',N'CNPR-B02/SX-620',N'0.1mm',N'一楼机加车间','2025-08-31',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'电动悬挂起重机(欧式)',N'REALLY-72',N'阀类吊',N'LX2.8T-6M',N'最大起重2.8T/链长6M',N'二楼阀类测试区','2025-12-04',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'马扎克数控车床',N'REALLY-73',N'数6',N'QTE200/500L',N'12工位刀塔/加工φ290/行程500',N'一楼机加车间','2026-01-10',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'马扎克加工中心',N'REALLY-75',N'加2',N'FF400V/30L',N'X500/Y400/Z400',N'一楼机加车间','2026-02-10',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'电动攻丝机',N'RELLY-54',N'攻丝机1#',N'M3-M20(YZ-20C)',N'夹头范围M3-M20',N'一楼机加车间','2025-12-01',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'手动液压叉车',N'REALLY-76',N'手动搬运车',N'黄色AC540 2.5T',N'最大承重2.5T',N'一楼机加车间','2025-12-11',N'辆',1,NULL); +INSERT INTO @导入设备 VALUES (N'455铜铝型材切割机(全自动)',N'REALLY-77',N'自动切割机',N'455铜铝型材切割机',N'最大切割行程100',N'一楼机加车间','2026-03-09',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'油雾收集器',N'REALLY-78',N'数5用',N'YWJC-LD300',NULL,N'一楼机加车间',NULL,N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'油雾收集器',N'REALLY-79',N'数7用',N'YWJC-LD300',NULL,N'一楼机加车间',NULL,N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'油雾收集器',N'REALLY-80',N'数8用',N'YWJC-LD300',NULL,N'一楼机加车间',NULL,N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'油雾收集器',N'REALLY-81',N'数6用',N'YWJC-LD300',NULL,N'一楼机加车间',NULL,N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'油雾收集器',N'REALLY-82',N'加2用',N'YWJC-LD1100',NULL,N'一楼机加车间',NULL,N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'油雾收集器',N'REALLY-83',N'加3用',N'YWJC-LD1100',NULL,N'一楼机加车间',NULL,N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'油雾收集器',N'REALLY-84',N'加5用',N'YWJC-LD1100',NULL,N'一楼机加车间',NULL,N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'油雾收集器',N'REALLY-85',N'卧加用',N'YWJC-LD1500',NULL,N'一楼机加车间',NULL,N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'油雾收集器',N'REALLY-86',N'数9用',N'YWJC-LD600',NULL,N'一楼机加车间',NULL,N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'无尘环保带锯床',N'REALLY-87',N'小带锯2#',N'DLY-18F1',N'45°切割范围φ100',N'一楼机打磨间','2026-05-20',N'台',1,NULL); +INSERT INTO @导入设备 VALUES (N'车床桁架机械手',N'REALLY-88',N'数6机械手',N'CNPR-B03',NULL,N'一楼机加车间',NULL,N'套',1,NULL); + +MERGE [dbo].[基础数据_设备工位点检表] AS target +USING @导入设备 AS source +ON ISNULL(target.[公司编码], N'') = ISNULL(source.[公司编码], N'') AND ISNULL(source.[公司编码], N'') <> N'' +WHEN MATCHED THEN UPDATE SET + target.[名称]=source.[名称], target.[设备名称]=source.[生产用名], target.[设备型号]=source.[型号规格], target.[设备信息]=source.[设备信息], target.[使用部门]=source.[使用部门], target.[入账日期]=source.[入账日期], target.[单位]=source.[单位], target.[数量]=source.[数量], target.[状态]=source.[状态] +WHEN NOT MATCHED BY TARGET THEN + INSERT ([名称],[公司编码],[设备名称],[设备型号],[设备信息],[使用部门],[入账日期],[单位],[数量],[状态]) + VALUES (source.[名称],source.[公司编码],source.[生产用名],source.[型号规格],source.[设备信息],source.[使用部门],source.[入账日期],source.[单位],source.[数量],source.[状态]); +GO + +SELECT COUNT(*) AS [设备信息导入后总数] FROM [dbo].[基础数据_设备工位点检表]; +GO diff --git a/db_backups/add_settlement_workhours_menu_20260627.sql b/db_backups/add_settlement_workhours_menu_20260627.sql new file mode 100644 index 0000000..2152d1b --- /dev/null +++ b/db_backups/add_settlement_workhours_menu_20260627.sql @@ -0,0 +1,43 @@ +USE [YL_MESDB] +GO + +DECLARE @NewMenuId INT; + +SELECT @NewMenuId = MAX(id) +FROM [dbo].[登录基础数据_二级菜单] +WHERE title = N'结算工时' + OR componet = '/ProductionManagement/SettlementWorkhours/index'; + +IF @NewMenuId IS NULL +BEGIN + SELECT @NewMenuId = ISNULL(MAX(id), 0) + 1 + FROM [dbo].[登录基础数据_二级菜单]; +END; + +INSERT INTO [dbo].[登录基础数据_二级菜单] + (id, pid, path, componet, redirect, name, title, icon, 账号代码, 模块代码, 是否启用, AddData, DeleteData, EditData, SearchData) +SELECT + @NewMenuId AS id, + 3 AS pid, + 'SettlementWorkhours/index' AS path, + '/ProductionManagement/SettlementWorkhours/index' AS componet, + '' AS redirect, + 'SettlementWorkhours' AS name, + N'结算工时' AS title, + ISNULL(NULLIF(w.icon, ''), 'DimensionsSummaryReport') AS icon, + w.账号代码, + w.模块代码, + ISNULL(w.是否启用, 1) AS 是否启用, + w.AddData, + w.DeleteData, + w.EditData, + w.SearchData +FROM [dbo].[登录基础数据_二级菜单] w +WHERE w.title = N'工时查询' + AND NOT EXISTS ( + SELECT 1 + FROM [dbo].[登录基础数据_二级菜单] existing + WHERE existing.title = N'结算工时' + AND existing.账号代码 = w.账号代码 + ); +GO diff --git a/db_backups/add_timely_kit_tracking_result_menu_20260629.sql b/db_backups/add_timely_kit_tracking_result_menu_20260629.sql new file mode 100644 index 0000000..3422f66 --- /dev/null +++ b/db_backups/add_timely_kit_tracking_result_menu_20260629.sql @@ -0,0 +1,85 @@ +USE [YL_MESDB] +GO + +SET NOCOUNT ON; + +DECLARE @Title nvarchar(100) = N'及时齐套跟踪结果'; +DECLARE @Path nvarchar(300) = N'TimelyKitTrackingResult/index'; +DECLARE @Component nvarchar(300) = N'/PlanManagement/TimelyKitTrackingResult/index'; +DECLARE @Name nvarchar(100) = N'TimelyKitTrackingResult'; +DECLARE @SourcePath nvarchar(300) = N'PlanShell/index'; +DECLARE @SourceComponent nvarchar(300) = N'/PlanManagement/PlanShell/index'; + +IF OBJECT_ID(N'dbo.登录基础数据_二级菜单', N'U') IS NULL +BEGIN + RAISERROR(N'未找到表 dbo.登录基础数据_二级菜单。', 16, 1); + RETURN; +END; + +DECLARE @IdIsIdentity bit = ISNULL(COLUMNPROPERTY(OBJECT_ID(N'dbo.登录基础数据_二级菜单'), N'id', 'IsIdentity'), 0); + +IF @IdIsIdentity = 1 +BEGIN + ;WITH SourceRows AS ( + SELECT + src.[账号代码], + src.[pid], + src.[icon] + FROM [dbo].[登录基础数据_二级菜单] src + WHERE src.[是否启用] = 1 + AND (src.[path] = @SourcePath OR src.[componet] = @SourceComponent OR src.[title] = N'计划用表') + AND NOT EXISTS ( + SELECT 1 + FROM [dbo].[登录基础数据_二级菜单] existing + WHERE existing.[账号代码] = src.[账号代码] + AND (existing.[path] = @Path OR existing.[componet] = @Component OR existing.[title] = @Title) + ) + ) + INSERT INTO [dbo].[登录基础数据_二级菜单] + ([pid], [path], [componet], [redirect], [name], [title], [icon], [账号代码], [是否启用]) + SELECT [pid], @Path, @Component, NULL, @Name, @Title, [icon], [账号代码], 1 + FROM SourceRows; +END +ELSE +BEGIN + ;WITH SourceRows AS ( + SELECT + ROW_NUMBER() OVER (ORDER BY src.[账号代码], src.[id]) AS rn, + src.[账号代码], + src.[pid], + src.[icon] + FROM [dbo].[登录基础数据_二级菜单] src + WHERE src.[是否启用] = 1 + AND (src.[path] = @SourcePath OR src.[componet] = @SourceComponent OR src.[title] = N'计划用表') + AND NOT EXISTS ( + SELECT 1 + FROM [dbo].[登录基础数据_二级菜单] existing + WHERE existing.[账号代码] = src.[账号代码] + AND (existing.[path] = @Path OR existing.[componet] = @Component OR existing.[title] = @Title) + ) + ), + BaseId AS ( + SELECT ISNULL(MAX([id]), 0) AS maxId + FROM [dbo].[登录基础数据_二级菜单] + ) + INSERT INTO [dbo].[登录基础数据_二级菜单] + ([id], [pid], [path], [componet], [redirect], [name], [title], [icon], [账号代码], [是否启用]) + SELECT BaseId.maxId + SourceRows.rn, SourceRows.[pid], @Path, @Component, NULL, @Name, @Title, SourceRows.[icon], SourceRows.[账号代码], 1 + FROM SourceRows + CROSS JOIN BaseId; +END; + +UPDATE [dbo].[登录基础数据_二级菜单] +SET + [path] = @Path, + [componet] = @Component, + [name] = @Name, + [title] = @Title, + [模块代码] = [id], + [是否启用] = 1 +WHERE [title] = @Title OR [componet] = @Component; + +SELECT [id], [pid], [path], [componet], [name], [title], [icon], [账号代码], [是否启用] +FROM [dbo].[登录基础数据_二级菜单] +WHERE [path] = @Path OR [componet] = @Component OR [title] = @Title +ORDER BY [账号代码], [id]; diff --git a/db_backups/create_settlement_workhours_query_20260627.sql b/db_backups/create_settlement_workhours_query_20260627.sql new file mode 100644 index 0000000..9cc86a1 --- /dev/null +++ b/db_backups/create_settlement_workhours_query_20260627.sql @@ -0,0 +1,231 @@ +USE [YL_MESDB] +GO + +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO + +IF OBJECT_ID(N'[dbo].[生产管理_结算工时_查询]', N'P') IS NULL + EXEC(N'CREATE PROCEDURE [dbo].[生产管理_结算工时_查询] AS BEGIN SET NOCOUNT ON; END') +GO + +ALTER PROCEDURE [dbo].[生产管理_结算工时_查询] + @合同号 NVARCHAR(50) = NULL, + @产品编码 NVARCHAR(100) = NULL, + @订单号 NVARCHAR(50) = NULL, + @工位 NVARCHAR(50) = NULL, + @开始日期 DATE = NULL, + @结束日期 DATE = NULL, + @数据条数 INT = 100 +AS +BEGIN + SET NOCOUNT ON; + + ;WITH 结算任务 AS ( + SELECT + AID, + 订单编号, + 物料编号, + 物料描述 + FROM [dbo].[MES_接口_生产计划] + WHERE 单据状态 IS NULL + ), + 基础数据 AS ( + SELECT TOP (CASE WHEN ISNULL(@数据条数, 0) <= 0 THEN 100 ELSE @数据条数 END) + v.TaskAID, + v.开始时间, + v.操作内容, + v.操作类别, + v.操作人, + v.加工工时, + v.操作数值, + v.订单合同号, + v.订单号, + v.订单行号, + v.产品编码, + v.产品名称, + v.工序名称, + v.工位名称, + p.物料编号, + p.物料描述 + FROM [dbo].[View_生产工时视图] v + INNER JOIN 结算任务 p ON p.AID = v.TaskAID + WHERE (@开始日期 IS NULL OR @开始日期 = '' OR v.开始时间 >= @开始日期) + AND (@结束日期 IS NULL OR @结束日期 = '' OR v.开始时间 < DATEADD(DAY, 1, @结束日期)) + AND (@合同号 IS NULL OR @合同号 = '' OR v.订单合同号 LIKE '%' + @合同号 + '%') + AND (@产品编码 IS NULL OR @产品编码 = '' OR v.产品编码 LIKE '%' + @产品编码 + '%') + AND (@订单号 IS NULL OR @订单号 = '' OR v.订单号 = @订单号) + AND (@工位 IS NULL OR @工位 = '' OR v.工位名称 LIKE '%' + @工位 + '%') + AND ISNULL(v.加工工时, 0) > 0 + AND (ISNULL(v.操作内容, '') IN ('报工', '辅助结束') OR ISNULL(v.操作类别, '') IN ('报工', '辅助结束')) + ORDER BY v.开始时间 DESC + ), + 明细键 AS ( + SELECT DISTINCT + TaskAID, + CONVERT(VARCHAR(19), 开始时间, 120) AS 开始时间 + FROM 基础数据 + ), + 操作人明细 AS ( + SELECT + k.TaskAID, + k.开始时间, + LTRIM(RTRIM(s.value)) AS 操作人 + FROM 明细键 k + INNER JOIN [dbo].[View_生产工时视图全部] v2 + ON v2.TaskAID = k.TaskAID + AND v2.开始时间 >= CONVERT(DATETIME, k.开始时间, 120) + AND v2.开始时间 < DATEADD(SECOND, 1, CONVERT(DATETIME, k.开始时间, 120)) + CROSS APPLY STRING_SPLIT(REPLACE(REPLACE(ISNULL(v2.操作人, ''), N',', ','), N'、', ','), ',') s + WHERE ISNULL(v2.加工工时, 0) <= 0 + AND NULLIF(LTRIM(RTRIM(s.value)), '') IS NOT NULL + ), + 操作人拼接 AS ( + SELECT + TaskAID, + 开始时间, + STRING_AGG(操作人, ',') AS 操作人 + FROM ( + SELECT DISTINCT TaskAID, 开始时间, 操作人 + FROM 操作人明细 + ) x + GROUP BY TaskAID, 开始时间 + ), + 结算明细 AS ( + SELECT + ISNULL(b.物料编号, b.产品编码) AS 物料编号, + ISNULL(b.物料描述, b.产品名称) AS 物料描述, + b.订单号, + b.工位名称, + b.TaskAID, + b.工序名称, + b.订单行号, + ISNULL(o.操作人, '') AS 操作人, + CASE + WHEN ISNULL(b.操作内容, '') LIKE '%辅助%' OR ISNULL(b.操作类别, '') LIKE '%辅助%' THEN '辅助结束' + ELSE '报工' + END AS 操作类型, + CAST(ISNULL(b.加工工时, 0) / 60.0 / 60.0 AS DECIMAL(18, 4)) AS 工时小时, + ISNULL(b.操作数值, 0) AS 完成数 + FROM 基础数据 b + LEFT JOIN 操作人拼接 o + ON o.TaskAID = b.TaskAID + AND o.开始时间 = CONVERT(VARCHAR(19), b.开始时间, 120) + ), + 订单工位汇总基础 AS ( + SELECT + 物料编号, + 物料描述, + 订单号, + 工位名称, + MAX(工序名称) AS 工序名称, + MAX(订单行号) AS 工序顺序, + COUNT(*) AS 记录数, + SUM(CASE WHEN 操作类型 = '报工' THEN 工时小时 ELSE 0 END) AS 报工工时, + SUM(CASE WHEN 操作类型 = '辅助结束' THEN 工时小时 ELSE 0 END) AS 主辅工时, + SUM(CASE WHEN 操作类型 = '报工' THEN 完成数 ELSE 0 END) AS 报工完成数, + SUM(CASE WHEN 操作类型 = '辅助结束' THEN 完成数 ELSE 0 END) AS 辅助完成数, + SUM(工时小时) AS 合计工时 + FROM 结算明细 j + GROUP BY 物料编号, 物料描述, 订单号, 工位名称 + ), + 订单工位操作人 AS ( + SELECT + 物料编号, + 订单号, + ISNULL(工位名称, '') AS 工位名称, + STRING_AGG(操作人, ',') AS 操作人 + FROM ( + SELECT DISTINCT + j.物料编号, + j.订单号, + ISNULL(j.工位名称, '') AS 工位名称, + LTRIM(RTRIM(s.value)) AS 操作人 + FROM 结算明细 j + CROSS APPLY STRING_SPLIT(REPLACE(REPLACE(ISNULL(j.操作人, ''), N',', ','), N'、', ','), ',') s + WHERE NULLIF(LTRIM(RTRIM(s.value)), '') IS NOT NULL + ) x + GROUP BY 物料编号, 订单号, ISNULL(工位名称, '') + ), + 订单工位汇总 AS ( + SELECT + b.物料编号, + b.物料描述, + b.订单号, + b.工位名称, + b.工序名称, + b.工序顺序, + b.记录数, + b.报工工时, + b.主辅工时, + b.报工完成数, + b.辅助完成数, + b.合计工时, + ISNULL(o.操作人, '') AS 操作人 + FROM 订单工位汇总基础 b + LEFT JOIN 订单工位操作人 o + ON o.物料编号 = b.物料编号 + AND o.订单号 = b.订单号 + AND o.工位名称 = ISNULL(b.工位名称, '') + ), + 物料汇总 AS ( + SELECT + 物料编号, + 物料描述, + SUM(记录数) AS 记录数, + SUM(报工工时) AS 报工工时, + SUM(主辅工时) AS 主辅工时, + SUM(报工完成数) AS 报工完成数, + SUM(辅助完成数) AS 辅助完成数, + SUM(合计工时) AS 合计工时 + FROM 订单工位汇总 + GROUP BY 物料编号, 物料描述 + ) + SELECT + 1 AS [Level], + 物料编号 AS materialCode, + 物料描述 AS materialDesc, + ISNULL(物料描述, '') + ' ' + ISNULL(物料编号, '') AS taskDescription, + '' AS productionOrderNo, + '' AS station, + CAST(报工工时 AS VARCHAR(20)) AS reportWorkHours, + CAST(主辅工时 AS VARCHAR(20)) AS auxiliaryWorkHours, + CAST(报工完成数 AS VARCHAR(20)) AS reportFinishQty, + CAST(辅助完成数 AS VARCHAR(20)) AS auxiliaryFinishQty, + CAST(合计工时 AS VARCHAR(20)) AS totalWorkHours, + CAST(CASE WHEN 报工完成数 > 0 THEN (报工工时 - 0 * 报工完成数) / 报工完成数 ELSE 0 END AS VARCHAR(20)) AS clampingTime, + CAST(0 AS VARCHAR(20)) AS programTime, + CAST(CASE WHEN 报工完成数 > 0 THEN 报工工时 / 报工完成数 ELSE 0 END AS VARCHAR(20)) AS settlementReportPieceHours, + CAST(CASE WHEN 辅助完成数 > 0 THEN 主辅工时 / 辅助完成数 ELSE 0 END AS VARCHAR(20)) AS settlementAuxiliaryPieceHours, + '' AS operatorNames, + CAST(记录数 AS VARCHAR(20)) AS recordCount + FROM 物料汇总 + + UNION ALL + + SELECT + 2 AS [Level], + 物料编号 AS materialCode, + 物料描述 AS materialDesc, + ISNULL(物料描述, '') + ' ' + ISNULL(物料编号, '') + + CASE WHEN NULLIF(ISNULL(工序名称, ''), '') IS NULL THEN '' ELSE ' ' + 工序名称 END + + CASE WHEN 工序顺序 IS NULL THEN '' ELSE ' 序' + CAST(工序顺序 AS VARCHAR(20)) END AS taskDescription, + ISNULL(订单号, '') AS productionOrderNo, + ISNULL(工位名称, '') AS station, + CAST(报工工时 AS VARCHAR(20)) AS reportWorkHours, + CAST(主辅工时 AS VARCHAR(20)) AS auxiliaryWorkHours, + CAST(报工完成数 AS VARCHAR(20)) AS reportFinishQty, + CAST(辅助完成数 AS VARCHAR(20)) AS auxiliaryFinishQty, + CAST(合计工时 AS VARCHAR(20)) AS totalWorkHours, + CAST(CASE WHEN 报工完成数 > 0 THEN (报工工时 - 0 * 报工完成数) / 报工完成数 ELSE 0 END AS VARCHAR(20)) AS clampingTime, + CAST(0 AS VARCHAR(20)) AS programTime, + CAST(CASE WHEN 报工完成数 > 0 THEN 报工工时 / 报工完成数 ELSE 0 END AS VARCHAR(20)) AS settlementReportPieceHours, + CAST(CASE WHEN 辅助完成数 > 0 THEN 主辅工时 / 辅助完成数 ELSE 0 END AS VARCHAR(20)) AS settlementAuxiliaryPieceHours, + ISNULL(操作人, '') AS operatorNames, + CAST(记录数 AS VARCHAR(20)) AS recordCount + FROM 订单工位汇总 + + ORDER BY materialCode, [Level], productionOrderNo, station +END +GO diff --git a/db_backups/create_timely_kit_tracking_result_20260629.sql b/db_backups/create_timely_kit_tracking_result_20260629.sql new file mode 100644 index 0000000..066949f --- /dev/null +++ b/db_backups/create_timely_kit_tracking_result_20260629.sql @@ -0,0 +1,410 @@ +USE [YL_MESDB] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +IF OBJECT_ID(N'dbo.生产管理_及时齐套跟踪结果_查询', N'P') IS NULL +BEGIN + EXEC(N'CREATE PROCEDURE [dbo].[生产管理_及时齐套跟踪结果_查询] AS BEGIN SET NOCOUNT ON; END'); +END +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +ALTER PROCEDURE [dbo].[生产管理_及时齐套跟踪结果_查询] + @订单号 int = 0, + @物料类型 nvarchar(50) = N'', + @合同号 nvarchar(50) = N'', + @产品编码 nvarchar(50) = N'', + @产品名称 nvarchar(50) = N'', + @工序名称 nvarchar(50) = N'', + @计划开始 nvarchar(50) = N'', + @计划完成 nvarchar(50) = N'', + @排产状态 nvarchar(50) = N'全部', + @指派对象 nvarchar(50) = N'全部', + @计划号 nvarchar(50) = N'', + @发货状态 nvarchar(50) = N'全部', + @齐套 nvarchar(50) = N'全部', + @检验状态 nvarchar(50) = N'', + @发料状态 nvarchar(50) = N'全部', + @自制件属性 nvarchar(50) = N'全部' +AS +BEGIN + SET NOCOUNT ON; + + ;WITH SAP缺件源 AS ( + SELECT + s.DocEntry, + s.Project COLLATE DATABASE_DEFAULT AS Project, + s.[行号], + s.ItemCode COLLATE DATABASE_DEFAULT AS ItemCode, + s.U_Name COLLATE DATABASE_DEFAULT AS U_Name, + ISNULL(s.[属性] COLLATE DATABASE_DEFAULT, N'') AS 属性, + ISNULL(s.[未发货数量], 0) AS 未发货数量, + ISNULL(s.[在制采购], 0) AS 在制采购, + s.[采购员] COLLATE DATABASE_DEFAULT AS 采购员, + s.[采购预计交货日期], + ISNULL(s.[采购未清数量], 0) AS 采购未清数量, + ISNULL(s.[到货草稿], 0) AS 到货草稿 + FROM [SAP].[SBO_YL].[dbo].[VIEW_Jijiankukc] AS s + WHERE ISNULL(s.[未发货数量], 0) > 0 + ), + SAP缺件 AS ( + SELECT TOP (2000) + src.* + FROM ( + SELECT + SAP缺件源.*, + ROW_NUMBER() OVER ( + PARTITION BY + SAP缺件源.DocEntry, + SAP缺件源.Project, + SAP缺件源.ItemCode, + SAP缺件源.属性 + ORDER BY + SAP缺件源.[未发货数量] DESC, + SAP缺件源.[行号] + ) AS rn + FROM SAP缺件源 + ) AS src + WHERE src.rn = 1 + ), + 查询结果 AS ( + SELECT + ISNULL(v.[计划号], N'') AS [计划号], + ISNULL(v.[合同号], N'') AS [合同号], + v.[订单编号] AS [订单号], + v.[物料编号] AS [产品编码], + v.[物料描述] AS [产品名称], + v.[计划数量订单], + v.[入库数量], + v.[计划完成] AS [要求完工日期], + v.[要求发货日期], + CASE + WHEN ISNULL(v.[发货状态], 0) = 1 THEN N'已发货' + ELSE N'未发货' + END AS [发货状态], + CASE + WHEN ISNULL(v.[齐套], 0) = 1 THEN N'是' + ELSE N'否' + END AS [齐套], + CASE + WHEN ISNULL(v.[拣配状态], 0) = 1 THEN N'已拣配' + ELSE N'未拣配' + END AS [拣配状态], + CASE + WHEN ISNULL(v.[发料状态], N'') = N'1' THEN N'发料齐套' + WHEN ISNULL(v.[发料状态], N'') = N'2' THEN N'发料缺件' + ELSE N'未发料' + END AS [发料状态], + CASE + WHEN ISNULL(v.[任务状态], 0) IN (2, 4) OR v.[开工时间] > '1900-01-01' THEN N'已开工' + ELSE N'待执行' + END AS [装配开工], + v.[完成数量], + CASE + WHEN final_check.[计划号] IS NOT NULL THEN N'是' + ELSE N'否' + END AS [终检], + CASE WHEN ISNULL(v.[生产工艺], 0) = 1 THEN N'是' ELSE N'否' END AS [生产工艺], + CASE WHEN ISNULL(v.[排产状态], 0) = 1 THEN N'已排产' ELSE N'未排产' END AS [排产状态], + ISNULL(v.[自制件属性], N'') AS [自制件属性], + v.[计划开始时间] AS [预计齐套时间], + sap.ItemCode AS [缺件物料编码], + sap.U_Name AS [缺件物料名称], + sap.[未发货数量] AS [缺件数量], + CASE WHEN sap.[属性] = N'' THEN N'外购' ELSE sap.[属性] END AS [缺件属性], + CASE + WHEN sap.[属性] = N'' THEN ISNULL(CONVERT(nvarchar(50), NULLIF(sap.[到货草稿], 0)), N'') + ELSE ISNULL(CONVERT(nvarchar(50), detail_order.[订单编号]), N'') + END AS [缺件生产订单号], + CASE WHEN sap.[属性] = N'' THEN N'' ELSE ISNULL(current_step.[当前序], N'') END AS [进度], + CASE + WHEN sap.[属性] = N'' THEN + N'采购员:' + ISNULL(NULLIF(sap.[采购员], N''), N'-') + + N' / 未清数量:' + CONVERT(nvarchar(30), sap.[采购未清数量]) + + N' / 到货草稿:' + CONVERT(nvarchar(30), sap.[到货草稿]) + + N' / 质检状态:' + ISNULL(purchase_check.[质检状态], N'未完成') + ELSE ISNULL(route.[工艺路线], N'') + END AS [工艺路线], + CASE + WHEN sap.[属性] = N'' THEN sap.[采购预计交货日期] + ELSE route.[预计完成时间] + END AS [预计完成时间], + CASE WHEN sap.[属性] = N'' THEN N'' ELSE ISNULL(route.[工艺路线明细], N'[]') END AS [工艺路线明细], + sap.[采购员], + sap.[采购未清数量], + sap.[到货草稿], + ISNULL(purchase_check.[质检状态], CASE WHEN sap.[属性] = N'' THEN N'未完成' ELSE N'' END) AS [质检状态], + sap.DocEntry AS [SAP单据], + sap.[行号] AS [SAP行号] + FROM SAP缺件 AS sap + OUTER APPLY ( + SELECT TOP (1) m.* + FROM [dbo].[View_生产订单_MES] AS m + WHERE m.[物料类型] = N'pit_Resource' + AND ISNULL(m.[排产状态], 0) = 1 + AND m.[订单编号] = sap.DocEntry + ORDER BY m.[订单行号] + ) AS v + OUTER APPLY ( + SELECT TOP (1) m.* + FROM [dbo].[View_生产订单_MES] AS m + WHERE m.[物料类型] = N'pit_Resource' + AND ISNULL(m.[排产状态], 0) = 1 + AND m.[订单编号] <> v.[订单编号] + AND ( + (sap.[属性] = N'机加件' AND m.[物料编号] = sap.ItemCode) + OR (sap.[属性] LIKE N'%装配%' AND m.[物料编号] = sap.ItemCode AND ISNULL(m.[合同号], N'') = ISNULL(sap.Project, N'')) + ) + ORDER BY m.[订单编号] DESC, m.[订单行号] + ) AS detail_order + OUTER APPLY ( + SELECT TOP (1) q.[计划号] + FROM [dbo].[YL_质量检验_质检记录] AS q + WHERE q.[质检类型] = N'终检' + AND q.[计划号] = v.[订单编号] + ) AS final_check + OUTER APPLY ( + SELECT + MAX(p.[计划完成时间]) AS [预计完成时间], + STUFF(( + SELECT N'、' + p2.[工序名称] + + CASE WHEN ISNULL(p2.[指派对象], N'') = N'' THEN N'' ELSE N'(' + p2.[指派对象] + N')' END + FROM [dbo].[View_生产订单_MES] AS p2 + WHERE p2.[订单编号] = detail_order.[订单编号] + AND p2.[物料类型] = N'pit_Resource' + ORDER BY p2.[订单行号] + FOR XML PATH(N''), TYPE + ).value(N'.', N'nvarchar(max)'), 1, 1, N'') AS [工艺路线], + ( + SELECT + p2.[订单行号], + p2.[工序名称], + p2.[指派对象], + p2.[计划开始时间], + p2.[计划完成时间], + ISNULL(p2.[进度], 0) AS [进度], + ISNULL(p2.[完成数量], 0) AS [完成数量], + ISNULL(p2.[收料数量], 0) AS [收料数量], + ISNULL(p2.[加工状态], 0) AS [加工状态], + p2.[开工时间], + ISNULL(check_qty.[收检合格数], 0) AS [收检合格数], + ISNULL(check_qty.[收检不合格数], 0) AS [收检不合格数] + FROM [dbo].[View_生产订单_MES] AS p2 + OUTER APPLY ( + SELECT + SUM(ISNULL(q.[合格数], 0)) AS [收检合格数], + SUM(ISNULL(q.[不合格数], 0)) AS [收检不合格数] + FROM [dbo].[YL_质量检验_质检记录] AS q + WHERE q.[TaskAID] = p2.[TaskAID] + AND q.[质检类型] = N'收检' + ) AS check_qty + WHERE p2.[订单编号] = detail_order.[订单编号] + AND p2.[物料类型] = N'pit_Resource' + ORDER BY p2.[订单行号] + FOR JSON PATH + ) AS [工艺路线明细] + FROM [dbo].[View_生产订单_MES] AS p + WHERE p.[订单编号] = detail_order.[订单编号] + AND p.[物料类型] = N'pit_Resource' + ) AS route + OUTER APPLY ( + SELECT TOP (1) + pending.[订单行号], + pending.[工序名称], + pending.[加工状态], + pending.[进度], + pending.[完成数量], + pending.[计划数量], + pending.[开工时间] + FROM [dbo].[View_生产订单_MES] AS pending + WHERE pending.[订单编号] = detail_order.[订单编号] + AND pending.[物料类型] = N'pit_Resource' + AND NOT ( + ISNULL(pending.[进度], 0) >= 100 + OR (ISNULL(pending.[计划数量], 0) > 0 AND ISNULL(pending.[完成数量], 0) >= ISNULL(pending.[计划数量], 0)) + ) + ORDER BY pending.[订单行号] + ) AS pending + OUTER APPLY ( + SELECT TOP (1) prev.[工序名称] + FROM [dbo].[View_生产订单_MES] AS prev + WHERE prev.[订单编号] = detail_order.[订单编号] + AND prev.[物料类型] = N'pit_Resource' + AND prev.[订单行号] < pending.[订单行号] + ORDER BY prev.[订单行号] DESC + ) AS prev_step + OUTER APPLY ( + SELECT TOP (1) last_step.[工序名称] + FROM [dbo].[View_生产订单_MES] AS last_step + WHERE last_step.[订单编号] = detail_order.[订单编号] + AND last_step.[物料类型] = N'pit_Resource' + ORDER BY last_step.[订单行号] DESC + ) AS last_step + OUTER APPLY ( + SELECT + CASE + WHEN detail_order.[订单编号] IS NULL THEN N'' + WHEN pending.[订单行号] IS NULL THEN ISNULL(last_step.[工序名称], N'') + N'毕' + WHEN ISNULL(pending.[进度], 0) > 0 + OR ISNULL(pending.[完成数量], 0) > 0 + OR ISNULL(pending.[加工状态], 0) IN (2, 3, 4, 5, 6) + OR pending.[开工时间] > '1900-01-01' + THEN ISNULL(pending.[工序名称], N'') + N'中' + WHEN prev_step.[工序名称] IS NULL THEN N'' + ELSE prev_step.[工序名称] + N'毕待' + ISNULL(pending.[工序名称], N'') + END AS [当前序] + ) AS current_step + OUTER APPLY ( + SELECT + CASE + WHEN sap.[属性] <> N'' THEN N'' + WHEN EXISTS ( + SELECT 1 + FROM [dbo].[质量检验_质检任务_SAP] AS task + OUTER APPLY ( + SELECT SUM(ISNULL(q.[检验数量], 0)) AS [已检验数量] + FROM [dbo].[YL_质量检验_质检记录] AS q + WHERE q.[检测类型编号] = 5 + AND q.[计划号] = task.[订单编号] + AND q.[行号] = task.[行号] + AND q.[订单类型] = task.[订单类型] + ) AS checked_qty + WHERE sap.[到货草稿] > 0 + AND task.[订单类型] = N'20' + AND task.[订单编号] = sap.[到货草稿] + AND ISNULL(task.[入库数量], 0) > 0 + ) + AND NOT EXISTS ( + SELECT 1 + FROM [dbo].[质量检验_质检任务_SAP] AS task + OUTER APPLY ( + SELECT SUM(ISNULL(q.[检验数量], 0)) AS [已检验数量] + FROM [dbo].[YL_质量检验_质检记录] AS q + WHERE q.[检测类型编号] = 5 + AND q.[计划号] = task.[订单编号] + AND q.[行号] = task.[行号] + AND q.[订单类型] = task.[订单类型] + ) AS checked_qty + WHERE sap.[到货草稿] > 0 + AND task.[订单类型] = N'20' + AND task.[订单编号] = sap.[到货草稿] + AND ( + ISNULL(task.[入库数量], 0) <= 0 + OR ISNULL(checked_qty.[已检验数量], 0) < ISNULL(task.[入库数量], 0) + ) + ) THEN N'已完成' + ELSE N'未完成' + END AS [质检状态] + ) AS purchase_check + WHERE + v.[订单编号] IS NOT NULL + AND (@订单号 <= 0 OR v.[订单编号] = @订单号) + AND (@计划号 = N'' OR ISNULL(v.[计划号], N'') = @计划号) + AND (@合同号 = N'' OR ISNULL(v.[合同号], N'') LIKE N'%' + @合同号 + N'%') + AND (@产品编码 = N'' OR ISNULL(v.[物料编号], N'') LIKE N'%' + @产品编码 + N'%') + AND (@产品名称 = N'' OR ISNULL(v.[物料描述], N'') LIKE N'%' + @产品名称 + N'%') + AND (@工序名称 = N'' OR EXISTS ( + SELECT 1 + FROM [dbo].[View_生产订单_MES] AS fp + WHERE fp.[订单编号] = v.[订单编号] + AND fp.[工序名称] = @工序名称 + )) + AND (@计划开始 = N'' OR v.[计划开始时间] >= TRY_CONVERT(datetime, @计划开始)) + AND (@计划完成 = N'' OR v.[计划开始时间] <= TRY_CONVERT(datetime, @计划完成)) + AND (@排产状态 = N'全部' OR @排产状态 = N'' OR + (@排产状态 = N'已完成' AND ISNULL(v.[排产状态], 0) = 1) OR + (@排产状态 = N'未完成' AND ISNULL(v.[排产状态], 0) = 0) + ) + AND (@指派对象 = N'全部' OR @指派对象 = N'' OR EXISTS ( + SELECT 1 + FROM [dbo].[View_生产订单_MES] AS ap + WHERE ap.[订单编号] = v.[订单编号] + AND ap.[指派对象] IN (SELECT LTRIM(RTRIM(value)) FROM STRING_SPLIT(@指派对象, N',')) + )) + AND (@发货状态 = N'全部' OR @发货状态 = N'' OR + (@发货状态 = N'已发货' AND ISNULL(v.[发货状态], N'0') = N'1') OR + (@发货状态 = N'未发货' AND ISNULL(v.[发货状态], N'0') <> N'1') + ) + AND (@齐套 = N'全部' OR @齐套 = N'' OR + (@齐套 = N'是' AND ISNULL(v.[齐套], 0) = 1) OR + (@齐套 = N'否' AND ISNULL(v.[齐套], 0) <> 1) + ) + AND (@发料状态 = N'全部' OR @发料状态 = N'' OR + (@发料状态 = N'发料齐套' AND ISNULL(v.[发料状态], N'0') = N'1') OR + (@发料状态 = N'发料缺件' AND ISNULL(v.[发料状态], N'0') = N'2') OR + (@发料状态 = N'未发料' AND ISNULL(v.[发料状态], N'0') NOT IN (N'1', N'2')) + ) + AND (@自制件属性 = N'全部' OR @自制件属性 = N'' OR + (@自制件属性 = N'机加' AND (sap.[属性] = N'机加件' OR v.[自制件属性] = N'机加件')) OR + (@自制件属性 = N'装配' AND (sap.[属性] LIKE N'%装配%' OR v.[自制件属性] LIKE N'%装配%')) + ) + AND (@检验状态 = N'' OR (sap.[属性] = N'' AND ISNULL(purchase_check.[质检状态], N'') = @检验状态)) + ) + SELECT TOP (1000) + [计划号], + [合同号], + [订单号], + [产品编码], + [产品名称], + [计划数量订单], + [入库数量], + [要求完工日期], + [要求发货日期], + [发货状态], + [齐套], + [拣配状态], + [发料状态], + [装配开工], + [完成数量], + [终检], + [生产工艺], + [排产状态], + [自制件属性], + [预计齐套时间], + [缺件物料编码], + [缺件物料名称], + [缺件数量], + [缺件属性], + [缺件生产订单号], + [进度], + [工艺路线], + [预计完成时间], + [工艺路线明细], + [采购员], + [采购未清数量], + [到货草稿], + [质检状态], + [SAP单据], + [SAP行号] + FROM ( + SELECT + 查询结果.*, + ROW_NUMBER() OVER ( + PARTITION BY + [订单号], + CASE + WHEN ISNULL([缺件生产订单号], N'') <> N'' THEN [缺件生产订单号] + ELSE [缺件物料编码] + N':' + CONVERT(nvarchar(30), [SAP行号]) + END + ORDER BY [缺件数量] DESC, [SAP单据], [SAP行号] + ) AS rn + FROM 查询结果 + ) AS dedup + WHERE rn = 1 + ORDER BY + [预计齐套时间], + [订单号], + [缺件生产订单号], + [缺件物料编码]; +END +GO diff --git a/db_backups/fix_device_add_company_code_message_20260629.sql b/db_backups/fix_device_add_company_code_message_20260629.sql new file mode 100644 index 0000000..76000b7 --- /dev/null +++ b/db_backups/fix_device_add_company_code_message_20260629.sql @@ -0,0 +1,76 @@ +USE [YL_MESDB] +GO + +ALTER PROCEDURE [dbo].[设备管理_设备信息_增加] + @名称 nvarchar(50) = NULL, + @公司编码 nvarchar(100) = NULL, + @设备名称 nvarchar(50) = NULL, + @设备型号 nvarchar(50) = NULL, + @设备类型 nvarchar(50) = NULL, + @设备信息 nvarchar(500) = NULL, + @使用部门 nvarchar(100) = NULL, + @入账日期 nvarchar(50) = NULL, + @单位 nvarchar(50) = NULL, + @数量 decimal(18, 4) = NULL, + @状态 nvarchar(50) = NULL, + @维修记录 nvarchar(1000) = NULL, + @维保记录 nvarchar(1000) = NULL, + @工位绑定 nvarchar(1000) = NULL, + @主要设备 nvarchar(10) = NULL, + @设备标准开机工时 decimal(18, 4) = NULL, + @特种设备 nvarchar(10) = NULL, + @证书有效期至 nvarchar(50) = NULL +AS +BEGIN + SET NOCOUNT ON; + + IF ISNULL(@公司编码, N'') = N'' + BEGIN + SELECT '0' AS result, N'公司编码不能为空' AS message; + RETURN; + END + + INSERT INTO [dbo].[基础数据_设备工位点检表] ( + [名称], + [公司编码], + [设备名称], + [设备型号], + [设备类型], + [设备信息], + [使用部门], + [入账日期], + [单位], + [数量], + [状态], + [维修记录], + [维保记录], + [工位绑定], + [主要设备], + [设备标准开机工时], + [特种设备], + [证书有效期至] + ) + VALUES ( + @名称, + @公司编码, + @设备名称, + @设备型号, + @设备类型, + @设备信息, + @使用部门, + TRY_CONVERT(date, NULLIF(@入账日期, N'')), + @单位, + @数量, + @状态, + @维修记录, + @维保记录, + @工位绑定, + @主要设备, + @设备标准开机工时, + @特种设备, + TRY_CONVERT(date, NULLIF(@证书有效期至, N'')) + ); + + SELECT '1' AS result; +END +GO diff --git a/db_backups/fix_device_excel_import_dates_20260629.sql b/db_backups/fix_device_excel_import_dates_20260629.sql new file mode 100644 index 0000000..74499bd --- /dev/null +++ b/db_backups/fix_device_excel_import_dates_20260629.sql @@ -0,0 +1,96 @@ +USE [YL_MESDB] +GO +DECLARE @导入设备日期 TABLE ([公司编码] nvarchar(100), [入账日期] date); +INSERT INTO @导入设备日期 VALUES (N'REALLY-11', '2007-01-01'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-21', '2007-01-02'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-6', '2008-12-24'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-1', '2011-01-01'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-19', '2011-01-01'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-3', '2011-09-30'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-8', '2012-03-30'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-2', '2014-01-01'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-14', '2014-06-06'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-4', '2015-03-18'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-16', '2015-04-13'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-44', '2015-05-18'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-13', '2016-02-02'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-5', '2018-05-12'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-10', '2018-08-27'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-33', '2020-04-16'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-23', '2020-06-30'); +INSERT INTO @导入设备日期 VALUES (N'已报废', '2020-06-30'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-25', '2020-11-06'); +INSERT INTO @导入设备日期 VALUES (N'加1#用', '2020-12-11'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-26', '2020-12-11'); +INSERT INTO @导入设备日期 VALUES (N'加3#用', '2020-12-11'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-31', '2021-02-02'); +INSERT INTO @导入设备日期 VALUES (N'RELLY-29', '2021-03-01'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-28', '2021-03-04'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-27', '2021-03-12'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-30', '2021-03-18'); +INSERT INTO @导入设备日期 VALUES (N'起重机/吊车', '2021-04-06'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-34', '2021-04-06'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-32', '2021-09-03'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-36', '2022-04-04'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-37', '2022-04-04'); +INSERT INTO @导入设备日期 VALUES (N'RELLY-38', '2022-04-30'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-39', '2022-06-23'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-40', '2022-12-10'); +INSERT INTO @导入设备日期 VALUES (N'加5#用', '2022-12-23'); +INSERT INTO @导入设备日期 VALUES (N'数7#数#8用', '2023-02-07'); +INSERT INTO @导入设备日期 VALUES (N'数7#数#8用', '2023-02-15'); +INSERT INTO @导入设备日期 VALUES (N'RELLY-41', '2023-03-13'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-17', '2023-04-23'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-42', '2023-08-07'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-43', '2023-08-15'); +INSERT INTO @导入设备日期 VALUES (N'普3#用', '2023-08-17'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-45', '2023-11-28'); +INSERT INTO @导入设备日期 VALUES (N'数7#数#8用', '2023-12-04'); +INSERT INTO @导入设备日期 VALUES (N'机器人用', '2024-01-29'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-46', '2024-06-30'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-47', '2024-06-30'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-50', '2024-06-30'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-49', '2024-06-30'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-60', '2024-09-30'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-61', '2024-09-30'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-59', '2024-11-26'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-52', '2024-11-26'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-58', '2024-11-26'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-63', '2024-11-26'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-51', '2024-11-30'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-55', '2024-11-30'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-62', '2024-11-30'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-57', '2024-12-11'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-53', '2024-12-26'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-64', '2024-12-04'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-65', '2024-12-04'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-66', '2024-12-04'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-67', '2025-01-02'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-56', '2025-02-14'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-24(注:替换原冷干机)', '2025-02-08'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-68', '2025-08-30'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-69', '2025-09-05'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-70', '2025-09-01'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-71', '2014-06-04'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-74', '2025-09-01'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-72', '2025-12-04'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-73', '2026-01-10'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-75', '2026-02-10'); +INSERT INTO @导入设备日期 VALUES (N'RELLY-54', '2025-12-01'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-76', '2025-12-11'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-77', '2026-03-09'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-78', NULL); +INSERT INTO @导入设备日期 VALUES (N'REALLY-79', NULL); +INSERT INTO @导入设备日期 VALUES (N'REALLY-80', NULL); +INSERT INTO @导入设备日期 VALUES (N'REALLY-81', NULL); +INSERT INTO @导入设备日期 VALUES (N'REALLY-82', NULL); +INSERT INTO @导入设备日期 VALUES (N'REALLY-83', NULL); +INSERT INTO @导入设备日期 VALUES (N'REALLY-84', NULL); +INSERT INTO @导入设备日期 VALUES (N'REALLY-85', NULL); +INSERT INTO @导入设备日期 VALUES (N'REALLY-86', NULL); +INSERT INTO @导入设备日期 VALUES (N'REALLY-87', '2026-05-20'); +INSERT INTO @导入设备日期 VALUES (N'REALLY-88', NULL); +UPDATE target SET target.[入账日期] = source.[入账日期] +FROM [dbo].[基础数据_设备工位点检表] target INNER JOIN @导入设备日期 source ON target.[公司编码] = source.[公司编码]; +SELECT COUNT(*) AS [设备信息日期修正后总数] FROM [dbo].[基础数据_设备工位点检表]; +GO \ No newline at end of file diff --git a/db_backups/fix_device_information_date_edit_20260629.sql b/db_backups/fix_device_information_date_edit_20260629.sql new file mode 100644 index 0000000..b71ab48 --- /dev/null +++ b/db_backups/fix_device_information_date_edit_20260629.sql @@ -0,0 +1,120 @@ +USE [YL_MESDB] +GO + +ALTER PROCEDURE [dbo].[设备管理_设备信息_增加] + @公司编码 nvarchar(100) = NULL, + @设备名称 nvarchar(50) = NULL, + @设备型号 nvarchar(50) = NULL, + @设备类型 nvarchar(50) = NULL, + @设备信息 nvarchar(500) = NULL, + @使用部门 nvarchar(100) = NULL, + @入账日期 nvarchar(50) = NULL, + @单位 nvarchar(50) = NULL, + @数量 decimal(18, 4) = NULL, + @状态 nvarchar(50) = NULL, + @维修记录 nvarchar(1000) = NULL, + @维保记录 nvarchar(1000) = NULL, + @工位绑定 nvarchar(1000) = NULL, + @主要设备 nvarchar(10) = NULL, + @设备标准开机工时 decimal(18, 4) = NULL, + @特种设备 nvarchar(10) = NULL, + @证书有效期至 nvarchar(50) = NULL +AS +BEGIN + SET NOCOUNT ON; + + IF ISNULL(@公司编码, N'') = N'' + BEGIN + SELECT '0' AS result, N'公司编码不能为空' AS message; + RETURN; + END + + INSERT INTO [dbo].[基础数据_设备工位点检表] ( + [公司编码], + [设备名称], + [设备型号], + [设备类型], + [设备信息], + [使用部门], + [入账日期], + [单位], + [数量], + [状态], + [维修记录], + [维保记录], + [工位绑定], + [主要设备], + [设备标准开机工时], + [特种设备], + [证书有效期至] + ) + VALUES ( + @公司编码, + @设备名称, + @设备型号, + @设备类型, + @设备信息, + @使用部门, + TRY_CONVERT(date, NULLIF(@入账日期, N'')), + @单位, + @数量, + @状态, + @维修记录, + @维保记录, + @工位绑定, + @主要设备, + @设备标准开机工时, + @特种设备, + TRY_CONVERT(date, NULLIF(@证书有效期至, N'')) + ); + + SELECT '1' AS result; +END +GO + +ALTER PROCEDURE [dbo].[设备管理_设备信息_编辑] + @设备流水号 int = NULL, + @公司编码 nvarchar(100) = NULL, + @设备名称 nvarchar(50) = NULL, + @设备型号 nvarchar(50) = NULL, + @设备类型 nvarchar(50) = NULL, + @设备信息 nvarchar(500) = NULL, + @使用部门 nvarchar(100) = NULL, + @入账日期 nvarchar(50) = NULL, + @单位 nvarchar(50) = NULL, + @数量 decimal(18, 4) = NULL, + @状态 nvarchar(50) = NULL, + @维修记录 nvarchar(1000) = NULL, + @维保记录 nvarchar(1000) = NULL, + @工位绑定 nvarchar(1000) = NULL, + @主要设备 nvarchar(10) = NULL, + @设备标准开机工时 decimal(18, 4) = NULL, + @特种设备 nvarchar(10) = NULL, + @证书有效期至 nvarchar(50) = NULL +AS +BEGIN + SET NOCOUNT ON; + + UPDATE [dbo].[基础数据_设备工位点检表] + SET + [设备名称] = @设备名称, + [设备型号] = @设备型号, + [设备类型] = @设备类型, + [设备信息] = @设备信息, + [使用部门] = @使用部门, + [入账日期] = TRY_CONVERT(date, NULLIF(@入账日期, N'')), + [单位] = @单位, + [数量] = @数量, + [状态] = @状态, + [维修记录] = @维修记录, + [维保记录] = @维保记录, + [工位绑定] = @工位绑定, + [主要设备] = @主要设备, + [设备标准开机工时] = @设备标准开机工时, + [特种设备] = @特种设备, + [证书有效期至] = TRY_CONVERT(date, NULLIF(@证书有效期至, N'')) + WHERE [设备流水号] = @设备流水号; + + SELECT '1' AS result; +END +GO diff --git a/db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_before_assembly_zero_reportqty_20260627_145839.sql b/db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_before_assembly_zero_reportqty_20260627_145839.sql new file mode 100644 index 0000000..975b5b3 --- /dev/null +++ b/db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_before_assembly_zero_reportqty_20260627_145839.sql @@ -0,0 +1,208 @@ + +CREATE PROCEDURE [dbo].[工时统计_作业者工时_查询] + @合同号 NVARCHAR(50) = NULL, + @操作人 NVARCHAR(50) = NULL, + @产品编码 NVARCHAR(100) = NULL, + @工序名称 NVARCHAR(50) = NULL, + @订单号 NVARCHAR(50) = NULL, + @工时类型 NVARCHAR(50) = NULL, + @开始日期 DATE = NULL, + @结束日期 DATE = NULL +AS +BEGIN + SET NOCOUNT ON; + + ;WITH 人员班组 AS ( + SELECT + LTRIM(RTRIM(Personnel_Name)) AS Personnel_Name, + MAX(NULLIF(LTRIM(RTRIM(班组)), '')) AS 班组 + FROM [YL_MESDB].[dbo].[登录基础数据_人员信息] + WHERE Personnel_Name IS NOT NULL + GROUP BY LTRIM(RTRIM(Personnel_Name)) + ), + 工时基础 AS ( + SELECT + v.*, + ISNULL(p.班组, '未分类') AS 工时类型, + CASE + WHEN v.操作类别 IN ('报工', '辅助结束') AND ISNULL(v.加工工时, 0) > 0 THEN ISNULL(v.加工工时, 0) + WHEN v.操作类别 IN ('报工', '辅助结束') AND ISNULL(v.总时长, 0) > 0 AND ISNULL(v.加工工时, 0) = 0 THEN ISNULL(v.总时长, 0) + WHEN v.操作类别 LIKE '%加班%' AND ISNULL(v.总时长, 0) > 0 THEN ISNULL(v.总时长, 0) + WHEN v.操作类别 = '开始加工' AND ISNULL(v.总时长, 0) > 0 THEN ISNULL(v.总时长, 0) + WHEN v.操作类别 = '异常' THEN -ISNULL(v.总时长, 0) + ELSE 0 + END AS 有效工时秒 + FROM [dbo].[View_生产工时视图全部] v + LEFT JOIN 人员班组 p ON LTRIM(RTRIM(v.操作人)) = p.Personnel_Name + ), + 筛选明细 AS ( + SELECT * + FROM 工时基础 + WHERE (@开始日期 IS NULL OR @开始日期 = '' OR 开始时间 >= @开始日期) + AND (@结束日期 IS NULL OR @结束日期 = '' OR 结束时间 <= @结束日期) + AND 操作人 IS NOT NULL AND 操作人 != '' + AND (@合同号 IS NULL OR @合同号 = '' OR 订单合同号 LIKE '%' + @合同号 + '%') + AND (@操作人 IS NULL OR @操作人 = '' OR 操作人 LIKE '%' + @操作人 + '%') + AND (@产品编码 IS NULL OR @产品编码 = '' OR 产品编码 LIKE '%' + @产品编码 + '%') + AND (@工序名称 IS NULL OR @工序名称 = '' OR 工序名称 LIKE '%' + @工序名称 + '%') + AND (@订单号 IS NULL OR @订单号 = '' OR 订单号 LIKE '%' + @订单号 + '%') + AND (@工时类型 IS NULL OR @工时类型 = '' OR 工时类型 = @工时类型) + AND ISNULL(阶段标识, 0) != -1 + ), + TaskStart报工数量 AS ( + SELECT + TaskAID, + CONVERT(VARCHAR(19), 开始时间, 120) AS 开始时间, + MAX(CASE + WHEN 操作类别 NOT IN ('异常') THEN ISNULL(操作数值, 0) + WHEN 操作类别 = '异常' THEN -ISNULL(操作数值, 0) + ELSE 0 + END) AS 报工数量 + FROM [dbo].[View_生产工时视图全部] + WHERE 操作类别编号 = 6 + GROUP BY TaskAID, CONVERT(VARCHAR(19), 开始时间, 120) + ), + 报工明细 AS ( + SELECT + b.操作人, + CONVERT(VARCHAR(10), b.开始时间, 120) AS 工作日期, + b.TaskAID, + b.订单合同号 AS 合同号, + b.订单号, + b.产品编码, + b.产品名称, + b.工序名称, + b.工时类型, + b.计划数量, + b.工位名称 AS 指派对象, + ISNULL(q.报工数量, CASE + WHEN b.操作类别 NOT IN ('异常') THEN ISNULL(b.操作数值, 0) + WHEN b.操作类别 = '异常' THEN -ISNULL(b.操作数值, 0) + ELSE 0 + END) AS 报工数量, + CONVERT(VARCHAR(19), b.开始时间, 120) AS 开始时间, + CONVERT(VARCHAR(19), b.结束时间, 120) AS 结束时间, + CAST(b.有效工时秒 / 60.0 / 60.0 AS DECIMAL(10,2)) AS 工时小时, + b.异常说明, + b.工序说明, + b.操作类别 + FROM 筛选明细 b + LEFT JOIN TaskStart报工数量 q + ON q.TaskAID = b.TaskAID + AND q.开始时间 = CONVERT(VARCHAR(19), b.开始时间, 120) + ), + 操作人报工数量 AS ( + SELECT 操作人, SUM(报工数量) AS 报工数量 + FROM ( + SELECT 操作人, TaskAID, 开始时间, MAX(报工数量) AS 报工数量 + FROM 报工明细 + WHERE TaskAID IS NOT NULL AND 开始时间 IS NOT NULL AND 开始时间 != '' + GROUP BY 操作人, TaskAID, 开始时间 + ) x + GROUP BY 操作人 + ), + 日期报工数量 AS ( + SELECT 操作人, 工作日期, SUM(报工数量) AS 报工数量 + FROM ( + SELECT 操作人, 工作日期, TaskAID, 开始时间, MAX(报工数量) AS 报工数量 + FROM 报工明细 + WHERE TaskAID IS NOT NULL AND 开始时间 IS NOT NULL AND 开始时间 != '' + GROUP BY 操作人, 工作日期, TaskAID, 开始时间 + ) x + GROUP BY 操作人, 工作日期 + ), + 操作人汇总 AS ( + SELECT + 操作人, + COUNT(*) AS 报工次数, + CAST(SUM(有效工时秒) / 60.0 / 60.0 AS DECIMAL(10,1)) AS 总工时小时 + FROM 筛选明细 + GROUP BY 操作人 + ), + 日期汇总 AS ( + SELECT + 操作人, + CONVERT(VARCHAR(10), 开始时间, 120) AS 工作日期, + COUNT(*) AS 报工次数, + CAST(SUM(有效工时秒) / 60.0 / 60.0 AS DECIMAL(10,1)) AS 工时小时 + FROM 筛选明细 + GROUP BY 操作人, CONVERT(VARCHAR(10), 开始时间, 120) + ) + SELECT + 1 AS [Level], + s.操作人 AS operator, + '' AS dateLabel, + CAST(s.报工次数 AS VARCHAR(20)) AS reportCount, + CAST(ISNULL(q.报工数量, 0) AS VARCHAR(20)) AS reportQty, + '' AS contractNo, + '' AS orderNo, + '' AS productCode, + '' AS productName, + '' AS processName, + CAST(NULL AS DECIMAL(19,6)) AS 计划数量, + '' AS 工时类型, + '' AS 指派对象, + '' AS startTime, + '' AS endTime, + '' AS 异常说明, + '' AS 工序说明, + '' AS 操作类别, + CAST(s.总工时小时 AS VARCHAR(20)) AS workHours, + '' AS TaskAID + FROM 操作人汇总 s + LEFT JOIN 操作人报工数量 q ON q.操作人 = s.操作人 + + UNION ALL + + SELECT + 2 AS [Level], + s.操作人 AS operator, + s.工作日期 AS dateLabel, + CAST(s.报工次数 AS VARCHAR(20)) AS reportCount, + CAST(ISNULL(q.报工数量, 0) AS VARCHAR(20)) AS reportQty, + '' AS contractNo, + '' AS orderNo, + '' AS productCode, + '' AS productName, + '' AS processName, + CAST(NULL AS DECIMAL(19,6)) AS 计划数量, + '' AS 工时类型, + '' AS 指派对象, + '' AS startTime, + '' AS endTime, + '' AS 异常说明, + '' AS 工序说明, + '' AS 操作类别, + CAST(s.工时小时 AS VARCHAR(20)) AS workHours, + '' AS TaskAID + FROM 日期汇总 s + LEFT JOIN 日期报工数量 q ON q.操作人 = s.操作人 AND q.工作日期 = s.工作日期 + + UNION ALL + + SELECT + 3 AS [Level], + 操作人 AS operator, + 工作日期 AS dateLabel, + '' AS reportCount, + CAST(报工数量 AS VARCHAR(20)) AS reportQty, + ISNULL(合同号, '') AS contractNo, + ISNULL(订单号, '') AS orderNo, + ISNULL(产品编码, '') AS productCode, + ISNULL(产品名称, '') AS productName, + ISNULL(工序名称, '') AS processName, + 计划数量 AS 计划数量, + ISNULL(工时类型, '') AS 工时类型, + ISNULL(指派对象, '') AS 指派对象, + ISNULL(开始时间, '') AS startTime, + ISNULL(结束时间, '') AS endTime, + ISNULL(异常说明, '') AS 异常说明, + ISNULL(工序说明, '') AS 工序说明, + ISNULL(操作类别, '') AS 操作类别, + CAST(工时小时 AS VARCHAR(20)) AS workHours, + CAST(TaskAID AS VARCHAR(50)) AS TaskAID + FROM 报工明细 + + ORDER BY operator, dateLabel, [Level], startTime +END + diff --git a/db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_before_taskstart_reportqty_20260627_133625.sql b/db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_before_taskstart_reportqty_20260627_133625.sql new file mode 100644 index 0000000..cf6ed15 --- /dev/null +++ b/db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_before_taskstart_reportqty_20260627_133625.sql @@ -0,0 +1,192 @@ + +CREATE PROCEDURE [dbo].[工时统计_作业者工时_查询] + @合同号 NVARCHAR(50) = NULL, + @操作人 NVARCHAR(50) = NULL, + @产品编码 NVARCHAR(100) = NULL, + @工序名称 NVARCHAR(50) = NULL, + @订单号 NVARCHAR(50) = NULL, + @工时类型 NVARCHAR(50) = NULL, + @开始日期 DATE = NULL, + @结束日期 DATE = NULL +AS +BEGIN + SET NOCOUNT ON; + + ;WITH 人员班组 AS ( + SELECT + LTRIM(RTRIM(Personnel_Name)) AS Personnel_Name, + MAX(NULLIF(LTRIM(RTRIM(班组)), '')) AS 班组 + FROM [YL_MESDB].[dbo].[登录基础数据_人员信息] + WHERE Personnel_Name IS NOT NULL + GROUP BY LTRIM(RTRIM(Personnel_Name)) + ), + 工时基础 AS ( + SELECT + v.*, + ISNULL(p.班组, '未分类') AS 工时类型, + CASE + WHEN v.操作类别 IN ('报工', '辅助结束') AND ISNULL(v.加工工时, 0) > 0 THEN ISNULL(v.加工工时, 0) + WHEN v.操作类别 IN ('报工', '辅助结束') AND ISNULL(v.总时长, 0) > 0 AND ISNULL(v.加工工时, 0) = 0 THEN ISNULL(v.总时长, 0) + WHEN v.操作类别 LIKE '%加班%' AND ISNULL(v.总时长, 0) > 0 THEN ISNULL(v.总时长, 0) + WHEN v.操作类别 = '开始加工' AND ISNULL(v.总时长, 0) > 0 THEN ISNULL(v.总时长, 0) + WHEN v.操作类别 = '异常' THEN -ISNULL(v.总时长, 0) + ELSE 0 + END AS 有效工时秒 + FROM [dbo].[View_生产工时视图全部] v + LEFT JOIN 人员班组 p ON LTRIM(RTRIM(v.操作人)) = p.Personnel_Name + ), + 操作人汇总 AS ( + SELECT + 操作人, + COUNT(*) AS 报工次数, + SUM(CASE + WHEN 操作类别 NOT IN ('异常') THEN 操作数值 + WHEN 操作类别 = '异常' THEN -操作数值 + ELSE 0 + END) AS 报工数量, + CAST(SUM(有效工时秒) / 60.0 / 60.0 AS DECIMAL(10,1)) AS 总工时小时 + FROM 工时基础 + WHERE (@开始日期 IS NULL OR @开始日期 = '' OR 开始时间 >= @开始日期) + AND (@结束日期 IS NULL OR @结束日期 = '' OR 结束时间 <= @结束日期) + AND 操作人 IS NOT NULL AND 操作人 != '' + AND (@合同号 IS NULL OR @合同号 = '' OR 订单合同号 LIKE '%' + @合同号 + '%') + AND (@操作人 IS NULL OR @操作人 = '' OR 操作人 LIKE '%' + @操作人 + '%') + AND (@产品编码 IS NULL OR @产品编码 = '' OR 产品编码 LIKE '%' + @产品编码 + '%') + AND (@工序名称 IS NULL OR @工序名称 = '' OR 工序名称 LIKE '%' + @工序名称 + '%') + AND (@订单号 IS NULL OR @订单号 = '' OR 订单号 LIKE '%' + @订单号 + '%') + AND (@工时类型 IS NULL OR @工时类型 = '' OR 工时类型 = @工时类型) + AND ISNULL(阶段标识, 0) != -1 + GROUP BY 操作人 + ), + 日期汇总 AS ( + SELECT + 操作人, + CONVERT(VARCHAR(10), 开始时间, 120) AS 工作日期, + COUNT(*) AS 报工次数, + SUM(CASE + WHEN 操作类别 NOT IN ('异常') THEN 操作数值 + WHEN 操作类别 = '异常' THEN -操作数值 + ELSE 0 + END) AS 报工数量, + CAST(SUM(有效工时秒) / 60.0 / 60.0 AS DECIMAL(10,1)) AS 工时小时 + FROM 工时基础 + WHERE (@开始日期 IS NULL OR @开始日期 = '' OR 开始时间 >= @开始日期) + AND (@结束日期 IS NULL OR @结束日期 = '' OR 结束时间 <= @结束日期) + AND 操作人 IS NOT NULL AND 操作人 != '' + AND (@合同号 IS NULL OR @合同号 = '' OR 订单合同号 LIKE '%' + @合同号 + '%') + AND (@操作人 IS NULL OR @操作人 = '' OR 操作人 LIKE '%' + @操作人 + '%') + AND (@产品编码 IS NULL OR @产品编码 = '' OR 产品编码 LIKE '%' + @产品编码 + '%') + AND (@工序名称 IS NULL OR @工序名称 = '' OR 工序名称 LIKE '%' + @工序名称 + '%') + AND (@订单号 IS NULL OR @订单号 = '' OR 订单号 LIKE '%' + @订单号 + '%') + AND (@工时类型 IS NULL OR @工时类型 = '' OR 工时类型 = @工时类型) + AND ISNULL(阶段标识, 0) != -1 + GROUP BY 操作人, CONVERT(VARCHAR(10), 开始时间, 120) + ), + 报工明细 AS ( + SELECT + 操作人, + CONVERT(VARCHAR(10), 开始时间, 120) AS 工作日期, + 订单合同号 AS 合同号, + 订单号, + 产品编码, + 产品名称, + 工序名称, + 工时类型, + 计划数量, + 工位名称 AS 指派对象, + CASE + WHEN 操作类别 NOT IN ('异常') THEN 操作数值 + WHEN 操作类别 = '异常' THEN -操作数值 + ELSE 0 + END AS 报工数量, + CONVERT(VARCHAR(19), 开始时间, 120) AS 开始时间, + CONVERT(VARCHAR(19), 结束时间, 120) AS 结束时间, + CAST(有效工时秒 / 60.0 / 60.0 AS DECIMAL(10,2)) AS 工时小时, + 异常说明, + 工序说明, + 操作类别 + FROM 工时基础 + WHERE (@开始日期 IS NULL OR @开始日期 = '' OR 开始时间 >= @开始日期) + AND (@结束日期 IS NULL OR @结束日期 = '' OR 结束时间 <= @结束日期) + AND 操作人 IS NOT NULL AND 操作人 != '' + AND (@合同号 IS NULL OR @合同号 = '' OR 订单合同号 LIKE '%' + @合同号 + '%') + AND (@操作人 IS NULL OR @操作人 = '' OR 操作人 LIKE '%' + @操作人 + '%') + AND (@产品编码 IS NULL OR @产品编码 = '' OR 产品编码 LIKE '%' + @产品编码 + '%') + AND (@工序名称 IS NULL OR @工序名称 = '' OR 工序名称 LIKE '%' + @工序名称 + '%') + AND (@订单号 IS NULL OR @订单号 = '' OR 订单号 LIKE '%' + @订单号 + '%') + AND (@工时类型 IS NULL OR @工时类型 = '' OR 工时类型 = @工时类型) + AND ISNULL(阶段标识, 0) != -1 + ) + SELECT + 1 AS [Level], + 操作人 AS operator, + '' AS dateLabel, + CAST(报工次数 AS VARCHAR(20)) AS reportCount, + CAST(报工数量 AS VARCHAR(20)) AS reportQty, + '' AS contractNo, + '' AS orderNo, + '' AS productCode, + '' AS productName, + '' AS processName, + CAST(NULL AS DECIMAL(19,6)) AS 计划数量, + '' AS 工时类型, + '' AS 指派对象, + '' AS startTime, + '' AS endTime, + '' AS 异常说明, + '' AS 工序说明, + '' AS 操作类别, + CAST(总工时小时 AS VARCHAR(20)) AS workHours + FROM 操作人汇总 + + UNION ALL + + SELECT + 2 AS [Level], + 操作人 AS operator, + 工作日期 AS dateLabel, + CAST(报工次数 AS VARCHAR(20)) AS reportCount, + CAST(报工数量 AS VARCHAR(20)) AS reportQty, + '' AS contractNo, + '' AS orderNo, + '' AS productCode, + '' AS productName, + '' AS processName, + CAST(NULL AS DECIMAL(19,6)) AS 计划数量, + '' AS 工时类型, + '' AS 指派对象, + '' AS startTime, + '' AS endTime, + '' AS 异常说明, + '' AS 工序说明, + '' AS 操作类别, + CAST(工时小时 AS VARCHAR(20)) AS workHours + FROM 日期汇总 + + UNION ALL + + SELECT + 3 AS [Level], + 操作人 AS operator, + 工作日期 AS dateLabel, + '' AS reportCount, + CAST(报工数量 AS VARCHAR(20)) AS reportQty, + ISNULL(合同号, '') AS contractNo, + ISNULL(订单号, '') AS orderNo, + ISNULL(产品编码, '') AS productCode, + ISNULL(产品名称, '') AS productName, + ISNULL(工序名称, '') AS processName, + 计划数量 AS 计划数量, + ISNULL(工时类型, '') AS 工时类型, + ISNULL(指派对象, '') AS 指派对象, + ISNULL(开始时间, '') AS startTime, + ISNULL(结束时间, '') AS endTime, + ISNULL(异常说明, '') AS 异常说明, + ISNULL(工序说明, '') AS 工序说明, + ISNULL(操作类别, '') AS 操作类别, + CAST(工时小时 AS VARCHAR(20)) AS workHours + FROM 报工明细 + + ORDER BY operator, dateLabel, [Level] +END + diff --git a/db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_before_taskstart_reportqty_type6_20260627_144642.sql b/db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_before_taskstart_reportqty_type6_20260627_144642.sql new file mode 100644 index 0000000..05029ac --- /dev/null +++ b/db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_before_taskstart_reportqty_type6_20260627_144642.sql @@ -0,0 +1,209 @@ + +CREATE PROCEDURE [dbo].[工时统计_作业者工时_查询] + @合同号 NVARCHAR(50) = NULL, + @操作人 NVARCHAR(50) = NULL, + @产品编码 NVARCHAR(100) = NULL, + @工序名称 NVARCHAR(50) = NULL, + @订单号 NVARCHAR(50) = NULL, + @工时类型 NVARCHAR(50) = NULL, + @开始日期 DATE = NULL, + @结束日期 DATE = NULL +AS +BEGIN + SET NOCOUNT ON; + + ;WITH 人员班组 AS ( + SELECT + LTRIM(RTRIM(Personnel_Name)) AS Personnel_Name, + MAX(NULLIF(LTRIM(RTRIM(班组)), '')) AS 班组 + FROM [YL_MESDB].[dbo].[登录基础数据_人员信息] + WHERE Personnel_Name IS NOT NULL + GROUP BY LTRIM(RTRIM(Personnel_Name)) + ), + 工时基础 AS ( + SELECT + v.*, + ISNULL(p.班组, '未分类') AS 工时类型, + CASE + WHEN v.操作类别 IN ('报工', '辅助结束') AND ISNULL(v.加工工时, 0) > 0 THEN ISNULL(v.加工工时, 0) + WHEN v.操作类别 IN ('报工', '辅助结束') AND ISNULL(v.总时长, 0) > 0 AND ISNULL(v.加工工时, 0) = 0 THEN ISNULL(v.总时长, 0) + WHEN v.操作类别 LIKE '%加班%' AND ISNULL(v.总时长, 0) > 0 THEN ISNULL(v.总时长, 0) + WHEN v.操作类别 = '开始加工' AND ISNULL(v.总时长, 0) > 0 THEN ISNULL(v.总时长, 0) + WHEN v.操作类别 = '异常' THEN -ISNULL(v.总时长, 0) + ELSE 0 + END AS 有效工时秒 + FROM [dbo].[View_生产工时视图全部] v + LEFT JOIN 人员班组 p ON LTRIM(RTRIM(v.操作人)) = p.Personnel_Name + ), + 筛选明细 AS ( + SELECT * + FROM 工时基础 + WHERE (@开始日期 IS NULL OR @开始日期 = '' OR 开始时间 >= @开始日期) + AND (@结束日期 IS NULL OR @结束日期 = '' OR 结束时间 <= @结束日期) + AND 操作人 IS NOT NULL AND 操作人 != '' + AND (@合同号 IS NULL OR @合同号 = '' OR 订单合同号 LIKE '%' + @合同号 + '%') + AND (@操作人 IS NULL OR @操作人 = '' OR 操作人 LIKE '%' + @操作人 + '%') + AND (@产品编码 IS NULL OR @产品编码 = '' OR 产品编码 LIKE '%' + @产品编码 + '%') + AND (@工序名称 IS NULL OR @工序名称 = '' OR 工序名称 LIKE '%' + @工序名称 + '%') + AND (@订单号 IS NULL OR @订单号 = '' OR 订单号 LIKE '%' + @订单号 + '%') + AND (@工时类型 IS NULL OR @工时类型 = '' OR 工时类型 = @工时类型) + AND ISNULL(阶段标识, 0) != -1 + ), + TaskStart报工数量 AS ( + SELECT + TaskAID, + CONVERT(VARCHAR(19), 开始时间, 120) AS 开始时间, + MAX(CASE + WHEN 操作类别 NOT IN ('异常') THEN ISNULL(操作数值, 0) + WHEN 操作类别 = '异常' THEN -ISNULL(操作数值, 0) + ELSE 0 + END) AS 报工数量 + FROM [dbo].[View_生产工时视图全部] + where 操作类别编号 = 6 + GROUP BY TaskAID, CONVERT(VARCHAR(19), 开始时间, 120) + + ), + 报工明细 AS ( + SELECT + b.操作人, + CONVERT(VARCHAR(10), b.开始时间, 120) AS 工作日期, + b.TaskAID, + b.订单合同号 AS 合同号, + b.订单号, + b.产品编码, + b.产品名称, + b.工序名称, + b.工时类型, + b.计划数量, + b.工位名称 AS 指派对象, + ISNULL(q.报工数量, CASE + WHEN b.操作类别 NOT IN ('异常') THEN ISNULL(b.操作数值, 0) + WHEN b.操作类别 = '异常' THEN -ISNULL(b.操作数值, 0) + ELSE 0 + END) AS 报工数量, + CONVERT(VARCHAR(19), b.开始时间, 120) AS 开始时间, + CONVERT(VARCHAR(19), b.结束时间, 120) AS 结束时间, + CAST(b.有效工时秒 / 60.0 / 60.0 AS DECIMAL(10,2)) AS 工时小时, + b.异常说明, + b.工序说明, + b.操作类别 + FROM 筛选明细 b + LEFT JOIN TaskStart报工数量 q + ON q.TaskAID = b.TaskAID + AND q.开始时间 = CONVERT(VARCHAR(19), b.开始时间, 120) + ), + 操作人报工数量 AS ( + SELECT 操作人, SUM(报工数量) AS 报工数量 + FROM ( + SELECT 操作人, TaskAID, 开始时间, MAX(报工数量) AS 报工数量 + FROM 报工明细 + WHERE TaskAID IS NOT NULL AND 开始时间 IS NOT NULL AND 开始时间 != '' + GROUP BY 操作人, TaskAID, 开始时间 + ) x + GROUP BY 操作人 + ), + 日期报工数量 AS ( + SELECT 操作人, 工作日期, SUM(报工数量) AS 报工数量 + FROM ( + SELECT 操作人, 工作日期, TaskAID, 开始时间, MAX(报工数量) AS 报工数量 + FROM 报工明细 + WHERE TaskAID IS NOT NULL AND 开始时间 IS NOT NULL AND 开始时间 != '' + GROUP BY 操作人, 工作日期, TaskAID, 开始时间 + ) x + GROUP BY 操作人, 工作日期 + ), + 操作人汇总 AS ( + SELECT + 操作人, + COUNT(*) AS 报工次数, + CAST(SUM(有效工时秒) / 60.0 / 60.0 AS DECIMAL(10,1)) AS 总工时小时 + FROM 筛选明细 + GROUP BY 操作人 + ), + 日期汇总 AS ( + SELECT + 操作人, + CONVERT(VARCHAR(10), 开始时间, 120) AS 工作日期, + COUNT(*) AS 报工次数, + CAST(SUM(有效工时秒) / 60.0 / 60.0 AS DECIMAL(10,1)) AS 工时小时 + FROM 筛选明细 + GROUP BY 操作人, CONVERT(VARCHAR(10), 开始时间, 120) + ) + SELECT + 1 AS [Level], + s.操作人 AS operator, + '' AS dateLabel, + CAST(s.报工次数 AS VARCHAR(20)) AS reportCount, + CAST(ISNULL(q.报工数量, 0) AS VARCHAR(20)) AS reportQty, + '' AS contractNo, + '' AS orderNo, + '' AS productCode, + '' AS productName, + '' AS processName, + CAST(NULL AS DECIMAL(19,6)) AS 计划数量, + '' AS 工时类型, + '' AS 指派对象, + '' AS startTime, + '' AS endTime, + '' AS 异常说明, + '' AS 工序说明, + '' AS 操作类别, + CAST(s.总工时小时 AS VARCHAR(20)) AS workHours, + '' AS TaskAID + FROM 操作人汇总 s + LEFT JOIN 操作人报工数量 q ON q.操作人 = s.操作人 + + UNION ALL + + SELECT + 2 AS [Level], + s.操作人 AS operator, + s.工作日期 AS dateLabel, + CAST(s.报工次数 AS VARCHAR(20)) AS reportCount, + CAST(ISNULL(q.报工数量, 0) AS VARCHAR(20)) AS reportQty, + '' AS contractNo, + '' AS orderNo, + '' AS productCode, + '' AS productName, + '' AS processName, + CAST(NULL AS DECIMAL(19,6)) AS 计划数量, + '' AS 工时类型, + '' AS 指派对象, + '' AS startTime, + '' AS endTime, + '' AS 异常说明, + '' AS 工序说明, + '' AS 操作类别, + CAST(s.工时小时 AS VARCHAR(20)) AS workHours, + '' AS TaskAID + FROM 日期汇总 s + LEFT JOIN 日期报工数量 q ON q.操作人 = s.操作人 AND q.工作日期 = s.工作日期 + + UNION ALL + + SELECT + 3 AS [Level], + 操作人 AS operator, + 工作日期 AS dateLabel, + '' AS reportCount, + CAST(报工数量 AS VARCHAR(20)) AS reportQty, + ISNULL(合同号, '') AS contractNo, + ISNULL(订单号, '') AS orderNo, + ISNULL(产品编码, '') AS productCode, + ISNULL(产品名称, '') AS productName, + ISNULL(工序名称, '') AS processName, + 计划数量 AS 计划数量, + ISNULL(工时类型, '') AS 工时类型, + ISNULL(指派对象, '') AS 指派对象, + ISNULL(开始时间, '') AS startTime, + ISNULL(结束时间, '') AS endTime, + ISNULL(异常说明, '') AS 异常说明, + ISNULL(工序说明, '') AS 工序说明, + ISNULL(操作类别, '') AS 操作类别, + CAST(工时小时 AS VARCHAR(20)) AS workHours, + CAST(TaskAID AS VARCHAR(50)) AS TaskAID + FROM 报工明细 + + ORDER BY operator, dateLabel, [Level], startTime +END + diff --git a/db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_before_unfiltered_taskstart_reportqty_20260627_141106.sql b/db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_before_unfiltered_taskstart_reportqty_20260627_141106.sql new file mode 100644 index 0000000..8b98b25 --- /dev/null +++ b/db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_before_unfiltered_taskstart_reportqty_20260627_141106.sql @@ -0,0 +1,209 @@ + +CREATE PROCEDURE [dbo].[工时统计_作业者工时_查询] + @合同号 NVARCHAR(50) = NULL, + @操作人 NVARCHAR(50) = NULL, + @产品编码 NVARCHAR(100) = NULL, + @工序名称 NVARCHAR(50) = NULL, + @订单号 NVARCHAR(50) = NULL, + @工时类型 NVARCHAR(50) = NULL, + @开始日期 DATE = NULL, + @结束日期 DATE = NULL +AS +BEGIN + SET NOCOUNT ON; + + ;WITH 人员班组 AS ( + SELECT + LTRIM(RTRIM(Personnel_Name)) AS Personnel_Name, + MAX(NULLIF(LTRIM(RTRIM(班组)), '')) AS 班组 + FROM [YL_MESDB].[dbo].[登录基础数据_人员信息] + WHERE Personnel_Name IS NOT NULL + GROUP BY LTRIM(RTRIM(Personnel_Name)) + ), + 工时基础 AS ( + SELECT + v.*, + ISNULL(p.班组, '未分类') AS 工时类型, + CASE + WHEN v.操作类别 IN ('报工', '辅助结束') AND ISNULL(v.加工工时, 0) > 0 THEN ISNULL(v.加工工时, 0) + WHEN v.操作类别 IN ('报工', '辅助结束') AND ISNULL(v.总时长, 0) > 0 AND ISNULL(v.加工工时, 0) = 0 THEN ISNULL(v.总时长, 0) + WHEN v.操作类别 LIKE '%加班%' AND ISNULL(v.总时长, 0) > 0 THEN ISNULL(v.总时长, 0) + WHEN v.操作类别 = '开始加工' AND ISNULL(v.总时长, 0) > 0 THEN ISNULL(v.总时长, 0) + WHEN v.操作类别 = '异常' THEN -ISNULL(v.总时长, 0) + ELSE 0 + END AS 有效工时秒 + FROM [dbo].[View_生产工时视图全部] v + LEFT JOIN 人员班组 p ON LTRIM(RTRIM(v.操作人)) = p.Personnel_Name + ), + 筛选明细 AS ( + SELECT * + FROM 工时基础 + WHERE (@开始日期 IS NULL OR @开始日期 = '' OR 开始时间 >= @开始日期) + AND (@结束日期 IS NULL OR @结束日期 = '' OR 结束时间 <= @结束日期) + AND 操作人 IS NOT NULL AND 操作人 != '' + AND (@合同号 IS NULL OR @合同号 = '' OR 订单合同号 LIKE '%' + @合同号 + '%') + AND (@操作人 IS NULL OR @操作人 = '' OR 操作人 LIKE '%' + @操作人 + '%') + AND (@产品编码 IS NULL OR @产品编码 = '' OR 产品编码 LIKE '%' + @产品编码 + '%') + AND (@工序名称 IS NULL OR @工序名称 = '' OR 工序名称 LIKE '%' + @工序名称 + '%') + AND (@订单号 IS NULL OR @订单号 = '' OR 订单号 LIKE '%' + @订单号 + '%') + AND (@工时类型 IS NULL OR @工时类型 = '' OR 工时类型 = @工时类型) + AND ISNULL(阶段标识, 0) != -1 + ), + TaskStart报工数量 AS ( + SELECT + TaskAID, + CONVERT(VARCHAR(19), 开始时间, 120) AS 开始时间, + MAX(CASE + WHEN 操作类别 NOT IN ('异常') THEN ISNULL(操作数值, 0) + WHEN 操作类别 = '异常' THEN -ISNULL(操作数值, 0) + ELSE 0 + END) AS 报工数量 + FROM 筛选明细 + WHERE TaskAID IS NOT NULL + AND 开始时间 IS NOT NULL + GROUP BY TaskAID, CONVERT(VARCHAR(19), 开始时间, 120) + ), + 报工明细 AS ( + SELECT + b.操作人, + CONVERT(VARCHAR(10), b.开始时间, 120) AS 工作日期, + b.TaskAID, + b.订单合同号 AS 合同号, + b.订单号, + b.产品编码, + b.产品名称, + b.工序名称, + b.工时类型, + b.计划数量, + b.工位名称 AS 指派对象, + ISNULL(q.报工数量, CASE + WHEN b.操作类别 NOT IN ('异常') THEN ISNULL(b.操作数值, 0) + WHEN b.操作类别 = '异常' THEN -ISNULL(b.操作数值, 0) + ELSE 0 + END) AS 报工数量, + CONVERT(VARCHAR(19), b.开始时间, 120) AS 开始时间, + CONVERT(VARCHAR(19), b.结束时间, 120) AS 结束时间, + CAST(b.有效工时秒 / 60.0 / 60.0 AS DECIMAL(10,2)) AS 工时小时, + b.异常说明, + b.工序说明, + b.操作类别 + FROM 筛选明细 b + LEFT JOIN TaskStart报工数量 q + ON q.TaskAID = b.TaskAID + AND q.开始时间 = CONVERT(VARCHAR(19), b.开始时间, 120) + ), + 操作人报工数量 AS ( + SELECT 操作人, SUM(报工数量) AS 报工数量 + FROM ( + SELECT 操作人, TaskAID, 开始时间, MAX(报工数量) AS 报工数量 + FROM 报工明细 + WHERE TaskAID IS NOT NULL AND 开始时间 IS NOT NULL AND 开始时间 != '' + GROUP BY 操作人, TaskAID, 开始时间 + ) x + GROUP BY 操作人 + ), + 日期报工数量 AS ( + SELECT 操作人, 工作日期, SUM(报工数量) AS 报工数量 + FROM ( + SELECT 操作人, 工作日期, TaskAID, 开始时间, MAX(报工数量) AS 报工数量 + FROM 报工明细 + WHERE TaskAID IS NOT NULL AND 开始时间 IS NOT NULL AND 开始时间 != '' + GROUP BY 操作人, 工作日期, TaskAID, 开始时间 + ) x + GROUP BY 操作人, 工作日期 + ), + 操作人汇总 AS ( + SELECT + 操作人, + COUNT(*) AS 报工次数, + CAST(SUM(有效工时秒) / 60.0 / 60.0 AS DECIMAL(10,1)) AS 总工时小时 + FROM 筛选明细 + GROUP BY 操作人 + ), + 日期汇总 AS ( + SELECT + 操作人, + CONVERT(VARCHAR(10), 开始时间, 120) AS 工作日期, + COUNT(*) AS 报工次数, + CAST(SUM(有效工时秒) / 60.0 / 60.0 AS DECIMAL(10,1)) AS 工时小时 + FROM 筛选明细 + GROUP BY 操作人, CONVERT(VARCHAR(10), 开始时间, 120) + ) + SELECT + 1 AS [Level], + s.操作人 AS operator, + '' AS dateLabel, + CAST(s.报工次数 AS VARCHAR(20)) AS reportCount, + CAST(ISNULL(q.报工数量, 0) AS VARCHAR(20)) AS reportQty, + '' AS contractNo, + '' AS orderNo, + '' AS productCode, + '' AS productName, + '' AS processName, + CAST(NULL AS DECIMAL(19,6)) AS 计划数量, + '' AS 工时类型, + '' AS 指派对象, + '' AS startTime, + '' AS endTime, + '' AS 异常说明, + '' AS 工序说明, + '' AS 操作类别, + CAST(s.总工时小时 AS VARCHAR(20)) AS workHours, + '' AS TaskAID + FROM 操作人汇总 s + LEFT JOIN 操作人报工数量 q ON q.操作人 = s.操作人 + + UNION ALL + + SELECT + 2 AS [Level], + s.操作人 AS operator, + s.工作日期 AS dateLabel, + CAST(s.报工次数 AS VARCHAR(20)) AS reportCount, + CAST(ISNULL(q.报工数量, 0) AS VARCHAR(20)) AS reportQty, + '' AS contractNo, + '' AS orderNo, + '' AS productCode, + '' AS productName, + '' AS processName, + CAST(NULL AS DECIMAL(19,6)) AS 计划数量, + '' AS 工时类型, + '' AS 指派对象, + '' AS startTime, + '' AS endTime, + '' AS 异常说明, + '' AS 工序说明, + '' AS 操作类别, + CAST(s.工时小时 AS VARCHAR(20)) AS workHours, + '' AS TaskAID + FROM 日期汇总 s + LEFT JOIN 日期报工数量 q ON q.操作人 = s.操作人 AND q.工作日期 = s.工作日期 + + UNION ALL + + SELECT + 3 AS [Level], + 操作人 AS operator, + 工作日期 AS dateLabel, + '' AS reportCount, + CAST(报工数量 AS VARCHAR(20)) AS reportQty, + ISNULL(合同号, '') AS contractNo, + ISNULL(订单号, '') AS orderNo, + ISNULL(产品编码, '') AS productCode, + ISNULL(产品名称, '') AS productName, + ISNULL(工序名称, '') AS processName, + 计划数量 AS 计划数量, + ISNULL(工时类型, '') AS 工时类型, + ISNULL(指派对象, '') AS 指派对象, + ISNULL(开始时间, '') AS startTime, + ISNULL(结束时间, '') AS endTime, + ISNULL(异常说明, '') AS 异常说明, + ISNULL(工序说明, '') AS 工序说明, + ISNULL(操作类别, '') AS 操作类别, + CAST(工时小时 AS VARCHAR(20)) AS workHours, + CAST(TaskAID AS VARCHAR(50)) AS TaskAID + FROM 报工明细 + + ORDER BY operator, dateLabel, [Level], startTime +END + diff --git a/db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_导出_before_assembly_zero_reportqty_20260627_145839.sql b/db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_导出_before_assembly_zero_reportqty_20260627_145839.sql new file mode 100644 index 0000000..cc2882e --- /dev/null +++ b/db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_导出_before_assembly_zero_reportqty_20260627_145839.sql @@ -0,0 +1,71 @@ + +CREATE PROCEDURE [dbo].[工时统计_作业者工时_查询_导出] + @合同号 NVARCHAR(50) = NULL, + @操作人 NVARCHAR(50) = NULL, + @产品编码 NVARCHAR(100) = NULL, + @工序名称 NVARCHAR(50) = NULL, + @订单号 NVARCHAR(50) = NULL, + @开始日期 DATE = NULL, + @结束日期 DATE = NULL +AS +BEGIN + SET NOCOUNT ON; + + SELECT '作业者工时统计_' + REPLACE(REPLACE(REPLACE(CONVERT(NVARCHAR(19), GETDATE(), 21), ':', ''), '-', ''), ' ', '-') AS tablename, '15' AS tabletype + + SELECT 256*12 AS 操作人, 256*15 AS 工作日期, 256*20 AS 合同号, 256*12 AS 订单号, 256*40 AS 产品编码, + 256*25 AS 产品名称, 256*15 AS 工序名称, 256*12 AS 指派对象, 256*10 AS 报工数量, 256*20 AS 开始时间, 256*20 AS 结束时间, 256*12 AS '工时(h)' + + SELECT 0 AS 操作人, 0 AS 工作日期, 0 AS 合同号, 0 AS 订单号, 0 AS 产品编码, + 0 AS 产品名称, 0 AS 工序名称, 0 AS 指派对象, 0 AS 报工数量, 0 AS 开始时间, 0 AS 结束时间, 0 AS '工时(h)' + + ;WITH 筛选明细 AS ( + SELECT * + FROM [dbo].[View_生产工时视图] + WHERE (@开始日期 IS NULL OR @开始日期 = '' OR 结束时间 >= @开始日期) + AND (@结束日期 IS NULL OR @结束日期 = '' OR 开始时间 <= @结束日期) + AND 操作人 IS NOT NULL AND 操作人 != '' + AND (@合同号 IS NULL OR @合同号 = '' OR 订单合同号 LIKE '%' + @合同号 + '%') + AND (@操作人 IS NULL OR @操作人 = '' OR 操作人 LIKE '%' + @操作人 + '%') + AND (@产品编码 IS NULL OR @产品编码 = '' OR 产品编码 LIKE '%' + @产品编码 + '%') + AND (@工序名称 IS NULL OR @工序名称 = '' OR 工序名称 LIKE '%' + @工序名称 + '%') + AND (@订单号 IS NULL OR @订单号 = '' OR 订单号 LIKE '%' + @订单号 + '%') + AND ISNULL(阶段标识, 0) != -1 + ), + TaskStart报工数量 AS ( + SELECT + TaskAID, + CONVERT(VARCHAR(19), 开始时间, 120) AS 开始时间, + MAX(CASE + WHEN 操作类别 NOT IN ('异常') THEN ISNULL(操作数值, 0) + WHEN 操作类别 = '异常' THEN -ISNULL(操作数值, 0) + ELSE 0 + END) AS 报工数量 + FROM [dbo].[View_生产工时视图全部] + WHERE 操作类别编号 = 6 + GROUP BY TaskAID, CONVERT(VARCHAR(19), 开始时间, 120) + ) + SELECT + b.操作人, + CONVERT(VARCHAR(10), b.开始时间, 120) AS 工作日期, + ISNULL(b.订单合同号, '') AS 合同号, + ISNULL(b.订单号, '') AS 订单号, + ISNULL(b.产品编码, '') AS 产品编码, + ISNULL(b.产品名称, '') AS 产品名称, + ISNULL(b.工序名称, '') AS 工序名称, + ISNULL(b.工位名称, '') AS 指派对象, + CAST(ISNULL(q.报工数量, CASE + WHEN b.操作类别 NOT IN ('异常') THEN ISNULL(b.操作数值, 0) + WHEN b.操作类别 = '异常' THEN -ISNULL(b.操作数值, 0) + ELSE 0 + END) AS VARCHAR(20)) AS 报工数量, + CONVERT(VARCHAR(19), b.开始时间, 120) AS 开始时间, + CONVERT(VARCHAR(19), b.结束时间, 120) AS 结束时间, + CAST(CAST(b.总时长 / 60.0 / 60.0 AS DECIMAL(10,2)) AS VARCHAR(20)) AS '工时(h)' + FROM 筛选明细 b + LEFT JOIN TaskStart报工数量 q + ON q.TaskAID = b.TaskAID + AND q.开始时间 = CONVERT(VARCHAR(19), b.开始时间, 120) + ORDER BY b.操作人, b.开始时间 +END + diff --git a/db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_导出_before_taskstart_reportqty_20260627_133625.sql b/db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_导出_before_taskstart_reportqty_20260627_133625.sql new file mode 100644 index 0000000..a579e7e --- /dev/null +++ b/db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_导出_before_taskstart_reportqty_20260627_133625.sql @@ -0,0 +1,47 @@ + +CREATE PROCEDURE [dbo].[工时统计_作业者工时_查询_导出] + @合同号 NVARCHAR(50) = NULL, + @操作人 NVARCHAR(50) = NULL, + @产品编码 NVARCHAR(100) = NULL, + @工序名称 NVARCHAR(50) = NULL, + @订单号 NVARCHAR(50) = NULL, + @开始日期 DATE = NULL, + @结束日期 DATE = NULL +AS +BEGIN + SET NOCOUNT ON; + + SELECT '作业者工时统计_' + REPLACE(REPLACE(REPLACE(CONVERT(NVARCHAR(19), GETDATE(), 21), ':', ''), '-', ''), ' ', '-') AS tablename, '15' AS tabletype + + SELECT 256*12 AS 操作人, 256*15 AS 工作日期, 256*20 AS 合同号, 256*12 AS 订单号, 256*40 AS 产品编码, + 256*25 AS 产品名称, 256*15 AS 工序名称, 256*12 AS 指派对象, 256*10 AS 报工数量, 256*20 AS 开始时间, 256*20 AS 结束时间, 256*12 AS '工时(h)' + + SELECT 0 AS 操作人, 0 AS 工作日期, 0 AS 合同号, 0 AS 订单号, 0 AS 产品编码, + 0 AS 产品名称, 0 AS 工序名称, 0 AS 指派对象, 0 AS 报工数量, 0 AS 开始时间, 0 AS 结束时间, 0 AS '工时(h)' + + SELECT + 操作人, + CONVERT(VARCHAR(10), 开始时间, 120) AS 工作日期, + ISNULL(订单合同号, '') AS 合同号, + ISNULL(订单号, '') AS 订单号, + ISNULL(产品编码, '') AS 产品编码, + ISNULL(产品名称, '') AS 产品名称, + ISNULL(工序名称, '') AS 工序名称, + ISNULL(工位名称, '') AS 指派对象, + CASE WHEN 操作类别 IN ('报工', '辅助结束', '加班', '异常', '开始加工') THEN CAST(操作数值 AS VARCHAR(20)) ELSE '0' END AS 报工数量, + CONVERT(VARCHAR(19), 开始时间, 120) AS 开始时间, + CONVERT(VARCHAR(19), 结束时间, 120) AS 结束时间, + CAST(CAST(总时长 / 60.0 / 60.0 AS DECIMAL(10,2)) AS VARCHAR(20)) AS '工时(h)' + FROM [dbo].[View_生产工时视图] + WHERE (@开始日期 IS NULL OR @开始日期 = '' OR 结束时间 >= @开始日期) + AND (@结束日期 IS NULL OR @结束日期 = '' OR 开始时间 <= @结束日期) + AND 操作人 IS NOT NULL AND 操作人 != '' + AND (@合同号 IS NULL OR @合同号 = '' OR 订单合同号 LIKE '%' + @合同号 + '%') + AND (@操作人 IS NULL OR @操作人 = '' OR 操作人 LIKE '%' + @操作人 + '%') + AND (@产品编码 IS NULL OR @产品编码 = '' OR 产品编码 LIKE '%' + @产品编码 + '%') + AND (@工序名称 IS NULL OR @工序名称 = '' OR 工序名称 LIKE '%' + @工序名称 + '%') + AND (@订单号 IS NULL OR @订单号 = '' OR 订单号 LIKE '%' + @订单号 + '%') + AND ISNULL(阶段标识, 0) != -1 + ORDER BY 操作人, 开始时间 +END + diff --git a/db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_导出_before_taskstart_reportqty_type6_20260627_144642.sql b/db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_导出_before_taskstart_reportqty_type6_20260627_144642.sql new file mode 100644 index 0000000..e60a24d --- /dev/null +++ b/db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_导出_before_taskstart_reportqty_type6_20260627_144642.sql @@ -0,0 +1,70 @@ + +CREATE PROCEDURE [dbo].[工时统计_作业者工时_查询_导出] + @合同号 NVARCHAR(50) = NULL, + @操作人 NVARCHAR(50) = NULL, + @产品编码 NVARCHAR(100) = NULL, + @工序名称 NVARCHAR(50) = NULL, + @订单号 NVARCHAR(50) = NULL, + @开始日期 DATE = NULL, + @结束日期 DATE = NULL +AS +BEGIN + SET NOCOUNT ON; + + SELECT '作业者工时统计_' + REPLACE(REPLACE(REPLACE(CONVERT(NVARCHAR(19), GETDATE(), 21), ':', ''), '-', ''), ' ', '-') AS tablename, '15' AS tabletype + + SELECT 256*12 AS 操作人, 256*15 AS 工作日期, 256*20 AS 合同号, 256*12 AS 订单号, 256*40 AS 产品编码, + 256*25 AS 产品名称, 256*15 AS 工序名称, 256*12 AS 指派对象, 256*10 AS 报工数量, 256*20 AS 开始时间, 256*20 AS 结束时间, 256*12 AS '工时(h)' + + SELECT 0 AS 操作人, 0 AS 工作日期, 0 AS 合同号, 0 AS 订单号, 0 AS 产品编码, + 0 AS 产品名称, 0 AS 工序名称, 0 AS 指派对象, 0 AS 报工数量, 0 AS 开始时间, 0 AS 结束时间, 0 AS '工时(h)' + + ;WITH 筛选明细 AS ( + SELECT * + FROM [dbo].[View_生产工时视图] + WHERE (@开始日期 IS NULL OR @开始日期 = '' OR 结束时间 >= @开始日期) + AND (@结束日期 IS NULL OR @结束日期 = '' OR 开始时间 <= @结束日期) + AND 操作人 IS NOT NULL AND 操作人 != '' + AND (@合同号 IS NULL OR @合同号 = '' OR 订单合同号 LIKE '%' + @合同号 + '%') + AND (@操作人 IS NULL OR @操作人 = '' OR 操作人 LIKE '%' + @操作人 + '%') + AND (@产品编码 IS NULL OR @产品编码 = '' OR 产品编码 LIKE '%' + @产品编码 + '%') + AND (@工序名称 IS NULL OR @工序名称 = '' OR 工序名称 LIKE '%' + @工序名称 + '%') + AND (@订单号 IS NULL OR @订单号 = '' OR 订单号 LIKE '%' + @订单号 + '%') + AND ISNULL(阶段标识, 0) != -1 + ), + TaskStart报工数量 AS ( + SELECT + TaskAID, + CONVERT(VARCHAR(19), 开始时间, 120) AS 开始时间, + MAX(CASE + WHEN 操作类别 NOT IN ('异常') THEN ISNULL(操作数值, 0) + WHEN 操作类别 = '异常' THEN -ISNULL(操作数值, 0) + ELSE 0 + END) AS 报工数量 + FROM [dbo].[View_生产工时视图全部] + GROUP BY TaskAID, CONVERT(VARCHAR(19), 开始时间, 120) + ) + SELECT + b.操作人, + CONVERT(VARCHAR(10), b.开始时间, 120) AS 工作日期, + ISNULL(b.订单合同号, '') AS 合同号, + ISNULL(b.订单号, '') AS 订单号, + ISNULL(b.产品编码, '') AS 产品编码, + ISNULL(b.产品名称, '') AS 产品名称, + ISNULL(b.工序名称, '') AS 工序名称, + ISNULL(b.工位名称, '') AS 指派对象, + CAST(ISNULL(q.报工数量, CASE + WHEN b.操作类别 NOT IN ('异常') THEN ISNULL(b.操作数值, 0) + WHEN b.操作类别 = '异常' THEN -ISNULL(b.操作数值, 0) + ELSE 0 + END) AS VARCHAR(20)) AS 报工数量, + CONVERT(VARCHAR(19), b.开始时间, 120) AS 开始时间, + CONVERT(VARCHAR(19), b.结束时间, 120) AS 结束时间, + CAST(CAST(b.总时长 / 60.0 / 60.0 AS DECIMAL(10,2)) AS VARCHAR(20)) AS '工时(h)' + FROM 筛选明细 b + LEFT JOIN TaskStart报工数量 q + ON q.TaskAID = b.TaskAID + AND q.开始时间 = CONVERT(VARCHAR(19), b.开始时间, 120) + ORDER BY b.操作人, b.开始时间 +END + diff --git a/db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_导出_before_unfiltered_taskstart_reportqty_20260627_141106.sql b/db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_导出_before_unfiltered_taskstart_reportqty_20260627_141106.sql new file mode 100644 index 0000000..f451bd9 --- /dev/null +++ b/db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_导出_before_unfiltered_taskstart_reportqty_20260627_141106.sql @@ -0,0 +1,72 @@ + +CREATE PROCEDURE [dbo].[工时统计_作业者工时_查询_导出] + @合同号 NVARCHAR(50) = NULL, + @操作人 NVARCHAR(50) = NULL, + @产品编码 NVARCHAR(100) = NULL, + @工序名称 NVARCHAR(50) = NULL, + @订单号 NVARCHAR(50) = NULL, + @开始日期 DATE = NULL, + @结束日期 DATE = NULL +AS +BEGIN + SET NOCOUNT ON; + + SELECT '作业者工时统计_' + REPLACE(REPLACE(REPLACE(CONVERT(NVARCHAR(19), GETDATE(), 21), ':', ''), '-', ''), ' ', '-') AS tablename, '15' AS tabletype + + SELECT 256*12 AS 操作人, 256*15 AS 工作日期, 256*20 AS 合同号, 256*12 AS 订单号, 256*40 AS 产品编码, + 256*25 AS 产品名称, 256*15 AS 工序名称, 256*12 AS 指派对象, 256*10 AS 报工数量, 256*20 AS 开始时间, 256*20 AS 结束时间, 256*12 AS '工时(h)' + + SELECT 0 AS 操作人, 0 AS 工作日期, 0 AS 合同号, 0 AS 订单号, 0 AS 产品编码, + 0 AS 产品名称, 0 AS 工序名称, 0 AS 指派对象, 0 AS 报工数量, 0 AS 开始时间, 0 AS 结束时间, 0 AS '工时(h)' + + ;WITH 筛选明细 AS ( + SELECT * + FROM [dbo].[View_生产工时视图] + WHERE (@开始日期 IS NULL OR @开始日期 = '' OR 结束时间 >= @开始日期) + AND (@结束日期 IS NULL OR @结束日期 = '' OR 开始时间 <= @结束日期) + AND 操作人 IS NOT NULL AND 操作人 != '' + AND (@合同号 IS NULL OR @合同号 = '' OR 订单合同号 LIKE '%' + @合同号 + '%') + AND (@操作人 IS NULL OR @操作人 = '' OR 操作人 LIKE '%' + @操作人 + '%') + AND (@产品编码 IS NULL OR @产品编码 = '' OR 产品编码 LIKE '%' + @产品编码 + '%') + AND (@工序名称 IS NULL OR @工序名称 = '' OR 工序名称 LIKE '%' + @工序名称 + '%') + AND (@订单号 IS NULL OR @订单号 = '' OR 订单号 LIKE '%' + @订单号 + '%') + AND ISNULL(阶段标识, 0) != -1 + ), + TaskStart报工数量 AS ( + SELECT + TaskAID, + CONVERT(VARCHAR(19), 开始时间, 120) AS 开始时间, + MAX(CASE + WHEN 操作类别 NOT IN ('异常') THEN ISNULL(操作数值, 0) + WHEN 操作类别 = '异常' THEN -ISNULL(操作数值, 0) + ELSE 0 + END) AS 报工数量 + FROM 筛选明细 + WHERE TaskAID IS NOT NULL + AND 开始时间 IS NOT NULL + GROUP BY TaskAID, CONVERT(VARCHAR(19), 开始时间, 120) + ) + SELECT + b.操作人, + CONVERT(VARCHAR(10), b.开始时间, 120) AS 工作日期, + ISNULL(b.订单合同号, '') AS 合同号, + ISNULL(b.订单号, '') AS 订单号, + ISNULL(b.产品编码, '') AS 产品编码, + ISNULL(b.产品名称, '') AS 产品名称, + ISNULL(b.工序名称, '') AS 工序名称, + ISNULL(b.工位名称, '') AS 指派对象, + CAST(ISNULL(q.报工数量, CASE + WHEN b.操作类别 NOT IN ('异常') THEN ISNULL(b.操作数值, 0) + WHEN b.操作类别 = '异常' THEN -ISNULL(b.操作数值, 0) + ELSE 0 + END) AS VARCHAR(20)) AS 报工数量, + CONVERT(VARCHAR(19), b.开始时间, 120) AS 开始时间, + CONVERT(VARCHAR(19), b.结束时间, 120) AS 结束时间, + CAST(CAST(b.总时长 / 60.0 / 60.0 AS DECIMAL(10,2)) AS VARCHAR(20)) AS '工时(h)' + FROM 筛选明细 b + LEFT JOIN TaskStart报工数量 q + ON q.TaskAID = b.TaskAID + AND q.开始时间 = CONVERT(VARCHAR(19), b.开始时间, 120) + ORDER BY b.操作人, b.开始时间 +END + diff --git a/db_backups/update_abnormal_control_parallel_approval_20260627.sql b/db_backups/update_abnormal_control_parallel_approval_20260627.sql new file mode 100644 index 0000000..edc80a9 --- /dev/null +++ b/db_backups/update_abnormal_control_parallel_approval_20260627.sql @@ -0,0 +1,298 @@ +/* + 过程异常管控并行审批调整 + 目标: + 1. sp_创建流程_简化版 支持前端传入多个审批人,审批人ID/审批人姓名使用英文逗号分隔。 + 2. 多个审批人写入同一个步骤序号的多个 processing 节点,所有审批人可同时看到待办。 + 3. sp_获取待处理任务 兼容同一步骤多行节点,也兼容旧过程已写入的逗号分隔审批人ID。 + 4. sp_处理审批 中任意一个审批人同意后,当前流程直接完成,并关闭同一步骤其他待处理节点。 + 说明:本脚本仅定义存储过程,不插入业务数据。 +*/ + +CREATE OR ALTER PROCEDURE [dbo].[sp_创建流程_简化版] + @流程标题 NVARCHAR(200), + @流程描述 NVARCHAR(MAX), + @优先级 NVARCHAR(20) = N'normal', + @发起人ID NVARCHAR(100), + @发起人姓名 NVARCHAR(100), + @审批人ID NVARCHAR(MAX), + @审批人姓名 NVARCHAR(MAX), + @新流程ID INT = 0, + @已关联计划号 NVARCHAR(100) = N'', + @零件名称 NVARCHAR(100) = N'', + @零件编号 NVARCHAR(100) = N'', + @工序名称 NVARCHAR(100) = N'' +AS +BEGIN + SET NOCOUNT ON; + + DECLARE @结果 INT = 0; + DECLARE @消息 NVARCHAR(500) = N''; + + BEGIN TRY + BEGIN TRANSACTION; + + DECLARE @审批人IDXml XML; + DECLARE @审批人姓名Xml XML; + + SET @审批人IDXml = CAST( + N'' + + REPLACE(REPLACE(REPLACE(REPLACE(ISNULL(@审批人ID, N''), N'&', N'&'), N'<', N'<'), N'>', N'>'), N',', N'') + + N'' AS XML + ); + + SET @审批人姓名Xml = CAST( + N'' + + REPLACE(REPLACE(REPLACE(REPLACE(ISNULL(@审批人姓名, N''), N'&', N'&'), N'<', N'<'), N'>', N'>'), N',', N'') + + N'' AS XML + ); + + DECLARE @审批人表 TABLE ( + 序号 INT IDENTITY(1, 1) PRIMARY KEY, + 审批人ID NVARCHAR(100), + 审批人姓名 NVARCHAR(100) + ); + + DECLARE @审批人ID表 TABLE ( + 序号 INT IDENTITY(1, 1) PRIMARY KEY, + 审批人ID NVARCHAR(100) + ); + + DECLARE @审批人姓名表 TABLE ( + 序号 INT IDENTITY(1, 1) PRIMARY KEY, + 审批人姓名 NVARCHAR(100) + ); + + INSERT INTO @审批人ID表 (审批人ID) + SELECT NULLIF(LTRIM(RTRIM(T.C.value(N'.', N'NVARCHAR(100)'))), N'') + FROM @审批人IDXml.nodes(N'/i') AS T(C); + + INSERT INTO @审批人姓名表 (审批人姓名) + SELECT NULLIF(LTRIM(RTRIM(T.C.value(N'.', N'NVARCHAR(100)'))), N'') + FROM @审批人姓名Xml.nodes(N'/i') AS T(C); + + INSERT INTO @审批人表 (审批人ID, 审批人姓名) + SELECT I.审批人ID, ISNULL(N.审批人姓名, I.审批人ID) + FROM @审批人ID表 I + LEFT JOIN @审批人姓名表 N ON N.序号 = I.序号 + WHERE I.审批人ID IS NOT NULL; + + IF NOT EXISTS (SELECT 1 FROM @审批人表) + BEGIN + INSERT INTO @审批人表 (审批人ID, 审批人姓名) + VALUES (@发起人ID, @发起人姓名); + END; + + INSERT INTO [dbo].[流程表] ( + 流程标题, + 流程描述, + 优先级, + 状态, + 发起人ID, + 发起人姓名, + 当前节点, + 当前步骤, + 总步骤数, + 已关联计划号, + 零件名称, + 零件编号, + 工序名称, + 创建时间, + 更新时间 + ) + VALUES ( + @流程标题, + @流程描述, + ISNULL(NULLIF(@优先级, N''), N'normal'), + N'processing', + @发起人ID, + @发起人姓名, + N'异常审批', + 1, + 1, + ISNULL(@已关联计划号, N''), + ISNULL(@零件名称, N''), + ISNULL(@零件编号, N''), + ISNULL(@工序名称, N''), + GETDATE(), + GETDATE() + ); + + SET @新流程ID = SCOPE_IDENTITY(); + + INSERT INTO [dbo].[流程节点表] ( + 流程ID, + 节点名称, + 审批人ID, + 审批人姓名, + 步骤序号, + 状态, + 是否转办 + ) + SELECT + @新流程ID, + N'异常审批', + 审批人ID, + 审批人姓名, + 1, + N'processing', + 0 + FROM @审批人表; + + SET @结果 = 1; + SET @消息 = N'流程创建成功,流程ID: ' + CAST(@新流程ID AS NVARCHAR(20)); + + COMMIT TRANSACTION; + END TRY + BEGIN CATCH + IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION; + SET @结果 = 0; + SET @消息 = N'错误: ' + ERROR_MESSAGE(); + END CATCH; + + SELECT @结果 AS 结果, @消息 AS 消息, @新流程ID AS 新流程ID; +END; +GO + +CREATE OR ALTER PROCEDURE [dbo].[sp_获取待处理任务] + @审批人ID NVARCHAR(100) +AS +BEGIN + SET NOCOUNT ON; + + SELECT + p.流程ID, + p.流程标题, + p.流程描述, + p.优先级, + p.状态, + p.发起人姓名 AS 申请人, + p.创建时间 AS 申请时间, + p.已关联计划号, + p.零件名称, + p.零件编号, + p.工序名称, + pn.节点ID, + pn.节点名称 AS 当前节点, + pn.是否转办 + FROM [dbo].[流程节点表] pn + INNER JOIN [dbo].[流程表] p ON p.流程ID = pn.流程ID + WHERE pn.状态 = N'processing' + AND p.状态 = N'processing' + AND ( + pn.审批人ID = @审批人ID + OR CHARINDEX(N',' + @审批人ID + N',', N',' + REPLACE(ISNULL(pn.审批人ID, N''), N',', N',') + N',') > 0 + ) + ORDER BY p.更新时间 DESC, p.创建时间 DESC; +END; +GO + +CREATE OR ALTER PROCEDURE [dbo].[sp_处理审批] + @流程ID INT, + @节点ID INT, + @审批人ID NVARCHAR(100), + @审批人姓名 NVARCHAR(100), + @处理结果 NVARCHAR(20), + @审批意见 NVARCHAR(MAX) = N'', + @成功 BIT = 0 +AS +BEGIN + SET NOCOUNT ON; + SET @成功 = 0; + + BEGIN TRY + BEGIN TRANSACTION; + + DECLARE @当前步骤 INT; + + SELECT @当前步骤 = 步骤序号 + FROM [dbo].[流程节点表] + WHERE 节点ID = @节点ID + AND 流程ID = @流程ID + AND 状态 = N'processing'; + + IF @当前步骤 IS NULL + BEGIN + RAISERROR(N'待处理节点不存在或已处理。', 16, 1); + END; + + INSERT INTO [dbo].[审批记录表] ( + 流程ID, + 节点ID, + 审批人ID, + 审批人姓名, + 处理结果, + 审批意见 + ) + VALUES ( + @流程ID, + @节点ID, + @审批人ID, + @审批人姓名, + @处理结果, + ISNULL(@审批意见, N'') + ); + + IF @处理结果 = N'approved' + BEGIN + UPDATE [dbo].[流程节点表] + SET 状态 = N'approved' + WHERE 流程ID = @流程ID + AND 步骤序号 = @当前步骤 + AND 状态 = N'processing'; + + UPDATE [dbo].[流程表] + SET 状态 = N'completed', + 当前节点 = N'已完成', + 更新时间 = GETDATE() + WHERE 流程ID = @流程ID; + + IF COL_LENGTH(N'dbo.流程表', N'完成人') IS NOT NULL + BEGIN + EXEC sp_executesql + N'UPDATE [dbo].[流程表] SET 完成人 = @p审批人姓名 WHERE 流程ID = @p流程ID', + N'@p审批人姓名 NVARCHAR(100), @p流程ID INT', + @p审批人姓名 = @审批人姓名, + @p流程ID = @流程ID; + END; + + IF COL_LENGTH(N'dbo.流程表', N'完成时间') IS NOT NULL + BEGIN + EXEC sp_executesql + N'UPDATE [dbo].[流程表] SET 完成时间 = GETDATE() WHERE 流程ID = @p流程ID', + N'@p流程ID INT', + @p流程ID = @流程ID; + END; + END + ELSE IF @处理结果 = N'rejected' + BEGIN + UPDATE [dbo].[流程节点表] + SET 状态 = N'rejected' + WHERE 流程ID = @流程ID + AND 步骤序号 = @当前步骤 + AND 状态 = N'processing'; + + UPDATE [dbo].[流程表] + SET 状态 = N'rejected', + 当前节点 = N'已拒绝', + 更新时间 = GETDATE() + WHERE 流程ID = @流程ID; + END + ELSE + BEGIN + UPDATE [dbo].[流程节点表] + SET 状态 = @处理结果 + WHERE 节点ID = @节点ID; + END; + + SET @成功 = 1; + COMMIT TRANSACTION; + END TRY + BEGIN CATCH + IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION; + SET @成功 = 0; + THROW; + END CATCH; + + SELECT @成功 AS 成功; +END; +GO diff --git a/db_backups/update_device_information_maintenance_20260629.sql b/db_backups/update_device_information_maintenance_20260629.sql new file mode 100644 index 0000000..4c4ba76 --- /dev/null +++ b/db_backups/update_device_information_maintenance_20260629.sql @@ -0,0 +1,190 @@ +USE [YL_MESDB] +GO + +IF COL_LENGTH(N'dbo.基础数据_设备工位点检表', N'公司编码') IS NULL + ALTER TABLE [dbo].[基础数据_设备工位点检表] ADD [公司编码] nvarchar(100) NULL +GO +IF COL_LENGTH(N'dbo.基础数据_设备工位点检表', N'设备信息') IS NULL + ALTER TABLE [dbo].[基础数据_设备工位点检表] ADD [设备信息] nvarchar(500) NULL +GO +IF COL_LENGTH(N'dbo.基础数据_设备工位点检表', N'使用部门') IS NULL + ALTER TABLE [dbo].[基础数据_设备工位点检表] ADD [使用部门] nvarchar(100) NULL +GO +IF COL_LENGTH(N'dbo.基础数据_设备工位点检表', N'入账日期') IS NULL + ALTER TABLE [dbo].[基础数据_设备工位点检表] ADD [入账日期] date NULL +GO +IF COL_LENGTH(N'dbo.基础数据_设备工位点检表', N'单位') IS NULL + ALTER TABLE [dbo].[基础数据_设备工位点检表] ADD [单位] nvarchar(50) NULL +GO +IF COL_LENGTH(N'dbo.基础数据_设备工位点检表', N'数量') IS NULL + ALTER TABLE [dbo].[基础数据_设备工位点检表] ADD [数量] decimal(18, 4) NULL +GO +IF COL_LENGTH(N'dbo.基础数据_设备工位点检表', N'状态') IS NULL + ALTER TABLE [dbo].[基础数据_设备工位点检表] ADD [状态] nvarchar(50) NULL +GO +IF COL_LENGTH(N'dbo.基础数据_设备工位点检表', N'维修记录') IS NULL + ALTER TABLE [dbo].[基础数据_设备工位点检表] ADD [维修记录] nvarchar(1000) NULL +GO +IF COL_LENGTH(N'dbo.基础数据_设备工位点检表', N'维保记录') IS NULL + ALTER TABLE [dbo].[基础数据_设备工位点检表] ADD [维保记录] nvarchar(1000) NULL +GO +IF COL_LENGTH(N'dbo.基础数据_设备工位点检表', N'工位绑定') IS NULL + ALTER TABLE [dbo].[基础数据_设备工位点检表] ADD [工位绑定] nvarchar(1000) NULL +GO +IF COL_LENGTH(N'dbo.基础数据_设备工位点检表', N'主要设备') IS NULL + ALTER TABLE [dbo].[基础数据_设备工位点检表] ADD [主要设备] nvarchar(10) NULL +GO +IF COL_LENGTH(N'dbo.基础数据_设备工位点检表', N'设备标准开机工时') IS NULL + ALTER TABLE [dbo].[基础数据_设备工位点检表] ADD [设备标准开机工时] decimal(18, 4) NULL +GO +IF COL_LENGTH(N'dbo.基础数据_设备工位点检表', N'特种设备') IS NULL + ALTER TABLE [dbo].[基础数据_设备工位点检表] ADD [特种设备] nvarchar(10) NULL +GO +IF COL_LENGTH(N'dbo.基础数据_设备工位点检表', N'证书有效期至') IS NULL + ALTER TABLE [dbo].[基础数据_设备工位点检表] ADD [证书有效期至] date NULL +GO + +ALTER PROCEDURE [dbo].[设备管理_设备信息_查询] + @设备名称_check bit = NULL, + @设备名称 nvarchar(50) = NULL, + @设备类型_check bit = NULL, + @设备类型 int = NULL +AS +BEGIN + SET NOCOUNT ON; + + SELECT + a.*, + d.[词条名称] AS [设备类型名称] + FROM [dbo].[基础数据_设备工位点检表] a + LEFT JOIN [dbo].[YL_基础表_数据字典] d ON a.[设备类型] = d.[AID] + WHERE (@设备名称_check IS NULL OR @设备名称_check = 0 OR a.[设备名称] LIKE N'%' + ISNULL(@设备名称, N'') + N'%') + AND (@设备类型_check IS NULL OR @设备类型_check = 0 OR a.[设备类型] = CONVERT(nvarchar(50), @设备类型)) + ORDER BY + CASE + WHEN a.[证书有效期至] IS NOT NULL AND a.[证书有效期至] < CONVERT(date, GETDATE()) THEN 0 + WHEN a.[证书有效期至] IS NOT NULL AND a.[证书有效期至] <= DATEADD(day, 30, CONVERT(date, GETDATE())) THEN 1 + ELSE 2 + END, + a.[证书有效期至], + a.[设备流水号] DESC; +END +GO + +ALTER PROCEDURE [dbo].[设备管理_设备信息_增加] + @公司编码 nvarchar(100) = NULL, + @设备名称 nvarchar(50) = NULL, + @设备型号 nvarchar(50) = NULL, + @设备类型 nvarchar(50) = NULL, + @设备信息 nvarchar(500) = NULL, + @使用部门 nvarchar(100) = NULL, + @入账日期 date = NULL, + @单位 nvarchar(50) = NULL, + @数量 decimal(18, 4) = NULL, + @状态 nvarchar(50) = NULL, + @维修记录 nvarchar(1000) = NULL, + @维保记录 nvarchar(1000) = NULL, + @工位绑定 nvarchar(1000) = NULL, + @主要设备 nvarchar(10) = NULL, + @设备标准开机工时 decimal(18, 4) = NULL, + @特种设备 nvarchar(10) = NULL, + @证书有效期至 date = NULL +AS +BEGIN + SET NOCOUNT ON; + + IF ISNULL(@公司编码, N'') = N'' + BEGIN + SELECT '0' AS result, N'公司编码不能为空' AS message; + RETURN; + END + + INSERT INTO [dbo].[基础数据_设备工位点检表] ( + [公司编码], + [设备名称], + [设备型号], + [设备类型], + [设备信息], + [使用部门], + [入账日期], + [单位], + [数量], + [状态], + [维修记录], + [维保记录], + [工位绑定], + [主要设备], + [设备标准开机工时], + [特种设备], + [证书有效期至] + ) + VALUES ( + @公司编码, + @设备名称, + @设备型号, + @设备类型, + @设备信息, + @使用部门, + @入账日期, + @单位, + @数量, + @状态, + @维修记录, + @维保记录, + @工位绑定, + @主要设备, + @设备标准开机工时, + @特种设备, + @证书有效期至 + ); + + SELECT '1' AS result; +END +GO + +ALTER PROCEDURE [dbo].[设备管理_设备信息_编辑] + @设备流水号 int = NULL, + @公司编码 nvarchar(100) = NULL, + @设备名称 nvarchar(50) = NULL, + @设备型号 nvarchar(50) = NULL, + @设备类型 nvarchar(50) = NULL, + @设备信息 nvarchar(500) = NULL, + @使用部门 nvarchar(100) = NULL, + @入账日期 date = NULL, + @单位 nvarchar(50) = NULL, + @数量 decimal(18, 4) = NULL, + @状态 nvarchar(50) = NULL, + @维修记录 nvarchar(1000) = NULL, + @维保记录 nvarchar(1000) = NULL, + @工位绑定 nvarchar(1000) = NULL, + @主要设备 nvarchar(10) = NULL, + @设备标准开机工时 decimal(18, 4) = NULL, + @特种设备 nvarchar(10) = NULL, + @证书有效期至 date = NULL +AS +BEGIN + SET NOCOUNT ON; + + UPDATE [dbo].[基础数据_设备工位点检表] + SET + [设备名称] = @设备名称, + [设备型号] = @设备型号, + [设备类型] = @设备类型, + [设备信息] = @设备信息, + [使用部门] = @使用部门, + [入账日期] = @入账日期, + [单位] = @单位, + [数量] = @数量, + [状态] = @状态, + [维修记录] = @维修记录, + [维保记录] = @维保记录, + [工位绑定] = @工位绑定, + [主要设备] = @主要设备, + [设备标准开机工时] = @设备标准开机工时, + [特种设备] = @特种设备, + [证书有效期至] = @证书有效期至 + WHERE [设备流水号] = @设备流水号; + + SELECT '1' AS result; +END +GO diff --git a/db_backups/update_timesheet_operator_report_qty_task_start_20260627.sql b/db_backups/update_timesheet_operator_report_qty_task_start_20260627.sql new file mode 100644 index 0000000..1f4ed64 --- /dev/null +++ b/db_backups/update_timesheet_operator_report_qty_task_start_20260627.sql @@ -0,0 +1,290 @@ +USE [YL_MESDB] +GO + +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER OFF +GO + +ALTER PROCEDURE [dbo].[工时统计_作业者工时_查询] + @合同号 NVARCHAR(50) = NULL, + @操作人 NVARCHAR(50) = NULL, + @产品编码 NVARCHAR(100) = NULL, + @工序名称 NVARCHAR(50) = NULL, + @订单号 NVARCHAR(50) = NULL, + @工时类型 NVARCHAR(50) = NULL, + @开始日期 DATE = NULL, + @结束日期 DATE = NULL +AS +BEGIN + SET NOCOUNT ON; + + ;WITH 人员班组 AS ( + SELECT + LTRIM(RTRIM(Personnel_Name)) AS Personnel_Name, + MAX(NULLIF(LTRIM(RTRIM(班组)), '')) AS 班组 + FROM [YL_MESDB].[dbo].[登录基础数据_人员信息] + WHERE Personnel_Name IS NOT NULL + GROUP BY LTRIM(RTRIM(Personnel_Name)) + ), + 工时基础 AS ( + SELECT + v.*, + ISNULL(p.班组, '未分类') AS 工时类型, + CASE + WHEN v.操作类别 IN ('报工', '辅助结束') AND ISNULL(v.加工工时, 0) > 0 THEN ISNULL(v.加工工时, 0) + WHEN v.操作类别 IN ('报工', '辅助结束') AND ISNULL(v.总时长, 0) > 0 AND ISNULL(v.加工工时, 0) = 0 THEN ISNULL(v.总时长, 0) + WHEN v.操作类别 LIKE '%加班%' AND ISNULL(v.总时长, 0) > 0 THEN ISNULL(v.总时长, 0) + WHEN v.操作类别 = '开始加工' AND ISNULL(v.总时长, 0) > 0 THEN ISNULL(v.总时长, 0) + WHEN v.操作类别 = '异常' THEN -ISNULL(v.总时长, 0) + ELSE 0 + END AS 有效工时秒 + FROM [dbo].[View_生产工时视图全部] v + LEFT JOIN 人员班组 p ON LTRIM(RTRIM(v.操作人)) = p.Personnel_Name + ), + 筛选明细 AS ( + SELECT * + FROM 工时基础 + WHERE (@开始日期 IS NULL OR @开始日期 = '' OR 开始时间 >= @开始日期) + AND (@结束日期 IS NULL OR @结束日期 = '' OR 结束时间 <= @结束日期) + AND 操作人 IS NOT NULL AND 操作人 != '' + AND (@合同号 IS NULL OR @合同号 = '' OR 订单合同号 LIKE '%' + @合同号 + '%') + AND (@操作人 IS NULL OR @操作人 = '' OR 操作人 LIKE '%' + @操作人 + '%') + AND (@产品编码 IS NULL OR @产品编码 = '' OR 产品编码 LIKE '%' + @产品编码 + '%') + AND (@工序名称 IS NULL OR @工序名称 = '' OR 工序名称 LIKE '%' + @工序名称 + '%') + AND (@订单号 IS NULL OR @订单号 = '' OR 订单号 LIKE '%' + @订单号 + '%') + AND (@工时类型 IS NULL OR @工时类型 = '' OR 工时类型 = @工时类型) + AND ISNULL(阶段标识, 0) != -1 + ), + TaskStart报工数量 AS ( + SELECT + TaskAID, + CONVERT(VARCHAR(19), 开始时间, 120) AS 开始时间, + MAX(CASE + WHEN 操作类别 NOT IN ('异常') THEN ISNULL(操作数值, 0) + WHEN 操作类别 = '异常' THEN -ISNULL(操作数值, 0) + ELSE 0 + END) AS 报工数量 + FROM [dbo].[View_生产工时视图全部] + GROUP BY TaskAID, CONVERT(VARCHAR(19), 开始时间, 120) + ), + 报工明细 AS ( + SELECT + b.操作人, + CONVERT(VARCHAR(10), b.开始时间, 120) AS 工作日期, + b.TaskAID, + b.订单合同号 AS 合同号, + b.订单号, + b.产品编码, + b.产品名称, + b.工序名称, + b.工时类型, + b.计划数量, + b.工位名称 AS 指派对象, + CASE + WHEN ISNULL(b.工位名称, '') LIKE '%装配%' THEN 0 + ELSE ISNULL(q.报工数量, CASE + WHEN b.操作类别 NOT IN ('异常') THEN ISNULL(b.操作数值, 0) + WHEN b.操作类别 = '异常' THEN -ISNULL(b.操作数值, 0) + ELSE 0 + END) + END AS 报工数量, + CONVERT(VARCHAR(19), b.开始时间, 120) AS 开始时间, + CONVERT(VARCHAR(19), b.结束时间, 120) AS 结束时间, + CAST(b.有效工时秒 / 60.0 / 60.0 AS DECIMAL(10,2)) AS 工时小时, + b.异常说明, + b.工序说明, + b.操作类别 + FROM 筛选明细 b + LEFT JOIN TaskStart报工数量 q + ON q.TaskAID = b.TaskAID + AND q.开始时间 = CONVERT(VARCHAR(19), b.开始时间, 120) + ), + 操作人报工数量 AS ( + SELECT 操作人, SUM(报工数量) AS 报工数量 + FROM ( + SELECT 操作人, TaskAID, 开始时间, MAX(报工数量) AS 报工数量 + FROM 报工明细 + WHERE TaskAID IS NOT NULL AND 开始时间 IS NOT NULL AND 开始时间 != '' + GROUP BY 操作人, TaskAID, 开始时间 + ) x + GROUP BY 操作人 + ), + 日期报工数量 AS ( + SELECT 操作人, 工作日期, SUM(报工数量) AS 报工数量 + FROM ( + SELECT 操作人, 工作日期, TaskAID, 开始时间, MAX(报工数量) AS 报工数量 + FROM 报工明细 + WHERE TaskAID IS NOT NULL AND 开始时间 IS NOT NULL AND 开始时间 != '' + GROUP BY 操作人, 工作日期, TaskAID, 开始时间 + ) x + GROUP BY 操作人, 工作日期 + ), + 操作人汇总 AS ( + SELECT + 操作人, + COUNT(*) AS 报工次数, + CAST(SUM(有效工时秒) / 60.0 / 60.0 AS DECIMAL(10,1)) AS 总工时小时 + FROM 筛选明细 + GROUP BY 操作人 + ), + 日期汇总 AS ( + SELECT + 操作人, + CONVERT(VARCHAR(10), 开始时间, 120) AS 工作日期, + COUNT(*) AS 报工次数, + CAST(SUM(有效工时秒) / 60.0 / 60.0 AS DECIMAL(10,1)) AS 工时小时 + FROM 筛选明细 + GROUP BY 操作人, CONVERT(VARCHAR(10), 开始时间, 120) + ) + SELECT + 1 AS [Level], + s.操作人 AS operator, + '' AS dateLabel, + CAST(s.报工次数 AS VARCHAR(20)) AS reportCount, + CAST(ISNULL(q.报工数量, 0) AS VARCHAR(20)) AS reportQty, + '' AS contractNo, + '' AS orderNo, + '' AS productCode, + '' AS productName, + '' AS processName, + CAST(NULL AS DECIMAL(19,6)) AS 计划数量, + '' AS 工时类型, + '' AS 指派对象, + '' AS startTime, + '' AS endTime, + '' AS 异常说明, + '' AS 工序说明, + '' AS 操作类别, + CAST(s.总工时小时 AS VARCHAR(20)) AS workHours, + '' AS TaskAID + FROM 操作人汇总 s + LEFT JOIN 操作人报工数量 q ON q.操作人 = s.操作人 + + UNION ALL + + SELECT + 2 AS [Level], + s.操作人 AS operator, + s.工作日期 AS dateLabel, + CAST(s.报工次数 AS VARCHAR(20)) AS reportCount, + CAST(ISNULL(q.报工数量, 0) AS VARCHAR(20)) AS reportQty, + '' AS contractNo, + '' AS orderNo, + '' AS productCode, + '' AS productName, + '' AS processName, + CAST(NULL AS DECIMAL(19,6)) AS 计划数量, + '' AS 工时类型, + '' AS 指派对象, + '' AS startTime, + '' AS endTime, + '' AS 异常说明, + '' AS 工序说明, + '' AS 操作类别, + CAST(s.工时小时 AS VARCHAR(20)) AS workHours, + '' AS TaskAID + FROM 日期汇总 s + LEFT JOIN 日期报工数量 q ON q.操作人 = s.操作人 AND q.工作日期 = s.工作日期 + + UNION ALL + + SELECT + 3 AS [Level], + 操作人 AS operator, + 工作日期 AS dateLabel, + '' AS reportCount, + CAST(报工数量 AS VARCHAR(20)) AS reportQty, + ISNULL(合同号, '') AS contractNo, + ISNULL(订单号, '') AS orderNo, + ISNULL(产品编码, '') AS productCode, + ISNULL(产品名称, '') AS productName, + ISNULL(工序名称, '') AS processName, + 计划数量 AS 计划数量, + ISNULL(工时类型, '') AS 工时类型, + ISNULL(指派对象, '') AS 指派对象, + ISNULL(开始时间, '') AS startTime, + ISNULL(结束时间, '') AS endTime, + ISNULL(异常说明, '') AS 异常说明, + ISNULL(工序说明, '') AS 工序说明, + ISNULL(操作类别, '') AS 操作类别, + CAST(工时小时 AS VARCHAR(20)) AS workHours, + CAST(TaskAID AS VARCHAR(50)) AS TaskAID + FROM 报工明细 + + ORDER BY operator, dateLabel, [Level], startTime +END +GO + +ALTER PROCEDURE [dbo].[工时统计_作业者工时_查询_导出] + @合同号 NVARCHAR(50) = NULL, + @操作人 NVARCHAR(50) = NULL, + @产品编码 NVARCHAR(100) = NULL, + @工序名称 NVARCHAR(50) = NULL, + @订单号 NVARCHAR(50) = NULL, + @开始日期 DATE = NULL, + @结束日期 DATE = NULL +AS +BEGIN + SET NOCOUNT ON; + + SELECT '作业者工时统计_' + REPLACE(REPLACE(REPLACE(CONVERT(NVARCHAR(19), GETDATE(), 21), ':', ''), '-', ''), ' ', '-') AS tablename, '15' AS tabletype + + SELECT 256*12 AS 操作人, 256*15 AS 工作日期, 256*20 AS 合同号, 256*12 AS 订单号, 256*40 AS 产品编码, + 256*25 AS 产品名称, 256*15 AS 工序名称, 256*12 AS 指派对象, 256*10 AS 报工数量, 256*20 AS 开始时间, 256*20 AS 结束时间, 256*12 AS '工时(h)' + + SELECT 0 AS 操作人, 0 AS 工作日期, 0 AS 合同号, 0 AS 订单号, 0 AS 产品编码, + 0 AS 产品名称, 0 AS 工序名称, 0 AS 指派对象, 0 AS 报工数量, 0 AS 开始时间, 0 AS 结束时间, 0 AS '工时(h)' + + ;WITH 筛选明细 AS ( + SELECT * + FROM [dbo].[View_生产工时视图] + WHERE (@开始日期 IS NULL OR @开始日期 = '' OR 结束时间 >= @开始日期) + AND (@结束日期 IS NULL OR @结束日期 = '' OR 开始时间 <= @结束日期) + AND 操作人 IS NOT NULL AND 操作人 != '' + AND (@合同号 IS NULL OR @合同号 = '' OR 订单合同号 LIKE '%' + @合同号 + '%') + AND (@操作人 IS NULL OR @操作人 = '' OR 操作人 LIKE '%' + @操作人 + '%') + AND (@产品编码 IS NULL OR @产品编码 = '' OR 产品编码 LIKE '%' + @产品编码 + '%') + AND (@工序名称 IS NULL OR @工序名称 = '' OR 工序名称 LIKE '%' + @工序名称 + '%') + AND (@订单号 IS NULL OR @订单号 = '' OR 订单号 LIKE '%' + @订单号 + '%') + AND ISNULL(阶段标识, 0) != -1 + ), + TaskStart报工数量 AS ( + SELECT + TaskAID, + CONVERT(VARCHAR(19), 开始时间, 120) AS 开始时间, + MAX(CASE + WHEN 操作类别 NOT IN ('异常') THEN ISNULL(操作数值, 0) + WHEN 操作类别 = '异常' THEN -ISNULL(操作数值, 0) + ELSE 0 + END) AS 报工数量 + FROM [dbo].[View_生产工时视图全部] + GROUP BY TaskAID, CONVERT(VARCHAR(19), 开始时间, 120) + ) + SELECT + b.操作人, + CONVERT(VARCHAR(10), b.开始时间, 120) AS 工作日期, + ISNULL(b.订单合同号, '') AS 合同号, + ISNULL(b.订单号, '') AS 订单号, + ISNULL(b.产品编码, '') AS 产品编码, + ISNULL(b.产品名称, '') AS 产品名称, + ISNULL(b.工序名称, '') AS 工序名称, + ISNULL(b.工位名称, '') AS 指派对象, + CAST(CASE + WHEN ISNULL(b.工位名称, '') LIKE '%装配%' THEN 0 + ELSE ISNULL(q.报工数量, CASE + WHEN b.操作类别 NOT IN ('异常') THEN ISNULL(b.操作数值, 0) + WHEN b.操作类别 = '异常' THEN -ISNULL(b.操作数值, 0) + ELSE 0 + END) + END AS VARCHAR(20)) AS 报工数量, + CONVERT(VARCHAR(19), b.开始时间, 120) AS 开始时间, + CONVERT(VARCHAR(19), b.结束时间, 120) AS 结束时间, + CAST(CAST(b.总时长 / 60.0 / 60.0 AS DECIMAL(10,2)) AS VARCHAR(20)) AS '工时(h)' + FROM 筛选明细 b + LEFT JOIN TaskStart报工数量 q + ON q.TaskAID = b.TaskAID + AND q.开始时间 = CONVERT(VARCHAR(19), b.开始时间, 120) + ORDER BY b.操作人, b.开始时间 +END +GO diff --git a/db_backups/update_workhours_query_detail_20260627.sql b/db_backups/update_workhours_query_detail_20260627.sql new file mode 100644 index 0000000..c34fdd2 --- /dev/null +++ b/db_backups/update_workhours_query_detail_20260627.sql @@ -0,0 +1,253 @@ +USE [YL_MESDB] +GO + +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO + +ALTER PROCEDURE [dbo].[生产管理_工时查询_工序工时_查询] + @合同号 NVARCHAR(50) = NULL, + @产品编码 NVARCHAR(100) = NULL, + @订单号 NVARCHAR(50) = NULL, + @开始日期 DATE = NULL, + @结束日期 DATE = NULL, + @数据条数 INT = 100 +AS +BEGIN + SET NOCOUNT ON; + + ;WITH 基础数据 AS ( + SELECT TOP (CASE WHEN ISNULL(@数据条数, 0) <= 0 THEN 100 ELSE @数据条数 END) + v.开始时间, + v.结束时间, + v.操作内容, + v.操作类别, + v.操作描述, + v.加工工时, + v.操作数值, + v.订单号, + v.订单行号, + v.订单合同号, + v.产品编码, + v.产品名称, + v.工序名称, + v.TaskAID, + v.工位名称, + CASE + WHEN ISNULL(v.操作内容, '') LIKE '%辅助%' OR ISNULL(v.操作类别, '') LIKE '%辅助%' THEN '调机' + WHEN ISNULL(v.操作内容, '') LIKE '%报工%' OR ISNULL(v.操作类别, '') LIKE '%报工%' THEN '正常' + ELSE ISNULL(NULLIF(v.操作内容, ''), v.操作类别) + END AS 报工类型, + p.标准工时 AS 工艺工时 + FROM [dbo].[View_生产工时视图] v + LEFT JOIN [dbo].[车间生产管理工艺_零件生产工艺_工艺库] p + ON v.订单号 = p.订单编号 + AND v.订单行号 = p.工艺顺序 + WHERE (@开始日期 IS NULL OR @开始日期 = '' OR v.开始时间 >= @开始日期) + AND (@结束日期 IS NULL OR @结束日期 = '' OR v.开始时间 < DATEADD(DAY, 1, @结束日期)) + AND (@合同号 IS NULL OR @合同号 = '' OR v.订单合同号 LIKE '%' + @合同号 + '%') + AND (@产品编码 IS NULL OR @产品编码 = '' OR v.产品编码 LIKE '%' + @产品编码 + '%') + AND (@订单号 IS NULL OR @订单号 = '' OR v.订单号 = @订单号) + AND (ISNULL(v.操作内容, '') IN ('报工', '辅助结束') OR ISNULL(v.操作类别, '') IN ('报工', '辅助结束')) + AND ISNULL(v.加工工时, 0) > 0 + ORDER BY v.开始时间 DESC + ), + 明细键 AS ( + SELECT DISTINCT + TaskAID, + CONVERT(VARCHAR(19), 开始时间, 120) AS 开始时间 + FROM 基础数据 + ), + TaskStart报工数量 AS ( + SELECT + TaskAID, + CONVERT(VARCHAR(19), 开始时间, 120) AS 开始时间, + MAX(CASE + WHEN 操作类别 = '异常' THEN -ISNULL(操作数值, 0) + ELSE ISNULL(操作数值, 0) + END) AS 报工数量 + FROM [dbo].[View_生产工时视图全部] + GROUP BY TaskAID, CONVERT(VARCHAR(19), 开始时间, 120) + ), + TaskStart扩展 AS ( + SELECT + k.TaskAID, + k.开始时间, + CASE + WHEN EXISTS ( + SELECT 1 + FROM [dbo].[View_生产工时视图全部] v + WHERE v.TaskAID = k.TaskAID + AND CONVERT(VARCHAR(19), v.开始时间, 120) = k.开始时间 + AND ISNULL(v.操作描述, '') LIKE '%白班%' + ) THEN '白班' + WHEN EXISTS ( + SELECT 1 + FROM [dbo].[View_生产工时视图全部] v + WHERE v.TaskAID = k.TaskAID + AND CONVERT(VARCHAR(19), v.开始时间, 120) = k.开始时间 + AND ISNULL(v.操作描述, '') LIKE '%夜班%' + ) THEN '夜班' + ELSE '' + END AS 班次, + ( + SELECT STRING_AGG(x.操作人, ',') + FROM ( + SELECT DISTINCT LTRIM(RTRIM(v2.操作人)) AS 操作人 + FROM [dbo].[View_生产工时视图全部] v2 + WHERE v2.TaskAID = k.TaskAID + AND CONVERT(VARCHAR(19), v2.开始时间, 120) = k.开始时间 + AND ISNULL(v2.加工工时, 0) <= 0 + AND NULLIF(LTRIM(RTRIM(ISNULL(v2.操作人, ''))), '') IS NOT NULL + ) x + ) AS 操作人 + FROM 明细键 k + ), + 明细数据 AS ( + SELECT + b.TaskAID, + ISNULL(b.产品名称, '') + ' ' + ISNULL(b.产品编码, '') + ' ' + ISNULL(b.工序名称, '') + ' 序' + CAST(ISNULL(b.订单行号, 0) AS VARCHAR(50)) AS 任务描述, + CONVERT(VARCHAR(10), b.开始时间, 120) AS 工作日期, + e.班次, + e.操作人, + b.订单号 AS 生产订单号, + b.报工类型, + qv.报工数量, + b.工位名称 AS 工位名称, + CAST(ISNULL(b.加工工时, 0) / 60.0 / 60.0 AS DECIMAL(10, 2)) AS 工时小时, + CAST(ISNULL(b.加工工时, 0) / 60.0 AS DECIMAL(10, 2)) AS 工时分钟, + '' AS 程序时间, + CASE + WHEN qv.报工数量 > 0 THEN CAST((ISNULL(b.加工工时, 0) / 60.0) / qv.报工数量 AS DECIMAL(10, 2)) + ELSE CAST(ISNULL(b.工艺工时, 0) AS DECIMAL(10, 2)) + END AS 单件工时, + b.工艺工时, + CONVERT(VARCHAR(19), b.开始时间, 120) AS 开始时间 + FROM 基础数据 b + LEFT JOIN TaskStart报工数量 q + ON q.TaskAID = b.TaskAID + AND q.开始时间 = CONVERT(VARCHAR(19), b.开始时间, 120) + LEFT JOIN TaskStart扩展 e + ON e.TaskAID = b.TaskAID + AND e.开始时间 = CONVERT(VARCHAR(19), b.开始时间, 120) + CROSS APPLY ( + SELECT CASE + WHEN ISNULL(b.工位名称, '') LIKE '%装配%' THEN 0 + ELSE ISNULL(q.报工数量, ISNULL(b.操作数值, 0)) + END AS 报工数量 + ) qv + ), + 去重数量 AS ( + SELECT + TaskAID, + 工作日期, + 开始时间, + MAX(报工数量) AS 报工数量 + FROM 明细数据 + GROUP BY TaskAID, 工作日期, 开始时间 + ), + Task数量汇总 AS ( + SELECT TaskAID, SUM(报工数量) AS 报工数量 + FROM 去重数量 + GROUP BY TaskAID + ), + 日期数量汇总 AS ( + SELECT TaskAID, 工作日期, SUM(报工数量) AS 报工数量 + FROM 去重数量 + GROUP BY TaskAID, 工作日期 + ), + Task汇总 AS ( + SELECT + m.TaskAID, + MAX(m.任务描述) AS 任务描述, + COUNT(*) AS 报工次数, + ISNULL(q.报工数量, 0) AS 报工数量, + SUM(m.工时小时) AS 工时小时, + SUM(m.工时分钟) AS 工时分钟, + MAX(m.工艺工时) AS 工艺工时 + FROM 明细数据 m + LEFT JOIN Task数量汇总 q ON q.TaskAID = m.TaskAID + GROUP BY m.TaskAID, q.报工数量 + ), + 日期汇总 AS ( + SELECT + m.TaskAID, + MAX(m.任务描述) AS 任务描述, + m.工作日期, + COUNT(*) AS 报工次数, + ISNULL(q.报工数量, 0) AS 报工数量, + SUM(m.工时小时) AS 工时小时, + SUM(m.工时分钟) AS 工时分钟, + MAX(m.工艺工时) AS 工艺工时 + FROM 明细数据 m + LEFT JOIN 日期数量汇总 q ON q.TaskAID = m.TaskAID AND q.工作日期 = m.工作日期 + GROUP BY m.TaskAID, m.工作日期, q.报工数量 + ) + SELECT + 1 AS [Level], + TaskAID, + 任务描述 AS taskDescription, + '' AS dateLabel, + '' AS shift, + '' AS operatorNames, + '' AS productionOrderNo, + '' AS reportType, + CAST(报工数量 AS VARCHAR(20)) AS reportQty, + '' AS station, + CAST(工时小时 AS VARCHAR(20)) AS workHours, + CAST(工时小时 AS VARCHAR(20)) AS actualWorkHours, + '' AS programTime, + CAST(CASE WHEN 报工数量 > 0 THEN 工时分钟 / 报工数量 ELSE ISNULL(工艺工时, 0) END AS VARCHAR(20)) AS pieceWorkHours, + CAST(ISNULL(工艺工时, 0) AS VARCHAR(20)) AS processWorkHours, + '' AS startTime, + CAST(报工次数 AS VARCHAR(20)) AS reportCount + FROM Task汇总 + + UNION ALL + + SELECT + 2 AS [Level], + TaskAID, + 任务描述 AS taskDescription, + 工作日期 AS dateLabel, + '' AS shift, + '' AS operatorNames, + '' AS productionOrderNo, + '' AS reportType, + CAST(报工数量 AS VARCHAR(20)) AS reportQty, + '' AS station, + CAST(工时小时 AS VARCHAR(20)) AS workHours, + CAST(工时小时 AS VARCHAR(20)) AS actualWorkHours, + '' AS programTime, + CAST(CASE WHEN 报工数量 > 0 THEN 工时分钟 / 报工数量 ELSE ISNULL(工艺工时, 0) END AS VARCHAR(20)) AS pieceWorkHours, + CAST(ISNULL(工艺工时, 0) AS VARCHAR(20)) AS processWorkHours, + '' AS startTime, + CAST(报工次数 AS VARCHAR(20)) AS reportCount + FROM 日期汇总 + + UNION ALL + + SELECT + 3 AS [Level], + TaskAID, + 任务描述 AS taskDescription, + 工作日期 AS dateLabel, + 班次 AS shift, + ISNULL(操作人, '') AS operatorNames, + ISNULL(生产订单号, '') AS productionOrderNo, + ISNULL(报工类型, '') AS reportType, + CAST(报工数量 AS VARCHAR(20)) AS reportQty, + ISNULL(工位名称, '') AS station, + CAST(工时小时 AS VARCHAR(20)) AS workHours, + CAST(工时小时 AS VARCHAR(20)) AS actualWorkHours, + 程序时间 AS programTime, + CAST(单件工时 AS VARCHAR(20)) AS pieceWorkHours, + CAST(ISNULL(工艺工时, 0) AS VARCHAR(20)) AS processWorkHours, + 开始时间 AS startTime, + '' AS reportCount + FROM 明细数据 + + ORDER BY TaskAID, dateLabel, [Level], startTime +END +GO diff --git a/db_backups/workhours_query_backups/生产管理_工时查询_工序工时_查询_before_detail_query_20260627_152142.sql b/db_backups/workhours_query_backups/生产管理_工时查询_工序工时_查询_before_detail_query_20260627_152142.sql new file mode 100644 index 0000000..c5470ae --- /dev/null +++ b/db_backups/workhours_query_backups/生产管理_工时查询_工序工时_查询_before_detail_query_20260627_152142.sql @@ -0,0 +1,238 @@ + +CREATE PROCEDURE [dbo].[生产管理_工时查询_工序工时_查询] + @合同号 NVARCHAR(50) = NULL, + @产品编码 NVARCHAR(100) = NULL, + @订单号 NVARCHAR(50) = NULL, + @开始日期 DATE = NULL, + @结束日期 DATE = NULL, + @数据条数 int = 100 +AS +BEGIN + SET NOCOUNT ON; + + -- 获取班次信息 + DECLARE @白班开始时间 TIME = '07:45:00' + DECLARE @白班结束时间 TIME = '16:30:00' + DECLARE @夜班开始时间 TIME = '16:30:00' + DECLARE @夜班结束时间 TIME = '00:40:00' + + ;WITH 基础数据 AS ( + SELECT top (@数据条数) + v.开始时间, + v.结束时间, + v.操作内容, + v.加工工时, + v.操作数值, + v.订单号, + v.订单行号, + v.订单合同号, + v.产品编码, + v.产品名称, + v.工序名称, + v.TaskAID, + v.工位名称, + -- 根据时间判断班次 + CASE + WHEN CAST(v.开始时间 AS TIME) >= @白班开始时间 + AND CAST(v.开始时间 AS TIME) < @白班结束时间 THEN '白班' + WHEN CAST(v.开始时间 AS TIME) >= @夜班开始时间 + OR CAST(v.开始时间 AS TIME) < @夜班结束时间 THEN '夜班' + ELSE '其他' + END AS 计算班次, + -- 标记实际工时和辅助工时 + CASE WHEN v.操作内容 = '报工' THEN v.加工工时 ELSE 0 END AS 实际加工工时, + CASE WHEN v.操作内容 = '辅助结束' THEN v.加工工时 ELSE 0 END AS 辅助加工工时, + -- 标记报工数量和辅助数量 + CASE WHEN v.操作内容 = '报工' THEN v.操作数值 ELSE 0 END AS 实际报工数量, + CASE WHEN v.操作内容 = '辅助结束' THEN v.操作数值 ELSE 0 END AS 辅助报工数量, + -- 关联工艺库获取标准工时(工艺工时) + p.标准工时 AS 工艺工时 + FROM View_生产工时视图 v + LEFT JOIN 车间生产管理工艺_零件生产工艺_工艺库 p + ON v.订单号 = p.订单编号 + AND v.订单行号 = p.工艺顺序 + WHERE (@开始日期 IS NULL OR @开始日期 = '' OR v.开始时间 >= @开始日期) + AND (@结束日期 IS NULL OR @结束日期 = '' OR v.结束时间 >= @结束日期) + AND (@合同号 IS NULL OR @合同号 = '' OR v.订单合同号 LIKE '%' + @合同号 + '%') + AND (@产品编码 IS NULL OR @产品编码 = '' OR v.产品编码 LIKE '%' + @产品编码 + '%') + AND (@订单号 IS NULL OR @订单号 = '' OR v.订单号 = @订单号) + -- 去掉报工时间为0的数据(实际加工工时或辅助加工工时不为0) + AND (CASE WHEN v.操作内容 = '报工' THEN v.加工工时 ELSE 0 END > 0 + OR CASE WHEN v.操作内容 = '辅助结束' THEN v.加工工时 ELSE 0 END > 0) + ), + -- 获取每个TaskAID对应的任务描述(取第一条记录) + Task描述 AS ( + SELECT DISTINCT + TaskAID, + -- 任务描述:产品名称 + 产品编码 + 工序名称 + ISNULL(产品名称, '') + ' ' + ISNULL(产品编码, '') + ' ' + ISNULL(工序名称, '') + ' 序'+ CAST(订单行号 AS VARCHAR(50)) AS 任务描述 + FROM 基础数据 + ), + -- 第一层:按TaskAID汇总 + TaskAID汇总 AS ( + SELECT + b.TaskAID, + t.任务描述, + '' AS 工作日期, + '' AS 班次, + COUNT(*) AS 报工次数, + SUM(实际报工数量) AS 实际报工数量, + SUM(辅助报工数量) AS 辅助报工数量, + CAST(SUM(实际加工工时) / 60.0 / 60.0 AS DECIMAL(10,1)) AS 实际工时小时, + CAST(SUM(辅助加工工时) / 60.0 / 60.0 AS DECIMAL(10,1)) AS 辅助工时小时, + -- 计算平均实际工时(实际加工工时/实际报工数量) + CASE + WHEN SUM(实际报工数量) > 0 + THEN CAST((SUM(实际加工工时) / 60.0 / 60.0) / SUM(实际报工数量) AS DECIMAL(10,2)) + ELSE 0 + END AS 平均实际工时, + -- 计算平均辅助工时(辅助加工工时/辅助报工数量) + CASE + WHEN SUM(辅助报工数量) > 0 + THEN CAST((SUM(辅助加工工时) / 60.0 / 60.0) / SUM(辅助报工数量) AS DECIMAL(10,2)) + ELSE 0 + END AS 平均辅助工时, + -- 工艺工时(取第一条记录的工艺工时) + MAX(b.工艺工时) AS 工艺工时 + FROM 基础数据 b + LEFT JOIN Task描述 t ON b.TaskAID = t.TaskAID + GROUP BY b.TaskAID, t.任务描述 + ), + -- 第二层:按TaskAID和日期汇总 + 日期汇总 AS ( + SELECT + b.TaskAID, + t.任务描述, + CONVERT(VARCHAR(10), b.开始时间, 120) AS 工作日期, + '' AS 班次, + COUNT(*) AS 报工次数, + SUM(实际报工数量) AS 实际报工数量, + SUM(辅助报工数量) AS 辅助报工数量, + CAST(SUM(实际加工工时) / 60.0 / 60.0 AS DECIMAL(10,1)) AS 实际工时小时, + CAST(SUM(辅助加工工时) / 60.0 / 60.0 AS DECIMAL(10,1)) AS 辅助工时小时, + -- 计算平均实际工时(实际加工工时/实际报工数量) + CASE + WHEN SUM(实际报工数量) > 0 + THEN CAST((SUM(实际加工工时) / 60.0 / 60.0) / SUM(实际报工数量) AS DECIMAL(10,2)) + ELSE 0 + END AS 平均实际工时, + -- 计算平均辅助工时(辅助加工工时/辅助报工数量) + CASE + WHEN SUM(辅助报工数量) > 0 + THEN CAST((SUM(辅助加工工时) / 60.0 / 60.0) / SUM(辅助报工数量) AS DECIMAL(10,2)) + ELSE 0 + END AS 平均辅助工时, + -- 工艺工时(取该日期第一条记录的工艺工时) + MAX(b.工艺工时) AS 工艺工时 + FROM 基础数据 b + LEFT JOIN Task描述 t ON b.TaskAID = t.TaskAID + GROUP BY b.TaskAID, t.任务描述, CONVERT(VARCHAR(10), b.开始时间, 120) + ), + -- 第三层:按TaskAID、日期和班次汇总 + 班次汇总 AS ( + SELECT + b.TaskAID, + t.任务描述, + CONVERT(VARCHAR(10), b.开始时间, 120) AS 工作日期, + b.计算班次, + b.工位名称, + COUNT(*) AS 报工次数, + SUM(实际报工数量) AS 实际报工数量, + SUM(辅助报工数量) AS 辅助报工数量, + CAST(SUM(实际加工工时) / 60.0 / 60.0 AS DECIMAL(10,1)) AS 实际工时小时, + CAST(SUM(辅助加工工时) / 60.0 / 60.0 AS DECIMAL(10,1)) AS 辅助工时小时, + -- 计算平均实际工时(实际加工工时/实际报工数量) + CASE + WHEN SUM(实际报工数量) > 0 + THEN CAST((SUM(实际加工工时) / 60.0 / 60.0) / SUM(实际报工数量) AS DECIMAL(10,2)) + ELSE 0 + END AS 平均实际工时, + -- 计算平均辅助工时(辅助加工工时/辅助报工数量) + CASE + WHEN SUM(辅助报工数量) > 0 + THEN CAST((SUM(辅助加工工时) / 60.0 / 60.0) / SUM(辅助报工数量) AS DECIMAL(10,2)) + ELSE 0 + END AS 平均辅助工时, + -- 工艺工时(取该班次第一条记录的工艺工时) + MAX(b.工艺工时) AS 工艺工时 + FROM 基础数据 b + LEFT JOIN Task描述 t ON b.TaskAID = t.TaskAID + GROUP BY b.TaskAID, t.任务描述, CONVERT(VARCHAR(10), b.开始时间, 120), b.计算班次, b.工位名称 + ) + + -- 第一层:TaskAID汇总 + SELECT + 1 AS [Level], + TaskAID, + 任务描述 AS taskDescription, + '' AS dateLabel, + '' AS shift, + '' AS 工位名称, + CAST(实际报工数量 AS VARCHAR(20)) AS reportQty, + CAST(实际工时小时 AS VARCHAR(20)) AS actualWorkHours, + CAST(辅助工时小时 AS VARCHAR(20)) AS auxiliaryWorkHours, + CAST(平均实际工时 AS VARCHAR(20)) AS avgActualWorkHours, + CAST(平均辅助工时 AS VARCHAR(20)) AS avgAuxiliaryWorkHours, + CAST(ISNULL(工艺工时, 0) AS VARCHAR(20)) AS processWorkHours, -- 工艺工时 + '' AS contractNo, + '' AS orderNo, + '' AS productCode, + '' AS productName, + '' AS processName, + CAST(报工次数 AS VARCHAR(20)) AS reportCount + FROM TaskAID汇总 + WHERE 实际工时小时 > 0 OR 辅助工时小时 > 0 + + UNION ALL + + -- 第二层:日期汇总 + SELECT + 2 AS [Level], + TaskAID, + 任务描述 AS taskDescription, + 工作日期 AS dateLabel, + '' AS shift, + '' AS 工位名称, + CAST(实际报工数量 AS VARCHAR(20)) AS reportQty, + CAST(实际工时小时 AS VARCHAR(20)) AS actualWorkHours, + CAST(辅助工时小时 AS VARCHAR(20)) AS auxiliaryWorkHours, + CAST(平均实际工时 AS VARCHAR(20)) AS avgActualWorkHours, + CAST(平均辅助工时 AS VARCHAR(20)) AS avgAuxiliaryWorkHours, + CAST(ISNULL(工艺工时, 0) AS VARCHAR(20)) AS processWorkHours, -- 工艺工时 + '' AS contractNo, + '' AS orderNo, + '' AS productCode, + '' AS productName, + '' AS processName, + CAST(报工次数 AS VARCHAR(20)) AS reportCount + FROM 日期汇总 + WHERE 实际工时小时 > 0 OR 辅助工时小时 > 0 + + UNION ALL + + -- 第三层:班次汇总 + SELECT + 3 AS [Level], + TaskAID, + 任务描述 AS taskDescription, + 工作日期 AS dateLabel, + 计算班次 AS shift, + 工位名称 AS 工位名称, + CAST(实际报工数量 AS VARCHAR(20)) AS reportQty, + CAST(实际工时小时 AS VARCHAR(20)) AS actualWorkHours, + CAST(辅助工时小时 AS VARCHAR(20)) AS auxiliaryWorkHours, + CAST(平均实际工时 AS VARCHAR(20)) AS avgActualWorkHours, + CAST(平均辅助工时 AS VARCHAR(20)) AS avgAuxiliaryWorkHours, + CAST(ISNULL(工艺工时, 0) AS VARCHAR(20)) AS processWorkHours, -- 工艺工时 + '' AS contractNo, + '' AS orderNo, + '' AS productCode, + '' AS productName, + '' AS processName, + CAST(报工次数 AS VARCHAR(20)) AS reportCount + FROM 班次汇总 + WHERE 实际工时小时 > 0 OR 辅助工时小时 > 0 + + ORDER BY TaskAID, dateLabel, shift, [Level] +END + diff --git a/doc/修改工时报表.docx b/doc/修改工时报表.docx new file mode 100644 index 0000000..e4f2272 Binary files /dev/null and b/doc/修改工时报表.docx differ diff --git a/doc/修改设备信息维护.docx b/doc/修改设备信息维护.docx new file mode 100644 index 0000000..b8156d5 Binary files /dev/null and b/doc/修改设备信息维护.docx differ diff --git a/doc/修改过程异常管控.docx b/doc/修改过程异常管控.docx new file mode 100644 index 0000000..74240ee Binary files /dev/null and b/doc/修改过程异常管控.docx differ diff --git a/doc/工时查询界面.docx b/doc/工时查询界面.docx new file mode 100644 index 0000000..cfd14dc Binary files /dev/null and b/doc/工时查询界面.docx differ diff --git a/doc/新增及时齐套跟踪结果.docx b/doc/新增及时齐套跟踪结果.docx new file mode 100644 index 0000000..c0131cc Binary files /dev/null and b/doc/新增及时齐套跟踪结果.docx differ diff --git a/doc/新增结算工时页面.docx b/doc/新增结算工时页面.docx new file mode 100644 index 0000000..0c12fb4 Binary files /dev/null and b/doc/新增结算工时页面.docx differ diff --git a/doc/设备信息.xlsx b/doc/设备信息.xlsx new file mode 100644 index 0000000..c1825ae Binary files /dev/null and b/doc/设备信息.xlsx differ diff --git a/gptlog-process/gpdlog.md b/gptlog-process/gpdlog.md new file mode 100644 index 0000000..445e992 --- /dev/null +++ b/gptlog-process/gpdlog.md @@ -0,0 +1,1167 @@ +## 2026-06-27 过程异常管控修改执行日志 + +1. 读取 `work/修改过程异常管控.docx`,解析到需求要点: + - 页面位置:`ProductionManagement/AbnormalControl/index`。 + - 原页面添加多个审批人后表现为多级审批,需要改为多选后多人同时看到任务。 + - 当前任务只要其中一个审批人同意,即完成当前任务。 + - 上传附件功能不正常,需要修改。 + - 加工中心 `ProductionManagement/MachiningCenter/index` 与装配中心 `ProductionManagement/AssemblyCenter/index` 也需要统一嵌套该业务页面。 + - 测试页面功能时不要产生业务数据。 + +2. 检查代码结构: + - 确认独立异常管控页面位于 `src/views/ProductionManagement/AbnormalControl/index.vue`。 + - 确认加工中心内复制了一份异常管控模板和方法。 + - 确认装配中心入口原本被注释,且没有完整异常管控弹窗模板。 + - 对比其他图纸上传页面,确认文件上传接口需要使用 `DataPDF.params = JSON.stringify(...)` 形式传参,当前异常管控直接传对象是上传异常的重要原因。 + +3. 前端修改: + - 新增复用组件 `src/views/ProductionManagement/components/AbnormalControlPanel.vue`,承载统一异常管控页面。 + - 将 `src/views/ProductionManagement/AbnormalControl/index.vue` 改为组件包装页,避免独立页面与中心页面逻辑分叉。 + - 在复用组件中将审批人从“添加审批人列表”改为 `el-select multiple` 多选。 + - 提交流程时将多个审批人的 ID 和姓名使用英文逗号拼接,继续通过 `审批人ID`、`审批人姓名` 参数提交,兼容原前端调用方式。 + - 修复附件上传: + - 上传前校验是否已选择附件。 + - 按项目已有接口约定传 `params` JSON。 + - 传入 `num`、`tableName=流程表`、`worker`、`uploadTime`。 + - 增加上传失败回调提示。 + - 加工中心新增统一异常管控弹窗,按钮改为打开复用组件。 + - 装配中心恢复“异常管控”按钮,并新增统一异常管控弹窗。 + - 修复加工中心旧异常管控复制代码中 `handleRowClick` 与主表行点击方法重名的问题,将旧异常管控内部行点击改名,避免覆盖主页面任务选择逻辑。 + +4. 数据库脚本: + - 新增 `db_backups/update_abnormal_control_parallel_approval_20260627.sql`。 + - 脚本包含 `sp_创建流程_简化版` 和 `sp_处理审批` 的 `CREATE OR ALTER PROCEDURE`。 + - `sp_创建流程_简化版` 支持逗号分隔的多个审批人,并拆分为同一步骤序号的多个 `processing` 节点,使多人同时看到待处理任务。 + - `sp_处理审批` 在任意审批人同意时,将同一步骤其他待处理节点同步关闭,并将流程置为 `completed`。 + - 脚本只定义存储过程,没有插入或修改业务测试数据;本次未执行该 SQL。 + +5. 文档归档: + - 新建目录 `work/ProductionManagement/WorkHoursCheck`。 + - 已将 `work/修改过程异常管控.docx` 移动到 `work/ProductionManagement/WorkHoursCheck/修改过程异常管控.docx`。 + +6. 验证: + - 执行 `npm run build`。 + - 构建成功。 + - 构建仅出现原项目资源体积较大、Browserslist 数据过期等警告。 + - 未调用流程新增、审批、上传等业务接口,因此未产生业务数据。 + +## 2026-06-27 过程异常管控复测问题处理日志 + +1. 根据用户复测反馈重新排查: + - 用户发起测试流程时选择了曹元和闫一龙两个审批人,但登录曹元账号后没有看到待处理任务。 + - 附件上传仍然不可用。 + +2. 待办不可见问题定位: + - 当前前端提交多个审批人时,会把审批人ID和审批人姓名用英文逗号拼接后传给 `sp_创建流程_简化版`。 + - 如果目标数据库仍是旧版存储过程,测试流程可能只生成一条节点记录,节点中的 `审批人ID` 是类似 `曹元ID,闫一龙ID` 的字符串。 + - 旧版 `sp_获取待处理任务` 如果按 `审批人ID = 当前登录人ID` 精确匹配,曹元登录时就匹配不到这条节点,所以待办为空。 + +3. 数据库脚本补充: + - 修改 `db_backups/update_abnormal_control_parallel_approval_20260627.sql`。 + - 在原有 `sp_创建流程_简化版`、`sp_处理审批` 基础上新增 `sp_获取待处理任务` 的 `CREATE OR ALTER PROCEDURE`。 + - 新版 `sp_获取待处理任务` 同时支持: + - 新逻辑生成的同一步骤多条待办节点。 + - 旧逻辑已生成的逗号分隔审批人ID节点。 + - 这样已发起的曹元、闫一龙测试流程,只要目标库执行该脚本,曹元账号也可以按逗号包含关系查询到待办。 + +4. 附件上传问题修改: + - 修改 `src/views/ProductionManagement/components/AbnormalControlPanel.vue`。 + - 上传按钮改为只选择附件并记录待上传数量,不再在流程创建前直接上传。 + - 流程创建成功并拿到 `新流程ID` 后,再自动调用上传接口。 + - 上传参数改为使用真实流程ID:`num = 新流程ID`、`tableName = 流程表`、`worker = 当前用户`、`uploadTime = 当前时间`。 + - 使用 `this.$set(this.DataPDF, 'params', JSON.stringify(...))` 设置上传参数,保持与项目已有上传页面的参数传递方式一致。 + - 多附件上传按成功回调计数,全部上传完成后清空文件列表和待上传数量。 + - 取消附件弹窗时清空已选择附件,避免误带入下次流程。 + - 提交流程成功后刷新“我发起的”和“待我处理”列表。 + +5. 验证: + - 修改后执行 `npm run build`。 + - 构建成功。 + - 构建仅有项目原有资源体积过大、Browserslist/baseline-browser-mapping 数据过期警告。 + - 本次没有调用流程新增、审批、附件上传等业务接口,没有执行数据库脚本,因此未产生业务数据。 + +6. 仍需执行的外部动作: + - 当前仓库没有可直接、安全执行数据库 DDL 的连接串或发布脚本入口。 + - 前端修改已经完成,但曹元待办不可见的问题依赖目标数据库存储过程更新。 + - 需要在目标 SQL Server 数据库执行 `db_backups/update_abnormal_control_parallel_approval_20260627.sql`,否则服务器仍会按旧存储过程逻辑查询,已发起的测试流程仍可能查不到。 + +## 2026-06-27 过程异常管控附件功能临时移除日志 + +1. 根据用户反馈重新调整: + - 用户确认附件功能仍然不好用,要求暂时去掉附件功能。 + - 本次目标改为移除过程异常管控页面中的附件入口和上传调用,避免影响流程发起。 + +2. 修改复用组件: + - 修改 `src/views/ProductionManagement/components/AbnormalControlPanel.vue`。 + - 删除发起流程表单中的“上传附件”表单项和“点击上传”按钮。 + - 删除上传附件弹窗。 + - 删除 `MESUploadFile` 引入。 + - 删除 `DataPDF`、`uploadPDF`、`pendingUploadCount`、`uploadFileTotal`、`uploadFileSuccess`、`uploadingAttachment` 等附件状态。 + - 删除 `uploadSuccessPDF`、`uploadErrorPDF`、`uploadShowPDF`、`submitPicturePDF`、`cancelAttachmentUpload`、`clearPendingAttachments`、`uploadPendingAttachments` 等附件相关方法。 + - 删除流程创建成功后的附件上传调用,成功提示恢复为只提示流程创建成功。 + - 删除无用的 `.attachment-tip` 样式。 + +3. 清理加工中心旧残留: + - 修改 `src/views/ProductionManagement/MachiningCenter/index.vue`。 + - 删除旧异常管控模板里残留的“上传附件”按钮。 + - 删除旧代码中已经注释的上传弹窗块。 + - 删除旧异常管控方法里的 `uploadShowPDF` 和 `submitPicturePDF`。 + - 删除旧数据中的 `imgDialogFormVisible`。 + +4. 搜索确认: + - 对 `src/views/ProductionManagement/components/AbnormalControlPanel.vue`、`AbnormalControl/index.vue`、`MachiningCenter/index.vue`、`AssemblyCenter/index.vue` 执行搜索。 + - 未再发现 `上传附件`、`MESUploadFile`、`uploadPDF`、`DataPDF`、`submitPicturePDF`、`uploadShowPDF`、`attachment-tip`、`附件开始上传` 等附件入口或上传调用残留。 + +5. 验证: + - 执行 `npm run build`。 + - 构建成功。 + - 构建仅有项目原有资源体积过大、Browserslist/baseline-browser-mapping 数据过期警告。 + - 本次未调用流程新增、审批、附件上传等业务接口,未产生业务数据。 + +## 2026-06-27 过程异常管控页签刷新处理日志 + +1. 根据用户反馈重新调整: + - 用户要求异常管控里面三个页签点击时需要刷新数据。 + - 涉及页签包括:`待我处理`、`我发起的`、`已完成`。 + +2. 检查当前实现: + - 当前 `el-tabs` 只通过 `v-model="activeTab"` 切换页签,没有绑定页签点击事件。 + - 顶部三个统计卡片点击时也只是修改 `activeTab`,没有重新请求数据。 + - `searchTable` 和 `searchTable1` 在接口返回空数组时不会覆盖原列表,可能导致刷新后仍显示上一次的数据。 + - 绑定任务查询 `searchTable3` 也存在接口返回空数组时保留旧列表的问题。 + +3. 前端修改: + - 修改 `src/views/ProductionManagement/components/AbnormalControlPanel.vue`。 + - 给 `el-tabs` 增加 `@tab-click="handleTabClick"`。 + - 新增 `handleTabClick(tab)` 方法,根据当前页签名称刷新对应数据。 + - 新增 `switchTab(tabName)` 方法,统计卡片点击时先切换页签,再刷新对应数据。 + - 新增 `refreshActiveTab(tabName)` 方法,统一调度三个页签的数据刷新: + - `pending` 调用 `searchTable1()` 刷新待我处理。 + - `initiated` 调用 `searchTable()` 刷新我发起的。 + - `processed` 调用 `getProcessedTasks()` 刷新已完成。 + +4. 数据覆盖修正: + - `getProcessedTasks()` 改为始终用 `response.data || []` 覆盖 `processedTasks`,并同步更新统计数量。 + - `searchTable()` 改为始终用 `response.data || []` 覆盖 `initiatedProcesses`,并同步更新统计数量。 + - `searchTable1()` 改为始终用 `response.data || []` 覆盖 `pendingTasks`,并同步更新统计数量。 + - `searchTable3()` 改为始终用 `response.data || []` 覆盖 `tableData5`,避免绑定任务查询为空时残留旧数据。 + +5. 验证: + - 执行 `npm run build`。 + - 构建成功。 + - 构建仅有项目原有资源体积过大、Browserslist/baseline-browser-mapping 数据过期警告。 + - 本次未调用流程新增、审批等业务接口,未产生业务数据。 + +## 2026-06-27 加工中心和装配中心异常管控集成问题处理日志 + +1. 根据用户反馈重新排查: + - 加工中心和装配中心打开异常管控后,新建流程时原本应自动带入的生产任务信息没有了。 + - 在异常管控中新建流程或处理任务时,弹出的二级弹框被黑色遮罩挡住,无法操作。 + +2. 自动带入问题定位: + - 加工中心、装配中心当前主表选中行保存在各自页面的 `selectedRow`。 + - 异常管控已经改成复用组件后,父页面没有把主表 `selectedRow` 传给复用组件。 + - 复用组件内部只知道自己弹窗里的绑定任务列表点击结果,因此从中心页进入时不会自动显示当前生产订单、物料、工序等信息。 + +3. 自动带入修复: + - 修改 `src/views/ProductionManagement/components/AbnormalControlPanel.vue`。 + - 新增 `initialSelectedRow` 入参。 + - 在组件创建和 `initialSelectedRow` 变化时调用 `applyInitialSelectedRow()`。 + - `applyInitialSelectedRow()` 会把外部传入的主表选中行交给 `handleRowClick()` 统一映射。 + - `handleRowClick()` 兼容多种字段名: + - 生产订单:`订单号`、`计划号`、`生产订单`。 + - 物料编码:`产品编码`、`零件编码`、`物料编码`。 + - 物料名称:`产品名称`、`零件名称`、`物料名称`。 + - 工序名称:`工序名称`。 + - 同步把外部带入的信息写入异常管控的查询条件,方便打开后看到当前任务上下文。 + - 新建流程校验从 `selectedRow == ""` 调整为 `!selectedRow`,兼容对象/null 两类状态。 + +4. 父页面传值修复: + - 修改 `src/views/ProductionManagement/MachiningCenter/index.vue`。 + - 修改 `src/views/ProductionManagement/AssemblyCenter/index.vue`。 + - 两个中心页的异常管控弹窗中,将组件调用改为 ``。 + +5. 遮罩问题修复: + - 复用组件内部所有二级弹窗增加 `:append-to-body="true"`: + - 发起新流程弹窗。 + - 处理任务弹窗。 + - 流程进度详情弹窗。 + - 转办流程弹窗。 + - 完结流程弹窗。 + - 加工中心和装配中心的外层异常管控弹窗增加 `append-to-body`,降低与页面其他弹窗层级冲突的风险。 + +6. 验证: + - 执行 `npm run build`。 + - 构建成功。 + - 构建仅有项目原有资源体积过大、Browserslist/baseline-browser-mapping 数据过期警告。 + - 本次未调用流程新增、审批等业务接口,未产生业务数据。 + +## 2026-06-27 修改工时报表执行日志 + +1. 查找并读取需求文档: + - 用户提到 `worke`,实际仓库中没有 `worke` 目录。 + - 在 `work` 目录下找到 `work/修改工时报表.docx`。 + - 读取 docx 内容,确认需求: + - 页面位置:`ProductionManagement/Timesheet`。 + - 页面中四个分页:`项目工时`、`作业者工时`、`任务工时`、`设备工时`。 + - 四个分页里面的明细信息都要按照开始时间排序。 + +2. 定位代码: + - 页面文件为 `src/views/ProductionManagement/Timesheet/index.vue`。 + - 四个分页对应数据: + - `项目工时` 使用 `projectTableData`,由 `loadProjectData()` 调用 `工时统计_项目工时_查询` 后通过 `buildProjectTree()` 组装。 + - `作业者工时` 使用 `operatorTableData`,由 `loadOperatorData()` 调用 `工时统计_作业者工时_查询` 后通过 `buildOperatorTree()` 组装。 + - `任务工时` 使用 `taskTableData`,由 `loadTaskData()` 调用 `工时统计_任务工时_查询` 后通过 `buildTaskTree()` 组装。 + - `设备工时` 使用 `DeviceTableData`,由 `loadDeviceData()` 调用 `工时统计_设备工时_查询` 后复用 `buildOperatorTree()` 组装。 + +3. 代码修改: + - 修改 `src/views/ProductionManagement/Timesheet/index.vue`。 + - 新增 `getStartTimeValue(row)`: + - 兼容 `startTime`、`planStart`、`开始时间`、`dateLabel` 字段。 + - 将时间字符串转换为可比较的时间戳。 + - 空值或无效时间排到最后。 + - 新增 `getEarliestStartTime(row)`: + - 对树形节点递归取子级最早开始时间。 + - 用于父级分组排序,保证父级分组顺序跟其明细开始时间一致。 + - 新增 `sortRowsByStartTime(rows)`: + - 递归排序每一层 `children`。 + - 每个分组下的明细按照开始时间升序排列。 + - 父级分组按照子级最早开始时间升序排列。 + - 在 `buildProjectTree()` 返回前调用 `sortRowsByStartTime()`,覆盖项目工时分页。 + - 在 `buildOperatorTree()` 返回前调用 `sortRowsByStartTime()`,覆盖作业者工时和设备工时分页。 + - 在 `buildTaskTree()` 返回前调用 `sortRowsByStartTime()`,覆盖任务工时分页。 + +4. 文档归档: + - 新建目录 `work/ProductionManagement/Timesheet`。 + - 已将 `work/修改工时报表.docx` 移动到 `work/ProductionManagement/Timesheet/修改工时报表.docx`。 + +5. 验证: + - 执行 `npm run build`。 + - 构建成功。 + - 构建仅有项目原有资源体积过大、Browserslist/baseline-browser-mapping 数据过期警告。 + - 本次只修改前端排序和移动文档,未调用业务接口,未产生业务数据。 + +## 2026-06-27 13:42:30 作业者工时报工数量按 TaskAID+开始时间取最大值 + +### 用户需求 +- 修改工时报表中“作业者工时”的“报工数量”取值口径。 +- 新口径:同一个 TaskAID 且开始时间相同的记录,报工数量取最大值;不再叠加其他分组条件。 +- 用户提供目标数据库连接信息,本次执行中使用目标库 192.168.2.92 / YL_MESDB,日志中不记录数据库密码。 + +### 执行过程 +1. 检查工作目录 C:\WorkYuanLy\MES_Manage_View_V20,确认工时报表文档已在 work/ProductionManagement/Timesheet/修改工时报表.docx。 +2. 检查前端文件 src/views/ProductionManagement/Timesheet/index.vue,确认“作业者工时”和“设备工时”共用 uildOperatorTree,因此修改时增加开关参数,只让作业者工时启用新口径,避免影响设备工时。 +3. 连接数据库 192.168.2.92 的 YL_MESDB,确认: + - dbo.View_生产工时视图 包含 TaskAID、开始时间、操作数值、操作人、阶段标识 字段。 + - dbo.View_生产工时视图全部 包含 TaskAID、开始时间、操作数值、操作人、阶段标识 字段。 + - dbo.工时统计_作业者工时_查询 存储过程存在。 +4. 在修改数据库过程前,备份目标库当前过程定义: + - db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_before_taskstart_reportqty_20260627_133625.sql + - db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_导出_before_taskstart_reportqty_20260627_133625.sql +5. 修改前端 src/views/ProductionManagement/Timesheet/index.vue: + - 增加 parseReportQty、 ormatReportQty、getTaskAID、getReportQtyGroupKey、uildTaskStartReportQtyMap、getTaskStartReportQty、 ecalculateOperatorReportQty。 + - loadOperatorData 调用 uildOperatorTree(res.data || [], true),启用作业者工时的新报工数量口径。 + - uildOperatorTree 增加 useTaskStartMaxReportQty 参数;明细行保留 TaskAID 和内部用的 eportQtyGroupKey。 + - 作业者工时的日期汇总和操作人汇总按唯一 TaskAID + startTime 取最大值后再求和,避免同一任务同一开始时间的重复行重复累加。 + - 设备工时继续调用 uildOperatorTree(res.data || []),不启用新口径。 +6. 新增数据库脚本 db_backups/update_timesheet_operator_report_qty_task_start_20260627.sql: + - 更新 dbo.工时统计_作业者工时_查询。 + - 更新 dbo.工时统计_作业者工时_查询_导出。 + - 两个过程均通过 TaskStart报工数量 按 TaskAID + CONVERT(VARCHAR(19), 开始时间, 120) 分组取最大报工数量。 + - 查询过程结果集中增加 TaskAID 字段供前端兜底计算使用。 + - 导出过程同步使用新口径,但不新增导出显示列,避免改变导出表头结构。 +7. 执行数据库脚本到目标库;本次数据库操作只执行 ALTER PROCEDURE,未写入或修改业务表数据。 +8. 使用 sys.sp_describe_first_result_set 验证 dbo.工时统计_作业者工时_查询 的结果集,确认包含 TaskAID 字段,位于结果列第 20 列。 +9. 验证数据库过程定义中查询和导出都包含 GROUP BY TaskAID, CONVERT(VARCHAR(19), 开始时间, 120),确认已按新口径分组。 +10. 执行 +pm run build,构建成功。构建输出仍有既有资源体积过大和 Browserslist 数据过期警告,本次修改未引入编译错误。 + +### 修改结果 +- 作业者工时页面“报工数量”现在按照同一 TaskAID、同一开始时间取最大值。 +- 作业者工时的操作人汇总、日期汇总、明细显示和导出过程均同步使用该口径。 +- 设备工时未被新口径影响。 +- 已保留数据库更新前备份和本次更新脚本。 + +### 验证结果 +- 数据库连接和字段确认:通过。 +- 存储过程更新:通过。 +- 查询结果集 TaskAID 字段确认:通过。 +- 前端生产构建 +pm run build:通过,仅有既有警告。 + +## 2026-06-27 14:13:28 修正作业者工时报工数量为全量视图取最大值 + +### 用户反馈 +- 上一次实现不符合要求。 +- 正确口径:直接查询 [View_生产工时视图全部],同一个 TaskAID、同一个开始时间取最大报工数量,不经过任何过滤条件。 + +### 执行过程 +1. 明确修正范围:报表显示行仍由原查询条件决定,但“报工数量最大值”的来源必须改为全量 [dbo].[View_生产工时视图全部],不能从筛选后的数据集计算。 +2. 修改脚本 db_backups/update_timesheet_operator_report_qty_task_start_20260627.sql: + - dbo.工时统计_作业者工时_查询 中的 TaskStart报工数量 CTE 从 FROM 筛选明细 改为 FROM [dbo].[View_生产工时视图全部]。 + - dbo.工时统计_作业者工时_查询_导出 中的 TaskStart报工数量 CTE 同步改为 FROM [dbo].[View_生产工时视图全部]。 + - 两处最大值计算均只按 TaskAID, CONVERT(VARCHAR(19), 开始时间, 120) 分组,不增加日期、操作人、合同号、产品、工序、订单、阶段标识等过滤条件。 +3. 在重新应用数据库脚本前,再次备份目标库当前过程定义: + - db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_before_unfiltered_taskstart_reportqty_20260627_141106.sql + - db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_导出_before_unfiltered_taskstart_reportqty_20260627_141106.sql +4. 重新连接目标库 192.168.2.92 / YL_MESDB,执行修正后的 SQL 脚本,只更新两个存储过程定义,未修改业务表数据。 +5. 第一次使用 LIKE 验证时因匹配范围过大产生误判,随后改为提取 TaskStart报工数量 CTE 片段进行验证。 +6. 验证结果: + - dbo.工时统计_作业者工时_查询 的 TaskStart报工数量 CTE 来源为 FROM [dbo].[View_生产工时视图全部],不包含 筛选明细。 + - dbo.工时统计_作业者工时_查询_导出 的 TaskStart报工数量 CTE 来源为 FROM [dbo].[View_生产工时视图全部],不包含 筛选明细。 + - 两个过程均按 GROUP BY TaskAID, CONVERT(VARCHAR(19), 开始时间, 120) 分组取最大值。 +7. 执行 +pm run build,前端构建通过。输出仍有既有资源体积过大和 Browserslist 数据过期警告,本次修正未引入编译错误。 + +### 修改结果 +- 作业者工时查询和导出过程的报工数量最大值来源已改为全量 [dbo].[View_生产工时视图全部]。 +- 最大值计算不再经过报表查询条件过滤。 +- 本地脚本和目标库过程已同步。 + +### 验证结果 +- 目标库脚本应用:通过。 +- CTE 来源验证:通过。 +- 前端生产构建 +pm run build:通过,仅有既有警告。 + +## 2026-06-27 14:48:37 修正作业者工时报工数量最大值增加操作类别编号过滤 + +### 用户反馈 +- 报工数量最大值仍需直接查 [View_生产工时视图全部]。 +- 同一个 TaskAID、同一个开始时间取最大值。 +- 需要增加过滤条件:操作类别编号 = 6。 + +### 执行过程 +1. 连接目标库 192.168.2.92 / YL_MESDB,确认 [dbo].[View_生产工时视图全部] 存在以下字段: + - TaskAID + - 开始时间 + - 操作数值 + - 操作类别编号 +2. 修改本地数据库脚本 db_backups/update_timesheet_operator_report_qty_task_start_20260627.sql: + - 在 dbo.工时统计_作业者工时_查询 的 TaskStart报工数量 CTE 中增加 WHERE 操作类别编号 = 6。 + - 在 dbo.工时统计_作业者工时_查询_导出 的 TaskStart报工数量 CTE 中同步增加 WHERE 操作类别编号 = 6。 + - 最大值来源仍为 FROM [dbo].[View_生产工时视图全部],不是筛选后的报表数据。 + - 分组仍只使用 TaskAID, CONVERT(VARCHAR(19), 开始时间, 120)。 +3. 在重新应用数据库脚本前,备份目标库当前过程定义: + - db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_before_taskstart_reportqty_type6_20260627_144642.sql + - db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_导出_before_taskstart_reportqty_type6_20260627_144642.sql +4. 重新执行 SQL 脚本到目标库,只执行 ALTER PROCEDURE,未修改业务表数据。 +5. 提取两个过程的 TaskStart报工数量 CTE 进行验证,结果如下: + - dbo.工时统计_作业者工时_查询:来源为 [dbo].[View_生产工时视图全部],包含 WHERE 操作类别编号 = 6,不包含 筛选明细。 + - dbo.工时统计_作业者工时_查询_导出:来源为 [dbo].[View_生产工时视图全部],包含 WHERE 操作类别编号 = 6,不包含 筛选明细。 +6. 执行 +pm run build,前端构建通过。输出仍有既有资源体积过大和 Browserslist 数据过期警告,本次调整未引入编译错误。 + +### 修改结果 +- 作业者工时查询和导出的报工数量最大值口径已更新为: + - 直接从 [dbo].[View_生产工时视图全部] 取数; + - 只取 操作类别编号 = 6 的记录; + - 同一 TaskAID、同一开始时间取最大 操作数值 口径后的报工数量; + - 不使用报表查询条件过滤最大值来源。 + +### 验证结果 +- 字段确认:通过。 +- 目标库过程更新:通过。 +- CTE 来源和条件验证:通过。 +- 前端生产构建 +pm run build:通过,仅有既有警告。 + +## 2026-06-27 15:02:19 修正作业者工时报工数量撤销操作类别过滤并增加装配置零 + +### 用户反馈 +- 之前增加 操作类别编号 = 6 不符合要求。 +- 正确口径:直接查 [View_生产工时视图全部],同一个 TaskAID、同一个开始时间取最大值,最大值来源没有任何过滤条件。 +- 另增判断:指派对象包含“装配”时,报工数量为 0。 + +### 执行过程 +1. 重新确认需求后,修正本地 SQL 脚本 db_backups/update_timesheet_operator_report_qty_task_start_20260627.sql。 +2. 从 dbo.工时统计_作业者工时_查询 的 TaskStart报工数量 CTE 中移除 WHERE 操作类别编号 = 6。 +3. 从 dbo.工时统计_作业者工时_查询_导出 的 TaskStart报工数量 CTE 中移除 WHERE 操作类别编号 = 6。 +4. 保留最大值来源为全量 [dbo].[View_生产工时视图全部],并只按 TaskAID, CONVERT(VARCHAR(19), 开始时间, 120) 分组。 +5. 在查询过程 报工明细 中增加判断:WHEN ISNULL(b.工位名称, '') LIKE '%装配%' THEN 0,否则使用全量视图按 TaskAID+开始时间取到的最大报工数量。 +6. 在导出过程的明细查询中同步增加同样的装配置零判断,保持页面和导出口径一致。 +7. 检查本地脚本,确认没有残留 操作类别编号 = 6,并确认查询和导出两处均包含装配置零判断。 +8. 在重新应用数据库脚本前,备份目标库当前过程定义: + - db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_before_assembly_zero_reportqty_20260627_145839.sql + - db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_导出_before_assembly_zero_reportqty_20260627_145839.sql +9. 重新执行 SQL 脚本到目标库 192.168.2.92 / YL_MESDB,只执行 ALTER PROCEDURE,未修改业务表数据。 +10. 数据库验证: + - dbo.工时统计_作业者工时_查询 的 TaskStart报工数量 CTE 来源为 [dbo].[View_生产工时视图全部],无 WHERE,不包含 操作类别编号,包含装配置零判断。 + - dbo.工时统计_作业者工时_查询_导出 的 TaskStart报工数量 CTE 来源为 [dbo].[View_生产工时视图全部],无 WHERE,不包含 操作类别编号,包含装配置零判断。 +11. 同步修改前端兜底逻辑 src/views/ProductionManagement/Timesheet/index.vue: + - 增加 isAssemblyAssignee 方法,识别 指派对象/工位名称/assignee 是否包含“装配”。 + - 在 getTaskStartReportQty 中,如果为装配指派对象,直接返回 ,避免前端按同一 TaskAID+开始时间重算时把非装配最大值覆盖到装配行。 +12. 执行 +pm run build,前端构建通过。输出仍有既有资源体积过大和 Browserslist 数据过期警告,本次修正未引入编译错误。 + +### 修改结果 +- 作业者工时查询和导出的最大值来源恢复为全量 [dbo].[View_生产工时视图全部],没有任何过滤条件。 +- 最大值分组键仍为 TaskAID + 开始时间。 +- 指派对象包含“装配”时,页面、汇总和导出报工数量均置为 0。 +- 前端兜底逻辑已同步,避免页面端重算覆盖数据库装配置零规则。 + +### 验证结果 +- SQL 脚本检查:通过。 +- 目标库过程更新:通过。 +- CTE 无过滤和装配置零判断验证:通过。 +- 前端生产构建 +pm run build:通过,仅有既有警告。 + +## 2026-06-27 15:26:30 根据工时查询界面文档修改工时查询页面 + +### 用户需求 +- 根据 work 下的 工时查询界面.docx 修改工时查询页面。 +- 修改后创建对应路径并把文档移入。 +- 按要求追加中文执行日志,不记录数据库密码。 + +### 文档内容提取 +- 文档名称:work/工时查询界面.docx。 +- 文档要求: + - 修改三级数据,由原三级汇总改成三级明细数据。 + - 页面字段按截图展示:任务描述、日期、班次、生产订单号、报工类型、报工数量、工位、工时、程序时间、单件工时、工艺工时等。 + - 报工类型字段:辅助 改成 调机,报工 改成 正常。 + - 报工数量:相同 TaskAID、相同开始时间取最大值。 + - 指派对象包含“装配”时,报工数量为 0。 + - 程序时间没有,暂时为空。 + - 单件工时按 工时(分钟)/报工数量 计算;报工数量为 0 时取工艺工时。 + - 工艺工时维持原样。 + - 增加字段“操作人”,取相同 TaskAID、相同开始时间的操作人拼接,且去掉加工工时大于 0 的数据。 + - 白班/夜班根据操作描述包含“白班”或“夜班”判断。 + +### 执行过程 +1. 查找并读取文档,确认文档路径为 work/工时查询界面.docx,并提取文档正文和截图。 +2. 定位工时查询页面为 src/views/ProductionManagement/Workhours/index.vue,当前调用存储过程 生产管理_工时查询_工序工时_查询。 +3. 连接目标库 192.168.2.92 / YL_MESDB,读取当前 dbo.生产管理_工时查询_工序工时_查询 定义,确认旧过程的三级数据为按 TaskAID、日期、班次汇总。 +4. 查询数据库字段,确认 [dbo].[View_生产工时视图] 和 [dbo].[View_生产工时视图全部] 存在 TaskAID、开始时间、结束时间、操作内容、操作类别、操作描述、操作人、加工工时、操作数值、订单号、订单行号、订单合同号、产品编码、产品名称、工序名称、工位名称 等字段。 +5. 新增数据库脚本 db_backups/update_workhours_query_detail_20260627.sql: + - 更新 dbo.生产管理_工时查询_工序工时_查询。 + - 基础数据仍按页面查询条件取报工/辅助结束且加工工时大于 0 的记录。 + - TaskStart报工数量 从 [dbo].[View_生产工时视图全部] 按 TaskAID + 开始时间 全量取最大值。 + - 指派对象/工位名称包含“装配”时,报工数量置 0。 + - 三级返回明细数据,不再返回班次汇总。 + - 操作人使用相同 TaskAID + 开始时间 且 加工工时 <= 0 的记录去重拼接。 + - 班次根据相同 TaskAID + 开始时间 的操作描述是否包含“白班”或“夜班”判断。 + - 程序时间返回空。 + - 单件工时按加工工时分钟/报工数量计算;报工数量为 0 时取工艺工时。 +6. 备份目标库旧过程到 db_backups/workhours_query_backups/生产管理_工时查询_工序工时_查询_before_detail_query_20260627_152142.sql。 +7. 第一次应用后用样本执行发现 XML 拼接操作人受 QUOTED_IDENTIFIER 设置影响,因此将脚本改为 SET QUOTED_IDENTIFIER ON,并把操作人拼接改成 SQL Server 2019 支持的 STRING_AGG。 +8. 重新执行脚本到目标库,只更新存储过程定义,未修改业务表数据。 +9. 执行 EXEC dbo.[生产管理_工时查询_工序工时_查询] @数据条数 = 5 验证,返回 15 行,三级明细包含 operatorNames、productionOrderNo、 eportType、 eportQty、station、workHours、pieceWorkHours、processWorkHours 等字段。 +10. 修改前端 src/views/ProductionManagement/Workhours/index.vue: + - 表格列调整为文档要求的工时记录结构。 + - 增加操作人、生产订单号、报工类型、工位、工时、程序时间、单件工时等列。 + - 报工类型前端兜底映射:包含“辅助”显示“调机”,包含“报工”显示“正常”。 + - 第三级树节点改为明细行展示,不再按班次汇总展示。 + - 底部汇总改为总工时。 +11. 创建目录 work/ProductionManagement/Workhours,并将 work/工时查询界面.docx 移动到 work/ProductionManagement/Workhours/工时查询界面.docx。 +12. 清理文档截图临时解压目录 work/.docx_extract_工时查询界面。 +13. 执行 +pm run build,前端构建通过。输出仍有既有资源体积过大和 Browserslist 数据过期警告,本次修改未引入编译错误。 + +### 修改结果 +- 工时查询页面已按文档改成工时记录形式。 +- 三级数据已由班次汇总改为明细数据。 +- 数据库过程和前端页面字段已同步。 +- 文档已移动到 work/ProductionManagement/Workhours/工时查询界面.docx。 + +### 验证结果 +- 存储过程脚本应用:通过。 +- 存储过程样本执行:通过。 +- 前端生产构建 +pm run build:通过,仅有既有警告。 + +## 2026-06-27 16:34:11 根据新增结算工时页面文档新增结算工时页面 + +### 用户需求 +- 根据 work 下的 新增结算工时页面.docx 新增结算工时页面。 +- 修改后创建对应路径并把文档移入。 +- 按要求追加中文执行日志,不记录数据库密码。 + +### 文档内容提取 +- 文档名称:work/新增结算工时页面.docx。 +- 文档要求: + - 新增结算工时页面,任务描述参考工时查询页面。 + - 根据订单编号(生产订单号)和工位(指派对象)分组。 + - 统计设备工时,条件为加工工时 > 0。 + - 报工工时:上述设备工时中操作类别等于报工的工时。 + - 主辅工时:上述设备工时中操作类别等于辅助结束的工时。 + - 完成数分为报工完成数和辅助完成数,对应上述工时记录的操作数值求和。 + - 增加操作人字段:相同 TaskAID、相同开始时间的操作人拼接,且去掉加工工时大于 0 的数据。 + +### 执行过程 +1. 查找并读取文档,确认路径为 work/新增结算工时页面.docx。 +2. 检查现有生产管理页面和路由机制,确认前端使用动态菜单路径加载 src/views 下组件;新增页面放置在 src/views/ProductionManagement/SettlementWorkhours/index.vue。 +3. 新增数据库脚本 db_backups/create_settlement_workhours_query_20260627.sql: + - 创建/更新 dbo.生产管理_结算工时_查询。 + - 基础数据来源为 [dbo].[View_生产工时视图]。 + - 查询条件包含合同号、产品编码、订单号、工位、开始日期、结束日期、数据条数。 + - 只统计 加工工时 > 0 且操作内容/操作类别为 报工 或 辅助结束 的设备工时。 + - 汇总层按 订单号 + 工位名称 分组。 + - 报工工时 为报工记录加工工时小时汇总。 + - 主辅工时 为辅助结束记录加工工时小时汇总。 + - 报工完成数、辅助完成数 分别按对应操作类型的 操作数值 汇总。 + - 明细层返回操作人、日期、工序、操作类别、完成数、工时、开始/结束时间、TaskAID。 + - 操作人使用 [dbo].[View_生产工时视图全部] 中相同 TaskAID + 开始时间 且 加工工时 <= 0 的记录去重后用 STRING_AGG 拼接。 +4. 执行数据库脚本到目标库 192.168.2.92 / YL_MESDB,只创建/更新存储过程,未修改业务表数据。 +5. 执行样本验证 EXEC dbo.[生产管理_结算工时_查询] @数据条数 = 10,返回 18 行,包含汇总层和明细层数据。 +6. 新增前端页面 src/views/ProductionManagement/SettlementWorkhours/index.vue: + - 提供合同号、产品编码、生产订单号、工位、数据条数、开始/结束日期查询条件。 + - 调用 生产管理_结算工时_查询。 + - 使用树形表格展示订单+工位汇总,展开查看明细。 + - 汇总列包含报工工时、主辅工时、报工完成数、辅助完成数、合计工时。 + - 明细列包含操作人、日期、工序名称、操作类别、完成数、工时、开始时间、结束时间。 + - 底部显示报工工时、主辅工时、合计工时汇总。 +7. 创建目录 work/ProductionManagement/SettlementWorkhours,并将 work/新增结算工时页面.docx 移动到 work/ProductionManagement/SettlementWorkhours/新增结算工时页面.docx。 +8. 执行 +pm run build,前端构建通过。输出仍有既有资源体积过大和 Browserslist 数据过期警告,本次新增未引入编译错误。 + +### 修改结果 +- 新增结算工时页面:src/views/ProductionManagement/SettlementWorkhours/index.vue。 +- 新增数据库脚本并已应用:db_backups/create_settlement_workhours_query_20260627.sql。 +- 文档已移动到 work/ProductionManagement/SettlementWorkhours/新增结算工时页面.docx。 + +### 验证结果 +- 存储过程脚本应用:通过。 +- 存储过程样本执行:通过。 +- 前端生产构建 +pm run build:通过,仅有既有警告。 + +## 2026-06-27 16:42:14 补新增结算工时页面菜单记录 + +### 用户反馈 +- 新增结算工时页面后,页面上看不到菜单。 +- 用户怀疑 [dbo].[登录基础数据_二级菜单] 没有增加记录。 + +### 执行过程 +1. 检查目标库 192.168.2.92 / YL_MESDB 的 [dbo].[登录基础数据_二级菜单] 表结构。 +2. 确认字段包括 IDD、id、pid、path、componet、 edirect、 +ame、 itle、icon、账号代码、模块代码、是否启用、AddData、DeleteData、EditData、SearchData。 +3. 注意到字段名是 componet,不是 component。 +4. 查询现有工时相关菜单,确认: + - 工时查询 菜单存在,id = 166,pid = 3,路径为 Workhours/index,组件为 /ProductionManagement/Workhours/index。 + - 工时查询 当前只配置给账号代码 1 和 2010。 + - 结算工时 菜单此前不存在。 +5. 查询 IDD 属性,确认 IDD 是自增列;当前最大菜单 id 为 230。 +6. 新增菜单脚本 db_backups/add_settlement_workhours_menu_20260627.sql: + - 新菜单 id 使用 231。 + - pid = 3,挂在生产管理下。 + - path = 'SettlementWorkhours/index'。 + - componet = '/ProductionManagement/SettlementWorkhours/index'。 + - +ame = 'SettlementWorkhours'。 + - itle = '结算工时'。 + - icon 复用工时查询图标,兜底为 DimensionsSummaryReport。 + - 权限按现有 工时查询 复制,插入账号代码 1 和 2010。 + - 脚本带 NOT EXISTS 判断,避免重复插入同账号菜单。 +7. 执行菜单脚本到目标库。 +8. 查询验证结果: + - IDD = 2754,账号代码 1,菜单 结算工时 已存在。 + - IDD = 2755,账号代码 2010,菜单 结算工时 已存在。 + - 两条记录均指向 /ProductionManagement/SettlementWorkhours/index。 + +### 修改结果 +- 已向 [dbo].[登录基础数据_二级菜单] 补录 结算工时 菜单。 +- 菜单权限与现有 工时查询 保持一致,仅账号代码 1 和 2010 可见。 +- 本次仅修改数据库菜单记录和新增脚本,不涉及前端代码变更。 + +### 验证结果 +- 菜单表结构确认:通过。 +- 菜单脚本执行:通过。 +- 结算工时 菜单记录查询:通过。 + +## 2026-06-27 17:05:00 修正结算工时页面层级和已结算口径 + +### 用户反馈 +- 结算工时页面缺少任务描述、装夹时间、程序时间。 +- 页面存在多余字段,需要去掉。 +- 数据层级应为 物料汇总 -> 生产订单号+工位汇总,不需要明细层。 +- 只要已经结算的数据,即 [YL_MESDB].[dbo].[MES_接口_生产计划] 中 单据状态 IS NULL 的数据。 + +### 执行过程 +1. 重新确认需求后,调整结算工时页面和存储过程为两级汇总,不再返回明细层。 +2. 查询字段确认: + - [dbo].[MES_接口_生产计划] 包含 AID、订单编号、物料编号、物料描述、单据状态。 + - [dbo].[View_生产工时视图] 和 [dbo].[View_生产工时视图全部] 包含 TaskAID、订单号、产品编码、产品名称、工位名称、加工工时、操作内容、操作类别、操作数值、开始时间、操作人。 + - [dbo].[车间生产管理工艺_零件生产工艺_工艺库] 包含 准备工时、标准工时,本次用 准备工时 作为装夹时间,用 标准工时 作为程序时间。 +3. 重写 db_backups/create_settlement_workhours_query_20260627.sql: + - dbo.生产管理_结算工时_查询 先从 [dbo].[MES_接口_生产计划] 取 单据状态 IS NULL 的结算任务。 + - 工时数据通过 p.AID = v.TaskAID 关联到结算任务。 + - 只统计 加工工时 > 0,且操作内容/操作类别为 报工 或 辅助结束 的设备工时。 + - 汇总层级改为两级:一级按 物料编号 + 物料描述 汇总,二级按 生产订单号 + 工位名称 汇总。 + - 输出字段包含任务描述、生产订单号、工位、报工工时、主辅工时、报工完成数、辅助完成数、合计工时、装夹时间、程序时间、操作人。 + - 去掉明细字段:日期、工序名称、操作类别、完成数、单条工时、开始时间、结束时间等。 +4. 执行脚本到目标库 192.168.2.92 / YL_MESDB,只更新存储过程定义,未修改业务表数据。 +5. 执行样本验证 EXEC dbo.[生产管理_结算工时_查询] @数据条数 = 20,返回 6 行,层级为 Level=1 物料汇总和 Level=2 订单+工位汇总。 +6. 使用 sp_describe_first_result_set 验证结果集字段,确认包含 materialCode、materialDesc、 askDescription、productionOrderNo、station、 eportWorkHours、uxiliaryWorkHours、 eportFinishQty、uxiliaryFinishQty、 otalWorkHours、clampingTime、programTime、operatorNames、 ecordCount。 +7. 重写前端 src/views/ProductionManagement/SettlementWorkhours/index.vue: + - 查询条件精简为生产订单号、物料编码、工位、数据条数、开始日期、结束日期。 + - 表格改为两级树:一级物料汇总,二级生产订单号+工位汇总。 + - 补回任务描述、装夹时间、程序时间列。 + - 删除多余明细列:合同号、产品编码、产品名称、日期、工序、操作类别、完成数、单条工时、开始时间、结束时间。 + - 底部汇总保留报工工时、主辅工时、合计工时。 +8. 执行 +pm run build,前端构建通过。输出仍有既有资源体积过大和 Browserslist 数据过期警告,本次修正未引入编译错误。 + +### 修改结果 +- 结算工时页面已改为 物料汇总 -> 生产订单号+工位汇总 两级结构。 +- 页面已补回任务描述、装夹时间、程序时间。 +- 页面多余明细字段已去掉。 +- 数据只取 [dbo].[MES_接口_生产计划] 中 单据状态 IS NULL 的结算任务。 + +### 验证结果 +- 目标库存储过程更新:通过。 +- 存储过程样本执行:通过。 +- 结果集字段验证:通过。 +- 前端生产构建 +pm run build:通过,仅有既有警告。 + +## 2026-06-27 17:28:58 修正结算工时程序时间装夹时间和单件工时口径 + +### 用户反馈 +- 程序时间目前没有,默认 0。 +- 装夹时间 = 【报工工时(汇总) - 程序时间 * 完工数】 / 完工数。 +- 结算报工单件工时 = 报工工时 / 报工完成数。 +- 结算辅助单件工时 = 主辅工时 / 辅助完成数。 +- 任务描述没了,需要加上。 + +### 执行过程 +1. 修改 db_backups/create_settlement_workhours_query_20260627.sql。 +2. 从结算工时存储过程里移除工艺库 准备工时/标准工时 作为装夹时间、程序时间的取值。 +3. 将程序时间固定输出为 。 +4. 将装夹时间改为公式:CASE WHEN 报工完成数 > 0 THEN (报工工时 - 0 * 报工完成数) / 报工完成数 ELSE 0 END。 +5. 新增输出字段: + - settlementReportPieceHours:CASE WHEN 报工完成数 > 0 THEN 报工工时 / 报工完成数 ELSE 0 END。 + - settlementAuxiliaryPieceHours:CASE WHEN 辅助完成数 > 0 THEN 主辅工时 / 辅助完成数 ELSE 0 END。 +6. 保留并输出 askDescription,由 物料描述 + ' ' + 物料编号 组成,一级和二级都返回该字段。 +7. 修改前端 src/views/ProductionManagement/SettlementWorkhours/index.vue: + - 二级行也显示任务描述。 + - 新增“结算报工单件工时”列。 + - 新增“结算辅助单件工时”列。 + - 绑定新字段 settlementReportPieceHours、settlementAuxiliaryPieceHours。 +8. 执行 SQL 脚本到目标库 192.168.2.92 / YL_MESDB,只更新存储过程定义,未修改业务表数据。 +9. 执行样本验证 EXEC dbo.[生产管理_结算工时_查询] @数据条数 = 20: + - 返回任务描述。 + - 程序时间为 0。 + - 装夹时间按公式返回。 + - 返回结算报工单件工时和结算辅助单件工时。 +10. 执行 +pm run build,前端构建通过。输出仍有既有资源体积过大和 Browserslist 数据过期警告,本次修正未引入编译错误。 + +### 修改结果 +- 程序时间默认 0。 +- 装夹时间改为按汇总公式计算。 +- 新增结算报工单件工时、结算辅助单件工时。 +- 任务描述在物料汇总层和生产订单号+工位汇总层均显示。 + +### 验证结果 +- 目标库存储过程更新:通过。 +- 存储过程样本执行:通过。 +- 前端生产构建 +pm run build:通过,仅有既有警告。 +## 2026-06-27 17:39:00 修正结算工时二级任务描述和查询性能 + +### 用户反馈 +- 结算工时页面红框位置的二级任务描述需要拼接工序名称和工序顺序。 +- 页面打开和查询太慢,需要优化。 + +### 执行过程 +1. 查看当前结算工时页面 `src/views/ProductionManagement/SettlementWorkhours/index.vue`,确认页面只展示接口返回的 `taskDescription`,红框位置对应二级“生产订单号+工位”汇总行。 +2. 查看当前 SQL 备份脚本 `db_backups/create_settlement_workhours_query_20260627.sql`,确认任务描述由 `物料描述 + 物料编号` 组成,未带工序名称和订单行号。 +3. 修改 `db_backups/create_settlement_workhours_query_20260627.sql`: + - 在结算明细中保留 `工序名称` 和 `订单行号`。 + - 在二级汇总中增加 `MAX(工序名称) AS 工序名称`、`MAX(订单行号) AS 工序顺序`。 + - 二级 `taskDescription` 改为:`物料描述 + 物料编号 + 工序名称 + ' 序' + 工序顺序`。 + - 一级物料汇总任务描述保持 `物料描述 + 物料编号`。 +4. 优化 SQL 查询性能: + - 将原来按每个明细键反复查询 `[dbo].[View_生产工时视图全部]` 的操作人相关子查询,改为 `明细键 -> 操作人明细 -> 操作人拼接` 的统一聚合。 + - 将订单工位汇总里的操作人相关子查询,改为先按订单工位聚合操作人,再回连到二级汇总,避免汇总行逐行重复扫描。 + - 连接开始时间时使用秒级时间范围匹配,避免对大视图每行做字符串转换匹配。 +5. 修改前端页面 `src/views/ProductionManagement/SettlementWorkhours/index.vue`: + - 将“任务描述”列最小宽度从 280 调整为 380,避免追加工序名称和序号后显示过窄。 +6. 第一次执行 SQL 脚本时发现 `sqlcmd -i` 未按 UTF-8 解释中文脚本,数据库误建了一个乱码过程,正式中文过程仍是旧定义。 +7. 使用 `sqlcmd -f 65001` 重新执行 UTF-8 脚本到 `192.168.2.92 / YL_MESDB`,正式过程 `dbo.生产管理_结算工时_查询` 更新成功。 +8. 确认正式过程定义中已包含 `工序顺序`。 +9. 删除本次因编码误建的乱码过程,避免后续排查混淆。 +10. 执行抽样验证: + - `软管总成 214-20411-30-12x1SN-12x4000 电火花 序5` + - `软管总成 214-20411-30-12x1SN-12x4000 打压检测 序4` + - 同类二级行已能显示工序名称和工序顺序。 +11. 对同样 `@数据条数 = 30` 的抽查计时: + - 优化前约 17161 ms。 + - 优化后约 1986 ms。 +12. 执行 `npm run build`,前端构建通过。输出仍有项目既有的资源体积过大和 Browserslist 数据过期警告,本次修改未引入编译错误。 + +### 修改结果 +- 结算工时页面二级任务描述已拼接工序名称和工序顺序。 +- SQL 操作人拼接和订单工位操作人汇总已优化,减少重复扫描。 +- 任务描述列宽已加宽。 +- 数据库存储过程已同步更新到目标库。 + +### 验证结果 +- 目标库存储过程更新:通过。 +- 乱码误建过程清理:通过。 +- 样本查询内容验证:通过。 +- 样本查询耗时验证:从约 17.1 秒降到约 2.0 秒。 +- 前端生产构建 `npm run build`:通过,仅有既有警告。 +## 2026-06-27 17:46:00 修正结算工时操作人重复拼接 + +### 用户反馈 +- 结算工时页面的操作人拼接存在重复姓名,需要去重。 + +### 执行过程 +1. 查看 `db_backups/create_settlement_workhours_query_20260627.sql` 中当前操作人拼接逻辑。 +2. 确认原逻辑已经对整段 `操作人` 字符串做了 `DISTINCT`,但在订单工位汇总时,如果明细中已有 `张三,李四` 这类拼接字符串,再和其他明细拼接,会出现单个人名重复。 +3. 修改 `操作人明细`: + - 对源字段 `v2.操作人` 先替换中文逗号、顿号为英文逗号。 + - 使用 `STRING_SPLIT` 拆成单个姓名。 + - 去掉姓名前后空格。 + - 过滤空姓名。 + - 再按 `TaskAID + 开始时间 + 操作人` 去重后重新 `STRING_AGG`。 +4. 修改 `订单工位操作人`: + - 对 `结算明细.操作人` 再次按逗号拆分成单个姓名。 + - 按 `物料编号 + 订单号 + 工位名称 + 操作人` 去重。 + - 再重新拼接为最终 `operatorNames`。 +5. 使用 `sqlcmd -f 65001` 将脚本同步到目标库 `192.168.2.92 / YL_MESDB`,只更新存储过程定义。 +6. 执行抽样验证 `EXEC dbo.[生产管理_结算工时_查询] @数据条数 = 100`: + - 将返回的 `operatorNames` 再拆分统计重复姓名。 + - 未查出重复姓名行。 + - 样例结果如 `李盛发,王宝昌,魏文海,普1,孙广义`,同一行内姓名不重复。 +7. 执行 `npm run build`,前端构建通过。输出仍有项目既有的资源体积过大和 Browserslist 数据过期警告,本次修改未引入编译错误。 + +### 修改结果 +- 操作人拼接已改为按单个姓名去重。 +- 支持处理中文逗号、顿号和英文逗号分隔的姓名。 +- 数据库存储过程已同步更新到目标库。 + +### 验证结果 +- 目标库存储过程更新:通过。 +- 重复姓名抽样检查:通过。 +- 前端生产构建 `npm run build`:通过,仅有既有警告。 + +## 2026-06-29 设备信息维护页面修改 + +### 用户需求 + +- 根据 `doc/修改设备信息维护.docx` 修改设备信息维护页面。 +- 修改后在 `work` 下创建对应路径,并复制原始文档。 +- 在对应路径下新增或修改 `01-项目功能内容`、`02-项目程序开发详细步骤`、`03-推进台账`、`04-任务矩阵`、`05-验收证据`、`06-决策记录`,并增加 README 索引。 +- 将完整执行过程追加到 `gptlog-process/gpdlog.md`,日志使用中文。 + +### 执行过程 + +1. 查看 `doc` 目录,确认存在 `doc/修改设备信息维护.docx`。 +2. 使用 PowerShell 解析 docx 中的 `word/document.xml`,提取需求文本:新增公司编码(财务)、设备信息、使用部门、入账日期、单位、数量、状态、维修记录、维保记录、工位绑定、主要设备、设备标准开机工时、特种设备、证书有效期至;生产用名复用设备名称,规格/型号复用设备型号;公司编码必填且不可修改;工位绑定为工位管理数据多选;证书有效期过期红色置顶,30 天内黄色靠前。 +3. 定位目标页面为 `src/views/DeviceManagement/DeviceInformation/index.vue`。 +4. 确认工位管理页面 `src/views/SystemMaintenance/WorkstationManagement/index.vue` 使用 `MES_登录_工位与名称_查询` 获取工位数据。 +5. 初次用 Windows 集成认证连接 SQL Server 失败,随后根据用户提供的数据库地址、账号和密码,用数据库账号连接 `192.168.2.92 / YL_MESDB` 成功。日志和文档中不记录明文密码。 +6. 查询 `dbo.基础数据_设备工位点检表`,确认原表只有旧字段:设备流水号、设备名称、设备型号、制造厂家、工位号、点检表类型、操作日期、保养人员代码、监督人员代码、设备类型。 +7. 查询旧存储过程定义,确认 `设备管理_设备信息_查询/增加/编辑` 只处理设备名称、设备型号、设备类型。 +8. 重写 `src/views/DeviceManagement/DeviceInformation/index.vue`:表格增加需求字段列;新增/编辑弹窗增加需求字段;公司编码新增必填、编辑禁用;工位绑定使用多选下拉,来源为 `MES_登录_工位与名称_查询`;主要设备、特种设备使用“是/否”下拉;证书有效期至使用日期选择;增加当前页证书有效期排序和行背景色;固定操作列,适配横向多列表格。 +9. 新增 `db_backups/update_device_information_maintenance_20260629.sql`:使用 `COL_LENGTH` 可重复执行地增加 14 个新字段;更新 `设备管理_设备信息_查询`,返回新字段并按证书有效期预警排序;更新 `设备管理_设备信息_增加`,写入新字段并校验公司编码不能为空;更新 `设备管理_设备信息_编辑`,更新新字段但不更新公司编码。 +10. 使用 `sqlcmd -f 65001` 执行增量脚本到目标库,执行成功。 +11. 验证数据库字段:`dbo.基础数据_设备工位点检表` 已存在公司编码、设备信息、使用部门、入账日期、单位、数量、状态、维修记录、维保记录、工位绑定、主要设备、设备标准开机工时、特种设备、证书有效期至。 +12. 验证存储过程参数:`设备管理_设备信息_增加` 已包含新增字段参数;`设备管理_设备信息_编辑` 已包含新增字段参数和设备流水号;`设备管理_设备信息_查询` 保持旧查询参数兼容。 +13. 执行 `EXEC dbo.[设备管理_设备信息_查询]`,过程执行无错误。 +14. 第一次执行 `npm run build` 因 124 秒超时未得到结果;随后使用更长超时时间重跑。 +15. 第二次执行 `npm run build` 成功,webpack 编译通过,仅有项目既有资源体积过大和 Browserslist 数据过期警告。 +16. 创建 `work/DeviceManagement/DeviceInformation`。 +17. 复制 `doc/修改设备信息维护.docx` 到 `work/DeviceManagement/DeviceInformation/修改设备信息维护.docx`。 +18. 在工作目录新增 `README.md`、`01-项目功能内容.md`、`02-项目程序开发详细步骤.md`、`03-推进台账.md`、`04-任务矩阵.md`、`05-验收证据.md`、`06-决策记录.md`。 + +### 修改文件 + +- `src/views/DeviceManagement/DeviceInformation/index.vue` +- `db_backups/update_device_information_maintenance_20260629.sql` +- `work/DeviceManagement/DeviceInformation/修改设备信息维护.docx` +- `work/DeviceManagement/DeviceInformation/README.md` +- `work/DeviceManagement/DeviceInformation/01-项目功能内容.md` +- `work/DeviceManagement/DeviceInformation/02-项目程序开发详细步骤.md` +- `work/DeviceManagement/DeviceInformation/03-推进台账.md` +- `work/DeviceManagement/DeviceInformation/04-任务矩阵.md` +- `work/DeviceManagement/DeviceInformation/05-验收证据.md` +- `work/DeviceManagement/DeviceInformation/06-决策记录.md` +- `gptlog-process/gpdlog.md` + +### 验证结果 + +- 数据库连接:通过。 +- 表字段新增:通过。 +- 存储过程参数更新:通过。 +- 查询过程执行:通过。 +- 前端生产构建 `npm run build`:通过,仅有既有警告。 + +### 下一步 + +- 登录真实系统页面做人工验收:新增设备、编辑设备、工位多选、公司编码只读、证书有效期颜色和排序。 +- 如现场要求历史设备补齐公司编码,需要补充历史数据治理脚本和验收规则。 + +## 2026-06-29 设备信息维护取消设备类型必填 + +### 用户需求 + +- 去掉设备类型必填修改。 + +### 执行过程 + +1. 打开 `src/views/DeviceManagement/DeviceInformation/index.vue`。 +2. 在表单校验 `rules` 中移除 `设备类型` 必填规则。 +3. 保留公司编码新增必填和生产用名必填。 +4. 更新 `work/DeviceManagement/DeviceInformation/03-推进台账.md`,追加第 2 轮记录。 +5. 更新 `work/DeviceManagement/DeviceInformation/04-任务矩阵.md`,新增 `DI-008A` 任务记录。 + +### 修改文件 + +- `src/views/DeviceManagement/DeviceInformation/index.vue` +- `work/DeviceManagement/DeviceInformation/03-推进台账.md` +- `work/DeviceManagement/DeviceInformation/04-任务矩阵.md` +- `gptlog-process/gpdlog.md` + +### 验证结果 + +- 代码层确认设备类型不再配置必填校验。 + +## 2026-06-29 修复设备信息维护日期编辑报错 + +### 用户反馈 + +- 证书有效期和入账日期编辑时报错,无法编辑修改。 + +### 执行过程 + +1. 查询目标库 `dbo.基础数据_设备工位点检表`,确认测试数据中 `入账日期` 和 `证书有效期至` 已有日期值。 +2. 查看当前前端 `src/views/DeviceManagement/DeviceInformation/index.vue`,确认两个日期字段由 `el-date-picker` 以 `yyyy-MM-dd` 字符串提交。 +3. 查看当前 `设备管理_设备信息_编辑` 存储过程,确认 `@入账日期`、`@证书有效期至` 定义为 `date` 类型。 +4. 判断问题原因:通用前端网关提交日期和空值时容易与 SQL Server `date` 参数转换冲突,尤其编辑清空日期时会报错。 +5. 修改前端页面:新增 `dateParam` 方法,两个日期字段提交时传 `yyyy-MM-dd` 字符串或空字符串,不再传 `null`。 +6. 新增数据库修复脚本 `db_backups/fix_device_information_date_edit_20260629.sql`。 +7. 修复脚本调整 `设备管理_设备信息_增加/编辑`: + - `@入账日期` 改为 `nvarchar(50)`。 + - `@证书有效期至` 改为 `nvarchar(50)`。 + - 写入表时使用 `TRY_CONVERT(date, NULLIF(@入账日期, N''))`。 + - 写入表时使用 `TRY_CONVERT(date, NULLIF(@证书有效期至, N''))`。 +8. 使用 `sqlcmd -f 65001` 执行修复脚本到 `192.168.2.92 / YL_MESDB`,执行成功。 +9. 查询 `sys.parameters`,确认 `设备管理_设备信息_增加/编辑` 的两个日期参数已变更为 `nvarchar`。 +10. 直接执行 `设备管理_设备信息_编辑` 测试正常日期:传入 `2026-07-01` 和 `2026-07-31`,返回 `result=1`,数据库日期更新成功。 +11. 直接执行 `设备管理_设备信息_编辑` 测试清空日期:传入空字符串,返回 `result=1`,数据库日期字段保存为 `NULL`。 +12. 更新工作目录文档:推进台账、任务矩阵、验收证据。 + +### 修改文件 + +- `src/views/DeviceManagement/DeviceInformation/index.vue` +- `db_backups/fix_device_information_date_edit_20260629.sql` +- `work/DeviceManagement/DeviceInformation/03-推进台账.md` +- `work/DeviceManagement/DeviceInformation/04-任务矩阵.md` +- `work/DeviceManagement/DeviceInformation/05-验收证据.md` +- `gptlog-process/gpdlog.md` + +### 验证结果 + +- 修复 SQL 执行:通过。 +- 日期参数类型验证:通过,已为 `nvarchar`。 +- 正常日期编辑验证:通过。 +- 清空日期编辑验证:通过,日期保存为 `NULL`。 + +### 补充验证 + +- 执行 `npm run build`,前端生产构建通过。 +- webpack compiled with 2 warnings,仍为项目既有资源体积过大和 Browserslist/caniuse-lite 数据过期警告。 + +## 2026-06-29 修复设备信息维护日期控件点击报错 + +### 用户反馈 + +- 点击修改入账日期或证书有效期时报错:`TypeError: date.getHours is not a function`。 +- 报错来自 Element UI 日期组件 `DateTable`,说明日期控件内部拿到的不是 `Date` 对象。 + +### 执行过程 + +1. 查看 `src/views/DeviceManagement/DeviceInformation/index.vue`,确认两个 `el-date-picker` 使用了 `value-format="yyyy-MM-dd"`,并且编辑回填时给表单日期字段赋值为字符串。 +2. 判断原因:Element UI 的日期面板点击逻辑需要 `Date` 对象参与内部时间修改,当前字符串值导致 `date.getHours is not a function`。 +3. 修改两个日期控件:去掉 `value-format="yyyy-MM-dd"`,让 `v-model` 保持 `Date` 对象。 +4. 修改编辑回填:`入账日期` 和 `证书有效期至` 改为调用 `parseDateValue`,将数据库日期转换为本地 `Date` 对象。 +5. 保留提交兼容:`dateParam` 在提交前将 `Date` 对象格式化成 `yyyy-MM-dd` 字符串,继续兼容已修复的数据库过程。 +6. 执行 `npm run build`,前端构建通过。 +7. 更新工作目录中的推进台账、任务矩阵和验收证据。 + +### 修改文件 + +- `src/views/DeviceManagement/DeviceInformation/index.vue` +- `work/DeviceManagement/DeviceInformation/03-推进台账.md` +- `work/DeviceManagement/DeviceInformation/04-任务矩阵.md` +- `work/DeviceManagement/DeviceInformation/05-验收证据.md` +- `gptlog-process/gpdlog.md` + +### 验证结果 + +- 两个日期控件已移除 `value-format`。 +- 编辑回填日期已转换为 `Date` 对象。 +- 提交前仍格式化为 `yyyy-MM-dd` 字符串。 +- `npm run build` 通过,仅有项目既有资源体积和 Browserslist 过期警告。 + +## 2026-06-29 修复设备信息维护编辑弹窗日期不回填 + +### 用户反馈 + +- 数据库有值,列表也有值,只是点击编辑时 `入账日期` 和 `证书有效期至` 读不到,显示为空。 + +### 执行过程 + +1. 查询数据库 `dbo.基础数据_设备工位点检表`,发现上一轮为了验证清空日期,测试记录 `设备流水号=1` 的两个日期被置为 `NULL`。 +2. 根据用户说明数据库和列表实际有值,判断问题仍集中在前端 `handleEdit` 日期回填。 +3. 恢复测试记录日期:`入账日期=2026-07-01`,`证书有效期至=2026-07-31`。 +4. 增强 `formatDate`,兼容 `yyyy-MM-dd`、`yyyy-MM-dd HH:mm:ss`、`yyyy/MM/dd`、`/Date(...)` 等后端可能返回格式。 +5. 增强 `parseDateValue`,支持直接传入 `Date` 对象,也支持通过 `formatDate` 解析字符串后生成本地 `Date` 对象。 +6. 将表单默认日期从空字符串调整为 `null`,符合 Element UI 日期控件空值约定。 +7. 修改编辑回填逻辑:不再整体替换 `this.form`,改为逐字段 `$set`,避免 Element Form 字段状态缓存导致日期控件未刷新。 +8. 在 `dialogFormVisible = true` 后通过 `$nextTick` 再次设置 `入账日期` 和 `证书有效期至`,防止被 `resetFields` 或弹窗初始化覆盖。 +9. 使用 Node 脚本验证多种日期格式均能解析为有效 `Date`。 +10. 执行 `npm run build`,前端构建通过,仅有既有资源体积和 Browserslist 过期警告。 +11. 确认本地 dev server 已运行在 `https://127.0.0.1:1997/`。命令行访问被自签名证书拦截,浏览器打开时需要允许证书后测试。 +12. 更新工作目录中的推进台账、任务矩阵和验收证据。 + +### 修改文件 + +- `src/views/DeviceManagement/DeviceInformation/index.vue` +- `work/DeviceManagement/DeviceInformation/03-推进台账.md` +- `work/DeviceManagement/DeviceInformation/04-任务矩阵.md` +- `work/DeviceManagement/DeviceInformation/05-验收证据.md` +- `gptlog-process/gpdlog.md` + +### 验证结果 + +- 数据库测试记录日期恢复:通过。 +- 本地日期解析函数测试:通过。 +- 前端生产构建 `npm run build`:通过,仅有既有警告。 +- 本地页面地址:`https://127.0.0.1:1997/`。 + +## 2026-06-29 新增设备名称字段并导入设备信息 Excel + +### 用户反馈 + +- 用户要求新增字段“设备名称”。 +- 用户要求将 `doc` 下的设备信息数据插入数据库。 +- 用户补充说明数据文件为 `设备信息.xlsx`。 +- 用户要求继续执行。 + +### 执行过程 + +1. 检查 `doc/设备信息.xlsx`,确认 Sheet1 表头为:`名称`、`公司编码`、`生产用名`、`型号/规格`、`设备信息`、`使用部门`、`入账日期`、`单位`、`数量`、`状态`。 +2. 读取 Excel 数据,确认有效数据共 89 行。 +3. 查询目标数据库 `192.168.2.92 / YL_MESDB`,确认 `dbo.基础数据_设备工位点检表` 当时为空。 +4. 明确字段映射:Excel `名称` 保存到新增数据库字段 `名称`,页面显示为“设备名称”;Excel `生产用名` 保存到原字段 `设备名称`,页面显示为“生产用名”。 +5. 修改 `src/views/DeviceManagement/DeviceInformation/index.vue`: + - 列表新增“设备名称”列,绑定 `名称`。 + - 新增/编辑弹窗新增“设备名称”输入框,绑定 `form.名称`。 + - `emptyForm` 增加 `名称`。 + - 编辑回填增加 `名称`。 + - 新增/编辑提交参数增加 `名称`。 +6. 生成 `db_backups/add_device_name_and_import_excel_20260629.sql`: + - 表 `dbo.基础数据_设备工位点检表` 不存在 `名称` 字段时新增该字段。 + - 调整 `设备管理_设备信息_增加` 和 `设备管理_设备信息_编辑`,增加 `@名称` 参数。 + - 使用 `MERGE` 按 `公司编码` 导入或更新 Excel 数据,避免重复导入生成重复记录。 +7. 执行导入脚本,数据库导入后设备信息总数为 89。 +8. 抽样检查发现 Excel 日期对象导入后部分 `入账日期` 早一天,例如 `1/1/07` 被保存为 `2006-12-31`。 +9. 根据 Excel 单元格显示值重新生成 `db_backups/fix_device_excel_import_dates_20260629.sql`,并执行日期修正。 +10. 修正后抽样验证: + - `REALLY-11` 入账日期为 `2007-01-01`。 + - `REALLY-6` 入账日期为 `2008-12-24`。 + - `REALLY-1` 入账日期为 `2011-01-01`。 +11. 检查新增过程文本,发现“公司编码不能为空”提示在首次脚本生成时变成问号文本。 +12. 使用 `apply_patch` 修正导入脚本里的提示文本,并新增 `db_backups/fix_device_add_company_code_message_20260629.sql`,只重新发布新增过程,不重新执行整份导入脚本,避免覆盖已修正日期。 +13. 执行提示文本修正脚本,确认新增过程可返回中文提示。 +14. 复制 `doc/设备信息.xlsx` 到 `work/DeviceManagement/DeviceInformation/设备信息.xlsx` 作为工作副本。 +15. 更新 `work/DeviceManagement/DeviceInformation` 下的 README、01-项目功能内容、02-项目程序开发详细步骤、03-推进台账、04-任务矩阵、05-验收证据、06-决策记录。 +16. 执行 `npm run build`,前端构建通过,仅有项目既有资源体积和 Browserslist/caniuse-lite 过期警告。 + +### 修改文件 + +- `src/views/DeviceManagement/DeviceInformation/index.vue` +- `db_backups/add_device_name_and_import_excel_20260629.sql` +- `db_backups/fix_device_excel_import_dates_20260629.sql` +- `db_backups/fix_device_add_company_code_message_20260629.sql` +- `work/DeviceManagement/DeviceInformation/设备信息.xlsx` +- `work/DeviceManagement/DeviceInformation/README.md` +- `work/DeviceManagement/DeviceInformation/01-项目功能内容.md` +- `work/DeviceManagement/DeviceInformation/02-项目程序开发详细步骤.md` +- `work/DeviceManagement/DeviceInformation/03-推进台账.md` +- `work/DeviceManagement/DeviceInformation/04-任务矩阵.md` +- `work/DeviceManagement/DeviceInformation/05-验收证据.md` +- `work/DeviceManagement/DeviceInformation/06-决策记录.md` +- `gptlog-process/gpdlog.md` + +### 验证结果 + +- Excel 有效数据行数:89。 +- 数据库设备信息总数:89。 +- `名称` 字段已存在并用于页面“设备名称”。 +- Excel `生产用名` 继续保存到原 `设备名称` 字段。 +- 日期修正后样例数据正确。 +- 新增过程提示文本已修正为“公司编码不能为空”。 +- `npm run build` 通过,仅有既有警告。 + +## 2026-06-29 新增及时齐套跟踪结果页面 + +### 用户需求 + +- 根据 `doc/新增及时齐套跟踪结果.docx` 新增页面“及时齐套跟踪结果”。 +- 修改后在 `work` 下创建对应路径并复制原始文档。 +- 在对应路径新增或修改 `01-项目功能内容`、`02-项目程序开发详细步骤`、`03-推进台账`、`04-任务矩阵`、`05-验收证据`、`06-决策记录` 和 README 索引。 +- 将完整执行过程使用中文追加到 `/gptlog-process/gpdlog.md`。 + +### 执行过程 + +1. 在 `doc` 目录查找需求文档,确认真实文件为 `doc/新增及时齐套跟踪结果.docx`。 +2. 将 docx 临时复制为 zip 并解包读取 `word/document.xml`,提取需求正文。 +3. 从需求中确认: + - 一级数据字段按计划用表页面一致。 + - 过滤条件和计划用表页面一致。 + - 二级绿色数据来自 `SAP.SBO_YL.dbo.VIEW_Jijiankukc`。 + - 二级字段包括物料编码、物料名称、缺件数量、属性、生产订单号、进度、工艺路线、预计完成时间。 +4. 查找现有页面,确认“计划用表”为 `src/views/PlanManagement/PlanShell/index.vue`,使用过程 `计划排产_查询计划信息`。 +5. 查找“生产计划跟踪”为 `src/views/ProductionManagement/ProductionPlanTrack/index.vue`,复用其当前序和工艺路线展示思路。 +6. 查询数据库菜单表,确认“计划用表”挂在 `PlanManagement` 下,因此新页面也放在 `PlanManagement` 模块。 +7. 查询 SAP linked server,确认可通过 `[SAP].[SBO_YL].[dbo].[VIEW_Jijiankukc]` 访问 SAP 缺件视图。 +8. 查询 SAP 视图字段,确认存在 `ItemCode`、`U_Name`、`属性`、`未发货数量`、`在制采购`、`采购员`、`采购预计交货日期`、`采购未清数量`、`到货草稿`。 +9. 查询 MES 视图字段,确认 `View_生产订单_MES` 可提供计划号、合同号、订单编号、物料编号、物料描述、计划数量、计划完成、计划开始时间、计划完成时间、齐套、发料状态、拣配状态、自制件属性、任务状态、加工状态、进度等字段。 +10. 新增 `db_backups/create_timely_kit_tracking_result_20260629.sql`,创建或更新 `dbo.生产管理_及时齐套跟踪结果_查询`。 +11. 新过程按计划用表参数接收筛选条件,并将 SAP 缺件数据与 MES 生产计划匹配: + - 机加件:`SAP.ItemCode = MES.物料编号`。 + - 装配件:`SAP.ItemCode + SAP.Project = MES.物料编号 + MES.合同号`。 + - 外购件:属性为空,生产订单号取 SAP `在制采购`,工艺路线列拼接采购信息和质检状态。 +12. 首次执行查询过程取样时,SQL Server 报 `QUOTED_IDENTIFIER` SET 选项错误。 +13. 修改 SQL 脚本,增加 `SET ANSI_NULLS ON` 和 `SET QUOTED_IDENTIFIER ON`,重新发布过程。 +14. 再次执行取样查询,确认过程可返回 SAP 缺件和 MES 计划组合数据。 +15. 新增 `db_backups/add_timely_kit_tracking_result_menu_20260629.sql`。 +16. 执行菜单脚本,按“计划用表”的角色授权复制新增菜单,生成 4 条“及时齐套跟踪结果”菜单记录。 +17. 新增前端页面 `src/views/PlanManagement/TimelyKitTrackingResult/index.vue`: + - 过滤区参考计划用表。 + - 主表展示一级计划字段。 + - 展开行展示二级缺件跟踪数据。 + - 二级明细行使用浅绿色背景。 + - 状态字段使用绿色/橙色标签样式。 +18. 执行 `npm run build`,构建通过,仅有项目既有资源体积过大和 Browserslist/caniuse-lite 过期警告。 +19. 创建 `work/PlanManagement/TimelyKitTrackingResult`。 +20. 复制 `doc/新增及时齐套跟踪结果.docx` 到工作目录。 +21. 新增 README、01-项目功能内容、02-项目程序开发详细步骤、03-推进台账、04-任务矩阵、05-验收证据、06-决策记录。 + +### 修改文件 + +- `src/views/PlanManagement/TimelyKitTrackingResult/index.vue` +- `db_backups/create_timely_kit_tracking_result_20260629.sql` +- `db_backups/add_timely_kit_tracking_result_menu_20260629.sql` +- `work/PlanManagement/TimelyKitTrackingResult/新增及时齐套跟踪结果.docx` +- `work/PlanManagement/TimelyKitTrackingResult/README.md` +- `work/PlanManagement/TimelyKitTrackingResult/01-项目功能内容.md` +- `work/PlanManagement/TimelyKitTrackingResult/02-项目程序开发详细步骤.md` +- `work/PlanManagement/TimelyKitTrackingResult/03-推进台账.md` +- `work/PlanManagement/TimelyKitTrackingResult/04-任务矩阵.md` +- `work/PlanManagement/TimelyKitTrackingResult/05-验收证据.md` +- `work/PlanManagement/TimelyKitTrackingResult/06-决策记录.md` +- `gptlog-process/gpdlog.md` + +### 验证结果 + +- SAP linked server 取样查询:通过。 +- `dbo.生产管理_及时齐套跟踪结果_查询` 执行:通过。 +- 菜单脚本执行:通过,新增 4 条菜单记录。 +- 前端构建 `npm run build`:通过,仅有既有警告。 + +## 2026-06-29 修正及时齐套跟踪结果页面反馈问题 + +### 用户反馈 + +1. 工艺路线缺少日期行和合格行,且没有颜色。 +2. 二级数据里面存在重复数据,不应该出现生产订单号一样的数据。 +3. 属性为空时代表外购,一级数据不对,应该取 SAP 视图 `DocEntry` 作为订单编号,再按照计划用表查询。 + +### 执行过程 + +1. 复查 `src/views/PlanManagement/TimelyKitTrackingResult/index.vue`,确认二级明细原先只把工艺路线作为文本展示,不能展示日期行、工序行、合格行和状态颜色。 +2. 复查 `db_backups/create_timely_kit_tracking_result_20260629.sql`,确认 SAP 缺件数据与 MES 计划数据匹配时,属性为空的外购数据仍可能使用在制采购号,导致一级计划数据取值不符合反馈要求。 +3. 查询样例订单 `7134`,确认同一个缺件生产订单号在二级明细中会重复出现。 +4. 查询样例订单 `7335`,确认该外购场景需要使用 SAP 视图 `DocEntry=7335` 作为订单编号匹配计划用表数据。 +5. 修改 SQL 查询过程脚本: + - 新增 SAP 缺件源数据去重,按 `DocEntry + Project + ItemCode + 属性` 保留一条。 + - 外购属性为空时,一级订单编号改为优先使用 `SAP.DocEntry`。 + - 外购属性为空时,MES 计划用表匹配条件增加 `MES.订单编号 = SAP.DocEntry`。 + - 新增 `工艺路线明细` JSON 字段,返回工序名称、计划开始时间、计划完成时间、进度、完成数量、收检合格数、收检不合格数、加工状态等页面渲染所需数据。 + - 最终结果增加按 `订单号 + 缺件生产订单号` 的去重层,避免同一生产订单号在二级明细重复出现。 +6. 重新执行 `db_backups/create_timely_kit_tracking_result_20260629.sql`,发布查询过程成功。 +7. 修改前端页面: + - 二级列“工艺路线/采购状态”增加自制件工艺路线 HTML 渲染。 + - 工艺路线渲染为三行结构:日期行、工序行、合格行。 + - 根据工序进度和加工状态增加绿色、蓝色、橙色、红色样式。 + - 外购件仍展示采购状态文本。 + - 前端合并数据时增加二级明细去重,避免接口数据异常时重复展示同一生产订单号。 +8. 更新工作目录文档: + - `work/PlanManagement/TimelyKitTrackingResult/03-推进台账.md` + - `work/PlanManagement/TimelyKitTrackingResult/04-任务矩阵.md` + - `work/PlanManagement/TimelyKitTrackingResult/05-验收证据.md` + - `work/PlanManagement/TimelyKitTrackingResult/06-决策记录.md` + +### 修改文件 + +- `src/views/PlanManagement/TimelyKitTrackingResult/index.vue` +- `db_backups/create_timely_kit_tracking_result_20260629.sql` +- `work/PlanManagement/TimelyKitTrackingResult/03-推进台账.md` +- `work/PlanManagement/TimelyKitTrackingResult/04-任务矩阵.md` +- `work/PlanManagement/TimelyKitTrackingResult/05-验收证据.md` +- `work/PlanManagement/TimelyKitTrackingResult/06-决策记录.md` +- `gptlog-process/gpdlog.md` + +### 验证结果 + +- 重新发布 `dbo.生产管理_及时齐套跟踪结果_查询` 成功。 +- 查询 `@订单号=7134` 时,同一缺件生产订单号 `7134` 的二级明细只返回 1 条,不再重复。 +- 查询 `@订单号=7335` 时,外购一级数据已按 `SAP.DocEntry=7335` 匹配到计划用表数据。 +- 执行 `npm run build` 通过,仅保留项目已有的资源体积过大和 Browserslist/caniuse-lite 过期警告。 + +### 下一步 + +- 登录页面人工查看展开行效果,重点确认工艺路线日期行、工序行、合格行和颜色是否与业务预期一致。 + +## 2026-06-29 继续修正及时齐套跟踪结果外购和主数据问题 + +### 用户反馈 + +1. 属性为空的外购数据应取 SAP 视图的采购员、采购未清数量、到货草稿,并根据到货草稿匹配采购入库检页面的生产订单读取检验状态。 +2. 第 32 行主数据生产订单号 `2007` 的一级数据是正确参照;前 1-10 行不正确,主数据缺件不应是主数据自身,且主数据产品编码后面的字段不应为空。 + +### 执行过程 + +1. 复查 `db_backups/create_timely_kit_tracking_result_20260629.sql`,确认上一版把一级主数据和二级缺件匹配混在同一个 `v` 里。 +2. 定位到问题来源:SQL 使用 `COALESCE(v.订单编号, sap.DocEntry)`、`COALESCE(v.物料编号, sap.ItemCode)`、`COALESCE(v.物料描述, sap.U_Name)` 作为主数据兜底,导致 SAP 缺件在没有匹配到计划用表时也会生成主表行。 +3. 查询 `@订单号=2007`,确认一级主数据完整,但外购缺件生产订单号显示成主订单号 `2007`,业务含义错误。 +4. 查看采购入库检页面 `src/views/QualityManagement/CheckTask/purchaseIncoming.vue`,确认查询过程为 `质量管理_质量检验_入库质检任务_查询`,页面生产订单字段来自 `质量检验_质检任务_SAP.订单编号`。 +5. 查看 `doc_old/fix_质量管理_入库质检任务_查询.sql`,确认采购入库检状态按 `质量检验_质检任务_SAP.入库数量` 和 `YL_质量检验_质检记录.检验数量` 判断。 +6. 修改查询过程: + - 一级主数据只按 `SAP.DocEntry = View_生产订单_MES.订单编号` 匹配。 + - 删除主数据字段对 SAP 缺件字段的兜底。 + - 新增 `detail_order`,仅用于自制缺件匹配二级生产订单、工艺路线和进度。 + - 外购缺件生产订单号改为 `SAP.到货草稿`;到货草稿为 0 时留空。 + - 外购质检状态改为 `SAP.到货草稿 -> 质量检验_质检任务_SAP.订单编号 -> YL_质量检验_质检记录` 口径。 + - 非外购质检状态保持为空。 +7. 重新发布 `dbo.生产管理_及时齐套跟踪结果_查询` 成功。 +8. 验证 `@订单号=2007`:一级主数据完整,外购缺件生产订单号不再等于 `2007`。 +9. 验证 `@订单号=7321`:外购缺件到货草稿 `11209` 显示为缺件生产订单号,质检状态为未完成。 +10. 默认查询统计:总行数 198,产品编码/产品名称为空行数 0,缺件生产订单号等于主订单号行数 0,非外购质检状态非空行数 0。 +11. 执行 `npm run build`,构建通过,仅保留项目既有 warning。 +12. 删除临时验证脚本 `db_backups/verify_timely_kit_tracking_result_temp_20260629.sql`。 +13. 更新 `work/PlanManagement/TimelyKitTrackingResult` 下推进台账、任务矩阵、验收证据、决策记录,并追加本日志。 + +### 修改文件 + +- `db_backups/create_timely_kit_tracking_result_20260629.sql` +- `work/PlanManagement/TimelyKitTrackingResult/03-推进台账.md` +- `work/PlanManagement/TimelyKitTrackingResult/04-任务矩阵.md` +- `work/PlanManagement/TimelyKitTrackingResult/05-验收证据.md` +- `work/PlanManagement/TimelyKitTrackingResult/06-决策记录.md` +- `gptlog-process/gpdlog.md` + +### 验证结果 + +- 查询过程发布成功。 +- `@订单号=2007`:一级主数据完整,外购缺件生产订单号不再等于 `2007`。 +- `@订单号=7321`:外购缺件按到货草稿 `11209` 显示缺件生产订单号,质检状态来自采购入库检口径。 +- 默认查询统计:总行数 198,产品编码/产品名称为空行数 0,缺件生产订单号等于主订单号行数 0,非外购质检状态非空行数 0。 +- `npm run build` 通过,仅有项目既有资源体积过大和 Browserslist/caniuse-lite 过期警告。 diff --git a/src/views/DeviceManagement/DeviceInformation/index.vue b/src/views/DeviceManagement/DeviceInformation/index.vue index d4d091d..d33a54c 100644 --- a/src/views/DeviceManagement/DeviceInformation/index.vue +++ b/src/views/DeviceManagement/DeviceInformation/index.vue @@ -1,9 +1,9 @@