VillageInfoApi.ts 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  1. import { DataModel, transformArrayDataModel, transformDataModel, type KeyValue } from '@imengyu/js-request-transform';
  2. import { AppServerRequestModule } from '../RequestModules';
  3. import CommonContent from '../CommonContent';
  4. export class CategoryListItem extends DataModel<CategoryListItem> {
  5. constructor() {
  6. super(CategoryListItem, "分类列表");
  7. this.setNameMapperCase('Camel', 'Snake');
  8. this._convertTable = {
  9. id: { clientSide: 'number', serverSide: 'number', clientSideRequired: true },
  10. pid: { clientSide: 'number', serverSide: 'number' },
  11. haschild: { clientSide: 'boolean', serverSide: 'number' },
  12. }
  13. }
  14. id !: number;
  15. pid !: number;
  16. title = '';
  17. status = 'normal';
  18. weight = 0;
  19. spacer = '';
  20. haschild = false;
  21. children?: CategoryListItem[];
  22. }
  23. export class CommonInfoModel extends DataModel<CommonInfoModel> {
  24. constructor() {
  25. super(CommonInfoModel, "信息详情");
  26. this.setNameMapperCase('Camel', 'Snake');
  27. this._convertTable = {
  28. id: { clientSide: 'number', serverSide: 'number', clientSideRequired: true },
  29. keywords: { clientSide: 'splitCommaArray', serverSide: 'commaArrayMerge' },
  30. culturalType: { clientSide: 'number', serverSide: 'number' },
  31. productType: { clientSide: 'number', serverSide: 'number' },
  32. type: { clientSide: 'number', serverSide: 'number' },
  33. nature: { clientSide: 'number', serverSide: 'number' },
  34. folkCultureType: { clientSide: 'number', serverSide: 'number' },
  35. landforms: [
  36. { clientSide: 'splitCommaArray', serverSide: 'commaArrayMerge' },
  37. { clientSide: 'arrayInt', serverSide: 'original' },
  38. ],
  39. villageType: { clientSide: 'number', serverSide: 'number' },
  40. entityType: { clientSide: 'splitCommaArray', serverSide: 'commaArrayMerge' },
  41. honorType: { clientSide: 'number', serverSide: 'number' },
  42. },
  43. this._blackList.toServer.push(
  44. 'updatedAt', 'createdAt', 'deletedAt',
  45. );
  46. this._convertKeyType = (key, direction) => {
  47. if (key.endsWith('At'))
  48. return {
  49. clientSide: 'date',
  50. serverSide: 'string',
  51. };
  52. return undefined;
  53. };
  54. this._afterSolveServer = () => {
  55. if (this.province && this.city && this.district) {
  56. this.cityAddress = [this.province as string, this.city as string, this.district as string];
  57. }
  58. if (!this.title && this.name)
  59. this.title = this.name;
  60. if (this.longitude && this.latitude) {
  61. this.lonlat = [this.longitude as number, this.latitude as number];
  62. }
  63. };
  64. this._afterSolveClient = (data) => {
  65. if (this.cityAddress) {
  66. data.province = this.cityAddress[0];
  67. data.city = this.cityAddress[1];
  68. data.district = this.cityAddress[2];
  69. }
  70. if (this.lonlat) {
  71. data.longitude = this.lonlat[0];
  72. data.latitude = this.lonlat[1];
  73. }
  74. };
  75. }
  76. /**
  77. * 审核不通过
  78. */
  79. static STATUS_REJECT = -1;
  80. /**
  81. * 草稿
  82. */
  83. static STATUS_DRAFT = 0;
  84. /**
  85. * 待审核
  86. */
  87. static STATUS_AUDIT = 1;
  88. /**
  89. * 审核通过
  90. */
  91. static STATUS_PASS = 2;
  92. /**
  93. * 专家评估
  94. */
  95. static STATUS_EXPERT = 3;
  96. /**
  97. * 终审
  98. */
  99. static STATUS_FINAL = 4;
  100. id !: number;
  101. cityAddress?: string[];
  102. title = '';
  103. desc = '';
  104. image = '';
  105. images = [] as string[];
  106. content = '';
  107. catalogId = 0;
  108. collectModuleId = 0;
  109. villageId = 0;
  110. villageVolunteerId = 0;
  111. villageName = '';
  112. villageVolunteerAvatar = '';
  113. villageVolunteerName = '';
  114. contentId = 0;
  115. name = '';
  116. type = 1;
  117. audio = '';
  118. video = '';
  119. archives = '';
  120. annex = [] as string[];
  121. keywords = [] as string[];
  122. createdAt = new Date();
  123. updatedAt = new Date();
  124. publishAt = new Date();
  125. /**
  126. * 不喜欢数
  127. */
  128. dislikeNum = 0;
  129. /**
  130. * 点赞数
  131. */
  132. likeNum = 0;
  133. /**
  134. * 点赞状态
  135. * * 1=已点赞
  136. * * 2=踩
  137. * * null=未操作
  138. */
  139. likeType = null as 1|2|null;
  140. lonlat?: number[];
  141. landforms = [] as string[];
  142. /** 类型:1=个人,2=团队,3=企业,4=匿名(多选,提交为逗号分隔) */
  143. entityType = [] as string[];
  144. /** 荣誉类型:1=捐赠,2=志愿服务,3=公益帮扶,4=其他 */
  145. honorType = null as number | null;
  146. customName = '';
  147. occurrenceDate = '';
  148. address = '';
  149. statusText = '';
  150. }
  151. export class VillageListItem extends DataModel<VillageListItem> {
  152. constructor() {
  153. super(VillageListItem, "村社信息");
  154. this.setNameMapperCase('Camel', 'Snake');
  155. this._convertTable = {
  156. id: { clientSide: 'number', serverSide: 'number', clientSideRequired: true },
  157. },
  158. this._blackList.toServer.push(
  159. 'updatedAt', 'createdAt', 'deletedAt',
  160. );
  161. this._convertKeyType = (key, direction) => {
  162. if (key.endsWith('At'))
  163. return {
  164. clientSide: 'date',
  165. serverSide: 'string',
  166. };
  167. return undefined;
  168. };
  169. this._afterSolveServer = () => {
  170. if (!this.title) {
  171. if (this.name) this.title = this.name as string;
  172. if (typeof this.content === 'object' && (this.content as any)?.title) this.title = (this.content as any).title as string;
  173. if (this.content) this.title = this.content as string;
  174. if (this.structure) this.title = this.structure as string;
  175. if (this.wisdom) this.title = this.wisdom as string;
  176. }
  177. if (!this.image) {
  178. if (this.distribution) this.image = this.distribution as string;
  179. }
  180. };
  181. }
  182. id !: number;
  183. createdAt = new Date();
  184. updatedAt = new Date();
  185. title = '';
  186. desc = '';
  187. image = '';
  188. }
  189. export class VillageBulidingInfo extends DataModel<VillageBulidingInfo> {
  190. constructor() {
  191. super(VillageBulidingInfo, "历史建筑信息");
  192. this.setNameMapperCase('Camel', 'Snake');
  193. this._convertTable = {
  194. id: { clientSide: 'number', serverSide: 'number', clientSideRequired: true },
  195. }
  196. this._blackList.toServer.push(
  197. 'updatedAt', 'createdAt', 'deletedAt',
  198. );
  199. const commaArrayKeys = [
  200. 'purpose','floorType','wallType','roofForm','bearingType',
  201. ]
  202. this._convertKeyType = (key, direction) => {
  203. if (commaArrayKeys.includes(key))
  204. return [
  205. { clientSide: 'splitCommaArray', serverSide: 'commaArrayMerge' },
  206. { clientSide: 'arrayInt', serverSide: 'original' },
  207. ];
  208. return undefined;
  209. };
  210. }
  211. id !: number;
  212. }
  213. export class VillageInfoApi extends AppServerRequestModule<DataModel> {
  214. constructor() {
  215. super();
  216. }
  217. /**
  218. * 用于获取某一个分类需要用的子级
  219. * @param pid 父级
  220. * @returns
  221. */
  222. getCategoryChildList(pid?: number) {
  223. return CommonContent.getCategoryChildList(pid);
  224. }
  225. getOverview(
  226. villageId: number,
  227. villageVolunteerId: number,
  228. ) {
  229. return (this.post<KeyValue>(`/village/overview/getInfo`, '获取村社概览', {
  230. village_id: villageId,
  231. village_volunteer_id: villageVolunteerId,
  232. }))
  233. .then(res => transformDataModel(CommonInfoModel, res.requireData()))
  234. .catch(e => { throw e });
  235. }
  236. async getInfo<T extends DataModel>(
  237. collectModuleId: number|undefined,
  238. subId: number|undefined,
  239. subKey: string|undefined,
  240. villageId: number,
  241. villageVolunteerId: number,
  242. catalogId?: number|undefined,
  243. id?: number,
  244. modelClassCreator: (new () => T) = CommonInfoModel as any
  245. ) {
  246. return (await this.post(`/village/collect/info`, '通用获取信息详情', {
  247. collect_module_id: collectModuleId,
  248. id,
  249. }, undefined, modelClassCreator)).data as T
  250. }
  251. async getList<T extends DataModel = CommonInfoModel>(data: {
  252. collectModuleId?: number|undefined,
  253. subId?: number|undefined,
  254. subKey?: string|undefined,
  255. villageId?: number|undefined,
  256. villageVolunteerId?: number|undefined,
  257. catalogId?: number|undefined,
  258. page?: number,
  259. pageSize?: number,
  260. status?: number|undefined,
  261. keywords?: string|undefined,
  262. modelClassCreator?: (new () => T),
  263. }) {
  264. return (this.post<{
  265. total: number,
  266. data: any[],
  267. }>(`/village/collect/list`, '获取信息详情', {
  268. collect_module_id: data.collectModuleId,
  269. [data.subKey ? data.subKey : 'type']: data.subId && data.subId >= 0 ? data.subId : undefined,
  270. village_id: data.villageId,
  271. village_volunteer_id: data.villageVolunteerId,
  272. catalog_id: data.catalogId || undefined,
  273. page: data.page,
  274. pageSize: data.pageSize,
  275. status: data.status,
  276. keywords: data.keywords,
  277. }))
  278. .then(res => {
  279. return {
  280. total: res.data?.total as number ?? 0,
  281. list: transformArrayDataModel<T>(data.modelClassCreator ?? CommonInfoModel, res.data?.data ?? [], `获取分类列表`, true)
  282. }
  283. })
  284. .catch(e => { throw e });
  285. }
  286. async getListForDiscover(page: number, pageSize: number, keywords?: string) {
  287. return (this.post<{
  288. total: number,
  289. data: any[],
  290. }>(`/village/collect/list`, '获取信息详情', {
  291. page,
  292. page_size: pageSize,
  293. keywords,
  294. status: 4,
  295. }))
  296. .then(res => ({
  297. total: res.data?.total as number ?? 0,
  298. list: transformArrayDataModel<CommonInfoModel>(CommonInfoModel, res.data?.data ?? [], `获取分类列表`, true)
  299. }))
  300. .catch(e => { throw e });
  301. }
  302. async getInfoForDiscover(id: number) {
  303. return (await this.post(`/village/collect/info`, '通用获取信息详情', {
  304. id,
  305. status: 4,
  306. }, undefined, CommonInfoModel)).data as CommonInfoModel
  307. }
  308. /**
  309. * 点赞/不感兴趣/取消
  310. * @param id 采集记录ID
  311. * @param likeType 类型: 1=点赞, 2=不感兴趣
  312. */
  313. async collectLike(id: number, likeType: 1 | 2) {
  314. return (await this.post<string>(`/village/collect/collectLike`, '点赞/不感兴趣', {
  315. id,
  316. like_type: likeType,
  317. }));
  318. }
  319. async deleteInfo(id: number) {
  320. return (await this.post(`/village/collect/del`, '删除信息详情', {
  321. id,
  322. }, undefined, CommonInfoModel)).data as CommonInfoModel
  323. }
  324. async updateInfo<T extends DataModel>(
  325. collectModuleId: number|undefined,
  326. subKey: string,
  327. subId: number,
  328. villageId: number,
  329. villageVolunteerId: number,
  330. catalogId: number|undefined,
  331. data: T,
  332. ) {
  333. const res : Record<string, any> = {
  334. ...data.toServerSide(),
  335. collect_module_id: collectModuleId,
  336. village_id: villageId,
  337. village_volunteer_id: villageVolunteerId,
  338. catalog_id: catalogId ? catalogId : undefined,
  339. };
  340. if (subKey && subId && subId > 0)
  341. res[subKey] = subId;
  342. return (await this.post(`/village/collect/save`, '通用更新信息详情', res));
  343. }
  344. async getInfoByVillageId(id: number) {
  345. return (await this.post(`/village/village/getInfo`, '获取村社信息', {
  346. id,
  347. }, undefined, VillageListItem)).data as VillageListItem
  348. }
  349. }
  350. export default new VillageInfoApi();