storage.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  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, Spin } from 'antd';
  10. import dayjs from 'dayjs';
  11. import { useRef } from 'react';
  12. import styles from './index.less';
  13. const StorageOverview = () => {
  14. const { projectId } = useParams();
  15. const yearRef = useRef(Number(dayjs().format('YYYY')));
  16. const monthRef = useRef(0);
  17. const statistics = [
  18. {
  19. title: '在库数量(个)',
  20. key: 'on_amount',
  21. },
  22. {
  23. title: '入库数量(个)',
  24. key: 'in_amount',
  25. },
  26. {
  27. title: '出库数量(个)',
  28. key: 'out_amount',
  29. },
  30. {
  31. title: '报废数量(个)',
  32. key: 'scrap_amount',
  33. },
  34. {
  35. title: '报警数量(个)',
  36. key: 'warning_stat',
  37. },
  38. ];
  39. const { data, loading } = useRequest(
  40. () =>
  41. queryMainChartList({
  42. project_id: Number(projectId),
  43. year: yearRef.current,
  44. month: monthRef.current,
  45. }),
  46. {
  47. formatResult: (res) => {
  48. const data = res.data;
  49. const values =
  50. data?.scrap?.length > 0
  51. ? data?.scrap?.map((item) => item.value)
  52. : [0];
  53. const radarMax = Math.max(...values);
  54. return {
  55. maxKind:
  56. data?.kind?.length > 0
  57. ? data?.kind?.sort((a, b) => b.value - a.value)[0].value
  58. : 1,
  59. kind: data.kind,
  60. statistics: statistics.map((item) => {
  61. return { ...item, value: data[item.key] };
  62. }),
  63. barData:
  64. data?.in?.length > 0 && data?.out?.length > 0
  65. ? {
  66. xData: data.in?.map((cur) => cur.item),
  67. dataList: [
  68. {
  69. name: '入库',
  70. data: data.in?.map((cur) => cur.value),
  71. },
  72. {
  73. name: '出库',
  74. data: data.out?.map((cur) => cur.value),
  75. },
  76. ],
  77. }
  78. : {},
  79. pieData: data?.rank?.map((cur) => {
  80. return { name: cur.item, value: cur.value };
  81. }),
  82. radarData:
  83. data?.scrap?.length > 0
  84. ? {
  85. indicator: data?.scrap?.map((item) => {
  86. return { name: item.item, max: radarMax };
  87. }),
  88. data: [
  89. {
  90. value: data?.scrap?.map((item) => {
  91. return item.value;
  92. }),
  93. },
  94. ],
  95. }
  96. : {},
  97. lineData:
  98. data?.on?.length > 0 && data.check?.length > 0
  99. ? {
  100. closeTime: true,
  101. yName: '数量',
  102. xData: data.on?.map((item) => item.item),
  103. dataList: [
  104. {
  105. type: 2,
  106. name: '库存',
  107. data: data.on?.map((item) => item.value),
  108. },
  109. {
  110. type: 1,
  111. name: '盘点',
  112. data: data.check?.map((item) => item.value),
  113. },
  114. ],
  115. }
  116. : null,
  117. };
  118. },
  119. },
  120. );
  121. return (
  122. <PageContent closeable={false}>
  123. <PageTitle children="备品统计" returnable />
  124. <div className="content-title">
  125. <div className={styles.main}>
  126. <Spin spinning={loading}>
  127. <div className={`card-box ${styles.itemContent}`}>
  128. <ModuleTitle title="物料种类库存占比" />
  129. <div style={{ height: '3.3rem' }}>
  130. {data?.pieData && <PieChartModule data={data.pieData} />}
  131. </div>
  132. </div>
  133. <div className={`card-box ${styles.itemContent}`}>
  134. <ModuleTitle title="物料库存排名前十统计" />
  135. <ul
  136. style={{
  137. height: '3.3rem',
  138. display: 'flex',
  139. flexDirection: 'column',
  140. }}
  141. >
  142. {data?.kind && data.kind.length != 0 ? (
  143. data.kind
  144. ?.sort((a, b) => b.value - a.value)
  145. .map((item) => {
  146. return (
  147. <li
  148. className={styles.li}
  149. key={`kind_${item.item}`}
  150. style={{ flexGrow: 1 }}
  151. >
  152. <div
  153. style={{
  154. width: '0.8rem',
  155. textAlign: 'right',
  156. fontSize: '0.18rem',
  157. whiteSpace: 'nowrap',
  158. }}
  159. >
  160. {item.item}
  161. </div>
  162. <div
  163. className={styles.line}
  164. style={{
  165. width: `${(70 * item.value) / data?.maxKind}%`,
  166. }}
  167. />
  168. {item.value}
  169. </li>
  170. );
  171. })
  172. ) : (
  173. <Empty />
  174. )}
  175. </ul>
  176. </div>
  177. <div className={`card-box ${styles.itemContent}`}>
  178. <ModuleTitle title="物料报废统计" />
  179. <div style={{ height: '4.4rem' }}>
  180. {data?.radarData && <RadarChartModule {...data.radarData} />}
  181. </div>
  182. </div>
  183. <div className={`card-box ${styles.itemContent}`}>
  184. <ModuleTitle title="出入库统计" />
  185. <div style={{ height: '4rem' }}>
  186. {data?.barData && <BarChartModule {...data.barData} />}
  187. </div>
  188. </div>
  189. </Spin>
  190. </div>
  191. </div>
  192. </PageContent>
  193. );
  194. };
  195. export default StorageOverview;