collectData.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616
  1. <template>
  2. <div class="collectData">
  3. <!-- 汇总数据的 nav -->
  4. <div class="box">
  5. <label>区域选择:</label>
  6. <area-zz @getCityCode="getCityCode"></area-zz>
  7. <div class="box_item" v-for="item in boxList" :key="item.id">
  8. <p>{{item.name}}</p>
  9. <p>{{item.value}}</p>
  10. </div>
  11. </div>
  12. <!-- 以下为图表 -->
  13. <div>
  14. <div class="chartDiv">
  15. <div class="title">
  16. <span>母猪总存栏走势</span>
  17. <div class="right">
  18. <el-date-picker
  19. v-model="timeSelected"
  20. v-show="daySelected === 1"
  21. type="daterange"
  22. range-separator="—"
  23. start-placeholder="开始日期"
  24. end-placeholder="结束日期"
  25. @change="onChange"
  26. value-format="yyyy-MM-dd"
  27. size="mini">
  28. </el-date-picker>
  29. <el-date-picker
  30. v-model="monthSelected"
  31. v-show="daySelected === 2"
  32. type="monthrange"
  33. range-separator="至"
  34. start-placeholder="开始月份"
  35. end-placeholder="结束月份"
  36. @change="onChange"
  37. size="mini"
  38. value-format="yyyy-MM">
  39. </el-date-picker>
  40. <div v-show="daySelected === 3">
  41. <el-date-picker
  42. v-model="startYear"
  43. type="year"
  44. placeholder="选择年"
  45. size="mini"
  46. style="width: 100px;"
  47. value-format="yyyy">
  48. </el-date-picker>
  49. -
  50. <el-date-picker
  51. v-model="endYear"
  52. type="year"
  53. placeholder="选择年"
  54. size="mini"
  55. @change="onChange"
  56. style="width: 100px;"
  57. value-format="yyyy">
  58. </el-date-picker>
  59. </div>
  60. </div>
  61. <div class="right">
  62. <span :class="{'scopeEle': true, 'ifScoped': daySelected === 1, 'borderLeft': true}" @click="scopeDay(1)">日</span>
  63. <span :class="{'scopeEle': true, 'ifScoped': daySelected === 2}" @click="scopeDay(2)">月</span>
  64. <span :class="{'scopeEle': true, 'ifScoped': daySelected === 3, 'borderRight': true}" @click="scopeDay(3)">年</span>
  65. </div>
  66. </div>
  67. <line-chart :lineList="lineList"></line-chart>
  68. </div>
  69. <div class="chartDiv">
  70. <div class="title">
  71. <span>各牧场母猪存栏比较</span>
  72. </div>
  73. <his-chart :hisList="hisList"></his-chart>
  74. </div>
  75. <div class="chartDiv">
  76. <div class="title">
  77. <span>牧场排名</span>
  78. </div>
  79. <!-- 查询 -->
  80. <div class="form_item">
  81. <el-form :inline="true" size="mini">
  82. <el-form-item label="母猪存栏:" style="width: 270px">
  83. <el-input style="width: 50px;" v-model="searchForm.pigAllMin"></el-input>
  84. &nbsp;至&nbsp;
  85. <el-input style="width: 50px;" v-model="searchForm.pigAllMax"></el-input>
  86. </el-form-item>
  87. <el-form-item label="母猪新增:" style="width: 270px">
  88. <el-input style="width: 50px;" v-model="searchForm.pigAddMin"></el-input>
  89. &nbsp;至&nbsp;
  90. <el-input style="width: 50px;" v-model="searchForm.pigAddMax"></el-input>
  91. </el-form-item>
  92. <el-form-item label="耳标离线:" style="width: 270px">
  93. <el-input style="width: 50px;" v-model="searchForm.eartagMin"></el-input>
  94. &nbsp;至&nbsp;
  95. <el-input style="width: 50px;" v-model="searchForm.eartagMax"></el-input>
  96. </el-form-item>
  97. <el-form-item label="能繁母猪:" style="width: 270px">
  98. <el-input style="width: 50px;" v-model="searchForm.bearPigMin"></el-input>
  99. &nbsp;至&nbsp;
  100. <el-input style="width: 50px;" v-model="searchForm.bearPigMax"></el-input>
  101. </el-form-item>
  102. <el-form-item>
  103. <el-button type="primary" @click="search">查询</el-button>
  104. </el-form-item>
  105. </el-form>
  106. </div>
  107. <div class="box_table">
  108. <el-table
  109. :data="tableData"
  110. border
  111. stripe
  112. :header-cell-style="{'text-align':'center', 'background-color': '#F9FAFC', 'padding': '5px 0', 'color': '#666666'}"
  113. :cell-style="{'text-align':'center', 'padding': '5px 0'}"
  114. height="700"
  115. row-key="name"
  116. default-expand-all
  117. :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
  118. style="width: 100%;"
  119. @selection-change="selectFarm"
  120. ref="table">
  121. <el-table-column
  122. type="selection"
  123. width="55">
  124. </el-table-column>
  125. <el-table-column
  126. label="牧场名"
  127. prop="farmName">
  128. </el-table-column>
  129. <el-table-column label="母猪存栏">
  130. <el-table-column
  131. label="存栏量"
  132. prop="sowLivestock">
  133. </el-table-column>
  134. <el-table-column
  135. label="省排名"
  136. prop="sowLivestockRank">
  137. </el-table-column>
  138. </el-table-column>
  139. <el-table-column
  140. label="母猪存栏月增长">
  141. <el-table-column
  142. label="存栏月环比增长量"
  143. prop="sowLivestockInc">
  144. </el-table-column>
  145. <el-table-column
  146. label="省排名"
  147. prop="sowLivestockIncRank">
  148. </el-table-column>
  149. </el-table-column>
  150. <el-table-column
  151. label="MSY">
  152. <el-table-column
  153. label="MSY"
  154. prop="sowMsy">
  155. </el-table-column>
  156. <el-table-column
  157. label="省排名"
  158. prop="sowMsyRank">
  159. </el-table-column>
  160. </el-table-column>
  161. <el-table-column
  162. prop="outStockCount"
  163. label="今年累计出栏量">
  164. </el-table-column>
  165. <el-table-column
  166. prop="outStockExpected"
  167. label="预计年出栏量">
  168. </el-table-column>
  169. <el-table-column
  170. prop="ainOutStock"
  171. label="目标年出栏量">
  172. </el-table-column>
  173. <el-table-column
  174. prop="finishPercent"
  175. label="目标完成度">
  176. </el-table-column>
  177. <el-table-column
  178. label="操作"
  179. width="100">
  180. <template slot-scope="scope">
  181. <el-button @click="handleEdit(scope.row)" type="text" size="small">编辑</el-button>
  182. </template>
  183. </el-table-column>
  184. </el-table>
  185. <table-footer
  186. :totals="totalPages"
  187. :size="pageSize"
  188. @sizeChange="sizeChange"
  189. @pageChange="pageChange">
  190. </table-footer>
  191. <!-- 对比框 -->
  192. <div v-show="constrastShow" class="constrast_box">
  193. <el-card style="height: 100%">
  194. <div class="card_title">
  195. <span>对比框({{constrastNum}}/8)</span>
  196. <i class="el-icon-circle-close card_icon" @click="closeConstrast"></i>
  197. </div>
  198. <!-- 被选中的牧场 -->
  199. <div class="card_body">
  200. <ul class="card_ul">
  201. <li
  202. v-for="item in cardFarms"
  203. :key="item.id">
  204. {{ item.farmName }}
  205. </li>
  206. </ul>
  207. </div>
  208. <div class="card_footer">
  209. <el-button plain size="small" @click="handleClear">清 空</el-button>
  210. <el-button type="primary" size="small" @click="handleConstrast">对 比</el-button>
  211. </div>
  212. </el-card>
  213. </div>
  214. </div>
  215. </div>
  216. </div>
  217. <update ref="update" @refreshData="init"></update>
  218. </div>
  219. </template>
  220. <script>
  221. import lineChart from './charts/lineChart.vue'
  222. import hisChart from './charts/hisChart.vue'
  223. import areaZz from '../../components/areaZz.vue'
  224. import TableFooter from "../../components/TableFooter"
  225. import update from './update.vue'
  226. import { mapState, mapMutations } from 'vuex';
  227. export default {
  228. name: "collectData",
  229. data () {
  230. return {
  231. areaSelected: '330000',
  232. boxList: [
  233. {
  234. id: 1,
  235. name: '母猪总存栏',
  236. value: 25000,
  237. },
  238. {
  239. id: 2,
  240. name: '预计年出栏量',
  241. value: 500000
  242. },
  243. {
  244. id: 3,
  245. name: '母猪目标存栏',
  246. value: 40000
  247. },
  248. {
  249. id: 4,
  250. name: '目标年出栏量',
  251. value: 800000
  252. }
  253. ],
  254. daySelected: 1, // 年月日选中值,默认月
  255. timeSelected: '', // 时间选择器选中的时间
  256. monthSelected: '', // 月份选择
  257. startYear: '',
  258. endYear: '',
  259. // 母猪总存栏走势
  260. lineList: [],
  261. // 母猪存栏比较
  262. hisList: [],
  263. searchForm: {
  264. pigAllMin: '', // 母猪存栏
  265. pigAllMax: '',
  266. pigAddMin: '', // 母猪新增
  267. pigAddMax: '',
  268. eartagMin: '', // 耳标离线
  269. eartagMax: '',
  270. bearPigMin: '', // 能繁母猪
  271. bearPigMax: ''
  272. },
  273. tableData: [
  274. {
  275. name: '测试牧场'
  276. }
  277. ],
  278. totalPages: 0,
  279. pageNum: 1,
  280. pageSize: 20,
  281. constrastNum: 0, // 对比框中的牧场数量
  282. constrastShow: false, // 对比框是否显示
  283. cardFarms: []
  284. }
  285. },
  286. computed: {
  287. ...mapState(['selected'])
  288. },
  289. components: {
  290. lineChart,
  291. hisChart,
  292. areaZz,
  293. TableFooter,
  294. update
  295. },
  296. methods: {
  297. ...mapMutations(['updateSelected']),
  298. /* 年月日选择 */
  299. scopeDay (val) {
  300. this.daySelected = val
  301. switch (val) {
  302. case 1: // 日
  303. this.initEchart()
  304. break;
  305. case 2: // 月
  306. this.initEchart()
  307. break;
  308. case 3: // 年
  309. this.initEchart()
  310. break;
  311. default:
  312. break;
  313. }
  314. },
  315. toCollectDay () {
  316. this.$router.push('/collectDay')
  317. },
  318. // 修改size
  319. sizeChange(val) {
  320. this.pageSize = val;
  321. },
  322. // 修改页数
  323. pageChange(val) {
  324. this.pageNum = val;
  325. },
  326. // echarts 图的数据
  327. initEchart () {
  328. let data = {}
  329. if(this.daySelected === 1) {
  330. data = {
  331. regionCode: this.areaSelected,
  332. start: this.timeSelected[0] ? this.timeSelected[0]: '',
  333. end: this.timeSelected[1] ? this.timeSelected[1]: '',
  334. type: this.daySelected
  335. }
  336. } else if(this.daySelected === 2) {
  337. data = {
  338. regionCode: this.areaSelected,
  339. start: this.monthSelected[0] ? this.monthSelected[0] : '',
  340. end: this.monthSelected[1] ? this.monthSelected[1] : '',
  341. type: this.daySelected
  342. }
  343. } else {
  344. data = {
  345. regionCode: this.areaSelected,
  346. start: this.startYear ? this.startYear : '',
  347. end: this.endYear ? this.endYear : '',
  348. type: this.daySelected
  349. }
  350. }
  351. this.$http({
  352. url: this.$http.adornUrl(`http://122.112.224.199:9000/dataAnalysis/getPigStockByRegionCode`),
  353. method: 'post',
  354. data: this.$http.adornData(data)
  355. }).then(res => {
  356. if(res.data.code === 0) {
  357. this.lineList = [res.data.dateList, res.data.stockList];
  358. }
  359. })
  360. },
  361. // 牧场排名的查询
  362. search () {
  363. console.log('查询');
  364. },
  365. // 牧场排名 - 表格
  366. init () {
  367. this.$http({
  368. url: this.$http.adornUrl(`http://122.112.224.199:9500/management/sowranktable/list`),
  369. method: 'get',
  370. data: this.$http.adornData({
  371. 'page': this.pageNum,
  372. 'limit': this.pageSize
  373. })
  374. }).then(({data}) => {
  375. if(data.code === 0) {
  376. this.tableData = data.page.list
  377. } else {
  378. this.hisList = [];
  379. }
  380. })
  381. },
  382. // // 点击表格的某一行
  383. // rowClick (row) {
  384. // console.log(row);
  385. // console.log('点击了某一行');
  386. // },
  387. // 牧场对比
  388. selectFarm (val) {
  389. this.constrastShow = true
  390. this.constrastNum = val.length
  391. this.cardFarms = val
  392. if (this.constrastNum === 0) {
  393. this.constrastShow = false
  394. }
  395. },
  396. // 关闭对比框
  397. closeConstrast () {
  398. this.constrastShow = false
  399. },
  400. // 清空牧场对比
  401. handleClear () {
  402. console.log('清空--------------------');
  403. this.cardFarms = []
  404. this.$refs.table.clearSelection()
  405. },
  406. // 进入 对比页面
  407. handleConstrast () {
  408. this.$router.push({
  409. name: 'collectFarm',
  410. params: {
  411. row: this.cardFarms
  412. }
  413. })
  414. },
  415. // 表格 - 编辑 - 更新数据
  416. handleEdit (row) {
  417. this.$nextTick(() => {
  418. this.$refs.update.init(row)
  419. })
  420. },
  421. // 省市县
  422. getCityCode (val) {
  423. console.log(val);
  424. let len = val.length
  425. this.areaSelected = val[len-1]
  426. this.initCom();
  427. },
  428. onChange() {
  429. if(this.daySelected === 3) {
  430. if(this.startYear > this.endYear) {
  431. this.$message.error('起始年份不能大于终止年份')
  432. this.startYear = '';
  433. this.endYear = '';
  434. return false;
  435. } else {
  436. this.initEchart()
  437. }
  438. } else {
  439. this.initEchart()
  440. }
  441. },
  442. // 存栏比较
  443. initCom() {
  444. let params = {
  445. regionCode: this.areaSelected
  446. }
  447. this.$http({
  448. url: this.$http.adornUrl('http://122.112.224.199:9000/dataAnalysis/childPigStock'),
  449. method: 'get',
  450. params: this.$http.adornParams(params)
  451. })
  452. .then(res => {
  453. if(res.data.code === 0) {
  454. this.hisList = [res.data.regionList, res.data.regionStockList];
  455. } else {
  456. this.hisList = [];
  457. }
  458. })
  459. },
  460. // 跳转
  461. onSelect() {
  462. this.updateSelected(1);
  463. this.$router.push({
  464. path: '/',
  465. query: {farmCode: 'N0003', type: 4}
  466. })
  467. }
  468. },
  469. mounted() {
  470. this.initEchart();
  471. this.initCom();
  472. this.init()
  473. },
  474. }
  475. </script>
  476. <style scoped>
  477. .box {
  478. width: 100%;
  479. height: 140px;
  480. background-color: #F9F9F9;
  481. display: flex;
  482. justify-content: space-around;
  483. align-items: center;
  484. }
  485. /* 汇总数据块的顶栏 */
  486. .box_item {
  487. width: 198px;
  488. height: 78px;
  489. border: 1px solid #ddd;
  490. text-align: center;
  491. }
  492. .box_item p {
  493. height: 39px;
  494. line-height: 39px;
  495. margin: 0;
  496. }
  497. /* 图表结构的大局 */
  498. .chartDiv {
  499. margin: 10px;
  500. margin-top: 20px;
  501. border: 1px solid #ddd;
  502. background-color: #fff;
  503. }
  504. .title {
  505. background-color: rgba(243, 243, 243, 1);
  506. height: 50px;
  507. line-height: 50px;
  508. padding-left: 50px;
  509. font-size: 14px;
  510. border-bottom: 1px solid #ddd;
  511. }
  512. .right {
  513. float: right;
  514. margin-right: 20px;
  515. font-size: 12px;
  516. }
  517. /** 年月日选择 */
  518. .scopeEle {
  519. display: inline-block;
  520. border: 1px solid #ccc;
  521. width: 75px;
  522. text-align: center;
  523. height: 26px;
  524. line-height: 26px;
  525. margin-left: -1px;
  526. cursor: pointer;
  527. background-color: #fff;
  528. }
  529. .borderLeft {
  530. border-radius: 5px 0 0 5px;
  531. }
  532. .borderRight {
  533. border-radius: 0 5px 5px 0 ;
  534. }
  535. /* 如果选中了 */
  536. .ifScoped {
  537. background-color: #1abc9c;
  538. color: #fff;
  539. border: 1px solid #1abc9c;
  540. }
  541. .form_item {
  542. width: 100%;
  543. height: 60px;
  544. background-color: #fff;
  545. border-top: 1px solid #ddd;
  546. border-bottom: 1px solid #ddd;
  547. box-sizing: border-box;
  548. padding: 15px;
  549. margin-top: 15px;
  550. }
  551. .box_table {
  552. width: 100%;
  553. box-sizing: border-box;
  554. margin-top: 15px;
  555. padding-right: 10px;
  556. position: relative;
  557. /*padding: 10px;*/
  558. }
  559. /** 对比框 */
  560. .constrast_box {
  561. width: 220px;
  562. height: 340px;
  563. position: absolute;
  564. right: 50px;
  565. top: 10%;
  566. background-color: #fff;
  567. }
  568. /* 去除 el-card 自带的 padding */
  569. /deep/ .el-card__body {
  570. padding: 0;
  571. }
  572. /* 对比框的 title */
  573. .card_title {
  574. font-weight: 700;
  575. font-size: 17px;
  576. display: flex;
  577. flex-direction: row;
  578. justify-content: space-between;
  579. background-color: #eee;
  580. padding: 15px 20px;
  581. border-bottom: 1px solid #ddd;
  582. }
  583. .card_icon {
  584. cursor: pointer;
  585. }
  586. /* 对比框的 body */
  587. .card_body {
  588. border-bottom: 1px solid #ddd;
  589. height: 200px;
  590. }
  591. .card_ul {
  592. text-decoration: none;
  593. list-style: none;
  594. padding-left: 30px;
  595. }
  596. .card_ul li {
  597. margin-top: 5px;
  598. font-size: 14px;
  599. }
  600. /* 对比框的底部按钮 */
  601. .card_footer {
  602. display: flex;
  603. flex-direction: row;
  604. justify-content: space-around;
  605. padding: 15px 20px;
  606. }
  607. </style>