index.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644
  1. <template>
  2. <div>
  3. <basic-container>
  4. <div class="home-container">
  5. <div style="display: flex;justify-content: center;">
  6. <div class="content">
  7. <div class="content-item" @click="handleClick('')">
  8. <div class="card">
  9. <div class="card-title card-title1">
  10. <span>
  11. </span>
  12. </div>
  13. <div class="card-content">
  14. <span class="card-content-num">{{ totalData.all }}</span>
  15. <span class="card-content-text">全部</span>
  16. </div>
  17. </div>
  18. </div>
  19. <div class="divider"/>
  20. <div class="content-item" @click="handleClick('2')">
  21. <div class="card">
  22. <div class="card-title card-title4">
  23. <span>
  24. </span>
  25. </div>
  26. <div class="card-content">
  27. <span class="card-content-num">{{ totalData.two }}</span>
  28. <span class="card-content-text">未受理</span>
  29. </div>
  30. </div>
  31. </div>
  32. <div class="divider"/>
  33. <div class="content-item" @click="handleClick('3')">
  34. <div class="card">
  35. <div class="card-title card-title5">
  36. <span>
  37. </span>
  38. </div>
  39. <div class="card-content">
  40. <span class="card-content-num">{{ totalData.three }}</span>
  41. <span class="card-content-text">未完工</span>
  42. </div>
  43. </div>
  44. </div>
  45. <div class="divider"/>
  46. <div class="content-item" @click="handleClick('4')">
  47. <div class="card">
  48. <div class="card-title card-title6">
  49. <span>
  50. </span>
  51. </div>
  52. <div class="card-content">
  53. <span class="card-content-num">{{ totalData.four }}</span>
  54. <span class="card-content-text">已完工</span>
  55. </div>
  56. </div>
  57. </div>
  58. </div>
  59. </div>
  60. </div>
  61. </basic-container>
  62. <basic-container v-if="key>0">
  63. <avue-crud
  64. :data="goodsList"
  65. :option="goodsOptionCrud"
  66. :table-loading="loading"
  67. :page.sync="page"
  68. ref="crud"
  69. @on-load="onLoad"
  70. @resetColumn="resetColumn"
  71. @saveColumn="saveColumn"
  72. @search-change="searchChange"
  73. @search-criteria-switch="searchCriteriaSwitch"
  74. @row-save="(row,done,loading)=>{rowSave(row,0,done,loading)}"
  75. @row-update="rowSave">
  76. <template slot-scope="{row,index}" slot="menu">
  77. <el-button
  78. type="text"
  79. size="small"
  80. v-if="row.status === 2"
  81. @click="rowSaveT(row,index)"
  82. >{{ row.$cellEdit ? '保 存' : '修 改' }}
  83. </el-button>
  84. <el-button
  85. size="small"
  86. type="text"
  87. @click="designate(row, index)"
  88. v-if="row.status===2"
  89. >受 理
  90. </el-button>
  91. <el-button
  92. size="small"
  93. type="text"
  94. @click="cancelDesignate(row, index)"
  95. v-if="row.status===3"
  96. >取消受理
  97. </el-button>
  98. <el-button
  99. size="small"
  100. type="text"
  101. @click="confirmCompletion(row, index)"
  102. v-if="row.status === 3"
  103. >确认完工
  104. </el-button>
  105. </template>
  106. <template slot="addressDetail" slot-scope="{ row,index}">
  107. <el-tooltip class="item" effect="dark" placement="top">
  108. <div v-html="ToBreak(row.addressDetail)" slot="content"></div>
  109. <div style="overflow: hidden;white-space: nowrap;text-overflow: ellipsis;">{{row.addressDetail}}</div>
  110. </el-tooltip>
  111. </template>
  112. </avue-crud>
  113. </basic-container>
  114. </div>
  115. </template>
  116. <script>
  117. import {
  118. driverQueryCollection,
  119. acceptanceCollection,
  120. acceptanceDispatchCollection,
  121. confirmCompletion,
  122. fleetList, motorcadeDriver, fleetDriverSave
  123. } from "@/api/landTransportation";
  124. export default {
  125. name: "index",
  126. data() {
  127. return {
  128. key:0,
  129. form: {},
  130. loading: false,
  131. activeName:'',
  132. page: {
  133. pageSize: 10,
  134. currentPage: 1,
  135. total: 0,
  136. pageSizes: [10, 50, 100, 200, 300]
  137. },
  138. roleName: localStorage.getItem("roleName").split(',')[0],
  139. goodsList: [],
  140. goodsOptionCrud:{},
  141. optionList: {
  142. stripe:true,
  143. index: true,
  144. addBtn: false,
  145. delBtn: false,
  146. cellBtn: false,
  147. cancelBtn: false,
  148. editBtn: false,
  149. addRowBtn: false,
  150. searchIcon: true,
  151. searchIndex: 2,
  152. searchSpan: 8,
  153. searchMenuPosition: "right",
  154. searchMenuSpan: 6,
  155. align: 'center',
  156. height: "auto",
  157. showSummary: true,
  158. summaryText: "合计",
  159. sumColumnList: [
  160. {
  161. name: 'landWeight',
  162. type: 'sum',
  163. decimals: 6
  164. }, {
  165. name: 'landAmountC',
  166. type: 'sum',
  167. decimals: 2
  168. }, {
  169. name: 'ctnQuantity',
  170. type: 'count'
  171. }],
  172. column: [{
  173. label: '状态',
  174. width: 200,
  175. type: 'select',
  176. overHidden: true,
  177. dicUrl: "/api/blade-system/dict-biz/dictionary?code=land_order_status",
  178. props: {
  179. label: "dictValue",
  180. value: "dictKey"
  181. },
  182. dataType: "string",
  183. prop: 'status'
  184. }, {
  185. label: '车队',
  186. width: 200,
  187. search: true,
  188. overHidden: true,
  189. type: 'select',
  190. cascader: ['plateNo'],
  191. dicUrl: "/api/blade-client/corpsdesc/fleet-list",
  192. props: {
  193. label: "cname",
  194. value: "id"
  195. },
  196. prop: 'fleetId'
  197. },{
  198. label: '提单号',
  199. width: 100,
  200. index: 3,
  201. search: true,
  202. overHidden: true,
  203. prop: 'billNo'
  204. },{
  205. label: '货物名称',
  206. overHidden: true,
  207. width: 160,
  208. search: true,
  209. index: 9,
  210. prop: 'goods'
  211. },{
  212. label: '路线',
  213. index: 14,
  214. width: 160,
  215. search: true,
  216. prop: 'addressDetail'
  217. }, {
  218. label: '尺寸箱型',
  219. width: 100,
  220. search: true,
  221. overHidden: true,
  222. prop: 'ctnType',
  223. type: 'select',
  224. dicUrl: "/api/blade-system/dict-biz/dictionary?code=boxType",
  225. props: {
  226. label: "dictValue",
  227. value: "dictValue"
  228. },
  229. }, {
  230. label: '箱量',
  231. width: 50,
  232. prop: 'ctnQuantity'
  233. }, {
  234. label: '重量',
  235. width: 160,
  236. prop: 'landWeight',
  237. controls: false,
  238. overHidden: true,
  239. precision: 6,
  240. type: 'number'
  241. }, {
  242. label: '车号',
  243. width: 150,
  244. prop: 'vehicleId',
  245. overHidden: true,
  246. type: 'select',
  247. search: true,
  248. dicUrl: "/api/blade-client/land-vehicle/vehicle-list?fleetId={{key}}",
  249. props: {
  250. label: "plateNo",
  251. value: "id"
  252. }
  253. }, {
  254. label: '司机',
  255. width: 115,
  256. search: true,
  257. overHidden: true,
  258. prop: 'driverId',
  259. type: 'select',
  260. dicUrl: "/api/blade-client/land-driver/driver-list?vehicleId={{key}}",
  261. props: {
  262. label: "name",
  263. value: "id"
  264. },
  265. }, {
  266. label: '电话',
  267. width: 160,
  268. overHidden: true,
  269. search: true,
  270. prop: 'tel'
  271. }, {
  272. label: '箱号',
  273. cell: true,
  274. overHidden: true,
  275. search: true,
  276. prop: 'ctnNo'
  277. }, {
  278. label: '场站',
  279. prop: 'station',
  280. overHidden: true,
  281. index: 10,
  282. width: 140,
  283. search: true,
  284. },{
  285. label: '船名航次',
  286. prop: 'factory',
  287. overHidden: true,
  288. index: 13,
  289. width: 140,
  290. search: true,
  291. },{
  292. label: '到厂时间',
  293. prop: 'arrivalTime',
  294. overHidden: true,
  295. type: "date",
  296. searchRange: true,
  297. defaultTime: ['00:00:00', '23:59:59'],
  298. format: "yyyy-MM-dd HH:mm:ss",
  299. valueFormat: "yyyy-MM-dd HH:mm:ss",
  300. index: 11,
  301. width: 140,
  302. search: true,
  303. },{
  304. label: '制单日期',
  305. overHidden: true,
  306. prop: 'createTime',
  307. type: "date",
  308. searchRange: true,
  309. defaultTime: ['00:00:00', '23:59:59'],
  310. format: "yyyy-MM-dd HH:mm:ss",
  311. valueFormat: "yyyy-MM-dd HH:mm:ss",
  312. index: 12,
  313. width: 140,
  314. search: true,
  315. }, {
  316. label: '陆运费(C)',
  317. overHidden: true,
  318. prop: 'landAmountC'
  319. }, {
  320. label: '委托备注',
  321. overHidden: true,
  322. prop: 'remarks'
  323. }, {
  324. label: '车队备注',
  325. overHidden: true,
  326. prop: 'fleetRemarks'
  327. }, {
  328. label: '司机备注',
  329. overHidden: true,
  330. cell: true,
  331. prop: 'driverRemarks'
  332. }
  333. ],
  334. },
  335. totalData:{}
  336. }
  337. },
  338. async created() {
  339. this.goodsOptionCrud = await this.getColumnData(this.getColumnName(88), this.optionList);
  340. this.key++
  341. this.getWorkDicts("order_status").then(res => {
  342. this.findObject(this.goodsOptionCrud.column, "status").dicData =
  343. res.data.data;
  344. });
  345. let i = 0;
  346. this.goodsOptionCrud.column.forEach(item => {
  347. if (item.search) i++
  348. })
  349. if (i % 3 !== 0) {
  350. const num = 3 - Number(i % 3)
  351. this.goodsOptionCrud.searchMenuSpan = num * 8;
  352. this.goodsOptionCrud.searchMenuPosition = "right";
  353. }
  354. },
  355. methods: {
  356. //自定义列保存
  357. async saveColumn() {
  358. /**
  359. * 已定义全局方法,直接使用,saveColumnData保存列数据方法,参数传值(表格名称,当前表格的option数据)
  360. * 已定义全局方法,直接使用,getColumnName方法用来获取枚举值,参数根据自己定义的code值获取中文名
  361. * 一定要执行异步操作,要等接口成功返回,才能执行下一行代码
  362. */
  363. const inSave = await this.saveColumnData(this.getColumnName(88), this.goodsOptionCrud);
  364. if (inSave) {
  365. this.$message.success("保存成功");
  366. //关闭窗口
  367. this.$refs.crud.$refs.dialogColumn.columnBox = false;
  368. }
  369. },
  370. //自定义列重置
  371. async resetColumn() {
  372. this.goodsOptionCrud = this.optionList;
  373. const inSave = await this.delColumnData(this.getColumnName(88), this.optionList);
  374. if (inSave) {
  375. this.$message.success("重置成功");
  376. this.$refs.crud.$refs.dialogColumn.columnBox = false;
  377. }
  378. },
  379. // 获得高度
  380. searchCriteriaSwitch(type) {
  381. if (type) {
  382. this.goodsOptionCrud.height = this.goodsOptionCrud.height - 184
  383. } else {
  384. this.goodsOptionCrud.height = this.goodsOptionCrud.height + 184
  385. }
  386. this.$refs.crud.getTableHeight()
  387. },
  388. //箱信息保存
  389. rowSave(row, index, done, loading) {
  390. done()
  391. },
  392. //箱信息选择车队
  393. getfleetIdT(data, row) {
  394. this.$set(row, 'fleetName', data.cname)
  395. },
  396. //搜索
  397. searchChange(params, done) {
  398. this.onLoad(this.page, params)
  399. done();
  400. },
  401. //切换订单状态
  402. handleClick(tab) {
  403. this.activeName = tab
  404. this.onLoad(this.page)
  405. },
  406. //查询
  407. onLoad(page, params) {
  408. motorcadeDriver(4).then(res=>{
  409. this.totalData = res.data.data
  410. })
  411. let queryParams = {
  412. size: page.pageSize,
  413. current: page.currentPage,
  414. tag: '4',
  415. ...params
  416. }
  417. this.loading = true;
  418. driverQueryCollection(queryParams).then(res => {
  419. this.goodsList = res.data.data.records
  420. this.page.total = res.data.data.total
  421. this.goodsOptionCrud.height = window.innerHeight - 345;
  422. }).finally(() => {
  423. this.loading = false;
  424. })
  425. },
  426. //箱信息保存
  427. rowSaveT(row, index, done, loading) {
  428. if (row.$cellEdit){
  429. fleetDriverSave(row).then(res=>{
  430. this.$message.success("保存成功");
  431. })
  432. }
  433. this.$refs.crud.rowCell(row, index)
  434. },
  435. //箱信息派车
  436. designate(row) {
  437. if (row.ctnNo) {
  438. this.$confirm('是否确定派车', '提示', {
  439. confirmButtonText: '确定',
  440. cancelButtonText: '取消',
  441. type: 'warning'
  442. }).then(() => {
  443. acceptanceCollection(row).then(res => {
  444. this.$message.success('操作成功');
  445. this.onLoad(this.page)
  446. })
  447. }).catch(() => {
  448. this.$message({
  449. type: 'info',
  450. message: '已取消'
  451. });
  452. });
  453. } else {
  454. this.$message.warning('未输入箱号,请输入');
  455. }
  456. },
  457. //取消派车
  458. cancelDesignate(row) {
  459. this.$confirm('是否确定取消派车', '提示', {
  460. confirmButtonText: '确定',
  461. cancelButtonText: '取消',
  462. type: 'warning'
  463. }).then(() => {
  464. acceptanceDispatchCollection({id: row.id}).then(res => {
  465. this.$message.success('操作成功');
  466. this.onLoad(this.page)
  467. })
  468. }).catch(() => {
  469. this.$message({
  470. type: 'info',
  471. message: '已取消'
  472. });
  473. });
  474. },
  475. confirmCompletion(row) {
  476. this.$confirm('是否确定完工', '提示', {
  477. confirmButtonText: '确定',
  478. cancelButtonText: '取消',
  479. type: 'warning'
  480. }).then(() => {
  481. confirmCompletion({id: row.id}).then(res => {
  482. this.$message.success('操作成功');
  483. this.onLoad(this.page)
  484. })
  485. }).catch(() => {
  486. this.$message({
  487. type: 'info',
  488. message: '已取消'
  489. });
  490. });
  491. },
  492. ToBreak (val) {
  493. if (val)return val.replace('\n', '<br/>')
  494. }
  495. }
  496. }
  497. </script>
  498. <style lang="scss" scoped>
  499. .home-container {
  500. padding: 0px 5px 5px 5px;
  501. box-sizing: border-box;
  502. height: 100%;
  503. ::v-deep .el-card__body {
  504. padding: 10px 15px;
  505. font-size: 14px;
  506. }
  507. &__card {
  508. width: 100%;
  509. height: 100%;
  510. }
  511. .title {
  512. display: flex;
  513. justify-content: space-between;
  514. .right {
  515. display: flex;
  516. align-items: center;
  517. &_but {
  518. margin-right: 10px;
  519. border: 1px solid #409eff;
  520. width: 80px;
  521. border-radius: 3px;
  522. display: flex;
  523. &_left {
  524. width: 40px;
  525. text-align: center;
  526. color: #409eff;
  527. cursor: pointer;
  528. }
  529. &_right {
  530. width: 40px;
  531. text-align: center;
  532. color: #409eff;
  533. cursor: pointer;
  534. }
  535. &_active {
  536. color: #fff;
  537. background-color: #409eff;
  538. }
  539. }
  540. }
  541. }
  542. }
  543. .content {
  544. display: flex;
  545. justify-content: center;
  546. align-items: center;
  547. height: 6vh;
  548. width: 80vw;
  549. .divider {
  550. display: block;
  551. height: 0px;
  552. width: 100%;
  553. border-top: 1px dashed #dcdfe6;
  554. }
  555. &-item {
  556. margin-left: 1vw;
  557. .card {
  558. width: 130px;
  559. display: flex;
  560. align-items: center;
  561. &-title {
  562. width: 40px;
  563. height: 40px;
  564. text-align: center;
  565. border-radius: 50%;
  566. font-size: 20px;
  567. font-weight: 600;
  568. display: flex;
  569. justify-content: center;
  570. align-items: center;
  571. span {
  572. line-height: 20px;
  573. }
  574. }
  575. &-title1 {
  576. color: #037fe1;
  577. background-color: rgba(3, 127, 225, 0.15);
  578. }
  579. &-title2 {
  580. color: #ffa21e;
  581. background-color: rgba(255, 162, 30, 0.15);
  582. }
  583. &-title3 {
  584. color: #fb5b60;
  585. background-color: rgba(251, 91, 96, 0.15);
  586. }
  587. &-title4 {
  588. color: #42bc6f;
  589. background-color: rgba(66, 188, 111, 0.15);
  590. }
  591. &-title5 {
  592. color: #14cde1;
  593. background-color: rgba(52, 149, 161, 0.15);
  594. }
  595. &-title6 {
  596. color: rgba(4, 66, 31, 0.63);
  597. background-color: rgba(66, 188, 111, 0.15);
  598. }
  599. &-content {
  600. padding-left: 1vw;
  601. display: flex;
  602. flex-direction: column;
  603. &-num {
  604. font-size: 20px;
  605. font-weight: 600;
  606. }
  607. &-text {
  608. color: #909399;
  609. }
  610. }
  611. }
  612. }
  613. }
  614. </style>