useWxGroupList.ts 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. import { useCallback, useEffect, useReducer } from 'react';
  2. import { allOfMember, listGroup, getAllZhMemBerApi } from '@/services/operating/account';
  3. import { useAjax } from '@/Hook/useAjax';
  4. import { getWxlist } from '@/services/operating/material';
  5. import { getMpsTimeOut } from '@/services/user';
  6. import { useModel, history } from 'umi';
  7. import { Modal, notification } from 'antd';
  8. import { getVersions } from '@/services/login';
  9. import React from 'react';
  10. type State = {
  11. actionWX?: any; //当前选中的微信
  12. mpAccounts?: any[]; //选中的组数据
  13. actionArr?: any[]; //多选的勾中的微信
  14. allWx?: any[]; //自己微信列表过滤重复
  15. tabsKey?: '自己' | '组员';
  16. tabsKey1?: '自己' | '组员';
  17. groupAllWx: any[]; //组员微信列表过滤重复
  18. filterWxs: any[]; //合并组员和自己的微信号
  19. groupActionWx: any[]; //当前组员的微信号
  20. selectWx?: any[]; //多选关联公众号
  21. versionsOpen?: boolean; //版本通知
  22. allOfMember?: any[]; //所有投手原始数据--->监控
  23. myallOfUser?: any[]; //自己的公众号数据--->监控
  24. };
  25. export type Action = {
  26. type:
  27. | 'actionWX'
  28. | 'mpAccounts'
  29. | 'allWx'
  30. | 'setTabsKey'
  31. | 'setTabsKey1'
  32. | 'setUserId'
  33. | 'setActionArr'
  34. | 'groupAllWx'
  35. | 'filterWxs'
  36. | 'groupActionWx'
  37. | 'selectWx'
  38. | 'versionsOpen'
  39. | 'allOfMember'
  40. | 'myallOfUser';
  41. params: any;
  42. };
  43. export function weChatReducer(state: State, action: Action) {
  44. let { type, params } = action;
  45. switch (type) {
  46. case 'actionWX':
  47. return { ...state, actionWX: params.actionWX };
  48. case 'mpAccounts':
  49. return { ...state, mpAccounts: params.mpAccounts };
  50. case 'allWx':
  51. return { ...state, allWx: params.allWx };
  52. case 'groupAllWx':
  53. return { ...state, groupAllWx: params.groupAllWx };
  54. case 'setTabsKey':
  55. return { ...state, tabsKey: params.tabsKey };
  56. case 'setTabsKey1':
  57. return { ...state, tabsKey1: params.tabsKey1 };
  58. case 'setActionArr':
  59. return { ...state, actionArr: params.actionArr };
  60. case 'filterWxs':
  61. return { ...state, filterWxs: params.filterWxs };
  62. case 'groupActionWx':
  63. return { ...state, groupActionWx: params.groupActionWx };
  64. case 'selectWx':
  65. return { ...state, selectWx: params.selectWx };
  66. case 'versionsOpen':
  67. return { ...state, versionsOpen: params.versionsOpen };
  68. case 'allOfMember':
  69. return { ...state, allOfMember: params.allOfMember };
  70. case 'myallOfUser':
  71. return { ...state, myallOfUser: params.myallOfUser };
  72. default:
  73. return state;
  74. }
  75. }
  76. export default function useWxGroupList() {
  77. const getDataList = useAjax(() => listGroup()); //获取分组微信公众号列表
  78. const getAllOfMember = useAjax(() => allOfMember()); //获取账户下属公众号
  79. const getAllZhMemBer = useAjax(() => getAllZhMemBerApi()); //获取账户下属公众号
  80. const catWx = useAjax((userId) => getMpsTimeOut(userId)); //查询公众号是否过期
  81. const getversions = useAjax(() => getVersions()); //获取版本号
  82. const getWxlists = useAjax((id) => getWxlist(id));
  83. const [state, dispatch] = useReducer(weChatReducer, {
  84. tabsKey: '自己',
  85. tabsKey1: '自己',
  86. actionArr: [],
  87. groupAllWx: [],
  88. filterWxs: [],
  89. groupActionWx: [],
  90. selectWx: [],
  91. });
  92. let versionsInterval: NodeJS.Timeout | null = null;
  93. const actionWx = useCallback((wx: any) => {
  94. dispatch({ type: 'actionWX', params: { actionWX: wx } });
  95. }, []);
  96. const actionMp = useCallback((mpAccounts: any[]) => {
  97. dispatch({ type: 'mpAccounts', params: { mpAccounts: mpAccounts?.filter(m => !!m) } });
  98. }, []);
  99. const initSelectWx = () => {
  100. dispatch({ type: 'selectWx', params: { selectWx: [] } });
  101. };
  102. //首次获取列表
  103. useEffect(() => {
  104. let ok: any = true;
  105. if (sessionStorage.getItem('Admin-Token') && history?.location?.pathname !== '/user/login') {
  106. //定时请求版本号对比
  107. let open = true;
  108. versionsInterval = setInterval(() => {
  109. let bdVersions = localStorage.getItem('versions'); //本地
  110. getversions.run().then((res) => {
  111. let fwqVersions = ''; //服务器版本
  112. let content = ''; //版本更新内容
  113. if (res) {
  114. fwqVersions = res?.configValue;
  115. content = res?.remark?.replace(/\n/gi, '<br/>');
  116. if (fwqVersions && bdVersions !== fwqVersions) {
  117. //不一样
  118. if (open) {
  119. //并且open未关闭
  120. //执行逻辑
  121. Modal.confirm({
  122. title: '版本更新!',
  123. content: React.createElement('div', {
  124. dangerouslySetInnerHTML: { __html: content },
  125. }),
  126. keyboard: false,
  127. cancelText: '稍后我自己刷新页面',
  128. okText: '现在就去刷新页面',
  129. onOk: () => {
  130. localStorage.setItem('versions', fwqVersions); //重新设置服务器版本
  131. location?.reload();
  132. },
  133. onCancel: () => {
  134. dispatch({ type: 'versionsOpen', params: { versionsOpen: true } });
  135. },
  136. });
  137. console.log('不一样');
  138. open = false; //已弹窗关闭
  139. }
  140. }
  141. }
  142. });
  143. console.log('请求版本号对比!');
  144. }, 1000 * 60 * 5); //5分钟请求一次
  145. ///
  146. // getDataList.run().then((res: any) => {
  147. // if (res && res?.length > 0) {
  148. // let allWx: any[] = [];
  149. // res?.forEach((item: any, index: number) => {
  150. // if (ok && item?.mpAccounts?.length > 0) {
  151. // ok = false;
  152. // actionWx(item?.mpAccounts[0]);
  153. // }
  154. // item?.mpAccounts?.forEach((list: any) => {
  155. // if (allWx.every((wx: { id: number }) => wx.id !== list.id)) {
  156. // allWx.push(list);
  157. // }
  158. // });
  159. // });
  160. // dispatch({
  161. // type: 'myallOfUser',
  162. // params: { myallOfUser: [{ key: res[0]?.operUserInfo, value: res[0]?.mpAccounts }] },
  163. // });
  164. // dispatch({ type: 'allWx', params: { allWx } });
  165. // }
  166. // });
  167. getAllZhMemBer.run().then(res => {
  168. dispatch({ type: 'allOfMember', params: { allOfMember: res } });
  169. })
  170. // getAllOfMember.run().then((res) => {
  171. // let groupAllWx: any[] = [];
  172. // res?.forEach((item: any) => {
  173. // if (ok && item?.value?.length > 0) {
  174. // //假如自己没有绑定公众号,那就从组员中寻找
  175. // ok = false;
  176. // actionWx(item?.value[0]);
  177. // dispatch({ type: 'setTabsKey', params: { tabsKey: '组员' } });
  178. // }
  179. // item?.value?.filter((v: any) => !!v)?.forEach((list: any) => {
  180. // if (groupAllWx?.every((wx: { id: number }) => wx.id !== list.id)) {
  181. // groupAllWx.push(list);
  182. // }
  183. // });
  184. // });
  185. // // console.log('getAllOfMember',groupAllWx)
  186. // dispatch({ type: 'allOfMember', params: { allOfMember: res } });
  187. // dispatch({ type: 'groupAllWx', params: { groupAllWx } });
  188. // });
  189. function canvas(dom: any, txt: any) {
  190. if (!dom) return false;
  191. let length = txt.length * 50 > 247 ? txt.length * 50 : 247; // 根据内容生成画布大小,20代表比例
  192. let canvas = document.createElement('canvas');
  193. canvas.id = 'myCanvas'
  194. canvas.width = length;
  195. canvas.id = 'myCanvas'
  196. canvas.height = 150;
  197. canvas.style.display = 'none';
  198. document.body.appendChild(canvas);
  199. let context: any = canvas.getContext('2d');
  200. canvas.style.letterSpacing = 3 + 'px';
  201. context.font =
  202. '30px "PingFangSC", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif';
  203. context.fillStyle = 'rgba(255,0,0,0.06)';
  204. context.rotate((-13 * Math.PI) / 80); // 画布里面文字的旋转角度
  205. context.fillText(txt, (length - txt.length * 13) / 2, length / 2 + 20); // 文字的位置
  206. dom.style.backgroundImage = `url(${canvas.toDataURL('image/png')})`;
  207. return;
  208. }
  209. let div: any = document.createElement('div');
  210. div.style = `width: 100%;
  211. height: 100%;
  212. position: fixed;
  213. left: 0px;
  214. top: 0px;
  215. z-index: 10000;
  216. pointer-events: none;
  217. background-color:rgba(0,0,0,.03);
  218. background-repeat: round;`;
  219. setTimeout(() => {
  220. let main = document.getElementById('root');
  221. if (main) {
  222. main.appendChild(div);
  223. canvas(div, localStorage.getItem('name'));
  224. let myCanvas: any = document.getElementById('myCanvas')
  225. document.body.removeChild(myCanvas)
  226. }
  227. }, 1000);
  228. }
  229. return () => {
  230. versionsInterval && clearInterval(versionsInterval);
  231. };
  232. }, []);
  233. //计算合并组员和自己的微信
  234. useEffect(() => {
  235. if (state?.allWx || state?.groupAllWx) {
  236. let wxArr: any = [...state?.groupAllWx];
  237. if (state?.allWx?.length > 0) {
  238. state?.allWx?.forEach((item: any) => {
  239. if (wxArr.every((wx: { id: number }) => wx.id !== item.id)) {
  240. wxArr.push(item);
  241. }
  242. });
  243. }
  244. dispatch({ type: 'filterWxs', params: { filterWxs: wxArr } });
  245. }
  246. }, [state.allWx, state.groupAllWx]);
  247. //当前选中组员的微信
  248. const actionGroupWx = useCallback(
  249. (userId: number) => {
  250. if (state.tabsKey === '自己') {
  251. dispatch({ type: 'groupActionWx', params: { groupActionWx: state.allWx } });
  252. } else {
  253. if (getAllOfMember.data && userId) {
  254. getAllOfMember?.data?.map((item: { key: { userId: number }; value: any[] }) => {
  255. if (userId == item?.key?.userId) {
  256. dispatch({ type: 'groupActionWx', params: { groupActionWx: item?.value } });
  257. }
  258. });
  259. }
  260. }
  261. },
  262. [getAllOfMember.data, state.tabsKey, state.allWx],
  263. );
  264. return {
  265. state,
  266. getDataList,
  267. actionWx,
  268. actionMp,
  269. getAllOfMember,
  270. getAllZhMemBer,
  271. dispatch,
  272. actionGroupWx,
  273. initSelectWx,
  274. getWxlists,
  275. getversions,
  276. };
  277. }