service.ts 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  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. const TOKEN_KEY = 'julefood_token';
  46. const USER_INFO_KEY = 'julefood_user_info';
  47. function saveToken(token: string): void {
  48. localStorage.setItem(TOKEN_KEY, token);
  49. }
  50. function getToken(): string {
  51. return localStorage.getItem(TOKEN_KEY) || '';
  52. }
  53. function removeToken(): void {
  54. localStorage.removeItem(TOKEN_KEY);
  55. }
  56. function saveUserInfo(userInfo: UserInfo): void {
  57. const jsonStr = JSON.stringify(userInfo);
  58. console.log('[DEBUG] saveUserInfo - saving:', jsonStr);
  59. localStorage.setItem(USER_INFO_KEY, jsonStr);
  60. const saved = localStorage.getItem(USER_INFO_KEY);
  61. console.log('[DEBUG] saveUserInfo - verified saved:', saved);
  62. }
  63. function getUserInfo(): UserInfo | null {
  64. const str = localStorage.getItem(USER_INFO_KEY);
  65. console.log('[DEBUG] getUserInfo - raw value:', str);
  66. if (!str) {
  67. console.warn('[DEBUG] getUserInfo - localStorage is empty');
  68. return null;
  69. }
  70. try {
  71. const result = JSON.parse(str);
  72. console.log('[DEBUG] getUserInfo - parsed userId:', result?.userId);
  73. return result;
  74. } catch (e) {
  75. console.error('[DEBUG] getUserInfo - JSON parse failed:', e);
  76. return null;
  77. }
  78. }
  79. function removeUserInfo(): void {
  80. localStorage.removeItem(USER_INFO_KEY);
  81. }
  82. function clearAuth(): void {
  83. removeToken();
  84. removeUserInfo();
  85. }
  86. const apiClient = axios.create({
  87. baseURL: BASE_URL,
  88. timeout: 30000,
  89. headers: {
  90. 'Content-Type': 'application/json',
  91. },
  92. });
  93. apiClient.interceptors.request.use(
  94. (config) => {
  95. const token = getToken();
  96. if (token) {
  97. config.headers['token'] = token;
  98. }
  99. return config;
  100. },
  101. (error) => {
  102. return Promise.reject(error);
  103. }
  104. );
  105. apiClient.interceptors.response.use(
  106. (response) => response,
  107. (error) => {
  108. console.error('API 请求错误:', error);
  109. return Promise.reject(error);
  110. }
  111. );
  112. async function login(authCode: string): Promise<UserInfo> {
  113. const response = await axios.post<LoginResponse>(
  114. `${BASE_URL}/sys_user/ddh5/login`,
  115. {
  116. code: authCode,
  117. app_id: 'dingqo0h82jhq5ewv9ow'
  118. },
  119. { timeout: 30000 }
  120. );
  121. if (response.data.code === 200) {
  122. const token = response.data.result.token;
  123. saveToken(token);
  124. const userInfoStr = response.data.result.user_info;
  125. let userInfo: UserInfo;
  126. try {
  127. const parsedUserInfo = JSON.parse(userInfoStr);
  128. userInfo = {
  129. userId: parsedUserInfo.userid || parsedUserInfo.id || '',
  130. name: parsedUserInfo.name || '',
  131. avatar: parsedUserInfo.avatar,
  132. mobile: parsedUserInfo.mobile,
  133. jobnumber: parsedUserInfo.jobnumber,
  134. department: parsedUserInfo.department,
  135. permissions: parsedUserInfo.permissions,
  136. ...parsedUserInfo
  137. };
  138. } catch (e) {
  139. console.error('解析用户信息失败:', e);
  140. userInfo = { userId: '', name: '用户' };
  141. }
  142. saveUserInfo(userInfo);
  143. return userInfo;
  144. } else {
  145. throw new Error(response.data.msg || '登录失败');
  146. }
  147. }
  148. async function getApiList(): Promise<ApiItem[]> {
  149. const userInfo = getUserInfo();
  150. const userId = userInfo?.userId || '';
  151. const response = await apiClient.get('/auth/user/api_asset', {
  152. params: { userId }
  153. });
  154. const applyList = response.data?.data || [];
  155. const uniqueMap = new Map();
  156. applyList.forEach((item: any) => {
  157. const apiId = item.apiId;
  158. if (!uniqueMap.has(apiId) && item.status !== 2) {
  159. uniqueMap.set(apiId, item);
  160. }
  161. });
  162. return Array.from(uniqueMap.values());
  163. }
  164. async function callApi(apiItem: Record<string, any>): Promise<ApiResponse> {
  165. const params = { ...apiItem };
  166. params.apiParamAuth = params.apiParamAuth.map((p: any) => ({
  167. paramName: p.paramName,
  168. value: p.value
  169. }));
  170. const userInfo = getUserInfo();
  171. params.userId = userInfo?.userId || '';
  172. console.log('[DEBUG] callApi - userId:', params.userId, 'userInfo:', userInfo);
  173. const response = await apiClient.post('/ding/add', params);
  174. return response.data;
  175. }
  176. async function getDocumentInfo() {
  177. try {
  178. const base = DingdocsScript.base;
  179. const uuid = (base as any).getDentryUuid?.() || (base as any).getDocUuid?.() || (base as any).getUuid?.() || '';
  180. const sheets = (base as any).getSheets?.() || (base as any).getSheetList?.() || [];
  181. const activeSheet = (base as any).getActiveSheet?.() || (base as any).getCurrentSheet?.();
  182. const currentSheet = (activeSheet as any)?.getName?.() || (activeSheet as any)?.name || '';
  183. return {
  184. uuid: uuid || '',
  185. sheetsCount: sheets.length,
  186. currentSheet
  187. };
  188. } catch (error: any) {
  189. return {
  190. uuid: '',
  191. sheetsCount: 0,
  192. currentSheet: ''
  193. };
  194. }
  195. }
  196. DingdocsScript.registerScript('login', login);
  197. DingdocsScript.registerScript('getToken', getToken);
  198. DingdocsScript.registerScript('getApiList', getApiList);
  199. DingdocsScript.registerScript('callApi', callApi);
  200. DingdocsScript.registerScript('getDocumentInfo', getDocumentInfo);
  201. DingdocsScript.registerScript('clearAuth', clearAuth);
  202. export {};