Analysis.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792
  1. <template>
  2. <div class="analysis">
  3. <!-- 工作看板 -->
  4. <board :title="title[0]">
  5. <div>
  6. <work-infos :dataList="workInfos" @workInfoClick="handleWorkInfoClick">
  7. </work-infos>
  8. <div class="table-content">
  9. <table-content
  10. :tableItems="tableItems"
  11. :height="height"
  12. :shows="tableShows"
  13. :listData="tableData"
  14. >
  15. <template v-slot:handleState="slotProps">
  16. {{ slotProps.row.handleState ? "已处理" : "未处理" }}
  17. </template>
  18. </table-content>
  19. </div>
  20. </div>
  21. </board>
  22. <!-- 存栏情况 -->
  23. <board :title="title[1]">
  24. <div>
  25. <div>
  26. <!-- 存栏结构 -->
  27. <chart-inventory-pie :data="inventoryPieData"></chart-inventory-pie>
  28. <!-- 存栏变动 -->
  29. <chart-inventory-lines
  30. :data="inventoryLinesData"
  31. ></chart-inventory-lines>
  32. </div>
  33. <div>
  34. <!-- 存栏计数 -->
  35. <inventory-items :data="inventoryItemsData"></inventory-items>
  36. </div>
  37. </div>
  38. </board>
  39. <!-- 生产情况 -->
  40. <board :title="title[2]">
  41. <!-- 环形图 -->
  42. <production-donuts :data="productionPercents"></production-donuts>
  43. <!-- 8个格子 -->
  44. <production-items :data="productionItems"></production-items>
  45. </board>
  46. <!-- 经营分析 -->
  47. <board :title="title[3]">
  48. <!-- 成本分析 -->
  49. <div class="cost">
  50. <div class="select">
  51. <el-select size="small" v-model="costValue">
  52. <el-option
  53. v-for="item in costOptions"
  54. :key="item.value"
  55. :label="item.label"
  56. :value="item.value"
  57. >
  58. </el-option>
  59. </el-select>
  60. </div>
  61. <div class="cost-content">
  62. <div class="cost-left">
  63. <cost-pie :data="costPieData"></cost-pie>
  64. </div>
  65. <div class="cost-right">
  66. <cost-histogram :data="costHisData"></cost-histogram>
  67. </div>
  68. </div>
  69. <h3 class="label">成本分析</h3>
  70. </div>
  71. <!-- 重要指标 -->
  72. <div class="important">
  73. <div class="condition">
  74. <el-select
  75. size="small"
  76. v-model="importantValue"
  77. style="margin-right: 20px"
  78. @change="changeImportantValue"
  79. >
  80. <el-option
  81. v-for="item in importantOptions"
  82. :key="item.type"
  83. :label="item.label"
  84. :value="item.type"
  85. >
  86. </el-option>
  87. </el-select>
  88. <el-date-picker
  89. v-model="importantDates"
  90. size="small"
  91. type="daterange"
  92. range-separator="至"
  93. start-placeholder="开始日期"
  94. end-placeholder="结束日期"
  95. value-format="yyyy-MM-dd"
  96. @change="changeImportantDates"
  97. >
  98. </el-date-picker>
  99. </div>
  100. <div class="important-chart">
  101. <important-line></important-line>
  102. </div>
  103. </div>
  104. <!-- 销售情况 -->
  105. <div class="sales">
  106. <div class="sales-condition">
  107. <el-date-picker
  108. v-model="getSalesDates"
  109. type="datetimerange"
  110. :picker-options="pickerOptions"
  111. range-separator="至"
  112. start-placeholder="开始日期"
  113. end-placeholder="结束日期"
  114. align="right"
  115. size="small"
  116. >
  117. </el-date-picker>
  118. </div>
  119. <div class="sales-content">
  120. <div class="sales-left">
  121. <div class="up">
  122. <label>本周销售额</label>
  123. <span>{{ weekSales }}元</span>
  124. <div class="sales-change">
  125. <div>
  126. <div
  127. class="triangle-change"
  128. :class="
  129. weekSalesChange > 0 ? 'triangle-up' : 'triangle-down'
  130. "
  131. ></div>
  132. <span :class="weekSalesChange > 0 ? 'color-up' : 'color-down'"
  133. >{{ weekSalesChange }}%</span
  134. >
  135. &nbsp;&nbsp;&nbsp;同比上周
  136. </div>
  137. </div>
  138. </div>
  139. <div class="down">
  140. <label>本周销售量</label>
  141. <span>{{ weekSalesVolume }}元</span>
  142. <div class="sales-change">
  143. <div>
  144. <div
  145. class="triangle-change"
  146. :class="
  147. weekSalesVolumeChange > 0
  148. ? 'triangle-up'
  149. : 'triangle-down'
  150. "
  151. ></div>
  152. <span
  153. :class="
  154. weekSalesVolumeChange > 0 ? 'color-up' : 'color-down'
  155. "
  156. >
  157. {{ weekSalesVolumeChange }}%
  158. </span>
  159. &nbsp;&nbsp;&nbsp;同比上周
  160. </div>
  161. </div>
  162. </div>
  163. </div>
  164. <div class="sales-right">
  165. <sales-chart :data="salesChartData"></sales-chart>
  166. </div>
  167. </div>
  168. </div>
  169. </board>
  170. <!-- 应收排名 -->
  171. <!-- <board :title="title[4]">
  172. <table-content
  173. :tableItems="yingshouTableItems"
  174. :height="height"
  175. :shows="yingshouTableShows"
  176. :listData="yingshouTableData"
  177. >
  178. </table-content>
  179. </board> -->
  180. <!-- 应付排名 -->
  181. <board :title="title[5]">
  182. <table-content
  183. :tableItems="yingshouTableItems"
  184. :height="height"
  185. :shows="yingshouTableShows"
  186. :listData="yingfuTableData"
  187. >
  188. </table-content>
  189. </board>
  190. <!-- 安全库存报警 -->
  191. <board :title="title[6]">
  192. <table-content
  193. :tableItems="safetyTableItems"
  194. :height="height"
  195. :shows="safetyTableShows"
  196. :listData="safetyTableData"
  197. >
  198. </table-content>
  199. <table-footer
  200. :totals="total"
  201. :size="size"
  202. @sizeChange="sizeChange"
  203. @pageChange="pageChange"
  204. >
  205. </table-footer>
  206. </board>
  207. </div>
  208. </template>
  209. <script>
  210. import Board from "components/board/index.vue";
  211. import WorkInfos from "./analysis/WorkInfos.vue";
  212. import TableContent from "components/newTable/TableContent.vue";
  213. import ChartInventoryPie from "./analysis/ChartInventoryPie.vue";
  214. import ChartInventoryLines from "./analysis/ChartInventoryLines.vue";
  215. import InventoryItems from "./analysis/InventoryItems.vue";
  216. import ProductionDonuts from "./analysis/ProductionDonuts.vue";
  217. import ProductionItems from "./analysis/ProductionItems.vue";
  218. import CostPie from "./analysis/CostPie.vue";
  219. import CostHistogram from "./analysis/CostHistogram.vue";
  220. import ImportantLine from "./analysis/ImportantLine.vue";
  221. import SalesChart from "./analysis/SalesChart.vue";
  222. import TableFooter from "../../components/TableFooter";
  223. import { tableItems, tableShows } from "./analysis/table.config";
  224. import {
  225. yingshouTableItems,
  226. yingshouTableShows,
  227. } from "./analysis/yingshouTable.config";
  228. import {
  229. safetyTableItems,
  230. safetyTableShows,
  231. } from "./analysis/safetyTable.config";
  232. // import { formItems } from './analysis/salesXForm.config'
  233. import {
  234. getInventoryLines,
  235. getInventoryAndProduct,
  236. getSalesChange,
  237. getSalesChart,
  238. getCosts,
  239. // getYingShou,
  240. getYingFu,
  241. } from "utils/api";
  242. import {
  243. getWorkTotal,
  244. getWorkInfos,
  245. getSafeInventory,
  246. getProductionCondition,
  247. getImportantData,
  248. } from "utils/chenApi";
  249. export default {
  250. name: "Analysis",
  251. components: {
  252. Board,
  253. WorkInfos,
  254. TableContent,
  255. ChartInventoryPie,
  256. ChartInventoryLines,
  257. InventoryItems,
  258. ProductionDonuts,
  259. ProductionItems,
  260. CostPie,
  261. CostHistogram,
  262. ImportantLine,
  263. // XForm,
  264. SalesChart,
  265. TableFooter,
  266. },
  267. data() {
  268. return {
  269. title: [
  270. "工作看板",
  271. "存栏情况",
  272. "生产情况",
  273. "经营分析",
  274. "应收排名",
  275. "应付排名",
  276. "安全库存报警",
  277. ],
  278. workInfos: [
  279. {
  280. label: "预警信息",
  281. number: 10,
  282. },
  283. {
  284. label: "断奶数量",
  285. number: 1150,
  286. },
  287. {
  288. label: "配种数量",
  289. number: 1540,
  290. },
  291. {
  292. label: "转舍计划",
  293. number: 108,
  294. },
  295. {
  296. label: "分娩数量",
  297. number: 180,
  298. },
  299. {
  300. label: "日常计划",
  301. number: 10,
  302. },
  303. {
  304. label: "天才计划",
  305. number: 10,
  306. },
  307. {
  308. label: "保健计划",
  309. number: 10,
  310. },
  311. ],
  312. tableItems: [],
  313. tableShows: {},
  314. height: 300,
  315. tableData: [],
  316. // 存栏情况
  317. inventoryLinesData: {}, // 折线图数据
  318. inventoryPieData: [], // 环形图数据
  319. inventoryItemsData: [], // 下面块图的数据
  320. // 生产情况
  321. productionPercents: [], // 百分比
  322. productionItems: [], // 下面块图的数据
  323. // 经营分析
  324. costOptions: [],
  325. costValue: "",
  326. costPieData: [], // 经营分析 - 成本分析环形图
  327. costHisData: [], // 经营分析 - 柱状图
  328. // 重要指标
  329. importantOptions: [
  330. {
  331. type: 1,
  332. label: "配种指标",
  333. },
  334. {
  335. type: 2,
  336. label: "分娩指标",
  337. },
  338. {
  339. type: 3,
  340. label: "断奶指标",
  341. },
  342. {
  343. type: 4,
  344. label: "成活率指标",
  345. },
  346. ],
  347. importantValue: "",
  348. importantDates: [],
  349. importantData: [], // 重要指标折线图数据
  350. // 销售额
  351. // salesFormItems: [],
  352. salesDay: 2, //默认选择本周
  353. weekSales: 1545252,
  354. weekSalesChange: 10,
  355. weekSalesVolume: 1000,
  356. weekSalesVolumeChange: -10,
  357. getSalesDates: [], // 销售图的时间选择
  358. pickerOptions: {
  359. // 快捷选项
  360. shortcuts: [
  361. {
  362. text: "最近一周",
  363. onClick(picker) {
  364. const end = new Date();
  365. const start = new Date();
  366. start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
  367. picker.$emit("pick", [start, end]);
  368. },
  369. },
  370. {
  371. text: "最近一个月",
  372. onClick(picker) {
  373. const end = new Date();
  374. const start = new Date();
  375. start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
  376. picker.$emit("pick", [start, end]);
  377. },
  378. },
  379. {
  380. text: "最近三个月",
  381. onClick(picker) {
  382. const end = new Date();
  383. const start = new Date();
  384. start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
  385. picker.$emit("pick", [start, end]);
  386. },
  387. },
  388. ],
  389. },
  390. salesChartData: {}, // 销售图的数据
  391. // 应收排名
  392. yingshouTableItems: [],
  393. yingshouTableShows: {},
  394. yingshouTableData: [],
  395. // 应付排名
  396. yingfuTableData: [],
  397. // 安全库存报警
  398. safetyTableItems: [],
  399. safetyTableShows: {},
  400. safetyTableData: [],
  401. total: 0,
  402. size: 20,
  403. pageNum: 1,
  404. };
  405. },
  406. mounted() {
  407. // this.salesFormItems = formItems
  408. this.tableItems = tableItems;
  409. this.tableShows = tableShows;
  410. this.yingshouTableItems = yingshouTableItems;
  411. this.yingshouTableShows = yingshouTableShows;
  412. this.safetyTableItems = safetyTableItems;
  413. this.safetyTableShows = safetyTableShows;
  414. /** 获取网络请求数据 */
  415. this.initInventoryLines();
  416. this.initInventoryAndProduct();
  417. this.initSalesChange();
  418. this.initSalesChart();
  419. this.initCosts();
  420. // this.initYingShou();
  421. this.initYingFu();
  422. this.initWorkBoard(); // 工作看板
  423. this.initSafeInventory(); // 安全库存报警
  424. this.initProductionCondition(); // 生产情况
  425. },
  426. methods: {
  427. handleWorkInfoClick(item) {
  428. console.log(item);
  429. },
  430. // 修改size
  431. sizeChange(val) {
  432. this.size = val;
  433. this.init();
  434. },
  435. // 修改页数
  436. pageChange(val) {
  437. this.pageNum = val;
  438. this.init();
  439. },
  440. init() {
  441. let params = {
  442. pageNum: this.pageNum,
  443. pageSize: this.size,
  444. searchStr: this.keyword,
  445. };
  446. console.log(params);
  447. // 获取后端数据
  448. },
  449. // 销售额选中日期
  450. salesSetDay(data) {
  451. this.salesDay = data;
  452. console.log(this.salesDay);
  453. },
  454. // 销售额选中日周月
  455. salesOnClickType(data) {
  456. console.log(data);
  457. },
  458. // 工作看板
  459. initWorkBoard() {
  460. getWorkTotal({}).then(async (res) => {
  461. this.workInfos = res.data;
  462. const result = await getWorkInfos({});
  463. this.tableData = result.data;
  464. });
  465. },
  466. // 存栏情况 - 存栏变动折线图数据请求
  467. initInventoryLines() {
  468. getInventoryLines({}).then((res) => {
  469. if (res.code === 10000) {
  470. this.inventoryLinesData = res.data;
  471. } else {
  472. this.inventoryLinesData = {
  473. boarStock: [],
  474. fatpigStock: [],
  475. griceStock: [],
  476. month: [],
  477. pigletStock: [],
  478. sowStock: [],
  479. };
  480. }
  481. });
  482. },
  483. // 存栏情况 + 生产情况
  484. initInventoryAndProduct() {
  485. getInventoryAndProduct({}).then((res) => {
  486. if (res.code === 10000) {
  487. // this.inventoryLinesData = res.data
  488. console.log(res.data);
  489. // this.inventoryPieData = res.data.slice(0, 6)
  490. this.inventoryPieData = [
  491. res.data["sow_stock"],
  492. res.data["boar_stock"],
  493. res.data["grice_stock"],
  494. res.data["piglet_stock"],
  495. res.data["fatpig_stock"],
  496. ];
  497. this.inventoryItemsData = [
  498. res.data["sow_stock"].stockQuantity,
  499. res.data["sow_stock_1"].stockQuantity,
  500. res.data["sow_stock_2"].stockQuantity,
  501. res.data["sow_stock_3"].stockQuantity,
  502. res.data["boar_stock"].stockQuantity,
  503. res.data["business_stock"].stockQuantity,
  504. ];
  505. // this.productionPercents = [
  506. // res.data[12].rate * 100,
  507. // res.data[13].rate * 100,
  508. // res.data[14].rate * 100,
  509. // res.data[15].rate * 100,
  510. // res.data[16].rate * 100,
  511. // ];
  512. // this.productionPercents = [res.data[12].rate*100, res.data[13].rate*100, res.data[14].rate*100, res.data[15].rate*100, res.data[16].rate*100]
  513. // this.productionItems = [res.data[17].stockQuantity, res.data[18].stockQuantity, res.data[19].stockQuantity, res.data[20].stockQuantity, res.data[21].stockQuantity, res.data[22].stockQuantity, res.data[23].stockQuantity, res.data[24].stockQuantity]
  514. } else {
  515. // this.inventoryLinesData = {
  516. // boarStock: [],
  517. // fatpigStock: [],
  518. // griceStock: [],
  519. // month: [],
  520. // pigletStock: [],
  521. // sowStock: []
  522. // }
  523. }
  524. });
  525. },
  526. // 经营分析 - 销售改变
  527. initSalesChange() {
  528. getSalesChange({}).then((res) => {
  529. if (res.code === 10000) {
  530. this.weekSales = res.data.quantityAll;
  531. this.weekSalesChange = res.data.quantityType
  532. ? res.data.quantityPercentage
  533. : -res.data.quantityPercentage;
  534. this.weekSalesVolume = res.data.saleAll;
  535. this.weekSalesVolumeChange = res.data.saleType
  536. ? res.data.salePercentage
  537. : -res.data.salePercentage;
  538. } else {
  539. this.weekSales = 0;
  540. this.weekSalesChange = 0;
  541. this.weekSalesVolume = 0;
  542. this.weekSalesVolumeChange = 0;
  543. }
  544. });
  545. },
  546. // 经营分析 - 销售情况图
  547. initSalesChart() {
  548. const params = {
  549. beginDate: this.getSalesDates[0] || "",
  550. endDate: this.getSalesDates[1] || "",
  551. };
  552. console.log("我要放参数了", params);
  553. getSalesChart(params).then((res) => {
  554. if (res.code === 10000) {
  555. this.salesChartData = res.data;
  556. console.log(this.salesChartData);
  557. }
  558. });
  559. },
  560. // 经营分析 - 成本分析
  561. initCosts() {
  562. getCosts({}).then((res) => {
  563. if (res.code === 10000) {
  564. this.costPieData = [];
  565. res.data.forEach((item) => {
  566. this.costPieData.push({
  567. name: item.costName,
  568. value: item.costRate,
  569. });
  570. });
  571. this.costHisData = [];
  572. res.data.forEach((item) => {
  573. this.costHisData.push(item.costVal);
  574. });
  575. }
  576. });
  577. },
  578. // // 应收排名
  579. // initYingShou() {
  580. // getYingShou({}).then((res) => {
  581. // console.log("应收", res);
  582. // if (res.code === 10000) {
  583. // this.yingshouTableData = res.data;
  584. // }
  585. // });
  586. // },
  587. // 应付排名
  588. initYingFu() {
  589. getYingFu({}).then((res) => {
  590. console.log("应付", res);
  591. if (res.code === 10000) {
  592. this.yingfuTableData = res.data;
  593. }
  594. });
  595. },
  596. // 安全库存报警
  597. initSafeInventory() {
  598. getSafeInventory({
  599. current: this.size,
  600. size: this.pageNum,
  601. }).then((res) => {
  602. console.log(res);
  603. });
  604. },
  605. // 生产情况
  606. initProductionCondition() {
  607. getProductionCondition({}).then((res) => {
  608. console.log(res.data);
  609. if (res.code === 10000) {
  610. this.productionPercents = [
  611. { ...res.data["grice_rate"], color: "rgb(112,249,250)" },
  612. { ...res.data["piglet_rate"], color: "rgb(51, 211, 137)" },
  613. { ...res.data["fatpig_rate"], color: "rgb(255, 125, 0)" },
  614. { ...res.data["break_rate"], color: "rgb(2, 167, 240)" },
  615. // FIXME: 配种分娩率没有,也不能随便放 color: "rgb(112, 0, 217)"
  616. ];
  617. this.productionItems = [
  618. res.data["avg_farrow_1"].stockQuantity,
  619. res.data["avg_farrow_2"].stockQuantity,
  620. res.data["avg_farrow_3"].stockQuantity,
  621. res.data["break_grice"].stockQuantity,
  622. res.data["avg_weight"].stockQuantity,
  623. res.data["avg_weight"].stockQuantity, // FIXME: 没有数据,随便放一个先
  624. res.data["nest_times"].stockQuantity,
  625. res.data["psy"].stockQuantity,
  626. ];
  627. }
  628. });
  629. },
  630. // 重要指标折线图
  631. initImportantData() {
  632. getImportantData({
  633. startDate: this.importantDates[0],
  634. endDate: this.importantDates[1],
  635. type: this.importantValue,
  636. }).then((res) => {
  637. console.log("重要指标数据----------------", res);
  638. });
  639. },
  640. // 重要指标的 type 改变
  641. changeImportantValue() {
  642. this.initImportantData();
  643. },
  644. // 重要指标的时间改变
  645. changeImportantDates() {
  646. this.initImportantData();
  647. },
  648. },
  649. watch: {
  650. getSalesDates(newValue) {
  651. this.getSalesDates = newValue;
  652. this.initSalesChart();
  653. },
  654. },
  655. };
  656. </script>
  657. <style scoped>
  658. .analysis {
  659. width: 100%;
  660. height: 100%;
  661. box-sizing: border-box;
  662. padding: 20px;
  663. }
  664. .table-content {
  665. padding: 10px 15px 12px;
  666. }
  667. /* 成本分析echarts图排列 */
  668. .cost {
  669. border-bottom: 1px solid rgba(228, 228, 228, 1);
  670. position: relative;
  671. }
  672. .cost > .select {
  673. position: absolute;
  674. right: 0;
  675. margin: 20px;
  676. }
  677. .cost-content {
  678. padding-top: 20px;
  679. display: flex;
  680. }
  681. .cost-left {
  682. flex: 1;
  683. }
  684. .cost-right {
  685. flex: 1;
  686. }
  687. .cost > .label {
  688. text-align: center;
  689. font-weight: bold;
  690. font-size: 18px;
  691. }
  692. /* 重要指标 */
  693. .important {
  694. padding: 20px;
  695. position: relative;
  696. border-bottom: 1px solid rgba(228, 228, 228, 1);
  697. }
  698. .important > .condition {
  699. position: absolute;
  700. right: 0;
  701. margin-right: 20px;
  702. }
  703. .important-chart {
  704. margin-top: 20px;
  705. }
  706. /* 销售情况 */
  707. .sales {
  708. padding: 20px;
  709. padding-bottom: 0;
  710. }
  711. .sales-condition {
  712. margin-left: 250px;
  713. }
  714. .sales-content {
  715. padding-top: 20px;
  716. width: 100%;
  717. display: flex;
  718. flex-direction: row;
  719. justify-content: space-around;
  720. }
  721. .sales-left {
  722. width: 15%;
  723. line-height: 25px;
  724. padding-top: 30px;
  725. }
  726. .sales-left > .up {
  727. margin-bottom: 20px;
  728. }
  729. .sales-left > .up > label,
  730. .sales-left > .down > label {
  731. display: block;
  732. text-align: center;
  733. font-size: 13px;
  734. color: #999;
  735. }
  736. .sales-left > .up > span,
  737. .sales-left > .down > span {
  738. display: block;
  739. text-align: center;
  740. font-size: 16px;
  741. color: #333;
  742. }
  743. .sales-left > .up > .sales-change,
  744. .sales-left > .down > .sales-change {
  745. display: flex;
  746. justify-content: space-around;
  747. font-size: 13px;
  748. }
  749. /* 三角形 */
  750. .triangle-change {
  751. display: inline-block;
  752. width: 8px;
  753. height: 8px;
  754. border-style: solid;
  755. border-width: 8px;
  756. margin-right: 20px;
  757. }
  758. .triangle-up {
  759. border-color: transparent transparent rgb(238, 16, 16) transparent;
  760. }
  761. .triangle-down {
  762. border-color: rgb(2, 112, 2) transparent transparent transparent;
  763. position: relative;
  764. top: 7px;
  765. }
  766. .color-up {
  767. color: rgb(238, 16, 16);
  768. }
  769. .color-down {
  770. color: rgb(2, 112, 2);
  771. }
  772. /* 销售情况右侧 */
  773. .sales-right {
  774. width: 85%;
  775. border-left: 1px solid rgba(228, 228, 228, 1);
  776. height: 300px;
  777. }
  778. </style>