AssessmentContent.ts 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866
  1. import { DataModel, transformArrayDataModel, transformDataModel, type KeyValue } from '@imengyu/js-request-transform';
  2. import { AppServerRequestModule } from '../RequestModules';
  3. import { transformSomeToArray } from '../Utils';
  4. import ApiCofig from '@/common/config/ApiCofig';
  5. import { appendGetUrlParams } from '@imengyu/imengyu-utils';
  6. import { useAuthStore } from '@/stores/auth';
  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. };
  153. this._convertKeyType = (key) => {
  154. if (key.endsWith('Text') || key.endsWith('_text')) {
  155. return { clientSide: 'string', serverSide: 'undefined' };
  156. }
  157. return undefined;
  158. };
  159. }
  160. id = 0 as number;
  161. title = '' as string;
  162. associationId = '' as string;
  163. sitesId = 0 as number;
  164. level = null as number|string|null;
  165. batch = 0 as number;
  166. gender = '' as string;
  167. basicMobile = '' as string|null;
  168. basicUnit = '' as string|null;
  169. ichId = 0 as number;
  170. ichTitle = '' as string;
  171. /** 已填写的传承协议记录 ID,未填写时为 null */
  172. agreementId = null as number|null;
  173. userId = null as number|null;
  174. year = null as number|null;
  175. partyA = '' as string|null;
  176. partyB = '' as string|null;
  177. apprentice = null as number|null;
  178. activity = null as number|null;
  179. course = null as number|null;
  180. mobile = '' as string|null;
  181. partyAMobile = '' as string|null;
  182. partyAContact = '' as string|null;
  183. idCard = '' as string|null;
  184. health = '' as string|null;
  185. ich = '' as string|null;
  186. partyASign = '' as string|null;
  187. partyBSign = '' as string|null;
  188. /** -1=未提交,0=草稿,1=已自评,2=审核完成 */
  189. progress = null as number|null;
  190. createtime = '' as string|null;
  191. updatetime = '' as string|null;
  192. deletetime = '' as string|null;
  193. batchText = '' as string;
  194. ichSiteTypeText = '' as string;
  195. }
  196. /** 保护单位账号:传承人列表行(ich/check/getInheritorList) */
  197. export class InheritorCheckListRow extends DataModel<InheritorCheckListRow> {
  198. constructor() {
  199. super(InheritorCheckListRow, '传承人列表项');
  200. this.setNameMapperCase('Camel', 'Snake');
  201. this._convertTable = {
  202. id: { clientSide: 'number', serverSide: 'number' },
  203. sitesId: { clientSide: 'number', serverSide: 'number' },
  204. batch: { clientSide: 'number', serverSide: 'number' },
  205. ichId: { clientSide: 'number', serverSide: 'number' },
  206. checkId: { clientSide: 'number', serverSide: 'number' },
  207. userId: { clientSide: 'number', serverSide: 'number' },
  208. year: { clientSide: 'number', serverSide: 'number' },
  209. weigh: { clientSide: 'number', serverSide: 'number' },
  210. deductPoints: { clientSide: 'number', serverSide: 'number' },
  211. points: { clientSide: 'number', serverSide: 'number' },
  212. self: { clientSide: 'number', serverSide: 'number' },
  213. ichUnit: { clientSide: 'number', serverSide: 'number' },
  214. unitPoints: { clientSide: 'number', serverSide: 'number' },
  215. county: { clientSide: 'number', serverSide: 'number' },
  216. countyPoints: { clientSide: 'number', serverSide: 'number' },
  217. district: { clientSide: 'number', serverSide: 'number' },
  218. districtPoints: { clientSide: 'number', serverSide: 'number' },
  219. province: { clientSide: 'number', serverSide: 'number' },
  220. provincePoints: { clientSide: 'number', serverSide: 'number' },
  221. progress: { clientSide: 'number', serverSide: 'number' },
  222. level: { clientSide: 'number', serverSide: 'string' },
  223. };
  224. this._convertKeyType = (key) => {
  225. if (key.endsWith('Text') || key.endsWith('_text')) {
  226. return { clientSide: 'string', serverSide: 'undefined' };
  227. }
  228. return undefined;
  229. };
  230. }
  231. id = 0 as number;
  232. title = '' as string;
  233. /** 关联项目 ID(接口可能返回字符串数字) */
  234. associationId = '' as string;
  235. sitesId = 0 as number;
  236. level = null as number|string|null;
  237. batch = 0 as number;
  238. gender = '' as string;
  239. basicMobile = '' as string|null;
  240. basicUnit = '' as string|null;
  241. ichId = 0 as number;
  242. ichTitle = '' as string;
  243. checkId = null as number|null;
  244. userId = null as number|null;
  245. year = null as number|null;
  246. inheritor = '' as string|null;
  247. unit = '' as string|null;
  248. ichName = '' as string|null;
  249. mobile = '' as string|null;
  250. idCard = '' as string|null;
  251. address = '' as string|null;
  252. weigh = null as number|null;
  253. deductPoints = null as number|null;
  254. points = null as number|null;
  255. self = null as number|null;
  256. ichUnit = null as number|null;
  257. unitPoints = null as number|null;
  258. county = null as number|null;
  259. countyPoints = null as number|null;
  260. district = null as number|null;
  261. districtPoints = null as number|null;
  262. province = null as number|null;
  263. provincePoints = null as number|null;
  264. createtime = '' as string|null;
  265. updatetime = '' as string|null;
  266. /** -1=未提交,0=草稿,1=已自评,2=项目保护单位审核完成,3=县(区)文旅部门审核完成,4=设区市文旅部门/省非遗中心审核完成,5=省文化和旅游厅审核完成 */
  267. progress = null as number|null;
  268. flagText = '' as string;
  269. typeText = '' as string;
  270. openStatusText = '' as string;
  271. statusText = '' as string;
  272. regionText = '' as string;
  273. levelText = '' as string;
  274. crTypeText = '' as string;
  275. ichTypeText = '' as string;
  276. claimStatusText = '' as string;
  277. isMultipleClaimsText = '' as string;
  278. batchText = '' as string;
  279. ichSiteTypeText = '' as string;
  280. }
  281. /** 传承人基础信息(ich/check/basic) */
  282. export class InheritorCheckBasicInfo extends DataModel<InheritorCheckBasicInfo> {
  283. constructor() {
  284. super(InheritorCheckBasicInfo, '传承人自查基础信息');
  285. this.setNameMapperCase('Camel', 'Snake');
  286. this._convertTable = {
  287. userId: { clientSide: 'number', serverSide: 'number' },
  288. level: { clientSide: 'number', serverSide: 'number' },
  289. batch: { clientSide: 'number', serverSide: 'number' },
  290. };
  291. this._convertKeyType = (key) => {
  292. if (key.endsWith('Text') || key.endsWith('_text')) {
  293. return { clientSide: 'string', serverSide: 'undefined' };
  294. }
  295. return undefined;
  296. };
  297. }
  298. userId = 0 as number;
  299. name = '' as string;
  300. region = '' as string;
  301. gender = '' as string;
  302. education = '' as string|null;
  303. ichName = '' as string;
  304. unit = '' as string;
  305. /** 国家级(23), 省级(24), 市级(25) */
  306. level = 0 as number;
  307. idCard = '' as string;
  308. address = '' as string;
  309. batch = 0 as number;
  310. mobile = '' as string;
  311. genderText = '' as string;
  312. educationText = '' as string;
  313. levelText = '' as string;
  314. regionText = '' as string;
  315. /** 已填写的传承协议ID */
  316. agreementId = 0 as number;
  317. /** 已填写的自查表ID */
  318. checkId = 0 as number;
  319. }
  320. /** 详情中已选计分项 */
  321. export class SelfAssessmentCheckItemAnswer extends DataModel<SelfAssessmentCheckItemAnswer> {
  322. constructor() {
  323. super(SelfAssessmentCheckItemAnswer, '自查计分选项');
  324. this.setNameMapperCase('Camel', 'Snake');
  325. this._convertTable = {
  326. id: { clientSide: 'number', serverSide: 'number' },
  327. points: { clientSide: 'number', serverSide: 'number' },
  328. count: { clientSide: 'number', serverSide: 'number' },
  329. };
  330. this._afterSolveServer = (data) => {
  331. if (data.itemId)
  332. data.id = data.itemId;
  333. }
  334. }
  335. id = 0 as number;
  336. points = 0 as number;
  337. count = 0 as number;
  338. }
  339. /** 自查评估表详情 */
  340. export class SelfAssessmentDetail extends DataModel<SelfAssessmentDetail> {
  341. constructor() {
  342. super(SelfAssessmentDetail, '自查评估表详情');
  343. this.setNameMapperCase('Camel', 'Snake');
  344. this._convertTable = {
  345. id: { clientSide: 'number', serverSide: 'number' },
  346. userId: { clientSide: 'number', serverSide: 'number' },
  347. year: { clientSide: 'number', serverSide: 'number' },
  348. weigh: { clientSide: 'number', serverSide: 'number' },
  349. deductPoints: { clientSide: 'number', serverSide: 'number' },
  350. points: { clientSide: 'number', serverSide: 'number' },
  351. self: { clientSide: 'number', serverSide: 'number' },
  352. ichUnit: { clientSide: 'number', serverSide: 'number' },
  353. unitPoints: { clientSide: 'number', serverSide: 'number' },
  354. county: { clientSide: 'number', serverSide: 'number' },
  355. countyPoints: { clientSide: 'number', serverSide: 'number' },
  356. district: { clientSide: 'number', serverSide: 'number' },
  357. districtPoints: { clientSide: 'number', serverSide: 'number' },
  358. province: { clientSide: 'number', serverSide: 'number' },
  359. provincePoints: { clientSide: 'number', serverSide: 'number' },
  360. level: { clientSide: 'number', serverSide: 'string' },
  361. content: {
  362. customToClientFn: (value) => {
  363. try {
  364. if (typeof value === 'object')
  365. return value;
  366. return JSON.parse(value as string);
  367. } catch {
  368. return {};
  369. }
  370. },
  371. customToServerFn: (value) => {
  372. return value;
  373. },
  374. },
  375. awardTime: {
  376. customToClientFn: (value) => {
  377. if (value) {
  378. return dayjs(value as string);
  379. }
  380. return value;
  381. },
  382. serverSide: 'string',
  383. serverSideDateFormat: 'YYYY-MM-DD',
  384. },
  385. checkItems: {
  386. customToClientFn: (value) => {
  387. const arr = transformSomeToArray(value);
  388. for (const item of arr)
  389. item.id = item.item_id;
  390. return transformArrayDataModel(SelfAssessmentCheckItemAnswer, arr, 'data');
  391. },
  392. customToServerFn: (value) => {
  393. return (value as SelfAssessmentCheckItemAnswer[])
  394. .filter(item => item.count > 0)
  395. .map((item) => {
  396. return {
  397. id: item.id,
  398. count: item.count,
  399. };
  400. });
  401. },
  402. },
  403. };
  404. this._blackList.toServer = [
  405. 'createtime',
  406. 'updatetime',
  407. 'deletetime',
  408. ]
  409. this._convertKeyType = (key) => {
  410. if (key.endsWith('Text') || key.endsWith('_text')) {
  411. return { clientSide: 'string', serverSide: 'undefined' };
  412. }
  413. return undefined;
  414. };
  415. this._beforeSolveClient = (data) => {
  416. if (data.id == 0)
  417. delete data.id;
  418. return data;
  419. }
  420. }
  421. id = 0 as number;
  422. userId = 0 as number;
  423. year = 0 as number;
  424. inheritor = '' as string|null;
  425. unit = '' as string|null;
  426. ichName = '' as string|null;
  427. mobile = '' as string|null;
  428. idCard = '' as string|null;
  429. level = null as number|string|null;
  430. address = '' as string|null;
  431. content : Record<string, any>|null = null;
  432. weigh = 0 as number;
  433. awardTime = dayjs();
  434. deductContent = '' as string|null;
  435. deductPoints = 0 as number;
  436. points = 0 as number;
  437. /** 进度:
  438. 0=草稿,
  439. 1=已自评,
  440. 2=项目保护单位审核完成,
  441. 3=县(区)文旅部门审核完成,
  442. 4=设区市文旅部门、省非遗中心审核完成,
  443. 5=省文化和旅游厅审核完成 */
  444. progress = 0;
  445. self = null as number|null;
  446. sign = '' as string|null;
  447. ichUnit = null as number|null;
  448. unitPoints = 0 as number;
  449. county = null as number|null;
  450. countyPoints = 0 as number;
  451. district = null as number|null;
  452. districtPoints = 0 as number;
  453. province = null as number|null;
  454. provincePoints = 0 as number;
  455. createtime = '' as string;
  456. updatetime = '' as string;
  457. deletetime = '' as string|null;
  458. selfText = '' as string;
  459. checkItems : SelfAssessmentCheckItemAnswer[] = [];
  460. }
  461. /** 传承协议详情 */
  462. export class AgreementDetail extends DataModel<AgreementDetail> {
  463. constructor() {
  464. super(AgreementDetail, '传承协议详情');
  465. this.setNameMapperCase('Camel', 'Snake');
  466. this._convertTable = {
  467. id: { clientSide: 'number', serverSide: 'number' },
  468. userId: { clientSide: 'number', serverSide: 'number' },
  469. year: { clientSide: 'number', serverSide: 'number' },
  470. apprentice: { clientSide: 'number', serverSide: 'number' },
  471. activity: { clientSide: 'number', serverSide: 'number' },
  472. course: { clientSide: 'number', serverSide: 'number' },
  473. level: { clientSide: 'number', serverSide: 'number' },
  474. updatetime: { clientSide: 'date', serverSide: 'undefined' },
  475. };
  476. this._nameMapperClient = {
  477. partyA: 'party_a',
  478. partyB: 'party_b',
  479. partyASign: 'party_a_sign',
  480. partyBSign: 'party_b_sign',
  481. partyAMobile: 'party_a_mobile',
  482. }
  483. this._blackList.toServer = [
  484. 'createtime',
  485. 'updatetime',
  486. 'deletetime',
  487. ]
  488. this._beforeSolveClient = (data) => {
  489. if (data.id == 0)
  490. delete data.id;
  491. return data;
  492. }
  493. }
  494. id = 0 as number;
  495. userId = 0 as number;
  496. level = null as number|null;
  497. year = 0 as number;
  498. partyA = '' as string|null;
  499. partyB = '' as string|null;
  500. apprentice = 0 as number;
  501. activity = 0 as number;
  502. course = 0 as number;
  503. mobile = '' as string|null;
  504. partyAMobile = '' as string|null;
  505. idCard = '' as string|null;
  506. health = '' as string|null;
  507. ich = '' as string|null;
  508. partyASign = '' as string|null;
  509. partyBSign = '' as string|null;
  510. updatetime = new Date();
  511. }
  512. /** 证明材料附件类型(saveAnnex `type`) */
  513. export const CheckAnnexType = {
  514. Image: 1,
  515. Video: 2,
  516. Audio: 3,
  517. Document: 4,
  518. Other: 5,
  519. ExternalLink: 6,
  520. } as const;
  521. export function getCheckAnnexType(mimetype: string) {
  522. if (mimetype.startsWith('image/')) return CheckAnnexType.Image;
  523. if (mimetype.startsWith('video/')) return CheckAnnexType.Video;
  524. if (mimetype.startsWith('audio/')) return CheckAnnexType.Audio;
  525. if (mimetype.startsWith('application/pdf')) return CheckAnnexType.Document;
  526. return CheckAnnexType.Other;
  527. }
  528. export type CheckAnnexTypeValue = (typeof CheckAnnexType)[keyof typeof CheckAnnexType];
  529. /** 自查表审核提交(POST /ich/check/review) */
  530. export interface IchCheckReviewPayload {
  531. /** 自查表 ID */
  532. id: number;
  533. /** 项目保护单位意见: 1=优秀,2=合格,3=不合格,4=丧失传承能力,5=取消资格 */
  534. ichUnit?: number;
  535. unitPoints?: number;
  536. /** 县(区)文旅部门审核意见,取值同 ichUnit */
  537. county?: number;
  538. countyPoints?: number;
  539. /** 设区市文旅部门、省非遗中心审核意见,取值同 ichUnit */
  540. district?: number;
  541. districtPoints?: number;
  542. /** 省文化和旅游厅意见,取值同 ichUnit */
  543. province?: number;
  544. provincePoints?: number;
  545. /** 0=草稿,1=已自评,2=项目保护单位审核完成,3=县(区)文旅部门审核完成,4=设区市文旅部门/省非遗中心审核完成,5=省文化和旅游厅审核完成 */
  546. progress: number;
  547. /** 退回状态: 0=无,1=自评阶段退回,2=项目保护单位退回,3=县(区)文旅部门退回,4=设区市文旅部门/省非遗中心退回,5=省文化和旅游厅退回 */
  548. rejectType?: number;
  549. /** 退回原因 */
  550. rejectReason?: string;
  551. }
  552. /** 证明材料修改与新增请求体(POST /ich/check/saveAnnex) */
  553. export interface SaveCheckAnnexPayload {
  554. id?: number;
  555. name: string;
  556. formId: number;
  557. itemId?: number;
  558. url: string;
  559. type: CheckAnnexTypeValue | number;
  560. desc?: string;
  561. mimetype?: string;
  562. attachId?: number;
  563. fileSize?: number;
  564. }
  565. /** 证明材料列表项(getAnnexList) */
  566. export class CheckAnnexListItem extends DataModel<CheckAnnexListItem> {
  567. constructor() {
  568. super(CheckAnnexListItem, '证明材料列表项');
  569. this.setNameMapperCase('Camel', 'Snake');
  570. this._convertTable = {
  571. id: { clientSide: 'number', serverSide: 'number' },
  572. formId: { clientSide: 'number', serverSide: 'number' },
  573. type: { clientSide: 'number', serverSide: 'number' },
  574. attachId: { clientSide: 'number', serverSide: 'number' },
  575. fileSize: { clientSide: 'number', serverSide: 'number' },
  576. };
  577. }
  578. id = 0 as number;
  579. name = '' as string;
  580. formId = 0 as number;
  581. url = '' as string;
  582. type = 0 as number;
  583. desc = '' as string|null;
  584. mimetype = '' as string|null;
  585. attachId = null as number|null;
  586. fileSize = null as number|null;
  587. createtime = '' as string|null;
  588. updatetime = '' as string|null;
  589. }
  590. export type IchCheckPaginated<T> = {
  591. total: number;
  592. perPage: number;
  593. currentPage: number;
  594. lastPage: number;
  595. data: T[];
  596. };
  597. function normalizePaginated<T extends DataModel>(rowClass: new () => T, raw: KeyValue): IchCheckPaginated<T> {
  598. return {
  599. total: Number(raw.total ?? 0),
  600. perPage: Number(raw.per_page ?? 0),
  601. currentPage: Number(raw.current_page ?? 0),
  602. lastPage: Number(raw.last_page ?? 0),
  603. data: transformArrayDataModel(rowClass, transformSomeToArray(raw.data), 'data'),
  604. };
  605. }
  606. function buildPdfUrl(baseUrl: string, path: string, id: number) {
  607. const auth = useAuthStore();
  608. let url = `${baseUrl}${path}?id=${encodeURIComponent(String(id))}`;
  609. url = appendGetUrlParams(url, 'main_body_id', ApiCofig.mainBodyId);
  610. url = appendGetUrlParams(url, 'token', auth.token);
  611. return url;
  612. }
  613. async function downloadPdfBlob(path: string, id: number, baseUrl: string, defaultFilename: string) {
  614. const url = buildPdfUrl(baseUrl, path, id);
  615. const auth = useAuthStore();
  616. const res = await fetch(url, {
  617. method: 'GET',
  618. headers: {
  619. token: auth.token,
  620. __token__: auth.token,
  621. },
  622. });
  623. if (!res.ok)
  624. throw new Error('下载失败,状态码:' + res.status);
  625. const blob = await res.blob();
  626. const objectUrl = URL.createObjectURL(blob);
  627. const a = document.createElement('a');
  628. a.href = objectUrl;
  629. a.download = defaultFilename;
  630. a.rel = 'noopener';
  631. document.body.appendChild(a);
  632. a.click();
  633. document.body.removeChild(a);
  634. URL.revokeObjectURL(objectUrl);
  635. }
  636. export class AssessmentContentApi extends AppServerRequestModule<DataModel> {
  637. constructor() {
  638. super();
  639. }
  640. async getCheckItems(level: number) {
  641. const res = await this.post('/ich/check/getCheckItems', '自查计分项目', { level });
  642. const list = transformSomeToArray(res.data) as KeyValue[];
  643. const items = transformArrayDataModel<CheckItemInfo>(CheckItemInfo, list, 'data') as CheckItemInfo[];
  644. const map = new Map<number, CheckItemInfo>();
  645. for (const item of items)
  646. map.set(item.id, item);
  647. const top = items.filter((item) => item.pid === 0);
  648. for (const item of items)
  649. item.children = items.filter((i) => i.pid === item.id);
  650. return {
  651. top,
  652. map,
  653. };
  654. }
  655. async getSelfAssessmentList(data: {
  656. userId?: number;
  657. progress?: number;
  658. level?: number;
  659. year?: number;
  660. keywords?: string;
  661. page?: number;
  662. pageSize?: number;
  663. }) {
  664. const res = await this.post<KeyValue>('/ich/check/getList', '评估表列表', {
  665. user_id: data.userId,
  666. progress: data.progress,
  667. level: data.level,
  668. year: data.year,
  669. keywords: data.keywords,
  670. page: data.page,
  671. pageSize: data.pageSize,
  672. });
  673. return normalizePaginated<SelfAssessmentListRow>(SelfAssessmentListRow, res.requireData());
  674. }
  675. async getAgreementList(data: {
  676. userId?: number;
  677. level?: number;
  678. year?: number;
  679. keywords?: string;
  680. page?: number;
  681. pageSize?: number;
  682. }) {
  683. const res = await this.post<KeyValue>('/ich/check/getAgreementList', '传承协议列表', {
  684. user_id: data.userId,
  685. level: data.level,
  686. year: data.year,
  687. keywords: data.keywords,
  688. page: data.page,
  689. pageSize: data.pageSize,
  690. });
  691. return normalizePaginated<AgreementListRow>(AgreementListRow, res.requireData());
  692. }
  693. /**
  694. * 保护单位账号:传承人传承协议分页列表
  695. * @param data.progress -1=未提交,0=草稿,1=已自评,2=审核完成
  696. */
  697. async getUserAgreementList(data: {
  698. userId?: number;
  699. progress?: number;
  700. level?: number;
  701. year?: number;
  702. keywords?: string;
  703. page?: number;
  704. pageSize?: number;
  705. }) {
  706. const res = await this.post<KeyValue>('/ich/check/getUserAgreement', '传承人传承协议列表', {
  707. user_id: data.userId,
  708. progress: data.progress,
  709. level: data.level,
  710. year: data.year,
  711. keywords: data.keywords,
  712. page: data.page,
  713. pageSize: data.pageSize,
  714. });
  715. return normalizePaginated<UserAgreementListRow>(UserAgreementListRow, res.requireData());
  716. }
  717. /**
  718. * 保护单位账号:传承人分页列表
  719. * @param data.progress -1=未提交,0=草稿,1=已自评,2=项目保护单位审核完成,3=县(区)文旅部门审核完成,4=设区市文旅部门/省非遗中心审核完成,5=省文化和旅游厅审核完成
  720. */
  721. async getInheritorList(data: {
  722. userId?: number;
  723. progress?: number;
  724. level?: number;
  725. year?: number;
  726. keywords?: string;
  727. page?: number;
  728. pageSize?: number;
  729. }) {
  730. const res = await this.post<KeyValue>('/ich/check/getInheritorList', '传承人列表', {
  731. user_id: data.userId,
  732. progress: data.progress,
  733. level: data.level,
  734. year: data.year,
  735. keywords: data.keywords,
  736. page: data.page,
  737. pageSize: data.pageSize,
  738. });
  739. return normalizePaginated<InheritorCheckListRow>(InheritorCheckListRow, res.requireData());
  740. }
  741. async saveAgreement(dataModel: AgreementDetail) {
  742. return this.post('/ich/check/saveAgreement', '传承协议保存', dataModel.toServerSide());
  743. }
  744. async saveSelfAssessment(dataModel: SelfAssessmentDetail, progress?: number) {
  745. const data = dataModel.toServerSide();
  746. if (progress !== undefined)
  747. data.progress = progress;
  748. return this.post('/ich/check/save', '自查评估表保存', data);
  749. }
  750. /**
  751. * 自查评估表审核
  752. * POST `/ich/check/review`
  753. */
  754. async reviewSelfAssessment(payload: IchCheckReviewPayload) {
  755. return this.post('/ich/check/review', '自查评估表审核', {
  756. id: payload.id,
  757. ich_unit: payload.ichUnit,
  758. unit_points: payload.unitPoints,
  759. county: payload.county,
  760. county_points: payload.countyPoints,
  761. district: payload.district,
  762. district_points: payload.districtPoints,
  763. province: payload.province,
  764. province_points: payload.provincePoints,
  765. progress: payload.progress,
  766. reject_type: payload.rejectType || 0,
  767. reject_reason: payload.rejectReason,
  768. });
  769. }
  770. async downloadSelfAssessmentPdf(id: number) {
  771. await downloadPdfBlob('/pdf/create', id, this.config.baseUrl, `self-assessment-${id}.pdf`);
  772. }
  773. async downloadAgreementPdf(id: number) {
  774. await downloadPdfBlob('/pdf/nationalContract', id, this.config.baseUrl, `agreement-${id}.pdf`);
  775. }
  776. async saveAnnex(payload: SaveCheckAnnexPayload) {
  777. return this.post('/ich/check/saveAnnex', '证明材料保存', {
  778. id: payload.id,
  779. name: payload.name,
  780. form_id: payload.formId,
  781. item_id: payload.itemId,
  782. url: payload.url,
  783. type: payload.type,
  784. desc: payload.desc,
  785. mimetype: payload.mimetype,
  786. attach_id: payload.attachId,
  787. filesize: payload.fileSize,
  788. });
  789. }
  790. async getAnnexList(formId: number, itemId?: number) {
  791. const res = await this.post<KeyValue>('/ich/check/getAnnexList', '证明材料列表', {
  792. form_id: formId,
  793. item_id: itemId,
  794. });
  795. return normalizePaginated<CheckAnnexListItem>(CheckAnnexListItem, res.requireData());
  796. }
  797. async delAnnex(id: number) {
  798. return this.post('/ich/check/delAnnex', '删除证明材料', { id });
  799. }
  800. async getInheritorBasic(userId?: number) {
  801. const res = await this.post<KeyValue>('/ich/check/basic', '传承人自查基础信息', {
  802. user_id: userId,
  803. });
  804. return transformDataModel<InheritorCheckBasicInfo>(InheritorCheckBasicInfo, res.requireData());
  805. }
  806. async getSelfAssessmentDetail(id: number, userId?: number) {
  807. const res = await this.post<KeyValue>('/ich/check/detail', '评估表详情', { id, user_id: userId });
  808. return transformDataModel<SelfAssessmentDetail>(SelfAssessmentDetail, res.requireData());
  809. }
  810. async getAgreementDetail(id: number, userId?: number) {
  811. const res = await this.post<KeyValue>('/ich/check/agreementDetail', '传承协议详情', { id, user_id: userId });
  812. return transformDataModel<AgreementDetail>(AgreementDetail, res.requireData());
  813. }
  814. }
  815. export default new AssessmentContentApi();