| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874 |
- Import SQLUSER
- /// Creator: 系统
- /// CreatDate: 2026-09-17
- /// Description: 报表服务类(承载各类报表,与 src.DRG.Profit 同级)
- ///
- /// 接口Code规范: 020106xx
- /// 02010601 可比就诊检索(已完成首页分组的就诊列表,供勾选加入比对)
- /// 02010602 病组费用比对(2~5 例并列:结算清单汇总列 / HIS明细项目 / 结算类别聚合
- /// + 诊断 / 手术 / DRG支付标准 + 中文文字分析报告)
- /// 02010603 重复收费汇总统计(按收费项目类型/收费项目,双比重 + 全局KPI)
- /// 02010604 重复收费明细查询(按重复组分页,同组同色号)
- /// 02010605 单次就诊费用信息(明细 + 双维度汇总 + 重复分组统计,只读不触发HIS同步)
- ///
- /// 数据来源:
- /// BS_DRGMedInsuMedicalRecord (MR) 医保结算明细(28 项费用列 + MedfeeSumamt、DRG/DRGDesc、HISAdmID、
- /// MedcasNo、MdtrtId、PsnNo、AdmDate、DscgDate、ImageURL、FixmedinsCode、ValiFlag)
- /// BS_HISPatAdm (PA) 住院就诊(科室 InLocCode/InLocDesc、医生 AdmDocCode/AdmDocDesc、
- /// 险种 InsuType;关联键 PA.AdmID = MR.HISAdmID)
- /// BS_HISFeeDetail (FD) HIS费用明细流水(MedinsListCodg/Desc、EcCode/EcDesc、Cnt、DetItemFeeSumamt;
- /// 关联键 FD.AdmID = MR.HISAdmID;有效口径 Deleted=0 且 ValidFlag 非 'N')
- /// BS_HISDiseInfo 诊断(AdmID 关联;DiagCode/DiagName/MainFlag/DiagSn;无 Deleted 字段)
- /// BS_HISOprnInfo 手术(AdmID 关联;OprnCode/OprnName/MainFlag/OprnSn;无 Deleted 字段)
- /// BS_DRGGroupRecord (GR) DRG分组(BenchmarkCost 支付标准、Weight 权重、DRG/DRGDesc、ActiveFlag)
- /// CB_DRGDictTable 险种字典(父记录 Code='INSU_TYPE',子记录 Code/Name)
- ///
- /// 已完成首页分组口径(02010601 固定附加,四条同时满足):MR.ValiFlag 非 '0';
- /// MR.ImageURL 非空;MR.DRG 非空(IS NOT NULL 且 <> '',主表 DRG 必须有值);
- /// EXISTS(BS_DRGGroupRecord g: g.AdmID = MR.HISAdmID AND g.ActiveFlag='1' AND g.DRG<>'')
- /// SQL 约束:本环境不支持 WITH(CTE)、ORDER BY 聚合表达式与列序号;聚合排序一律在 ObjectScript 侧完成
- Class src.DRG.Report Extends (%RegisteredObject, %XML.Adaptor) [ Not ProcedureBlock ]
- {
- /// Description: 通用成功结果封装
- ClassMethod SetSuccessResult(code As %String, message As %String) As %Library.DynamicObject
- {
- new resultObj
- set resultObj = {}
- set resultObj.errorCode = code
- set resultObj.errorMessage = message
- set resultObj.result = {}
- quit resultObj
- }
- /// Description: 通用错误结果封装
- ClassMethod SetErrorResult(errorCode As %String, errorMsg As %String) As %Library.DynamicObject
- {
- new resultObj
- set resultObj = {}
- set resultObj.errorCode = errorCode
- set resultObj.errorMessage = errorMsg
- set resultObj.result = {}
- quit resultObj
- }
- /// Description: 解析分页参数(pagination[0].pageSize / currentPage,缺省 20 / 1)
- ClassMethod %GetPage(jsonObj As %Library.DynamicObject) As %Library.DynamicObject
- {
- new pg, pagination
- set pg = {}
- set pg.pageSize = 20
- set pg.currentPage = 1
- if (jsonObj.%IsDefined("pagination") '= 0) {
- set pagination = jsonObj.pagination.%Get(0)
- if (pagination.pageSize '= "") set pg.pageSize = pagination.pageSize
- if (pagination.currentPage '= "") set pg.currentPage = pagination.currentPage
- }
- quit pg
- }
- /// Description: 内存分页:对结果数组做切片,返回 {rows, total}
- ClassMethod %Paginate(all As %Library.DynamicArray, pg As %Library.DynamicObject) As %Library.DynamicObject
- {
- new out, total, startIdx, rows, i
- set out = {}
- set total = all.%Size()
- set startIdx = (pg.currentPage - 1) * pg.pageSize
- if (startIdx < 0) set startIdx = 0
- set rows = []
- for i = startIdx:1:(startIdx + pg.pageSize - 1) {
- if (i >= total) quit
- do rows.%Push(all.%Get(i))
- }
- set out.rows = rows
- set out.total = total
- quit out
- }
- /// Description: 统一异常处理:记录错误日志并返回中文错误结果
- ClassMethod %HandleError(methodName As %String, code As %String, jsonObj As %Library.DynamicObject, status As %Status) As %Library.DynamicObject
- {
- new errorMsg, errorInfo, errorLogID, resultObj
- set errorMsg = $replace(##class(%SYSTEM.Status).GetErrorText(status, "cn"), "^", " ")
- set errorInfo = methodName _ "异常:类=" _ $ClassName() _ ",入参=" _ jsonObj.%ToJSON() _ ",错误:" _ errorMsg
- set errorLogID = ##class(src.Interface.Message).InsErrRecord(code, errorInfo, errorMsg)
- set resultObj = {}
- set resultObj.errorCode = code
- set resultObj.errorMessage = methodName _ "异常(日志ID:" _ errorLogID _ "):" _ errorMsg
- set resultObj.result = {}
- quit resultObj
- }
- /// Description: 险种编码转中文名(查 CB_DRGDictTable 自关联);查不到回落为编码原值
- ClassMethod %GetInsuTypeName(code As %String) As %String
- {
- new sqlObj, sc, rs, name
- if (code = "") quit ""
- set sqlObj = ##class(%SQL.Statement).%New(1)
- set sc = sqlObj.%Prepare("SELECT b.Name AS Name FROM CB_DRGDictTable a INNER JOIN CB_DRGDictTable b ON a.ID = b.Parent_Dr WHERE a.Parent_Dr IS NULL AND a.Code = 'INSU_TYPE' AND a.Status = 'Y' AND b.Code = ?")
- if ('$$$ISOK(sc)) quit code
- set rs = sqlObj.%Execute(code)
- if (rs.%Next()) {
- set name = rs.%Get("Name")
- if (name '= "") quit name
- }
- quit code
- }
- /// Description: 将就诊号数组拼成 SQL IN 列表(每个元素做单引号转义防注入)
- ClassMethod %BuildIn(arr As %Library.DynamicArray) As %String
- {
- new inList, i, v
- set inList = ""
- for i = 0:1:(arr.%Size() - 1) {
- set v = arr.%Get(i)
- if (v = "") continue
- if (inList '= "") set inList = inList _ ","
- set inList = inList _ "'" _ $REPLACE(v, "'", "") _ "'"
- }
- quit inList
- }
- /// Description: 构建可比就诊检索的公共过滤条件
- /// 基础口径:MR 有效 + 病案首页已入库(ImageURL<>'') + 存在有效 DRG 分组记录
- /// 追加:普通区(机构/DRG编码/入院或出院日期区间)与高级区(患者/病案/就诊/流水号/个人编号/险种/主诊断/主手术)
- /// 注意:险种 InsuType 存于 BS_HISPatAdm(PA),主 SQL 必须 INNER JOIN PA
- ClassMethod %BuildVisitWhere(params As %Library.DynamicObject) As %String
- {
- new w, v, dateType, dateCol
- set w = " WHERE (MR.ValiFlag IS NULL OR MR.ValiFlag = '1')"
- _ " AND (MR.ImageURL IS NOT NULL AND MR.ImageURL <> '')"
- _ " AND (MR.DRG IS NOT NULL AND MR.DRG <> '')"
- _ " AND EXISTS (SELECT 1 FROM BS_DRGGroupRecord g WHERE g.AdmID = MR.HISAdmID AND g.ActiveFlag = '1' AND g.DRG <> '')"
- set v = params.fixmedinsCode
- if (v '= "") set w = w _ " AND MR.FixmedinsCode = '" _ $REPLACE(v, "'", "") _ "'"
- set v = params.drgCode
- if (v '= "") set w = w _ " AND MR.DRG = '" _ $REPLACE(v, "'", "") _ "'"
- set dateType = params.dateType
- set dateCol = $CASE(dateType, "discharge" : "MR.DscgDate", : "MR.AdmDate")
- set v = params.startDate
- if (v '= "") set w = w _ " AND " _ dateCol _ " >= '" _ $REPLACE(v, "'", "") _ "'"
- set v = params.endDate
- if (v '= "") set w = w _ " AND " _ dateCol _ " <= '" _ $REPLACE(v, "'", "") _ " 23:59:59'"
- set v = params.patName
- if (v '= "") set w = w _ " AND MR.PsnName LIKE '%" _ $REPLACE(v, "'", "") _ "%'"
- set v = params.medcasNo
- if (v '= "") set w = w _ " AND MR.MedcasNo = '" _ $REPLACE(v, "'", "") _ "'"
- set v = params.admID
- if (v '= "") set w = w _ " AND MR.HISAdmID = '" _ $REPLACE(v, "'", "") _ "'"
- set v = params.mdtrtId
- if (v '= "") set w = w _ " AND MR.MdtrtId = '" _ $REPLACE(v, "'", "") _ "'"
- set v = params.psnNo
- if (v '= "") set w = w _ " AND MR.PsnNo LIKE '%" _ $REPLACE(v, "'", "") _ "%'"
- set v = params.insuType
- if (v '= "") set w = w _ " AND PA.InsuType = '" _ $REPLACE(v, "'", "") _ "'"
- set v = params.mainDiagCode
- if (v '= "") set w = w _ " AND EXISTS (SELECT 1 FROM BS_HISDiseInfo d WHERE d.AdmID = MR.HISAdmID AND d.MainFlag = 1 AND d.DiagCode = '" _ $REPLACE(v, "'", "") _ "')"
- set v = params.mainDiagName
- if (v '= "") set w = w _ " AND EXISTS (SELECT 1 FROM BS_HISDiseInfo d WHERE d.AdmID = MR.HISAdmID AND d.MainFlag = 1 AND d.DiagName LIKE '%" _ $REPLACE(v, "'", "") _ "%')"
- set v = params.mainOprnCode
- if (v '= "") set w = w _ " AND EXISTS (SELECT 1 FROM BS_HISOprnInfo o WHERE o.AdmID = MR.HISAdmID AND o.MainFlag = 'Y' AND o.OprnCode = '" _ $REPLACE(v, "'", "") _ "')"
- set v = params.mainOprnName
- if (v '= "") set w = w _ " AND EXISTS (SELECT 1 FROM BS_HISOprnInfo o WHERE o.AdmID = MR.HISAdmID AND o.MainFlag = 'Y' AND o.OprnName LIKE '%" _ $REPLACE(v, "'", "") _ "%')"
- quit w
- }
- /// Description: 计算单个比对单元格的差异标记
- /// @param value 本例金额
- /// @param baseValue 基准金额(首条值 或 各例均值)
- /// @param exists 本例是否存在该行
- /// @param existsCount 全部病例中存在该行的例数
- /// @return $LB(diffFlag, diffAmount, diffRate)
- /// missing=本例无该项 / onlyIn=仅本例有 / diff=有差异 / same=一致(2 位小数容差)
- ClassMethod %CalcDiff(value As %Numeric, baseValue As %Numeric, exists As %Boolean, existsCount As %Integer) As %List
- {
- new diffAmount, diffRate
- if ('exists) quit $LB("missing", 0, 0)
- if (existsCount <= 1) quit $LB("onlyIn", +$FN(value, "", 2), 0)
- if ($FN(value, "", 2) = $FN(baseValue, "", 2)) quit $LB("same", 0, 0)
- set diffAmount = +$FN(value - baseValue, "", 2)
- set diffRate = 0
- if (baseValue '= 0) set diffRate = +$FN((diffAmount / baseValue) * 100, "", 2)
- quit $LB("diff", diffAmount, diffRate)
- }
- /// Creator: 系统
- /// CreatDate: 2026-09-17
- /// Description: 可比就诊检索(已完成首页分组的就诊列表,供勾选加入比对)
- /// Code: 02010601
- /// Input: {"params":[{"fixmedinsCode":"","dateType":"adm","startDate":"","endDate":"","drgCode":"",
- /// "patName":"","medcasNo":"","admID":"","mdtrtId":"","psnNo":"","insuType":"",
- /// "mainDiagCode":"","mainDiagName":"","mainOprnCode":"","mainOprnName":""}],
- /// "pagination":[{"pageSize":20,"currentPage":1}]}
- /// Output: {errorCode:"0", errorMessage:"", result:{rows:[{admID,medcasNo,patName,...,payStandard,insuType,insuTypeCode}], total:N}}
- ClassMethod QueryComparableVisits(jsonObj As %Library.DynamicObject) As %Library.DynamicObject
- {
- new (jsonObj)
- set resultObj = {"errorCode":"0","errorMessage":"","result":{}}
- try
- {
- if (jsonObj = "") || (jsonObj.params = "") {
- set resultObj = ..SetErrorResult("-1", "入参异常:缺少params参数或参数为空")
- quit
- }
- set pg = ..%GetPage(jsonObj)
- set params = jsonObj.params.%Get(0)
- set fixmedinsCode = params.fixmedinsCode
- set startDate = params.startDate
- set endDate = params.endDate
- set admID = params.admID
- set medcasNo = params.medcasNo
- set mdtrtId = params.mdtrtId
- if (fixmedinsCode = "") && (startDate = "") && (endDate = "") && (admID = "") && (medcasNo = "") && (mdtrtId = "") {
- set resultObj = ..SetErrorResult("-1", "查询条件不足:请至少提供机构代码、日期区间或就诊标识之一")
- quit
- }
- set w = ..%BuildVisitWhere(params)
- set baseFrom = " FROM BS_DRGMedInsuMedicalRecord MR INNER JOIN BS_HISPatAdm PA ON PA.AdmID = MR.HISAdmID " _ w
- set sqlObj = ##class(%SQL.Statement).%New(1)
- set sc = sqlObj.%Prepare("SELECT COUNT(*) AS total " _ baseFrom)
- if ('$$$ISOK(sc)) {
- set resultObj = ..%HandleError("查询可比就诊", "02010601", jsonObj, sc)
- quit
- }
- set rs = sqlObj.%Execute()
- set total = 0
- if (rs.%Next()) set total = +rs.%Get("total")
- if (total = 0) {
- set resultObj.result = {"rows":[], "total":0}
- quit
- }
- set sql = "SELECT MR.HISAdmID AS admID, MR.MedcasNo AS medcasNo, MR.PsnName AS patName, MR.Gend AS gend, MR.Age AS age,"
- _ " MR.AdmDate AS admDate, MR.DscgDate AS dscgDate, MR.IptDays AS iptDays, MR.DRG AS drgCode, MR.DRGDesc AS drgName,"
- _ " MR.MedfeeSumamt AS medfeeSumamt, MR.PsnNo AS psnNo, MR.MdtrtId AS mdtrtId, MR.FixmedinsCode AS fixmedinsCode,"
- _ " PA.InsuType AS insuTypeCode, PA.InLocCode AS deptCode, PA.InLocDesc AS deptName,"
- _ " PA.AdmDocCode AS doctorCode, PA.AdmDocDesc AS doctorName"
- _ baseFrom _ " ORDER BY MR.AdmDate DESC, MR.ID DESC"
- set sc = sqlObj.%Prepare(sql)
- if ('$$$ISOK(sc)) {
- set resultObj = ..%HandleError("查询可比就诊列表", "02010601", jsonObj, sc)
- quit
- }
- set rs = sqlObj.%Execute()
- set all = []
- while (rs.%Next()) {
- set r = {}
- set r.admID = rs.%Get("admID")
- set r.medcasNo = rs.%Get("medcasNo")
- set r.patName = rs.%Get("patName")
- set r.gend = rs.%Get("gend")
- set r.age = +rs.%Get("age")
- set r.admDate = rs.%Get("admDate")
- set r.dscgDate = rs.%Get("dscgDate")
- set r.iptDays = +rs.%Get("iptDays")
- set r.drgCode = rs.%Get("drgCode")
- set r.drgName = rs.%Get("drgName")
- set r.medfeeSumamt = +rs.%Get("medfeeSumamt")
- set r.psnNo = rs.%Get("psnNo")
- set r.mdtrtId = rs.%Get("mdtrtId")
- set r.fixmedinsCode = rs.%Get("fixmedinsCode")
- set r.insuTypeCode = rs.%Get("insuTypeCode")
- set r.deptCode = rs.%Get("deptCode")
- set r.deptName = rs.%Get("deptName")
- set r.doctorCode = rs.%Get("doctorCode")
- set r.doctorName = rs.%Get("doctorName")
- set r.payStandard = 0
- do all.%Push(r)
- }
- set paged = ..%Paginate(all, pg)
- set paged.total = total
- // 支付标准:独立按 AdmID 聚合回填(避免 JOIN 放大行数)
- set pageIds = []
- set rows = paged.rows
- for i = 0:1:(rows.%Size() - 1) {
- do pageIds.%Push(rows.%Get(i).admID)
- }
- if (pageIds.%Size() > 0) {
- kill payStd
- set sc = sqlObj.%Prepare("SELECT AdmID, MAX(BenchmarkCost) AS PayStd FROM BS_DRGGroupRecord WHERE ActiveFlag = '1' AND AdmID IN (" _ ..%BuildIn(pageIds) _ ") GROUP BY AdmID")
- if ('$$$ISOK(sc)) {
- set resultObj = ..%HandleError("查询可比就诊支付标准", "02010601", jsonObj, sc)
- quit
- }
- set rs = sqlObj.%Execute()
- while (rs.%Next()) {
- set payStd(rs.%Get("AdmID")) = +rs.%Get("PayStd")
- }
- for i = 0:1:(rows.%Size() - 1) {
- set r = rows.%Get(i)
- set r.payStandard = +$get(payStd(r.admID), 0)
- set r.insuType = ..%GetInsuTypeName(r.insuTypeCode)
- do rows.%Set(i, r)
- }
- }
- set resultObj.result = paged
- }
- catch(e)
- {
- set resultObj = ..%HandleError("查询可比就诊", "02010601", jsonObj, e.AsStatus())
- }
- quit resultObj
- }
- /// Creator: 系统
- /// CreatDate: 2026-09-17
- /// Description: 病组费用比对(三维度费用 + 诊断/手术/支付标准 + 中文文字分析报告)
- /// Code: 02010602
- ClassMethod CompareDRGFee(jsonObj As %Library.DynamicObject) As %Library.DynamicObject
- {
- new (jsonObj)
- set resultObj = {"errorCode":"0","errorMessage":"","result":{}}
- try
- {
- if (jsonObj = "") || (jsonObj.params = "") {
- set resultObj = ..SetErrorResult("-1", "入参异常:缺少params参数或参数为空")
- quit
- }
- set params = jsonObj.params.%Get(0)
- if ('$ISOBJECT(params.admIds)) {
- set resultObj = ..SetErrorResult("-1", "请至少选择 2 条就诊记录进行比对")
- quit
- }
- set admIds = []
- kill seenId
- for i = 0:1:(params.admIds.%Size() - 1) {
- set aid = params.admIds.%Get(i)
- if (aid = "") continue
- if ($get(seenId(aid)) = 1) continue
- set seenId(aid) = 1
- do admIds.%Push(aid)
- }
- if (admIds.%Size() < 2) {
- set resultObj = ..SetErrorResult("-1", "请至少选择 2 条就诊记录进行比对")
- quit
- }
- if (admIds.%Size() > 5) {
- set resultObj = ..SetErrorResult("-1", "单次最多支持 5 条就诊记录同时比对")
- quit
- }
- set diffBase = params.diffBase
- if ((diffBase '= "avg") && (diffBase '= "first")) set diffBase = "first"
- set n = admIds.%Size()
- set inList = ..%BuildIn(admIds)
- set sqlObj = ##class(%SQL.Statement).%New(1)
- // ---------- SQL-A 就诊基本信息 ----------
- set sql = "SELECT MR.HISAdmID AS admID, MR.MedcasNo AS medcasNo, MR.PsnName AS patName, MR.Gend AS gend, MR.Age AS age,"
- _ " MR.AdmDate AS admDate, MR.DscgDate AS dscgDate, MR.IptDays AS iptDays, MR.MedfeeSumamt AS medfeeSumamt,"
- _ " MR.DRG AS drgCode, MR.DRGDesc AS drgName, PA.InLocDesc AS deptName, PA.AdmDocDesc AS doctorName, PA.InsuType AS insuTypeCode"
- _ " FROM BS_DRGMedInsuMedicalRecord MR LEFT JOIN BS_HISPatAdm PA ON PA.AdmID = MR.HISAdmID AND PA.Deleted = 0"
- _ " WHERE MR.HISAdmID IN (" _ inList _ ")"
- set sc = sqlObj.%Prepare(sql)
- if ('$$$ISOK(sc)) {
- set resultObj = ..%HandleError("查询比对就诊信息", "02010602", jsonObj, sc)
- quit
- }
- set rs = sqlObj.%Execute()
- kill vIdx
- while (rs.%Next()) {
- set v = {}
- set v.admID = rs.%Get("admID")
- set v.medcasNo = rs.%Get("medcasNo")
- set v.patName = rs.%Get("patName")
- set v.gend = rs.%Get("gend")
- set v.age = +rs.%Get("age")
- set v.admDate = rs.%Get("admDate")
- set v.dscgDate = rs.%Get("dscgDate")
- set v.iptDays = +rs.%Get("iptDays")
- set v.medfeeSumamt = +rs.%Get("medfeeSumamt")
- set v.drgCode = rs.%Get("drgCode")
- set v.drgName = rs.%Get("drgName")
- set v.deptName = rs.%Get("deptName")
- set v.doctorName = rs.%Get("doctorName")
- set v.insuTypeCode = rs.%Get("insuTypeCode")
- set vIdx(v.admID) = v
- }
- set visits = []
- for i = 0:1:(n - 1) {
- set aid = admIds.%Get(i)
- if ($data(vIdx(aid)) = 0) {
- set v = {}
- set v.admID = aid
- set v.medcasNo = ""
- set v.patName = ""
- set v.gend = ""
- set v.age = 0
- set v.admDate = ""
- set v.dscgDate = ""
- set v.iptDays = 0
- set v.medfeeSumamt = 0
- set v.drgCode = ""
- set v.drgName = ""
- set v.deptName = ""
- set v.doctorName = ""
- set v.insuTypeCode = ""
- set v.insuType = ""
- } else {
- set v = vIdx(aid)
- set v.insuType = ..%GetInsuTypeName(v.insuTypeCode)
- }
- do visits.%Push(v)
- }
- // ---------- SQL-B DRG 支付标准 ----------
- kill grPay, grWt
- set sc = sqlObj.%Prepare("SELECT AdmID, MAX(BenchmarkCost) AS PayStd, MAX(Weight) AS Weight FROM BS_DRGGroupRecord WHERE ActiveFlag = '1' AND AdmID IN (" _ inList _ ") GROUP BY AdmID")
- if ('$$$ISOK(sc)) {
- set resultObj = ..%HandleError("查询比对支付标准", "02010602", jsonObj, sc)
- quit
- }
- set rs = sqlObj.%Execute()
- while (rs.%Next()) {
- set grPay(rs.%Get("AdmID")) = +rs.%Get("PayStd")
- set grWt(rs.%Get("AdmID")) = +rs.%Get("Weight")
- }
- set drgPayment = []
- for i = 0:1:(n - 1) {
- set aid = admIds.%Get(i)
- set v = visits.%Get(i)
- set p = {}
- set p.admID = aid
- set p.drgCode = v.drgCode
- set p.drgName = v.drgName
- set p.payStandard = +$get(grPay(aid), 0)
- set p.weight = +$get(grWt(aid), 0)
- set p.totalFee = v.medfeeSumamt
- set p.profitAmount = +$FN(p.payStandard - p.totalFee, "", 2)
- set p.profitRate = 0
- if (p.totalFee > 0) set p.profitRate = +$FN((p.profitAmount / p.totalFee) * 100, "", 2)
- do drgPayment.%Push(p)
- }
- // ---------- SQL-C 结算清单费用汇总列 ----------
- set feeList = $LB(
- $LB("MedfeeSumamt","医疗费用总额"), $LB("OrdnMedServfee","一般医疗服务费"), $LB("OrdnTrtOprtFee","一般治疗操作费"),
- $LB("NursFee","护理费"), $LB("ComMedServOthFee","综合医疗服务其他费"), $LB("PalgDiagFee","病理诊断费"),
- $LB("LabDiagFee","实验室诊断费"), $LB("RdhyDiagFee","影像学诊断费"), $LB("ClncDiseFee","临床诊断项目费"),
- $LB("NsrgtrtItemFee","非手术治疗项目费"), $LB("ClncPhysTrtFee","临床物理治疗费"), $LB("RgtrtTrtFee","手术治疗费"),
- $LB("AnstFee","麻醉费"), $LB("RgtrtFee","手术费"), $LB("RhabFee","康复费"), $LB("TcmTrtFee","中医治疗费"),
- $LB("WmFee","西药费"), $LB("AbtlMednFee","抗菌药费"), $LB("TcmpatFee","中成药费"), $LB("TcmherbFee","中药饮片费"),
- $LB("BloFee","血费"), $LB("AlbuFee","白蛋白类制品费"), $LB("GlonFee","球蛋白类制品费"), $LB("ClotfacFee","凝血因子类制品费"),
- $LB("CykiFee","细胞因子类制品费"), $LB("ExamDspoMatlFee","检查用卫生材料费"), $LB("TrtDspoMatlFee","治疗用卫生材料费"),
- $LB("OprnDspoMatlFee","手术用卫生材料费"), $LB("OthFee","其他费"))
- set feeCount = $LL(feeList)
- set sel = "MR.HISAdmID AS admID"
- for fi = 1:1:feeCount {
- set sel = sel _ ", MR." _ $LI($LI(feeList, fi), 1) _ " AS " _ $LI($LI(feeList, fi), 1)
- }
- set sc = sqlObj.%Prepare("SELECT " _ sel _ " FROM BS_DRGMedInsuMedicalRecord MR WHERE MR.HISAdmID IN (" _ inList _ ")")
- if ('$$$ISOK(sc)) {
- set resultObj = ..%HandleError("查询比对结算清单费用", "02010602", jsonObj, sc)
- quit
- }
- set rs = sqlObj.%Execute()
- kill settleVal, settleExists
- while (rs.%Next()) {
- set aid = rs.%Get("admID")
- set settleExists(aid) = 1
- for fi = 1:1:feeCount {
- set settleVal(aid, $LI($LI(feeList, fi), 1)) = +rs.%Get($LI($LI(feeList, fi), 1))
- }
- }
- set settleCaseCount = 0
- for i = 0:1:(n - 1) {
- if ($get(settleExists(admIds.%Get(i))) = 1) set settleCaseCount = settleCaseCount + 1
- }
- set settleSummary = []
- for fi = 1:1:feeCount {
- set f = $LI($LI(feeList, fi), 1)
- set fname = $LI($LI(feeList, fi), 2)
- set baseVal = 0
- if (diffBase = "first") {
- set baseVal = +$get(settleVal(admIds.%Get(0), f), 0)
- } else {
- set cnt = 0
- for i = 0:1:(n - 1) {
- set aid = admIds.%Get(i)
- if ($get(settleExists(aid)) = 1) {
- set baseVal = baseVal + +$get(settleVal(aid, f), 0)
- set cnt = cnt + 1
- }
- }
- if (cnt > 0) set baseVal = baseVal / cnt
- }
- set cells = []
- set maxA = ""
- set minA = ""
- for i = 0:1:(n - 1) {
- set aid = admIds.%Get(i)
- set ex = ($get(settleExists(aid)) = 1)
- set val = +$get(settleVal(aid, f), 0)
- set d = ..%CalcDiff(val, baseVal, ex, settleCaseCount)
- set c = {}
- set c.admID = aid
- set c.value = val
- set c.diffFlag = $LI(d, 1)
- set c.diffAmount = $LI(d, 2)
- set c.diffRate = $LI(d, 3)
- do cells.%Push(c)
- if (ex) {
- if (maxA = "") || (val > maxA) set maxA = val
- if (minA = "") || (val < minA) set minA = val
- }
- }
- if (maxA = "") set maxA = 0
- if (minA = "") set minA = 0
- set row = {}
- set row.field = f
- set row.fieldName = fname
- set row.cells = cells
- set row.maxAmount = +$FN(maxA, "", 2)
- set row.minAmount = +$FN(minA, "", 2)
- set row.rangeAmount = +$FN(maxA - minA, "", 2)
- do settleSummary.%Push(row)
- }
- // ---------- SQL-D HIS 费用明细按项目 ----------
- set sc = sqlObj.%Prepare("SELECT FD.AdmID AS admID, FD.MedinsListCodg AS itemCode, MAX(FD.MedinsListDesc) AS itemName, SUM(COALESCE(FD.Cnt,0)) AS qty, SUM(COALESCE(FD.DetItemFeeSumamt,0)) AS amount FROM BS_HISFeeDetail FD WHERE FD.AdmID IN (" _ inList _ ") AND FD.Deleted = 0 AND (FD.ValidFlag IS NULL OR FD.ValidFlag <> 'N') GROUP BY FD.AdmID, FD.MedinsListCodg")
- if ('$$$ISOK(sc)) {
- set resultObj = ..%HandleError("查询比对费用明细项目", "02010602", jsonObj, sc)
- quit
- }
- set rs = sqlObj.%Execute()
- kill itemNameOf, ex, vl, qt
- while (rs.%Next()) {
- set aid = rs.%Get("admID")
- set code = rs.%Get("itemCode")
- if (code = "") set code = "#NONE#"
- set nm = rs.%Get("itemName")
- if ('$data(itemNameOf(code))) set itemNameOf(code) = nm
- if (nm '= "") set itemNameOf(code) = nm
- set ex(code, aid) = 1
- set vl(code, aid) = +rs.%Get("amount")
- set qt(code, aid) = +rs.%Get("qty")
- }
- kill rowKey, rowName
- set rowCount = 0
- set code = ""
- for {
- set code = $ORDER(itemNameOf(code))
- quit:(code = "")
- set rowCount = rowCount + 1
- set rowKey(rowCount) = code
- set rowName(rowCount) = itemNameOf(code)
- }
- set feeItem = ..%BuildMatrix(.rowKey, .rowName, .ex, .vl, .qt, admIds, diffBase, 500, .itemTruncated)
- // ---------- SQL-E 结算类别聚合 ----------
- set sc = sqlObj.%Prepare("SELECT FD.AdmID AS admID, FD.EcCode AS catCode, MAX(FD.EcDesc) AS catName, SUM(COALESCE(FD.Cnt,0)) AS qty, SUM(COALESCE(FD.DetItemFeeSumamt,0)) AS amount FROM BS_HISFeeDetail FD WHERE FD.AdmID IN (" _ inList _ ") AND FD.Deleted = 0 AND (FD.ValidFlag IS NULL OR FD.ValidFlag <> 'N') GROUP BY FD.AdmID, FD.EcCode, FD.EcDesc")
- if ('$$$ISOK(sc)) {
- set resultObj = ..%HandleError("查询比对结算类别", "02010602", jsonObj, sc)
- quit
- }
- set rs = sqlObj.%Execute()
- kill itemNameOf, ex, vl, qt
- while (rs.%Next()) {
- set aid = rs.%Get("admID")
- set code = rs.%Get("catCode")
- set nm = rs.%Get("catName")
- if (code = "") { set code = "#NONE#" if (nm = "") set nm = "未分类" }
- if ('$data(itemNameOf(code))) set itemNameOf(code) = nm
- if (nm '= "") set itemNameOf(code) = nm
- set ex(code, aid) = 1
- set vl(code, aid) = +$get(vl(code, aid), 0) + +rs.%Get("amount")
- set qt(code, aid) = +$get(qt(code, aid), 0) + +rs.%Get("qty")
- }
- kill rowKey, rowName
- set rowCount = 0
- set code = ""
- for {
- set code = $ORDER(itemNameOf(code))
- quit:(code = "")
- set rowCount = rowCount + 1
- set rowKey(rowCount) = code
- set rowName(rowCount) = itemNameOf(code)
- }
- set catTruncated = 0
- set feeCategory = ..%BuildMatrix(.rowKey, .rowName, .ex, .vl, .qt, admIds, diffBase, 0, .catTruncated)
- // ---------- SQL-F 诊断比对(BS_HISDiseInfo 无 Deleted 字段,不做作废过滤) ----------
- kill diagNameOf, diagEx, diagMain
- set sc = sqlObj.%Prepare("SELECT AdmID, DiagCode, DiagName, MainFlag FROM BS_HISDiseInfo WHERE AdmID IN (" _ inList _ ")")
- if ('$$$ISOK(sc)) {
- set resultObj = ..%HandleError("查询比对诊断信息", "02010602", jsonObj, sc)
- quit
- }
- set rs = sqlObj.%Execute()
- while (rs.%Next()) {
- set aid = rs.%Get("AdmID")
- set dc = rs.%Get("DiagCode")
- if (dc = "") continue
- set nm = rs.%Get("DiagName")
- if ('$data(diagNameOf(dc))) set diagNameOf(dc) = nm
- if (nm '= "") set diagNameOf(dc) = nm
- set diagEx(dc, aid) = 1
- if (+rs.%Get("MainFlag") = 1) set diagMain(dc, aid) = 1
- }
- set diagnoses = []
- set dc = ""
- for {
- set dc = $ORDER(diagNameOf(dc))
- quit:(dc = "")
- set marks = []
- for i = 0:1:(n - 1) {
- set aid = admIds.%Get(i)
- set m = {}
- set m.admID = aid
- set m.exists = ($get(diagEx(dc, aid)) = 1)
- set m.isMain = ($get(diagMain(dc, aid)) = 1)
- do marks.%Push(m)
- }
- set dr = {}
- set dr.diagCode = dc
- set dr.diagName = diagNameOf(dc)
- set dr.marks = marks
- do diagnoses.%Push(dr)
- }
- // ---------- SQL-G 手术比对(BS_HISOprnInfo 无 Deleted 字段,不做作废过滤) ----------
- kill oprnNameOf, oprnEx, oprnMain
- set sc = sqlObj.%Prepare("SELECT AdmID, OprnCode, OprnName, MainFlag FROM BS_HISOprnInfo WHERE AdmID IN (" _ inList _ ")")
- if ('$$$ISOK(sc)) {
- set resultObj = ..%HandleError("查询比对手术信息", "02010602", jsonObj, sc)
- quit
- }
- set rs = sqlObj.%Execute()
- while (rs.%Next()) {
- set aid = rs.%Get("AdmID")
- set oc = rs.%Get("OprnCode")
- if (oc = "") continue
- set nm = rs.%Get("OprnName")
- if ('$data(oprnNameOf(oc))) set oprnNameOf(oc) = nm
- if (nm '= "") set oprnNameOf(oc) = nm
- set oprnEx(oc, aid) = 1
- if (rs.%Get("MainFlag") = "Y") set oprnMain(oc, aid) = 1
- }
- set operations = []
- set oc = ""
- for {
- set oc = $ORDER(oprnNameOf(oc))
- quit:(oc = "")
- set marks = []
- for i = 0:1:(n - 1) {
- set aid = admIds.%Get(i)
- set m = {}
- set m.admID = aid
- set m.exists = ($get(oprnEx(oc, aid)) = 1)
- set m.isMain = ($get(oprnMain(oc, aid)) = 1)
- do marks.%Push(m)
- }
- set orow = {}
- set orow.oprnCode = oc
- set orow.oprnName = oprnNameOf(oc)
- set orow.marks = marks
- do operations.%Push(orow)
- }
- // ---------- 文字比对分析报告 ----------
- set reportText = ..%BuildReportText(visits, drgPayment, settleSummary, feeItem, diagnoses, operations, itemTruncated)
- set analysis = {}
- set analysis.reportText = reportText
- set out = {}
- set out.visits = visits
- set out.drgPayment = drgPayment
- set out.settleSummary = settleSummary
- set out.feeItem = feeItem
- set out.feeCategory = feeCategory
- set out.diagnoses = diagnoses
- set out.operations = operations
- set out.analysis = analysis
- set resultObj.result = out
- }
- catch(e)
- {
- set resultObj = ..%HandleError("病组费用比对", "02010602", jsonObj, e.AsStatus())
- }
- quit resultObj
- }
- /// Description: 由并集行键构建比对矩阵(应用层降序排序 + TopN 截断)
- /// rowKey(k)=行键、rowName(k)=行名(k=1..rowCount)
- /// ex(key,admID)=1 表示该例存在该行;vl(key,admID)=金额;qt(key,admID)=数量
- /// topN>0 时仅保留各例金额最大值最高的 topN 行,并置 truncated=1
- /// 注:本环境不支持 ORDER BY 聚合表达式,排序一律在应用层用下标数组完成
- ClassMethod %BuildMatrix(ByRef rowKey, ByRef rowName, ByRef ex, ByRef vl, ByRef qt, admIds As %Library.DynamicArray, diffBase As %String, topN As %Integer, ByRef truncated) As %Library.DynamicArray
- {
- new out, rowCount, n, i, k, key, baseVal, cnt, aid, val, existsCount, cells, c, d, maxA, minA, row, maxV, t, sMax, skey, take, done, e
- set truncated = 0
- set out = []
- set n = admIds.%Size()
- set rowCount = 0
- set k = ""
- for {
- set k = $ORDER(rowKey(k))
- quit:(k = "")
- set rowCount = rowCount + 1
- }
- if (rowCount = 0) quit out
- kill sortIdx
- for k = 1:1:rowCount {
- set key = rowKey(k)
- set maxV = 0
- for i = 0:1:(n - 1) {
- set aid = admIds.%Get(i)
- if ($get(ex(key, aid)) = 1) {
- set t = +$get(vl(key, aid), 0)
- if (t > maxV) set maxV = t
- }
- }
- set sortIdx(maxV, k) = k
- }
- set take = 0
- set done = 0
- set sMax = ""
- for {
- quit:done
- set sMax = $ORDER(sortIdx(sMax), -1)
- quit:(sMax = "")
- set skey = ""
- for {
- quit:done
- set skey = $ORDER(sortIdx(sMax, skey), 1)
- quit:(skey = "")
- if ((topN > 0) && (take >= topN)) { set truncated = 1 set done = 1 quit }
- set k = sortIdx(sMax, skey)
- set key = rowKey(k)
- set existsCount = 0
- for i = 0:1:(n - 1) {
- set aid = admIds.%Get(i)
- if ($get(ex(key, aid)) = 1) set existsCount = existsCount + 1
- }
- set baseVal = 0
- if (diffBase = "first") {
- set baseVal = +$get(vl(key, admIds.%Get(0)), 0)
- } else {
- set cnt = 0
- for i = 0:1:(n - 1) {
- set aid = admIds.%Get(i)
- if ($get(ex(key, aid)) = 1) {
- set baseVal = baseVal + +$get(vl(key, aid), 0)
- set cnt = cnt + 1
- }
- }
- if (cnt > 0) set baseVal = baseVal / cnt
- }
- set cells = []
- set maxA = ""
- set minA = ""
- for i = 0:1:(n - 1) {
- set aid = admIds.%Get(i)
- set e = ($get(ex(key, aid)) = 1)
- set val = +$get(vl(key, aid), 0)
- set d = ..%CalcDiff(val, baseVal, e, existsCount)
- set c = {}
- set c.admID = aid
- set c.value = val
- set c.qty = +$get(qt(key, aid), 0)
- set c.diffFlag = $LI(d, 1)
- set c.diffAmount = $LI(d, 2)
- set c.diffRate = $LI(d, 3)
- do cells.%Push(c)
- if (e) {
- if (maxA = "") || (val > maxA) set maxA = val
- if (minA = "") || (val < minA) set minA = val
- }
- }
- if (maxA = "") set maxA = 0
- if (minA = "") set minA = 0
- set row = {}
- set row.key = key
- set row.name = $get(rowName(k), "")
- set row.cells = cells
- set row.maxAmount = +$FN(maxA, "", 2)
- set row.minAmount = +$FN(minA, "", 2)
- set row.rangeAmount = +$FN(maxA - minA, "", 2)
- do out.%Push(row)
- set take = take + 1
- }
- }
- quit out
- }
- /// Description: 拼装中文文字比对分析报告(段落数组)
- /// 段落顺序:结论摘要 / 费用总览 / 结构差异 Top5 / 诊断与手术差异 / 支付标准与盈亏
- /// / [跨病组比对提示] / [风险提示] / [明细截断说明]
- ClassMethod %BuildReportText(visits As %Library.DynamicArray, drgPayment As %Library.DynamicArray, settleSummary As %Library.DynamicArray, feeItem As %Library.DynamicArray, diagnoses As %Library.DynamicArray, operations As %Library.DynamicArray, itemTruncated As %Boolean) As %Library.DynamicArray
- {
- new txt, n, i, mi, ri, v, p, c, r, dr, orow, mk, maxV, minV, maxIdx, minIdx, sumFee, avgFee, s, drgCount, dc, sMax, skey, take, overList, overCnt, onlyList, onlyCnt, onlyIdx, onlyFlag, sameDiag, sameOprn, firstDiag, firstOprn, aid
- set txt = []
- set n = visits.%Size()
- if (n = 0) quit txt
- // 段落 1 结论摘要
- set maxV = visits.%Get(0).medfeeSumamt
- set minV = visits.%Get(0).medfeeSumamt
- set maxIdx = 0
- set minIdx = 0
- set sumFee = 0
- for i = 0:1:(n - 1) {
- set v = visits.%Get(i)
- set sumFee = sumFee + v.medfeeSumamt
- if (v.medfeeSumamt > maxV) { set maxV = v.medfeeSumamt set maxIdx = i }
- if (v.medfeeSumamt < minV) { set minV = v.medfeeSumamt set minIdx = i }
- }
- set s = "【结论摘要】本次共比对 " _ n _ " 例就诊。总费用最高为第 " _ (maxIdx + 1) _ " 例(" _ visits.%Get(maxIdx).patName _ "," _ $FN(maxV, "", 2) _ " 元),"
- set s = s _ "最低为第 " _ (minIdx + 1) _ " 例(" _ visits.%Get(minIdx).patName _ "," _ $FN(minV, "", 2) _ " 元),差额 " _ $FN(maxV - minV, "", 2) _ " 元"
- if (minV > 0) set s = s _ ",倍差 " _ $FN(maxV / minV, "", 2) _ " 倍"
- set s = s _ "。"
- do txt.%Push(s)
- // 段落 2 费用总览
- set avgFee = sumFee / n
- set s = "【费用总览】"
- for i = 0:1:(n - 1) {
- set v = visits.%Get(i)
- set s = s _ "第" _ (i + 1) _ "例 " _ v.patName _ "(就诊号 " _ v.admID _ "):" _ $FN(v.medfeeSumamt, "", 2) _ " 元,住院 " _ v.iptDays _ " 天;"
- }
- set s = s _ "例均费用 " _ $FN(avgFee, "", 2) _ " 元。"
- do txt.%Push(s)
- // 段落 3 结构差异 Top5(按结算清单费用项极差降序)
- kill sortIdx
- for ri = 0:1:(settleSummary.%Size() - 1) {
- set r = settleSummary.%Get(ri)
- set sortIdx(r.rangeAmount, ri) = ri
- }
- set s = "【结构差异 Top5】按结算清单费用项极差降序:"
- set take = 0
- set sMax = ""
- for {
- set sMax = $ORDER(sortIdx(sMax), -1)
- quit:(sMax = "")
- quit:(take >= 5)
- set skey = ""
- for {
- set skey = $ORDER(sortIdx(sMax, skey), 1)
- quit:(skey = "")
- quit:(take >= 5)
- if (sMax <= 0) continue
- set r = settleSummary.%Get(sortIdx(sMax, skey))
- set s = s _ "|" _ r.fieldName _ " 极差 " _ $FN(r.rangeAmount, "", 2) _ " 元("
- for i = 0:1:(r.cells.%Size() - 1) {
- set c = r.cells.%Get(i)
- set s = s _ $FN(c.value, "", 2)
- if (i < (r.cells.%Size() - 1)) set s = s _ " / "
- }
- set s = s _ ")"
- set take = take + 1
- }
- }
- if (take = 0) set s = s _ "各例结算清单费用项无差异"
- set s = s _ "。"
- do txt.%Push(s)
- // 段落 4 诊断与手术差异
- kill mainDiagOf, mainOprnOf
- for i = 0:1:(diagnoses.%Size() - 1) {
- set dr = diagnoses.%Get(i)
- for mi = 0:1:(dr.marks.%Size() - 1) {
- set mk = dr.marks.%Get(mi)
- if (mk.isMain = 1) set mainDiagOf(mk.admID) = dr.diagCode _ " " _ dr.diagName
- }
- }
- for i = 0:1:(operations.%Size() - 1) {
- set orow = operations.%Get(i)
- for mi = 0:1:(orow.marks.%Size() - 1) {
- set mk = orow.marks.%Get(mi)
- if (mk.isMain = 1) set mainOprnOf(mk.admID) = orow.oprnCode _ " " _ orow.oprnName
- }
- }
- set firstDiag = $get(mainDiagOf(visits.%Get(0).admID), "")
- set firstOprn = $get(mainOprnOf(visits.%Get(0).admID), "")
- set sameDiag = 1
- set sameOprn = 1
- for i = 0:1:(n - 1) {
- set aid = visits.%Get(i).admID
- if ($get(mainDiagOf(aid)) '= firstDiag) set sameDiag = 0
- if ($get(mainOprnOf(aid)) '= firstOprn) set sameOprn = 0
- }
- set s = "【诊断与手术差异】主诊断"
- if (sameDiag) {
- set s = s _ "一致:" _ firstDiag
- } else {
- set s = s _ "不一致:"
- for i = 0:1:(n - 1) {
- set v = visits.%Get(i)
- set s = s _ "第" _ (i + 1) _ "例 " _ $get(mainDiagOf(v.admID), "无") _ ";"
- }
- }
- set s = s _ "。主手术"
- if (sameOprn) {
- set s = s _ "一致:" _ firstOprn
- } else {
- set s = s _ "不一致:"
- for i = 0:1:(n - 1) {
- set v = visits.%Get(i)
- set s = s _ "第" _ (i + 1) _ "例 " _ $get(mainOprnOf(v.admID), "无") _ ";"
- }
- }
- set s = s _ "。"
- do txt.%Push(s)
- // 段落 5 支付标准与盈亏
- set s = "【支付标准与盈亏】"
- for i = 0:1:(drgPayment.%Size() - 1) {
- set p = drgPayment.%Get(i)
- set s = s _ "第" _ (i + 1) _ "例 " _ p.drgCode _ " " _ p.drgName _ ":支付标准 " _ $FN(p.payStandard, "", 2) _ " 元,实际费用 " _ $FN(p.totalFee, "", 2) _ " 元,盈亏 " _ $FN(p.profitAmount, "", 2) _ " 元(" _ $FN(p.profitRate, "", 2) _ "%);"
- }
- set s = s _ "。"
- do txt.%Push(s)
- // 跨病组比对提示(各例 DRG 不一致时强制输出)
- kill drgSet
- set drgCount = 0
- for i = 0:1:(drgPayment.%Size() - 1) {
- set dc = drgPayment.%Get(i).drgCode
- if (dc = "") continue
- if ('$data(drgSet(dc))) { set drgSet(dc) = 1 set drgCount = drgCount + 1 }
- }
- if (drgCount > 1) {
- do txt.%Push("【跨病组比对提示】本次比对的就诊分属 " _ drgCount _ " 个不同 DRG 病组,费用结构差异受病组差异影响,上述结论仅供参考,请结合各病组支付标准分别评估。")
- }
- // 段落 6 风险提示(无风险项时不输出)
- set overList = ""
- set overCnt = 0
- for i = 0:1:(drgPayment.%Size() - 1) {
- set p = drgPayment.%Get(i)
- if (p.totalFee > p.payStandard) {
- set overCnt = overCnt + 1
- if (overList '= "") set overList = overList _ ";"
- set overList = overList _ "第" _ (i + 1) _ "例超支 " _ $FN(p.totalFee - p.payStandard, "", 2) _ " 元(" _ $FN($select(p.payStandard > 0 : ((p.totalFee - p.payStandard) / p.payStandard) * 100, 1 : 0), "", 2) _ "%)"
- }
- }
- set onlyList = ""
- set onlyCnt = 0
- for ri = 0:1:(feeItem.%Size() - 1) {
- set r = feeItem.%Get(ri)
- set onlyIdx = -1
- set onlyFlag = 1
- for i = 0:1:(r.cells.%Size() - 1) {
- set c = r.cells.%Get(i)
- if (c.value > 0) {
- if (onlyIdx = -1) { set onlyIdx = i } else { set onlyFlag = 0 }
- }
- }
- if (onlyFlag && (onlyIdx >= 0)) {
- set c = r.cells.%Get(onlyIdx)
- if (c.value >= 5000) {
- set onlyCnt = onlyCnt + 1
- if (onlyList '= "") set onlyList = onlyList _ ";"
- set onlyList = onlyList _ "第" _ (onlyIdx + 1) _ "例独有「" _ r.name _ "」" _ $FN(c.value, "", 2) _ " 元"
- if (onlyCnt >= 5) quit
- }
- }
- }
- if ((overCnt > 0) || (onlyCnt > 0)) {
- set s = "【风险提示】"
- if (overCnt > 0) set s = s _ "超支病例 " _ overCnt _ " 例:" _ overList _ "。"
- if (onlyCnt > 0) set s = s _ "单边特有高值项目(≥5000 元):" _ onlyList _ "。"
- do txt.%Push(s)
- }
- // 明细截断说明
- if (itemTruncated = 1) {
- do txt.%Push("【说明】费用明细项目较多,仅展示金额 Top 500 项。")
- }
- quit txt
- }
- /// ============================================================
- /// 重复收费统计(02010603 / 02010604 / 02010605)
- /// 判定口径:分组键 = 就诊号 | 费用日期(YYYY-MM-DD) | 收费项目编码 MedinsListCodg
- /// 组内记录数 >= dupTimes(默认 2)判定为重复
- /// 仅 DetItemFeeSumamt >= 0 且 MedinsListCodg 非空的记录参与判定(排除退费)
- /// 金额口径:dupAmountMode = excess(默认)重复金额 = 组内总额 * (次数-1) / 次数
- /// total 重复金额 = 组内总额
- /// 比重口径:dupRatioOfCategory 分母为该收费类型全部有效明细金额(含退费)
- /// dupRatioOfTotal 分母为查询范围内全部有效明细金额(含退费)
- /// ============================================================
- /// Description: 构建重复收费统计的公共过滤条件(02010603 / 02010604 共用)
- /// 基础口径:FD.Deleted = 0 AND (FD.ValidFlag IS NULL OR FD.ValidFlag <> 'N')
- /// MR 基准(任何日期口径都必须附加):存在病案首页且 DRG 非空(已分组)
- /// dupOnly = 1:追加重复判定过滤(金额 >= 0 且项目编码非空,排除退费)
- /// dateType:adm -> MR.AdmDate / discharge -> MR.DscgDate / fee -> FD.FeeOcurTime
- ClassMethod %BuildDupWhere(params As %Library.DynamicObject, dupOnly As %Integer) As %String
- {
- new w, v, dateType
- set w = " WHERE FD.Deleted = 0 AND (FD.ValidFlag IS NULL OR FD.ValidFlag <> 'N')"
- set w = w _ " AND EXISTS (SELECT 1 FROM BS_DRGMedInsuMedicalRecord MR WHERE MR.HISAdmID = FD.AdmID AND (MR.ValiFlag IS NULL OR MR.ValiFlag <> '0') AND MR.DRG IS NOT NULL AND MR.DRG <> '')"
- if (dupOnly = 1) set w = w _ " AND FD.DetItemFeeSumamt >= 0 AND (FD.MedinsListCodg IS NOT NULL AND FD.MedinsListCodg <> '')"
- set v = params.fixmedinsCode
- if (v '= "") set w = w _ " AND FD.FixmedinsCode = '" _ $REPLACE(v, "'", "") _ "'"
- set v = params.admID
- if (v '= "") set w = w _ " AND FD.AdmID = '" _ $REPLACE(v, "'", "") _ "'"
- set v = params.patName
- if (v '= "") set w = w _ " AND FD.PatName LIKE '%" _ $REPLACE(v, "'", "") _ "%'"
- set v = params.itemCodeOrName
- if (v '= "") set w = w _ " AND (FD.MedinsListCodg = '" _ $REPLACE(v, "'", "") _ "' OR FD.MedinsListDesc LIKE '%" _ $REPLACE(v, "'", "") _ "%')"
- set v = params.ecCode
- if (v '= "") set w = w _ " AND FD.EcCode = '" _ $REPLACE(v, "'", "") _ "'"
- set v = params.deptName
- if (v '= "") set w = w _ " AND FD.BilgDeptName LIKE '%" _ $REPLACE(v, "'", "") _ "%'"
- set dateType = params.dateType
- set v = params.startDate
- if (v '= "") {
- if (dateType = "fee") {
- set w = w _ " AND FD.FeeOcurTime >= '" _ $REPLACE(v, "'", "") _ " 00:00:00'"
- } elseif (dateType = "discharge") {
- set w = w _ " AND EXISTS (SELECT 1 FROM BS_DRGMedInsuMedicalRecord m WHERE m.HISAdmID = FD.AdmID AND m.DscgDate >= '" _ $REPLACE(v, "'", "") _ "')"
- } else {
- set w = w _ " AND EXISTS (SELECT 1 FROM BS_DRGMedInsuMedicalRecord m WHERE m.HISAdmID = FD.AdmID AND m.AdmDate >= '" _ $REPLACE(v, "'", "") _ "')"
- }
- }
- set v = params.endDate
- if (v '= "") {
- if (dateType = "fee") {
- set w = w _ " AND FD.FeeOcurTime <= '" _ $REPLACE(v, "'", "") _ " 23:59:59'"
- } elseif (dateType = "discharge") {
- set w = w _ " AND EXISTS (SELECT 1 FROM BS_DRGMedInsuMedicalRecord m WHERE m.HISAdmID = FD.AdmID AND m.DscgDate <= '" _ $REPLACE(v, "'", "") _ " 23:59:59')"
- } else {
- set w = w _ " AND EXISTS (SELECT 1 FROM BS_DRGMedInsuMedicalRecord m WHERE m.HISAdmID = FD.AdmID AND m.AdmDate <= '" _ $REPLACE(v, "'", "") _ " 23:59:59')"
- }
- }
- quit w
- }
- /// Description: 重复金额折算
- /// total = 组内全部金额
- /// excess = 组内总额 * (次数 - 1) / 次数(按均价保留一次,其余视为多收)
- ClassMethod %CalcDupAmount(amount As %Numeric, times As %Integer, mode As %String) As %Numeric
- {
- if (times <= 1) quit 0
- if (mode = "total") quit +$FN(amount, "", 2)
- quit +$FN((amount * (times - 1)) / times, "", 2)
- }
- /// Description: 重复数量折算(语义同 %CalcDupAmount)
- ClassMethod %CalcDupQty(qty As %Numeric, times As %Integer, mode As %String) As %Numeric
- {
- if (times <= 1) quit 0
- if (mode = "total") quit +$FN(qty, "", 2)
- quit +$FN((qty * (times - 1)) / times, "", 2)
- }
- /// Description: 百分比计算(分母为 0 时返回 0),保留两位小数
- ClassMethod %Ratio(molecule As %Numeric, denominator As %Numeric) As %Numeric
- {
- if (denominator = 0) quit 0
- quit +$FN((molecule / denominator) * 100, "", 2)
- }
- /// Description: 重复收费排序列的定长排序键(16 位补零,保证字符串序 = 数值序且永不为 "")
- ClassMethod %SortKey(amount As %Numeric) As %String
- {
- quit $TRANSLATE($JUSTIFY($FN(amount * 100, "", 0), 16), " ", "0")
- }
- /// Description: 构建命中重复组(02010603 / 02010604 共用)
- /// 分组键 dk = 就诊号 | 费用日期(YYYY-MM-DD) | 收费项目编码 MedinsListCodg
- /// 两段式:SQL-1 按 (就诊, 项目编码) 预筛候选 -> SQL-2 按就诊分批回捞明细 -> 应用层按自然日归并
- /// ByRef out 输出:
- /// out("hitCnt") / out("truncated")
- /// out("hit", n) = dk(按重复金额降序)
- /// out("adm"/"date"/"code"/"name"/"cat"/"catName"/"times"/"qty"/"amt"/"dupAmt"/"dupQty", dk)
- /// out("admList", n) = 命中涉及的就诊号
- /// @return 命中组数(截断后);-1 表示 SQL 预编译失败
- ClassMethod %BuildDupGroups(params As %Library.DynamicObject, dupTimes As %Integer, dupAmountMode As %String, ByRef out) As %Integer
- {
- new (params, dupTimes, dupAmountMode, out)
- set w = ..%BuildDupWhere(params, 1)
- set sqlObj = ##class(%SQL.Statement).%New(1)
- set sc = sqlObj.%Prepare("SELECT FD.AdmID AS admID, FD.MedinsListCodg AS itemCode, COUNT(*) AS recCnt FROM BS_HISFeeDetail FD" _ w _ " GROUP BY FD.AdmID, FD.MedinsListCodg")
- if ('$$$ISOK(sc)) quit -1
- set rs = sqlObj.%Execute()
- set admCnt = 0
- while (rs.%Next()) {
- if (rs.%Get("recCnt") < dupTimes) continue
- set admCnt = admCnt + 1
- set admArr(rs.%Get("admID")) = 1
- }
- set out("hitCnt") = 0
- set out("truncated") = 0
- if (admCnt = 0) quit 0
- set seq = 0
- set admID = ""
- set batchCnt = 0
- set inList = ""
- set errFlag = 0
- set done = 0
- while ('done) {
- set admID = $ORDER(admArr(admID))
- if (admID '= "") {
- set batchCnt = batchCnt + 1
- if (inList '= "") set inList = inList _ ","
- set inList = inList _ "'" _ $REPLACE(admID, "'", "") _ "'"
- }
- if ((admID = "") || (batchCnt >= 200)) {
- if (inList '= "") {
- set sc = sqlObj.%Prepare("SELECT FD.AdmID AS admID, FD.MedinsListCodg AS itemCode, FD.MedinsListDesc AS itemName, FD.EcCode AS catCode, FD.EcDesc AS catName, FD.Cnt AS cnt, FD.DetItemFeeSumamt AS amount, FD.FeeOcurTime AS feeOcurTime FROM BS_HISFeeDetail FD" _ w _ " AND FD.AdmID IN (" _ inList _ ")")
- if ('$$$ISOK(sc)) {
- set errFlag = 1
- } else {
- set rs = sqlObj.%Execute()
- while (rs.%Next()) {
- set admID2 = rs.%Get("admID")
- set itemCode = rs.%Get("itemCode")
- set itemName = rs.%Get("itemName")
- set catCode = rs.%Get("catCode")
- set catName = rs.%Get("catName")
- set cnt = +rs.%Get("cnt")
- set amount = +rs.%Get("amount")
- set feeOcurTime = rs.%Get("feeOcurTime")
- set fd = $EXTRACT(feeOcurTime, 1, 10)
- set dk = admID2 _ "|" _ fd _ "|" _ itemCode
- set t = $INCREMENT(out("times", dk))
- if (t = 1) {
- set seq = seq + 1
- set out("seq", seq) = dk
- set out("adm", dk) = admID2
- set out("date", dk) = fd
- set out("code", dk) = itemCode
- set out("name", dk) = itemName
- set out("cat", dk) = catCode
- set out("catName", dk) = catName
- set out("qty", dk) = 0
- set out("amt", dk) = 0
- }
- set out("qty", dk) = out("qty", dk) + cnt
- set out("amt", dk) = out("amt", dk) + amount
- if (itemName '= "") set out("name", dk) = itemName
- if (catCode '= "") {
- set out("cat", dk) = catCode
- set out("catName", dk) = catName
- }
- }
- }
- set inList = ""
- set batchCnt = 0
- }
- if (admID = "") set done = 1
- }
- if (errFlag) set done = 1
- }
- if (errFlag) quit -1
- set dk = ""
- set done = 0
- while ('done) {
- set dk = $ORDER(out("times", dk))
- if (dk = "") {
- set done = 1
- } else {
- if (out("times", dk) >= dupTimes) {
- set dupAmt = ..%CalcDupAmount(out("amt", dk), out("times", dk), dupAmountMode)
- set out("dupAmt", dk) = dupAmt
- set out("dupQty", dk) = ..%CalcDupQty(out("qty", dk), out("times", dk), dupAmountMode)
- set sk = ..%SortKey(dupAmt)
- set sortIdx(sk, dk) = ""
- }
- }
- }
- set hitCnt = 0
- set admN = 0
- set done = 0
- set sk = ""
- while ('done) {
- set sk = $ORDER(sortIdx(sk), -1)
- if (sk = "") {
- set done = 1
- } else {
- set dk2 = ""
- set done2 = 0
- while ('done2) {
- set dk2 = $ORDER(sortIdx(sk, dk2))
- if (dk2 = "") {
- set done2 = 1
- } else {
- if (hitCnt >= 2000) {
- set out("truncated") = 1
- set done2 = 1
- set done = 1
- } else {
- set hitCnt = hitCnt + 1
- set out("hit", hitCnt) = dk2
- set m = $INCREMENT(admSeen(out("adm", dk2)))
- if (m = 1) {
- set admN = admN + 1
- set out("admList", admN) = out("adm", dk2)
- }
- }
- }
- }
- }
- }
- set out("hitCnt") = hitCnt
- quit hitCnt
- }
- /// Creator: 系统
- /// CreatDate: 2026-09-17
- /// Description: 重复收费汇总统计(按收费项目类型/收费项目,含双比重与全局KPI)
- /// Code: 02010603
- /// Input: {"params":[{"fixmedinsCode":"","dateType":"adm","startDate":"","endDate":"",
- /// "dupTimes":2,"dupAmountMode":"excess","groupBy":"category",
- /// "admID":"","patName":"","itemCodeOrName":"","ecCode":"","deptName":""}]}
- /// Output: {errorCode:"0", errorMessage:"", result:{rows:[{groupCode,groupName,totalAmount,
- /// dupAmount,dupQty,dupRecordCount,dupItemCount,dupVisitCount,
- /// dupRatioOfCategory,dupRatioOfTotal}], statistics:{...}, message:""}}
- ClassMethod QueryDuplicateChargeSummary(jsonObj As %Library.DynamicObject) As %Library.DynamicObject
- {
- new (jsonObj)
- set resultObj = {"errorCode":"0","errorMessage":"","result":{}}
- try
- {
- if (jsonObj = "") || (jsonObj.params = "") {
- set resultObj = ..SetErrorResult("-1", "入参异常:缺少params参数或参数为空")
- quit
- }
- set params = jsonObj.params.%Get(0)
- set fixmedinsCode = params.fixmedinsCode
- set startDate = params.startDate
- set endDate = params.endDate
- set admIDIn = params.admID
- set patNameIn = params.patName
- if ((fixmedinsCode = "") && (startDate = "") && (endDate = "") && (admIDIn = "") && (patNameIn = "")) {
- set resultObj = ..SetErrorResult("-1", "查询条件不足:请至少提供机构代码、日期区间或就诊标识之一")
- quit
- }
- set dupTimes = $CASE(params.dupTimes, "" : 2, : +params.dupTimes)
- if (dupTimes < 2) set dupTimes = 2
- set dupAmountMode = $CASE(params.dupAmountMode, "total" : "total", : "excess")
- set groupBy = $CASE(params.groupBy, "item" : "item", : "category")
- set hitCnt = ..%BuildDupGroups(params, dupTimes, dupAmountMode, .out)
- if (hitCnt < 0) {
- set resultObj = ..SetErrorResult("-1", "重复收费统计失败:查询预编译异常,请稍后重试")
- quit
- }
- set w0 = ..%BuildDupWhere(params, 0)
- set sqlObj = ##class(%SQL.Statement).%New(1)
- set sc = sqlObj.%Prepare("SELECT COUNT(DISTINCT FD.AdmID) AS cnt FROM BS_HISFeeDetail FD" _ w0)
- if ('$$$ISOK(sc)) {
- set resultObj = ..%HandleError("重复收费汇总统计", "02010603", jsonObj, sc)
- quit
- }
- set rs = sqlObj.%Execute()
- set visitCount = 0
- if (rs.%Next()) set visitCount = +rs.%Get("cnt")
- set sc = sqlObj.%Prepare("SELECT SUM(COALESCE(FD.DetItemFeeSumamt,0)) AS totalAmount FROM BS_HISFeeDetail FD" _ w0)
- if ('$$$ISOK(sc)) {
- set resultObj = ..%HandleError("重复收费汇总统计", "02010603", jsonObj, sc)
- quit
- }
- set rs = sqlObj.%Execute()
- set totalAmount = 0
- if (rs.%Next()) set totalAmount = +rs.%Get("totalAmount")
- set rowCnt = 0
- set dupAmount = 0
- set dupRecordCount = 0
- set dupItemCount = 0
- set dupVisitCount = 0
- for hi = 1:1:hitCnt {
- set dk = out("hit", hi)
- if (groupBy = "item") {
- set rk = out("code", dk)
- set rname = out("name", dk)
- } else {
- set rk = out("cat", dk)
- set rname = out("catName", dk)
- }
- if (rname = "") set rname = "未分类"
- set t = $INCREMENT(rowSeen(rk))
- if (t = 1) {
- set rowCnt = rowCnt + 1
- set rowKey(rowCnt) = rk
- set rowName(rk) = rname
- set rowDupAmt(rk) = 0
- set rowDupQty(rk) = 0
- set rowRec(rk) = 0
- set rowItemCnt(rk) = 0
- set rowVisitCnt(rk) = 0
- set rowTotal(rk) = 0
- }
- set rowDupAmt(rk) = rowDupAmt(rk) + out("dupAmt", dk)
- set rowDupQty(rk) = rowDupQty(rk) + out("dupQty", dk)
- set rowRec(rk) = rowRec(rk) + out("times", dk)
- set m = $INCREMENT(rowItemSeen(rk, out("code", dk)))
- if (m = 1) set rowItemCnt(rk) = rowItemCnt(rk) + 1
- set m = $INCREMENT(rowVisitSeen(rk, out("adm", dk)))
- if (m = 1) set rowVisitCnt(rk) = rowVisitCnt(rk) + 1
- set dupAmount = dupAmount + out("dupAmt", dk)
- set dupRecordCount = dupRecordCount + out("times", dk)
- set m = $INCREMENT(admSeen(out("adm", dk)))
- if (m = 1) set dupVisitCount = dupVisitCount + 1
- set m = $INCREMENT(itemSeen(out("code", dk)))
- if (m = 1) set dupItemCount = dupItemCount + 1
- }
- if (groupBy = "item") {
- set sc = sqlObj.%Prepare("SELECT FD.MedinsListCodg AS gCode, SUM(COALESCE(FD.DetItemFeeSumamt,0)) AS gAmount FROM BS_HISFeeDetail FD" _ w0 _ " GROUP BY FD.MedinsListCodg")
- } else {
- set sc = sqlObj.%Prepare("SELECT FD.EcCode AS gCode, SUM(COALESCE(FD.DetItemFeeSumamt,0)) AS gAmount FROM BS_HISFeeDetail FD" _ w0 _ " GROUP BY FD.EcCode")
- }
- if ('$$$ISOK(sc)) {
- set resultObj = ..%HandleError("重复收费汇总统计", "02010603", jsonObj, sc)
- quit
- }
- set rs = sqlObj.%Execute()
- while (rs.%Next()) {
- set gk = rs.%Get("gCode")
- set rowTotal(gk) = +rs.%Get("gAmount")
- }
- for i = 1:1:rowCnt {
- set rk = rowKey(i)
- set sk = ..%SortKey(rowDupAmt(rk))
- set rowSort(sk, rk) = ""
- }
- set rows = []
- set done = 0
- set sk = ""
- while ('done) {
- set sk = $ORDER(rowSort(sk), -1)
- if (sk = "") {
- set done = 1
- } else {
- set rk2 = ""
- set done2 = 0
- while ('done2) {
- set rk2 = $ORDER(rowSort(sk, rk2))
- if (rk2 = "") {
- set done2 = 1
- } else {
- set r = {}
- set r.groupCode = rk2
- set r.groupName = rowName(rk2)
- set r.totalAmount = +$FN(rowTotal(rk2), "", 2)
- set r.dupAmount = +$FN(rowDupAmt(rk2), "", 2)
- set r.dupQty = +$FN(rowDupQty(rk2), "", 2)
- set r.dupRecordCount = rowRec(rk2)
- set r.dupItemCount = rowItemCnt(rk2)
- set r.dupVisitCount = rowVisitCnt(rk2)
- set r.dupRatioOfCategory = ..%Ratio(rowDupAmt(rk2), rowTotal(rk2))
- set r.dupRatioOfTotal = ..%Ratio(rowDupAmt(rk2), totalAmount)
- do rows.%Push(r)
- }
- }
- }
- }
- set stat = {}
- set stat.visitCount = visitCount
- set stat.dupVisitCount = dupVisitCount
- set stat.dupVisitRatio = ..%Ratio(dupVisitCount, visitCount)
- set stat.dupItemCount = dupItemCount
- set stat.dupGroupCount = hitCnt
- set stat.dupRecordCount = dupRecordCount
- set stat.totalAmount = +$FN(totalAmount, "", 2)
- set stat.dupAmount = +$FN(dupAmount, "", 2)
- set stat.dupRatioOfTotal = ..%Ratio(dupAmount, totalAmount)
- set resultObj.result.rows = rows
- set resultObj.result.total = hitCnt
- set resultObj.result.statistics = stat
- set resultObj.result.message = ""
- if (out("truncated") = 1) set resultObj.result.message = "命中重复组过多,仅展示重复金额最高的 2000 组,请缩小查询范围"
- }
- catch(e)
- {
- set resultObj = ..%HandleError("重复收费汇总统计", "02010603", jsonObj, e.AsStatus())
- }
- quit resultObj
- }
- /// Creator: 系统
- /// CreatDate: 2026-09-17
- /// Description: 重复收费明细查询(按重复组分页,同组同色号,同组不被跨页切断)
- /// Code: 02010604
- /// Input: {"params":[{...同 02010603}], "pagination":[{"pageSize":10,"currentPage":1}]}
- /// Output: {errorCode:"0", errorMessage:"", result:{rows:[{...dupGroupKey,colorIndex,times,
- /// amount,dupAmount,isDup,...}], total:N, statistics:{...}, message:""}}
- ClassMethod QueryDuplicateChargeDetail(jsonObj As %Library.DynamicObject) As %Library.DynamicObject
- {
- new (jsonObj)
- set resultObj = {"errorCode":"0","errorMessage":"","result":{}}
- try
- {
- if (jsonObj = "") || (jsonObj.params = "") {
- set resultObj = ..SetErrorResult("-1", "入参异常:缺少params参数或参数为空")
- quit
- }
- set params = jsonObj.params.%Get(0)
- set fixmedinsCode = params.fixmedinsCode
- set startDate = params.startDate
- set endDate = params.endDate
- set admIDIn = params.admID
- set patNameIn = params.patName
- if ((fixmedinsCode = "") && (startDate = "") && (endDate = "") && (admIDIn = "") && (patNameIn = "")) {
- set resultObj = ..SetErrorResult("-1", "查询条件不足:请至少提供机构代码、日期区间或就诊标识之一")
- quit
- }
- set dupTimes = $CASE(params.dupTimes, "" : 2, : +params.dupTimes)
- if (dupTimes < 2) set dupTimes = 2
- set dupAmountMode = $CASE(params.dupAmountMode, "total" : "total", : "excess")
- set pg = ..%GetPage(jsonObj)
- set hitCnt = ..%BuildDupGroups(params, dupTimes, dupAmountMode, .out)
- if (hitCnt < 0) {
- set resultObj = ..SetErrorResult("-1", "重复收费明细查询失败:查询预编译异常,请稍后重试")
- quit
- }
- set dupAmount = 0
- set dupRecordCount = 0
- set dupItemCount = 0
- set dupVisitCount = 0
- for hi = 1:1:hitCnt {
- set dk = out("hit", hi)
- set dupAmount = dupAmount + out("dupAmt", dk)
- set dupRecordCount = dupRecordCount + out("times", dk)
- set m = $INCREMENT(admSeen(out("adm", dk)))
- if (m = 1) set dupVisitCount = dupVisitCount + 1
- set m = $INCREMENT(itemSeen(out("code", dk)))
- if (m = 1) set dupItemCount = dupItemCount + 1
- }
- set w0 = ..%BuildDupWhere(params, 0)
- set sqlObj = ##class(%SQL.Statement).%New(1)
- set sc = sqlObj.%Prepare("SELECT COUNT(DISTINCT FD.AdmID) AS cnt FROM BS_HISFeeDetail FD" _ w0)
- if ('$$$ISOK(sc)) {
- set resultObj = ..%HandleError("重复收费明细查询", "02010604", jsonObj, sc)
- quit
- }
- set rs = sqlObj.%Execute()
- set visitCount = 0
- if (rs.%Next()) set visitCount = +rs.%Get("cnt")
- set sc = sqlObj.%Prepare("SELECT SUM(COALESCE(FD.DetItemFeeSumamt,0)) AS totalAmount FROM BS_HISFeeDetail FD" _ w0)
- if ('$$$ISOK(sc)) {
- set resultObj = ..%HandleError("重复收费明细查询", "02010604", jsonObj, sc)
- quit
- }
- set rs = sqlObj.%Execute()
- set totalAmount = 0
- if (rs.%Next()) set totalAmount = +rs.%Get("totalAmount")
- set startIdx = (pg.currentPage - 1) * pg.pageSize + 1
- if (startIdx < 1) set startIdx = 1
- set endIdx = startIdx + pg.pageSize - 1
- if (endIdx > hitCnt) set endIdx = hitCnt
- set rows = []
- if (startIdx <= endIdx) {
- set pageAdmN = 0
- for hi = startIdx:1:endIdx {
- set dk = out("hit", hi)
- set m = $INCREMENT(pageAdmSeen(out("adm", dk)))
- if (m = 1) {
- set pageAdmN = pageAdmN + 1
- set pageAdm(pageAdmN) = out("adm", dk)
- }
- }
- set inList = ""
- for i = 1:1:pageAdmN {
- set pName(pageAdm(i)) = ""
- set pMed(pageAdm(i)) = ""
- set pDrg(pageAdm(i)) = ""
- set pDrgN(pageAdm(i)) = ""
- set pDept(pageAdm(i)) = ""
- set pDoc(pageAdm(i)) = ""
- if (inList '= "") set inList = inList _ ","
- set inList = inList _ "'" _ $REPLACE(pageAdm(i), "'", "") _ "'"
- }
- set sc = sqlObj.%Prepare("SELECT MR.HISAdmID AS admID, MR.PsnName AS patName, MR.MedcasNo AS medcasNo, MR.DRG AS drgCode, MR.DRGDesc AS drgName, PA.InLocDesc AS deptName, PA.AdmDocDesc AS doctorName FROM BS_DRGMedInsuMedicalRecord MR LEFT JOIN BS_HISPatAdm PA ON PA.AdmID = MR.HISAdmID AND PA.Deleted = 0 WHERE MR.HISAdmID IN (" _ inList _ ")")
- if ('$$$ISOK(sc)) {
- set resultObj = ..%HandleError("重复收费明细查询", "02010604", jsonObj, sc)
- quit
- }
- set rs = sqlObj.%Execute()
- while (rs.%Next()) {
- set a = rs.%Get("admID")
- set pName(a) = rs.%Get("patName")
- set pMed(a) = rs.%Get("medcasNo")
- set pDrg(a) = rs.%Get("drgCode")
- set pDrgN(a) = rs.%Get("drgName")
- set pDept(a) = rs.%Get("deptName")
- set pDoc(a) = rs.%Get("doctorName")
- }
- set sc = sqlObj.%Prepare("SELECT FD.AdmID AS admID, FD.FeedetlSn AS feedetlSn, FD.MedinsListCodg AS itemCode, FD.MedinsListDesc AS itemName, FD.EcCode AS catCode, FD.EcDesc AS catName, FD.Spec AS spec, FD.Pric AS pric, FD.Cnt AS cnt, FD.DetItemFeeSumamt AS amount, FD.FeeOcurTime AS feeOcurTime, FD.BilgDeptName AS bilgDeptName, FD.OrdersDrName AS ordersDrName FROM BS_HISFeeDetail FD" _ w0 _ " AND FD.AdmID IN (" _ inList _ ")")
- if ('$$$ISOK(sc)) {
- set resultObj = ..%HandleError("重复收费明细查询", "02010604", jsonObj, sc)
- quit
- }
- set rs = sqlObj.%Execute()
- while (rs.%Next()) {
- set admID2 = rs.%Get("admID")
- set itemCode = rs.%Get("itemCode")
- set feeOcurTime = rs.%Get("feeOcurTime")
- set dk = admID2 _ "|" _ $EXTRACT(feeOcurTime, 1, 10) _ "|" _ itemCode
- set n = $INCREMENT(bTot(dk))
- if (n <= 30) {
- set bRow(dk, n) = $LB(rs.%Get("feedetlSn"), admID2, itemCode, rs.%Get("itemName"), rs.%Get("catCode"), rs.%Get("catName"), rs.%Get("spec"), +rs.%Get("pric"), +rs.%Get("cnt"), +rs.%Get("amount"), feeOcurTime, rs.%Get("bilgDeptName"), rs.%Get("ordersDrName"))
- }
- }
- for hi = startIdx:1:endIdx {
- set dk = out("hit", hi)
- set admID2 = out("adm", dk)
- set colorIndex = (hi - 1) # 8
- set gTimes = out("times", dk)
- set gAmt = out("amt", dk)
- set gDupAmt = out("dupAmt", dk)
- set tot = bTot(dk)
- set lim = tot
- if (lim > 30) set lim = 30
- for j = 1:1:lim {
- set lb = bRow(dk, j)
- set r = {}
- set r.dupGroupKey = dk
- set r.colorIndex = colorIndex
- set r.times = gTimes
- set r.amount = +$FN(gAmt, "", 2)
- set r.dupAmount = gDupAmt
- set r.isDup = 1
- if ($LG(lb, 10) < 0) set r.isDup = 0
- set r.isTip = 0
- set r.feedetlSn = $LG(lb, 1)
- set r.admID = $LG(lb, 2)
- set r.patName = pName($LG(lb, 2))
- set r.medcasNo = pMed($LG(lb, 2))
- set r.deptName = pDept($LG(lb, 2))
- set r.doctorName = pDoc($LG(lb, 2))
- set r.feeDate = out("date", dk)
- set r.medinsListCodg = $LG(lb, 3)
- set r.medinsListDesc = $LG(lb, 4)
- set r.ecCode = $LG(lb, 5)
- set r.ecDesc = $LG(lb, 6)
- if (r.ecDesc = "") set r.ecDesc = "未分类"
- set r.spec = $LG(lb, 7)
- set r.pric = +$FN($LG(lb, 8), "", 2)
- set r.cnt = +$FN($LG(lb, 9), "", 2)
- set r.detItemFeeSumamt = +$FN($LG(lb, 10), "", 2)
- set r.feeOcurTime = $LG(lb, 11)
- set r.bilgDeptName = $LG(lb, 12)
- set r.ordersDrName = $LG(lb, 13)
- set r.drgCode = pDrg($LG(lb, 2))
- set r.drgName = pDrgN($LG(lb, 2))
- do rows.%Push(r)
- }
- if (tot > 30) {
- set tr = {}
- set tr.isTip = 1
- set tr.dupGroupKey = dk
- set tr.colorIndex = colorIndex
- set tr.medinsListDesc = "…该组还有 " _ (tot - 30) _ " 条未展示"
- set tr.detItemFeeSumamt = 0
- set tr.cnt = 0
- do rows.%Push(tr)
- }
- }
- }
- set stat = {}
- set stat.visitCount = visitCount
- set stat.dupVisitCount = dupVisitCount
- set stat.dupVisitRatio = ..%Ratio(dupVisitCount, visitCount)
- set stat.dupItemCount = dupItemCount
- set stat.dupGroupCount = hitCnt
- set stat.dupRecordCount = dupRecordCount
- set stat.totalAmount = +$FN(totalAmount, "", 2)
- set stat.dupAmount = +$FN(dupAmount, "", 2)
- set stat.dupRatioOfTotal = ..%Ratio(dupAmount, totalAmount)
- set resultObj.result.rows = rows
- set resultObj.result.total = hitCnt
- set resultObj.result.statistics = stat
- set resultObj.result.message = ""
- if (out("truncated") = 1) set resultObj.result.message = "命中重复组过多,仅展示重复金额最高的 2000 组,请缩小查询范围"
- }
- catch(e)
- {
- set resultObj = ..%HandleError("重复收费明细查询", "02010604", jsonObj, e.AsStatus())
- }
- quit resultObj
- }
- /// Creator: 系统
- /// CreatDate: 2026-09-17
- /// Description: 单次就诊费用信息(明细 + 双维度汇总 + 重复分组统计),只读已落库数据、不触发 HIS 同步
- /// Code: 02010605
- /// Input: {"params":[{"admID":"","fixmedinsCode":"","dupTimes":2,"dupAmountMode":"excess"}]}
- /// Output: {errorCode:"0", errorMessage:"", result:{visit:{}, summaryByCategory:[],
- /// summaryByItem:[], dupGroups:[], rows:[], statistics:{}}}
- ClassMethod QueryVisitFeeDetail(jsonObj As %Library.DynamicObject) As %Library.DynamicObject
- {
- new (jsonObj)
- set resultObj = {"errorCode":"0","errorMessage":"","result":{}}
- try
- {
- if (jsonObj = "") || (jsonObj.params = "") {
- set resultObj = ..SetErrorResult("-1", "入参异常:缺少params参数或参数为空")
- quit
- }
- set params = jsonObj.params.%Get(0)
- set admID = params.admID
- if (admID = "") {
- set resultObj = ..SetErrorResult("-1", "缺少就诊号admID")
- quit
- }
- set dupTimes = $CASE(params.dupTimes, "" : 2, : +params.dupTimes)
- if (dupTimes < 2) set dupTimes = 2
- set dupAmountMode = $CASE(params.dupAmountMode, "total" : "total", : "excess")
- set fixmedinsCode = params.fixmedinsCode
- set admIDSql = $REPLACE(admID, "'", "")
- set fixSql = ""
- if (fixmedinsCode '= "") set fixSql = " AND MR.FixmedinsCode = '" _ $REPLACE(fixmedinsCode, "'", "") _ "'"
- set sqlObj = ##class(%SQL.Statement).%New(1)
- set sc = sqlObj.%Prepare("SELECT MR.HISAdmID AS admID, MR.PsnName AS patName, MR.MedcasNo AS medcasNo, MR.DRG AS drgCode, MR.DRGDesc AS drgName, MR.AdmDate AS admDate, MR.DscgDate AS dscgDate, MR.MedfeeSumamt AS medfeeSumamt, PA.InsuType AS insuType, PA.InLocDesc AS deptName, PA.AdmDocDesc AS doctorName FROM BS_DRGMedInsuMedicalRecord MR LEFT JOIN BS_HISPatAdm PA ON PA.AdmID = MR.HISAdmID AND PA.Deleted = 0 WHERE MR.HISAdmID = '" _ admIDSql _ "'" _ fixSql)
- if ('$$$ISOK(sc)) {
- set resultObj = ..%HandleError("查询单次就诊费用信息", "02010605", jsonObj, sc)
- quit
- }
- set rs = sqlObj.%Execute()
- set visit = {}
- if (rs.%Next()) {
- set visit.admID = rs.%Get("admID")
- set visit.patName = rs.%Get("patName")
- set visit.medcasNo = rs.%Get("medcasNo")
- set visit.drgCode = rs.%Get("drgCode")
- set visit.drgName = rs.%Get("drgName")
- set visit.admDate = rs.%Get("admDate")
- set visit.dscgDate = rs.%Get("dscgDate")
- set visit.medfeeSumamt = +rs.%Get("medfeeSumamt")
- set visit.insuType = ..%GetInsuTypeName(rs.%Get("insuType"))
- set visit.deptName = rs.%Get("deptName")
- set visit.doctorName = rs.%Get("doctorName")
- }
- set fixSql2 = ""
- if (fixmedinsCode '= "") set fixSql2 = " AND FD.FixmedinsCode = '" _ $REPLACE(fixmedinsCode, "'", "") _ "'"
- set sc = sqlObj.%Prepare("SELECT FD.FeedetlSn AS feedetlSn, FD.MedinsListCodg AS itemCode, FD.MedinsListDesc AS itemName, FD.EcCode AS catCode, FD.EcDesc AS catName, FD.Spec AS spec, FD.Pric AS pric, FD.Cnt AS cnt, FD.DetItemFeeSumamt AS amount, FD.FeeOcurTime AS feeOcurTime, FD.BilgDeptName AS bilgDeptName, FD.OrdersDrName AS ordersDrName FROM BS_HISFeeDetail FD WHERE FD.AdmID = '" _ admIDSql _ "' AND FD.Deleted = 0 AND (FD.ValidFlag IS NULL OR FD.ValidFlag <> 'N')" _ fixSql2)
- if ('$$$ISOK(sc)) {
- set resultObj = ..%HandleError("查询单次就诊费用信息", "02010605", jsonObj, sc)
- quit
- }
- set rs = sqlObj.%Execute()
- set rowN = 0
- while (rs.%Next()) {
- set rowN = rowN + 1
- set dRow(rowN) = $LB(rs.%Get("feedetlSn"), rs.%Get("itemCode"), rs.%Get("itemName"), rs.%Get("catCode"), rs.%Get("catName"), rs.%Get("spec"), +rs.%Get("pric"), +rs.%Get("cnt"), +rs.%Get("amount"), rs.%Get("feeOcurTime"), rs.%Get("bilgDeptName"), rs.%Get("ordersDrName"))
- }
- set totalAmount = 0
- set refundAmount = 0
- set dupAmount = 0
- set cN = 0
- set iN = 0
- set seq = 0
- for i = 1:1:rowN {
- set lb = dRow(i)
- set amount = $LG(lb, 9)
- set cnt = $LG(lb, 8)
- set totalAmount = totalAmount + amount
- if (amount < 0) set refundAmount = refundAmount + amount
- set ck = $LG(lb, 4)
- set cn = $LG(lb, 5)
- set t = $INCREMENT(cSeen(ck))
- if (t = 1) {
- set cN = cN + 1
- set cKey(cN) = ck
- set cName(ck) = cn
- set cAmt(ck) = 0
- set cQty(ck) = 0
- set cRec(ck) = 0
- }
- set cAmt(ck) = cAmt(ck) + amount
- set cQty(ck) = cQty(ck) + cnt
- set cRec(ck) = cRec(ck) + 1
- if (cn '= "") set cName(ck) = cn
- set ik = $LG(lb, 2)
- set in = $LG(lb, 3)
- set t = $INCREMENT(iSeen(ik))
- if (t = 1) {
- set iN = iN + 1
- set iKey(iN) = ik
- set iName(ik) = in
- set iAmt(ik) = 0
- set iQty(ik) = 0
- set iRec(ik) = 0
- }
- set iAmt(ik) = iAmt(ik) + amount
- set iQty(ik) = iQty(ik) + cnt
- set iRec(ik) = iRec(ik) + 1
- if (in '= "") set iName(ik) = in
- if ($LG(lb, 2) '= "") {
- set gdk = $EXTRACT($LG(lb, 10), 1, 10) _ "|" _ $LG(lb, 2)
- set a2 = $INCREMENT(gAll(gdk))
- if (a2 = 1) {
- set seq = seq + 1
- set gKey(seq) = gdk
- set gDate(gdk) = $EXTRACT($LG(lb, 10), 1, 10)
- set gCode(gdk) = $LG(lb, 2)
- set gName(gdk) = $LG(lb, 3)
- set gCat(gdk) = $LG(lb, 5)
- set gTimes(gdk) = 0
- set gQty(gdk) = 0
- set gAmt(gdk) = 0
- }
- if (amount >= 0) {
- set gTimes(gdk) = gTimes(gdk) + 1
- set gQty(gdk) = gQty(gdk) + cnt
- set gAmt(gdk) = gAmt(gdk) + amount
- if ($LG(lb, 3) '= "") set gName(gdk) = $LG(lb, 3)
- if ($LG(lb, 5) '= "") set gCat(gdk) = $LG(lb, 5)
- }
- }
- }
- for i = 1:1:seq {
- set gdk = gKey(i)
- if (gTimes(gdk) < dupTimes) continue
- set d1 = ..%CalcDupAmount(gAmt(gdk), gTimes(gdk), dupAmountMode)
- set gDupAmt(gdk) = d1
- set gDupQty(gdk) = ..%CalcDupQty(gQty(gdk), gTimes(gdk), dupAmountMode)
- set gSort(gDate(gdk) _ "|" _ ..%SortKey(d1), gdk) = ""
- set dupAmount = dupAmount + d1
- }
- set dupGroups = []
- set ord = 0
- set done = 0
- set sk = ""
- while ('done) {
- set sk = $ORDER(gSort(sk), -1)
- if (sk = "") {
- set done = 1
- } else {
- set gdk2 = ""
- set done2 = 0
- while ('done2) {
- set gdk2 = $ORDER(gSort(sk, gdk2))
- if (gdk2 = "") {
- set done2 = 1
- } else {
- set gColor(gdk2) = ord # 8
- set ord = ord + 1
- set g = {}
- set g.date = gDate(gdk2)
- set g.itemCode = gCode(gdk2)
- set g.itemName = gName(gdk2)
- set g.catName = gCat(gdk2)
- if (g.catName = "") set g.catName = "未分类"
- set g.times = gTimes(gdk2)
- set g.qty = +$FN(gQty(gdk2), "", 2)
- set g.amount = +$FN(gAmt(gdk2), "", 2)
- set g.dupAmount = gDupAmt(gdk2)
- do dupGroups.%Push(g)
- }
- }
- }
- }
- set summaryByCategory = []
- for i = 1:1:cN {
- set ck = cKey(i)
- set cSort(..%SortKey(cAmt(ck)), ck) = ""
- }
- set done = 0
- set sk = ""
- while ('done) {
- set sk = $ORDER(cSort(sk), -1)
- if (sk = "") {
- set done = 1
- } else {
- set ck2 = ""
- set done2 = 0
- while ('done2) {
- set ck2 = $ORDER(cSort(sk, ck2))
- if (ck2 = "") {
- set done2 = 1
- } else {
- set it = {}
- set it.groupCode = ck2
- set it.groupName = cName(ck2)
- if (it.groupName = "") set it.groupName = "未分类"
- set it.amount = +$FN(cAmt(ck2), "", 2)
- set it.qty = +$FN(cQty(ck2), "", 2)
- set it.recordCount = cRec(ck2)
- set it.avgPrice = 0
- if (cQty(ck2) '= 0) set it.avgPrice = +$FN(cAmt(ck2) / cQty(ck2), "", 2)
- set it.ratio = ..%Ratio(cAmt(ck2), totalAmount)
- do summaryByCategory.%Push(it)
- }
- }
- }
- }
- set summaryByItem = []
- for i = 1:1:iN {
- set ik = iKey(i)
- set iSort(..%SortKey(iAmt(ik)), ik) = ""
- }
- set done = 0
- set sk = ""
- while ('done) {
- set sk = $ORDER(iSort(sk), -1)
- if (sk = "") {
- set done = 1
- } else {
- set ik2 = ""
- set done2 = 0
- while ('done2) {
- set ik2 = $ORDER(iSort(sk, ik2))
- if (ik2 = "") {
- set done2 = 1
- } else {
- set it = {}
- set it.groupCode = ik2
- set it.groupName = iName(ik2)
- if (it.groupName = "") set it.groupName = "未分类"
- set it.amount = +$FN(iAmt(ik2), "", 2)
- set it.qty = +$FN(iQty(ik2), "", 2)
- set it.recordCount = iRec(ik2)
- set it.avgPrice = 0
- if (iQty(ik2) '= 0) set it.avgPrice = +$FN(iAmt(ik2) / iQty(ik2), "", 2)
- set it.ratio = ..%Ratio(iAmt(ik2), totalAmount)
- do summaryByItem.%Push(it)
- }
- }
- }
- }
- set rows = []
- for i = 1:1:rowN {
- set lb = dRow(i)
- set amount = $LG(lb, 9)
- set isDup = 0
- set gdk = ""
- set times = 0
- set gamount = 0
- set gdupAmount = 0
- if ($LG(lb, 2) '= "") {
- set gdk = $EXTRACT($LG(lb, 10), 1, 10) _ "|" _ $LG(lb, 2)
- if ((amount >= 0) && (gTimes(gdk) >= dupTimes)) {
- set isDup = 1
- set times = gTimes(gdk)
- set gamount = +$FN(gAmt(gdk), "", 2)
- set gdupAmount = gDupAmt(gdk)
- }
- }
- set r = {}
- set r.feedetlSn = $LG(lb, 1)
- set r.admID = admID
- set r.medinsListCodg = $LG(lb, 2)
- set r.medinsListDesc = $LG(lb, 3)
- set r.ecCode = $LG(lb, 4)
- set r.ecDesc = $LG(lb, 5)
- if (r.ecDesc = "") set r.ecDesc = "未分类"
- set r.spec = $LG(lb, 6)
- set r.pric = +$FN($LG(lb, 7), "", 2)
- set r.cnt = +$FN($LG(lb, 8), "", 2)
- set r.detItemFeeSumamt = +$FN($LG(lb, 9), "", 2)
- set r.feeOcurTime = $LG(lb, 10)
- set r.feeDate = $EXTRACT($LG(lb, 10), 1, 10)
- set r.bilgDeptName = $LG(lb, 11)
- set r.ordersDrName = $LG(lb, 12)
- set r.isDup = isDup
- set r.times = times
- set r.amount = gamount
- set r.dupAmount = gdupAmount
- set r.dupGroupKey = ""
- if (isDup = 1) {
- set r.dupGroupKey = gdk
- set r.colorIndex = gColor(gdk)
- }
- do rows.%Push(r)
- }
- set stat = {}
- set stat.recordCount = rowN
- set stat.totalAmount = +$FN(totalAmount, "", 2)
- set stat.dupAmount = +$FN(dupAmount, "", 2)
- set stat.dupRatio = ..%Ratio(dupAmount, totalAmount)
- set stat.refundAmount = +$FN(refundAmount, "", 2)
- set resultObj.result.visit = visit
- set resultObj.result.summaryByCategory = summaryByCategory
- set resultObj.result.summaryByItem = summaryByItem
- set resultObj.result.dupGroups = dupGroups
- set resultObj.result.rows = rows
- set resultObj.result.statistics = stat
- }
- catch(e)
- {
- set resultObj = ..%HandleError("查询单次就诊费用信息", "02010605", jsonObj, e.AsStatus())
- }
- quit resultObj
- }
- /// 报表服务类主数据来源表(置于类末尾,规避类文件最后一个成员为方法时被自动重写吞掉结束大括号)
- Parameter ReportSourceTable As %String = "BS_DRGMedInsuMedicalRecord";
- }
|