VillageApi.ts 12 KB

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