VillageApi.ts 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. import { CONVERTER_ADD_DEFAULT, DataModel, transformArrayDataModel, transformDataModel, type KeyValue } from '@imengyu/js-request-transform';
  2. import { AppServerRequestModule } from '../RequestModules';
  3. import { findAProp, transformSomeToArray } from '../Utils';
  4. import { LoginResult } from '../auth/UserApi';
  5. import AppCofig from '@/common/config/AppCofig';
  6. export class VillageListItem extends DataModel<VillageListItem> {
  7. constructor() {
  8. super(VillageListItem, "活动列表");
  9. this.setNameMapperCase('Camel', 'Snake');
  10. this._convertTable = {
  11. id: { clientSide: 'number', serverSide: 'number', clientSideRequired: true },
  12. collectFlag: { clientSide: 'boolean' },
  13. }
  14. this._nameMapperServer = {
  15. name: 'villageName',
  16. };
  17. this._convertKeyType = (key, direction) => {
  18. if (key.endsWith('At'))
  19. return {
  20. clientSide: 'date',
  21. serverSide: 'string',
  22. };
  23. return undefined;
  24. };
  25. this._afterSolveServer = () => {
  26. this.address =
  27. (this.province || '') +
  28. (this.city || '') +
  29. (this.district || '') +
  30. (this.township || '');
  31. if (this.images && this.images && this.images.length > 0 ) {
  32. this.image = this.images[0]
  33. }
  34. this.thumbnail = this.image;
  35. this.title = this.villageName
  36. }
  37. }
  38. id !: number;
  39. province = '' as string|null;
  40. city = '' as string|null;
  41. district = '' as string|null;
  42. township = '' as string|null;
  43. address = '';
  44. collectFlag = false;
  45. villageVolunteerId = null as number|null;
  46. villageId !:number;
  47. claimReason = '';
  48. status = '';
  49. statusText = '';
  50. createdAt = null as Date|null;
  51. updatedAt = null as Date|null;
  52. deleteAt = null as Date|null;
  53. image = '';
  54. thumbnail = '';
  55. images = [] as string[];
  56. villageName = '';
  57. title = '';
  58. volunteerName = '';
  59. }
  60. export class VolunteerRanklistItem extends DataModel<VolunteerRanklistItem> {
  61. constructor() {
  62. super(VolunteerRanklistItem, "活动列表");
  63. this.setNameMapperCase('Camel', 'Snake');
  64. this._convertTable = {
  65. id: { clientSide: 'number', serverSide: 'number', clientSideRequired: true },
  66. points: [{ clientSide: 'number', serverSide: 'number' }, { clientSide: CONVERTER_ADD_DEFAULT, clientSideParam: { defaultValue: 0 } }],
  67. level: [{ clientSide: 'number', serverSide: 'number' }, { clientSide: CONVERTER_ADD_DEFAULT, clientSideParam: { defaultValue: 0 } }],
  68. }
  69. }
  70. id !: number;
  71. name = '';
  72. mobile = '';
  73. points = 0;
  74. level = 0;
  75. typeText = '';
  76. sexText = '';
  77. statusText = '';
  78. image = '';
  79. }
  80. export class VolunteerInfo extends DataModel<VolunteerInfo> {
  81. constructor() {
  82. super(VolunteerInfo, "活动列表");
  83. this.setNameMapperCase('Camel', 'Snake');
  84. this._convertTable = {
  85. id: { clientSide: 'number', serverSide: 'number', clientSideRequired: true },
  86. points: [{ clientSide: 'number', serverSide: 'number' }, { clientSide: CONVERTER_ADD_DEFAULT, clientSideParam: { defaultValue: 0 } }],
  87. level: [{ clientSide: 'number', serverSide: 'number' }, { clientSide: CONVERTER_ADD_DEFAULT, clientSideParam: { defaultValue: 0 } }],
  88. collectModule: [
  89. { clientSide: 'splitCommaArray',serverSide: 'commaArrayMerge' },
  90. { clientSide: 'array', clientSideChildDataModel: 'number', serverSide: 'original' },
  91. ],
  92. birthday: { clientSide: 'date', serverSide: 'undefined' },
  93. catalogIds: [
  94. { clientSide: 'splitCommaArray', serverSide: 'commaArrayMerge' },
  95. { clientSide: 'array', clientSideChildDataModel: 'number', serverSide: 'original' },
  96. ],
  97. }
  98. }
  99. static STATUS_APPROVED = 1;
  100. static STATUS_PENDING = 0;
  101. static STATUS_REJECTED = -1;
  102. id !: number;
  103. mainBodyId !: number;
  104. avatar = '';
  105. type = '';
  106. name = '';
  107. /**
  108. * 累计发文
  109. */
  110. collectCount = 0;
  111. /**
  112. * 已关注村社数
  113. */
  114. followVillageCount = 0;
  115. sex = 0;
  116. mobile = '';
  117. regionId = null as number|null;
  118. address = '';
  119. image = '';
  120. birthday = new Date();
  121. /**
  122. * 乡源果累计
  123. */
  124. fruittotal = 0;
  125. /**
  126. * 文化积分
  127. */
  128. points = 0;
  129. level = 0;
  130. status = '';
  131. createdAt = '';
  132. updatedAt = '';
  133. typeText = '';
  134. sexText = '';
  135. statusText = '';
  136. catalogIds = [] as number[];
  137. collectModule = [] as number[];
  138. collectModuleText = '';
  139. }
  140. export class VillageClaimInfo extends DataModel<VillageClaimInfo> {
  141. constructor() {
  142. super(VillageClaimInfo, '村落认领');
  143. this.setNameMapperCase('Camel', 'Snake');
  144. this._convertTable = {
  145. villageId: { clientSide: 'number', serverSide: 'number', clientSideRequired: true },
  146. sex: { clientSide: 'number', serverSide: 'number' },
  147. };
  148. }
  149. villageId = 0;
  150. name = '';
  151. type = 'villager';
  152. mobile = '';
  153. address = '';
  154. claimReason = '';
  155. job = '';
  156. unit = '';
  157. sex = 3;
  158. }
  159. export class VillageMenuListItem extends DataModel<VillageMenuListItem> {
  160. constructor() {
  161. super(VillageMenuListItem, "村落菜单列表");
  162. this.setNameMapperCase('Camel', 'Snake');
  163. this._convertTable = {
  164. id: { clientSide: 'number', serverSide: 'number', clientSideRequired: true },
  165. }
  166. this._nameMapperServer = {
  167. };
  168. this._convertKeyType = (key, direction) => {
  169. if (key.endsWith('At'))
  170. return {
  171. clientSide: 'date',
  172. serverSide: 'string',
  173. };
  174. return undefined;
  175. };
  176. }
  177. name = '';
  178. logo = '';
  179. }
  180. export class VillageCatalogListItem extends DataModel<VillageCatalogListItem> {
  181. constructor() {
  182. super(VillageCatalogListItem, "村落目录列表");
  183. this.setNameMapperCase('Camel', 'Snake');
  184. this._convertTable = {
  185. id: { clientSide: 'number', serverSide: 'number', clientSideRequired: true },
  186. childlist: [
  187. { clientSide: 'array', clientSideChildDataModel: VillageCatalogListItem, serverSide: 'undefined' },
  188. ],
  189. }
  190. this._nameMapperServer = {
  191. };
  192. this._afterSolveServer = () => {
  193. this.haschild = (this.childlist as any[]).length > 0;
  194. if (this.otherParams) {
  195. this.typeId = findAProp(this.otherParams, [
  196. { type: 'endWith', name: 'type' },
  197. { type: 'match', name: 'nature' },
  198. { type: 'match', name: 'cultural' },
  199. { type: 'selectAtLestOne' },
  200. ]);
  201. }
  202. }
  203. this._convertKeyType = (key, direction) => {
  204. if (key.endsWith('At'))
  205. return {
  206. clientSide: 'date',
  207. serverSide: 'string',
  208. };
  209. return undefined;
  210. };
  211. }
  212. id !: number;
  213. name = '';
  214. title = '';
  215. icon = '';
  216. desc = '';
  217. pid = 0;
  218. collectModuleId = 0;
  219. collectModuleName = '';
  220. childlist = [] as VillageCatalogListItem[];
  221. villageName = '';
  222. spacer = '';
  223. haschild = false;
  224. typeId = -1;
  225. total = -1;
  226. }
  227. export class VillageApi extends AppServerRequestModule<DataModel> {
  228. constructor() {
  229. super();
  230. }
  231. async getClaimedVallageList(volunteerId?: string) {
  232. const res = await this.get('/village/village/getVillageList', '获取已认领村落', {
  233. village_volunteer_id: volunteerId,
  234. });
  235. return transformArrayDataModel<VillageListItem>(VillageListItem, transformSomeToArray(res.data), `村落`, true);
  236. }
  237. async getCanClaimVallageList() {
  238. const res = await this.get('/village/village/getClaimList', '可认领村落列表', {
  239. main_body_id: 2,
  240. });
  241. return transformArrayDataModel<VillageListItem>(VillageListItem, transformSomeToArray(res.data), `村落`, true);
  242. }
  243. async claimVallage(data: VillageClaimInfo, recommendUserId?: number) {
  244. return this.post('/village/village/addVillageClaim', '认领村落', {
  245. ...data.toServerSide(),
  246. recommend_user_id: recommendUserId || 0,
  247. });
  248. }
  249. async getVallageList(level?: number, status?: number, region?: string) {
  250. const res = await this.get('/village/village/getList', '村落列表', {
  251. history_level: level,
  252. status,
  253. region: region,
  254. });
  255. return transformArrayDataModel<VillageListItem>(VillageListItem, transformSomeToArray(res.data), `村落`, true);
  256. }
  257. async getVolunteerInfo() {
  258. const res = await this.post<KeyValue>('/village/volunteer/getInfo', '获取志愿者信息', {}, undefined);
  259. return transformDataModel<VolunteerInfo>(VolunteerInfo, res.requireData());
  260. }
  261. async getVolunteerRanklist(category?: number) {
  262. const res = await this.post<any[]>('/village/volunteer/getRanklist', '志愿者排行榜', {
  263. category,
  264. });
  265. return transformArrayDataModel<VolunteerRanklistItem>(VolunteerRanklistItem, res.data ?? [], ``, true);
  266. }
  267. async addVolunteer(data: VolunteerInfo) {
  268. return this.post('/village/volunteer/add', '添加志愿者', data.toServerSide());
  269. }
  270. async updateVolunteer(data: VolunteerInfo) {
  271. return this.post('/village/volunteer/save', '更新志愿者', data.toServerSide());
  272. }
  273. async deleteVolunteer(id: number, villageId: number) {
  274. return this.post('/village/volunteer/del', '删除志愿者', {
  275. id,
  276. village_id: villageId,
  277. });
  278. }
  279. async shareAddVolunteer(data: VolunteerInfo, recommendUserId?: number) {
  280. const res = await this.post('/village/volunteer/shareAdd', '分享添加志愿者', {
  281. ...data.toServerSide(),
  282. recommend_user_id: recommendUserId || 0,
  283. }, undefined, LoginResult);
  284. return res.data as LoginResult;
  285. }
  286. async bindVolunteer(data: {
  287. account: string,
  288. password: string
  289. }) {
  290. const res = await this.post('/village/volunteer/bindVolunteer', '绑定志愿者', data, undefined, LoginResult);
  291. return res.data as LoginResult;
  292. }
  293. async bindWechat(data: { code: string }) {
  294. return this.post('/village/volunteer/bindWechat', '绑定微信', {
  295. code: data.code,
  296. appid: AppCofig.appId
  297. });
  298. }
  299. async getVolunteerInfoByIdAdmin(id: number) {
  300. const res = await this.post('/village/volunteer/info', '管理员获取志愿者信息', {
  301. id,
  302. }, undefined, VolunteerInfo);
  303. return res.data as VolunteerInfo;
  304. }
  305. async getVolunteerInfoById(id: number) {
  306. const res = await this.post('/village/volunteer/getInfo', '通过ID获取志愿者信息', {
  307. id,
  308. }, undefined, VolunteerInfo);
  309. return res.data as VolunteerInfo;
  310. }
  311. async getVillageVolunteerList(
  312. page: number, pageSize: number,
  313. villageId?: number, status?: number,
  314. name?: string,
  315. ) {
  316. const res = (await this.post<{
  317. data: KeyValue[],
  318. total: number,
  319. }>('/village/volunteer/getList', '获取志愿者列表', {
  320. village_id: villageId,
  321. status,
  322. page,
  323. pageSize,
  324. })).requireData();
  325. return {
  326. list: transformArrayDataModel<VolunteerInfo>(VolunteerInfo, res.data || [], ``, true),
  327. total: res.total,
  328. };
  329. }
  330. async reviewVillageVolunteer(villageId: number, volunteerId: number, status: number) {
  331. return this.post('/village/village/claimReview', '审核志愿者', {
  332. village_id: villageId,
  333. village_volunteer_id: volunteerId,
  334. status,
  335. });
  336. }
  337. async getCollectModuleList() {
  338. const res = await this.get<KeyValue>('/village/volunteer/getCollectModuleList', '获取采集版块列表', {});
  339. const result = [] as {
  340. value: string,
  341. label: string,
  342. }[];
  343. const data = res.data ?? {};
  344. for (const key in data) {
  345. result.push({
  346. value: key,
  347. label: data[key] as string,
  348. });
  349. }
  350. return result;
  351. }
  352. async getCollectModuleMap() {
  353. const res = await this.post<any[]>('/village/volunteer/getCollectModuleList', '采集板块列表', {});
  354. const map = new Map<string, number>();
  355. if (!res.data || typeof res.data !== 'object')
  356. return map;
  357. for (const key in res.data || []) {
  358. if (typeof res.data[key] !== 'string')
  359. throw new Error(`采集板块列表键值对值不是字符串: ${key} -> ${res.data[key]}`);
  360. if (isNaN(Number(key)))
  361. throw new Error(`采集板块列表键值对键不是数字: ${key}`);
  362. map.set(res.data[key], Number(key));
  363. }
  364. return map;
  365. }
  366. async getCatalogList(villageId?: number, volunteerId?: number, pid?: number) {
  367. const res = await this.get<any[]>('/village/village/getCatalogList', '村落目录列表', {
  368. village_id: villageId,
  369. village_volunteer_id: volunteerId,
  370. pid: pid === 0 ? undefined : pid,
  371. });
  372. return transformArrayDataModel<VillageCatalogListItem>(VillageCatalogListItem, res.data ?? [], `村落目录列表`, true);
  373. }
  374. async getVillageMenuList(id: number) {
  375. const res = await this.get<any[]>('/village/menu/getList', '村落菜单列表', {
  376. village_id: id,
  377. });
  378. return transformArrayDataModel<VillageMenuListItem>(VillageMenuListItem, res.data ?? [], `村落菜单`, true);
  379. }
  380. }
  381. export default new VillageApi();