period.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687
  1. <template>
  2. <div class="bunit">
  3. <el-container>
  4. <el-header>
  5. <div class="rect rect-form">
  6. <el-form
  7. :inline="true"
  8. :model="dataForm"
  9. size="mini">
  10. <el-form-item style="width: 140px">
  11. <el-select
  12. v-model="dataForm.pigstyId"
  13. placeholder="猪舍"
  14. style="width: 100%">
  15. <el-option
  16. v-for="item in phSelectedList"
  17. :key="item.id"
  18. :label="item.number"
  19. :value="item.id">
  20. </el-option>
  21. </el-select>
  22. </el-form-item>
  23. <el-form-item style="width: 140px">
  24. <el-select
  25. v-model="dataForm.unitId"
  26. placeholder="单元"
  27. style="width: 100%"
  28. ref="unit"
  29. @focus="selectFocus('unit')">
  30. <el-option
  31. v-for="item in unitSelectedList"
  32. :key="item.id"
  33. :label="item.number"
  34. :value="item.id">
  35. </el-option>
  36. </el-select>
  37. </el-form-item>
  38. <el-form-item style="width: 180px">
  39. <el-input
  40. v-model="dataForm.key"
  41. placeholder="栏期编号"
  42. clearable>
  43. </el-input>
  44. </el-form-item>
  45. <el-form-item>
  46. <el-button icon="el-icon-search" @click="getDataList()">查 询</el-button>
  47. </el-form-item>
  48. <el-form-item>
  49. <el-button icon="el-icon-circle-close" @click="clearAll()">清 空</el-button>
  50. </el-form-item>
  51. </el-form>
  52. </div>
  53. </el-header>
  54. <el-main>
  55. <div class="rect rect-table">
  56. <!-- 新增 删除按钮 -->
  57. <el-form inline size="mini">
  58. <el-form-item>
  59. <el-button
  60. icon="el-icon-plus"
  61. @click="addOrUpdateHandle()">
  62. 新 增
  63. </el-button>
  64. </el-form-item>
  65. <!-- <el-form-item>
  66. <el-button
  67. icon="el-icon-delete"
  68. type="danger"
  69. @click="deleteHandle()"
  70. :disabled="selectionDataList.length <= 0">
  71. 删 除
  72. </el-button>
  73. </el-form-item> -->
  74. </el-form>
  75. <el-table
  76. height="540"
  77. :data="dataList"
  78. @selection-change="selectionChangeHandle"
  79. v-loading="dataListLoading"
  80. style="width: 100%"
  81. size="mini"
  82. border
  83. stripe
  84. :header-cell-style="{background:'rgb(245,245,245)',color:'#000',height: '45px',fontSize: '13px',fontWeight: 'normal',borderBottom: '1px solid #ccc'}"
  85. :cell-style="{color: '#888',fontSize: '13px'}">
  86. <el-table-column
  87. type="selection"
  88. header-align="center"
  89. align="center"
  90. width="50">
  91. </el-table-column>
  92. <el-table-column
  93. prop="number"
  94. header-align="center"
  95. align="center"
  96. label="栏期编号">
  97. </el-table-column>
  98. <el-table-column
  99. prop="unitName"
  100. header-align="center"
  101. align="center"
  102. label="单元">
  103. </el-table-column>
  104. <el-table-column
  105. prop="pigstyName"
  106. header-align="center"
  107. align="center"
  108. label="猪舍">
  109. </el-table-column>
  110. <!-- <el-table-column
  111. fixed="right"
  112. header-align="center"
  113. align="center"
  114. label="操作">
  115. <template slot-scope="scope">
  116. <el-button
  117. type="text"
  118. size="small"
  119. @click="addOrUpdateHandle(scope.row)">
  120. 修改
  121. </el-button>
  122. <el-button
  123. type="text"
  124. size="small"
  125. @click="deleteHandle(scope.row.id)">
  126. 删除
  127. </el-button>
  128. </template>
  129. </el-table-column> -->
  130. </el-table>
  131. <div class="block">
  132. <el-pagination
  133. @size-change="sizeChangeHandle"
  134. @current-change="currentChangeHandle"
  135. :current-page="pageIndex"
  136. :page-sizes="[10, 20, 30, 50, 100]"
  137. :page-size="pageSize"
  138. layout="total, sizes, prev, pager, next, jumper"
  139. :total="totalPage">
  140. </el-pagination>
  141. </div>
  142. <el-dialog
  143. :title="!form.id ? '新增' : '修改'"
  144. :close-on-click-modal="false"
  145. :visible.sync="visible"
  146. @close="cancel"
  147. width="600px">
  148. <el-form
  149. :model="form"
  150. ref="form"
  151. @keyup.enter.native="formSubmit()"
  152. label-width="80px"
  153. :rules="dataRule"
  154. size="mini"
  155. style="margin-left: 20px;width: 500px">
  156. <!-- <el-form-item label="所属牧场" prop="farmId">
  157. <el-select v-model="form.farmId" placeholder="请选择所属牧场" @change="getPasture" style="width: 100%">
  158. <el-option
  159. v-for="item in farmList"
  160. :key="item.id"
  161. :label="item.name"
  162. :value="item.id">
  163. </el-option>
  164. </el-select>
  165. </el-form-item> -->
  166. <el-form-item label="猪舍" prop="pigstyId">
  167. <el-select
  168. v-model="form.pigstyId"
  169. placeholder="请选择所属猪舍"
  170. style="width: 100%">
  171. <el-option
  172. v-for="item in phSelectedList"
  173. :key="item.id"
  174. :label="item.number"
  175. :value="item.id">
  176. </el-option>
  177. </el-select>
  178. </el-form-item>
  179. <el-form-item label="单元" prop="unitId">
  180. <el-select
  181. v-model="form.unitId"
  182. placeholder="单元"
  183. style="width: 100%"
  184. ref="unitDialog"
  185. @focus="selectFocus()">
  186. <el-option
  187. v-for="item in unitSelectedList"
  188. :key="item.id"
  189. :label="item.number"
  190. :value="item.id">
  191. </el-option>
  192. </el-select>
  193. </el-form-item>
  194. <!-- <el-form-item v-if="this.form.id" label="栏期" prop="number">
  195. <el-input v-model="form.number"></el-input>
  196. </el-form-item> -->
  197. </el-form>
  198. <span slot="footer" class="dialog-footer">
  199. <el-button size="small" @click="cancel">关闭</el-button>
  200. <el-button size="small" type="primary" @click="formSubmit()">确定</el-button>
  201. </span>
  202. </el-dialog>
  203. </div>
  204. </el-main>
  205. </el-container>
  206. </div>
  207. </template>
  208. <script>
  209. export default {
  210. data () {
  211. return {
  212. dataForm: {
  213. key: ''
  214. },
  215. dataList: [
  216. {
  217. id: '',
  218. number: '',
  219. phNumber: '',
  220. name: ''
  221. }
  222. ],
  223. pageIndex: 1,
  224. pageSize: 10,
  225. totalPage: 0,
  226. dataListLoading: false,
  227. selectionDataList: [],
  228. visible: false,
  229. form: {
  230. id: '',
  231. pigstyId: '',
  232. number: '',
  233. unitId: ''
  234. },
  235. pigstyList: [], // 猪舍list
  236. pighouseList: [], // 猪舍list
  237. phSelectedList: [], // 选择过牧场后的猪舍list
  238. unitList: [],
  239. unitSelectedList: [],
  240. dataRule: {
  241. pigstyId: [
  242. { required: true, message: '所属猪舍不能为空', trigger: 'blur' }
  243. ],
  244. // number: [
  245. // { required: true, message: '栏期编号不能为空', trigger: ['blur', 'change'] },
  246. // { type: 'string' , message: '只允许输入中英文、数字、-与_', pattern: /[\w\u4E00-\u9FA5\-]+$/g },
  247. // { min: 1, max: 20, message: '长度在 1 到 20 个字符之间', trigger: ['blur', 'change'] }
  248. // ],
  249. unitId: [
  250. { required: true, message: '单元编号不能为空', trigger: ['blur', 'change'] }
  251. ]
  252. }
  253. }
  254. },
  255. activated () {
  256. this.getDataList()
  257. },
  258. methods: {
  259. // 获取数据列表
  260. getDataList () {
  261. this.dataListLoading = true
  262. this.$http({
  263. url: this.$http.adornUrl('/management/period/list'),
  264. method: 'get',
  265. params: this.$http.adornParams({
  266. page: this.pageIndex,
  267. limit: 10,
  268. keyword: this.dataForm.key || undefined,
  269. pigstyId: this.dataForm.pigstyId || undefined,
  270. unitId: this.dataForm.unitId || undefined
  271. })
  272. }).then(async ({ data }) => {
  273. // 获取所有猪舍
  274. let pighouseResult = await this.$http({
  275. url: this.$http.adornUrl('/management/pigsty/findAll'),
  276. method: 'get',
  277. params: this.$http.adornParams({})
  278. })
  279. pighouseResult.data.all && (this.pigstyList = pighouseResult.data.all)
  280. this.phSelectedList = this.pigstyList
  281. // 获取所有单元
  282. let unitResult = await this.$http({
  283. url: this.$http.adornUrl('/management/unit/findAll'),
  284. method: 'get',
  285. params: this.$http.adornParams({})
  286. })
  287. unitResult.data.all && (this.unitList = unitResult.data.all)
  288. this.unitSelectedList = this.unitList
  289. if (data && data.code === 0) {
  290. this.dataList = data.page.list
  291. this.totalPage = data.page.totalCount
  292. } else {
  293. this.dataList = []
  294. this.totalPage = 0
  295. }
  296. this.dataListLoading = false
  297. })
  298. },
  299. // 点击 单元or栏期的选择框
  300. selectFocus (val) {
  301. let form = val === 'unit'? 'dataForm': 'form'
  302. let unit = val === 'unit'? 'unit': 'unitDialog'
  303. if (!this[form].pigstyId) {
  304. this.$message.error('请先选择猪舍')
  305. setTimeout(() => {
  306. this.$refs[unit].blur()
  307. }, 10)
  308. }
  309. },
  310. // 清空查询内容
  311. clearAll () {
  312. this.dataForm.key = ''
  313. this.dataForm.pigstyId = ''
  314. this.dataForm.unitId = ''
  315. },
  316. // 每页数
  317. sizeChangeHandle (val) {
  318. this.pageSize = val
  319. this.pageIndex = 1
  320. this.getDataList()
  321. },
  322. // 当前页
  323. currentChangeHandle (val) {
  324. this.pageIndex = val
  325. this.getDataList()
  326. },
  327. // // 根据栋舍选择限制栏期
  328. // pigstyChange (val) {
  329. // this.unitSelectedList = this.unitList.filter(item => item.pigstyId === val)
  330. // console.log(this.unitSelectedList);
  331. // // this.periodSelectedList = this.periodList.filter(item => item.pigstyId === val)
  332. // },
  333. // // 需要先选择猪舍,才能选择单元或栏期
  334. // ifPigsty () {
  335. // if (!this.dataForm.pigstyId) {
  336. // this.$message.error('请先选择猪舍')
  337. // this.dataForm.unitId = ''
  338. // }
  339. // },
  340. // // 新增时,需要先选择猪舍,才能选择单元或栏期
  341. // ifUnit() {
  342. // if (!this.form.pigstyId) {
  343. // this.$message.error('请先选择猪舍')
  344. // this.form.unitId = ''
  345. // }
  346. // },
  347. // // 获取到了牧场 → 限制猪舍
  348. // getPasture (val) {
  349. // this.phSelectedList = []
  350. // this.pighouseList.forEach(item => {
  351. // if (item.farmId === val) {
  352. // this.phSelectedList.push(item)
  353. // }
  354. // });
  355. // // 如果已有选中的猪舍,且该猪舍不属于该牧场,则清空猪舍选择
  356. // let i;
  357. // for (i = 0; i < this.phSelectedList.length; i++) {
  358. // let item = this.phSelectedList[i];
  359. // if (item.id === this.form.pigstyId) {
  360. // break
  361. // }
  362. // }
  363. // if (i === this.phSelectedList.length) {
  364. // this.form.pigstyId = ''
  365. // }
  366. // },
  367. // // 获取到猪舍
  368. // getPigsty (val) {
  369. // // → 反向确定牧场
  370. // for (let item of this.pighouseList) {
  371. // if (item.id === val) {
  372. // this.form.farmId = item.farmId
  373. // break
  374. // }
  375. // }
  376. // // → 先获取猪舍,没有确定牧场的情况下,限制猪舍
  377. // this.phSelectedList = []
  378. // this.pighouseList.forEach(item => {
  379. // if (item.farmId === this.form.farmId) {
  380. // this.phSelectedList.push(item)
  381. // }
  382. // });
  383. // },
  384. // 新增 or 修改
  385. addOrUpdateHandle (row) {
  386. // 显示新增 or 修改
  387. this.visible = true
  388. if (row) {
  389. this.form.id = row.id
  390. for (let key of Object.keys(this.form)) {
  391. this.form[key] = row[key]
  392. }
  393. }
  394. this.phSelectedList = this.pigstyList
  395. this.unitSelectedList = this.unitList
  396. // 解决猪舍、牧场已删除,但该页面仍不变问题
  397. // this.$http({
  398. // url: this.$http.adornUrl("/management/farm/findAll"),
  399. // method: "get",
  400. // params: this.$http.adornParams({})
  401. // }).then(async ({ data }) => {
  402. // if (data && data.code === 0) {
  403. // this.farmList = data.all
  404. // // 获取猪舍
  405. // let pighouseResult = await this.$http({
  406. // url: this.$http.adornUrl('/management/pigsty/findAll'),
  407. // method: 'get',
  408. // params: this.$http.adornParams({})
  409. // })
  410. // pighouseResult.data.all && (this.pighouseList = pighouseResult.data.all)
  411. // this.phSelectedList = this.pighouseList
  412. // console.log(this.pighouseList);
  413. // }
  414. // })
  415. },
  416. // 选择n个牧场
  417. selectionChangeHandle (val) {
  418. this.selectionDataList = []
  419. val.forEach(item => {
  420. this.selectionDataList.push(item.id)
  421. });
  422. },
  423. // 删除n个牧场
  424. deleteHandle (id) {
  425. this.$confirm(`确定删除栏期?`, '提示', {
  426. confirmButtonText: '确定',
  427. cancelButtonText: '取消',
  428. type: 'warning'
  429. }).then(() => {
  430. // 删除操作
  431. if (id) {
  432. this.selectionDataList.push(id)
  433. }
  434. if (this.selectionDataList.length <= 0) {
  435. return
  436. }
  437. this.$http({
  438. url: this.$http.adornUrl('/management/period/delete'),
  439. method: 'post',
  440. data: this.$http.adornData(this.selectionDataList, false)
  441. }).then(result => {
  442. console.log(result);
  443. if (result.data.code === 0) {
  444. this.resetForm()
  445. this.$message({
  446. message: '成功删除栏期',
  447. type: 'success',
  448. duration: 1000
  449. })
  450. // pageIndex修正
  451. this.totalPage -= this.selectionDataList.length
  452. let pages = Math.ceil(this.totalPage / this.pageSize)
  453. this.pageIndex = this.pageIndex > pages? pages: this.pageIndex
  454. this.pageIndex = this.pageIndex < 1? pages: this.pageIndex
  455. } else {
  456. this.$message.error('删除栏期失败');
  457. }
  458. this.selectionDataList = []
  459. })
  460. }).catch(() => {})
  461. },
  462. formSubmit () {
  463. if (this.form.id) {
  464. /** 修改 */
  465. this.$refs['form'].validate((valid) => {
  466. if (valid) {
  467. // 进行修改操作
  468. this.$http({
  469. url: this.$http.adornUrl('/management/period/update'),
  470. method: 'post',
  471. data: this.$http.adornData({
  472. id: this.form.id,
  473. farmId: parseInt(this.$cookie.get('formFarmId')),
  474. pigstyId: this.form.pigstyId,
  475. unitId: this.form.unitId,
  476. number: this.form.number
  477. }, false)
  478. }).then(result => {
  479. if (result.data.code === 0) {
  480. this.resetForm();
  481. this.visible = false;
  482. this.$message({
  483. message: '成功修改栏期信息',
  484. type: 'success',
  485. duration: 1000
  486. })
  487. } else {
  488. if (result.data.code === 600) {
  489. let msg = result.data.msg.split('-')
  490. this.$message({
  491. message: `栏期编号 <p style="color:#333; display:inline">${msg[0]}</p> 已经存在!`,
  492. type: "error",
  493. duration: 1000,
  494. dangerouslyUseHTMLString: true
  495. })
  496. return
  497. }
  498. this.$message.error(result.datanmsg);
  499. }
  500. })
  501. }
  502. })
  503. } else {
  504. /** 新增 */
  505. this.$refs['form'].validate((valid) => {
  506. if (valid) {
  507. // 进行新增操作
  508. this.$http({
  509. url: this.$http.adornUrl('/management/period/save'),
  510. method: 'post',
  511. data: this.$http.adornData({
  512. farmId:parseInt(this.$cookie.get('formFarmId')),
  513. unitId: this.form.unitId,
  514. pigstyId: this.form.pigstyId
  515. }, false)
  516. }).then(result => {
  517. if (result.data.code === 0) {
  518. // 新增pageIndex的修正
  519. this.totalPage++
  520. let pages = Math.ceil(this.totalPage / this.pageSize)
  521. this.pageIndex = this.pageIndex < pages? pages: this.pageIndex
  522. this.resetForm();
  523. this.visible = false;
  524. this.$message({
  525. message: '成功添加栏期',
  526. type: 'success',
  527. duration: 1000
  528. })
  529. } else {
  530. if (result.data.code === 600) {
  531. let msg = result.data.msg.split('-')
  532. this.$message({
  533. message: `栏期编号 <p style="color:#333; display:inline">${msg[0]}</p> 已经存在!`,
  534. type: "error",
  535. duration: 1000,
  536. dangerouslyUseHTMLString: true
  537. })
  538. return
  539. }
  540. this.$message.error(result.data.msg);
  541. }
  542. })
  543. }
  544. })
  545. }
  546. },
  547. // 清空form
  548. resetForm () {
  549. for (let i in this.form) {
  550. this.form[i] = ''
  551. }
  552. this.getDataList()
  553. },
  554. // 取消
  555. cancel () {
  556. this.visible = false
  557. // 如果新增,则不保留form
  558. if (this.form.id) {
  559. this.resetForm()
  560. }
  561. },
  562. // 校验输入是否完整
  563. validComplete (val) {
  564. val && (delete this.form.id)
  565. console.log(this.form);
  566. for (let i in this.form) {
  567. if (!this.form[i].toString()) {
  568. return false
  569. }
  570. }
  571. return true
  572. },
  573. // 如不完整,则提示
  574. confirmComplete (val) {
  575. if (this.validComplete(val)) {
  576. return true
  577. }
  578. this.$confirm(`请输入完整`, '提示', {
  579. confirmButtonText: '确定',
  580. cancelButtonText: '取消',
  581. type: 'warning'
  582. }).then(() => {
  583. console.log('牧场输入不完整')
  584. }).catch(() => {})
  585. return false
  586. },
  587. // 校验输入是否合法,此处只校验单元序号
  588. validInput () {
  589. // 只允许中文、英文、数字、-、_的输入,取反
  590. const reg = /[^\a-\z\A-\Z0-9\u4E00-\u9FA5\_\-]/g
  591. if (reg.test(this.form.number)) {
  592. return false
  593. }
  594. return true
  595. },
  596. // 如不合法,则提示
  597. confirmInput () {
  598. if (this.validInput()) {
  599. return true
  600. }
  601. this.$confirm(`只允许输入中英文、数字、-与_`, '提示', {
  602. confirmButtonText: '确定',
  603. cancelButtonText: '取消',
  604. type: 'warning'
  605. }).then(() => {
  606. console.log('单元序号输入不合法')
  607. }).catch(() => {})
  608. return false
  609. },
  610. getchange (val) {
  611. console.log(val);
  612. }
  613. },
  614. watch: {
  615. 'dataForm.pigstyId': {
  616. handler(newValue, oldValue) {
  617. if (oldValue) {
  618. this.dataForm.unitId = ''
  619. }
  620. this.unitSelectedList = this.unitList.filter(item => item.pigstyId === newValue)
  621. }
  622. },
  623. 'form.pigstyId': {
  624. handler (newValue, oldValue) {
  625. if (oldValue) {
  626. this.form.unitId = ''
  627. }
  628. this.unitSelectedList = this.unitList.filter(item => item.pigstyId === newValue)
  629. }
  630. }
  631. }
  632. }
  633. </script>
  634. <style scoped>
  635. .rect {
  636. background-color: #fff;
  637. padding: 30px 15px;
  638. border-radius: 5px;
  639. border: 1px solid #e8e8e8;
  640. }
  641. .rect-form {
  642. padding-bottom: 10px;
  643. }
  644. .rect-table {
  645. margin-top: 20px;
  646. }
  647. .demo-table-expand {
  648. font-size: 0;
  649. margin-left: 40px;
  650. }
  651. .demo-table-expand label {
  652. width: 90px;
  653. color: #99a9bf;
  654. }
  655. .demo-table-expand .el-form-item {
  656. margin-right: 0;
  657. margin-bottom: 0;
  658. width: 80%;
  659. }
  660. .el-table .height {
  661. background: rgba(254, 254, 254, 0.5);
  662. }
  663. /deep/ .el-table--mini td, .el-table--mini th {
  664. padding: 3px 0 !important;
  665. height: 20px !important;
  666. }
  667. /deep/ .el-checkbox__input.is-checked+.el-checkbox__label {
  668. color: rgb(24,144,255);
  669. background-color: rgb(24,144,255);
  670. border-color: rgb(24,144,255);
  671. }
  672. /deep/.el-table .el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner {
  673. background-color: rgb(24,144,255);
  674. border-color: rgb(24,144,255);
  675. }
  676. /deep/.el-table .el-checkbox__inner:hover {
  677. border-color: rgb(24,144,255);
  678. }
  679. /deep/.el-table .el-checkbox__input.is-focus .el-checkbox__inner {
  680. border-color: rgb(24,144,255);
  681. }
  682. /deep/.el-table #select .cell .el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner {
  683. background-color: rgb(24,144,255);
  684. border-color: rgb(24,144,255);
  685. }
  686. </style>