index.ts 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. import {
  2. getAllMaterialList,
  3. getAllRoleList,
  4. getAllStorage,
  5. getAllUser,
  6. getDictionaryOptions,
  7. } from '@apis';
  8. import {
  9. BaseResult,
  10. DictionaryData,
  11. DictionaryParamsType,
  12. StorageListData,
  13. } from '@models';
  14. import {useQuery} from '@tanstack/react-query';
  15. import {useLatest} from 'ahooks';
  16. import {useMemo, useState} from 'react';
  17. import {debounce} from 'lodash-es';
  18. type Options<T extends {id: number | string}, P extends unknown[]> = {
  19. fn: (...args: P) => BaseResult<T[]>;
  20. findName: (state: T) => string;
  21. addAll: boolean;
  22. findValue?: (state: T) => string;
  23. params: P;
  24. };
  25. function useQueryOptions<T extends {id: number | string}, P extends unknown[]>(
  26. options: Options<T, P>,
  27. ) {
  28. const {findValue, fn, findName, addAll, params} = options;
  29. const findValueFn = useLatest(findValue);
  30. return useQuery({
  31. queryKey: [fn.name, addAll, findValueFn, ...Object.values(params)],
  32. async queryFn({signal}) {
  33. const newParams = [...params, signal] as unknown as P;
  34. const data = await fn(...newParams);
  35. if (data.msg === '200') {
  36. const list = data.data.map(function (value) {
  37. return {
  38. label: findName(value),
  39. value: findValueFn.current
  40. ? findValueFn.current?.(value)
  41. : String(value.id),
  42. };
  43. });
  44. if (addAll) list.unshift({label: '全部', value: ''});
  45. return list;
  46. }
  47. return [];
  48. },
  49. initialData: [],
  50. cacheTime: 1000 * 60 * 10,
  51. // 兼容useStorageOptions 当id不传入的时候返回空数组
  52. // 确保与仓库id联动
  53. enabled: params.length > 0 ? Boolean(params[0]) : true,
  54. });
  55. }
  56. export function useStorageOptions(
  57. addAll = false,
  58. findValue?: (state: StorageListData) => string,
  59. options: {id?: string} = {},
  60. ) {
  61. return useQueryOptions({
  62. fn: getAllStorage,
  63. findName: state => state.storageLocationName,
  64. addAll,
  65. findValue,
  66. params: [options.id ?? ''],
  67. });
  68. }
  69. export function useRoleOptions(addAll = false) {
  70. return useQueryOptions({
  71. fn: getAllRoleList,
  72. findName: state => state.roleName,
  73. addAll,
  74. params: [],
  75. });
  76. }
  77. /**
  78. * 查询内容较少时使用,例如仓库
  79. * 本地可以做校验 不需要频繁请求服务器
  80. */
  81. export function useDictionaryOptions(
  82. type: DictionaryParamsType,
  83. addAll = false,
  84. findValue: (state: DictionaryData) => string = state => state.tldId,
  85. ) {
  86. return useQuery({
  87. queryKey: [getDictionaryOptions.name, type, addAll],
  88. async queryFn({signal}) {
  89. const data = await getDictionaryOptions(type, '', signal);
  90. if (data.msg === '200') {
  91. const list = data.data.map(function (value) {
  92. return {
  93. label: value.name,
  94. value: findValue(value),
  95. type: value.warehouseType,
  96. };
  97. });
  98. if (addAll) list.unshift({label: '全部', value: '', type: ''});
  99. return list;
  100. }
  101. return [];
  102. },
  103. initialData: [],
  104. cacheTime: 1000 * 60 * 10,
  105. });
  106. }
  107. /** filterSelect使用 */
  108. export function useDictionaryKeyOptions(
  109. type: DictionaryParamsType,
  110. findValue: (state: DictionaryData) => string = state => state.tldId,
  111. options: {
  112. lazy?: boolean;
  113. search?: string;
  114. } = {},
  115. ) {
  116. const {lazy, search} = options;
  117. // lazy模式下 当search变动时触发重新查询
  118. let searchName = '';
  119. const enabledLazy = lazy && search !== void 0;
  120. if (enabledLazy) {
  121. searchName = search;
  122. }
  123. const {data, isFetching} = useQuery({
  124. queryKey: [getDictionaryOptions.name, type, searchName],
  125. async queryFn({signal}) {
  126. const data = await getDictionaryOptions(type, searchName, signal);
  127. if (data.msg === '200') {
  128. const list = data.data.map(function (value) {
  129. return {
  130. label: value.name,
  131. value: findValue(value),
  132. type: value.warehouseType,
  133. };
  134. });
  135. return list;
  136. }
  137. return [];
  138. },
  139. initialData: [],
  140. cacheTime: 1000 * 60 * 10,
  141. enabled: enabledLazy ? Boolean(searchName) : true,
  142. });
  143. return {options: data, isFetching};
  144. }
  145. export function useUserOptions(addAll = false) {
  146. const {data} = useQuery({
  147. queryKey: [getAllUser.name, addAll],
  148. async queryFn({signal}) {
  149. const data = await getAllUser(signal);
  150. if (data.msg === '200') {
  151. const list = data.data.map(function (value) {
  152. return {label: value.realName, value: String(value.id)};
  153. });
  154. if (addAll) list.unshift({label: '全部', value: ''});
  155. return list;
  156. }
  157. return [];
  158. },
  159. initialData: [],
  160. cacheTime: 1000 * 60 * 10,
  161. });
  162. return data;
  163. }
  164. /**
  165. * 数量较多的时候用,第一次查询可能会很慢
  166. * 例如物料和供应商
  167. */
  168. export function useDictionaryWidthCode(
  169. type: DictionaryParamsType,
  170. {
  171. addAll = false,
  172. findValue = state => state.tldId,
  173. enabled = false,
  174. }: {
  175. addAll?: boolean;
  176. findValue?: (state: DictionaryData) => string;
  177. enabled?: boolean;
  178. } = {},
  179. ) {
  180. const [code, setCode] = useState('');
  181. const {data, isFetching} = useQuery({
  182. queryKey: [
  183. getDictionaryOptions.name,
  184. type,
  185. addAll,
  186. 'useDictionaryWidthCode',
  187. code,
  188. ],
  189. async queryFn({signal}) {
  190. const data = await getDictionaryOptions(type, code, signal);
  191. if (data.msg === '200') {
  192. const list = data.data.map(function (value) {
  193. return {
  194. label: value.name,
  195. value: findValue(value),
  196. type: value.warehouseType,
  197. };
  198. });
  199. if (addAll) list.unshift({label: '全部', value: '', type: ''});
  200. return list;
  201. }
  202. return [];
  203. },
  204. initialData: [],
  205. cacheTime: 1000 * 60 * 10,
  206. enabled: Boolean(code) || enabled,
  207. });
  208. const onSearch = useMemo(function () {
  209. function onSearchValue(value: string) {
  210. setCode(value);
  211. }
  212. return debounce(onSearchValue, 500, {leading: false, trailing: true});
  213. }, []);
  214. return [{data, isFetching}, onSearch] as const;
  215. }
  216. export function useMaterialOptions() {
  217. const {data, isFetching} = useQuery({
  218. queryKey: [getAllMaterialList.name],
  219. async queryFn({signal}) {
  220. const data = await getAllMaterialList(
  221. {partType: '半成品', nameOrCode: ''},
  222. signal,
  223. );
  224. if (data.msg === '200')
  225. return data.data.map(val => ({label: val.name, value: val.code}));
  226. return [];
  227. },
  228. initialData: [],
  229. });
  230. return {data, isFetching};
  231. }