AssessmentContent.ts 34 KB

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