service.ts 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. /*global DingdocsScript*/
  2. import type {} from 'dingtalk-docs-cool-app';
  3. import axios from 'axios';
  4. const BASE_URL = 'https://openapi.julefood.cn:8082/api';
  5. interface UserInfo {
  6. userId: string;
  7. name?: string;
  8. avatar?: string;
  9. mobile?: string;
  10. jobnumber?: string;
  11. department?: number[];
  12. permissions?: string[];
  13. [key: string]: any;
  14. }
  15. interface LoginResponse {
  16. code: number;
  17. result: {
  18. user_info: string;
  19. expiration_time: string;
  20. token: string;
  21. };
  22. msg: string;
  23. }
  24. interface ApiParam {
  25. paramName: string;
  26. paramDesc: string;
  27. exampleValue?: string;
  28. valueList?: string[];
  29. value?: string;
  30. }
  31. interface ApiItem {
  32. id: string;
  33. apiName: string;
  34. url: string;
  35. description: string;
  36. aiTableId: string;
  37. aiTablename: string;
  38. apiParamAuth: ApiParam[];
  39. }
  40. interface ApiResponse {
  41. code: number;
  42. msg: string;
  43. data?: any;
  44. }
  45. let token: string = '';
  46. let currentUserInfo: UserInfo | null = null;
  47. const apiClient = axios.create({
  48. baseURL: BASE_URL,
  49. timeout: 30000,
  50. headers: {
  51. 'Content-Type': 'application/json',
  52. },
  53. });
  54. apiClient.interceptors.request.use(
  55. (config) => {
  56. if (token) {
  57. config.headers['token'] = token;
  58. }
  59. return config;
  60. },
  61. (error) => {
  62. return Promise.reject(error);
  63. }
  64. );
  65. apiClient.interceptors.response.use(
  66. (response) => response,
  67. (error) => {
  68. console.error('API 请求错误:', error);
  69. return Promise.reject(error);
  70. }
  71. );
  72. async function login(authCode: string): Promise<UserInfo> {
  73. const response = await axios.post<LoginResponse>(
  74. `${BASE_URL}/sys_user/ddh5/login`,
  75. {
  76. code: authCode,
  77. app_id: 'dingqo0h82jhq5ewv9ow'
  78. },
  79. { timeout: 30000 }
  80. );
  81. if (response.data.code === 200) {
  82. token = response.data.result.token;
  83. const userInfoStr = response.data.result.user_info;
  84. try {
  85. const parsedUserInfo = JSON.parse(userInfoStr);
  86. currentUserInfo = {
  87. userId: parsedUserInfo.userid || parsedUserInfo.id || '',
  88. name: parsedUserInfo.name || '',
  89. avatar: parsedUserInfo.avatar,
  90. mobile: parsedUserInfo.mobile,
  91. jobnumber: parsedUserInfo.jobnumber,
  92. department: parsedUserInfo.department,
  93. permissions: parsedUserInfo.permissions,
  94. ...parsedUserInfo
  95. };
  96. } catch (e) {
  97. console.error('解析用户信息失败:', e);
  98. currentUserInfo = { userId: '', name: '用户' };
  99. }
  100. return currentUserInfo!;
  101. } else {
  102. throw new Error(response.data.msg || '登录失败');
  103. }
  104. }
  105. async function getApiList(): Promise<ApiItem[]> {
  106. const userId = currentUserInfo?.userId || '';
  107. const response = await apiClient.get('/auth/user/api_asset', {
  108. params: { userId }
  109. });
  110. const applyList = response.data?.data || [];
  111. const uniqueMap = new Map();
  112. applyList.forEach((item: any) => {
  113. const apiId = item.apiId;
  114. if (!uniqueMap.has(apiId) && item.status !== 2) {
  115. uniqueMap.set(apiId, item);
  116. }
  117. });
  118. return Array.from(uniqueMap.values());
  119. }
  120. async function callApi(apiItem: Record<string, any>): Promise<ApiResponse> {
  121. const params = { ...apiItem };
  122. params.apiParamAuth = params.apiParamAuth.map((p: any) => ({
  123. paramName: p.paramName,
  124. value: p.value
  125. }));
  126. params.userId = currentUserInfo?.userId || '';
  127. const response = await apiClient.post('/ding/add', params);
  128. return response.data;
  129. }
  130. async function getDocumentInfo() {
  131. try {
  132. const base = DingdocsScript.base;
  133. const uuid = (base as any).getDentryUuid?.() || (base as any).getDocUuid?.() || (base as any).getUuid?.() || '';
  134. const sheets = (base as any).getSheets?.() || (base as any).getSheetList?.() || [];
  135. const activeSheet = (base as any).getActiveSheet?.() || (base as any).getCurrentSheet?.();
  136. const currentSheet = (activeSheet as any)?.getName?.() || (activeSheet as any)?.name || '';
  137. return {
  138. uuid: uuid || '',
  139. sheetsCount: sheets.length,
  140. currentSheet
  141. };
  142. } catch (error: any) {
  143. return {
  144. uuid: '',
  145. sheetsCount: 0,
  146. currentSheet: ''
  147. };
  148. }
  149. }
  150. function getToken(): string {
  151. return token;
  152. }
  153. DingdocsScript.registerScript('login', login);
  154. DingdocsScript.registerScript('getToken', getToken);
  155. DingdocsScript.registerScript('getApiList', getApiList);
  156. DingdocsScript.registerScript('callApi', callApi);
  157. DingdocsScript.registerScript('getDocumentInfo', getDocumentInfo);
  158. export {};