zentao-api 0.5.3 → 0.5.4

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.
@@ -1,2 +1,2 @@
1
- (()=>{var{defineProperty:wB,getOwnPropertyNames:CD,getOwnPropertyDescriptor:XD}=Object,$D=Object.prototype.hasOwnProperty;function wD(B){return this[B]}var JD=(B)=>{var D=(EB??=new WeakMap).get(B),W;if(D)return D;if(D=wB({},"__esModule",{value:!0}),B&&typeof B==="object"||typeof B==="function"){for(var R of CD(B))if(!$D.call(D,R))wB(D,R,{get:wD.bind(B,R),enumerable:!(W=XD(B,R))||W.enumerable})}return EB.set(B,D),D},EB;var VD=(B)=>B;function YD(B,D){this[B]=VD.bind(null,D)}var MB=(B,D)=>{for(var W in D)wB(B,W,{get:D[W],enumerable:!0,configurable:!0,set:YD.bind(D,W)})};var $W={};MB($W,{switchProfile:()=>t,sortData:()=>b,setGlobalOptions:()=>h,searchData:()=>N,request:()=>XB,processData:()=>j,pickFieldsSingle:()=>M,pickFields:()=>y,getProfileKey:()=>K,getProfile:()=>KB,getObjectProps:()=>QB,getModuleNames:()=>RB,getModuleActionParams:()=>x,getModuleAction:()=>T,getModule:()=>P,getGlobalOptions:()=>O,getAllProfiles:()=>gB,filterData:()=>r,extendModuleAction:()=>U,exportRegistry:()=>CB,deleteProfile:()=>TB,defineModules:()=>DB,defineModuleActions:()=>WB,addProfile:()=>m,ZentaoError:()=>$,ZentaoClient:()=>z,ZENTAO_PROFILES_STORAGE_KEY:()=>v,VERSION:()=>PB,ERRORS:()=>p,BUILD:()=>_B});var $B={};MB($B,{switchProfile:()=>t,sortData:()=>b,setGlobalOptions:()=>h,searchData:()=>N,request:()=>XB,processData:()=>j,pickFieldsSingle:()=>M,pickFields:()=>y,getProfileKey:()=>K,getProfile:()=>KB,getObjectProps:()=>QB,getModuleNames:()=>RB,getModuleActionParams:()=>x,getModuleAction:()=>T,getModule:()=>P,getGlobalOptions:()=>O,getAllProfiles:()=>gB,filterData:()=>r,extendModuleAction:()=>U,exportRegistry:()=>CB,deleteProfile:()=>TB,defineModules:()=>DB,defineModuleActions:()=>WB,addProfile:()=>m,ZentaoError:()=>$,ZentaoClient:()=>z,ZENTAO_PROFILES_STORAGE_KEY:()=>v,VERSION:()=>PB,ERRORS:()=>p,BUILD:()=>_B});var p={E_INVALID_BASE_URL:"Invalid ZenTao baseUrl.",E_NO_GLOBAL_CLIENT:"No global client configured. Call ZentaoClient.init() or pass options.client.",E_HTTP_ERROR:"HTTP request failed: {status} {statusText}",E_NETWORK_ERROR:"Network request failed: {message}",E_TIMEOUT:"Request timed out.",E_INSECURE_BROWSER:"The insecure option is only supported in Node.js runtimes.",E_LOGIN_FAILED:"ZenTao login failed.",E_INVALID_PROFILE:"Invalid ZenTao profile.",E_NO_PROFILE:"No ZenTao profile is configured.",E_PROFILE_NOT_FOUND:"ZenTao profile not found: {profileKey}",E_PROFILE_STORAGE_INVALID:"ZenTao profile storage is not valid JSON.",E_PROFILE_STORAGE_UNAVAILABLE:"ZenTao profile storage is unavailable in this runtime.",E_INVALID_MODULE:"Unknown module: {module}",E_INVALID_ACTION:"Unknown action: {module}-{action}",E_INVALID_MODULE_DEFINITION:"Invalid module definition.",E_INVALID_ACTION_DEFINITION:"Invalid module action definition.",E_INDETERMINATE_ACTION_METHOD:'Cannot infer HTTP method for action "{action}" from type "{type}"; specify "method" explicitly.',E_INDETERMINATE_ACTION_RESULT_TYPE:'Cannot infer result type for action "{action}" from type "{type}"; specify "resultType" explicitly.',E_MISSING_PARAM:"Missing required parameter: {param}",E_INVALID_PARAM:"Invalid value for parameter {param}: {value}",E_INVALID_REQUEST_NAME:'Request name must use the form "moduleName", "moduleName/methodName", or "moduleName/<objectID>".',E_API_FAILED:"ZenTao API returned failure: {message}"};class $ extends Error{code;details;constructor(B,D,W){let R=p[B];if(D)for(let[Q,C]of Object.entries(D))R=R.replaceAll(`{${Q}}`,String(C));super(R);this.name="ZentaoError",this.code=B,this.details=W}}function s(){return typeof process<"u"&&Boolean(process.versions?.node)}function kB(B){return import(B)}function HD(B){let D={};return new Headers(B).forEach((W,R)=>{D[R]=W}),D}function GD(B){let D=new Headers;for(let[W,R]of Object.entries(B)){if(R===void 0)continue;D.set(W,Array.isArray(R)?R.join(", "):String(R))}return D}function JB(B,D){let W=D.toLowerCase();return Object.keys(B).some((R)=>R.toLowerCase()===W)}async function LD(B,D){if(B===void 0||B===null)return;if(typeof B==="string")return B;if(B instanceof Uint8Array)return B;if(B instanceof ArrayBuffer)return new Uint8Array(B);if(ArrayBuffer.isView(B))return new Uint8Array(B.buffer,B.byteOffset,B.byteLength);if(B instanceof Blob){if(B.type&&!JB(D,"content-type"))D["content-type"]=B.type;return new Uint8Array(await B.arrayBuffer())}if(typeof FormData<"u"&&B instanceof FormData){let W=new Request("https://zentao-api.local/",{method:"POST",body:B}),R=W.headers.get("content-type");if(R&&!JB(D,"content-type"))D["content-type"]=R;return new Uint8Array(await W.arrayBuffer())}if(typeof URLSearchParams<"u"&&B instanceof URLSearchParams){if(!JB(D,"content-type"))D["content-type"]="application/x-www-form-urlencoded;charset=UTF-8";return B.toString()}return String(B)}function xB(){return new DOMException("The operation was aborted.","AbortError")}function qD(B){let D=B.reduce((Q,C)=>Q+C.byteLength,0),W=new Uint8Array(D),R=0;for(let Q of B)W.set(Q,R),R+=Q.byteLength;return W.buffer}async function AD(B,D,W){let R=new URL(B),Q=R.protocol==="https:"?await kB("node:https"):await kB("node:http"),C=HD(D.headers),X=await LD(D.body,C);return new Promise((w,J)=>{if(D.signal?.aborted){J(xB());return}let V=Q.request(R,{method:D.method??"GET",headers:C,rejectUnauthorized:W},(A)=>{let g=[];A.on("data",(I)=>{g.push(typeof I==="string"?new TextEncoder().encode(I):I)}),A.on("end",()=>{H();let I=g.length>0?qD(g):void 0,i=new Response(I,{status:A.statusCode??200,statusText:A.statusMessage??"",headers:GD(A.headers)});Object.defineProperty(i,"url",{value:B}),w(i)})}),H=()=>{D.signal?.removeEventListener("abort",Y)},Y=()=>{H(),V.destroy(xB())};if(V.on("error",(A)=>{H(),J(A)}),D.signal?.addEventListener("abort",Y,{once:!0}),X!==void 0)V.write(X);V.end()})}function VB(B){if(B&&!s())throw new $("E_INSECURE_BROWSER")}async function hB(B,D,W){if(!B)return fetch(D,W);return VB(B),AD(D,W,!1)}var YB={};function O(){return{...YB}}function h(B){YB={...YB,...B}}function G(B){return Boolean(B)&&typeof B==="object"&&!Array.isArray(B)}function Z(B){return B===void 0||B===null||B===""}function L(B,D){let W=D.split("."),R=B;for(let Q of W){if(R===null||R===void 0||typeof R!=="object")return;R=R[Q]}return R}function S(B){return Array.isArray(B)?B:[B]}function E(B){let D=B.trim().replace(/\/+$/,"");if(!D)throw new $("E_INVALID_BASE_URL");let W=D.replace(/\/api\.php\/v2$/i,""),R;try{R=new URL(W)}catch{throw new $("E_INVALID_BASE_URL")}if(!["http:","https:"].includes(R.protocol)||R.search||R.hash)throw new $("E_INVALID_BASE_URL");return R.toString().replace(/\/+$/,"")}function M(B,D){let W={};for(let R of D){let Q=L(B,R);if(Q===void 0)continue;let C=R.split("."),X=W;for(let w=0;w<C.length-1;w++){let J=C[w];if(!G(X[J]))X[J]={};X=X[J]}X[C[C.length-1]]=Q}return W}function y(B,D){return B.map((W)=>M(W,D))}function f(B,D){let W=Number(B),R=Number(D);if(B!==""&&D!==""&&!Number.isNaN(W)&&!Number.isNaN(R))return W-R;return String(B).localeCompare(String(D))}function fB(B,D){let W=Number(B),R=Number(D);if(B!==""&&D!==""&&!Number.isNaN(W)&&!Number.isNaN(R))return W===R;return String(B)===String(D)}function yB(B,D){if(B===void 0||B===null)return!1;let W=String(B).toLowerCase();return S(D).some((R)=>W.includes(String(R).toLowerCase()))}function NB(B,D){let W=L(B,D.key),{operator:R,value:Q}=D;switch(R){case"=":return S(Q).some((C)=>fB(W,C));case"!=":return S(Q).every((C)=>!fB(W,C));case"~":return yB(W,Q);case"!~":return!yB(W,Q);case">":return f(W,Q)>0;case"<":return f(W,Q)<0;case">=":return f(W,Q)>=0;case"<=":return f(W,Q)<=0;default:return!1}}function bB(B,D){if(D.conditions.length===0)return!0;return D.operator==="OR"?D.conditions.some((W)=>NB(B,W)):D.conditions.every((W)=>NB(B,W))}function r(B,D){if(D.length===0)return B.slice();return B.filter((W)=>D.every((R)=>bB(W,R)))}function GB(B){let D=[],W="",R,Q=0,C=!1;for(let X of B){if(C){W+=X,C=!1;continue}if(R){if(W+=X,X==="\\")C=!0;else if(X===R)R=void 0;continue}if(X==='"'||X==="'"){R=X,W+=X;continue}if(X==="[")Q+=1;else if(X==="]"&&Q>0)Q-=1;if(X===","&&Q===0)D.push(W.trim()),W="";else W+=X}return D.push(W.trim()),D.filter(Boolean)}function HB(B){let D=B.trim(),W=D[0];return D.length>=2&&(W==='"'||W==="'")&&D.at(-1)===W?D.slice(1,-1):D}function l(B,D){if(B===null||B===void 0)return;if(Array.isArray(B))for(let W of B)l(W,D);else if(G(B))for(let W of Object.values(B))l(W,D);else D.push(String(B))}function UD(B,D){let W=[];if(D&&D.length>0)for(let R of D)l(L(B,R),W);else l(B,W);return W.join("\x00").toLowerCase()}function N(B,D,W){let R=D.map((Q)=>GB(Q).map((C)=>HB(C).toLowerCase()).filter(Boolean)).filter((Q)=>Q.length>0);if(R.length===0)return B.slice();return B.filter((Q)=>{let C=UD(Q,W);return R.some((X)=>X.every((w)=>C.includes(w)))})}function gD(B){if(typeof B==="function")return B;let D=B.match(/^(.+):(asc|desc)$/i)??B.match(/^(.+)_(asc|desc)$/i),W=D?.[1]??B,Q=(D?.[2].toLowerCase()??"asc")==="desc"?-1:1;return(C,X)=>f(L(C,W),L(X,W))*Q}function b(B,D){let W=D.map(gD);return B.slice().sort((R,Q)=>{for(let C of W){let X=C(R,Q);if(X!==0)return X}return 0})}var KD=[">=","<=","!=","!~","=","~",">","<",":"];function TD(B){let D=B.trim();if(D.startsWith("[")&&D.endsWith("]"))return GB(D.slice(1,-1)).map(HB).filter(Boolean);let W=HB(D);if(W==="true")return!0;if(W==="false")return!1;if(W!==""&&!Number.isNaN(Number(W)))return Number(W);return W}function ID(B){let D,W=0,R=!1;for(let Q=0;Q<B.length;Q+=1){let C=B[Q];if(R){R=!1;continue}if(D){if(C==="\\")R=!0;else if(C===D)D=void 0;continue}if(C==='"'||C==="'"){D=C;continue}if(C==="["){W+=1;continue}if(C==="]"&&W>0){W-=1;continue}if(W>0)continue;let X=KD.find((w)=>B.startsWith(w,Q));if(X&&Q>0)return{index:Q,operator:X}}return}function OD(B){let D=ID(B);if(!D)return;let W=B.slice(0,D.index).trim();if(!W)return;return{key:W,operator:D.operator===":"?"=":D.operator,value:TD(B.slice(D.index+D.operator.length))}}function SD(B){let D=GB(B);if(D.length===0)return;let W=D.map(OD);if(W.some((R)=>R===void 0))return;return{operator:"AND",conditions:W}}function jD(B){if(B===void 0||B==="")return;let D=Number(B);if(!Number.isFinite(D)||D<0)return;return Math.floor(D)}function j(B,D){if(!Array.isArray(B)){let C=D,X=C.convert?C.convert(B):B;return C.pick?M(X,C.pick):{...X}}let W=D,R=W.convert?W.convert(B):B;if(W.filter&&W.filter.length>0){let C=W.filter.map(SD).filter((X)=>X!==void 0);if(C.length>0)R=R.filter((X)=>C.some((w)=>bB(X,w)))}if(W.search&&W.search.length>0)R=N(R,W.search,W.searchFields);if(W.sort){let C=W.sort.split(",").map((X)=>X.trim()).filter(Boolean);if(C.length>0)R=b(R,C)}let Q=jD(W.limit);if(Q!==void 0)R=R.slice(0,Q);if(W.pick)R=y(R,W.pick);return R}var v="ZENTAO_PROFILES",zD=[".config","zentao","zentao.json"];function cB(B){return Boolean(B)&&typeof B==="object"&&!Array.isArray(B)}function mB(B){if(B===void 0)return B;return JSON.parse(JSON.stringify(B))}function tB(){return new Date().toISOString()}function d(B){return import(B)}var dB=Promise.resolve();function LB(B){let D=dB.then(B,B);return dB=D.catch(()=>{return}),D}function uB(){try{return globalThis.localStorage}catch{return}}async function iB(){let B=await d("node:path"),D=process.env.HOME??process.env.USERPROFILE??(await d("node:os")).homedir();if(!D)throw new $("E_PROFILE_STORAGE_UNAVAILABLE");return B.join(D,...zD)}function FD(B,D){let W=B.trim(),R=E(D);if(!W)throw new $("E_INVALID_PROFILE");return`${W}@${R}`}function qB(B){if(!cB(B)||typeof B.server!=="string"||typeof B.account!=="string"||typeof B.token!=="string")throw new $("E_INVALID_PROFILE");let D=B.token.trim();if(!D)throw new $("E_INVALID_PROFILE");let W=mB(B);return delete W.key,{...W,server:E(B.server),account:B.account.trim(),token:D}}function nB(B){if(!cB(B))return{profiles:[]};let D=Array.isArray(B.profiles)?B.profiles.flatMap((R)=>{try{return[qB(R)]}catch{return[]}}):[],W=typeof B.currentProfile==="string"?B.currentProfile:void 0;return W?{currentProfile:W,profiles:D}:{profiles:D}}function vB(B){try{return nB(JSON.parse(B))}catch(D){throw new $("E_PROFILE_STORAGE_INVALID",void 0,D)}}async function c(){if(s()){let W=await d("node:fs/promises"),R=await iB();try{return vB(await W.readFile(R,"utf8"))}catch(Q){if(Q.code==="ENOENT")return{profiles:[]};throw Q}}let B=uB();if(!B)throw new $("E_PROFILE_STORAGE_UNAVAILABLE");let D=B.getItem(v);return D?vB(D):{profiles:[]}}async function AB(B){let D=nB(B),W=`${JSON.stringify(D,null,2)}
2
- `;if(s()){let Q=await d("node:fs/promises"),C=await d("node:path"),X=await iB(),w=C.dirname(X),J=C.join(w,`.zentao.${Date.now()}.${Math.random().toString(36).slice(2)}.tmp`);await Q.mkdir(w,{recursive:!0,mode:448}),await Q.chmod(w,448).catch(()=>{return});try{await Q.writeFile(J,W,{encoding:"utf8",mode:384}),await Q.rename(J,X),await Q.chmod(X,384).catch(()=>{return})}catch(V){throw await Q.rm(J,{force:!0}).catch(()=>{return}),V}return}let R=uB();if(!R)throw new $("E_PROFILE_STORAGE_UNAVAILABLE");R.setItem(v,W)}function a(B){let D=qB(B);return{...mB(D),key:K(D)}}function UB(B,D){return B.profiles.find((W)=>K(W)===D)}function _D(B){if(!B.currentProfile||!UB(B,B.currentProfile)){let D=B.profiles.at(-1);B.currentProfile=D?K(D):void 0}}function K(B){return FD(B.account,B.server)}async function gB(){return(await c()).profiles.map(a)}async function KB(B){let D=await c(),W=B??D.currentProfile;if(!W)return;let R=UB(D,W);return R?a(R):void 0}function m(B){return LB(async()=>{let D=await c(),W=tB(),R=qB({...B,loginTime:B.loginTime??W,lastUsedTime:B.lastUsedTime??W}),Q=K(R),C=D.profiles.findIndex((X)=>K(X)===Q);if(C>=0)D.profiles[C]=R;else D.profiles.push(R);return D.currentProfile=Q,await AB(D),a(R)})}function TB(B){return LB(async()=>{let D=await c(),W=D.profiles.filter((R)=>K(R)!==B);if(W.length===D.profiles.length)return!1;return D.profiles=W,_D(D),await AB(D),!0})}function t(B){return LB(async()=>{let D=await c(),W=B??D.currentProfile;if(!W)throw new $("E_NO_PROFILE");let R=UB(D,W);if(!R)throw new $("E_PROFILE_NOT_FOUND",{profileKey:W});return R.lastUsedTime=tB(),D.currentProfile=W,await AB(D),a(R)})}var PD=1e4;function ZD(B,D,W){let R=D.startsWith("/")?D:`/${D}`,Q=new URL(`${B}${R}`);for(let[C,X]of Object.entries(W??{})){if(X===void 0)continue;Q.searchParams.set(C,String(X))}return Q.toString()}function ED(B){if(!B||typeof B!=="object")return!1;let D=Object.getPrototypeOf(B);return D===Object.prototype||D===null}function o(B,D){let W=globalThis[D];return typeof W==="function"&&B instanceof W}function MD(B){return B instanceof ArrayBuffer||ArrayBuffer.isView(B)}function pB(B,D,W){if(W===void 0)return;if(Array.isArray(W)){for(let R of W)pB(B,D,R);return}B.append(D,W===null?"":String(W))}function kD(B,D,W){if(B===void 0||B===null)return;if(D==="form"){let R=B instanceof URLSearchParams?B:new URLSearchParams;if(!(B instanceof URLSearchParams)&&ED(B))for(let[Q,C]of Object.entries(B))pB(R,Q,C);else if(!(B instanceof URLSearchParams))throw new $("E_INVALID_PARAM",{param:"body",value:String(B)});if(!W.has("Content-Type"))W.set("Content-Type","application/x-www-form-urlencoded;charset=UTF-8");return R}if(D==="raw"||typeof B==="string"||MD(B)||o(B,"FormData")||o(B,"URLSearchParams")||o(B,"Blob")||o(B,"ReadableStream"))return B;if(!W.has("Content-Type"))W.set("Content-Type","application/json");return JSON.stringify(B)}function xD(B,D){let W=new AbortController,R=()=>W.abort(D?.reason),Q=setTimeout(()=>W.abort(),B);if(D?.aborted)R();else D?.addEventListener("abort",R,{once:!0});return{signal:W.signal,cleanup:()=>{clearTimeout(Q),D?.removeEventListener("abort",R)}}}async function hD(B,D="auto"){if(D==="response")return B;if(D==="arrayBuffer")return B.arrayBuffer();if(D==="blob")return B.blob();if(D==="text")return B.text();if(D==="json"){let R=await B.text();return R===""?void 0:JSON.parse(R)}let W=await B.text();if(W==="")return;try{return JSON.parse(W)}catch{return W}}class z{siteUrl;baseUrl;token;timeout;insecure;constructor(B){let D=typeof B==="string"?{baseUrl:B}:B;this.siteUrl=E(D.baseUrl),this.baseUrl=`${this.siteUrl}/api.php/v2`,this.token=D.token,this.timeout=D.timeout,this.insecure=D.insecure}async request(B,D={}){let W=O(),R=D.method??"GET",Q=D.timeout??W.timeout??this.timeout??PD,C=D.insecure??W.insecure??this.insecure;VB(C);let X=ZD(this.baseUrl,B,D.query),w=new Headers(D.headers);if(this.token)w.set("Token",this.token);let{signal:J,cleanup:V}=xD(Q,D.signal),H={method:R,headers:w,signal:J};if(D.body!==void 0&&R!=="GET")H.body=kD(D.body,D.bodyType,w);try{let Y=await hB(C,X,H);if(!Y.ok)throw new $("E_HTTP_ERROR",{status:Y.status,statusText:Y.statusText},{url:Y.url,status:Y.status,statusText:Y.statusText,body:await Y.text().catch(()=>{return})});return hD(Y,D.responseType)}catch(Y){if(Y instanceof $)throw Y;if(Y instanceof DOMException&&Y.name==="AbortError")throw new $("E_TIMEOUT");throw new $("E_NETWORK_ERROR",{message:Y.message??String(Y)},Y)}finally{V()}}async get(B,D={}){return this.request(B,{...D,method:"GET"})}async post(B,D,W={}){return this.request(B,{...W,method:"POST",body:D})}async put(B,D,W={}){return this.request(B,{...W,method:"PUT",body:D})}async delete(B,D={}){return this.request(B,{...D,method:"DELETE"})}async login(B,D){let W=await this.post("/users/login",{account:B,password:D});if(W.status!=="success"||!W.token)throw new $("E_LOGIN_FAILED");this.token=W.token;let R=O();if(R.persistProfiles){let Q={},C=this.timeout??R.timeout,X=this.insecure??R.insecure;if(C!==void 0)Q.timeout=C;if(X!==void 0)Q.insecure=X;await m({server:this.siteUrl,account:B,token:W.token,user:G(W.user)?W.user:void 0,serverConfig:G(W.serverConfig)?W.serverConfig:void 0,config:Object.keys(Q).length>0?Q:void 0})}return W.token}static create(B){return new z(B)}static init(B){let D=new z(B);return h({client:D}),D}static async fromProfile(B){let D=await t(B);return new z({baseUrl:D.server,token:D.token,timeout:typeof D.config?.timeout==="number"?D.config.timeout:void 0,insecure:typeof D.config?.insecure==="boolean"?D.config.insecure:void 0})}}var sB=[{name:"user",display:"用户",description:"用户管理,支持获取用户列表、创建用户、获取用户详情、修改用户信息、删除用户",actions:[{name:"list",display:"获取用户列表",type:"list",method:"get",path:"/users",resultType:"list",pagerGetter:"pager",resultGetter:"users",params:[{name:"browseType",required:!1,type:"string",description:"浏览类型",options:[{value:"inside",label:"内部用户"},{value:"outside",label:"内部用户"}]},{name:"orderBy",required:!1,type:"string",description:"排序",options:[{value:"id_asc",label:"ID 升序"},{value:"id_desc",label:"ID 降序"},{value:"realname_asc",label:"姓名 升序"},{value:"realname_desc",label:"姓名 降序"},{value:"account_asc",label:"用户名 升序"},{value:"account_desc",label:"用户名 降序"}]},{name:"recPerPage",required:!1,type:"number",description:"每页数量,不超过1000"},{name:"pageID",required:!1,type:"number",description:"页码,从第1页开始"}]},{name:"create",display:"创建用户",type:"create",method:"post",path:"/users",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{account:{type:"string",description:"登录名"},realname:{type:"string",description:"姓名"},password:{type:"string",description:"密码"}},required:["account","realname","password"]}}},{name:"get",display:"获取用户详情",type:"get",method:"get",path:"/users/{userID}",resultType:"object",resultGetter:"user",pathParams:{userID:"用户ID"}},{name:"update",display:"修改用户信息",type:"update",method:"put",path:"/users/{userID}",resultType:"object",pathParams:{userID:"用户ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{realname:{type:"string",description:"真实姓名"},dept:{type:"integer",description:"部门",format:"int32"},join:{type:"string",description:"入职日期"},group:{type:"array",items:{type:"string"},description:"权限分组"},email:{type:"string",description:"邮箱"},visions:{type:"array",items:{type:"string"},description:"界面类型(研发综合界面 rnd | 运营管理界面 lite)"},mobile:{type:"string",description:"手机"},weixin:{type:"string",description:"微信"},password:{type:"string",description:"密码"}}}}},{name:"delete",display:"删除用户",type:"delete",method:"delete",path:"/users/{userID}",resultType:"text",pathParams:{userID:"用户ID"}}]},{name:"program",display:"项目集",description:"项目集管理,支持获取项目集列表、创建项目集、获取项目集详情、修改项目集、删除项目集",actions:[{name:"list",display:"获取项目集列表",type:"list",method:"get",path:"/programs",resultType:"list",pagerGetter:"pager",resultGetter:"programs",params:[{name:"status",required:!1,type:"string",description:"状态",options:[{value:"all",label:"全部"},{value:"unclosed",label:"未关闭"},{value:"wait",label:"未开始"},{value:"doing",label:"进行中"},{value:"suspended",label:"已挂起"},{value:"delayed",label:"已延期"},{value:"closed",label:"已关闭"}]},{name:"orderBy",required:!1,type:"string",description:"排序",options:[{value:"id_asc",label:"ID 升序"},{value:"id_desc",label:"ID 降序"},{value:"name_asc",label:"名称 升序"},{value:"name_desc",label:"名称 降序"},{value:"begin_asc",label:"计划开始 升序"},{value:"begin_desc",label:"计划开始 降序"},{value:"end_asc",label:"计划结束 升序"},{value:"end_desc",label:"计划结束 降序"}]},{name:"recPerPage",required:!1,type:"number",description:"每页数量,不超过1000"},{name:"pageID",required:!1,type:"number",description:"页码,从第1页开始"}]},{name:"create",display:"创建项目集",type:"create",method:"post",path:"/programs",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{name:{type:"string",description:"项目集名称"},begin:{type:"string",description:"计划开始日期"},end:{type:"string",description:"计划完成日期"},PM:{type:"string",description:"计划完成日期"},desc:{type:"string",description:"项目集描述"}},required:["name","begin","end"]}}},{name:"get",display:"获取项目集详情",type:"get",method:"get",path:"/programs/{programID}",resultType:"object",resultGetter:"program",pathParams:{programID:"项目集ID"}},{name:"update",display:"修改项目集",type:"update",method:"put",path:"/programs/{programID}",resultType:"object",pathParams:{programID:"项目集ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{name:{type:"string",description:"项目集名称"},begin:{type:"string",description:"计划开始日期"},end:{type:"string",description:"计划完成日期"},PM:{type:"string",description:"计划完成日期"},desc:{type:"string",description:"项目集描述"}},required:["name","begin","end"]}}},{name:"delete",display:"删除项目集",type:"delete",method:"delete",path:"/programs/{programID}",resultType:"text",pathParams:{programID:"项目集ID"}}]},{name:"product",display:"产品",description:"产品管理,支持获取产品列表、创建产品、获取产品详情、修改产品、删除产品",actions:[{name:"list",display:"获取产品列表",type:"list",method:"get",path:"/products",resultType:"list",pagerGetter:"pager",resultGetter:"products",params:[{name:"browseType",required:!1,type:"string",description:"浏览类型",options:[{value:"all",label:"全部"},{value:"noclosed",label:"未关闭"},{value:"closed",label:"已结束"}]},{name:"orderBy",required:!1,type:"string",description:"排序",options:[{value:"id_asc",label:"ID 升序"},{value:"id_desc",label:"ID 降序"},{value:"title_asc",label:"名称 升序"},{value:"title_desc",label:"名称 降序"},{value:"begin_asc",label:"计划开始 升序"},{value:"begin_desc",label:"计划开始 降序"},{value:"end_asc",label:"计划结束 升序"},{value:"end_desc",label:"计划结束 降序"}]},{name:"recPerPage",required:!1,type:"number",description:"每页数量,不超过1000"},{name:"pageID",required:!1,type:"number",description:"页码,从第1页开始"}]},{name:"create",display:"创建产品",type:"create",method:"post",path:"/products",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{name:{type:"string",description:"产品名称"},program:{type:"integer",description:"所属项目集",format:"int32"},line:{type:"integer",description:"所属产品线",format:"int32"},type:{type:"string",description:"类型(normal 正常 | branch 多分支 | platform 多平台)"},PO:{type:"string",description:"产品负责人"},reviewer:{type:"array",items:{type:"string"},description:"评审人"},desc:{type:"array",items:{type:"string"},description:"产品描述"},QD:{type:"string",description:"测试负责人"},RD:{type:"string",description:"发布负责人"},acl:{type:"string",description:"访问控制(open 公开 | private 私有)"}},required:["name"]}}},{name:"get",display:"获取产品详情",type:"get",method:"get",path:"/products/{productID}",resultType:"object",resultGetter:"product",pathParams:{productID:"产品ID"}},{name:"update",display:"修改产品",type:"update",method:"put",path:"/products/{productID}",resultType:"object",pathParams:{productID:"产品ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{name:{type:"string",description:"产品名称"},program:{type:"integer",description:"所属项目集",format:"int32"},line:{type:"integer",description:"所属产品线",format:"int32"},type:{type:"string",description:"类型(normal 正常 | branch 多分支 | platform 多平台)"},PO:{type:"string",description:"产品负责人"},reviewer:{type:"array",items:{type:"string"},description:"评审人"},desc:{type:"array",items:{type:"string"},description:"产品描述"},QD:{type:"string",description:"测试负责人"},RD:{type:"string",description:"发布负责人"},acl:{type:"string",description:"访问控制(open 公开 | private 私有)"}},required:["name"]}}},{name:"delete",display:"删除产品",type:"delete",method:"delete",path:"/products/{productID}",resultType:"text",pathParams:{productID:"产品ID"}}]},{name:"project",display:"项目",description:"项目管理,支持获取项目列表、创建项目、修改项目、删除项目",actions:[{name:"list",display:"获取项目列表",type:"list",method:"get",path:"/projects",resultType:"list",pagerGetter:"pager",resultGetter:"projects",params:[{name:"browseType",required:!1,type:"string",description:"项目状态,默认是undone",defaultValue:"undone",options:[{value:"all",label:"全部"},{value:"undone",label:"未完成"},{value:"wait",label:"未开始"},{value:"doing",label:"进行中"}]},{name:"orderBy",required:!1,type:"string",description:"排序",options:[{value:"id_asc",label:"ID 升序"},{value:"id_desc",label:"ID 降序"},{value:"name_asc",label:"名称 升序"},{value:"name_desc",label:"名称 降序"},{value:"begin_asc",label:"计划开始 升序"},{value:"begin_desc",label:"计划开始 降序"},{value:"end_asc",label:"计划结束 升序"},{value:"end_desc",label:"计划结束 降序"}]},{name:"recPerPage",required:!1,type:"number",description:"每页数量,不超过1000"},{name:"pageID",required:!1,type:"number",description:"页码,从第1页开始"}]},{name:"create",display:"创建项目",type:"create",method:"post",path:"/projects",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{name:{type:"string",description:"项目名称"},model:{type:"string",description:"项目管理方式(scrum 敏捷 | waterfall 瀑布 | kanban 看板 | agileplus 融合敏捷 | waterfallplus 融合瀑布)"},begin:{type:"string",description:"开始日期"},end:{type:"string",description:"结束日期"},products:{type:"array",items:{type:"string"},description:"关联产品"},parent:{type:"integer",description:"所属项目集",format:"int32"},workflowGroup:{type:"integer",description:"项目流程,付费版功能,开源版可以不填",format:"int32"},PM:{type:"string",description:"项目负责人"}},required:["name","model","begin","end","workflowGroup"]}}},{name:"update",display:"修改项目",type:"update",method:"put",path:"/projects/{projectID}",resultType:"object",pathParams:{projectID:"项目ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{name:{type:"string",description:"项目名称"},model:{type:"string",description:"项目管理方式(scrum 敏捷 | waterfall 瀑布 | kanban 看板 | agileplus 融合敏捷 | waterfallplus 融合瀑布)"},begin:{type:"string",description:"开始日期"},end:{type:"string",description:"结束日期"},products:{type:"array",items:{type:"string"},description:"关联产品"},parent:{type:"integer",description:"所属项目集",format:"int32"},workflowGroup:{type:"integer",description:"项目流程,付费版功能,开源版可以不填",format:"int32"},PM:{type:"string",description:"项目负责人"}},required:["name","model","begin","end","workflowGroup"]}}},{name:"delete",display:"删除项目",type:"delete",method:"delete",path:"/projects/{projectID}",resultType:"text",pathParams:{projectID:"项目ID"}}]},{name:"execution",display:"执行",description:"执行管理,支持获取执行列表、创建执行、获取执行详情、修改执行、删除执行",actions:[{name:"list",display:"获取执行列表",type:"list",method:"get",path:"/executions",resultType:"list",pagerGetter:"pager",resultGetter:"executions",params:[{name:"status",required:!1,type:"string",description:"执行状态,默认是undone",defaultValue:"undone",options:[{value:"all",label:"全部"},{value:"undone",label:"未完成"},{value:"wait",label:"未开始"},{value:"doing",label:"进行中"}]},{name:"orderBy",required:!1,type:"string",description:"排序",options:[{value:"rawID_asc",label:"RAWID 升序"},{value:"rawID_desc",label:"RAWID 降序"},{value:"nameCol_asc",label:"名称 升序"},{value:"nameCol_desc",label:"名称 降序"},{value:"begin_asc",label:"计划开始 升序"},{value:"begin_desc",label:"计划开始 降序"},{value:"end_asc",label:"计划结束 升序"},{value:"end_desc",label:"计划结束 降序"}]},{name:"recPerPage",required:!1,type:"number",description:"每页数量,不超过1000"},{name:"pageID",required:!1,type:"number",description:"页码,从第1页开始"}]},{name:"create",display:"创建执行",type:"create",method:"post",path:"/executions",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{project:{type:"integer",description:"所属项目",format:"int32"},name:{type:"string",description:"迭代名称"},lifetime:{type:"string",description:"执行类型(short 短期 | long 长期 | ops 运维)"},begin:{type:"string",description:"开始日期"},end:{type:"string",description:"结束日期"},days:{type:"integer",description:"可用工作日",format:"int32"},products:{type:"array",items:{type:"string"},description:"关联产品"},plans:{type:"array",items:{type:"string"},description:"关联计划,必须是产品+planID的二维数组"},PO:{type:"string",description:"产品负责人"},QD:{type:"string",description:"测试负责人"},PM:{type:"string",description:"执行负责人"},RD:{type:"string",description:"发布负责人"},acl:{type:"string",description:"访问控制(open 公开 | private 私有)"}},required:["project","name","begin","end"]}}},{name:"get",display:"获取执行详情",type:"get",method:"get",path:"/executions/{executionID}",resultType:"object",resultGetter:"execution",pathParams:{executionID:"执行ID"}},{name:"update",display:"修改执行",type:"update",method:"put",path:"/executions/{executionID}",resultType:"object",pathParams:{executionID:"执行ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{project:{type:"integer",description:"所属项目",format:"int32"},name:{type:"string",description:"迭代名称"},lifetime:{type:"string",description:"执行类型(short 短期 | long 长期 | ops 运维)"},begin:{type:"string",description:"开始日期"},end:{type:"string",description:"结束日期"},days:{type:"integer",description:"可用工作日",format:"int32"},products:{type:"array",items:{type:"string"},description:"关联产品"},plans:{type:"array",items:{type:"string"},description:"关联计划,必须是产品+planID的二维数组"},PO:{type:"string",description:"产品负责人"},QD:{type:"string",description:"测试负责人"},PM:{type:"string",description:"执行负责人"},RD:{type:"string",description:"发布负责人"},acl:{type:"string",description:"访问控制(open 公开 | private 私有)"}},required:["name","begin","end"]}}},{name:"delete",display:"删除执行",type:"delete",method:"delete",path:"/executions/{executionID}",resultType:"text",pathParams:{executionID:"执行ID"}}]},{name:"productplan",display:"产品计划",description:"产品计划管理,支持获取产品计划列表,支持获取产品下的产品计划、创建产品计划、获取产品计划详情、修改产品计划、删除产品计划",actions:[{name:"list",display:"获取产品计划列表,支持获取产品下的产品计划",type:"list",method:"get",path:"/products/{productID}/productplans",resultType:"list",pagerGetter:"pager",resultGetter:"productplans",pathParams:{productID:"所属产品ID"},params:[{name:"browseType",required:!1,type:"string",description:"执行状态,默认是undone",defaultValue:"undone",options:[{value:"all",label:"全部"},{value:"undone",label:"未完成"},{value:"wait",label:"未开始"},{value:"doing",label:"进行中"}]},{name:"orderBy",required:!1,type:"string",description:"排序",options:[{value:"id_asc",label:"ID 升序"},{value:"id_desc",label:"ID 降序"},{value:"title_asc",label:"名称 升序"},{value:"title_desc",label:"名称 降序"},{value:"begin_asc",label:"开始日期 升序"},{value:"begin_desc",label:"开始日期 降序"},{value:"end_asc",label:"结束日期 升序"},{value:"end_desc",label:"结束日期 降序"},{value:"status_asc",label:"状态 升序"}]},{name:"recPerPage",required:!1,type:"number",description:"每页数量,不超过1000"},{name:"pageID",required:!1,type:"number",description:"页码,从第1页开始"}]},{name:"create",display:"创建产品计划",type:"create",method:"post",path:"/productplans",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{productID:{type:"integer",description:"产品ID",format:"int32"},title:{type:"string",description:"计划名称"},parent:{type:"integer",description:"父计划ID",format:"int32"},begin:{type:"string",description:"开始日期"},end:{type:"string",description:"结束日期"},branchID:{type:"integer",description:"分支ID",format:"int32"},desc:{type:"string",description:"计划描述"}},required:["productID","title"]}}},{name:"get",display:"获取产品计划详情",type:"get",method:"get",path:"/productplans/{planID}",resultType:"object",resultGetter:"productplan",pathParams:{planID:"产品计划ID"}},{name:"update",display:"修改产品计划",type:"update",method:"put",path:"/productplans/{productplanID}",resultType:"object",pathParams:{productplanID:"产品计划ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{title:{type:"string",description:"计划名称"},parent:{type:"integer",description:"父计划",format:"int32"},begin:{type:"string",description:"开始日期"},end:{type:"string",description:"结束日期"},branchID:{type:"integer",description:"分支ID",format:"int32"},desc:{type:"string",description:"计划描述"}},required:["title"]}}},{name:"delete",display:"删除产品计划",type:"delete",method:"delete",path:"/productplans/{productplanID}",resultType:"text",pathParams:{productplanID:"产品计划ID"}}]},{name:"story",display:"需求",description:"需求管理,支持获取需求列表,支持获取产品/项目/执行下的需求、创建需求、获取需求详情、修改需求、删除需求、激活需求、变更需求、关闭需求",actions:[{name:"list",display:"获取需求列表,支持获取产品/项目/执行下的需求",type:"list",method:"get",path:"/{scope}/{scopeID}/stories",resultType:"list",pagerGetter:"pager",resultGetter:"stories",pathParams:{scope:{description:"需求所属范围",options:[{value:"products",label:"产品"},{value:"projects",label:"项目"},{value:"executions",label:"执行"}]},scopeID:"所属范围ID"},params:[{name:"browseType",required:!1,type:"string",description:"状态,默认是unclosed",defaultValue:"unclosed",options:[{value:"allstory",label:"全部"},{value:"assignedtome",label:"指派给我"},{value:"openedbyme",label:"我创建"},{value:"reviewbyme",label:"待我评审"},{value:"draftstory",label:"草稿"}]},{name:"orderBy",required:!1,type:"string",description:"排序",options:[{value:"id_asc",label:"ID 升序"},{value:"id_desc",label:"ID 降序"},{value:"title_asc",label:"标题 升序"},{value:"title_desc",label:"标题 降序"},{value:"status_asc",label:"状态 升序"},{value:"status_desc",label:"状态 降序"}]},{name:"recPerPage",required:!1,type:"number",description:"每页数量,不超过1000"},{name:"pageID",required:!1,type:"number",description:"页码,从第1页开始"}]},{name:"create",display:"创建需求",type:"create",method:"post",path:"/stories",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{productID:{type:"integer",description:"产品ID",format:"int32"},title:{type:"string"},pri:{type:"integer",description:"优先级,默认是3",format:"int32"},module:{type:"integer",description:"所属模块",format:"int32"},parent:{type:"integer",description:"父需求",format:"int32"},estimate:{type:"number",description:"预计工时",format:"float"},spec:{type:"string",description:"需求描述"},category:{type:"integer",description:"类别(feature 功能 | interface 接口 | performance 性能 | safe 安全 | experience 体验 | improve 改进 | other 其他)",format:"int32"},source:{type:"string",description:"来源(customer 客户 | user 用户 | po 产品经理 | market 市场 | service 客服 | operation 运营 | support 技术支持 | competitor 竞争对手 | partner 合作伙伴 | dev 开发人员 | tester 测试人员 | bug Bug | forum 论坛 | other 其他)"},verify:{type:"string",description:"验收标准"},assignedTo:{type:"string",description:"指派给"},reviewer:{type:"array",items:{type:"string"},description:"评审人,如果设置必须评审,必须填写"},project:{type:"integer",description:"所属项目",format:"int32"},execution:{type:"integer",description:"所属执行",format:"int32"}},required:["productID","title"]}}},{name:"get",display:"获取需求详情",type:"get",method:"get",path:"/stories/{storyID}",resultType:"object",resultGetter:"story",pathParams:{storyID:"需求ID"}},{name:"update",display:"修改需求",type:"update",method:"put",path:"/stories/{storyID}",resultType:"object",pathParams:{storyID:"需求ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{title:{type:"string"},pri:{type:"integer",description:"优先级,默认是3",format:"int32"},module:{type:"integer",description:"所属模块",format:"int32"},parent:{type:"integer",description:"父需求",format:"int32"},estimate:{type:"number",description:"预计工时",format:"float"},category:{type:"integer",description:"类别(feature 功能 | interface 接口 | performance 性能 | safe 安全 | experience 体验 | improve 改进 | other 其他)",format:"int32"},source:{type:"string",description:"来源(customer 客户 | user 用户 | po 产品经理 | market 市场 | service 客服 | operation 运营 | support 技术支持 | competitor 竞争对手 | partner 合作伙伴 | dev 开发人员 | tester 测试人员 | bug Bug | forum 论坛 | other 其他)"},assignedTo:{type:"string",description:"指派给"}},required:["title"]}}},{name:"delete",display:"删除需求",type:"delete",method:"delete",path:"/stories/{storyID}",resultType:"text",pathParams:{storyID:"需求ID"}},{name:"activate",display:"激活需求",type:"action",method:"put",path:"/stories/{storyID}/activate",resultType:"text",pathParams:{storyID:"需求ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{assignedTo:{type:"string",description:"指派给"},comment:{type:"string",description:"备注"}}}}},{name:"change",display:"变更需求",type:"action",method:"put",path:"/stories/{storyID}/change",resultType:"text",pathParams:{storyID:"需求ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{title:{type:"string",description:"需求名称"},reviewer:{type:"array",items:{type:"string"},description:"评审人员"},spec:{type:"string",description:"需求描述"},verify:{type:"string",description:"验收标准"}},required:["reviewer"]}}},{name:"close",display:"关闭需求",type:"action",method:"put",path:"/stories/{storyID}/close",resultType:"text",pathParams:{storyID:"需求ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{closedReason:{type:"string",description:"关闭原因(done 已完成 | subdivided 已拆分 | duplicate 重复 | postponed 延期 | willnotdo 不做 | cancel 已取消 | bydesign 设计如此)"},comment:{type:"string",description:"备注"}},required:["closedReason"]}}}]},{name:"epic",display:"业务需求",description:"业务需求管理,支持获取业务需求列表,支持获取产品下的业务需求、创建业务需求、获取业务需求详情、修改业务需求、删除业务需求、激活业务需求、变更业务需求、关闭业务需求",actions:[{name:"list",display:"获取业务需求列表,支持获取产品下的业务需求",type:"list",method:"get",path:"/products/{productID}/epics",resultType:"list",pagerGetter:"pager",resultGetter:"epics",pathParams:{productID:"所属产品ID"},params:[{name:"browseType",required:!1,type:"string",description:"状态,默认是unclosed",defaultValue:"unclosed",options:[{value:"allstory",label:"全部"},{value:"assignedtome",label:"指派给我"},{value:"openedbyme",label:"我创建"},{value:"reviewbyme",label:"待我评审"},{value:"draftstory",label:"草稿"}]},{name:"orderBy",required:!1,type:"string",description:"排序",options:[{value:"id_asc",label:"ID 升序"},{value:"id_desc",label:"ID 降序"},{value:"title_asc",label:"标题 升序"},{value:"title_desc",label:"标题 降序"},{value:"status_asc",label:"状态 升序"},{value:"status_desc",label:"状态 降序"}]},{name:"recPerPage",required:!1,type:"number",description:"每页数量,不超过1000"},{name:"pageID",required:!1,type:"number",description:"页码,从第1页开始"}]},{name:"create",display:"创建业务需求",type:"create",method:"post",path:"/epics",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{productID:{type:"integer",description:"产品ID",format:"int32"},title:{type:"string"},pri:{type:"integer",description:"优先级,默认是3",format:"int32"},module:{type:"integer",description:"所属模块",format:"int32"},parent:{type:"integer",description:"父业务需求",format:"int32"},estimate:{type:"number",description:"预计工时",format:"float"},spec:{type:"string",description:"业务需求描述"},category:{type:"integer",description:"类别(feature 功能 | interface 接口 | performance 性能 | safe 安全 | experience 体验 | improve 改进 | other 其他)",format:"int32"},source:{type:"string",description:"来源(customer 客户 | user 用户 | po 产品经理 | market 市场 | service 客服 | operation 运营 | support 技术支持 | competitor 竞争对手 | partner 合作伙伴 | dev 开发人员 | tester 测试人员 | bug Bug | forum 论坛 | other 其他)"},verify:{type:"string",description:"验收标准"},assignedTo:{type:"string",description:"指派给"},reviewer:{type:"array",items:{type:"string"},description:"评审人,如果设置必须评审,必须填写"}},required:["productID","title"]}}},{name:"get",display:"获取业务需求详情",type:"get",method:"get",path:"/epics/{storyID}",resultType:"object",resultGetter:"epic",pathParams:{storyID:"需求ID"}},{name:"update",display:"修改业务需求",type:"update",method:"put",path:"/epics/{epicID}",resultType:"object",pathParams:{epicID:"业务需求ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{title:{type:"string",description:"需求名称"},pri:{type:"integer",description:"优先级,默认是3",format:"int32"},module:{type:"integer",description:"所属模块",format:"int32"},parent:{type:"integer",description:"父业务需求",format:"int32"},estimate:{type:"number",description:"预计工时",format:"float"},category:{type:"integer",description:"类别(feature 功能 | interface 接口 | performance 性能 | safe 安全 | experience 体验 | improve 改进 | other 其他)",format:"int32"},source:{type:"string",description:"来源(customer 客户 | user 用户 | po 产品经理 | market 市场 | service 客服 | operation 运营 | support 技术支持 | competitor 竞争对手 | partner 合作伙伴 | dev 开发人员 | tester 测试人员 | bug Bug | forum 论坛 | other 其他)"},assignedTo:{type:"string",description:"指派给"}},required:["title"]}}},{name:"delete",display:"删除业务需求",type:"delete",method:"delete",path:"/epics/{epicID}",resultType:"text",pathParams:{epicID:"业务需求ID"}},{name:"activate",display:"激活业务需求",type:"action",method:"put",path:"/epics/{epicID}/activate",resultType:"text",pathParams:{epicID:"业务需求ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{assignedTo:{type:"string",description:"指派给"},comment:{type:"string",description:"备注"}}}}},{name:"change",display:"变更业务需求",type:"action",method:"put",path:"/epics/{epicID}/change",resultType:"text",pathParams:{epicID:"业务需求ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{title:{type:"string",description:"需求名称"},reviewer:{type:"array",items:{type:"string"},description:"评审人员"},spec:{type:"string",description:"需求描述"},verify:{type:"string",description:"验收标准"}},required:["reviewer"]}}},{name:"close",display:"关闭业务需求",type:"action",method:"put",path:"/epics/{epicID}/close",resultType:"text",pathParams:{epicID:"业务需求ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{closedReason:{type:"string",description:"关闭原因(done 已完成 | subdivided 已拆分 | duplicate 重复 | postponed 延期 | willnotdo 不做 | cancel 已取消 | bydesign 设计如此)"},comment:{type:"string",description:"备注"}},required:["closedReason"]}}}]},{name:"requirement",display:"用户需求",description:"用户需求管理,支持获取用户需求列表,支持获取产品下的用户需求、创建用户需求、获取用户需求详情、修改用户需求、删除用户需求、激活用户需求、变更用户需求、关闭用户需求",actions:[{name:"list",display:"获取用户需求列表,支持获取产品下的用户需求",type:"list",method:"get",path:"/products/{productID}/requirements",resultType:"list",pagerGetter:"pager",resultGetter:"requirements",pathParams:{productID:"所属产品ID"},params:[{name:"browseType",required:!1,type:"string",description:"状态,默认是unclosed",defaultValue:"unclosed",options:[{value:"allstory",label:"全部"},{value:"assignedtome",label:"指派给我"},{value:"openedbyme",label:"我创建"},{value:"reviewbyme",label:"待我评审"},{value:"draftstory",label:"草稿"}]},{name:"orderBy",required:!1,type:"string",description:"排序",options:[{value:"id_asc",label:"ID 升序"},{value:"id_desc",label:"ID 降序"},{value:"title_asc",label:"标题 升序"},{value:"title_desc",label:"标题 降序"},{value:"status_asc",label:"状态 升序"},{value:"status_desc",label:"状态 降序"}]},{name:"recPerPage",required:!1,type:"number",description:"每页数量,不超过1000"},{name:"pageID",required:!1,type:"number",description:"页码,从第1页开始"}]},{name:"create",display:"创建用户需求",type:"create",method:"post",path:"/requirements",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{productID:{type:"integer",description:"产品ID",format:"int32"},title:{type:"string"},pri:{type:"integer",description:"优先级,默认是3",format:"int32"},module:{type:"integer",description:"所属模块",format:"int32"},parent:{type:"integer",description:"父用户需求",format:"int32"},estimate:{type:"number",description:"预计工时",format:"float"},spec:{type:"string",description:"用户需求描述"},category:{type:"integer",description:"类别(feature 功能 | interface 接口 | performance 性能 | safe 安全 | experience 体验 | improve 改进 | other 其他)",format:"int32"},source:{type:"string",description:"来源(customer 客户 | user 用户 | po 产品经理 | market 市场 | service 客服 | operation 运营 | support 技术支持 | competitor 竞争对手 | partner 合作伙伴 | dev 开发人员 | tester 测试人员 | bug Bug | forum 论坛 | other 其他)"},verify:{type:"string",description:"验收标准"},assignedTo:{type:"string",description:"指派给"},reviewer:{type:"array",items:{type:"string"},description:"评审人,如果设置必须评审,必须填写"}},required:["productID","title"]}}},{name:"get",display:"获取用户需求详情",type:"get",method:"get",path:"/requirements/{storyID}",resultType:"object",resultGetter:"requirement",pathParams:{storyID:"需求ID"}},{name:"update",display:"修改用户需求",type:"update",method:"put",path:"/requirements/{requirementID}",resultType:"object",pathParams:{requirementID:"用户需求ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{title:{type:"string"},pri:{type:"integer",description:"优先级,默认是3",format:"int32"},module:{type:"integer",description:"所属模块",format:"int32"},parent:{type:"integer",description:"父用户需求",format:"int32"},estimate:{type:"number",description:"预计工时",format:"float"},category:{type:"integer",description:"类别(feature 功能 | interface 接口 | performance 性能 | safe 安全 | experience 体验 | improve 改进 | other 其他)",format:"int32"},source:{type:"string",description:"来源(customer 客户 | user 用户 | po 产品经理 | market 市场 | service 客服 | operation 运营 | support 技术支持 | competitor 竞争对手 | partner 合作伙伴 | dev 开发人员 | tester 测试人员 | bug Bug | forum 论坛 | other 其他)"},assignedTo:{type:"string",description:"指派给"}},required:["title"]}}},{name:"delete",display:"删除用户需求",type:"delete",method:"delete",path:"/requirements/{requirementID}",resultType:"text",pathParams:{requirementID:"用户需求ID"}},{name:"activate",display:"激活用户需求",type:"action",method:"put",path:"/requirements/{requirementID}/activate",resultType:"text",pathParams:{requirementID:"用户需求ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{assignedTo:{type:"string",description:"指派给"},comment:{type:"string",description:"备注"}}}}},{name:"change",display:"变更用户需求",type:"action",method:"put",path:"/requirements/{requirementID}/change",resultType:"text",pathParams:{requirementID:"用户需求ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{title:{type:"string",description:"需求名称"},spec:{type:"string",description:"需求描述"},verify:{type:"string",description:"验收标准"}}}}},{name:"close",display:"关闭用户需求",type:"action",method:"put",path:"/requirements/{requirementID}/close",resultType:"text",pathParams:{requirementID:"用户需求ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{closedReason:{type:"string",description:"关闭原因(done 已完成 | subdivided 已拆分 | duplicate 重复 | postponed 延期 | willnotdo 不做 | cancel 已取消 | bydesign 设计如此)"},comment:{type:"string",description:"备注"}},required:["closedReason"]}}}]},{name:"bug",display:"Bug",description:"Bug管理,支持获取Bug列表,支持获取产品/项目/执行下的Bug、创建Bug、获取Bug详情、修改Bug、删除Bug、激活Bug、关闭Bug、解决Bug",actions:[{name:"list",display:"获取Bug列表,支持获取产品/项目/执行下的Bug",type:"list",method:"get",path:"/{scope}/{scopeID}/bugs",resultType:"list",pagerGetter:"pager",resultGetter:"bugs",pathParams:{scope:{description:"Bug所属范围",options:[{value:"products",label:"产品"},{value:"projects",label:"项目"},{value:"executions",label:"执行"}]},scopeID:"所属范围ID"},params:[{name:"browseType",required:!1,type:"string",description:"状态,默认是unclosed",defaultValue:"unclosed",options:[{value:"all",label:"全部"},{value:"unclosed",label:"未关闭"},{value:"assignedtome",label:"指派给我"},{value:"openedbyme",label:"我创建"},{value:"assignedbyme",label:"由我指派"}]},{name:"orderBy",required:!1,type:"string",description:"排序",options:[{value:"id_asc",label:"ID 升序"},{value:"id_desc",label:"ID 降序"},{value:"title_asc",label:"标题 升序"},{value:"title_desc",label:"标题 降序"},{value:"status_asc",label:"状态 升序"},{value:"status_desc",label:"状态 降序"}]},{name:"recPerPage",required:!1,type:"number",description:"每页数量,不超过1000"},{name:"pageID",required:!1,type:"number",description:"页码,从第1页开始"}]},{name:"create",display:"创建Bug",type:"create",method:"post",path:"/bugs",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{productID:{type:"integer",description:"所属产品",format:"int32"},title:{type:"string",description:"Bug标题"},openedBuild:{type:"array",items:{type:"string"},description:"影响版本,主干是trunk,其他版本使用版本ID"},project:{type:"integer",description:"所属项目",format:"int32"},execution:{type:"integer",description:"所属执行",format:"int32"},severity:{type:"integer",description:"严重程度,默认是3",format:"int32"},pri:{type:"integer",description:"优先级,默认是3",format:"int32"},type:{type:"string",description:"Bug类型(codeerror 代码错误 | config 配置相关 | install 安装部署 | security 安全相关 | performance 性能问题 | standard 标准规范 | automation 测试脚本 | designdefect 设计缺陷 | others 其他)"},steps:{type:"string",description:"重现步骤"},story:{type:"integer",description:"相关需求",format:"int32"}},required:["productID","title","openedBuild"]}}},{name:"get",display:"获取Bug详情",type:"get",method:"get",path:"/bugs/{bugID}",resultType:"object",resultGetter:"bug",pathParams:{bugID:"Bug ID"}},{name:"update",display:"修改Bug",type:"update",method:"put",path:"/bugs/{bugID}",resultType:"object",pathParams:{bugID:"Bug ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{title:{type:"string",description:"Bug标题"},severity:{type:"integer",description:"严重程度,默认是3",format:"int32"},pri:{type:"integer",description:"优先级,默认是3",format:"int32"},type:{type:"string",description:"Bug类型(codeerror 代码错误 | config 配置相关 | install 安装部署 | security 安全相关 | performance 性能问题 | standard 标准规范 | automation 测试脚本 | designdefect 设计缺陷 | others 其他)"},openedBuild:{type:"array",items:{type:"string"},description:"影响版本,主干是trunk,其他版本使用版本ID"},steps:{type:"string",description:"重现步骤"},project:{type:"integer",description:"所属项目",format:"int32"},execution:{type:"integer",description:"所属执行",format:"int32"},story:{type:"integer",description:"相关需求",format:"int32"}}}}},{name:"delete",display:"删除Bug",type:"delete",method:"delete",path:"/bugs/{bugID}",resultType:"text",pathParams:{bugID:"Bug ID"}},{name:"activate",display:"激活Bug",type:"action",method:"put",path:"/bugs/{bugID}/activate",resultType:"text",pathParams:{bugID:"Bug ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{openedBuild:{type:"array",items:{type:"string"},description:"影响版本, trunk为主干"},assignedTo:{type:"string",description:"指派给"},comment:{type:"string",description:"备注"}}}}},{name:"close",display:"关闭Bug",type:"action",method:"put",path:"/bugs/{bugID}/close",resultType:"text",pathParams:{bugID:"Bug ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{comment:{type:"string",description:"备注"}}}}},{name:"resolve",display:"解决Bug",type:"action",method:"put",path:"/bugs/{bugID}/resolve",resultType:"text",pathParams:{bugID:"Bug ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{resolution:{type:"string",description:"fixed 已解决 | notrepro 无法重现 | bydesign 设计如此 | duplicate 重复Bug | external 外部原因| postponed 延期处理 | willnotfix 不予解决 | tostory 转为需求"},resolvedDate:{type:"string",description:"解决日期,默认今天"},resolvedBuild:{type:"string",description:"解决版本, trunk为主干"},assignedTo:{type:"string",description:"指派给"},comment:{type:"string",description:"备注"}},required:["resolution"]}}}]},{name:"testcase",display:"测试用例",description:"测试用例管理,支持获取测试用例列表,支持获取产品/项目/执行下的测试用例、创建测试用例、获取测试用例详情、修改测试用例、删除测试用例",actions:[{name:"list",display:"获取测试用例列表,支持获取产品/项目/执行下的测试用例",type:"list",method:"get",path:"/{scope}/{scopeID}/testcases",resultType:"list",pagerGetter:"pager",resultGetter:"testcases",pathParams:{scope:{description:"测试用例所属范围",options:[{value:"products",label:"产品"},{value:"projects",label:"项目"},{value:"executions",label:"执行"}]},scopeID:"所属范围ID"},params:[{name:"browseType",required:!1,type:"string",description:"状态,默认是all",defaultValue:"all",options:[{value:"all",label:"全部"},{value:"wait",label:"未关闭"},{value:"needconfirm",label:"需求变动"}]},{name:"orderBy",required:!1,type:"string",description:"排序",options:[{value:"id_asc",label:"ID 升序"},{value:"id_desc",label:"ID 降序"},{value:"title_asc",label:"标题 升序"},{value:"title_desc",label:"标题 降序"},{value:"status_asc",label:"状态 升序"},{value:"status_desc",label:"状态 降序"}]},{name:"recPerPage",required:!1,type:"number",description:"每页数量,不超过1000"},{name:"pageID",required:!1,type:"number",description:"页码,从第1页开始"}]},{name:"create",display:"创建测试用例",type:"create",method:"post",path:"/testcases",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{productID:{type:"integer",description:"所属产品",format:"int32"},title:{type:"string",description:"用例标题"},module:{type:"integer",description:"所属模块",format:"int32"},story:{type:"integer",description:"相关需求",format:"int32"},pri:{type:"integer",description:"优先级",format:"int32"},type:{type:"string",description:"用例类型(unit 单元测试 | interface 接口测试 | feature 功能测试 | install 安装部署 | config 配置相关 | performance 性能测试 | security 安全相关 | other 其他)"},precondition:{type:"string",description:"前置条件"},steps:{type:"array",items:{type:"string"},description:"用例步骤"},expects:{type:"array",items:{type:"string"},description:"用例步骤期望"},stepType:{type:"array",items:{type:"string"},description:"用例步骤类型(step 步骤 | group 父级步骤)"},project:{type:"integer",description:"所属项目",format:"int32"},execution:{type:"integer",description:"所属执行",format:"int32"}},required:["productID","title"]}}},{name:"get",display:"获取测试用例详情",type:"get",method:"get",path:"/testcases/{caseID}",resultType:"object",resultGetter:"testcase",pathParams:{caseID:"测试用例ID"}},{name:"update",display:"修改测试用例",type:"update",method:"put",path:"/testcases/{testcasID}",resultType:"object",pathParams:{testcasID:"测试用例ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{title:{type:"string",description:"用例标题"},moudule:{type:"integer",description:"所属模块",format:"int32"},story:{type:"integer",description:"相关需求",format:"int32"},pri:{type:"integer",description:"优先级",format:"int32"},type:{type:"string",description:"用例类型(unit 单元测试 | interface 接口测试 | feature 功能测试 | install 安装部署 | config 配置相关 | performance 性能测试 | security 安全相关 | other 其他)"},precondition:{type:"string",description:"前置条件"},steps:{type:"array",items:{type:"string"},description:"用例步骤"},expects:{type:"array",items:{type:"string"},description:"用例步骤期望"},stepType:{type:"array",items:{type:"string"},description:"用例步骤类型(step 步骤 | group 父级步骤)"}},required:["title"]}}},{name:"delete",display:"删除测试用例",type:"delete",method:"delete",path:"/testcases/{testcasID}",resultType:"text",pathParams:{testcasID:"测试用例ID"}}]},{name:"task",display:"任务",description:"任务管理,支持获取任务列表,支持获取执行下的任务、创建任务、获取任务详情、修改任务、删除任务、激活任务、关闭任务、完成任务、启动任务",actions:[{name:"list",display:"获取任务列表,支持获取执行下的任务",type:"list",method:"get",path:"/executions/{executionID}/tasks",resultType:"list",pagerGetter:"pager",resultGetter:"tasks",pathParams:{executionID:"所属执行ID"},params:[{name:"status",required:!1,type:"string",description:"状态,默认是unclosed",defaultValue:"unclosed",options:[{value:"all",label:"全部"},{value:"unclosed",label:"未关闭"},{value:"assignedtome",label:"指派给我"},{value:"assignedtome",label:"指派给我"},{value:"myinvolved",label:"由我参与"},{value:"assignedbyme",label:"由我指派"}]},{name:"orderBy",required:!1,type:"string",description:"排序",options:[{value:"id_asc",label:"ID 升序"},{value:"id_desc",label:"ID 降序"},{value:"name_asc",label:"名称 升序"},{value:"name_desc",label:"名称 降序"},{value:"status_asc",label:"状态 升序"},{value:"status_desc",label:"状态 降序"}]},{name:"recPerPage",required:!1,type:"number",description:"每页数量,不超过1000"},{name:"pageID",required:!1,type:"number",description:"页码,从第1页开始"}]},{name:"create",display:"创建任务",type:"create",method:"post",path:"/tasks",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{name:{type:"string",description:"任务名称"},executionID:{type:"integer",description:"所属执行",format:"int32"},type:{type:"string",description:"任务类型"},assignedTo:{type:"string",description:"指派给"},estStarted:{type:"string",description:"预计开始"},deadline:{type:"string",description:"截止日期"},pri:{type:"integer",description:"优先级",format:"int32"},estimate:{type:"number",description:"预计工时",format:"float"},module:{type:"integer",description:"所属模块",format:"int32"},story:{type:"integer",description:"相关需求",format:"int32"},desc:{type:"string",description:"任务描述"}},required:["name","executionID"]}}},{name:"get",display:"获取任务详情",type:"get",method:"get",path:"/tasks/{taskID}",resultType:"object",pathParams:{taskID:"任务ID"}},{name:"update",display:"修改任务",type:"update",method:"put",path:"/tasks/{taskID}",resultType:"object",pathParams:{taskID:"任务ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{name:{type:"string",description:"任务名称"},type:{type:"string",description:"任务类型"},assignedTo:{type:"string",description:"指派给"},estStarted:{type:"string",description:"预计开始"},deadline:{type:"string",description:"截止日期"},pri:{type:"integer",description:"优先级",format:"int32"},estimate:{type:"number",description:"预计工时",format:"float"},module:{type:"integer",description:"所属模块",format:"int32"},story:{type:"integer",description:"相关需求",format:"int32"},desc:{type:"string",description:"任务描述"}}}}},{name:"delete",display:"删除任务",type:"delete",method:"delete",path:"/tasks/{taskID}",resultType:"text",pathParams:{taskID:"任务ID"}},{name:"activate",display:"激活任务",type:"action",method:"put",path:"/tasks/{taskID}/activate",resultType:"text",pathParams:{taskID:"任务ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{left:{type:"number",description:"预计剩余",format:"float"},assignedTo:{type:"string",description:"指派给"},comment:{type:"string",description:"备注"}}}}},{name:"close",display:"关闭任务",type:"action",method:"put",path:"/tasks/{taskID}/close",resultType:"text",pathParams:{taskID:"任务ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{comment:{type:"string",description:"备注"}}}}},{name:"finish",display:"完成任务",type:"action",method:"put",path:"/tasks/{taskID}/finish",resultType:"text",pathParams:{taskID:"任务ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{currentConsumed:{type:"number",description:"本次消耗",format:"float"},assignedTo:{type:"string",description:"任务名称"},consumed:{type:"number",description:"总计消耗",format:"float"},realStarted:{type:"string",description:"实际开始"},finishedDate:{type:"string",description:"实际完成"},comment:{type:"string",description:"备注"}},required:["currentConsumed","realStarted","finishedDate"]}}},{name:"start",display:"启动任务",type:"action",method:"put",path:"/tasks/{taskID}/start",resultType:"text",pathParams:{taskID:"任务ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{assignedTo:{type:"string",description:"任务名称"},realStarted:{type:"string",description:"实际开始"},consumed:{type:"number",description:"总计消耗",format:"float"},left:{type:"number",description:"预计剩余",format:"float"},comment:{type:"string",description:"备注"}},required:["realStarted"]}}}]},{name:"feedback",display:"反馈",description:"反馈管理,支持获取反馈列表,支持获取产品下的反馈、创建反馈、获取反馈详情、修改反馈、删除反馈、激活反馈、关闭反馈",actions:[{name:"list",display:"获取反馈列表,支持获取产品下的反馈",type:"list",method:"get",path:"/products/{productID}/feedbacks",resultType:"list",pagerGetter:"pager",resultGetter:"feedbacks",pathParams:{productID:"所属产品ID"},params:[{name:"browseType",required:!1,type:"string",description:"状态,默认是wait",defaultValue:"wait",options:[{value:"all",label:"全部"},{value:"wait",label:"待处理"},{value:"doing",label:"处理中"},{value:"toclosed",label:"待关闭"},{value:"review",label:"待评审"},{value:"assigntome",label:"指派给我"},{value:"openedbyme",label:"由我反馈"}]},{name:"orderBy",required:!1,type:"string",description:"排序",options:[{value:"id_asc",label:"ID 升序"},{value:"id_desc",label:"ID 降序"},{value:"title_asc",label:"标题 升序"},{value:"title_desc",label:"标题 降序"},{value:"status_asc",label:"状态 升序"},{value:"status_desc",label:"状态 降序"}]},{name:"recPerPage",required:!1,type:"number",description:"每页数量,不超过1000"},{name:"pageID",required:!1,type:"number",description:"页码,从第1页开始"}]},{name:"create",display:"创建反馈",type:"create",method:"post",path:"/feedbacks",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{product:{type:"integer",description:"所属产品",format:"int32"},title:{type:"string",description:"标题"},module:{type:"integer",description:"所属模块",format:"int32"},type:{type:"string",description:"类型(story 需求 | task 任务 | bug Bug | todo 待办 | advice 建议 | issue 问题 | risk 风险 | opportunity 机会)"},desc:{type:"string",description:"描述"},feedbackBy:{type:"string",description:"反馈者"},source:{type:"string",description:"来源"}},required:["product","title"]}}},{name:"get",display:"获取反馈详情",type:"get",method:"get",path:"/feedbacks/{feedbackID}",resultType:"object",resultGetter:"feedback",pathParams:{feedbackID:"反馈ID"}},{name:"update",display:"修改反馈",type:"update",method:"put",path:"/feedbacks/{feedbackID}",resultType:"object",pathParams:{feedbackID:"反馈ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{product:{type:"integer",description:"所属产品",format:"int32"},module:{type:"integer",description:"所属模块",format:"int32"},title:{type:"string",description:"标题"},type:{type:"string",description:"类型(story 需求 | task 任务 | bug Bug | todo 待办 | advice 建议 | issue 问题 | risk 风险 | opportunity 机会)"},desc:{type:"string",description:"描述"},feedbackBy:{type:"string",description:"反馈者"},source:{type:"string",description:"来源"}},required:["product","title"]}}},{name:"delete",display:"删除反馈",type:"delete",method:"delete",path:"/feedbacks/{feedbackID}",resultType:"text",pathParams:{feedbackID:"反馈ID"}},{name:"activate",display:"激活反馈",type:"action",method:"put",path:"/feedbacks/{feedbackID}/activate",resultType:"text",pathParams:{feedbackID:"反馈ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{assignedTo:{type:"string",description:"指派给"},comment:{type:"string",description:"备注"}}}}},{name:"close",display:"关闭反馈",type:"action",method:"put",path:"/feedbacks/{feedbackID}/close",resultType:"text",pathParams:{feedbackID:"反馈ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{closedReason:{type:"string",description:"关闭原因(commented 已处理 | repeat 重复 | refuse 不予采纳)"},comment:{type:"string",description:"备注"}},required:["closedReason"]}}}]},{name:"ticket",display:"工单",description:"工单管理,支持获取工单列表,支持获取产品下的工单、创建工单、获取工单详情、修改工单、删除工单、激活工单、关闭工单",actions:[{name:"list",display:"获取工单列表,支持获取产品下的工单",type:"list",method:"get",path:"/products/{productID}/tickets",resultType:"list",pagerGetter:"pager",resultGetter:"tickets",pathParams:{productID:"所属产品ID"},params:[{name:"browseType",required:!1,type:"string",description:"状态,默认是wait",defaultValue:"wait",options:[{value:"all",label:"全部"},{value:"unclosed",label:"未关闭"},{value:"wait",label:"待处理"},{value:"doing",label:"处理中"},{value:"done",label:"待关闭"},{value:"finishedbyme",label:"由我解决"},{value:"assigntome",label:"指派给我"},{value:"openedbyme",label:"由我创建"}]},{name:"orderBy",required:!1,type:"string",description:"排序",options:[{value:"id_asc",label:"ID 升序"},{value:"id_desc",label:"ID 降序"},{value:"title_asc",label:"标题 升序"},{value:"title_desc",label:"标题 降序"},{value:"status_asc",label:"状态 升序"},{value:"status_desc",label:"状态 降序"}]},{name:"recPerPage",required:!1,type:"number",description:"每页数量,不超过1000"},{name:"pageID",required:!1,type:"number",description:"页码,从第1页开始"}]},{name:"create",display:"创建工单",type:"create",method:"post",path:"/tickets",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{product:{type:"integer",description:"所属产品",format:"int32"},module:{type:"integer",description:"所属模块",format:"int32"},title:{type:"string",description:"标题"},type:{type:"string",description:"类型(code 程序报错 | data 数据错误 | stuck 流程卡断 | security 安全问题 | affair 事务)"},desc:{type:"string",description:"描述"},assignedTo:{type:"string",description:"指派给"},deadline:{type:"string",description:"截止日期"},openedBuild:{type:"array",items:{type:"string"},description:"影响版本"}},required:["product","title"]}}},{name:"get",display:"获取工单详情",type:"get",method:"get",path:"/tickets/{ticketID}",resultType:"object",resultGetter:"ticket",pathParams:{ticketID:"工单ID"}},{name:"update",display:"修改工单",type:"update",method:"put",path:"/tickets/{ticketID}",resultType:"object",pathParams:{ticketID:"工单ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{product:{type:"integer",description:"所属产品",format:"int32"},module:{type:"integer",description:"所属模块",format:"int32"},title:{type:"string",description:"标题"},type:{type:"string",description:"类型(code 程序报错 | data 数据错误 | stuck 流程卡断 | security 安全问题 | affair 事务)"},desc:{type:"string",description:"描述"},assignedTo:{type:"string",description:"指派给"},deadline:{type:"string",description:"截止日期"},openedBuild:{type:"array",items:{type:"string"},description:"影响版本"}}}}},{name:"delete",display:"删除工单",type:"delete",method:"delete",path:"/tickets/{ticketID}",resultType:"text",pathParams:{ticketID:"工单ID"}},{name:"activate",display:"激活工单",type:"action",method:"put",path:"/tickets/{ticketID}/activate",resultType:"text",pathParams:{ticketID:"工单ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{assignedTo:{type:"string",description:"指派给"},comment:{type:"string",description:"备注"}}}}},{name:"close",display:"关闭工单",type:"action",method:"put",path:"/tickets/{ticketID}/close",resultType:"text",pathParams:{ticketID:"工单ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{closedReason:{type:"string",description:"关闭原因(commented 已处理 | repeat 重复 | refuse 不予处理)"},comment:{type:"string",description:"备注"}},required:["closedReason","comment"]}}}]},{name:"system",display:"应用",description:"应用管理,支持获取应用列表,支持获取产品下的应用、创建应用、修改应用",actions:[{name:"list",display:"获取应用列表,支持获取产品下的应用",type:"list",method:"get",path:"/products/{productID}/systems",resultType:"list",pagerGetter:"pager",pathParams:{productID:"所属产品ID"}},{name:"create",display:"创建应用",type:"create",method:"post",path:"/systems",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{productID:{type:"integer",description:"所属产品",format:"int32"},integrated:{type:"integer",description:"是否集成应用(0 否| 1 是)",format:"int32"},children:{type:"array",items:{type:"string"},description:"集成应用需要包含其他应用,非集成应用传空数组[]"},name:{type:"string",description:"应用名称"},desc:{type:"string",description:"描述"}},required:["productID","integrated","children","name"]}}},{name:"update",display:"修改应用",type:"update",method:"put",path:"/systems/{systemID}",resultType:"object",pathParams:{systemID:"应用ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{name:{type:"string",description:"应用名称"},children:{type:"array",items:{type:"string"},description:"集成应用需要包含其他应用,非集成应用传空数组[]"},desc:{type:"string",description:"描述"}},required:["name","children"]}}}]},{name:"build",display:"版本",description:"版本管理,支持获取版本列表,支持获取项目/执行下的版本、创建版本/构建、修改版本、删除版本",actions:[{name:"list",display:"获取版本列表,支持获取项目/执行下的版本",type:"list",method:"get",path:"/{scope}/{scopeID}/builds",resultType:"list",pagerGetter:"pager",resultGetter:"builds",pathParams:{scope:{description:"版本所属范围",options:[{value:"projects",label:"项目"},{value:"executions",label:"执行"}]},scopeID:"所属范围ID"}},{name:"create",display:"创建版本/构建",type:"create",method:"post",path:"/builds",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{executionID:{type:"integer",description:"所属执行/迭代",format:"int32"},product:{type:"integer",description:"所属产品",format:"int32"},name:{type:"string",description:"构建名称"},system:{type:"integer",description:"所属应用",format:"int32"},builder:{type:"string",description:"构建者"},date:{type:"string",description:"打包日期"},scmPath:{type:"string",description:"源代码地址"},filePath:{type:"string",description:"下载地址"},desc:{type:"string",description:"描述"}},required:["executionID","product","name","system","builder","date"]}}},{name:"update",display:"修改版本",type:"update",method:"put",path:"/builds/{buildID}",resultType:"object",pathParams:{buildID:"版本ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{execution:{type:"integer",description:"所属执行/迭代",format:"int32"},product:{type:"integer",description:"所属产品",format:"int32"},name:{type:"string",description:"构建名称"},system:{type:"integer",description:"所属应用",format:"int32"},builder:{type:"string",description:"构建者"},date:{type:"string",description:"打包日期"},scmPath:{type:"string",description:"源代码地址"},filePath:{type:"string",description:"下载地址"},desc:{type:"string",description:"描述"}},required:["execution","product","name","system","builder","date"]}}},{name:"delete",display:"删除版本",type:"delete",method:"delete",path:"/builds/{buildID}",resultType:"text",pathParams:{buildID:"版本ID"}}]},{name:"testtask",display:"测试单",description:"测试单管理,支持获取测试单列表,支持获取产品/项目/执行下的测试单、创建测试单、修改测试单、删除测试单",actions:[{name:"list",display:"获取测试单列表,支持获取产品/项目/执行下的测试单",type:"list",method:"get",path:"/{scope}/{scopeID}/testtasks",resultType:"list",pagerGetter:"pager",resultGetter:"testtasks",pathParams:{scope:{description:"测试单所属范围",options:[{value:"products",label:"产品"},{value:"projects",label:"项目"},{value:"executions",label:"执行"}]},scopeID:"所属范围ID"}},{name:"create",display:"创建测试单",type:"create",method:"post",path:"/testtasks",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{productID:{type:"integer",description:"所属产品ID",format:"int32"},name:{type:"string",description:"测试单名称"},build:{type:"integer",description:"提测构建/版本",format:"int32"},execution:{type:"integer",description:"所属执行",format:"int32"},type:{type:"array",items:{type:"string"},description:"类型(integrate 集成测试 | system 系统测试 | acceptance 验收测试 | performance 性能测试 | safety 安全测试)"},owner:{type:"string",description:"负责人"},status:{type:"string",description:"状态(wait 未开始 | doing 进行中 | done 已关闭 | blocked 被阻塞)"},begin:{type:"string",description:"开始日期"},end:{type:"string",description:"结束日期"},desc:{type:"string",description:"描述"}},required:["productID","name","build","begin","end"]}}},{name:"update",display:"修改测试单",type:"update",method:"put",path:"/testtasks/{testtaskID}",resultType:"object",pathParams:{testtaskID:"测试单ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{name:{type:"string",description:"测试单名称"},build:{type:"integer",description:"提测构建/版本",format:"int32"},execution:{type:"integer",description:"所属执行",format:"int32"},type:{type:"array",items:{type:"string"},description:"类型(integrate 集成测试 | system 系统测试 | acceptance 验收测试 | performance 性能测试 | safety 安全测试)"},owner:{type:"string",description:"负责人"},status:{type:"string",description:"状态(wait 未开始 | doing 进行中 | done 已关闭 | blocked 被阻塞)"},begin:{type:"string",description:"开始日期"},end:{type:"string",description:"结束日期"},desc:{type:"string",description:"描述"}},required:["name","build","begin","end"]}}},{name:"delete",display:"删除测试单",type:"delete",method:"delete",path:"/testtasks/{testtaskID}",resultType:"text",pathParams:{testtaskID:"测试单ID"}}]},{name:"release",display:"发布",description:"发布管理,支持获取发布列表,支持获取产品下的发布、创建发布、修改发布、删除发布",actions:[{name:"list",display:"获取发布列表,支持获取产品下的发布",type:"list",method:"get",path:"/products/{productID}/releases",resultType:"list",pagerGetter:"pager",resultGetter:"releases",pathParams:{productID:"所属产品ID"}},{name:"create",display:"创建发布",type:"create",method:"post",path:"/releases",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{productID:{type:"integer",description:"所属产品",format:"int32"},system:{type:"integer",description:"所属应用",format:"int32"},name:{type:"string",description:"应用版本号"},build:{type:"array",items:{type:"string"},description:"包含构建"},status:{type:"string",description:"状态(wait 未开始 | normal 已发布 | fail 发布失败 | terminate 停止维护)"},date:{type:"string",description:"计划发布日期"},desc:{type:"string",description:"描述"}},required:["productID","system","name","build","date"]}}},{name:"update",display:"修改发布",type:"update",method:"put",path:"/releases/{releasID}",resultType:"object",pathParams:{releasID:"发布ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{system:{type:"integer",description:"所属应用",format:"int32"},name:{type:"string",description:"应用版本号"},build:{type:"array",items:{type:"string"},description:"包含构建"},status:{type:"string",description:"状态(wait 未开始 | normal 已发布 | fail 发布失败 | terminate 停止维护)"},date:{type:"string",description:"计划发布日期"},desc:{type:"string",description:"描述"}},required:["system","name","build","date"]}}},{name:"delete",display:"删除发布",type:"delete",method:"delete",path:"/releases/{releasID}",resultType:"text",pathParams:{releasID:"发布ID"}}]},{name:"file",display:"附件",description:"附件管理,支持编辑附件,修改附件的名称、删除附件",actions:[{name:"create",display:"编辑附件,修改附件的名称",type:"create",method:"post",path:"/files",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{fileName:{type:"string",description:"附件名称"}},required:["fileName"]}}},{name:"delete",display:"删除附件",type:"delete",method:"delete",path:"/files/{fileID}",resultType:"text",pathParams:{fileID:"附件ID"}}]}];var fD={list:"get",get:"get",create:"post",update:"put",delete:"delete",action:"post"},yD={list:"list",get:"object",create:"object",update:"object",delete:"text",action:"text"},IB=dD(ND()),lB=aB(IB);function q(B){if(Array.isArray(B))return B.map((D)=>q(D));if(B&&typeof B==="object"&&!(B instanceof Function)){let D={};for(let[W,R]of Object.entries(B))D[W]=q(R);return D}return B}function OB(B,D){if(!G(D))return D===void 0?B:q(D);let W=G(B)?{...B}:{};for(let[R,Q]of Object.entries(D)){if(Q===void 0)continue;let C=W[R];W[R]=G(Q)&&G(C)?OB(C,Q):q(Q)}return W}function ND(){return q(sB)}function SB(B){if(B===null||typeof B!=="object")return B;if(Object.isFrozen(B))return B;for(let D of Object.keys(B))SB(B[D]);return Object.freeze(B)}function bD(B){if(B.method===void 0){let D=fD[B.type];if(D===void 0)throw new $("E_INDETERMINATE_ACTION_METHOD",{action:String(B.name),type:String(B.type)});B.method=D}if(B.resultType===void 0){let D=yD[B.type];if(D===void 0)throw new $("E_INDETERMINATE_ACTION_RESULT_TYPE",{action:String(B.name),type:String(B.type)});B.resultType=D}return B}function u(B){return SB(bD(B))}function F(B){return B.actions.forEach(u),SB(B)}function dD(B){return B.forEach(F),B}function e(B,D){let W=D.toLowerCase();return B.findIndex((R)=>String(R.name).toLowerCase()===W)}function vD(B,D){let W=B.slice();for(let R of D){let Q=e(W,String(R.name)),C=u(q(R));if(Q>=0)W[Q]=C;else W.push(C)}return W}function rB(B,D){return F({...B,...q(D),actions:vD(B.actions,D.actions)})}function aB(B){return new Map(B.map((D)=>[D.name.toLowerCase(),D]))}function oB(B){if(!B||typeof B.name!=="string"||!Array.isArray(B.actions))throw new $("E_INVALID_MODULE_DEFINITION")}function jB(B){if(!B||typeof B.name!=="string"||typeof B.path!=="string")throw new $("E_INVALID_ACTION_DEFINITION");if(B.method!==void 0&&typeof B.method!=="string")throw new $("E_INVALID_ACTION_DEFINITION");if(B.resultType!==void 0&&typeof B.resultType!=="string")throw new $("E_INVALID_ACTION_DEFINITION")}function k(){return IB}function _(){return lB}function BB(){lB=aB(IB)}var cD;function eB(B){cD=B}function DB(B,D={}){let W=k();for(let R of S(B)){oB(R);let Q=R.name.toLowerCase(),C=W.findIndex((X)=>X.name.toLowerCase()===Q);if(C>=0)W[C]=D.replace?F(q(R)):rB(W[C],R);else W.push(F(q(R)))}BB()}function WB(B,D){let W=B.toLowerCase(),R=_().get(W);if(!R)throw new $("E_INVALID_MODULE",{module:B});let Q=R.actions.slice();for(let J of S(D)){jB(J);let V=e(Q,String(J.name)),H=u(q(J));if(V>=0)Q[V]=H;else Q.push(H)}let C=F({...R,actions:Q}),X=k(),w=X.findIndex((J)=>J.name.toLowerCase()===W);X[w]=C,BB()}function U(B,D,W){let R=B.toLowerCase(),Q=_().get(R);if(!Q)throw new $("E_INVALID_MODULE",{module:B});let C=Q.actions.slice(),X=e(C,D);if(X<0)throw new $("E_INVALID_ACTION",{module:B,action:D});let w=C[X],J=typeof W==="function"?W(q(w)):OB(w,W);jB(J),C[X]=u(J);let V=F({...Q,actions:C}),H=k(),Y=H.findIndex((A)=>A.name.toLowerCase()===R);H[Y]=V,BB()}function zB(){U("execution","create",(B)=>{let D=B.requestBody.schema?.required;if(Array.isArray(D)&&!D.includes("products"))D.push("products");return B}),U("story","update",(B)=>{let D=B.requestBody.schema?.properties;if(D&&!D.plan)D.plan={type:"integer",description:"所属计划",format:"int32"};if(D&&D.category)D.category={type:"string",description:"类别"};return B}),U("task","list",(B)=>{return B.path="/executions/{executionID}/tasks",B.pathParams={executionID:"执行ID"},B}),[["product","create"],["product","update"],["execution","create"],["execution","update"]].forEach(([B,D])=>{U(B,D,(W)=>{let R=W.requestBody.schema?.properties;if(R.acl&&R.acl.defaultValue===void 0)R.acl.defaultValue="open";return W})}),["create","update"].forEach((B)=>{U("task",B,(D)=>{let W=D.requestBody?.schema?.properties;if(W&&!W.parent)W.parent={type:"integer",description:"父任务",format:"int32"};return D})})}var BD={user:{id:"用户编号",company:"所属公司",type:"用户类型",dept:"部门",account:"用户名",password:"密码",role:"职位",realname:"姓名",superior:"直属上级",pinyin:"姓名拼音",nickname:"昵称",commiter:"源代码帐号",avatar:"用户头像",birthday:"生日",gender:"性别",email:"邮箱",skype:"Skype",qq:"QQ",mobile:"手机",phone:"电话",weixin:"微信",dingding:"钉钉",slack:"Slack",whatsapp:"WhatsApp",address:"通讯地址",zipcode:"邮编",nature:"性格特征",analysis:"影响分析",strategy:"应对策略",join:"入职日期",visits:"访问次数",visions:"界面类型",ip:"最后IP",last:"最后登录",fails:"失败次数",locked:"锁住日期",feedback:"是否反馈用户",ranzhi:"ZDOO帐号",ldap:"LDAP账号",score:"积分",scoreLevel:"积分等级",resetToken:"重置密码令牌",resetExpired:"重置令牌过期时间",clientStatus:"登录状态",clientLang:"客户端语言",jira:"是否Jira导入用户",deleted:"(已删除)"},program:{id:"编号",project:"项目",isTpl:"是否模板",charter:"所属立项",model:"项目管理方式",type:"类型",category:"项目集类型",lifetime:"项目周期",budget:"预算",budgetUnit:"预算单位",attribute:"阶段类型",percent:"工作量占比",milestone:"里程碑",output:"输出",auth:"权限控制",storyType:"关联需求概念",parent:"父项目集",path:"路径",grade:"层级",name:"项目集名称",code:"项目代号",hasProduct:"是否关联产品",workflowGroup:"项目流程",begin:"计划开始",end:"计划完成",firstEnd:"启动时的计划完成日期",realBegan:"实际开始",realEnd:"实际完成",days:"可用工作日",schedule:"日程安排",status:"状态",subStatus:"子状态",pri:"优先级",desc:"项目集描述",version:"版本",parentVersion:"父版本",planDuration:"计划周期天数",realDuration:"实际周期天数",progress:"项目进度",estimate:"预计",left:"剩余工时",consumed:"消耗工时",teamCount:"总人数",market:"目标市场",openedBy:"创建者",openedDate:"创建时间",openedVersion:"创建版本",lastEditedBy:"最后编辑人",lastEditedDate:"最后编辑日期",closedBy:"由谁关闭",closedDate:"关闭日期",closedReason:"关闭原因",canceledBy:"由谁取消",canceledDate:"取消日期",suspendedDate:"暂停日期",PO:"项目负责人",PM:"负责人",QD:"测试负责人",RD:"发布负责人",team:"团队",acl:"访问控制",whitelist:"白名单",tplAcl:"模板访问控制",tplWhiteList:"模板白名单",order:"排序",stageBy:"阶段类型",displayCards:"每列最大卡片数",fluidBoard:"列宽度",multiple:"启用迭代",parallel:"是否允许并行",enabled:"是否启用阶段",linkType:"关联类型",taskDateLimit:"任务时间限制",colWidth:"列宽",minColWidth:"最小列宽",maxColWidth:"最大列宽",coverExecutionPriv:"执行权限控制",vision:"界面",frozen:"冻结状态",deleted:"已删除"},product:{id:"编号",program:"所属项目集",name:"产品名称",code:"产品代号",shadow:"是否影子产品",bind:"是否独立产品",line:"产品线",type:"产品类型",status:"状态",subStatus:"子状态",desc:"产品描述",PO:"产品负责人",QD:"测试负责人",RD:"发布负责人",feedback:"反馈负责人",ticket:"工单负责人",workflowGroup:"产品流程",acl:"访问控制",groups:"权限组",whitelist:"白名单",reviewer:"评审人",PMT:"规划负责人",draftEpics:"草稿业务需求",activeEpics:"激活业务需求",changingEpics:"变更中业务需求",reviewingEpics:"评审中业务需求",finishedEpics:"已完成业务需求",closedEpics:"已关闭业务需求",totalEpics:"业务需求数",draftRequirements:"草稿用户需求",activeRequirements:"激活用户需求",changingRequirements:"变更中用户需求",reviewingRequirements:"评审中用户需求",finishedRequirements:"已完成用户需求",closedRequirements:"已关闭用户需求",totalRequirements:"用户需求数",draftStories:"草稿软件需求",activeStories:"激活软件需求",changingStories:"变更中软件需求",reviewingStories:"评审中软件需求",finishedStories:"已完成软件需求",closedStories:"已关闭软件需求",totalStories:"软件需求数",unresolvedBugs:"未解决Bug",closedBugs:"关闭Bug",fixedBugs:"已修复Bug",totalBugs:"Bug总数",plans:"计划数",releases:"发布数",createdBy:"由谁创建",createdDate:"创建日期",createdVersion:"创建版本",closedDate:"关闭日期",order:"排序",vision:"所属界面",deleted:"已删除"},project:{id:"项目ID",project:"所属项目",isTpl:"是否模板",charter:"所属立项",model:"项目管理方式",type:"项目类型",category:"项目类型",lifetime:"项目周期",budget:"预算",budgetUnit:"(单位:)",attribute:"阶段类型",percent:"工作量占比",milestone:"里程碑",output:"输出",auth:"权限控制",storyType:"关联需求概念",parent:"所属项目集",path:"路径",grade:"层级",name:"项目名称",code:"项目代号",hasProduct:"是否关联产品",workflowGroup:"项目流程",begin:"计划开始",end:"计划完成",firstEnd:"启动时的计划完成日期",realBegan:"实际开始日期",realEnd:"实际完成日期",days:"可用工作日",schedule:"日程安排",status:"状态",subStatus:"子状态",pri:"优先级",desc:"项目描述",version:"版本",parentVersion:"父版本",planDuration:"计划周期天数",realDuration:"实际周期天数",progress:"进度",estimate:"预计",left:"剩余工时",consumed:"消耗工时",teamCount:"人数",market:"目标市场",openedBy:"由谁创建",openedDate:"创建日期",openedVersion:"创建版本",lastEditedBy:"最后编辑人",lastEditedDate:"最后编辑日期",closedBy:"由谁关闭",closedDate:"关闭日期",closedReason:"关闭原因",canceledBy:"由谁取消",canceledDate:"取消日期",suspendedDate:"暂停日期",PO:"项目负责人",PM:"负责人",QD:"测试负责人",RD:"发布负责人",team:"团队",acl:"访问控制",whitelist:"项目白名单",tplAcl:"模板访问控制",tplWhiteList:"模板白名单",order:"排序",stageBy:"阶段类型",displayCards:"每列最大卡片数",fluidBoard:"列宽度",multiple:"启用迭代",parallel:"是否允许并行",enabled:"是否启用阶段",linkType:"关联类型",taskDateLimit:"任务时间限制",colWidth:"列宽",minColWidth:"最小列宽",maxColWidth:"最大列宽",coverExecutionPriv:"执行权限控制",vision:"界面",frozen:"冻结状态",deleted:"已删除"},execution:{id:"迭代编号",project:"所属项目",isTpl:"是否模板",charter:"所属立项",model:"项目管理方式",type:"迭代类型",category:"项目类型",lifetime:"项目周期",budget:"预算",budgetUnit:"(单位:)",attribute:"阶段类型",percent:"工作量占比",milestone:"里程碑",output:"输出",auth:"权限控制",storyType:"关联需求概念",parent:"所属项目",path:"路径",grade:"层级",name:"迭代名称",code:"迭代代号",hasProduct:"是否关联产品",workflowGroup:"项目流程",begin:"计划开始",end:"计划完成",firstEnd:"启动时的计划完成日期",realBegan:"实际开始日期",realEnd:"实际完成日期",days:"可用工作日",schedule:"日程安排",status:"迭代状态",subStatus:"子状态",pri:"优先级",desc:"迭代描述",version:"版本",parentVersion:"父版本",planDuration:"计划周期天数",realDuration:"实际周期天数",progress:"进度",estimate:"预计",left:"剩余",consumed:"消耗",teamCount:"人数",market:"目标市场",openedBy:"由谁创建",openedDate:"创建日期",openedVersion:"创建版本",lastEditedBy:"最后编辑人",lastEditedDate:"最后编辑日期",closedBy:"由谁关闭",closedDate:"关闭日期",closedReason:"关闭原因",canceledBy:"由谁取消",canceledDate:"取消日期",suspendedDate:"暂停日期",PO:"产品负责人",PM:"迭代负责人",QD:"测试负责人",RD:"发布负责人",team:"团队成员",acl:"访问控制",whitelist:"白名单",tplAcl:"模板访问控制",tplWhiteList:"模板白名单",order:"迭代排序",stageBy:"阶段类型",displayCards:"每列最大卡片数",fluidBoard:"列宽度",multiple:"启用迭代",parallel:"是否允许并行",enabled:"是否启用阶段",linkType:"关联类型",taskDateLimit:"任务时间限制",colWidth:"列宽",minColWidth:"最小列宽",maxColWidth:"最大列宽",coverExecutionPriv:"执行权限控制",vision:"界面",frozen:"冻结状态",deleted:"已删除"},productplan:{id:"编号",product:"所属产品",branch:"平台/分支",parent:"父计划",title:"计划名称",status:"状态",desc:"描述",begin:"开始日期",end:"结束日期",finishedDate:"完成时间",closedDate:"关闭时间",order:"排序",closedReason:"关闭原因",createdBy:"由谁创建",createdDate:"创建时间",deleted:"已删除"},story:{id:"编号",parent:"父需求",isParent:"是父需求",root:"顶级需求ID",path:"路径",grade:"需求层级",product:"所属产品",branch:"平台/分支",module:"所属模块",plan:"所属计划",source:"来源",sourceNote:"来源备注",fromBug:"来源Bug",feedback:"相关反馈",title:"软件需求名称",keywords:"关键词",type:"需求类型",category:"类别",pri:"优先级",estimate:"预计工时",status:"当前状态",subStatus:"子状态",color:"标题颜色",stage:"所处阶段",stagedBy:"设置阶段者",mailto:"抄送给",lib:"所属需求库",fromStory:"来源需求",fromVersion:"来源版本",openedBy:"由谁创建",openedDate:"创建日期",assignedTo:"指派给",assignedDate:"指派日期",approvedDate:"评审日期",lastEditedBy:"最后修改",lastEditedDate:"最后修改日期",changedBy:"由谁变更",changedDate:"变更时间",reviewedBy:"已评审人",reviewedDate:"评审时间",releasedDate:"发布日期",closedBy:"由谁关闭",closedDate:"关闭日期",closedReason:"关闭原因",activatedDate:"激活日期",toBug:"转Bug",linkStories:"相关需求",linkRequirements:"相关用户需求",docs:"关联文档",twins:"孪生需求",duplicateStory:"重复需求",version:"版本号",parentVersion:"父需求版本",demandVersion:"需求池需求版本",storyChanged:"需求已变更",feedbackBy:"反馈者",notifyEmail:"通知邮箱",BSA:"BSA等级",duration:"管理周期",demand:"需求池需求",submitedBy:"提交评审人",roadmap:"所属路标",URChanged:"用需变更",unlinkReason:"移除原因",retractedReason:"撤销原因",retractedBy:"由谁撤回",retractedDate:"撤回日期",verifiedDate:"验收时间",vision:"所属界面",frozen:"冻结状态",deleted:"已删除"},epic:{id:"编号",parent:"父需求",isParent:"是父需求",root:"顶级需求ID",path:"路径",grade:"需求层级",product:"所属产品",branch:"平台/分支",module:"所属模块",plan:"所属计划",source:"来源",sourceNote:"来源备注",fromBug:"来源Bug",feedback:"相关反馈",title:"业务需求名称",keywords:"关键词",type:"需求类型",category:"类别",pri:"优先级",estimate:"预计工时",status:"当前状态",subStatus:"子状态",color:"标题颜色",stage:"所处阶段",stagedBy:"设置阶段者",mailto:"抄送给",lib:"所属需求库",fromStory:"来源需求",fromVersion:"来源版本",openedBy:"由谁创建",openedDate:"创建日期",assignedTo:"指派给",assignedDate:"指派日期",approvedDate:"评审日期",lastEditedBy:"最后修改",lastEditedDate:"最后修改日期",changedBy:"由谁变更",changedDate:"变更时间",reviewedBy:"已评审人",reviewedDate:"评审时间",releasedDate:"发布日期",closedBy:"由谁关闭",closedDate:"关闭日期",closedReason:"关闭原因",activatedDate:"激活日期",toBug:"转Bug",linkStories:"相关需求",linkRequirements:"相关用户需求",docs:"关联文档",twins:"孪生需求",duplicateStory:"重复需求",version:"版本号",parentVersion:"父需求版本",demandVersion:"需求池需求版本",storyChanged:"需求已变更",feedbackBy:"反馈者",notifyEmail:"通知邮箱",BSA:"BSA等级",duration:"管理周期",demand:"需求池需求",submitedBy:"提交评审人",roadmap:"所属路标",URChanged:"用需变更",unlinkReason:"移除原因",retractedReason:"撤销原因",retractedBy:"由谁撤回",retractedDate:"撤回日期",verifiedDate:"验收时间",vision:"所属界面",frozen:"冻结状态",deleted:"已删除"},requirement:{id:"编号",parent:"父需求",isParent:"是父需求",root:"顶级需求ID",path:"路径",grade:"需求层级",product:"所属产品",branch:"平台/分支",module:"所属模块",plan:"所属计划",source:"来源",sourceNote:"来源备注",fromBug:"来源Bug",feedback:"相关反馈",title:"用户需求名称",keywords:"关键词",type:"需求类型",category:"类别",pri:"优先级",estimate:"预计工时",status:"当前状态",subStatus:"子状态",color:"标题颜色",stage:"所处阶段",stagedBy:"设置阶段者",mailto:"抄送给",lib:"所属需求库",fromStory:"来源需求",fromVersion:"来源版本",openedBy:"由谁创建",openedDate:"创建日期",assignedTo:"指派给",assignedDate:"指派日期",approvedDate:"评审日期",lastEditedBy:"最后修改",lastEditedDate:"最后修改日期",changedBy:"由谁变更",changedDate:"变更时间",reviewedBy:"已评审人",reviewedDate:"评审时间",releasedDate:"发布日期",closedBy:"由谁关闭",closedDate:"关闭日期",closedReason:"关闭原因",activatedDate:"激活日期",toBug:"转Bug",linkStories:"相关需求",linkRequirements:"相关用户需求",docs:"关联文档",twins:"孪生需求",duplicateStory:"重复需求",version:"版本号",parentVersion:"父需求版本",demandVersion:"需求池需求版本",storyChanged:"需求已变更",feedbackBy:"反馈者",notifyEmail:"通知邮箱",BSA:"BSA等级",duration:"管理周期",demand:"需求池需求",submitedBy:"提交评审人",roadmap:"所属路标",URChanged:"用需变更",unlinkReason:"移除原因",retractedReason:"撤销原因",retractedBy:"由谁撤回",retractedDate:"撤回日期",verifiedDate:"验收时间",vision:"所属界面",frozen:"冻结状态",deleted:"已删除"},bug:{id:"Bug编号",project:"所属项目",product:"所属产品",injection:"注入环节",identify:"发现环节",branch:"平台/分支",module:"所属模块",execution:"所属执行",plan:"所属计划",story:"相关需求",storyVersion:"软件需求版本",task:"相关任务",toTask:"转任务",toStory:"转软件需求",title:"Bug标题",keywords:"关键词",severity:"严重程度",pri:"优先级",type:"Bug类型",os:"操作系统",browser:"浏览器",hardware:"硬件",found:"发现环境",steps:"重现步骤",status:"Bug状态",subStatus:"子状态",color:"标题颜色",confirmed:"是否确认",activatedCount:"激活次数",activatedDate:"激活时间",feedbackBy:"反馈者",notifyEmail:"通知邮箱",mailto:"抄送给",openedBy:"由谁创建",openedDate:"创建日期",openedBuild:"影响版本",assignedTo:"指派给",assignedDate:"指派日期",deadline:"截止日期",resolvedBy:"解决者",resolution:"解决方案",resolvedBuild:"解决版本",resolvedDate:"解决日期",closedBy:"由谁关闭",closedDate:"关闭日期",duplicateBug:"重复Bug",relatedBug:"相关Bug",case:"来源用例",caseVersion:"用例版本",feedback:"相关反馈",result:"结果",repo:"所属版本库",mr:"合并请求",entry:"代码路径",lines:"代码行",v1:"版本1",v2:"版本2",repoType:"版本库类型",issueKey:"Sonarqube问题键值",testtask:"测试单",lastEditedBy:"最后修改者",lastEditedDate:"修改日期",deleted:"已删除"},testcase:{id:"用例编号",project:"所属项目",product:"所属产品",execution:"所属迭代",branch:"平台/分支",lib:"所属库",module:"所属模块",path:"路径",story:"相关软件需求",storyVersion:"软件需求版本",title:"用例名称",precondition:"前置条件",keywords:"关键词",pri:"优先级",type:"用例类型",auto:"自动化测试用例",frame:"自动化测试框架",stage:"适用环节",howRun:"测试方式",script:"自动化脚本",scriptedBy:"脚本由谁创建",scriptedDate:"脚本创建日期",scriptStatus:"脚本状态",scriptLocation:"脚本地址",status:"用例状态",subStatus:"子状态",color:"标题颜色",frequency:"使用频率",order:"排序",openedBy:"由谁创建",openedDate:"创建日期",reviewedBy:"由谁评审",reviewedDate:"评审时间",lastEditedBy:"最后修改者",lastEditedDate:"修改日期",version:"用例版本",linkCase:"相关用例",fromBug:"来源Bug",fromCaseID:"用例来源ID",fromCaseVersion:"用例来源版本",lastRunner:"执行人",lastRunDate:"执行时间",lastRunResult:"结果",scene:"所属场景",sort:"排序",deleted:"已删除"},task:{id:"编号",project:"所属项目",parent:"父任务",isParent:"是父任务",isTpl:"是模板",path:"路径",execution:"所属执行",module:"所属模块",design:"相关设计",story:"相关软件需求",storyVersion:"软件需求版本",designVersion:"设计版本",fromBug:"来源Bug",feedback:"相关反馈",fromIssue:"来源问题",docs:"关联文档",docVersions:"文档版本",name:"任务名称",type:"任务类型",mode:"任务模式",pri:"优先级",estimate:"最初预计",consumed:"总计消耗",left:"预计剩余",deadline:"截止日期",status:"任务状态",subStatus:"子状态",color:"标题颜色",mailto:"抄送给",keywords:"关键词",desc:"任务描述",version:"版本",openedBy:"由谁创建",openedDate:"创建日期",assignedTo:"指派给",assignedDate:"指派日期",estStarted:"预计开始",realStarted:"实际开始",finishedBy:"由谁完成",finishedDate:"实际完成",finishedList:"完成者列表",canceledBy:"由谁取消",canceledDate:"取消时间",closedBy:"由谁关闭",closedDate:"关闭时间",planDuration:"计划持续天数",realDuration:"实际持续天数",closedReason:"关闭原因",lastEditedBy:"最后修改",lastEditedDate:"最后修改日期",activatedDate:"激活日期",order:"排序",repo:"所属代码库",mr:"合并请求",entry:"代码路径",lines:"代码行",v1:"版本1",v2:"版本2",vision:"所属界面",deleted:"已删除"},feedback:{id:"编号",product:"所属产品",module:"所属模块",title:"反馈名称",type:"类型",solution:"处理方案",desc:"描述",pri:"优先级",status:"状态",subStatus:"子状态",prevStatus:"之前状态",public:"公开",notify:"通知",notifyEmail:"通知邮箱",source:"来源公司",likes:"点赞人",result:"转化结果",faq:"FAQ",openedBy:"创建者",openedDate:"创建时间",reviewedBy:"由谁评审",reviewedDate:"评审时间",processedBy:"由谁处理",processedDate:"处理时间",closedBy:"由谁关闭",closedDate:"关闭时间",closedReason:"关闭原因",editedBy:"最后处理人",editedDate:"最后操作时间",assignedTo:"指派给",prevAssignedTo:"之前指派人",assignedDate:"指派时间",activatedBy:"由谁激活",activatedDate:"激活时间",feedbackBy:"反馈者",repeatFeedback:"重复反馈",mailto:"抄送给",keywords:"关键词",deleted:"已删除"},ticket:{id:"工单编号",product:"所属产品",module:"所属模块",title:"工单名称",type:"类型",desc:"描述",openedBuild:"影响版本",feedback:"由反馈转化",assignedTo:"指派给",assignedDate:"指派日期",realStarted:"实际开始",startedBy:"由谁开始",startedDate:"开始时间",deadline:"截止日期",pri:"优先级",estimate:"最初预计",left:"预计剩余",status:"状态",openedBy:"由谁创建",openedDate:"创建时间",activatedCount:"激活次数",activatedBy:"由谁激活",activatedDate:"激活时间",closedBy:"关闭者",closedDate:"关闭时间",closedReason:"关闭原因",finishedBy:"完成者",finishedDate:"完成时间",resolvedBy:"解决者",resolvedDate:"解决时间",resolution:"解决方案",editedBy:"由谁编辑",editedDate:"最后修改时间",keywords:"关键字",repeatTicket:"重复工单",mailto:"抄送给",deleted:"已删除"},system:{id:"编号",name:"应用名称",product:"所属产品",integrated:"集成应用",latestRelease:"最新版本号",latestDate:"最新发布日期",children:"包含应用",status:"状态",desc:"描述",createdBy:"由谁创建",createdDate:"创建日期",editedBy:"由谁编辑",editedDate:"编辑日期",deleted:"已删除"},build:{id:"ID",project:"所属项目",product:"所属产品",branch:"平台/分支",execution:"所属迭代",builds:"包含构建",name:"名称",system:"所属应用",scmPath:"源代码地址",filePath:"下载地址",date:"打包日期",stories:"完成的软件需求",bugs:"解决的Bug",artifactRepoID:"制品库",builder:"构建者",desc:"描述",createdBy:"由谁创建",createdDate:"创建时间",deleted:"已删除"},testtask:{id:"编号",project:"所属项目",product:"所属产品",name:"测试单名称",execution:"所属执行",build:"提测构建",joint:"是否联调测试单",type:"测试类型",owner:"负责人",pri:"优先级",begin:"开始日期",end:"结束日期",realBegan:"实际开始日期",realFinishedDate:"实际完成日期",mailto:"抄送给",desc:"描述",report:"测试总结",status:"当前状态",testreport:"相关测试报告",auto:"自动化",subStatus:"子状态",createdBy:"由谁创建",createdDate:"创建时间",members:"参与人",deleted:"已删除"},release:{id:"ID",project:"所属项目",product:"所属产品",branch:"平台/分支",shadow:"影子构建",build:"构建",name:"应用版本号",system:"应用",releases:"包含应用",marker:"里程碑",date:"计划发布日期",releasedDate:"实际发布日期",stories:"完成的软件需求",bugs:"解决的Bug",leftBugs:"遗留的Bug",desc:"描述",mailto:"抄送给",notify:"发送通知",status:"发布状态",subStatus:"子状态",createdBy:"由谁创建",createdDate:"创建时间",deleted:"已删除"},file:{id:"编号",pathname:"路径",title:"标题",extension:"文件类型",size:"大小",objectType:"对象类型",objectID:"对象ID",gid:"全局标识",addedBy:"由谁添加",addedDate:"添加时间",downloads:"下载次数",extra:"备注",deleted:"已删除"}};function P(B){return _().get(B.toLowerCase())}function T(B,D){let W=P(B);if(!W)return;let R=D==="ls"?"list":D,Q=W.actions.find((X)=>String(X.name).toLowerCase()===R.toLowerCase());if(Q)return Q;if(!new Set(["list","get","create","update","delete"]).has(R)){let X=W.actions.find((w)=>w.type==="action"&&String(w.name).toLowerCase()===R.toLowerCase());if(X)return X}return}function x(B,D,W){let{roles:R}=W??{},Q=[],C=T(B,D);if(!C)return[];if(C.pathParams&&(!R||R.includes("path")))Object.entries(C.pathParams).forEach(([w,J])=>{if(typeof J==="string")J={description:J};Q.push({name:w,role:"path",required:!0,...J})});if(C.params&&(!R||R.includes("query")))Q.push(...C.params.map((w)=>({...w,role:"query"})));let X=C.requestBody?.schema;if(X&&(!R||R.includes("body")))if(X.type==="object"){let w=new Set(X.required?X.required.map((J)=>J.toLowerCase()):[]);Object.entries(X.properties).forEach(([J,V])=>{Q.push({name:J,role:"body",required:V.required??w.has(J.toLowerCase()),type:(V.type==="integer"?"number":V.type)??"string",...V})})}else Q.push({name:"data",role:"body",required:!0,type:X.type});return Q}function RB(){return k().map((B)=>B.name)}function QB(B){return BD[B]}function FB(B){if(Array.isArray(B))return B.filter((D)=>typeof D!=="function").map((D)=>FB(D));if(B&&typeof B==="object"){let D={};for(let[W,R]of Object.entries(B))if(typeof R!=="function")D[W]=FB(R);return D}return B}function CB(B={}){let D=B.raw??!1,W=B.jsonSafe??!0,R={};return _().forEach((Q)=>{let C=D?Q:{...Q,actions:Q.actions.map((X)=>{let{requestBody:w,...J}=X;return{...J,bodyParams:w?x(Q.name,X.name,{roles:["body"]}):[]}})};R[Q.name]=W?FB(C):C}),R}eB(zB);zB();var DD={product:"products",project:"projects",execution:"executions"},mD=new Set(Object.values(DD)),tD=["execution","project","product"];function uD(B){let{scope:D,scopeID:W}=B;if(!Z(D)&&!Z(W)){let R=String(D);if(!mD.has(R))throw new $("E_INVALID_PARAM",{param:"scope",value:R});let Q=Number(W);if(Number.isNaN(Q))throw new $("E_INVALID_PARAM",{param:"scopeID",value:String(W)});return{scope:R,scopeID:Q}}for(let R of tD){let Q=B[R]??B[`${R}ID`];if(Z(Q))continue;let C=Number(Q);if(!Number.isNaN(C))return{scope:DD[R],scopeID:C}}return}function iD(B,D){return B.path.replace(/\{(\w+)\}/g,(W,R)=>{let Q=D[R];if(Z(Q))throw new $("E_MISSING_PARAM",{param:R});return String(Q)})}function nD(B){if(B===void 0)return;if(typeof B==="string")try{let D=JSON.parse(B);return G(D)?D:void 0}catch{return}return G(B)?B:void 0}var pD=new Set(["true","1","yes","on"]),sD=new Set(["false","0","no","off"]);function lD(B,D,W,R=!1){if(B===void 0||B===null)return B;if(D==="number"||D==="integer"){let Q=Number(B);return Number.isNaN(Q)?B:Q}if(D==="boolean"){if(typeof B==="boolean")return B;if(typeof B==="number"){if(B===1)return!0;if(B===0)return!1;throw new $("E_INVALID_PARAM",{param:W,value:String(B)})}if(typeof B==="string"){let Q=B.trim().toLowerCase();if(pD.has(Q))return!0;if(sD.has(Q))return!1;throw new $("E_INVALID_PARAM",{param:W,value:B})}throw new $("E_INVALID_PARAM",{param:W,value:String(B)})}if(D==="array"){if(Array.isArray(B))return B;if(typeof B==="string")return B.split(",");if(R&&G(B))return B;return[B]}return B}function rD(B,D,W){let R={},Q=Object.keys(D.pathParams??{});if(Q.includes("scope")){let V=uD(W);if(!V)throw new $("E_MISSING_PARAM",{param:"scope/scopeID or product/project/execution"});R.scope=V.scope,R.scopeID=V.scopeID}let C=Q.find((V)=>V.endsWith("ID")&&V!=="scopeID"),X=W.id??W[`${B.name}ID`]??(C?W[C]:void 0),w=X===void 0?Number.NaN:Number(X),J=Number.isNaN(w)?void 0:w;if(C&&J!==void 0)R[C]=J;for(let V of Q){if(V==="scope"||V==="scopeID"||R[V]!==void 0)continue;let H=D.pathParams?.[V],Y=W[V];if(Y!==void 0){R[V]=Y;continue}if(typeof H==="object"){if(H.defaultValue!==void 0)R[V]=H.defaultValue;else if(H.options?.[0]?.value!==void 0)R[V]=H.options[0].value}if(R[V]===void 0)throw new $("E_MISSING_PARAM",{param:V})}return{values:R,id:J}}function aD(B,D){let W={};for(let R of B.params??[]){let Q=D[R.name];if(Q===void 0&&R.name==="pageID")Q=D.page;if(Q===void 0)Q=R.defaultValue??R.options?.[0]?.value;if(Q===void 0&&R.required)throw new $("E_MISSING_PARAM",{param:R.name});if(Q!==void 0)W[R.name]=Q}return W}function oD(B,D){let W=nD(D.data);if(B.requestBody?.schema?.type!=="object")return W;let R=W?{...W}:{},Q=B.requestBody.schema,C=new Set(Q.required??[]);for(let[X,w]of Object.entries(Q.properties??{})){let J=Object.prototype.hasOwnProperty.call(R,X),V=Object.prototype.hasOwnProperty.call(D,X),H=J?R[X]:V?D[X]:w.defaultValue;if(H===void 0&&(w.required||C.has(X)))throw new $("E_MISSING_PARAM",{param:X});let Y=lD(H,w.type,X,J);if(Y!==void 0)R[X]=Y}return R}function WD(B,D,W={}){let R=T(B.name,D);if(!R)throw new $("E_INVALID_ACTION",{module:B.name,action:D});let{values:Q,id:C}=rD(B,R,W);return{module:B.name,action:R,params:W,path:iD(R,Q),query:aD(R,W),data:oD(R,W),id:C}}function RD(B,D,W={}){let R=B.resultGetter;if(!R)return D.data??D;if(typeof R==="function")return R(D,W);if(typeof R==="string")return L(D,R);let Q={};for(let[C,X]of Object.entries(R))Q[C]=L(D,X);return Q}function QD(B,D,W={}){let R=B.pagerGetter;if(!R)return D.pager;if(typeof R==="function")return R(D,W);if(typeof R==="string")return L(D,R);let Q=L(D,R.pageID),C=L(D,R.recPerPage),X=L(D,R.recTotal);if(Q===void 0||C===void 0||X===void 0)return;return{pageID:Number(Q),recPerPage:Number(C),recTotal:Number(X)}}function eD(B){let D=B.split("/");if(D.length>2||!D[0])throw new $("E_INVALID_REQUEST_NAME");let[W,R]=D;if(!R?.length)return{moduleName:W,actionName:"list"};if(Number.isInteger(Number(R)))return{moduleName:W,actionName:"get",id:Number(R)};return{moduleName:W,actionName:R}}function BW(B){let D=B;if(typeof D==="string")try{D=JSON.parse(D)}catch{return new Set}if(D&&typeof D==="object"&&!Array.isArray(D))return new Set(Object.keys(D));return new Set}async function DW(B,D,W,R){let Q=D.requestBody?.schema?.properties,C=B.actions.find((V)=>V.type==="get");if(!Q||!C)return W;let X=(await XB(`${B.name}/${C.name}`,W,{client:R.client,timeout:R.timeout,insecure:R.insecure,throwOnFail:!0})).data;if(!G(X))return W;let w=BW(W.data),J={...W};for(let V of Object.keys(Q))if(!(Object.prototype.hasOwnProperty.call(W,V)||w.has(V))&&Object.prototype.hasOwnProperty.call(X,V))J[V]=X[V];return J}function WW(B){if(typeof B==="string")return B;if(B===void 0)return;try{return JSON.stringify(B)}catch{return String(B)}}function RW(B){for(let D of["code","errorCode","errno"]){let W=B[D];if(typeof W==="string"||typeof W==="number")return W}return}function QW(B){return Boolean(B.convert||B.filter&&B.filter.length>0||B.search&&B.search.length>0||B.sort||B.limit||B.pick&&B.pick.length>0)}function CW(B,D){if(Array.isArray(B)){if(!QW(D))return B;if(B.every(G))return j(B,{convert:D.convert,filter:D.filter,search:D.search,searchFields:D.searchFields,sort:D.sort,limit:D.limit,pick:D.pick});let W=Number(D.limit);return Number.isFinite(W)&&W>=0?B.slice(0,Math.floor(W)):B}if(G(B)&&(D.convertSingle||D.pick&&D.pick.length>0))return j(B,{convert:D.convertSingle,pick:D.pick});return B}function XW(B,D,W){if(!D||typeof D!=="object"||Array.isArray(D))return{status:"success",data:D};let R=D,Q=R.status==="fail"?"fail":"success",C=CW(RD(B.action,R,B.params),W),X=R.message,w=QD(B.action,R,B.params),J={status:Q,message:WW(X),data:C,pager:w?{total:Number(w.recTotal),page:Number(w.pageID),recPerPage:Number(w.recPerPage)}:void 0};if(X!==void 0&&typeof X!=="string")J.rawMessage=X;let V=RW(R);if(V!==void 0)J.apiCode=V;if(Q==="fail")J.raw=R;return J}async function XB(B,D={},W={}){let R=O(),Q=W.client??R.client;if(!Q)throw new $("E_NO_GLOBAL_CLIENT");let{moduleName:C,actionName:X,id:w}=eD(B),J=P(C);if(!J)throw new $("E_INVALID_MODULE",{module:C});let V=D.recPerPage??W.recPerPage??R.recPerPage,H={...D,...w!==void 0?{id:w}:{},...V!==void 0?{recPerPage:V}:{}},Y=T(C,X);if(!Y)throw new $("E_INVALID_ACTION",{module:C,action:X});let A=Y.type==="update"&&(W.autoFill??R.autoFill)?await DW(J,Y,H,W):H,g=WD(J,X,A),I=await Q.request(g.path,{method:String(g.action.method).toUpperCase(),query:g.query,body:g.data,timeout:W.timeout??R.timeout,insecure:W.insecure??R.insecure});if(W.raw)return I;let i={...W,limit:W.limit??R.limit},n=XW(g,I,i);if(n.status==="fail"&&(W.throwOnFail??R.throwOnFail))throw new $("E_API_FAILED",{message:n.message??""},n);return n}var _B="2026-08-12T03:04:33.420Z",PB="0.5.3";var ZB=globalThis;ZB.ZentaoAPI=$B;if(ZB.window)ZB.window.ZentaoAPI=$B;})();
1
+ (()=>{var{defineProperty:JB,getOwnPropertyNames:CD,getOwnPropertyDescriptor:XD}=Object,$D=Object.prototype.hasOwnProperty;function JD(B){return this[B]}var VD=(B)=>{var D=(EB??=new WeakMap).get(B),W;if(D)return D;if(D=JB({},"__esModule",{value:!0}),B&&typeof B==="object"||typeof B==="function"){for(var R of CD(B))if(!$D.call(D,R))JB(D,R,{get:JD.bind(B,R),enumerable:!(W=XD(B,R))||W.enumerable})}return EB.set(B,D),D},EB;var wD=(B)=>B;function YD(B,D){this[B]=wD.bind(null,D)}var MB=(B,D)=>{for(var W in D)JB(B,W,{get:D[W],enumerable:!0,configurable:!0,set:YD.bind(D,W)})};var $W={};MB($W,{switchProfile:()=>u,sortData:()=>b,setGlobalOptions:()=>h,searchData:()=>y,request:()=>XB,processData:()=>j,pickFieldsSingle:()=>M,pickFields:()=>N,getProfileKey:()=>K,getProfile:()=>KB,getObjectProps:()=>QB,getModuleNames:()=>RB,getModuleActionParams:()=>x,getModuleAction:()=>I,getModule:()=>Z,getGlobalOptions:()=>O,getAllProfiles:()=>gB,filterData:()=>r,extendModuleAction:()=>U,exportRegistry:()=>CB,deleteProfile:()=>IB,defineModules:()=>DB,defineModuleActions:()=>WB,addProfile:()=>m,ZentaoError:()=>$,ZentaoClient:()=>z,ZENTAO_PROFILES_STORAGE_KEY:()=>v,VERSION:()=>ZB,ERRORS:()=>p,BUILD:()=>_B});var $B={};MB($B,{switchProfile:()=>u,sortData:()=>b,setGlobalOptions:()=>h,searchData:()=>y,request:()=>XB,processData:()=>j,pickFieldsSingle:()=>M,pickFields:()=>N,getProfileKey:()=>K,getProfile:()=>KB,getObjectProps:()=>QB,getModuleNames:()=>RB,getModuleActionParams:()=>x,getModuleAction:()=>I,getModule:()=>Z,getGlobalOptions:()=>O,getAllProfiles:()=>gB,filterData:()=>r,extendModuleAction:()=>U,exportRegistry:()=>CB,deleteProfile:()=>IB,defineModules:()=>DB,defineModuleActions:()=>WB,addProfile:()=>m,ZentaoError:()=>$,ZentaoClient:()=>z,ZENTAO_PROFILES_STORAGE_KEY:()=>v,VERSION:()=>ZB,ERRORS:()=>p,BUILD:()=>_B});var p={E_INVALID_BASE_URL:"Invalid ZenTao baseUrl.",E_NO_GLOBAL_CLIENT:"No global client configured. Call ZentaoClient.init() or pass options.client.",E_HTTP_ERROR:"HTTP request failed: {status} {statusText}",E_NETWORK_ERROR:"Network request failed: {message}",E_TIMEOUT:"Request timed out.",E_INSECURE_BROWSER:"The insecure option is only supported in Node.js runtimes.",E_LOGIN_FAILED:"ZenTao login failed.",E_INVALID_PROFILE:"Invalid ZenTao profile.",E_NO_PROFILE:"No ZenTao profile is configured.",E_PROFILE_NOT_FOUND:"ZenTao profile not found: {profileKey}",E_PROFILE_STORAGE_INVALID:"ZenTao profile storage is not valid JSON.",E_PROFILE_STORAGE_UNAVAILABLE:"ZenTao profile storage is unavailable in this runtime.",E_INVALID_MODULE:"Unknown module: {module}",E_INVALID_ACTION:"Unknown action: {module}-{action}",E_INVALID_MODULE_DEFINITION:"Invalid module definition.",E_INVALID_ACTION_DEFINITION:"Invalid module action definition.",E_INDETERMINATE_ACTION_METHOD:'Cannot infer HTTP method for action "{action}" from type "{type}"; specify "method" explicitly.',E_INDETERMINATE_ACTION_RESULT_TYPE:'Cannot infer result type for action "{action}" from type "{type}"; specify "resultType" explicitly.',E_MISSING_PARAM:"Missing required parameter: {param}",E_INVALID_PARAM:"Invalid value for parameter {param}: {value}",E_INVALID_REQUEST_NAME:'Request name must use the form "moduleName", "moduleName/methodName", or "moduleName/<objectID>".',E_API_FAILED:"ZenTao API returned failure: {message}"};class $ extends Error{code;details;constructor(B,D,W){let R=p[B];if(D)for(let[Q,C]of Object.entries(D))R=R.replaceAll(`{${Q}}`,String(C));super(R);this.name="ZentaoError",this.code=B,this.details=W}}function s(){return typeof process<"u"&&Boolean(process.versions?.node)}function kB(B){return import(B)}function HD(B){let D={};return new Headers(B).forEach((W,R)=>{D[R]=W}),D}function GD(B){let D=new Headers;for(let[W,R]of Object.entries(B)){if(R===void 0)continue;D.set(W,Array.isArray(R)?R.join(", "):String(R))}return D}function VB(B,D){let W=D.toLowerCase();return Object.keys(B).some((R)=>R.toLowerCase()===W)}async function LD(B,D){if(B===void 0||B===null)return;if(typeof B==="string")return B;if(B instanceof Uint8Array)return B;if(B instanceof ArrayBuffer)return new Uint8Array(B);if(ArrayBuffer.isView(B))return new Uint8Array(B.buffer,B.byteOffset,B.byteLength);if(B instanceof Blob){if(B.type&&!VB(D,"content-type"))D["content-type"]=B.type;return new Uint8Array(await B.arrayBuffer())}if(typeof FormData<"u"&&B instanceof FormData){let W=new Request("https://zentao-api.local/",{method:"POST",body:B}),R=W.headers.get("content-type");if(R&&!VB(D,"content-type"))D["content-type"]=R;return new Uint8Array(await W.arrayBuffer())}if(typeof URLSearchParams<"u"&&B instanceof URLSearchParams){if(!VB(D,"content-type"))D["content-type"]="application/x-www-form-urlencoded;charset=UTF-8";return B.toString()}return String(B)}function xB(){return new DOMException("The operation was aborted.","AbortError")}function qD(B){let D=B.reduce((Q,C)=>Q+C.byteLength,0),W=new Uint8Array(D),R=0;for(let Q of B)W.set(Q,R),R+=Q.byteLength;return W.buffer}async function AD(B,D,W){let R=new URL(B),Q=R.protocol==="https:"?await kB("node:https"):await kB("node:http"),C=HD(D.headers),X=await LD(D.body,C);return new Promise((J,V)=>{if(D.signal?.aborted){V(xB());return}let w=Q.request(R,{method:D.method??"GET",headers:C,rejectUnauthorized:W},(A)=>{let g=[];A.on("data",(T)=>{g.push(typeof T==="string"?new TextEncoder().encode(T):T)}),A.on("end",()=>{H();let T=g.length>0?qD(g):void 0,i=new Response(T,{status:A.statusCode??200,statusText:A.statusMessage??"",headers:GD(A.headers)});Object.defineProperty(i,"url",{value:B}),J(i)})}),H=()=>{D.signal?.removeEventListener("abort",Y)},Y=()=>{H(),w.destroy(xB())};if(w.on("error",(A)=>{H(),V(A)}),D.signal?.addEventListener("abort",Y,{once:!0}),X!==void 0)w.write(X);w.end()})}function wB(B){if(B&&!s())throw new $("E_INSECURE_BROWSER")}async function hB(B,D,W){if(!B)return fetch(D,W);return wB(B),AD(D,W,!1)}var YB={};function O(){return{...YB}}function h(B){YB={...YB,...B}}function G(B){return Boolean(B)&&typeof B==="object"&&!Array.isArray(B)}function P(B){return B===void 0||B===null||B===""}function L(B,D){let W=D.split("."),R=B;for(let Q of W){if(R===null||R===void 0||typeof R!=="object")return;R=R[Q]}return R}function S(B){return Array.isArray(B)?B:[B]}function E(B){let D=B.trim().replace(/\/+$/,"");if(!D)throw new $("E_INVALID_BASE_URL");let W=D.replace(/\/api\.php\/v2$/i,""),R;try{R=new URL(W)}catch{throw new $("E_INVALID_BASE_URL")}if(!["http:","https:"].includes(R.protocol)||R.search||R.hash)throw new $("E_INVALID_BASE_URL");return R.toString().replace(/\/+$/,"")}function M(B,D){let W={};for(let R of D){let Q=L(B,R);if(Q===void 0)continue;let C=R.split("."),X=W;for(let J=0;J<C.length-1;J++){let V=C[J];if(!G(X[V]))X[V]={};X=X[V]}X[C[C.length-1]]=Q}return W}function N(B,D){return B.map((W)=>M(W,D))}function f(B,D){let W=Number(B),R=Number(D);if(B!==""&&D!==""&&!Number.isNaN(W)&&!Number.isNaN(R))return W-R;return String(B).localeCompare(String(D))}function fB(B,D){let W=Number(B),R=Number(D);if(B!==""&&D!==""&&!Number.isNaN(W)&&!Number.isNaN(R))return W===R;return String(B)===String(D)}function NB(B,D){if(B===void 0||B===null)return!1;let W=String(B).toLowerCase();return S(D).some((R)=>W.includes(String(R).toLowerCase()))}function yB(B,D){let W=L(B,D.key),{operator:R,value:Q}=D;switch(R){case"=":return S(Q).some((C)=>fB(W,C));case"!=":return S(Q).every((C)=>!fB(W,C));case"~":return NB(W,Q);case"!~":return!NB(W,Q);case">":return f(W,Q)>0;case"<":return f(W,Q)<0;case">=":return f(W,Q)>=0;case"<=":return f(W,Q)<=0;default:return!1}}function bB(B,D){if(D.conditions.length===0)return!0;return D.operator==="OR"?D.conditions.some((W)=>yB(B,W)):D.conditions.every((W)=>yB(B,W))}function r(B,D){if(D.length===0)return B.slice();return B.filter((W)=>D.every((R)=>bB(W,R)))}function GB(B){let D=[],W="",R,Q=0,C=!1;for(let X of B){if(C){W+=X,C=!1;continue}if(R){if(W+=X,X==="\\")C=!0;else if(X===R)R=void 0;continue}if(X==='"'||X==="'"){R=X,W+=X;continue}if(X==="[")Q+=1;else if(X==="]"&&Q>0)Q-=1;if(X===","&&Q===0)D.push(W.trim()),W="";else W+=X}return D.push(W.trim()),D.filter(Boolean)}function HB(B){let D=B.trim(),W=D[0];return D.length>=2&&(W==='"'||W==="'")&&D.at(-1)===W?D.slice(1,-1):D}function l(B,D){if(B===null||B===void 0)return;if(Array.isArray(B))for(let W of B)l(W,D);else if(G(B))for(let W of Object.values(B))l(W,D);else D.push(String(B))}function UD(B,D){let W=[];if(D&&D.length>0)for(let R of D)l(L(B,R),W);else l(B,W);return W.join("\x00").toLowerCase()}function y(B,D,W){let R=D.map((Q)=>GB(Q).map((C)=>HB(C).toLowerCase()).filter(Boolean)).filter((Q)=>Q.length>0);if(R.length===0)return B.slice();return B.filter((Q)=>{let C=UD(Q,W);return R.some((X)=>X.every((J)=>C.includes(J)))})}function gD(B){if(typeof B==="function")return B;let D=B.match(/^(.+):(asc|desc)$/i)??B.match(/^(.+)_(asc|desc)$/i),W=D?.[1]??B,Q=(D?.[2].toLowerCase()??"asc")==="desc"?-1:1;return(C,X)=>f(L(C,W),L(X,W))*Q}function b(B,D){let W=D.map(gD);return B.slice().sort((R,Q)=>{for(let C of W){let X=C(R,Q);if(X!==0)return X}return 0})}var KD=[">=","<=","!=","!~","=","~",">","<",":"];function ID(B){let D=B.trim();if(D.startsWith("[")&&D.endsWith("]"))return GB(D.slice(1,-1)).map(HB).filter(Boolean);let W=HB(D);if(W==="true")return!0;if(W==="false")return!1;if(W!==""&&!Number.isNaN(Number(W)))return Number(W);return W}function TD(B){let D,W=0,R=!1;for(let Q=0;Q<B.length;Q+=1){let C=B[Q];if(R){R=!1;continue}if(D){if(C==="\\")R=!0;else if(C===D)D=void 0;continue}if(C==='"'||C==="'"){D=C;continue}if(C==="["){W+=1;continue}if(C==="]"&&W>0){W-=1;continue}if(W>0)continue;let X=KD.find((J)=>B.startsWith(J,Q));if(X&&Q>0)return{index:Q,operator:X}}return}function OD(B){let D=TD(B);if(!D)return;let W=B.slice(0,D.index).trim();if(!W)return;return{key:W,operator:D.operator===":"?"=":D.operator,value:ID(B.slice(D.index+D.operator.length))}}function SD(B){let D=GB(B);if(D.length===0)return;let W=D.map(OD);if(W.some((R)=>R===void 0))return;return{operator:"AND",conditions:W}}function jD(B){if(B===void 0||B==="")return;let D=Number(B);if(!Number.isFinite(D)||D<0)return;return Math.floor(D)}function j(B,D){if(!Array.isArray(B)){let C=D,X=C.convert?C.convert(B):B;return C.pick?M(X,C.pick):{...X}}let W=D,R=W.convert?W.convert(B):B;if(W.filter&&W.filter.length>0){let C=W.filter.map(SD).filter((X)=>X!==void 0);if(C.length>0)R=R.filter((X)=>C.some((J)=>bB(X,J)))}if(W.search&&W.search.length>0)R=y(R,W.search,W.searchFields);if(W.sort){let C=W.sort.split(",").map((X)=>X.trim()).filter(Boolean);if(C.length>0)R=b(R,C)}let Q=jD(W.limit);if(Q!==void 0)R=R.slice(0,Q);if(W.pick)R=N(R,W.pick);return R}var v="ZENTAO_PROFILES",zD=[".config","zentao","zentao.json"];function cB(B){return Boolean(B)&&typeof B==="object"&&!Array.isArray(B)}function mB(B){if(B===void 0)return B;return JSON.parse(JSON.stringify(B))}function uB(){return new Date().toISOString()}function d(B){return import(B)}var dB=Promise.resolve();function LB(B){let D=dB.then(B,B);return dB=D.catch(()=>{return}),D}function tB(){try{return globalThis.localStorage}catch{return}}async function iB(){let B=await d("node:path"),D=process.env.HOME??process.env.USERPROFILE??(await d("node:os")).homedir();if(!D)throw new $("E_PROFILE_STORAGE_UNAVAILABLE");return B.join(D,...zD)}function FD(B,D){let W=B.trim(),R=E(D);if(!W)throw new $("E_INVALID_PROFILE");return`${W}@${R}`}function qB(B){if(!cB(B)||typeof B.server!=="string"||typeof B.account!=="string"||typeof B.token!=="string")throw new $("E_INVALID_PROFILE");let D=B.token.trim();if(!D)throw new $("E_INVALID_PROFILE");let W=mB(B);return delete W.key,{...W,server:E(B.server),account:B.account.trim(),token:D}}function nB(B){if(!cB(B))return{profiles:[]};let D=Array.isArray(B.profiles)?B.profiles.flatMap((R)=>{try{return[qB(R)]}catch{return[]}}):[],W=typeof B.currentProfile==="string"?B.currentProfile:void 0;return W?{currentProfile:W,profiles:D}:{profiles:D}}function vB(B){try{return nB(JSON.parse(B))}catch(D){throw new $("E_PROFILE_STORAGE_INVALID",void 0,D)}}async function c(){if(s()){let W=await d("node:fs/promises"),R=await iB();try{return vB(await W.readFile(R,"utf8"))}catch(Q){if(Q.code==="ENOENT")return{profiles:[]};throw Q}}let B=tB();if(!B)throw new $("E_PROFILE_STORAGE_UNAVAILABLE");let D=B.getItem(v);return D?vB(D):{profiles:[]}}async function AB(B){let D=nB(B),W=`${JSON.stringify(D,null,2)}
2
+ `;if(s()){let Q=await d("node:fs/promises"),C=await d("node:path"),X=await iB(),J=C.dirname(X),V=C.join(J,`.zentao.${Date.now()}.${Math.random().toString(36).slice(2)}.tmp`);await Q.mkdir(J,{recursive:!0,mode:448}),await Q.chmod(J,448).catch(()=>{return});try{await Q.writeFile(V,W,{encoding:"utf8",mode:384}),await Q.rename(V,X),await Q.chmod(X,384).catch(()=>{return})}catch(w){throw await Q.rm(V,{force:!0}).catch(()=>{return}),w}return}let R=tB();if(!R)throw new $("E_PROFILE_STORAGE_UNAVAILABLE");R.setItem(v,W)}function a(B){let D=qB(B);return{...mB(D),key:K(D)}}function UB(B,D){return B.profiles.find((W)=>K(W)===D)}function _D(B){if(!B.currentProfile||!UB(B,B.currentProfile)){let D=B.profiles.at(-1);B.currentProfile=D?K(D):void 0}}function K(B){return FD(B.account,B.server)}async function gB(){return(await c()).profiles.map(a)}async function KB(B){let D=await c(),W=B??D.currentProfile;if(!W)return;let R=UB(D,W);return R?a(R):void 0}function m(B){return LB(async()=>{let D=await c(),W=uB(),R=qB({...B,loginTime:B.loginTime??W,lastUsedTime:B.lastUsedTime??W}),Q=K(R),C=D.profiles.findIndex((X)=>K(X)===Q);if(C>=0)D.profiles[C]=R;else D.profiles.push(R);return D.currentProfile=Q,await AB(D),a(R)})}function IB(B){return LB(async()=>{let D=await c(),W=D.profiles.filter((R)=>K(R)!==B);if(W.length===D.profiles.length)return!1;return D.profiles=W,_D(D),await AB(D),!0})}function u(B){return LB(async()=>{let D=await c(),W=B??D.currentProfile;if(!W)throw new $("E_NO_PROFILE");let R=UB(D,W);if(!R)throw new $("E_PROFILE_NOT_FOUND",{profileKey:W});return R.lastUsedTime=uB(),D.currentProfile=W,await AB(D),a(R)})}var ZD=1e4;function PD(B,D,W){let R=D.startsWith("/")?D:`/${D}`,Q=new URL(`${B}${R}`);for(let[C,X]of Object.entries(W??{})){if(X===void 0)continue;Q.searchParams.set(C,String(X))}return Q.toString()}function ED(B){if(!B||typeof B!=="object")return!1;let D=Object.getPrototypeOf(B);return D===Object.prototype||D===null}function o(B,D){let W=globalThis[D];return typeof W==="function"&&B instanceof W}function MD(B){return B instanceof ArrayBuffer||ArrayBuffer.isView(B)}function pB(B,D,W){if(W===void 0)return;if(Array.isArray(W)){for(let R of W)pB(B,D,R);return}B.append(D,W===null?"":String(W))}function kD(B,D,W){if(B===void 0||B===null)return;if(D==="form"){let R=B instanceof URLSearchParams?B:new URLSearchParams;if(!(B instanceof URLSearchParams)&&ED(B))for(let[Q,C]of Object.entries(B))pB(R,Q,C);else if(!(B instanceof URLSearchParams))throw new $("E_INVALID_PARAM",{param:"body",value:String(B)});if(!W.has("Content-Type"))W.set("Content-Type","application/x-www-form-urlencoded;charset=UTF-8");return R}if(D==="raw"||typeof B==="string"||MD(B)||o(B,"FormData")||o(B,"URLSearchParams")||o(B,"Blob")||o(B,"ReadableStream"))return B;if(!W.has("Content-Type"))W.set("Content-Type","application/json");return JSON.stringify(B)}function xD(B,D){let W=new AbortController,R=()=>W.abort(D?.reason),Q=setTimeout(()=>W.abort(),B);if(D?.aborted)R();else D?.addEventListener("abort",R,{once:!0});return{signal:W.signal,cleanup:()=>{clearTimeout(Q),D?.removeEventListener("abort",R)}}}async function hD(B,D="auto"){if(D==="response")return B;if(D==="arrayBuffer")return B.arrayBuffer();if(D==="blob")return B.blob();if(D==="text")return B.text();if(D==="json"){let R=await B.text();return R===""?void 0:JSON.parse(R)}let W=await B.text();if(W==="")return;try{return JSON.parse(W)}catch{return W}}class z{siteUrl;baseUrl;token;timeout;insecure;constructor(B){let D=typeof B==="string"?{baseUrl:B}:B;this.siteUrl=E(D.baseUrl),this.baseUrl=`${this.siteUrl}/api.php/v2`,this.token=D.token,this.timeout=D.timeout,this.insecure=D.insecure}async request(B,D={}){let W=O(),R=D.method??"GET",Q=D.timeout??W.timeout??this.timeout??ZD,C=D.insecure??W.insecure??this.insecure;wB(C);let X=PD(this.baseUrl,B,D.query),J=new Headers(D.headers);if(this.token)J.set("Token",this.token);let{signal:V,cleanup:w}=xD(Q,D.signal),H={method:R,headers:J,signal:V};if(D.body!==void 0&&R!=="GET")H.body=kD(D.body,D.bodyType,J);try{let Y=await hB(C,X,H);if(!Y.ok)throw new $("E_HTTP_ERROR",{status:Y.status,statusText:Y.statusText},{url:Y.url,status:Y.status,statusText:Y.statusText,body:await Y.text().catch(()=>{return})});return hD(Y,D.responseType)}catch(Y){if(Y instanceof $)throw Y;if(Y instanceof DOMException&&Y.name==="AbortError")throw new $("E_TIMEOUT");throw new $("E_NETWORK_ERROR",{message:Y.message??String(Y)},Y)}finally{w()}}async get(B,D={}){return this.request(B,{...D,method:"GET"})}async post(B,D,W={}){return this.request(B,{...W,method:"POST",body:D})}async put(B,D,W={}){return this.request(B,{...W,method:"PUT",body:D})}async delete(B,D={}){return this.request(B,{...D,method:"DELETE"})}async login(B,D){let W=await this.post("/users/login",{account:B,password:D});if(W.status!=="success"||!W.token)throw new $("E_LOGIN_FAILED");this.token=W.token;let R=O();if(R.persistProfiles){let Q={},C=this.timeout??R.timeout,X=this.insecure??R.insecure;if(C!==void 0)Q.timeout=C;if(X!==void 0)Q.insecure=X;await m({server:this.siteUrl,account:B,token:W.token,user:G(W.user)?W.user:void 0,serverConfig:G(W.serverConfig)?W.serverConfig:void 0,config:Object.keys(Q).length>0?Q:void 0})}return W.token}static create(B){return new z(B)}static init(B){let D=new z(B);return h({client:D}),D}static async fromProfile(B){let D=await u(B);return new z({baseUrl:D.server,token:D.token,timeout:typeof D.config?.timeout==="number"?D.config.timeout:void 0,insecure:typeof D.config?.insecure==="boolean"?D.config.insecure:void 0})}}var sB=[{name:"user",display:"用户",description:"用户管理,支持获取用户列表、创建用户、获取用户详情、修改用户信息、删除用户",actions:[{name:"list",display:"获取用户列表",type:"list",method:"get",path:"/users",resultType:"list",pagerGetter:"pager",resultGetter:"users",params:[{name:"browseType",required:!1,type:"string",description:"浏览类型",options:[{value:"inside",label:"内部用户"},{value:"outside",label:"内部用户"}]},{name:"orderBy",required:!1,type:"string",description:"排序",options:[{value:"id_asc",label:"ID 升序"},{value:"id_desc",label:"ID 降序"},{value:"realname_asc",label:"姓名 升序"},{value:"realname_desc",label:"姓名 降序"},{value:"account_asc",label:"用户名 升序"},{value:"account_desc",label:"用户名 降序"}]},{name:"recPerPage",required:!1,type:"number",description:"每页数量,不超过1000"},{name:"pageID",required:!1,type:"number",description:"页码,从第1页开始"}]},{name:"create",display:"创建用户",type:"create",method:"post",path:"/users",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{account:{type:"string",description:"登录名"},realname:{type:"string",description:"姓名"},password:{type:"string",description:"密码"}},required:["account","realname","password"]}}},{name:"get",display:"获取用户详情",type:"get",method:"get",path:"/users/{userID}",resultType:"object",resultGetter:"user",pathParams:{userID:"用户ID"}},{name:"update",display:"修改用户信息",type:"update",method:"put",path:"/users/{userID}",resultType:"object",pathParams:{userID:"用户ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{realname:{type:"string",description:"真实姓名"},dept:{type:"integer",description:"部门",format:"int32"},join:{type:"string",description:"入职日期"},group:{type:"array",items:{type:"string"},description:"权限分组"},email:{type:"string",description:"邮箱"},visions:{type:"array",items:{type:"string"},description:"界面类型(研发综合界面 rnd | 运营管理界面 lite)"},mobile:{type:"string",description:"手机"},weixin:{type:"string",description:"微信"},password:{type:"string",description:"密码"}}}}},{name:"delete",display:"删除用户",type:"delete",method:"delete",path:"/users/{userID}",resultType:"text",pathParams:{userID:"用户ID"}}]},{name:"program",display:"项目集",description:"项目集管理,支持获取项目集列表、创建项目集、获取项目集详情、修改项目集、删除项目集",actions:[{name:"list",display:"获取项目集列表",type:"list",method:"get",path:"/programs",resultType:"list",pagerGetter:"pager",resultGetter:"programs",params:[{name:"status",required:!1,type:"string",description:"状态",options:[{value:"all",label:"全部"},{value:"unclosed",label:"未关闭"},{value:"wait",label:"未开始"},{value:"doing",label:"进行中"},{value:"suspended",label:"已挂起"},{value:"delayed",label:"已延期"},{value:"closed",label:"已关闭"}]},{name:"orderBy",required:!1,type:"string",description:"排序",options:[{value:"id_asc",label:"ID 升序"},{value:"id_desc",label:"ID 降序"},{value:"name_asc",label:"名称 升序"},{value:"name_desc",label:"名称 降序"},{value:"begin_asc",label:"计划开始 升序"},{value:"begin_desc",label:"计划开始 降序"},{value:"end_asc",label:"计划结束 升序"},{value:"end_desc",label:"计划结束 降序"}]},{name:"recPerPage",required:!1,type:"number",description:"每页数量,不超过1000"},{name:"pageID",required:!1,type:"number",description:"页码,从第1页开始"}]},{name:"create",display:"创建项目集",type:"create",method:"post",path:"/programs",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{name:{type:"string",description:"项目集名称"},begin:{type:"string",description:"计划开始日期"},end:{type:"string",description:"计划完成日期"},PM:{type:"string",description:"计划完成日期"},desc:{type:"string",description:"项目集描述"}},required:["name","begin","end"]}}},{name:"get",display:"获取项目集详情",type:"get",method:"get",path:"/programs/{programID}",resultType:"object",resultGetter:"program",pathParams:{programID:"项目集ID"}},{name:"update",display:"修改项目集",type:"update",method:"put",path:"/programs/{programID}",resultType:"object",pathParams:{programID:"项目集ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{name:{type:"string",description:"项目集名称"},begin:{type:"string",description:"计划开始日期"},end:{type:"string",description:"计划完成日期"},PM:{type:"string",description:"计划完成日期"},desc:{type:"string",description:"项目集描述"}},required:["name","begin","end"]}}},{name:"delete",display:"删除项目集",type:"delete",method:"delete",path:"/programs/{programID}",resultType:"text",pathParams:{programID:"项目集ID"}}]},{name:"product",display:"产品",description:"产品管理,支持获取产品列表、创建产品、获取产品详情、修改产品、删除产品",actions:[{name:"list",display:"获取产品列表",type:"list",method:"get",path:"/products",resultType:"list",pagerGetter:"pager",resultGetter:"products",params:[{name:"browseType",required:!1,type:"string",description:"浏览类型",options:[{value:"all",label:"全部"},{value:"noclosed",label:"未关闭"},{value:"closed",label:"已结束"}]},{name:"orderBy",required:!1,type:"string",description:"排序",options:[{value:"id_asc",label:"ID 升序"},{value:"id_desc",label:"ID 降序"},{value:"title_asc",label:"名称 升序"},{value:"title_desc",label:"名称 降序"},{value:"begin_asc",label:"计划开始 升序"},{value:"begin_desc",label:"计划开始 降序"},{value:"end_asc",label:"计划结束 升序"},{value:"end_desc",label:"计划结束 降序"}]},{name:"recPerPage",required:!1,type:"number",description:"每页数量,不超过1000"},{name:"pageID",required:!1,type:"number",description:"页码,从第1页开始"}]},{name:"create",display:"创建产品",type:"create",method:"post",path:"/products",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{name:{type:"string",description:"产品名称"},program:{type:"integer",description:"所属项目集",format:"int32"},line:{type:"integer",description:"所属产品线",format:"int32"},type:{type:"string",description:"类型(normal 正常 | branch 多分支 | platform 多平台)"},PO:{type:"string",description:"产品负责人"},reviewer:{type:"array",items:{type:"string"},description:"评审人"},desc:{type:"array",items:{type:"string"},description:"产品描述"},QD:{type:"string",description:"测试负责人"},RD:{type:"string",description:"发布负责人"},acl:{type:"string",description:"访问控制(open 公开 | private 私有)"}},required:["name"]}}},{name:"get",display:"获取产品详情",type:"get",method:"get",path:"/products/{productID}",resultType:"object",resultGetter:"product",pathParams:{productID:"产品ID"}},{name:"update",display:"修改产品",type:"update",method:"put",path:"/products/{productID}",resultType:"object",pathParams:{productID:"产品ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{name:{type:"string",description:"产品名称"},program:{type:"integer",description:"所属项目集",format:"int32"},line:{type:"integer",description:"所属产品线",format:"int32"},type:{type:"string",description:"类型(normal 正常 | branch 多分支 | platform 多平台)"},PO:{type:"string",description:"产品负责人"},reviewer:{type:"array",items:{type:"string"},description:"评审人"},desc:{type:"array",items:{type:"string"},description:"产品描述"},QD:{type:"string",description:"测试负责人"},RD:{type:"string",description:"发布负责人"},acl:{type:"string",description:"访问控制(open 公开 | private 私有)"}},required:["name"]}}},{name:"delete",display:"删除产品",type:"delete",method:"delete",path:"/products/{productID}",resultType:"text",pathParams:{productID:"产品ID"}}]},{name:"project",display:"项目",description:"项目管理,支持获取项目列表、创建项目、修改项目、删除项目",actions:[{name:"list",display:"获取项目列表",type:"list",method:"get",path:"/projects",resultType:"list",pagerGetter:"pager",resultGetter:"projects",params:[{name:"browseType",required:!1,type:"string",description:"项目状态,默认是undone",defaultValue:"undone",options:[{value:"all",label:"全部"},{value:"undone",label:"未完成"},{value:"wait",label:"未开始"},{value:"doing",label:"进行中"}]},{name:"orderBy",required:!1,type:"string",description:"排序",options:[{value:"id_asc",label:"ID 升序"},{value:"id_desc",label:"ID 降序"},{value:"name_asc",label:"名称 升序"},{value:"name_desc",label:"名称 降序"},{value:"begin_asc",label:"计划开始 升序"},{value:"begin_desc",label:"计划开始 降序"},{value:"end_asc",label:"计划结束 升序"},{value:"end_desc",label:"计划结束 降序"}]},{name:"recPerPage",required:!1,type:"number",description:"每页数量,不超过1000"},{name:"pageID",required:!1,type:"number",description:"页码,从第1页开始"}]},{name:"create",display:"创建项目",type:"create",method:"post",path:"/projects",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{name:{type:"string",description:"项目名称"},model:{type:"string",description:"项目管理方式(scrum 敏捷 | waterfall 瀑布 | kanban 看板 | agileplus 融合敏捷 | waterfallplus 融合瀑布)"},begin:{type:"string",description:"开始日期"},end:{type:"string",description:"结束日期"},products:{type:"array",items:{type:"string"},description:"关联产品"},parent:{type:"integer",description:"所属项目集",format:"int32"},workflowGroup:{type:"integer",description:"项目流程,付费版功能,开源版可以不填",format:"int32"},PM:{type:"string",description:"项目负责人"}},required:["name","model","begin","end","workflowGroup"]}}},{name:"update",display:"修改项目",type:"update",method:"put",path:"/projects/{projectID}",resultType:"object",pathParams:{projectID:"项目ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{name:{type:"string",description:"项目名称"},model:{type:"string",description:"项目管理方式(scrum 敏捷 | waterfall 瀑布 | kanban 看板 | agileplus 融合敏捷 | waterfallplus 融合瀑布)"},begin:{type:"string",description:"开始日期"},end:{type:"string",description:"结束日期"},products:{type:"array",items:{type:"string"},description:"关联产品"},parent:{type:"integer",description:"所属项目集",format:"int32"},workflowGroup:{type:"integer",description:"项目流程,付费版功能,开源版可以不填",format:"int32"},PM:{type:"string",description:"项目负责人"}},required:["name","model","begin","end","workflowGroup"]}}},{name:"delete",display:"删除项目",type:"delete",method:"delete",path:"/projects/{projectID}",resultType:"text",pathParams:{projectID:"项目ID"}}]},{name:"execution",display:"执行",description:"执行管理,支持获取执行列表、创建执行、获取执行详情、修改执行、删除执行",actions:[{name:"list",display:"获取执行列表",type:"list",method:"get",path:"/executions",resultType:"list",pagerGetter:"pager",resultGetter:"executions",params:[{name:"status",required:!1,type:"string",description:"执行状态,默认是undone",defaultValue:"undone",options:[{value:"all",label:"全部"},{value:"undone",label:"未完成"},{value:"wait",label:"未开始"},{value:"doing",label:"进行中"}]},{name:"orderBy",required:!1,type:"string",description:"排序",options:[{value:"rawID_asc",label:"RAWID 升序"},{value:"rawID_desc",label:"RAWID 降序"},{value:"nameCol_asc",label:"名称 升序"},{value:"nameCol_desc",label:"名称 降序"},{value:"begin_asc",label:"计划开始 升序"},{value:"begin_desc",label:"计划开始 降序"},{value:"end_asc",label:"计划结束 升序"},{value:"end_desc",label:"计划结束 降序"}]},{name:"recPerPage",required:!1,type:"number",description:"每页数量,不超过1000"},{name:"pageID",required:!1,type:"number",description:"页码,从第1页开始"}]},{name:"create",display:"创建执行",type:"create",method:"post",path:"/executions",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{project:{type:"integer",description:"所属项目",format:"int32"},name:{type:"string",description:"迭代名称"},lifetime:{type:"string",description:"执行类型(short 短期 | long 长期 | ops 运维)"},begin:{type:"string",description:"开始日期"},end:{type:"string",description:"结束日期"},days:{type:"integer",description:"可用工作日",format:"int32"},products:{type:"array",items:{type:"string"},description:"关联产品"},plans:{type:"array",items:{type:"string"},description:"关联计划,必须是产品+planID的二维数组"},PO:{type:"string",description:"产品负责人"},QD:{type:"string",description:"测试负责人"},PM:{type:"string",description:"执行负责人"},RD:{type:"string",description:"发布负责人"},acl:{type:"string",description:"访问控制(open 公开 | private 私有)"}},required:["project","name","begin","end"]}}},{name:"get",display:"获取执行详情",type:"get",method:"get",path:"/executions/{executionID}",resultType:"object",resultGetter:"execution",pathParams:{executionID:"执行ID"}},{name:"update",display:"修改执行",type:"update",method:"put",path:"/executions/{executionID}",resultType:"object",pathParams:{executionID:"执行ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{project:{type:"integer",description:"所属项目",format:"int32"},name:{type:"string",description:"迭代名称"},lifetime:{type:"string",description:"执行类型(short 短期 | long 长期 | ops 运维)"},begin:{type:"string",description:"开始日期"},end:{type:"string",description:"结束日期"},days:{type:"integer",description:"可用工作日",format:"int32"},products:{type:"array",items:{type:"string"},description:"关联产品"},plans:{type:"array",items:{type:"string"},description:"关联计划,必须是产品+planID的二维数组"},PO:{type:"string",description:"产品负责人"},QD:{type:"string",description:"测试负责人"},PM:{type:"string",description:"执行负责人"},RD:{type:"string",description:"发布负责人"},acl:{type:"string",description:"访问控制(open 公开 | private 私有)"}},required:["name","begin","end"]}}},{name:"delete",display:"删除执行",type:"delete",method:"delete",path:"/executions/{executionID}",resultType:"text",pathParams:{executionID:"执行ID"}}]},{name:"productplan",display:"产品计划",description:"产品计划管理,支持获取产品计划列表,支持获取产品下的产品计划、创建产品计划、获取产品计划详情、修改产品计划、删除产品计划",actions:[{name:"list",display:"获取产品计划列表,支持获取产品下的产品计划",type:"list",method:"get",path:"/products/{productID}/productplans",resultType:"list",pagerGetter:"pager",resultGetter:"productplans",pathParams:{productID:"所属产品ID"},params:[{name:"browseType",required:!1,type:"string",description:"执行状态,默认是undone",defaultValue:"undone",options:[{value:"all",label:"全部"},{value:"undone",label:"未完成"},{value:"wait",label:"未开始"},{value:"doing",label:"进行中"}]},{name:"orderBy",required:!1,type:"string",description:"排序",options:[{value:"id_asc",label:"ID 升序"},{value:"id_desc",label:"ID 降序"},{value:"title_asc",label:"名称 升序"},{value:"title_desc",label:"名称 降序"},{value:"begin_asc",label:"开始日期 升序"},{value:"begin_desc",label:"开始日期 降序"},{value:"end_asc",label:"结束日期 升序"},{value:"end_desc",label:"结束日期 降序"},{value:"status_asc",label:"状态 升序"}]},{name:"recPerPage",required:!1,type:"number",description:"每页数量,不超过1000"},{name:"pageID",required:!1,type:"number",description:"页码,从第1页开始"}]},{name:"create",display:"创建产品计划",type:"create",method:"post",path:"/productplans",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{productID:{type:"integer",description:"产品ID",format:"int32"},title:{type:"string",description:"计划名称"},parent:{type:"integer",description:"父计划ID",format:"int32"},begin:{type:"string",description:"开始日期"},end:{type:"string",description:"结束日期"},branchID:{type:"integer",description:"分支ID",format:"int32"},desc:{type:"string",description:"计划描述"}},required:["productID","title"]}}},{name:"get",display:"获取产品计划详情",type:"get",method:"get",path:"/productplans/{planID}",resultType:"object",resultGetter:"productplan",pathParams:{planID:"产品计划ID"}},{name:"update",display:"修改产品计划",type:"update",method:"put",path:"/productplans/{productplanID}",resultType:"object",pathParams:{productplanID:"产品计划ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{title:{type:"string",description:"计划名称"},parent:{type:"integer",description:"父计划",format:"int32"},begin:{type:"string",description:"开始日期"},end:{type:"string",description:"结束日期"},branchID:{type:"integer",description:"分支ID",format:"int32"},desc:{type:"string",description:"计划描述"}},required:["title"]}}},{name:"delete",display:"删除产品计划",type:"delete",method:"delete",path:"/productplans/{productplanID}",resultType:"text",pathParams:{productplanID:"产品计划ID"}}]},{name:"story",display:"需求",description:"需求管理,支持获取需求列表,支持获取产品/项目/执行下的需求、创建需求、获取需求详情、修改需求、删除需求、激活需求、变更需求、关闭需求",actions:[{name:"list",display:"获取需求列表,支持获取产品/项目/执行下的需求",type:"list",method:"get",path:"/{scope}/{scopeID}/stories",resultType:"list",pagerGetter:"pager",resultGetter:"stories",pathParams:{scope:{description:"需求所属范围",options:[{value:"products",label:"产品"},{value:"projects",label:"项目"},{value:"executions",label:"执行"}]},scopeID:"所属范围ID"},params:[{name:"browseType",required:!1,type:"string",description:"状态,默认是unclosed",defaultValue:"unclosed",options:[{value:"allstory",label:"全部"},{value:"assignedtome",label:"指派给我"},{value:"openedbyme",label:"我创建"},{value:"reviewbyme",label:"待我评审"},{value:"draftstory",label:"草稿"}]},{name:"orderBy",required:!1,type:"string",description:"排序",options:[{value:"id_asc",label:"ID 升序"},{value:"id_desc",label:"ID 降序"},{value:"title_asc",label:"标题 升序"},{value:"title_desc",label:"标题 降序"},{value:"status_asc",label:"状态 升序"},{value:"status_desc",label:"状态 降序"}]},{name:"recPerPage",required:!1,type:"number",description:"每页数量,不超过1000"},{name:"pageID",required:!1,type:"number",description:"页码,从第1页开始"}]},{name:"create",display:"创建需求",type:"create",method:"post",path:"/stories",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{productID:{type:"integer",description:"产品ID",format:"int32"},title:{type:"string"},pri:{type:"integer",description:"优先级,默认是3",format:"int32"},module:{type:"integer",description:"所属模块",format:"int32"},parent:{type:"integer",description:"父需求",format:"int32"},estimate:{type:"number",description:"预计工时",format:"float"},spec:{type:"string",description:"需求描述"},category:{type:"integer",description:"类别(feature 功能 | interface 接口 | performance 性能 | safe 安全 | experience 体验 | improve 改进 | other 其他)",format:"int32"},source:{type:"string",description:"来源(customer 客户 | user 用户 | po 产品经理 | market 市场 | service 客服 | operation 运营 | support 技术支持 | competitor 竞争对手 | partner 合作伙伴 | dev 开发人员 | tester 测试人员 | bug Bug | forum 论坛 | other 其他)"},verify:{type:"string",description:"验收标准"},assignedTo:{type:"string",description:"指派给"},reviewer:{type:"array",items:{type:"string"},description:"评审人,如果设置必须评审,必须填写"},project:{type:"integer",description:"所属项目",format:"int32"},execution:{type:"integer",description:"所属执行",format:"int32"}},required:["productID","title"]}}},{name:"get",display:"获取需求详情",type:"get",method:"get",path:"/stories/{storyID}",resultType:"object",resultGetter:"story",pathParams:{storyID:"需求ID"}},{name:"update",display:"修改需求",type:"update",method:"put",path:"/stories/{storyID}",resultType:"object",pathParams:{storyID:"需求ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{title:{type:"string"},pri:{type:"integer",description:"优先级,默认是3",format:"int32"},module:{type:"integer",description:"所属模块",format:"int32"},parent:{type:"integer",description:"父需求",format:"int32"},estimate:{type:"number",description:"预计工时",format:"float"},category:{type:"integer",description:"类别(feature 功能 | interface 接口 | performance 性能 | safe 安全 | experience 体验 | improve 改进 | other 其他)",format:"int32"},source:{type:"string",description:"来源(customer 客户 | user 用户 | po 产品经理 | market 市场 | service 客服 | operation 运营 | support 技术支持 | competitor 竞争对手 | partner 合作伙伴 | dev 开发人员 | tester 测试人员 | bug Bug | forum 论坛 | other 其他)"},assignedTo:{type:"string",description:"指派给"}},required:["title"]}}},{name:"delete",display:"删除需求",type:"delete",method:"delete",path:"/stories/{storyID}",resultType:"text",pathParams:{storyID:"需求ID"}},{name:"activate",display:"激活需求",type:"action",method:"put",path:"/stories/{storyID}/activate",resultType:"text",pathParams:{storyID:"需求ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{assignedTo:{type:"string",description:"指派给"},comment:{type:"string",description:"备注"}}}}},{name:"change",display:"变更需求",type:"action",method:"put",path:"/stories/{storyID}/change",resultType:"text",pathParams:{storyID:"需求ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{title:{type:"string",description:"需求名称"},reviewer:{type:"array",items:{type:"string"},description:"评审人员"},spec:{type:"string",description:"需求描述"},verify:{type:"string",description:"验收标准"}},required:["reviewer"]}}},{name:"close",display:"关闭需求",type:"action",method:"put",path:"/stories/{storyID}/close",resultType:"text",pathParams:{storyID:"需求ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{closedReason:{type:"string",description:"关闭原因(done 已完成 | subdivided 已拆分 | duplicate 重复 | postponed 延期 | willnotdo 不做 | cancel 已取消 | bydesign 设计如此)"},comment:{type:"string",description:"备注"}},required:["closedReason"]}}}]},{name:"epic",display:"业务需求",description:"业务需求管理,支持获取业务需求列表,支持获取产品下的业务需求、创建业务需求、获取业务需求详情、修改业务需求、删除业务需求、激活业务需求、变更业务需求、关闭业务需求",actions:[{name:"list",display:"获取业务需求列表,支持获取产品下的业务需求",type:"list",method:"get",path:"/products/{productID}/epics",resultType:"list",pagerGetter:"pager",resultGetter:"epics",pathParams:{productID:"所属产品ID"},params:[{name:"browseType",required:!1,type:"string",description:"状态,默认是unclosed",defaultValue:"unclosed",options:[{value:"allstory",label:"全部"},{value:"assignedtome",label:"指派给我"},{value:"openedbyme",label:"我创建"},{value:"reviewbyme",label:"待我评审"},{value:"draftstory",label:"草稿"}]},{name:"orderBy",required:!1,type:"string",description:"排序",options:[{value:"id_asc",label:"ID 升序"},{value:"id_desc",label:"ID 降序"},{value:"title_asc",label:"标题 升序"},{value:"title_desc",label:"标题 降序"},{value:"status_asc",label:"状态 升序"},{value:"status_desc",label:"状态 降序"}]},{name:"recPerPage",required:!1,type:"number",description:"每页数量,不超过1000"},{name:"pageID",required:!1,type:"number",description:"页码,从第1页开始"}]},{name:"create",display:"创建业务需求",type:"create",method:"post",path:"/epics",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{productID:{type:"integer",description:"产品ID",format:"int32"},title:{type:"string"},pri:{type:"integer",description:"优先级,默认是3",format:"int32"},module:{type:"integer",description:"所属模块",format:"int32"},parent:{type:"integer",description:"父业务需求",format:"int32"},estimate:{type:"number",description:"预计工时",format:"float"},spec:{type:"string",description:"业务需求描述"},category:{type:"integer",description:"类别(feature 功能 | interface 接口 | performance 性能 | safe 安全 | experience 体验 | improve 改进 | other 其他)",format:"int32"},source:{type:"string",description:"来源(customer 客户 | user 用户 | po 产品经理 | market 市场 | service 客服 | operation 运营 | support 技术支持 | competitor 竞争对手 | partner 合作伙伴 | dev 开发人员 | tester 测试人员 | bug Bug | forum 论坛 | other 其他)"},verify:{type:"string",description:"验收标准"},assignedTo:{type:"string",description:"指派给"},reviewer:{type:"array",items:{type:"string"},description:"评审人,如果设置必须评审,必须填写"}},required:["productID","title"]}}},{name:"get",display:"获取业务需求详情",type:"get",method:"get",path:"/epics/{storyID}",resultType:"object",resultGetter:"epic",pathParams:{storyID:"需求ID"}},{name:"update",display:"修改业务需求",type:"update",method:"put",path:"/epics/{epicID}",resultType:"object",pathParams:{epicID:"业务需求ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{title:{type:"string",description:"需求名称"},pri:{type:"integer",description:"优先级,默认是3",format:"int32"},module:{type:"integer",description:"所属模块",format:"int32"},parent:{type:"integer",description:"父业务需求",format:"int32"},estimate:{type:"number",description:"预计工时",format:"float"},category:{type:"integer",description:"类别(feature 功能 | interface 接口 | performance 性能 | safe 安全 | experience 体验 | improve 改进 | other 其他)",format:"int32"},source:{type:"string",description:"来源(customer 客户 | user 用户 | po 产品经理 | market 市场 | service 客服 | operation 运营 | support 技术支持 | competitor 竞争对手 | partner 合作伙伴 | dev 开发人员 | tester 测试人员 | bug Bug | forum 论坛 | other 其他)"},assignedTo:{type:"string",description:"指派给"}},required:["title"]}}},{name:"delete",display:"删除业务需求",type:"delete",method:"delete",path:"/epics/{epicID}",resultType:"text",pathParams:{epicID:"业务需求ID"}},{name:"activate",display:"激活业务需求",type:"action",method:"put",path:"/epics/{epicID}/activate",resultType:"text",pathParams:{epicID:"业务需求ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{assignedTo:{type:"string",description:"指派给"},comment:{type:"string",description:"备注"}}}}},{name:"change",display:"变更业务需求",type:"action",method:"put",path:"/epics/{epicID}/change",resultType:"text",pathParams:{epicID:"业务需求ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{title:{type:"string",description:"需求名称"},reviewer:{type:"array",items:{type:"string"},description:"评审人员"},spec:{type:"string",description:"需求描述"},verify:{type:"string",description:"验收标准"}},required:["reviewer"]}}},{name:"close",display:"关闭业务需求",type:"action",method:"put",path:"/epics/{epicID}/close",resultType:"text",pathParams:{epicID:"业务需求ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{closedReason:{type:"string",description:"关闭原因(done 已完成 | subdivided 已拆分 | duplicate 重复 | postponed 延期 | willnotdo 不做 | cancel 已取消 | bydesign 设计如此)"},comment:{type:"string",description:"备注"}},required:["closedReason"]}}}]},{name:"requirement",display:"用户需求",description:"用户需求管理,支持获取用户需求列表,支持获取产品下的用户需求、创建用户需求、获取用户需求详情、修改用户需求、删除用户需求、激活用户需求、变更用户需求、关闭用户需求",actions:[{name:"list",display:"获取用户需求列表,支持获取产品下的用户需求",type:"list",method:"get",path:"/products/{productID}/requirements",resultType:"list",pagerGetter:"pager",resultGetter:"requirements",pathParams:{productID:"所属产品ID"},params:[{name:"browseType",required:!1,type:"string",description:"状态,默认是unclosed",defaultValue:"unclosed",options:[{value:"allstory",label:"全部"},{value:"assignedtome",label:"指派给我"},{value:"openedbyme",label:"我创建"},{value:"reviewbyme",label:"待我评审"},{value:"draftstory",label:"草稿"}]},{name:"orderBy",required:!1,type:"string",description:"排序",options:[{value:"id_asc",label:"ID 升序"},{value:"id_desc",label:"ID 降序"},{value:"title_asc",label:"标题 升序"},{value:"title_desc",label:"标题 降序"},{value:"status_asc",label:"状态 升序"},{value:"status_desc",label:"状态 降序"}]},{name:"recPerPage",required:!1,type:"number",description:"每页数量,不超过1000"},{name:"pageID",required:!1,type:"number",description:"页码,从第1页开始"}]},{name:"create",display:"创建用户需求",type:"create",method:"post",path:"/requirements",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{productID:{type:"integer",description:"产品ID",format:"int32"},title:{type:"string"},pri:{type:"integer",description:"优先级,默认是3",format:"int32"},module:{type:"integer",description:"所属模块",format:"int32"},parent:{type:"integer",description:"父用户需求",format:"int32"},estimate:{type:"number",description:"预计工时",format:"float"},spec:{type:"string",description:"用户需求描述"},category:{type:"integer",description:"类别(feature 功能 | interface 接口 | performance 性能 | safe 安全 | experience 体验 | improve 改进 | other 其他)",format:"int32"},source:{type:"string",description:"来源(customer 客户 | user 用户 | po 产品经理 | market 市场 | service 客服 | operation 运营 | support 技术支持 | competitor 竞争对手 | partner 合作伙伴 | dev 开发人员 | tester 测试人员 | bug Bug | forum 论坛 | other 其他)"},verify:{type:"string",description:"验收标准"},assignedTo:{type:"string",description:"指派给"},reviewer:{type:"array",items:{type:"string"},description:"评审人,如果设置必须评审,必须填写"}},required:["productID","title"]}}},{name:"get",display:"获取用户需求详情",type:"get",method:"get",path:"/requirements/{storyID}",resultType:"object",resultGetter:"requirement",pathParams:{storyID:"需求ID"}},{name:"update",display:"修改用户需求",type:"update",method:"put",path:"/requirements/{requirementID}",resultType:"object",pathParams:{requirementID:"用户需求ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{title:{type:"string"},pri:{type:"integer",description:"优先级,默认是3",format:"int32"},module:{type:"integer",description:"所属模块",format:"int32"},parent:{type:"integer",description:"父用户需求",format:"int32"},estimate:{type:"number",description:"预计工时",format:"float"},category:{type:"integer",description:"类别(feature 功能 | interface 接口 | performance 性能 | safe 安全 | experience 体验 | improve 改进 | other 其他)",format:"int32"},source:{type:"string",description:"来源(customer 客户 | user 用户 | po 产品经理 | market 市场 | service 客服 | operation 运营 | support 技术支持 | competitor 竞争对手 | partner 合作伙伴 | dev 开发人员 | tester 测试人员 | bug Bug | forum 论坛 | other 其他)"},assignedTo:{type:"string",description:"指派给"}},required:["title"]}}},{name:"delete",display:"删除用户需求",type:"delete",method:"delete",path:"/requirements/{requirementID}",resultType:"text",pathParams:{requirementID:"用户需求ID"}},{name:"activate",display:"激活用户需求",type:"action",method:"put",path:"/requirements/{requirementID}/activate",resultType:"text",pathParams:{requirementID:"用户需求ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{assignedTo:{type:"string",description:"指派给"},comment:{type:"string",description:"备注"}}}}},{name:"change",display:"变更用户需求",type:"action",method:"put",path:"/requirements/{requirementID}/change",resultType:"text",pathParams:{requirementID:"用户需求ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{title:{type:"string",description:"需求名称"},spec:{type:"string",description:"需求描述"},verify:{type:"string",description:"验收标准"}}}}},{name:"close",display:"关闭用户需求",type:"action",method:"put",path:"/requirements/{requirementID}/close",resultType:"text",pathParams:{requirementID:"用户需求ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{closedReason:{type:"string",description:"关闭原因(done 已完成 | subdivided 已拆分 | duplicate 重复 | postponed 延期 | willnotdo 不做 | cancel 已取消 | bydesign 设计如此)"},comment:{type:"string",description:"备注"}},required:["closedReason"]}}}]},{name:"bug",display:"Bug",description:"Bug管理,支持获取Bug列表,支持获取产品/项目/执行下的Bug、创建Bug、获取Bug详情、修改Bug、删除Bug、激活Bug、关闭Bug、解决Bug",actions:[{name:"list",display:"获取Bug列表,支持获取产品/项目/执行下的Bug",type:"list",method:"get",path:"/{scope}/{scopeID}/bugs",resultType:"list",pagerGetter:"pager",resultGetter:"bugs",pathParams:{scope:{description:"Bug所属范围",options:[{value:"products",label:"产品"},{value:"projects",label:"项目"},{value:"executions",label:"执行"}]},scopeID:"所属范围ID"},params:[{name:"browseType",required:!1,type:"string",description:"状态,默认是unclosed",defaultValue:"unclosed",options:[{value:"all",label:"全部"},{value:"unclosed",label:"未关闭"},{value:"assignedtome",label:"指派给我"},{value:"openedbyme",label:"我创建"},{value:"assignedbyme",label:"由我指派"}]},{name:"orderBy",required:!1,type:"string",description:"排序",options:[{value:"id_asc",label:"ID 升序"},{value:"id_desc",label:"ID 降序"},{value:"title_asc",label:"标题 升序"},{value:"title_desc",label:"标题 降序"},{value:"status_asc",label:"状态 升序"},{value:"status_desc",label:"状态 降序"}]},{name:"recPerPage",required:!1,type:"number",description:"每页数量,不超过1000"},{name:"pageID",required:!1,type:"number",description:"页码,从第1页开始"}]},{name:"create",display:"创建Bug",type:"create",method:"post",path:"/bugs",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{productID:{type:"integer",description:"所属产品",format:"int32"},title:{type:"string",description:"Bug标题"},openedBuild:{type:"array",items:{type:"string"},description:"影响版本,主干是trunk,其他版本使用版本ID"},project:{type:"integer",description:"所属项目",format:"int32"},execution:{type:"integer",description:"所属执行",format:"int32"},severity:{type:"integer",description:"严重程度,默认是3",format:"int32"},pri:{type:"integer",description:"优先级,默认是3",format:"int32"},type:{type:"string",description:"Bug类型(codeerror 代码错误 | config 配置相关 | install 安装部署 | security 安全相关 | performance 性能问题 | standard 标准规范 | automation 测试脚本 | designdefect 设计缺陷 | others 其他)"},steps:{type:"string",description:"重现步骤"},story:{type:"integer",description:"相关需求",format:"int32"}},required:["productID","title","openedBuild"]}}},{name:"get",display:"获取Bug详情",type:"get",method:"get",path:"/bugs/{bugID}",resultType:"object",resultGetter:"bug",pathParams:{bugID:"Bug ID"}},{name:"update",display:"修改Bug",type:"update",method:"put",path:"/bugs/{bugID}",resultType:"object",pathParams:{bugID:"Bug ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{title:{type:"string",description:"Bug标题"},severity:{type:"integer",description:"严重程度,默认是3",format:"int32"},pri:{type:"integer",description:"优先级,默认是3",format:"int32"},type:{type:"string",description:"Bug类型(codeerror 代码错误 | config 配置相关 | install 安装部署 | security 安全相关 | performance 性能问题 | standard 标准规范 | automation 测试脚本 | designdefect 设计缺陷 | others 其他)"},openedBuild:{type:"array",items:{type:"string"},description:"影响版本,主干是trunk,其他版本使用版本ID"},steps:{type:"string",description:"重现步骤"},project:{type:"integer",description:"所属项目",format:"int32"},execution:{type:"integer",description:"所属执行",format:"int32"},story:{type:"integer",description:"相关需求",format:"int32"}}}}},{name:"delete",display:"删除Bug",type:"delete",method:"delete",path:"/bugs/{bugID}",resultType:"text",pathParams:{bugID:"Bug ID"}},{name:"activate",display:"激活Bug",type:"action",method:"put",path:"/bugs/{bugID}/activate",resultType:"text",pathParams:{bugID:"Bug ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{openedBuild:{type:"array",items:{type:"string"},description:"影响版本, trunk为主干"},assignedTo:{type:"string",description:"指派给"},comment:{type:"string",description:"备注"}}}}},{name:"close",display:"关闭Bug",type:"action",method:"put",path:"/bugs/{bugID}/close",resultType:"text",pathParams:{bugID:"Bug ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{comment:{type:"string",description:"备注"}}}}},{name:"resolve",display:"解决Bug",type:"action",method:"put",path:"/bugs/{bugID}/resolve",resultType:"text",pathParams:{bugID:"Bug ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{resolution:{type:"string",description:"fixed 已解决 | notrepro 无法重现 | bydesign 设计如此 | duplicate 重复Bug | external 外部原因| postponed 延期处理 | willnotfix 不予解决 | tostory 转为需求"},resolvedDate:{type:"string",description:"解决日期,默认今天"},resolvedBuild:{type:"string",description:"解决版本, trunk为主干"},assignedTo:{type:"string",description:"指派给"},comment:{type:"string",description:"备注"}},required:["resolution"]}}}]},{name:"testcase",display:"测试用例",description:"测试用例管理,支持获取测试用例列表,支持获取产品/项目/执行下的测试用例、创建测试用例、获取测试用例详情、修改测试用例、删除测试用例",actions:[{name:"list",display:"获取测试用例列表,支持获取产品/项目/执行下的测试用例",type:"list",method:"get",path:"/{scope}/{scopeID}/testcases",resultType:"list",pagerGetter:"pager",resultGetter:"testcases",pathParams:{scope:{description:"测试用例所属范围",options:[{value:"products",label:"产品"},{value:"projects",label:"项目"},{value:"executions",label:"执行"}]},scopeID:"所属范围ID"},params:[{name:"browseType",required:!1,type:"string",description:"状态,默认是all",defaultValue:"all",options:[{value:"all",label:"全部"},{value:"wait",label:"未关闭"},{value:"needconfirm",label:"需求变动"}]},{name:"orderBy",required:!1,type:"string",description:"排序",options:[{value:"id_asc",label:"ID 升序"},{value:"id_desc",label:"ID 降序"},{value:"title_asc",label:"标题 升序"},{value:"title_desc",label:"标题 降序"},{value:"status_asc",label:"状态 升序"},{value:"status_desc",label:"状态 降序"}]},{name:"recPerPage",required:!1,type:"number",description:"每页数量,不超过1000"},{name:"pageID",required:!1,type:"number",description:"页码,从第1页开始"}]},{name:"create",display:"创建测试用例",type:"create",method:"post",path:"/testcases",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{productID:{type:"integer",description:"所属产品",format:"int32"},title:{type:"string",description:"用例标题"},module:{type:"integer",description:"所属模块",format:"int32"},story:{type:"integer",description:"相关需求",format:"int32"},pri:{type:"integer",description:"优先级",format:"int32"},type:{type:"string",description:"用例类型(unit 单元测试 | interface 接口测试 | feature 功能测试 | install 安装部署 | config 配置相关 | performance 性能测试 | security 安全相关 | other 其他)"},precondition:{type:"string",description:"前置条件"},steps:{type:"array",items:{type:"string"},description:"用例步骤"},expects:{type:"array",items:{type:"string"},description:"用例步骤期望"},stepType:{type:"array",items:{type:"string"},description:"用例步骤类型(step 步骤 | group 父级步骤)"},project:{type:"integer",description:"所属项目",format:"int32"},execution:{type:"integer",description:"所属执行",format:"int32"}},required:["productID","title"]}}},{name:"get",display:"获取测试用例详情",type:"get",method:"get",path:"/testcases/{caseID}",resultType:"object",resultGetter:"testcase",pathParams:{caseID:"测试用例ID"}},{name:"update",display:"修改测试用例",type:"update",method:"put",path:"/testcases/{testcasID}",resultType:"object",pathParams:{testcasID:"测试用例ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{title:{type:"string",description:"用例标题"},moudule:{type:"integer",description:"所属模块",format:"int32"},story:{type:"integer",description:"相关需求",format:"int32"},pri:{type:"integer",description:"优先级",format:"int32"},type:{type:"string",description:"用例类型(unit 单元测试 | interface 接口测试 | feature 功能测试 | install 安装部署 | config 配置相关 | performance 性能测试 | security 安全相关 | other 其他)"},precondition:{type:"string",description:"前置条件"},steps:{type:"array",items:{type:"string"},description:"用例步骤"},expects:{type:"array",items:{type:"string"},description:"用例步骤期望"},stepType:{type:"array",items:{type:"string"},description:"用例步骤类型(step 步骤 | group 父级步骤)"}},required:["title"]}}},{name:"delete",display:"删除测试用例",type:"delete",method:"delete",path:"/testcases/{testcasID}",resultType:"text",pathParams:{testcasID:"测试用例ID"}}]},{name:"task",display:"任务",description:"任务管理,支持获取任务列表,支持获取执行下的任务、创建任务、获取任务详情、修改任务、删除任务、激活任务、关闭任务、完成任务、启动任务",actions:[{name:"list",display:"获取任务列表,支持获取执行下的任务",type:"list",method:"get",path:"/executions/{executionID}/tasks",resultType:"list",pagerGetter:"pager",resultGetter:"tasks",pathParams:{executionID:"所属执行ID"},params:[{name:"status",required:!1,type:"string",description:"状态,默认是unclosed",defaultValue:"unclosed",options:[{value:"all",label:"全部"},{value:"unclosed",label:"未关闭"},{value:"assignedtome",label:"指派给我"},{value:"assignedtome",label:"指派给我"},{value:"myinvolved",label:"由我参与"},{value:"assignedbyme",label:"由我指派"}]},{name:"orderBy",required:!1,type:"string",description:"排序",options:[{value:"id_asc",label:"ID 升序"},{value:"id_desc",label:"ID 降序"},{value:"name_asc",label:"名称 升序"},{value:"name_desc",label:"名称 降序"},{value:"status_asc",label:"状态 升序"},{value:"status_desc",label:"状态 降序"}]},{name:"recPerPage",required:!1,type:"number",description:"每页数量,不超过1000"},{name:"pageID",required:!1,type:"number",description:"页码,从第1页开始"}]},{name:"create",display:"创建任务",type:"create",method:"post",path:"/tasks",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{name:{type:"string",description:"任务名称"},executionID:{type:"integer",description:"所属执行",format:"int32"},type:{type:"string",description:"任务类型"},assignedTo:{type:"string",description:"指派给"},estStarted:{type:"string",description:"预计开始"},deadline:{type:"string",description:"截止日期"},pri:{type:"integer",description:"优先级",format:"int32"},estimate:{type:"number",description:"预计工时",format:"float"},module:{type:"integer",description:"所属模块",format:"int32"},story:{type:"integer",description:"相关需求",format:"int32"},desc:{type:"string",description:"任务描述"}},required:["name","executionID"]}}},{name:"get",display:"获取任务详情",type:"get",method:"get",path:"/tasks/{taskID}",resultType:"object",pathParams:{taskID:"任务ID"}},{name:"update",display:"修改任务",type:"update",method:"put",path:"/tasks/{taskID}",resultType:"object",pathParams:{taskID:"任务ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{name:{type:"string",description:"任务名称"},type:{type:"string",description:"任务类型"},assignedTo:{type:"string",description:"指派给"},estStarted:{type:"string",description:"预计开始"},deadline:{type:"string",description:"截止日期"},pri:{type:"integer",description:"优先级",format:"int32"},estimate:{type:"number",description:"预计工时",format:"float"},module:{type:"integer",description:"所属模块",format:"int32"},story:{type:"integer",description:"相关需求",format:"int32"},desc:{type:"string",description:"任务描述"}}}}},{name:"delete",display:"删除任务",type:"delete",method:"delete",path:"/tasks/{taskID}",resultType:"text",pathParams:{taskID:"任务ID"}},{name:"activate",display:"激活任务",type:"action",method:"put",path:"/tasks/{taskID}/activate",resultType:"text",pathParams:{taskID:"任务ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{left:{type:"number",description:"预计剩余",format:"float"},assignedTo:{type:"string",description:"指派给"},comment:{type:"string",description:"备注"}}}}},{name:"close",display:"关闭任务",type:"action",method:"put",path:"/tasks/{taskID}/close",resultType:"text",pathParams:{taskID:"任务ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{comment:{type:"string",description:"备注"}}}}},{name:"finish",display:"完成任务",type:"action",method:"put",path:"/tasks/{taskID}/finish",resultType:"text",pathParams:{taskID:"任务ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{currentConsumed:{type:"number",description:"本次消耗",format:"float"},assignedTo:{type:"string",description:"任务名称"},consumed:{type:"number",description:"总计消耗",format:"float"},realStarted:{type:"string",description:"实际开始"},finishedDate:{type:"string",description:"实际完成"},comment:{type:"string",description:"备注"}},required:["currentConsumed","realStarted","finishedDate"]}}},{name:"start",display:"启动任务",type:"action",method:"put",path:"/tasks/{taskID}/start",resultType:"text",pathParams:{taskID:"任务ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{assignedTo:{type:"string",description:"任务名称"},realStarted:{type:"string",description:"实际开始"},consumed:{type:"number",description:"总计消耗",format:"float"},left:{type:"number",description:"预计剩余",format:"float"},comment:{type:"string",description:"备注"}},required:["realStarted"]}}}]},{name:"feedback",display:"反馈",description:"反馈管理,支持获取反馈列表,支持获取产品下的反馈、创建反馈、获取反馈详情、修改反馈、删除反馈、激活反馈、关闭反馈",actions:[{name:"list",display:"获取反馈列表,支持获取产品下的反馈",type:"list",method:"get",path:"/products/{productID}/feedbacks",resultType:"list",pagerGetter:"pager",resultGetter:"feedbacks",pathParams:{productID:"所属产品ID"},params:[{name:"browseType",required:!1,type:"string",description:"状态,默认是wait",defaultValue:"wait",options:[{value:"all",label:"全部"},{value:"wait",label:"待处理"},{value:"doing",label:"处理中"},{value:"toclosed",label:"待关闭"},{value:"review",label:"待评审"},{value:"assigntome",label:"指派给我"},{value:"openedbyme",label:"由我反馈"}]},{name:"orderBy",required:!1,type:"string",description:"排序",options:[{value:"id_asc",label:"ID 升序"},{value:"id_desc",label:"ID 降序"},{value:"title_asc",label:"标题 升序"},{value:"title_desc",label:"标题 降序"},{value:"status_asc",label:"状态 升序"},{value:"status_desc",label:"状态 降序"}]},{name:"recPerPage",required:!1,type:"number",description:"每页数量,不超过1000"},{name:"pageID",required:!1,type:"number",description:"页码,从第1页开始"}]},{name:"create",display:"创建反馈",type:"create",method:"post",path:"/feedbacks",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{product:{type:"integer",description:"所属产品",format:"int32"},title:{type:"string",description:"标题"},module:{type:"integer",description:"所属模块",format:"int32"},type:{type:"string",description:"类型(story 需求 | task 任务 | bug Bug | todo 待办 | advice 建议 | issue 问题 | risk 风险 | opportunity 机会)"},desc:{type:"string",description:"描述"},feedbackBy:{type:"string",description:"反馈者"},source:{type:"string",description:"来源"}},required:["product","title"]}}},{name:"get",display:"获取反馈详情",type:"get",method:"get",path:"/feedbacks/{feedbackID}",resultType:"object",resultGetter:"feedback",pathParams:{feedbackID:"反馈ID"}},{name:"update",display:"修改反馈",type:"update",method:"put",path:"/feedbacks/{feedbackID}",resultType:"object",pathParams:{feedbackID:"反馈ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{product:{type:"integer",description:"所属产品",format:"int32"},module:{type:"integer",description:"所属模块",format:"int32"},title:{type:"string",description:"标题"},type:{type:"string",description:"类型(story 需求 | task 任务 | bug Bug | todo 待办 | advice 建议 | issue 问题 | risk 风险 | opportunity 机会)"},desc:{type:"string",description:"描述"},feedbackBy:{type:"string",description:"反馈者"},source:{type:"string",description:"来源"}},required:["product","title"]}}},{name:"delete",display:"删除反馈",type:"delete",method:"delete",path:"/feedbacks/{feedbackID}",resultType:"text",pathParams:{feedbackID:"反馈ID"}},{name:"activate",display:"激活反馈",type:"action",method:"put",path:"/feedbacks/{feedbackID}/activate",resultType:"text",pathParams:{feedbackID:"反馈ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{assignedTo:{type:"string",description:"指派给"},comment:{type:"string",description:"备注"}}}}},{name:"close",display:"关闭反馈",type:"action",method:"put",path:"/feedbacks/{feedbackID}/close",resultType:"text",pathParams:{feedbackID:"反馈ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{closedReason:{type:"string",description:"关闭原因(commented 已处理 | repeat 重复 | refuse 不予采纳)"},comment:{type:"string",description:"备注"}},required:["closedReason"]}}}]},{name:"ticket",display:"工单",description:"工单管理,支持获取工单列表,支持获取产品下的工单、创建工单、获取工单详情、修改工单、删除工单、激活工单、关闭工单",actions:[{name:"list",display:"获取工单列表,支持获取产品下的工单",type:"list",method:"get",path:"/products/{productID}/tickets",resultType:"list",pagerGetter:"pager",resultGetter:"tickets",pathParams:{productID:"所属产品ID"},params:[{name:"browseType",required:!1,type:"string",description:"状态,默认是wait",defaultValue:"wait",options:[{value:"all",label:"全部"},{value:"unclosed",label:"未关闭"},{value:"wait",label:"待处理"},{value:"doing",label:"处理中"},{value:"done",label:"待关闭"},{value:"finishedbyme",label:"由我解决"},{value:"assigntome",label:"指派给我"},{value:"openedbyme",label:"由我创建"}]},{name:"orderBy",required:!1,type:"string",description:"排序",options:[{value:"id_asc",label:"ID 升序"},{value:"id_desc",label:"ID 降序"},{value:"title_asc",label:"标题 升序"},{value:"title_desc",label:"标题 降序"},{value:"status_asc",label:"状态 升序"},{value:"status_desc",label:"状态 降序"}]},{name:"recPerPage",required:!1,type:"number",description:"每页数量,不超过1000"},{name:"pageID",required:!1,type:"number",description:"页码,从第1页开始"}]},{name:"create",display:"创建工单",type:"create",method:"post",path:"/tickets",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{product:{type:"integer",description:"所属产品",format:"int32"},module:{type:"integer",description:"所属模块",format:"int32"},title:{type:"string",description:"标题"},type:{type:"string",description:"类型(code 程序报错 | data 数据错误 | stuck 流程卡断 | security 安全问题 | affair 事务)"},desc:{type:"string",description:"描述"},assignedTo:{type:"string",description:"指派给"},deadline:{type:"string",description:"截止日期"},openedBuild:{type:"array",items:{type:"string"},description:"影响版本"}},required:["product","title"]}}},{name:"get",display:"获取工单详情",type:"get",method:"get",path:"/tickets/{ticketID}",resultType:"object",resultGetter:"ticket",pathParams:{ticketID:"工单ID"}},{name:"update",display:"修改工单",type:"update",method:"put",path:"/tickets/{ticketID}",resultType:"object",pathParams:{ticketID:"工单ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{product:{type:"integer",description:"所属产品",format:"int32"},module:{type:"integer",description:"所属模块",format:"int32"},title:{type:"string",description:"标题"},type:{type:"string",description:"类型(code 程序报错 | data 数据错误 | stuck 流程卡断 | security 安全问题 | affair 事务)"},desc:{type:"string",description:"描述"},assignedTo:{type:"string",description:"指派给"},deadline:{type:"string",description:"截止日期"},openedBuild:{type:"array",items:{type:"string"},description:"影响版本"}}}}},{name:"delete",display:"删除工单",type:"delete",method:"delete",path:"/tickets/{ticketID}",resultType:"text",pathParams:{ticketID:"工单ID"}},{name:"activate",display:"激活工单",type:"action",method:"put",path:"/tickets/{ticketID}/activate",resultType:"text",pathParams:{ticketID:"工单ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{assignedTo:{type:"string",description:"指派给"},comment:{type:"string",description:"备注"}}}}},{name:"close",display:"关闭工单",type:"action",method:"put",path:"/tickets/{ticketID}/close",resultType:"text",pathParams:{ticketID:"工单ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{closedReason:{type:"string",description:"关闭原因(commented 已处理 | repeat 重复 | refuse 不予处理)"},comment:{type:"string",description:"备注"}},required:["closedReason","comment"]}}}]},{name:"system",display:"应用",description:"应用管理,支持获取应用列表,支持获取产品下的应用、创建应用、修改应用",actions:[{name:"list",display:"获取应用列表,支持获取产品下的应用",type:"list",method:"get",path:"/products/{productID}/systems",resultType:"list",pagerGetter:"pager",pathParams:{productID:"所属产品ID"}},{name:"create",display:"创建应用",type:"create",method:"post",path:"/systems",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{productID:{type:"integer",description:"所属产品",format:"int32"},integrated:{type:"integer",description:"是否集成应用(0 否| 1 是)",format:"int32"},children:{type:"array",items:{type:"string"},description:"集成应用需要包含其他应用,非集成应用传空数组[]"},name:{type:"string",description:"应用名称"},desc:{type:"string",description:"描述"}},required:["productID","integrated","children","name"]}}},{name:"update",display:"修改应用",type:"update",method:"put",path:"/systems/{systemID}",resultType:"object",pathParams:{systemID:"应用ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{name:{type:"string",description:"应用名称"},children:{type:"array",items:{type:"string"},description:"集成应用需要包含其他应用,非集成应用传空数组[]"},desc:{type:"string",description:"描述"}},required:["name","children"]}}}]},{name:"build",display:"版本",description:"版本管理,支持获取版本列表,支持获取项目/执行下的版本、创建版本/构建、修改版本、删除版本",actions:[{name:"list",display:"获取版本列表,支持获取项目/执行下的版本",type:"list",method:"get",path:"/{scope}/{scopeID}/builds",resultType:"list",pagerGetter:"pager",resultGetter:"builds",pathParams:{scope:{description:"版本所属范围",options:[{value:"projects",label:"项目"},{value:"executions",label:"执行"}]},scopeID:"所属范围ID"}},{name:"create",display:"创建版本/构建",type:"create",method:"post",path:"/builds",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{executionID:{type:"integer",description:"所属执行/迭代",format:"int32"},product:{type:"integer",description:"所属产品",format:"int32"},name:{type:"string",description:"构建名称"},system:{type:"integer",description:"所属应用",format:"int32"},builder:{type:"string",description:"构建者"},date:{type:"string",description:"打包日期"},scmPath:{type:"string",description:"源代码地址"},filePath:{type:"string",description:"下载地址"},desc:{type:"string",description:"描述"}},required:["executionID","product","name","system","builder","date"]}}},{name:"update",display:"修改版本",type:"update",method:"put",path:"/builds/{buildID}",resultType:"object",pathParams:{buildID:"版本ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{execution:{type:"integer",description:"所属执行/迭代",format:"int32"},product:{type:"integer",description:"所属产品",format:"int32"},name:{type:"string",description:"构建名称"},system:{type:"integer",description:"所属应用",format:"int32"},builder:{type:"string",description:"构建者"},date:{type:"string",description:"打包日期"},scmPath:{type:"string",description:"源代码地址"},filePath:{type:"string",description:"下载地址"},desc:{type:"string",description:"描述"}},required:["execution","product","name","system","builder","date"]}}},{name:"delete",display:"删除版本",type:"delete",method:"delete",path:"/builds/{buildID}",resultType:"text",pathParams:{buildID:"版本ID"}}]},{name:"testtask",display:"测试单",description:"测试单管理,支持获取测试单列表,支持获取产品/项目/执行下的测试单、创建测试单、修改测试单、删除测试单",actions:[{name:"list",display:"获取测试单列表,支持获取产品/项目/执行下的测试单",type:"list",method:"get",path:"/{scope}/{scopeID}/testtasks",resultType:"list",pagerGetter:"pager",resultGetter:"testtasks",pathParams:{scope:{description:"测试单所属范围",options:[{value:"products",label:"产品"},{value:"projects",label:"项目"},{value:"executions",label:"执行"}]},scopeID:"所属范围ID"}},{name:"create",display:"创建测试单",type:"create",method:"post",path:"/testtasks",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{productID:{type:"integer",description:"所属产品ID",format:"int32"},name:{type:"string",description:"测试单名称"},build:{type:"integer",description:"提测构建/版本",format:"int32"},execution:{type:"integer",description:"所属执行",format:"int32"},type:{type:"array",items:{type:"string"},description:"类型(integrate 集成测试 | system 系统测试 | acceptance 验收测试 | performance 性能测试 | safety 安全测试)"},owner:{type:"string",description:"负责人"},status:{type:"string",description:"状态(wait 未开始 | doing 进行中 | done 已关闭 | blocked 被阻塞)"},begin:{type:"string",description:"开始日期"},end:{type:"string",description:"结束日期"},desc:{type:"string",description:"描述"}},required:["productID","name","build","begin","end"]}}},{name:"update",display:"修改测试单",type:"update",method:"put",path:"/testtasks/{testtaskID}",resultType:"object",pathParams:{testtaskID:"测试单ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{name:{type:"string",description:"测试单名称"},build:{type:"integer",description:"提测构建/版本",format:"int32"},execution:{type:"integer",description:"所属执行",format:"int32"},type:{type:"array",items:{type:"string"},description:"类型(integrate 集成测试 | system 系统测试 | acceptance 验收测试 | performance 性能测试 | safety 安全测试)"},owner:{type:"string",description:"负责人"},status:{type:"string",description:"状态(wait 未开始 | doing 进行中 | done 已关闭 | blocked 被阻塞)"},begin:{type:"string",description:"开始日期"},end:{type:"string",description:"结束日期"},desc:{type:"string",description:"描述"}},required:["name","build","begin","end"]}}},{name:"delete",display:"删除测试单",type:"delete",method:"delete",path:"/testtasks/{testtaskID}",resultType:"text",pathParams:{testtaskID:"测试单ID"}}]},{name:"release",display:"发布",description:"发布管理,支持获取发布列表,支持获取产品下的发布、创建发布、修改发布、删除发布",actions:[{name:"list",display:"获取发布列表,支持获取产品下的发布",type:"list",method:"get",path:"/products/{productID}/releases",resultType:"list",pagerGetter:"pager",resultGetter:"releases",pathParams:{productID:"所属产品ID"}},{name:"create",display:"创建发布",type:"create",method:"post",path:"/releases",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{productID:{type:"integer",description:"所属产品",format:"int32"},system:{type:"integer",description:"所属应用",format:"int32"},name:{type:"string",description:"应用版本号"},build:{type:"array",items:{type:"string"},description:"包含构建"},status:{type:"string",description:"状态(wait 未开始 | normal 已发布 | fail 发布失败 | terminate 停止维护)"},date:{type:"string",description:"计划发布日期"},desc:{type:"string",description:"描述"}},required:["productID","system","name","build","date"]}}},{name:"update",display:"修改发布",type:"update",method:"put",path:"/releases/{releasID}",resultType:"object",pathParams:{releasID:"发布ID"},requestBody:{required:!0,type:"object",schema:{type:"object",properties:{system:{type:"integer",description:"所属应用",format:"int32"},name:{type:"string",description:"应用版本号"},build:{type:"array",items:{type:"string"},description:"包含构建"},status:{type:"string",description:"状态(wait 未开始 | normal 已发布 | fail 发布失败 | terminate 停止维护)"},date:{type:"string",description:"计划发布日期"},desc:{type:"string",description:"描述"}},required:["system","name","build","date"]}}},{name:"delete",display:"删除发布",type:"delete",method:"delete",path:"/releases/{releasID}",resultType:"text",pathParams:{releasID:"发布ID"}}]},{name:"file",display:"附件",description:"附件管理,支持编辑附件,修改附件的名称、删除附件",actions:[{name:"create",display:"编辑附件,修改附件的名称",type:"create",method:"post",path:"/files",resultType:"object",requestBody:{required:!0,type:"object",schema:{type:"object",properties:{fileName:{type:"string",description:"附件名称"}},required:["fileName"]}}},{name:"delete",display:"删除附件",type:"delete",method:"delete",path:"/files/{fileID}",resultType:"text",pathParams:{fileID:"附件ID"}}]}];var fD={list:"get",get:"get",create:"post",update:"put",delete:"delete",action:"post"},ND={list:"list",get:"object",create:"object",update:"object",delete:"text",action:"text"},TB=dD(yD()),lB=aB(TB);function q(B){if(Array.isArray(B))return B.map((D)=>q(D));if(B&&typeof B==="object"&&!(B instanceof Function)){let D={};for(let[W,R]of Object.entries(B))D[W]=q(R);return D}return B}function OB(B,D){if(!G(D))return D===void 0?B:q(D);let W=G(B)?{...B}:{};for(let[R,Q]of Object.entries(D)){if(Q===void 0)continue;let C=W[R];W[R]=G(Q)&&G(C)?OB(C,Q):q(Q)}return W}function yD(){return q(sB)}function SB(B){if(B===null||typeof B!=="object")return B;if(Object.isFrozen(B))return B;for(let D of Object.keys(B))SB(B[D]);return Object.freeze(B)}function bD(B){if(B.method===void 0){let D=fD[B.type];if(D===void 0)throw new $("E_INDETERMINATE_ACTION_METHOD",{action:String(B.name),type:String(B.type)});B.method=D}if(B.resultType===void 0){let D=ND[B.type];if(D===void 0)throw new $("E_INDETERMINATE_ACTION_RESULT_TYPE",{action:String(B.name),type:String(B.type)});B.resultType=D}return B}function t(B){return SB(bD(B))}function F(B){return B.actions.forEach(t),SB(B)}function dD(B){return B.forEach(F),B}function e(B,D){let W=D.toLowerCase();return B.findIndex((R)=>String(R.name).toLowerCase()===W)}function vD(B,D){let W=B.slice();for(let R of D){let Q=e(W,String(R.name)),C=t(q(R));if(Q>=0)W[Q]=C;else W.push(C)}return W}function rB(B,D){return F({...B,...q(D),actions:vD(B.actions,D.actions)})}function aB(B){return new Map(B.map((D)=>[D.name.toLowerCase(),D]))}function oB(B){if(!B||typeof B.name!=="string"||!Array.isArray(B.actions))throw new $("E_INVALID_MODULE_DEFINITION")}function jB(B){if(!B||typeof B.name!=="string"||typeof B.path!=="string")throw new $("E_INVALID_ACTION_DEFINITION");if(B.method!==void 0&&typeof B.method!=="string")throw new $("E_INVALID_ACTION_DEFINITION");if(B.resultType!==void 0&&typeof B.resultType!=="string")throw new $("E_INVALID_ACTION_DEFINITION")}function k(){return TB}function _(){return lB}function BB(){lB=aB(TB)}var cD;function eB(B){cD=B}function DB(B,D={}){let W=k();for(let R of S(B)){oB(R);let Q=R.name.toLowerCase(),C=W.findIndex((X)=>X.name.toLowerCase()===Q);if(C>=0)W[C]=D.replace?F(q(R)):rB(W[C],R);else W.push(F(q(R)))}BB()}function WB(B,D){let W=B.toLowerCase(),R=_().get(W);if(!R)throw new $("E_INVALID_MODULE",{module:B});let Q=R.actions.slice();for(let V of S(D)){jB(V);let w=e(Q,String(V.name)),H=t(q(V));if(w>=0)Q[w]=H;else Q.push(H)}let C=F({...R,actions:Q}),X=k(),J=X.findIndex((V)=>V.name.toLowerCase()===W);X[J]=C,BB()}function U(B,D,W){let R=B.toLowerCase(),Q=_().get(R);if(!Q)throw new $("E_INVALID_MODULE",{module:B});let C=Q.actions.slice(),X=e(C,D);if(X<0)throw new $("E_INVALID_ACTION",{module:B,action:D});let J=C[X],V=typeof W==="function"?W(q(J)):OB(J,W);jB(V),C[X]=t(V);let w=F({...Q,actions:C}),H=k(),Y=H.findIndex((A)=>A.name.toLowerCase()===R);H[Y]=w,BB()}function zB(){U("execution","create",(B)=>{let D=B.requestBody.schema?.required;if(Array.isArray(D)&&!D.includes("products"))D.push("products");return B}),U("story","update",(B)=>{let D=B.requestBody.schema?.properties;if(D&&!D.plan)D.plan={type:"integer",description:"所属计划",format:"int32"};if(D&&D.category)D.category={type:"string",description:"类别"};return B}),U("task","list",(B)=>{return B.path="/executions/{executionID}/tasks",B.pathParams={executionID:"执行ID"},B}),[["product","create"],["product","update"],["execution","create"],["execution","update"]].forEach(([B,D])=>{U(B,D,(W)=>{let R=W.requestBody.schema?.properties;if(R.acl&&R.acl.defaultValue===void 0)R.acl.defaultValue="open";return W})}),["create","update"].forEach((B)=>{U("task",B,(D)=>{let W=D.requestBody?.schema?.properties;if(W&&!W.parent)W.parent={type:"integer",description:"父任务",format:"int32"};return D})}),U("bug","list",(B)=>{let W=B.params?.find((R)=>R.name==="browseType");if(W&&W.options?.length){let R=W.options,Q=R.find((C)=>C.value==="assignedtome");if(Q)W.options=[...R.filter((C)=>C!==Q),{...Q,value:"assigntome"}];if(!W.options.some((C)=>C.value==="resolvedbyme"))W.options=[...W.options,{value:"resolvedbyme",label:"由我解决"}]}return B})}var BD={user:{id:"用户编号",company:"所属公司",type:"用户类型",dept:"部门",account:"用户名",password:"密码",role:"职位",realname:"姓名",superior:"直属上级",pinyin:"姓名拼音",nickname:"昵称",commiter:"源代码帐号",avatar:"用户头像",birthday:"生日",gender:"性别",email:"邮箱",skype:"Skype",qq:"QQ",mobile:"手机",phone:"电话",weixin:"微信",dingding:"钉钉",slack:"Slack",whatsapp:"WhatsApp",address:"通讯地址",zipcode:"邮编",nature:"性格特征",analysis:"影响分析",strategy:"应对策略",join:"入职日期",visits:"访问次数",visions:"界面类型",ip:"最后IP",last:"最后登录",fails:"失败次数",locked:"锁住日期",feedback:"是否反馈用户",ranzhi:"ZDOO帐号",ldap:"LDAP账号",score:"积分",scoreLevel:"积分等级",resetToken:"重置密码令牌",resetExpired:"重置令牌过期时间",clientStatus:"登录状态",clientLang:"客户端语言",jira:"是否Jira导入用户",deleted:"(已删除)"},program:{id:"编号",project:"项目",isTpl:"是否模板",charter:"所属立项",model:"项目管理方式",type:"类型",category:"项目集类型",lifetime:"项目周期",budget:"预算",budgetUnit:"预算单位",attribute:"阶段类型",percent:"工作量占比",milestone:"里程碑",output:"输出",auth:"权限控制",storyType:"关联需求概念",parent:"父项目集",path:"路径",grade:"层级",name:"项目集名称",code:"项目代号",hasProduct:"是否关联产品",workflowGroup:"项目流程",begin:"计划开始",end:"计划完成",firstEnd:"启动时的计划完成日期",realBegan:"实际开始",realEnd:"实际完成",days:"可用工作日",schedule:"日程安排",status:"状态",subStatus:"子状态",pri:"优先级",desc:"项目集描述",version:"版本",parentVersion:"父版本",planDuration:"计划周期天数",realDuration:"实际周期天数",progress:"项目进度",estimate:"预计",left:"剩余工时",consumed:"消耗工时",teamCount:"总人数",market:"目标市场",openedBy:"创建者",openedDate:"创建时间",openedVersion:"创建版本",lastEditedBy:"最后编辑人",lastEditedDate:"最后编辑日期",closedBy:"由谁关闭",closedDate:"关闭日期",closedReason:"关闭原因",canceledBy:"由谁取消",canceledDate:"取消日期",suspendedDate:"暂停日期",PO:"项目负责人",PM:"负责人",QD:"测试负责人",RD:"发布负责人",team:"团队",acl:"访问控制",whitelist:"白名单",tplAcl:"模板访问控制",tplWhiteList:"模板白名单",order:"排序",stageBy:"阶段类型",displayCards:"每列最大卡片数",fluidBoard:"列宽度",multiple:"启用迭代",parallel:"是否允许并行",enabled:"是否启用阶段",linkType:"关联类型",taskDateLimit:"任务时间限制",colWidth:"列宽",minColWidth:"最小列宽",maxColWidth:"最大列宽",coverExecutionPriv:"执行权限控制",vision:"界面",frozen:"冻结状态",deleted:"已删除"},product:{id:"编号",program:"所属项目集",name:"产品名称",code:"产品代号",shadow:"是否影子产品",bind:"是否独立产品",line:"产品线",type:"产品类型",status:"状态",subStatus:"子状态",desc:"产品描述",PO:"产品负责人",QD:"测试负责人",RD:"发布负责人",feedback:"反馈负责人",ticket:"工单负责人",workflowGroup:"产品流程",acl:"访问控制",groups:"权限组",whitelist:"白名单",reviewer:"评审人",PMT:"规划负责人",draftEpics:"草稿业务需求",activeEpics:"激活业务需求",changingEpics:"变更中业务需求",reviewingEpics:"评审中业务需求",finishedEpics:"已完成业务需求",closedEpics:"已关闭业务需求",totalEpics:"业务需求数",draftRequirements:"草稿用户需求",activeRequirements:"激活用户需求",changingRequirements:"变更中用户需求",reviewingRequirements:"评审中用户需求",finishedRequirements:"已完成用户需求",closedRequirements:"已关闭用户需求",totalRequirements:"用户需求数",draftStories:"草稿软件需求",activeStories:"激活软件需求",changingStories:"变更中软件需求",reviewingStories:"评审中软件需求",finishedStories:"已完成软件需求",closedStories:"已关闭软件需求",totalStories:"软件需求数",unresolvedBugs:"未解决Bug",closedBugs:"关闭Bug",fixedBugs:"已修复Bug",totalBugs:"Bug总数",plans:"计划数",releases:"发布数",createdBy:"由谁创建",createdDate:"创建日期",createdVersion:"创建版本",closedDate:"关闭日期",order:"排序",vision:"所属界面",deleted:"已删除"},project:{id:"项目ID",project:"所属项目",isTpl:"是否模板",charter:"所属立项",model:"项目管理方式",type:"项目类型",category:"项目类型",lifetime:"项目周期",budget:"预算",budgetUnit:"(单位:)",attribute:"阶段类型",percent:"工作量占比",milestone:"里程碑",output:"输出",auth:"权限控制",storyType:"关联需求概念",parent:"所属项目集",path:"路径",grade:"层级",name:"项目名称",code:"项目代号",hasProduct:"是否关联产品",workflowGroup:"项目流程",begin:"计划开始",end:"计划完成",firstEnd:"启动时的计划完成日期",realBegan:"实际开始日期",realEnd:"实际完成日期",days:"可用工作日",schedule:"日程安排",status:"状态",subStatus:"子状态",pri:"优先级",desc:"项目描述",version:"版本",parentVersion:"父版本",planDuration:"计划周期天数",realDuration:"实际周期天数",progress:"进度",estimate:"预计",left:"剩余工时",consumed:"消耗工时",teamCount:"人数",market:"目标市场",openedBy:"由谁创建",openedDate:"创建日期",openedVersion:"创建版本",lastEditedBy:"最后编辑人",lastEditedDate:"最后编辑日期",closedBy:"由谁关闭",closedDate:"关闭日期",closedReason:"关闭原因",canceledBy:"由谁取消",canceledDate:"取消日期",suspendedDate:"暂停日期",PO:"项目负责人",PM:"负责人",QD:"测试负责人",RD:"发布负责人",team:"团队",acl:"访问控制",whitelist:"项目白名单",tplAcl:"模板访问控制",tplWhiteList:"模板白名单",order:"排序",stageBy:"阶段类型",displayCards:"每列最大卡片数",fluidBoard:"列宽度",multiple:"启用迭代",parallel:"是否允许并行",enabled:"是否启用阶段",linkType:"关联类型",taskDateLimit:"任务时间限制",colWidth:"列宽",minColWidth:"最小列宽",maxColWidth:"最大列宽",coverExecutionPriv:"执行权限控制",vision:"界面",frozen:"冻结状态",deleted:"已删除"},execution:{id:"迭代编号",project:"所属项目",isTpl:"是否模板",charter:"所属立项",model:"项目管理方式",type:"迭代类型",category:"项目类型",lifetime:"项目周期",budget:"预算",budgetUnit:"(单位:)",attribute:"阶段类型",percent:"工作量占比",milestone:"里程碑",output:"输出",auth:"权限控制",storyType:"关联需求概念",parent:"所属项目",path:"路径",grade:"层级",name:"迭代名称",code:"迭代代号",hasProduct:"是否关联产品",workflowGroup:"项目流程",begin:"计划开始",end:"计划完成",firstEnd:"启动时的计划完成日期",realBegan:"实际开始日期",realEnd:"实际完成日期",days:"可用工作日",schedule:"日程安排",status:"迭代状态",subStatus:"子状态",pri:"优先级",desc:"迭代描述",version:"版本",parentVersion:"父版本",planDuration:"计划周期天数",realDuration:"实际周期天数",progress:"进度",estimate:"预计",left:"剩余",consumed:"消耗",teamCount:"人数",market:"目标市场",openedBy:"由谁创建",openedDate:"创建日期",openedVersion:"创建版本",lastEditedBy:"最后编辑人",lastEditedDate:"最后编辑日期",closedBy:"由谁关闭",closedDate:"关闭日期",closedReason:"关闭原因",canceledBy:"由谁取消",canceledDate:"取消日期",suspendedDate:"暂停日期",PO:"产品负责人",PM:"迭代负责人",QD:"测试负责人",RD:"发布负责人",team:"团队成员",acl:"访问控制",whitelist:"白名单",tplAcl:"模板访问控制",tplWhiteList:"模板白名单",order:"迭代排序",stageBy:"阶段类型",displayCards:"每列最大卡片数",fluidBoard:"列宽度",multiple:"启用迭代",parallel:"是否允许并行",enabled:"是否启用阶段",linkType:"关联类型",taskDateLimit:"任务时间限制",colWidth:"列宽",minColWidth:"最小列宽",maxColWidth:"最大列宽",coverExecutionPriv:"执行权限控制",vision:"界面",frozen:"冻结状态",deleted:"已删除"},productplan:{id:"编号",product:"所属产品",branch:"平台/分支",parent:"父计划",title:"计划名称",status:"状态",desc:"描述",begin:"开始日期",end:"结束日期",finishedDate:"完成时间",closedDate:"关闭时间",order:"排序",closedReason:"关闭原因",createdBy:"由谁创建",createdDate:"创建时间",deleted:"已删除"},story:{id:"编号",parent:"父需求",isParent:"是父需求",root:"顶级需求ID",path:"路径",grade:"需求层级",product:"所属产品",branch:"平台/分支",module:"所属模块",plan:"所属计划",source:"来源",sourceNote:"来源备注",fromBug:"来源Bug",feedback:"相关反馈",title:"软件需求名称",keywords:"关键词",type:"需求类型",category:"类别",pri:"优先级",estimate:"预计工时",status:"当前状态",subStatus:"子状态",color:"标题颜色",stage:"所处阶段",stagedBy:"设置阶段者",mailto:"抄送给",lib:"所属需求库",fromStory:"来源需求",fromVersion:"来源版本",openedBy:"由谁创建",openedDate:"创建日期",assignedTo:"指派给",assignedDate:"指派日期",approvedDate:"评审日期",lastEditedBy:"最后修改",lastEditedDate:"最后修改日期",changedBy:"由谁变更",changedDate:"变更时间",reviewedBy:"已评审人",reviewedDate:"评审时间",releasedDate:"发布日期",closedBy:"由谁关闭",closedDate:"关闭日期",closedReason:"关闭原因",activatedDate:"激活日期",toBug:"转Bug",linkStories:"相关需求",linkRequirements:"相关用户需求",docs:"关联文档",twins:"孪生需求",duplicateStory:"重复需求",version:"版本号",parentVersion:"父需求版本",demandVersion:"需求池需求版本",storyChanged:"需求已变更",feedbackBy:"反馈者",notifyEmail:"通知邮箱",BSA:"BSA等级",duration:"管理周期",demand:"需求池需求",submitedBy:"提交评审人",roadmap:"所属路标",URChanged:"用需变更",unlinkReason:"移除原因",retractedReason:"撤销原因",retractedBy:"由谁撤回",retractedDate:"撤回日期",verifiedDate:"验收时间",vision:"所属界面",frozen:"冻结状态",deleted:"已删除"},epic:{id:"编号",parent:"父需求",isParent:"是父需求",root:"顶级需求ID",path:"路径",grade:"需求层级",product:"所属产品",branch:"平台/分支",module:"所属模块",plan:"所属计划",source:"来源",sourceNote:"来源备注",fromBug:"来源Bug",feedback:"相关反馈",title:"业务需求名称",keywords:"关键词",type:"需求类型",category:"类别",pri:"优先级",estimate:"预计工时",status:"当前状态",subStatus:"子状态",color:"标题颜色",stage:"所处阶段",stagedBy:"设置阶段者",mailto:"抄送给",lib:"所属需求库",fromStory:"来源需求",fromVersion:"来源版本",openedBy:"由谁创建",openedDate:"创建日期",assignedTo:"指派给",assignedDate:"指派日期",approvedDate:"评审日期",lastEditedBy:"最后修改",lastEditedDate:"最后修改日期",changedBy:"由谁变更",changedDate:"变更时间",reviewedBy:"已评审人",reviewedDate:"评审时间",releasedDate:"发布日期",closedBy:"由谁关闭",closedDate:"关闭日期",closedReason:"关闭原因",activatedDate:"激活日期",toBug:"转Bug",linkStories:"相关需求",linkRequirements:"相关用户需求",docs:"关联文档",twins:"孪生需求",duplicateStory:"重复需求",version:"版本号",parentVersion:"父需求版本",demandVersion:"需求池需求版本",storyChanged:"需求已变更",feedbackBy:"反馈者",notifyEmail:"通知邮箱",BSA:"BSA等级",duration:"管理周期",demand:"需求池需求",submitedBy:"提交评审人",roadmap:"所属路标",URChanged:"用需变更",unlinkReason:"移除原因",retractedReason:"撤销原因",retractedBy:"由谁撤回",retractedDate:"撤回日期",verifiedDate:"验收时间",vision:"所属界面",frozen:"冻结状态",deleted:"已删除"},requirement:{id:"编号",parent:"父需求",isParent:"是父需求",root:"顶级需求ID",path:"路径",grade:"需求层级",product:"所属产品",branch:"平台/分支",module:"所属模块",plan:"所属计划",source:"来源",sourceNote:"来源备注",fromBug:"来源Bug",feedback:"相关反馈",title:"用户需求名称",keywords:"关键词",type:"需求类型",category:"类别",pri:"优先级",estimate:"预计工时",status:"当前状态",subStatus:"子状态",color:"标题颜色",stage:"所处阶段",stagedBy:"设置阶段者",mailto:"抄送给",lib:"所属需求库",fromStory:"来源需求",fromVersion:"来源版本",openedBy:"由谁创建",openedDate:"创建日期",assignedTo:"指派给",assignedDate:"指派日期",approvedDate:"评审日期",lastEditedBy:"最后修改",lastEditedDate:"最后修改日期",changedBy:"由谁变更",changedDate:"变更时间",reviewedBy:"已评审人",reviewedDate:"评审时间",releasedDate:"发布日期",closedBy:"由谁关闭",closedDate:"关闭日期",closedReason:"关闭原因",activatedDate:"激活日期",toBug:"转Bug",linkStories:"相关需求",linkRequirements:"相关用户需求",docs:"关联文档",twins:"孪生需求",duplicateStory:"重复需求",version:"版本号",parentVersion:"父需求版本",demandVersion:"需求池需求版本",storyChanged:"需求已变更",feedbackBy:"反馈者",notifyEmail:"通知邮箱",BSA:"BSA等级",duration:"管理周期",demand:"需求池需求",submitedBy:"提交评审人",roadmap:"所属路标",URChanged:"用需变更",unlinkReason:"移除原因",retractedReason:"撤销原因",retractedBy:"由谁撤回",retractedDate:"撤回日期",verifiedDate:"验收时间",vision:"所属界面",frozen:"冻结状态",deleted:"已删除"},bug:{id:"Bug编号",project:"所属项目",product:"所属产品",injection:"注入环节",identify:"发现环节",branch:"平台/分支",module:"所属模块",execution:"所属执行",plan:"所属计划",story:"相关需求",storyVersion:"软件需求版本",task:"相关任务",toTask:"转任务",toStory:"转软件需求",title:"Bug标题",keywords:"关键词",severity:"严重程度",pri:"优先级",type:"Bug类型",os:"操作系统",browser:"浏览器",hardware:"硬件",found:"发现环境",steps:"重现步骤",status:"Bug状态",subStatus:"子状态",color:"标题颜色",confirmed:"是否确认",activatedCount:"激活次数",activatedDate:"激活时间",feedbackBy:"反馈者",notifyEmail:"通知邮箱",mailto:"抄送给",openedBy:"由谁创建",openedDate:"创建日期",openedBuild:"影响版本",assignedTo:"指派给",assignedDate:"指派日期",deadline:"截止日期",resolvedBy:"解决者",resolution:"解决方案",resolvedBuild:"解决版本",resolvedDate:"解决日期",closedBy:"由谁关闭",closedDate:"关闭日期",duplicateBug:"重复Bug",relatedBug:"相关Bug",case:"来源用例",caseVersion:"用例版本",feedback:"相关反馈",result:"结果",repo:"所属版本库",mr:"合并请求",entry:"代码路径",lines:"代码行",v1:"版本1",v2:"版本2",repoType:"版本库类型",issueKey:"Sonarqube问题键值",testtask:"测试单",lastEditedBy:"最后修改者",lastEditedDate:"修改日期",deleted:"已删除"},testcase:{id:"用例编号",project:"所属项目",product:"所属产品",execution:"所属迭代",branch:"平台/分支",lib:"所属库",module:"所属模块",path:"路径",story:"相关软件需求",storyVersion:"软件需求版本",title:"用例名称",precondition:"前置条件",keywords:"关键词",pri:"优先级",type:"用例类型",auto:"自动化测试用例",frame:"自动化测试框架",stage:"适用环节",howRun:"测试方式",script:"自动化脚本",scriptedBy:"脚本由谁创建",scriptedDate:"脚本创建日期",scriptStatus:"脚本状态",scriptLocation:"脚本地址",status:"用例状态",subStatus:"子状态",color:"标题颜色",frequency:"使用频率",order:"排序",openedBy:"由谁创建",openedDate:"创建日期",reviewedBy:"由谁评审",reviewedDate:"评审时间",lastEditedBy:"最后修改者",lastEditedDate:"修改日期",version:"用例版本",linkCase:"相关用例",fromBug:"来源Bug",fromCaseID:"用例来源ID",fromCaseVersion:"用例来源版本",lastRunner:"执行人",lastRunDate:"执行时间",lastRunResult:"结果",scene:"所属场景",sort:"排序",deleted:"已删除"},task:{id:"编号",project:"所属项目",parent:"父任务",isParent:"是父任务",isTpl:"是模板",path:"路径",execution:"所属执行",module:"所属模块",design:"相关设计",story:"相关软件需求",storyVersion:"软件需求版本",designVersion:"设计版本",fromBug:"来源Bug",feedback:"相关反馈",fromIssue:"来源问题",docs:"关联文档",docVersions:"文档版本",name:"任务名称",type:"任务类型",mode:"任务模式",pri:"优先级",estimate:"最初预计",consumed:"总计消耗",left:"预计剩余",deadline:"截止日期",status:"任务状态",subStatus:"子状态",color:"标题颜色",mailto:"抄送给",keywords:"关键词",desc:"任务描述",version:"版本",openedBy:"由谁创建",openedDate:"创建日期",assignedTo:"指派给",assignedDate:"指派日期",estStarted:"预计开始",realStarted:"实际开始",finishedBy:"由谁完成",finishedDate:"实际完成",finishedList:"完成者列表",canceledBy:"由谁取消",canceledDate:"取消时间",closedBy:"由谁关闭",closedDate:"关闭时间",planDuration:"计划持续天数",realDuration:"实际持续天数",closedReason:"关闭原因",lastEditedBy:"最后修改",lastEditedDate:"最后修改日期",activatedDate:"激活日期",order:"排序",repo:"所属代码库",mr:"合并请求",entry:"代码路径",lines:"代码行",v1:"版本1",v2:"版本2",vision:"所属界面",deleted:"已删除"},feedback:{id:"编号",product:"所属产品",module:"所属模块",title:"反馈名称",type:"类型",solution:"处理方案",desc:"描述",pri:"优先级",status:"状态",subStatus:"子状态",prevStatus:"之前状态",public:"公开",notify:"通知",notifyEmail:"通知邮箱",source:"来源公司",likes:"点赞人",result:"转化结果",faq:"FAQ",openedBy:"创建者",openedDate:"创建时间",reviewedBy:"由谁评审",reviewedDate:"评审时间",processedBy:"由谁处理",processedDate:"处理时间",closedBy:"由谁关闭",closedDate:"关闭时间",closedReason:"关闭原因",editedBy:"最后处理人",editedDate:"最后操作时间",assignedTo:"指派给",prevAssignedTo:"之前指派人",assignedDate:"指派时间",activatedBy:"由谁激活",activatedDate:"激活时间",feedbackBy:"反馈者",repeatFeedback:"重复反馈",mailto:"抄送给",keywords:"关键词",deleted:"已删除"},ticket:{id:"工单编号",product:"所属产品",module:"所属模块",title:"工单名称",type:"类型",desc:"描述",openedBuild:"影响版本",feedback:"由反馈转化",assignedTo:"指派给",assignedDate:"指派日期",realStarted:"实际开始",startedBy:"由谁开始",startedDate:"开始时间",deadline:"截止日期",pri:"优先级",estimate:"最初预计",left:"预计剩余",status:"状态",openedBy:"由谁创建",openedDate:"创建时间",activatedCount:"激活次数",activatedBy:"由谁激活",activatedDate:"激活时间",closedBy:"关闭者",closedDate:"关闭时间",closedReason:"关闭原因",finishedBy:"完成者",finishedDate:"完成时间",resolvedBy:"解决者",resolvedDate:"解决时间",resolution:"解决方案",editedBy:"由谁编辑",editedDate:"最后修改时间",keywords:"关键字",repeatTicket:"重复工单",mailto:"抄送给",deleted:"已删除"},system:{id:"编号",name:"应用名称",product:"所属产品",integrated:"集成应用",latestRelease:"最新版本号",latestDate:"最新发布日期",children:"包含应用",status:"状态",desc:"描述",createdBy:"由谁创建",createdDate:"创建日期",editedBy:"由谁编辑",editedDate:"编辑日期",deleted:"已删除"},build:{id:"ID",project:"所属项目",product:"所属产品",branch:"平台/分支",execution:"所属迭代",builds:"包含构建",name:"名称",system:"所属应用",scmPath:"源代码地址",filePath:"下载地址",date:"打包日期",stories:"完成的软件需求",bugs:"解决的Bug",artifactRepoID:"制品库",builder:"构建者",desc:"描述",createdBy:"由谁创建",createdDate:"创建时间",deleted:"已删除"},testtask:{id:"编号",project:"所属项目",product:"所属产品",name:"测试单名称",execution:"所属执行",build:"提测构建",joint:"是否联调测试单",type:"测试类型",owner:"负责人",pri:"优先级",begin:"开始日期",end:"结束日期",realBegan:"实际开始日期",realFinishedDate:"实际完成日期",mailto:"抄送给",desc:"描述",report:"测试总结",status:"当前状态",testreport:"相关测试报告",auto:"自动化",subStatus:"子状态",createdBy:"由谁创建",createdDate:"创建时间",members:"参与人",deleted:"已删除"},release:{id:"ID",project:"所属项目",product:"所属产品",branch:"平台/分支",shadow:"影子构建",build:"构建",name:"应用版本号",system:"应用",releases:"包含应用",marker:"里程碑",date:"计划发布日期",releasedDate:"实际发布日期",stories:"完成的软件需求",bugs:"解决的Bug",leftBugs:"遗留的Bug",desc:"描述",mailto:"抄送给",notify:"发送通知",status:"发布状态",subStatus:"子状态",createdBy:"由谁创建",createdDate:"创建时间",deleted:"已删除"},file:{id:"编号",pathname:"路径",title:"标题",extension:"文件类型",size:"大小",objectType:"对象类型",objectID:"对象ID",gid:"全局标识",addedBy:"由谁添加",addedDate:"添加时间",downloads:"下载次数",extra:"备注",deleted:"已删除"}};function Z(B){return _().get(B.toLowerCase())}function I(B,D){let W=Z(B);if(!W)return;let R=D==="ls"?"list":D,Q=W.actions.find((X)=>String(X.name).toLowerCase()===R.toLowerCase());if(Q)return Q;if(!new Set(["list","get","create","update","delete"]).has(R)){let X=W.actions.find((J)=>J.type==="action"&&String(J.name).toLowerCase()===R.toLowerCase());if(X)return X}return}function x(B,D,W){let{roles:R}=W??{},Q=[],C=I(B,D);if(!C)return[];if(C.pathParams&&(!R||R.includes("path")))Object.entries(C.pathParams).forEach(([J,V])=>{if(typeof V==="string")V={description:V};Q.push({name:J,role:"path",required:!0,...V})});if(C.params&&(!R||R.includes("query")))Q.push(...C.params.map((J)=>({...J,role:"query"})));let X=C.requestBody?.schema;if(X&&(!R||R.includes("body")))if(X.type==="object"){let J=new Set(X.required?X.required.map((V)=>V.toLowerCase()):[]);Object.entries(X.properties).forEach(([V,w])=>{Q.push({name:V,role:"body",required:w.required??J.has(V.toLowerCase()),type:(w.type==="integer"?"number":w.type)??"string",...w})})}else Q.push({name:"data",role:"body",required:!0,type:X.type});return Q}function RB(){return k().map((B)=>B.name)}function QB(B){return BD[B]}function FB(B){if(Array.isArray(B))return B.filter((D)=>typeof D!=="function").map((D)=>FB(D));if(B&&typeof B==="object"){let D={};for(let[W,R]of Object.entries(B))if(typeof R!=="function")D[W]=FB(R);return D}return B}function CB(B={}){let D=B.raw??!1,W=B.jsonSafe??!0,R={};return _().forEach((Q)=>{let C=D?Q:{...Q,actions:Q.actions.map((X)=>{let{requestBody:J,...V}=X;return{...V,bodyParams:J?x(Q.name,X.name,{roles:["body"]}):[]}})};R[Q.name]=W?FB(C):C}),R}eB(zB);zB();var DD={product:"products",project:"projects",execution:"executions"},mD=new Set(Object.values(DD)),uD=["execution","project","product"];function tD(B){let{scope:D,scopeID:W}=B;if(!P(D)&&!P(W)){let R=String(D);if(!mD.has(R))throw new $("E_INVALID_PARAM",{param:"scope",value:R});let Q=Number(W);if(Number.isNaN(Q))throw new $("E_INVALID_PARAM",{param:"scopeID",value:String(W)});return{scope:R,scopeID:Q}}for(let R of uD){let Q=B[R]??B[`${R}ID`];if(P(Q))continue;let C=Number(Q);if(!Number.isNaN(C))return{scope:DD[R],scopeID:C}}return}function iD(B,D){return B.path.replace(/\{(\w+)\}/g,(W,R)=>{let Q=D[R];if(P(Q))throw new $("E_MISSING_PARAM",{param:R});return String(Q)})}function nD(B){if(B===void 0)return;if(typeof B==="string")try{let D=JSON.parse(B);return G(D)?D:void 0}catch{return}return G(B)?B:void 0}var pD=new Set(["true","1","yes","on"]),sD=new Set(["false","0","no","off"]);function lD(B,D,W,R=!1){if(B===void 0||B===null)return B;if(D==="number"||D==="integer"){let Q=Number(B);return Number.isNaN(Q)?B:Q}if(D==="boolean"){if(typeof B==="boolean")return B;if(typeof B==="number"){if(B===1)return!0;if(B===0)return!1;throw new $("E_INVALID_PARAM",{param:W,value:String(B)})}if(typeof B==="string"){let Q=B.trim().toLowerCase();if(pD.has(Q))return!0;if(sD.has(Q))return!1;throw new $("E_INVALID_PARAM",{param:W,value:B})}throw new $("E_INVALID_PARAM",{param:W,value:String(B)})}if(D==="array"){if(Array.isArray(B))return B;if(typeof B==="string")return B.split(",");if(R&&G(B))return B;return[B]}return B}function rD(B,D,W){let R={},Q=Object.keys(D.pathParams??{});if(Q.includes("scope")){let w=tD(W);if(!w)throw new $("E_MISSING_PARAM",{param:"scope/scopeID or product/project/execution"});R.scope=w.scope,R.scopeID=w.scopeID}let C=Q.find((w)=>w.endsWith("ID")&&w!=="scopeID"),X=W.id??W[`${B.name}ID`]??(C?W[C]:void 0),J=X===void 0?Number.NaN:Number(X),V=Number.isNaN(J)?void 0:J;if(C&&V!==void 0)R[C]=V;for(let w of Q){if(w==="scope"||w==="scopeID"||R[w]!==void 0)continue;let H=D.pathParams?.[w],Y=W[w];if(Y!==void 0){R[w]=Y;continue}if(typeof H==="object"){if(H.defaultValue!==void 0)R[w]=H.defaultValue;else if(H.options?.[0]?.value!==void 0)R[w]=H.options[0].value}if(R[w]===void 0)throw new $("E_MISSING_PARAM",{param:w})}return{values:R,id:V}}function aD(B,D){let W={};for(let R of B.params??[]){let Q=D[R.name];if(Q===void 0&&R.name==="pageID")Q=D.page;if(Q===void 0)Q=R.defaultValue??R.options?.[0]?.value;if(Q===void 0&&R.required)throw new $("E_MISSING_PARAM",{param:R.name});if(Q!==void 0)W[R.name]=Q}return W}function oD(B,D){let W=nD(D.data);if(B.requestBody?.schema?.type!=="object")return W;let R=W?{...W}:{},Q=B.requestBody.schema,C=new Set(Q.required??[]);for(let[X,J]of Object.entries(Q.properties??{})){let V=Object.prototype.hasOwnProperty.call(R,X),w=Object.prototype.hasOwnProperty.call(D,X),H=V?R[X]:w?D[X]:J.defaultValue;if(H===void 0&&(J.required||C.has(X)))throw new $("E_MISSING_PARAM",{param:X});let Y=lD(H,J.type,X,V);if(Y!==void 0)R[X]=Y}return R}function WD(B,D,W={}){let R=I(B.name,D);if(!R)throw new $("E_INVALID_ACTION",{module:B.name,action:D});let{values:Q,id:C}=rD(B,R,W);return{module:B.name,action:R,params:W,path:iD(R,Q),query:aD(R,W),data:oD(R,W),id:C}}function RD(B,D,W={}){let R=B.resultGetter;if(!R)return D.data??D;if(typeof R==="function")return R(D,W);if(typeof R==="string")return L(D,R);let Q={};for(let[C,X]of Object.entries(R))Q[C]=L(D,X);return Q}function QD(B,D,W={}){let R=B.pagerGetter;if(!R)return D.pager;if(typeof R==="function")return R(D,W);if(typeof R==="string")return L(D,R);let Q=L(D,R.pageID),C=L(D,R.recPerPage),X=L(D,R.recTotal);if(Q===void 0||C===void 0||X===void 0)return;return{pageID:Number(Q),recPerPage:Number(C),recTotal:Number(X)}}function eD(B){let D=B.split("/");if(D.length>2||!D[0])throw new $("E_INVALID_REQUEST_NAME");let[W,R]=D;if(!R?.length)return{moduleName:W,actionName:"list"};if(Number.isInteger(Number(R)))return{moduleName:W,actionName:"get",id:Number(R)};return{moduleName:W,actionName:R}}function BW(B){let D=B;if(typeof D==="string")try{D=JSON.parse(D)}catch{return new Set}if(D&&typeof D==="object"&&!Array.isArray(D))return new Set(Object.keys(D));return new Set}async function DW(B,D,W,R){let Q=D.requestBody?.schema?.properties,C=B.actions.find((w)=>w.type==="get");if(!Q||!C)return W;let X=(await XB(`${B.name}/${C.name}`,W,{client:R.client,timeout:R.timeout,insecure:R.insecure,throwOnFail:!0})).data;if(!G(X))return W;let J=BW(W.data),V={...W};for(let w of Object.keys(Q))if(!(Object.prototype.hasOwnProperty.call(W,w)||J.has(w))&&Object.prototype.hasOwnProperty.call(X,w))V[w]=X[w];return V}function WW(B){if(typeof B==="string")return B;if(B===void 0)return;try{return JSON.stringify(B)}catch{return String(B)}}function RW(B){for(let D of["code","errorCode","errno"]){let W=B[D];if(typeof W==="string"||typeof W==="number")return W}return}function QW(B){return Boolean(B.convert||B.filter&&B.filter.length>0||B.search&&B.search.length>0||B.sort||B.limit||B.pick&&B.pick.length>0)}function CW(B,D){if(Array.isArray(B)){if(!QW(D))return B;if(B.every(G))return j(B,{convert:D.convert,filter:D.filter,search:D.search,searchFields:D.searchFields,sort:D.sort,limit:D.limit,pick:D.pick});let W=Number(D.limit);return Number.isFinite(W)&&W>=0?B.slice(0,Math.floor(W)):B}if(G(B)&&(D.convertSingle||D.pick&&D.pick.length>0))return j(B,{convert:D.convertSingle,pick:D.pick});return B}function XW(B,D,W){if(!D||typeof D!=="object"||Array.isArray(D))return{status:"success",data:D};let R=D,Q=R.status==="fail"?"fail":"success",C=CW(RD(B.action,R,B.params),W),X=R.message,J=QD(B.action,R,B.params),V={status:Q,message:WW(X),data:C,pager:J?{total:Number(J.recTotal),page:Number(J.pageID),recPerPage:Number(J.recPerPage)}:void 0};if(X!==void 0&&typeof X!=="string")V.rawMessage=X;let w=RW(R);if(w!==void 0)V.apiCode=w;if(Q==="fail")V.raw=R;return V}async function XB(B,D={},W={}){let R=O(),Q=W.client??R.client;if(!Q)throw new $("E_NO_GLOBAL_CLIENT");let{moduleName:C,actionName:X,id:J}=eD(B),V=Z(C);if(!V)throw new $("E_INVALID_MODULE",{module:C});let w=D.recPerPage??W.recPerPage??R.recPerPage,H={...D,...J!==void 0?{id:J}:{},...w!==void 0?{recPerPage:w}:{}},Y=I(C,X);if(!Y)throw new $("E_INVALID_ACTION",{module:C,action:X});let A=Y.type==="update"&&(W.autoFill??R.autoFill)?await DW(V,Y,H,W):H,g=WD(V,X,A),T=await Q.request(g.path,{method:String(g.action.method).toUpperCase(),query:g.query,body:g.data,timeout:W.timeout??R.timeout,insecure:W.insecure??R.insecure});if(W.raw)return T;let i={...W,limit:W.limit??R.limit},n=XW(g,T,i);if(n.status==="fail"&&(W.throwOnFail??R.throwOnFail))throw new $("E_API_FAILED",{message:n.message??""},n);return n}var _B="2026-08-12T07:18:23.603Z",ZB="0.5.4";var PB=globalThis;PB.ZentaoAPI=$B;if(PB.window)PB.window.ZentaoAPI=$B;})();
@@ -124,4 +124,32 @@ export function applyBuiltinOverrides() {
124
124
  return action;
125
125
  });
126
126
  });
127
+ // 修改 BUG 列表选项
128
+ extendModuleAction('bug', 'list', (action) => {
129
+ const params = action.params;
130
+ const browseTypeParam = params?.find((param) => param.name === 'browseType');
131
+ if (browseTypeParam && browseTypeParam.options?.length) {
132
+ const options = browseTypeParam.options;
133
+ const assignedtomeOption = options.find(x => x.value === 'assignedtome');
134
+ if (assignedtomeOption) {
135
+ browseTypeParam.options = [
136
+ ...options.filter(x => x !== assignedtomeOption),
137
+ {
138
+ ...assignedtomeOption,
139
+ value: 'assigntome',
140
+ }
141
+ ];
142
+ }
143
+ if (!browseTypeParam.options.some(x => x.value === 'resolvedbyme')) {
144
+ browseTypeParam.options = [
145
+ ...browseTypeParam.options,
146
+ {
147
+ value: 'resolvedbyme',
148
+ label: '由我解决',
149
+ }
150
+ ];
151
+ }
152
+ }
153
+ return action;
154
+ });
127
155
  }
package/dist/version.js CHANGED
@@ -1,5 +1,5 @@
1
- const fallbackBuild = "2026-08-12T03:04:33.420Z";
2
- const fallbackVersion = "0.5.3";
1
+ const fallbackBuild = "2026-08-12T07:18:23.603Z";
2
+ const fallbackVersion = "0.5.4";
3
3
  /**
4
4
  * 构建标识,由构建脚本通过 `__ZENTAO_API_BUILD__` 注入。
5
5
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zentao-api",
3
- "version": "0.5.3",
3
+ "version": "0.5.4",
4
4
  "type": "module",
5
5
  "description": "Browser and Node.js SDK for ZenTao API",
6
6
  "license": "MIT",