storage.js 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. import BarChartModule from '@/components/ManagementPage/BarChartModule';
  2. import PieChartModule from '@/components/ManagementPage/PieChartModule';
  3. import RadarChartModule from '@/components/ManagementPage/RadarChartModule';
  4. import ModuleTitle from '@/components/ManagementPage/moduleTitle';
  5. import PageContent from '@/components/PageContent';
  6. import PageTitle from '@/components/PageTitle';
  7. import { queryMainChartList } from '@/services/StorageManagement';
  8. import { useParams, useRequest } from '@umijs/max';
  9. import { Empty, Select, Spin } from 'antd';
  10. import moment from 'moment';
  11. import { useRef } from 'react';
  12. import styles from './index.less';
  13. const { Option } = Select;
  14. const StorageOverview = () => {
  15. const { projectId } = useParams();
  16. const yearRef = useRef(Number(moment().format('YYYY')));
  17. const monthRef = useRef(0);
  18. const statistics = [
  19. {
  20. title: '在库数量(个)',
  21. key: 'on_amount',
  22. },
  23. {
  24. title: '入库数量(个)',
  25. key: 'in_amount',
  26. },
  27. {
  28. title: '出库数量(个)',
  29. key: 'out_amount',
  30. },
  31. {
  32. title: '报废数量(个)',
  33. key: 'scrap_amount',
  34. },
  35. {
  36. title: '报警数量(个)',
  37. key: 'warning_stat',
  38. },
  39. ];
  40. const colors = ['#E1943A', '#5BE46D', '#FF976F', '#6589FC', '#9863F9'];
  41. const topTen = [
  42. {
  43. name: '你好',
  44. value: '100',
  45. },
  46. {
  47. name: '进水阀',
  48. value: '73',
  49. },
  50. {
  51. name: 'hahah',
  52. value: '70',
  53. },
  54. {
  55. name: 'hahah',
  56. value: '65',
  57. },
  58. {
  59. name: 'hahah',
  60. value: '60',
  61. },
  62. {
  63. name: 'hahah',
  64. value: '50',
  65. },
  66. {
  67. name: 'hahah',
  68. value: '45',
  69. },
  70. {
  71. name: 'hahah',
  72. value: '40',
  73. },
  74. {
  75. name: 'hahah',
  76. value: '38',
  77. },
  78. {
  79. name: 'hahah',
  80. value: '33',
  81. },
  82. ];
  83. const props1 = {
  84. yName: '水量(t)',
  85. xData: ['00:00', '01:15', '02:30', '03:45', '05:00', '06:15', '07:30'],
  86. dataList: [
  87. {
  88. type: 0,
  89. name: '进水水量',
  90. data: [820, 932, 901, 934, 1290, 1330, 1320],
  91. },
  92. {
  93. type: 0,
  94. name: '进水水量111',
  95. data: [420, 932, 601, 934, 1990, 1330, 1520],
  96. },
  97. {
  98. type: 1,
  99. name: '预测出水量',
  100. data: [720, 832, 601, 834, 1190, 1230, 1220],
  101. },
  102. {
  103. type: 2,
  104. name: '实际出水量',
  105. data: [820, 632, 501, 534, 1190, 1130, 1120],
  106. },
  107. ],
  108. };
  109. const { data, run, loading } = useRequest(
  110. () =>
  111. queryMainChartList({
  112. project_id: Number(projectId),
  113. year: yearRef.current,
  114. month: monthRef.current,
  115. }),
  116. {
  117. formatResult: (res) => {
  118. const data = res.data;
  119. console.log('--------------------', data);
  120. const values =
  121. data?.scrap?.length > 0
  122. ? data?.scrap?.map((item) => item.value)
  123. : [0];
  124. const radarMax = Math.max(...values);
  125. return {
  126. maxKind:
  127. data?.kind?.length > 0
  128. ? data?.kind?.sort((a, b) => b.value - a.value)[0].value
  129. : 1,
  130. kind: data.kind,
  131. statistics: statistics.map((item) => {
  132. return { ...item, value: data[item.key] };
  133. }),
  134. barData:
  135. data?.in?.length > 0 && data?.out?.length > 0
  136. ? {
  137. xData: data.in?.map((cur) => cur.item),
  138. dataList: [
  139. {
  140. name: '入库',
  141. data: data.in?.map((cur) => cur.value),
  142. },
  143. {
  144. name: '出库',
  145. data: data.out?.map((cur) => cur.value),
  146. },
  147. ],
  148. }
  149. : {},
  150. pieData: data?.rank?.map((cur) => {
  151. return { name: cur.item, value: cur.value };
  152. }),
  153. radarData:
  154. data?.scrap?.length > 0
  155. ? {
  156. indicator: data?.scrap?.map((item) => {
  157. return { name: item.item, max: radarMax };
  158. }),
  159. data: [
  160. {
  161. value: data?.scrap?.map((item) => {
  162. return item.value;
  163. }),
  164. },
  165. ],
  166. }
  167. : {},
  168. lineData:
  169. data?.on?.length > 0 && data.check?.length > 0
  170. ? {
  171. closeTime: true,
  172. yName: '数量',
  173. xData: data.on?.map((item) => item.item),
  174. dataList: [
  175. {
  176. type: 2,
  177. name: '库存',
  178. data: data.on?.map((item) => item.value),
  179. },
  180. {
  181. type: 1,
  182. name: '盘点',
  183. data: data.check?.map((item) => item.value),
  184. },
  185. ],
  186. }
  187. : null,
  188. };
  189. },
  190. },
  191. );
  192. const ItemContent = ({ idx, title, value }) => {
  193. return (
  194. <div className={styles.item} style={{ backgroundColor: colors[idx] }}>
  195. <div className={styles.item_title}>{title}</div>
  196. <div className={styles.item_num}>{value}</div>
  197. </div>
  198. );
  199. };
  200. return (
  201. <PageContent>
  202. <PageTitle children="备品统计" returnable />
  203. <div className={styles.main}>
  204. <Spin spinning={loading}>
  205. <ModuleTitle title="物料种类库存占比" />
  206. <div style={{ height: '330px' }}>
  207. {data?.pieData && <PieChartModule data={data.pieData} />}
  208. </div>
  209. <div className={styles.thereItem}>
  210. <ModuleTitle title="物料库存排名前十统计" />
  211. <ul
  212. style={{
  213. height: '330px',
  214. display: 'flex',
  215. flexDirection: 'column',
  216. }}
  217. >
  218. {data?.kind && data.kind.length != 0 ? (
  219. data.kind
  220. ?.sort((a, b) => b.value - a.value)
  221. .map((item) => {
  222. return (
  223. <li
  224. className={styles.li}
  225. key={`kind_${item.item}`}
  226. style={{ flexGrow: 1 }}
  227. >
  228. <div
  229. style={{
  230. width: '80px',
  231. textAlign: 'right',
  232. fontSize: '18px',
  233. whiteSpace: 'nowrap',
  234. }}
  235. >
  236. {item.item}
  237. </div>
  238. <div
  239. className={styles.line}
  240. style={{
  241. width: `${(70 * item.value) / data?.maxKind}%`,
  242. }}
  243. ></div>
  244. {item.value}
  245. </li>
  246. );
  247. })
  248. ) : (
  249. <Empty />
  250. )}
  251. </ul>
  252. </div>
  253. <div className={styles.thereItem}>
  254. <ModuleTitle title="物料报废统计" />
  255. <div style={{ height: '330px' }}>
  256. {data?.radarData && <RadarChartModule {...data.radarData} />}
  257. </div>
  258. </div>
  259. <div className={styles.twoItem}>
  260. <ModuleTitle title="出入库统计" />
  261. <div style={{ height: '330px' }}>
  262. {data?.barData && <BarChartModule {...data.barData} />}
  263. </div>
  264. </div>
  265. </Spin>
  266. </div>
  267. </PageContent>
  268. );
  269. };
  270. export default StorageOverview;