bigscreen.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650
  1. import { sldCommonService, safeJsonParse } from "@/utils/utils";
  2. import moment from "moment";
  3. export default {
  4. namespace: "bigscreen",
  5. state: {
  6. overviewData: {
  7. loading: false,
  8. data: {},
  9. },
  10. portalTrafficData: {
  11. loading: false,
  12. data: {},
  13. options: [
  14. {
  15. label: "近7日",
  16. value: {
  17. startTime:
  18. moment()
  19. .subtract(7, "days")
  20. .format("YYYY-MM-DD") + " 00:00:00",
  21. endTime:
  22. moment()
  23. .subtract(1, "days")
  24. .format("YYYY-MM-DD") + " 23:59:59:999",
  25. },
  26. },
  27. {
  28. label: "近30日",
  29. value: {
  30. startTime:
  31. moment()
  32. .subtract(30, "days")
  33. .format("YYYY-MM-DD") + " 00:00:00",
  34. endTime:
  35. moment()
  36. .subtract(1, "days")
  37. .format("YYYY-MM-DD") + " 23:59:59:999",
  38. },
  39. },
  40. ],
  41. current: "近7日",
  42. },
  43. enquireData: {
  44. loading: false,
  45. data: {},
  46. options: [
  47. {
  48. label: "近7日",
  49. value: {
  50. startTime:
  51. moment()
  52. .subtract(7, "days")
  53. .format("YYYY-MM-DD") + " 00:00:00",
  54. endTime:
  55. moment()
  56. .subtract(1, "days")
  57. .format("YYYY-MM-DD") + " 23:59:59:999",
  58. },
  59. },
  60. {
  61. label: "近30日",
  62. value: {
  63. startTime:
  64. moment()
  65. .subtract(30, "days")
  66. .format("YYYY-MM-DD") + " 00:00:00",
  67. endTime:
  68. moment()
  69. .subtract(1, "days")
  70. .format("YYYY-MM-DD") + " 23:59:59:999",
  71. },
  72. },
  73. ],
  74. current: "近7日",
  75. },
  76. overseasEnquireLocationData: {
  77. loading: false,
  78. data: [],
  79. },
  80. distributorEnquireLocationData: {
  81. loading: false,
  82. data: [],
  83. },
  84. memberAddTrendData: {
  85. loading: false,
  86. data: [],
  87. options: [
  88. {
  89. label: "昨日",
  90. value: {
  91. startTime:
  92. moment()
  93. .subtract(1, "days")
  94. .format("YYYY-MM-DD") + " 00:00:00",
  95. endTime:
  96. moment()
  97. .subtract(1, "days")
  98. .format("YYYY-MM-DD") + " 23:59:59:999",
  99. },
  100. },
  101. {
  102. label: "近7日",
  103. value: {
  104. startTime:
  105. moment()
  106. .subtract(7, "days")
  107. .format("YYYY-MM-DD") + " 00:00:00",
  108. endTime:
  109. moment()
  110. .subtract(1, "days")
  111. .format("YYYY-MM-DD") + " 23:59:59:999",
  112. },
  113. },
  114. {
  115. label: "近30日",
  116. value: {
  117. startTime:
  118. moment()
  119. .subtract(30, "days")
  120. .format("YYYY-MM-DD") + " 00:00:00",
  121. endTime:
  122. moment()
  123. .subtract(1, "days")
  124. .format("YYYY-MM-DD") + " 23:59:59:999",
  125. },
  126. },
  127. ],
  128. current: "昨日",
  129. },
  130. productAddTrendData: {
  131. loading: false,
  132. data: [],
  133. },
  134. searchRankData: {
  135. loading: false,
  136. data: [],
  137. options: [
  138. {
  139. label: "昨日",
  140. value: {
  141. startTime:
  142. moment()
  143. .subtract(1, "days")
  144. .format("YYYY-MM-DD") + " 00:00:00",
  145. endTime:
  146. moment()
  147. .subtract(1, "days")
  148. .format("YYYY-MM-DD") + " 23:59:59:999",
  149. },
  150. },
  151. {
  152. label: "近7日",
  153. value: {
  154. startTime:
  155. moment()
  156. .subtract(7, "days")
  157. .format("YYYY-MM-DD") + " 00:00:00",
  158. endTime:
  159. moment()
  160. .subtract(1, "days")
  161. .format("YYYY-MM-DD") + " 23:59:59:999",
  162. },
  163. },
  164. {
  165. label: "近30日",
  166. value: {
  167. startTime:
  168. moment()
  169. .subtract(30, "days")
  170. .format("YYYY-MM-DD") + " 00:00:00",
  171. endTime:
  172. moment()
  173. .subtract(1, "days")
  174. .format("YYYY-MM-DD") + " 23:59:59:999",
  175. },
  176. },
  177. ],
  178. current: "昨日",
  179. },
  180. storeTrafficData: {
  181. loading: false,
  182. data: [],
  183. options: [
  184. {
  185. label: "昨日",
  186. value: {
  187. startTime:
  188. moment()
  189. .subtract(1, "days")
  190. .format("YYYY-MM-DD") + " 00:00:00",
  191. endTime:
  192. moment()
  193. .subtract(1, "days")
  194. .format("YYYY-MM-DD") + " 23:59:59:999",
  195. },
  196. },
  197. {
  198. label: "近7日",
  199. value: {
  200. startTime:
  201. moment()
  202. .subtract(7, "days")
  203. .format("YYYY-MM-DD") + " 00:00:00",
  204. endTime:
  205. moment()
  206. .subtract(1, "days")
  207. .format("YYYY-MM-DD") + " 23:59:59:999",
  208. },
  209. },
  210. {
  211. label: "近30日",
  212. value: {
  213. startTime:
  214. moment()
  215. .subtract(30, "days")
  216. .format("YYYY-MM-DD") + " 00:00:00",
  217. endTime:
  218. moment()
  219. .subtract(1, "days")
  220. .format("YYYY-MM-DD") + " 23:59:59:999",
  221. },
  222. },
  223. ],
  224. current: "昨日",
  225. },
  226. mapContainerData: {
  227. loading: false,
  228. data: [],
  229. },
  230. orderData: {
  231. loading: false,
  232. data: [],
  233. options: [
  234. {
  235. label: "近7日",
  236. value: "7",
  237. },
  238. {
  239. label: "近30日",
  240. value: "30",
  241. },
  242. ],
  243. current: "近7日",
  244. },
  245. updateTime: "",
  246. },
  247. effects: {
  248. // 平台数据汇总
  249. *load_overview({ payload }, { call, put }) {
  250. yield put({
  251. type: "setOverviewData",
  252. payload: { loading: true },
  253. });
  254. const response = yield call(
  255. sldCommonService,
  256. payload,
  257. "get",
  258. "v3/statistics/screen/analysis/dataSummary"
  259. );
  260. yield put({
  261. type: "setOverviewData",
  262. payload: { data: response.data, loading: false },
  263. });
  264. },
  265. // 门户流量
  266. *load_portal_traffic({ payload }, { call, put, select }) {
  267. const current = yield select(
  268. (state) => state.bigscreen.portalTrafficData.current
  269. );
  270. const options = yield select(
  271. (state) => state.bigscreen.portalTrafficData.options
  272. );
  273. const condition = options.filter((item) => item.label == current)[0]
  274. .value;
  275. payload = { ...payload, ...condition };
  276. yield put({
  277. type: "setPortalTrafficData",
  278. payload: { loading: true },
  279. });
  280. const response = yield call(
  281. sldCommonService,
  282. payload,
  283. "get",
  284. "v3/statistics/screen/analysis/flowTrend"
  285. );
  286. yield put({
  287. type: "setPortalTrafficData",
  288. payload: { data: response.data, loading: false },
  289. });
  290. },
  291. // 询盘概况
  292. *load_enquire_data({ payload }, { call, put, select }) {
  293. const current = yield select(
  294. (state) => state.bigscreen.enquireData.current
  295. );
  296. const options = yield select(
  297. (state) => state.bigscreen.enquireData.options
  298. );
  299. const condition = options.filter((item) => item.label == current)[0]
  300. .value;
  301. payload = { ...payload, ...condition };
  302. yield put({
  303. type: "setEnquireData",
  304. payload: { loading: true },
  305. });
  306. const response = yield call(
  307. sldCommonService,
  308. payload,
  309. "get",
  310. "v3/statistics/screen/analysis/enquiryTrend"
  311. );
  312. yield put({
  313. type: "setEnquireData",
  314. payload: { data: response.data, loading: false },
  315. });
  316. },
  317. // 海外询盘地区分布
  318. *load_overseas_enquire_location({ payload }, { call, put, select }) {
  319. yield put({
  320. type: "setOverseasEnquireLocation",
  321. payload: { loading: true },
  322. });
  323. const response = yield call(
  324. sldCommonService,
  325. payload,
  326. "get",
  327. "v3/statistics/screen/analysis/enquiryDistribution"
  328. );
  329. yield put({
  330. type: "setOverseasEnquireLocation",
  331. payload: { data: response.data, loading: false },
  332. });
  333. },
  334. // 分销商地区分布
  335. *load_distributor_enquire_location({ payload }, { call, put, select }) {
  336. yield put({
  337. type: "setDistributorEnquireLocation",
  338. payload: { loading: true },
  339. });
  340. const response = yield call(
  341. sldCommonService,
  342. payload,
  343. "get",
  344. "v3/statistics/screen/analysis/regionDistribution"
  345. );
  346. yield put({
  347. type: "setDistributorEnquireLocation",
  348. payload: { data: response.data, loading: false },
  349. });
  350. },
  351. // 新增会员趋势
  352. *load_add_member_trend({ payload }, { put, call, select}) {
  353. const current = yield select(
  354. (state) => state.bigscreen.memberAddTrendData.current
  355. );
  356. const options = yield select(
  357. (state) => state.bigscreen.memberAddTrendData.options
  358. );
  359. const condition = options.filter((item) => item.label == current)[0]
  360. .value;
  361. payload = { ...payload, ...condition };
  362. yield put({
  363. type: "setMemberAddTrendData",
  364. payload: { loading: true },
  365. });
  366. const response = yield call(
  367. sldCommonService,
  368. payload,
  369. "get",
  370. "v3/statistics/screen/analysis/memberTrend"
  371. );
  372. yield put({
  373. type: "setMemberAddTrendData",
  374. payload: { data: response.data, loading: false },
  375. });
  376. },
  377. // 新增商品趋势
  378. *load_add_product_trend({ payload }, { put, call }) {
  379. yield put({
  380. type: "setProductAddTrendData",
  381. payload: { loading: true },
  382. });
  383. const response = yield call(
  384. sldCommonService,
  385. payload,
  386. "get",
  387. "v3/statistics/screen/analysis/goodsTrend"
  388. );
  389. yield put({
  390. type: "setProductAddTrendData",
  391. payload: { data: response.data, loading: false },
  392. });
  393. },
  394. // 门户关键词搜索
  395. *load_search_rank({ payload }, { put, call, select }) {
  396. const current = yield select(
  397. (state) => state.bigscreen.searchRankData.current
  398. );
  399. const options = yield select(
  400. (state) => state.bigscreen.searchRankData.options
  401. );
  402. const condition = options.filter((item) => item.label == current)[0]
  403. .value;
  404. payload = { ...payload, ...condition };
  405. yield put({
  406. type: "setSearchRankData",
  407. payload: { loading: true },
  408. });
  409. const response = yield call(
  410. sldCommonService,
  411. payload,
  412. "get",
  413. "v3/statistics/screen/analysis/searchRank"
  414. );
  415. yield put({
  416. type: "setSearchRankData",
  417. payload: { data: response.data, loading: false },
  418. });
  419. },
  420. // 店铺流量排行
  421. *load_store_traffic({ payload }, { put, call, select }) {
  422. const current = yield select(
  423. (state) => state.bigscreen.storeTrafficData.current
  424. );
  425. const options = yield select(
  426. (state) => state.bigscreen.storeTrafficData.options
  427. );
  428. const condition = options.filter((item) => item.label == current)[0]
  429. .value;
  430. payload = { ...payload, ...condition };
  431. yield put({
  432. type: "setStoreTrafficData",
  433. payload: { loading: true },
  434. });
  435. const response = yield call(
  436. sldCommonService,
  437. payload,
  438. "get",
  439. "v3/statistics/screen/analysis/storeFlowRank"
  440. );
  441. yield put({
  442. type: "setStoreTrafficData",
  443. payload: { data: response.data, loading: false },
  444. });
  445. },
  446. // 世界地图站点数据
  447. *load_world_map({ payload }, { put, call, select }) {
  448. yield put({
  449. type: "setWorldMapData",
  450. payload: { loading: true },
  451. });
  452. const response = yield call(
  453. sldCommonService,
  454. payload,
  455. "get",
  456. "v3/statistics/screen/analysis/memberDistribution"
  457. );
  458. yield put({
  459. type: "setWorldMapData",
  460. payload: { data: response.data, loading: false },
  461. });
  462. },
  463. // 订单概况
  464. *load_order_basic({ payload }, { put, call, select }) {
  465. const current = yield select(
  466. (state) => state.bigscreen.orderData.current
  467. );
  468. const options = yield select(
  469. (state) => state.bigscreen.orderData.options
  470. );
  471. const condition = options.filter((item) => item.label == current)[0].value;
  472. payload = { ...payload, day: condition };
  473. yield put({
  474. type: "setOrderData",
  475. payload: { loading: true },
  476. });
  477. const response = yield call(
  478. sldCommonService,
  479. payload,
  480. "get",
  481. "v3/business/admin/orderInfo/orderList"
  482. );
  483. yield put({
  484. type: "setOrderData",
  485. payload: { data: safeJsonParse(response.msg, []), loading: false },
  486. });
  487. },
  488. // 初始化数据
  489. *load_data({ payload }, { put, call, all }) {
  490. // 更新时间
  491. const now = new Date();
  492. const pad = (n) => n.toString().padStart(2, "0");
  493. const currentTime = `${now.getFullYear()}-${pad(
  494. now.getMonth() + 1
  495. )}-${pad(now.getDate())} ${pad(now.getHours())}:${pad(
  496. now.getMinutes()
  497. )}:${pad(now.getSeconds())}`;
  498. yield put({
  499. type: "setUpdateTime",
  500. payload: currentTime,
  501. });
  502. yield all([
  503. put({ type: "load_overview" }),
  504. put({ type: "load_portal_traffic" }),
  505. put({ type: "load_enquire_data" }),
  506. put({ type: "load_overseas_enquire_location" }),
  507. put({ type: "load_distributor_enquire_location" }),
  508. put({ type: "load_add_member_trend" }),
  509. // put({ type: "load_add_product_trend" }),
  510. put({ type: "load_search_rank" }),
  511. put({ type: "load_store_traffic" }),
  512. put({ type: "load_world_map" }),
  513. put({ type: 'load_order_basic' })
  514. ]);
  515. },
  516. },
  517. reducers: {
  518. setOrderData(state, { payload }) {
  519. return {
  520. ...state,
  521. orderData: {
  522. ...state.orderData,
  523. ...payload,
  524. },
  525. };
  526. },
  527. setWorldMapData(state, { payload }) {
  528. return {
  529. ...state,
  530. mapContainerData: {
  531. ...state.mapContainerData,
  532. ...payload,
  533. },
  534. };
  535. },
  536. setStoreTrafficData(state, { payload }) {
  537. return {
  538. ...state,
  539. storeTrafficData: {
  540. ...state.storeTrafficData,
  541. ...payload,
  542. },
  543. };
  544. },
  545. setUpdateTime(state, { payload }) {
  546. return {
  547. ...state,
  548. updateTime: payload,
  549. };
  550. },
  551. setSearchRankData(state, { payload }) {
  552. return {
  553. ...state,
  554. searchRankData: {
  555. ...state.searchRankData,
  556. ...payload,
  557. },
  558. };
  559. },
  560. setOverviewData(state, { payload }) {
  561. return {
  562. ...state,
  563. overviewData: {
  564. ...state.overviewData,
  565. ...payload,
  566. },
  567. };
  568. },
  569. setPortalTrafficData(state, { payload }) {
  570. return {
  571. ...state,
  572. portalTrafficData: {
  573. ...state.portalTrafficData,
  574. ...payload,
  575. },
  576. };
  577. },
  578. setEnquireData(state, { payload }) {
  579. return {
  580. ...state,
  581. enquireData: {
  582. ...state.enquireData,
  583. ...payload,
  584. },
  585. };
  586. },
  587. setOverseasEnquireLocation(state, { payload }) {
  588. return {
  589. ...state,
  590. overseasEnquireLocationData: {
  591. ...state.overseasEnquireLocationData,
  592. ...payload,
  593. },
  594. };
  595. },
  596. setDistributorEnquireLocation(state, { payload }) {
  597. return {
  598. ...state,
  599. distributorEnquireLocationData: {
  600. ...state.distributorEnquireLocationData,
  601. ...payload,
  602. },
  603. };
  604. },
  605. setMemberAddTrendData(state, { payload }) {
  606. return {
  607. ...state,
  608. memberAddTrendData: {
  609. ...state.memberAddTrendData,
  610. ...payload,
  611. },
  612. };
  613. },
  614. setProductAddTrendData(state, { payload }) {
  615. return {
  616. ...state,
  617. productAddTrendData: {
  618. ...state.productAddTrendData,
  619. ...payload,
  620. },
  621. };
  622. },
  623. },
  624. subscriptions: {
  625. setup({ history }) {
  626. // Subscribe history(url) change, trigger `load` action if pathname is `/`
  627. return history.listen(({ pathname, search }) => {
  628. if (typeof window.ga !== "undefined") {
  629. window.ga("send", "pageview", pathname + search);
  630. }
  631. });
  632. },
  633. },
  634. };