VillageApi.ts 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  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) {
  244. return this.post('/village/village/addVillageClaim', '认领村落', data.toServerSide());
  245. }
  246. async getVallageList(level?: number, status?: number, region?: string) {
  247. const res = await this.get('/village/village/getList', '村落列表', {
  248. history_level: level,
  249. status,
  250. region: region,
  251. });
  252. return transformArrayDataModel<VillageListItem>(VillageListItem, transformSomeToArray(res.data), `村落`, true);
  253. }
  254. async getVolunteerInfo() {
  255. const res = await this.post<KeyValue>('/village/volunteer/getInfo', '获取志愿者信息', {}, undefined);
  256. return transformDataModel<VolunteerInfo>(VolunteerInfo, res.requireData());
  257. }
  258. async getVolunteerRanklist(category?: number) {
  259. const res = await this.post<any[]>('/village/volunteer/getRanklist', '志愿者排行榜', {
  260. category,
  261. });
  262. return transformArrayDataModel<VolunteerRanklistItem>(VolunteerRanklistItem, res.data ?? [], ``, true);
  263. }
  264. async addVolunteer(data: VolunteerInfo) {
  265. return this.post('/village/volunteer/add', '添加志愿者', data.toServerSide());
  266. }
  267. async updateVolunteer(data: VolunteerInfo) {
  268. console.log('updateVolunteer', data.toServerSide());
  269. return this.post('/village/volunteer/save', '更新志愿者', data.toServerSide());
  270. }
  271. async deleteVolunteer(id: number, villageId: number) {
  272. return this.post('/village/volunteer/del', '删除志愿者', {
  273. id,
  274. village_id: villageId,
  275. });
  276. }
  277. async shareAddVolunteer(data: VolunteerInfo) {
  278. const res = await this.post('/village/volunteer/shareAdd', '分享添加志愿者', data.toServerSide(), undefined, LoginResult);
  279. return res.data as LoginResult;
  280. }
  281. async bindVolunteer(data: {
  282. account: string,
  283. password: string
  284. }) {
  285. const res = await this.post('/village/volunteer/bindVolunteer', '绑定志愿者', data, undefined, LoginResult);
  286. return res.data as LoginResult;
  287. }
  288. async bindWechat(data: { code: string }) {
  289. return this.post('/village/volunteer/bindWechat', '绑定微信', {
  290. code: data.code,
  291. appid: AppCofig.appId
  292. });
  293. }
  294. async getVolunteerInfoByIdAdmin(id: number) {
  295. const res = await this.post('/village/volunteer/info', '管理员获取志愿者信息', {
  296. id,
  297. }, undefined, VolunteerInfo);
  298. return res.data as VolunteerInfo;
  299. }
  300. async getVolunteerInfoById(id: number) {
  301. const res = await this.post('/village/volunteer/getInfo', '通过ID获取志愿者信息', {
  302. id,
  303. }, undefined, VolunteerInfo);
  304. return res.data as VolunteerInfo;
  305. }
  306. async getVillageVolunteerList(
  307. page: number, pageSize: number,
  308. villageId?: number, status?: number,
  309. name?: string,
  310. ) {
  311. const res = (await this.post<{
  312. data: KeyValue[],
  313. total: number,
  314. }>('/village/volunteer/getList', '获取志愿者列表', {
  315. village_id: villageId,
  316. status,
  317. page,
  318. pageSize,
  319. })).requireData();
  320. return {
  321. list: transformArrayDataModel<VolunteerInfo>(VolunteerInfo, res.data || [], ``, true),
  322. total: res.total,
  323. };
  324. }
  325. async reviewVillageVolunteer(villageId: number, volunteerId: number, status: number) {
  326. return this.post('/village/village/claimReview', '审核志愿者', {
  327. village_id: villageId,
  328. village_volunteer_id: volunteerId,
  329. status,
  330. });
  331. }
  332. async getCollectModuleList() {
  333. const res = await this.get<KeyValue>('/village/volunteer/getCollectModuleList', '获取采集版块列表', {});
  334. const result = [] as {
  335. value: string,
  336. label: string,
  337. }[];
  338. const data = res.data ?? {};
  339. for (const key in data) {
  340. result.push({
  341. value: key,
  342. label: data[key] as string,
  343. });
  344. }
  345. return result;
  346. }
  347. async getCollectModuleMap() {
  348. const res = await this.post<any[]>('/village/volunteer/getCollectModuleList', '采集板块列表', {});
  349. const map = new Map<string, number>();
  350. if (!res.data || typeof res.data !== 'object')
  351. return map;
  352. for (const key in res.data || []) {
  353. if (typeof res.data[key] !== 'string')
  354. throw new Error(`采集板块列表键值对值不是字符串: ${key} -> ${res.data[key]}`);
  355. if (isNaN(Number(key)))
  356. throw new Error(`采集板块列表键值对键不是数字: ${key}`);
  357. map.set(res.data[key], Number(key));
  358. }
  359. return map;
  360. }
  361. async getCatalogList(villageId?: number, volunteerId?: number, pid?: number) {
  362. const res = await this.get<any[]>('/village/village/getCatalogList', '村落目录列表', {
  363. village_id: villageId,
  364. village_volunteer_id: volunteerId,
  365. pid: pid === 0 ? undefined : pid,
  366. });
  367. return transformArrayDataModel<VillageCatalogListItem>(VillageCatalogListItem, res.data ?? [], `村落目录列表`, true);
  368. }
  369. async getVillageMenuList(id: number) {
  370. const res = await this.get<any[]>('/village/menu/getList', '村落菜单列表', {
  371. village_id: id,
  372. });
  373. return transformArrayDataModel<VillageMenuListItem>(VillageMenuListItem, res.data ?? [], `村落菜单`, true);
  374. }
  375. }
  376. export default new VillageApi();