Caché托管事务实际使用

在“Cache死循环检测和申明式事务”里面介绍了申明式事务的实现。在实际使用中考虑到对老的兼容性,使用托管事务更实用,这次用实际代码展示写法的差异。

老事务写法很大的精力是在失败回滚事务后,用变量标记来防止后面做其他的增删改操作,或者接着执行后续逻辑直到报错。该复杂度随业务复杂和调整变得复杂
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

托管模式之后需要回滚直接抛出异常,方法就返回了,不用担心接着往下执行的问题。多个方法之间调用也不用来回用变量协调了,任意方法抛异常后就结束方法,回滚事务了

手工计费和退费采用托管模式示例

Class LIS.WS.BLL.DHCMicManualAccount Extends %RegisteredObject
{

/// Creator:      zlz
/// CreatDate:    20200604
/// Description:: 插入HIS医嘱代理,用来和HIS.DHCOrderItem的SaveOrdItem无缝对接
/// Table:        
/// Input:        Labno:检验号,Param参数内容XML格式
/// 								Param.P0 
/// 								Param.P1 
/// Output:       无
/// Return:       
/// Others: w ##Class(LIS.WS.BLL.DHCMicManualAccount).SaveOrdItemProxy("","<Data><P0>468</P0><P1></P1><P2>^742||270@1</P2><P3></P3></Data>","81^9^^12^1")	  
ClassMethod SaveOrdItemProxy(Labno As %String, Param As %String(MAXLEN=32767), Sessions As %String, Output RetValue As %String(MAXLEN=32767)) As %String [ SqlProc ]
{
	q ##Class(LIS.WS.DHCLISServiceBase).DeclarativeTrans("LIS.WS.BLL.DHCMicManualAccount","SaveOrdItem",Labno, Param, "", "", "", "", "", "", "", "", "", "", "", "", Sessions,.RetValue)
}

/// Creator:      zlz
/// CreatDate:    20200604
/// Description:: 停止HIS医嘱代理,用来和HIS.DHCOrderItem的StopOrdItem无缝对接
/// Table:        
/// Input:        Labno:检验号,Param参数内容XML格式
/// 								Param.P0 
/// 								Param.P1 
/// Output:       无
/// Return:       
/// Others: w ##Class(LIS.WS.BLL.DHCMicManualAccount).StopOrdItemProxy("","<Data><P0>468</P0><P1></P1><P2>^742||270@1</P2><P3></P3></Data>","81^9^^12^1")	  
ClassMethod StopOrdItemProxy(Labno As %String, Param As %String(MAXLEN=32767), Sessions As %String, Output RetValue As %String(MAXLEN=32767)) As %String [ SqlProc ]
{
	q ##Class(LIS.WS.DHCLISServiceBase).DeclarativeTrans("LIS.WS.BLL.DHCMicManualAccount","StopOrdItem",Labno, Param, "", "", "", "", "", "", "", "", "", "", "", "", Sessions,.RetValue)
}

/// Creator:      zlz
/// CreatDate:    20200604
/// Description:: 插入HIS医嘱
/// Table:        
/// Input:        Labno:检验号,Param参数内容XML格式
/// 								Param.P0 
/// 								Param.P1 
/// Output:       无
/// Return:       
/// Others: w ##Class(LIS.WS.BLL.DHCMicManualAccount).SaveOrdItem("","<Data><P0>468</P0><P1></P1><P2>^742||270@1</P2><P3></P3></Data>","81^9^^12^1")	  
ClassMethod SaveOrdItem(Labno As %String, Param As %String(MAXLEN=32767), P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, Sessions, Output RetValue As %String(MAXLEN=32767)) As %String
{
	s ^TMPLIS("SaveOrdItem")=$lb(Labno,Param,Sessions)
    s Labno=$g(Labno),Param=$g(Param),Sessions=$g(Sessions)
	s WorkGroupDR=$p(Sessions,"^",2)
	s UserDR=$p(Sessions,"^",1)
	s HospitalDR=$p(Sessions,"^",5)
	s HOSDR="LIS@"_HospitalDR
	s HospitalCode=$lg($g(^dbo.BTHospitalD(HospitalDR)),2)
	s WebNamespace=##Class(OTH.SYSParameter).GetWebNamespace()
	s CurNamespace=$ZUTIL(5)
	s Usercode=$lg($g(^dbo.SYSUserD(UserDR)),2)
	s Usercode=$zcvt(Usercode,"U")
	i '$l(Usercode)  throw ##class(%Exception.General).%New("事务委托","D",,"-1^LIS用户不存在")
	//判断HIS用户
	s UserID=$o(^[WebNamespace]SSU("SSUSR",0,"SSUSR_Initials",Usercode,""))
	i '$l(UserID) throw ##class(%Exception.General).%New("事务委托","D",,"-1^HIS用户不存在")
	//用户的类别:医生
	s RetValue=##Class(HIS.DHCOrderItem).GetUserType(UserID,WebNamespace)
	i RetValue="" throw ##class(%Exception.General).%New("事务委托","D",,"-1^医护人员类型定义有误")
	//默认登录科室
	s Loc=$p(^[WebNamespace]SSU("SSUSR",UserID),"^",4)  
	i '$l(Loc) throw ##class(%Exception.General).%New("事务委托","D",,"-1^用户"_Usercode_"在HIS端未维护默认科室!")
	s (P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14)=""
    s reader = ##class(%XML.Reader).%New()
    d reader.OpenString(Param)
    d reader.Correlate("Data","LIS.WS.Model.InputParameter")
    s err=""
    s RetValue=1
    While (reader.Next(.obj,.sc)) {
	    If ($SYSTEM.Status.IsOK(sc)) 
	    {
		    //标本主键
		    s VisitNumberDR=$tr(obj.P0,$c(0)) 
		    //就诊号
		    s AdmNo=$tr(obj.P1,$c(0))  
		    //^0002313@1^0342342@2  0002313为医嘱Code,1为医嘱数量       
			s OrdItmList=$tr(obj.P2,$c(0))    
			//插入类型  MIC
			s OptFlag=$tr(obj.P3,$c(0)) 
			//报告主键      
			s ReportDR=$tr(obj.P4,$c(0))  
			//处理空值     
			i ReportDR="null" s ReportDR=""
			//IP地址
			s IP=$tr(obj.P5,$c(0))
			//标本数据       
			s RPVisitNumberData=$g(^dbo.RPVisitNumberD(VisitNumberDR))
			//登记号
			s RegNo=$lg(RPVisitNumberData,3)
			//没传就诊号就从标本表取
			i '$l(AdmNo) s AdmNo=$lg(RPVisitNumberData,5)
			i '$l(AdmNo) throw ##class(%Exception.General).%New("事务委托","D",,"-1^就诊信息不存在")
			//得到患者状态,出院那些就不计费
  			s ret=##class(HIS.DHCCommon).GetCurrentDischargeStatus(AdmNo)
			i ret'=0 throw ##class(%Exception.General).%New("事务委托","D",,ret)
			//目标医生
			s TargetDoc=$p($g(^[WebNamespace]SSU("SSUSR",UserID)),"^",14)
			b ;OrdItmList
			s retList=##Class(Interface.Common.DHCOrderItem).SaveOrderItem(AdmNo,OrdItmList,Usercode,"",HospitalCode)
			i retList=0 throw ##class(%Exception.General).%New("事务委托","D",,"-1^医嘱插入失败!"_" 调用接口:##Class(Interface.Common.DHCOrderItem).SaveOrderItem("_AdmNo_","_OrdItmList_","_Usercode_","_Loc_","_HospitalCode_")")
			i retList=100 throw ##class(%Exception.General).%New("事务委托","D",,"-1^医嘱插入失败!"_" 调用接口:##Class(Interface.Common.DHCOrderItem).SaveOrderItem("_AdmNo_","_OrdItmList_","_Usercode_","_Loc_","_HospitalCode_")")
			//s Ret="7787||1*46518||348*V*^7795||1*46518||349*V*^"    
	        //标本操作记录
			s TransDateTime=##Class(LISSP.BLL.DHCCommonInterface).TransDateTime()
			s CurDate=$p(TransDateTime,"^",1),CurTime=$p(TransDateTime,"^",2)
	        s OperateDate=CurDate
	        s OperateTime=CurTime   
	        i retList["*" d
		    .s RetValue = 0
		    .//循环解析返回的串插入日志
			.f k=1:1:$l(OrdItmList,"^") d
			..s HisOrderRet = $p(retList,"^",k)
		    ..s OrderItemDR=$p(HisOrderRet,"*",1) 
		    ..s OperateNotes=$p(HisOrderRet,"*",2)
			..s Quantity=+$p($p(OrdItmList,"^",k),"@",2)
			..s OrderItemCode=$p($p(OrdItmList,"^",k),"@",1)
			..//手工计费
		    ..s OperateTypeCode="98"  
		    ..s RejectTypeDR=""
		    ..s WorkGroupMachineDR="" 
		    ..d ##Class(Interface.Common.DHCOrderItem).ExecuteHISOrder(AdmNo,OrderItemDR,Usercode)
		    ..s Price=+##Class(Interface.Common.DHCOrderItem).GetOrderPrice("","",OrderItemCode,+$h,"","","","",HospitalCode)
		    ..s RetValue=##Class(LISSP.BLL.DHCRPVisitNumberRecord).SaveRecord(VisitNumberDR,OperateDate,OperateTime+k,UserDR,OperateNotes,OperateTypeCode,WorkGroupMachineDR,RejectTypeDR,"",IP)
		    ..i RetValue'=1 throw ##class(%Exception.General).%New("事务委托","D",,"标本操作记录插入失败:"_RetValue)
		    ..s RetValue=##Class(HIS.DHCOrderItem).SaveRecord(VisitNumberDR,OperateDate,OperateTime+k,UserDR,OrderItemDR,Quantity,Price,OperateTypeCode,WorkGroupDR,OperateNotes,"",ReportDR,OrderItemCode)
		    ..i RetValue'=1 throw ##class(%Exception.General).%New("事务委托","D",,"手工医嘱记录插入失败:"_RetValue)
			.i RetValue=1 s RetValue=0
	  }
    }    
	
    i $system.Status.IsError(sc) throw ##class(%Exception.General).%New("事务委托","D",,"-1^参数错误:") 
    i RetValue'=0 throw ##class(%Exception.General).%New("事务委托","D",,RetValue) 
	s RetValue=1
	q RetValue
}

/// Creator:      zlz
/// CreatDate:    20200604
/// Description:: 停止HIS医嘱
/// Table:        
/// Input:        Labno:检验号^员工ID是否取HIS医嘱对应的,Param参数内容XML格式
/// 								Param.P0 
/// 								Param.P1 
/// Output:       无
/// Return:       
/// Others: w ##Class(LIS.WS.BLL.DHCMicManualAccount).StopOrdItem("","<Data><P0>468</P0><P1></P1><P2>^742||270@1</P2><P3></P3></Data>","81^9^^12^1")	  
ClassMethod StopOrdItem(Labno As %String, Param As %String(MAXLEN=32767), P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, Sessions, Output RetValue As %String(MAXLEN=32767)) As %String
{
	s Labno=$g(Labno),Param=$g(Param),Sessions=$g(Sessions)
	s WorkGroupDR=$p(Sessions,"^",2)
	s UserDR=$p(Sessions,"^",1)
	s ISHISUseID=$p(Labno,"^",2)
	s Labno=$p(Labno,"^",1)
	s WebNamespace=##Class(OTH.SYSParameter).GetWebNamespace()
	s CurNamespace=$ZUTIL(5)
    s Usercode=""
    if (ISHISUseID'=1)
    {
	   s Usercode=$lg($g(^dbo.SYSUserD(UserDR)),2)
	   s Usercode=$zcvt(Usercode,"U")
	   i '$l(Usercode)  throw ##class(%Exception.General).%New("事务委托","D",,"-1^LIS用户不存在")
	   //判断HIS用户
	   s UserID=$o(^[WebNamespace]SSU("SSUSR",0,"SSUSR_Initials",Usercode,""))
	   i '$l(UserID) throw ##class(%Exception.General).%New("事务委托","D",,"-1^HIS用户不存在")
	   //用户的类别:医生
	   s RetValue=##Class(HIS.DHCOrderItem).GetUserType(UserID,WebNamespace)
	   i RetValue="" throw ##class(%Exception.General).%New("事务委托","D",,"-1^医护人员类型定义有误")
	}  	
	s (P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14)=""

    s reader = ##class(%XML.Reader).%New()
    d reader.OpenString(Param)
    d reader.Correlate("Data","LIS.WS.Model.InputParameter")
    s err="",RetValue=1
    While (reader.Next(.obj,.sc)) {
	    If ($SYSTEM.Status.IsOK(sc)) 
	    {
		    //标本主键
		    s VisitNumberDR=$tr(obj.P0,$c(0)) 
		    //就诊号
		    s AdmNo=$tr(obj.P1,$c(0))        
		    //^24||110^24||111  医嘱RowID列表
			s OrdItmList=$tr(obj.P2,$c(0))   
			//操作类型  MIC 
			s OptFlag=$tr(obj.P3,$c(0))  
			//价格列表     
			s priceList=$tr(obj.P4,$c(0))  
			//数量列表 
			s ordqtyList=$tr(obj.P5,$c(0)) 
			//费用id列表  
			s costitemList=$tr(obj.P6,$c(0)) 
			//IP地址  
			s IP=$tr(obj.P7,$c(0))       
			s RPVisitNumberData=$g(^dbo.RPVisitNumberD(VisitNumberDR))
			//登记号
			s RegNo=$lg(RPVisitNumberData,3)
			//就诊类型
			s AdmissionTypeDR=$lg(RPVisitNumberData,4)
			s AdmCode=""
			i $l(AdmissionTypeDR) s AdmCode=$lg($g(^dbo.BTAdmissionTypeD(AdmissionTypeDR)),2)
			//没传就诊号就从标本表取
			i '$l(AdmNo) s AdmNo=$lg(RPVisitNumberData,5)
			i '$l(AdmNo) throw ##class(%Exception.General).%New("事务委托","D",,"-1^就诊信息不存在")
  			//得到患者状态,出院那些就不计费
  			s ret=##class(HIS.DHCCommon).GetCurrentDischargeStatus(AdmNo)
			i ret'=0 throw ##class(%Exception.General).%New("事务委托","D",,ret)
  		    s patType=$p($g(^[WebNamespace]PAADM(+AdmNo)),"^",2)
  			s OrdItemStr=""
  			//循环停止医嘱
  			f k=1:1:$l(OrdItmList,"^") d
  			.//得到医嘱的RowID
	    	.s OrdRowId=$p(OrdItmList,"^",k)
		    .i $l(OrdRowId) d
		    ..i (ISHISUseID=1) d
		    ...s tmpOrdItmId=$p(OrdRowId,"||",1)
			...s tmpOrderChild=$p(OrdRowId,"||",2)
		    ...s tmpUserID=$p($g(^[WebNamespace]OEORD(tmpOrdItmId,"I",tmpOrderChild,8)),"^",12)
		    ...i $l(tmpUserID) d
			....s UserData = $g(^[WebNamespace]SSU("SSUSR",tmpUserID))
			....s Usercode = $tr($p(UserData,"^",1)," ")
			....s Usercode=$zcvt(Usercode,"U")
			..i '$l(Usercode) throw ##class(%Exception.General).%New("事务委托","D",,"-1^获取HIS医嘱对应用户Code为空。")
		    ..s ret=##Class(Interface.Common.DHCOrderItem).StopOrderItem(AdmNo,OrdRowId,AdmCode,Usercode)
			..i ret'=0 throw ##class(%Exception.General).%New("事务委托","D",,ret_"^医嘱停止错误。")
	        .//标本操作记录
			.s TransDateTime=##Class(LISSP.BLL.DHCCommonInterface).TransDateTime()
			.s CurDate=$p(TransDateTime,"^",1),CurTime=$p(TransDateTime,"^",2)
	        .s OperateDate=CurDate
	        .s OperateTime=CurTime
	        //循环给检验插入记录
  			f k=1:1:$l(OrdItmList,"^") d
	    	.s OrdRowId=$p(OrdItmList,"^",k)
		    .s Price=$p(priceList,"^",k)
		    .s Quantity=-$p(ordqtyList,"^",k)
		    .s costitem=$p(costitemList,"^",k) 
		    .s OrderItemCode=$p($p(OrdItmList,"^",k),"@",1)
		    .i $l(OrdRowId) d 
		    ..s OperateNotes=OrdRowId
		    ..//计费
			..s OperateTypeCode="99"  
			..s RejectTypeDR=""
			..s WorkGroupMachineDR=""
			..s ret=##Class(LISSP.BLL.DHCRPVisitNumberRecord).SaveRecord(VisitNumberDR,OperateDate,OperateTime+k,UserDR,OperateNotes,OperateTypeCode,WorkGroupMachineDR,RejectTypeDR,"",IP)
			..s RetValue=##Class(HIS.DHCOrderItem).SaveRecord(VisitNumberDR,OperateDate,OperateTime+k,UserDR,costitem,Quantity,Price,OperateTypeCode,WorkGroupDR,OperateNotes,"","",OrderItemCode)
			..i ret'=1 throw ##class(%Exception.General).%New("事务委托","D",,"标本操作记录插入失败:"_ret)

	    }
    }    
    i $system.Status.IsError(sc) throw ##class(%Exception.General).%New("事务委托","D",,"-1^参数错误:")
    i $l(err) throw ##class(%Exception.General).%New("事务委托","D",,"-1^"_err)  
	s RetValue=1
	q RetValue
}

}

微生物报告保存,避免了原来写法设置回滚后标志变量的复杂度

/// 此类为微生物报告界面和微生物院感报告界面的共同保存审核逻辑,在不违反约定的前提下可修复bug
/// 不恰当的修改会引起两个界面保存和初审、审核方面的问题
Class LIS.WS.BLL.DHCRPMicReportSave Extends %RegisteredObject
{

/// ReportDR:报告主键
/// ResultStr:结果串
/// 一个项目的结果依次为:结果,文本结果,扩展结果,其他结果,异常标识,参考范围,结果说明,序号,项目主键,单位,传输日期,传输时间,传输仪器,药敏信息串,耐药机制串
/// 药敏子串结构:抗生素,MIC结果,MM结果,药敏结果,检查类型,提示类型,提示内容,仪器药敏,抗生素分类,是否上报,抗生素专家规则
/// 耐药机制子串结构:耐药机制项目,结果,序号
/// Oper:操作S:保存,E:仅初审,A:仅审核,SE:保存后初审,SA:保存后审核
/// w ##Class(LIS.WS.BLL.DHCRPMicReportSave).SaveReportResultMTHD("170","170$RES$215$RES$阳性$RES$$RES$$RES$A$RES$阴性$RES$$RES$415$RES$415$RES$$RES$2020-03-24$RES$15:36:22$RES$$RES$$RES$$RES$$RES$$RES$$TS$170$RES$226$RES$检出革兰阴性双球菌$RES$$RES$$RES$A$RES$$RES$$RES$441$RES$441$RES$$RES$2020-03-24$RES$15:36:22$RES$$RES$$RES$$RES$$RES$$RES$$TS$170$RES$1$RES$1$RES$$RES$$RES$$RES$$RES$$RES$455$RES$460$RES$$RES$2020-03-24$RES$15:36:22$RES$$RES$$RES$$RES$$RES$$RES$$TS$170$RES$237$RES$无细菌生长$RES$$RES$$RES$$RES$$RES$$RES$460$RES$455$RES$$RES$2020-03-24$RES$15:36:22$RES$$RES$$RES$$RES$$RES$$RES$$TS$170$RES$1738$RES$铜绿假单胞菌$RES$$RES$$RES$$RES$$RES$;药敏结果参考该病人本月1号结果。$RES$$RES$440$RES$$RES$$RES$$RES$$RES$;曲霉菌属:对氟康唑(FCA)和5-氟胞嘧啶(5FC)天然耐药! 黄曲霉和土曲霉对两性霉素B(AMB)也常耐药!$RES$$RES$$RES$208$SEN$11$SEN$$SEN$$SEN$$SEN$$SEN$$SEN$$SEN$$SEN$1$SEN$$ANT$31$SEN$11$SEN$$SEN$$SEN$$SEN$$SEN$$SEN$$SEN$$SEN$1$SEN$$ANT$181$SEN$11$SEN$$SEN$3$SEN$$SEN$$SEN$$SEN$$SEN$$SEN$1$SEN$$ANT$258$SEN$11$SEN$$SEN$3$SEN$$SEN$$SEN$$SEN$$SEN$$SEN$1$SEN$$ANT$293$SEN$11$SEN$$SEN$3$SEN$$SEN$$SEN$$SEN$$SEN$$SEN$1$SEN$$ANT$112$SEN$11$SEN$$SEN$3$SEN$$SEN$$SEN$$SEN$$SEN$$SEN$1$SEN$$ANT$384$SEN$11$SEN$$SEN$3$SEN$$SEN$$SEN$$SEN$$SEN$$SEN$1$SEN$$ANT$244$SEN$11$SEN$$SEN$$SEN$$SEN$$SEN$$SEN$$SEN$$SEN$1$SEN$$ANT$491$SEN$11$SEN$$SEN$$SEN$$SEN$$SEN$$SEN$$SEN$$SEN$1$SEN$$ANT$12$SEN$11$SEN$$SEN$2$SEN$$SEN$$SEN$$SEN$$SEN$$SEN$1$SEN$$ANT$326$SEN$11$SEN$$SEN$$SEN$$SEN$$SEN$$SEN$$SEN$$SEN$1$SEN$$ANT$616$SEN$11$SEN$$SEN$3$SEN$$SEN$$SEN$$SEN$$SEN$$SEN$1$SEN$$ANT$285$SEN$11$SEN$$SEN$3$SEN$$SEN$$SEN$$SEN$$SEN$$SEN$1$SEN$$ANT$336$SEN$11$SEN$$SEN$$SEN$$SEN$$SEN$$SEN$$SEN$$SEN$1$SEN$$ANT$279$SEN$11$SEN$$SEN$3$SEN$$SEN$$SEN$$SEN$$SEN$$SEN$1$SEN$$ANT$346$SEN$11$SEN$$SEN$3$SEN$$SEN$$SEN$$SEN$$SEN$$SEN$1$SEN$$ANT$236$SEN$11$SEN$$SEN$3$SEN$$SEN$$SEN$$SEN$$SEN$$SEN$1$SEN$$ANT$137$SEN$11$SEN$$SEN$$SEN$$SEN$$SEN$$SEN$$SEN$$SEN$1$SEN$$ANT$$RES$1$RSS$92$RSS$0$RST$2$RSS$92$RSS$1$RST$3$RSS$160$RSS$2$RST$$TS$","S","","","0","::1","1","","","","","","","113^2^0^16^1")
ClassMethod SaveReportResultMTHD(ReportDR, ResultStr As %String(MAXLEN=32767), Oper, EntryUserDR, AuthUserDR, MICEntryDrect, ClientIp, AuthAsk, P8, P9, P10, P11, P12, P13, Sessions, Output RowCount As %String) As %String
{
	//s ^TMP("zlzmic")=$lb(ReportDR,ResultStr,Oper,EntryUserDR, AuthUserDR, MICEntryDrect, ClientIp, AuthAsk, P8, P9, P10, P11, P12, P13, Sessions)
	s ReportDR=$g(ReportDR)
	s ResultStr=$g(ResultStr)
	s Oper=$g(Oper)
	s EntryUserDR=$g(EntryUserDR)
	s AuthUserDR=$g(AuthUserDR)
	//是否保存直接初审
	s MICEntryDrect=$g(MICEntryDrect)
	//客户端IP
	s ClientIp=$g(ClientIp)
	i '$l(ClientIp) s ClientIp=$ZU(67,15,$j)

	//审核是否检测询问消息
	s AuthAsk=$g(AuthAsk)
	s Sessions=$g(Sessions)
	s RowCount=$g(RowCount)
	s UserID=$p(Sessions,"^",1)
	//没传初审用户和审核用户就默认当前用户
	i '$l(EntryUserDR) s EntryUserDR=UserID
	i '$l(AuthUserDR) s AuthUserDR=UserID
	
	//报告数据
	s ReportData=$g(^dbo.RPVisitNumberReportD(ReportDR))
	s VisitNumberDR=$lg(ReportData,2)
	//标本数据
	s VisitNumberData=$g(^dbo.RPVisitNumberD(VisitNumberDR))
	//标本类型
	s SpecimenDR=$lg(VisitNumberData,56)
	//工作小组
	s WorkGroupMachineDR=$lg(ReportData,4)
	
	//工作组
	s WorkGroupDR=$lg($g(^dbo.BTWorkGroupMachineD(WorkGroupMachineDR)),4)
	
	s RetMsg=""
	s CheackMsg=""
	//询问用户点是后传入AuthAsk为0,绕开检测消息
	i (Oper["A"),(AuthAsk'="0") d
	.//检测询问的消息-2为询问消息
	.s CheackMsg=##Class(LIS.WS.BLL.DHCMicAuthRule).CheackAuthMsgMTHD(ReportDR)
	i $l(CheackMsg) q "-2^"_CheackMsg
	
	//事务托管进行保存报告和审核逻辑
	s RetMsg=##Class(LIS.WS.DHCLISServiceBase).DeclarativeTrans("LIS.WS.BLL.DHCRPMicReportSave","SaveReportResultTrans",ReportDR,ResultStr,Oper,EntryUserDR,AuthUserDR,MICEntryDrect,ClientIp,AuthAsk,P8, P9, P10, P11, P12, P13, Sessions,.RowCount)
	i $l(RetMsg) q RetMsg
	//状态
	s ReportStatus=$lg($g(^dbo.RPVisitNumberReportD(ReportDR)),22)
	//善后开始*********************************************************************************
	//保存审核等的善后操作,清除仪器结果保存操作日志
	d ##class(LIS.WS.BLL.DHCRPMicNumberReport).ClearMachineResultMTHD(ReportDR,WorkGroupMachineDR,"")
	//插入标本操作记录
	s OperateUserDR=UserID
	s (OperateDate,OperateTime,OperateTypeCode,OperateNotes,RejectTypeDR)=""
	//初审核
	i ReportStatus="2" s OperateTypeCode="11",OperateUserDR=EntryUserDR,OperateNotes="初审报告"   
	//审核
	i ReportStatus="3" s OperateTypeCode="7",OperateUserDR=AuthUserDR,OperateNotes="审核报告"  
	//保存结果日志
	i Oper="S" d
	.s RetVal=##Class(LISSP.BLL.DHCRPVisitNumberRecord).SaveRecord(VisitNumberDR,OperateDate,OperateTime,OperateUserDR,"保存结果","31",WorkGroupMachineDR,RejectTypeDR,"",ClientIp) 
	//初审和审核的操作日志    
	i $l(OperateTypeCode) d
	.s RetVal=##Class(LISSP.BLL.DHCRPVisitNumberRecord).SaveRecord(VisitNumberDR,OperateDate,OperateTime,OperateUserDR,OperateNotes,OperateTypeCode,WorkGroupMachineDR,RejectTypeDR,"",ClientIp)
	
	//审核
	//i Oper["A" d
	//.s RetMsg=##Class(CA.DataDeal).GetReportInfoMTHD(ReportDR,"","","","","","","","","","","","","",Sessions)
	//善后结束*********************************************************************************
	
	//约定-1^错误消息  -2^询问消息
	q RetMsg
}

/// 保存报告结果委托事务部分
ClassMethod SaveReportResultTrans(ReportDR, ResultStr As %String(MAXLEN=32767), Oper, EntryUserDR, AuthUserDR, MICEntryDrect, ClientIp, AuthAsk, P8, P9, P10, P11, P12, P13, Sessions, Output RowCount As %String) As %String
{
	s ReportDR=$g(ReportDR)
	s ResultStr=$g(ResultStr)
	s Oper=$g(Oper)
	s EntryUserDR=$g(EntryUserDR)
	s AuthUserDR=$g(AuthUserDR)
	//是否保存直接初审
	s MICEntryDrect=$g(MICEntryDrect)
	//客户端IP
	s ClientIp=$g(ClientIp)

	//审核是否检测询问消息
	s AuthAsk=$g(AuthAsk)
	s Sessions=$g(Sessions)
	s RowCount=$g(RowCount)
	s UserID=$p(Sessions,"^",1)
	//没传初审用户和审核用户就默认当前用户
	i '$l(EntryUserDR) s EntryUserDR=UserID
	i '$l(AuthUserDR) s AuthUserDR=UserID
	
	//约定的分隔符
	//多个项目之间的分割
	s TestCodeDeli="$TS$"
	
	//报告数据
	s ReportData=$g(^dbo.RPVisitNumberReportD(ReportDR))
	s VisitNumberDR=$lg(ReportData,2)
	//标本数据
	s VisitNumberData=$g(^dbo.RPVisitNumberD(VisitNumberDR))
	//标本类型
	s SpecimenDR=$lg(VisitNumberData,56)
	//工作小组
	s WorkGroupMachineDR=$lg(ReportData,4)
	//状态
	s Status=$lg(ReportData,22)
	//工作组
	s WorkGroupDR=$lg($g(^dbo.BTWorkGroupMachineD(WorkGroupMachineDR)),4)
	
	//是否有多耐
	s HasMultiRes=0
	//标识是否有结果
	s HasReportRes=0
	//保存结果开始*********************************************************************************
	//包含保存操作就保存
	i Oper["S" d
	.f t=1:1:$l(ResultStr,TestCodeDeli)  d
	..//取一个项目的结果串
	..s CurTSRes=$p(ResultStr,TestCodeDeli,t)
	..//没内容退出
	..i '$l(CurTSRes) q
	..//保存报告项目结果数据
	..d ..SaveReportResult(ReportDR,CurTSRes,VisitNumberDR,WorkGroupMachineDR,SpecimenDR,Oper,ClientIp,UserID,.HasReportRes)
	
	//没有保存的结果判断
	i Oper["A",HasReportRes=0 d
	.THROW ##class(%Exception.General).%New("事务委托","D",,"-1^没有保存的结果!可能操作速度太快")
	
	//保存图片
	d ##class(LIS.WS.BLL.DHCRPMicNumberReport).SaveReportImage(ReportDR)
	//保存结果结束*********************************************************************************
	
	//执行报告执行器代码
	i Oper["S" d ##Class(LIS.WS.BLL.DHCReportActuator).Execute(ReportDR)
	//存保存者信息
	i Oper="S" d
	.s ReportObj=##Class(dbo.RPVisitNumberReport).%OpenId(ReportDR)
	.s ReportObj.SaveDate=$zd($h,8)
	.s ReportObj.SaveTime=$p($h,",",2)
	.s ReportObj.SaveUserDR=UserID
	.s sc=ReportObj.%Save()
	.i ('$SYSTEM.Status.IsOK(sc)) d
	..THROW ##class(%Exception.General).%New("事务委托","D",,"-1^保存报告状态失败:"_$SYSTEM.Status.GetErrorText(sc))
	
	//初审开始*********************************************************************************
	//初审
	i Oper["E" d
	.i ((Status'="1")&&(Status'="2")&&(Status'="5")&&(Status'="4")) d
	..THROW ##class(%Exception.General).%New("事务委托","D",,"-1^非登记或取消或复查状态不能初审!")
	.s ReportObj=##Class(dbo.RPVisitNumberReport).%OpenId(ReportDR)
	.//保存直接初审模式就设置第一次初审者和初审时间
	.i (MICEntryDrect'="1")||('$l(ReportObj.EntryUserDR)) d
	..s ReportObj.EntryDate=$zd($h,8)
	..s ReportObj.EntryTime=$p($h,",",2)
	..s ReportObj.EntryUserDR=EntryUserDR
	.s ReportObj.Status=2
	.s sc=ReportObj.%Save()
	.i ('$SYSTEM.Status.IsOK(sc)) d
	..THROW ##class(%Exception.General).%New("事务委托","D",,"-1^保存报告状态失败:"_$SYSTEM.Status.GetErrorText(sc))
	//初审结束*********************************************************************************
	
	
	//审核开始*********************************************************************************
	//审核
	i Oper["A" d
	.i ((Status'="1")&&(Status'="2")&&(Status'="5")&&(Status'="4")) d
	..THROW ##class(%Exception.General).%New("事务委托","D",,"-1^非登记或取消或复查状态不能审核!")
	.s ReportObj=##Class(dbo.RPVisitNumberReport).%OpenId(ReportDR)
	.s HasRes=0
	.i $d(^dbo.RPVisitNumberReportResultI("IndexReportItem",ReportDR)) d
	..s TestCodeDR="" f  s TestCodeDR=$o(^dbo.RPVisitNumberReportResultI("IndexReportItem",ReportDR,TestCodeDR)) q:(TestCodeDR="")||($l(RetMsg))  d
	...s ReportResultDR=$o(^dbo.RPVisitNumberReportResultI("IndexReportItem",ReportDR,TestCodeDR,""))
	...s TextRes=$lg($g(^dbo.RPVisitNumberReportResultD(ReportResultDR)),5)
	...i $l(TextRes) s HasRes=1
	....//仅仅审核更新结果的审核时间
	....i Oper="A" d
	.....s ReportResultObj=##Class(dbo.RPVisitNumberReportResult).%OpenId(ReportResultDR)
	.....s ReportResultObj.AuthDate=$zd($h,8)
	.....s ReportResultObj.AuthTime=$p($h,",",2)
	.....s sc=ReportResultObj.%Save()
	.....i ('$SYSTEM.Status.IsOK(sc)) d
	......THROW ##class(%Exception.General).%New("事务委托","D",,"-1^更新报告结果时间失败:"_$SYSTEM.Status.GetErrorText(sc))
	.i $l(ReportObj.MajorConclusion) s HasRes=1
	.i HasRes=0 d
	..THROW ##class(%Exception.General).%New("事务委托","D",,"-1^报告没结果且没报告评价不能审核!")
	.s CheckMsg=##Class(LIS.WS.BLL.DHCRPMicNumberReport).CheckReportMTHD(ReportDR,EntryUserDR,AuthUserDR)
	.//检测消息不通过直接返回
	.i CheckMsg["-1^" s RetMsg=CheckMsg TROLLBACK  q
	.s ReportObj.AuthDate=$zd($h,8)
	.s ReportObj.AuthTime=$p($h,",",2)
	.//直接审核设置初审信息
	.i '$l(ReportObj.EntryUserDR) d
	..s ReportObj.EntryDate=$zd($h,8)
	..s ReportObj.EntryTime=$p($h,",",2)
	..s ReportObj.EntryUserDR=EntryUserDR
	.s ReportObj.AuthUserDR=AuthUserDR
	.s ReportObj.Status=3
	.s sc=ReportObj.%Save()
	.i ('$SYSTEM.Status.IsOK(sc)) d
	..THROW ##class(%Exception.General).%New("事务委托","D",,"-1^保存报告状态失败:"_$SYSTEM.Status.GetErrorText(sc))
	.//设置菌使用次数
	.d ##Class(LIS.WS.BLL.DHCRPMicNumberReport).SetOrganismNumMTHD(ReportDR)
	.//发送审核消息记录
	.s ret=##Class(LISSP.BLL.DHCOTMsgStock).InsertMsg("","",UserID,"HISAuthorise","",ReportDR)
	.//发送多耐消息
	.i HasMultiRes=1 d
	..s ret=##Class(LISSP.BLL.DHCOTMsgStock).InsertMsg("","",UserID,"MultipleResistant","出现多耐菌!",ReportDR)
	//审核结束*********************************************************************************
	q ""
}

/// 保存报告结果数据
/// ReportDR:报告主键
/// CurTSRes:当前项目结果串
/// VisitNumberDR:标本主键
/// WorkGroupMachineDR:工作小组
/// HasReportRes:是否有结果
/// d ##Class(LIS.WS.BLL.DHCRPMicReportSave).SaveReportResult()
ClassMethod SaveReportResult(ReportDR, CurTSRes, VisitNumberDR, WorkGroupMachineDR, SpecimenDR, Oper, ClientIp, UserID, Output HasReportRes)
{
	//一个项目结果的分割
	s ResultDeli="$RES$"
	//项目结果的所属报告
	s ResReportDR=$p(CurTSRes,ResultDeli,1)
	i ResReportDR'=ReportDR d
	.THROW ##class(%Exception.General).%New("事务委托","D",,"-1^未加载完成报告和结果不一致!")
    //标本数据
	s VisitNumberData=$g(^dbo.RPVisitNumberD(VisitNumberDR))
    //项目结果
    s Result=$p(CurTSRes,ResultDeli,2)
    //文本结果
    s TextRes=$p(CurTSRes,ResultDeli,3)
    //有结果
    i $l(TextRes) s HasReportRes=1
    //额外结果
    s ExtraRes=$p(CurTSRes,ResultDeli,4)
    //其他结果
    s OtherRes=$p(CurTSRes,ResultDeli,5)
    //异常标识
    s AbFlag=$p(CurTSRes,ResultDeli,6)
    //参考范围
    s RefRanges=$p(CurTSRes,ResultDeli,7)
    //结果说明
    s ResNoes=$p(CurTSRes,ResultDeli,8)
    //序号
    s Sequence=$p(CurTSRes,ResultDeli,9)
    //项目主键
    s TestCodeDR=$p(CurTSRes,ResultDeli,10)
    //单位
    s Unit=$p(CurTSRes,ResultDeli,11)
    //传输日期
    s AssayDate=$p(CurTSRes,ResultDeli,12)
    s AssayDate=$tr(AssayDate,"-","")
    i '$l(AssayDate) s AssayDate=$zd($h,8)
    //传输时间
    s AssayTime=$p(CurTSRes,ResultDeli,13)
    i '$l(AssayTime) s AssayTime=$p($h,",",2)
    e  s AssayTime=$zth(AssayTime)
    //传输仪器
    s MachineParameterDR=$p(CurTSRes,ResultDeli,14)
    //专家规则
    s ExpertRule=$p(CurTSRes,ResultDeli,15)
    //多耐
    s MultipleResistant=$p(CurTSRes,ResultDeli,16)
    //多耐子结果
    s MultipleResChild=$p(CurTSRes,ResultDeli,17)
    //所有抗生素串
    s AllAntStr=$p(CurTSRes,ResultDeli,18)
    //所有耐药机制串
    s AllRstStr=$p(CurTSRes,ResultDeli,19)
    s ReportResultObj=""
    i $d(^dbo.RPVisitNumberReportResultI("IndexReportItem",ReportDR,TestCodeDR)) d
    .s ReportResultDR=$o(^dbo.RPVisitNumberReportResultI("IndexReportItem",ReportDR,TestCodeDR,""))
    .s ReportResultObj=##Class(dbo.RPVisitNumberReportResult).%OpenId(ReportResultDR)
    e  d
    .s ReportResultObj=##Class(dbo.RPVisitNumberReportResult).%New()
    //结果变化了存结果修改日志
    i (ReportResultObj.Result'=Result)||(ReportResultObj.TextRes'=TextRes)||(ReportResultObj.ExtraRes'=ExtraRes) d
    .//写结果修改日志
    .d ..SaveResModifyLog(VisitNumberDR,WorkGroupMachineDR,TestCodeDR,Result,TextRes,ExtraRes,OtherRes,ResNoes,AbFlag,ClientIp,UserID,Unit,ReportResultObj.Result,ReportResultObj.TextRes,ReportResultObj.ExtraRes)
    s ReportResultObj.AbFlag=AbFlag
    s ReportResultObj.AdmNo=$lg(VisitNumberData,5)
    s ReportResultObj.AssayDate=AssayDate
    s ReportResultObj.AssayTime=AssayTime
    //保存并审核时保存结果里的审核日期
    i Oper="SA" d
    .s ReportResultObj.AuthDate=$zd($h,8)
    .s ReportResultObj.AuthTime=$p($h,",",2)
    s ReportResultObj.ExtraRes=ExtraRes
    s ReportResultObj.MachineParameterDR=MachineParameterDR
    s ReportResultObj.MultipleResChild=""
    s ReportResultObj.MultipleResistant=""
    s ReportResultObj.OtherRes=OtherRes
    s ReportResultObj.RefRanges=RefRanges
    s ReportResultObj.RegNo=$lg(VisitNumberData,3)
    s ReportResultObj.ResNoes=ResNoes
    s ReportResultObj.Result=Result
    s ReportResultObj.Sequence=Sequence
    s ReportResultObj.TestCodeDR=TestCodeDR
    s ReportResultObj.TextRes=TextRes
    s ReportResultObj.Unit=Unit
    s ReportResultObj.VisitNumberReportDR=ResReportDR
    s ReportResultObj.ExpertRule=ExpertRule
    s ReportResultObj.MultipleResistant=MultipleResistant
    s ReportResultObj.MultipleResChild=MultipleResChild
    i $l(MultipleResistant) s HasMultiRes=1
    i $l(MultipleResChild) s HasMultiRes=1
    //结果补全医嘱信息
    i '$l(ReportResultObj.TestSetDR) d
    .s TestSetDR="" f  s TestSetDR=$o(^dbo.RPVisitNumberTestSetI("IndexWGMachineDR",VisitNumberDR,WorkGroupMachineDR,TestSetDR)) q:TestSetDR=""  d
    ..i $d(^dbo.BTTestSetLayoutI("IndexMaster",TestSetDR,WorkGroupDR,TestCodeDR)) d
    ...s TSRowID=$o(^dbo.RPVisitNumberTestSetI("IndexWGMachineDR",VisitNumberDR,WorkGroupMachineDR,TestSetDR,"")) 
    ...s ReportResultObj.TestSetDR=TestSetDR
    ...s ReportResultObj.RPVisitNumberTestSetDR=TSRowID
    //定性参考范围判断扩展结果
    s IsCheckText=$lg($g(^dbo.BTTestCodeD(TestCodeDR)),28)
    i $d(^dbo.BTTestCodeJudgeRangesI("IndexMasterTC",TestCodeDR)),$ISVALIDNUM(TextRes),IsCheckText="1"  d
    .s OrderNo="" f  s OrderNo=$o(^dbo.BTTestCodeJudgeRangesI("IndexMasterTC",TestCodeDR,OrderNo)) q:OrderNo=""  d
    ..s JudgeRowID="" f  s JudgeRowID=$o(^dbo.BTTestCodeJudgeRangesI("IndexMasterTC",TestCodeDR,OrderNo,JudgeRowID)) q:JudgeRowID=""  d
    ...s JudgeMachineParameterDR=$lg($g(^dbo.BTTestCodeJudgeRangesD(JudgeRowID)),4)
    ...i $l(JudgeMachineParameterDR),(MachineParameterDR'=JudgeMachineParameterDR) q
    ...s JudgeValueLow=$lg($g(^dbo.BTTestCodeJudgeRangesD(JudgeRowID)),5)
    ...s JudgeValueHigh=$lg($g(^dbo.BTTestCodeJudgeRangesD(JudgeRowID)),6)
    ...s JudgeResult=$lg($g(^dbo.BTTestCodeJudgeRangesD(JudgeRowID)),7)
    ...s JudgeAbFlag=$lg($g(^dbo.BTTestCodeJudgeRangesD(JudgeRowID)),9)
    ...i (TextRes>=JudgeValueLow)&&(TextRes<=JudgeValueHigh) d
    ....s ReportResultObj.ExtraRes=JudgeResult
    ....s ReportResultObj.AbFlag=JudgeAbFlag
    //定性参考范围判断扩展结果
    s sc=ReportResultObj.%Save()
    i ('$SYSTEM.Status.IsOK(sc)) d
    .THROW ##class(%Exception.General).%New("事务委托","D",,"-1^保存报告结果失败:"_$SYSTEM.Status.GetErrorText(sc))
    //存药敏和耐药机制结果
    e  d
    .//保存药敏结果数据
    .d ..SaveReportResSen(ReportDR,ReportResultObj.RowID,ReportResultObj.Result,AllAntStr,SpecimenDR)
    .//保存耐药机制结果
    .d ..SaveReportResRst(ReportDR,ReportResultObj.RowID,AllRstStr)
}

/// 保存报告结果的药敏结果
/// ReportDR:报告主键
/// ReportResultDR:报告结果主键
/// OrgDR:细菌主键
/// AllAntStr:抗生素结果串
/// d ##Class(LIS.WS.BLL.DHCRPMicReportSave).SaveReportResSen()
ClassMethod SaveReportResSen(ReportDR, ReportResultDR, OrgDR, AllAntStr, SpecimenDR)
{
	//一个项目的抗生素分割
	s AntDeli="$ANT$"
	//一个抗生素的折点分割
	s SenDeli="$SEN$"
    //清除之前的药敏结果
    &sql(delete from dbo.RP_VisitNumberReportResSen where VisitNumberReportResultDR=:ReportResultDR)
    
    i $l(AllAntStr) d
    .s repid=$i(^CacheTemp)
    .//细菌组
    .s OrganismGroupDR=""
    .//细菌科
    .s OrganismFamilyDR=""
    .//有菌取细菌组关系
    .i $l(OrgDR),$d(^dbo.BTOrganismD(OrgDR)) d
    ..s OrganismGroupDR=$lg($g(^dbo.BTOrganismD(OrgDR)),9)
    ..i $l(OrganismGroupDR) s OrganismFamilyDR=$lg($g(^dbo.BTOrganismGroupD(OrganismGroupDR)),6)
    ..//获取折点数据
    ..d ##Class(LIS.WS.BLL.DHCRPMicNumberReport).GetMICAntSen(OrgDR,"",repid,SpecimenDR)
    .//循环保存药敏结果
    .f a=1:1:$l(AllAntStr,AntDeli)  d
    ..s OneAntRes=$p(AllAntStr,AntDeli,a)
    ..//没内容退出
    ..i '$l(OneAntRes) q
    ..//抗生素
    ..s AntibioticDR=$p(OneAntRes,SenDeli,1)
    ..//MIC值
    ..s MIC=$p(OneAntRes,SenDeli,2)
    ..//MM值
    ..s MM=$p(OneAntRes,SenDeli,3)
    ..//药敏结果
    ..s Result=$p(OneAntRes,SenDeli,4)
    ..//检查类型
    ..s CheckType=$p(OneAntRes,SenDeli,5)
    ..//提示类型
    ..s PromptType=$p(OneAntRes,SenDeli,6)
    ..//提示
    ..s Prompt=$p(OneAntRes,SenDeli,7)
    ..//仪器药敏
    ..s MachSensitivityDR=$p(OneAntRes,SenDeli,8)
    ..//抗生素类别
    ..s AntibioticsClassDR=$p(OneAntRes,SenDeli,9)
    ..//是否上报
    ..s IsReport=$p(OneAntRes,SenDeli,10)
    ..//抗生素专家规则
    ..s ExpertRuleID=$p(OneAntRes,SenDeli,11)
    ..s HasFindLink=0
    ..//尝试取菌上维护的类别
    ..i ('$l(AntibioticsClassDR)),$d(^dbo.BTOrganismAntI("IndexMaster",OrgDR)) d
    ...s HasFindLink=1
    ...i $d(^dbo.BTOrganismAntI("IndexMaster",OrgDR,AntibioticDR)) d
    ....s OrgAntDR=$o(^dbo.BTOrganismAntI("IndexMaster",OrgDR,AntibioticDR,""))
    ....s AntibioticsClassDR=$lg($g(^dbo.BTOrganismAntD(OrgAntDR)),8)
    ..//取细菌组上维护的类别
    ..i (HasFindLink=0),('$l(AntibioticsClassDR)),$l(OrganismGroupDR) d
    ...i $d(^dbo.BTOrganismGroupAntI("IndexMaster",OrganismGroupDR)) d
    ....s HasFindLink=1
    ...i $d(^dbo.BTOrganismGroupAntI("IndexMaster",OrganismGroupDR,AntibioticDR)) d
    ....s OrgGrAntDR=$o(^dbo.BTOrganismGroupAntI("IndexMaster",OrganismGroupDR,AntibioticDR,""))
    ....s AntibioticsClassDR=$lg($g(^dbo.BTOrganismGroupAntD(OrgGrAntDR)),8)
    ..//取菌科上维护的类别
    ..i (HasFindLink=0),('$l(AntibioticsClassDR)),$l(OrganismFamilyDR) d
    ...i $d(^dbo.BTOrganismFamilyAntI("IndexMaster",OrganismFamilyDR,AntibioticDR)) d
    ....s OrgFamilyAntDR=$o(^dbo.BTOrganismFamilyAntI("IndexMaster",OrganismFamilyDR,AntibioticDR,""))
    ....s AntibioticsClassDR=$lg($g(^dbo.BTOrganismFamilyAntD(OrgFamilyAntDR)),8)
    ..//试验方法
    ..s SenMethod=""
    ..//试验值
    ..s SenValue=""
    ..i $l(MM) d
    ...s SenMethod="1"
    ...s SenValue=MM
    ..e  d
    ...s SenMethod="2"
    ...s SenValue=MIC
    ..s RepResSenObj=""
    ..//有数据就打开更新,否则新增
    ..i $d(^dbo.RPVisitNumberReportResSenI("IndexAntibiocs",ReportResultDR,AntibioticDR)) d
    ...s RepResSenDR=$o(^dbo.RPVisitNumberReportResSenI("IndexAntibiocs",ReportResultDR,AntibioticDR,""))
    ...s RepResSenObj=##Class(dbo.RPVisitNumberReportResSen).%OpenId(RepResSenDR)
    ..e  d
    ...s RepResSenObj=##Class(dbo.RPVisitNumberReportResSen).%New()
    ..s RepResSenObj.AntibioticsClassDR=AntibioticsClassDR
    ..s RepResSenObj.AntibioticsDR=AntibioticDR
    ..s RepResSenObj.CheckType=CheckType
    ..s RepResSenObj.MachSensitivityDR=MachSensitivityDR
    ..s RepResSenObj.Prompt=Prompt
    ..s RepResSenObj.PromptType=PromptType
    ..s RepResSenObj.SenMethod=SenMethod
    ..s RepResSenObj.SensitivityDR=Result
    ..s RepResSenObj.SenValue=SenValue
    ..s RepResSenObj.Sequence=a
    ..s RepResSenObj.IRanges=""
    ..s RepResSenObj.SRanges=""
    ..s RepResSenObj.RRanges=""
    ..s RepResSenObj.SDDRanges=""
    ..s RepResSenObj.Reported=IsReport
    ..s RepResSenObj.ExpertRuleID=ExpertRuleID
    ..//审核时候把专家规则的RowID和文本存起来,防止打印编号
    ..i $l(ExpertRuleID),Oper["A" d
    ...d ..SaveReportExpert(ReportDR,ExpertRuleID)
    ..//得到当前抗生素折点数据
    ..s CurAntSenData=$g(^TMP("GetMICAntSen",repid,AntibioticDR,SenMethod))
    ..i $l(CurAntSenData) d 
    ...s RepResSenObj.IRanges=$lg(CurAntSenData,1)
    ...s RepResSenObj.SRanges=$lg(CurAntSenData,2)
    ...s RepResSenObj.RRanges=$lg(CurAntSenData,3)
    ...s RepResSenObj.SDDRanges=$lg(CurAntSenData,4)
    ..s RepResSenObj.VisitNumberReportResultDR=ReportResultDR
    ..s sc=RepResSenObj.%Save()
    ..i ('$SYSTEM.Status.IsOK(sc)) d
    ...k ^TMP("GetMICAntSen",repid)
    ...THROW ##class(%Exception.General).%New("事务委托","D",,"-1^保存报告药敏结果失败:"_$SYSTEM.Status.GetErrorText(sc))
    .//删除折点数据
    .k ^TMP("GetMICAntSen",repid)
    q ""
}

/// 保存报告结果的药敏结果
/// 报告主键
/// 专家规则ID
/// d ##Class(LIS.WS.BLL.DHCRPMicReportSave).SaveReportResRst()
ClassMethod SaveReportResRst(ReportDR, ReportResultDR, AllRstStr)
{
	//结果里的耐药机制分割符
	s RstDeli="$RST$"
	//结果里的耐药机制里的结果分割符
    s RstResDeli = "$RSS$"
	//清除之前的耐药机制结果
    &sql(delete from dbo.RP_VisitNumberRepResRst where VisitNumberReportResultDR=:ReportResultDR)
    //循环保存耐药机制结果
    i $l(AllRstStr) d
    .//循环保存耐药机制结果
    .f r=1:1:$l(AllRstStr,RstDeli)  d
    ..s OneRstRes=$p(AllRstStr,RstDeli,r)
    ..//没内容退出
    ..i '$l(OneRstRes) q
    ..//耐药机制项目主键
    ..s ResistanceItemDR=$p(OneRstRes,RstResDeli,1)
    ..//耐药机制结果
    ..s Result=$p(OneRstRes,RstResDeli,2)
    ..//序号
    ..s Sequence=$p(OneRstRes,RstResDeli,3)	
    ..i $d(^dbo.RPVisitNumberRepResRstI("IndexDataMaster",ReportResultDR,ResistanceItemDR)) d
    ...s RepResRstDR=$o(^dbo.RPVisitNumberRepResRstI("IndexDataMaster",ReportResultDR,ResistanceItemDR,""))
    ...s RepResRstObj=##Class(dbo.RPVisitNumberRepResRst).%OpenId(RepResRstDR)
    ..e  d
    ...s RepResRstObj=##Class(dbo.RPVisitNumberRepResRst).%New()
    ..s RepResRstObj.ResistanceItemDR=ResistanceItemDR
    ..s RepResRstObj.Result=Result
    ..s RepResRstObj.Sequence=Sequence
    ..s RepResRstObj.VisitNumberReportResultDR=ReportResultDR
    ..s sc=RepResRstObj.%Save()
    ..i ('$SYSTEM.Status.IsOK(sc)) d
    ...THROW ##class(%Exception.General).%New("事务委托","D",,"-1^保存报告耐药机制结果失败:"_$SYSTEM.Status.GetErrorText(sc))
	q ""
}

/// 保存报告专家规则
/// 报告主键
/// 专家规则ID
/// d ##Class(LIS.WS.BLL.DHCRPMicReportSave).SaveReportExpert()
ClassMethod SaveReportExpert(ReportDR, ExpertID)
{
	s ReportDR=$g(ReportDR)
	s ExpertID=$g(ExpertID)
	f i=1:1:$l(ExpertID,"^") d
	.s OneExpertID=$p(ExpertID,"^",i)
	.i '$l(OneExpertID) q
	.s CName=$lg($g(^dbo.BTExpertRuleD(OneExpertID)),3)
	.s SaveObj=""
	.i $d(^dbo.RPVisitNumberReportExpertI("IndexVisitNumberReportDR",ReportDR,ExpertID)) d
	..s RepExpertRowID=$o(^dbo.RPVisitNumberReportExpertI("IndexVisitNumberReportDR",ReportDR,ExpertID,""))
	..s SaveObj=##Class(dbo.RPVisitNumberReportExpert).%OpenId(RepExpertRowID)
	.e  d
	..s SaveObj=##Class(dbo.RPVisitNumberReportExpert).%New()
	.s SaveObj.ExpertRule=CName
	.s SaveObj.ExpertRuleID=OneExpertID
	.s SaveObj.VisitNumberReportDR=ReportDR
	.s sc=VisitNumberModifyObj.%Save()
	.i '($SYSTEM.Status.IsOK(sc)) d
	..THROW ##class(%Exception.General).%New("事务委托","D",,"-1^保存报告专家规则失败:"_$SYSTEM.Status.GetErrorText(sc))
	q ""
}

/// 保存结果修改日志
/// d ##Class(LIS.WS.BLL.DHCRPMicReportSave).SaveResModifyLog()
ClassMethod SaveResModifyLog(VisitNumberDR, WorkGroupMachineDR, TestCodeDR, ModifiedResult, ModifiedTextResult, ModifiedExtraRes, ModifiedOtherRes, ModifiedResNoes, AbFlag, ClientIp, UserID, Unit, PreResult, PreTextResult, PreExtraRes)
{
	s VisitNumberModifyObj = ##Class(dbo.RPVisitnumberResModifyLog).%New()
    s VisitNumberModifyObj.VisitnumberDR = VisitNumberDR
    s VisitNumberModifyObj.WorkGroupMachineDR = WorkGroupMachineDR
    s VisitNumberModifyObj.TestCodeDR = TestCodeDR
    s VisitNumberModifyObj.ModifiedResult = ModifiedResult
    s VisitNumberModifyObj.ModifiedTextResult = ModifiedTextResult
    s VisitNumberModifyObj.ModifiedExtraRes = ModifiedExtraRes
    s VisitNumberModifyObj.ModifiedOtherRes = ModifiedOtherRes
    s VisitNumberModifyObj.ModifiedResNoes = ModifiedResNoes
    s VisitNumberModifyObj.AbFlag = AbFlag
    s VisitNumberModifyObj.ModifyClinetIp = ClientIp
    s VisitNumberModifyObj.ModifyDate = $zd($h,8)
    s VisitNumberModifyObj.ModifyTime = $p($h,",",2)
    s VisitNumberModifyObj.ModifyUserDR = UserID
    s VisitNumberModifyObj.Unit = Unit
    s VisitNumberModifyObj.PreResult=PreResult
	s VisitNumberModifyObj.PreTextResult=PreTextResult
	s VisitNumberModifyObj.PreExtraRes=PreExtraRes
    s sc=VisitNumberModifyObj.%Save()
	If ($SYSTEM.Status.IsOK(sc)) {s RetVal=1}
	Else {s RetVal=$SYSTEM.Status.GetErrorText(sc) Quit}
}



/// 委托事务的保存报告日志
ClassMethod SaveReportResLogTrans(ReportDR, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, Sessions, Output RowCount As %String) As %String
{
	s ReportDR=$g(ReportDR)
	s Sessions=$g(Sessions)
	s UserID=$p(Sessions,"^",1)
	i $d(^dbo.RPVisitNumberReportResultI("IndexReportItem",ReportDR)) d
	.s TestCodeDR="" f  s TestCodeDR=$o(^dbo.RPVisitNumberReportResultI("IndexReportItem",ReportDR,TestCodeDR)) q:TestCodeDR=""  d
	..s ResultFormat=$lg($g(^dbo.BTTestCodeD(TestCodeDR)),9)
	..i ResultFormat'="M" q
	..s RepResultDR="" f  s RepResultDR=$o(^dbo.RPVisitNumberReportResultI("IndexReportItem",ReportDR,TestCodeDR,RepResultDR)) q:RepResultDR=""  d
	...s TextRes=$lg($g(^dbo.RPVisitNumberReportResultD(RepResultDR)),5)
	...//有结果就备份日志
	...i $l(TextRes) d
	....s RepResObj=##Class(dbo.RPVisitNumberReportResult).%OpenId(RepResultDR)
	....s RepResLogObj=##Class(dbo.RPVisitNumberReportResLog).%New()
	....s RepResLogObj.AbFlag=RepResObj.AbFlag
	....s RepResLogObj.AccessionNo=""
	....s RepResLogObj.AdmNo=RepResObj.AdmNo
	....s RepResLogObj.AssayDate=RepResObj.AssayDate
	....s RepResLogObj.AssayNo=""
	....s RepResLogObj.AssayStatus=RepResObj.AssayStatus
	....s RepResLogObj.AssayTime=RepResObj.AssayTime
	....s RepResLogObj.AuthDate=$zd($h,8)
	....s RepResLogObj.AuthTime=$p($h,",",2)
	....s RepResLogObj.AuthUserDR=UserID
	....s RepResLogObj.DilCode=RepResObj.DilCode
	....s RepResLogObj.ExpertRule=RepResObj.ExpertRule
	....s RepResLogObj.ExtraRes=RepResObj.ExtraRes
	....s RepResLogObj.IsMandatory=RepResObj.IsMandatory
	....s RepResLogObj.IsNotAllowPrint=RepResObj.IsNotAllowPrint
	....s RepResLogObj.IsReport=RepResObj.IsReport
	....s RepResLogObj.MachineParameterDR=RepResObj.MachineParameterDR
	....s RepResLogObj.MethodDR=RepResObj.MethodDR
	....s RepResLogObj.MultipleResChild=RepResObj.MultipleResChild
	....s RepResLogObj.MultipleResistant=RepResObj.MultipleResistant
	....s RepResLogObj.OperateType=RepResObj.OperateType
	....s RepResLogObj.OperateUserDR=RepResObj.OperateUserDR
	....s RepResLogObj.OtherRes=RepResObj.OtherRes
	....s RepResLogObj.OthTestSetIDs=RepResObj.OthTestSetIDs
	....s RepResLogObj.PrintSeq=RepResObj.PrintSeq
	....s RepResLogObj.ReAssayNum=RepResObj.ReAssayNum
	....s RepResLogObj.ReAssayNumber=RepResObj.ReAssayNumber
	....s RepResLogObj.RefRanges=RepResObj.RefRanges
	....s RepResLogObj.RegNo=RepResObj.RegNo
	....s RepResLogObj.ResClass=RepResObj.ResClass
	....s RepResLogObj.ResNoes=RepResObj.ResNoes
	....s RepResLogObj.Result=RepResObj.Result
	....s RepResLogObj.RPVisitNumberTestSetDR=RepResObj.RPVisitNumberTestSetDR
	....s RepResLogObj.Sequence=RepResObj.Sequence
	....s RepResLogObj.TestCodeDR=RepResObj.TestCodeDR
	....s RepResLogObj.TestSetDR=RepResObj.TestSetDR
	....s RepResLogObj.TextRes=RepResObj.TextRes
	....s RepResLogObj.TransmitDate=$zd($h,8)
	....s RepResLogObj.Unit=RepResObj.Unit
	....s RepResLogObj.VisitNumberReportDR=RepResObj.VisitNumberReportDR
	....s RepResLogObj.WorkGroupMachineDR=""
	....s sc=RepResLogObj.%Save()
	....i ('$SYSTEM.Status.IsOK(sc)) d
	.....THROW ##class(%Exception.General).%New("事务委托","D",,"-1^保存报告结果日志失败:"_$SYSTEM.Status.GetErrorText(sc))
	....i $d(^dbo.RPVisitNumberReportResSenI("IndexAntibiocs",RepResultDR)) d
	.....s AntibioticsDR="" f  s AntibioticsDR=$o(^dbo.RPVisitNumberReportResSenI("IndexAntibiocs",RepResultDR,AntibioticsDR)) q:AntibioticsDR=""  d
	......s RepSenDR=$o(^dbo.RPVisitNumberReportResSenI("IndexAntibiocs",RepResultDR,AntibioticsDR,""))
	......s RepSenObj=##Class(dbo.RPVisitNumberReportResSen).%OpenId(RepSenDR)
	......s RepSenLogObj=##Class(dbo.RPVisitNumberReportResSenLog).%New()
	......s RepSenLogObj.AntibioticsClassDR=RepSenObj.AntibioticsClassDR
	......s RepSenLogObj.AntibioticsDR=RepSenObj.AntibioticsDR
	......s RepSenLogObj.CheckType=RepSenObj.CheckType
	......s RepSenLogObj.ExpertRuleID=RepSenObj.ExpertRuleID
	......s RepSenLogObj.IRanges=RepSenObj.IRanges
	......s RepSenLogObj.MachSensitivityDR=RepSenObj.MachSensitivityDR
	......s RepSenLogObj.Prompt=RepSenObj.Prompt
	......s RepSenLogObj.PromptType=RepSenObj.PromptType
	......s RepSenLogObj.Reported=RepSenObj.Reported
	......s RepSenLogObj.RRanges=RepSenObj.RRanges
	......s RepSenLogObj.SDDRanges=RepSenObj.SDDRanges
	......s RepSenLogObj.SenMethod=RepSenObj.SenMethod
	......s RepSenLogObj.SensitivityDR=RepSenObj.SensitivityDR
	......s RepSenLogObj.SenValue=RepSenObj.SenValue
	......s RepSenLogObj.Sequence=RepSenObj.Sequence
	......s RepSenLogObj.SRanges=RepSenObj.SRanges
	......s RepSenLogObj.VisitNumberReportResLogDR=RepResLogObj.RowID
	......s sc=RepSenLogObj.%Save()
	......i ('$SYSTEM.Status.IsOK(sc)) d
	.......THROW ##class(%Exception.General).%New("事务委托","D",,"-1^保存报告结果药敏日志失败:"_$SYSTEM.Status.GetErrorText(sc))
    q ""
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小乌鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值