CREATE OR REPLACE PROCEDURE SP_YF_ZYFYZDFPZSM(PCKDH00 in char, PCZY000 in number, PSFQZDP in char default '0', --是否全量自动匹配 PSFTS00 in char default '0', --是否提示 0不提示,1提示 POTHER0 in varchar2 default '' --XML扩展入参 ) as Ecustom exception; ls_YPZSL0 YF_YZYPSQ.YPZSL0%type; ls_YPSYSL YF_YZYPSQ.YPZSL0%type; Verrmsg varchar2(200); LS_ZYFYZDFPZSM varchar2(20); ls_YFBMBH BM_BMBM00.BMBH00%type; ls_YPQLPC YF_YZYPSQ.YPQLPC%type; ls_ZYID00 YF_YZYPSQ.ZYID00%type; ls_SFQZDP varchar2(10); LS_ZSMSFQZDPP varchar2(100); V_YPXX00 varchar2(2000); LS_ZSMFPSX varchar2(10); ls_count0 number(5); ls_HZBZ00 varchar2(2); -- Person Date Comments -- dsm 2025.03.26 自动分配追溯码 create for YF-20250327-002 -- dsm 2025.03.28 增加参数YF_ZYFYZDFPZSM for YF-20250328-001 -- dsm 2025.03.31 YZLB00写入修正 for YF-20250331-001 -- dsm 2025.04.03 库存不足错误先屏蔽 for YF-20250407-002 -- dsm 2025.04.09 ckdh00写入cflsh0字段,YSMSL0去掉FYTYBZ条件 for YF-20250410-001 -- dsm 2025.04.17 YSMSL0增加YZLB00条件 for YF-20250418-010 -- dsm 2025.05.09 增加SF_YF_GetZSMGGYF处理 for YF-20250509-001 -- dsm 2025.05.15 增加错误提示 for YF-20250515-001 -- dsm 2025.05.28 JLZSL0要减退的数量 for YF-20250529-004 -- huangjy 2025.06.12 增加PSFTS00,兼容his9 for YFPY-20250603-001 -- dsm 2025.06.17 增加追溯码使用顺序控制YF_ZSMFPSX for YF-20250618-002 -- huangjy 2025.07.31 增加HZBZ00区分口服针剂 for YF-20250530-002 begin select max(trim(MC0000)) into LS_ZYFYZDFPZSM from BM_TYZD00 where BH0000='YF_ZYFYZDFPZSM' and ZDMC00='医保追溯码配置'; ls_SFQZDP:=PSFQZDP; if LS_ZYFYZDFPZSM in('-1','1') and LS_ZYFYZDFPZSM<>'0' then return; end if; ls_HZBZ00:=trim(substrb(SF_SF_GETXMLNOTE('HZBZ00',POTHER0),1,2)); --YF_ZSMFPSX 追溯码分配顺序,0按拆零入库的顺序,1按有效期 select nvl(max(trim(MC0000)),'0') into LS_ZSMFPSX from BM_TYZD00 where BH0000='YF_ZSMFPSX' and ZDMC00='医保追溯码配置'; --追溯码是否全量全码自动匹配 select YFBMBH into ls_YFBMBH from YF_YZYPSQ where CKDH00=PCKDH00 and rownum=1; --0不自动匹配,1发药自动匹配,2手动点自动分配 默认1 select nvl(max(trim(MC0000)),'1') into LS_ZSMSFQZDPP from BM_TYZD00 where BH0000='YF_ZSMSFQZDPP_YZFY' and ZDMC00='医保追溯码配置'; if LS_ZSMSFQZDPP not in('1','2') then ls_SFQZDP:='0'; end if; if LS_ZSMSFQZDPP='1' then ls_SFQZDP:='1'; end if; for c_ckdyp in( select a.ZYID00,a.YPNM00,a.YPMC00,a.YPQLPC,a.YPZSL0,a.ZHL000,a.YFBMBH,(YPZSL0-nvl(a.ZCXSL0,0))*ZHL000 JLZSL0 ,nvl((select sum(YPZSL0-nvl(TYZSL0,0)) from YF_CFZSMX where CFLSH0=a.CKDH00 and MZZYBZ='1' and YPQLPC=a.YPQLPC and YPNM00=a.YPNM00 and YZLB00='1'),0) YSMSL0 from YF_YZYPSQ a,BM_YD0000 b where a.CKDH00=PCKDH00 and a.YPNM00=b.YPNM00 and b.PZBSM0 is not null and (b.ZSCLBZ in('2','3') or ls_SFQZDP='1') and (a.HZBZ00=ls_HZBZ00 or ls_HZBZ00 is null) --and exists(select 1 from BM_YD0000 where YPNM00=a.YPNM00 and PZBSM0 is not null) ) loop select SF_YF_GetZSMGGYF(c_ckdyp.YPNM00,c_ckdyp.YFBMBH) into ls_YFBMBH from dual; ls_YPZSL0:=c_ckdyp.JLZSL0-c_ckdyp.YSMSL0; for c_clyp in( select CLLSH0,ZSM000,SYJLSL,YXQ000 from ( select CLLSH0,ZSM000,SYJLSL,nvl((select YXQ000 from YK_RKZSM0 where ZSM000=a.ZSM000),'0') YXQ000 from YF_RKZSM0 a where YFBMBH=ls_YFBMBH and YPNM00=c_ckdyp.YPNM00 and SYJLSL>0 and ZT0000<>'3' ) order by to_number(decode(LS_ZSMFPSX,'1',YXQ000,CLLSH0)) ) loop if ls_YPZSL0>0 then if c_clyp.SYJLSL0 and PSFTS00='1' then --拆零库不够分配 if V_YPXX00 is null then V_YPXX00 := c_ckdyp.YPMC00; else V_YPXX00 := V_YPXX00||'、'||c_ckdyp.YPMC00; end if; end if; end loop; --拆零库不够分配 if V_YPXX00 is not null then Verrmsg:=V_YPXX00||' 拆零库存不够分配'; raise Ecustom; end if; exception when Ecustom then raise_application_error(-20010,substrb(Verrmsg||'!*',1,160)); when others then raise_application_error(-20002,substrb(Verrmsg||'@'||nvl(sqlerrm, '原因不明出错')||'!*',1,160)); end;