SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO --================================================================================================ --创 建 人:0004 创建日期:2010 --功能描述:会员积分 --关联业务:会员发卡或充值时,手工输入正负积分; -- 挂号退号、门诊收退费、住院收退费根据积分策略自动增减积分; -- 积分余额自动(通过积分转换规则)转换为赠送帐户余额 --更新人:0004 更新日期:2011.08.26 更新内容:重新分类 --更新人:0004 更新日期:2011.09.19 更新内容:非按卡消费积分方式,现金消费不产生积分 --2014-03-31 修改VCB04长度 --2014.12.12 减小事务锁粒度 --2014.12.17 根据参数决定是否调用积分生成过程 --2015.10.14 修正会员充值时积分记录中备注未保留的问题 --================================================================================================ ALTER PROC [Customer_VBU17_INC] @VBU01 int --会员帐户ID ,@Style int --10=门诊基本帐户消费;11=门诊现金消费;(12=门诊赠送帐户消费;13=门诊积分帐户消费) --20=住院基本帐户消费;21=住院现金消费;(22=住院赠送帐户消费;23=住院积分帐户消费) --30=基本帐户充值;31=手工赠送积分;(32=积分兑换赠送帐户余额;33=积分兑换礼品) ,@VCA01 int --帐户交易ID ,@VAK01 int --结帐ID ,@VBL01 int --支付ID ,@Value numeric(18,2) --交易额,消费金额、充值金额或积分值 ,@UserName varchar(64) --操作员 ,@BCE01 int=0 ,@BCE02 varchar(20)='' ,@VBL12 varchar(128)='' AS --如果设置了禁用积分,退出该过程 If exists(select * from SYS_Parameters with(nolock) where ProductID = 1 and ProgramID = 116001 and paramno =24 and value='1') BEGIN RETURN END DECLARE @SAA01 int --卡类ID ,@iVBU01B int --上级会员ID ,@VCB04 varchar(64) --卡号 ,@ErrId int ,@VBL02 varchar(30) SELECT @SAA01=ISNULL(VBU08,0) ,@iVBU01B=ISNULL(VBU01B,0) ,@VCB04=ISNULL(VCB04,'') FROM VBU1 with(nolock) WHERE VBU01=@VBU01 ---------0.创建临时表------------------------------------------------------------------ CREATE TABLE #Tmp_SAI1( ID int IDENTITY ,VBU01 int --会员ID ,SAI11 numeric(18,2) --积分值 ,SAI17 varchar(64) --备注 ) ---------1.计算积分--------------------------------------------------------------------- DECLARE @xType int --积分方式 ,@ObjectID int --积分对象 ,@RuleID int --积分规则 ,@SAD05_F numeric(18,2) --数值型参数1 ,@SAD06_F numeric(18,2) --数值型参数2 ,@SAD05_V varchar(100) --字符型参数1 ,@SAI11 numeric(18,2) --积分值 ,@Parameters nvarchar(4000) --公式参数列表 ,@SAI17 varchar(64) --备注 ,@LVLNR int --层次 ,@Continue tinyint --是否继续 IF @Style=31 --手工赠送积分 BEGIN SET @SAI17=CASE WHEN @VBL12>'' then @VBL12 ELSE CASE WHEN @Value>0 THEN '手工赠送积分' ELSE '手工冲减积分' END END INSERT INTO #Tmp_SAI1(VBU01,SAI11,SAI17) VALUES(@VBU01,@Value,@SAI17) END ELSE BEGIN --取积分方式:1=按基本帐户充值金额;2=按基本帐户消费金额;28=按卡消费金额 SELECT @xType=SAC01 FROM SAD1 with(nolock) WHERE SAA01=@SAA01 AND SAB01=2 --取积分对象:3=本帐户;4=上级帐户;5=本帐户及上级帐户;6=金字塔式积分 SELECT @ObjectID=SAC01 FROM SAD1 with(nolock) WHERE SAA01=@SAA01 AND SAB01=3 --取积分规则:7=按基本帐户交易金额乘以比例[Rate];8=按基本帐户交易金额满[m]元积[n]分;27=按[本帐户积分公式]及[上级帐户积分公式] SELECT @RuleID=SAC01 FROM SAD1 with(nolock) WHERE SAA01=@SAA01 AND SAB01=4 SELECT @xType=ISNULL(@xType,0),@ObjectID=ISNULL(@ObjectID,0),@RuleID=ISNULL(@RuleID,0),@Continue=1 IF NOT (@xType IN(1,2,28) AND @ObjectID IN(3,4,5,6) AND @RuleID IN(7,8,27)) SET @Continue=0 --非按卡消费积分方式,现金消费不产生积分 IF @xType<>28 AND @Style IN(11,21) SET @Continue=0 --按卡消费积分方式,基本帐户消费不产生积分 IF @xType=28 AND @Style IN(10,20) SET @Continue=0 SELECT @iVBU01B=@VBU01,@LVLNR=0,@SAI11=0 BEGIN TRAN WHILE (@iVBU01B>0 AND @Continue>0) AND ((@xType=1 AND @Style=30) OR (@xType IN(2,28) AND @Style IN(10,11,20,21))) BEGIN IF @RuleID=7 BEGIN SELECT @SAD05_F=CASE ISNUMERIC(SAD05) WHEN 1 THEN CAST(SAD05 AS numeric(18,2)) ELSE 0 END FROM SAD1 with(nolock) WHERE SAA01=@SAA01 AND SAB01=4 AND SAC01=7 SET @SAI11=@Value*@SAD05_F END ELSE IF @RuleID=8 BEGIN SELECT @SAD05_F=CASE ISNUMERIC(SAD05) WHEN 1 THEN CAST(SAD05 AS numeric(18,2)) ELSE 999999 END ,@SAD06_F=CASE ISNUMERIC(SAD06) WHEN 1 THEN CAST(SAD06 AS numeric(18,2)) ELSE 0 END FROM SAD1 with(nolock) WHERE SAA01=@SAA01 AND SAB01=4 AND SAC01=8 SET @SAI11=SIGN(@Value)*FLOOR(ABS(@Value)/CASE WHEN @SAD05_F>0 THEN @SAD05_F ELSE 99999999 END)*@SAD06_F END ELSE IF @RuleID=27 BEGIN SELECT @SAD05_V=CASE @LVLNR WHEN 0 THEN CASE WHEN SAD05>'' THEN SAD05 ELSE '' END --本级用公式SAD05 ELSE CASE WHEN SAD06>'' THEN SAD06 ELSE '' END --非本级用公式SAD06 END FROM SAD1 with(nolock) WHERE SAA01=@SAA01 AND SAB01=4 AND SAC01=27 IF @SAD05_V>'' BEGIN SET @Parameters='' EXEC [Pub_GetCalcResult] @SAD05_V,@Parameters,@SAI11 out IF @@ERROR>'' BEGIN COMMIT TRAN RAISERROR('按公式计算积分时发生错误。',16,1) WITH NOWAIT RETURN @@ERROR END END END set @SAI17=case when @VBL12>'' then @VBL12 else CASE @LVLNR WHEN 0 THEN '本帐户' WHEN 1 THEN '下级帐户' ELSE '下'+CAST(@LVLNR AS VARCHAR)+'级帐户' END +CASE WHEN @LVLNR>0 THEN '(卡号:'+@VCB04+')' ELSE '' END +CASE @Style WHEN 10 THEN '门诊基本帐户消费' WHEN 11 THEN '门诊现金/帐户消费' WHEN 20 THEN '住院基本帐户消费' WHEN 21 THEN '住院现金/帐户消费' WHEN 30 THEN '基本帐户充值' ELSE '手工赠送积分' END +'产生积分' end IF ISNULL(@SAI11,0)=0 SET @Continue=0 ELSE IF NOT (@ObjectID=4 AND @LVLNR=0) --积分到上级帐户,首次循环不产生积分 INSERT INTO #Tmp_SAI1(VBU01,SAI11,SAI17) VALUES(@iVBU01B,@SAI11,@SAI17) IF @ObjectID=3 SET @Continue=0 --积分到本帐户,只循环一次 IF @ObjectID=4 AND @LVLNR=1 SET @Continue=0 --积分到本帐户,循环两次,第二次产生积分 IF @ObjectID=5 AND @LVLNR=1 SET @Continue=0 --积分到本帐户及上级帐户,循环两次 SELECT @iVBU01B=VBU01B FROM VBU1 WHERE VBU01=@iVBU01B SET @LVLNR=@LVLNR+1 END COMMIT TRAN END ---------2.写积分日志------------------------------------------------------------------- DECLARE @ID int ,@Max_ID int ,@VAA01 int ,@VAA07 int ,@SAI07 varchar(255) ,@SAI13 tinyint ,@SAI01A int IF @VCA01>0 SELECT @VAA01=VAA01 ,@VAA07=VAA07 ,@SAI07=VAI01 ,@VAK01=VAK01 FROM VCA1 with(nolock) WHERE VCA01=@VCA01 IF @VBL01>0 SELECT @VAA01=VAA01 ,@VAA07=VAA07 ,@VBL01=VBL01 FROM VBL1 with(nolock) WHERE VBL01=@VBL01 SELECT @ID=1,@Max_ID=COUNT(1) FROM #Tmp_SAI1 WHILE @ID<=@Max_ID BEGIN SELECT @VBU01=VBU01 ,@SAI11=SAI11 ,@SAI17=SAI17 FROM #Tmp_SAI1 WHERE ID=@ID if isnull(@VAA01,0)=0 SELECT top 1 @VAA01=VAA01 FROM VAA1 WHERE VBU01=@VBU01 --插入数据 病人缴款记录 IF @Value<>0 and @Style=31 --手工赠送积分 BEGIN Exec Core_NewIDEx 'VBL1','VBL01',@VBL01 out SET @VBL02 ='C' + RIGHT('00000000000' + Cast(@VBL01 AS VARCHAR), 10) insert into VBL1(VBL01, VBL02, VBL03, VBL04, VBL05, VAA01, VAA07, VBL11, VBL12, VBL13, VBL14, VBL15, VAK01, VBL17, VBL18, VBL19 ,VBL01A, BCE01, BCE02, BCE03, VBL24, VBL25, VBL26, VBL27, PNRCP, VBU01) Select @VBL01, @VBL02 ,'' , 5, 0, @VAA01, 0, '', @SAI17, @Value, '积分', '43', 0, 0, getdate(), getdate(), 0, @BCE01, @BCE02, @UserName, 0, 0, 0, 1, 0, @VBU01 IF @@ERROR>0 BEGIN RAISERROR('写入病人缴款时发生错误,错误号为: %d.', 16, 1, @@ERROR) WITH NOWAIT RETURN @@ERROR END END EXEC @ErrId=Customer_SAI1_UPDATE @VBU01,@VAA01,@VAA07,@Style,@VCA01,@SAI07,@VAK01,@VBL01,@Value,@SAI11,@SAI13,@SAI01A,@UserName,@SAI17 IF @ErrId>0 OR @@ERROR>0 BEGIN RAISERROR('写积分日志时发生错误!',16,1) WITH NOWAIT RETURN 1 END SET @ID=@ID+1 END ---------3.积分自动转换为赠送帐户余额---------------------------------------------------- DECLARE @SAC01 int --积分转换规则 ,@VBU30 numeric(18,2) --交易前积分余额 ,@VBU30_Tran numeric(18,2) --转换时消耗的积分 ,@VBU13 numeric(18,2) --积分转换成赠送帐户金额 SELECT IDENTITY(int,1,1) ID ,U.VBU01 ,U.VAA01 ,U.VBU08 SAA01 ,D.SAC01 ,CAST(D.SAD05 AS numeric(18,2)) SAD05 ,CAST(D.SAD06 AS numeric(18,2)) SAD06 ,ISNULL(U.VBU30,0) VBU30 INTO #Tmp_Tran FROM VBU1 U JOIN SAD1 D ON D.SAA01=U.VBU08 AND D.SAB01=6 WHERE EXISTS(SELECT * FROM #Tmp_SAI1 WHERE VBU01=U.VBU01) --本次积分关联的帐户 AND EXISTS(SELECT * FROM SAD1 WHERE SAA01=U.VBU08 AND SAB01=5 AND SAC01=10) --帐户交易时自动转换的卡类 AND ISNUMERIC(D.SAD05)=1 AND ISNUMERIC(D.SAD06)=1 --合法参数 AND ISNULL(U.VBU30,0)>0 --积分余额为整数 SELECT @ID=1,@Max_ID=COUNT(1) FROM #Tmp_Tran WHILE @ID<=@Max_ID BEGIN SELECT @VBU01=VBU01 ,@VAA01=VAA01 ,@SAA01=SAA01 ,@SAC01=SAC01 ,@SAD05_F=SAD05 ,@SAD06_F=SAD06 ,@VBU30=VBU30 FROM #Tmp_Tran WHERE ID=@ID IF @SAC01=12 AND @VBU30>@SAD05_F --大于x固定比例y转换成赠送帐户余额(转换后余额处理方式可以再加一个参数0/1) BEGIN --计算积分转换成赠送帐户金额,消耗的积分 SET @VBU13=@VBU30*@SAD06_F SET @VBU30_Tran=-@VBU30 --写积分日志 EXEC Customer_SAI1_UPDATE @VBU01,@VAA01,@VAA07,32,@VCA01,@SAI07,@VAK01,@VBL01,@VBU30_Tran,@VBU30_Tran,2,0,@UserName,'积分余额自动转换为赠送帐户余额' IF @@ERROR>0 BEGIN RAISERROR('写积分日志时发生错误!',16,1) WITH NOWAIT RETURN 1 END END ELSE IF @SAC01=13 --按积分满m分兑换n元到赠送帐户 BEGIN --计算积分转换成赠送帐户金额,消耗的积分 SET @VBU13=FLOOR(@VBU30/CASE WHEN @SAD05_F>0 THEN @SAD05_F ELSE 999999 END)*@SAD06_F SET @VBU30_Tran=-FLOOR(@VBU30/CASE WHEN @SAD05_F>0 THEN @SAD05_F ELSE 999999 END)*@SAD05_F --写积分日志 EXEC Customer_SAI1_UPDATE @VBU01,@VAA01,@VAA07,32,@VCA01,@SAI07,@VAK01,@VBL01,@VBU30_Tran,@VBU30_Tran,2,0,@UserName,'积分余额自动转换为赠送帐户余额' IF @@ERROR>0 BEGIN RAISERROR('写积分日志时发生错误!',16,1) WITH NOWAIT RETURN 1 END END --写赠送帐户变动日志 IF @VBU13>0 OR @VBU13<0 BEGIN EXEC Customer_VBU13_Update '' --单据号 ,@VBU01 --帐户ID, 关联字段:VBU1.VBU01 ,@VAA01 --病人ID, 关联字段:VAA1.VAA01 ,@VAA07 --就诊ID ,2 --类型:0=手工;2=积分帐户转入;3=消费;9=其他 ,@VBU13 --金额 ,@VAK01 --结帐ID, 关联字段:VAK1.VAK01 ,@VBL01 --支付ID, 关联字段:VBL1.VBL01 ,0 --操作员ID, 关联字段:BCE1.BCE01 ,'' --操作员号, 关联字段:BCE1.BCE02 ,@UserName --操作员, 关联字段:BCE1.BCE03 ,'' --审批人, 关联字段:BCE1.BCE03 ,0 --冲销ID, 关联字段:SAL1.SAL01 ,0 --状态:0=原始单据;1=冲销单据 ,'积分余额自动转换为赠送帐户余额' --备注 IF @@ERROR>0 BEGIN RAISERROR('写赠送帐户变动日志时发生错误!',16,1) WITH NOWAIT RETURN 1 END END SET @ID=@ID+1 END --更新本次消费积分到VCA1 update vca1 with(rowlock) set vbu17=@sai11 where vca01=@vca01 IF OBJECT_ID('tempdb..#Tmp_SAI1') IS NOT NULL DROP TABLE #Tmp_SAI1 IF OBJECT_ID('tempdb..#Tmp_Tran') IS NOT NULL DROP TABLE #Tmp_Tran