/** * @description 创建存储过程类 */ export default class FuncUtils { /** * @description 创建页面存储过程 * @return {String} */ static getTableFunc (config) { let form = '' let formParam = '' let _vars = ['bid', 'pageindex', 'pagesize', 'ordercol', 'ordertype', 'exceltype', 'septmenuno', 'lang', 'debug', 'loginuid', 'sessionuid', 'userid', 'errorcode', 'retmsg'] let _columns = [] let primaryKey = config.setting.primaryKey || 'ID' if (!_vars.includes(primaryKey.toLowerCase())) { _vars.push(primaryKey.toLowerCase()) formParam = `mchr13k@${primaryKey} nvarchar(50)='',` } if (config.search && config.search.length > 0) { let _fields = new Map() config.search.forEach(item => { if (item.field) { let type = '' if (item.type.match(/date/ig)) { type = 'datetime=null' } else { type = 'nvarchar(50)=\'\'' } item.field.split(',').forEach(cell => { let _f = cell if (_fields.has(cell)) { _f = _f + '1' } _fields.set(cell, true) if (!_vars.includes(_f.toLowerCase())) { _vars.push(_f.toLowerCase()) formParam = formParam + `mchr13k@${_f} ${type},` } }) } }) } if (config.columns && config.columns.length > 0) { config.columns.forEach(item => { if (item.field) { _columns.push(`${item.field} as ${item.label}`) } }) form = ` declare @dc table (${_columns.join(',')}) @tableid ='${config.MenuID}' ` } let Ltext = `create proc ${config.func} ( /*${config.MenuName}*/ @appkey nvarchar(50)='', @BID nvarchar(50)='', @UserName nvarchar(50)='', @FullName nvarchar(50)='',${formParam} @PageIndex nvarchar(50)='', @PageSize nvarchar(50)='', @OrderCol nvarchar(50)='', @OrderType nvarchar(50)='', @exceltype nvarchar(50)='', @sEPTMenuNo nvarchar(50)='${config.menuNo}', @lang nvarchar(50)='', @debug nvarchar(50)='', @LoginUID nvarchar(50)='', @SessionUid nvarchar(50)='', @UserID nvarchar(50), @dataM nvarchar(50), @ErrorCode nvarchar(50) out, @retmsg nvarchar(4000) out ) as begin declare @BegindateTest datetime,@EnddateTest datetime select @BegindateTest=getdate() set @ErrorCode='' set @retmsg='' BEGIN TRY /*事务操作*/ BEGIN TRAN /*具体业务操作*/ /* select top 10 * from sProcExcep order by id desc ${form} if 1=2 begin set @ErrorCode='E' set @retmsg='在此写报错' goto GOTO_RETURN end insert into sNote (remark,createuserid,CreateUser,CreateStaff) select '在此写日志',@UserID,@UserName,@FullName */ COMMIT TRAN SET NOCOUNT ON RETURN END TRY BEGIN CATCH /*错误处理*/ ROLLBACK TRAN DECLARE @ErrorMessage NVARCHAR(4000); DECLARE @ErrorSeverity INT; DECLARE @ErrorState INT; /*把自定义的友好的错误信息提示加上*/ set @ErrorCode=cast(ERROR_NUMBER() as nvarchar(50)) SET @retmsg=ERROR_MESSAGE(); SELECT @ErrorMessage=ERROR_MESSAGE(), @ErrorSeverity=ERROR_SEVERITY(), @ErrorState=ERROR_STATE(); RAISERROR(@ErrorMessage, /*-- Message text.*/ @ErrorSeverity, /*-- Severity.*/ @ErrorState /*-- State.*/ ); END CATCH GOTO_RETURN: ROLLBACK TRAN END` Ltext = Ltext.replace(/\n\s{4}/ig, 'mchr13k') return Ltext } /** * @description 创建存储过程 * @return {String} */ static getfunc (btn) { let form = '' let formParam = '' let _vars = ['bid', 'septmenuno', 'lang', 'debug', 'loginuid', 'sessionuid', 'userid', 'errorcode', 'retmsg'] let columns = btn.columns let primaryKey = btn.primaryKey if (!_vars.includes(primaryKey.toLowerCase())) { _vars.push(primaryKey.toLowerCase()) let _type = '50' if (btn.Ot === 'requiredOnce') { // 多行拼接时,主键设为max _type = 'max' } formParam = `mchr13k@${primaryKey} nvarchar(${_type})='',` } if (btn.fields && btn.fields.length > 0) { let _fields = [] btn.fields.forEach(item => { if (item.field) { let type = '' if (item.type.match(/date/ig)) { type = 'datetime=null' } else if (item.type === 'number') { type = `decimal(18,${item.decimal})=0` } else if (item.type === 'rate') { type = `decimal(18,2)=0` } else { type = 'nvarchar(50)=\'\'' } if (!_vars.includes(item.field.toLowerCase())) { _vars.push(item.field.toLowerCase()) formParam = formParam + `mchr13k@${item.field} ${type},` } _fields.push(item.field) } }) let field1 = _fields.join(',') let field2 = _fields.join(',@') let field3 = _fields.map(cell => { return cell + '=@' + cell }) field2 = field2 ? '@' + field2 : '' field3 = field3.join(',') form = ` insert into ${btn.name} (${field1},createuserid) select ${field2},@UserID update ${btn.name} set ${field3},modifydate=getdate(),modifyuser=@username,modifyuserid=@UserID ` } else if (btn.OpenType === 'prompt' || btn.OpenType === 'exec') { form = ` update ${btn.name} set ModifyDate=getdate(),ModifyUserID=@UserID where ${primaryKey}=@${primaryKey} ` } if (columns) { let _col = [] let _field = [] columns.forEach(col => { if (col.field) { if (col.type === 'number') { _col.push(col.field + ' decimal(18,2)') } else { _col.push(col.field + ' nvarchar(50)') } _field.push(col.field) } }) _col = _col.join(',') _field = _field.join(',') form = form + ` declare @dc table (${_col}) insert into @dc (${_field}) @tableid ='${btn.MenuID}' ` } // 打印自定义模板字段提示 let _printRemark = '' if (btn.funcType === 'print') { _printRemark = '/* 自定义数据打印模板时,请使用TemplateID字段 */' } let Ltext = `create proc ${btn.func} ( /*${btn.MenuName} ${btn.label}*/ @appkey nvarchar(50)='', @BID nvarchar(50)='', @UserName nvarchar(50)='', @FullName nvarchar(50)='',${formParam} @sEPTMenuNo nvarchar(50)='${btn.menuNo}', @lang nvarchar(50)='', @debug nvarchar(50)='', @LoginUID nvarchar(50)='', @SessionUid nvarchar(50)='', @UserID nvarchar(50), @ErrorCode nvarchar(50) out, @retmsg nvarchar(4000) out ) as begin declare @BegindateTest datetime,@EnddateTest datetime select @BegindateTest=getdate() set @ErrorCode='' set @retmsg='' BEGIN TRY /*事务操作*/ BEGIN TRAN /*具体业务操作*/ ${_printRemark} /* select top 10 * from sProcExcep order by id desc ${form} if 1=2 begin set @ErrorCode='E' set @retmsg='在此写报错' goto GOTO_RETURN end insert into sNote (remark,createuserid,CreateUser,CreateStaff) select '在此写日志',@UserID,@UserName,@FullName */ COMMIT TRAN SET NOCOUNT ON RETURN END TRY BEGIN CATCH /*错误处理*/ ROLLBACK TRAN DECLARE @ErrorMessage NVARCHAR(4000); DECLARE @ErrorSeverity INT; DECLARE @ErrorState INT; /*把自定义的友好的错误信息提示加上*/ set @ErrorCode=cast(ERROR_NUMBER() as nvarchar(50)) SET @retmsg=ERROR_MESSAGE(); SELECT @ErrorMessage=ERROR_MESSAGE(), @ErrorSeverity=ERROR_SEVERITY(), @ErrorState=ERROR_STATE(); RAISERROR(@ErrorMessage, /* Message text.*/ @ErrorSeverity, /* Severity.*/ @ErrorState /* State.*/ ); END CATCH GOTO_RETURN: ROLLBACK TRAN END` Ltext = Ltext.replace(/\n\s{4}/ig, 'mchr13k') return Ltext } /** * @description 创建导入存储过程 * @return {String} */ static getexcelInfunc (btn) { let _verify = btn.verify let _uniquesql = '' if (_verify.uniques && _verify.uniques.length > 0) { _verify.uniques.forEach(unique => { if (unique.status === 'false') return let _fields = unique.field.split(',') let _fields_ = _fields.map(_field => { return `a.${_field}=b.${_field}` }) _fields_ = _fields_.join(' and ') if (unique.verifyType !== 'physical') { _fields_ += ' and b.deleted=0' } _uniquesql += ` Set @tbid='' Select top 1 @tbid=${_fields.join('+\' \'+')} from (select 1 as n,${unique.field} from @${btn.sheet} ) a group by ${unique.field} having sum(n)>1 If @tbid!='' Begin select @ErrorCode='${unique.errorCode}',@retmsg=@tbid+' 重复' goto aaa end Set @tbid='' Select top 1 @tbid=${_fields.join('+\' \'+')} from @${btn.sheet} a Inner join ${btn.sheet} b on ${_fields_} If @tbid!='' Begin select @ErrorCode='${unique.errorCode}',@retmsg=@tbid+' 与已有数据重复' goto aaa end ` }) if (_uniquesql) { _uniquesql = ` Declare @tbid Nvarchar(512) ${_uniquesql}` } } let declarefields = [] let fields = [] _verify.columns.forEach(col => { declarefields.push(`${col.Column} ${col.type}`) fields.push(col.Column) }) fields = fields.join(',') let _sql = `declare @${btn.sheet} table (${declarefields.join(',')},jskey nvarchar(50),BID nvarchar(50)) Insert into @${btn.sheet} (${fields},jskey,BID) select @LText=dbo.urldecode(dbo.base64decode(@LText)) ${_uniquesql} Insert into ${btn.sheet} (${fields},createuserid,createuser,createstaff,bid) Select ${fields},@userid,@username,@fullname,@BID From @${btn.sheet} Delete @${btn.sheet}` let Ltext = `create proc ${btn.func} ( /*${btn.MenuName} ${btn.label}*/ @appkey nvarchar(50)='', @ID nvarchar(50)='', @BID nvarchar(50)='', @UserName nvarchar(50)='', @FullName nvarchar(50)='', @Ltext nvarchar(max)='', @sEPTMenuNo nvarchar(50)='${btn.menuNo}', @secretkey nvarchar(50)='', @timestamp nvarchar(50)='', @lang nvarchar(50)='', @LoginUID nvarchar(50)='', @SessionUid nvarchar(50)='', @UserID nvarchar(50), @ErrorCode nvarchar(50) out, @retmsg nvarchar(4000) out ) as begin declare @BegindateTest datetime,@EnddateTest datetime select @BegindateTest=getdate() set @ErrorCode='' set @retmsg='' BEGIN TRY /*事务操作*/ BEGIN TRAN /*具体业务操作*/ /* ${_sql} */ COMMIT TRAN SET NOCOUNT ON RETURN END TRY BEGIN CATCH /*错误处理*/ ROLLBACK TRAN DECLARE @ErrorMessage NVARCHAR(4000); DECLARE @ErrorSeverity INT; DECLARE @ErrorState INT; /*把自定义的友好的错误信息提示加上*/ set @ErrorCode=cast(ERROR_NUMBER() as nvarchar(50)) SET @retmsg=ERROR_MESSAGE(); SELECT @ErrorMessage=ERROR_MESSAGE(), @ErrorSeverity=ERROR_SEVERITY(), @ErrorState=ERROR_STATE(); RAISERROR(@ErrorMessage, /* Message text.*/ @ErrorSeverity, /* Severity.*/ @ErrorState /* State.*/ ); END CATCH GOTO_RETURN: ROLLBACK TRAN END` Ltext = Ltext.replace(/\n\s{4}/ig, 'mchr13k') return Ltext } }