chainlesschain 0.157.8 → 0.157.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-Dmur24hV.js → AIOps-C4XQxptM.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-BiXQ5MCX.js → ActionButton-CvKbykKA.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-BrBdBLPi.js → Analytics-DFMAWKUR.js} +2 -2
- package/src/assets/web-panel/assets/AppLayout-BkNdtTbn.js +1 -0
- package/src/assets/web-panel/assets/AppLayout-CKMl4NLf.css +1 -0
- package/src/assets/web-panel/assets/{Audit-DLYnWfX_.js → Audit-Bw7KSJD_.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-CKHLFZZS.js → Backup-D46qSgzQ.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-B7lryLAY.js → BaseInput-CvAa9Hm_.js} +1 -1
- package/src/assets/web-panel/assets/Chat-3Kj2JQP4.js +2 -0
- package/src/assets/web-panel/assets/{Checkbox-DAqCmQtS.js → Checkbox-YsCNWg9S.js} +1 -1
- package/src/assets/web-panel/assets/Codegen-AVAcL7NA.css +1 -0
- package/src/assets/web-panel/assets/Codegen-DDiVk21N.js +1 -0
- package/src/assets/web-panel/assets/{Col-BxNojt4A.js → Col-Dpb7Eik4.js} +1 -1
- package/src/assets/web-panel/assets/{Community-BG7vSQg7.js → Community-Bglv8oIv.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-Bl_FTVcP.js → Compact-DC8UsEAe.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CL6jUiTf.js → Compliance-DzVghx7L.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-Q37C8zUh.js → Cowork-pgKzBNDo.js} +4 -4
- package/src/assets/web-panel/assets/{Cron-Kq3eJC0L.js → Cron-I81HiCa1.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CvI5bEH8.js → Crosschain-48CdkgQf.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BD9PovRf.js → DID-CVYxjLQn.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-BXSj5-OS.js → Dashboard-sqj42zKx.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-BcEYFA4h.js → Dropdown-DBfZJHBI.js} +1 -1
- package/src/assets/web-panel/assets/Federation-BT-pF1wN.js +1 -0
- package/src/assets/web-panel/assets/Federation-BftELHDw.css +1 -0
- package/src/assets/web-panel/assets/{FormItemContext-C_8M0L9X.js → FormItemContext-B-sn9E_W.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DW9KmRrN.js → Git-DTh2i-Qk.js} +2 -2
- package/src/assets/web-panel/assets/{Governance--0gVd3YR.js → Governance-D788Lws6.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CSuaikJO.js → Inference-CnFa6Se9.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-Bz8-Uh6r.js → KnowledgeGraph-DHaMxawn.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BMTqVPem.js → Logs-B39LUZs9.js} +2 -2
- package/src/assets/web-panel/assets/{Marketplace-CTZqO_RV.js → Marketplace-BdOCF2RA.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-IN5l2BCN.js → McpTools-DbwkdBUE.js} +2 -2
- package/src/assets/web-panel/assets/{Memory-DEJ96vkh.js → Memory-Vl_lYCs2.js} +2 -2
- package/src/assets/web-panel/assets/{NLProgramming-BMftRM4D.js → NLProgramming-CgD2H0Pc.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-DAP1s6Bg.js → Notes-BvC5_V2H.js} +2 -2
- package/src/assets/web-panel/assets/{Organization-CutzdziK.js → Organization-Cxhhw4aD.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-CFLJpWAb.js → Overflow-L_28D41_.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-H7hLODDc.js → P2P-BflX74Hm.js} +2 -2
- package/src/assets/web-panel/assets/{Permissions-B7UejC3D.js → Permissions-ByLhEAbz.js} +3 -3
- package/src/assets/web-panel/assets/Pipeline-CnZJNdgt.js +1 -0
- package/src/assets/web-panel/assets/Privacy-BJIajCGG.js +1 -0
- package/src/assets/web-panel/assets/{ProjectSettings-BiKBzbRF.js → ProjectSettings-N0r_mtec.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-asWgm0Iz.js → Projects-DLvUzeIB.js} +2 -2
- package/src/assets/web-panel/assets/{Providers-C2eO_XrC.js → Providers-B2A35VhD.js} +2 -2
- package/src/assets/web-panel/assets/{Recommend-CIZjeClx.js → Recommend-DYb61WNp.js} +1 -1
- package/src/assets/web-panel/assets/Reputation-C9BfnI0z.js +1 -0
- package/src/assets/web-panel/assets/{Row-BBRGnkyd.js → Row-CpPHVi7H.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-B4jpCYCI.js → RssFeed-CbqJDErh.js} +3 -3
- package/src/assets/web-panel/assets/Search-BTk9rglb.css +1 -0
- package/src/assets/web-panel/assets/Search-C0gd765-.js +1 -0
- package/src/assets/web-panel/assets/{Security-D2BQD7tk.js → Security-DsYWAhpE.js} +4 -4
- package/src/assets/web-panel/assets/{Services-VasZTmqN.js → Services-7Blny0Jc.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-1joyz4wO.js → Skeleton-TzxE-JJt.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-BkTmE8SJ.js → Skills-DfaRaffm.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DTbGerEL.js → Sla-mftEtvGn.js} +1 -1
- package/src/assets/web-panel/assets/{Tasks-DI3oKTDz.js → Tasks-Db9TRjE7.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-C9Z_82IH.js → Templates-DgonVRQJ.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-kLu9x3Ty.js → Tenant-BB-LLJMZ.js} +1 -1
- package/src/assets/web-panel/assets/Tokens-DHOkHNur.js +1 -0
- package/src/assets/web-panel/assets/Tokens-KvJRHQcl.css +1 -0
- package/src/assets/web-panel/assets/{Trigger-BIXZjkDZ.js → Trigger-BV4JPD3z.js} +1 -1
- package/src/assets/web-panel/assets/Trust-BLI308Ik.css +1 -0
- package/src/assets/web-panel/assets/Trust-BpC4gDis.js +1 -0
- package/src/assets/web-panel/assets/{VideoEditing-nIRTUjK_.js → VideoEditing-CeDFfKrq.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-bO-fXxBx.js → Wallet-CcNCVaor.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-uNwYx1Yn.js → WebAuthn-BbIPA6Ca.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-Bw6cIw_h.js → WorkflowEditor-DxkitXpf.js} +1 -1
- package/src/assets/web-panel/assets/{colors-WgDc41S9.js → colors-2MPUdPu2.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BI2RK_Ub.js → compact-item-B4vcKR0x.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-gy9ZhS49.js → createContext-Div8Cl0F.js} +1 -1
- package/src/assets/web-panel/assets/{hasIn-BeuofWqK.js → hasIn-9c9xldOR.js} +1 -1
- package/src/assets/web-panel/assets/icons-ukMaZ3tx.js +57 -0
- package/src/assets/web-panel/assets/{index-B_Jn0gUS.js → index--tOLU2ID.js} +1 -1
- package/src/assets/web-panel/assets/{index-BqUqxSm3.js → index-3KbT-bG7.js} +1 -1
- package/src/assets/web-panel/assets/index-B4hcllQg.js +12 -0
- package/src/assets/web-panel/assets/{index-CFjz2AoU.js → index-B58J4NxK.js} +1 -1
- package/src/assets/web-panel/assets/{index-D3LHutKn.js → index-B65KFSc3.js} +1 -1
- package/src/assets/web-panel/assets/{index-bpC7BiFY.js → index-BCfVA9mJ.js} +2 -2
- package/src/assets/web-panel/assets/{index-DLcTmwiN.js → index-BbqCdQXU.js} +3 -3
- package/src/assets/web-panel/assets/{index-BeI4fOXN.js → index-BcnQrVVZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CCe5JJYI.js → index-BfoYep3e.js} +1 -1
- package/src/assets/web-panel/assets/{index-CBfv-ndK.js → index-BjGOthNv.js} +1 -1
- package/src/assets/web-panel/assets/{index-ChQfosO1.js → index-BntG0RJO.js} +1 -1
- package/src/assets/web-panel/assets/{index-B1KhJnQM.js → index-BuVNDnn8.js} +1 -1
- package/src/assets/web-panel/assets/index-BzBaZFuT.js +1 -0
- package/src/assets/web-panel/assets/{index-CwzHos3n.js → index-C-CTCrAH.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cwuee4M2.js → index-C1GXp5YD.js} +1 -1
- package/src/assets/web-panel/assets/index-CDoxJ9Cl.js +1 -0
- package/src/assets/web-panel/assets/{index-BhwkejpN.js → index-CIE6ht2b.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dxy2NQqS.js → index-CIWKlZ1X.js} +1 -1
- package/src/assets/web-panel/assets/{index-BIlQFerH.js → index-COJ-mQYg.js} +1 -1
- package/src/assets/web-panel/assets/{index-CndKqpaA.js → index-COdKVelL.js} +1 -1
- package/src/assets/web-panel/assets/{index-t8Iy1rHD.js → index-CVYrm1az.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ct1YvTCX.js → index-Ca3iTiXs.js} +2 -2
- package/src/assets/web-panel/assets/{index-BhSfMAk_.js → index-CtM3tjRj.js} +1 -1
- package/src/assets/web-panel/assets/{index-DhwwIcoT.js → index-D--EKCHy.js} +1 -1
- package/src/assets/web-panel/assets/{index-pGLDMYoo.js → index-D-0g6tCK.js} +1 -1
- package/src/assets/web-panel/assets/{index-Q7v4BZgp.js → index-D0GALIQZ.js} +3 -3
- package/src/assets/web-panel/assets/{index-BVg8Wf40.js → index-D1JeOKve.js} +1 -1
- package/src/assets/web-panel/assets/index-DIe3dY84.js +1 -0
- package/src/assets/web-panel/assets/{index-vwTt5gIV.js → index-DJAPu9VF.js} +1 -1
- package/src/assets/web-panel/assets/{index-t5BUMwJ1.js → index-DdHPswKn.js} +1 -1
- package/src/assets/web-panel/assets/index-DgWftysw.js +1 -0
- package/src/assets/web-panel/assets/{index-CBI2Y4Kj.js → index-Dk3ZySO2.js} +2 -2
- package/src/assets/web-panel/assets/{index-D_bHyAnC.js → index-DogHNcyC.js} +1 -1
- package/src/assets/web-panel/assets/{index-IXyQceyp.js → index-IzAqu_OK.js} +2 -2
- package/src/assets/web-panel/assets/{index-BSrnzqkD.js → index-OhUZFfxQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CUV4Xqwc.js → index-ZW72ov7W.js} +1 -1
- package/src/assets/web-panel/assets/index-ZZ_4A9um.js +36 -0
- package/src/assets/web-panel/assets/{index--V8HSAh9.js → index-dV8k_pMc.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-C1zn_AKT.js → initDefaultProps--L8bzddm.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BflWvLDD.js → motion-BR7NF0vx.js} +1 -1
- package/src/assets/web-panel/assets/{move-TfXJb-sS.js → move-BpyQMRtF.js} +1 -1
- package/src/assets/web-panel/assets/{omit-COjrlUIA.js → omit-RkKN6uqw.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-1WCywewt.js → pickAttrs-Bk8_mKGY.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-y75Pew0G.js → placementArrow-CBAaXBxj.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-BDt6Mlnb.js → responsiveObserve-BzrPInK7.js} +1 -1
- package/src/assets/web-panel/assets/{slide-B1oHu6JW.js → slide-CXFBsLyp.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-CO9QQaYQ.js → statusUtils-6TeOuUzQ.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-C2ONfKU2.js → styleChecker-CQt4HHRm.js} +1 -1
- package/src/assets/web-panel/assets/{transition-atE2sWdv.js → transition-CGYDOK3N.js} +1 -1
- package/src/assets/web-panel/assets/{useConfigInject-DIKG5Y4I.js → useConfigInject-BKqJUQaF.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-C0OopxrG.js → useFlexGapSupport--RuYYIc6.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-Cryb4eNl.js → vnode-I9keNa_U.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-zuDCIwwE.js → zoom-BNV3xYvt.js} +1 -1
- package/src/assets/web-panel/index.html +2 -2
- package/src/assets/web-panel/assets/AppLayout-DCrLKryi.css +0 -1
- package/src/assets/web-panel/assets/AppLayout-DGosvMBr.js +0 -1
- package/src/assets/web-panel/assets/Chat-Ga0oUawB.js +0 -2
- package/src/assets/web-panel/assets/Pipeline-DhmIDzq5.js +0 -1
- package/src/assets/web-panel/assets/Privacy-D98lbFiD.js +0 -1
- package/src/assets/web-panel/assets/Reputation-Dq21I6NZ.js +0 -1
- package/src/assets/web-panel/assets/icons-E3MGhN6s.js +0 -57
- package/src/assets/web-panel/assets/index-B4FsQ2CI.js +0 -1
- package/src/assets/web-panel/assets/index-CK4CCFyw.js +0 -1
- package/src/assets/web-panel/assets/index-CapUO117.js +0 -12
- package/src/assets/web-panel/assets/index-CsESExuO.js +0 -1
- package/src/assets/web-panel/assets/index-DPaLf3-g.js +0 -36
- package/src/assets/web-panel/assets/index-TpCAHpWv.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as bt}from"./ws-Bv7YH0VB.js";import{s as Pe}from"./community-parser-CO25nZFt.js";import{_ as _t}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{a as k}from"./index-DLcTmwiN.js";import{O as xt,aG as gt,aa as kt,ae as Ue,a8 as Me,u as St,aB as ht,al as Ct}from"./icons-E3MGhN6s.js";import{E as It}from"./useConfigInject-DIKG5Y4I.js";import{l as Tt,F as d,D as b,c as o,x as a,m as h,G as v,q as y,r as x,v as s,J as p,u as g,H as O,L as $,N as zt,I as u,j as de,a as Be}from"./vendor-BVetwVfk.js";import"./index-DPaLf3-g.js";import"./transition-atE2sWdv.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-CHsntPCQ.js";import"./index-U4Zd5IK6.js";function N(l){const n=Pe(l);if(!n)return null;try{return JSON.parse(n)}catch{}const i=n.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(!i)return null;try{return JSON.parse(i[0])}catch{return null}}const pe=Object.freeze(["gold","silver","bronze"]),ze=Object.freeze(["active","expired","terminated"]),fe=Object.freeze(["availability","response_time","throughput","error_rate"]),le=Object.freeze(["minor","moderate","major","critical"]),At=Object.freeze(["open","acknowledged","resolved","waived"]);function m(l,n=0){return typeof l=="number"&&Number.isFinite(l)?l:n}function W(l){if(!l)return{noDb:!1,error:""};const n=Pe(l),i=/Database not available/i.test(n);return{noDb:i,error:i?"Database not available":""}}function jt(l,n=0){if(!l||typeof l!="object")return null;const i=l.name||"";return i?{key:i,name:i,availability:m(l.availability,0),maxResponseTime:m(l.maxResponseTime,0),minThroughput:m(l.minThroughput,0),maxErrorRate:m(l.maxErrorRate,0),compensationRate:m(l.compensationRate,0),_idx:n}:null}function Ot(l){const n=N(l);return Array.isArray(n)?n.map(jt).filter(Boolean):[]}function wt(l){const n={availability:0,maxResponseTime:0,minThroughput:0,maxErrorRate:0,compensationRate:0};return!l||typeof l!="object"||Array.isArray(l)?n:{availability:m(l.availability,0),maxResponseTime:m(l.maxResponseTime,0),minThroughput:m(l.minThroughput,0),maxErrorRate:m(l.maxErrorRate,0),compensationRate:m(l.compensationRate,0)}}function Je(l,n=0){if(!l||typeof l!="object")return null;const i=l.slaId||l.sla_id||"";return i?{key:i,slaId:i,orgId:String(l.orgId??l.org_id??""),tier:String(l.tier||"").toLowerCase(),terms:wt(l.terms),monthlyFee:m(l.monthlyFee??l.monthly_fee,0),startDate:l.startDate??l.start_date??null,endDate:l.endDate??l.end_date??null,status:String(l.status||"active").toLowerCase(),createdAt:l.createdAt??l.created_at??null,updatedAt:l.updatedAt??l.updated_at??null,_idx:n}:null}function Ft(l){const n=N(l);return Array.isArray(n)?n.map(Je).filter(Boolean):[]}function Dt(l){const n=N(l);return!n||typeof n!="object"||Array.isArray(n)?null:Je(n,0)}function qe(l){return!l||typeof l!="object"?null:{count:m(l.count,0),mean:m(l.mean,0),min:m(l.min,0),max:m(l.max,0),p95:m(l.p95,0)}}function Rt(l){const n=N(l);if(!n||typeof n!="object"||Array.isArray(n))return{slaId:"",totalSamples:0,byTerm:{}};const i={};if(n.byTerm&&typeof n.byTerm=="object")for(const[f,_]of Object.entries(n.byTerm)){const w=qe(_);w&&(i[f]=w)}return{slaId:String(n.slaId||""),totalSamples:m(n.totalSamples,0),byTerm:i}}function Ge(l,n=0){if(!l||typeof l!="object")return null;const i=l.violationId||l.violation_id||"";return i?{key:i,violationId:i,slaId:String(l.slaId??l.sla_id??""),term:String(l.term||"").toLowerCase(),severity:String(l.severity||"minor").toLowerCase(),expectedValue:m(l.expectedValue??l.expected_value,0),actualValue:m(l.actualValue??l.actual_value,0),deviationPercent:m(l.deviationPercent??l.deviation_percent,0),compensationAmount:typeof l.compensationAmount=="number"?l.compensationAmount:typeof l.compensation_amount=="number"?l.compensation_amount:null,occurredAt:l.occurredAt??l.occurred_at??null,resolvedAt:l.resolvedAt??l.resolved_at??null,v2Status:l.v2Status?String(l.v2Status).toLowerCase():"open",v2Note:l.v2Note??"",_idx:n}:null}function $t(l){const n=N(l);return Array.isArray(n)?n.map(Ge).filter(Boolean):[]}function Lt(l){const n=N(l);return!n||typeof n!="object"||Array.isArray(n)?{slaId:"",checkedAt:null,totalViolations:0,violations:[]}:{slaId:String(n.slaId||""),checkedAt:n.checkedAt??null,totalViolations:m(n.totalViolations,0),violations:Array.isArray(n.violations)?n.violations.map(Ge).filter(Boolean):[]}}function Vt(l){const n=N(l);return!n||typeof n!="object"||Array.isArray(n)?null:{violationId:String(n.violationId||""),slaId:String(n.slaId||""),severity:String(n.severity||""),base:m(n.base,0),multiplier:m(n.multiplier,0),amount:m(n.amount,0)}}const Et={slaId:"",tier:"",compliance:0,startDate:null,endDate:null,metricsByTerm:{},violations:{total:0,byTerm:{},bySeverity:{},totalCompensation:0}};function Nt(l){const n=JSON.parse(JSON.stringify(Et));for(const f of fe)n.violations.byTerm[f]=0;for(const f of le)n.violations.bySeverity[f]=0;const i=N(l);if(!i||typeof i!="object"||Array.isArray(i))return n;if(n.slaId=String(i.slaId||""),n.tier=String(i.tier||"").toLowerCase(),n.compliance=m(i.compliance,0),n.startDate=i.startDate??null,n.endDate=i.endDate??null,i.metricsByTerm&&typeof i.metricsByTerm=="object")for(const[f,_]of Object.entries(i.metricsByTerm)){const w=qe(_);w&&(n.metricsByTerm[f]=w)}if(i.violations&&typeof i.violations=="object"){if(n.violations.total=m(i.violations.total,0),n.violations.totalCompensation=m(i.violations.totalCompensation,0),i.violations.byTerm&&typeof i.violations.byTerm=="object")for(const[f,_]of Object.entries(i.violations.byTerm))typeof _=="number"&&Number.isFinite(_)&&(n.violations.byTerm[f]=_);if(i.violations.bySeverity&&typeof i.violations.bySeverity=="object")for(const[f,_]of Object.entries(i.violations.bySeverity))typeof _=="number"&&Number.isFinite(_)&&(n.violations.bySeverity[f]=_)}return n}const Ut={totalContracts:0,activeContracts:0,activeOrgs:0,maxActiveSlasPerOrg:0,byStatus:{},byTier:{},violations:{total:0,byTerm:{},bySeverity:{},byStatus:{},totalCompensation:0}};function Mt(l){const n=JSON.parse(JSON.stringify(Ut));for(const f of ze)n.byStatus[f]=0;for(const f of pe)n.byTier[f]=0;for(const f of fe)n.violations.byTerm[f]=0;for(const f of le)n.violations.bySeverity[f]=0;for(const f of At)n.violations.byStatus[f]=0;const i=N(l);if(!i||typeof i!="object"||Array.isArray(i))return n;if(n.totalContracts=m(i.totalContracts,0),n.activeContracts=m(i.activeContracts,0),n.activeOrgs=m(i.activeOrgs,0),n.maxActiveSlasPerOrg=m(i.maxActiveSlasPerOrg,0),i.byStatus&&typeof i.byStatus=="object")for(const[f,_]of Object.entries(i.byStatus))typeof _=="number"&&Number.isFinite(_)&&(n.byStatus[f]=_);if(i.byTier&&typeof i.byTier=="object")for(const[f,_]of Object.entries(i.byTier))typeof _=="number"&&Number.isFinite(_)&&(n.byTier[f]=_);if(i.violations&&typeof i.violations=="object"){n.violations.total=m(i.violations.total,0),n.violations.totalCompensation=m(i.violations.totalCompensation,0);for(const f of["byTerm","bySeverity","byStatus"])if(i.violations[f]&&typeof i.violations[f]=="object")for(const[_,w]of Object.entries(i.violations[f]))typeof w=="number"&&Number.isFinite(w)&&(n.violations[f][_]=w)}return n}function Te(l){if(l==null||l==="")return"—";const n=typeof l=="number"?new Date(l):new Date(String(l));return isNaN(n.getTime())?String(l):n.toLocaleString("zh-CN",{hour12:!1})}const Bt={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},Pt={class:"tier-head"},Jt={class:"tier-comp"},qt={class:"tier-terms"},Gt={class:"tier-term"},Kt={class:"tier-term"},Ht={class:"tier-term"},Wt={class:"tier-term"},Yt={class:"filter-bar"},Qt={key:0,style:{color:"var(--text-primary)","font-family":"monospace","font-size":"12px"}},Xt={key:1,style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"12px"}},Zt={key:4,style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"12px"}},eo={key:5,style:{color:"var(--text-secondary)","font-size":"11px"}},to={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},oo={class:"filter-bar"},ao={key:0,style:{color:"var(--text-primary)","font-family":"monospace","font-size":"12px"}},lo={key:4,style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"12px"}},no={key:5,style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"12px"}},ro={key:0,style:{color:"#faad14","font-weight":"500"}},io={key:1,style:{color:"var(--text-muted)"}},so={key:7,style:{color:"var(--text-secondary)","font-size":"11px"}},uo={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},co={style:{color:"var(--text-muted)","font-size":"11px","margin-top":"4px"}},po={key:0,style:{"padding-top":"8px"}},fo={key:1,style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"12px"}},mo={key:2,style:{"font-family":"monospace","font-size":"12px"}},vo={key:0,style:{"padding-top":"8px"}},yo={style:{"margin-left":"8px","font-family":"monospace","font-size":"12px"}},bo={style:{"margin-left":"8px",color:"var(--text-secondary)","font-size":"12px"}},_o={style:{"margin-left":"auto",color:"#ff4d4f","font-weight":"500"}},xo={key:0,style:{"padding-top":"8px"}},go={key:0,style:{color:"var(--text-primary)","font-size":"13px",margin:"16px 0 8px"}},ko={key:1,style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"12px"}},So={key:2,style:{"font-family":"monospace","font-size":"12px"}},ho={key:0,style:{"padding-top":"8px"}},Co={style:{"font-family":"monospace","font-size":"12px"}},Io={style:{"font-family":"monospace"}},To={style:{"font-family":"monospace"}},zo={style:{color:"#faad14","font-weight":"600","font-family":"monospace","font-size":"14px"}},Ao={__name:"Sla",setup(l){const n=bt(),i=It.PRESENTED_IMAGE_SIMPLE,f=x(!1),_=x(!1),w=x(!1),Ae=x([]),me=x([]),je=x([]),S=x({totalContracts:0,activeContracts:0,activeOrgs:0,maxActiveSlasPerOrg:0,byStatus:{},byTier:{},violations:{total:0,byTerm:{},bySeverity:{},byStatus:{},totalCompensation:0}}),ve=x({noDb:!1,error:""}),Oe=x("contracts"),Y=x(""),Q=x(""),X=x(""),ne=x(!1),re=x(!1),ye=x(!1),be=x(!1),_e=x(!1),ie=x(!1),I=Be({orgId:"",tier:"silver",monthlyFee:1e3,durationDays:30}),T=Be({slaId:null,term:"availability",value:null}),z=x(null),Z=x({slaId:"",totalSamples:0,byTerm:{}}),L=x(null),j=x(null),xe=x(null),D=x(null),Ke=[{title:"SLA ID",key:"slaId",width:"120px"},{title:"组织",key:"orgId",width:"160px"},{title:"等级",key:"tier",width:"90px"},{title:"状态",key:"status",width:"100px"},{title:"月费",key:"monthlyFee",width:"110px"},{title:"到期",key:"endDate",width:"160px"},{title:"操作",key:"action",width:"260px"}],He=[{title:"ID",key:"violationId",width:"120px"},{title:"指标",key:"term",width:"140px"},{title:"严重度",key:"severity",width:"100px"},{title:"偏差",key:"deviation",width:"180px"},{title:"期望",key:"expected",width:"110px"},{title:"实际",key:"actual",width:"110px"},{title:"补偿",key:"compensation",width:"110px"},{title:"发生时间",key:"occurredAt",width:"160px"},{title:"操作",key:"action",width:"120px"}],we=[{title:"指标",key:"term",width:"140px"},{title:"期望",key:"expected",width:"110px"},{title:"均值",key:"mean",width:"110px"},{title:"p95",key:"p95",width:"110px"},{title:"最小",key:"min",width:"110px"},{title:"最大",key:"max",width:"110px"},{title:"样本数",key:"count",width:"90px"}],We=de(()=>{let r=me.value;return Y.value&&(r=r.filter(t=>t.tier===Y.value)),Q.value&&(r=r.filter(t=>t.status===Q.value)),r}),Ye=de(()=>{let r=je.value;return X.value&&(r=r.filter(t=>t.severity===X.value)),r}),Qe=de(()=>z.value?Object.entries(Z.value.byTerm).map(([r,t])=>({key:r,term:r,expected:Fe(z.value.terms,r),...t})):[]),Xe=de(()=>!j.value||!z.value?[]:Object.entries(j.value.metricsByTerm).map(([r,t])=>({key:r,term:r,expected:Fe(z.value.terms,r),...t})));function Fe(r,t){if(!r)return 0;switch(t){case"availability":return r.availability;case"response_time":return r.maxResponseTime;case"throughput":return r.minThroughput;case"error_rate":return r.maxErrorRate;default:return 0}}function se(r){return{gold:"gold",silver:"default",bronze:"orange"}[r]||"default"}function De(r){return{gold:"#faad14",silver:"#8c8c8c",bronze:"#d4a373"}[r]||"#888"}function ge(r){return{active:"活跃",expired:"已过期",terminated:"已终止"}[r]||r}function Re(r){return{active:"green",expired:"default",terminated:"red"}[r]||"default"}function Ze(r){return{active:"#52c41a",expired:"#888",terminated:"#ff4d4f"}[r]||"#888"}function P(r){return{availability:"可用性",response_time:"响应时间",throughput:"吞吐量",error_rate:"错误率"}[r]||r}function et(r){return{availability:"比例 0~1,例如 0.997",response_time:"毫秒,例如 120",throughput:"每秒请求数,例如 850",error_rate:"比例 0~1,例如 0.003"}[r]||""}function U(r,t){return typeof t!="number"||!Number.isFinite(t)?"—":r==="availability"||r==="error_rate"?(t*100).toFixed(3)+"%":r==="response_time"?t.toFixed(1)+"ms":r==="throughput"?t.toFixed(0)+" rps":t.toFixed(4)}function J(r){return{minor:"轻微",moderate:"中等",major:"严重",critical:"关键"}[r]||r}function ee(r){return{minor:"default",moderate:"gold",major:"orange",critical:"red"}[r]||"default"}function ke(r){return{minor:"#888",moderate:"#faad14",major:"#fa8c16",critical:"#ff4d4f"}[r]||"#888"}function tt(r){return r>=.99?"#52c41a":r>=.9?"#1677ff":r>=.7?"#faad14":"#ff4d4f"}function te(r,t){return t?Math.round(r/t*100):0}async function q(){f.value=!0,ve.value={noDb:!1,error:""};try{const[r,t,C,oe]=await Promise.all([n.execute("sla tiers --json",8e3).catch(()=>({output:""})),n.execute("sla list --limit 200 --json",1e4).catch(()=>({output:""})),n.execute("sla violations --limit 200 --json",1e4).catch(()=>({output:""})),n.execute("sla stats-v2",8e3).catch(()=>({output:""}))]),M=[t,C,oe].map(F=>W(F.output)).find(F=>F.noDb);M&&(ve.value=M),Ae.value=Ot(r.output),me.value=Ft(t.output),je.value=$t(C.output),S.value=Mt(oe.output)}catch(r){k.error("加载 SLA 数据失败: "+(r?.message||r))}finally{f.value=!1}}async function ot(){if(!I.orgId.trim()){k.warning("请填写组织 ID");return}_.value=!0;try{const r=I.durationDays*24*60*60*1e3,t=[`sla create "${I.orgId.trim().replace(/"/g,'\\"')}"`,`-t ${I.tier}`,`-d ${r}`,`-f ${I.monthlyFee||0}`,"--json"],{output:C}=await n.execute(t.join(" "),1e4);if(W(C).noDb){k.error("需要先 cc init 初始化项目");return}const M=Dt(C);if(!M){k.error("创建失败: "+C.slice(0,120));return}k.success(`合约已创建:${M.slaId.slice(0,8)}`),ne.value=!1,$e(),await q()}catch(r){k.error("创建失败: "+(r?.message||r))}finally{_.value=!1}}async function at(){if(!T.slaId){k.warning("请选择 SLA 合约");return}if(T.value===null||T.value===void 0){k.warning("请填写指标数值");return}w.value=!0;try{const{output:r}=await n.execute(`sla record ${T.slaId} ${T.term} ${T.value} --json`,8e3);if(W(r).noDb){k.error("需要先 cc init 初始化项目");return}if(!/"metricId"|"term"/.test(r)){k.error("记录失败: "+r.slice(0,120));return}k.success("指标已记录"),re.value=!1,Le()}catch(r){k.error("记录失败: "+(r?.message||r))}finally{w.value=!1}}async function lt(r){try{const{output:t}=await n.execute(`sla terminate ${r.slaId}`,8e3);if(W(t).noDb){k.error("需要先 cc init 初始化项目");return}if(/Failed/i.test(t)&&!/terminated/i.test(t)){k.error("终止失败: "+t.slice(0,120));return}k.success("合约已终止"),await q()}catch(t){k.error("终止失败: "+(t?.message||t))}}async function nt(r){z.value=r,Z.value={slaId:"",totalSamples:0,byTerm:{}},ye.value=!0;try{const{output:t}=await n.execute(`sla metrics ${r.slaId} --json`,8e3);Z.value=Rt(t)}catch(t){k.error("加载指标失败: "+(t?.message||t))}}async function rt(r){z.value=r,L.value=null,be.value=!0;try{const{output:t}=await n.execute(`sla check ${r.slaId} --json`,1e4);if(W(t).noDb){k.error("需要先 cc init 初始化项目");return}L.value=Lt(t),L.value.totalViolations>0&&await q()}catch(t){k.error("检查失败: "+(t?.message||t))}}async function it(r){z.value=r,j.value=null,_e.value=!0;try{const{output:t}=await n.execute(`sla report ${r.slaId} --json`,1e4);j.value=Nt(t)}catch(t){k.error("加载报告失败: "+(t?.message||t))}}async function st(r){xe.value=r,D.value=null;try{const{output:t}=await n.execute(`sla compensate ${r.violationId} --json`,8e3);if(W(t).noDb){k.error("需要先 cc init 初始化项目");return}if(D.value=Vt(t),!D.value){k.error("计算失败: "+t.slice(0,120));return}ie.value=!0,await q()}catch(t){k.error("计算失败: "+(t?.message||t))}}function ut(r){xe.value=r,D.value={violationId:r.violationId,slaId:r.slaId,severity:r.severity,base:0,multiplier:0,amount:r.compensationAmount||0},ie.value=!0}function $e(){I.orgId="",I.tier="silver",I.monthlyFee=1e3,I.durationDays=30}function Le(){T.slaId=null,T.term="availability",T.value=null}return Tt(q),(r,t)=>{const C=y("a-button"),oe=y("a-space"),M=y("a-alert"),F=y("a-statistic"),V=y("a-card"),R=y("a-col"),ue=y("a-row"),A=y("a-tag"),G=y("a-radio-button"),Se=y("a-radio-group"),ct=y("a-popconfirm"),ce=y("a-table"),he=y("a-tab-pane"),K=y("a-progress"),dt=y("a-tabs"),pt=y("a-input"),B=y("a-form-item"),Ve=y("a-select-option"),Ce=y("a-select"),Ie=y("a-input-number"),Ee=y("a-form"),H=y("a-modal"),E=y("a-descriptions-item"),Ne=y("a-descriptions"),ft=y("a-empty"),mt=y("a-result"),vt=y("a-list-item"),yt=y("a-list");return s(),d("div",null,[b("div",Bt,[t[22]||(t[22]=b("div",null,[b("h2",{class:"page-title"},"SLA 管理"),b("p",{class:"page-sub"},"服务等级合约 · 指标记录 · 偏差检测 · 补偿计算")],-1)),o(oe,null,{default:a(()=>[o(C,{loading:f.value,onClick:q},{icon:a(()=>[o(g(xt))]),default:a(()=>[t[19]||(t[19]=p(" 刷新 ",-1))]),_:1},8,["loading"]),o(C,{onClick:t[0]||(t[0]=e=>re.value=!0)},{icon:a(()=>[o(g(gt))]),default:a(()=>[t[20]||(t[20]=p(" 记录指标 ",-1))]),_:1}),o(C,{type:"primary",onClick:t[1]||(t[1]=e=>ne.value=!0)},{icon:a(()=>[o(g(kt))]),default:a(()=>[t[21]||(t[21]=p(" 新建合约 ",-1))]),_:1})]),_:1})]),ve.value.noDb?(s(),h(M,{key:0,type:"info","show-icon":"",message:"该模块需要项目级数据库",description:"`cc sla ...` 命令仅在 chainlesschain 项目目录下可用。请先运行 `cc init` 初始化项目,或在已初始化的目录启动 `cc serve`。",style:{"margin-bottom":"16px"}})):v("",!0),o(ue,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:a(()=>[o(R,{xs:12,sm:8,lg:5},{default:a(()=>[o(V,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(F,{title:"合约总数",value:S.value.totalContracts,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:a(()=>[o(g(Ue))]),_:1},8,["value"])]),_:1})]),_:1}),o(R,{xs:12,sm:8,lg:5},{default:a(()=>[o(V,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(F,{title:"活跃合约",value:S.value.activeContracts,"value-style":{color:S.value.activeContracts>0?"#52c41a":"#888",fontSize:"20px"}},{prefix:a(()=>[o(g(Me))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),o(R,{xs:12,sm:8,lg:5},{default:a(()=>[o(V,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(F,{title:"合作组织",value:S.value.activeOrgs,"value-style":{color:"#722ed1",fontSize:"20px"},suffix:S.value.maxActiveSlasPerOrg?`· cap=${S.value.maxActiveSlasPerOrg}`:""},{prefix:a(()=>[o(g(St))]),_:1},8,["value","suffix"])]),_:1})]),_:1}),o(R,{xs:12,sm:8,lg:5},{default:a(()=>[o(V,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(F,{title:"违规总数",value:S.value.violations.total,"value-style":{color:S.value.violations.total>0?"#ff4d4f":"#888",fontSize:"20px"}},{prefix:a(()=>[o(g(ht))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),o(R,{xs:24,sm:8,lg:4},{default:a(()=>[o(V,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(F,{title:"累计补偿",value:S.value.violations.totalCompensation,precision:2,"value-style":{color:"#faad14",fontSize:"20px"}},{prefix:a(()=>[o(g(Ct))]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),o(V,{title:"SLA 等级",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"},"body-style":{padding:"12px 16px"}},{default:a(()=>[o(ue,{gutter:[12,12]},{default:a(()=>[(s(!0),d(O,null,$(Ae.value,e=>(s(),h(R,{key:e.name,xs:24,sm:8},{default:a(()=>[b("div",{class:"tier-pill",style:zt({borderLeftColor:De(e.name)})},[b("div",Pt,[o(A,{color:se(e.name),style:{"font-family":"monospace","font-size":"13px"}},{default:a(()=>[p(u(e.name.toUpperCase()),1)]),_:2},1032,["color"]),b("span",Jt,"补偿率 "+u((e.compensationRate*100).toFixed(1))+"%",1)]),b("div",qt,[b("span",Gt,"可用性 ≥ "+u((e.availability*100).toFixed(2))+"%",1),b("span",Kt,"p95 ≤ "+u(e.maxResponseTime)+"ms",1),b("span",Ht,"RPS ≥ "+u(e.minThroughput),1),b("span",Wt,"错误率 ≤ "+u((e.maxErrorRate*100).toFixed(2))+"%",1)])],4)]),_:2},1024))),128))]),_:1})]),_:1}),o(dt,{activeKey:Oe.value,"onUpdate:activeKey":t[5]||(t[5]=e=>Oe.value=e),class:"sla-tabs"},{default:a(()=>[o(he,{key:"contracts",tab:"合约"},{default:a(()=>[b("div",Yt,[o(Se,{value:Y.value,"onUpdate:value":t[2]||(t[2]=e=>Y.value=e),size:"small","button-style":"solid"},{default:a(()=>[o(G,{value:""},{default:a(()=>[...t[23]||(t[23]=[p("全部等级",-1)])]),_:1}),(s(!0),d(O,null,$(g(pe),e=>(s(),h(G,{key:e,value:e},{default:a(()=>[p(u(e.toUpperCase()),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),o(Se,{value:Q.value,"onUpdate:value":t[3]||(t[3]=e=>Q.value=e),size:"small"},{default:a(()=>[o(G,{value:""},{default:a(()=>[...t[24]||(t[24]=[p("全部状态",-1)])]),_:1}),(s(!0),d(O,null,$(g(ze),e=>(s(),h(G,{key:e,value:e},{default:a(()=>[p(u(ge(e)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),o(ce,{columns:Ke,"data-source":We.value,pagination:{pageSize:20,showTotal:e=>`共 ${e} 个合约`},size:"small",loading:f.value,style:{background:"var(--bg-card)"}},{bodyCell:a(({column:e,record:c})=>[e.key==="slaId"?(s(),d("span",Qt,u(c.slaId.slice(0,12)),1)):v("",!0),e.key==="orgId"?(s(),d("span",Xt,u(c.orgId),1)):v("",!0),e.key==="tier"?(s(),h(A,{key:2,color:se(c.tier),style:{"font-family":"monospace"}},{default:a(()=>[p(u(c.tier.toUpperCase()),1)]),_:2},1032,["color"])):v("",!0),e.key==="status"?(s(),h(A,{key:3,color:Re(c.status)},{default:a(()=>[p(u(ge(c.status)),1)]),_:2},1032,["color"])):v("",!0),e.key==="monthlyFee"?(s(),d("span",Zt,u(c.monthlyFee.toFixed(2)),1)):v("",!0),e.key==="endDate"?(s(),d("span",eo,u(g(Te)(c.endDate)),1)):v("",!0),e.key==="action"?(s(),d(O,{key:6},[o(C,{size:"small",type:"link",onClick:ae=>nt(c)},{default:a(()=>[...t[25]||(t[25]=[p("指标",-1)])]),_:1},8,["onClick"]),o(C,{size:"small",type:"link",onClick:ae=>rt(c)},{default:a(()=>[...t[26]||(t[26]=[p("检查",-1)])]),_:1},8,["onClick"]),o(C,{size:"small",type:"link",onClick:ae=>it(c)},{default:a(()=>[...t[27]||(t[27]=[p("报告",-1)])]),_:1},8,["onClick"]),c.status==="active"?(s(),h(ct,{key:0,title:"终止该合约?","ok-text":"终止","cancel-text":"取消",onConfirm:ae=>lt(c)},{default:a(()=>[o(C,{size:"small",type:"link",danger:""},{default:a(()=>[...t[28]||(t[28]=[p("终止",-1)])]),_:1})]),_:1},8,["onConfirm"])):v("",!0)],64)):v("",!0)]),emptyText:a(()=>[b("div",to,[o(g(Ue),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),p(" "+u(Y.value||Q.value?"没有符合条件的合约":'暂无合约,点"新建合约"创建第一个'),1)])]),_:1},8,["data-source","pagination","loading"])]),_:1}),o(he,{key:"violations",tab:"违规"},{default:a(()=>[b("div",oo,[o(Se,{value:X.value,"onUpdate:value":t[4]||(t[4]=e=>X.value=e),size:"small","button-style":"solid"},{default:a(()=>[o(G,{value:""},{default:a(()=>[...t[29]||(t[29]=[p("全部严重度",-1)])]),_:1}),(s(!0),d(O,null,$(g(le),e=>(s(),h(G,{key:e,value:e},{default:a(()=>[p(u(J(e)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),o(ce,{columns:He,"data-source":Ye.value,pagination:{pageSize:20,showTotal:e=>`共 ${e} 条`},size:"small",loading:f.value,style:{background:"var(--bg-card)"}},{bodyCell:a(({column:e,record:c})=>[e.key==="violationId"?(s(),d("span",ao,u(c.violationId.slice(0,12)),1)):v("",!0),e.key==="term"?(s(),h(A,{key:1,color:"default",style:{"font-family":"monospace"}},{default:a(()=>[p(u(P(c.term)),1)]),_:2},1024)):v("",!0),e.key==="severity"?(s(),h(A,{key:2,color:ee(c.severity)},{default:a(()=>[p(u(J(c.severity)),1)]),_:2},1032,["color"])):v("",!0),e.key==="deviation"?(s(),h(K,{key:3,percent:Math.min(100,Math.round(c.deviationPercent)),"stroke-color":ke(c.severity),size:"small",format:()=>`${c.deviationPercent.toFixed(1)}%`},null,8,["percent","stroke-color","format"])):v("",!0),e.key==="expected"?(s(),d("span",lo,u(U(c.term,c.expectedValue)),1)):v("",!0),e.key==="actual"?(s(),d("span",no,u(U(c.term,c.actualValue)),1)):v("",!0),e.key==="compensation"?(s(),d(O,{key:6},[c.compensationAmount!==null?(s(),d("span",ro,u(c.compensationAmount.toFixed(2)),1)):(s(),d("span",io,"未计算"))],64)):v("",!0),e.key==="occurredAt"?(s(),d("span",so,u(g(Te)(c.occurredAt)),1)):v("",!0),e.key==="action"?(s(),d(O,{key:8},[c.compensationAmount===null?(s(),h(C,{key:0,size:"small",type:"link",onClick:ae=>st(c)},{default:a(()=>[...t[30]||(t[30]=[p("计算补偿",-1)])]),_:1},8,["onClick"])):(s(),h(C,{key:1,size:"small",type:"link",onClick:ae=>ut(c)},{default:a(()=>[...t[31]||(t[31]=[p("查看",-1)])]),_:1},8,["onClick"]))],64)):v("",!0)]),emptyText:a(()=>[b("div",uo,[o(g(Me),{style:{"font-size":"36px","margin-bottom":"10px",display:"block",color:"#52c41a"}}),p(" "+u(X.value?"没有符合条件的违规":"暂无违规记录"),1)])]),_:1},8,["data-source","pagination","loading"])]),_:1}),o(he,{key:"breakdown",tab:"分布统计"},{default:a(()=>[o(ue,{gutter:[16,16]},{default:a(()=>[o(R,{xs:24,lg:12},{default:a(()=>[o(V,{title:"合约 — 按状态",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"12px"}},{default:a(()=>[(s(!0),d(O,null,$(g(ze),e=>(s(),d("div",{key:e,class:"bd-row"},[o(A,{color:Re(e),style:{"min-width":"80px","text-align":"center"}},{default:a(()=>[p(u(ge(e)),1)]),_:2},1032,["color"]),o(K,{percent:te(S.value.byStatus[e]||0,S.value.totalContracts),"stroke-color":Ze(e),format:()=>`${S.value.byStatus[e]||0}`,size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128))]),_:1}),o(V,{title:"合约 — 按等级",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[(s(!0),d(O,null,$(g(pe),e=>(s(),d("div",{key:e,class:"bd-row"},[o(A,{color:se(e),style:{"min-width":"80px","text-align":"center","font-family":"monospace"}},{default:a(()=>[p(u(e.toUpperCase()),1)]),_:2},1032,["color"]),o(K,{percent:te(S.value.byTier[e]||0,S.value.totalContracts),"stroke-color":De(e),format:()=>`${S.value.byTier[e]||0}`,size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128))]),_:1})]),_:1}),o(R,{xs:24,lg:12},{default:a(()=>[o(V,{title:"违规 — 按严重度",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"12px"}},{default:a(()=>[(s(!0),d(O,null,$(g(le),e=>(s(),d("div",{key:e,class:"bd-row"},[o(A,{color:ee(e),style:{"min-width":"80px","text-align":"center"}},{default:a(()=>[p(u(J(e)),1)]),_:2},1032,["color"]),o(K,{percent:te(S.value.violations.bySeverity[e]||0,S.value.violations.total),"stroke-color":ke(e),format:()=>`${S.value.violations.bySeverity[e]||0}`,size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128))]),_:1}),o(V,{title:"违规 — 按指标",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[(s(!0),d(O,null,$(g(fe),e=>(s(),d("div",{key:e,class:"bd-row"},[o(A,{color:"default",style:{"min-width":"110px","text-align":"center","font-family":"monospace","font-size":"11px"}},{default:a(()=>[p(u(P(e)),1)]),_:2},1024),o(K,{percent:te(S.value.violations.byTerm[e]||0,S.value.violations.total),"stroke-color":"#fa8c16",format:()=>`${S.value.violations.byTerm[e]||0}`,size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","format"])]))),128))]),_:1})]),_:1})]),_:1})]),_:1})]),_:1},8,["activeKey"]),o(H,{open:ne.value,"onUpdate:open":t[10]||(t[10]=e=>ne.value=e),title:"新建 SLA 合约","confirm-loading":_.value,width:540,"ok-text":"创建","cancel-text":"取消",onOk:ot,onCancel:$e},{default:a(()=>[o(Ee,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:a(()=>[o(B,{label:"组织 ID",required:""},{default:a(()=>[o(pt,{value:I.orgId,"onUpdate:value":t[6]||(t[6]=e=>I.orgId=e),placeholder:"例如 org-acme"},null,8,["value"])]),_:1}),o(B,{label:"等级",required:""},{default:a(()=>[o(Ce,{value:I.tier,"onUpdate:value":t[7]||(t[7]=e=>I.tier=e)},{default:a(()=>[(s(!0),d(O,null,$(g(pe),e=>(s(),h(Ve,{key:e,value:e},{default:a(()=>[p(u(e.toUpperCase()),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),o(B,{label:"月费"},{default:a(()=>[o(Ie,{value:I.monthlyFee,"onUpdate:value":t[8]||(t[8]=e=>I.monthlyFee=e),min:0,step:100,style:{width:"160px"}},null,8,["value"])]),_:1}),o(B,{label:"期限 (天)"},{default:a(()=>[o(Ie,{value:I.durationDays,"onUpdate:value":t[9]||(t[9]=e=>I.durationDays=e),min:1,step:30,style:{width:"160px"}},null,8,["value"]),t[32]||(t[32]=b("span",{style:{"margin-left":"8px",color:"var(--text-muted)","font-size":"12px"}},"默认 30 天",-1))]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),o(H,{open:re.value,"onUpdate:open":t[14]||(t[14]=e=>re.value=e),title:"记录指标","confirm-loading":w.value,width:540,"ok-text":"记录","cancel-text":"取消",onOk:at,onCancel:Le},{default:a(()=>[o(Ee,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:a(()=>[o(B,{label:"SLA",required:""},{default:a(()=>[o(Ce,{value:T.slaId,"onUpdate:value":t[11]||(t[11]=e=>T.slaId=e),placeholder:"选择合约",options:me.value.map(e=>({value:e.slaId,label:`${e.slaId.slice(0,8)} · ${e.orgId} [${e.tier}]`})),"show-search":""},null,8,["value","options"])]),_:1}),o(B,{label:"指标",required:""},{default:a(()=>[o(Ce,{value:T.term,"onUpdate:value":t[12]||(t[12]=e=>T.term=e)},{default:a(()=>[(s(!0),d(O,null,$(g(fe),e=>(s(),h(Ve,{key:e,value:e},{default:a(()=>[p(u(P(e)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),o(B,{label:"数值",required:""},{default:a(()=>[o(Ie,{value:T.value,"onUpdate:value":t[13]||(t[13]=e=>T.value=e),step:.01,style:{width:"200px"}},null,8,["value"]),b("div",co,u(et(T.term)),1)]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),o(H,{open:ye.value,"onUpdate:open":t[15]||(t[15]=e=>ye.value=e),title:`指标聚合:${z.value?.slaId?.slice(0,12)||""}`,width:640,footer:null},{default:a(()=>[z.value?(s(),d("div",po,[o(Ne,{column:2,size:"small",bordered:""},{default:a(()=>[o(E,{label:"组织"},{default:a(()=>[p(u(z.value.orgId),1)]),_:1}),o(E,{label:"等级"},{default:a(()=>[o(A,{color:se(z.value.tier)},{default:a(()=>[p(u(z.value.tier.toUpperCase()),1)]),_:1},8,["color"])]),_:1}),o(E,{label:"样本数"},{default:a(()=>[p(u(Z.value.totalSamples),1)]),_:1}),o(E,{label:"月费"},{default:a(()=>[p(u(z.value.monthlyFee.toFixed(2)),1)]),_:1})]),_:1}),t[33]||(t[33]=b("h4",{style:{color:"var(--text-primary)","font-size":"13px",margin:"16px 0 10px"}},"按指标聚合",-1)),Object.keys(Z.value.byTerm).length?(s(),h(ce,{key:1,columns:we,"data-source":Qe.value,size:"small",pagination:!1,style:{background:"var(--bg-card)"}},{bodyCell:a(({column:e,record:c})=>[e.key==="term"?(s(),h(A,{key:0,color:"default",style:{"font-family":"monospace"}},{default:a(()=>[p(u(P(c.term)),1)]),_:2},1024)):v("",!0),e.key==="expected"?(s(),d("span",fo,u(U(c.term,c.expected)),1)):["mean","p95","min","max"].includes(e.key)?(s(),d("span",mo,u(U(c.term,c[e.key])),1)):v("",!0)]),_:1},8,["data-source"])):(s(),h(ft,{key:0,description:"尚无指标数据",image:g(i)},null,8,["image"]))])):v("",!0)]),_:1},8,["open","title"]),o(H,{open:be.value,"onUpdate:open":t[16]||(t[16]=e=>be.value=e),title:`违规检测:${z.value?.slaId?.slice(0,12)||""}`,width:640,footer:null},{default:a(()=>[L.value?(s(),d("div",vo,[o(mt,{status:L.value.totalViolations===0?"success":"warning",title:L.value.totalViolations===0?"未检测到违规":`检测到 ${L.value.totalViolations} 项违规`,"sub-title":`检测时间: ${g(Te)(L.value.checkedAt)}`},null,8,["status","title","sub-title"]),L.value.totalViolations>0?(s(),h(yt,{key:0,size:"small","data-source":L.value.violations},{renderItem:a(({item:e})=>[o(vt,null,{default:a(()=>[o(A,{color:ee(e.severity),style:{"min-width":"50px","text-align":"center"}},{default:a(()=>[p(u(J(e.severity)),1)]),_:2},1032,["color"]),b("span",yo,u(P(e.term)),1),b("span",bo," 期望 "+u(U(e.term,e.expectedValue))+" · 实际 "+u(U(e.term,e.actualValue)),1),b("span",_o,u(e.deviationPercent.toFixed(2))+"%",1)]),_:2},1024)]),_:1},8,["data-source"])):v("",!0)])):v("",!0)]),_:1},8,["open","title"]),o(H,{open:_e.value,"onUpdate:open":t[17]||(t[17]=e=>_e.value=e),title:`合规报告:${z.value?.slaId?.slice(0,12)||""}`,width:720,footer:null},{default:a(()=>[j.value?(s(),d("div",xo,[o(ue,{gutter:12,style:{"margin-bottom":"16px"}},{default:a(()=>[o(R,{span:8},{default:a(()=>[o(F,{title:"合规率",value:j.value.compliance*100,suffix:"%",precision:2,"value-style":{color:tt(j.value.compliance),fontSize:"20px"}},null,8,["value","value-style"])]),_:1}),o(R,{span:8},{default:a(()=>[o(F,{title:"违规总数",value:j.value.violations.total,"value-style":{color:"#ff4d4f",fontSize:"20px"}},null,8,["value"])]),_:1}),o(R,{span:8},{default:a(()=>[o(F,{title:"累计补偿",value:j.value.violations.totalCompensation,precision:2,"value-style":{color:"#faad14",fontSize:"20px"}},null,8,["value"])]),_:1})]),_:1}),t[34]||(t[34]=b("h4",{style:{color:"var(--text-primary)","font-size":"13px",margin:"16px 0 8px"}},"违规分布 — 按严重度",-1)),(s(!0),d(O,null,$(g(le),e=>(s(),d("div",{key:e,class:"bd-row"},[o(A,{color:ee(e),style:{"min-width":"80px","text-align":"center"}},{default:a(()=>[p(u(J(e)),1)]),_:2},1032,["color"]),o(K,{percent:te(j.value.violations.bySeverity[e]||0,j.value.violations.total),"stroke-color":ke(e),format:()=>`${j.value.violations.bySeverity[e]||0}`,size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128)),Object.keys(j.value.metricsByTerm).length?(s(),d("h4",go,"指标聚合")):v("",!0),Object.keys(j.value.metricsByTerm).length?(s(),h(ce,{key:1,columns:we,"data-source":Xe.value,size:"small",pagination:!1,style:{background:"var(--bg-card)"}},{bodyCell:a(({column:e,record:c})=>[e.key==="term"?(s(),h(A,{key:0,color:"default",style:{"font-family":"monospace"}},{default:a(()=>[p(u(P(c.term)),1)]),_:2},1024)):v("",!0),e.key==="expected"?(s(),d("span",ko,u(U(c.term,c.expected)),1)):["mean","p95","min","max"].includes(e.key)?(s(),d("span",So,u(U(c.term,c[e.key])),1)):v("",!0)]),_:1},8,["data-source"])):v("",!0)])):v("",!0)]),_:1},8,["open","title"]),o(H,{open:ie.value,"onUpdate:open":t[18]||(t[18]=e=>ie.value=e),title:`补偿计算:${xe.value?.violationId?.slice(0,12)||""}`,width:540,footer:null},{default:a(()=>[D.value?(s(),d("div",ho,[o(Ne,{column:2,size:"small",bordered:""},{default:a(()=>[o(E,{label:"违规 ID",span:2},{default:a(()=>[b("span",Co,u(D.value.violationId),1)]),_:1}),o(E,{label:"严重度"},{default:a(()=>[o(A,{color:ee(D.value.severity)},{default:a(()=>[p(u(J(D.value.severity)),1)]),_:1},8,["color"])]),_:1}),o(E,{label:"基础金额"},{default:a(()=>[b("span",Io,u(D.value.base.toFixed(4)),1)]),_:1}),o(E,{label:"偏差倍数"},{default:a(()=>[b("span",To,"×"+u(D.value.multiplier.toFixed(2)),1)]),_:1}),o(E,{label:"最终补偿"},{default:a(()=>[b("span",zo,u(D.value.amount.toFixed(2)),1)]),_:1})]),_:1})])):v("",!0)]),_:1},8,["open","title"])])}}},Mo=_t(Ao,[["__scopeId","data-v-049d391a"]]);export{Mo as default};
|
|
1
|
+
import{u as bt}from"./ws-Bv7YH0VB.js";import{s as Be}from"./community-parser-CO25nZFt.js";import{_ as _t}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{a as k}from"./index-BbqCdQXU.js";import{Y as xt,aI as gt,ac as kt,ag as Ue,aa as Me,w as St,aD as ht,an as Ct}from"./icons-ukMaZ3tx.js";import{E as It}from"./useConfigInject-BKqJUQaF.js";import{l as Tt,F as d,D as b,c as o,x as a,m as h,G as v,q as y,r as x,v as s,J as p,u as g,H as O,L as $,N as zt,I as u,j as de,a as Pe}from"./vendor-BVetwVfk.js";import"./index-ZZ_4A9um.js";import"./transition-CGYDOK3N.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-CHsntPCQ.js";import"./index-U4Zd5IK6.js";function N(l){const n=Be(l);if(!n)return null;try{return JSON.parse(n)}catch{}const i=n.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(!i)return null;try{return JSON.parse(i[0])}catch{return null}}const pe=Object.freeze(["gold","silver","bronze"]),ze=Object.freeze(["active","expired","terminated"]),fe=Object.freeze(["availability","response_time","throughput","error_rate"]),le=Object.freeze(["minor","moderate","major","critical"]),At=Object.freeze(["open","acknowledged","resolved","waived"]);function m(l,n=0){return typeof l=="number"&&Number.isFinite(l)?l:n}function W(l){if(!l)return{noDb:!1,error:""};const n=Be(l),i=/Database not available/i.test(n);return{noDb:i,error:i?"Database not available":""}}function jt(l,n=0){if(!l||typeof l!="object")return null;const i=l.name||"";return i?{key:i,name:i,availability:m(l.availability,0),maxResponseTime:m(l.maxResponseTime,0),minThroughput:m(l.minThroughput,0),maxErrorRate:m(l.maxErrorRate,0),compensationRate:m(l.compensationRate,0),_idx:n}:null}function Ot(l){const n=N(l);return Array.isArray(n)?n.map(jt).filter(Boolean):[]}function wt(l){const n={availability:0,maxResponseTime:0,minThroughput:0,maxErrorRate:0,compensationRate:0};return!l||typeof l!="object"||Array.isArray(l)?n:{availability:m(l.availability,0),maxResponseTime:m(l.maxResponseTime,0),minThroughput:m(l.minThroughput,0),maxErrorRate:m(l.maxErrorRate,0),compensationRate:m(l.compensationRate,0)}}function Je(l,n=0){if(!l||typeof l!="object")return null;const i=l.slaId||l.sla_id||"";return i?{key:i,slaId:i,orgId:String(l.orgId??l.org_id??""),tier:String(l.tier||"").toLowerCase(),terms:wt(l.terms),monthlyFee:m(l.monthlyFee??l.monthly_fee,0),startDate:l.startDate??l.start_date??null,endDate:l.endDate??l.end_date??null,status:String(l.status||"active").toLowerCase(),createdAt:l.createdAt??l.created_at??null,updatedAt:l.updatedAt??l.updated_at??null,_idx:n}:null}function Dt(l){const n=N(l);return Array.isArray(n)?n.map(Je).filter(Boolean):[]}function Ft(l){const n=N(l);return!n||typeof n!="object"||Array.isArray(n)?null:Je(n,0)}function qe(l){return!l||typeof l!="object"?null:{count:m(l.count,0),mean:m(l.mean,0),min:m(l.min,0),max:m(l.max,0),p95:m(l.p95,0)}}function Rt(l){const n=N(l);if(!n||typeof n!="object"||Array.isArray(n))return{slaId:"",totalSamples:0,byTerm:{}};const i={};if(n.byTerm&&typeof n.byTerm=="object")for(const[f,_]of Object.entries(n.byTerm)){const w=qe(_);w&&(i[f]=w)}return{slaId:String(n.slaId||""),totalSamples:m(n.totalSamples,0),byTerm:i}}function Ge(l,n=0){if(!l||typeof l!="object")return null;const i=l.violationId||l.violation_id||"";return i?{key:i,violationId:i,slaId:String(l.slaId??l.sla_id??""),term:String(l.term||"").toLowerCase(),severity:String(l.severity||"minor").toLowerCase(),expectedValue:m(l.expectedValue??l.expected_value,0),actualValue:m(l.actualValue??l.actual_value,0),deviationPercent:m(l.deviationPercent??l.deviation_percent,0),compensationAmount:typeof l.compensationAmount=="number"?l.compensationAmount:typeof l.compensation_amount=="number"?l.compensation_amount:null,occurredAt:l.occurredAt??l.occurred_at??null,resolvedAt:l.resolvedAt??l.resolved_at??null,v2Status:l.v2Status?String(l.v2Status).toLowerCase():"open",v2Note:l.v2Note??"",_idx:n}:null}function $t(l){const n=N(l);return Array.isArray(n)?n.map(Ge).filter(Boolean):[]}function Lt(l){const n=N(l);return!n||typeof n!="object"||Array.isArray(n)?{slaId:"",checkedAt:null,totalViolations:0,violations:[]}:{slaId:String(n.slaId||""),checkedAt:n.checkedAt??null,totalViolations:m(n.totalViolations,0),violations:Array.isArray(n.violations)?n.violations.map(Ge).filter(Boolean):[]}}function Vt(l){const n=N(l);return!n||typeof n!="object"||Array.isArray(n)?null:{violationId:String(n.violationId||""),slaId:String(n.slaId||""),severity:String(n.severity||""),base:m(n.base,0),multiplier:m(n.multiplier,0),amount:m(n.amount,0)}}const Et={slaId:"",tier:"",compliance:0,startDate:null,endDate:null,metricsByTerm:{},violations:{total:0,byTerm:{},bySeverity:{},totalCompensation:0}};function Nt(l){const n=JSON.parse(JSON.stringify(Et));for(const f of fe)n.violations.byTerm[f]=0;for(const f of le)n.violations.bySeverity[f]=0;const i=N(l);if(!i||typeof i!="object"||Array.isArray(i))return n;if(n.slaId=String(i.slaId||""),n.tier=String(i.tier||"").toLowerCase(),n.compliance=m(i.compliance,0),n.startDate=i.startDate??null,n.endDate=i.endDate??null,i.metricsByTerm&&typeof i.metricsByTerm=="object")for(const[f,_]of Object.entries(i.metricsByTerm)){const w=qe(_);w&&(n.metricsByTerm[f]=w)}if(i.violations&&typeof i.violations=="object"){if(n.violations.total=m(i.violations.total,0),n.violations.totalCompensation=m(i.violations.totalCompensation,0),i.violations.byTerm&&typeof i.violations.byTerm=="object")for(const[f,_]of Object.entries(i.violations.byTerm))typeof _=="number"&&Number.isFinite(_)&&(n.violations.byTerm[f]=_);if(i.violations.bySeverity&&typeof i.violations.bySeverity=="object")for(const[f,_]of Object.entries(i.violations.bySeverity))typeof _=="number"&&Number.isFinite(_)&&(n.violations.bySeverity[f]=_)}return n}const Ut={totalContracts:0,activeContracts:0,activeOrgs:0,maxActiveSlasPerOrg:0,byStatus:{},byTier:{},violations:{total:0,byTerm:{},bySeverity:{},byStatus:{},totalCompensation:0}};function Mt(l){const n=JSON.parse(JSON.stringify(Ut));for(const f of ze)n.byStatus[f]=0;for(const f of pe)n.byTier[f]=0;for(const f of fe)n.violations.byTerm[f]=0;for(const f of le)n.violations.bySeverity[f]=0;for(const f of At)n.violations.byStatus[f]=0;const i=N(l);if(!i||typeof i!="object"||Array.isArray(i))return n;if(n.totalContracts=m(i.totalContracts,0),n.activeContracts=m(i.activeContracts,0),n.activeOrgs=m(i.activeOrgs,0),n.maxActiveSlasPerOrg=m(i.maxActiveSlasPerOrg,0),i.byStatus&&typeof i.byStatus=="object")for(const[f,_]of Object.entries(i.byStatus))typeof _=="number"&&Number.isFinite(_)&&(n.byStatus[f]=_);if(i.byTier&&typeof i.byTier=="object")for(const[f,_]of Object.entries(i.byTier))typeof _=="number"&&Number.isFinite(_)&&(n.byTier[f]=_);if(i.violations&&typeof i.violations=="object"){n.violations.total=m(i.violations.total,0),n.violations.totalCompensation=m(i.violations.totalCompensation,0);for(const f of["byTerm","bySeverity","byStatus"])if(i.violations[f]&&typeof i.violations[f]=="object")for(const[_,w]of Object.entries(i.violations[f]))typeof w=="number"&&Number.isFinite(w)&&(n.violations[f][_]=w)}return n}function Te(l){if(l==null||l==="")return"—";const n=typeof l=="number"?new Date(l):new Date(String(l));return isNaN(n.getTime())?String(l):n.toLocaleString("zh-CN",{hour12:!1})}const Pt={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},Bt={class:"tier-head"},Jt={class:"tier-comp"},qt={class:"tier-terms"},Gt={class:"tier-term"},Kt={class:"tier-term"},Ht={class:"tier-term"},Wt={class:"tier-term"},Yt={class:"filter-bar"},Qt={key:0,style:{color:"var(--text-primary)","font-family":"monospace","font-size":"12px"}},Xt={key:1,style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"12px"}},Zt={key:4,style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"12px"}},eo={key:5,style:{color:"var(--text-secondary)","font-size":"11px"}},to={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},oo={class:"filter-bar"},ao={key:0,style:{color:"var(--text-primary)","font-family":"monospace","font-size":"12px"}},lo={key:4,style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"12px"}},no={key:5,style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"12px"}},ro={key:0,style:{color:"#faad14","font-weight":"500"}},io={key:1,style:{color:"var(--text-muted)"}},so={key:7,style:{color:"var(--text-secondary)","font-size":"11px"}},uo={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},co={style:{color:"var(--text-muted)","font-size":"11px","margin-top":"4px"}},po={key:0,style:{"padding-top":"8px"}},fo={key:1,style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"12px"}},mo={key:2,style:{"font-family":"monospace","font-size":"12px"}},vo={key:0,style:{"padding-top":"8px"}},yo={style:{"margin-left":"8px","font-family":"monospace","font-size":"12px"}},bo={style:{"margin-left":"8px",color:"var(--text-secondary)","font-size":"12px"}},_o={style:{"margin-left":"auto",color:"#ff4d4f","font-weight":"500"}},xo={key:0,style:{"padding-top":"8px"}},go={key:0,style:{color:"var(--text-primary)","font-size":"13px",margin:"16px 0 8px"}},ko={key:1,style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"12px"}},So={key:2,style:{"font-family":"monospace","font-size":"12px"}},ho={key:0,style:{"padding-top":"8px"}},Co={style:{"font-family":"monospace","font-size":"12px"}},Io={style:{"font-family":"monospace"}},To={style:{"font-family":"monospace"}},zo={style:{color:"#faad14","font-weight":"600","font-family":"monospace","font-size":"14px"}},Ao={__name:"Sla",setup(l){const n=bt(),i=It.PRESENTED_IMAGE_SIMPLE,f=x(!1),_=x(!1),w=x(!1),Ae=x([]),me=x([]),je=x([]),S=x({totalContracts:0,activeContracts:0,activeOrgs:0,maxActiveSlasPerOrg:0,byStatus:{},byTier:{},violations:{total:0,byTerm:{},bySeverity:{},byStatus:{},totalCompensation:0}}),ve=x({noDb:!1,error:""}),Oe=x("contracts"),Y=x(""),Q=x(""),X=x(""),ne=x(!1),re=x(!1),ye=x(!1),be=x(!1),_e=x(!1),ie=x(!1),I=Pe({orgId:"",tier:"silver",monthlyFee:1e3,durationDays:30}),T=Pe({slaId:null,term:"availability",value:null}),z=x(null),Z=x({slaId:"",totalSamples:0,byTerm:{}}),L=x(null),j=x(null),xe=x(null),F=x(null),Ke=[{title:"SLA ID",key:"slaId",width:"120px"},{title:"组织",key:"orgId",width:"160px"},{title:"等级",key:"tier",width:"90px"},{title:"状态",key:"status",width:"100px"},{title:"月费",key:"monthlyFee",width:"110px"},{title:"到期",key:"endDate",width:"160px"},{title:"操作",key:"action",width:"260px"}],He=[{title:"ID",key:"violationId",width:"120px"},{title:"指标",key:"term",width:"140px"},{title:"严重度",key:"severity",width:"100px"},{title:"偏差",key:"deviation",width:"180px"},{title:"期望",key:"expected",width:"110px"},{title:"实际",key:"actual",width:"110px"},{title:"补偿",key:"compensation",width:"110px"},{title:"发生时间",key:"occurredAt",width:"160px"},{title:"操作",key:"action",width:"120px"}],we=[{title:"指标",key:"term",width:"140px"},{title:"期望",key:"expected",width:"110px"},{title:"均值",key:"mean",width:"110px"},{title:"p95",key:"p95",width:"110px"},{title:"最小",key:"min",width:"110px"},{title:"最大",key:"max",width:"110px"},{title:"样本数",key:"count",width:"90px"}],We=de(()=>{let r=me.value;return Y.value&&(r=r.filter(t=>t.tier===Y.value)),Q.value&&(r=r.filter(t=>t.status===Q.value)),r}),Ye=de(()=>{let r=je.value;return X.value&&(r=r.filter(t=>t.severity===X.value)),r}),Qe=de(()=>z.value?Object.entries(Z.value.byTerm).map(([r,t])=>({key:r,term:r,expected:De(z.value.terms,r),...t})):[]),Xe=de(()=>!j.value||!z.value?[]:Object.entries(j.value.metricsByTerm).map(([r,t])=>({key:r,term:r,expected:De(z.value.terms,r),...t})));function De(r,t){if(!r)return 0;switch(t){case"availability":return r.availability;case"response_time":return r.maxResponseTime;case"throughput":return r.minThroughput;case"error_rate":return r.maxErrorRate;default:return 0}}function se(r){return{gold:"gold",silver:"default",bronze:"orange"}[r]||"default"}function Fe(r){return{gold:"#faad14",silver:"#8c8c8c",bronze:"#d4a373"}[r]||"#888"}function ge(r){return{active:"活跃",expired:"已过期",terminated:"已终止"}[r]||r}function Re(r){return{active:"green",expired:"default",terminated:"red"}[r]||"default"}function Ze(r){return{active:"#52c41a",expired:"#888",terminated:"#ff4d4f"}[r]||"#888"}function B(r){return{availability:"可用性",response_time:"响应时间",throughput:"吞吐量",error_rate:"错误率"}[r]||r}function et(r){return{availability:"比例 0~1,例如 0.997",response_time:"毫秒,例如 120",throughput:"每秒请求数,例如 850",error_rate:"比例 0~1,例如 0.003"}[r]||""}function U(r,t){return typeof t!="number"||!Number.isFinite(t)?"—":r==="availability"||r==="error_rate"?(t*100).toFixed(3)+"%":r==="response_time"?t.toFixed(1)+"ms":r==="throughput"?t.toFixed(0)+" rps":t.toFixed(4)}function J(r){return{minor:"轻微",moderate:"中等",major:"严重",critical:"关键"}[r]||r}function ee(r){return{minor:"default",moderate:"gold",major:"orange",critical:"red"}[r]||"default"}function ke(r){return{minor:"#888",moderate:"#faad14",major:"#fa8c16",critical:"#ff4d4f"}[r]||"#888"}function tt(r){return r>=.99?"#52c41a":r>=.9?"#1677ff":r>=.7?"#faad14":"#ff4d4f"}function te(r,t){return t?Math.round(r/t*100):0}async function q(){f.value=!0,ve.value={noDb:!1,error:""};try{const[r,t,C,oe]=await Promise.all([n.execute("sla tiers --json",8e3).catch(()=>({output:""})),n.execute("sla list --limit 200 --json",1e4).catch(()=>({output:""})),n.execute("sla violations --limit 200 --json",1e4).catch(()=>({output:""})),n.execute("sla stats-v2",8e3).catch(()=>({output:""}))]),M=[t,C,oe].map(D=>W(D.output)).find(D=>D.noDb);M&&(ve.value=M),Ae.value=Ot(r.output),me.value=Dt(t.output),je.value=$t(C.output),S.value=Mt(oe.output)}catch(r){k.error("加载 SLA 数据失败: "+(r?.message||r))}finally{f.value=!1}}async function ot(){if(!I.orgId.trim()){k.warning("请填写组织 ID");return}_.value=!0;try{const r=I.durationDays*24*60*60*1e3,t=[`sla create "${I.orgId.trim().replace(/"/g,'\\"')}"`,`-t ${I.tier}`,`-d ${r}`,`-f ${I.monthlyFee||0}`,"--json"],{output:C}=await n.execute(t.join(" "),1e4);if(W(C).noDb){k.error("需要先 cc init 初始化项目");return}const M=Ft(C);if(!M){k.error("创建失败: "+C.slice(0,120));return}k.success(`合约已创建:${M.slaId.slice(0,8)}`),ne.value=!1,$e(),await q()}catch(r){k.error("创建失败: "+(r?.message||r))}finally{_.value=!1}}async function at(){if(!T.slaId){k.warning("请选择 SLA 合约");return}if(T.value===null||T.value===void 0){k.warning("请填写指标数值");return}w.value=!0;try{const{output:r}=await n.execute(`sla record ${T.slaId} ${T.term} ${T.value} --json`,8e3);if(W(r).noDb){k.error("需要先 cc init 初始化项目");return}if(!/"metricId"|"term"/.test(r)){k.error("记录失败: "+r.slice(0,120));return}k.success("指标已记录"),re.value=!1,Le()}catch(r){k.error("记录失败: "+(r?.message||r))}finally{w.value=!1}}async function lt(r){try{const{output:t}=await n.execute(`sla terminate ${r.slaId}`,8e3);if(W(t).noDb){k.error("需要先 cc init 初始化项目");return}if(/Failed/i.test(t)&&!/terminated/i.test(t)){k.error("终止失败: "+t.slice(0,120));return}k.success("合约已终止"),await q()}catch(t){k.error("终止失败: "+(t?.message||t))}}async function nt(r){z.value=r,Z.value={slaId:"",totalSamples:0,byTerm:{}},ye.value=!0;try{const{output:t}=await n.execute(`sla metrics ${r.slaId} --json`,8e3);Z.value=Rt(t)}catch(t){k.error("加载指标失败: "+(t?.message||t))}}async function rt(r){z.value=r,L.value=null,be.value=!0;try{const{output:t}=await n.execute(`sla check ${r.slaId} --json`,1e4);if(W(t).noDb){k.error("需要先 cc init 初始化项目");return}L.value=Lt(t),L.value.totalViolations>0&&await q()}catch(t){k.error("检查失败: "+(t?.message||t))}}async function it(r){z.value=r,j.value=null,_e.value=!0;try{const{output:t}=await n.execute(`sla report ${r.slaId} --json`,1e4);j.value=Nt(t)}catch(t){k.error("加载报告失败: "+(t?.message||t))}}async function st(r){xe.value=r,F.value=null;try{const{output:t}=await n.execute(`sla compensate ${r.violationId} --json`,8e3);if(W(t).noDb){k.error("需要先 cc init 初始化项目");return}if(F.value=Vt(t),!F.value){k.error("计算失败: "+t.slice(0,120));return}ie.value=!0,await q()}catch(t){k.error("计算失败: "+(t?.message||t))}}function ut(r){xe.value=r,F.value={violationId:r.violationId,slaId:r.slaId,severity:r.severity,base:0,multiplier:0,amount:r.compensationAmount||0},ie.value=!0}function $e(){I.orgId="",I.tier="silver",I.monthlyFee=1e3,I.durationDays=30}function Le(){T.slaId=null,T.term="availability",T.value=null}return Tt(q),(r,t)=>{const C=y("a-button"),oe=y("a-space"),M=y("a-alert"),D=y("a-statistic"),V=y("a-card"),R=y("a-col"),ue=y("a-row"),A=y("a-tag"),G=y("a-radio-button"),Se=y("a-radio-group"),ct=y("a-popconfirm"),ce=y("a-table"),he=y("a-tab-pane"),K=y("a-progress"),dt=y("a-tabs"),pt=y("a-input"),P=y("a-form-item"),Ve=y("a-select-option"),Ce=y("a-select"),Ie=y("a-input-number"),Ee=y("a-form"),H=y("a-modal"),E=y("a-descriptions-item"),Ne=y("a-descriptions"),ft=y("a-empty"),mt=y("a-result"),vt=y("a-list-item"),yt=y("a-list");return s(),d("div",null,[b("div",Pt,[t[22]||(t[22]=b("div",null,[b("h2",{class:"page-title"},"SLA 管理"),b("p",{class:"page-sub"},"服务等级合约 · 指标记录 · 偏差检测 · 补偿计算")],-1)),o(oe,null,{default:a(()=>[o(C,{loading:f.value,onClick:q},{icon:a(()=>[o(g(xt))]),default:a(()=>[t[19]||(t[19]=p(" 刷新 ",-1))]),_:1},8,["loading"]),o(C,{onClick:t[0]||(t[0]=e=>re.value=!0)},{icon:a(()=>[o(g(gt))]),default:a(()=>[t[20]||(t[20]=p(" 记录指标 ",-1))]),_:1}),o(C,{type:"primary",onClick:t[1]||(t[1]=e=>ne.value=!0)},{icon:a(()=>[o(g(kt))]),default:a(()=>[t[21]||(t[21]=p(" 新建合约 ",-1))]),_:1})]),_:1})]),ve.value.noDb?(s(),h(M,{key:0,type:"info","show-icon":"",message:"该模块需要项目级数据库",description:"`cc sla ...` 命令仅在 chainlesschain 项目目录下可用。请先运行 `cc init` 初始化项目,或在已初始化的目录启动 `cc serve`。",style:{"margin-bottom":"16px"}})):v("",!0),o(ue,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:a(()=>[o(R,{xs:12,sm:8,lg:5},{default:a(()=>[o(V,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(D,{title:"合约总数",value:S.value.totalContracts,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:a(()=>[o(g(Ue))]),_:1},8,["value"])]),_:1})]),_:1}),o(R,{xs:12,sm:8,lg:5},{default:a(()=>[o(V,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(D,{title:"活跃合约",value:S.value.activeContracts,"value-style":{color:S.value.activeContracts>0?"#52c41a":"#888",fontSize:"20px"}},{prefix:a(()=>[o(g(Me))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),o(R,{xs:12,sm:8,lg:5},{default:a(()=>[o(V,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(D,{title:"合作组织",value:S.value.activeOrgs,"value-style":{color:"#722ed1",fontSize:"20px"},suffix:S.value.maxActiveSlasPerOrg?`· cap=${S.value.maxActiveSlasPerOrg}`:""},{prefix:a(()=>[o(g(St))]),_:1},8,["value","suffix"])]),_:1})]),_:1}),o(R,{xs:12,sm:8,lg:5},{default:a(()=>[o(V,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(D,{title:"违规总数",value:S.value.violations.total,"value-style":{color:S.value.violations.total>0?"#ff4d4f":"#888",fontSize:"20px"}},{prefix:a(()=>[o(g(ht))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),o(R,{xs:24,sm:8,lg:4},{default:a(()=>[o(V,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(D,{title:"累计补偿",value:S.value.violations.totalCompensation,precision:2,"value-style":{color:"#faad14",fontSize:"20px"}},{prefix:a(()=>[o(g(Ct))]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),o(V,{title:"SLA 等级",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"},"body-style":{padding:"12px 16px"}},{default:a(()=>[o(ue,{gutter:[12,12]},{default:a(()=>[(s(!0),d(O,null,$(Ae.value,e=>(s(),h(R,{key:e.name,xs:24,sm:8},{default:a(()=>[b("div",{class:"tier-pill",style:zt({borderLeftColor:Fe(e.name)})},[b("div",Bt,[o(A,{color:se(e.name),style:{"font-family":"monospace","font-size":"13px"}},{default:a(()=>[p(u(e.name.toUpperCase()),1)]),_:2},1032,["color"]),b("span",Jt,"补偿率 "+u((e.compensationRate*100).toFixed(1))+"%",1)]),b("div",qt,[b("span",Gt,"可用性 ≥ "+u((e.availability*100).toFixed(2))+"%",1),b("span",Kt,"p95 ≤ "+u(e.maxResponseTime)+"ms",1),b("span",Ht,"RPS ≥ "+u(e.minThroughput),1),b("span",Wt,"错误率 ≤ "+u((e.maxErrorRate*100).toFixed(2))+"%",1)])],4)]),_:2},1024))),128))]),_:1})]),_:1}),o(dt,{activeKey:Oe.value,"onUpdate:activeKey":t[5]||(t[5]=e=>Oe.value=e),class:"sla-tabs"},{default:a(()=>[o(he,{key:"contracts",tab:"合约"},{default:a(()=>[b("div",Yt,[o(Se,{value:Y.value,"onUpdate:value":t[2]||(t[2]=e=>Y.value=e),size:"small","button-style":"solid"},{default:a(()=>[o(G,{value:""},{default:a(()=>[...t[23]||(t[23]=[p("全部等级",-1)])]),_:1}),(s(!0),d(O,null,$(g(pe),e=>(s(),h(G,{key:e,value:e},{default:a(()=>[p(u(e.toUpperCase()),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),o(Se,{value:Q.value,"onUpdate:value":t[3]||(t[3]=e=>Q.value=e),size:"small"},{default:a(()=>[o(G,{value:""},{default:a(()=>[...t[24]||(t[24]=[p("全部状态",-1)])]),_:1}),(s(!0),d(O,null,$(g(ze),e=>(s(),h(G,{key:e,value:e},{default:a(()=>[p(u(ge(e)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),o(ce,{columns:Ke,"data-source":We.value,pagination:{pageSize:20,showTotal:e=>`共 ${e} 个合约`},size:"small",loading:f.value,style:{background:"var(--bg-card)"}},{bodyCell:a(({column:e,record:c})=>[e.key==="slaId"?(s(),d("span",Qt,u(c.slaId.slice(0,12)),1)):v("",!0),e.key==="orgId"?(s(),d("span",Xt,u(c.orgId),1)):v("",!0),e.key==="tier"?(s(),h(A,{key:2,color:se(c.tier),style:{"font-family":"monospace"}},{default:a(()=>[p(u(c.tier.toUpperCase()),1)]),_:2},1032,["color"])):v("",!0),e.key==="status"?(s(),h(A,{key:3,color:Re(c.status)},{default:a(()=>[p(u(ge(c.status)),1)]),_:2},1032,["color"])):v("",!0),e.key==="monthlyFee"?(s(),d("span",Zt,u(c.monthlyFee.toFixed(2)),1)):v("",!0),e.key==="endDate"?(s(),d("span",eo,u(g(Te)(c.endDate)),1)):v("",!0),e.key==="action"?(s(),d(O,{key:6},[o(C,{size:"small",type:"link",onClick:ae=>nt(c)},{default:a(()=>[...t[25]||(t[25]=[p("指标",-1)])]),_:1},8,["onClick"]),o(C,{size:"small",type:"link",onClick:ae=>rt(c)},{default:a(()=>[...t[26]||(t[26]=[p("检查",-1)])]),_:1},8,["onClick"]),o(C,{size:"small",type:"link",onClick:ae=>it(c)},{default:a(()=>[...t[27]||(t[27]=[p("报告",-1)])]),_:1},8,["onClick"]),c.status==="active"?(s(),h(ct,{key:0,title:"终止该合约?","ok-text":"终止","cancel-text":"取消",onConfirm:ae=>lt(c)},{default:a(()=>[o(C,{size:"small",type:"link",danger:""},{default:a(()=>[...t[28]||(t[28]=[p("终止",-1)])]),_:1})]),_:1},8,["onConfirm"])):v("",!0)],64)):v("",!0)]),emptyText:a(()=>[b("div",to,[o(g(Ue),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),p(" "+u(Y.value||Q.value?"没有符合条件的合约":'暂无合约,点"新建合约"创建第一个'),1)])]),_:1},8,["data-source","pagination","loading"])]),_:1}),o(he,{key:"violations",tab:"违规"},{default:a(()=>[b("div",oo,[o(Se,{value:X.value,"onUpdate:value":t[4]||(t[4]=e=>X.value=e),size:"small","button-style":"solid"},{default:a(()=>[o(G,{value:""},{default:a(()=>[...t[29]||(t[29]=[p("全部严重度",-1)])]),_:1}),(s(!0),d(O,null,$(g(le),e=>(s(),h(G,{key:e,value:e},{default:a(()=>[p(u(J(e)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),o(ce,{columns:He,"data-source":Ye.value,pagination:{pageSize:20,showTotal:e=>`共 ${e} 条`},size:"small",loading:f.value,style:{background:"var(--bg-card)"}},{bodyCell:a(({column:e,record:c})=>[e.key==="violationId"?(s(),d("span",ao,u(c.violationId.slice(0,12)),1)):v("",!0),e.key==="term"?(s(),h(A,{key:1,color:"default",style:{"font-family":"monospace"}},{default:a(()=>[p(u(B(c.term)),1)]),_:2},1024)):v("",!0),e.key==="severity"?(s(),h(A,{key:2,color:ee(c.severity)},{default:a(()=>[p(u(J(c.severity)),1)]),_:2},1032,["color"])):v("",!0),e.key==="deviation"?(s(),h(K,{key:3,percent:Math.min(100,Math.round(c.deviationPercent)),"stroke-color":ke(c.severity),size:"small",format:()=>`${c.deviationPercent.toFixed(1)}%`},null,8,["percent","stroke-color","format"])):v("",!0),e.key==="expected"?(s(),d("span",lo,u(U(c.term,c.expectedValue)),1)):v("",!0),e.key==="actual"?(s(),d("span",no,u(U(c.term,c.actualValue)),1)):v("",!0),e.key==="compensation"?(s(),d(O,{key:6},[c.compensationAmount!==null?(s(),d("span",ro,u(c.compensationAmount.toFixed(2)),1)):(s(),d("span",io,"未计算"))],64)):v("",!0),e.key==="occurredAt"?(s(),d("span",so,u(g(Te)(c.occurredAt)),1)):v("",!0),e.key==="action"?(s(),d(O,{key:8},[c.compensationAmount===null?(s(),h(C,{key:0,size:"small",type:"link",onClick:ae=>st(c)},{default:a(()=>[...t[30]||(t[30]=[p("计算补偿",-1)])]),_:1},8,["onClick"])):(s(),h(C,{key:1,size:"small",type:"link",onClick:ae=>ut(c)},{default:a(()=>[...t[31]||(t[31]=[p("查看",-1)])]),_:1},8,["onClick"]))],64)):v("",!0)]),emptyText:a(()=>[b("div",uo,[o(g(Me),{style:{"font-size":"36px","margin-bottom":"10px",display:"block",color:"#52c41a"}}),p(" "+u(X.value?"没有符合条件的违规":"暂无违规记录"),1)])]),_:1},8,["data-source","pagination","loading"])]),_:1}),o(he,{key:"breakdown",tab:"分布统计"},{default:a(()=>[o(ue,{gutter:[16,16]},{default:a(()=>[o(R,{xs:24,lg:12},{default:a(()=>[o(V,{title:"合约 — 按状态",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"12px"}},{default:a(()=>[(s(!0),d(O,null,$(g(ze),e=>(s(),d("div",{key:e,class:"bd-row"},[o(A,{color:Re(e),style:{"min-width":"80px","text-align":"center"}},{default:a(()=>[p(u(ge(e)),1)]),_:2},1032,["color"]),o(K,{percent:te(S.value.byStatus[e]||0,S.value.totalContracts),"stroke-color":Ze(e),format:()=>`${S.value.byStatus[e]||0}`,size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128))]),_:1}),o(V,{title:"合约 — 按等级",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[(s(!0),d(O,null,$(g(pe),e=>(s(),d("div",{key:e,class:"bd-row"},[o(A,{color:se(e),style:{"min-width":"80px","text-align":"center","font-family":"monospace"}},{default:a(()=>[p(u(e.toUpperCase()),1)]),_:2},1032,["color"]),o(K,{percent:te(S.value.byTier[e]||0,S.value.totalContracts),"stroke-color":Fe(e),format:()=>`${S.value.byTier[e]||0}`,size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128))]),_:1})]),_:1}),o(R,{xs:24,lg:12},{default:a(()=>[o(V,{title:"违规 — 按严重度",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"12px"}},{default:a(()=>[(s(!0),d(O,null,$(g(le),e=>(s(),d("div",{key:e,class:"bd-row"},[o(A,{color:ee(e),style:{"min-width":"80px","text-align":"center"}},{default:a(()=>[p(u(J(e)),1)]),_:2},1032,["color"]),o(K,{percent:te(S.value.violations.bySeverity[e]||0,S.value.violations.total),"stroke-color":ke(e),format:()=>`${S.value.violations.bySeverity[e]||0}`,size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128))]),_:1}),o(V,{title:"违规 — 按指标",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[(s(!0),d(O,null,$(g(fe),e=>(s(),d("div",{key:e,class:"bd-row"},[o(A,{color:"default",style:{"min-width":"110px","text-align":"center","font-family":"monospace","font-size":"11px"}},{default:a(()=>[p(u(B(e)),1)]),_:2},1024),o(K,{percent:te(S.value.violations.byTerm[e]||0,S.value.violations.total),"stroke-color":"#fa8c16",format:()=>`${S.value.violations.byTerm[e]||0}`,size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","format"])]))),128))]),_:1})]),_:1})]),_:1})]),_:1})]),_:1},8,["activeKey"]),o(H,{open:ne.value,"onUpdate:open":t[10]||(t[10]=e=>ne.value=e),title:"新建 SLA 合约","confirm-loading":_.value,width:540,"ok-text":"创建","cancel-text":"取消",onOk:ot,onCancel:$e},{default:a(()=>[o(Ee,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:a(()=>[o(P,{label:"组织 ID",required:""},{default:a(()=>[o(pt,{value:I.orgId,"onUpdate:value":t[6]||(t[6]=e=>I.orgId=e),placeholder:"例如 org-acme"},null,8,["value"])]),_:1}),o(P,{label:"等级",required:""},{default:a(()=>[o(Ce,{value:I.tier,"onUpdate:value":t[7]||(t[7]=e=>I.tier=e)},{default:a(()=>[(s(!0),d(O,null,$(g(pe),e=>(s(),h(Ve,{key:e,value:e},{default:a(()=>[p(u(e.toUpperCase()),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),o(P,{label:"月费"},{default:a(()=>[o(Ie,{value:I.monthlyFee,"onUpdate:value":t[8]||(t[8]=e=>I.monthlyFee=e),min:0,step:100,style:{width:"160px"}},null,8,["value"])]),_:1}),o(P,{label:"期限 (天)"},{default:a(()=>[o(Ie,{value:I.durationDays,"onUpdate:value":t[9]||(t[9]=e=>I.durationDays=e),min:1,step:30,style:{width:"160px"}},null,8,["value"]),t[32]||(t[32]=b("span",{style:{"margin-left":"8px",color:"var(--text-muted)","font-size":"12px"}},"默认 30 天",-1))]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),o(H,{open:re.value,"onUpdate:open":t[14]||(t[14]=e=>re.value=e),title:"记录指标","confirm-loading":w.value,width:540,"ok-text":"记录","cancel-text":"取消",onOk:at,onCancel:Le},{default:a(()=>[o(Ee,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:a(()=>[o(P,{label:"SLA",required:""},{default:a(()=>[o(Ce,{value:T.slaId,"onUpdate:value":t[11]||(t[11]=e=>T.slaId=e),placeholder:"选择合约",options:me.value.map(e=>({value:e.slaId,label:`${e.slaId.slice(0,8)} · ${e.orgId} [${e.tier}]`})),"show-search":""},null,8,["value","options"])]),_:1}),o(P,{label:"指标",required:""},{default:a(()=>[o(Ce,{value:T.term,"onUpdate:value":t[12]||(t[12]=e=>T.term=e)},{default:a(()=>[(s(!0),d(O,null,$(g(fe),e=>(s(),h(Ve,{key:e,value:e},{default:a(()=>[p(u(B(e)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),o(P,{label:"数值",required:""},{default:a(()=>[o(Ie,{value:T.value,"onUpdate:value":t[13]||(t[13]=e=>T.value=e),step:.01,style:{width:"200px"}},null,8,["value"]),b("div",co,u(et(T.term)),1)]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),o(H,{open:ye.value,"onUpdate:open":t[15]||(t[15]=e=>ye.value=e),title:`指标聚合:${z.value?.slaId?.slice(0,12)||""}`,width:640,footer:null},{default:a(()=>[z.value?(s(),d("div",po,[o(Ne,{column:2,size:"small",bordered:""},{default:a(()=>[o(E,{label:"组织"},{default:a(()=>[p(u(z.value.orgId),1)]),_:1}),o(E,{label:"等级"},{default:a(()=>[o(A,{color:se(z.value.tier)},{default:a(()=>[p(u(z.value.tier.toUpperCase()),1)]),_:1},8,["color"])]),_:1}),o(E,{label:"样本数"},{default:a(()=>[p(u(Z.value.totalSamples),1)]),_:1}),o(E,{label:"月费"},{default:a(()=>[p(u(z.value.monthlyFee.toFixed(2)),1)]),_:1})]),_:1}),t[33]||(t[33]=b("h4",{style:{color:"var(--text-primary)","font-size":"13px",margin:"16px 0 10px"}},"按指标聚合",-1)),Object.keys(Z.value.byTerm).length?(s(),h(ce,{key:1,columns:we,"data-source":Qe.value,size:"small",pagination:!1,style:{background:"var(--bg-card)"}},{bodyCell:a(({column:e,record:c})=>[e.key==="term"?(s(),h(A,{key:0,color:"default",style:{"font-family":"monospace"}},{default:a(()=>[p(u(B(c.term)),1)]),_:2},1024)):v("",!0),e.key==="expected"?(s(),d("span",fo,u(U(c.term,c.expected)),1)):["mean","p95","min","max"].includes(e.key)?(s(),d("span",mo,u(U(c.term,c[e.key])),1)):v("",!0)]),_:1},8,["data-source"])):(s(),h(ft,{key:0,description:"尚无指标数据",image:g(i)},null,8,["image"]))])):v("",!0)]),_:1},8,["open","title"]),o(H,{open:be.value,"onUpdate:open":t[16]||(t[16]=e=>be.value=e),title:`违规检测:${z.value?.slaId?.slice(0,12)||""}`,width:640,footer:null},{default:a(()=>[L.value?(s(),d("div",vo,[o(mt,{status:L.value.totalViolations===0?"success":"warning",title:L.value.totalViolations===0?"未检测到违规":`检测到 ${L.value.totalViolations} 项违规`,"sub-title":`检测时间: ${g(Te)(L.value.checkedAt)}`},null,8,["status","title","sub-title"]),L.value.totalViolations>0?(s(),h(yt,{key:0,size:"small","data-source":L.value.violations},{renderItem:a(({item:e})=>[o(vt,null,{default:a(()=>[o(A,{color:ee(e.severity),style:{"min-width":"50px","text-align":"center"}},{default:a(()=>[p(u(J(e.severity)),1)]),_:2},1032,["color"]),b("span",yo,u(B(e.term)),1),b("span",bo," 期望 "+u(U(e.term,e.expectedValue))+" · 实际 "+u(U(e.term,e.actualValue)),1),b("span",_o,u(e.deviationPercent.toFixed(2))+"%",1)]),_:2},1024)]),_:1},8,["data-source"])):v("",!0)])):v("",!0)]),_:1},8,["open","title"]),o(H,{open:_e.value,"onUpdate:open":t[17]||(t[17]=e=>_e.value=e),title:`合规报告:${z.value?.slaId?.slice(0,12)||""}`,width:720,footer:null},{default:a(()=>[j.value?(s(),d("div",xo,[o(ue,{gutter:12,style:{"margin-bottom":"16px"}},{default:a(()=>[o(R,{span:8},{default:a(()=>[o(D,{title:"合规率",value:j.value.compliance*100,suffix:"%",precision:2,"value-style":{color:tt(j.value.compliance),fontSize:"20px"}},null,8,["value","value-style"])]),_:1}),o(R,{span:8},{default:a(()=>[o(D,{title:"违规总数",value:j.value.violations.total,"value-style":{color:"#ff4d4f",fontSize:"20px"}},null,8,["value"])]),_:1}),o(R,{span:8},{default:a(()=>[o(D,{title:"累计补偿",value:j.value.violations.totalCompensation,precision:2,"value-style":{color:"#faad14",fontSize:"20px"}},null,8,["value"])]),_:1})]),_:1}),t[34]||(t[34]=b("h4",{style:{color:"var(--text-primary)","font-size":"13px",margin:"16px 0 8px"}},"违规分布 — 按严重度",-1)),(s(!0),d(O,null,$(g(le),e=>(s(),d("div",{key:e,class:"bd-row"},[o(A,{color:ee(e),style:{"min-width":"80px","text-align":"center"}},{default:a(()=>[p(u(J(e)),1)]),_:2},1032,["color"]),o(K,{percent:te(j.value.violations.bySeverity[e]||0,j.value.violations.total),"stroke-color":ke(e),format:()=>`${j.value.violations.bySeverity[e]||0}`,size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128)),Object.keys(j.value.metricsByTerm).length?(s(),d("h4",go,"指标聚合")):v("",!0),Object.keys(j.value.metricsByTerm).length?(s(),h(ce,{key:1,columns:we,"data-source":Xe.value,size:"small",pagination:!1,style:{background:"var(--bg-card)"}},{bodyCell:a(({column:e,record:c})=>[e.key==="term"?(s(),h(A,{key:0,color:"default",style:{"font-family":"monospace"}},{default:a(()=>[p(u(B(c.term)),1)]),_:2},1024)):v("",!0),e.key==="expected"?(s(),d("span",ko,u(U(c.term,c.expected)),1)):["mean","p95","min","max"].includes(e.key)?(s(),d("span",So,u(U(c.term,c[e.key])),1)):v("",!0)]),_:1},8,["data-source"])):v("",!0)])):v("",!0)]),_:1},8,["open","title"]),o(H,{open:ie.value,"onUpdate:open":t[18]||(t[18]=e=>ie.value=e),title:`补偿计算:${xe.value?.violationId?.slice(0,12)||""}`,width:540,footer:null},{default:a(()=>[F.value?(s(),d("div",ho,[o(Ne,{column:2,size:"small",bordered:""},{default:a(()=>[o(E,{label:"违规 ID",span:2},{default:a(()=>[b("span",Co,u(F.value.violationId),1)]),_:1}),o(E,{label:"严重度"},{default:a(()=>[o(A,{color:ee(F.value.severity)},{default:a(()=>[p(u(J(F.value.severity)),1)]),_:1},8,["color"])]),_:1}),o(E,{label:"基础金额"},{default:a(()=>[b("span",Io,u(F.value.base.toFixed(4)),1)]),_:1}),o(E,{label:"偏差倍数"},{default:a(()=>[b("span",To,"×"+u(F.value.multiplier.toFixed(2)),1)]),_:1}),o(E,{label:"最终补偿"},{default:a(()=>[b("span",zo,u(F.value.amount.toFixed(2)),1)]),_:1})]),_:1})])):v("",!0)]),_:1},8,["open","title"])])}}},Mo=_t(Ao,[["__scopeId","data-v-049d391a"]]);export{Mo as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{k as F,r as $,j as I,l as P,M as R,F as d,D as f,c as o,x as l,u as s,m as T,G as b,q as _,v as r,J as g,I as u,H as A,L as V}from"./vendor-BVetwVfk.js";import{u as B}from"./ws-Bv7YH0VB.js";import{_ as L}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{
|
|
1
|
+
import{k as F,r as $,j as I,l as P,M as R,F as d,D as f,c as o,x as l,u as s,m as T,G as b,q as _,v as r,J as g,I as u,H as A,L as V}from"./vendor-BVetwVfk.js";import{u as B}from"./ws-Bv7YH0VB.js";import{_ as L}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{Y as E}from"./icons-ukMaZ3tx.js";const M=F("tasks",()=>{const v=$([]),t=$(!1);let w=null,k=null;const S=I(()=>v.value.filter(e=>e.status==="running")),x=I(()=>v.value.filter(e=>e.status==="pending")),i=I(()=>v.value.filter(e=>e.status==="completed"||e.status==="failed"||e.status==="timeout"));async function a(){const e=B();t.value=!0;try{const p=await e.sendRaw({type:"tasks-list"});p&&Array.isArray(p.tasks)&&(v.value=p.tasks)}catch{}finally{t.value=!1}}async function N(e){const p=B();try{await p.sendRaw({type:"tasks-stop",taskId:e})}catch{}finally{await a()}}const C=$(null);function z(e=5e3){y(),a(),w=setInterval(a,e),m()}function y(){w&&(clearInterval(w),w=null),k&&(k(),k=null)}function m(){const e=B();if(k)return;const p=n=>{n.type==="task:notification"&&n.payload?.task&&(C.value=n.payload.task,a(),setTimeout(()=>{C.value=null},8e3))};k=e.onRuntimeEvent(p)}function h(e){return!e||e<0?"-":e<1e3?`${e}ms`:e<6e4?`${(e/1e3).toFixed(1)}s`:`${(e/6e4).toFixed(1)}m`}function D(e){switch(e){case"running":return"processing";case"pending":return"default";case"completed":return"success";case"failed":return"error";case"timeout":return"warning";default:return"default"}}return{tasks:v,loading:t,running:S,pending:x,completed:i,lastNotification:C,fetchTasks:a,stopTask:N,startPolling:z,stopPolling:y,formatDuration:h,getStatusColor:D}}),U={class:"page-header"},j={key:0,class:"error-text"},q={key:1},G={class:"task-header"},H={class:"task-desc"},J={class:"task-id"},O={class:"task-meta"},W=["title"],Y={key:0,class:"error-text"},K={key:1,class:"success-text"},Q={key:2,class:"muted-text"},X={__name:"Tasks",setup(v){const t=M(),w=[{title:"状态",key:"status",width:90},{title:"描述",key:"description",ellipsis:!0},{title:"类型",dataIndex:"type",width:100},{title:"耗时",key:"duration",width:90},{title:"创建时间",key:"createdAt",width:180},{title:"结果",key:"result",ellipsis:!0},{title:"操作",key:"action",width:80}];function k(i){return i.status==="running"&&i.startedAt?t.formatDuration(Date.now()-i.startedAt):i.completedAt&&i.startedAt?t.formatDuration(i.completedAt-i.startedAt):"-"}function S(i){return i?new Date(i).toLocaleString():"-"}function x(i,a){return i?i.length>a?`${i.slice(0,a)}...`:i:""}return P(()=>t.startPolling(5e3)),R(()=>t.stopPolling()),(i,a)=>{const N=_("a-button"),C=_("a-space"),z=_("a-alert"),y=_("a-statistic"),m=_("a-card"),h=_("a-col"),D=_("a-row"),e=_("a-tag"),p=_("a-table");return r(),d("div",null,[f("div",U,[a[3]||(a[3]=f("div",null,[f("h2",{class:"page-title"},"后台任务"),f("p",{class:"page-sub"},"查看后台任务队列、实时通知和任务执行结果。")],-1)),o(C,null,{default:l(()=>[o(N,{ghost:"",loading:s(t).loading,onClick:a[0]||(a[0]=n=>s(t).fetchTasks())},{icon:l(()=>[o(s(E))]),default:l(()=>[a[2]||(a[2]=g(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),s(t).lastNotification?(r(),T(z,{key:0,type:s(t).lastNotification.status==="completed"?"success":"error","show-icon":"",closable:"",class:"banner",onClose:a[1]||(a[1]=n=>s(t).lastNotification=null)},{message:l(()=>[g(" 任务"+u(s(t).lastNotification.status==="completed"?"完成":"结束")+": "+u(s(t).lastNotification.description||s(t).lastNotification.id.slice(0,16)),1)]),description:l(()=>[s(t).lastNotification.error?(r(),d("span",j,u(s(t).lastNotification.error),1)):s(t).lastNotification.result?(r(),d("span",q,u(x(String(s(t).lastNotification.result),120)),1)):b("",!0)]),_:1},8,["type"])):b("",!0),o(D,{gutter:[16,16],class:"stats-row"},{default:l(()=>[o(h,{xs:12,sm:6},{default:l(()=>[o(m,{class:"stat-card",size:"small"},{default:l(()=>[o(y,{title:"全部任务",value:s(t).tasks.length},null,8,["value"])]),_:1})]),_:1}),o(h,{xs:12,sm:6},{default:l(()=>[o(m,{class:"stat-card",size:"small"},{default:l(()=>[o(y,{title:"运行中",value:s(t).running.length},null,8,["value"])]),_:1})]),_:1}),o(h,{xs:12,sm:6},{default:l(()=>[o(m,{class:"stat-card",size:"small"},{default:l(()=>[o(y,{title:"等待中",value:s(t).pending.length},null,8,["value"])]),_:1})]),_:1}),o(h,{xs:12,sm:6},{default:l(()=>[o(m,{class:"stat-card",size:"small"},{default:l(()=>[o(y,{title:"已完成",value:s(t).completed.length},null,8,["value"])]),_:1})]),_:1})]),_:1}),s(t).running.length>0?(r(),T(m,{key:1,title:"运行中的任务",class:"panel-card",size:"small"},{default:l(()=>[(r(!0),d(A,null,V(s(t).running,n=>(r(),d("div",{key:n.id,class:"task-item running"},[f("div",G,[o(e,{color:s(t).getStatusColor(n.status)},{default:l(()=>[g(u(n.status.toUpperCase()),1)]),_:2},1032,["color"]),f("span",H,u(n.description),1),f("span",J,u(n.id.slice(0,16)),1)]),f("div",O,[f("span",null,"类型: "+u(n.type||"-"),1),f("span",null,"已运行: "+u(s(t).formatDuration(Date.now()-n.startedAt)),1),o(N,{size:"small",danger:"",onClick:c=>s(t).stopTask(n.id)},{default:l(()=>[...a[4]||(a[4]=[g("停止",-1)])]),_:1},8,["onClick"])])]))),128))]),_:1})):b("",!0),o(m,{class:"panel-card"},{default:l(()=>[o(p,{columns:w,"data-source":s(t).tasks,pagination:{pageSize:15,size:"small"},loading:s(t).loading,"row-key":"id",size:"small"},{bodyCell:l(({column:n,record:c})=>[n.key==="status"?(r(),T(e,{key:0,color:s(t).getStatusColor(c.status)},{default:l(()=>[g(u(c.status),1)]),_:2},1032,["color"])):n.key==="description"?(r(),d("span",{key:1,title:c.command},u(c.description),9,W)):n.key==="duration"?(r(),d(A,{key:2},[g(u(k(c)),1)],64)):n.key==="createdAt"?(r(),d(A,{key:3},[g(u(S(c.createdAt)),1)],64)):n.key==="result"?(r(),d(A,{key:4},[c.error?(r(),d("span",Y,u(x(c.error,60)),1)):c.result?(r(),d("span",K,u(x(String(c.result),60)),1)):(r(),d("span",Q,"-"))],64)):n.key==="action"?(r(),d(A,{key:5},[c.status==="running"?(r(),T(N,{key:0,size:"small",danger:"",onClick:Z=>s(t).stopTask(c.id)},{default:l(()=>[...a[5]||(a[5]=[g(" 停止 ",-1)])]),_:1},8,["onClick"])):b("",!0)],64)):b("",!0)]),_:1},8,["data-source","loading"])]),_:1})])}}},nt=L(X,[["__scopeId","data-v-c8e3e605"]]);export{nt as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{l as fe,F as x,D as n,c as t,x as o,r as c,q as l,a as ye,B as ge,v as p,H as A,L as R,u,I as d,J as i,m as y,G as U}from"./vendor-BVetwVfk.js";import{u as _e}from"./ws-Bv7YH0VB.js";import{_ as xe}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{R as M,a7 as G,b as be,w as H,aa as ke,a as W,ao as we,an as Ce}from"./icons-E3MGhN6s.js";import{a as h}from"./index-DLcTmwiN.js";import"./index-DPaLf3-g.js";import"./useConfigInject-DIKG5Y4I.js";import"./transition-atE2sWdv.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-CHsntPCQ.js";import"./index-U4Zd5IK6.js";const ze={style:{display:"flex","align-items":"flex-start",gap:"10px"}},he={style:{flex:"1","min-width":"0"}},Pe={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px","font-family":"monospace","margin-bottom":"4px"}},Oe={style:{color:"var(--text-secondary)","font-size":"12px","line-height":"1.5"}},Ie={style:{"margin-top":"12px","text-align":"right"}},Te={style:{margin:"0","font-size":"12px","white-space":"pre-wrap","max-height":"200px","overflow-y":"auto"}},$e={key:0,style:{"text-align":"center",padding:"40px"}},Be={style:{display:"flex","align-items":"flex-start",gap:"10px"}},je={style:{flex:"1","min-width":"0"}},Se={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px","margin-bottom":"4px"}},Ne={style:{color:"var(--text-secondary)","font-size":"12px","line-height":"1.5"}},Ae={key:0,style:{"margin-top":"4px"}},Re={style:{"margin-top":"12px","text-align":"right"}},Ue={style:{margin:"0","font-size":"12px","white-space":"pre-wrap","max-height":"200px","overflow-y":"auto"}},De={style:{"margin-bottom":"16px"}},Le={style:{display:"flex","align-items":"center",gap:"8px","margin-bottom":"8px"}},qe={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px",flex:"1",overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"}},Fe={style:{color:"var(--text-secondary)","font-size":"12px","line-height":"1.5","max-height":"60px",overflow:"hidden","text-overflow":"ellipsis","white-space":"pre-wrap"}},Je={style:{"margin-top":"12px",display:"flex",gap:"8px","justify-content":"flex-end"}},Y="cc_prompt_templates",Ke={__name:"Templates",setup(Ve){const P=_e(),Q=ge(),D=c("project"),O=c(""),v=c(null),b=c(!1),I=c(""),X=[{name:"code-project",description:"代码项目 — 代码审查、重构、单元测试"},{name:"data-science",description:"数据科学 — ML/数据分析、可视化"},{name:"devops",description:"DevOps — 基础设施、部署、监控"},{name:"medical-triage",description:"医疗分诊 — 症状分析、分诊建议"},{name:"agriculture-expert",description:"农业专家 — 作物管理、病虫害"},{name:"general-assistant",description:"通用助手 — 日常问答、任务管理"},{name:"ai-media-creator",description:"AI 媒体创作 — 图文生成、视频脚本"},{name:"ai-doc-creator",description:"AI 文档创作 — 文档生成、格式转换"},{name:"empty",description:"空白模板 — 最小项目结构"}];function Z(s){I.value=s,b.value=!0}async function ee(){b.value=!1;const s=I.value;if(s){O.value=s,v.value=null;try{const e=`init --template ${s} --yes`,{output:m,exitCode:_}=await P.execute(e,3e4);v.value={success:_===0,output:m}}catch(e){v.value={success:!1,output:`初始化失败: ${e.message}`}}finally{O.value=""}}}const T=c(!1),k=c([]),$=c(""),f=c(null);async function te(){T.value=!0;try{const{output:s}=await P.execute("bi templates --json",15e3),e=JSON.parse(s);k.value=Array.isArray(e)?e:e.templates||[]}catch{k.value=[]}finally{T.value=!1}}async function oe(s){$.value=s,f.value=null;try{const e=`bi dashboard create --template ${s} --json`,{output:m,exitCode:_}=await P.execute(e,3e4);f.value={success:_===0,output:m}}catch(e){f.value={success:!1,output:`创建失败: ${e.message}`}}finally{$.value=""}}const g=c([]),w=c(!1),r=ye({name:"",category:"general",content:""});function ae(){try{const s=localStorage.getItem(Y);g.value=s?JSON.parse(s):[]}catch{g.value=[]}}function L(){localStorage.setItem(Y,JSON.stringify(g.value))}function ne(){!r.name||!r.content||(g.value.push({name:r.name,category:r.category,content:r.content}),L(),q(),h.success("模板已保存"))}function q(){w.value=!1,r.name="",r.category="general",r.content=""}function se(s){g.value.splice(s,1),L(),h.success("模板已删除")}function le(s){navigator.clipboard.writeText(s.content).then(()=>{h.success("已复制到剪贴板")}).catch(()=>{h.error("复制失败")})}function ie(s){Q.push({path:"/chat",query:{prompt:s.content}})}function re(s){return{general:"blue",code:"green",writing:"orange",analysis:"purple"}[s]||"default"}return fe(()=>{ae(),te()}),(s,e)=>{const m=l("a-button"),_=l("a-card"),B=l("a-col"),j=l("a-row"),F=l("a-alert"),S=l("a-tab-pane"),pe=l("a-spin"),J=l("a-empty"),K=l("a-tag"),ue=l("a-tabs"),V=l("a-modal"),ce=l("a-input"),N=l("a-form-item"),C=l("a-select-option"),de=l("a-select"),me=l("a-textarea"),ve=l("a-form");return p(),x("div",null,[e[27]||(e[27]=n("div",{style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},[n("div",null,[n("h2",{class:"page-title"},"模板中心"),n("p",{class:"page-sub"},"项目模板 / BI 模板 / Prompt 模板")])],-1)),t(ue,{activeKey:D.value,"onUpdate:activeKey":e[3]||(e[3]=a=>D.value=a),type:"card"},{default:o(()=>[t(S,{key:"project"},{tab:o(()=>[t(u(be)),e[10]||(e[10]=i(" 项目模板 ",-1))]),default:o(()=>[t(j,{gutter:[16,16]},{default:o(()=>[(p(),x(A,null,R(X,a=>t(B,{key:a.name,xs:24,sm:12,lg:8},{default:o(()=>[t(_,{size:"small",hoverable:"",class:"template-card",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[n("div",ze,[t(u(M),{style:{"font-size":"24px",color:"#1677ff","flex-shrink":"0","margin-top":"2px"}}),n("div",he,[n("div",Pe,d(a.name),1),n("div",Oe,d(a.description),1)])]),n("div",Ie,[t(m,{type:"primary",size:"small",loading:O.value===a.name,onClick:z=>Z(a.name)},{icon:o(()=>[t(u(G))]),default:o(()=>[e[11]||(e[11]=i(" 初始化 ",-1))]),_:1},8,["loading","onClick"])])]),_:2},1024)]),_:2},1024)),64))]),_:1}),v.value?(p(),y(F,{key:0,message:v.value.success?"初始化成功":"初始化失败",type:v.value.success?"success":"error","show-icon":"",closable:"",style:{"margin-top":"16px"},onClose:e[0]||(e[0]=a=>v.value=null)},{description:o(()=>[n("pre",Te,d(v.value.output),1)]),_:1},8,["message","type"])):U("",!0)]),_:1}),t(S,{key:"bi"},{tab:o(()=>[t(u(H)),e[12]||(e[12]=i(" BI 模板 ",-1))]),default:o(()=>[T.value?(p(),x("div",$e,[t(pe),e[13]||(e[13]=n("div",{style:{color:"var(--text-muted)","margin-top":"8px"}},"加载 BI 模板...",-1))])):k.value.length?(p(),y(j,{key:2,gutter:[16,16]},{default:o(()=>[(p(!0),x(A,null,R(k.value,a=>(p(),y(B,{key:a.id,xs:24,sm:12,lg:8},{default:o(()=>[t(_,{size:"small",hoverable:"",class:"template-card",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[n("div",Be,[t(u(H),{style:{"font-size":"24px",color:"#722ed1","flex-shrink":"0","margin-top":"2px"}}),n("div",je,[n("div",Se,d(a.name),1),n("div",Ne,d(a.description||"暂无描述"),1),a.id?(p(),x("div",Ae,[t(K,{size:"small",color:"purple"},{default:o(()=>[i(d(a.id),1)]),_:2},1024)])):U("",!0)])]),n("div",Re,[t(m,{type:"primary",size:"small",loading:$.value===a.id,onClick:z=>oe(a.id)},{icon:o(()=>[t(u(G))]),default:o(()=>[e[14]||(e[14]=i(" 创建仪表板 ",-1))]),_:1},8,["loading","onClick"])])]),_:2},1024)]),_:2},1024))),128))]),_:1})):(p(),y(J,{key:1,description:"暂无 BI 模板"})),f.value?(p(),y(F,{key:3,message:f.value.success?"仪表板创建成功":"创建失败",type:f.value.success?"success":"error","show-icon":"",closable:"",style:{"margin-top":"16px"},onClose:e[1]||(e[1]=a=>f.value=null)},{description:o(()=>[n("pre",Ue,d(f.value.output),1)]),_:1},8,["message","type"])):U("",!0)]),_:1}),t(S,{key:"prompts"},{tab:o(()=>[t(u(W)),e[15]||(e[15]=i(" Prompt 模板 ",-1))]),default:o(()=>[n("div",De,[t(m,{type:"primary",onClick:e[2]||(e[2]=a=>w.value=!0)},{icon:o(()=>[t(u(ke))]),default:o(()=>[e[16]||(e[16]=i(" 新建模板 ",-1))]),_:1})]),g.value.length?(p(),y(j,{key:1,gutter:[16,16]},{default:o(()=>[(p(!0),x(A,null,R(g.value,(a,z)=>(p(),y(B,{key:z,xs:24,sm:12,lg:8},{default:o(()=>[t(_,{size:"small",class:"template-card",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[n("div",Le,[t(u(W),{style:{"font-size":"18px",color:"#52c41a"}}),n("span",qe,d(a.name),1),t(K,{color:re(a.category),size:"small"},{default:o(()=>[i(d(a.category),1)]),_:2},1032,["color"])]),n("div",Fe,d(a.content.length>120?a.content.slice(0,120)+"...":a.content),1),n("div",Je,[t(m,{size:"small",onClick:E=>ie(a)},{icon:o(()=>[t(u(M))]),default:o(()=>[e[17]||(e[17]=i(" 使用 ",-1))]),_:1},8,["onClick"]),t(m,{size:"small",onClick:E=>le(a)},{icon:o(()=>[t(u(we))]),default:o(()=>[e[18]||(e[18]=i(" 复制 ",-1))]),_:1},8,["onClick"]),t(m,{size:"small",danger:"",onClick:E=>se(z)},{icon:o(()=>[t(u(Ce))]),default:o(()=>[e[19]||(e[19]=i(" 删除 ",-1))]),_:1},8,["onClick"])])]),_:2},1024)]),_:2},1024))),128))]),_:1})):(p(),y(J,{key:0,description:"暂无 Prompt 模板,点击上方按钮创建"}))]),_:1})]),_:1},8,["activeKey"]),t(V,{open:b.value,"onUpdate:open":e[4]||(e[4]=a=>b.value=a),title:"确认初始化",onOk:ee,onCancel:e[5]||(e[5]=a=>b.value=!1),"ok-text":"确认","cancel-text":"取消"},{default:o(()=>[n("p",null,[e[20]||(e[20]=i("确定要使用模板 ",-1)),n("strong",null,d(I.value),1),e[21]||(e[21]=i(" 初始化项目吗?",-1))]),e[22]||(e[22]=n("p",{style:{color:"var(--text-muted)","font-size":"12px"}},"这将在当前工作目录创建项目结构。",-1))]),_:1},8,["open"]),t(V,{open:w.value,"onUpdate:open":e[9]||(e[9]=a=>w.value=a),title:"新建 Prompt 模板",onOk:ne,onCancel:q,"ok-text":"保存","cancel-text":"取消","ok-button-props":{disabled:!r.name||!r.content}},{default:o(()=>[t(ve,{layout:"vertical"},{default:o(()=>[t(N,{label:"模板名称",required:""},{default:o(()=>[t(ce,{value:r.name,"onUpdate:value":e[6]||(e[6]=a=>r.name=a),placeholder:"输入模板名称"},null,8,["value"])]),_:1}),t(N,{label:"分类"},{default:o(()=>[t(de,{value:r.category,"onUpdate:value":e[7]||(e[7]=a=>r.category=a),style:{width:"100%"}},{default:o(()=>[t(C,{value:"general"},{default:o(()=>[...e[23]||(e[23]=[i("general",-1)])]),_:1}),t(C,{value:"code"},{default:o(()=>[...e[24]||(e[24]=[i("code",-1)])]),_:1}),t(C,{value:"writing"},{default:o(()=>[...e[25]||(e[25]=[i("writing",-1)])]),_:1}),t(C,{value:"analysis"},{default:o(()=>[...e[26]||(e[26]=[i("analysis",-1)])]),_:1})]),_:1},8,["value"])]),_:1}),t(N,{label:"模板内容",required:""},{default:o(()=>[t(me,{value:r.content,"onUpdate:value":e[8]||(e[8]=a=>r.content=a),rows:6,placeholder:"输入 Prompt 模板内容"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","ok-button-props"])])}}},ot=xe(Ke,[["__scopeId","data-v-22e50acf"]]);export{ot as default};
|
|
1
|
+
import{l as fe,F as x,D as n,c as t,x as o,r as c,q as l,a as ye,B as ge,v as p,H as A,L as R,u,I as d,J as i,m as y,G as U}from"./vendor-BVetwVfk.js";import{u as _e}from"./ws-Bv7YH0VB.js";import{_ as xe}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{R as M,a9 as G,b as be,y as H,ac as ke,a as W,aq as we,ap as Ce}from"./icons-ukMaZ3tx.js";import{a as h}from"./index-BbqCdQXU.js";import"./index-ZZ_4A9um.js";import"./useConfigInject-BKqJUQaF.js";import"./transition-CGYDOK3N.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-CHsntPCQ.js";import"./index-U4Zd5IK6.js";const ze={style:{display:"flex","align-items":"flex-start",gap:"10px"}},he={style:{flex:"1","min-width":"0"}},Pe={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px","font-family":"monospace","margin-bottom":"4px"}},Oe={style:{color:"var(--text-secondary)","font-size":"12px","line-height":"1.5"}},Ie={style:{"margin-top":"12px","text-align":"right"}},Te={style:{margin:"0","font-size":"12px","white-space":"pre-wrap","max-height":"200px","overflow-y":"auto"}},$e={key:0,style:{"text-align":"center",padding:"40px"}},Be={style:{display:"flex","align-items":"flex-start",gap:"10px"}},je={style:{flex:"1","min-width":"0"}},Se={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px","margin-bottom":"4px"}},Ne={style:{color:"var(--text-secondary)","font-size":"12px","line-height":"1.5"}},Ae={key:0,style:{"margin-top":"4px"}},Re={style:{"margin-top":"12px","text-align":"right"}},Ue={style:{margin:"0","font-size":"12px","white-space":"pre-wrap","max-height":"200px","overflow-y":"auto"}},qe={style:{"margin-bottom":"16px"}},De={style:{display:"flex","align-items":"center",gap:"8px","margin-bottom":"8px"}},Le={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px",flex:"1",overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"}},Fe={style:{color:"var(--text-secondary)","font-size":"12px","line-height":"1.5","max-height":"60px",overflow:"hidden","text-overflow":"ellipsis","white-space":"pre-wrap"}},Je={style:{"margin-top":"12px",display:"flex",gap:"8px","justify-content":"flex-end"}},Y="cc_prompt_templates",Ke={__name:"Templates",setup(Ve){const P=_e(),Q=ge(),q=c("project"),O=c(""),v=c(null),b=c(!1),I=c(""),X=[{name:"code-project",description:"代码项目 — 代码审查、重构、单元测试"},{name:"data-science",description:"数据科学 — ML/数据分析、可视化"},{name:"devops",description:"DevOps — 基础设施、部署、监控"},{name:"medical-triage",description:"医疗分诊 — 症状分析、分诊建议"},{name:"agriculture-expert",description:"农业专家 — 作物管理、病虫害"},{name:"general-assistant",description:"通用助手 — 日常问答、任务管理"},{name:"ai-media-creator",description:"AI 媒体创作 — 图文生成、视频脚本"},{name:"ai-doc-creator",description:"AI 文档创作 — 文档生成、格式转换"},{name:"empty",description:"空白模板 — 最小项目结构"}];function Z(s){I.value=s,b.value=!0}async function ee(){b.value=!1;const s=I.value;if(s){O.value=s,v.value=null;try{const e=`init --template ${s} --yes`,{output:m,exitCode:_}=await P.execute(e,3e4);v.value={success:_===0,output:m}}catch(e){v.value={success:!1,output:`初始化失败: ${e.message}`}}finally{O.value=""}}}const T=c(!1),k=c([]),$=c(""),f=c(null);async function te(){T.value=!0;try{const{output:s}=await P.execute("bi templates --json",15e3),e=JSON.parse(s);k.value=Array.isArray(e)?e:e.templates||[]}catch{k.value=[]}finally{T.value=!1}}async function oe(s){$.value=s,f.value=null;try{const e=`bi dashboard create --template ${s} --json`,{output:m,exitCode:_}=await P.execute(e,3e4);f.value={success:_===0,output:m}}catch(e){f.value={success:!1,output:`创建失败: ${e.message}`}}finally{$.value=""}}const g=c([]),w=c(!1),r=ye({name:"",category:"general",content:""});function ae(){try{const s=localStorage.getItem(Y);g.value=s?JSON.parse(s):[]}catch{g.value=[]}}function D(){localStorage.setItem(Y,JSON.stringify(g.value))}function ne(){!r.name||!r.content||(g.value.push({name:r.name,category:r.category,content:r.content}),D(),L(),h.success("模板已保存"))}function L(){w.value=!1,r.name="",r.category="general",r.content=""}function se(s){g.value.splice(s,1),D(),h.success("模板已删除")}function le(s){navigator.clipboard.writeText(s.content).then(()=>{h.success("已复制到剪贴板")}).catch(()=>{h.error("复制失败")})}function ie(s){Q.push({path:"/chat",query:{prompt:s.content}})}function re(s){return{general:"blue",code:"green",writing:"orange",analysis:"purple"}[s]||"default"}return fe(()=>{ae(),te()}),(s,e)=>{const m=l("a-button"),_=l("a-card"),B=l("a-col"),j=l("a-row"),F=l("a-alert"),S=l("a-tab-pane"),pe=l("a-spin"),J=l("a-empty"),K=l("a-tag"),ue=l("a-tabs"),V=l("a-modal"),ce=l("a-input"),N=l("a-form-item"),C=l("a-select-option"),de=l("a-select"),me=l("a-textarea"),ve=l("a-form");return p(),x("div",null,[e[27]||(e[27]=n("div",{style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},[n("div",null,[n("h2",{class:"page-title"},"模板中心"),n("p",{class:"page-sub"},"项目模板 / BI 模板 / Prompt 模板")])],-1)),t(ue,{activeKey:q.value,"onUpdate:activeKey":e[3]||(e[3]=a=>q.value=a),type:"card"},{default:o(()=>[t(S,{key:"project"},{tab:o(()=>[t(u(be)),e[10]||(e[10]=i(" 项目模板 ",-1))]),default:o(()=>[t(j,{gutter:[16,16]},{default:o(()=>[(p(),x(A,null,R(X,a=>t(B,{key:a.name,xs:24,sm:12,lg:8},{default:o(()=>[t(_,{size:"small",hoverable:"",class:"template-card",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[n("div",ze,[t(u(M),{style:{"font-size":"24px",color:"#1677ff","flex-shrink":"0","margin-top":"2px"}}),n("div",he,[n("div",Pe,d(a.name),1),n("div",Oe,d(a.description),1)])]),n("div",Ie,[t(m,{type:"primary",size:"small",loading:O.value===a.name,onClick:z=>Z(a.name)},{icon:o(()=>[t(u(G))]),default:o(()=>[e[11]||(e[11]=i(" 初始化 ",-1))]),_:1},8,["loading","onClick"])])]),_:2},1024)]),_:2},1024)),64))]),_:1}),v.value?(p(),y(F,{key:0,message:v.value.success?"初始化成功":"初始化失败",type:v.value.success?"success":"error","show-icon":"",closable:"",style:{"margin-top":"16px"},onClose:e[0]||(e[0]=a=>v.value=null)},{description:o(()=>[n("pre",Te,d(v.value.output),1)]),_:1},8,["message","type"])):U("",!0)]),_:1}),t(S,{key:"bi"},{tab:o(()=>[t(u(H)),e[12]||(e[12]=i(" BI 模板 ",-1))]),default:o(()=>[T.value?(p(),x("div",$e,[t(pe),e[13]||(e[13]=n("div",{style:{color:"var(--text-muted)","margin-top":"8px"}},"加载 BI 模板...",-1))])):k.value.length?(p(),y(j,{key:2,gutter:[16,16]},{default:o(()=>[(p(!0),x(A,null,R(k.value,a=>(p(),y(B,{key:a.id,xs:24,sm:12,lg:8},{default:o(()=>[t(_,{size:"small",hoverable:"",class:"template-card",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[n("div",Be,[t(u(H),{style:{"font-size":"24px",color:"#722ed1","flex-shrink":"0","margin-top":"2px"}}),n("div",je,[n("div",Se,d(a.name),1),n("div",Ne,d(a.description||"暂无描述"),1),a.id?(p(),x("div",Ae,[t(K,{size:"small",color:"purple"},{default:o(()=>[i(d(a.id),1)]),_:2},1024)])):U("",!0)])]),n("div",Re,[t(m,{type:"primary",size:"small",loading:$.value===a.id,onClick:z=>oe(a.id)},{icon:o(()=>[t(u(G))]),default:o(()=>[e[14]||(e[14]=i(" 创建仪表板 ",-1))]),_:1},8,["loading","onClick"])])]),_:2},1024)]),_:2},1024))),128))]),_:1})):(p(),y(J,{key:1,description:"暂无 BI 模板"})),f.value?(p(),y(F,{key:3,message:f.value.success?"仪表板创建成功":"创建失败",type:f.value.success?"success":"error","show-icon":"",closable:"",style:{"margin-top":"16px"},onClose:e[1]||(e[1]=a=>f.value=null)},{description:o(()=>[n("pre",Ue,d(f.value.output),1)]),_:1},8,["message","type"])):U("",!0)]),_:1}),t(S,{key:"prompts"},{tab:o(()=>[t(u(W)),e[15]||(e[15]=i(" Prompt 模板 ",-1))]),default:o(()=>[n("div",qe,[t(m,{type:"primary",onClick:e[2]||(e[2]=a=>w.value=!0)},{icon:o(()=>[t(u(ke))]),default:o(()=>[e[16]||(e[16]=i(" 新建模板 ",-1))]),_:1})]),g.value.length?(p(),y(j,{key:1,gutter:[16,16]},{default:o(()=>[(p(!0),x(A,null,R(g.value,(a,z)=>(p(),y(B,{key:z,xs:24,sm:12,lg:8},{default:o(()=>[t(_,{size:"small",class:"template-card",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[n("div",De,[t(u(W),{style:{"font-size":"18px",color:"#52c41a"}}),n("span",Le,d(a.name),1),t(K,{color:re(a.category),size:"small"},{default:o(()=>[i(d(a.category),1)]),_:2},1032,["color"])]),n("div",Fe,d(a.content.length>120?a.content.slice(0,120)+"...":a.content),1),n("div",Je,[t(m,{size:"small",onClick:E=>ie(a)},{icon:o(()=>[t(u(M))]),default:o(()=>[e[17]||(e[17]=i(" 使用 ",-1))]),_:1},8,["onClick"]),t(m,{size:"small",onClick:E=>le(a)},{icon:o(()=>[t(u(we))]),default:o(()=>[e[18]||(e[18]=i(" 复制 ",-1))]),_:1},8,["onClick"]),t(m,{size:"small",danger:"",onClick:E=>se(z)},{icon:o(()=>[t(u(Ce))]),default:o(()=>[e[19]||(e[19]=i(" 删除 ",-1))]),_:1},8,["onClick"])])]),_:2},1024)]),_:2},1024))),128))]),_:1})):(p(),y(J,{key:0,description:"暂无 Prompt 模板,点击上方按钮创建"}))]),_:1})]),_:1},8,["activeKey"]),t(V,{open:b.value,"onUpdate:open":e[4]||(e[4]=a=>b.value=a),title:"确认初始化",onOk:ee,onCancel:e[5]||(e[5]=a=>b.value=!1),"ok-text":"确认","cancel-text":"取消"},{default:o(()=>[n("p",null,[e[20]||(e[20]=i("确定要使用模板 ",-1)),n("strong",null,d(I.value),1),e[21]||(e[21]=i(" 初始化项目吗?",-1))]),e[22]||(e[22]=n("p",{style:{color:"var(--text-muted)","font-size":"12px"}},"这将在当前工作目录创建项目结构。",-1))]),_:1},8,["open"]),t(V,{open:w.value,"onUpdate:open":e[9]||(e[9]=a=>w.value=a),title:"新建 Prompt 模板",onOk:ne,onCancel:L,"ok-text":"保存","cancel-text":"取消","ok-button-props":{disabled:!r.name||!r.content}},{default:o(()=>[t(ve,{layout:"vertical"},{default:o(()=>[t(N,{label:"模板名称",required:""},{default:o(()=>[t(ce,{value:r.name,"onUpdate:value":e[6]||(e[6]=a=>r.name=a),placeholder:"输入模板名称"},null,8,["value"])]),_:1}),t(N,{label:"分类"},{default:o(()=>[t(de,{value:r.category,"onUpdate:value":e[7]||(e[7]=a=>r.category=a),style:{width:"100%"}},{default:o(()=>[t(C,{value:"general"},{default:o(()=>[...e[23]||(e[23]=[i("general",-1)])]),_:1}),t(C,{value:"code"},{default:o(()=>[...e[24]||(e[24]=[i("code",-1)])]),_:1}),t(C,{value:"writing"},{default:o(()=>[...e[25]||(e[25]=[i("writing",-1)])]),_:1}),t(C,{value:"analysis"},{default:o(()=>[...e[26]||(e[26]=[i("analysis",-1)])]),_:1})]),_:1},8,["value"])]),_:1}),t(N,{label:"模板内容",required:""},{default:o(()=>[t(me,{value:r.content,"onUpdate:value":e[8]||(e[8]=a=>r.content=a),rows:6,placeholder:"输入 Prompt 模板内容"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","ok-button-props"])])}}},ot=xe(Ke,[["__scopeId","data-v-22e50acf"]]);export{ot as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as Ze}from"./ws-Bv7YH0VB.js";import{s as et}from"./community-parser-CO25nZFt.js";import{_ as tt}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{a as v}from"./index-DLcTmwiN.js";import{O as at,aa as nt,v as ce,D as lt,aG as ot,aN as Ie,c as rt}from"./icons-E3MGhN6s.js";import{l as ut,F as f,D as m,c as n,x as a,m as g,G as S,q as y,r as C,v as u,J as d,u as _,H as A,L as j,I as p,a as ne,j as he}from"./vendor-BVetwVfk.js";import"./index-DPaLf3-g.js";import"./useConfigInject-DIKG5Y4I.js";import"./transition-atE2sWdv.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-CHsntPCQ.js";import"./index-U4Zd5IK6.js";function D(o){const r=et(o);if(!r)return null;try{return JSON.parse(r)}catch{}const s=r.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(!s)return null;try{return JSON.parse(s[0])}catch{return null}}const W=Object.freeze(["free","starter","pro","enterprise"]),st=Object.freeze(["active","suspended","deleted"]),Te=Object.freeze(["api_calls","storage_bytes","ai_requests"]);function I(o,r=0){return typeof o=="number"&&Number.isFinite(o)?o:r}function it(o,r=0){if(!o||typeof o!="object")return null;const s=o.id||"";if(!s)return null;const z=o.quotas&&typeof o.quotas=="object"?{...o.quotas}:{};return{key:s,id:s,name:String(o.name||s),monthlyFee:o.monthlyFee==null?null:I(o.monthlyFee,null),quotas:z,features:Array.isArray(o.features)?o.features.filter(Y=>typeof Y=="string"):[],_idx:r}}function dt(o){const r=D(o);return Array.isArray(r)?r.map(it).filter(Boolean):[]}function pt(o,r=0){if(!o||typeof o!="object")return null;const s=o.id||"";return s?{key:s,id:s,name:String(o.name||s),unit:String(o.unit||""),_idx:r}:null}function ct(o){const r=D(o);return Array.isArray(r)?r.map(pt).filter(Boolean):[]}function ft(o,r=0){if(!o||typeof o!="object")return null;const s=o.id||"";return s?{key:s,id:s,name:String(o.name||""),slug:String(o.slug||""),config:o.config??null,status:String(o.status||"active").toLowerCase(),plan:String(o.plan||"free").toLowerCase(),dbPath:o.dbPath||null,ownerId:o.ownerId||"",createdAt:o.createdAt??null,updatedAt:o.updatedAt??null,deletedAt:o.deletedAt??null,_idx:r}:null}function vt(o){const r=D(o);return Array.isArray(r)?r.map(ft).filter(Boolean):[]}function mt(o,r=0){if(!o||typeof o!="object")return null;const s=o.id||"";return s?{key:s,id:s,tenantId:String(o.tenantId||""),plan:String(o.plan||"free").toLowerCase(),status:String(o.status||"active").toLowerCase(),startedAt:o.startedAt??null,expiresAt:o.expiresAt??null,cancelledAt:o.cancelledAt??null,paymentMethod:o.paymentMethod||null,amount:o.amount==null?null:I(o.amount,null),createdAt:o.createdAt??null,_idx:r}:null}function yt(o){const r=D(o);return Array.isArray(r)?r.map(mt).filter(Boolean):[]}function gt(o){const r=D(o);return!r||typeof r!="object"||Array.isArray(r)?null:{tenantId:String(r.tenantId||""),plan:String(r.plan||"free").toLowerCase(),metric:String(r.metric||""),period:String(r.period||""),limit:r.limit==null?null:I(r.limit,null),used:I(r.used,0),remaining:r.remaining==null?null:I(r.remaining,null),unlimited:!!r.unlimited,exceeded:!!r.exceeded}}const _t={tenantCount:0,byStatus:{active:0,suspended:0,deleted:0},byPlan:{free:0,starter:0,pro:0,enterprise:0},subscriptionCount:0,activeSubscriptions:0,usageRecordCount:0,totalUsage:{api_calls:0,storage_bytes:0,ai_requests:0}};function bt(o){const r=JSON.parse(JSON.stringify(_t)),s=D(o);if(!s||typeof s!="object"||Array.isArray(s))return r;if(r.tenantCount=I(s.tenantCount,0),r.subscriptionCount=I(s.subscriptionCount,0),r.activeSubscriptions=I(s.activeSubscriptions,0),r.usageRecordCount=I(s.usageRecordCount,0),s.byStatus&&typeof s.byStatus=="object")for(const z of Object.keys(r.byStatus))r.byStatus[z]=I(s.byStatus[z],0);if(s.byPlan&&typeof s.byPlan=="object")for(const z of Object.keys(r.byPlan))r.byPlan[z]=I(s.byPlan[z],0);if(s.totalUsage&&typeof s.totalUsage=="object")for(const z of Object.keys(r.totalUsage))r.totalUsage[z]=I(s.totalUsage[z],0);return r}function fe(o){if(o==null||o==="")return"—";const r=typeof o=="number"?new Date(o):new Date(String(o));return isNaN(r.getTime())?String(o):r.toLocaleString("zh-CN",{hour12:!1})}function ve(o){return typeof o!="number"||!Number.isFinite(o)||o<0?"—":o===0?"0":o<1024?`${o} B`:o<1024*1024?`${(o/1024).toFixed(1)} KB`:o<1024*1024*1024?`${(o/1024/1024).toFixed(1)} MB`:`${(o/1024/1024/1024).toFixed(2)} GB`}function kt(o=new Date){const r=o.getFullYear(),s=String(o.getMonth()+1).padStart(2,"0");return`${r}-${s}`}const xt={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},St={style:{color:"var(--text-secondary)","font-size":"12px","margin-left":"8px"}},Ct={class:"filter-bar"},At={style:{color:"var(--text-primary)","font-weight":"500"}},wt={style:{color:"var(--text-secondary)","font-size":"11px","margin-top":"2px","font-family":"monospace"}},zt={key:0,style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"11px"}},$t={key:1,style:{color:"var(--text-muted)"}},jt={key:4,style:{color:"var(--text-secondary)","font-size":"11px"}},Ut={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},It={style:{color:"var(--text-primary)","font-weight":"500"}},ht={style:{color:"var(--text-secondary)","font-size":"11px","font-family":"monospace"}},Tt={key:0,style:{color:"#722ed1","font-weight":"500"}},qt={key:1,style:{color:"var(--text-muted)"}},Ft={key:4,style:{color:"var(--text-secondary)","font-size":"11px"}},Nt={key:5,style:{color:"var(--text-secondary)","font-size":"11px"}},Ot={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},Mt={class:"plan-fee"},Pt={key:0},Lt={key:1,style:{color:"#722ed1"}},Rt={class:"plan-section"},Bt={class:"plan-quota-label"},Et={class:"plan-quota-value"},Dt={class:"plan-section"},Yt={style:{"margin-top":"12px","font-size":"12px",color:"var(--text-secondary)"}},Jt={style:{"font-family":"monospace",color:"var(--text-primary)"}},Kt={key:0},Vt={style:{"font-family":"monospace"}},Qt={key:1,style:{"margin-top":"8px"}},Gt={__name:"Tenant",setup(o){const r=Ze(),s=C(!1),z=C(!1),Y=C(!1),le=C(!1),oe=C(!1),J=C([]),re=C([]),me=C([]),ye=C([]),h=C({tenantCount:0,byStatus:{active:0,suspended:0,deleted:0},byPlan:{free:0,starter:0,pro:0,enterprise:0},subscriptionCount:0,activeSubscriptions:0,usageRecordCount:0,totalUsage:{api_calls:0,storage_bytes:0,ai_requests:0}}),ue=C("tenants"),K=C(""),V=C(""),H=C(!1),X=C(!1),se=C(!1),Z=C(!1),w=ne({name:"",slug:"",plan:"free",owner:""}),x=ne({tenantId:"",plan:"pro",amount:null,duration:720*60*60*1e3}),ie=C(""),U=ne({tenantId:null,metric:"api_calls",period:""}),b=ne({tenantId:null,metric:"api_calls",value:1,period:""}),k=C(null),qe=[{title:"租户",key:"name"},{title:"计划",key:"plan",width:"110px"},{title:"状态",key:"status",width:"100px"},{title:"所有者",key:"owner",width:"160px"},{title:"创建时间",key:"createdAt",width:"160px"},{title:"操作",key:"action",width:"280px"}],Fe=[{title:"租户",key:"tenant"},{title:"计划",key:"plan",width:"110px"},{title:"金额",key:"amount",width:"100px"},{title:"状态",key:"status",width:"110px"},{title:"开始",key:"startedAt",width:"160px"},{title:"到期",key:"expiresAt",width:"160px"},{title:"操作",key:"action",width:"120px"}],Ne=he(()=>{let l=J.value;return K.value&&(l=l.filter(e=>e.plan===K.value)),V.value&&(l=l.filter(e=>e.status===V.value)),l}),Oe=he(()=>re.value.filter(l=>l.status==="active"&&typeof l.amount=="number").reduce((l,e)=>l+e.amount,0));function F(l){return{free:"免费版",starter:"入门版",pro:"专业版",enterprise:"企业版"}[l]||l}function Q(l){return{free:"default",starter:"blue",pro:"purple",enterprise:"gold"}[l]||"default"}function ge(l){return{active:"活跃",suspended:"已暂停",deleted:"已删除"}[l]||l}function Me(l){return{active:"green",suspended:"orange",deleted:"default"}[l]||"default"}function Pe(l){return{active:"活跃",cancelled:"已取消",expired:"已过期",past_due:"逾期"}[l]||l}function Le(l){return{active:"green",cancelled:"default",expired:"red",past_due:"orange"}[l]||"default"}function Re(l){const e=J.value.find(c=>c.id===l);return e?e.name:"(已删除)"}function _e(l,e){return l==null?"—":e==="storage_bytes"?ve(l):String(l)}function Be(l,e){return l==null?"无限":e==="storage_bytes"?ve(l):l.toLocaleString()}function Ee({key:l}){l==="tenant"?H.value=!0:l==="quota"?(k.value=null,se.value=!0):l==="record"&&(Z.value=!0)}async function N(){s.value=!0;try{const[l,e,c,T,ee]=await Promise.all([r.execute("tenant list --json",1e4).catch(()=>({output:""})),r.execute("tenant subscriptions --json",1e4).catch(()=>({output:""})),r.execute("tenant plans --json",8e3).catch(()=>({output:""})),r.execute("tenant metrics --json",8e3).catch(()=>({output:""})),r.execute("tenant stats --json",8e3).catch(()=>({output:""}))]);J.value=vt(l.output),re.value=yt(e.output),me.value=dt(c.output),ye.value=ct(T.output),h.value=bt(ee.output)}catch(l){v.error("加载租户数据失败: "+(l?.message||l))}finally{s.value=!1}}async function De(){const l=w.name.trim(),e=w.slug.trim();if(!l||!e){v.warning("请填写名称和 slug");return}if(!/^[a-z0-9][a-z0-9-]*[a-z0-9]$|^[a-z0-9]$/.test(e)){v.warning("slug 必须为小写字母数字 + 连字符");return}z.value=!0;try{const c=[`tenant create "${l.replace(/"/g,'\\"')}" "${e.replace(/"/g,'\\"')}"`];c.push(`--plan ${w.plan}`),w.owner.trim()&&c.push(`--owner "${w.owner.trim().replace(/"/g,'\\"')}"`),c.push("--json");const{output:T}=await r.execute(c.join(" "),1e4);if(/error|Error|失败/i.test(T)&&!/"id"/.test(T)){v.error("创建失败: "+T.slice(0,120));return}v.success("租户已创建"),H.value=!1,ke(),await N()}catch(c){v.error("创建失败: "+(c?.message||c))}finally{z.value=!1}}function Ye(l){x.tenantId=l.id,x.plan=l.plan==="free"?"starter":l.plan,x.amount=null,x.duration=720*60*60*1e3,ie.value=l.name,X.value=!0}async function Je(){Y.value=!0;try{const l=[`tenant subscribe ${x.tenantId}`];l.push(`--plan ${x.plan}`),x.amount!=null&&l.push(`--amount ${x.amount}`),x.duration&&l.push(`--duration-ms ${x.duration}`),l.push("--json");const{output:e}=await r.execute(l.join(" "),1e4);if(/error|Error|失败/i.test(e)&&!/"id"/.test(e)){v.error("订阅失败: "+e.slice(0,120));return}v.success("订阅已创建"),X.value=!1,xe(),ue.value="subscriptions",await N()}catch(l){v.error("订阅失败: "+(l?.message||l))}finally{Y.value=!1}}async function Ke(l,e){if(e!==l.plan)try{const{output:c}=await r.execute(`tenant configure ${l.id} --plan ${e} --json`,8e3);if(/error|Error/i.test(c)&&!/"id"/.test(c)){v.error("计划变更失败: "+c.slice(0,120));return}v.success(`已切换到 ${F(e)}`),await N()}catch(c){v.error("计划变更失败: "+(c?.message||c))}}async function be(l,e){try{const{output:c}=await r.execute(`tenant configure ${l.id} --status ${e} --json`,8e3);if(/error|Error/i.test(c)&&!/"id"/.test(c)){v.error("状态变更失败: "+c.slice(0,120));return}v.success(`已${e==="active"?"激活":"暂停"}`),await N()}catch(c){v.error("状态变更失败: "+(c?.message||c))}}async function Ve(l){try{const{output:e}=await r.execute(`tenant delete ${l.id} --json`,8e3);if(/error|Error/i.test(e)&&!/deleted|removed/.test(e)){v.error("删除失败: "+e.slice(0,120));return}v.success("租户已软删除"),await N()}catch(e){v.error("删除失败: "+(e?.message||e))}}async function Qe(l){try{const{output:e}=await r.execute(`tenant cancel ${l.tenantId}`,8e3);if(/error|Error/i.test(e)&&!/cancelled|cancel/i.test(e)){v.error("取消失败: "+e.slice(0,120));return}v.success("订阅已取消"),await N()}catch(e){v.error("取消失败: "+(e?.message||e))}}async function Ge(){if(!U.tenantId){v.warning("请选择租户");return}le.value=!0,k.value=null;try{const l=[`tenant check-quota ${U.tenantId} ${U.metric}`];U.period.trim()&&l.push(`--period ${U.period.trim()}`),l.push("--json");const{output:e}=await r.execute(l.join(" "),8e3),c=gt(e);if(!c){v.error("检查失败: "+e.slice(0,120));return}k.value=c,c.exceeded&&v.warning("该租户已超额!")}catch(l){v.error("检查失败: "+(l?.message||l))}finally{le.value=!1}}async function We(){if(!b.tenantId){v.warning("请选择租户");return}if(b.value==null||b.value<0){v.warning("请输入有效数量");return}oe.value=!0;try{const l=[`tenant record ${b.tenantId} ${b.metric} ${b.value}`];b.period.trim()&&l.push(`--period ${b.period.trim()}`),l.push("--json");const{output:e}=await r.execute(l.join(" "),8e3);if(/error|Error/i.test(e)&&!/"id"|"tenant"/.test(e)){v.error("记录失败: "+e.slice(0,120));return}v.success("用量已记录"),Z.value=!1,Se(),await N()}catch(l){v.error("记录失败: "+(l?.message||l))}finally{oe.value=!1}}function ke(){w.name="",w.slug="",w.plan="free",w.owner=""}function xe(){x.tenantId="",x.plan="pro",x.amount=null,x.duration=720*60*60*1e3,ie.value=""}function Se(){b.tenantId=null,b.metric="api_calls",b.value=1,b.period=""}function Ce(l){l.period||(l.period=kt())}return Ce(U),Ce(b),ut(N),(l,e)=>{const c=y("a-button"),T=y("a-menu-item"),ee=y("a-menu"),Ae=y("a-dropdown"),we=y("a-space"),L=y("a-statistic"),O=y("a-card"),R=y("a-col"),ze=y("a-row"),M=y("a-tag"),P=y("a-radio-button"),de=y("a-radio-group"),$e=y("a-popconfirm"),je=y("a-table"),pe=y("a-tab-pane"),He=y("a-tabs"),G=y("a-input"),$=y("a-form-item"),B=y("a-select-option"),E=y("a-select"),te=y("a-form"),ae=y("a-modal"),Ue=y("a-input-number"),Xe=y("a-progress");return u(),f("div",null,[m("div",xt,[e[26]||(e[26]=m("div",null,[m("h2",{class:"page-title"},"多租户 SaaS"),m("p",{class:"page-sub"},"租户管理 · 订阅计费 · 用量计量 · 配额检查")],-1)),n(we,null,{default:a(()=>[n(c,{loading:s.value,onClick:N},{icon:a(()=>[n(_(at))]),default:a(()=>[e[21]||(e[21]=d(" 刷新 ",-1))]),_:1},8,["loading"]),n(Ae,{trigger:["click"]},{overlay:a(()=>[n(ee,{onClick:Ee},{default:a(()=>[n(T,{key:"tenant"},{default:a(()=>[n(_(ce)),e[23]||(e[23]=d(" 创建租户",-1))]),_:1}),n(T,{key:"quota"},{default:a(()=>[n(_(lt)),e[24]||(e[24]=d(" 检查配额",-1))]),_:1}),n(T,{key:"record"},{default:a(()=>[n(_(ot)),e[25]||(e[25]=d(" 记录用量",-1))]),_:1})]),_:1})]),default:a(()=>[n(c,{type:"primary"},{icon:a(()=>[n(_(nt))]),default:a(()=>[e[22]||(e[22]=d(" 操作 ▼ ",-1))]),_:1})]),_:1})]),_:1})]),n(ze,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:a(()=>[n(R,{xs:12,sm:8,lg:5},{default:a(()=>[n(O,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[n(L,{title:"租户总数",value:h.value.tenantCount,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:a(()=>[n(_(ce))]),_:1},8,["value"])]),_:1})]),_:1}),n(R,{xs:12,sm:8,lg:5},{default:a(()=>[n(O,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[n(L,{title:"活跃订阅",value:h.value.activeSubscriptions,"value-style":{color:h.value.activeSubscriptions>0?"#52c41a":"#888",fontSize:"20px"}},{prefix:a(()=>[n(_(Ie))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),n(R,{xs:12,sm:8,lg:5},{default:a(()=>[n(O,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[n(L,{title:"月度收入",value:Oe.value,precision:0,prefix:"¥","value-style":{color:"#722ed1",fontSize:"20px"}},null,8,["value"])]),_:1})]),_:1}),n(R,{xs:12,sm:8,lg:5},{default:a(()=>[n(O,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[n(L,{title:"API 调用",value:h.value.totalUsage.api_calls,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:a(()=>[n(_(rt))]),_:1},8,["value"])]),_:1})]),_:1}),n(R,{xs:24,sm:8,lg:4},{default:a(()=>[n(O,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[n(L,{title:"存储用量",value:_(ve)(h.value.totalUsage.storage_bytes),"value-style":{color:"#faad14",fontSize:"18px"}},null,8,["value"])]),_:1})]),_:1})]),_:1}),h.value.tenantCount>0?(u(),g(O,{key:0,title:"计划分布",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"},"body-style":{padding:"12px 16px"}},{default:a(()=>[n(we,{size:[12,8],wrap:""},{default:a(()=>[(u(!0),f(A,null,j(_(W),t=>(u(),g(M,{key:t,color:Q(t)},{default:a(()=>[d(p(F(t))+": "+p(h.value.byPlan[t]||0),1)]),_:2},1032,["color"]))),128)),m("span",St," 活跃 "+p(h.value.byStatus.active)+" · 暂停 "+p(h.value.byStatus.suspended)+" · 已删除 "+p(h.value.byStatus.deleted),1)]),_:1})]),_:1})):S("",!0),n(He,{activeKey:ue.value,"onUpdate:activeKey":e[2]||(e[2]=t=>ue.value=t),class:"tenant-tabs"},{default:a(()=>[n(pe,{key:"tenants",tab:"租户"},{default:a(()=>[m("div",Ct,[n(de,{value:K.value,"onUpdate:value":e[0]||(e[0]=t=>K.value=t),size:"small"},{default:a(()=>[n(P,{value:""},{default:a(()=>[...e[27]||(e[27]=[d("全部计划",-1)])]),_:1}),(u(!0),f(A,null,j(_(W),t=>(u(),g(P,{key:t,value:t},{default:a(()=>[d(p(F(t)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),n(de,{value:V.value,"onUpdate:value":e[1]||(e[1]=t=>V.value=t),size:"small","button-style":"solid"},{default:a(()=>[n(P,{value:""},{default:a(()=>[...e[28]||(e[28]=[d("全部状态",-1)])]),_:1}),(u(!0),f(A,null,j(_(st),t=>(u(),g(P,{key:t,value:t},{default:a(()=>[d(p(ge(t)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),n(je,{columns:qe,"data-source":Ne.value,pagination:{pageSize:20,showTotal:t=>`共 ${t} 条`},size:"small",loading:s.value,style:{background:"var(--bg-card)"}},{bodyCell:a(({column:t,record:i})=>[t.key==="name"?(u(),f(A,{key:0},[m("span",At,p(i.name),1),m("div",wt,p(i.slug),1)],64)):S("",!0),t.key==="plan"?(u(),g(M,{key:1,color:Q(i.plan)},{default:a(()=>[d(p(F(i.plan)),1)]),_:2},1032,["color"])):S("",!0),t.key==="status"?(u(),g(M,{key:2,color:Me(i.status)},{default:a(()=>[d(p(ge(i.status)),1)]),_:2},1032,["color"])):S("",!0),t.key==="owner"?(u(),f(A,{key:3},[i.ownerId?(u(),f("span",zt,p(i.ownerId),1)):(u(),f("span",$t,"—"))],64)):S("",!0),t.key==="createdAt"?(u(),f("span",jt,p(_(fe)(i.createdAt)),1)):S("",!0),t.key==="action"?(u(),f(A,{key:5},[n(c,{size:"small",type:"link",onClick:q=>Ye(i)},{default:a(()=>[...e[29]||(e[29]=[d("订阅",-1)])]),_:1},8,["onClick"]),n(Ae,{trigger:["click"]},{overlay:a(()=>[n(ee,{onClick:q=>Ke(i,q.key)},{default:a(()=>[(u(!0),f(A,null,j(_(W),q=>(u(),g(T,{key:q,disabled:q===i.plan},{default:a(()=>[d(p(F(q)),1)]),_:2},1032,["disabled"]))),128))]),_:2},1032,["onClick"])]),default:a(()=>[n(c,{size:"small",type:"link"},{default:a(()=>[...e[30]||(e[30]=[d("计划 ▼",-1)])]),_:1})]),_:2},1024),i.status==="active"?(u(),g(c,{key:0,size:"small",type:"link",onClick:q=>be(i,"suspended")},{default:a(()=>[...e[31]||(e[31]=[d("暂停",-1)])]),_:1},8,["onClick"])):i.status==="suspended"?(u(),g(c,{key:1,size:"small",type:"link",onClick:q=>be(i,"active")},{default:a(()=>[...e[32]||(e[32]=[d("激活",-1)])]),_:1},8,["onClick"])):S("",!0),i.status!=="deleted"?(u(),g($e,{key:2,title:"软删除该租户?","ok-text":"删除","cancel-text":"取消",onConfirm:q=>Ve(i)},{default:a(()=>[n(c,{size:"small",type:"link",danger:""},{default:a(()=>[...e[33]||(e[33]=[d("删除",-1)])]),_:1})]),_:1},8,["onConfirm"])):S("",!0)],64)):S("",!0)]),emptyText:a(()=>[m("div",Ut,[n(_(ce),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),d(" "+p(K.value||V.value?"没有符合条件的租户":'暂无租户,点"操作 → 创建租户"添加第一个'),1)])]),_:1},8,["data-source","pagination","loading"])]),_:1}),n(pe,{key:"subscriptions",tab:"订阅"},{default:a(()=>[n(je,{columns:Fe,"data-source":re.value,pagination:{pageSize:20,showTotal:t=>`共 ${t} 条`},size:"small",loading:s.value,style:{background:"var(--bg-card)"}},{bodyCell:a(({column:t,record:i})=>[t.key==="tenant"?(u(),f(A,{key:0},[m("span",It,p(Re(i.tenantId)),1),m("div",ht,p(i.tenantId.slice(0,8)),1)],64)):S("",!0),t.key==="plan"?(u(),g(M,{key:1,color:Q(i.plan)},{default:a(()=>[d(p(F(i.plan)),1)]),_:2},1032,["color"])):S("",!0),t.key==="amount"?(u(),f(A,{key:2},[i.amount!=null?(u(),f("span",Tt,"¥"+p(i.amount),1)):(u(),f("span",qt,"—"))],64)):S("",!0),t.key==="status"?(u(),g(M,{key:3,color:Le(i.status)},{default:a(()=>[d(p(Pe(i.status)),1)]),_:2},1032,["color"])):S("",!0),t.key==="startedAt"?(u(),f("span",Ft,p(_(fe)(i.startedAt)),1)):S("",!0),t.key==="expiresAt"?(u(),f("span",Nt,p(_(fe)(i.expiresAt)),1)):S("",!0),t.key==="action"?(u(),f(A,{key:6},[i.status==="active"?(u(),g($e,{key:0,title:"取消该订阅?","ok-text":"取消订阅","cancel-text":"返回",onConfirm:q=>Qe(i)},{default:a(()=>[n(c,{size:"small",type:"link",danger:""},{default:a(()=>[...e[34]||(e[34]=[d("取消订阅",-1)])]),_:1})]),_:1},8,["onConfirm"])):S("",!0)],64)):S("",!0)]),emptyText:a(()=>[m("div",Ot,[n(_(Ie),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),e[35]||(e[35]=d(" 暂无订阅记录 ",-1))])]),_:1},8,["data-source","pagination","loading"])]),_:1}),n(pe,{key:"plans",tab:"计划"},{default:a(()=>[n(ze,{gutter:[16,16]},{default:a(()=>[(u(!0),f(A,null,j(me.value,t=>(u(),g(R,{key:t.id,xs:24,sm:12,lg:6},{default:a(()=>[n(O,{title:t.name,size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{extra:a(()=>[n(M,{color:Q(t.id)},{default:a(()=>[d(p(t.id),1)]),_:2},1032,["color"])]),default:a(()=>[m("div",Mt,[t.monthlyFee!=null?(u(),f("span",Pt,[d("¥"+p(t.monthlyFee)+" ",1),e[36]||(e[36]=m("span",{class:"plan-fee-unit"},"/ 月",-1))])):(u(),f("span",Lt,"联系销售"))]),m("div",Rt,[e[37]||(e[37]=m("div",{class:"plan-section-title"},"配额",-1)),(u(!0),f(A,null,j(ye.value,i=>(u(),f("div",{key:i.id,class:"plan-quota-row"},[m("span",Bt,p(i.name),1),m("span",Et,p(Be(t.quotas?.[i.id],i.id)),1)]))),128))]),m("div",Dt,[e[38]||(e[38]=m("div",{class:"plan-section-title"},"特性",-1)),(u(!0),f(A,null,j(t.features,i=>(u(),g(M,{key:i,style:{"font-size":"10px",margin:"1px"}},{default:a(()=>[d(p(i),1)]),_:2},1024))),128))])]),_:2},1032,["title"])]),_:2},1024))),128))]),_:1})]),_:1})]),_:1},8,["activeKey"]),n(ae,{open:H.value,"onUpdate:open":e[7]||(e[7]=t=>H.value=t),title:"创建租户","confirm-loading":z.value,width:520,"ok-text":"创建","cancel-text":"取消",onOk:De,onCancel:ke},{default:a(()=>[n(te,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:a(()=>[n($,{label:"名称",required:""},{default:a(()=>[n(G,{value:w.name,"onUpdate:value":e[3]||(e[3]=t=>w.name=t),placeholder:"例如: Acme Corp"},null,8,["value"])]),_:1}),n($,{label:"Slug",required:""},{default:a(()=>[n(G,{value:w.slug,"onUpdate:value":e[4]||(e[4]=t=>w.slug=t),placeholder:"小写字母数字+连字符,例如: acme-corp"},null,8,["value"])]),_:1}),n($,{label:"计划"},{default:a(()=>[n(E,{value:w.plan,"onUpdate:value":e[5]||(e[5]=t=>w.plan=t)},{default:a(()=>[(u(!0),f(A,null,j(_(W),t=>(u(),g(B,{key:t,value:t},{default:a(()=>[d(p(F(t)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),n($,{label:"所有者 ID"},{default:a(()=>[n(G,{value:w.owner,"onUpdate:value":e[6]||(e[6]=t=>w.owner=t),placeholder:"可选"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),n(ae,{open:X.value,"onUpdate:open":e[11]||(e[11]=t=>X.value=t),title:`订阅:${ie.value}`,"confirm-loading":Y.value,width:500,"ok-text":"订阅","cancel-text":"取消",onOk:Je,onCancel:xe},{default:a(()=>[n(te,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:a(()=>[n($,{label:"计划",required:""},{default:a(()=>[n(E,{value:x.plan,"onUpdate:value":e[8]||(e[8]=t=>x.plan=t)},{default:a(()=>[(u(!0),f(A,null,j(_(W),t=>(u(),g(B,{key:t,value:t},{default:a(()=>[d(p(F(t)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),n($,{label:"金额覆盖"},{default:a(()=>[n(Ue,{value:x.amount,"onUpdate:value":e[9]||(e[9]=t=>x.amount=t),min:0,placeholder:"留空使用计划默认价",style:{width:"100%"}},null,8,["value"])]),_:1}),n($,{label:"周期"},{default:a(()=>[n(de,{value:x.duration,"onUpdate:value":e[10]||(e[10]=t=>x.duration=t)},{default:a(()=>[n(P,{value:720*60*60*1e3},{default:a(()=>[...e[39]||(e[39]=[d("30 天",-1)])]),_:1}),n(P,{value:2160*60*60*1e3},{default:a(()=>[...e[40]||(e[40]=[d("90 天",-1)])]),_:1}),n(P,{value:365*24*60*60*1e3},{default:a(()=>[...e[41]||(e[41]=[d("1 年",-1)])]),_:1})]),_:1},8,["value"])]),_:1})]),_:1})]),_:1},8,["open","title","confirm-loading"]),n(ae,{open:se.value,"onUpdate:open":e[15]||(e[15]=t=>se.value=t),title:"配额检查","confirm-loading":le.value,width:500,"ok-text":"检查","cancel-text":"关闭",onOk:Ge},{default:a(()=>[n(te,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:a(()=>[n($,{label:"租户",required:""},{default:a(()=>[n(E,{value:U.tenantId,"onUpdate:value":e[12]||(e[12]=t=>U.tenantId=t),"show-search":"",placeholder:"选择租户"},{default:a(()=>[(u(!0),f(A,null,j(J.value,t=>(u(),g(B,{key:t.id,value:t.id},{default:a(()=>[d(p(t.name)+" ("+p(t.slug)+")",1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),n($,{label:"指标",required:""},{default:a(()=>[n(E,{value:U.metric,"onUpdate:value":e[13]||(e[13]=t=>U.metric=t)},{default:a(()=>[(u(!0),f(A,null,j(_(Te),t=>(u(),g(B,{key:t,value:t},{default:a(()=>[d(p(t),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),n($,{label:"周期"},{default:a(()=>[n(G,{value:U.period,"onUpdate:value":e[14]||(e[14]=t=>U.period=t),placeholder:"YYYY-MM,留空则当前月"},null,8,["value"])]),_:1})]),_:1}),k.value?(u(),g(O,{key:0,size:"small",style:{background:"var(--bg-base)","margin-top":"8px"}},{default:a(()=>[n(L,{title:"配额状态",value:k.value.unlimited?"无限":k.value.exceeded?"已超额":"正常","value-style":{color:k.value.exceeded?"#ff4d4f":k.value.unlimited?"#722ed1":"#52c41a"}},null,8,["value","value-style"]),m("div",Yt,[m("div",null,[e[42]||(e[42]=d("计划: ",-1)),n(M,{color:Q(k.value.plan)},{default:a(()=>[d(p(F(k.value.plan)),1)]),_:1},8,["color"])]),m("div",null,"周期: "+p(k.value.period),1),m("div",null,[e[43]||(e[43]=d("已用: ",-1)),m("span",Jt,p(_e(k.value.used,k.value.metric)),1)]),k.value.unlimited?S("",!0):(u(),f("div",Kt,[e[44]||(e[44]=d(" 上限: ",-1)),m("span",Vt,p(_e(k.value.limit,k.value.metric)),1)])),!k.value.unlimited&&k.value.limit>0?(u(),f("div",Qt,[n(Xe,{percent:Math.min(100,Math.round(100*k.value.used/k.value.limit)),size:"small",status:k.value.exceeded?"exception":"active"},null,8,["percent","status"])])):S("",!0)])]),_:1})):S("",!0)]),_:1},8,["open","confirm-loading"]),n(ae,{open:Z.value,"onUpdate:open":e[20]||(e[20]=t=>Z.value=t),title:"记录用量","confirm-loading":oe.value,width:500,"ok-text":"记录","cancel-text":"取消",onOk:We,onCancel:Se},{default:a(()=>[n(te,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:a(()=>[n($,{label:"租户",required:""},{default:a(()=>[n(E,{value:b.tenantId,"onUpdate:value":e[16]||(e[16]=t=>b.tenantId=t),"show-search":"",placeholder:"选择租户"},{default:a(()=>[(u(!0),f(A,null,j(J.value,t=>(u(),g(B,{key:t.id,value:t.id},{default:a(()=>[d(p(t.name)+" ("+p(t.slug)+")",1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),n($,{label:"指标",required:""},{default:a(()=>[n(E,{value:b.metric,"onUpdate:value":e[17]||(e[17]=t=>b.metric=t)},{default:a(()=>[(u(!0),f(A,null,j(_(Te),t=>(u(),g(B,{key:t,value:t},{default:a(()=>[d(p(t),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),n($,{label:"数量",required:""},{default:a(()=>[n(Ue,{value:b.value,"onUpdate:value":e[18]||(e[18]=t=>b.value=t),min:0,style:{width:"100%"}},null,8,["value"])]),_:1}),n($,{label:"周期"},{default:a(()=>[n(G,{value:b.period,"onUpdate:value":e[19]||(e[19]=t=>b.period=t),placeholder:"YYYY-MM,留空则当前月"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"])])}}},sa=tt(Gt,[["__scopeId","data-v-45eae7f1"]]);export{sa as default};
|
|
1
|
+
import{u as Ze}from"./ws-Bv7YH0VB.js";import{s as et}from"./community-parser-CO25nZFt.js";import{_ as tt}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{a as v}from"./index-BbqCdQXU.js";import{Y as at,ac as nt,x as ce,D as lt,aI as ot,aR as Ue,c as rt}from"./icons-ukMaZ3tx.js";import{l as ut,F as f,D as m,c as n,x as a,m as g,G as S,q as y,r as C,v as u,J as d,u as _,H as A,L as j,I as p,a as ne,j as he}from"./vendor-BVetwVfk.js";import"./index-ZZ_4A9um.js";import"./useConfigInject-BKqJUQaF.js";import"./transition-CGYDOK3N.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-CHsntPCQ.js";import"./index-U4Zd5IK6.js";function D(o){const r=et(o);if(!r)return null;try{return JSON.parse(r)}catch{}const s=r.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(!s)return null;try{return JSON.parse(s[0])}catch{return null}}const W=Object.freeze(["free","starter","pro","enterprise"]),st=Object.freeze(["active","suspended","deleted"]),Te=Object.freeze(["api_calls","storage_bytes","ai_requests"]);function U(o,r=0){return typeof o=="number"&&Number.isFinite(o)?o:r}function it(o,r=0){if(!o||typeof o!="object")return null;const s=o.id||"";if(!s)return null;const z=o.quotas&&typeof o.quotas=="object"?{...o.quotas}:{};return{key:s,id:s,name:String(o.name||s),monthlyFee:o.monthlyFee==null?null:U(o.monthlyFee,null),quotas:z,features:Array.isArray(o.features)?o.features.filter(Y=>typeof Y=="string"):[],_idx:r}}function dt(o){const r=D(o);return Array.isArray(r)?r.map(it).filter(Boolean):[]}function pt(o,r=0){if(!o||typeof o!="object")return null;const s=o.id||"";return s?{key:s,id:s,name:String(o.name||s),unit:String(o.unit||""),_idx:r}:null}function ct(o){const r=D(o);return Array.isArray(r)?r.map(pt).filter(Boolean):[]}function ft(o,r=0){if(!o||typeof o!="object")return null;const s=o.id||"";return s?{key:s,id:s,name:String(o.name||""),slug:String(o.slug||""),config:o.config??null,status:String(o.status||"active").toLowerCase(),plan:String(o.plan||"free").toLowerCase(),dbPath:o.dbPath||null,ownerId:o.ownerId||"",createdAt:o.createdAt??null,updatedAt:o.updatedAt??null,deletedAt:o.deletedAt??null,_idx:r}:null}function vt(o){const r=D(o);return Array.isArray(r)?r.map(ft).filter(Boolean):[]}function mt(o,r=0){if(!o||typeof o!="object")return null;const s=o.id||"";return s?{key:s,id:s,tenantId:String(o.tenantId||""),plan:String(o.plan||"free").toLowerCase(),status:String(o.status||"active").toLowerCase(),startedAt:o.startedAt??null,expiresAt:o.expiresAt??null,cancelledAt:o.cancelledAt??null,paymentMethod:o.paymentMethod||null,amount:o.amount==null?null:U(o.amount,null),createdAt:o.createdAt??null,_idx:r}:null}function yt(o){const r=D(o);return Array.isArray(r)?r.map(mt).filter(Boolean):[]}function gt(o){const r=D(o);return!r||typeof r!="object"||Array.isArray(r)?null:{tenantId:String(r.tenantId||""),plan:String(r.plan||"free").toLowerCase(),metric:String(r.metric||""),period:String(r.period||""),limit:r.limit==null?null:U(r.limit,null),used:U(r.used,0),remaining:r.remaining==null?null:U(r.remaining,null),unlimited:!!r.unlimited,exceeded:!!r.exceeded}}const _t={tenantCount:0,byStatus:{active:0,suspended:0,deleted:0},byPlan:{free:0,starter:0,pro:0,enterprise:0},subscriptionCount:0,activeSubscriptions:0,usageRecordCount:0,totalUsage:{api_calls:0,storage_bytes:0,ai_requests:0}};function bt(o){const r=JSON.parse(JSON.stringify(_t)),s=D(o);if(!s||typeof s!="object"||Array.isArray(s))return r;if(r.tenantCount=U(s.tenantCount,0),r.subscriptionCount=U(s.subscriptionCount,0),r.activeSubscriptions=U(s.activeSubscriptions,0),r.usageRecordCount=U(s.usageRecordCount,0),s.byStatus&&typeof s.byStatus=="object")for(const z of Object.keys(r.byStatus))r.byStatus[z]=U(s.byStatus[z],0);if(s.byPlan&&typeof s.byPlan=="object")for(const z of Object.keys(r.byPlan))r.byPlan[z]=U(s.byPlan[z],0);if(s.totalUsage&&typeof s.totalUsage=="object")for(const z of Object.keys(r.totalUsage))r.totalUsage[z]=U(s.totalUsage[z],0);return r}function fe(o){if(o==null||o==="")return"—";const r=typeof o=="number"?new Date(o):new Date(String(o));return isNaN(r.getTime())?String(o):r.toLocaleString("zh-CN",{hour12:!1})}function ve(o){return typeof o!="number"||!Number.isFinite(o)||o<0?"—":o===0?"0":o<1024?`${o} B`:o<1024*1024?`${(o/1024).toFixed(1)} KB`:o<1024*1024*1024?`${(o/1024/1024).toFixed(1)} MB`:`${(o/1024/1024/1024).toFixed(2)} GB`}function xt(o=new Date){const r=o.getFullYear(),s=String(o.getMonth()+1).padStart(2,"0");return`${r}-${s}`}const kt={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},St={style:{color:"var(--text-secondary)","font-size":"12px","margin-left":"8px"}},Ct={class:"filter-bar"},At={style:{color:"var(--text-primary)","font-weight":"500"}},wt={style:{color:"var(--text-secondary)","font-size":"11px","margin-top":"2px","font-family":"monospace"}},zt={key:0,style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"11px"}},$t={key:1,style:{color:"var(--text-muted)"}},jt={key:4,style:{color:"var(--text-secondary)","font-size":"11px"}},It={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},Ut={style:{color:"var(--text-primary)","font-weight":"500"}},ht={style:{color:"var(--text-secondary)","font-size":"11px","font-family":"monospace"}},Tt={key:0,style:{color:"#722ed1","font-weight":"500"}},qt={key:1,style:{color:"var(--text-muted)"}},Ft={key:4,style:{color:"var(--text-secondary)","font-size":"11px"}},Nt={key:5,style:{color:"var(--text-secondary)","font-size":"11px"}},Ot={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},Mt={class:"plan-fee"},Pt={key:0},Rt={key:1,style:{color:"#722ed1"}},Lt={class:"plan-section"},Bt={class:"plan-quota-label"},Et={class:"plan-quota-value"},Dt={class:"plan-section"},Yt={style:{"margin-top":"12px","font-size":"12px",color:"var(--text-secondary)"}},Jt={style:{"font-family":"monospace",color:"var(--text-primary)"}},Kt={key:0},Vt={style:{"font-family":"monospace"}},Qt={key:1,style:{"margin-top":"8px"}},Gt={__name:"Tenant",setup(o){const r=Ze(),s=C(!1),z=C(!1),Y=C(!1),le=C(!1),oe=C(!1),J=C([]),re=C([]),me=C([]),ye=C([]),h=C({tenantCount:0,byStatus:{active:0,suspended:0,deleted:0},byPlan:{free:0,starter:0,pro:0,enterprise:0},subscriptionCount:0,activeSubscriptions:0,usageRecordCount:0,totalUsage:{api_calls:0,storage_bytes:0,ai_requests:0}}),ue=C("tenants"),K=C(""),V=C(""),H=C(!1),X=C(!1),se=C(!1),Z=C(!1),w=ne({name:"",slug:"",plan:"free",owner:""}),k=ne({tenantId:"",plan:"pro",amount:null,duration:720*60*60*1e3}),ie=C(""),I=ne({tenantId:null,metric:"api_calls",period:""}),b=ne({tenantId:null,metric:"api_calls",value:1,period:""}),x=C(null),qe=[{title:"租户",key:"name"},{title:"计划",key:"plan",width:"110px"},{title:"状态",key:"status",width:"100px"},{title:"所有者",key:"owner",width:"160px"},{title:"创建时间",key:"createdAt",width:"160px"},{title:"操作",key:"action",width:"280px"}],Fe=[{title:"租户",key:"tenant"},{title:"计划",key:"plan",width:"110px"},{title:"金额",key:"amount",width:"100px"},{title:"状态",key:"status",width:"110px"},{title:"开始",key:"startedAt",width:"160px"},{title:"到期",key:"expiresAt",width:"160px"},{title:"操作",key:"action",width:"120px"}],Ne=he(()=>{let l=J.value;return K.value&&(l=l.filter(e=>e.plan===K.value)),V.value&&(l=l.filter(e=>e.status===V.value)),l}),Oe=he(()=>re.value.filter(l=>l.status==="active"&&typeof l.amount=="number").reduce((l,e)=>l+e.amount,0));function F(l){return{free:"免费版",starter:"入门版",pro:"专业版",enterprise:"企业版"}[l]||l}function Q(l){return{free:"default",starter:"blue",pro:"purple",enterprise:"gold"}[l]||"default"}function ge(l){return{active:"活跃",suspended:"已暂停",deleted:"已删除"}[l]||l}function Me(l){return{active:"green",suspended:"orange",deleted:"default"}[l]||"default"}function Pe(l){return{active:"活跃",cancelled:"已取消",expired:"已过期",past_due:"逾期"}[l]||l}function Re(l){return{active:"green",cancelled:"default",expired:"red",past_due:"orange"}[l]||"default"}function Le(l){const e=J.value.find(c=>c.id===l);return e?e.name:"(已删除)"}function _e(l,e){return l==null?"—":e==="storage_bytes"?ve(l):String(l)}function Be(l,e){return l==null?"无限":e==="storage_bytes"?ve(l):l.toLocaleString()}function Ee({key:l}){l==="tenant"?H.value=!0:l==="quota"?(x.value=null,se.value=!0):l==="record"&&(Z.value=!0)}async function N(){s.value=!0;try{const[l,e,c,T,ee]=await Promise.all([r.execute("tenant list --json",1e4).catch(()=>({output:""})),r.execute("tenant subscriptions --json",1e4).catch(()=>({output:""})),r.execute("tenant plans --json",8e3).catch(()=>({output:""})),r.execute("tenant metrics --json",8e3).catch(()=>({output:""})),r.execute("tenant stats --json",8e3).catch(()=>({output:""}))]);J.value=vt(l.output),re.value=yt(e.output),me.value=dt(c.output),ye.value=ct(T.output),h.value=bt(ee.output)}catch(l){v.error("加载租户数据失败: "+(l?.message||l))}finally{s.value=!1}}async function De(){const l=w.name.trim(),e=w.slug.trim();if(!l||!e){v.warning("请填写名称和 slug");return}if(!/^[a-z0-9][a-z0-9-]*[a-z0-9]$|^[a-z0-9]$/.test(e)){v.warning("slug 必须为小写字母数字 + 连字符");return}z.value=!0;try{const c=[`tenant create "${l.replace(/"/g,'\\"')}" "${e.replace(/"/g,'\\"')}"`];c.push(`--plan ${w.plan}`),w.owner.trim()&&c.push(`--owner "${w.owner.trim().replace(/"/g,'\\"')}"`),c.push("--json");const{output:T}=await r.execute(c.join(" "),1e4);if(/error|Error|失败/i.test(T)&&!/"id"/.test(T)){v.error("创建失败: "+T.slice(0,120));return}v.success("租户已创建"),H.value=!1,xe(),await N()}catch(c){v.error("创建失败: "+(c?.message||c))}finally{z.value=!1}}function Ye(l){k.tenantId=l.id,k.plan=l.plan==="free"?"starter":l.plan,k.amount=null,k.duration=720*60*60*1e3,ie.value=l.name,X.value=!0}async function Je(){Y.value=!0;try{const l=[`tenant subscribe ${k.tenantId}`];l.push(`--plan ${k.plan}`),k.amount!=null&&l.push(`--amount ${k.amount}`),k.duration&&l.push(`--duration-ms ${k.duration}`),l.push("--json");const{output:e}=await r.execute(l.join(" "),1e4);if(/error|Error|失败/i.test(e)&&!/"id"/.test(e)){v.error("订阅失败: "+e.slice(0,120));return}v.success("订阅已创建"),X.value=!1,ke(),ue.value="subscriptions",await N()}catch(l){v.error("订阅失败: "+(l?.message||l))}finally{Y.value=!1}}async function Ke(l,e){if(e!==l.plan)try{const{output:c}=await r.execute(`tenant configure ${l.id} --plan ${e} --json`,8e3);if(/error|Error/i.test(c)&&!/"id"/.test(c)){v.error("计划变更失败: "+c.slice(0,120));return}v.success(`已切换到 ${F(e)}`),await N()}catch(c){v.error("计划变更失败: "+(c?.message||c))}}async function be(l,e){try{const{output:c}=await r.execute(`tenant configure ${l.id} --status ${e} --json`,8e3);if(/error|Error/i.test(c)&&!/"id"/.test(c)){v.error("状态变更失败: "+c.slice(0,120));return}v.success(`已${e==="active"?"激活":"暂停"}`),await N()}catch(c){v.error("状态变更失败: "+(c?.message||c))}}async function Ve(l){try{const{output:e}=await r.execute(`tenant delete ${l.id} --json`,8e3);if(/error|Error/i.test(e)&&!/deleted|removed/.test(e)){v.error("删除失败: "+e.slice(0,120));return}v.success("租户已软删除"),await N()}catch(e){v.error("删除失败: "+(e?.message||e))}}async function Qe(l){try{const{output:e}=await r.execute(`tenant cancel ${l.tenantId}`,8e3);if(/error|Error/i.test(e)&&!/cancelled|cancel/i.test(e)){v.error("取消失败: "+e.slice(0,120));return}v.success("订阅已取消"),await N()}catch(e){v.error("取消失败: "+(e?.message||e))}}async function Ge(){if(!I.tenantId){v.warning("请选择租户");return}le.value=!0,x.value=null;try{const l=[`tenant check-quota ${I.tenantId} ${I.metric}`];I.period.trim()&&l.push(`--period ${I.period.trim()}`),l.push("--json");const{output:e}=await r.execute(l.join(" "),8e3),c=gt(e);if(!c){v.error("检查失败: "+e.slice(0,120));return}x.value=c,c.exceeded&&v.warning("该租户已超额!")}catch(l){v.error("检查失败: "+(l?.message||l))}finally{le.value=!1}}async function We(){if(!b.tenantId){v.warning("请选择租户");return}if(b.value==null||b.value<0){v.warning("请输入有效数量");return}oe.value=!0;try{const l=[`tenant record ${b.tenantId} ${b.metric} ${b.value}`];b.period.trim()&&l.push(`--period ${b.period.trim()}`),l.push("--json");const{output:e}=await r.execute(l.join(" "),8e3);if(/error|Error/i.test(e)&&!/"id"|"tenant"/.test(e)){v.error("记录失败: "+e.slice(0,120));return}v.success("用量已记录"),Z.value=!1,Se(),await N()}catch(l){v.error("记录失败: "+(l?.message||l))}finally{oe.value=!1}}function xe(){w.name="",w.slug="",w.plan="free",w.owner=""}function ke(){k.tenantId="",k.plan="pro",k.amount=null,k.duration=720*60*60*1e3,ie.value=""}function Se(){b.tenantId=null,b.metric="api_calls",b.value=1,b.period=""}function Ce(l){l.period||(l.period=xt())}return Ce(I),Ce(b),ut(N),(l,e)=>{const c=y("a-button"),T=y("a-menu-item"),ee=y("a-menu"),Ae=y("a-dropdown"),we=y("a-space"),R=y("a-statistic"),O=y("a-card"),L=y("a-col"),ze=y("a-row"),M=y("a-tag"),P=y("a-radio-button"),de=y("a-radio-group"),$e=y("a-popconfirm"),je=y("a-table"),pe=y("a-tab-pane"),He=y("a-tabs"),G=y("a-input"),$=y("a-form-item"),B=y("a-select-option"),E=y("a-select"),te=y("a-form"),ae=y("a-modal"),Ie=y("a-input-number"),Xe=y("a-progress");return u(),f("div",null,[m("div",kt,[e[26]||(e[26]=m("div",null,[m("h2",{class:"page-title"},"多租户 SaaS"),m("p",{class:"page-sub"},"租户管理 · 订阅计费 · 用量计量 · 配额检查")],-1)),n(we,null,{default:a(()=>[n(c,{loading:s.value,onClick:N},{icon:a(()=>[n(_(at))]),default:a(()=>[e[21]||(e[21]=d(" 刷新 ",-1))]),_:1},8,["loading"]),n(Ae,{trigger:["click"]},{overlay:a(()=>[n(ee,{onClick:Ee},{default:a(()=>[n(T,{key:"tenant"},{default:a(()=>[n(_(ce)),e[23]||(e[23]=d(" 创建租户",-1))]),_:1}),n(T,{key:"quota"},{default:a(()=>[n(_(lt)),e[24]||(e[24]=d(" 检查配额",-1))]),_:1}),n(T,{key:"record"},{default:a(()=>[n(_(ot)),e[25]||(e[25]=d(" 记录用量",-1))]),_:1})]),_:1})]),default:a(()=>[n(c,{type:"primary"},{icon:a(()=>[n(_(nt))]),default:a(()=>[e[22]||(e[22]=d(" 操作 ▼ ",-1))]),_:1})]),_:1})]),_:1})]),n(ze,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:a(()=>[n(L,{xs:12,sm:8,lg:5},{default:a(()=>[n(O,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[n(R,{title:"租户总数",value:h.value.tenantCount,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:a(()=>[n(_(ce))]),_:1},8,["value"])]),_:1})]),_:1}),n(L,{xs:12,sm:8,lg:5},{default:a(()=>[n(O,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[n(R,{title:"活跃订阅",value:h.value.activeSubscriptions,"value-style":{color:h.value.activeSubscriptions>0?"#52c41a":"#888",fontSize:"20px"}},{prefix:a(()=>[n(_(Ue))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),n(L,{xs:12,sm:8,lg:5},{default:a(()=>[n(O,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[n(R,{title:"月度收入",value:Oe.value,precision:0,prefix:"¥","value-style":{color:"#722ed1",fontSize:"20px"}},null,8,["value"])]),_:1})]),_:1}),n(L,{xs:12,sm:8,lg:5},{default:a(()=>[n(O,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[n(R,{title:"API 调用",value:h.value.totalUsage.api_calls,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:a(()=>[n(_(rt))]),_:1},8,["value"])]),_:1})]),_:1}),n(L,{xs:24,sm:8,lg:4},{default:a(()=>[n(O,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[n(R,{title:"存储用量",value:_(ve)(h.value.totalUsage.storage_bytes),"value-style":{color:"#faad14",fontSize:"18px"}},null,8,["value"])]),_:1})]),_:1})]),_:1}),h.value.tenantCount>0?(u(),g(O,{key:0,title:"计划分布",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"},"body-style":{padding:"12px 16px"}},{default:a(()=>[n(we,{size:[12,8],wrap:""},{default:a(()=>[(u(!0),f(A,null,j(_(W),t=>(u(),g(M,{key:t,color:Q(t)},{default:a(()=>[d(p(F(t))+": "+p(h.value.byPlan[t]||0),1)]),_:2},1032,["color"]))),128)),m("span",St," 活跃 "+p(h.value.byStatus.active)+" · 暂停 "+p(h.value.byStatus.suspended)+" · 已删除 "+p(h.value.byStatus.deleted),1)]),_:1})]),_:1})):S("",!0),n(He,{activeKey:ue.value,"onUpdate:activeKey":e[2]||(e[2]=t=>ue.value=t),class:"tenant-tabs"},{default:a(()=>[n(pe,{key:"tenants",tab:"租户"},{default:a(()=>[m("div",Ct,[n(de,{value:K.value,"onUpdate:value":e[0]||(e[0]=t=>K.value=t),size:"small"},{default:a(()=>[n(P,{value:""},{default:a(()=>[...e[27]||(e[27]=[d("全部计划",-1)])]),_:1}),(u(!0),f(A,null,j(_(W),t=>(u(),g(P,{key:t,value:t},{default:a(()=>[d(p(F(t)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),n(de,{value:V.value,"onUpdate:value":e[1]||(e[1]=t=>V.value=t),size:"small","button-style":"solid"},{default:a(()=>[n(P,{value:""},{default:a(()=>[...e[28]||(e[28]=[d("全部状态",-1)])]),_:1}),(u(!0),f(A,null,j(_(st),t=>(u(),g(P,{key:t,value:t},{default:a(()=>[d(p(ge(t)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),n(je,{columns:qe,"data-source":Ne.value,pagination:{pageSize:20,showTotal:t=>`共 ${t} 条`},size:"small",loading:s.value,style:{background:"var(--bg-card)"}},{bodyCell:a(({column:t,record:i})=>[t.key==="name"?(u(),f(A,{key:0},[m("span",At,p(i.name),1),m("div",wt,p(i.slug),1)],64)):S("",!0),t.key==="plan"?(u(),g(M,{key:1,color:Q(i.plan)},{default:a(()=>[d(p(F(i.plan)),1)]),_:2},1032,["color"])):S("",!0),t.key==="status"?(u(),g(M,{key:2,color:Me(i.status)},{default:a(()=>[d(p(ge(i.status)),1)]),_:2},1032,["color"])):S("",!0),t.key==="owner"?(u(),f(A,{key:3},[i.ownerId?(u(),f("span",zt,p(i.ownerId),1)):(u(),f("span",$t,"—"))],64)):S("",!0),t.key==="createdAt"?(u(),f("span",jt,p(_(fe)(i.createdAt)),1)):S("",!0),t.key==="action"?(u(),f(A,{key:5},[n(c,{size:"small",type:"link",onClick:q=>Ye(i)},{default:a(()=>[...e[29]||(e[29]=[d("订阅",-1)])]),_:1},8,["onClick"]),n(Ae,{trigger:["click"]},{overlay:a(()=>[n(ee,{onClick:q=>Ke(i,q.key)},{default:a(()=>[(u(!0),f(A,null,j(_(W),q=>(u(),g(T,{key:q,disabled:q===i.plan},{default:a(()=>[d(p(F(q)),1)]),_:2},1032,["disabled"]))),128))]),_:2},1032,["onClick"])]),default:a(()=>[n(c,{size:"small",type:"link"},{default:a(()=>[...e[30]||(e[30]=[d("计划 ▼",-1)])]),_:1})]),_:2},1024),i.status==="active"?(u(),g(c,{key:0,size:"small",type:"link",onClick:q=>be(i,"suspended")},{default:a(()=>[...e[31]||(e[31]=[d("暂停",-1)])]),_:1},8,["onClick"])):i.status==="suspended"?(u(),g(c,{key:1,size:"small",type:"link",onClick:q=>be(i,"active")},{default:a(()=>[...e[32]||(e[32]=[d("激活",-1)])]),_:1},8,["onClick"])):S("",!0),i.status!=="deleted"?(u(),g($e,{key:2,title:"软删除该租户?","ok-text":"删除","cancel-text":"取消",onConfirm:q=>Ve(i)},{default:a(()=>[n(c,{size:"small",type:"link",danger:""},{default:a(()=>[...e[33]||(e[33]=[d("删除",-1)])]),_:1})]),_:1},8,["onConfirm"])):S("",!0)],64)):S("",!0)]),emptyText:a(()=>[m("div",It,[n(_(ce),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),d(" "+p(K.value||V.value?"没有符合条件的租户":'暂无租户,点"操作 → 创建租户"添加第一个'),1)])]),_:1},8,["data-source","pagination","loading"])]),_:1}),n(pe,{key:"subscriptions",tab:"订阅"},{default:a(()=>[n(je,{columns:Fe,"data-source":re.value,pagination:{pageSize:20,showTotal:t=>`共 ${t} 条`},size:"small",loading:s.value,style:{background:"var(--bg-card)"}},{bodyCell:a(({column:t,record:i})=>[t.key==="tenant"?(u(),f(A,{key:0},[m("span",Ut,p(Le(i.tenantId)),1),m("div",ht,p(i.tenantId.slice(0,8)),1)],64)):S("",!0),t.key==="plan"?(u(),g(M,{key:1,color:Q(i.plan)},{default:a(()=>[d(p(F(i.plan)),1)]),_:2},1032,["color"])):S("",!0),t.key==="amount"?(u(),f(A,{key:2},[i.amount!=null?(u(),f("span",Tt,"¥"+p(i.amount),1)):(u(),f("span",qt,"—"))],64)):S("",!0),t.key==="status"?(u(),g(M,{key:3,color:Re(i.status)},{default:a(()=>[d(p(Pe(i.status)),1)]),_:2},1032,["color"])):S("",!0),t.key==="startedAt"?(u(),f("span",Ft,p(_(fe)(i.startedAt)),1)):S("",!0),t.key==="expiresAt"?(u(),f("span",Nt,p(_(fe)(i.expiresAt)),1)):S("",!0),t.key==="action"?(u(),f(A,{key:6},[i.status==="active"?(u(),g($e,{key:0,title:"取消该订阅?","ok-text":"取消订阅","cancel-text":"返回",onConfirm:q=>Qe(i)},{default:a(()=>[n(c,{size:"small",type:"link",danger:""},{default:a(()=>[...e[34]||(e[34]=[d("取消订阅",-1)])]),_:1})]),_:1},8,["onConfirm"])):S("",!0)],64)):S("",!0)]),emptyText:a(()=>[m("div",Ot,[n(_(Ue),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),e[35]||(e[35]=d(" 暂无订阅记录 ",-1))])]),_:1},8,["data-source","pagination","loading"])]),_:1}),n(pe,{key:"plans",tab:"计划"},{default:a(()=>[n(ze,{gutter:[16,16]},{default:a(()=>[(u(!0),f(A,null,j(me.value,t=>(u(),g(L,{key:t.id,xs:24,sm:12,lg:6},{default:a(()=>[n(O,{title:t.name,size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{extra:a(()=>[n(M,{color:Q(t.id)},{default:a(()=>[d(p(t.id),1)]),_:2},1032,["color"])]),default:a(()=>[m("div",Mt,[t.monthlyFee!=null?(u(),f("span",Pt,[d("¥"+p(t.monthlyFee)+" ",1),e[36]||(e[36]=m("span",{class:"plan-fee-unit"},"/ 月",-1))])):(u(),f("span",Rt,"联系销售"))]),m("div",Lt,[e[37]||(e[37]=m("div",{class:"plan-section-title"},"配额",-1)),(u(!0),f(A,null,j(ye.value,i=>(u(),f("div",{key:i.id,class:"plan-quota-row"},[m("span",Bt,p(i.name),1),m("span",Et,p(Be(t.quotas?.[i.id],i.id)),1)]))),128))]),m("div",Dt,[e[38]||(e[38]=m("div",{class:"plan-section-title"},"特性",-1)),(u(!0),f(A,null,j(t.features,i=>(u(),g(M,{key:i,style:{"font-size":"10px",margin:"1px"}},{default:a(()=>[d(p(i),1)]),_:2},1024))),128))])]),_:2},1032,["title"])]),_:2},1024))),128))]),_:1})]),_:1})]),_:1},8,["activeKey"]),n(ae,{open:H.value,"onUpdate:open":e[7]||(e[7]=t=>H.value=t),title:"创建租户","confirm-loading":z.value,width:520,"ok-text":"创建","cancel-text":"取消",onOk:De,onCancel:xe},{default:a(()=>[n(te,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:a(()=>[n($,{label:"名称",required:""},{default:a(()=>[n(G,{value:w.name,"onUpdate:value":e[3]||(e[3]=t=>w.name=t),placeholder:"例如: Acme Corp"},null,8,["value"])]),_:1}),n($,{label:"Slug",required:""},{default:a(()=>[n(G,{value:w.slug,"onUpdate:value":e[4]||(e[4]=t=>w.slug=t),placeholder:"小写字母数字+连字符,例如: acme-corp"},null,8,["value"])]),_:1}),n($,{label:"计划"},{default:a(()=>[n(E,{value:w.plan,"onUpdate:value":e[5]||(e[5]=t=>w.plan=t)},{default:a(()=>[(u(!0),f(A,null,j(_(W),t=>(u(),g(B,{key:t,value:t},{default:a(()=>[d(p(F(t)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),n($,{label:"所有者 ID"},{default:a(()=>[n(G,{value:w.owner,"onUpdate:value":e[6]||(e[6]=t=>w.owner=t),placeholder:"可选"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),n(ae,{open:X.value,"onUpdate:open":e[11]||(e[11]=t=>X.value=t),title:`订阅:${ie.value}`,"confirm-loading":Y.value,width:500,"ok-text":"订阅","cancel-text":"取消",onOk:Je,onCancel:ke},{default:a(()=>[n(te,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:a(()=>[n($,{label:"计划",required:""},{default:a(()=>[n(E,{value:k.plan,"onUpdate:value":e[8]||(e[8]=t=>k.plan=t)},{default:a(()=>[(u(!0),f(A,null,j(_(W),t=>(u(),g(B,{key:t,value:t},{default:a(()=>[d(p(F(t)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),n($,{label:"金额覆盖"},{default:a(()=>[n(Ie,{value:k.amount,"onUpdate:value":e[9]||(e[9]=t=>k.amount=t),min:0,placeholder:"留空使用计划默认价",style:{width:"100%"}},null,8,["value"])]),_:1}),n($,{label:"周期"},{default:a(()=>[n(de,{value:k.duration,"onUpdate:value":e[10]||(e[10]=t=>k.duration=t)},{default:a(()=>[n(P,{value:720*60*60*1e3},{default:a(()=>[...e[39]||(e[39]=[d("30 天",-1)])]),_:1}),n(P,{value:2160*60*60*1e3},{default:a(()=>[...e[40]||(e[40]=[d("90 天",-1)])]),_:1}),n(P,{value:365*24*60*60*1e3},{default:a(()=>[...e[41]||(e[41]=[d("1 年",-1)])]),_:1})]),_:1},8,["value"])]),_:1})]),_:1})]),_:1},8,["open","title","confirm-loading"]),n(ae,{open:se.value,"onUpdate:open":e[15]||(e[15]=t=>se.value=t),title:"配额检查","confirm-loading":le.value,width:500,"ok-text":"检查","cancel-text":"关闭",onOk:Ge},{default:a(()=>[n(te,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:a(()=>[n($,{label:"租户",required:""},{default:a(()=>[n(E,{value:I.tenantId,"onUpdate:value":e[12]||(e[12]=t=>I.tenantId=t),"show-search":"",placeholder:"选择租户"},{default:a(()=>[(u(!0),f(A,null,j(J.value,t=>(u(),g(B,{key:t.id,value:t.id},{default:a(()=>[d(p(t.name)+" ("+p(t.slug)+")",1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),n($,{label:"指标",required:""},{default:a(()=>[n(E,{value:I.metric,"onUpdate:value":e[13]||(e[13]=t=>I.metric=t)},{default:a(()=>[(u(!0),f(A,null,j(_(Te),t=>(u(),g(B,{key:t,value:t},{default:a(()=>[d(p(t),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),n($,{label:"周期"},{default:a(()=>[n(G,{value:I.period,"onUpdate:value":e[14]||(e[14]=t=>I.period=t),placeholder:"YYYY-MM,留空则当前月"},null,8,["value"])]),_:1})]),_:1}),x.value?(u(),g(O,{key:0,size:"small",style:{background:"var(--bg-base)","margin-top":"8px"}},{default:a(()=>[n(R,{title:"配额状态",value:x.value.unlimited?"无限":x.value.exceeded?"已超额":"正常","value-style":{color:x.value.exceeded?"#ff4d4f":x.value.unlimited?"#722ed1":"#52c41a"}},null,8,["value","value-style"]),m("div",Yt,[m("div",null,[e[42]||(e[42]=d("计划: ",-1)),n(M,{color:Q(x.value.plan)},{default:a(()=>[d(p(F(x.value.plan)),1)]),_:1},8,["color"])]),m("div",null,"周期: "+p(x.value.period),1),m("div",null,[e[43]||(e[43]=d("已用: ",-1)),m("span",Jt,p(_e(x.value.used,x.value.metric)),1)]),x.value.unlimited?S("",!0):(u(),f("div",Kt,[e[44]||(e[44]=d(" 上限: ",-1)),m("span",Vt,p(_e(x.value.limit,x.value.metric)),1)])),!x.value.unlimited&&x.value.limit>0?(u(),f("div",Qt,[n(Xe,{percent:Math.min(100,Math.round(100*x.value.used/x.value.limit)),size:"small",status:x.value.exceeded?"exception":"active"},null,8,["percent","status"])])):S("",!0)])]),_:1})):S("",!0)]),_:1},8,["open","confirm-loading"]),n(ae,{open:Z.value,"onUpdate:open":e[20]||(e[20]=t=>Z.value=t),title:"记录用量","confirm-loading":oe.value,width:500,"ok-text":"记录","cancel-text":"取消",onOk:We,onCancel:Se},{default:a(()=>[n(te,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:a(()=>[n($,{label:"租户",required:""},{default:a(()=>[n(E,{value:b.tenantId,"onUpdate:value":e[16]||(e[16]=t=>b.tenantId=t),"show-search":"",placeholder:"选择租户"},{default:a(()=>[(u(!0),f(A,null,j(J.value,t=>(u(),g(B,{key:t.id,value:t.id},{default:a(()=>[d(p(t.name)+" ("+p(t.slug)+")",1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),n($,{label:"指标",required:""},{default:a(()=>[n(E,{value:b.metric,"onUpdate:value":e[17]||(e[17]=t=>b.metric=t)},{default:a(()=>[(u(!0),f(A,null,j(_(Te),t=>(u(),g(B,{key:t,value:t},{default:a(()=>[d(p(t),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),n($,{label:"数量",required:""},{default:a(()=>[n(Ie,{value:b.value,"onUpdate:value":e[18]||(e[18]=t=>b.value=t),min:0,style:{width:"100%"}},null,8,["value"])]),_:1}),n($,{label:"周期"},{default:a(()=>[n(G,{value:b.period,"onUpdate:value":e[19]||(e[19]=t=>b.period=t),placeholder:"YYYY-MM,留空则当前月"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"])])}}},sa=tt(Gt,[["__scopeId","data-v-45eae7f1"]]);export{sa as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{u as ht}from"./ws-Bv7YH0VB.js";import{s as nt}from"./community-parser-CO25nZFt.js";import{_ as Ct}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{a as A}from"./index-BbqCdQXU.js";import{Y as zt,c as Bt,N as tt,k as et,ao as At,ap as ot}from"./icons-ukMaZ3tx.js";import{l as Rt,F as v,D as y,c as o,x as a,m as M,G as _,q as k,r as B,v as d,J as T,u as m,H as O,L as J,I as i,j as Ot}from"./vendor-BVetwVfk.js";import"./index-ZZ_4A9um.js";import"./useConfigInject-BKqJUQaF.js";import"./transition-CGYDOK3N.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-CHsntPCQ.js";import"./index-U4Zd5IK6.js";function j(t){const e=nt(t);if(!e)return null;try{return JSON.parse(e)}catch{}const n=e.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(!n)return null;try{return JSON.parse(n[0])}catch{return null}}const Ut=Object.freeze(["today","week","month","all"]),rt=Object.freeze(["planning","active","suspended","archived"]),lt=Object.freeze(["pending","recorded","billed","rejected","refunded"]);function u(t,e=0){return typeof t=="number"&&Number.isFinite(t)?t:e}function I(t){if(!t)return{noDb:!1,error:""};const e=nt(t),n=/Database not available/i.test(e);return{noDb:n,error:n?"Database not available":""}}const G={totalCalls:0,totalInputTokens:0,totalOutputTokens:0,totalTokens:0,totalCostUsd:0,avgResponseTimeMs:0};function st(t){const e={...G};return!t||typeof t!="object"||Array.isArray(t)||(e.totalCalls=u(t.total_calls??t.totalCalls,0),e.totalInputTokens=u(t.total_input_tokens??t.totalInputTokens,0),e.totalOutputTokens=u(t.total_output_tokens??t.totalOutputTokens,0),e.totalTokens=u(t.total_tokens??t.totalTokens,0),e.totalCostUsd=u(t.total_cost_usd??t.totalCostUsd,0),e.avgResponseTimeMs=u(t.avg_response_time_ms??t.avgResponseTimeMs,0)),e}function at(t){const e=j(t);return!e||typeof e!="object"||Array.isArray(e)?{stats:{...G},today:{...G}}:{stats:st(e.stats),today:st(e.today)}}function Et(t,e=0){if(!t||typeof t!="object")return null;const n=t.provider||"",f=t.model||"";return!n&&!f?null:{key:`${n}/${f}/${e}`,provider:String(n),model:String(f),calls:u(t.calls,0),inputTokens:u(t.input_tokens??t.inputTokens,0),outputTokens:u(t.output_tokens??t.outputTokens,0),totalTokens:u(t.total_tokens??t.totalTokens,0),costUsd:u(t.cost_usd??t.costUsd,0),_idx:e}}function Mt(t){const e=j(t);return Array.isArray(e)?e.map(Et).filter(Boolean):[]}function jt(t,e=0){if(!t||typeof t!="object")return null;const n=t.id||"";return n?{key:n,id:n,provider:String(t.provider||""),model:String(t.model||""),inputTokens:u(t.input_tokens??t.inputTokens,0),outputTokens:u(t.output_tokens??t.outputTokens,0),totalTokens:u(t.total_tokens??t.totalTokens,0),costUsd:u(t.cost_usd??t.costUsd,0),responseTimeMs:u(t.response_time_ms??t.responseTimeMs,0),endpoint:String(t.endpoint||""),createdAt:t.created_at??t.createdAt??"",_idx:e}:null}function Dt(t){const e=j(t);return Array.isArray(e)?e.map(jt).filter(Boolean):[]}const Vt={totalEntries:0,totalHits:0,totalTokensSaved:0,expiredEntries:0};function Nt(t){const e={...Vt},n=j(t);return!n||typeof n!="object"||Array.isArray(n)||(e.totalEntries=u(n.total_entries??n.totalEntries,0),e.totalHits=u(n.total_hits??n.totalHits,0),e.totalTokensSaved=u(n.total_tokens_saved??n.totalTokensSaved,0),e.expiredEntries=u(n.expired_entries??n.expiredEntries,0)),e}const It={totalBudgetsV2:0,totalRecordsV2:0,maxActiveBudgetsPerOwner:0,maxPendingRecordsPerBudget:0,budgetIdleMs:0,recordStuckMs:0,budgetsByStatus:{},recordsByStatus:{}};function Pt(t){const e=JSON.parse(JSON.stringify(It));for(const f of rt)e.budgetsByStatus[f]=0;for(const f of lt)e.recordsByStatus[f]=0;const n=j(t);if(!n||typeof n!="object"||Array.isArray(n))return e;if(e.totalBudgetsV2=u(n.totalBudgetsV2,0),e.totalRecordsV2=u(n.totalRecordsV2,0),e.maxActiveBudgetsPerOwner=u(n.maxActiveBudgetsPerOwner,0),e.maxPendingRecordsPerBudget=u(n.maxPendingRecordsPerBudget,0),e.budgetIdleMs=u(n.budgetIdleMs,0),e.recordStuckMs=u(n.recordStuckMs,0),n.budgetsByStatus&&typeof n.budgetsByStatus=="object")for(const[f,p]of Object.entries(n.budgetsByStatus))typeof p=="number"&&Number.isFinite(p)&&(e.budgetsByStatus[f]=p);if(n.recordsByStatus&&typeof n.recordsByStatus=="object")for(const[f,p]of Object.entries(n.recordsByStatus))typeof p=="number"&&Number.isFinite(p)&&(e.recordsByStatus[f]=p);return e}function wt(t){if(t==null||t==="")return"—";const e=String(t),n=e.includes(" ")&&!e.includes("T")?e.replace(" ","T")+"Z":e,f=typeof t=="number"?new Date(t):new Date(n);return isNaN(f.getTime())?e:f.toLocaleString("zh-CN",{hour12:!1})}function P(t){return typeof t!="number"||!Number.isFinite(t)?"$0":"$"+(Math.abs(t)<1?t.toFixed(4):t.toFixed(2))}const Lt={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},Ft={style:{display:"flex","align-items":"center",gap:"12px","flex-wrap":"wrap"}},$t={class:"stat-sub"},Ht={class:"stat-sub"},Jt={class:"stat-sub"},Gt={class:"stat-sub"},Kt={key:1,style:{color:"var(--text-primary)","font-family":"monospace","font-size":"12px"}},Yt={key:2,style:{color:"var(--text-secondary)"}},qt={style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"12px"}},Wt={style:{color:"var(--text-muted)","font-size":"11px","font-family":"monospace"}},Zt={style:{color:"#faad14","font-weight":"500","font-family":"monospace"}},Qt={key:5,style:{color:"var(--text-muted)","font-family":"monospace","font-size":"12px"}},Xt={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},te={key:0,style:{color:"var(--text-secondary)","font-size":"11px","font-family":"monospace"}},ee={key:2,style:{color:"var(--text-primary)","font-family":"monospace","font-size":"12px"}},oe={style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"12px"}},se={style:{color:"var(--text-muted)","font-size":"11px","font-family":"monospace"}},ae={key:4,style:{color:"#faad14","font-weight":"500","font-family":"monospace"}},ne={key:0,style:{color:"var(--text-muted)","font-family":"monospace","font-size":"11px"}},re={key:1,style:{color:"var(--text-muted)"}},le={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},ie={__name:"Tokens",setup(t){const e=ht(),n=B(!1),f=B("all"),p=B({stats:{totalCalls:0,totalInputTokens:0,totalOutputTokens:0,totalTokens:0,totalCostUsd:0,avgResponseTimeMs:0},today:{totalCalls:0,totalInputTokens:0,totalOutputTokens:0,totalTokens:0,totalCostUsd:0,avgResponseTimeMs:0}}),w=B([]),K=B([]),b=B({totalEntries:0,totalHits:0,totalTokensSaved:0,expiredEntries:0}),R=B({totalBudgetsV2:0,totalRecordsV2:0,maxActiveBudgetsPerOwner:0,maxPendingRecordsPerBudget:0,budgetIdleMs:0,recordStuckMs:0,budgetsByStatus:{},recordsByStatus:{}}),D=B({noDb:!1,error:""}),Y=B("breakdown"),it=[{title:"提供商",key:"provider",width:"130px"},{title:"模型",key:"model"},{title:"调用",key:"calls",width:"90px"},{title:"Token",key:"totalTokens",width:"180px"},{title:"成本",key:"costUsd",width:"180px"},{title:"均价/次",key:"avgCost",width:"110px"}],ut=[{title:"时间",key:"createdAt",width:"160px"},{title:"提供商",key:"provider",width:"130px"},{title:"模型",key:"model",width:"180px"},{title:"Tokens",key:"tokens",width:"160px"},{title:"成本",key:"costUsd",width:"110px"},{title:"响应",key:"responseTimeMs",width:"100px"},{title:"端点",key:"endpoint"}],q=Ot(()=>w.value.reduce((s,l)=>s+l.costUsd,0));function ct(s){return{today:"今日",week:"近 7 日",month:"近 30 日",all:"全部"}[s]||s}function W(s){const l=["blue","green","purple","orange","cyan","magenta","gold","volcano"];let h=0;for(let C=0;C<(s||"").length;C++)h=h*31+s.charCodeAt(C)>>>0;return l[h%l.length]}function dt(s){return s<=500?"#52c41a":s<=1500?"#1677ff":s<=3e3?"#faad14":"#ff4d4f"}function pt(s){return s<=500?"green":s<=1500?"blue":s<=3e3?"gold":"red"}function S(s){return typeof s!="number"||!Number.isFinite(s)?"0":s.toLocaleString("en-US")}function ft(s){return!q.value||s<=0?0:Math.min(100,Math.round(s/q.value*100))}function Z(s,l){return l?Math.round(s/l*100):0}function yt(s){return{planning:"筹划",active:"活跃",suspended:"暂停",archived:"已归档"}[s]||s}function vt(s){return{planning:"default",active:"green",suspended:"orange",archived:"default"}[s]||"default"}function mt(s){return{planning:"#888",active:"#52c41a",suspended:"#faad14",archived:"#666"}[s]||"#888"}function kt(s){return{pending:"待处理",recorded:"已记录",billed:"已结算",rejected:"已拒绝",refunded:"已退款"}[s]||s}function _t(s){return{pending:"default",recorded:"blue",billed:"green",rejected:"red",refunded:"orange"}[s]||"default"}function gt(s){return{pending:"#888",recorded:"#1677ff",billed:"#52c41a",rejected:"#ff4d4f",refunded:"#faad14"}[s]||"#888"}async function V(){n.value=!0,D.value={noDb:!1,error:""};try{const[s,l,h,C,L]=await Promise.all([e.execute(`tokens show --period ${f.value} --json`,8e3).catch(()=>({output:""})),e.execute("tokens breakdown --json",8e3).catch(()=>({output:""})),e.execute("tokens recent -n 100 --json",1e4).catch(()=>({output:""})),e.execute("tokens cache --json",6e3).catch(()=>({output:""})),e.execute("tokens stats-v2",6e3).catch(()=>({output:""}))]),N=[s,l,h,C].map(U=>I(U.output)).find(U=>U.noDb);N&&(D.value=N),p.value=at(s.output),w.value=Mt(l.output),K.value=Dt(h.output),b.value=Nt(C.output),R.value=Pt(L.output)}catch(s){A.error("加载用量数据失败: "+(s?.message||s))}finally{n.value=!1}}async function bt(){try{const{output:s}=await e.execute(`tokens show --period ${f.value} --json`,8e3),l=I(s);if(l.noDb){D.value=l;return}p.value=at(s)}catch(s){A.error("加载用量失败: "+(s?.message||s))}}async function xt(){try{const{output:s}=await e.execute("tokens cache --cleanup",8e3);if(I(s).noDb){A.error("需要先 cc init 初始化项目");return}A.success("过期条目已清理"),await V()}catch(s){A.error("清理失败: "+(s?.message||s))}}async function Tt(){try{const{output:s}=await e.execute("tokens cache --clear",8e3);if(I(s).noDb){A.error("需要先 cc init 初始化项目");return}A.success("缓存已清空"),await V()}catch(s){A.error("清空失败: "+(s?.message||s))}}return Rt(V),(s,l)=>{const h=k("a-button"),C=k("a-space"),L=k("a-alert"),N=k("a-radio-button"),U=k("a-radio-group"),g=k("a-card"),z=k("a-statistic"),x=k("a-col"),F=k("a-row"),E=k("a-tag"),$=k("a-progress"),Q=k("a-table"),H=k("a-tab-pane"),X=k("a-popconfirm"),St=k("a-tabs");return d(),v("div",null,[y("div",Lt,[l[3]||(l[3]=y("div",null,[y("h2",{class:"page-title"},"Token 用量"),y("p",{class:"page-sub"},"LLM 调用追踪 · 成本核算 · 响应缓存")],-1)),o(C,null,{default:a(()=>[o(h,{loading:n.value,onClick:V},{icon:a(()=>[o(m(zt))]),default:a(()=>[l[2]||(l[2]=T(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),D.value.noDb?(d(),M(L,{key:0,type:"info","show-icon":"",message:"该模块需要项目级数据库",description:"`cc tokens ...` 命令仅在 chainlesschain 项目目录下可用。请先运行 `cc init` 初始化项目,或在已初始化的目录启动 `cc serve`。",style:{"margin-bottom":"16px"}})):_("",!0),o(g,{size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"},"body-style":{padding:"10px 16px"}},{default:a(()=>[y("div",Ft,[l[4]||(l[4]=y("span",{style:{color:"var(--text-secondary)","font-size":"12px"}},"时间范围:",-1)),o(U,{value:f.value,"onUpdate:value":l[0]||(l[0]=r=>f.value=r),size:"small","button-style":"solid",onChange:bt},{default:a(()=>[(d(!0),v(O,null,J(m(Ut),r=>(d(),M(N,{key:r,value:r},{default:a(()=>[T(i(ct(r)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])])]),_:1}),o(F,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:a(()=>[o(x,{xs:12,sm:8,lg:5},{default:a(()=>[o(g,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(z,{title:"调用次数",value:p.value.stats.totalCalls,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:a(()=>[o(m(Bt))]),_:1},8,["value"]),y("div",$t,"今日 "+i(p.value.today.totalCalls),1)]),_:1})]),_:1}),o(x,{xs:12,sm:8,lg:5},{default:a(()=>[o(g,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(z,{title:"Token 总数",value:p.value.stats.totalTokens,"value-style":{color:"#722ed1",fontSize:"20px"}},{prefix:a(()=>[o(m(tt))]),_:1},8,["value"]),y("div",Ht,i(S(p.value.stats.totalInputTokens))+" 入 / "+i(S(p.value.stats.totalOutputTokens))+" 出",1)]),_:1})]),_:1}),o(x,{xs:12,sm:8,lg:5},{default:a(()=>[o(g,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(z,{title:"累计成本",value:p.value.stats.totalCostUsd,precision:p.value.stats.totalCostUsd<1?4:2,prefix:"$","value-style":{color:"#faad14",fontSize:"20px"}},null,8,["value","precision"]),y("div",Jt,"今日 "+i(m(P)(p.value.today.totalCostUsd)),1)]),_:1})]),_:1}),o(x,{xs:12,sm:8,lg:5},{default:a(()=>[o(g,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(z,{title:"平均响应",value:p.value.stats.avgResponseTimeMs,suffix:"ms",precision:0,"value-style":{color:dt(p.value.stats.avgResponseTimeMs),fontSize:"20px"}},{prefix:a(()=>[o(m(et))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),o(x,{xs:24,sm:8,lg:4},{default:a(()=>[o(g,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(z,{title:"缓存命中",value:b.value.totalHits,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:a(()=>[o(m(At))]),_:1},8,["value"]),y("div",Gt,"省 "+i(S(b.value.totalTokensSaved))+" tokens",1)]),_:1})]),_:1})]),_:1}),o(St,{activeKey:Y.value,"onUpdate:activeKey":l[1]||(l[1]=r=>Y.value=r),class:"tokens-tabs"},{default:a(()=>[o(H,{key:"breakdown",tab:"模型成本"},{default:a(()=>[o(Q,{columns:it,"data-source":w.value,pagination:{pageSize:20,showTotal:r=>`共 ${r} 个模型`},size:"small",loading:n.value,style:{background:"var(--bg-card)"}},{bodyCell:a(({column:r,record:c})=>[r.key==="provider"?(d(),M(E,{key:0,color:W(c.provider),style:{"font-family":"monospace"}},{default:a(()=>[T(i(c.provider),1)]),_:2},1032,["color"])):_("",!0),r.key==="model"?(d(),v("span",Kt,i(c.model),1)):_("",!0),r.key==="calls"?(d(),v("span",Yt,i(S(c.calls)),1)):_("",!0),r.key==="totalTokens"?(d(),v(O,{key:3},[y("span",qt,i(S(c.totalTokens)),1),y("div",Wt,i(S(c.inputTokens))+" 入 / "+i(S(c.outputTokens))+" 出 ",1)],64)):_("",!0),r.key==="costUsd"?(d(),v(O,{key:4},[y("span",Zt,i(m(P)(c.costUsd)),1),o($,{percent:ft(c.costUsd),"show-info":!1,"stroke-color":"#faad14",size:"small",style:{"margin-top":"2px"}},null,8,["percent"])],64)):_("",!0),r.key==="avgCost"?(d(),v("span",Qt,i(c.calls>0?m(P)(c.costUsd/c.calls):"—"),1)):_("",!0)]),emptyText:a(()=>[y("div",Xt,[o(m(tt),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),l[5]||(l[5]=T(" 暂无用量数据 ",-1))])]),_:1},8,["data-source","pagination","loading"])]),_:1}),o(H,{key:"recent",tab:"最近调用"},{default:a(()=>[o(Q,{columns:ut,"data-source":K.value,pagination:{pageSize:20,showTotal:r=>`共 ${r} 条`},size:"small",loading:n.value,style:{background:"var(--bg-card)"}},{bodyCell:a(({column:r,record:c})=>[r.key==="createdAt"?(d(),v("span",te,i(m(wt)(c.createdAt)),1)):_("",!0),r.key==="provider"?(d(),M(E,{key:1,color:W(c.provider),style:{"font-family":"monospace"}},{default:a(()=>[T(i(c.provider),1)]),_:2},1032,["color"])):_("",!0),r.key==="model"?(d(),v("span",ee,i(c.model),1)):_("",!0),r.key==="tokens"?(d(),v(O,{key:3},[y("span",oe,i(S(c.totalTokens)),1),y("div",se,i(S(c.inputTokens))+" / "+i(S(c.outputTokens)),1)],64)):_("",!0),r.key==="costUsd"?(d(),v("span",ae,i(m(P)(c.costUsd)),1)):_("",!0),r.key==="responseTimeMs"?(d(),M(E,{key:5,color:pt(c.responseTimeMs)},{default:a(()=>[T(i(c.responseTimeMs)+"ms",1)]),_:2},1032,["color"])):_("",!0),r.key==="endpoint"?(d(),v(O,{key:6},[c.endpoint?(d(),v("span",ne,i(c.endpoint),1)):(d(),v("span",re,"—"))],64)):_("",!0)]),emptyText:a(()=>[y("div",le,[o(m(et),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),l[6]||(l[6]=T(" 暂无调用记录 ",-1))])]),_:1},8,["data-source","pagination","loading"])]),_:1}),o(H,{key:"cache",tab:"响应缓存"},{default:a(()=>[o(F,{gutter:[16,16],style:{"margin-bottom":"16px"}},{default:a(()=>[o(x,{xs:12,sm:6},{default:a(()=>[o(g,{size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(z,{title:"缓存条目",value:b.value.totalEntries,"value-style":{color:"#1677ff",fontSize:"18px"}},null,8,["value"])]),_:1})]),_:1}),o(x,{xs:12,sm:6},{default:a(()=>[o(g,{size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(z,{title:"命中次数",value:b.value.totalHits,"value-style":{color:"#52c41a",fontSize:"18px"}},null,8,["value"])]),_:1})]),_:1}),o(x,{xs:12,sm:6},{default:a(()=>[o(g,{size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(z,{title:"节省 Tokens",value:b.value.totalTokensSaved,"value-style":{color:"#13c2c2",fontSize:"18px"}},null,8,["value"])]),_:1})]),_:1}),o(x,{xs:12,sm:6},{default:a(()=>[o(g,{size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(z,{title:"过期条目",value:b.value.expiredEntries,"value-style":{color:b.value.expiredEntries>0?"#faad14":"#888",fontSize:"18px"}},null,8,["value","value-style"])]),_:1})]),_:1})]),_:1}),o(g,{title:"缓存维护",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(C,null,{default:a(()=>[o(X,{title:"移除所有过期缓存?","ok-text":"清理","cancel-text":"取消",onConfirm:xt},{default:a(()=>[o(h,{disabled:b.value.expiredEntries===0},{icon:a(()=>[o(m(ot))]),default:a(()=>[T(" 清理过期条目 ("+i(b.value.expiredEntries)+") ",1)]),_:1},8,["disabled"])]),_:1}),o(X,{title:"清空整个响应缓存?此操作不可撤销。","ok-text":"清空","ok-type":"danger","cancel-text":"取消",onConfirm:Tt},{default:a(()=>[o(h,{danger:"",disabled:b.value.totalEntries===0},{icon:a(()=>[o(m(ot))]),default:a(()=>[l[7]||(l[7]=T(" 清空全部缓存 ",-1))]),_:1},8,["disabled"])]),_:1})]),_:1})]),_:1}),o(g,{title:"V2 预算治理",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-top":"16px"}},{default:a(()=>[o(F,{gutter:[16,16]},{default:a(()=>[o(x,{xs:24,lg:12},{default:a(()=>[l[8]||(l[8]=y("h5",{style:{"font-size":"12px",color:"var(--text-secondary)",margin:"0 0 8px"}},"预算 (Budgets V2)",-1)),(d(!0),v(O,null,J(m(rt),r=>(d(),v("div",{key:r,class:"bd-row"},[o(E,{color:vt(r),style:{"min-width":"80px","text-align":"center"}},{default:a(()=>[T(i(yt(r)),1)]),_:2},1032,["color"]),o($,{percent:Z(R.value.budgetsByStatus[r]||0,R.value.totalBudgetsV2),"stroke-color":mt(r),format:()=>`${R.value.budgetsByStatus[r]||0}`,size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128))]),_:1}),o(x,{xs:24,lg:12},{default:a(()=>[l[9]||(l[9]=y("h5",{style:{"font-size":"12px",color:"var(--text-secondary)",margin:"0 0 8px"}},"使用记录 (Records V2)",-1)),(d(!0),v(O,null,J(m(lt),r=>(d(),v("div",{key:r,class:"bd-row"},[o(E,{color:_t(r),style:{"min-width":"80px","text-align":"center"}},{default:a(()=>[T(i(kt(r)),1)]),_:2},1032,["color"]),o($,{percent:Z(R.value.recordsByStatus[r]||0,R.value.totalRecordsV2),"stroke-color":gt(r),format:()=>`${R.value.recordsByStatus[r]||0}`,size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128))]),_:1})]),_:1})]),_:1})]),_:1})]),_:1},8,["activeKey"])])}}},xe=Ct(ie,[["__scopeId","data-v-9ff78be5"]]);export{xe as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.page-title[data-v-9ff78be5]{margin:0;color:var(--text-primary);font-size:22px;font-weight:600}.page-sub[data-v-9ff78be5]{margin:4px 0 0;color:var(--text-secondary);font-size:13px}.tokens-tabs[data-v-9ff78be5] .ant-tabs-nav{margin-bottom:16px}.stat-sub[data-v-9ff78be5]{margin-top:4px;color:var(--text-muted);font-size:11px}.bd-row[data-v-9ff78be5]{display:flex;align-items:center;margin-bottom:8px}
|