/// desc:常用系统相关方法
Class DHCDoc.Util.System Extends %RegisteredObject
{

/// Desc: 获取时间戳
/// Input: time: 本地日期时间(机器码)、integer:(0/1)是否精确毫秒
/// w ##class(DHCDoc.Util.System).GetTimeStamp()
ClassMethod GetTimeStamp(time = "", integer = "0") As %Integer
{
	if time=""{
		;默认采用UTC时间
		s time=$ZTS
	}else{
		;本地时间转为UTC时间
		s time=$SYSTEM.Util.LocalWithZTIMEZONEtoUTC(time)
	}
	i integer'=0{
		s time=$p(time,".",1)
	}
	q ((($piece(time,",")-47117)*86400+$piece(time,",",2))*1000)\1
}

/// Desc: 解析时间戳
/// w ##class(DHCDoc.Util.System).ParseTimeStamp()
ClassMethod ParseTimeStamp(Timestamp As %Float)
{
	q:+Timestamp=0 ""
	s Timestamp=Timestamp/1000
	s UTCDate=Timestamp\86400+47117
	s UTCTime=Timestamp#86400
	;UTC时间转为本地
	s LocalStamp=$SYSTEM.Util.UTCtoLocalWithZTIMEZONE(UTCDate_","_UTCTime)
	q LocalStamp
}

/// Desc: 获取客户端IP
ClassMethod GetOutLocalIP() As %String
{
	q ##class(%SYSTEM.Process).ClientIPAddress()
}

/// Desc: 获取服务器IP
ClassMethod GetInLocalIP() As %String
{
	q $p($zu(54,13,$zu(54,0)),",",1 )
}

/// Desc: 获取License信息
ClassMethod ShowLicenseInfo() As %Boolean
{
	d ##class(%SYSTEM.License).ShowCounts()
}

/// Desc: 获取服务器的MAC地址
ClassMethod GetMACAddress() As %String
{
	Q ##class(%SYSTEM.INetInfo).EthernetAddress(0)
	Q $zu(114,$zu(54,0))
}

/// 生成PDF
/// d ##class(DHCDoc.Util.System).CreatePDF()
ClassMethod CreatePDF()
{
	zn "SAMPLES"
	do ##class(ZENDemo.Home).CreateDemoData() 
	s rpt1=##class(ZENApp.MyReport).%New()
	s rpt1.RepeatingElement="SalesRep"
	s rpt1.CountRepeatingElement=5
	s rpt1.SplitAndMerge=1
	s rpt1.Month=1
	s Status=rpt1.GenerateReport("c:\temp\MyReport1.pdf",0)
	d $System.Status.DisplayError(Status)
	w $System.Status.DisplayError(Status)
	zn "DHC-APP"
}

/***
  **Description      :间接加锁业务表,用以替换$$LOCK^SSLOCK
  **Author           :tanjishan
  **Time             :2022/11/29
  **debugger         :##Class(DHCDoc.Util.System).LOCK("OE_Order",1,1,"41:35:23")
  **Parameter        :BASETAB,自定义表名
  						ROWID,
						User,用户
						Comp,客户端特征编码
  **Returns          :-1:成功,其他:失败
***/
ClassMethod LOCK(BASETAB, ROWID, User As %String = "", Comp As %String = "") As %String
{
	q:$g(ROWID)="" -1
	s User=$g(User),Comp=$g(Comp)
	s (user,name,doc,ext,s)=""
	L +^DBLock(BASETAB,ROWID):0
	if '$TEST {
		s ss=$g(^DBLock(BASETAB,ROWID)),user=$p(ss,"^"),comp=$p(ss,"^",2)
		s s=$g(^SSU("SSUSR",+user)),name=$p(s,"^",2),doc=$p(s,"^",14),ext=$p($g(^CTPCP(+doc,2)),"^",2)
		Q name_"^"_ext_"^"_comp
	}
	s ^DBLock(BASETAB,ROWID)=User_"^"_Comp
	Q -1
}

/***
  **Description      :默认立即解锁,不需要等待事务结束,用以替换$$LOCKCLR^SSLOCK
  **Author           :tanjishan
  **Time             :2022/11/29
  **debugger         :w ##Class(DHCDoc.Util.System).LOCKCLR("OE_Order",1)
  **Parameter        :BASETAB,自定义表名
  						ROWID,
						LockType,是否立即解锁,具体是否需要重写该变量,请结合实际业务考虑!!
  **Returns          :%String
***/
ClassMethod LOCKCLR(BASETAB, ROWID, LockType As %String = "I") As %String
{
	q:$g(ROWID)="" -1
	if (LockType="I"){
		L -^DBLock(BASETAB,ROWID)#LockType
	}else{
		L -^DBLock(BASETAB,ROWID)
	}
	k ^DBLock(BASETAB,ROWID)

	Q -1
}

}

AES加密2次调用

/// AES 加密
/// w ##class(iH.test).AESEncrypt("DHC005864210624172656")
/// w ##class(iH.Api.PublicApi).GetAES256CTR("DHC005864210624172656")
ClassMethod AESEncrypt(plaintext As %String, key As %String, IV As %String = "") As %String
{
	Set key="dhcc1024@hospital!leveld"
	Set IV="01wshdkcnzmawoid"
	Set text=$ZCONVERT(plaintext,"O","UTF8")
	Set text=$SYSTEM.Encryption.AESCBCEncrypt(text,key,IV)
	b ; text
	Set ciphertext=$SYSTEM.Encryption.Base64Encode(text)
	q ciphertext
}

/// AES 解密
/// w ##class(iH.test).AESCBCDecrypt()
ClassMethod AESCBCDecrypt(ciphertext As %String, key As %String, IV As %String = "") As %String
{
	Set key="2067a854ff54447db3867b5893eb3f69"
	Set text=$SYSTEM.Encryption.Base64Decode(ciphertext)
	Set text=$SYSTEM.Encryption.AESCBCDecrypt(text,key)
	Set plaintext=$ZCONVERT(text,"I","UTF8")
	q plaintext
}