AssessmentContent.ts 48 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366
  1. import { DataModel, transformArrayDataModel, transformDataModel, type KeyValue } from '@imengyu/js-request-transform';
  2. import { AppServerRequestModule } from '../RequestModules';
  3. import { transformSomeToArray } from '../Utils';
  4. import { appendGetUrlParams } from '@imengyu/imengyu-utils';
  5. import { useAuthStore } from '@/stores/auth';
  6. import ApiCofig from '@/common/config/ApiCofig';
  7. import dayjs from 'dayjs';
  8. /**
  9. * 自查评估 / 传承协议相关接口(ShowDoc)
  10. * @see https://www.showdoc.com.cn/minnanCE/11559060626966335 列表
  11. * @see https://www.showdoc.com.cn/minnanCE/11559060626887140 传承协议编辑
  12. * @see https://www.showdoc.com.cn/minnanCE/11559060626966336 评估表编辑/新增
  13. * @see https://www.showdoc.com.cn/minnanCE/11559060626966337 详情
  14. */
  15. /** 计分点项(getCheckItems) */
  16. export class CheckItemInfo extends DataModel<CheckItemInfo> {
  17. constructor() {
  18. super(CheckItemInfo, '自查计分项目');
  19. this.setNameMapperCase('Camel', 'Snake');
  20. this._convertTable = {
  21. id: { clientSide: 'number', serverSide: 'number' },
  22. pid: { clientSide: 'number', serverSide: 'number' },
  23. level: { clientSide: 'number', serverSide: 'number' },
  24. points: { clientSide: 'number', serverSide: 'number' },
  25. isTitle: { clientSide: 'boolean', serverSide: 'number' },
  26. isMulitCheck: { clientSide: 'boolean', serverSide: 'number' },
  27. };
  28. }
  29. id = 0 as number;
  30. pid = 0 as number;
  31. name = '' as string;
  32. level = 0 as number;
  33. points = 0 as number;
  34. isTitle = false;
  35. isMulitCheck = false;
  36. /** 1=单选,2=多选,3=次数 */
  37. checkType = 0 as number;
  38. children: CheckItemInfo[] = [];
  39. }
  40. /** 自查评估表列表行 */
  41. export class SelfAssessmentListRow extends DataModel<SelfAssessmentListRow> {
  42. constructor() {
  43. super(SelfAssessmentListRow, '自查评估表列表项');
  44. this.setNameMapperCase('Camel', 'Snake');
  45. this._convertTable = {
  46. id: { clientSide: 'number', serverSide: 'number' },
  47. userId: { clientSide: 'number', serverSide: 'number' },
  48. year: { clientSide: 'number', serverSide: 'number' },
  49. weigh: { clientSide: 'number', serverSide: 'number' },
  50. deductPoints: { clientSide: 'number', serverSide: 'number' },
  51. points: { clientSide: 'number', serverSide: 'number' },
  52. self: { clientSide: 'number', serverSide: 'number' },
  53. ichUnit: { clientSide: 'number', serverSide: 'number' },
  54. unitPoints: { clientSide: 'number', serverSide: 'number' },
  55. county: { clientSide: 'number', serverSide: 'number' },
  56. countyPoints: { clientSide: 'number', serverSide: 'number' },
  57. district: { clientSide: 'number', serverSide: 'number' },
  58. districtPoints: { clientSide: 'number', serverSide: 'number' },
  59. province: { clientSide: 'number', serverSide: 'number' },
  60. provincePoints: { clientSide: 'number', serverSide: 'number' },
  61. level: { clientSide: 'number', serverSide: 'string' },
  62. progress: { clientSide: 'number', serverSide: 'number' },
  63. };
  64. this._convertKeyType = (key) => {
  65. if (key.endsWith('Text') || key.endsWith('_text')) {
  66. return { clientSide: 'string', serverSide: 'undefined' };
  67. }
  68. return undefined;
  69. };
  70. }
  71. id = 0 as number;
  72. userId = 0 as number;
  73. year = 0 as number;
  74. inheritor = '' as string|null;
  75. unit = '' as string|null;
  76. ichName = '' as string|null;
  77. mobile = '' as string|null;
  78. idCard = '' as string|null;
  79. level = null as number|string|null;
  80. address = '' as string|null;
  81. weigh = 0 as number;
  82. deductPoints = 0 as number;
  83. points = 0 as number;
  84. self = null as number|null;
  85. ichUnit = null as number|null;
  86. unitPoints = 0 as number;
  87. county = null as number|null;
  88. countyPoints = 0 as number;
  89. district = null as number|null;
  90. districtPoints = 0 as number;
  91. province = null as number|null;
  92. provincePoints = 0 as number;
  93. createtime = '' as string;
  94. updatetime = '' as string;
  95. selfText = '' as string;
  96. /** -1=未提交,0=草稿,1=已自评,2~5 各级审核完成 */
  97. progress = null as number|null;
  98. }
  99. /** 传承协议列表行 */
  100. export class AgreementListRow extends DataModel<AgreementListRow> {
  101. constructor() {
  102. super(AgreementListRow, '传承协议列表项');
  103. this.setNameMapperCase('Camel', 'Snake');
  104. this._convertTable = {
  105. id: { clientSide: 'number', serverSide: 'number' },
  106. userId: { clientSide: 'number', serverSide: 'number' },
  107. year: { clientSide: 'number', serverSide: 'number' },
  108. apprentice: { clientSide: 'number', serverSide: 'number' },
  109. activity: { clientSide: 'number', serverSide: 'number' },
  110. course: { clientSide: 'number', serverSide: 'number' },
  111. level: { clientSide: 'number', serverSide: 'number' },
  112. };
  113. }
  114. id = 0 as number;
  115. userId = 0 as number;
  116. level = null as number|null;
  117. year = 0 as number;
  118. partyA = '' as string|null;
  119. partyB = '' as string|null;
  120. apprentice = 0 as number;
  121. activity = 0 as number;
  122. course = 0 as number;
  123. mobile = '' as string|null;
  124. partyAMobile = '' as string|null;
  125. idCard = '' as string|null;
  126. health = '' as string|null;
  127. ich = '' as string|null;
  128. partyASign = '' as string|null;
  129. partyBSign = '' as string|null;
  130. createtime = '' as string;
  131. updatetime = '' as string;
  132. deletetime = '' as string|null;
  133. }
  134. /** 保护单位账号:传承人传承协议分页列表行(ich/check/getUserAgreement) */
  135. export class UserAgreementListRow extends DataModel<UserAgreementListRow> {
  136. constructor() {
  137. super(UserAgreementListRow, '传承人传承协议列表项');
  138. this.setNameMapperCase('Camel', 'Snake');
  139. this._convertTable = {
  140. id: { clientSide: 'number', serverSide: 'number' },
  141. sitesId: { clientSide: 'number', serverSide: 'number' },
  142. batch: { clientSide: 'number', serverSide: 'number' },
  143. ichId: { clientSide: 'number', serverSide: 'number' },
  144. agreementId: { clientSide: 'number', serverSide: 'number' },
  145. userId: { clientSide: 'number', serverSide: 'number' },
  146. year: { clientSide: 'number', serverSide: 'number' },
  147. apprentice: { clientSide: 'number', serverSide: 'number' },
  148. activity: { clientSide: 'number', serverSide: 'number' },
  149. course: { clientSide: 'number', serverSide: 'number' },
  150. progress: { clientSide: 'number', serverSide: 'number' },
  151. level: { clientSide: 'number', serverSide: 'string' },
  152. rejectType: { clientSide: 'number', serverSide: 'number' },
  153. };
  154. this._convertKeyType = (key) => {
  155. if (key.endsWith('Text') || key.endsWith('_text')) {
  156. return { clientSide: 'string', serverSide: 'undefined' };
  157. }
  158. return undefined;
  159. };
  160. }
  161. id = 0 as number;
  162. title = '' as string;
  163. associationId = '' as string;
  164. sitesId = 0 as number;
  165. level = null as number|string|null;
  166. batch = 0 as number;
  167. gender = '' as string;
  168. basicMobile = '' as string|null;
  169. basicUnit = '' as string|null;
  170. ichId = 0 as number;
  171. ichTitle = '' as string;
  172. /** 已填写的传承协议记录 ID,未填写时为 null */
  173. agreementId = null as number|null;
  174. userId = null as number|null;
  175. year = null as number|null;
  176. partyA = '' as string|null;
  177. partyB = '' as string|null;
  178. apprentice = null as number|null;
  179. activity = null as number|null;
  180. course = null as number|null;
  181. mobile = '' as string|null;
  182. partyAMobile = '' as string|null;
  183. partyAContact = '' as string|null;
  184. idCard = '' as string|null;
  185. health = '' as string|null;
  186. ich = '' as string|null;
  187. partyASign = '' as string|null;
  188. partyBSign = '' as string|null;
  189. /** 进度:0=草稿,
  190. 1=已自评,
  191. 2=项目保护单位审核完成,
  192. 3=县(区)文旅部门审核完成,
  193. 4=设区市文旅部门、省非遗中心审核完成,
  194. 5=省文化和旅游厅审核完成 */
  195. progress = null as number|null;
  196. /** 退回状态: 0=无,1=自评阶段退回,2=项目保护单位退回,3=县(区)文旅部门退回,4=设区市文旅部门/省非遗中心退回,5=省文化和旅游厅退回 */
  197. rejectType = null as number|null;
  198. rejectReason = '' as string|null;
  199. createtime = '' as string|null;
  200. updatetime = '' as string|null;
  201. deletetime = '' as string|null;
  202. batchText = '' as string;
  203. ichSiteTypeText = '' as string;
  204. }
  205. /** 保护单位账号:传承人列表行(ich/check/getInheritorList) */
  206. export class InheritorCheckListRow extends DataModel<InheritorCheckListRow> {
  207. constructor() {
  208. super(InheritorCheckListRow, '传承人列表项');
  209. this.setNameMapperCase('Camel', 'Snake');
  210. this._convertTable = {
  211. id: { clientSide: 'number', serverSide: 'number' },
  212. sitesId: { clientSide: 'number', serverSide: 'number' },
  213. batch: { clientSide: 'number', serverSide: 'number' },
  214. ichId: { clientSide: 'number', serverSide: 'number' },
  215. checkId: { clientSide: 'number', serverSide: 'number' },
  216. userId: { clientSide: 'number', serverSide: 'number' },
  217. year: { clientSide: 'number', serverSide: 'number' },
  218. weigh: { clientSide: 'number', serverSide: 'number' },
  219. deductPoints: { clientSide: 'number', serverSide: 'number' },
  220. points: { clientSide: 'number', serverSide: 'number' },
  221. self: { clientSide: 'number', serverSide: 'number' },
  222. ichUnit: { clientSide: 'number', serverSide: 'number' },
  223. unitPoints: { clientSide: 'number', serverSide: 'number' },
  224. county: { clientSide: 'number', serverSide: 'number' },
  225. countyPoints: { clientSide: 'number', serverSide: 'number' },
  226. district: { clientSide: 'number', serverSide: 'number' },
  227. districtPoints: { clientSide: 'number', serverSide: 'number' },
  228. province: { clientSide: 'number', serverSide: 'number' },
  229. provincePoints: { clientSide: 'number', serverSide: 'number' },
  230. progress: { clientSide: 'number', serverSide: 'number' },
  231. level: { clientSide: 'number', serverSide: 'string' },
  232. rejectType: { clientSide: 'number', serverSide: 'number' },
  233. };
  234. this._convertKeyType = (key) => {
  235. if (key.endsWith('Text') || key.endsWith('_text')) {
  236. return { clientSide: 'string', serverSide: 'undefined' };
  237. }
  238. return undefined;
  239. };
  240. }
  241. id = 0 as number;
  242. title = '' as string;
  243. /** 关联项目 ID(接口可能返回字符串数字) */
  244. associationId = '' as string;
  245. sitesId = 0 as number;
  246. level = null as number|string|null;
  247. batch = 0 as number;
  248. gender = '' as string;
  249. basicMobile = '' as string|null;
  250. basicUnit = '' as string|null;
  251. ichId = 0 as number;
  252. ichTitle = '' as string;
  253. checkId = null as number|null;
  254. userId = null as number|null;
  255. year = null as number|null;
  256. inheritor = '' as string|null;
  257. unit = '' as string|null;
  258. ichName = '' as string|null;
  259. mobile = '' as string|null;
  260. idCard = '' as string|null;
  261. address = '' as string|null;
  262. weigh = null as number|null;
  263. deductPoints = null as number|null;
  264. points = null as number|null;
  265. self = null as number|null;
  266. ichUnit = null as number|null;
  267. unitPoints = null as number|null;
  268. county = null as number|null;
  269. countyPoints = null as number|null;
  270. district = null as number|null;
  271. districtPoints = null as number|null;
  272. province = null as number|null;
  273. provincePoints = null as number|null;
  274. createtime = '' as string|null;
  275. updatetime = '' as string|null;
  276. /** -1=未提交,0=草稿,1=已自评,2=项目保护单位审核完成,3=县(区)文旅部门审核完成,4=设区市文旅部门/省非遗中心审核完成,5=省文化和旅游厅审核完成 */
  277. progress = null as number|null;
  278. /** 退回状态: 0=无,1=自评阶段退回,2=项目保护单位退回,3=县(区)文旅部门退回,4=设区市文旅部门/省非遗中心退回,5=省文化和旅游厅退回 */
  279. rejectType = null as number|null;
  280. rejectReason = '' as string|null;
  281. flagText = '' as string;
  282. typeText = '' as string;
  283. openStatusText = '' as string;
  284. statusText = '' as string;
  285. regionText = '' as string;
  286. levelText = '' as string;
  287. crTypeText = '' as string;
  288. ichTypeText = '' as string;
  289. claimStatusText = '' as string;
  290. isMultipleClaimsText = '' as string;
  291. batchText = '' as string;
  292. ichSiteTypeText = '' as string;
  293. }
  294. /** 自查表审核日志列表行(checkLogList) */
  295. export class CheckLogListRow extends DataModel<CheckLogListRow> {
  296. constructor() {
  297. super(CheckLogListRow, '自查表审核日志');
  298. this.setNameMapperCase('Camel', 'Snake');
  299. this._convertTable = {
  300. id: { clientSide: 'number', serverSide: 'number' },
  301. checkId: { clientSide: 'number', serverSide: 'number' },
  302. reviewType: { clientSide: 'number', serverSide: 'number' },
  303. status: { clientSide: 'number', serverSide: 'number' },
  304. operator: { clientSide: 'number', serverSide: 'number' },
  305. progress: { clientSide: 'number', serverSide: 'number' },
  306. userId: { clientSide: 'number', serverSide: 'number' },
  307. };
  308. this._convertKeyType = (key) => {
  309. if (key.endsWith('Text') || key.endsWith('_text')) {
  310. return { clientSide: 'string', serverSide: 'undefined' };
  311. }
  312. return undefined;
  313. };
  314. }
  315. id = 0 as number;
  316. checkId = 0 as number;
  317. /** 审核环节: 1=自评阶段,2=项目保护单位,3=县(区)文旅部门,4=设区市文旅部门、省非遗中心,5=省文化和旅游厅 */
  318. reviewType = 0 as number;
  319. /** 状态: 1=通过,2=退回 */
  320. status = 0 as number;
  321. reason = '' as string|null;
  322. operator = 0 as number;
  323. createtime = '' as string|null;
  324. progress = 0 as number;
  325. inheritor = '' as string|null;
  326. userId = 0 as number;
  327. reviewTypeText = '' as string;
  328. statusText = '' as string;
  329. }
  330. /** 传承人基础信息(ich/check/basic) */
  331. export class InheritorCheckBasicInfo extends DataModel<InheritorCheckBasicInfo> {
  332. constructor() {
  333. super(InheritorCheckBasicInfo, '传承人自查基础信息');
  334. this.setNameMapperCase('Camel', 'Snake');
  335. this._convertTable = {
  336. userId: { clientSide: 'number', serverSide: 'number' },
  337. level: { clientSide: 'number', serverSide: 'number' },
  338. batch: { clientSide: 'number', serverSide: 'number' },
  339. };
  340. this._convertKeyType = (key) => {
  341. if (key.endsWith('Text') || key.endsWith('_text')) {
  342. return { clientSide: 'string', serverSide: 'undefined' };
  343. }
  344. return undefined;
  345. };
  346. }
  347. userId = 0 as number;
  348. name = '' as string;
  349. region = '' as string;
  350. gender = '' as string;
  351. education = '' as string|null;
  352. ichName = '' as string;
  353. unit = '' as string;
  354. /** 国家级(23), 省级(24), 市级(25) */
  355. level = 0 as number;
  356. idCard = '' as string;
  357. address = '' as string;
  358. batch = 0 as number;
  359. mobile = '' as string;
  360. genderText = '' as string;
  361. educationText = '' as string;
  362. levelText = '' as string;
  363. regionText = '' as string;
  364. /** 已填写的传承协议ID */
  365. agreementId = 0 as number;
  366. /** 已填写的自查表ID */
  367. checkId = 0 as number;
  368. }
  369. /** 详情中已选计分项 */
  370. export class SelfAssessmentCheckItemAnswer extends DataModel<SelfAssessmentCheckItemAnswer> {
  371. constructor() {
  372. super(SelfAssessmentCheckItemAnswer, '自查计分选项');
  373. this.setNameMapperCase('Camel', 'Snake');
  374. this._convertTable = {
  375. id: { clientSide: 'number', serverSide: 'number' },
  376. points: { clientSide: 'number', serverSide: 'number' },
  377. count: { clientSide: 'number', serverSide: 'number' },
  378. };
  379. this._afterSolveServer = (data) => {
  380. if (data.itemId)
  381. data.id = data.itemId;
  382. }
  383. }
  384. id = 0 as number;
  385. points = 0 as number;
  386. count = 0 as number;
  387. }
  388. /** 自查评估表详情 */
  389. export class SelfAssessmentDetail extends DataModel<SelfAssessmentDetail> {
  390. constructor() {
  391. super(SelfAssessmentDetail, '自查评估表详情');
  392. this.setNameMapperCase('Camel', 'Snake');
  393. this._convertTable = {
  394. id: { clientSide: 'number', serverSide: 'number' },
  395. userId: { clientSide: 'number', serverSide: 'number' },
  396. year: { clientSide: 'number', serverSide: 'number' },
  397. weigh: { clientSide: 'number', serverSide: 'number' },
  398. deductPoints: { clientSide: 'number', serverSide: 'number' },
  399. points: { clientSide: 'number', serverSide: 'number' },
  400. self: { clientSide: 'number', serverSide: 'number' },
  401. ichUnit: { clientSide: 'number', serverSide: 'number' },
  402. unitPoints: { clientSide: 'number', serverSide: 'number' },
  403. county: { clientSide: 'number', serverSide: 'number' },
  404. countyPoints: { clientSide: 'number', serverSide: 'number' },
  405. district: { clientSide: 'number', serverSide: 'number' },
  406. districtPoints: { clientSide: 'number', serverSide: 'number' },
  407. province: { clientSide: 'number', serverSide: 'number' },
  408. provincePoints: { clientSide: 'number', serverSide: 'number' },
  409. districtSt: { clientSide: 'number', serverSide: 'number' },
  410. districtStPoints: { clientSide: 'number', serverSide: 'number' },
  411. districtNd: { clientSide: 'number', serverSide: 'number' },
  412. districtNdPoints: { clientSide: 'number', serverSide: 'number' },
  413. districtRd: { clientSide: 'number', serverSide: 'number' },
  414. districtRdPoints: { clientSide: 'number', serverSide: 'number' },
  415. districtTh: { clientSide: 'number', serverSide: 'number' },
  416. districtThPoints: { clientSide: 'number', serverSide: 'number' },
  417. districtFi: { clientSide: 'number', serverSide: 'number' },
  418. districtFiPoints: { clientSide: 'number', serverSide: 'number' },
  419. level: { clientSide: 'number', serverSide: 'string' },
  420. content: {
  421. customToClientFn: (value) => {
  422. try {
  423. if (typeof value === 'object')
  424. return value;
  425. return JSON.parse(value as string);
  426. } catch {
  427. return {};
  428. }
  429. },
  430. customToServerFn: (value) => {
  431. return value;
  432. },
  433. },
  434. awardTime: {
  435. clientSide: 'dayjs',
  436. clientSideDateFormat: 'YYYY-MM-DD',
  437. serverSide: 'dayjsString',
  438. serverSideDateFormat: 'YYYY-MM-DD',
  439. },
  440. checkItems: {
  441. customToClientFn: (value) => {
  442. const arr = transformSomeToArray(value);
  443. for (const item of arr)
  444. item.id = item.item_id;
  445. return transformArrayDataModel(SelfAssessmentCheckItemAnswer, arr, 'data');
  446. },
  447. customToServerFn: (value) => {
  448. return (value as SelfAssessmentCheckItemAnswer[])
  449. .filter(item => item.count > 0)
  450. .map((item) => {
  451. return {
  452. id: item.id,
  453. count: item.count,
  454. };
  455. });
  456. },
  457. },
  458. };
  459. this._blackList.toServer = [
  460. 'createtime',
  461. 'updatetime',
  462. 'deletetime',
  463. ]
  464. this._convertKeyType = (key) => {
  465. if (key.endsWith('Text') || key.endsWith('_text')) {
  466. return { clientSide: 'string', serverSide: 'undefined' };
  467. }
  468. return undefined;
  469. };
  470. this._beforeSolveClient = (data) => {
  471. if (data.id == 0)
  472. delete data.id;
  473. return data;
  474. }
  475. }
  476. id = 0 as number;
  477. userId = 0 as number;
  478. year = 0 as number;
  479. inheritor = '' as string|null;
  480. unit = '' as string|null;
  481. ichName = '' as string|null;
  482. mobile = '' as string|null;
  483. idCard = '' as string|null;
  484. level = null as number|string|null;
  485. address = '' as string|null;
  486. content : Record<string, any>|null = null;
  487. weigh = 0 as number;
  488. awardTime = dayjs();
  489. deductContent = '' as string|null;
  490. deductPoints = 0 as number;
  491. scan = '' as string|null;
  492. points = 0 as number;
  493. /** 进度:
  494. 0=草稿,
  495. 1=已自评,
  496. 2=项目保护单位审核完成,
  497. 3=县(区)文旅部门审核完成,
  498. 4=设区市文旅部门、省非遗中心审核完成,
  499. 5=省文化和旅游厅审核完成 */
  500. progress = 0;
  501. /** 自我评估: 1=优秀,2=合格,3=不合格,4=丧失传承能力,5=取消资格 */
  502. self = null as number|null;
  503. sign = '' as string|null;
  504. /** 项目保护单位意见: 1=优秀,2=合格,3=不合格,4=丧失传承能力,5=取消资格 */
  505. ichUnit = null as number|null;
  506. /** 项目保护单位评分 */
  507. unitPoints = 0 as number;
  508. /** 县(区)文旅部门审核意见: 1=优秀,2=合格,3=不合格,4=丧失传承能力,5=取消资格 */
  509. county = null as number|null;
  510. /** 县(区)文旅部门评分 */
  511. countyPoints = 0 as number;
  512. /** 设区市文旅部门、省非遗中心审核意见: 1=优秀,2=合格,3=不合格,4=丧失传承能力,5=取消资格 */
  513. district = null as number|null;
  514. /** 设区市文旅部门、省非遗中心评分 */
  515. districtPoints = 0 as number;
  516. /** 省文化和旅游厅意见: 1=优秀,2=合格,3=不合格,4=丧失传承能力,5=取消资格 */
  517. province = null as number|null;
  518. /** 省文化和旅游厅评分 */
  519. provincePoints = 0 as number;
  520. /** 项目负责人意见: 0=未审核,1=优秀,2=合格,3=不合格,4=丧失传承能力,5=取消资格 */
  521. districtSt = null as number|null;
  522. /** 项目负责人评分 */
  523. districtStPoints = 0 as number;
  524. /** 部门主任意见: 0=未审核,1=优秀,2=合格,3=不合格,4=丧失传承能力,5=取消资格 */
  525. districtNd = null as number|null;
  526. /** 部门主任评分 */
  527. districtNdPoints = 0 as number;
  528. /** 分管领导意见: 0=未审核,1=优秀,2=合格,3=不合格,4=丧失传承能力,5=取消资格 */
  529. districtRd = null as number|null;
  530. /** 分管领导评分 */
  531. districtRdPoints = 0 as number;
  532. /** 工服处意见: 0=未审核,1=优秀,2=合格,3=不合格,4=丧失传承能力,5=取消资格 */
  533. districtTh = null as number|null;
  534. /** 工服处评分 */
  535. districtThPoints = 0 as number;
  536. /** 工服处-分管领导意见: 0=未审核,1=优秀,2=合格,3=不合格,4=丧失传承能力,5=取消资格 */
  537. districtFi = null as number|null;
  538. /** 工服处-分管领导评分 */
  539. districtFiPoints = 0 as number;
  540. createtime = '' as string;
  541. updatetime = '' as string;
  542. deletetime = '' as string|null;
  543. selfText = '' as string;
  544. checkItems : SelfAssessmentCheckItemAnswer[] = [];
  545. /** 退回状态: 0=无,1=自评阶段退回,2=项目保护单位退回,3=县(区)文旅部门退回,4=设区市文旅部门/省非遗中心退回,5=省文化和旅游厅退回 */
  546. rejectType = 0 as number;
  547. /** 退回原因 */
  548. rejectReason = '' as string;
  549. /** 退回意见 reasons [键值-角色组id : 退回意见] */
  550. reasons = {} as Record<number, string>;
  551. }
  552. /** 传承协议详情 */
  553. export class AgreementDetail extends DataModel<AgreementDetail> {
  554. constructor() {
  555. super(AgreementDetail, '传承协议详情');
  556. this.setNameMapperCase('Camel', 'Snake');
  557. this._convertTable = {
  558. id: { clientSide: 'number', serverSide: 'number' },
  559. userId: { clientSide: 'number', serverSide: 'number' },
  560. year: { clientSide: 'number', serverSide: 'number' },
  561. apprentice: { clientSide: 'number', serverSide: 'number' },
  562. activity: { clientSide: 'number', serverSide: 'number' },
  563. course: { clientSide: 'number', serverSide: 'number' },
  564. level: { clientSide: 'number', serverSide: 'number' },
  565. updatetime: { clientSide: 'date', serverSide: 'undefined' },
  566. };
  567. this._nameMapperClient = {
  568. partyA: 'party_a',
  569. partyB: 'party_b',
  570. partyASign: 'party_a_sign',
  571. partyBSign: 'party_b_sign',
  572. partyAMobile: 'party_a_mobile',
  573. }
  574. this._blackList.toServer = [
  575. 'createtime',
  576. 'updatetime',
  577. 'deletetime',
  578. ]
  579. this._beforeSolveClient = (data) => {
  580. if (data.id == 0)
  581. delete data.id;
  582. return data;
  583. }
  584. }
  585. id = 0 as number;
  586. userId = 0 as number;
  587. level = null as number|null;
  588. year = 0 as number;
  589. partyA = '' as string|null;
  590. partyB = '' as string|null;
  591. apprentice = 0 as number;
  592. activity = 0 as number;
  593. course = 0 as number;
  594. mobile = '' as string|null;
  595. /** 进度: 0=草稿,1=已自评,2=项目保护单位审核完成,3=县(区)文旅部门审核完成,4=设区市文旅部门、省非遗中心审核完成,5=省文化和旅游厅审核完成 */
  596. progress: number = 0;
  597. /** 退回状态: 0=无,1=自评阶段退回,2=项目保护单位退回,3=县(区)文旅部门退回,4=设区市文旅部门、省非遗中心退回,5=省文化和旅游厅退回 */
  598. rejectType: number = 0;
  599. /** 退回原因 */
  600. rejectReason?: string;
  601. partyAMobile = '' as string|null;
  602. idCard = '' as string|null;
  603. health = '' as string|null;
  604. ich = '' as string|null;
  605. scan = '' as string|null;
  606. partyASign = '' as string|null;
  607. partyBSign = '' as string|null;
  608. unitSign = '' as string|null;
  609. updatetime = new Date();
  610. }
  611. export function getRejectTypeText(d: number) {
  612. switch (d) {
  613. case 0: return '无';
  614. case 1: return '自评阶段退回';
  615. case 2: return '项目保护单位退回';
  616. case 3: return '县(区)文旅部门退回';
  617. case 4: return '设区市文旅部门/省非遗中心退回';
  618. case 5: return '省文化和旅游厅退回';
  619. default: return '未知';
  620. }
  621. }
  622. /** 证明材料附件类型(saveAnnex `type`) */
  623. export const CheckAnnexType = {
  624. Image: 1,
  625. Video: 2,
  626. Audio: 3,
  627. Document: 4,
  628. Other: 5,
  629. ExternalLink: 6,
  630. } as const;
  631. export function getCheckAnnexType(mimetype: string) {
  632. if (mimetype.startsWith('image/')) return CheckAnnexType.Image;
  633. if (mimetype.startsWith('video/')) return CheckAnnexType.Video;
  634. if (mimetype.startsWith('audio/')) return CheckAnnexType.Audio;
  635. if (mimetype.startsWith('application/pdf')) return CheckAnnexType.Document;
  636. return CheckAnnexType.Other;
  637. }
  638. export type CheckAnnexTypeValue = (typeof CheckAnnexType)[keyof typeof CheckAnnexType];
  639. /** 传承协议审核提交(POST /ich/check/reviewAgreement) */
  640. export interface AgreementReviewPayload {
  641. /** 传承协议 ID */
  642. id: number;
  643. /** 进度: 0=草稿,1=已自评,2=项目保护单位审核完成,3=县(区)文旅部门审核完成,4=设区市文旅部门、省非遗中心审核完成,5=省文化和旅游厅审核完成 */
  644. progress: number;
  645. /** 退回状态: 0=无,1=自评阶段退回,2=项目保护单位退回,3=县(区)文旅部门退回,4=设区市文旅部门、省非遗中心退回,5=省文化和旅游厅退回 */
  646. rejectType?: number;
  647. /** 退回原因 */
  648. rejectReason?: string;
  649. }
  650. /** 自查表审核提交(POST /ich/check/review) */
  651. export interface IchCheckReviewPayload {
  652. /** 自查表 ID */
  653. id: number;
  654. /** 项目保护单位意见: 0=未审核,1=优秀,2=合格,3=不合格,4=丧失传承能力,5=取消资格 */
  655. ichUnit?: number;
  656. unitPoints?: number;
  657. /** 县(区)文旅部门审核意见,取值同 ichUnit */
  658. county?: number;
  659. countyPoints?: number;
  660. /** 设区市文旅部门、省非遗中心审核意见,取值同 ichUnit */
  661. district?: number;
  662. districtPoints?: number;
  663. /** 省文化和旅游厅意见,取值同 ichUnit */
  664. province?: number;
  665. provincePoints?: number;
  666. /** 项目负责人意见,取值同 ichUnit */
  667. districtSt?: number;
  668. districtStPoints?: number;
  669. /** 部门主任意见,取值同 ichUnit */
  670. districtNd?: number;
  671. districtNdPoints?: number;
  672. /** 分管领导意见,取值同 ichUnit */
  673. districtRd?: number;
  674. districtRdPoints?: number;
  675. /** 工服处意见,取值同 ichUnit */
  676. districtTh?: number;
  677. districtThPoints?: number;
  678. /** 工服处-分管领导意见,取值同 ichUnit */
  679. districtFi?: number;
  680. districtFiPoints?: number;
  681. /** 0=草稿,1=已自评,2=项目保护单位审核完成,3=县(区)文旅部门审核完成,4=设区市文旅部门/省非遗中心审核完成,5=省文化和旅游厅审核完成 */
  682. progress: number;
  683. /** 退回状态: 0=无,1=自评阶段退回,2=项目保护单位退回,3=县(区)文旅部门退回,4=设区市文旅部门/省非遗中心退回,5=省文化和旅游厅退回 */
  684. rejectType?: number;
  685. /** 退回原因 */
  686. rejectReason?: string;
  687. /** 退回意见 reasons [键值-角色组id : 退回意见] */
  688. reasons?:Record<number, string>;
  689. sendMsg?: boolean;
  690. }
  691. /** 过会后修改分数和意见请求体(POST /ich/check/checkReview) */
  692. export interface CheckReviewPayload {
  693. checkId: number;
  694. ichUnit?: number;
  695. unitPoints?: number;
  696. county?: number;
  697. countyPoints?: number;
  698. district?: number;
  699. districtPoints?: number;
  700. province?: number;
  701. provincePoints?: number;
  702. progress?: number;
  703. rejectType?: number;
  704. rejectReason?: string;
  705. scan?: string;
  706. }
  707. /** 自查评估表审核(新)请求体(POST /ich/check/reviewOnly) */
  708. export interface SelfAssessmentReviewOnlyPayload {
  709. /** 自查表 ID */
  710. checkId: number;
  711. /** 审核角色组 ID */
  712. groupId: number;
  713. /** 退回状态:0=无,1=自评阶段退回,2=项目保护单位退回,3=县(区)文旅部门退回,4=设区市文旅部门、省非遗中心退回,5=省文化和旅游厅退回 */
  714. rejectType: number;
  715. /** 审核退回意见 */
  716. rejectReason?: string;
  717. /** 评估级别: 1=优秀,2=合格,3=不合格,4=丧失传承能力,5=取消资格 */
  718. opinion?: number;
  719. /** 评分 */
  720. points?: number;
  721. /** 发送短信:0=否,1=是 */
  722. sendMsg?: number;
  723. }
  724. /** 自查评估表审核(新)返回结果 */
  725. export interface SelfAssessmentReviewOnlyResult {
  726. /** 操作级别 */
  727. operateLevel: number;
  728. /** 操作角色组ID */
  729. targetGroupId: string;
  730. /** 短信内容 */
  731. smsInfo: string;
  732. /** 是否退回 */
  733. isFormalReject: boolean;
  734. /** 是否改变进度 */
  735. canChangeProgress: boolean;
  736. /** 新进度 */
  737. newProgress: number;
  738. }
  739. /** 证明材料修改与新增请求体(POST /ich/check/saveAnnex) */
  740. export interface SaveCheckAnnexPayload {
  741. id?: number;
  742. name: string;
  743. formId: number;
  744. itemId?: number;
  745. url: string;
  746. type: CheckAnnexTypeValue | number;
  747. desc?: string;
  748. mimetype?: string;
  749. attachId?: number;
  750. fileSize?: number;
  751. }
  752. /** 证明材料列表项(getAnnexList) */
  753. export class CheckAnnexListItem extends DataModel<CheckAnnexListItem> {
  754. constructor() {
  755. super(CheckAnnexListItem, '证明材料列表项');
  756. this.setNameMapperCase('Camel', 'Snake');
  757. this._convertTable = {
  758. id: { clientSide: 'number', serverSide: 'number' },
  759. formId: { clientSide: 'number', serverSide: 'number' },
  760. type: { clientSide: 'number', serverSide: 'number' },
  761. attachId: { clientSide: 'number', serverSide: 'number' },
  762. fileSize: { clientSide: 'number', serverSide: 'number' },
  763. };
  764. }
  765. id = 0 as number;
  766. name = '' as string;
  767. formId = 0 as number;
  768. url = '' as string;
  769. type = 0 as number;
  770. desc = '' as string|null;
  771. mimetype = '' as string|null;
  772. attachId = null as number|null;
  773. fileSize = null as number|null;
  774. createtime = '' as string|null;
  775. updatetime = '' as string|null;
  776. }
  777. export class DataCountItem extends DataModel<DataCountItem> {
  778. constructor() {
  779. super(DataCountItem, '统计条目');
  780. this.setNameMapperCase('Camel', 'Snake');
  781. this._convertTable = {
  782. num: { clientSide: 'number' },
  783. };
  784. this._nameMapperServer = {
  785. progress: 'key',
  786. reject_type: 'key',
  787. progress_text: 'title',
  788. reject_type_text: 'title',
  789. num: 'value',
  790. };
  791. }
  792. title = '';
  793. key = 0 as number;
  794. value = 0 as number;
  795. }
  796. export type IchCheckPaginated<T> = {
  797. total: number;
  798. perPage: number;
  799. currentPage: number;
  800. lastPage: number;
  801. data: T[];
  802. };
  803. function normalizePaginated<T extends DataModel>(rowClass: new () => T, raw: KeyValue): IchCheckPaginated<T> {
  804. return {
  805. total: Number(raw.total ?? 0),
  806. perPage: Number(raw.per_page ?? 0),
  807. currentPage: Number(raw.current_page ?? 0),
  808. lastPage: Number(raw.last_page ?? 0),
  809. data: transformArrayDataModel(rowClass, transformSomeToArray(raw.data), 'data'),
  810. };
  811. }
  812. function buildPdfUrl(baseUrl: string, path: string, id: number) {
  813. const auth = useAuthStore();
  814. let url = `${baseUrl}${path}?id=${encodeURIComponent(String(id))}`;
  815. url = appendGetUrlParams(url, 'main_body_id', ApiCofig.mainBodyId);
  816. url = appendGetUrlParams(url, 'token', auth.token);
  817. return url;
  818. }
  819. async function downloadPdfBlob(path: string, id: number, baseUrl: string, defaultFilename: string) {
  820. const url = buildPdfUrl(baseUrl, path, id);
  821. const auth = useAuthStore();
  822. const res = await fetch(url, {
  823. method: 'GET',
  824. headers: {
  825. token: auth.token,
  826. __token__: auth.token,
  827. },
  828. });
  829. if (!res.ok)
  830. throw new Error('下载失败,状态码:' + res.status);
  831. const blob = await res.blob();
  832. const objectUrl = URL.createObjectURL(blob);
  833. const a = document.createElement('a');
  834. a.href = objectUrl;
  835. a.download = defaultFilename;
  836. a.rel = 'noopener';
  837. document.body.appendChild(a);
  838. a.click();
  839. document.body.removeChild(a);
  840. URL.revokeObjectURL(objectUrl);
  841. }
  842. export class AssessmentContentApi extends AppServerRequestModule<DataModel> {
  843. constructor() {
  844. super();
  845. }
  846. async getDataCount(level?: number) {
  847. const res = (await this.post<{
  848. agreement: object;
  849. agreement_reject: object;
  850. check: object;
  851. check_reject: object;
  852. }>('/ich/check/dataCount', '自查/协议数据统计', {
  853. level,
  854. })).requireData();
  855. return {
  856. /**自查评估表统计 {进度值progress:数量} */
  857. check: transformArrayDataModel<DataCountItem>(DataCountItem, transformSomeToArray(res.check), 'data.check'),
  858. /**自查评估表退回统计 {退回类型reject_type:数量} */
  859. checkReject: transformArrayDataModel<DataCountItem>(DataCountItem, transformSomeToArray(res.check_reject), 'data.checkReject'),
  860. /**传承协议统计 {进度值progress:数量} */
  861. agreement: transformArrayDataModel<DataCountItem>(DataCountItem, transformSomeToArray(res.agreement), 'data.agreement'),
  862. /**传承协议退回统计 {退回类型reject_type:数量} */
  863. agreementReject: transformArrayDataModel<DataCountItem>(DataCountItem, transformSomeToArray(res.agreement_reject), 'data.agreementReject'),
  864. };
  865. }
  866. async getCheckItems(level: number) {
  867. const res = await this.post('/ich/check/getCheckItems', '自查计分项目', { level });
  868. const list = transformSomeToArray(res.data) as KeyValue[];
  869. const items = transformArrayDataModel<CheckItemInfo>(CheckItemInfo, list, 'data') as CheckItemInfo[];
  870. const map = new Map<number, CheckItemInfo>();
  871. for (const item of items)
  872. map.set(item.id, item);
  873. const top = items.filter((item) => item.pid === 0);
  874. for (const item of items)
  875. item.children = items.filter((i) => i.pid === item.id);
  876. return {
  877. top,
  878. map,
  879. };
  880. }
  881. async getSelfAssessmentList(data: {
  882. userId?: number;
  883. progress?: number;
  884. level?: number;
  885. year?: number;
  886. keywords?: string;
  887. page?: number;
  888. pageSize?: number;
  889. }) {
  890. const res = await this.post<KeyValue>('/ich/check/getList', '评估表列表', {
  891. user_id: data.userId,
  892. progress: data.progress,
  893. level: data.level,
  894. year: data.year,
  895. keywords: data.keywords,
  896. page: data.page,
  897. pageSize: data.pageSize,
  898. });
  899. return normalizePaginated<SelfAssessmentListRow>(SelfAssessmentListRow, res.requireData());
  900. }
  901. async getAgreementList(data: {
  902. userId?: number;
  903. level?: number;
  904. year?: number;
  905. keywords?: string;
  906. page?: number;
  907. pageSize?: number;
  908. }) {
  909. const res = await this.post<KeyValue>('/ich/check/getAgreementList', '传承协议列表', {
  910. user_id: data.userId,
  911. level: data.level,
  912. year: data.year,
  913. keywords: data.keywords,
  914. page: data.page,
  915. pageSize: data.pageSize,
  916. });
  917. return normalizePaginated<AgreementListRow>(AgreementListRow, res.requireData());
  918. }
  919. /**
  920. * 保护单位账号:传承人传承协议分页列表
  921. * @param data.progress -1=未提交,0=草稿,1=已自评,2=审核完成
  922. */
  923. async getUserAgreementList(data: {
  924. userId?: number;
  925. progress?: number;
  926. level?: number;
  927. year?: number;
  928. keywords?: string;
  929. page?: number;
  930. pageSize?: number;
  931. }) {
  932. const res = await this.post<KeyValue>('/ich/check/getUserAgreement', '传承人传承协议列表', {
  933. user_id: data.userId,
  934. progress: data.progress,
  935. level: data.level,
  936. year: data.year,
  937. keywords: data.keywords,
  938. page: data.page,
  939. pageSize: data.pageSize,
  940. });
  941. return normalizePaginated<UserAgreementListRow>(UserAgreementListRow, res.requireData());
  942. }
  943. /**
  944. * 自查表审核日志列表
  945. */
  946. async getCheckLogList(data: {
  947. userId?: number;
  948. reviewType?: number;
  949. year?: number;
  950. status?: number;
  951. operator?: number;
  952. checkId?: number;
  953. keywords?: string;
  954. page?: number;
  955. pageSize?: number;
  956. }) {
  957. const res = await this.post<KeyValue>('/ich/check/checkLogList', '自查表审核日志', {
  958. user_id: data.userId,
  959. review_type: data.reviewType,
  960. year: data.year,
  961. status: data.status,
  962. operator: data.operator,
  963. check_id: data.checkId,
  964. keywords: data.keywords,
  965. page: data.page,
  966. pageSize: data.pageSize,
  967. });
  968. return normalizePaginated<CheckLogListRow>(CheckLogListRow, res.requireData());
  969. }
  970. /**
  971. * 保护单位账号:传承人分页列表
  972. * @param data.progress -1=未提交,0=草稿,1=已自评,2=项目保护单位审核完成,3=县(区)文旅部门审核完成,4=设区市文旅部门/省非遗中心审核完成,5=省文化和旅游厅审核完成
  973. */
  974. async getInheritorList(data: {
  975. userId?: number;
  976. progress?: number;
  977. level?: number;
  978. year?: number;
  979. keywords?: string;
  980. page?: number;
  981. pageSize?: number;
  982. logStatus?: number;
  983. }) {
  984. const res = await this.post<KeyValue>('/ich/check/getInheritorList', '传承人列表', {
  985. user_id: data.userId,
  986. progress: data.progress,
  987. level: data.level,
  988. year: data.year,
  989. keywords: data.keywords,
  990. page: data.page,
  991. pageSize: data.pageSize,
  992. log_status: data.logStatus,
  993. });
  994. return normalizePaginated<InheritorCheckListRow>(InheritorCheckListRow, res.requireData());
  995. }
  996. async saveAgreement(dataModel: AgreementDetail) {
  997. return this.post('/ich/check/saveAgreement', '传承协议保存', dataModel.toServerSide());
  998. }
  999. /**
  1000. * 传承协议审核
  1001. * POST `/ich/check/reviewAgreement`
  1002. */
  1003. async reviewAgreement(payload: AgreementReviewPayload) {
  1004. return this.post('/ich/check/reviewAgreement', '传承协议审核', {
  1005. id: payload.id,
  1006. progress: payload.progress,
  1007. reject_type: payload.rejectType || 0,
  1008. reject_reason: payload.rejectReason,
  1009. });
  1010. }
  1011. async saveSelfAssessment(dataModel: SelfAssessmentDetail, progress?: number) {
  1012. const data = dataModel.toServerSide();
  1013. if (progress !== undefined)
  1014. data.progress = progress;
  1015. return this.post('/ich/check/save', '自查评估表保存', data);
  1016. }
  1017. /**
  1018. * 自查评估表审核
  1019. * POST `/ich/check/review`
  1020. */
  1021. async reviewSelfAssessment(payload: IchCheckReviewPayload) {
  1022. return this.post('/ich/check/review', '自查评估表审核', {
  1023. id: payload.id,
  1024. ich_unit: payload.ichUnit,
  1025. unit_points: payload.unitPoints,
  1026. county: payload.county,
  1027. county_points: payload.countyPoints,
  1028. district: payload.district,
  1029. district_points: payload.districtPoints,
  1030. province: payload.province,
  1031. province_points: payload.provincePoints,
  1032. district_st: payload.districtSt,
  1033. district_st_points: payload.districtStPoints,
  1034. district_nd: payload.districtNd,
  1035. district_nd_points: payload.districtNdPoints,
  1036. district_rd: payload.districtRd,
  1037. district_rd_points: payload.districtRdPoints,
  1038. district_th: payload.districtTh,
  1039. district_th_points: payload.districtThPoints,
  1040. district_fi: payload.districtFi,
  1041. district_fi_points: payload.districtFiPoints,
  1042. progress: payload.progress,
  1043. reject_type: payload.rejectType || 0,
  1044. reject_reason: payload.rejectReason,
  1045. reasons: payload.reasons,
  1046. send_msg: payload.sendMsg === false ? 0 : undefined,
  1047. });
  1048. }
  1049. /**
  1050. * 自查评估表审核(新)
  1051. * POST `/ich/check/reviewOnly`
  1052. */
  1053. async reviewOnly(payload: SelfAssessmentReviewOnlyPayload) {
  1054. return this.post<SelfAssessmentReviewOnlyResult>('/ich/check/reviewOnly', '自查评估表审核(新)', {
  1055. check_id: payload.checkId,
  1056. group_id: payload.groupId,
  1057. reject_type: payload.rejectType,
  1058. reject_reason: payload.rejectReason,
  1059. opinion: payload.opinion,
  1060. points: payload.points,
  1061. send_msg: payload.sendMsg,
  1062. });
  1063. }
  1064. /**
  1065. * 过会后修改分数和意见
  1066. * POST `/ich/check/checkReview`
  1067. */
  1068. async checkReview(payload: CheckReviewPayload) {
  1069. return this.post('/ich/check/checkReview', '过会后修改分数和意见', {
  1070. check_id: payload.checkId,
  1071. ich_unit: payload.ichUnit,
  1072. unit_points: payload.unitPoints,
  1073. county: payload.county,
  1074. county_points: payload.countyPoints,
  1075. district: payload.district,
  1076. district_points: payload.districtPoints,
  1077. province: payload.province,
  1078. province_points: payload.provincePoints,
  1079. progress: payload.progress,
  1080. reject_type: payload.rejectType,
  1081. reject_reason: payload.rejectReason,
  1082. scan: payload.scan,
  1083. });
  1084. }
  1085. async downloadSelfAssessmentPdf(id: number) {
  1086. await downloadPdfBlob('/pdf/create', id, this.config.baseUrl, `self-assessment-${id}.pdf`);
  1087. }
  1088. /**
  1089. * 预览自查评估表 PDF
  1090. */
  1091. async previewSelfAssessmentPdf(id: number) {
  1092. const url = `${this.config.baseUrl}/pdf/create/${id}?main_body_id=${ApiCofig.mainBodyId}`;
  1093. const auth = useAuthStore();
  1094. const res = await fetch(url, {
  1095. method: 'POST',
  1096. headers: {
  1097. 'Content-Type': 'application/json',
  1098. token: auth.token,
  1099. __token__: auth.token,
  1100. },
  1101. body: JSON.stringify({ id }),
  1102. });
  1103. if (!res.ok)
  1104. throw new Error('预览失败,状态码:' + res.status);
  1105. const blob = await res.blob();
  1106. return URL.createObjectURL(blob);
  1107. }
  1108. async downloadAgreementPdf(id: number) {
  1109. await downloadPdfBlob('/pdf/nationalContract', id, this.config.baseUrl, `agreement-${id}.pdf`);
  1110. }
  1111. /**
  1112. * 预览传承协议 PDF
  1113. */
  1114. async previewAgreementPdf(id: number) {
  1115. const url = `${this.config.baseUrl}/pdf/nationalContract/?id=${id}&main_body_id=${ApiCofig.mainBodyId}`;
  1116. const auth = useAuthStore();
  1117. const res = await fetch(url, {
  1118. method: 'POST',
  1119. headers: {
  1120. 'Content-Type': 'application/json',
  1121. token: auth.token,
  1122. __token__: auth.token,
  1123. },
  1124. });
  1125. if (!res.ok)
  1126. throw new Error('预览失败,状态码:' + res.status);
  1127. const blob = await res.blob();
  1128. return URL.createObjectURL(blob);
  1129. }
  1130. async saveAnnex(payload: SaveCheckAnnexPayload) {
  1131. return this.post('/ich/check/saveAnnex', '证明材料保存', {
  1132. id: payload.id,
  1133. name: payload.name,
  1134. form_id: payload.formId,
  1135. item_id: payload.itemId,
  1136. url: payload.url,
  1137. type: payload.type,
  1138. desc: payload.desc,
  1139. mimetype: payload.mimetype,
  1140. attach_id: payload.attachId,
  1141. filesize: payload.fileSize,
  1142. });
  1143. }
  1144. async getAnnexList(formId: number, itemId?: number) {
  1145. const res = await this.post<KeyValue>('/ich/check/getAnnexList', '证明材料列表', {
  1146. form_id: formId,
  1147. item_id: itemId,
  1148. });
  1149. return normalizePaginated<CheckAnnexListItem>(CheckAnnexListItem, res.requireData());
  1150. }
  1151. async delAnnex(id: number) {
  1152. return this.post('/ich/check/delAnnex', '删除证明材料', { id });
  1153. }
  1154. async getInheritorBasic(userId?: number) {
  1155. const res = await this.post<KeyValue>('/ich/check/basic', '传承人自查基础信息', {
  1156. user_id: userId,
  1157. });
  1158. return transformDataModel<InheritorCheckBasicInfo>(InheritorCheckBasicInfo, res.requireData());
  1159. }
  1160. async getSelfAssessmentDetail(id: number, userId?: number) {
  1161. const res = await this.post<KeyValue>('/ich/check/detail', '评估表详情', { id, user_id: userId });
  1162. return transformDataModel<SelfAssessmentDetail>(SelfAssessmentDetail, res.requireData());
  1163. }
  1164. async getAgreementDetail(id: number, userId?: number) {
  1165. const res = await this.post<KeyValue>('/ich/check/agreementDetail', '传承协议详情', { id, user_id: userId });
  1166. return transformDataModel<AgreementDetail>(AgreementDetail, res.requireData());
  1167. }
  1168. /**
  1169. * 自查表汇总excel导出
  1170. */
  1171. async exportCheckExcel(data: { level?: number; year?: number; progress?: number }) {
  1172. const auth = useAuthStore();
  1173. let url = `${this.config.baseUrl}/pdf/exportCheckExcel`;
  1174. url = appendGetUrlParams(url, 'main_body_id', ApiCofig.mainBodyId);
  1175. url = appendGetUrlParams(url, 'token', auth.token);
  1176. if (data.level !== undefined) url = appendGetUrlParams(url, 'level', String(data.level));
  1177. if (data.year) url = appendGetUrlParams(url, 'year', String(data.year));
  1178. if (data.progress !== undefined) url = appendGetUrlParams(url, 'progress', String(data.progress));
  1179. const res = await fetch(url, {
  1180. method: 'POST',
  1181. headers: {
  1182. token: auth.token,
  1183. __token__: auth.token,
  1184. },
  1185. });
  1186. if (!res.ok)
  1187. throw new Error('导出失败,状态码:' + res.status);
  1188. const blob = await res.blob();
  1189. const objectUrl = URL.createObjectURL(blob);
  1190. const a = document.createElement('a');
  1191. a.href = objectUrl;
  1192. a.download = `自查表汇总-${data.year || '全部'}.xlsx`;
  1193. a.rel = 'noopener';
  1194. document.body.appendChild(a);
  1195. a.click();
  1196. document.body.removeChild(a);
  1197. URL.revokeObjectURL(objectUrl);
  1198. }
  1199. /**
  1200. * 打包传承人自查表、汇总表zip下载
  1201. * @see https://www.showdoc.com.cn/minnanCE/11559060626887137
  1202. */
  1203. async downloadCheckZip(data: {
  1204. year?: number;
  1205. level?: number;
  1206. progress?: number
  1207. }) {
  1208. const auth = useAuthStore();
  1209. let url = `${this.config.baseUrl}/inheritor_check_download/index`;
  1210. url = appendGetUrlParams(url, 'main_body_id', ApiCofig.mainBodyId);
  1211. url = appendGetUrlParams(url, 'token', auth.token);
  1212. if (data.year) url = appendGetUrlParams(url, 'year', String(data.year));
  1213. if (data.level !== undefined) url = appendGetUrlParams(url, 'level', String(data.level));
  1214. if (data.progress !== undefined) url = appendGetUrlParams(url, 'progress', String(data.progress));
  1215. const res = await fetch(url, {
  1216. method: 'POST',
  1217. headers: {
  1218. token: auth.token,
  1219. __token__: auth.token,
  1220. },
  1221. });
  1222. if (!res.ok)
  1223. throw new Error('下载失败,状态码:' + res.status);
  1224. const blob = await res.blob();
  1225. const objectUrl = URL.createObjectURL(blob);
  1226. const a = document.createElement('a');
  1227. a.href = objectUrl;
  1228. a.download = `自查表汇总-${data.year || '全部'}.zip`;
  1229. a.rel = 'noopener';
  1230. document.body.appendChild(a);
  1231. a.click();
  1232. document.body.removeChild(a);
  1233. URL.revokeObjectURL(objectUrl);
  1234. }
  1235. /**
  1236. * 审核结果建议汇总 PDF 导出
  1237. * @see pdf/exportSummaryPdf
  1238. */
  1239. private buildSummaryPdfUrl(data: { year?: number; level?: string; region?: string }) {
  1240. const auth = useAuthStore();
  1241. let url = `${this.config.baseUrl}/pdf/exportSummaryPdf`;
  1242. url = appendGetUrlParams(url, 'main_body_id', ApiCofig.mainBodyId);
  1243. url = appendGetUrlParams(url, 'token', auth.token);
  1244. if (data.year) url = appendGetUrlParams(url, 'year', String(data.year));
  1245. if (data.level !== undefined && data.level !== '') url = appendGetUrlParams(url, 'level', data.level);
  1246. if (data.region !== undefined && data.region !== '') url = appendGetUrlParams(url, 'region', data.region);
  1247. return url;
  1248. }
  1249. /**
  1250. * 预览审核结果建议汇总 PDF
  1251. * @returns PDF Blob URL
  1252. */
  1253. async previewSummaryPdf(data: { year?: number; level?: string; region?: string }) {
  1254. const url = this.buildSummaryPdfUrl(data);
  1255. const auth = useAuthStore();
  1256. const res = await fetch(url, {
  1257. method: 'POST',
  1258. headers: {
  1259. token: auth.token,
  1260. __token__: auth.token,
  1261. },
  1262. });
  1263. if (!res.ok)
  1264. throw new Error('预览失败,状态码:' + res.status);
  1265. const blob = await res.blob();
  1266. return URL.createObjectURL(blob);
  1267. }
  1268. /**
  1269. * 下载审核结果建议汇总 PDF
  1270. */
  1271. async downloadSummaryPdf(data: { year?: number; level?: string; region?: string }) {
  1272. const url = this.buildSummaryPdfUrl(data);
  1273. const auth = useAuthStore();
  1274. const res = await fetch(url, {
  1275. method: 'POST',
  1276. headers: {
  1277. token: auth.token,
  1278. __token__: auth.token,
  1279. },
  1280. });
  1281. if (!res.ok)
  1282. throw new Error('下载失败,状态码:' + res.status);
  1283. const blob = await res.blob();
  1284. const objectUrl = URL.createObjectURL(blob);
  1285. const a = document.createElement('a');
  1286. a.href = objectUrl;
  1287. a.download = `审核结果建议汇总-${data.year || '全部'}.pdf`;
  1288. a.rel = 'noopener';
  1289. document.body.appendChild(a);
  1290. a.click();
  1291. document.body.removeChild(a);
  1292. URL.revokeObjectURL(objectUrl);
  1293. }
  1294. }
  1295. export default new AssessmentContentApi();