documents.yaml 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769
  1. Documents:
  2. get:
  3. operationId: listDocuments
  4. summary: 分页查询主案和子方案
  5. parameters:
  6. - $ref: '../components/parameters.yaml#/XRequestId'
  7. - {name: documentType, in: query, schema: {type: string, default: MAIN}}
  8. - {name: categoryId, in: query, schema: {$ref: '../components/schemas.yaml#/StringId'}}
  9. - name: includeDescendants
  10. in: query
  11. description: 与categoryId同时使用时,是否包含全部有效后代分类;默认false。
  12. schema: {type: boolean, default: false}
  13. - {name: keyword, in: query, schema: {type: string}}
  14. - {name: securityLevel, in: query, schema: {$ref: '../components/schemas.yaml#/SecurityLevel'}}
  15. - {name: status, in: query, schema: {$ref: '../components/schemas.yaml#/DocumentStatus'}}
  16. - $ref: '../components/parameters.yaml#/UpdatedFrom'
  17. - $ref: '../components/parameters.yaml#/UpdatedTo'
  18. - name: sortBy
  19. in: query
  20. schema:
  21. type: string
  22. enum: [documentName, createdAt, updatedAt, viewCount, downloadCount]
  23. default: updatedAt
  24. - {name: sortDirection, in: query, schema: {type: string, enum: [asc, desc], default: desc}}
  25. - {name: page, in: query, schema: {type: integer, minimum: 1, default: 1}}
  26. - {name: pageSize, in: query, schema: {type: integer, minimum: 1, maximum: 100, default: 20}}
  27. responses:
  28. '200': {description: 方案分页, content: {application/json: {schema: {$ref: '../components/schemas.yaml#/DocumentPageResponse'}}}}
  29. '400': {$ref: '../components/responses.yaml#/InvalidArgument'}
  30. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  31. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  32. '404': {$ref: '../components/responses.yaml#/NotFound'}
  33. '500': {$ref: '../components/responses.yaml#/InternalError'}
  34. post:
  35. operationId: createDocument
  36. summary: 上传主案或子方案
  37. requestBody:
  38. required: true
  39. content:
  40. multipart/form-data:
  41. schema:
  42. type: object
  43. additionalProperties: false
  44. required: [file, metadata]
  45. properties:
  46. file: {type: string, format: binary}
  47. metadata:
  48. type: string
  49. description: DocumentCreateMetadata的JSON字符串。
  50. responses:
  51. '201': {description: 上传成功, content: {application/json: {schema: {$ref: '../components/schemas.yaml#/DocumentDetailResponse'}}}}
  52. '400': {$ref: '../components/responses.yaml#/InvalidArgument'}
  53. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  54. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  55. '404': {$ref: '../components/responses.yaml#/NotFound'}
  56. '409': {$ref: '../components/responses.yaml#/Conflict'}
  57. '413': {$ref: '../components/responses.yaml#/PayloadTooLarge'}
  58. '415': {$ref: '../components/responses.yaml#/UnsupportedMedia'}
  59. '500': {$ref: '../components/responses.yaml#/InternalError'}
  60. Document:
  61. parameters:
  62. - {name: id, in: path, required: true, schema: {$ref: '../components/schemas.yaml#/StringId'}}
  63. get:
  64. operationId: getDocument
  65. summary: 查询主案或子方案详情
  66. responses:
  67. '200': {description: 方案详情, content: {application/json: {schema: {$ref: '../components/schemas.yaml#/DocumentDetailResponse'}}}}
  68. '400': {$ref: '../components/responses.yaml#/InvalidArgument'}
  69. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  70. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  71. '404': {$ref: '../components/responses.yaml#/NotFound'}
  72. '500': {$ref: '../components/responses.yaml#/InternalError'}
  73. put:
  74. operationId: updateDocument
  75. summary: 编辑方案文档元数据
  76. parameters:
  77. - $ref: '../components/parameters.yaml#/XDocumentPassword'
  78. requestBody:
  79. required: true
  80. content:
  81. application/json:
  82. schema: {$ref: '../components/schemas.yaml#/UpdateDocumentRequest'}
  83. responses:
  84. '200': {description: 编辑成功, content: {application/json: {schema: {$ref: '../components/schemas.yaml#/DocumentDetailResponse'}}}}
  85. '400': {$ref: '../components/responses.yaml#/InvalidArgument'}
  86. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  87. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  88. '404': {$ref: '../components/responses.yaml#/NotFound'}
  89. '409': {$ref: '../components/responses.yaml#/Conflict'}
  90. '500': {$ref: '../components/responses.yaml#/InternalError'}
  91. delete:
  92. operationId: deleteDocument
  93. summary: 逻辑删除方案文档
  94. parameters:
  95. - {name: rowVersion, in: query, required: true, schema: {type: integer, minimum: 0}}
  96. responses:
  97. '200': {description: 删除成功, content: {application/json: {schema: {$ref: '../components/schemas.yaml#/DeleteDocumentResponse'}}}}
  98. '400': {$ref: '../components/responses.yaml#/InvalidArgument'}
  99. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  100. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  101. '404': {$ref: '../components/responses.yaml#/NotFound'}
  102. '409': {$ref: '../components/responses.yaml#/Conflict'}
  103. '500': {$ref: '../components/responses.yaml#/InternalError'}
  104. SubPlans:
  105. parameters:
  106. - {name: id, in: path, required: true, schema: {$ref: '../components/schemas.yaml#/StringId'}}
  107. get:
  108. operationId: listMainPlanSubPlans
  109. summary: 查询主案的直接子方案
  110. parameters:
  111. - {name: keyword, in: query, schema: {type: string}}
  112. - {name: status, in: query, schema: {$ref: '../components/schemas.yaml#/DocumentStatus'}}
  113. - $ref: '../components/parameters.yaml#/UpdatedFrom'
  114. - $ref: '../components/parameters.yaml#/UpdatedTo'
  115. - name: sortBy
  116. in: query
  117. schema: {type: string, enum: [documentName, createdAt, updatedAt, viewCount, downloadCount], default: updatedAt}
  118. - {name: sortDirection, in: query, schema: {type: string, enum: [asc, desc], default: desc}}
  119. - {name: page, in: query, schema: {type: integer, minimum: 1, default: 1}}
  120. - {name: pageSize, in: query, schema: {type: integer, minimum: 1, maximum: 100, default: 20}}
  121. responses:
  122. '200': {description: 子方案分页, content: {application/json: {schema: {$ref: '../components/schemas.yaml#/DocumentPageResponse'}}}}
  123. '400': {$ref: '../components/responses.yaml#/InvalidArgument'}
  124. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  125. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  126. '404': {$ref: '../components/responses.yaml#/NotFound'}
  127. '500': {$ref: '../components/responses.yaml#/InternalError'}
  128. Attachments:
  129. get:
  130. operationId: listAttachments
  131. summary: 分页查询独立共享附件库(全量可见,普通用户allowedActions为空且不返回description/contentSnippet)
  132. description: 所有登录用户可访问,支撑全局检索按标题命中全部附件;附件内容访问由详情/预览/下载接口按挂载主案权限独立拦截。
  133. parameters:
  134. - $ref: '../components/parameters.yaml#/XRequestId'
  135. - {name: keyword, in: query, schema: {type: string}}
  136. - {name: attachmentType, in: query, schema: {$ref: '../components/schemas.yaml#/AttachmentType'}}
  137. - {name: fileExtension, in: query, schema: {type: string}}
  138. - $ref: '../components/parameters.yaml#/UpdatedFrom'
  139. - $ref: '../components/parameters.yaml#/UpdatedTo'
  140. - name: sortBy
  141. in: query
  142. schema: {type: string, enum: [documentName, createdAt, updatedAt, viewCount, downloadCount], default: updatedAt}
  143. - {name: sortDirection, in: query, schema: {type: string, enum: [asc, desc], default: desc}}
  144. - {name: page, in: query, schema: {type: integer, minimum: 1, default: 1}}
  145. - {name: pageSize, in: query, schema: {type: integer, minimum: 1, maximum: 100, default: 20}}
  146. responses:
  147. '200': {description: 附件分页, content: {application/json: {schema: {$ref: '../components/schemas.yaml#/DocumentPageResponse'}}}}
  148. '400': {$ref: '../components/responses.yaml#/InvalidArgument'}
  149. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  150. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  151. '404': {$ref: '../components/responses.yaml#/NotFound'}
  152. '500': {$ref: '../components/responses.yaml#/InternalError'}
  153. post:
  154. operationId: createAttachment
  155. summary: 上传共享附件
  156. requestBody:
  157. required: true
  158. content:
  159. multipart/form-data:
  160. schema:
  161. type: object
  162. additionalProperties: false
  163. required: [file, metadata]
  164. properties:
  165. file: {type: string, format: binary}
  166. metadata:
  167. type: string
  168. description: AttachmentCreateMetadata的JSON字符串。
  169. responses:
  170. '201': {description: 上传成功, content: {application/json: {schema: {$ref: '../components/schemas.yaml#/DocumentDetailResponse'}}}}
  171. '400': {$ref: '../components/responses.yaml#/InvalidArgument'}
  172. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  173. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  174. '413': {$ref: '../components/responses.yaml#/PayloadTooLarge'}
  175. '415': {$ref: '../components/responses.yaml#/UnsupportedMedia'}
  176. '500': {$ref: '../components/responses.yaml#/InternalError'}
  177. Attachment:
  178. parameters:
  179. - {name: id, in: path, required: true, schema: {$ref: '../components/schemas.yaml#/StringId'}}
  180. get:
  181. operationId: getAttachment
  182. summary: 查询共享附件详情
  183. responses:
  184. '200': {description: 附件详情, content: {application/json: {schema: {$ref: '../components/schemas.yaml#/DocumentDetailResponse'}}}}
  185. '400': {$ref: '../components/responses.yaml#/InvalidArgument'}
  186. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  187. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  188. '404': {$ref: '../components/responses.yaml#/NotFound'}
  189. '500': {$ref: '../components/responses.yaml#/InternalError'}
  190. put:
  191. operationId: updateAttachment
  192. summary: 编辑共享附件元数据
  193. requestBody:
  194. required: true
  195. content:
  196. application/json:
  197. schema: {$ref: '../components/schemas.yaml#/UpdateAttachmentRequest'}
  198. responses:
  199. '200': {description: 编辑成功, content: {application/json: {schema: {$ref: '../components/schemas.yaml#/DocumentDetailResponse'}}}}
  200. '400': {$ref: '../components/responses.yaml#/InvalidArgument'}
  201. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  202. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  203. '404': {$ref: '../components/responses.yaml#/NotFound'}
  204. '409': {$ref: '../components/responses.yaml#/Conflict'}
  205. '500': {$ref: '../components/responses.yaml#/InternalError'}
  206. delete:
  207. operationId: deleteAttachment
  208. summary: 逻辑删除共享附件
  209. parameters:
  210. - {name: rowVersion, in: query, required: true, schema: {type: integer, minimum: 0}}
  211. responses:
  212. '200': {description: 删除成功, content: {application/json: {schema: {$ref: '../components/schemas.yaml#/DeleteDocumentResponse'}}}}
  213. '400': {$ref: '../components/responses.yaml#/InvalidArgument'}
  214. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  215. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  216. '404': {$ref: '../components/responses.yaml#/NotFound'}
  217. '409': {$ref: '../components/responses.yaml#/Conflict'}
  218. '500': {$ref: '../components/responses.yaml#/InternalError'}
  219. DocumentBatchImport:
  220. post:
  221. operationId: batchImportDocuments
  222. summary: 批量导入主案和子方案
  223. requestBody:
  224. required: true
  225. content:
  226. multipart/form-data:
  227. schema:
  228. $ref: '../components/schemas.yaml#/BatchImportMultipart'
  229. responses:
  230. '200': {description: 逐文件导入结果, content: {application/json: {schema: {$ref: '../components/schemas.yaml#/BatchImportResponse'}}}}
  231. '400': {$ref: '../components/responses.yaml#/InvalidArgument'}
  232. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  233. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  234. '413': {$ref: '../components/responses.yaml#/PayloadTooLarge'}
  235. '500': {$ref: '../components/responses.yaml#/InternalError'}
  236. AttachmentBatchImport:
  237. post:
  238. operationId: batchImportAttachments
  239. summary: 批量导入共享附件
  240. requestBody:
  241. required: true
  242. content:
  243. multipart/form-data:
  244. schema:
  245. $ref: '../components/schemas.yaml#/BatchImportMultipart'
  246. responses:
  247. '200': {description: 逐文件导入结果, content: {application/json: {schema: {$ref: '../components/schemas.yaml#/BatchImportResponse'}}}}
  248. '400': {$ref: '../components/responses.yaml#/InvalidArgument'}
  249. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  250. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  251. '413': {$ref: '../components/responses.yaml#/PayloadTooLarge'}
  252. '500': {$ref: '../components/responses.yaml#/InternalError'}
  253. DocumentPreview:
  254. parameters:
  255. - {name: id, in: path, required: true, schema: {$ref: '../components/schemas.yaml#/StringId'}}
  256. get:
  257. operationId: previewDocument
  258. summary: PDF直接预览;DOC、DOCX、WPS由LibreOffice离线转换为PDF后预览
  259. parameters:
  260. - $ref: '../components/parameters.yaml#/XDocumentPassword'
  261. responses:
  262. '200':
  263. description: PDF文件流(PDF原文件或DOC/DOCX/WPS转换后的PDF)
  264. headers:
  265. X-Request-Id: {schema: {type: string, format: uuid}}
  266. content:
  267. application/pdf: {schema: {type: string, format: binary}}
  268. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  269. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  270. '404': {$ref: '../components/responses.yaml#/NotFound'}
  271. '415': {$ref: '../components/responses.yaml#/UnsupportedMedia'}
  272. '502': {$ref: '../components/responses.yaml#/PreviewConversionFailed'}
  273. '503': {$ref: '../components/responses.yaml#/PreviewConverterUnavailable'}
  274. '504': {$ref: '../components/responses.yaml#/PreviewConversionTimeout'}
  275. '500': {$ref: '../components/responses.yaml#/InternalError'}
  276. DocumentDownload:
  277. parameters:
  278. - {name: id, in: path, required: true, schema: {$ref: '../components/schemas.yaml#/StringId'}}
  279. get:
  280. operationId: downloadDocument
  281. summary: 下载原始文档
  282. parameters:
  283. - $ref: '../components/parameters.yaml#/XDocumentPassword'
  284. responses:
  285. '200':
  286. description: 原始文件流
  287. headers:
  288. X-Request-Id: {schema: {type: string, format: uuid}}
  289. content:
  290. application/octet-stream: {schema: {type: string, format: binary}}
  291. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  292. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  293. '404': {$ref: '../components/responses.yaml#/NotFound'}
  294. '500': {$ref: '../components/responses.yaml#/InternalError'}
  295. AttachmentMainPlans:
  296. parameters:
  297. - {name: id, in: path, required: true, schema: {$ref: '../components/schemas.yaml#/StringId'}}
  298. get:
  299. operationId: listAttachmentMainPlans
  300. summary: 查询共享附件挂载的可见主案
  301. responses:
  302. '200': {description: 主案简要集合, content: {application/json: {schema: {$ref: '../components/schemas.yaml#/MainPlanBriefCollectionResponse'}}}}
  303. '400': {$ref: '../components/responses.yaml#/InvalidArgument'}
  304. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  305. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  306. '404': {$ref: '../components/responses.yaml#/NotFound'}
  307. '500': {$ref: '../components/responses.yaml#/InternalError'}
  308. MainPlanAttachments:
  309. parameters:
  310. - {name: id, in: path, required: true, schema: {$ref: '../components/schemas.yaml#/StringId'}}
  311. get:
  312. operationId: listMainPlanAttachments
  313. summary: 查询主案已挂载共享附件
  314. parameters:
  315. - {name: keyword, in: query, schema: {type: string}}
  316. - {name: attachmentType, in: query, schema: {$ref: '../components/schemas.yaml#/AttachmentType'}}
  317. - $ref: '../components/parameters.yaml#/UpdatedFrom'
  318. - $ref: '../components/parameters.yaml#/UpdatedTo'
  319. - {name: page, in: query, schema: {type: integer, minimum: 1, default: 1}}
  320. - {name: pageSize, in: query, schema: {type: integer, minimum: 1, maximum: 100, default: 20}}
  321. responses:
  322. '200': {description: 挂载附件分页, content: {application/json: {schema: {$ref: '../components/schemas.yaml#/AttachmentBindingPageResponse'}}}}
  323. '400': {$ref: '../components/responses.yaml#/InvalidArgument'}
  324. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  325. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  326. '404': {$ref: '../components/responses.yaml#/NotFound'}
  327. '500': {$ref: '../components/responses.yaml#/InternalError'}
  328. MainPlanAttachmentBinding:
  329. parameters:
  330. - {name: id, in: path, required: true, schema: {$ref: '../components/schemas.yaml#/StringId'}}
  331. post:
  332. operationId: bindMainPlanAttachments
  333. summary: 批量挂载共享附件到主案
  334. parameters:
  335. - $ref: '../components/parameters.yaml#/XDocumentPassword'
  336. requestBody:
  337. required: true
  338. content:
  339. application/json:
  340. schema: {$ref: '../components/schemas.yaml#/BindAttachmentsRequest'}
  341. responses:
  342. '200': {description: 挂载结果, content: {application/json: {schema: {$ref: '../components/schemas.yaml#/BindAttachmentsResponse'}}}}
  343. '400': {$ref: '../components/responses.yaml#/InvalidArgument'}
  344. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  345. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  346. '404': {$ref: '../components/responses.yaml#/NotFound'}
  347. '409': {$ref: '../components/responses.yaml#/Conflict'}
  348. '500': {$ref: '../components/responses.yaml#/InternalError'}
  349. MainPlanAttachmentsReorder:
  350. parameters:
  351. - {name: id, in: path, required: true, schema: {$ref: '../components/schemas.yaml#/StringId'}}
  352. put:
  353. operationId: reorderMainPlanAttachments
  354. summary: 调整主案下挂载附件的显示顺序
  355. description: 顺序存于挂载关系,同一附件在不同主案中可各自独立排序。
  356. parameters:
  357. - $ref: '../components/parameters.yaml#/XRequestId'
  358. requestBody:
  359. required: true
  360. content:
  361. application/json:
  362. schema: {$ref: '../components/schemas.yaml#/ReorderAttachmentsRequest'}
  363. responses:
  364. '200': {description: 重排结果, content: {application/json: {schema: {$ref: '../components/schemas.yaml#/ReorderAttachmentsResponse'}}}}
  365. '400': {$ref: '../components/responses.yaml#/InvalidArgument'}
  366. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  367. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  368. '404': {$ref: '../components/responses.yaml#/NotFound'}
  369. '409': {$ref: '../components/responses.yaml#/Conflict'}
  370. '500': {$ref: '../components/responses.yaml#/InternalError'}
  371. MainPlanAttachment:
  372. parameters:
  373. - {name: id, in: path, required: true, schema: {$ref: '../components/schemas.yaml#/StringId'}}
  374. - {name: attachmentId, in: path, required: true, schema: {$ref: '../components/schemas.yaml#/StringId'}}
  375. delete:
  376. operationId: unbindMainPlanAttachment
  377. summary: 解除主案和共享附件的挂载
  378. parameters:
  379. - {name: mainPlanRowVersion, in: query, required: true, schema: {type: integer, minimum: 0}}
  380. - $ref: '../components/parameters.yaml#/XDocumentPassword'
  381. responses:
  382. '200': {description: 解除挂载结果, content: {application/json: {schema: {$ref: '../components/schemas.yaml#/UnbindAttachmentResponse'}}}}
  383. '400': {$ref: '../components/responses.yaml#/InvalidArgument'}
  384. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  385. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  386. '404': {$ref: '../components/responses.yaml#/NotFound'}
  387. '409': {$ref: '../components/responses.yaml#/Conflict'}
  388. '500': {$ref: '../components/responses.yaml#/InternalError'}
  389. DocumentsTags:
  390. get:
  391. operationId: listMainPlanTags
  392. summary: 聚合当前用户可见的主案标签
  393. description: 标签集合不随分类、关键词等筛选变化;按Unicode升序返回。
  394. parameters:
  395. - $ref: '../components/parameters.yaml#/XRequestId'
  396. responses:
  397. '200': {description: 标签集合, content: {application/json: {schema: {$ref: '../components/schemas.yaml#/DocumentTagsResponse'}}}}
  398. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  399. '500': {$ref: '../components/responses.yaml#/InternalError'}
  400. DocumentsReorder:
  401. put:
  402. operationId: reorderDocuments
  403. summary: 管理员拖动重排主案/子方案
  404. description: 主案在全局范围排序,子方案在所属主案内排序,共享附件不支持;orderedIds为拖动后的目标顺序。
  405. parameters:
  406. - $ref: '../components/parameters.yaml#/XRequestId'
  407. requestBody:
  408. required: true
  409. content:
  410. application/json:
  411. schema: {$ref: '../components/schemas.yaml#/ReorderDocumentsRequest'}
  412. responses:
  413. '200': {description: 重排结果, content: {application/json: {schema: {$ref: '../components/schemas.yaml#/ReorderDocumentsResponse'}}}}
  414. '400': {$ref: '../components/responses.yaml#/InvalidArgument'}
  415. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  416. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  417. '404': {$ref: '../components/responses.yaml#/NotFound'}
  418. '409': {$ref: '../components/responses.yaml#/Conflict'}
  419. '500': {$ref: '../components/responses.yaml#/InternalError'}
  420. DocumentPassword:
  421. parameters:
  422. - {name: id, in: path, required: true, schema: {$ref: '../components/schemas.yaml#/StringId'}}
  423. put:
  424. operationId: saveDocumentPassword
  425. summary: 设置/修改/清除主案密码锁(仅MAIN)
  426. description: |
  427. 未设密时设置:password+protectedActions必填;已设密时修改/清除:oldPassword必填且正确;
  428. password缺省或空表示清除。任何人(含ADMIN)修改/清除均需原密码;rowVersion乐观锁校验。
  429. requestBody:
  430. required: true
  431. content:
  432. application/json:
  433. schema: {$ref: '../components/schemas.yaml#/UpdateDocumentPasswordRequest'}
  434. responses:
  435. '200': {description: 密码锁摘要, content: {application/json: {schema: {$ref: '../components/schemas.yaml#/DocumentPasswordResponse'}}}}
  436. '400': {$ref: '../components/responses.yaml#/InvalidArgument'}
  437. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  438. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  439. '404': {$ref: '../components/responses.yaml#/NotFound'}
  440. '409': {$ref: '../components/responses.yaml#/Conflict'}
  441. '500': {$ref: '../components/responses.yaml#/InternalError'}
  442. DocumentDescription:
  443. parameters:
  444. - {name: id, in: path, required: true, schema: {$ref: '../components/schemas.yaml#/StringId'}}
  445. put:
  446. operationId: updateDocumentDescription
  447. summary: 维护文档详细说明(主案/子案/附件通用,不校验rowVersion)
  448. parameters:
  449. - $ref: '../components/parameters.yaml#/XDocumentPassword'
  450. requestBody:
  451. required: true
  452. content:
  453. application/json:
  454. schema: {$ref: '../components/schemas.yaml#/UpdateDocumentDescriptionRequest'}
  455. responses:
  456. '200': {description: 保存后的文档详情, content: {application/json: {schema: {$ref: '../components/schemas.yaml#/DocumentDetailResponse'}}}}
  457. '400': {$ref: '../components/responses.yaml#/InvalidArgument'}
  458. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  459. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  460. '404': {$ref: '../components/responses.yaml#/NotFound'}
  461. '500': {$ref: '../components/responses.yaml#/InternalError'}
  462. DocumentReExtract:
  463. parameters:
  464. - {name: id, in: path, required: true, schema: {$ref: '../components/schemas.yaml#/StringId'}}
  465. post:
  466. operationId: reExtractDocumentContent
  467. summary: 重新提取文档正文(仅管理员,主案/子案/附件通用)
  468. description: |
  469. 按当前存储文件重新解析正文并回写 contentText/searchText 与提取状态;
  470. Office 类型(doc/wps/xls/xlsx/et)先经 LibreOffice 转 PDF 再提取。
  471. 提取结果(含失败原因 contentExtractError)覆盖写回,rowVersion 递增,
  472. 审计复用 EDIT_DOCUMENT(detail.scope=reExtractContent)。
  473. responses:
  474. '200': {description: 重新提取后的文档详情, content: {application/json: {schema: {$ref: '../components/schemas.yaml#/DocumentDetailResponse'}}}}
  475. '400': {$ref: '../components/responses.yaml#/InvalidArgument'}
  476. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  477. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  478. '404': {$ref: '../components/responses.yaml#/NotFound'}
  479. '500': {$ref: '../components/responses.yaml#/InternalError'}
  480. DocumentPermissions:
  481. parameters:
  482. - {name: id, in: path, required: true, schema: {$ref: '../components/schemas.yaml#/StringId'}}
  483. get:
  484. operationId: getDocumentPermissions
  485. summary: 查询主案借阅授权或子方案继承授权
  486. parameters:
  487. - $ref: '../components/parameters.yaml#/XDocumentPassword'
  488. responses:
  489. '200': {description: 权限详情, content: {application/json: {schema: {$ref: '../components/schemas.yaml#/PermissionDetailResponse'}}}}
  490. '400': {$ref: '../components/responses.yaml#/InvalidArgument'}
  491. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  492. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  493. '404': {$ref: '../components/responses.yaml#/NotFound'}
  494. '409': {$ref: '../components/responses.yaml#/Conflict'}
  495. '500': {$ref: '../components/responses.yaml#/InternalError'}
  496. put:
  497. operationId: saveDocumentPermissions
  498. summary: 全量保存主案借阅授权
  499. description: 敏感操作,强制二次认证(X-DMS-Reauth-Token,缺失或无效返回403 REAUTH_REQUIRED)。
  500. parameters:
  501. - $ref: '../components/parameters.yaml#/XDocumentPassword'
  502. - $ref: '../components/parameters.yaml#/XDmsReauthToken'
  503. requestBody:
  504. required: true
  505. content:
  506. application/json:
  507. schema: {$ref: '../components/schemas.yaml#/SavePermissionsRequest'}
  508. responses:
  509. '200': {description: 保存后的权限详情, content: {application/json: {schema: {$ref: '../components/schemas.yaml#/PermissionDetailResponse'}}}}
  510. '400': {$ref: '../components/responses.yaml#/InvalidArgument'}
  511. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  512. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  513. '404': {$ref: '../components/responses.yaml#/NotFound'}
  514. '409': {$ref: '../components/responses.yaml#/Conflict'}
  515. '500': {$ref: '../components/responses.yaml#/InternalError'}
  516. DocumentPermissionVoucher:
  517. parameters:
  518. - {name: id, in: path, required: true, schema: {$ref: '../components/schemas.yaml#/StringId'}}
  519. - {name: entryId, in: path, required: true, schema: {$ref: '../components/schemas.yaml#/StringId'}}
  520. post:
  521. operationId: uploadPermissionVoucher
  522. summary: 上传或替换授权条目的审批单凭证(仅主案,仅PDF)
  523. description: 请求必须且只能包含文件字段file,不得携带任何表单字段;替换语义,新凭证在数据库事务提交后提升落位,旧文件随后清理;审计UPLOAD_PERMISSION_VOUCHER。敏感操作,强制二次认证(X-DMS-Reauth-Token,缺失或无效返回403 REAUTH_REQUIRED)。
  524. parameters:
  525. - $ref: '../components/parameters.yaml#/XDocumentPassword'
  526. - $ref: '../components/parameters.yaml#/XDmsReauthToken'
  527. requestBody:
  528. required: true
  529. content:
  530. multipart/form-data:
  531. schema:
  532. type: object
  533. additionalProperties: false
  534. required: [file]
  535. properties:
  536. file: {type: string, format: binary}
  537. responses:
  538. '200': {description: 上传后的凭证信息, content: {application/json: {schema: {$ref: '../components/schemas.yaml#/PermissionVoucherResultResponse'}}}}
  539. '400': {$ref: '../components/responses.yaml#/InvalidArgument'}
  540. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  541. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  542. '404': {$ref: '../components/responses.yaml#/NotFound'}
  543. '413': {$ref: '../components/responses.yaml#/PayloadTooLarge'}
  544. '415': {$ref: '../components/responses.yaml#/UnsupportedMedia'}
  545. '500': {$ref: '../components/responses.yaml#/InternalError'}
  546. get:
  547. operationId: downloadPermissionVoucher
  548. summary: 下载授权条目的审批单凭证
  549. description: 成功返回application/pdf附件二进制(含nosniff);条目未上传凭证或文件缺失返回404。
  550. parameters:
  551. - $ref: '../components/parameters.yaml#/XDocumentPassword'
  552. responses:
  553. '200': {description: 审批单PDF二进制, content: {application/pdf: {schema: {type: string, format: binary}}}}
  554. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  555. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  556. '404': {$ref: '../components/responses.yaml#/NotFound'}
  557. '500': {$ref: '../components/responses.yaml#/InternalError'}
  558. delete:
  559. operationId: deletePermissionVoucher
  560. summary: 清除授权条目的审批单凭证(授权条目本身保留)
  561. description: 凭证文件在数据库事务提交后清理;审计DELETE_PERMISSION_VOUCHER。敏感操作,强制二次认证(X-DMS-Reauth-Token,缺失或无效返回403 REAUTH_REQUIRED)。
  562. parameters:
  563. - $ref: '../components/parameters.yaml#/XDocumentPassword'
  564. - $ref: '../components/parameters.yaml#/XDmsReauthToken'
  565. responses:
  566. '200': {description: 清除结果, content: {application/json: {schema: {$ref: '../components/schemas.yaml#/PermissionVoucherDeleteResultResponse'}}}}
  567. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  568. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  569. '404': {$ref: '../components/responses.yaml#/NotFound'}
  570. '500': {$ref: '../components/responses.yaml#/InternalError'}
  571. DocumentMove:
  572. parameters:
  573. - {name: id, in: path, required: true, schema: {$ref: '../components/schemas.yaml#/StringId'}}
  574. put:
  575. operationId: moveDocument
  576. summary: 跨页移动方案到浏览范围内指定位置(1.18)
  577. description: targetPosition与target二选一;位置为范围内1-based序号并自动收敛;目标位与当前位相同为无操作;权限要求对该文档有EDIT(无权403,1.30修订);审计MOVE_DOCUMENT。
  578. responses:
  579. '200': {description: 移动结果, content: {application/json: {schema: {$ref: '../components/schemas.yaml#/DocumentMoveResponse'}}}}
  580. '400': {$ref: '../components/responses.yaml#/InvalidArgument'}
  581. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  582. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  583. '404': {$ref: '../components/responses.yaml#/NotFound'}
  584. '409': {$ref: '../components/responses.yaml#/Conflict'}
  585. '500': {$ref: '../components/responses.yaml#/InternalError'}
  586. requestBody:
  587. required: true
  588. content:
  589. application/json:
  590. schema: {$ref: '../components/schemas.yaml#/DocumentMoveRequest'}
  591. MainPlanAttachmentMove:
  592. parameters:
  593. - {name: id, in: path, required: true, schema: {$ref: '../components/schemas.yaml#/StringId'}}
  594. - {name: bindingId, in: path, required: true, schema: {$ref: '../components/schemas.yaml#/StringId'}}
  595. put:
  596. operationId: moveMainPlanAttachment
  597. summary: 跨页移动主案挂载附件到页签类型范围内指定位置(1.18)
  598. description: 载荷必填mainPlanRowVersion(乐观锁,过期409);有实际移动时主案rowVersion加1并回传;权限要求对主案有EDIT(1.30修订,原BIND_ATTACHMENT);审计MOVE_ATTACHMENT。
  599. responses:
  600. '200': {description: 移动结果, content: {application/json: {schema: {$ref: '../components/schemas.yaml#/AttachmentMoveResponse'}}}}
  601. '400': {$ref: '../components/responses.yaml#/InvalidArgument'}
  602. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  603. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  604. '404': {$ref: '../components/responses.yaml#/NotFound'}
  605. '409': {$ref: '../components/responses.yaml#/Conflict'}
  606. '500': {$ref: '../components/responses.yaml#/InternalError'}
  607. requestBody:
  608. required: true
  609. content:
  610. application/json:
  611. schema: {$ref: '../components/schemas.yaml#/AttachmentMoveRequest'}
  612. DocumentRelationPresets:
  613. get:
  614. operationId: listDocumentRelationPresets
  615. summary: 方案关联关系类型预置清单
  616. description: 启动期从document-relation-presets配置加载;预置类型用于编辑弹窗下拉,用户仍可自定义关系文本。
  617. parameters:
  618. - $ref: '../components/parameters.yaml#/XRequestId'
  619. responses:
  620. '200': {description: 预置关系清单, content: {application/json: {schema: {$ref: '../components/schemas.yaml#/DocumentRelationPresetsResponse'}}}}
  621. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  622. '500': {$ref: '../components/responses.yaml#/InternalError'}
  623. DocumentRelations:
  624. parameters:
  625. - {name: id, in: path, required: true, schema: {$ref: '../components/schemas.yaml#/StringId'}}
  626. get:
  627. operationId: listDocumentRelations
  628. summary: 查询方案声明的关联清单
  629. description: 与文档详情同套访问控制;被关联方进入回收站后自动隐藏,恢复后重新显示。
  630. parameters:
  631. - $ref: '../components/parameters.yaml#/XDocumentPassword'
  632. responses:
  633. '200': {description: 关联清单, content: {application/json: {schema: {$ref: '../components/schemas.yaml#/DocumentRelationsResponse'}}}}
  634. '400': {$ref: '../components/responses.yaml#/InvalidArgument'}
  635. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  636. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  637. '404': {$ref: '../components/responses.yaml#/NotFound'}
  638. '500': {$ref: '../components/responses.yaml#/InternalError'}
  639. put:
  640. operationId: saveDocumentRelations
  641. summary: 整体替换方案的关联清单(管理员)
  642. description: |
  643. 关联发起方限主案/子方案,被关联方必须是主案且不可为自身;relations为空数组表示清空;
  644. relationType存最终文本(预置label或自定义,1~64字符);rowVersion乐观锁校验,
  645. 保存成功后rowVersion自增;设密主案需通过EDIT密码锁。
  646. parameters:
  647. - $ref: '../components/parameters.yaml#/XDocumentPassword'
  648. requestBody:
  649. required: true
  650. content:
  651. application/json:
  652. schema: {$ref: '../components/schemas.yaml#/UpdateDocumentRelationsRequest'}
  653. responses:
  654. '200': {description: 保存后的关联清单与新版本号, content: {application/json: {schema: {$ref: '../components/schemas.yaml#/DocumentRelationsSaveResponse'}}}}
  655. '400': {$ref: '../components/responses.yaml#/InvalidArgument'}
  656. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  657. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  658. '404': {$ref: '../components/responses.yaml#/NotFound'}
  659. '409': {$ref: '../components/responses.yaml#/Conflict'}
  660. '500': {$ref: '../components/responses.yaml#/InternalError'}
  661. MainPlanSubPlanBinding:
  662. parameters:
  663. - {name: id, in: path, required: true, schema: {$ref: '../components/schemas.yaml#/StringId'}}
  664. post:
  665. operationId: bindMainPlanSubPlans
  666. summary: 批量挂载其他主案的子案到当前主案
  667. description: 仅建立展示关系,子案权限仍继承原主案;同一主案上的写入由主案行锁串行化。
  668. parameters:
  669. - $ref: '../components/parameters.yaml#/XDocumentPassword'
  670. requestBody:
  671. required: true
  672. content:
  673. application/json:
  674. schema:
  675. type: object
  676. required: [subPlanIds, mainPlanRowVersion]
  677. additionalProperties: false
  678. properties:
  679. subPlanIds:
  680. type: array
  681. minItems: 1
  682. items: {$ref: '../components/schemas.yaml#/StringId'}
  683. mainPlanRowVersion: {type: integer, minimum: 0}
  684. responses:
  685. '200':
  686. description: 挂载结果
  687. content:
  688. application/json:
  689. schema:
  690. type: object
  691. required: [code, message, data, requestId]
  692. properties:
  693. code: {type: string}
  694. message: {type: string}
  695. requestId: {type: string}
  696. data:
  697. type: object
  698. required: [createdCount, existingCount, subPlanCount, mainPlanRowVersion]
  699. properties:
  700. createdCount: {type: integer, minimum: 0}
  701. existingCount: {type: integer, minimum: 0}
  702. subPlanCount: {type: integer, minimum: 0}
  703. mainPlanRowVersion: {type: integer, minimum: 0}
  704. '400': {$ref: '../components/responses.yaml#/InvalidArgument'}
  705. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  706. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  707. '404': {$ref: '../components/responses.yaml#/NotFound'}
  708. '409': {$ref: '../components/responses.yaml#/Conflict'}
  709. '500': {$ref: '../components/responses.yaml#/InternalError'}
  710. MainPlanSubPlan:
  711. parameters:
  712. - {name: id, in: path, required: true, schema: {$ref: '../components/schemas.yaml#/StringId'}}
  713. - {name: subPlanId, in: path, required: true, schema: {$ref: '../components/schemas.yaml#/StringId'}}
  714. delete:
  715. operationId: unbindMainPlanSubPlan
  716. summary: 解除主案与已挂载子案的展示关系
  717. parameters:
  718. - {name: mainPlanRowVersion, in: query, required: true, schema: {type: integer, minimum: 0}}
  719. - $ref: '../components/parameters.yaml#/XDocumentPassword'
  720. responses:
  721. '200':
  722. description: 解除挂载结果
  723. content:
  724. application/json:
  725. schema:
  726. type: object
  727. required: [code, message, data, requestId]
  728. properties:
  729. code: {type: string}
  730. message: {type: string}
  731. requestId: {type: string}
  732. data:
  733. type: object
  734. required: [subPlanCount, mainPlanRowVersion]
  735. properties:
  736. subPlanCount: {type: integer, minimum: 0}
  737. mainPlanRowVersion: {type: integer, minimum: 0}
  738. '400': {$ref: '../components/responses.yaml#/InvalidArgument'}
  739. '401': {$ref: '../components/responses.yaml#/AuthenticationError'}
  740. '403': {$ref: '../components/responses.yaml#/Forbidden'}
  741. '404': {$ref: '../components/responses.yaml#/NotFound'}
  742. '409': {$ref: '../components/responses.yaml#/Conflict'}
  743. '500': {$ref: '../components/responses.yaml#/InternalError'}