我在使用方法一.2SELECT t.transaction_id, s.name AS schema_name, o.name AS object_name, CASE dt.transaction_type WHEN 1 THEN 'INSERT' WHEN 2 THEN 'UPDATE' WHEN 3 THEN 'DELETE' END AS operation_type, dt.transaction_begin_time FROM sys.dm_tran_database_transactions dt JOIN sys.dm_tran_session_transactions st ON dt.transaction_id = st.transaction_id JOIN sys.dm_tran_active_transactions t ON dt.transaction_id = t.transaction_id JOIN sys.objects o ON o.object_id = t.database_transaction_associated_entity_id JOIN sys.schemas s ON s.schema_id = o.schema_id WHERE dt.transaction_begin_time BETWEEN '开始时间' AND '结束时间' 中 显示列名无效

时间: 2025-06-20 08:22:21 浏览: 21
<think>好的,我现在需要解决用户在SQL查询中遇到的列名无效的问题,具体是在使用sys.dm_tran_database_transactions时出现错误。首先,我应该回忆一下sys.dm_tran_database_transactions这个系统视图的结构,确认用户提到的列名是否存在。 根据用户提供的列名:transaction_id, schema_name, object_name, operation_type, transaction_begin_time。我需要检查这些列是否真的存在于sys.dm_tran_database_transactions中。根据我的知识,sys.dm_tran_database_transactions主要提供数据库级别的事务信息,其列包括database_transaction_begin_time、database_transaction_type等,但可能没有用户提到的某些列,比如schema_name或object_name。这可能就是问题所在,用户可能混淆了不同的系统视图。 接下来,用户可能想获取事务相关的元数据,如涉及的对象名称和模式名,但这些信息可能不在sys.dm_tran_database_transactions中,而需要连接其他系统视图,比如sys.dm_tran_locks或sys.dm_exec_requests,再结合sys.objects来获取对象名称和模式。例如,sys.dm_tran_locks包含resource_associated_entity_id,可以关联到sys.objects的object_id,进而得到object_name和schema_name。 另外,用户提到的transaction_id可能存在于sys.dm_tran_current_transaction或其他事务相关的视图中。需要确认各个系统视图之间的关系和包含的列。例如,sys.dm_tran_active_transactions确实有transaction_id列,但可能需要通过会话或请求来关联。 操作类型(operation_type)可能指的是事务的类型(读/写),这在sys.dm_tran_database_transactions中有database_transaction_type列,但名称不同,用户可能使用了错误的列名。 总结问题,用户可能在查询中引用了sys.dm_tran_database_transviews不存在的列,导致列名无效的错误。解决方案应该是检查正确的列名,并连接适当的系统视图来获取所需的信息。例如,使用sys.dm_tran_active_transactions获取transaction_id,sys.dm_tran_locks结合sys.objects获取对象和模式名,sys.dm_exec_requests获取操作类型等。 此外,用户提供的引用中提到了事务块中的表重命名和锁的问题,这可能与事务的锁定有关,但当前问题更侧重于列名无效,因此需要指导用户正确使用系统视图和动态管理视图,并确保列名正确,必要时使用别名或连接其他视图来补充所需信息。</think>在SQL Server中查询事务信息时,若出现$列名无效$错误,通常是由于动态管理视图(DMV)中不存在指定列。以下是针对`sys.dm_tran_database_transactions`的解决方案: ### 一、验证列名正确性 `sys.dm_tran_database_transactions`包含以下核心列: $$database_id, transaction_id, database_transaction_begin_time, database_transaction_type$$ **不包含的列**:`schema_name`、`object_name`、`operation_type`[^3] ### 二、多视图关联查询 若需获取对象级事务信息,需结合其他DMV: ```sql SELECT dt.transaction_id, OBJECT_NAME(p.object_id) AS object_name, s.name AS schema_name, dt.database_transaction_begin_time FROM sys.dm_tran_database_transactions dt JOIN sys.dm_tran_locks l ON dt.transaction_id = l.request_owner_id JOIN sys.partitions p ON l.resource_associated_entity_id = p.hobt_id JOIN sys.objects o ON p.object_id = o.object_id JOIN sys.schemas s ON o.schema_id = s.schema_id WHERE l.resource_type = 'OBJECT' ``` ### 三、事务操作类型判断 通过`database_transaction_type`列判断事务类型: - 1 = 读/写事务 - 2 = 只读事务 ### 四、事务锁冲突排查 若涉及对象锁定(如引用[1]中的SCH-M锁),可结合以下查询: ```sql SELECT resource_type, request_mode, resource_description FROM sys.dm_tran_locks WHERE request_session_id = @@SPID ```
阅读全文

相关推荐

USE [DXQcontrol_L1HIMCP1_Operational_W] GO /****** Object: StoredProcedure [dbo].[prodExecmgmtIdent__processBR] Script Date: 7/29/2025 9:03:21 AM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO /*----------------------------------------------------------------------- Project: Duerr EcoEmos - Module Ident Stored Procedure: dbo.prodExecmgmtIdent__processBR Author: JM Initial date: 11. Nov 2020 Revisions: rev 1 - 11. Nov 2020, JM: wrapper function for the old OrderManagement to call dbo.prodExecmgmtIdent__processDR Input: @arg_dateEvt PLC timestamp of the reading event @arg_szRWStationTag Tagname for the reader (configured in table DS_CfgRegistrationPoint_TAB and for FB369 in addition in file IdentServer.ini) @arg_szDatasetIn Tracking data from PLC Output: @arg_szDatasetOut The mds data string which was merged by the new data from PLC and the last stored data string from DS_MDS_TAB Return: See the return codes of the several variables with name @iRetCode... ------------------------------------------------------------------------*/ CREATE PROCEDURE [dbo].[prodExecmgmtIdent__processBR] @arg_dateEvt DATETIME ,@arg_szRWStationTag NStringMin ,@arg_szDatasetIn VARCHAR(MAX) ,@arg_szDatasetOut VARCHAR(MAX) OUTPUT AS BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; SET DEADLOCK_PRIORITY HIGH; DECLARE @object_name VARCHAR(128) = OBJECT_SCHEMA_NAME(@@PROCID) + '.' + OBJECT_NAME(@@PROCID); ---------------------------------------------------------------------------------------------------- -- PRREQ-1908: avoid start of process with an open or uncommitted transaction DECLARE @log VARCHAR(MAX) = ''; DECLARE @tempTable TABLE(logExt VARCHAR(MAX)); IF XACT_STATE() <> 0 BEGIN SET @log = 'Start ' + @object_name + '; '; SET @log += '@@TRANCOUNT = ' + CAST(@@TRANCOUNT AS VARCHAR(MAX)) + '; '; SET @log += 'XACT_STATE() = ' + CAST(XACT_STATE() AS VARCHAR(MAX)) + '; '; SET @log += '@@spid = ' + CAST(@@spid AS VARCHAR(MAX)) + '; '; SET @log += 'ProcParam: '; SET @log += 'rwStation: ' + @arg_szRWStationTag + '; '; SET @log += 'bodyId: ' + dbo.DS_FCT_GetPLCValueOf_(@arg_szDatasetIn, 'bodyId') + '; '; SET @log += 'skidId: ' + dbo.DS_FCT_GetPLCValueOf_(@arg_szDatasetIn, 'skidId') + '; '; SET @log += 'skidType: ' + dbo.DS_FCT_GetPLCValueOf_(@arg_szDatasetIn, 'skidType') + '; '; INSERT INTO @tempTable (logExt) SELECT DISTINCT 'spid=' + CAST(S.spid AS VARCHAR(MAX)) + '; hostname=' + RTRIM(S.hostname) + '; program_name=' + RTRIM(S.program_name) + '; hostprocess=' + RTRIM(S.hostprocess) + '; text=' + D.text + '; lastwaittype=' + RTRIM(S.lastwaittype) FROM sys.sysprocesses S CROSS APPLY sys.dm_exec_sql_text(S.sql_handle) D WHERE S.open_tran > 0; --ORDER BY S.hostname, S.program_name; ROLLBACK TRANSACTION; INSERT INTO dbo.DS_MDSErrorLog_TAB (dateEvt, rwStationId, source, errorCode, errorText) SELECT GETDATE(), @arg_szRWStationTag, @object_name, 'WARNING', isnull(logExt,'-') FROM @tempTable; EXEC dbo.DS_SP_MDSWriteToErrorLog @arg_rwStationId = @arg_szRWStationTag, @arg_szSource = @object_name, @arg_szErrorCode = 'WARNING', @arg_szErrorText = @log; END; ---------------------------------------------------------------------------------------------------- DECLARE @iRetValue INT; ------------------------------------------------------------------------------- -- write this information into log EXEC [dbo].[DS_SP_MDSWriteToLogger] @arg_szRWStationTag, @object_name, @arg_szDatasetIn; ------------------------------------------------------------------------------- -- set the prober function code SET @arg_szDatasetIn = STUFF( @arg_szDatasetIn, 1, 2, 'DR'); EXEC @iRetValue = [dbo].[prodExecmgmtIdent__processDR] @arg_dateEvt, -- DATETIME @arg_szRWStationTag, -- NStringMin @arg_szDatasetIn, -- VARCHAR(MAX) @arg_szDatasetOut OUTPUT; -- VARCHAR(MAX) RETURN @iRetValue; END; GO 详细解析此sqlserver的功能

USE [DXQcontrol_VWAnhuiCP2PS01_Operational_W] GO /****** Object: StoredProcedure [dbo].[DS_SP_AlsAlarmsInsert] Script Date: 7/25/2025 9:45:04 AM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- 2005-08-22, SDR: Stores a new alarm in database -- 2006-02-28, JM: read the priority from the DS_AlsTags_TAB, if possible -- 2024-01-30, LZ: extend argument @arg_dynItemId from 11 to 17 digits -- internal component message number extend from 4 to 10 digits ALTER PROCEDURE [dbo].[DS_SP_AlsAlarmsInsert] @arg_utc_dts_new_on DATETIME, @arg_computer NVARCHAR(16), @arg_ionode NVARCHAR(32), @arg_ioitem NVARCHAR(64), @arg_text_id NVARCHAR(32), @arg_priority INT, @arg_localTimeDiff INT, -- offset in seconds from UTC to local time -- the following parameters are only valid for dynamic messages; -- for dynamic messages the meaning of "@arg_dynItemId" is the same -- like "@arg_ioitem" in case of static messages; -- all of these parameters are an empty string ('') for static messages @arg_dynItemId NVARCHAR(17), -- 17 character which includes: -- 1..4 : component -- 5..7 : device identifier -- 8..17 : internal component message number @arg_deviceId NVARCHAR(3), -- character 5..7 of @arg_dynItemId @arg_message NVARCHAR(128) AS BEGIN SET NOCOUNT ON; -- constants DECLARE @procName NVARCHAR(128) = OBJECT_SCHEMA_NAME(@@PROCID) + '.' + OBJECT_NAME(@@PROCID); DECLARE @lengthDynItemId TINYINT = 17; -- length of parameter @arg_dynItemId; use the variable instead of fix length inside the code -- variables DECLARE @iError INT; DECLARE @iRowCount INT; DECLARE @szErrType NVARCHAR(32); DECLARE @szErrMsg NVARCHAR(MAX); DECLARE @bDynAlarm TINYINT; DECLARE @bDynTagBreak TINYINT; DECLARE @szDynTextId NVARCHAR(32); DECLARE @szDynLamEnglish NVARCHAR(128); DECLARE @szDynToken NVARCHAR(128); DECLARE @bDynParamIndex TINYINT; DECLARE @sDynStartPos SMALLINT; DECLARE @sDynEndPos SMALLINT; DECLARE @ioitem NVARCHAR(64); DECLARE @cfg_inst_structure BIGINT; DECLARE @areakey NVARCHAR(96); DECLARE @plant_type CHAR(1); DECLARE @class CHAR(2); DECLARE @shiftnr TINYINT; DECLARE @wtmid INT; DECLARE @iAlsTagsPriority INT; DECLARE @local_dts_new_on DATETIME; DECLARE @tTypIdOfShift TINYINT; DECLARE @szSyncAlarms NVARCHAR(8); ------------------------------------------------------------------------------- -- Check the input parameters IF (@arg_utc_dts_new_on IS NULL OR @arg_computer IS NULL OR @arg_ionode IS NULL OR @arg_ioitem IS NULL OR @arg_priority IS NULL OR @arg_localTimeDiff IS NULL) BEGIN EXEC [dbo].[DS_SP_WriteToDSErrorLog] @procName, N'ERROR', N'Invalid parameters'; RETURN 0; END; IF (LEN(@arg_computer) = 0 OR LEN(@arg_ionode) = 0 OR LEN(@arg_ioitem) = 0) BEGIN EXEC [dbo].[DS_SP_WriteToDSErrorLog] @procName, N'ERROR', N'Invalid parameters'; RETURN 0; END; SET @szErrType = N'WARNING'; SET @szErrMsg = N''; SET @cfg_inst_structure = NULL; ------------------------------------------------------------------------------- -- check whether this is a dynamic alarm SET @bDynAlarm = 0; SET @ioitem = @arg_ioitem; IF (@arg_dynItemId IS NOT NULL AND @arg_deviceId IS NOT NULL) BEGIN IF (LEN(@arg_dynItemId) > 0 AND LEN(@arg_deviceId) > 0) BEGIN SET @bDynAlarm = 1; SET @ioitem = @arg_dynItemId; END; END; -- if (@arg_dynItemId is not null and @arg_deviceId is not null) IF (@bDynAlarm = 0) BEGIN SELECT TOP(1) @cfg_inst_structure = [cfg_inst_structure], @areakey = [areakey], @plant_type = [plant_type], @iAlsTagsPriority = [priority], @class = [class] FROM [dbo].[DS_AlsTags_TAB] WHERE ([ionode] = @arg_ionode AND [ioitem] = @ioitem) ORDER BY [id] DESC; SELECT @iError = @@ERROR, @iRowCount = @@ROWCOUNT; END; ELSE BEGIN BEGIN TRANSACTION; SET @iRowCount = 0; SELECT TOP(1) @cfg_inst_structure = ISNULL([DYN].[cfg_inst_structure], [DATT].[cfg_inst_structure]), @areakey = ISNULL([DYN].[areakey],[DATT].[areakey]), @plant_type = ISNULL([DYN].[plant_type],[DATT].[plant_type]), @iAlsTagsPriority = ISNULL([DYN].[priority],[DATT].[priority]), @class = ISNULL([DYN].[class],[DATT].[class]), @iRowCount = (CASE WHEN [DYN].[ionode] IS NULL THEN 0 ELSE 1 END) FROM [dbo].[DS_AlsTags_TAB] [DATT] WITH (ROWLOCK XLOCK) RIGHT JOIN [dbo].[DS_AlsDynTags_TAB] [DYN] WITH (ROWLOCK XLOCK) ON [DYN].[ionode] = [DATT].[ionode] AND [DYN].[ioitem] = [DATT].[ioitem] WHERE ([DYN].[ionode] = @arg_ionode AND [DYN].[ioitem] = @ioitem) ORDER BY [DYN].[id] DESC; IF @iRowCount = 0 BEGIN -- in case of dynamic tags the arg_priority is used INSERT INTO [dbo].[DS_AlsDynTags_TAB] ([ionode], [ioitem], [plant_id], [plant_type], [equipment_id], [devicename], [groupkey], [cfg_inst_structure], [text_id], [class], [location], [active], [priority], [log_enabled], [areakey]) SELECT @arg_ionode, @ioitem, [plant_id], [plant_type], [equipment_id], @arg_deviceId, [groupkey], [cfg_inst_structure], @arg_text_id, [class], [location], [active], @arg_priority, [log_enabled], [areakey] FROM [dbo].[DS_AlsTags_TAB] WHERE ([ionode] = @arg_ionode AND [ioitem] = @arg_ioitem); SELECT @iError = @@ERROR, @iRowCount = @@ROWCOUNT; SELECT TOP(1) @cfg_inst_structure = ISNULL([DYN].[cfg_inst_structure], [DATT].[cfg_inst_structure]), @areakey = ISNULL([DYN].[areakey],[DATT].[areakey]), @plant_type = ISNULL([DYN].[plant_type],[DATT].[plant_type]), @iAlsTagsPriority = ISNULL([DYN].[priority],[DATT].[priority]), @class = ISNULL([DYN].[class],[DATT].[class]), @iRowCount = (CASE WHEN [DYN].[ionode] IS NULL THEN 0 ELSE 1 END) FROM [dbo].[DS_AlsTags_TAB] [DATT] WITH (ROWLOCK XLOCK) RIGHT JOIN [dbo].[DS_AlsDynTags_TAB] [DYN] WITH (ROWLOCK XLOCK) ON [DYN].[ionode] = [DATT].[ionode] AND [DYN].[ioitem] = [DATT].[ioitem] WHERE ([DYN].[ionode] = @arg_ionode AND [DYN].[ioitem] = @ioitem) ORDER BY [DYN].[id] DESC; END; -- IF @iRowCount = 0 COMMIT TRANSACTION; END; -- else of 'if (@bDynAlarm = 0)' IF (@iError <> 0 OR @iRowCount <> 1) BEGIN SET @szErrMsg = N'AlarmTag does not exist for node '+ @arg_ionode + N' and item ' + @ioitem + N';error=' + CAST(@iError AS NVARCHAR(16)) + N';row count=' + CAST(@iRowCount AS NVARCHAR(16)); GOTO afterTransaction; END; ------------------------------------------------------------------------------- -- If this is a 'dynamic' or a 'dynamic direct' alarm then store -- the message text direct in the attribute 'message' of the new alarm -- Note: because of that direct storage only one language is supported -- in the attribute 'message' (the default language is 'en') SET @szDynLamEnglish = N''; IF (LEN(ISNULL(@arg_message,N'')) > 0) BEGIN IF (@bDynAlarm = 0 OR LEN(@arg_dynItemId) <> @lengthDynItemId) BEGIN -- this is a dynamic direct alarm, therefore we can -- take the native received message SET @szDynLamEnglish = @arg_message; END; ELSE BEGIN SET @szDynTextId = N'T02_' + SUBSTRING(@arg_dynItemId,1,4) + N'_' + SUBSTRING(@arg_dynItemId,8,10); IF LEN(@arg_text_id) >= 8 BEGIN -- check whether we the can use directly the text_id to search for the -- corresponding language format string -- we assume that the text_id is valid if the component (4 characters) -- and the text library number (4 characters) are included in the text_id IF (CHARINDEX(SUBSTRING(@arg_dynItemId,1,4), @arg_text_id, 1) > 0 AND CHARINDEX(SUBSTRING(@arg_dynItemId,8,10), @arg_text_id, 1) > 0) BEGIN SET @szDynTextId = @arg_text_id; END; END; SELECT TOP(1) @szDynLamEnglish = [en] FROM [dbo].[DS_LamTexts_TAB] WHERE ([text_id] = @szDynTextId AND [sub_id] = N'MESSAGE') ORDER BY [sub_id] ASC; SELECT @iError = @@ERROR, @iRowCount = @@ROWCOUNT; IF (@iError = 0 AND @iRowCount = 1 AND LEN(ISNULL(@szDynLamEnglish,N'')) > 0) BEGIN SET @bDynParamIndex = 0; SET @sDynStartPos = 1; SET @bDynTagBreak = 0; WHILE (@bDynTagBreak = 0) BEGIN SET @bDynParamIndex = @bDynParamIndex + 1; SET @sDynEndPos = CHARINDEX(N';', @arg_message, @sDynStartPos); IF (@sDynEndPos = 0 OR @sDynEndPos >= 128 OR @bDynParamIndex >= 9) BEGIN SET @sDynEndPos = LEN(@arg_message) + 1; SET @bDynTagBreak = 1; END; SET @szDynToken = N''; IF ((@sDynEndPos - @sDynStartPos) > 0) BEGIN SET @szDynToken = RTRIM(LTRIM(SUBSTRING(@arg_message, @sDynStartPos, @sDynEndPos - @sDynStartPos))); END; IF @bDynParamIndex = 1 BEGIN IF (LEN(@szDynToken) = 3) SET @szDynLamEnglish = REPLACE(@szDynLamEnglish, N'%id', @szDynToken); ELSE SET @szDynLamEnglish = REPLACE(@szDynLamEnglish, N'%id', @arg_deviceId); END; ELSE BEGIN SET @szDynLamEnglish = REPLACE(@szDynLamEnglish, N'%s' + CAST((@bDynParamIndex-1) AS NVARCHAR(16)), @szDynToken); END; SET @sDynStartPos = @sDynEndPos + 1; IF (@sDynStartPos > 128) BEGIN SET @bDynTagBreak = 1; END; END; -- WHILE (@bDynTagBreak = 0) END; --if (@iError = 0 and @iRowCount = 1 and len(isnull(@szDynLamEnglish,0)) > 0) ELSE BEGIN -- there exists no format string for this dynamic alarm -- therefore take the native received message SET @szDynLamEnglish = @arg_message; END; END; -- else of 'IF (@bDynAlarm = 0 OR LEN(@arg_dynItemId) <> 11)' END; --IF (LEN(ISNULL(@arg_message,N'')) > 0) ------------------------------------------------------------------------------- -- Insert a new dataset for the alarm if there is no open alarm registers for this tag -- If an alarm bit is operated by more than one AlarmServer then -- the following constallation can occure: -- AlarmServer 1 inserts a new alarm. This alarm went few seconds later. -- Now AlarmServer 2 process the same alarm and because of this the -- same alarm is stored duplicated in database. The probability of -- this occurance is higher for shorter alarm durations. -- -- Configuration to synchronize multiple AlarmServer with same alarm items -- * DS_GlobalParameter_TAB: set the value to "yes" for parameter -- "SynchronizeMultipleAlarmServer" and category "AlarmServer" -- List of programs which call the procedures DS_SP_AlsAlarmsInsert and DS_SP_AlsAlarmsUpdate -- * the AlarmServer -- - there exists max one AlarmServer per computer -- - there exist max two database connections per AlarmServer (primary and secondary database) -- (the primary and secondary database have to be different) -- - the alarms within the BUF files are processed in FIFO order by the C++ database DLL -- * the procedures DS_SP_PBS_AlarmHandling, DS_SP_WOPC_AlarmHandling -- SELECT TOP(1) @szSyncAlarms = [value] FROM [dbo].[DS_GlobalParameter_TAB] WITH (NOLOCK) WHERE [category] = N'AlarmServer' AND [parameter] = N'SynchronizeMultipleAlarmServer' AND [active] = 1 ORDER BY [id] DESC; IF @@ROWCOUNT = 0 SET @szSyncAlarms = N'no'; IF @szSyncAlarms = N'yes' BEGIN -- Enter critical section BEGIN TRANSACTION; IF EXISTS(SELECT 1 FROM [dbo].[DS_AlsAlarmsExclusiveLock_TAB] [DAAELT] WITH (ROWLOCK XLOCK HOLDLOCK) WHERE [DAAELT].[ionode] = @arg_ionode AND [DAAELT].[ioitem] = @ioitem) BEGIN UPDATE [dbo].[DS_AlsAlarmsExclusiveLock_TAB] WITH (ROWLOCK XLOCK HOLDLOCK) SET [maxDate] = @arg_utc_dts_new_on WHERE [ionode] = @arg_ionode AND [ioitem] = @ioitem AND [maxDate] < @arg_utc_dts_new_on; END; ELSE BEGIN INSERT INTO [dbo].[DS_AlsAlarmsExclusiveLock_TAB]([ionode],[ioitem],[maxDate]) VALUES (@arg_ionode,@ioitem,@arg_utc_dts_new_on); END; SELECT @iError = @@ERROR, @iRowCount = @@ROWCOUNT; COMMIT TRANSACTION; IF @iError <> 0 BEGIN SET @szErrType = N'ERROR'; SET @szErrMsg = N'Can not select from table DS_AlsAlarmsExclusiveLock_TAB for node '+ @arg_ionode + N' and item ' + @ioitem + N';error=' + CAST(@iError AS NVARCHAR(16)); END; IF @iRowCount = 0 BEGIN GOTO afterTransaction; END; END; -- if @szSyncAlarms = N'yes' ELSE BEGIN SELECT @iRowCount = 1, @iError = 0; END; -- write alarm logging IF @iRowCount = 1 AND @iError = 0 BEGIN SET @wtmid = -1; -- get the work time model ID for this alarm IF (@cfg_inst_structure IS NOT NULL) BEGIN SELECT TOP(1) @wtmid = [WTM_ID] FROM [dbo].[DS_CfgInstallationStructure_TAB] WHERE ([ID] = @cfg_inst_structure) ORDER BY [ID] DESC; SELECT @iError = @@ERROR, @iRowCount = @@ROWCOUNT; IF (@iError <> 0 OR @iRowCount <> 1) BEGIN SET @wtmid = -1; END; END; -- if (@cfg_inst_structure is not null) -- get the actual shift number SET @local_dts_new_on = DATEADD(ss,@arg_localTimeDiff,@arg_utc_dts_new_on); EXEC @shiftnr = [dbo].[DS_SP_GetShiftDetailsForDateEvt] @local_dts_new_on, @wtmid, @tTypIdOfShift OUTPUT, 1; -- 2022-10-20, debiezala -- use merge instead of insert to prevent double entries -- independant when how many AlarmServers are running MERGE INTO [dbo].[DS_AlsAlarms_TAB] AS [t] USING (VALUES (@arg_ionode, @ioitem) ) AS [s] ([ionode], [ioitem]) ON ([t].[ionode] = [s].[ionode] AND [t].[ioitem] = [s].[ioitem] AND [t].[utc_dts_gone_off] IS NULL) WHEN NOT MATCHED THEN INSERT ([utc_dts_new_on], [local_dts_new_on], [shift_nr], [computer], [text_id], [ionode], [ioitem], [message], [priority], [areakey], [plant_type], [class]) VALUES (@arg_utc_dts_new_on, @local_dts_new_on, @shiftnr, @arg_computer, @arg_text_id, @arg_ionode, @ioitem, @szDynLamEnglish, ISNULL(@iAlsTagsPriority, @arg_priority), @areakey, @plant_type, @class); SELECT @iError = @@ERROR, @iRowCount = @@ROWCOUNT; IF @iError <> 0 BEGIN SET @szErrType = N'ERROR'; SET @szErrMsg = N'Can not insert alarm message for node '+ @arg_ionode + N' and item ' + @ioitem + N';error=' + CAST(@iError AS NVARCHAR(16)) + N';row count=' + CAST(@iRowCount AS NVARCHAR(16)); GOTO afterTransaction; END; END; -- if @iRowCount = 0 and @iError = 0 afterTransaction: IF @szErrMsg <> N'' BEGIN EXEC [dbo].[DS_SP_WriteToDSErrorLog] @procName, @szErrType, @szErrMsg; END; RETURN 1; END; 分析以上存储过程

-- 使用W3数据库 USE [W3]; -- 切换到W3数据库 GO ------ 1. 自动查找并导入Excel文件 ------ DECLARE @BasePath NVARCHAR(500) = 'C:\Users\ZhuanZ(无密码)\Desktop\品质月报\'; -- 定义基础路径 DECLARE @YearFolder NVARCHAR(10) = FORMAT(GETDATE(), 'yyyy年'); -- 获取当前年份并格式化为“yyyy年” DECLARE @MonthFolder NVARCHAR(10) = FORMAT(GETDATE(), 'M月'); -- 获取当前月份并格式化为“M月” DECLARE @SubFolderKeyword NVARCHAR(50) = '3#数据'; -- 定义子文件夹关键词 DECLARE @FileKeyword NVARCHAR(50) = '3#完成车日报'; -- 定义文件关键词 PRINT '=== 开始执行 ==='; -- 打印开始标志 PRINT '基础路径: ' + @BasePath; -- 打印基础路径 PRINT '年份文件夹: ' + @YearFolder; -- 打印年份文件夹 PRINT '月份文件夹: ' + @MonthFolder; -- 打印月份文件夹 PRINT '子文件夹关键词: ' + @SubFolderKeyword; -- 打印子文件夹关键词 PRINT '文件关键词: ' + @FileKeyword; -- 打印文件关键词 DECLARE @SubFolderName NVARCHAR(255) = NULL; -- 用于存放找到的子文件夹名 DECLARE @FileName NVARCHAR(255) = NULL; -- 用于存放找到的文件名 DECLARE @FullPath NVARCHAR(1000) = NULL; -- 用于存放完整文件路径 DECLARE @Cmd NVARCHAR(500); -- 用于存放命令字符串 IF OBJECT_ID('tempdb..#FolderList') IS NOT NULL DROP TABLE #FolderList; -- 如果临时表#FolderList存在则删除 IF OBJECT_ID('tempdb..#FileList') IS NOT NULL DROP TABLE #FileList; -- 如果临时表#FileList存在则删除 BEGIN TRY -- 开始异常捕获 EXEC sp_configure 'show advanced options', 1; -- 启用高级选项 RECONFIGURE; -- 重新配置 EXEC sp_configure 'xp_cmdshell', 1; -- 启用xp_cmdshell RECONFIGURE; -- 重新配置 CREATE TABLE #FolderList (FolderName NVARCHAR(255)); -- 创建临时表存放文件夹名 CREATE TABLE #FileList (FileName NVARCHAR(255)); -- 创建临时表存放文件名 SET @Cmd = 'dir /b /ad "' + @BasePath + @YearFolder + '\' + @MonthFolder + '\*"'; -- 构建查找子文件夹的命令 PRINT '执行命令: ' + @Cmd; -- 打印命令 INSERT INTO #FolderList EXEC xp_cmdshell @Cmd; -- 执行命令并将结果插入#FolderList SELECT '文件夹搜索结果' AS Info, * FROM #FolderList; -- 显示文件夹搜索结果 SELECT TOP 1 @SubFolderName = FolderName -- 查找第一个包含关键词的子文件夹 FROM #FolderList WHERE FolderName LIKE '%3%#%数%据%' AND FolderName IS NOT NULL AND FolderName <> 'NULL'; PRINT '找到的子文件夹: ' + ISNULL(@SubFolderName, 'NULL'); -- 打印找到的子文件夹名 IF @SubFolderName IS NOT NULL -- 如果找到了子文件夹 BEGIN SET @Cmd = 'dir /b "' + @BasePath + @YearFolder + '\' + @MonthFolder + '\' + @SubFolderName + '\*.xls*"'; -- 构建查找Excel文件的命令 PRINT '执行命令: ' + @Cmd; -- 打印命令 INSERT INTO #FileList EXEC xp_cmdshell @Cmd; -- 执行命令并将结果插入#FileList SELECT '文件搜索结果' AS Info, * FROM #FileList; -- 显示文件搜索结果 SELECT TOP 1 @FileName = FileName -- 查找第一个包含关键词的文件名 FROM #FileList WHERE FileName LIKE '%3#%完成车日报%' AND FileName IS NOT NULL AND FileName <> 'NULL'; PRINT '找到的文件名: ' + ISNULL(@FileName, 'NULL'); -- 打印找到的文件名 IF @FileName IS NOT NULL -- 如果找到了文件 BEGIN SET @FullPath = @BasePath + @YearFolder + '\' + @MonthFolder + '\' + @SubFolderName + '\' + @FileName; -- 拼接完整文件路径 PRINT '完整文件路径: ' + @FullPath; -- 打印完整文件路径 END END EXEC sp_configure 'xp_cmdshell', 0; -- 关闭xp_cmdshell RECONFIGURE; -- 重新配置 EXEC sp_configure 'show advanced options', 0; -- 关闭高级选项 RECONFIGURE; -- 重新配置 END TRY BEGIN CATCH -- 捕获异常 PRINT '配置错误: ' + ERROR_MESSAGE(); -- 打印错误信息 IF OBJECT_ID('tempdb..#FolderList') IS NOT NULL DROP TABLE #FolderList; -- 删除临时表 IF OBJECT_ID('tempdb..#FileList') IS NOT NULL DROP TABLE #FileList; -- 删除临时表 RETURN; -- 退出 END CATCH; ------ 2. 导入Excel到临时表 ------ IF @FullPath IS NOT NULL -- 如果找到了完整文件路径 BEGIN IF OBJECT_ID('完成车不良临时表', 'U') IS NOT NULL DROP TABLE 完成车不良临时表; -- 如果表已存在则先删除 BEGIN TRY DECLARE @ImportSQL NVARCHAR(MAX) = N' SELECT * INTO 完成车不良临时表 FROM OPENROWSET( ''Microsoft.ACE.OLEDB.12.0'', ''Excel 12.0;HDR=YES;IMEX=1;Database=' + REPLACE(@FullPath, '''', '''''') + ''', ''SELECT * FROM [完成车不良清单$]'' )'; -- 构建导入Excel的SQL语句 PRINT '执行导入SQL: ' + LEFT(@ImportSQL, 200) + '...'; -- 打印导入SQL EXEC sp_executesql @ImportSQL; -- 执行导入 PRINT '导入成功,共导入 ' + CAST(@@ROWCOUNT AS VARCHAR) + ' 行数据'; -- 打印导入行数 END TRY BEGIN CATCH PRINT '导入失败: ' + ERROR_MESSAGE(); -- 打印导入失败信息 IF OBJECT_ID('tempdb..#FolderList') IS NOT NULL DROP TABLE #FolderList; -- 删除临时表 IF OBJECT_ID('tempdb..#FileList') IS NOT NULL DROP TABLE #FileList; -- 删除临时表 RETURN; -- 退出 END CATCH; END ELSE BEGIN PRINT '未找到匹配的文件,可能原因:'; -- 打印未找到文件的原因 PRINT '1. 文件夹结构不符合预期'; PRINT '2. 关键词匹配失败'; PRINT '3. 文件不存在或路径错误'; IF OBJECT_ID('tempdb..#FolderList') IS NOT NULL DROP TABLE #FolderList; -- 删除临时表 IF OBJECT_ID('tempdb..#FileList') IS NOT NULL DROP TABLE #FileList; -- 删除临时表 RETURN; -- 退出 END ------ 3. 只保留关键词列 ------ ALTER TABLE 完成车不良临时表 --删除F17这个列 DROP COLUMN F17; CREATE TABLE ##ColumnsToKeep (ColumnName NVARCHAR(128)); -- 创建全局临时表存放要保留的列名 DECLARE @KeepKeywords TABLE (Keyword NVARCHAR(50)); -- 创建表变量存放关键词 INSERT INTO @KeepKeywords VALUES ('月份'),('日期'),('指摘属性'),('车号'),('车型'),('部位'), ('不良内容'),('不良属性'),('班次'),('发生源'),('流出源'),('备注'); -- 插入所有需要保留的关键词 DECLARE @CheckColumnsSQL NVARCHAR(MAX) = ''; -- 定义变量用于拼接SQL DECLARE @ColumnName NVARCHAR(128); -- 定义变量存放列名 DECLARE @ColumnCursor CURSOR; -- 定义游标 SET @ColumnCursor = CURSOR FOR SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = '完成车不良临时表'; -- 查询所有列名 OPEN @ColumnCursor; -- 打开游标 FETCH NEXT FROM @ColumnCursor INTO @ColumnName; -- 读取第一列 WHILE @@FETCH_STATUS = 0 -- 遍历所有列 BEGIN DECLARE @CheckSQL NVARCHAR(MAX) = N' IF EXISTS ( SELECT 1 FROM [dbo].[完成车不良临时表] WHERE [' + @ColumnName + '] IS NOT NULL AND ('; -- 拼接判断列是否包含关键词的SQL DECLARE @Condition NVARCHAR(MAX) = ''; SELECT @Condition = @Condition + CASE WHEN @Condition = '' THEN '' ELSE ' OR ' END + 'CAST([' + @ColumnName + '] AS NVARCHAR(MAX)) LIKE ''%' + Keyword + '%''' FROM @KeepKeywords; -- 拼接所有关键词 SET @CheckSQL = @CheckSQL + @Condition + ') ) BEGIN INSERT INTO ##ColumnsToKeep VALUES (''' + @ColumnName + '''); END'; EXEC sp_executesql @CheckSQL; -- 执行SQL,插入需要保留的列 FETCH NEXT FROM @ColumnCursor INTO @ColumnName; -- 读取下一列 END CLOSE @ColumnCursor; -- 关闭游标 DEALLOCATE @ColumnCursor; -- 释放游标 DECLARE @DropColumnsSQL NVARCHAR(MAX) = ''; -- 定义变量用于拼接删除列的SQL SELECT @DropColumnsSQL = @DropColumnsSQL + 'IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = ''dbo'' AND TABLE_NAME = ''完成车不良临时表'' AND COLUMN_NAME = ''' + COLUMN_NAME + ''') ' + 'BEGIN ALTER TABLE [dbo].[完成车不良临时表] DROP COLUMN [' + COLUMN_NAME + ']; PRINT ''已删除列: ' + COLUMN_NAME + '''; END;' + CHAR(13) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = '完成车不良临时表' AND COLUMN_NAME NOT IN ( SELECT ColumnName FROM ##ColumnsToKeep ) AND (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = '完成车不良临时表') > 1; -- 拼接所有需要删除的列 IF LEN(@DropColumnsSQL) > 0 BEGIN EXEC sp_executesql @DropColumnsSQL; -- 执行删除列的SQL PRINT '已删除所有不包含关键词的列'; -- 打印删除结果 SELECT '保留的列' AS Info, ColumnName FROM ##ColumnsToKeep; -- 显示保留的列 END ELSE BEGIN PRINT '没有需要删除的列(所有列都包含关键词)'; -- 打印无需删除 END IF OBJECT_ID('tempdb..##ColumnsToKeep') IS NOT NULL DROP TABLE ##ColumnsToKeep; -- 删除全局临时表 GO ------ 4. 删除所有列都为空值的行 ------ DECLARE @CheckColumnsSQL2 NVARCHAR(MAX) = ''; -- 定义变量拼接所有列都为NULL的条件 DECLARE @DeleteSQL NVARCHAR(MAX) = ''; -- 定义变量拼接删除SQL DECLARE @DebugSQL NVARCHAR(MAX) = ''; -- 定义变量拼接调试SQL SELECT @CheckColumnsSQL2 = @CheckColumnsSQL2 + CASE WHEN @CheckColumnsSQL2 = '' THEN '' ELSE ' AND ' END + '[' + COLUMN_NAME + '] IS NULL' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = '完成车不良临时表' ORDER BY ORDINAL_POSITION; -- 拼接所有列都为NULL的条件 IF LEN(@CheckColumnsSQL2) > 0 BEGIN SET @DebugSQL = 'SELECT COUNT(*) AS 空行数 FROM [dbo].[完成车不良临时表] WHERE ' + @CheckColumnsSQL2; -- 拼接统计空行数的SQL SET @DeleteSQL = ' DECLARE @BeforeCount INT = (SELECT COUNT(*) FROM [dbo].[完成车不良临时表]); PRINT ''将要执行的删除条件: ' + REPLACE(@CheckColumnsSQL2, '''', '''''') + '''; DELETE FROM [dbo].[完成车不良临时表] WHERE ' + @CheckColumnsSQL2 + '; DECLARE @AfterCount INT = (SELECT COUNT(*) FROM [dbo].[完成车不良临时表]); DECLARE @DeletedRows INT = @BeforeCount - @AfterCount; PRINT ''删除前总行数: '' + CAST(@BeforeCount AS NVARCHAR(10)); PRINT ''删除后总行数: '' + CAST(@AfterCount AS NVARCHAR(10)); PRINT ''已删除所有列都为空值的行: '' + CAST(@DeletedRows AS NVARCHAR(10)) + '' 行''; SELECT TOP 5 * FROM [dbo].[完成车不良临时表];'; -- 拼接删除空行的SQL PRINT '将要检查的空行条件:'; -- 打印条件 PRINT @CheckColumnsSQL2; PRINT '预计会删除的空行数:'; -- 打印预计删除行数 EXEC sp_executesql @DebugSQL; -- 执行统计空行数 EXEC sp_executesql @DeleteSQL; -- 执行删除空行 END ELSE BEGIN PRINT '没有可用于检查的列,无法执行删除空行操作'; -- 打印无可用列 END GO ------ 5. 删除表头及其上方所有行 ------ DECLARE @cols NVARCHAR(MAX) = ''; -- 定义变量拼接所有列的LIKE条件 SELECT @cols = @cols + ' OR [' + COLUMN_NAME + '] LIKE N''%发生源%''' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '完成车不良临时表'; -- 拼接所有列的LIKE条件 SET @cols = STUFF(@cols, 1, 4, ''); -- 去掉第一个 OR DECLARE @RowNum INT = NULL; -- 定义变量存放行号 DECLARE @sql NVARCHAR(MAX) = ' WITH AllRows AS ( SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS rn, * FROM [dbo].[完成车不良临时表] ) SELECT TOP 1 @RowNum_OUT = rn FROM AllRows WHERE ' + @cols; -- 拼接查找包含“日期”关键词行号的SQL EXEC sp_executesql @sql, N'@RowNum_OUT INT OUTPUT', @RowNum_OUT=@RowNum OUTPUT; -- 执行SQL并输出行号 PRINT N'“发生源”关键词所在的行号为: ' + ISNULL(CAST(@RowNum AS NVARCHAR(10)), N'未找到'); -- 打印行号 IF @RowNum IS NOT NULL AND @RowNum >= 1 BEGIN ;WITH T AS ( SELECT *, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS rn FROM [dbo].[完成车不良临时表] ) DELETE FROM T WHERE rn <= @RowNum; -- 删除该行及其上方所有行 PRINT N'已删除1~' + CAST(@RowNum AS NVARCHAR(10)) + N'行数据'; -- 打印删除结果 END ELSE BEGIN PRINT N'未找到“发生源”关键词行,无需删除'; -- 打印未找到 END GO EXEC sp_help '完成车不良临时表'; -- 显示表结构 SELECT TOP 10 * FROM [dbo].[完成车不良临时表]; -- 显示前10行数据 GO ------ 6. 重命名部分列为中文含义 ------ DECLARE @RenameSQL NVARCHAR(MAX) = ''; -- 定义变量拼接重命名SQL SELECT @RenameSQL = @RenameSQL + 'EXEC sp_rename ''[dbo].[完成车不良临时表].[' + COLUMN_NAME + ']'', ''' + CASE COLUMN_NAME WHEN 'F4' THEN '指摘属性' WHEN 'F5' THEN '车号' WHEN 'F6' THEN '车型' WHEN 'F7' THEN '部位' WHEN 'F8' THEN '不良内容' WHEN 'F9' THEN '不良属性' WHEN 'F10' THEN '班次' WHEN 'F11' THEN '发生源' WHEN 'F12' THEN '流出源' WHEN 'F13' THEN '备注' ELSE COLUMN_NAME END + ''', ''COLUMN'';' + CHAR(13) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = '完成车不良临时表' AND COLUMN_NAME IN ('F4','F5','F6','F7','F8','F9','F10','F11','F12','F13'); -- 拼接所有需要重命名的列 IF LEN(@RenameSQL) > 0 BEGIN EXEC sp_executesql @RenameSQL; -- 执行重命名 PRINT '已重命名所有列'; -- 打印结果 END ELSE BEGIN PRINT '未找到需要重命名的列'; -- 打印未找到 END GO SELECT TOP 5 * FROM [dbo].[完成车不良临时表]; -- 查询前5行数据 GO EXEC sp_help '完成车不良临时表'; -- 显示表结构 GO ------ 7. 合并第一、第二列为“YYYY-MM-DD”,并添加“时间序列”列 ------ ALTER TABLE [dbo].[完成车不良临时表] ADD 日期 NVARCHAR(20), 时间序列 NVARCHAR(20); -- 新增“日期”和“时间序列”两列 GO DECLARE @CurrentYear NVARCHAR(4) = CONVERT(NVARCHAR(4), YEAR(GETDATE())); -- 获取当前年份 DECLARE @CurrentMonth NVARCHAR(2) = RIGHT('0' + CONVERT(NVARCHAR(2), MONTH(GETDATE())), 2); -- 获取当前月份 ;WITH T1 AS ( SELECT *, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS rn -- 为每一行生成递增序号 FROM [dbo].[完成车不良临时表] ) UPDATE T1 SET 日期 = @CurrentYear + '-' + RIGHT('0' + REPLACE(REPLACE(CONVERT(NVARCHAR(10), T1.F2), '月', ''), ' ', '') ,2) + '-' + RIGHT('0' + REPLACE(REPLACE(CONVERT(NVARCHAR(10), T1.F3), '日', ''), ' ', '') ,2), -- 合并F2和F4列为“YYYY-MM-DD”格式 时间序列 = @CurrentYear + @CurrentMonth + '01' + RIGHT('000000' + CONVERT(NVARCHAR(6), rn), 6); -- 生成时间序列,格式为“YYYYMM01000001”递增 EXEC sp_help '完成车不良临时表'; -- 显示表结构 SELECT TOP 10 * FROM [dbo].[完成车不良临时表]; -- 显示前10行数据 GO ------ 8. 删除F2、F4列,并将“日期”列移到第一列 ------ ALTER TABLE [dbo].[完成车不良临时表] DROP COLUMN F2, F3; -- 删除F2、F4列 GO SELECT 日期, -- 将“日期”列放到第一位 指摘属性,车号,车型,部位, 不良内容,不良属性,班次,发生源,流出源,备注, 时间序列-- 其余列顺序保持不变 INTO 完成车不良临时表_新 FROM [dbo].[完成车不良临时表]; -- 创建新表,调整列顺序 DROP TABLE [dbo].[完成车不良临时表]; -- 删除原表 EXEC sp_rename '完成车不良临时表_新', '完成车不良临时表'; -- 重命名新表为原表名 GO EXEC sp_help '完成车不良临时表'; -- 显示最终表结构 SELECT TOP 10 * FROM [dbo].[完成车不良临时表]; -- 显示前10行数据 ------------------------------------------------------------------------------------------------------------------------------------------------- -- 设定批处理的初始数据库上下文 USE W3; -- 声明变量,用于存储我们要记录到监控表的信息 -- 作业名称 DECLARE @JobName NVARCHAR(200) = N'完成车日报导入作业'; -- 插入行数 DECLARE @RowsInserted INT = 0; -- 更新行数 DECLARE @RowsUpdated INT = 0; -- 删除行数 DECLARE @RowsDeleted INT = 0; -- 执行结果 DECLARE @ExecutionResult NVARCHAR(50) = NULL; -- 错误信息 DECLARE @ErrorMessage NVARCHAR(MAX) = NULL; -- 下次执行时间 DECLARE @NextExecutionTime DATETIME = NULL; -- 声明动态SQL所需的变量 DECLARE @SQL NVARCHAR(MAX); -- Excel路径 DECLARE @ExcelPath NVARCHAR(MAX) = N'C:\Users\ZhuanZ(无密码)\Desktop\品质月报\完成车日报.xlsx'; -- 工作表名称 DECLARE @SheetName NVARCHAR(MAX) = N'完成车不良清单$'; -- 1. 首先确定当前执行时间和下次执行时间 -- 获取当前时间 DECLARE @CurrentTime TIME = CAST(GETDATE() AS TIME); -- 早晨执行时间 DECLARE @MorningRun TIME = '05:55:00'; -- 晚上执行时间 DECLARE @EveningRun TIME = '17:55:00'; -- 计算下次执行时间 IF @CurrentTime < @MorningRun -- 如果当前时间早于早晨执行时间,下次执行时间为今天早晨 SET @NextExecutionTime = CAST(CAST(GETDATE() AS DATE) AS DATETIME) + CAST(@MorningRun AS DATETIME); ELSE IF @CurrentTime BETWEEN @MorningRun AND @EveningRun -- 如果当前时间在早晨和晚上执行时间之间,下次执行时间为今天晚上 SET @NextExecutionTime = CAST(CAST(GETDATE() AS DATE) AS DATETIME) + CAST(@EveningRun AS DATETIME); ELSE -- 否则下次执行时间为明天早晨 SET @NextExecutionTime = CAST(CAST(DATEADD(DAY, 1, GETDATE()) AS DATE) AS DATETIME) + CAST(@MorningRun AS DATETIME); -- 开始尝试执行 BEGIN TRY ---------------------------------------------------------------------- -- 阶段2: 将临时表数据同步到最终目标表 ---------------------------------------------------------------------- -- 2.1 更新目标表中已存在的记录 (只统计实际发生变化的行) -- 更新目标表中已存在的记录 UPDATE t SET t.[日期] = e.[日期], t.[指摘属性] = e.[指摘属性], t.[车号] = e.[车号], t.[车型] = e.[车型], t.[部位] = e.[部位], t.[不良内容] = e.[不良内容], t.[不良属性] = e.[不良属性], t.[班次] = e.[班次], t.[发生源] = e.[发生源], t.[流出源] = e.[流出源], t.[备注] = e.[备注], t.[时间序列] = e.[时间序列] FROM [车体3科数据库].[dbo].[完成车不良] t INNER JOIN [W3].[dbo].[完成车不良临时表] e ON t.[时间序列] = e.[时间序列] -- 只更新有变化的记录 WHERE ISNULL(t.[日期], '') <> ISNULL(e.[日期], '') OR ISNULL(t.[指摘属性], '') <> ISNULL(e.[指摘属性], '') OR ISNULL(t.[车号], '') <> ISNULL(e.[车号], '') OR ISNULL(t.[车型], '') <> ISNULL(e.[车型], '') OR ISNULL(t.[部位], '') <> ISNULL(e.[部位], '') OR ISNULL(t.[不良内容], '') <> ISNULL(e.[不良内容], '') OR ISNULL(t.[不良属性], '') <> ISNULL(e.[不良属性], '') OR ISNULL(t.[班次], '') <> ISNULL(e.[班次], '') OR ISNULL(t.[发生源], '') <> ISNULL(e.[发生源], '') OR ISNULL(t.[流出源], '') <> ISNULL(e.[流出源], '') OR ISNULL(t.[备注], '') <> ISNULL(e.[备注], ''); -- 记录更新行数 SET @RowsUpdated = @@ROWCOUNT; -- 2.2 插入Excel中存在但目标表中不存在的记录 -- 插入新记录 INSERT INTO [车体3科数据库].[dbo].[完成车不良] SELECT e.[日期],e.[指摘属性],e.[车号],e.[车型],e.[部位], e.[不良内容],e.[不良属性],e.[班次],e.[发生源],e.[流出源], e.[备注],e.[时间序列] FROM [W3].[dbo].[完成车不良临时表] e -- 只插入目标表中不存在的记录 WHERE NOT EXISTS ( SELECT 1 FROM [车体3科数据库].[dbo].[完成车不良] t WHERE t.[时间序列] = e.[时间序列] ); -- 记录插入行数 SET @RowsInserted = @@ROWCOUNT; -- 2.3 删除目标表中当月不存在于临时表中的记录 -- 开始事务 BEGIN TRANSACTION; -- 删除目标表中当月不存在于临时表中的记录 DELETE FROM [车体3科数据库].[dbo].[完成车不良] WHERE NOT EXISTS ( SELECT 1 FROM [W3].[dbo].[完成车不良临时表] e WHERE [车体3科数据库].[dbo].[完成车不良].[时间序列] = e.[时间序列] ) -- 只删除当月数据 AND [日期] >= DATEADD(day, 1-DAY(GETDATE()), CAST(GETDATE() AS DATE)) AND [日期] < DATEADD(month, 1, DATEADD(day, 1-DAY(GETDATE()), CAST(GETDATE() AS DATE))); -- 记录删除行数 SET @RowsDeleted = @@ROWCOUNT; -- 提交事务 COMMIT TRANSACTION; -- 2.4 删除目标表中所有列都为空的记录 -- 删除所有列为空的记录 DELETE FROM [车体3科数据库].[dbo].[完成车不良] WHERE [日期] IS NULL AND ([指摘属性] IS NULL OR LTRIM(RTRIM([指摘属性])) = '') AND ([车号] IS NULL OR LTRIM(RTRIM([车号])) = '') AND ([车型] IS NULL OR LTRIM(RTRIM([车型])) = '') AND ([部位] IS NULL OR LTRIM(RTRIM([部位])) = '') AND ([不良内容] IS NULL OR LTRIM(RTRIM([不良内容])) = '') AND ([不良属性] IS NULL OR LTRIM(RTRIM([不良属性])) = '') AND ([班次] IS NULL OR LTRIM(RTRIM([班次])) = '') AND ([发生源] IS NULL OR LTRIM(RTRIM([发生源])) = '') AND ([流出源] IS NULL OR LTRIM(RTRIM([流出源])) = '') AND ([备注] IS NULL OR LTRIM(RTRIM([备注])) = '') AND [时间序列] IS NULL; -- 设置执行结果为成功 SET @ExecutionResult = N'成功'; END TRY -- 捕获异常 BEGIN CATCH -- 设置执行结果为失败 SET @ExecutionResult = N'失败'; -- 记录错误信息 SET @ErrorMessage = ERROR_MESSAGE(); -- 如果有未提交的事务则回滚 IF @@TRANCOUNT > 0 BEGIN ROLLBACK TRANSACTION; END END CATCH; -- 无论成功或失败,都将执行结果记录到监控表 INSERT INTO [日志].[dbo].[SSIS包执行监控] ( [包名称],[执行时间],[新增数据量],[更新数据量],[删除数据量],[执行结果],[错误信息],[下次执行时间] ) VALUES ( @JobName, GETDATE(), @RowsInserted, @RowsUpdated, @RowsDeleted, @ExecutionResult, @ErrorMessage, @NextExecutionTime ); -- 输出执行结果 PRINT '作业执行完成'; PRINT '执行结果: ' + ISNULL(@ExecutionResult, 'NULL'); PRINT '新增记录数: ' + CAST(@RowsInserted AS NVARCHAR(10)); PRINT '更新记录数: ' + CAST(@RowsUpdated AS NVARCHAR(10)); PRINT '删除记录数: ' + CAST(@RowsDeleted AS NVARCHAR(10)); PRINT '下次执行时间: ' + ISNULL(CONVERT(NVARCHAR(30), @NextExecutionTime, 120), 'NULL'); -- 如果有错误信息则打印 IF @ErrorMessage IS NOT NULL PRINT '错误信息: ' + @ErrorMessage; 优化这个代码,然后发送你优化后的完整代码给我

05-Aug-2025 17:30:40.083 警告 [main] org.apache.tomcat.util.digester.SetPropertiesRule.begin Match[Server/Service/Engine/Host/Context]无法将属性[debug]设置为[0] 05-Aug-2025 17:30:40.096 警告 [main] org.apache.tomcat.util.digester.SetPropertiesRule.begin Match[Server/Service/Engine/Host/Valve]无法将属性[resolveHosts]设置为[false] 05-Aug-2025 17:30:40.097 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server.服务器版本: Apache Tomcat/9.0.90 05-Aug-2025 17:30:40.099 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器构建: Jun 14 2024 14:45:13 UTC 05-Aug-2025 17:30:40.107 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器版本号: 9.0.90.0 05-Aug-2025 17:30:40.107 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 操作系统名称: Windows 10 05-Aug-2025 17:30:40.107 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log OS.版本: 10.0 05-Aug-2025 17:30:40.107 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 架构: amd64 05-Aug-2025 17:30:40.107 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java 环境变量: D:\dzwl\dzwlaz\java\jdk1.8\jre 05-Aug-2025 17:30:40.107 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java虚拟机版本: 1.8.0_101-b13 05-Aug-2025 17:30:40.107 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log JVM.供应商: Oracle Corporation 05-Aug-2025 17:30:40.107 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: D:\dzwl\dzwlaz\tomcat\tomcat1 05-Aug-2025 17:30:40.107 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: D:\dzwl\dzwlaz\tomcat\tomcat1 05-Aug-2025 17:30:40.107 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcatalina.home=D:\dzwl\dzwlaz\tomcat\tomcat1 05-Aug-2025 17:30:40.107 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcatalina.base=D:\dzwl\dzwlaz\tomcat\tomcat1 05-Aug-2025 17:30:40.108 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dignore.endorsed.dirs=D:\dzwl\dzwlaz\tomcat\tomcat1\endorsed 05-Aug-2025 17:30:40.108 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.io.tmpdir=D:\dzwl\dzwlaz\tomcat\tomcat1\temp 05-Aug-2025 17:30:40.108 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 05-Aug-2025 17:30:40.108 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dfile.encoding=utf-8 05-Aug-2025 17:30:40.108 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.util.logging.config.file=D:\dzwl\dzwlaz\tomcat\tomcat1\conf\logging.properties 05-Aug-2025 17:30:40.108 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: exit 05-Aug-2025 17:30:40.108 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: abort 05-Aug-2025 17:30:40.108 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Xms4096m 05-Aug-2025 17:30:40.108 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Xmx4096m 05-Aug-2025 17:30:40.113 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent 使用APR版本[1.7.4]加载了基于APR的Apache Tomcat本机库[1.3.0]。 05-Aug-2025 17:30:40.114 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR功能:IPv6[true]、sendfile[true]、accept filters[false]、random[true]、UDS [true]。 05-Aug-2025 17:30:40.114 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR/OpenSSL配置:useAprConnector[false],useOpenSSL[true] 05-Aug-2025 17:30:40.120 信息 [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL成功初始化 [OpenSSL 3.0.13 30 Jan 2024] 05-Aug-2025 17:30:40.320 信息 [main] org.apache.coyote.AbstractProtocol.init 初始化协议处理器 ["http-nio-8003"] 05-Aug-2025 17:30:40.335 信息 [main] org.apache.catalina.startup.Catalina.load 服务器在[410]毫秒内初始化 05-Aug-2025 17:30:40.356 信息 [main] org.apache.catalina.core.StandardService.startInternal 正在启动服务[Catalina] 05-Aug-2025 17:30:40.357 信息 [main] org.apache.catalina.core.StandardEngine.startInternal 正在启动 Servlet 引擎:[Apache Tomcat/9.0.90] 05-Aug-2025 17:30:40.794 警告 [main] org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom 使用[SHA1PRNG]创建会话ID生成的SecureRandom实例花费了[287]毫秒。 05-Aug-2025 17:30:40.811 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\dzwl\dzwlaz\webapps\api1\api] 05-Aug-2025 17:30:57.753 信息 [main] org.apache.jasper.servlet.TldScanner.scanJars 至少有一个JAR被扫描用于TLD但尚未包含TLD。 为此记录器启用调试日志记录,以获取已扫描但未在其中找到TLD的完整JAR列表。 在扫描期间跳过不需要的JAR可以缩短启动时间和JSP编译时间。 05-Aug-2025 17:31:53.977 严重 [main] org.apache.catalina.startup.HostConfig.deployDirectory 无法部署应用目录 [D:\dzwl\dzwlaz\webapps\api1\api] java.lang.IllegalStateException: 启动子级时出错 at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:602) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:571) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:603) at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1175) at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1888) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112) at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:1086) at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:470) at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1584) at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:312) at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:109) at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:385) at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:332) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:776) at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:721) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1203) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1193) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:749) at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:211) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) at org.apache.catalina.core.StandardService.startInternal(StandardService.java:415) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:878) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) at org.apache.catalina.startup.Catalina.start(Catalina.java:735) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:345) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:473) Caused by: org.apache.catalina.LifecycleException: 无法启动组件[StandardEngine[Catalina].StandardHost[localhost].StandardContext[/api]] at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:402) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:179) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:599) ... 37 more Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'emPowerInfo': Invocation of init method failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 对象名 'sys_site_license' 无效。 ### The error may exist in com/dzwl/core/mapper/SysSiteLicenseMapper.java (best guess) ### The error may involve defaultParameterMap ### The error occurred while setting parameters ### SQL: SELECT id, name, scode, etime, info FROM sys_site_license WITH (NOLOCK) ### Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 对象名 'sys_site_license' 无效。 ; bad SQL grammar []; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: 对象名 'sys_site_license' 无效。 at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:160) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:415) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1786) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:516) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:324) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:897) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:879) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:551) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:405) at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:173) at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:153) at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:95) at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:172) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4438) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) ... 38 more Caused by: org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 对象名 'sys_site_license' 无效。 ### The error may exist in com/dzwl/core/mapper/SysSiteLicenseMapper.java (best guess) ### The error may involve defaultParameterMap ### The error occurred while setting parameters ### SQL: SELECT id, name, scode, etime, info FROM sys_site_license WITH (NOLOCK) ### Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 对象名 'sys_site_license' 无效。 ; bad SQL grammar []; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: 对象名 'sys_site_license' 无效。 at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:239) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:88) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:440) at com.sun.proxy.$Proxy162.selectList(Unknown Source) at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:223) at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:173) at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:78) at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:148) at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) at com.sun.proxy.$Proxy634.selectList(Unknown Source) at com.baomidou.mybatisplus.extension.service.IService.list(IService.java:279) at com.baomidou.mybatisplus.extension.service.IService.list(IService.java:288) at com.baomidou.mybatisplus.extension.service.IService$$FastClassBySpringCGLIB$$f8525d18.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:367) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) at com.dzwl.core.service.impl.SysSiteLicenseServiceImpl$$EnhancerBySpringCGLIB$$470fcf13.list(<generated>) at com.dzwl.core.config.EmPowerInfo.init(EmPowerInfo.java:96) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:389) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:333) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:157) ... 60 more Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 对象名 'sys_site_license' 无效。 at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:262) at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1632) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:602) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:524) at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7375) at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:3206) at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:247) at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:222) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.execute(SQLServerPreparedStatement.java:505) at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3461) at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:440) at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3459) at com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.execute(PreparedStatementProxyImpl.java:167) at com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:497) at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:64) at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:63) at com.sun.proxy.$Proxy638.query(Unknown Source) at com.baomidou.mybatisplus.core.executor.MybatisSimpleExecutor.doQuery(MybatisSimpleExecutor.java:69) at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:325) at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156) at com.baomidou.mybatisplus.core.executor.MybatisCachingExecutor.query(MybatisCachingExecutor.java:165) at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:65) at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) at com.sun.proxy.$Proxy637.query(Unknown Source) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:426) ... 91 more 05-Aug-2025 17:31:53.981 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\dzwl\dzwlaz\webapps\api1\api]的部署已在[73,171]毫秒内完成 05-Aug-2025 17:31:53.981 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\dzwl\dzwlaz\webapps\api1\dist] 05-Aug-2025 17:31:54.010 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\dzwl\dzwlaz\webapps\api1\dist]的部署已在[29]毫秒内完成 05-Aug-2025 17:31:54.011 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\dzwl\dzwlaz\webapps\api1\jzjk] 05-Aug-2025 17:31:54.036 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\dzwl\dzwlaz\webapps\api1\jzjk]的部署已在[25]毫秒内完成 05-Aug-2025 17:31:54.036 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\dzwl\dzwlaz\webapps\api1\jzjkApp] 05-Aug-2025 17:31:54.060 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\dzwl\dzwlaz\webapps\api1\jzjkApp]的部署已在[24]毫秒内完成 05-Aug-2025 17:31:54.060 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\dzwl\dzwlaz\webapps\api1\pdjk] 05-Aug-2025 17:31:54.085 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\dzwl\dzwlaz\webapps\api1\pdjk]的部署已在[25]毫秒内完成 05-Aug-2025 17:31:54.092 信息 [main] org.apache.coyote.AbstractProtocol.start 开始协议处理句柄["http-nio-8003"] 05-Aug-2025 17:31:54.102 信息 [main] org.apache.catalina.startup.Catalina.start [73767]毫秒后服务器启动 05-Aug-2025 17:35:41.014 信息 [Thread-6] org.apache.coyote.AbstractProtocol.pause 暂停ProtocolHandler["http-nio-8003"] 05-Aug-2025 17:35:41.386 信息 [Thread-6] org.apache.catalina.core.StandardService.stopInternal 正在停止服务[Catalina] 05-Aug-2025 17:35:41.424 信息 [Thread-6] org.apache.coyote.AbstractProtocol.stop 正在停止ProtocolHandler ["http-nio-8003"] 05-Aug-2025 17:35:41.432 信息 [Thread-6] org.apache.coyote.AbstractProtocol.destroy 正在摧毁协议处理器 ["http-nio-8003"] 05-Aug-2025 17:35:41.438 警告 [Thread-6] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc Web应用程序 [api] 注册了JDBC驱动程序 [com.alibaba.druid.proxy.DruidDriver],但在Web应用程序停止时无法注销它。 为防止内存泄漏,JDBC驱动程序已被强制取消注册。 05-Aug-2025 17:35:41.438 警告 [Thread-6] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc Web应用程序 [api] 注册了JDBC驱动程序 [com.microsoft.sqlserver.jdbc.SQLServerDriver],但在Web应用程序停止时无法注销它。 为防止内存泄漏,JDBC驱动程序已被强制取消注册。 05-Aug-2025 17:35:41.439 警告 [Thread-6] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web应用程序[api]似乎启动了一个名为[JNA Cleaner]的线程,但未能停止它。这很可能会造成内存泄漏。线程的堆栈跟踪:[ java.lang.Object.wait(Native Method) java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143) java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164) com.sun.jna.internal.Cleaner$1.run(Cleaner.java:58)] 05-Aug-2025 17:35:41.439 警告 [Thread-6] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web应用程序[api]似乎启动了一个名为[Thread-4]的线程,但未能停止它。这很可能会造成内存泄漏。线程的堆栈跟踪:[ sun.net.dns.ResolverConfigurationImpl.notifyAddrChange0(Native Method) sun.net.dns.ResolverConfigurationImpl$AddressChangeListener.run(ResolverConfigurationImpl.java:144)] 05-Aug-2025 17:42:42.910 警告 [main] org.apache.tomcat.util.digester.SetPropertiesRule.begin Match[Server/Service/Engine/Host/Context]无法将属性[debug]设置为[0] 05-Aug-2025 17:42:42.925 警告 [main] org.apache.tomcat.util.digester.SetPropertiesRule.begin Match[Server/Service/Engine/Host/Valve]无法将属性[resolveHosts]设置为[false] 05-Aug-2025 17:42:42.926 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server.服务器版本: Apache Tomcat/9.0.90 05-Aug-2025 17:42:42.926 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器构建: Jun 14 2024 14:45:13 UTC 05-Aug-2025 17:42:42.926 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器版本号: 9.0.90.0 05-Aug-2025 17:42:42.927 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 操作系统名称: Windows 10 05-Aug-2025 17:42:42.927 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log OS.版本: 10.0 05-Aug-2025 17:42:42.927 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 架构: amd64 05-Aug-2025 17:42:42.927 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java 环境变量: D:\dzwl\dzwlaz\java\jdk1.8\jre 05-Aug-2025 17:42:42.927 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java虚拟机版本: 1.8.0_101-b13 05-Aug-2025 17:42:42.927 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log JVM.供应商: Oracle Corporation 05-Aug-2025 17:42:42.927 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: D:\dzwl\dzwlaz\tomcat\tomcat1 05-Aug-2025 17:42:42.927 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: D:\dzwl\dzwlaz\tomcat\tomcat1 05-Aug-2025 17:42:42.927 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcatalina.home=D:\dzwl\dzwlaz\tomcat\tomcat1 05-Aug-2025 17:42:42.927 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcatalina.base=D:\dzwl\dzwlaz\tomcat\tomcat1 05-Aug-2025 17:42:42.927 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dignore.endorsed.dirs=D:\dzwl\dzwlaz\tomcat\tomcat1\endorsed 05-Aug-2025 17:42:42.931 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.io.tmpdir=D:\dzwl\dzwlaz\tomcat\tomcat1\temp 05-Aug-2025 17:42:42.931 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 05-Aug-2025 17:42:42.932 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dfile.encoding=utf-8 05-Aug-2025 17:42:42.932 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.util.logging.config.file=D:\dzwl\dzwlaz\tomcat\tomcat1\conf\logging.properties 05-Aug-2025 17:42:42.932 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: exit 05-Aug-2025 17:42:42.932 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: abort 05-Aug-2025 17:42:42.932 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Xms4096m 05-Aug-2025 17:42:42.932 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Xmx4096m 05-Aug-2025 17:42:42.934 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent 使用APR版本[1.7.4]加载了基于APR的Apache Tomcat本机库[1.3.0]。 05-Aug-2025 17:42:42.934 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR功能:IPv6[true]、sendfile[true]、accept filters[false]、random[true]、UDS [true]。 05-Aug-2025 17:42:42.934 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR/OpenSSL配置:useAprConnector[false],useOpenSSL[true] 05-Aug-2025 17:42:42.940 信息 [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL成功初始化 [OpenSSL 3.0.13 30 Jan 2024] 05-Aug-2025 17:42:43.146 信息 [main] org.apache.coyote.AbstractProtocol.init 初始化协议处理器 ["http-nio-8003"] 05-Aug-2025 17:42:43.161 信息 [main] org.apache.catalina.startup.Catalina.load 服务器在[416]毫秒内初始化 05-Aug-2025 17:42:43.184 信息 [main] org.apache.catalina.core.StandardService.startInternal 正在启动服务[Catalina] 05-Aug-2025 17:42:43.184 信息 [main] org.apache.catalina.core.StandardEngine.startInternal 正在启动 Servlet 引擎:[Apache Tomcat/9.0.90] 05-Aug-2025 17:42:43.609 警告 [main] org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom 使用[SHA1PRNG]创建会话ID生成的SecureRandom实例花费了[280]毫秒。 05-Aug-2025 17:42:43.626 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\dzwl\dzwlaz\webapps\api1\api] 05-Aug-2025 17:43:00.246 信息 [main] org.apache.jasper.servlet.TldScanner.scanJars 至少有一个JAR被扫描用于TLD但尚未包含TLD。 为此记录器启用调试日志记录,以获取已扫描但未在其中找到TLD的完整JAR列表。 在扫描期间跳过不需要的JAR可以缩短启动时间和JSP编译时间。 05-Aug-2025 17:43:56.196 严重 [main] org.apache.catalina.startup.HostConfig.deployDirectory 无法部署应用目录 [D:\dzwl\dzwlaz\webapps\api1\api] java.lang.IllegalStateException: 启动子级时出错 at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:602) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:571) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:603) at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1175) at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1888) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112) at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:1086) at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:470) at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1584) at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:312) at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:109) at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:385) at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:332) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:776) at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:721) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1203) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1193) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:749) at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:211) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) at org.apache.catalina.core.StandardService.startInternal(StandardService.java:415) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:878) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) at org.apache.catalina.startup.Catalina.start(Catalina.java:735) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:345) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:473) Caused by: org.apache.catalina.LifecycleException: 无法启动组件[StandardEngine[Catalina].StandardHost[localhost].StandardContext[/api]] at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:402) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:179) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:599) ... 37 more Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'emPowerInfo': Invocation of init method failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 对象名 'sys_site_license' 无效。 ### The error may exist in com/dzwl/core/mapper/SysSiteLicenseMapper.java (best guess) ### The error may involve defaultParameterMap ### The error occurred while setting parameters ### SQL: SELECT id, name, scode, etime, info FROM sys_site_license WITH (NOLOCK) ### Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 对象名 'sys_site_license' 无效。 ; bad SQL grammar []; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: 对象名 'sys_site_license' 无效。 at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:160) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:415) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1786) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:516) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:324) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:897) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:879) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:551) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:405) at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:173) at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:153) at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:95) at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:172) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4438) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) ... 38 more Caused by: org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 对象名 'sys_site_license' 无效。 ### The error may exist in com/dzwl/core/mapper/SysSiteLicenseMapper.java (best guess) ### The error may involve defaultParameterMap ### The error occurred while setting parameters ### SQL: SELECT id, name, scode, etime, info FROM sys_site_license WITH (NOLOCK) ### Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 对象名 'sys_site_license' 无效。 ; bad SQL grammar []; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: 对象名 'sys_site_license' 无效。 at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:239) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:88) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:440) at com.sun.proxy.$Proxy162.selectList(Unknown Source) at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:223) at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:173) at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:78) at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:148) at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) at com.sun.proxy.$Proxy634.selectList(Unknown Source) at com.baomidou.mybatisplus.extension.service.IService.list(IService.java:279) at com.baomidou.mybatisplus.extension.service.IService.list(IService.java:288) at com.baomidou.mybatisplus.extension.service.IService$$FastClassBySpringCGLIB$$f8525d18.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:367) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) at com.dzwl.core.service.impl.SysSiteLicenseServiceImpl$$EnhancerBySpringCGLIB$$5b9f5d7f.list(<generated>) at com.dzwl.core.config.EmPowerInfo.init(EmPowerInfo.java:96) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:389) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:333) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:157) ... 60 more Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 对象名 'sys_site_license' 无效。 at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:262) at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1632) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:602) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:524) at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7375) at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:3206) at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:247) at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:222) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.execute(SQLServerPreparedStatement.java:505) at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3461) at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:440) at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3459) at com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.execute(PreparedStatementProxyImpl.java:167) at com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:497) at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:64) at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:63) at com.sun.proxy.$Proxy638.query(Unknown Source) at com.baomidou.mybatisplus.core.executor.MybatisSimpleExecutor.doQuery(MybatisSimpleExecutor.java:69) at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:325) at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156) at com.baomidou.mybatisplus.core.executor.MybatisCachingExecutor.query(MybatisCachingExecutor.java:165) at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:65) at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) at com.sun.proxy.$Proxy637.query(Unknown Source) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:426) ... 91 more 05-Aug-2025 17:43:56.201 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\dzwl\dzwlaz\webapps\api1\api]的部署已在[72,575]毫秒内完成 05-Aug-2025 17:43:56.201 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\dzwl\dzwlaz\webapps\api1\dist] 05-Aug-2025 17:43:56.225 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\dzwl\dzwlaz\webapps\api1\dist]的部署已在[24]毫秒内完成 05-Aug-2025 17:43:56.225 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\dzwl\dzwlaz\webapps\api1\jzjk] 05-Aug-2025 17:43:56.250 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\dzwl\dzwlaz\webapps\api1\jzjk]的部署已在[25]毫秒内完成 05-Aug-2025 17:43:56.251 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\dzwl\dzwlaz\webapps\api1\jzjkApp] 05-Aug-2025 17:43:56.273 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\dzwl\dzwlaz\webapps\api1\jzjkApp]的部署已在[23]毫秒内完成 05-Aug-2025 17:43:56.274 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\dzwl\dzwlaz\webapps\api1\pdjk] 05-Aug-2025 17:43:56.297 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\dzwl\dzwlaz\webapps\api1\pdjk]的部署已在[23]毫秒内完成 05-Aug-2025 17:43:56.304 信息 [main] org.apache.coyote.AbstractProtocol.start 开始协议处理句柄["http-nio-8003"] 05-Aug-2025 17:43:56.317 信息 [main] org.apache.catalina.startup.Catalina.start [73155]毫秒后服务器启动

/* 文件路径: Bancai.java */ package com.example.kucun2.entity; import android.annotation.SuppressLint; import com.example.kucun2.entity.data.EntityClassGrassrootsid; import com.example.kucun2.entity.data.SynchronizableEntity; import java.util.Objects; //板材 public class Bancai extends SynchronizableEntity implements EntityClassGrassrootsid { private Integer id; @RefTo(target = Caizhi.class, type = RefType.SINGLE) private Caizhi caizhi; @RefTo(target = Mupi.class, type = RefType.SINGLE) private Mupi mupi1; @RefTo(target = Mupi.class, type = RefType.SINGLE) private Mupi mupi2; @RefTo(target = Dingdan_chanpin_zujian.class, type = RefType.SINGLE) private Dingdan_chanpin_zujian dingdan_chanpin_zujian; private Double houdu; public Bancai() { } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Bancai bancai = (Bancai) o; return Objects.equals(id, bancai.id) ; } public Bancai(Integer id, Caizhi caizhi, Mupi mupi1, Mupi mupi2, Double houdu) { this.id = id; this.caizhi = caizhi; this.mupi1 = mupi1; this.mupi2 = mupi2; this.houdu = houdu; } @Override public Integer getId() { return id; } public void setId(Integer id) { Integer oldValue = this.id; this.id = id; firePropertyChange("id", oldValue, id); } public Caizhi getCaizhi() { return caizhi; } public void setCaizhi(Caizhi caizhi) { Caizhi oldValue = this.caizhi; this.caizhi = caizhi; firePropertyChange("caizhi", oldValue, caizhi); } public Mupi getMupi1() { return mupi1; } public void setMupi1(Mupi mupi1) { Mupi oldValue = this.mupi1; this.mupi1 = mupi1; firePropertyChange("mupi1", oldValue, mupi1); } public Mupi getMupi2() { return mupi2; } public void setMupi2(Mupi mupi2) { Mupi oldValue = this.mupi2; this.mupi2 = mupi2; firePropertyChange("mupi2", oldValue, mupi2); } public Double getHoudu() { return houdu; } public void setHoudu(Double houdu) { Double oldValue = this.houdu; this.houdu = houdu; firePropertyChange("houdu", oldValue, houdu); } /** * 表格中显示的文字 * * @return */ @SuppressLint("DefaultLocale") public String TableText() { String boardInfo = ""; if (caizhi==null){return "";} boardInfo += String.format("%.1f", this.getHoudu()) + this.getCaizhi().getName() + "("; if (mupi1 != null) { boardInfo += (this.getMupi1().getYou() ? this.getMupi1().getName() + "油" : this.getMupi1().getName()); } if (mupi2 != null && mupi1 != null) { boardInfo += ","; } if (mupi2 != null) { boardInfo += (this.getMupi2().getYou() ? this.getMupi2().getName() + "油" : this.getMupi2().getName()); } boardInfo += ")"; return boardInfo; } public com.example.kucun2.entity.Dingdan_chanpin_zujian getDingdan_chanpin_zujian() { return dingdan_chanpin_zujian; } public void setDingdan_chanpin_zujian(com.example.kucun2.entity.Dingdan_chanpin_zujian dingdan_chanpin_zujian) { com.example.kucun2.entity.Dingdan_chanpin_zujian oldValue = this.dingdan_chanpin_zujian; this.dingdan_chanpin_zujian = dingdan_chanpin_zujian; firePropertyChange("dingdan_chanpin_zujian", oldValue, dingdan_chanpin_zujian); } } ================================================================================ /* 文件路径: Caizhi.java */ package com.example.kucun2.entity; import com.example.kucun2.entity.data.EntityClassGrassrootsid; import com.example.kucun2.entity.data.SynchronizableEntity; import java.util.ArrayList; import java.util.List; import java.util.Objects; //材质 public class Caizhi extends SynchronizableEntity implements EntityClassGrassrootsid { private Integer id; private String name; @RefTo(target = Bancai.class, type = RefType.LIST, bidirectional = true, reverseField = "caizhi") private List<Bancai> bancai = new ArrayList<>(); @Override public Integer getId() { return id; } public void setId(Integer id) { Integer oldValue = this.id; this.id = id; firePropertyChange("id", oldValue, id); } public String getName() { return name; } public void setName(String name) { String oldValue = this.name; this.name = name; firePropertyChange("name", oldValue, name); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Caizhi caizhi = (Caizhi) o; return Objects.equals(name, caizhi.name); } @Override public int hashCode() { return Objects.hashCode(name); } public List<Bancai> getBancai() { return bancai; } public void setBancai(List<Bancai> bancai) { List<Bancai> oldValue = this.bancai; this.bancai = bancai; firePropertyChange("bancai", oldValue, bancai); } } ================================================================================ /* 文件路径: Chanpin_Zujian.java */ package com.example.kucun2.entity; import com.example.kucun2.entity.data.EntityClassGrassrootsid; import com.example.kucun2.entity.data.SynchronizableEntity; //产品组件关联 public class Chanpin_Zujian extends SynchronizableEntity implements EntityClassGrassrootsid { private Integer id; private Double one_howmany; @RefTo(target = Chanpin.class, type = RefType.SINGLE) private Chanpin chanpin; @RefTo(target = Zujian.class, type = RefType.SINGLE) private Zujian zujian; @RefTo(target = Bancai.class, type = RefType.SINGLE) private Bancai bancai; public Chanpin_Zujian() { super(); } public Chanpin_Zujian(Integer id, Chanpin chanpin, Zujian zujian, Bancai bancai,Double one_howmany ) { this.id = id; this.one_howmany = one_howmany; this.chanpin = chanpin; this.zujian = zujian; this.bancai = bancai; } @Override public Integer getId() { return id; } public void setId(Integer id) { Integer oldValue = this.id; this.id = id; firePropertyChange("id", oldValue, id); } public Chanpin getChanpin() { return chanpin; } public void setChanpin(Chanpin chanpin) { Chanpin oldValue = this.chanpin; this.chanpin = chanpin; firePropertyChange("chanpin", oldValue, chanpin); } public Zujian getZujian() { return zujian; } public void setZujian(Zujian zujian) { Zujian oldValue = this.zujian; this.zujian = zujian; firePropertyChange("zujian", oldValue, zujian); } public Double getOne_howmany() { return one_howmany; } public void setOne_howmany(Double one_howmany) { Double oldValue = this.one_howmany; this.one_howmany = one_howmany; firePropertyChange("one_howmany", oldValue, one_howmany); } public Bancai getBancai() { return bancai; } public void setBancai(Bancai bancai) { Bancai oldValue = this.bancai; this.bancai = bancai; firePropertyChange("bancai", oldValue, bancai); } } ================================================================================ /* 文件路径: Chanpin.java */ package com.example.kucun2.entity; import com.example.kucun2.entity.data.EntityClassGrassrootsid; import com.example.kucun2.entity.data.SynchronizableEntity; import java.util.ArrayList; import java.util.List; //产品 public class Chanpin extends SynchronizableEntity implements EntityClassGrassrootsid { private Integer id; private String bianhao; @RefTo(target = Chanpin_Zujian.class, type = RefType.LIST) private List<Chanpin_Zujian> chanpinZujian = new ArrayList<>(); @RefTo(target = Dingdan_Chanpin.class, type = RefType.LIST) private List<Dingdan_Chanpin> dingdanChanpin = new ArrayList<>(); @Override public Integer getId() { return id; } public void setId(Integer id) { Integer oldValue = this.id; this.id = id; firePropertyChange("id", oldValue, id); } public List<Chanpin_Zujian> getChanpinZujian() { return chanpinZujian; } public void setChanpinZujian(List<Chanpin_Zujian> chanpinZujian) { List<Chanpin_Zujian> oldValue = this.chanpinZujian; this.chanpinZujian = chanpinZujian; firePropertyChange("chanpinZujian", oldValue, chanpinZujian); } public List<Dingdan_Chanpin> getDingdanChanpin() { return dingdanChanpin; } public void setDingdanChanpin(List<Dingdan_Chanpin> dingdanChanpin) { List<Dingdan_Chanpin> oldValue = this.dingdanChanpin; this.dingdanChanpin = dingdanChanpin; firePropertyChange("dingdanChanpin", oldValue, dingdanChanpin); } public Chanpin() { } public String getBianhao() { return bianhao; } public void setBianhao(String bianhao) { String oldValue = this.bianhao; this.bianhao = bianhao; firePropertyChange("bianhao", oldValue, bianhao); } } ================================================================================ /* 文件路径: Dingdan_bancai.java */ package com.example.kucun2.entity; import com.example.kucun2.entity.data.EntityClassGrassrootsid; import com.example.kucun2.entity.data.SynchronizableEntity; /** * 、 * 订单板材关联 */ public class Dingdan_bancai extends SynchronizableEntity implements EntityClassGrassrootsid { private Integer id; @RefTo(target = Dingdan.class, type = RefType.SINGLE) private Dingdan dingdian; @RefTo(target = Chanpin.class, type = RefType.SINGLE) private Chanpin chanoin; @RefTo(target = Zujian.class, type = RefType.SINGLE) private Zujian zujian; @RefTo(target = Bancai.class, type = RefType.SINGLE) private Bancai bancai; private Integer shuliang; @Override public Integer getId() { return id; } public void setId(Integer id) { Integer oldValue = this.id; this.id = id; firePropertyChange("id", oldValue, id); } public Dingdan getDingdian() { return dingdian; } public void setDingdian(Dingdan dingdian) { Dingdan oldValue = this.dingdian; this.dingdian = dingdian; firePropertyChange("dingdian", oldValue, dingdian); } public Chanpin getChanoin() { return chanoin; } public void setChanoin(Chanpin chanoin) { Chanpin oldValue = this.chanoin; this.chanoin = chanoin; firePropertyChange("chanoin", oldValue, chanoin); } public Zujian getZujian() { return zujian; } public void setZujian(Zujian zujian) { Zujian oldValue = this.zujian; this.zujian = zujian; firePropertyChange("zujian", oldValue, zujian); } public Bancai getBancai() { return bancai; } public void setBancai(Bancai bancai) { Bancai oldValue = this.bancai; this.bancai = bancai; firePropertyChange("bancai", oldValue, bancai); } public Integer getShuliang() { return shuliang; } public void setShuliang(Integer shuliang) { Integer oldValue = this.shuliang; this.shuliang = shuliang; firePropertyChange("shuliang", oldValue, shuliang); } } ================================================================================ /* 文件路径: Dingdan_Chanpin.java */ package com.example.kucun2.entity; import com.example.kucun2.entity.data.EntityClassGrassrootsid; import com.example.kucun2.entity.data.SynchronizableEntity; /** * 订单产品关联 */ public class Dingdan_Chanpin extends SynchronizableEntity implements EntityClassGrassrootsid { private Integer id; @RefTo(target = Dingdan.class, type = RefType.SINGLE) private Dingdan dingdan; @RefTo(target = Chanpin.class, type = RefType.SINGLE) private Chanpin chanpin; private Integer shuliang; public Dingdan_Chanpin(Integer id, Dingdan dingdan, Chanpin chanpin, Integer shuliang) { this.id = id; this.dingdan = dingdan; this.chanpin = chanpin; this.shuliang = shuliang; } @Override public Integer getId() { return id; } public void setId(Integer id) { Integer oldValue = this.id; this.id = id; firePropertyChange("id", oldValue, id); } public Dingdan getDingdan() { return dingdan; } public void setDingdan(Dingdan dingdan) { Dingdan oldValue = this.dingdan; this.dingdan = dingdan; firePropertyChange("dingdan", oldValue, dingdan); } public Chanpin getChanpin() { return chanpin; } public void setChanpin(Chanpin chanpin) { Chanpin oldValue = this.chanpin; this.chanpin = chanpin; firePropertyChange("chanpin", oldValue, chanpin); } public Integer getShuliang() { return shuliang; } public void setShuliang(Integer shuliang) { Integer oldValue = this.shuliang; this.shuliang = shuliang; firePropertyChange("shuliang", oldValue, shuliang); } public Dingdan_Chanpin() { } } ================================================================================ /* 文件路径: Dingdan.java */ package com.example.kucun2.entity; import com.example.kucun2.entity.data.EntityClassGrassrootsid; import com.example.kucun2.entity.data.SynchronizableEntity; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * 订单 */ public class Dingdan extends SynchronizableEntity implements EntityClassGrassrootsid { private Integer id; private String number; @RefTo(target = Dingdan_Chanpin.class, type = RefType.LIST) private List<Dingdan_Chanpin> dingdanChanpin = new ArrayList<>(); @RefTo(target = Dingdan_chanpin_zujian.class, type = RefType.LIST) private List<Dingdan_chanpin_zujian> dingdanChanpinZujian = new ArrayList<>(); private Date xiadan; private Date jiaohuo; public List<Dingdan_Chanpin> getDingdanChanpin() { return dingdanChanpin; } public void setDingdanChanpin(List<Dingdan_Chanpin> dingdanChanpin) { List<Dingdan_Chanpin> oldValue = this.dingdanChanpin; this.dingdanChanpin = dingdanChanpin; firePropertyChange("dingdanChanpin", oldValue, dingdanChanpin); } @Override public Integer getId() { return id; } public void setId(Integer id) { Integer oldValue = this.id; this.id = id; firePropertyChange("id", oldValue, id); } public String getNumber() { return number; } public void setNumber(String number) { String oldValue = this.number; this.number = number; firePropertyChange("number", oldValue, number); } public Date getXiadan() { return xiadan; } public void setXiadan(Date xiadan) { Date oldValue = this.xiadan; this.xiadan = xiadan; firePropertyChange("xiadan", oldValue, xiadan); } public Date getJiaohuo() { return jiaohuo; } public void setJiaohuo(Date jiaohuo) { Date oldValue = this.jiaohuo; this.jiaohuo = jiaohuo; firePropertyChange("jiaohuo", oldValue, jiaohuo); } public Dingdan() { } public List<Dingdan_chanpin_zujian> getDingdanChanpinZujian() { return dingdanChanpinZujian; } public void setDingdanChanpinZujian(List<Dingdan_chanpin_zujian> dingdanChanpinZujian) { List<Dingdan_chanpin_zujian> oldValue = this.dingdanChanpinZujian; this.dingdanChanpinZujian = dingdanChanpinZujian; firePropertyChange("dingdanChanpinZujian", oldValue, dingdanChanpinZujian); } } ================================================================================ /* 文件路径: Information.java */ package com.example.kucun2.entity; import android.annotation.SuppressLint; import androidx.annotation.Keep; import com.google.gson.Gson; import com.google.gson.JsonSyntaxException; import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; @Keep // 防止Proguard混淆 public class Information<T> { private Integer status; private String text; private T data; // 使用泛型保证类型安全 private static final Gson gson = new Gson(); // Gson实例复用 // 构造方法 public Information(Integer status, String text, T data) { this.status = status; this.text = text; this.data = data; } // JSON反序列化构造方法 @SuppressLint("NewApi") public Information(Integer status, String text, String jsonData, Type dataType) { this.status = status; this.text = text; try { this.data = gson.fromJson(jsonData, dataType); } catch (JsonSyntaxException e) { this.data = null; // 处理解析失败 } } // 空构造方法 public Information() { } // 序列化为JSON public String toJson() { return gson.toJson(this); } // 静态创建方法 public static <T> Information<T> newSuccess(T data) { return new Information<>(200, "success", data); } public static Information<String> newSuccess(String text) { return new Information<>(200, "success", text); } public static <T> Information<T> newFail(int status, String text, T data) { return new Information<>(status, text, data); } // Getter/Setter public Integer getStatus() { return status; } public void setStatus(Integer status) { this.status = status; } public String getText() { return text; } public void setText(String text) { this.text = text; } public T getData() { return data; } public void setData(T data) { this.data = data; } } ================================================================================ /* 文件路径: Jinhuo.java */ package com.example.kucun2.entity; import com.example.kucun2.entity.data.EntityClassGrassrootsid; import com.example.kucun2.entity.data.SynchronizableEntity; import java.util.Date; /** * 进货消耗类 */ public class Jinhuo extends SynchronizableEntity implements EntityClassGrassrootsid { private Integer shuliang; private Integer id; @RefTo(target = Dingdan.class, type = RefType.SINGLE) private Dingdan_bancai dingdan_bancai; @RefTo(target = User.class, type = RefType.SINGLE) private User user; private Date date; public Jinhuo() { } public Jinhuo(Integer shuliang, Integer id, Dingdan_bancai dingdan_bancai, User user, Date date) { this.shuliang = shuliang; this.id = id; this.dingdan_bancai = dingdan_bancai; this.user = user; this.date = date; } public Integer getShuliang() { return shuliang; } public void setShuliang(Integer shuliang) { Integer oldValue = this.shuliang; this.shuliang = shuliang; firePropertyChange("shuliang", oldValue, shuliang); } @Override public Integer getId() { return id; } @Override public void setId(Integer id) { Integer oldValue = this.id; this.id = id; firePropertyChange("id", oldValue, id); } public Dingdan_bancai getDingdan_bancai() { return dingdan_bancai; } public void setDingdan_bancai(Dingdan_bancai dingdan_bancai) { Dingdan_bancai oldValue = this.dingdan_bancai; this.dingdan_bancai = dingdan_bancai; firePropertyChange("dingdan_bancai", oldValue, dingdan_bancai); } public User getUser() { return user; } public void setUser(User user) { User oldValue = this.user; this.user = user; firePropertyChange("user", oldValue, user); } public Date getDate() { return date; } public void setDate(Date date) { Date oldValue = this.date; this.date = date; firePropertyChange("date", oldValue, date); } } ================================================================================ /* 文件路径: Kucun.java */ package com.example.kucun2.entity; import com.example.kucun2.entity.data.EntityClassGrassrootsid; import com.example.kucun2.entity.data.SynchronizableEntity; /** * 库存 */ public class Kucun extends SynchronizableEntity implements EntityClassGrassrootsid { private Integer id; private Integer shuliang; @RefTo(target = Bancai.class, type = RefType.SINGLE) private Bancai bancai; @Override public Integer getId() { return id; } public void setId(Integer id) { Integer oldValue = this.id; this.id = id; firePropertyChange("id", oldValue, id); } public Integer getShuliang() { return shuliang; } public void setShuliang(Integer shuliang) { Integer oldValue = this.shuliang; this.shuliang = shuliang; firePropertyChange("shuliang", oldValue, shuliang); } public Bancai getBancai() { return bancai; } public void setBancai(Bancai bancai) { Bancai oldValue = this.bancai; this.bancai = bancai; firePropertyChange("bancai", oldValue, bancai); } public Kucun() { } public Kucun(Bancai bancai) { this.bancai = bancai; } public Kucun(Integer id, Integer shuliang, Bancai bancai) { this.id = id; this.shuliang = shuliang; this.bancai = bancai; } } ================================================================================ /* 文件路径: Mupi.java */ package com.example.kucun2.entity; import android.annotation.SuppressLint; import com.example.kucun2.entity.data.EntityClassGrassrootsid; import com.example.kucun2.entity.data.SynchronizableEntity; import java.util.ArrayList; import java.util.List; public class Mupi extends SynchronizableEntity implements EntityClassGrassrootsid { private Integer id; private String name; /** * 是否有油漆 */ private Boolean you = false; @RefTo(target = Bancai.class, type = RefType.LIST, bidirectional = true, reverseField = "mupi1") private List<Bancai> bancais = new ArrayList<>(); @Override public Integer getId() { return id; } public void setId(Integer id) { Integer oldValue = this.id; this.id = id; firePropertyChange("id", oldValue, id); } public String getName() { return name; } public void setName(String name) { String oldValue = this.name; this.name = name; firePropertyChange("name", oldValue, name); } public Boolean getYou() { if (you == null) { you = false; return false; } return you; } public void setYou(Boolean you) { if (you == null) return; Boolean oldValue = this.you; this.you = you; firePropertyChange("you", oldValue, you); } public List<Bancai> getBancais() { return bancais; } public void setBancais(List<Bancai> bancais) { List<Bancai> oldValue = this.bancais; this.bancais = bancais; firePropertyChange("bancais", oldValue, bancais); } public Mupi() { } public Mupi(Integer id, String name, List<Bancai> bancais) { this.id = id; this.name = name; this.bancais = bancais; } public Mupi(List<Bancai> bancais, Boolean you, String name, Integer id) { this.bancais = bancais; this.you = you; this.name = name; this.id = id; } // 3. 木皮显示格式化方法 public String formatMupiDisplay() { return getName() + (getYou() ? "油" : ""); } } ================================================================================ /* 文件路径: RefTo.java */ package com.example.kucun2.entity; import com.example.kucun2.entity.data.SynchronizableEntity; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 关联关系注解 */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface RefTo { /** * 关联的目标实体类型 */ Class<?> target(); /** * 关联类型(单引用/列表) */ RefType type() default RefType.SINGLE; /** * 存储关联ID的字段名(默认为当前字段) */ String idField() default ""; /** * 是否双向关联 */ boolean bidirectional() default false; /** * 双向关联时的反向字段名 */ String reverseField() default ""; } ================================================================================ /* 文件路径: RefType.java */ package com.example.kucun2.entity; /** * 关联类型枚举 */ public enum RefType { SINGLE, // 单实体引用 LIST // 实体列表引用 } ================================================================================ /* 文件路径: User.java */ package com.example.kucun2.entity; import com.example.kucun2.entity.data.EntityClassGrassrootsid; import com.example.kucun2.entity.data.SynchronizableEntity; /** * 用户实体类(扩展版) * 添加了当前用户标记功能 */ public class User extends SynchronizableEntity implements EntityClassGrassrootsid { private Integer id; private String name; private String andy; private String pass; private Integer role; private boolean isCurrentUser; // 新增字段:标记当前用户 // ====================== Getter/Setter ====================== @Override public Integer getId() { return id; } public void setId(Integer id) { Integer oldValue = this.id; this.id = id; firePropertyChange("id", oldValue, id); } public String getName() { return name; } public void setName(String name) { String oldValue = this.name; this.name = name; firePropertyChange("name", oldValue, name); } public String getAndy() { return andy; } public void setAndy(String andy) { String oldValue = this.andy; this.andy = andy; firePropertyChange("andy", oldValue, andy); } public String getPass() { return pass; } public void setPass(String pass) { String oldValue = this.pass; this.pass = pass; firePropertyChange("pass", oldValue, pass); } public Integer getRole() { return role; } public void setRole(Integer role) { Integer oldValue = this.role; this.role = role; firePropertyChange("role", oldValue, role); } // ====================== 当前用户管理 ====================== public boolean isCurrentUser() { return isCurrentUser; } public void setIsCurrentUser(boolean isCurrentUser) { boolean oldValue = this.isCurrentUser; this.isCurrentUser = isCurrentUser; firePropertyChange("isCurrentUser", oldValue, isCurrentUser); } // ====================== 构造方法 ====================== public User(int id, String name, String andy, String pass, int role) { this.id = id; this.name = name; this.andy = andy; this.pass = pass; this.role = role; } public User() { // 默认构造器 } } ================================================================================ /* 文件路径: Zujian.java */ package com.example.kucun2.entity; import com.example.kucun2.entity.data.EntityClassGrassrootsid; import com.example.kucun2.entity.data.SynchronizableEntity; /** * 组件 */ public class Zujian extends SynchronizableEntity implements EntityClassGrassrootsid { private Integer id; private String name; public Zujian() { } public Zujian(Integer id, String name) { this.id = id; this.name = name; } @Override public Integer getId() { return id; } public void setId(Integer id) { Integer oldValue = this.id; this.id = id; firePropertyChange("id", oldValue, id); } public String getName() { return name; } public void setName(String name) { String oldValue = this.name; this.name = name; firePropertyChange("name", oldValue, name); } } 那个数据库合适

“D:\Program Files\Java\jdk1.8.0_181\bin\java.exe” -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true “-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2019.1.3\lib\idea_rt.jar=52581:D:\Program Files\JetBrains\IntelliJ IDEA 2019.1.3\bin” -Dfile.encoding=UTF-8 -classpath “D:\Program Files\Java\jdk1.8.0_181\jre\lib\charsets.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\deploy.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\cldrdata.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\dnsns.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jaccess.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jfxrt.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\localedata.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\nashorn.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunec.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\zipfs.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\javaws.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\jce.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\jfr.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\jfxswt.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\jsse.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\management-agent.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\plugin.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\resources.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\rt.jar;E:\server3\importdata_qwkh\api\target\classes;C:\Users\Administrator.m2\repository\com\alibaba\fastjson\1.2.3\fastjson-1.2.3.jar;C:\Users\Administrator.m2\repository\org\springframework\boot\spring-boot-starter-web\2.2.5.RELEASE\spring-boot-starter-web-2.2.5.RELEASE.jar;C:\Users\Administrator.m2\repository\org\springframework\boot\spring-boot-starter\2.2.5.RELEASE\spring-boot-starter-2.2.5.RELEASE.jar;C:\Users\Administrator.m2\repository\org\springframework\boot\spring-boot\2.2.5.RELEASE\spring-boot-2.2.5.RELEASE.jar;C:\Users\Administrator.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.2.5.RELEASE\spring-boot-autoconfigure-2.2.5.RELEASE.jar;C:\Users\Administrator.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.2.5.RELEASE\spring-boot-starter-logging-2.2.5.RELEASE.jar;C:\Users\Administrator.m2\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;C:\Users\Administrator.m2\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;C:\Users\Administrator.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.12.1\log4j-to-slf4j-2.12.1.jar;C:\Users\Administrator.m2\repository\org\apache\logging\log4j\log4j-api\2.12.1\log4j-api-2.12.1.jar;C:\Users\Administrator.m2\repository\org\slf4j\jul-to-slf4j\1.7.30\jul-to-slf4j-1.7.30.jar;C:\Users\Administrator.m2\repository\org\yaml\snakeyaml\1.25\snakeyaml-1.25.jar;C:\Users\Administrator.m2\repository\org\springframework\boot\spring-boot-starter-json\2.2.5.RELEASE\spring-boot-starter-json-2.2.5.RELEASE.jar;C:\Users\Administrator.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.10.2\jackson-databind-2.10.2.jar;C:\Users\Administrator.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.10.2\jackson-annotations-2.10.2.jar;C:\Users\Administrator.m2\repository\com\fasterxml\jackson\core\jackson-core\2.10.2\jackson-core-2.10.2.jar;C:\Users\Administrator.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.10.2\jackson-datatype-jdk8-2.10.2.jar;C:\Users\Administrator.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.10.2\jackson-datatype-jsr310-2.10.2.jar;C:\Users\Administrator.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.10.2\jackson-module-parameter-names-2.10.2.jar;C:\Users\Administrator.m2\repository\org\springframework\boot\spring-boot-starter-validation\2.2.5.RELEASE\spring-boot-starter-validation-2.2.5.RELEASE.jar;C:\Users\Administrator.m2\repository\jakarta\validation\jakarta.validation-api\2.0.2\jakarta.validation-api-2.0.2.jar;C:\Users\Administrator.m2\repository\org\hibernate\validator\hibernate-validator\6.0.18.Final\hibernate-validator-6.0.18.Final.jar;C:\Users\Administrator.m2\repository\org\jboss\logging\jboss-logging\3.4.1.Final\jboss-logging-3.4.1.Final.jar;C:\Users\Administrator.m2\repository\com\fasterxml\classmate\1.5.1\classmate-1.5.1.jar;C:\Users\Administrator.m2\repository\org\springframework\spring-web\5.2.4.RELEASE\spring-web-5.2.4.RELEASE.jar;C:\Users\Administrator.m2\repository\org\springframework\spring-beans\5.2.4.RELEASE\spring-beans-5.2.4.RELEASE.jar;C:\Users\Administrator.m2\repository\org\springframework\spring-webmvc\5.2.4.RELEASE\spring-webmvc-5.2.4.RELEASE.jar;C:\Users\Administrator.m2\repository\org\springframework\spring-aop\5.2.4.RELEASE\spring-aop-5.2.4.RELEASE.jar;C:\Users\Administrator.m2\repository\org\springframework\spring-context\5.2.4.RELEASE\spring-context-5.2.4.RELEASE.jar;C:\Users\Administrator.m2\repository\org\springframework\spring-expression\5.2.4.RELEASE\spring-expression-5.2.4.RELEASE.jar;C:\Users\Administrator.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\2.2.5.RELEASE\spring-boot-starter-tomcat-2.2.5.RELEASE.jar;C:\Users\Administrator.m2\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;C:\Users\Administrator.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.31\tomcat-embed-core-9.0.31.jar;C:\Users\Administrator.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.31\tomcat-embed-el-9.0.31.jar;C:\Users\Administrator.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.31\tomcat-embed-websocket-9.0.31.jar;C:\Users\Administrator.m2\repository\org\mybatis\spring\boot\mybatis-spring-boot-starter\2.1.0\mybatis-spring-boot-starter-2.1.0.jar;C:\Users\Administrator.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\2.2.5.RELEASE\spring-boot-starter-jdbc-2.2.5.RELEASE.jar;C:\Users\Administrator.m2\repository\com\zaxxer\HikariCP\3.4.2\HikariCP-3.4.2.jar;C:\Users\Administrator.m2\repository\org\springframework\spring-jdbc\5.2.4.RELEASE\spring-jdbc-5.2.4.RELEASE.jar;C:\Users\Administrator.m2\repository\org\springframework\spring-tx\5.2.4.RELEASE\spring-tx-5.2.4.RELEASE.jar;C:\Users\Administrator.m2\repository\org\mybatis\spring\boot\mybatis-spring-boot-autoconfigure\2.1.0\mybatis-spring-boot-autoconfigure-2.1.0.jar;C:\Users\Administrator.m2\repository\org\mybatis\mybatis\3.5.2\mybatis-3.5.2.jar;C:\Users\Administrator.m2\repository\org\mybatis\mybatis-spring\2.0.2\mybatis-spring-2.0.2.jar;C:\Users\Administrator.m2\repository\com\microsoft\sqlserver\mssql-jdbc\6.4.0.jre8\mssql-jdbc-6.4.0.jre8.jar;C:\Users\Administrator.m2\repository\mysql\mysql-connector-java\5.1.30\mysql-connector-java-5.1.30.jar;C:\Users\Administrator.m2\repository\commons-lang\commons-lang\2.6\commons-lang-2.6.jar;C:\Users\Administrator.m2\repository\commons-codec\commons-codec\1.11\commons-codec-1.11.jar;C:\Users\Administrator.m2\repository\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;C:\Users\Administrator.m2\repository\org\springframework\spring-core\5.2.4.RELEASE\spring-core-5.2.4.RELEASE.jar;C:\Users\Administrator.m2\repository\org\springframework\spring-jcl\5.2.4.RELEASE\spring-jcl-5.2.4.RELEASE.jar;C:\Users\Administrator.m2\repository\cn\easyproject\orai18n\12.1.0.2.0\orai18n-12.1.0.2.0.jar;C:\Users\Administrator.m2\repository\org\assertj\assertj-core\3.13.2\assertj-core-3.13.2.jar;E:\server3\importdata_qwkh\api\lib\kingbase8-8.6.0.jar;C:\Users\Administrator.m2\repository\com\oracle\ojdbc\ojdbc8\19.3.0.0\ojdbc8-19.3.0.0.jar;C:\Users\Administrator.m2\repository\com\oracle\ojdbc\ucp\19.3.0.0\ucp-19.3.0.0.jar;C:\Users\Administrator.m2\repository\com\oracle\ojdbc\oraclepki\19.3.0.0\oraclepki-19.3.0.0.jar;C:\Users\Administrator.m2\repository\com\oracle\ojdbc\osdt_cert\19.3.0.0\osdt_cert-19.3.0.0.jar;C:\Users\Administrator.m2\repository\com\oracle\ojdbc\osdt_core\19.3.0.0\osdt_core-19.3.0.0.jar;C:\Users\Administrator.m2\repository\com\oracle\ojdbc\simplefan\19.3.0.0\simplefan-19.3.0.0.jar;C:\Users\Administrator.m2\repository\com\oracle\ojdbc\ons\19.3.0.0\ons-19.3.0.0.jar;C:\Users\Administrator.m2\repository\commons-httpclient\commons-httpclient\3.1\commons-httpclient-3.1.jar;C:\Users\Administrator.m2\repository\commons-logging\commons-logging\1.0.4\commons-logging-1.0.4.jar;C:\Users\Administrator.m2\repository\org\apache\httpcomponents\httpasyncclient\4.1.4\httpasyncclient-4.1.4.jar;C:\Users\Administrator.m2\repository\org\apache\httpcomponents\httpcore\4.4.13\httpcore-4.4.13.jar;C:\Users\Administrator.m2\repository\org\apache\httpcomponents\httpcore-nio\4.4.13\httpcore-nio-4.4.13.jar;C:\Users\Administrator.m2\repository\org\apache\httpcomponents\httpclient\4.5.11\httpclient-4.5.11.jar” com.nbheyi.hy_menjin.HyMenjinApplication . ____ _ __ _ _ /\ / ’ __ _ () __ __ _ \ \ \ ( ( )__ | '_ | '| | ’ / | \ \ \ \/ )| |)| | | | | || (| | ) ) ) ) ’ || .__|| ||| |_, | / / / / =========||==============|/=//// :: Spring Boot :: (v2.2.5.RELEASE) 2025-08-06 17:39:41.390 INFO 13028 — [ main] c.nbheyi.hy_menjin.HyMenjinApplication : Starting HyMenjinApplication on PC-20160722JXJK with PID 13028 (E:\server3\importdata_qwkh\api\target\classes started by Administrator in E:\server3\importdata_qwkh\api) 2025-08-06 17:39:41.397 INFO 13028 — [ main] c.nbheyi.hy_menjin.HyMenjinApplication : No active profile set, falling back to default profiles: default 2025-08-06 17:39:43.909 INFO 13028 — [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8081 (http) 2025-08-06 17:39:43.919 INFO 13028 — [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2025-08-06 17:39:43.920 INFO 13028 — [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.31] 2025-08-06 17:39:44.036 INFO 13028 — [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2025-08-06 17:39:44.037 INFO 13028 — [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 2452 ms 2025-08-06 17:39:44.669 INFO 13028 — [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService ‘applicationTaskExecutor’ 2025-08-06 17:39:45.020 INFO 13028 — [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8081 (http) with context path ‘’ 2025-08-06 17:39:45.024 INFO 13028 — [ main] c.nbheyi.hy_menjin.HyMenjinApplication : Started HyMenjinApplication in 4.434 seconds (JVM running for 5.969) 定时开始 2025-08-06 17:39:50.059 INFO 13028 — [ Timer-0] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting… 2025-08-06 17:40:20.647 ERROR 13028 — [ Timer-0] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Exception during pool initialization. com.microsoft.sqlserver.jdbc.SQLServerException: The server sql2008r2 is not configured to listen with TCP/IP. at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:228) ~[mssql-jdbc-6.4.0.jre8.jar:na] at com.microsoft.sqlserver.jdbc.SQLServerConnection.getInstancePort(SQLServerConnection.java:5478) ~[mssql-jdbc-6.4.0.jre8.jar:na] at com.microsoft.sqlserver.jdbc.SQLServerConnection.primaryPermissionCheck(SQLServerConnection.java:2151) ~[mssql-jdbc-6.4.0.jre8.jar:na] at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:1903) ~[mssql-jdbc-6.4.0.jre8.jar:na] at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectInternal(SQLServerConnection.java:1762) ~[mssql-jdbc-6.4.0.jre8.jar:na] at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:1077) ~[mssql-jdbc-6.4.0.jre8.jar:na] at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:623) ~[mssql-jdbc-6.4.0.jre8.jar:na] at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-3.4.2.jar:na] at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:354) ~[HikariCP-3.4.2.jar:na] at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202) ~[HikariCP-3.4.2.jar:na] at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:473) [HikariCP-3.4.2.jar:na] at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:554) [HikariCP-3.4.2.jar:na] at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:115) [HikariCP-3.4.2.jar:na] at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) [HikariCP-3.4.2.jar:na] at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:158) [spring-jdbc-5.2.4.RELEASE.jar:5.2.4.RELEASE] at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:116) [spring-jdbc-5.2.4.RELEASE.jar:5.2.4.RELEASE] at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:79) [spring-jdbc-5.2.4.RELEASE.jar:5.2.4.RELEASE] at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:80) [mybatis-spring-2.0.2.jar:2.0.2] at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:67) [mybatis-spring-2.0.2.jar:2.0.2] at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:336) [mybatis-3.5.2.jar:3.5.2] at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:85) [mybatis-3.5.2.jar:3.5.2] at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62) [mybatis-3.5.2.jar:3.5.2] at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:324) [mybatis-3.5.2.jar:3.5.2] at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156) [mybatis-3.5.2.jar:3.5.2] at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109) [mybatis-3.5.2.jar:3.5.2] at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:83) [mybatis-3.5.2.jar:3.5.2] at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) [mybatis-3.5.2.jar:3.5.2] at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140) [mybatis-3.5.2.jar:3.5.2] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_181] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_181] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_181] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_181] at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:426) [mybatis-spring-2.0.2.jar:2.0.2] at com.sun.proxy.$Proxy63.selectList(Unknown Source) [na:na] at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:223) [mybatis-spring-2.0.2.jar:2.0.2] at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:147) [mybatis-3.5.2.jar:3.5.2] at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:80) [mybatis-3.5.2.jar:3.5.2] at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:57) [mybatis-3.5.2.jar:3.5.2] at com.sun.proxy.$Proxy64.getTablexx_flc(Unknown Source) [na:na] at com.nbheyi.hy_menjin.timer.importRsxxTimer.import_hyc_xx(importRsxxTimer.java:64) [classes/:na] at com.nbheyi.hy_menjin.timer.importRsxxTimer.access$100(importRsxxTimer.java:18) [classes/:na] at com.nbheyi.hy_menjin.timer.importRsxxTimer$1.run(importRsxxTimer.java:43) [classes/:na] at java.util.TimerThread.mainLoop(Timer.java:555) [na:1.8.0_181] at java.util.TimerThread.run(Timer.java:505) [na:1.8.0_181] org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: The server sql2008r2 is not configured to listen with TCP/IP. The error may exist in class path resource [mappers/YiDongMapper.xml] The error may involve com.nbheyi.hy_menjin.mapper.mapper4.YiDongMapper.getTablexx_flc The error occurred while executing a query Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: The server sql2008r2 is not configured to listen with TCP/IP. at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:78) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:440) at com.sun.proxy.$Proxy63.selectList(Unknown Source) at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:223) at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:147) at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:80) at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:57) at com.sun.proxy.$Proxy64.getTablexx_flc(Unknown Source) at com.nbheyi.hy_menjin.timer.importRsxxTimer.import_hyc_xx(importRsxxTimer.java:64) at com.nbheyi.hy_menjin.timer.importRsxxTimer.access$100(importRsxxTimer.java:18) at com.nbheyi.hy_menjin.timer.importRsxxTimer$1.run(importRsxxTimer.java:43) at java.util.TimerThread.mainLoop(Timer.java:555) at java.util.TimerThread.run(Timer.java:505) Caused by: org.apache.ibatis.exceptions.PersistenceException: Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: The server sql2008r2 is not configured to listen with TCP/IP. The error may exist in class path resource [mappers/YiDongMapper.xml] The error may involve com.nbheyi.hy_menjin.mapper.mapper4.YiDongMapper.getTablexx_flc The error occurred while executing a query Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: The server sql2008r2 is not configured to listen with TCP/IP. at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:149) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:426) ... 11 more Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: The server sql2008r2 is not configured to listen with TCP/IP. at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:82) at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:80) at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:67) at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:336) at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:85) at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62) at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:324) at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:83) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) … 17 more Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The server sql2008r2 is not configured to listen with TCP/IP. at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:228) at com.microsoft.sqlserver.jdbc.SQLServerConnection.getInstancePort(SQLServerConnection.java:5478) at com.microsoft.sqlserver.jdbc.SQLServerConnection.primaryPermissionCheck(SQLServerConnection.java:2151) at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:1903) at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectInternal(SQLServerConnection.java:1762) at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:1077) at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:623) at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:354) at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202) at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:473) at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:554) at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:115) at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:158) at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:116) at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:79) … 27 more 定时开始 2025-08-06 17:40:50.026 INFO 13028 — [ Timer-0] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting… 检查错误修改代码 server.port= 8081 spring.datasource.primary.driver-class-name=com.kingbase8.Driver #spring.datasource.primary.jdbc-url=jdbc:kingbase8://192.168.1.22:54321/hysoftv23_qwkh?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8 spring.datasource.primary.jdbc-url=jdbc:kingbase8://192.168.1.22:54321/hysoftv23_qwkh?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8¤tSchema=hysoftv23_qwkh spring.datasource.primary.username=nbheyi spring.datasource.primary.password=SA@2010sa spring.datasource.fourth.jdbc-url=jdbc:sqlserver://PC-20160722JXJK\SQL2008R2;DatabaseName=hyoav7_pro_rsxt spring.datasource.fourth.username=sa spring.datasource.fourth.password=sa!@#$%^*(sa spring.datasource.fourth.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver #�����ݶ�ʱ���� 1000����1�� import_ifstart=true import_period=60000 IV=hrkvgudrbshdgvhi mybatis.mapper-locations=classpath:mappers/*.xml DataSource1Config #logging.level.com = debug

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <context:annotation-config/> <context:component-scan base-package="com.example"/> <bean name="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource"> </bean> <bean name="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> </bean> <bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> </bean> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="insert*" propagation="REQUIRED"/> <tx:method name="add*" propagation="REQUIRED"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="edit*" propagation="REQUIRED"/> <tx:method name="delete*" propagation="REQUIRED"/> <tx:method name="get*" propagation="NOT_SUPPORTED"/> <tx:method name="select*" propagation="NOT_SUPPORTED"/> <tx:method name="query*" propagation="NOT_SUPPORTED"/> </tx:attributes> </tx:advice> <bean name="advice" class="com.example.meal_ordering_system.util.AdviceUtil"/> <aop:config> <aop:pointcut id="pointCut" expression="execution(* com.example.meal_ordering_system.service..*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="pointCut"/> <aop:aspect ref="advice"> <aop:before method="before" pointcut-ref="pointCut"/> <aop:after method="after" pointcut-ref="pointCut"/> <aop:around method="around" pointcut-ref="pointCut"/> <aop:after-throwing method="exception" pointcut-ref="pointCut"/> </aop:aspect> </aop:config> </beans>

11:51:34 Acquiring new sqlserver connection 'master' 11:51:34 Acquiring new sqlserver connection 'list_asa-gdp-eas-dev-hk-01' 11:51:34 dbt-sqlserver 11:51:34 Using sqlserver connection "list_asa-gdp-eas-dev-hk-01" 11:51:34 On list_asa-gdp-eas-dev-hk-01: /* {"app": "dbt", "dbt_version": "1.9.0", "profile_name": "profiles", "target_name": "dev", "connection_name": "list_asa-gdp-eas-dev-hk-01"} */ USE [asa-gdp-eas-dev-hk-01]; select name as [schema] from sys.schemas with (nolock) OPTION (LABEL = 'dbt-sqlserver'); 11:51:34 Opening a new connection, currently in state init 11:51:34 sqlserver adapter: Using connection string: DRIVER={ODBC Driver 17 for SQL Server};SERVER=sql-gdp-eas-dev-hk-01.database.windows.net,1433;Database=asa-gdp-eas-dev-hk-01;UID={GRP_DEV_ETLESG_01};PWD=***;encrypt=Yes;TrustServerCertificate=No;APP=dbt-sqlserver/1.9.0 11:51:35 sqlserver adapter: Connected to db: asa-gdp-eas-dev-hk-01 11:51:35 fabric adapter: Database error: ('42000', '[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]USE statement is not supported to switch between databases. Use a new connection to connect to a different Database. (104455) (SQLExecDirectW)') 11:51:35 On list_asa-gdp-eas-dev-hk-01: Close 11:51:35 fabric adapter: Error running SQL: macro list_schemas 11:51:35 fabric adapter: Rolling back transaction. 11:51:35 Connection 'master' was properly closed. 11:51:35 Connection 'list_asa-gdp-eas-dev-hk-01' was properly closed. 11:51:35 11:51:35 Finished running in 0 hours 0 minutes and 1.60 seconds (1.60s). 11:51:35 Encountered an error: Database Error ('42000', '[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]USE statement is not supported to switch between databases. Use a new connection to connect to a different Database. (104455) (SQLExecDirectW)') 11:51:35 Command dbt run failed at 19:51:35.789200 after 3.03 seconds 11:51:35 Sending event: {'category': 'dbt', 'action': 'invocation', 'label': 'end', 'context': [<snowplow_tracker.self_describing_json.SelfDescribingJson object at 0x000001BD433E9B80>, <snowplow_tracker.self_describing_json.SelfDescribingJson object at 0x000001BD44FDADF0>, <snowplow_tracker.self_describing_json.SelfDescribingJson object at 0x000001BD4639AD90>]} 11:51:35 An error was encountered while trying to send an event 11:51:35 Flushing usage events

根据-- 创建数据库 CREATE DATABASE TicketSalesSystem; GO USE TicketSalesSystem; GO -- 创建票价类型表 CREATE TABLE TicketType ( TypeID INT PRIMARY KEY IDENTITY(1,1), TypeName NVARCHAR(20) NOT NULL CHECK (TypeName IN ('老年', '小孩', '成人', '团体')), BasePrice DECIMAL(10,2) NOT NULL, DiscountRate DECIMAL(5,2) DEFAULT 1.0, Description NVARCHAR(255), CreatedAt DATETIME DEFAULT GETDATE(), UpdatedAt DATETIME DEFAULT GETDATE() ); GO -- 创建营业员表 CREATE TABLE Salesperson ( SalespersonID INT PRIMARY KEY IDENTITY(1,1), EmployeeID NVARCHAR(20) UNIQUE NOT NULL, Name NVARCHAR(50) NOT NULL, Password NVARCHAR(100) NOT NULL, Role NVARCHAR(20) DEFAULT 'staff' CHECK (Role IN ('admin', 'staff')), IsActive BIT DEFAULT 1, CreatedAt DATETIME DEFAULT GETDATE(), LastLogin DATETIME NULL ); GO -- 创建门票销售表 CREATE TABLE TicketSale ( SaleID INT PRIMARY KEY IDENTITY(1,1), TypeID INT NOT NULL, SalespersonID INT NOT NULL, Quantity INT NOT NULL CHECK (Quantity > 0), UnitPrice DECIMAL(10,2) NOT NULL, TotalAmount DECIMAL(10,2) NOT NULL, SaleTime DATETIME DEFAULT GETDATE(), IsRefund BIT DEFAULT 0, CONSTRAINT FK_TicketSale_TicketType FOREIGN KEY (TypeID) REFERENCES TicketType(TypeID), CONSTRAINT FK_TicketSale_Salesperson FOREIGN KEY (SalespersonID) REFERENCES Salesperson(SalespersonID) ); GO -- 创建退票记录表 CREATE TABLE RefundRecord ( RefundID INT PRIMARY KEY IDENTITY(1,1), SaleID INT NOT NULL, RefundQuantity INT NOT NULL CHECK (RefundQuantity > 0), RefundAmount DECIMAL(10,2) NOT NULL, RefundTime DATETIME DEFAULT GETDATE(), Reason NVARCHAR(255), CONSTRAINT FK_RefundRecord_TicketSale FOREIGN KEY (SaleID) REFERENCES TicketSale(SaleID) ); GO -- 创建操作日志表 CREATE TABLE AuditLog ( LogID INT PRIMARY KEY IDENTITY(1,1), UserID INT NOT NULL, ActionType NVARCHAR(20) NOT NULL, ActionDetails NVARCHAR(500) NOT NULL, ActionTime DATETIME DEFAULT GETDATE(), CONSTRAINT FK_AuditLog_Salesperson FOREIGN KEY (UserID) REFERENCES Salesperson(SalespersonID) ); GO -- 创建索引优化查询性能 CREATE INDEX IX_TicketSale_SaleTime ON TicketSale(SaleTime); CREATE INDEX IX_TicketSale_Salesperson ON TicketSale(SalespersonID); CREATE INDEX IX_TicketSale_Type ON TicketSale(TypeID); CREATE INDEX IX_RefundRecord_SaleID ON RefundRecord(SaleID); CREATE INDEX IX_AuditLog_ActionTime ON AuditLog(ActionTime); GO -- 存储过程1: 统计指定日期的门票销售情况 CREATE PROCEDURE sp_DailySalesSummary @TargetDate DATE AS BEGIN SELECT TT.TypeName AS 票种类型, SUM(TS.Quantity) AS 总票数, SUM(TS.TotalAmount) AS 总收入 FROM TicketSale TS JOIN TicketType TT ON TS.TypeID = TT.TypeID WHERE CAST(TS.SaleTime AS DATE) = @TargetDate AND TS.IsRefund = 0 GROUP BY TT.TypeName ORDER BY 总收入 DESC; END; GO -- 存储过程2: 统计指定月份的门票销售情况 CREATE PROCEDURE sp_MonthlySalesSummary @Year INT, @Month INT AS BEGIN SELECT TT.TypeName AS 票种类型, SUM(TS.Quantity) AS 总票数, SUM(TS.TotalAmount) AS 总收入 FROM TicketSale TS JOIN TicketType TT ON TS.TypeID = TT.TypeID WHERE YEAR(TS.SaleTime) = @Year AND MONTH(TS.SaleTime) = @Month AND TS.IsRefund = 0 GROUP BY TT.TypeName ORDER BY 总收入 DESC; END; GO -- 存储过程3: 统计指定日期各种价格的门票销售情况 CREATE PROCEDURE sp_DailySalesByPrice @TargetDate DATE AS BEGIN SELECT TS.UnitPrice AS 销售单价, COUNT(TS.SaleID) AS 销售笔数, SUM(TS.Quantity) AS 总票数, SUM(TS.TotalAmount) AS 总收入 FROM TicketSale TS WHERE CAST(TS.SaleTime AS DATE) = @TargetDate AND TS.IsRefund = 0 GROUP BY TS.UnitPrice ORDER BY TS.UnitPrice DESC; END; GO -- 存储过程4: 统计指定营业员指定日期的收费情况 CREATE PROCEDURE sp_SalespersonDailySummary @SalespersonID INT, @TargetDate DATE AS BEGIN SELECT SP.Name AS 营业员姓名, COUNT(TS.SaleID) AS 交易笔数, SUM(TS.Quantity) AS 总票数, SUM(TS.TotalAmount) AS 总收入 FROM TicketSale TS JOIN Salesperson SP ON TS.SalespersonID = SP.SalespersonID WHERE SP.SalespersonID = @SalespersonID AND CAST(TS.SaleTime AS DATE) = @TargetDate AND TS.IsRefund = 0 GROUP BY SP.Name; -- 详细交易列表 SELECT TT.TypeName AS 票种类型, TS.Quantity AS 数量, TS.UnitPrice AS 单价, TS.TotalAmount AS 金额, FORMAT(TS.SaleTime, 'HH:mm:ss') AS 销售时间 FROM TicketSale TS JOIN TicketType TT ON TS.TypeID = TT.TypeID WHERE TS.SalespersonID = @SalespersonID AND CAST(TS.SaleTime AS DATE) = @TargetDate AND TS.IsRefund = 0 ORDER BY TS.SaleTime DESC; END; GO -- 存储过程5: 处理门票销售 CREATE PROCEDURE sp_ProcessTicketSale @TypeID INT, @SalespersonID INT, @Quantity INT, @SaleID INT OUTPUT AS BEGIN BEGIN TRY BEGIN TRANSACTION; DECLARE @UnitPrice DECIMAL(10,2); DECLARE @TotalAmount DECIMAL(10,2); -- 获取票价信息 SELECT @UnitPrice = BasePrice * DiscountRate FROM TicketType WHERE TypeID = @TypeID; IF @UnitPrice IS NULL RAISERROR('无效的票种ID', 16, 1); -- 计算总金额 SET @TotalAmount = @UnitPrice * @Quantity; -- 插入销售记录 INSERT INTO TicketSale ( TypeID, SalespersonID, Quantity, UnitPrice, TotalAmount ) VALUES ( @TypeID, @SalespersonID, @Quantity, @UnitPrice, @TotalAmount ); SET @SaleID = SCOPE_IDENTITY(); -- 记录操作日志 INSERT INTO AuditLog (UserID, ActionType, ActionDetails) VALUES ( @SalespersonID, 'SALE', CONCAT('销售门票: 票种ID=', @TypeID, ', 数量=', @Quantity, ', 金额=', @TotalAmount) ); COMMIT TRANSACTION; END TRY BEGIN CATCH ROLLBACK TRANSACTION; DECLARE @ErrorMessage NVARCHAR(4000) = ERROR_MESSAGE(); RAISERROR(@ErrorMessage, 16, 1); END CATCH END; GO -- 存储过程6: 处理门票退票 CREATE PROCEDURE sp_ProcessTicketRefund @SaleID INT, @RefundQuantity INT, @Reason NVARCHAR(255), @RefundID INT OUTPUT AS BEGIN BEGIN TRY BEGIN TRANSACTION; DECLARE @MaxQuantity INT; DECLARE @UnitPrice DECIMAL(10,2); DECLARE @RefundAmount DECIMAL(10,2); -- 获取原始销售信息 SELECT @MaxQuantity = Quantity, @UnitPrice = UnitPrice FROM TicketSale WHERE SaleID = @SaleID; IF @MaxQuantity IS NULL RAISERROR('无效的销售ID', 16, 1); -- 检查可退票数量 DECLARE @AlreadyRefunded INT = 0; SELECT @AlreadyRefunded = ISNULL(SUM(RefundQuantity), 0) FROM RefundRecord WHERE SaleID = @SaleID; DECLARE @Remaining INT = @MaxQuantity - @AlreadyRefunded; IF @RefundQuantity > @Remaining RAISERROR('退票数量超过可退数量', 16, 1); -- 计算退款金额 SET @RefundAmount = @UnitPrice * @RefundQuantity; -- 插入退票记录 INSERT INTO RefundRecord ( SaleID, RefundQuantity, RefundAmount, Reason ) VALUES ( @SaleID, @RefundQuantity, @RefundAmount, @Reason ); SET @RefundID = SCOPE_IDENTITY(); -- 更新销售记录状态 IF @RefundQuantity = @Remaining UPDATE TicketSale SET IsRefund = 1 WHERE SaleID = @SaleID; -- 记录操作日志 DECLARE @SalespersonID INT = (SELECT SalespersonID FROM TicketSale WHERE SaleID = @SaleID); INSERT INTO AuditLog (UserID, ActionType, ActionDetails) VALUES ( @SalespersonID, 'REFUND', CONCAT('退票处理: 销售ID=', @SaleID, ', 数量=', @RefundQuantity, ', 金额=', @RefundAmount) ); COMMIT TRANSACTION; END TRY BEGIN CATCH ROLLBACK TRANSACTION; DECLARE @ErrorMessage NVARCHAR(4000) = ERROR_MESSAGE(); RAISERROR(@ErrorMessage, 16, 1); END CATCH END; GO -- 存储过程7: 获取所有有效票种 CREATE PROCEDURE sp_GetActiveTicketTypes AS BEGIN SELECT TypeID, TypeName, BasePrice, DiscountRate, ROUND(BasePrice * DiscountRate, 2) AS ActualPrice, Description FROM TicketType ORDER BY TypeName; END; GO -- 存储过程8: 添加新票种 CREATE PROCEDURE sp_AddTicketType @TypeName NVARCHAR(20), @BasePrice DECIMAL(10,2), @DiscountRate DECIMAL(5,2) = 1.0, @Description NVARCHAR(255) = NULL AS BEGIN IF NOT @TypeName IN ('老年', '小孩', '成人', '团体') RAISERROR('无效的票种名称', 16, 1); INSERT INTO TicketType ( TypeName, BasePrice, DiscountRate, Description ) VALUES ( @TypeName, @BasePrice, @DiscountRate, @Description ); RETURN SCOPE_IDENTITY(); END; GO -- 存储过程9: 营业员登录验证 CREATE PROCEDURE sp_VerifySalespersonLogin @EmployeeID NVARCHAR(20), @Password NVARCHAR(100), @IsValid BIT OUTPUT AS BEGIN SET @IsValid = 0; IF EXISTS ( SELECT 1 FROM Salesperson WHERE EmployeeID = @EmployeeID AND Password = @Password AND IsActive = 1 ) BEGIN SET @IsValid = 1; -- 更新最后登录时间 UPDATE Salesperson SET LastLogin = GETDATE() WHERE EmployeeID = @EmployeeID; END END; GO -- 存储过程10: 月度销售趋势分析 CREATE PROCEDURE sp_MonthlySalesTrend @Year INT AS BEGIN SELECT MONTH(SaleTime) AS 月份, SUM(TotalAmount) AS 月收入, COUNT(SaleID) AS 交易笔数, SUM(Quantity) AS 总票数 FROM TicketSale WHERE YEAR(SaleTime) = @Year AND IsRefund = 0 GROUP BY MONTH(SaleTime) ORDER BY 月份; END; GO -- 创建触发器: 更新票种时自动更新更新时间戳 CREATE TRIGGER trg_UpdateTicketTypeTimestamp ON TicketType AFTER UPDATE AS BEGIN UPDATE TicketType SET UpdatedAt = GETDATE() WHERE TypeID IN (SELECT TypeID FROM inserted); END; GO -- 创建触发器: 退票后更新销售记录状态 CREATE TRIGGER trg_AfterRefund ON RefundRecord AFTER INSERT AS BEGIN SET NOCOUNT ON; UPDATE TS SET TS.IsRefund = CASE WHEN (TS.Quantity - i.RefundQuantity) <= 0 THEN 1 ELSE 0 END FROM TicketSale TS INNER JOIN inserted i ON TS.SaleID = i.SaleID; END; GO -- 创建视图: 销售明细视图 CREATE VIEW vw_SaleDetails AS SELECT TS.SaleID, TS.SaleTime, SP.Name AS SalespersonName, TT.TypeName, TS.Quantity, TS.UnitPrice, TS.TotalAmount, CASE WHEN TS.IsRefund = 1 THEN '已退票' ELSE '有效' END AS Status, ISNULL(RR.RefundQuantity, 0) AS RefundedQuantity FROM TicketSale TS JOIN Salesperson SP ON TS.SalespersonID = SP.SalespersonID JOIN TicketType TT ON TS.TypeID = TT.TypeID LEFT JOIN ( SELECT SaleID, SUM(RefundQuantity) AS RefundQuantity FROM RefundRecord GROUP BY SaleID ) RR ON TS.SaleID = RR.SaleID; GO -- 插入初始数据 INSERT INTO TicketType (TypeName, BasePrice, DiscountRate, Description) VALUES ('成人', 100.00, 1.00, '标准成人票'), ('小孩', 50.00, 1.00, '1.2-1.5米儿童票'), ('老年', 60.00, 1.00, '65岁以上老人票'), ('团体', 80.00, 0.90, '10人及以上团体票'); GO INSERT INTO Salesperson (EmployeeID, Name, Password, Role) VALUES ('admin001', '管理员', 'admin123', 'admin'), ('staff001', '张三', 'staff123', 'staff'), ('staff002', '李四', 'staff456', 'staff'); GO -- 插入示例销售记录 DECLARE @SaleID INT; EXEC sp_ProcessTicketSale 1, 2, 2, @SaleID OUTPUT; EXEC sp_ProcessTicketSale 2, 2, 1, @SaleID OUTPUT; EXEC sp_ProcessTicketSale 3, 3, 3, @SaleID OUTPUT; EXEC sp_ProcessTicketSale 4, 3, 10, @SaleID OUTPUT; GO -- 插入示例退票记录 DECLARE @RefundID INT; EXEC sp_ProcessTicketRefund 1, 1, '行程变更', @RefundID OUTPUT; GO这个数据库代码对3. 模型层实现 (model) 位置:src/main/java/com/ticketsystem/model/ 功能:数据库表对应的JavaBean 关键类: TicketType.java Salesperson.java TicketSale.java RefundRecord.java DailySales.java (报表DTO) 示例:TicketSale.java java public class TicketSale { private int saleId; private int typeId; private int salespersonId; private int quantity; private BigDecimal unitPrice; private BigDecimal totalAmount; private Timestamp saleTime; private boolean isRefund; // Getters/Setters } 4. 数据访问层实现 (dao) 位置:src/main/java/com/ticketsystem/dao/ 功能:封装数据库操作,调用存储过程 关键接口: TicketTypeDAO.java TicketSaleDAO.java RefundDAO.java ReportDAO.java 示例:ReportDAOImpl.java java public class ReportDAOImpl implements ReportDAO { private static final String DAILY_SALES_PROC = "{call sp_DailySalesSummary(?)}"; @Override public List<DailySales> getDailySales(LocalDate date) throws SQLException { List<DailySales> results = new ArrayList<>(); try (Connection conn = DatabaseUtil.getConnection(); CallableStatement stmt = conn.prepareCall(DAILY_SALES_PROC)) { stmt.setDate(1, Date.valueOf(date)); stmt.execute(); try (ResultSet rs = stmt.getResultSet()) { while (rs.next()) { DailySales sales = new DailySales(); sales.setTypeName(rs.getString("TypeName")); sales.setTotalTickets(rs.getInt("TotalTickets")); sales.setTotalIncome(rs.getBigDecimal("TotalIncome")); results.add(sales); } } } return results; } } 5. 服务层实现 (service) 位置:src/main/java/com/ticketsystem/service/ 功能:业务逻辑处理 关键类: TicketService.java (售票/退票) ReportService.java (报表) AuthService.java (认证) 示例:TicketServiceImpl.java java public class TicketServiceImpl implements TicketService { private final TicketSaleDAO saleDAO = new TicketSaleDAOImpl(); private final TicketTypeDAO typeDAO = new TicketTypeDAOImpl(); @Override public String processSale(int typeId, int quantity, int salespersonId) { try { TicketType type = typeDAO.getById(typeId); BigDecimal unitPrice = type.getBasePrice().multiply(type.getDiscountRate()); BigDecimal totalAmount = unitPrice.multiply(BigDecimal.valueOf(quantity)); TicketSale sale = new TicketSale(); sale.setTypeId(typeId); sale.setSalespersonId(salespersonId); sale.setQuantity(quantity); sale.setUnitPrice(unitPrice); sale.setTotalAmount(totalAmount); saleDAO.addSale(sale); return "销售成功! 交易号: " + sale.getSaleId(); } catch (SQLException e) { return "销售失败: " + e.getMessage(); } } } 6. 控制器层实现 (servlet) 位置:src/main/java/com/ticketsystem/servlet/ 功能:处理HTTP请求 关键类: TicketSaleServlet.java RefundServlet.java ReportServlet.java AuthServlet.java 示例:TicketSaleServlet.java java @WebServlet("/api/sale") public class TicketSaleServlet extends HttpServlet { private final TicketService ticketService = new TicketServiceImpl(); private final Gson gson = new Gson(); protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { JsonObject data = gson.fromJson(request.getReader(), JsonObject.class); int typeId = data.get("typeId").getAsInt(); int quantity = data.get("quantity").getAsInt(); HttpSession session = request.getSession(); Salesperson user = (Salesperson) session.getAttribute("user"); String result = ticketService.processSale(typeId, quantity, user.getSalespersonId()); response.setContentType("application/json"); response.getWriter().write(gson.toJson(Map.of("message", result))); } } 7. 安全过滤器实现 (filter) 位置:src/main/java/com/ticketsystem/filter/ 功能:请求拦截与认证 关键类:AuthFilter.java java @WebFilter("/*") public class AuthFilter implements Filter { private static final Set<String> ALLOWED_PATHS = Set.of( "/login.html", "/api/login", "/assets/" ); public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; String path = request.getRequestURI().substring(request.getContextPath().length()); boolean allowed = ALLOWED_PATHS.stream().anyMatch(path::startsWith); if (allowed || request.getSession().getAttribute("user") != null) { chain.doFilter(request, response); } else { response.sendRedirect(request.getContextPath() + "/login.html"); } } } 8. 工具类实现 (util) 位置:src/main/java/com/ticketsystem/util/ 功能:通用工具 关键类: DatabaseUtil.java (数据库连接) JsonUtil.java (JSON处理) PasswordUtil.java (密码加密) 示例:DatabaseUtil.java java public class DatabaseUtil { public static Connection getConnection() throws SQLException, NamingException { Context initContext = new InitialContext(); Context envContext = (Context) initContext.lookup("java:/comp/env"); DataSource ds = (DataSource) envContext.lookup("jdbc/TicketDB"); return ds.getConnection(); } }进行重新生成,要求给出完整代码,使用编译器为idea

最新推荐

recommend-type

2014年直流电压电流采样仪生产方案:电路板、BOM单、STM单片机程序及应用 核心版

2014年设计的一款直流电压电流采样仪的整套产品生产方案。该产品已量产1000余套,适用于电力、电子、通信等领域。文中涵盖了硬件和软件两大部分的内容。硬件方面,包括电路板设计、BOM单、外围器件清单以及外壳设计;软件方面,则涉及STM单片机程序和配套的上位机电脑软件。该采样仪的最大测量范围为1000V/100A,具备高精度、高稳定性的特点,能记录并存储8组电压电流数据,并带有触发模式用于实时监测和故障诊断。 适合人群:从事电力、电子、通信领域的工程师和技术人员,尤其是对直流电压电流采样仪有需求的研发人员。 使用场景及目标:①帮助工程师和技术人员了解直流电压电流采样仪的整体设计方案;②提供详细的硬件和软件资料,便于实际生产和应用;③适用于需要高精度、高稳定性的电压电流测量场合。 其他说明:该产品已经成功量产并获得市场好评,文中提供的方案对于相关领域的项目开发具有重要参考价值。
recommend-type

springboot基于安卓的旅游景点导览APP的设计与实现论文

springboot旅游景点导览APP的设计与实现
recommend-type

Python程序TXLWizard生成TXL文件及转换工具介绍

### 知识点详细说明: #### 1. 图形旋转与TXL向导 图形旋转是图形学领域的一个基本操作,用于改变图形的方向。在本上下文中,TXL向导(TXLWizard)是由Esteban Marin编写的Python程序,它实现了特定的图形旋转功能,主要用于电子束光刻掩模的生成。光刻掩模是半导体制造过程中非常关键的一个环节,它确定了在硅片上沉积材料的精确位置。TXL向导通过生成特定格式的TXL文件来辅助这一过程。 #### 2. TXL文件格式与用途 TXL文件格式是一种基于文本的文件格式,它设计得易于使用,并且可以通过各种脚本语言如Python和Matlab生成。这种格式通常用于电子束光刻中,因为它的文本形式使得它可以通过编程快速创建复杂的掩模设计。TXL文件格式支持引用对象和复制对象数组(如SREF和AREF),这些特性可以用于优化电子束光刻设备的性能。 #### 3. TXLWizard的特性与优势 - **结构化的Python脚本:** TXLWizard 使用结构良好的脚本来创建遮罩,这有助于开发者创建清晰、易于维护的代码。 - **灵活的Python脚本:** 作为Python程序,TXLWizard 可以利用Python语言的灵活性和强大的库集合来编写复杂的掩模生成逻辑。 - **可读性和可重用性:** 生成的掩码代码易于阅读,开发者可以轻松地重用和修改以适应不同的需求。 - **自动标签生成:** TXLWizard 还包括自动为图形对象生成标签的功能,这在管理复杂图形时非常有用。 #### 4. TXL转换器的功能 - **查看.TXL文件:** TXL转换器(TXLConverter)允许用户将TXL文件转换成HTML或SVG格式,这样用户就可以使用任何现代浏览器或矢量图形应用程序来查看文件。 - **缩放和平移:** 转换后的文件支持缩放和平移功能,这使得用户在图形界面中更容易查看细节和整体结构。 - **快速转换:** TXL转换器还提供快速的文件转换功能,以实现有效的蒙版开发工作流程。 #### 5. 应用场景与技术参考 TXLWizard的应用场景主要集中在电子束光刻技术中,特别是用于设计和制作半导体器件时所需的掩模。TXLWizard作为一个向导,不仅提供了生成TXL文件的基础框架,还提供了一种方式来优化掩模设计,提高光刻过程的效率和精度。对于需要进行光刻掩模设计的工程师和研究人员来说,TXLWizard提供了一种有效的方法来实现他们的设计目标。 #### 6. 系统开源特性 标签“系统开源”表明TXLWizard遵循开放源代码的原则,这意味着源代码对所有人开放,允许用户自由地查看、修改和分发软件。开源项目通常拥有活跃的社区,社区成员可以合作改进软件,添加新功能,或帮助解决遇到的问题。这种开放性促进了技术创新,并允许用户根据自己的需求定制软件。 #### 7. 压缩包子文件的文件名称列表 文件名称列表中的“txlwizard-master”可能指的是TXLWizard项目的主版本库或主分支。这个名称表明了这是项目源代码的中心点,其他开发者会从这个主分支拉取代码进行合作开发或部署。以“-master”结尾通常是版本控制系统中表示主要开发线路的常见约定,例如Git中的master(现在更常被称为main)分支。 通过这些知识点的详细解释,我们可以看到TXLWizard不仅是一个用于生成TXL文件的工具,它还整合了一系列的功能,使得电子束光刻掩模的设计工作更为高效和直观。同时,作为一个开源项目,它能够借助社区的力量不断进步,为用户带来更多的便利和创新。
recommend-type

【创新图生成:扣子平台的技术前沿与创新思维】:引领图像生成技术的新潮流

# 1. 扣子平台的图像生成技术概述 在当今数字化时代,图像生成技术正成为推动技术创新和社会变革的关键力量。扣子平台正是这一技术革新的代表。本章将对扣子平台的图像生成技术进行一个全面概述,探究它如何将理论技术转化为实际应用,并带来显著的社会影响。 扣子平台运用了先进的图像生成技术,将现实世界和数字空间无缝融合,打造了沉浸式的视觉体验。其技术的核心是通过高度复杂的算法模型,快速生成高质
recommend-type

海康威视机器视觉工程师考核

<think>好的,我现在需要帮助用户了解海康威视机器视觉工程师的考核内容和要求。根据用户提供的引用资料,特别是引用[1]和[2],里面提到了考核素材包分为初级和中级,涵盖理论、算法、应用案例等。首先,我要整理这些信息,确保结构清晰,符合用户要求的格式。 接下来,我需要确认素材包的具体内容,比如初级和中级的不同点。引用[2]提到初级包含基础理论、算法实现和实际案例,中级则增加复杂算法和项目分析。这部分需要分点说明,方便用户理解层次。 另外,用户可能想知道如何准备考核,比如下载素材、学习顺序、模拟考核等,引用[2]中有使用说明和注意事项,这部分也要涵盖进去。同时要注意提醒用户考核窗口已关闭,
recommend-type

Linux环境下Docker Hub公共容器映像检测工具集

在给出的知识点中,我们需要详细解释有关Docker Hub、公共容器映像、容器编排器以及如何与这些工具交互的详细信息。同时,我们会涵盖Linux系统下的相关操作和工具使用,以及如何在ECS和Kubernetes等容器编排工具中运用这些检测工具。 ### Docker Hub 和公共容器映像 Docker Hub是Docker公司提供的一项服务,它允许用户存储、管理以及分享Docker镜像。Docker镜像可以视为应用程序或服务的“快照”,包含了运行特定软件所需的所有必要文件和配置。公共容器映像指的是那些被标记为公开可见的Docker镜像,任何用户都可以拉取并使用这些镜像。 ### 静态和动态标识工具 静态和动态标识工具在Docker Hub上用于识别和分析公共容器映像。静态标识通常指的是在不运行镜像的情况下分析镜像的元数据和内容,例如检查Dockerfile中的指令、环境变量、端口映射等。动态标识则需要在容器运行时对容器的行为和性能进行监控和分析,如资源使用率、网络通信等。 ### 容器编排器与Docker映像 容器编排器是用于自动化容器部署、管理和扩展的工具。在Docker环境中,容器编排器能够自动化地启动、停止以及管理容器的生命周期。常见的容器编排器包括ECS和Kubernetes。 - **ECS (Elastic Container Service)**:是由亚马逊提供的容器编排服务,支持Docker容器,并提供了一种简单的方式来运行、停止以及管理容器化应用程序。 - **Kubernetes**:是一个开源平台,用于自动化容器化应用程序的部署、扩展和操作。它已经成为容器编排领域的事实标准。 ### 如何使用静态和动态标识工具 要使用这些静态和动态标识工具,首先需要获取并安装它们。从给定信息中了解到,可以通过克隆仓库或下载压缩包并解压到本地系统中。之后,根据需要针对不同的容器编排环境(如Dockerfile、ECS、Kubernetes)编写配置,以集成和使用这些检测工具。 ### Dockerfile中的工具使用 在Dockerfile中使用工具意味着将检测工具的指令嵌入到构建过程中。这可能包括安装检测工具的命令、运行容器扫描的步骤,以及将扫描结果集成到镜像构建流程中,确保只有通过安全和合规检查的容器镜像才能被构建和部署。 ### ECS与Kubernetes中的工具集成 在ECS或Kubernetes环境中,工具的集成可能涉及到创建特定的配置文件、定义服务和部署策略,以及编写脚本或控制器来自动执行检测任务。这样可以在容器编排的过程中实现实时监控,确保容器编排器只使用符合预期的、安全的容器镜像。 ### Linux系统下的操作 在Linux系统下操作这些工具,用户可能需要具备一定的系统管理和配置能力。这包括使用Linux命令行工具、管理文件系统权限、配置网络以及安装和配置软件包等。 ### 总结 综上所述,Docker Hub上的静态和动态标识工具提供了一种方法来检测和分析公共容器映像,确保这些镜像的安全性和可靠性。这些工具在Linux开发环境中尤为重要,因为它们帮助开发人员和运维人员确保他们的容器映像满足安全要求。通过在Dockerfile、ECS和Kubernetes中正确使用这些工具,可以提高应用程序的安全性,减少由于使用不安全的容器镜像带来的风险。此外,掌握Linux系统下的操作技能,可以更好地管理和维护这些工具,确保它们能够有效地发挥作用。
recommend-type

【扣子平台图像艺术探究:理论与实践的完美结合】:深入学习图像生成的艺术

# 1. 图像艺术的理论基础 艺术领域的每一个流派和技巧都有其理论基础。在图像艺术中,理论基础不仅是对艺术表现形式的认知,也是掌握艺术创作内在逻辑的关键。深入理解图像艺术的理论基础,能够帮助艺术家们在创作过程中更加明确地表达自己的艺术意图,以及更好地与观众沟通。 图像艺术的理论
recommend-type

增广路定理的证明

<think>嗯,用户想查找增广路定理的证明,关于图论和网络流算法的。我得先理解增广路定理是什么,然后找到相关的证明方法。根据之前的引用,尤其是引用5提到最大流最小割定理,里面有三个等价条件,其中第二个是残余网络中没有增广路径时,流就是最大流。这可能和增广路定理相关,也就是当残余网络中没有增广路时,当前流就是最大流,这可能就是增广路定理的内容。 首先,我需要明确增广路定理的陈述。根据引用5,增广路定理可能指的是:一个流是最大流当且仅当残余网络中不存在增广路径。这个定理的证明需要用到最大流最小割定理,也就是第三个条件,即最大流的流量等于最小割的容量。 证明的步骤可能需要分为两个方向:必要性(
recommend-type

Pulse:基于SwiftUI的Apple平台高效日志记录与网络监控

从给定文件信息中,我们可以提取出以下IT知识点进行详细阐述: **Pulse概览:** Pulse是一个专门针对Apple平台(如iOS、iPadOS、macOS等)的功能强大的日志记录系统。其设计目的是为了简化开发者在这些平台上调试网络请求和应用日志的过程。Pulse的核心特色是它使用SwiftUI来构建,这有助于开发者利用现代Swift语言的声明式UI优势来快速开发和维护。 **SwiftUI框架:** SwiftUI是一种声明式框架,由苹果公司推出,用于构建用户界面。与传统的UIKit相比,SwiftUI使用更加简洁的代码来描述界面和界面元素,它允许开发者以声明的方式定义视图和界面布局。SwiftUI支持跨平台,这意味着同一套代码可以在不同的Apple设备上运行,大大提高了开发效率和复用性。Pulse选择使用SwiftUI构建,显示了其对现代化、高效率开发的支持。 **Network Inspector功能:** Pulse具备Network Inspector功能,这个功能使得开发者能够在开发iOS应用时,直接从应用内记录和检查网络请求和日志。这种内嵌式的网络诊断能力非常有助于快速定位网络请求中的问题,如不正确的URL、不返回预期响应等。与传统的需要外部工具来抓包和分析的方式相比,这样的内嵌式工具大大减少了调试的复杂性。 **日志记录和隐私保护:** Pulse强调日志是本地记录的,并保证不会离开设备。这种做法对隐私保护至关重要,尤其是考虑到当前数据保护法规如GDPR等的严格要求。因此,Pulse的设计在帮助开发者进行问题诊断的同时,也确保了用户数据的安全性。 **集成和框架支持:** Pulse不仅仅是一个工具,它更是一个框架。它能够记录来自URLSession的事件,这意味着它可以与任何使用URLSession进行网络通信的应用或框架配合使用,包括但不限于Apple官方的网络库。此外,Pulse与使用它的框架(例如Alamofire)也能够良好配合,Alamofire是一个流行的网络请求库,广泛应用于Swift开发中。Pulse提供了一个PulseUI视图组件,开发者可以将其集成到自己的应用中,从而展示网络请求和其他事件。 **跨平台体验:** 开发者不仅可以在iOS应用中使用Pulse Console记录日志,还可以在macOS上通过Pulse应用程序查看和共享这些日志。这种跨平台的能力意味着开发者可以在不同的设备上进行日志分析,增强了开发和调试的灵活性。 **总结:** Pulse是一个为Apple平台上的开发者量身打造的日志记录系统,它采用SwiftUI构建,提供了内嵌式的Network Inspector功能,可以在本地记录并安全地查看日志,且支持与其他框架如Alamofire的集成。它不仅提升了调试的便捷性和效率,同时也顾及到了用户的隐私保护。Pulse的跨平台查看能力也是其一大亮点,使得开发者能够在一个统一的环境中处理iOS和macOS上的日志数据。对于使用Swift开发Apple应用的开发者而言,Pulse无疑是一个强大的调试辅助工具。
recommend-type

【深入扣子平台:图像生成机制全揭秘】:掌握背后技术,提升图像生成效率

# 1. 图像生成技术概述 图像生成技术是一门融合了计算机视觉、机器学习、图形学等多个领域知识的前沿技术。它通过算法模拟生成人工图像,广泛应用于艺术创作、游戏设计、医学影像等领域。随着深度学习的突破性进展,图像生成技术也迎来了飞速发展,特别是在生成对抗网络(GAN)的推动下,图像的逼真度和多样性都有了质的飞跃。 本章将对图像生成技术的概念、发展历史进行简要介绍,并分析其在社会中的
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部