南航卢春:混合云架构实践与未来技术规划

南航作为中国最大的民用航空公司之一,通过与阿里云合作,利用云计算重构信息化系统,解决了高并发和海量数据处理的问题,实现了从预订到支付全流程电子化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

11月22日广州云栖大会上,中国南方航空公司电子商务部副总经理卢春带来了南航上云的实践思考。在他看来:“云+端”的服务模式为航企创新提供有利条件,利用云计算对海量数据的分析和处理,挖掘旅客群体的个性化需求,并据此开展精准营销、提高服务水平,正成为航企实现“换道超车”的关键。

 

以下是精彩内容整理:

南航是业内创新先驱,作为首个实现全流程电子化的航空公司,南方航空率先与阿里云合作,利用云计算重构信息化系统,并将网上销售系统的部分应用搬到云上,用云的方法解决海量和高并发数据处理难题。

为什么要上云?

711f11cf4b1b54eb02e3a62ee4bca2af6f3fc7d1

南航是中国航班最多、航线网络最密集、年客运量最大的民用航空公司,机队规模亚洲第一、世界第四,目前机队规模已经达到720架,预计2020年飞机数将达到一千架,庞大的业务体量带来了更高的技术要求。无论从运输量、规模等各方面,南航都已经踏进了世界前沿领域,南航的实践发展需要更多的接入互联网元素,于是,南方航空率先与阿里云合作,利用云计算重构信息化系统,并将网上销售系统的部分应用搬到云上。

通过两年时间的数字化转型,南航已经能够实现从预订到支付、选座、值机、登机,以及最后的电子发票全流程电子化。

南航在业内一直是创新先驱,第一张电子车票、第一张电子发票、第一个自助登机牌、第一个电子牌,还有第一次接入人脸识别登机系统。

在南航看来,目前最大的挑战并不是业内公司,真正的挑战来自于互联网企业,他们更专注于用户而不是传统的销售渠道,在大数据元年,互联网企业能够获得大量的数据并且搭建起基本的精准营销体系,掌握整个出行数据,这对南航来说是一种威胁。

互联网使得每个用户都有自己对出行便捷用户体验的要求,在任何时间任何接触点都必须能够及时获得一个极致服务,面对这样的要求,南航必须要进行变革,如何实现高并发和海量数据处理呢?传统企业的数据中心是很难实现目标的,所以拥抱云是南航目前最好的选择。

 

一次会员日促销带来的架构思考

9947765e58f2941fd3bef9008d19f53c7fc9926a

南航拥抱云计算源自一次不太成功的会员日促销活动。活动当天准备一万张一折票,希望能够通过优惠的价格吸引大量用户,但是大量用户的同时涌进导致系统压力太大,有30%的请求因为长期等待而放弃了,官网和手机客户端访问量均超平时5倍,超出原有IT系统的最大处理能力,导致会员在活动页面长时间排队。

这实际上更多是带宽问题,南航的数据中心带宽只有200M,远远不足于互联网的应用请求。南航意识到,高并发、海量数据、突发性的业务是传统数据中心并不擅长的。基于这样的判断,南方航空开始和阿里云合作。南航有自己的数据中心,正在支撑南航的电子服务,因此在保留原有基础服务前提下,将高并发的模块部署到云上,搭建一个混合云架构。

南航对于云部署计划分三阶段,具体如下:

第一阶段,将服务器迁移到云上,主要解决设备扩容时间长,过去增加10%的计算能力需要三到六个月,增加20%能力可能需要1年,面对全国旅客的系统这是不可想象的;

第二阶段,南航更希望通过云服务公司提供架构改造的能力,从传统的企业内部数据结构逐步实现多点部署、多地多活的方式;

第三阶段,提供一个永远在线的电商销售服务平台,才能让自己在互联网潮流中更具竞争力。

 

南航混合云架构实践

在阿里云的帮助下,南航已经完成机票销售主流程向云上迁移,以及航班查询、订单生成、合作渠道等服务的云端部署。互联网架构中包含的大多数功能在南航云架构中都得到了体现,包括分布式架构、流程处理的异步化和并行处理等都通过云部署的方式得到改造。

在查询方面,南航目标是实现混合云部署,建立云查询系统,单条链路的目标在100tps,准确率为90%,而实际效果令人惊讶。南航不仅将服务器放上云,也将整个组织结构、系统架构进行了改造,日处理消息量达1500万条,150万航班、3900万个仓位准确率达到95%以上。从订购来讲,如果每秒中可以产生40笔订单支付,南航一年销量可以达到3000亿到4000亿。

更重要的是在生成订单环节,查询后数据要同步,交易的关键点还是数据,南航混合云结构云上云下都有订单数据,实现了数据同步,消灭了数据库层面瓶颈,单链路性能提升10倍以上。目前,按照每年大概一个亿的旅客量,所有数据跑在云上性能没有明显的下降,经过半年时间三个阶段的改造,南航目前的平台处理能力可以满足未来几年内南航的业务增长需求。

 

从“两地三中心”到“多活”,未来技术规划

82ece224bbd42c9e3dcad4c372a9a26b7474817f

未来,南航还计划在此基础上针对销售流程基于云架构进行互联网、电子化改造。

接下来,南航会将工作中心更多的放在扩大外部渠道上,生态数据玩家更多的把流量聚集起来,通过上下游服务能力的提升,达到极致用户体验。南航也想要打造永远在线的电商平台,过去是做两地三中心,持续投入资源经常演练切换,有了云后,应该更多考虑实现多活、没有任何维护的时间窗口。

南航也会在人工智能和大数据方面做一些工作,比如智能客服,目前南航可以提供3~5个语言的服务能力,随着语义语音的识别能力提升,未来南航想要实现提供40种语言的服务能力,这不能依赖于客服中心的作息,而要依赖阿里技术能力的输出。此外,南航的生物智能识别平台已经开始打造,包括人脸、虹膜、指静脉等都是下一步便捷旅行的关键节点,能够有效帮助航空公司提升客户体验。

 

 

/****** Object: StoredProcedure [dbo].[Gp_AddDataToAuditingBill] Script Date: 2025-07-07 15:08:24 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO /* 作者:谢吉康 日期:2005-8-4 描述:增加新的单据到AuditingBill中 新Carpa平台后重新调整 卢春 2009-06 添加询价单,请购单的修改状态 周华 2013-11-27 */ ALTER PROCEDURE [dbo].[Gp_AddDataToAuditingBill] ( @BillNumberId varchar(8000), --单据编号 @BillIndexType int, --单据类型 0.订单 1.借欠 2.一般物流单据 @OperatorETypeID VARCHAR(100) --操作员ID号 ) --@encode$-- AS SET NOCOUNT ON DECLARE @OperatorId varchar(100), @BillType int, @ETypeId varchar(100), @STypeID VARCHAR(100), @BillDate datetime, @BillCode varchar(256), @AuditingId int, @AuditingLevel int, @AuditingLevel1 int, @AuditingType int, @InOrOut varchar(10), @Checke VARCHAR(50) --制单人 BEGIN TRAN -- 判断状态是否待审核或审核通过,是则退出 IF EXISTS(SELECT TOP 1 BillNumberId FROM AuditingBill WHERE BillNumberId = @BillNumberId AND BillIndexType = @BillIndexType AND IfAudit <> -1) BEGIN ROLLBACK TRAN RETURN -2 END -- 审核不通过,则删除掉原记录,重新写记录 IF EXISTS(SELECT TOP 1 BillNumberId FROM AuditingBill WHERE BillNumberId = @BillNumberId AND BillIndexType = @BillIndexType AND IfAudit = -1) BEGIN DELETE AuditingBillDetail WHERE BillNumberId=@BillNumberId AND BillIndexType=@BillIndexType DELETE AuditingBill WHERE BillNumberId = @BillNumberId AND BillIndexType = @BillIndexType IF @@ROWCOUNT = 0 BEGIN ROLLBACK TRAN RETURN -6 END END IF @BillIndexType = 0 -- 订单 BEGIN --修改订单状态 IF EXISTS(SELECT TOP 1 BillNumberId FROM OrderIndex WHERE BillNumberId = @BillNumberId) BEGIN UPDATE OrderIndex SET IfAudit = 0 WHERE BillNumberId = @BillNumberId IF @@ROWCOUNT = 0 BEGIN ROLLBACK TRAN RETURN -1 END END --获取单据的信息 SELECT @BillType = BillType, @ETypeId = ETypeId, @STypeID = STypeID, @BillDate = BillDate, @BillCode = BillCode, @Checke=Checke FROM OrderIndex WHERE BillNumberId = @BillNumberId END IF @BillIndexType = 1 -- 借欠 BEGIN --修改订单状态 IF EXISTS(SELECT TOP 1 BillNumberId FROM dbo.LendIndex WHERE BillNumberId = @BillNumberId) BEGIN UPDATE LendIndex SET IfAudit = 0 WHERE BillNumberId = @BillNumberId IF @@ROWCOUNT = 0 BEGIN ROLLBACK TRAN RETURN -1 END END --获取单据的信息 SELECT @BillType = BillType, @ETypeId = ETypeId, @STypeID = STypeID, @BillDate = BillDate, @BillCode = BillCode, @Checke=Checke FROM LendIndex WHERE BillNumberId = @BillNumberId END IF @BillIndexType = 2 -- 一般物流单据 BEGIN --修改184报价单状态 IF EXISTS(SELECT TOP 1 BillNumberId FROM BillIndex WHERE BillNumberId = @BillNumberId AND BillType=184) BEGIN UPDATE BillIndex SET IfAudit = 0 WHERE BillNumberId = @BillNumberId AND BillType=184 IF @@ROWCOUNT = 0 BEGIN ROLLBACK TRAN RETURN -1 END END -- 修改询价单状态 IF EXISTS(SELECT TOP 1 BillNumberId FROM BillIndex WHERE BillNumberId = @BillNumberId AND BillType =185) BEGIN UPDATE BillIndex SET IfAudit = 0 WHERE BillNumberId = @BillNumberId IF @@ROWCOUNT = 0 BEGIN ROLLBACK TRAN RETURN -1 END END --获取单据的信息 SELECT @BillType = BillType, @ETypeId = ETypeId, @STypeID = STypeID, @BillDate = BillDate, @BillCode = BillCode, @Checke=Checke FROM BillIndex WHERE BillNumberId = @BillNumberId END IF @BillIndexType=3 --请购单 BEGIN -- 修改请购单状态 IF EXISTS(SELECT TOP 1 BillNumberId FROM RequestIndex WHERE BillNumberId = @BillNumberId AND BillType=204) BEGIN UPDATE dbo.RequestIndex SET IfAudit = 0 WHERE BillNumberId = @BillNumberId IF @@ROWCOUNT = 0 BEGIN ROLLBACK TRAN RETURN -1 END END --获取单据的信息 SELECT @BillType = BillType, @ETypeId = ETypeId, @STypeID = STypeID, @BillDate = BillDate, @BillCode = BillCode, @Checke=Checke FROM dbo.RequestIndex WHERE BillNumberId = @BillNumberId END IF @BillIndexType=4 --提成单 BEGIN ---- 修改请购单状 IF EXISTS(SELECT TOP 1 BillNumberId FROM CommissionBillNew WHERE BillNumberId = @BillNumberId) BEGIN UPDATE dbo.CommissionBillNew SET BillState = 3 WHERE BillNumberId = @BillNumberId IF @@ROWCOUNT = 0 BEGIN ROLLBACK TRAN RETURN -1 END END --获取单据的信息 SELECT @BillType = 311, @ETypeId = Checke, @STypeID = STypeID, @BillDate = BillDate, @BillCode = BillCode, @Checke=Checke FROM dbo.CommissionBillNew WHERE BillNumberId = @BillNumberId END IF @BillIndexType=5--发票单据 BEGIN IF EXISTS(SELECT TOP 1 BillNumberid FROM ReceiptBillIndex WHERE BillNumberID=@BillNumberId) BEGIN UPDATE dbo.ReceiptBillIndex SET IfAudit=0 WHERE BillNumberID=@BillNumberId IF @@ROWCOUNT = 0 BEGIN ROLLBACK TRAN RETURN -1 END END --获取单据的信息 SELECT @BillType = BillType, @ETypeId = ETypeId, @STypeID = STypeID, @BillDate = BillDate, @BillCode = BillCode, @Checke=Checke FROM ReceiptBillIndex WHERE BillNumberId = @BillNumberId END IF @BillIndexType = 7 --实物库存 BEGIN --获取单据的信息 SELECT @BillType = BillType, @ETypeId = ETypeId, @STypeID = STypeID, @BillDate = BillDate, @BillCode = BillCode, @Checke=Checke FROM FactIndex WHERE BillNumberId = @BillNumberId END IF @BillIndexType = 9--门店类 BEGIN --获取单据的信息 SELECT @BillType = BillType, @ETypeId = ApplyEtypeId, @STypeID = STypeID, @BillDate = BillDate, @BillCode = BillCode, @Checke=Checke FROM PosAllotApplyBillIndex WHERE BillNumberId = @BillNumberId END --判断单据是否有审核流程 SELECT @AuditingId = AuditingId, @AuditingLevel = AuditingLevel, @AuditingLevel1 = AuditingLevel1, @AuditingType = AuditingType FROM AuditingFlowSet WHERE BillType = @BillType AND STypeID=@STypeID AND IfUse = 1 --写入审核表(AuditingBill)中 INSERT INTO AuditingBill ( BillNumberId, AuditingId, AuditingSteps, IfAudit, ETypeId, BillDate, BillCode, BillDetail, BillIndexType, PassSteps, Checke )VALUES( @BillNumberId, @AuditingId, REPLACE(REPLICATE(@AuditingLevel,@AuditingLevel),@AuditingLevel,'2'), 0, @ETypeId, @BillDate, @BillCode, '', @BillIndexType, REPLACE(REPLICATE(@AuditingLevel,@AuditingLevel),@AuditingLevel,'2'), @Checke ) IF @@ROWCOUNT = 0 BEGIN ROLLBACK TRAN RETURN -3 END ---------------------------------------------------------------------------------------------- --【定制】销售订单制单人审核人相同时校验余额是否大于订单金额 IF EXISTS(select TOP 1 1 FROM orderindex WHERE BillNumberId = @BillNumberId AND SaleWay = 1) BEGIN DECLARE @DealBTypeID VARCHAR(50) DECLARE @OrderTotal numeric(24, 10) DECLARE @BillTotal numeric(24, 10) -- 获取订单的DealBTypeID SELECT @DealBTypeID = dealbtypeid FROM orderindex WHERE BillNumberId = @BillNumberId SELECT @BillTotal = ISNULL(SUM(totalmoney),0) - ISNULL(SUM(preferencemoney),0) - ISNULL(( SELECT SUM(totalmoney) FROM orderindex WHERE billtype = 300 AND dealbtypeid=@DealBTypeID AND IfAudit = 1 ),0) FROM billindex WITH ( NOLOCK ) WHERE billtype IN ( 4, 189 ) AND dealbtypeid=@DealBTypeID AND ifcheck = 't' AND redword = '0' SELECT @OrderTotal = totalmoney FROM orderindex WHERE billnumberid=@BillNumberId IF @BillTotal < @OrderTotal BEGIN ROLLBACK TRAN RETURN -9 END END --------------------------------------------------------------------------------------------- -- PassSteps代表整单审核通过需要经历的步骤,原因相关 DECLARE @PassSteps VARCHAR(50) SET @PassSteps = REPLACE(REPLICATE(@AuditingLevel,@AuditingLevel),@AuditingLevel,'2') CREATE TABLE #temp( BillNumberID INT, BillType NUMERIC(4, 0), PassFlag bit, Reason VARCHAR(500), value VARCHAR(500), AuditingStep int ) INSERT #temp EXEC GP_BillAudtingCheckReason @BillNumberId,@OperatorETypeID,@BillIndexType,'1',-1,0 DECLARE @i INT,@j INT,@stepReason VARCHAR(500),@stepValue VARCHAR(500) -- 处理特审原因 DECLARE CURSOR_str CURSOR FOR SELECT DISTINCT Reason,Value,AuditingStep FROM #temp WHERE PassFlag = 0 ORDER BY AuditingStep OPEN CURSOR_str FETCH NEXT FROM CURSOR_str INTO @stepReason,@stepValue,@i WHILE @@FETCH_STATUS = 0 BEGIN UPDATE AuditingBill SET StepReasons = ISNULL(StepReasons,'') + '0ж' + RTRIM(@stepReason + ' ' + ISNULL(@stepValue,'')) + 'жи' WHERE BillNumberID = @BillNumberId AND BillIndexType = @BillIndexType FETCH NEXT FROM CURSOR_str INTO @stepReason,@stepValue,@i END CLOSE CURSOR_str DEALLOCATE CURSOR_str -- 写入每级相关原因 SET @j = 0 DECLARE CURSOR_str CURSOR FOR SELECT AuditingStep,Reason,value FROM #temp WHERE PassFlag = 0 ORDER BY AuditingStep OPEN CURSOR_str FETCH NEXT FROM CURSOR_str INTO @i,@stepReason,@stepValue WHILE @@FETCH_STATUS = 0 BEGIN IF @stepReason<>'...' BEGIN UPDATE AuditingBill SET StepReasons = ISNULL(StepReasons,'') + CAST(@i AS VARCHAR(10)) + 'ж' + RTRIM(@stepReason + ' ' + ISNULL(@stepValue,'')) + 'жи' WHERE BillNumberID=@BillNumberId AND BillIndexType=@BillIndexType IF @i <> @j BEGIN SET @PassSteps = LEFT(@PassSteps,@i-1) + '1' + RIGHT(@PassSteps,LEN(@PassSteps)-@i) END SET @j = @i END FETCH NEXT FROM CURSOR_str INTO @i,@stepReason,@stepValue END CLOSE CURSOR_str DEALLOCATE CURSOR_str UPDATE AuditingBill SET PassSteps=@PassSteps WHERE BillNumberID=@BillNumberId AND BillIndexType=@BillIndexType -- 设置灯泡提醒 IF @AuditingType = 1 DECLARE AuditingCursor CURSOR FOR SELECT ETypeId FROM AuditingFlowDetail WHERE AuditingId = @AuditingId AND AuditingStep IN (SELECT TOP 1 AuditingStep FROM #temp WHERE PassFlag=0 ORDER BY AuditingStep) IF @AuditingType = 3 DECLARE AuditingCursor CURSOR FOR SELECT ETypeId FROM AuditingFlowDetail WHERE AuditingId = @AuditingId AND AuditingStep IN (SELECT AuditingStep FROM #temp WHERE PassFlag=0 GROUP BY AuditingStep) OPEN AuditingCursor FETCH NEXT FROM AuditingCursor INTO @OperatorId WHILE @@FETCH_STATUS = 0 BEGIN -- 是否有修改他人草稿的权限 0.有 1.无 DECLARE @ifCanEditOtherDraft INT EXEC @ifCanEditOtherDraft = GP_CheckLimit @OperatorId, 135 -- 是否有审核他人草稿的权限 0.有 1.无 DECLARE @AuditingOtherDraft int EXEC @AuditingOtherDraft = GP_CheckLimit @OperatorID,467 DECLARE @checkeWhere VARCHAR(50) IF @ifCanEditOtherDraft = 0 OR @AuditingOtherDraft = 0 SET @checkeWhere = '%%' ELSE SET @checkeWhere = @OperatorId DECLARE @ifAlerm INT SET @ifAlerm = 0 IF @BillType IN (17,21)-- AND @AuditingType = 1 BEGIN -- 检查仓库权限是否有效 0.有效 1.无效 DECLARE @StockLimit INT EXEC @StockLimit = GP_CheckLimit @OperatorID,454 -- 调拨单中,仓库的权限无效 IF EXISTS(SELECT TOP 1 1 FROM Userconfig WHERE ConfigName = 'MoveInOutKLimit' AND Value = '0') OR @StockLimit = 0 BEGIN IF EXISTS( SELECT TOP 1 1 FROM BillIndex WHERE BillNumberId = @BillNumberId AND ETypeId IN (SELECT * FROM F_GetManDetailEType(@OperatorId)) AND (KTypeID IN (SELECT * FROM F_GetManDetailKType(@OperatorId)) OR KTypeID2 IN (SELECT * FROM F_GetManDetailKType(@OperatorId))) AND checke LIKE @checkeWhere ) SET @ifAlerm = 1 END ELSE BEGIN IF EXISTS( SELECT TOP 1 1 FROM BillIndex WHERE BillNumberId = @BillNumberId AND ETypeId IN (SELECT * FROM F_GetManDetailEType(@OperatorId)) AND (KTypeID IN (SELECT * FROM F_GetManDetailKType(@OperatorId)) AND KTypeID2 IN (SELECT * FROM F_GetManDetailKType(@OperatorId))) AND checke LIKE @checkeWhere ) SET @ifAlerm = 1 END END ELSE IF @BillType IN (300,301) -- 订单 BEGIN IF EXISTS( SELECT TOP 1 1 FROM OrderIndex WHERE BillNumberId = @BillNumberId AND ETypeId IN (SELECT * FROM F_GetManDetailEType(@OperatorId)) AND BTypeId IN (SELECT * FROM F_GetManDetailBType(@OperatorId)) AND KTypeId IN (SELECT * FROM F_GetManDetailKType(@OperatorId)) ) SET @ifAlerm = 1 END ELSE IF @BillType IN (57) BEGIN IF EXISTS( SELECT BillNumberId FROM AdPriceBill WHERE BillNumberId=@BillNumberId AND ChangeAllStock=1 ) BEGIN IF EXISTS( SELECT TOP 1 1 FROM BillIndex WHERE BillNumberId = @BillNumberId AND ETypeId IN (SELECT * FROM F_GetManDetailEType(@OperatorId)) AND (BTypeId IN (SELECT * FROM F_GetManDetailBType(@OperatorId)) OR ISNULL(BTypeId,'')='') AND (KTypeId='00000') AND checke LIKE @checkeWhere ) SET @ifAlerm = 1 END ELSE BEGIN IF EXISTS( SELECT TOP 1 1 FROM BillIndex WHERE BillNumberId = @BillNumberId AND ETypeId IN (SELECT * FROM F_GetManDetailEType(@OperatorId)) AND (BTypeId IN (SELECT * FROM F_GetManDetailBType(@OperatorId)) OR ISNULL(BTypeId,'')='') AND (KTypeId IN (SELECT * FROM F_GetManDetailKType(@OperatorId)) OR ISNULL(KTypeId,'')='') AND checke LIKE @checkeWhere ) SET @ifAlerm = 1 END END ELSE IF @BillType IN (328,327) --门店单据 BEGIN IF EXISTS( SELECT TOP 1 1 FROM PosAllotApplyBillIndex WHERE BillNumberId = @BillNumberId AND ApplyEtypeId IN (SELECT * FROM F_GetManDetailEType(@OperatorId)) AND (KTypeID IN (SELECT * FROM F_GetManDetailKType(@OperatorId)) OR InKtypeId IN (SELECT * FROM F_GetManDetailKType(@OperatorId))) AND checke LIKE @checkeWhere ) SET @ifAlerm = 1 END ELSE BEGIN --2018-08-15 谢吉康 以前的算法不合理,优化 DECLARE @BTypeId VARCHAR(500) SELECT @BTypeId = BTypeID FROM BillIndex WHERE BillNumberid = @BillNumberId IF @BTypeId <> '' BEGIN IF EXISTS( SELECT TOP 1 1 FROM BillIndex B INNER JOIN (SELECT * FROM F_GetManDetailEType(@OperatorId)) E ON B.ETypeId = E.TypeId INNER JOIN (SELECT * FROM F_GetManDetailBTypeForAudit(@OperatorId,@BTypeId)) MB ON MB.TypeId = B.btypeid INNER JOIN (SELECT * FROM F_GetManDetailKType(@OperatorId)) MK ON (MK.TypeId = B.KTypeId OR ISNULL(KTypeId,'')='') WHERE BillNumberId = @BillNumberId AND checke LIKE @checkeWhere ) SET @ifAlerm = 1 END ELSE BEGIN IF EXISTS( SELECT TOP 1 1 FROM BillIndex B INNER JOIN (SELECT * FROM F_GetManDetailEType(@OperatorId)) E ON B.ETypeId = E.TypeId INNER JOIN (SELECT * FROM F_GetManDetailKType(@OperatorId)) MK ON (MK.TypeId = B.KTypeId OR ISNULL(KTypeId,'')='') WHERE BillNumberId = @BillNumberId AND checke LIKE @checkeWhere ) SET @ifAlerm = 1 END END IF @ifAlerm = 1 BEGIN IF @AuditingType = 1 BEGIN UPDATE AuditingFlowDetail SET AuditingAlerm = 1 WHERE AuditingId = @AuditingId AND ETypeId = @OperatorId AND AuditingStep IN (SELECT TOP 1 AuditingStep FROM #temp WHERE PassFlag=0 ORDER BY AuditingStep) END IF @AuditingType = 3 BEGIN UPDATE AuditingFlowDetail SET AuditingAlerm = 1 WHERE AuditingId = @AuditingId AND ETypeId = @OperatorId AND AuditingStep IN (SELECT AuditingStep FROM #temp WHERE PassFlag=0 GROUP BY AuditingStep) END END FETCH NEXT FROM AuditingCursor INTO @OperatorId END CLOSE AuditingCursor DEALLOCATE AuditingCursor --处理同一个人审核人的情况 IF EXISTS(SELECT TOP 1 1 FROM dbo.Userconfig WHERE ConfigName = 'samepersonchecked' AND Value = '1') BEGIN IF EXISTS(SELECT TOP 1 1 FROM AuditingFlowSet WHERE BillType = @BillType AND AuditingType = 3) AND EXISTS(SELECT TOP 1 1 FROM AuditingFlowDetail WHERE BillType = @BillType AND AuditingStep <> 0 AND ETypeID = @OperatorETypeID) --会签审核 BEGIN EXEC GP_BillAuditingDeal @OperatorETypeID,@BillNumberId,'1','自动审核通过',@BillIndexType,'','' END ELSE BEGIN --处理审核消息 DECLARE @nextStep INT IF EXISTS(SELECT TOP 1 AuditingStep FROM AuditingBillDetail WHERE BillNumberID = @BillNumberId AND BillIndexType = @BillIndexType) SELECT TOP 1 @nextStep = AuditingStep + 1 FROM AuditingBillDetail WHERE BillNumberID = @BillNumberId AND BillIndexType = @BillIndexType ORDER BY AuditingStep DESC ELSE SET @nextStep = 1 SELECT * INTO #AuditingFlowDetail FROM AuditingFlowDetail WHERE BillType = @BillType AND AuditingStep <> 0 AND ETypeID = @OperatorETypeID WHILE EXISTS(SELECT TOP 1 1 FROM #AuditingFlowDetail WHERE AuditingStep = @nextStep) BEGIN EXEC GP_BillAuditingDeal @OperatorETypeID,@BillNumberId,'1','自动审核通过',@BillIndexType,'','' SET @nextStep += 1 END DROP TABLE #AuditingFlowDetail END END --单据审核流程完成后自动过账 DECLARE @RE INT EXEC @RE = GP_CheckLimit @OperatorETypeID,2659 --处理价格跟踪 IF @BillType IN (184,185,300,301) BEGIN EXEC dbo.GP_BatchPassPT @billnumberid=@BillNumberId,@billtype=@BillType END --自动过账 IF @billtype NOT IN(184,185,300,313,204,185,301,22,326,162,163) AND EXISTS(SELECT TOP 1 1 FROM dbo.AuditingBill WHERE BillNumberID = @BillNumberId AND BillIndexType = @BillIndexType AND IfAudit = 1) AND @RE = 0 BEGIN EXEC dbo.Gp_Auditing @nBillID = @BillNumberId, -- numeric @szCheckMan = @Checke, -- varchar(50) @szPID = '', -- varchar(1000) @chvOpID = @OperatorETypeID, -- varchar(50) @KTypeID = '', -- varchar(50) @billtype = @BillType, -- int @voucherMsg = '', -- varchar(50) @vipcentinfo='', @AssetMsg='', @VipCardCode = '' ,--VARCHAR(200) @CommissionConfirm = 0 ,--INT @strReturnBillCode = '' --VARCHAR(200) IF EXISTS(SELECT TOP 1 1 FROM dbo.Userconfig WHERE ConfigName = 'BillCodeCreateTime' AND Value = 2) EXEC dbo.GP_SaveBillCode_Seed @intBillNumberID=@BillNumberId,@intBillType=@BillType,@dBillDate=@billdate,@strBillCode=@BillCode IF(@BillType IN(17,21,404,327,328)) --没有btypeid 的不要插入,否则报错 begin INSERT INTO BillOperateLog(billnumberid,operatetype,etypeid,OperateTime,ip,billcode,billdate,ifcheck,ntotalmoney,billtype) VALUES(@billnumberid,'自动审核过账',@OperatorETypeID,GETDATE(),'',@billcode,@billdate,'t',0,@billtype) END ELSE BEGIN INSERT INTO BillOperateLog(billnumberid,operatetype,etypeid,OperateTime,ip,billcode,billdate,ifcheck,btypeid,ntotalmoney,billtype) VALUES(@billnumberid,'自动审核过账',@OperatorETypeID,GETDATE(),'',@billcode,@billdate,'t',ISNULL(@btypeid,''),0,@billtype) END --自动审核过账,反写一大堆数量,状态等.正常过账反写以前是写在代码里面的,没有在存储过程里,所以要单独写出来 EXEC Gp_Auditing_UpdateQtyorState @BillNumberId, @BillType END DROP TABLE #temp --成功,退出 COMMIT TRAN RETURN 0
最新发布
07-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值