SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO --======================================================================================== --Author <...8065> --Alter Date <...2021-04-08> --Description<...门诊结算界面划价保存过程,与其他划价过程分开> --History <...2012.12.07划价时保存门诊或者住院单位到FAB03> --History <...2013.12.11待发药单据写入业务通知表,加快检索效率> --History <...2013.12.11更新虚拟库存时判断是否更新DPT1表> --修改VCB04长度 --History <...2015.06.16前台修改的执行科室保存后台中> --History <...2015.06.19调用自动分单过程> --History <...2015.11.02摘要信息划价时前后增加.如.测试套餐.> --History <...2016.03.07完善更新转诊备注信息> --History <...2016.05.30增加插入门诊费用附加信息> --History <...2016.10.20增加调用材料冲减功能> --History <...2016.10.31新增划价记录时判断挂号有效期> --History <...2016.12.22门诊材料冲减按门诊医生站参数判断> --History <...2017.06.16门诊结账支持病人姓名的调整并记录日志> --History <...2018.12.13记录第三方序列号> --History <...2019.03.01新增病人时增加身份证、出生日期录入> --History <...2019.07.24更新材料虚拟库存> --History <...2019.08.14更新身份证信息> --History <...2019.09.07插入门诊待发药明细记录> --History <...2020.01.10增加手机号维护> --History <...2020.03.23调整BDP02长度与数据库长度一致> --History <...2020.06.09根据药品计价方式选项记录重新写入价格、数量等信息> --History <...2020.06.24支持单独生成挂号记录> --History <...2020.10.12收费处修改数量同步更新VEG03> --History <...2021.04.08病人资料记录建档途径及修改人> --History <...2021.10.19记录VHP1> --========================================================================================= ALTER PROC [HORate_VAJ1_Update2] @Xml ntext,@VAI01 int out, @VAI04 varchar(20) out , @VAA07 int = 0 out , @Refuse tinyint = 0 , @OnlyReg tinyint = 0 AS DECLARE @iDOM int, @iret int Exec @iret = sp_xml_preparedocument @iDOM OUTPUT, @XML if @iret > 0 BEGIN exec sp_xml_removedocument @iDOM RAISERROR('解析XML文档时发生错误,错误号: %d.', 16, 1, @iret) with nowait return @iret END /*Root/VAA1病人信息*/ SELECT * INTO #TmpVAA1 from OpenXml(@iDOM,'/Root/VAA/Ie',8) WITH ( VAA01 int , VAA07 int , ACF01 int , VAA03 varchar(20) , EmpId int , EmpNo varchar(20) , EmpName varchar(20) , HostName varchar(128) , HostIP varchar(32) , WorkName varchar(20) , WorkType smallint , WorkFrom smallint , BCK01A int , BCK01B int , BCE01A int , BCE03A varchar(64) , VAA05 nvarchar(64) , ABBRW varchar(10) , ABBRP varchar(10) , ABW01 varchar(1) , VAA10 int , AAU01 varchar(1) , BDP02 varchar(50) , ABC02 varchar(20) , BCE02A varchar(20) , VAK17 varchar(255) , KuoZhan1 varchar(255) , VBU01 int , VCB04 varchar(64) , VAP01 int , VCJ10 varchar(64) , VCJ11 varchar(64) , VCJ12 varchar(50) , VCJ13 varchar(128) , VCJ14 varchar(128) , VAA15 varchar(20) , VAA12 datetime , VAA35 varchar(13) ) If not exists(select * from #tmpVAA1) BEGIN exec sp_xml_removedocument @iDOM RAISERROR('提交错误,病人信息为空', 16, 1) with nowait RETURN 2 END IF EXISTS(SELECT * FROM #tmpVAA1 where ISNULL(BCK01A , 0) <= 0) BEGIN EXEC sp_xml_removedocument @iDOM RAISERROR('提交错误,病人科室不能为空', 16, 1) with nowait RETURN 2 END --如果前台传入多条病人信息,报错 If exists(select VAA01 from #TmpVAA1 group by VAA01 having COUNT(VAA01) > 1 ) BEGIN exec sp_xml_removedocument @iDOM RAISERROR('提交错误,存在多条病人信息,请联系开发商.', 16, 1) with nowait RETURN 2 END --If exists(select * from #TmpVAA1 where ISNULL(VAA01 , 0) = 0) --BEGIN If exists(select * from #TmpVAA1 where (ISNULL(VAA03 , '') = '') or (ISNULL(VAA05 , '') = '')) BEGIN exec sp_xml_removedocument @iDOM RAISERROR('提交错误,病人姓名或者门诊号为空.', 16, 1) with nowait RETURN 2 END --END /*Root/VAI病人收费单据*/ select * into #tmpVAI1 from OpenXml(@iDOM,'/Root/VAI/Ie',8) with ( VAI00 varchar(38) , VAI01 int , VAI04 varchar(20) , VAI05 varchar(1024) , BCK01B int , BCE02A varchar(20) , BCE03A varchar(64) , Enabled smallint , VAI17 smallint , VAI22 numeric(18,4) , VAI23 numeric(18,4) , BCE01C int , BCE03C varchar(64) , BCE01D int , BCE03D varchar(64) , VAI35 int ) If @OnlyReg = 0 and not exists(select * from #tmpVAI1) BEGIN exec sp_xml_removedocument @iDOM RAISERROR('提交错误,病人单据信息为空', 16, 1) with nowait RETURN 2 END /*Root/VAJ病人收费记录信息*/ SELECT * , 0 VAJ53 into #tmpVAJ1 from OpenXml(@iDOM,'/Root/VAJ/Ie',8) with ( VAI00 varchar(38) , VAJ01 int , ROWNR int , VAI01 int , BDN01 varchar(2) , VAF01 int , BBY01 int , VAJ01A int , VAJ22 smallint , VAJ23 smallint , VAJ24 numeric(18,4) , VAJ25 numeric(18,4) , VAJ26 smallint , BCK01B int , BCE02B varchar(20) , BCE03B varchar(64) , VAJ27 int , BCK01D int , VAJ30 numeric(18,4) , VAJ31 numeric(18,4) , VAJ59 numeric(18,6) , VAJ32 numeric(18,4) , VAJ33 numeric(18,4) , VAJ34 numeric(18,4) , VAJ35 varchar(20) , VAJ36 numeric(18,4) , VAJ37 numeric(18,4) , VAJ38 numeric(18,4) , VAJ61 numeric(18,4) , VAJ39 smallint , BCK01E int , BCK01C int , VAJ57 varchar(1024) , DSK01 int , VAJ54 varchar(255) , VAJ67 numeric(18,4) , VEG08 int , VAJ76 numeric(18 ,4) , VAJ77 varchar(20) , VAJ78 numeric(18 ,4) , VAJ79 numeric(18 ,6) , VAJ80 numeric(18 ,6) , VEG04 varchar(64) ) If @OnlyReg = 0 and not exists(select * from #tmpVAJ1) BEGIN exec sp_xml_removedocument @iDOM RAISERROR('提交错误,病人收费记录信息为空.', 16, 1) with nowait RETURN 2 END If @OnlyReg = 0 and exists(select * from #tmpVAJ1 where ISNULL(BCK01D , 0) = 0 ) BEGIN exec sp_xml_removedocument @iDOM RAISERROR('提交错误,病人收费记录执行科室不能为空.', 16, 1) with nowait RETURN 2 END --如果是血库调用,更新费用明细中开单科室与开单医生 If exists(SELECT * from #tmpVAI1 where VAI05 = '血库记账') BEGIN Update a set a.BCK01C = b.BCK01B , a.BCE02B = b.BCE02A , a.BCE03B = b.BCE03A , a.VAJ53 = 1 from #tmpVAJ1 a join #tmpVAI1 b on a.VAI00 = b.VAI00 END --更新明细表中单据ID Update a SET a.VAI01 = b.VAI01 from #tmpVAJ1 a join #tmpVAI1 b on b.VAI00 = a.VAI00 exec sp_xml_removedocument @iDOM Declare @i int , @VAA01 int , @Count int , @ACF01 int , @BBY01 int , @VAJ01 int , @BCK01A int , @BCK01B int , @InDept int , @InWard int , @VAI01A int , @BCK01D int , @BCE01A int , @EmpId int , @KuoZhan1 int , @ErrId int , @IsHyType int , @VBU01 int , @VAI18 int , @Result int , @ABC14 tinyint , @BDN01 varchar(2) , @WorkName varchar(20) , @BCE02A varchar(20) , @BCE03A varchar(64) , @WorkType smallint , @WorkFrom smallint , @VAI00 varchar(38) , @EmpNo varchar(20) , @BDP02 varchar(50) , @ABC02 varchar(20) , @EmpName varchar(20) , @VAJ24 numeric(18,4) , @VAJ25 numeric(18,4) , @VAJ30 numeric(18,4) , @VAJ31 numeric(18,4) , @VAJ32 numeric(18,4) , @VAJ33 numeric(18,4) , @VAJ34 numeric(18,4) , @VAJ35 varchar(20) , @FAB03 varchar(20) ,--门诊单位或者住院单位 @TotalFee numeric(18,4) , @VCB04 varchar(64) , @VAI22 numeric(18,4) , @VAI23 numeric(18,4) , @VAP01 int , @DSK01 int , @VAJ10 int , @BCK01E int , @CurDate datetime , @VAA05 nvarchar(64) , @OVAA05 nvarchar(64) , @ABBRP varchar(20) , @ABBRW varchar(20) , @VAA15 varchar(18) , @OVAA15 varchar(18) , @ZAE01 int , @OBDP02 varchar(50), @VAA35 varchar(13), @OVAA35 varchar(13), @gParam138 int, @IAA01 int SET @CurDate = GETDATE() select @VAA01 = VAA01 ,@VAA07= VAA07,@ACF01 = ACF01,@WorkName = WorkName,@WorkType = WorkType,@EmpId = EmpId, @EmpNo = EmpNo,@EmpName = EmpName, @BCK01A = BCK01A,@WorkFrom = WorkFrom ,@BCK01B = BCK01B,@BCE01A = BCE01A, @BCE02A = BCE02A,@BCE03A = BCE03A, @TotalFee = 0,@BDP02 = BDP02 ,@ABC02 = ABC02 , @VBU01 = VBU01 , @VCB04 = VCB04 , @VAP01 = ISNULL(VAP01 , 0) , @VAA05 = VAA05 , @ABBRP = ABBRP , @ABBRW = ABBRW , @VAA15 = ISNULL(VAA15 , ''), @VAA35 = ISNULL(VAA35,'') from #tmpVAA1 --门诊病人新增划价记录时判断挂号有效期 If (@OnlyReg = 0) and (@ACF01 = 1) and exists(select * from #tmpVAJ1 where VAJ01 = 0) BEGIN If exists(select * from VAC1 with(nolock) where VAC01 = @VAA07 and VAC72 < @CurDate) BEGIN RAISERROR('当前病人挂号有效期已过,请重新挂号后划价.', 16, 1) with nowait RETURN 2 END END --更新明细表中套餐信息(非体检病人划价单据) If @ACF01 <> 4 BEGIN Update a SET VAJ57 = '.' + VAJ57 + '.' from #tmpVAJ1 a where VAF01 = 0 and (ISNULL(VAJ57 , '') <> '') END --会员病人绑定病人费别 IF EXISTS(SELECT * FROM SYS_PARAMETERS with(nolock) WHERE PRODUCTID=100 AND PROGRAMID=116001 AND PRIVILEGE=0 AND PARAMNO='2' AND VALUE='1') AND EXISTS(SELECT * FROM VAA1 with(nolock) WHERE VAA01=@VAA01 AND VBU01>0 AND ABC02>'' AND ABC02<>@ABC02) BEGIN RAISERROR('已绑定会员卡类型,禁止修改病人费别.', 16, 1) with nowait RETURN 2 END --如果医生不在职,则不让保存数据 If ISNULL(@BCE01A ,0) > 0 BEGIN If not exists(select * from BCE1 where BCE01 = @BCE01A and BCE41 = 1) BEGIN RAISERROR('提交错误,开单医生不在职,不能进行记账操作..', 16, 1) with nowait RETURN 2 END END --对应记账如果就诊表中不存在数据,则退出 If @ACF01 = 2 BEGIN If not exists(select * from VAE1 with(nolock) where VAE01 = @VAA07 and VAA01 = @VAA01 ) BEGIN RAISERROR('提交错误,病人就诊记录不存在,不能进行记账操作..', 16, 1) with nowait RETURN 2 END END else If (@ACF01 = 1 ) and (@VAA01 > 0) BEGIN If not exists(select * from VAC1 with(nolock) where VAC01 = @VAA07 and VAA01 = @VAA01) BEGIN RAISERROR('提交错误,病人就诊记录不存在,不能进行记账操作..', 16, 1) with nowait RETURN 2 END END --判断是否存在开单科室为空的单据信息 If @OnlyReg = 0 and exists(select * from #tmpVAI1 where ISNULL(BCK01B , 0) = 0) BEGIN RAISERROR('提交错误,存在收费单据开单科室为空.', 16, 1) with nowait RETURN 2 END --判断是否存在开单人为空的单据信息 If @OnlyReg = 0 and exists(select * from #tmpVAI1 where ISNULL(BCE02A , '') = '') and (@WorkType <> 1 ) BEGIN RAISERROR('提交错误,存在收费单据开单人为空.', 16, 1) with nowait RETURN 2 END --如果存在开单科室为空或者开单医生为空,则不让保存数据 If @OnlyReg = 0 and exists(select * from #tmpVAJ1 where ISNULL(BCK01C , 0) = 0) and (@WorkType <> 1 ) BEGIN RAISERROR('提交错误,病人收费记录开单科室不能为空.', 16, 1) with nowait RETURN 2 END If @OnlyReg = 0 and exists(select * from #tmpVAJ1 where ISNULL(BCE02B , '') = '') and (@WorkType <> 1 ) BEGIN RAISERROR('提交错误,病人收费记录开单医生不能为空.', 16, 1) with nowait RETURN 2 END --住院病人领药科室为空提示,参数设置为记帐必须有领药科室 If exists(select * from SYS_Parameters where ProgramID = 103012 and ParamNo = 14 and Value = '0') and (@ACF01 = 2) BEGIN If exists(select * from #tmpVAJ1 where BDN01 <= '3' and ISNULL(BCK01E , 0) = 0 ) BEGIN RAISERROR('提交错误,领药科室不能为空.', 16, 1) with nowait RETURN 2 END END --如果是手术工作站,不允许传入zhuozhan1值为空 If (@WorkFrom = 2) and (@WorkType = 5) BEGIN If exists(select * from #TmpVAA1 where ISNULL(KuoZhan1 , 0) <= 0) BEGIN RAISERROR('提交错误,手术记账未传入手术ID.', 16, 1) with nowait RETURN 2 END END --校验待收费记录中是否存在已结算记录 if exists(select * from #tmpVAJ1 a join VAJ1 b with(nolock) on b.VAJ01 = a.VAJ01 and VAK01 > 0) BEGIN RAISERROR('待收费记录中存在已结算记录,请重新检索病人.', 16, 1) with nowait RETURN 2 END SELECT @ABC14 = ABC14 from ABC1 where ABC02 = @ABC02 SET @ABC14 = ISNULL(@ABC14 , 0 ) SELECT @IsHyType = dbo.GetWorkingMode() --找出未保存并且存在明细的单据 SELECT IDENTITY(int,1,1) AS ID, * Into #tmpNewVAI1 from #tmpVAI1 where VAI01 = 0 and exists(select * from #tmpVAJ1 where #tmpVAI1.VAI00 = #tmpVAJ1.VAI00) --找出未保存的明细 select IDENTITY(int,1,1) AS ID, * Into #tmpNewVAJ1 from #tmpVAJ1 where VAJ01 = 0 --找出已保存的明细 select IDENTITY(int,1,1) AS ID, * Into #tmpOldVAJ1 from #tmpVAJ1 where VAJ01 > 0 --如果药品记帐不用发药,更新药品状态为拒绝发药 If exists(select * from SYS_Parameters where ProductID = 100 and ProgramID = 106004 and ParamNo = 4 and Value = '1') and (@WorkFrom = 2) BEGIN update #tmpNewVAJ1 set VAJ53 = 2 where BDN01 <= '3' END --找出已保存单据更新其单据全额、金额 SELECT * INTO #tmpSumVAJ1 from (SELECT VAI01 , sum(VAJ36) VAI22 , sum(VAJ38) VAI23 from #tmpVAJ1 where VAI01 > 0 GROUP by VAI01) a /*===============================================================生成单据、明细临时表=========================================================*/ SELECT @i =0 , @Count = COUNT(1) FROM #tmpNewVAI1 EXEC Core_NewIDEx 'VAI1', 'VAI01', @VAI01 out , @Count WHILE @i < @Count BEGIN SELECT @VAI00 = VAI00 FROM #tmpNewVAI1 WHERE [ID] = @i + 1 SET @VAI04 = '000000000' SET @VAI04 = @VAI04 + Cast(@VAI01 - @Count + @i + 1 AS VARCHAR) SET @VAI04 = 'I' + SUBSTRING(@VAI04, Len(@VAI04) - 9, 10) SELECT @VAI22 = sum(VAJ36) , @VAI23 = sum(VAJ38) from #tmpVAJ1 where VAI00 = @VAI00 UPDATE #tmpNewVAI1 SET VAI01 = @VAI01 - @Count + @i + 1, VAI04 = @VAI04 , VAI22 = @VAI22 , VAI23 = @VAI23 WHERE [ID] = @i + 1 SET @i = @i + 1 END --更新原单据ID UPDATE a SET a.VAI01 = b.VAI01 , a.VAI04 = b.VAI04 from #tmpVAI1 a join #tmpNewVAI1 b on a.VAI00 = b.VAI00 --更新临时明细表中单据ID UPDATE b SET b.VAI01 = a.VAI01 FROM #tmpVAI1 a JOIN #tmpVAJ1 b ON a.VAI00 = b.VAI00 --更新新增明细临时表中单据ID UPDATE b SET b.VAI01 = a.VAI01 FROM #tmpVAI1 a JOIN #tmpNewVAJ1 b ON a.VAI00 = b.VAI00 --更新新增明细临时表中单据ID UPDATE b SET b.VAI01 = a.VAI01 FROM #tmpVAI1 a JOIN #tmpVAJ1 b ON a.VAI00 = b.VAI00 --转换明细中药品单位、价格 SELECT @i = 0 , @Count = COUNT(1) FROM #tmpOldVAJ1 WHILE @i < @Count BEGIN SELECT @BDN01 = BDN01 ,@BBY01 = BBY01 ,@VAJ25 = VAJ25 ,@VAJ30 = VAJ30 , @VAJ31 = VAJ31 , @VAJ32 = VAJ32 ,@VAJ33 = VAJ33 ,@VAJ34 = VAJ34 , @VAJ35 = VAJ35 , @VAJ24 = VAJ24 , @FAB03 = VAJ35 from #tmpOldVAJ1 where [ID] = @i + 1 --如果是药品,保存的时候转为为基本单位对应的数量、价格及保存基本单位 IF @BDN01 < '4' BEGIN SELECT @VAJ32 = @VAJ32 / @VAJ34 , @VAJ35 = BBY08 FROM BBY1 a join BAG1 b on b.BBY01 = a.BBY01 WHERE a.BBY01 = @BBY01 SET @VAJ33 = @VAJ32*@VAJ30/@VAJ31 SET @VAJ25 = @VAJ25*@VAJ34 --如果是中草药,转换其单量为基本单量 SET @VAJ24 = @VAJ24*@VAJ34 UPDATE #tmpOldVAJ1 SET VAJ24 = @VAJ24 , VAJ25 = @VAJ25 , VAJ32 = @VAJ32 , VAJ33 = @VAJ33 , VAJ35 = @VAJ35 WHERE [ID] = @i + 1 END SET @i = @i + 1 END SELECT @i = 0 , @Count = COUNT(1) FROM #tmpNewVAJ1 Exec Core_NewIDEx 'VAJ1', 'VAJ01', @VAJ01 out , @Count WHILE @i < @Count BEGIN SELECT @BDN01 = BDN01 ,@BBY01 = BBY01 ,@VAJ25 = VAJ25 ,@VAJ30 = VAJ30 , @VAJ31 = VAJ31 , @VAJ32 = VAJ32 ,@VAJ33 = VAJ33 ,@VAJ34 = VAJ34 , @VAJ35 = VAJ35 , @VAJ24 = VAJ24 , @FAB03 = VAJ35 from #tmpNewVAJ1 where [ID] = @i + 1 --如果是药品,保存的时候转为为基本单位对应的数量、价格及保存基本单位 IF @BDN01 < '4' BEGIN --SELECT @VAJ32 = Case @ABC14 when 1 then (case when isnull(b.BAG23 , 0) = 0 then a.BBY25 else b.BAG23 end) else a.BBY25 end, SELECT @VAJ32 = @VAJ32 / @VAJ34 , @VAJ35 = BBY08 FROM BBY1 a join BAG1 b on b.BBY01 = a.BBY01 WHERE a.BBY01 = @BBY01 SET @VAJ33 = @VAJ32*@VAJ30/@VAJ31 SET @VAJ25 = @VAJ25*@VAJ34 --如果是中草药,转换其单量为基本单量 --IF @BDN01 = '3' SET @VAJ24 = @VAJ24*@VAJ34 UPDATE #tmpNewVAJ1 SET VAJ24 = @VAJ24 , VAJ25 = @VAJ25 , VAJ32 = @VAJ32 , VAJ33 = @VAJ33 , VAJ35 = @VAJ35 WHERE [ID] = @i + 1 END UPDATE #tmpNewVAJ1 SET VAJ01 = @VAJ01 - @Count + @i + 1 WHERE [ID] = @i + 1 SET @i = @i + 1 END --统计单据总额 select @TotalFee = SUM(VAJ38) from #tmpNewVAJ1 --检索出待保存的药品明细 select IDENTITY(int,1,1) AS ID, BBY01 , VAJ25 , BCK01D , DSK01 Into #tmpSumNewVAJ1 from (select BBY01 , SUM(VAJ25) VAJ25 , BCK01D , DSK01 from #tmpNewVAJ1 where BDN01 <= '3' group by BBY01 , BCK01D , DSK01) a --检索待保存的材料明细 select IDENTITY(int,1,1) AS ID, BBY01 , VAJ25 , BCK01D , DSK01 Into #tmpMaterial from (select BBY01 , SUM(VAJ25) VAJ25 , BCK01D , DSK01 from #tmpNewVAJ1 where BDN01 = '4' group by BBY01 , BCK01D , DSK01) a --汇总待发药单据到通知表中(暂时只处理门诊) If exists(select * from #TmpVAA1 where ACF01 = 1) BEGIN SELECT IDENTITY(int,1,1) AS ID,VAI01 , BCK01D , BCK01E INTO #TmpForMedicine from #tmpVAJ1 where BDN01 <= '3' and VAJ53 = 0 group by VAI01 , BCK01D , BCK01E END --门诊待发药临时表 SELECT VAJ01 INTO #tmpOutptDTD1 FROM #tmpNewVAJ1 WHERE BDN01 < '4' and VAJ53 = 0 --待发药记录表更新 SELECT a.VAJ01 , a.VAJ25 INTO #tmpUpdateDTD1 FROM #tmpOldVAJ1 a JOIN VAJ1 b with(nolock) on b.VAJ01 = a.VAJ01 WHERE a.BDN01 < '4' and a.VAJ53 = 0 and a.VAJ25 <> b.VAJ25 /*======================================================按计价方式重新写入价格、数量等信息=============================================*/ SELECT @gParam138 = dbo.GetSysParamValue(9999,9999,138) If @gParam138 = 1 BEGIN Update a SET a.VAJ76=a.VAJ25/b.BAG05, a.VAJ77=b.BDG02A, a.VAJ78=b.BAG05, a.VAJ79=c.PresellPrice, a.VAJ80=c.PresellPrice*a.VAJ30/a.VAJ31 from #tmpNewVAJ1 a join BAG1 b with(nolock) on b.BBY01=a.BBY01 join DSK1 c with(nolock) on c.ID=a.DSK01 where a.BDN01<'4' and b.BAG05=b.BAG09 Update a SET a.VAJ76=a.VAJ25/b.BAG05 from #tmpOldVAJ1 a join BAG1 b with(nolock) on b.BBY01=a.BBY01 where a.BDN01<'4' and b.BAG05=b.BAG09 Update a SET a.VAJ76=a.VAJ25, a.VAJ77=a.VAJ35, a.VAJ78=1, a.VAJ79=a.VAJ32, a.VAJ80=a.VAJ33 from #tmpNewVAJ1 a LEFT JOIN BAG1 b with(nolock) on b.BBY01 = a.BBY01 where a.BDN01>'3' or (a.BDN01 < '4' and (ISNULL(DSK01 ,0) = 0 or b.BAG05<>b.BAG09)) Update a SET a.VAJ76=a.VAJ25 from #tmpOldVAJ1 a join BAG1 b with(nolock) on b.BBY01=a.BBY01 where a.BDN01<'4' and b.BAG05=b.BAG09 END ELSE BEGIN Update a SET a.VAJ76=a.VAJ25, a.VAJ77=a.VAJ35, a.VAJ78=1, a.VAJ79=a.VAJ32, a.VAJ80=a.VAJ33 from #tmpNewVAJ1 a Update a SET a.VAJ76=a.VAJ25 from #tmpOldVAJ1 a END SELECT @IAA01 = IAA01 from IAR1 with(nolock) where VAA01 = @VAA01 and VAA07 = @VAA07 and ACF01 <> 2 If ISNULL(@IAA01 ,0) <= 0 BEGIN SELECT @IAA01 = BLP06 from BLP1 with(nolock) where BLP02=72 and BLP04=1 END SET @IAA01 = ISNULL(@IAA01 ,0) /*======================================================================================================================*/ BEGIN TRAN --开始一个事物 /*================================================================收费处新增病人=======================================================*/ IF ISNULL(@VAA01,0) = 0 BEGIN --新增病人信息 EXEC Core_NewIdEx 'VAA1' , 'VAA01' ,@VAA01 out INSERT INTO VAA1 (VAA01 , VAA03 , VAA05 , ABBRP , ABBRW , ABW01 , VAA10 , AAU01 , BDP02,ABC02 , VAA75 , VAA15 , VAA12 , VAA35) SELECT @VAA01 , VAA03 , VAA05 , ABBRP , ABBRW , ABW01 , VAA10 , AAU01 , BDP02, ABC02 , @CurDate , VAA15 , VAA12 , VAA35 FROM #tmpVAA1 IF @@ERROR > 0 --如果发生错误则回滚数据 BEGIN IF @@TRANCOUNT > 0 ROLLBACK TRAN RAISERROR('写入病人信息时发生错误,错误号为: %d.', 16, 1, @@ERROR) WITH NOWAIT Return 1 END INSERT INTO VFA1(VAA01 , BCE01 , BCE03 , BCE01C , BCE03C , VFA22) SELECT @VAA01 , @EmpId , @EmpName , @EmpId , @EmpName , -1 --新增病人挂号记录 Declare @VAC02 varChar(30) , @curID int EXEC Core_NewIDEx 'VAC1' , 'VAC01' , @VAA07 out Exec Core_NewId_VAC02 @curID out SELECT @VAC02 = dbo.[GetNewSquenceNo](1 , @curID) INSERT INTO VAC1 (VAC01 , VAC02 , VAA01 , VAA10 , AAU01 , ABC02 , VAC06 , VAC09 , BCK01A , BCE03A , VAC36 , VAC37 , BCE02 , BCE03B, VAC45 , VAC46 , BCE02A ,BDP02 , BCE01A , BCE01D , BCE03D , VAC71,VAC34 , VAC72 , VAC74 , VAC75 , VAC76 , VAC77 , VAC78 , VAC82) SELECT @VAA07 , @VAC02 , @VAA01 , VAA10 , AAU01 , ABC02 , 0 , -1 , BCK01A , BCE03A , @CurDate , @CurDate , @EmpNo , @EmpName, 1 , '收费处新增病人' , BCE02A, BDP02 , BCE01A , BCE01A , BCE03A , 1 , 1 , ISNULL(dbo.GetClinicExpiryDate(@BCK01A , @BDP02 , @ABC02,@CurDate) , '9999-12-31' ),VAA03 ,VAA05 , ABW01 , VAA15 , VAA12 , -1 from #tmpVAA1 IF @@ERROR > 0 --如果发生错误则回滚数据 BEGIN IF @@TRANCOUNT > 0 ROLLBACK TRAN RAISERROR('写入病人挂号记录时发生错误,错误号为: %d.', 16, 1, @@ERROR) WITH NOWAIT Return 1 END --转诊信息写入挂号附表 INSERT INTO VCJ1 (VAA07 , VCJ09 ,VCJ10 , VCJ11 , VCJ12 , VCJ13 , VCJ14) SELECT @VAA07 , @CurDate ,VCJ10 , VCJ11 , VCJ12 , VCJ13 , VCJ14 from #TmpVAA1 IF @@ERROR > 0 --如果发生错误则回滚数据 BEGIN IF @@TRANCOUNT > 0 ROLLBACK TRAN RAISERROR('写入病人挂号附表时发生错误,错误号为: %d.', 16, 1, @@ERROR) WITH NOWAIT Return 1 END END ELSE BEGIN --存在病人信息 SELECT @OVAA05 = VAA05 , @OVAA15 = VAA15 , @OBDP02 = BDP02 , @OVAA35 = VAA35 from VAA1 with(nolock) where VAA01 = @VAA01 UPDATE VAA1 --WITH (SNAPSHOT) SET BDP02 =@BDP02 , ABC02 = @ABC02 , VAA05 = @VAA05 , VAA15 = @VAA15 , VAA35 = @VAA35 , ABBRP = ISNULL(@ABBRP , ABBRP) , ABBRW = ISNULL(@ABBRW , ABBRW) , ModifiedDate = @CurDate WHERE VAA01=@VAA01 Update VFA1 SET BCE01C = @EmpId , BCE03C = @EmpName where VAA01 = @VAA01 UPDATE VAC1 --WITH (SNAPSHOT) SET BDP02 = @BDP02 , ABC02 = @ABC02 , VAC75 = @VAA05 , VAC77 = @VAA15 WHERE VAC01 =@VAA07 --更新挂号医生 IF EXISTS(SELECT * FROM VAC1 with(nolock) WHERE VAC01 = @VAA07 AND BCE01A = 0) BEGIN UPDATE VAC1 --WITH (SNAPSHOT) SET BCE01A = @BCE01A , BCE02A = @BCE02A , BCE03A = @BCE03A WHERE VAC01 = @VAA07 END --更新转诊信息 UPDATE a SET a.VCJ10 = b.VCJ10 , a.VCJ11 = b.VCJ11 , a.VCJ12 = b.VCJ12 , a.VCJ13 = b.VCJ13 , a.VCJ14 = b.VCJ14 FROM VCJ1 a JOIN #TmpVAA1 b on b.VAA07 = a.VAA07 where a.VAA07 = @VAA07 If @VAA05 <> @OVAA05 BEGIN Exec Core_NewId 'ZAE1' , 'ZAE01' , @ZAE01 out INSERT INTO ZAE1 (ZAE01, TNAME, CNAME, ZAE04, ZAE05, ZAE06, ZAE07, ZAE08, BCE01, BCE03, ZAE11) select @ZAE01, 'VAA1', 'VAA05', @VAA01, @VAA07, @OVAA05, @VAA05, '门诊收费姓名变更', @EmpId, @EmpName, @CurDate END If @VAA15 <> @OVAA15 BEGIN Exec Core_NewId 'ZAE1' , 'ZAE01' , @ZAE01 out INSERT INTO ZAE1 (ZAE01, TNAME, CNAME, ZAE04, ZAE05, ZAE06, ZAE07, ZAE08, BCE01, BCE03, ZAE11) select @ZAE01, 'VAA1', 'VAA15', @VAA01, @VAA07, @OVAA15, @VAA15, '门诊收费身份证号变更', @EmpId, @EmpName, @CurDate END If @BDP02 <> @OBDP02 BEGIN Exec Core_NewId 'ZAE1' , 'ZAE01' , @ZAE01 out INSERT INTO ZAE1 (ZAE01, TNAME, CNAME, ZAE04, ZAE05, ZAE06, ZAE07, ZAE08, BCE01, BCE03, ZAE11) select @ZAE01, 'VAA1', 'BDP02', @VAA01, @VAA07, @OBDP02, @BDP02, '门诊收费病人类别变更', @EmpId, @EmpName, @CurDate END If @VAA35 <> @OVAA35 BEGIN Exec Core_NewId 'ZAE1' , 'ZAE01' , @ZAE01 out INSERT INTO ZAE1 (ZAE01, TNAME, CNAME, ZAE04, ZAE05, ZAE06, ZAE07, ZAE08, BCE01, BCE03, ZAE11) select @ZAE01, 'VAA1', 'VAA35', @VAA01, @VAA07, @OBDP02, @BDP02, '门诊收费病人手机号变更', @EmpId, @EmpName, @CurDate END END --单独保存病人信息则退出 If @OnlyReg = 1 BEGIN COMMIT TRAN SELECT @VAA01 VAA01 , @VAA07 VAA07 RETURN 3 END --更新已有单据上的全额、金额、挂起 If exists(select * from #tmpSumVAJ1) BEGIN Update a SET a.VAI22 = b.VAI22 , a.VAI23 = b.VAI23 from VAI1 a join #tmpSumVAJ1 b on a.VAI01 = b.VAI01 END --更新已有单据是否挂起标志 Update a SET a.VAI25 = b.Enabled from VAI1 a join #tmpVAI1 b on a.VAI01 = b.VAI01 --更新单据明细单据ID(门诊结算重新调整单据后) Update a SET a.VAI01 = b.VAI01 from VAJ1 a join #tmpVAJ1 b on b.VAJ01 = a.VAJ01 --更新VEG1记录 SELECT a.VAJ01 , a.VAJ25 INTO #tmpVAJ1Change from #tmpOldVAJ1 a join VAJ1 b with(nolock) on a.VAJ01 = b.VAJ01 where a.VAJ25 <> b.VAJ25 If exists(SELECT * from #tmpVAJ1Change ) BEGIN Update a SET a.VEG03 = b.VAJ25 from VEG1 a join #tmpVAJ1Change b on a.VAJ01 = b.VAJ01 END --新明细数据、单价、全额、金额、核算金额、执行科室 Update a SET a.VAJ23 = b.VAJ23 , a.VAJ24 = b.VAJ24 , a.VAJ25 = b.VAJ25 , a.VAJ30 = b.VAJ30 , a.VAJ31 = b.VAJ31 , a.VAJ32 = b.VAJ32 , a.VAJ33 = b.VAJ33 , a.VAJ36 = b.VAJ36 , a.VAJ37 = b.VAJ37 , a.VAJ38 = b.VAJ38 , a.VAJ61 = b.VAJ61 , a.BCK01D = b.BCK01D, a.VAJ76 = b.VAJ76 from VAJ1 a join #tmpOldVAJ1 b on a.VAJ01 = b.VAJ01 --如果不存在要新增的明细数据,则返回 If not exists(select * from #tmpNewVAJ1 ) and not exists(select * from #tmpNewVAI1) BEGIN COMMIT TRAN SELECT @VAA01 VAA01 ,@VAA07 VAA07 , * from #tmpVAI1 RETURN 3 END /*========================================================检索病人科室、病区=============================================================*/ If @ACF01 = 1 --门诊 BEGIN Select @InDept =BCK01A , @InWard = 0 from VAC1 with(nolock) where VAC01 = @VAA07 END /*========================================================保存病人收费单据=================================================================*/ SET @KuoZhan1 = 0 SET @VAJ10 = 0 --如果是收费处新增的单据,状态为划价状态 If @WorkType In(3 , 4 ) BEGIN SET @VAI18 = 2 END else BEGIN SET @VAI18 = @WorkType END INSERT INTO VAI1(VAI01, VAA01, VAA07, VAI04, VAI05, BCK01A, BCK01B, BCE02A, BCE03A, BCE02B, BCE03B, VAI12, VAI13, VAI14, VAI01A, VAI16, VAI17, VAI18 , CBM01 , ACF01 , VAI22 , VAI23 , VAK01 ,VAI25 , BCE01C , BCE03C , BCE01D , BCE03D , VAP01 , VAI35 ) SELECT VAI01, @VAA01, @VAA07, VAI04, VAI05, @BCK01B, BCK01B, BCE02A, BCE03A, @EmpNo, @EmpName, @CurDate, @CurDate, @WorkName, 0, 1, VAI17, @VAI18 ,ISNULL(@KuoZhan1 , 0) , @ACF01 , VAI22 , VAI23 , 0 , Enabled , BCE01C , BCE03C , BCE01D , BCE03D , @VAP01 , VAI35 from #tmpNewVAI1 IF @@ERROR > 0 --如果发生错误,则回滚数据 BEGIN IF @@TRANCOUNT > 0 ROLLBACK TRAN RAISERROR('写入病人费用单据时发生错误,错误号为: %d.', 16, 1, @@ERROR) WITH NOWAIT Return 1 END /*========================================================保存收费明细数据========================================================*/ INSERT INTO VAJ1(VAJ01, VAA01, VAA07, VAJ04, VAJ05, ROWNR, VAJ01A, VAJ01B, VAJ09, VAJ10, VAI01, VAF01, VAK01, ACF01, VAJ15, BCK01A, BCK01B, BDN01, BBY01, BCJ02, VAJ21, VAJ22, VAJ23, VAJ24, VAJ25, VAJ26, VAJ27, VAJ28, VAJ29, VAJ30, VAJ31, VAJ32, VAJ33, VAJ34, VAJ35, VAJ36, VAJ37, VAJ38, VAJ39, BCE03A, BCK01C, BCE02B, BCE03B, VAJ46, VAJ47, VAJ48, BCK01D, VAJ54, BCE02D, BCE03D,VAJ53, VAJ57, FAB03, VAJ59 , VAJ61 , VAJ62 , BCK01E , DSK01 , VAJ67 , VAJ76 , VAJ77 , VAJ78 , VAJ79 , VAJ80 ) SELECT VAJ01, @VAA01, @VAA07, @VAI18 , 1, ROWNR , ISNULL(VAJ01A , 0), 0, 0, @VAJ10 , VAI01, ISNULL(VAF01 , 0) , 0, @ACF01, 0, @InWard, @InDept, BDN01, BBY01, '', 0, VAJ22, VAJ23, VAJ24, VAJ25, VAJ26, @VAP01, 1, 1, VAJ30, VAJ31, VAJ32, VAJ33, VAJ34, VAJ35, VAJ36, VAJ37, VAJ38 , VAJ39, @EmpName, BCK01C, BCE02B, BCE03B, @CurDate, @CurDate, 0, BCK01D, ISNULL(VAJ54 ,@WorkName), @EmpNo, @EmpName, VAJ53 ,VAJ57, ISNULL(@FAB03 , ''), VAJ59 , VAJ38 , @CurDate , BCK01E , DSK01 , VAJ67, VAJ76 , VAJ77 , VAJ78 , VAJ79 , VAJ80 from #tmpNewVAJ1 IF @@ERROR > 0 --如果发生错误,则回滚数据 BEGIN IF @@TRANCOUNT > 0 ROLLBACK TRAN RAISERROR('保存病人收费明细时发生错误,错误号为: %d.', 16, 1, @@ERROR) WITH NOWAIT Return 1 END /*=======================================================更新药品虚拟库存====================================================================*/ If exists(select * from #tmpSumNewVAJ1) and not exists(select * from SYS_Parameters where ProductID = 9999 and ProgramID = 9999 and ParamNo = 46 and value ='1') BEGIN SELECT @i = 0 , @Count = COUNT(1) from #tmpSumNewVAJ1 while @i < @Count BEGIN SELECT @BCK01D = BCK01D , @BBY01 = BBY01 , @VAJ25 = VAJ25 , @DSK01 = DSK01 from #tmpSumNewVAJ1 WHERE [ID] = @i + 1 Exec @ErrId = DPS_DPT1_Update @BCK01D , @BBY01 , @DSK01 ,@VAJ25 IF @@ERROR > 0 --如果发生错误,则回滚数据 BEGIN IF @@TRANCOUNT > 0 ROLLBACK TRAN RAISERROR('更新药品虚拟库存时发生错误,错误号为: %d.', 16, 1, @@ERROR) WITH NOWAIT Return 1 END SET @i = @i + 1 END END /*=======================================================更新材料虚拟库存==========================================================================*/ If exists(select * from #tmpMaterial) and not exists(select * from SYS_Parameters where ProductID = 9999 and ProgramID = 9999 and ParamNo = 125 and value ='1') BEGIN SELECT @i = 0 , @Count = COUNT(1) from #tmpMaterial while @i < @Count BEGIN SELECT @BCK01D = BCK01D , @BBY01 = BBY01 , @VAJ25 = VAJ25 , @DSK01 = DSK01 from #tmpMaterial WHERE [ID] = @i + 1 Exec @ErrId = MDS_MDT1_Update @BCK01D , @BBY01 , @DSK01 ,@VAJ25 IF @@ERROR > 0 --如果发生错误,则回滚数据 BEGIN IF @@TRANCOUNT > 0 ROLLBACK TRAN RAISERROR('更新材料虚拟库存时发生错误,错误号为: %d.', 16, 1, @@ERROR) WITH NOWAIT Return 1 END SET @i = @i + 1 END END /*====================================================汇总待发药的单据列表(暂时只处理门诊)=========================================================*/ If exists(select * from #TmpForMedicine) BEGIN SELECT @i = 0 , @Count = COUNT(1) from #TmpForMedicine while @i < @Count BEGIN SELECT @BCK01D = BCK01D , @BCK01E = BCK01E , @VAI01 = VAI01 from #TmpForMedicine where [ID] = @i + 1 SELECT @VAI04 = VAI04 from #tmpVAI1 where VAI01 = @VAI01 --如果业务通知表中不存在数据,则写入 If not exists(select * from VBX1 where VBX18 = @VAI01 and VBX03 = 2 and BCK01D = @BCK01D and BCK01C = @BCK01E) BEGIN Exec @ErrId = HOPublic_VBX1_Update @VAA01 , @VAA07 , @ACF01 , 2 , 2 , 2 , -1 , @VAI04 , @CurDate , @VAI01 , 0 ,'划价生成待发药单据' , 0 , 0 , @EmpId , @EmpName , @InDept , @BCK01E , @BCK01D , 0 END SET @i = @i + 1 END END /*========================================================调用自动分单过程========================================================================*/ If exists(select * from #tmpNewVAI1) BEGIN Declare @DisVAI01 int SELECT @i =0 , @Count = count(1) from #tmpNewVAI1 WHILE @i < @Count BEGIN SELECT @DisVAI01 = VAI01 from #tmpNewVAI1 where [id] = @i + 1 Exec HOFt_VAI1_Split @DisVAI01 SET @i = @i + 1 END END /*=========================================================插入费用附加表=========================================================================*/ --目前插入非医嘱、体检的划价费用明细 If (@ACF01 = 1) and exists(select * from #tmpNewVAJ1 where VAF01 = 0 ) BEGIN INSERT INTO VEG1(VAJ01 , VEG03 , VEG04 , VEG08) SELECT VAJ01 , VAJ25 , VEG04, VEG08 from #tmpNewVAJ1 where VAF01 = 0 IF @@ERROR > 0 --如果发生错误,则回滚数据 BEGIN IF @@TRANCOUNT > 0 ROLLBACK TRAN RAISERROR('插入门诊费用附表时发生错误,错误号为: %d.', 16, 1, @@ERROR) WITH NOWAIT Return 1 END INSERT INTO VHP1(VAJ01 , IAH04 , IAH05 ) SELECT VAJ01 , c.IAH04 , c.IAH05 from #tmpNewVAJ1 a LEFT JOIN IAM1 b on b.BBY01 = a.BBY01 and b.IAA01 = @IAA01 LEFT JOIN IAH1 c on c.IAH01 = b.IAH01 IF @@ERROR > 0 --如果发生错误,则回滚数据 BEGIN IF @@TRANCOUNT > 0 ROLLBACK TRAN RAISERROR('插入门诊费用附表二时发生错误,错误号为: %d.', 16, 1, @@ERROR) WITH NOWAIT Return 1 END END /*=============================================================插入待发药明细记录====================================================================*/ If exists(select * from #tmpOutptDTD1) BEGIN INSERT INTO DTD1(VAJ01, DTB01, VAA01, VAA07, VAJ04, VAJ05, VAJ09, VAI01, VAF01, BDN01, ROWNR, BBY01, VAJ23, VAJ24, VAJ25, VAJ32, VAJ33, VAJ34, VAJ35, VAJ36, VAJ37, VAJ38, BCK01A, BCK01B, BCK01C, BCK01D, BCK01E, BCE03A, BCE02B, BCE03B, BCE03C, VAJ46, VAJ47, VAJ48, VAJ51, VAJ53, VAJ54, BCJ02 , DSK01) SELECT a.VAJ01, 0, VAA01, VAA07, VAJ04, VAJ05, VAJ09, VAI01, VAF01, BDN01, ROWNR, BBY01, VAJ23, VAJ24, VAJ25, VAJ32, VAJ33, VAJ34, VAJ35, VAJ36, VAJ37, VAJ38, BCK01A, BCK01B, BCK01C, BCK01D, BCK01E, BCE03A, BCE02B, BCE03B, BCE03C, VAJ46, VAJ47, VAJ48, VAJ51, VAJ53, VAJ54, BCJ02 , DSK01 from #tmpOutptDTD1 a JOIN VAJ1 b with(nolock) on b.VAJ01 = a.VAJ01 END /*===========================================================更新待发药记录========================================================================*/ If exists(SELECT * from #tmpUpdateDTD1) BEGIN Update a SET a.VAJ25 = b.VAJ25 from DTD1 a join #tmpUpdateDTD1 b on b.VAJ01 = a.VAJ01 END /*=================================================================================================================================================*/ Commit TRAN /*=========================================================返回保存成功的单据列表==================================================================*/ if exists(select * from #tmpNewVAI1) begin Select @VAA01 VAA01 ,@VAA07 VAA07 , * from #tmpNewVAI1 end else begin Select @VAA01 VAA01 ,@VAA07 VAA07 , * from #tmpVAI1 end ---------------------------------------------------------------------------------------------------------------------------------------------------- IF Object_id('tempdb..#TmpVAA1') IS NOT NULL DROP TABLE #TmpVAA1 IF Object_id('tempdb..#TmpForMedicine') IS NOT NULL DROP TABLE #TmpForMedicine IF Object_id('tempdb..#tmpNewVAI1') IS NOT NULL DROP TABLE #tmpNewVAI1 IF Object_id('tempdb..#tmpNewVAJ1') IS NOT NULL DROP TABLE #tmpNewVAJ1 IF Object_id('tempdb..#tmpOldVAJ1') IS NOT NULL DROP TABLE #tmpOldVAJ1 IF Object_id('tempdb..#tmpSumNewVAJ1') IS NOT NULL DROP TABLE #tmpSumNewVAJ1 IF Object_id('tempdb..#tmpSumVAJ1') IS NOT NULL DROP TABLE #tmpSumVAJ1 IF Object_id('tempdb..#tmpVAJ1') IS NOT NULL DROP TABLE #tmpVAJ1 IF Object_id('tempdb..#tmpVAI1') IS NOT NULL DROP TABLE #tmpVAI1 If Object_id('tempdb..#tmpMaterial') IS NOT NULL DROP TABLE #tmpMaterial If Object_id('tempdb..#tmpOutptDTD1') IS NOT NULL DROP TABLE #tmpOutptDTD1 If Object_id('tempdb..#tmpUpdateDTD1') IS NOT NULL DROP TABLE #tmpUpdateDTD1 If Object_id('tempdb..#tmpVAJ1Change') IS NOT NULL DROP TABLE #tmpVAJ1Change