taskInfoTable.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502
  1. <template>
  2. <div>
  3. <el-form ref="form" :model="form">
  4. <!-- 数据表格 -->
  5. <ele-pro-table
  6. ref="table"
  7. :columns="columns"
  8. :datasource="form.datasource"
  9. :needPage="false"
  10. :minHeight="100"
  11. tool-class="ele-toolbar-form"
  12. cache-key="eomContactPageTable"
  13. :summary-method="getSummaries"
  14. show-summary
  15. >
  16. <!-- 表头工具栏 -->
  17. <template v-slot:toolbar>
  18. <el-button
  19. v-if="dialogType !== 'view'"
  20. size="small"
  21. type="primary"
  22. icon="el-icon-plus"
  23. class="ele-btn-icon"
  24. @click="handleAddInfo"
  25. >
  26. 新增
  27. </el-button>
  28. </template>
  29. <template v-slot:action="{ row, $index }" v-if="dialogType !== 'view'">
  30. <el-popconfirm
  31. class="ele-action"
  32. title="确定要删除此信息吗?"
  33. @confirm="handleDelInfo($index)"
  34. >
  35. <template v-slot:reference>
  36. <el-link type="danger" :underline="false" icon="el-icon-delete">
  37. 删除
  38. </el-link>
  39. </template>
  40. </el-popconfirm>
  41. </template>
  42. <template
  43. v-slot:trakNumber="{ row, $index }"
  44. v-if="dialogType !== 'view'"
  45. >
  46. <el-form-item
  47. :prop="'datasource.' + $index + '.trakNumber'"
  48. :rules="{
  49. required: true,
  50. message: '请选择车辆',
  51. trigger: ['blur', 'change']
  52. }"
  53. >
  54. <el-input v-model="row.trakNumber">
  55. <template slot="append">
  56. <el-link
  57. type="primary"
  58. :underline="false"
  59. @click.native="handleCar(row, $index)"
  60. >
  61. 选择</el-link
  62. >
  63. </template>
  64. </el-input>
  65. </el-form-item>
  66. </template>
  67. <template
  68. v-slot:driverName="{ row, $index }"
  69. v-if="dialogType !== 'view'"
  70. >
  71. <el-form-item
  72. :prop="'datasource.' + $index + '.driverName'"
  73. :rules="{
  74. required: false,
  75. message: '请选择司机',
  76. trigger: ['blur', 'change']
  77. }"
  78. >
  79. <el-input v-model="row.driverName">
  80. <template slot="append">
  81. <el-link
  82. type="primary"
  83. :underline="false"
  84. @click.native="handleDriver(row, $index)"
  85. >
  86. 选择</el-link
  87. >
  88. </template>
  89. </el-input>
  90. </el-form-item>
  91. </template>
  92. <template v-slot:phone="{ row, $index }" v-if="dialogType !== 'view'">
  93. <el-form-item
  94. :prop="'datasource.' + $index + '.phone'"
  95. :rules="{
  96. required: false,
  97. message: '请输入司机电话',
  98. trigger: ['blur', 'change']
  99. }"
  100. >
  101. <el-input v-model="row.phone"></el-input>
  102. </el-form-item>
  103. </template>
  104. <template
  105. v-slot:startPlace="{ row, $index }"
  106. v-if="dialogType !== 'view'"
  107. >
  108. <el-form-item
  109. :prop="'datasource.' + $index + '.startPlace'"
  110. :rules="{
  111. required: false,
  112. message: '请输入出发地',
  113. trigger: ['blur', 'change']
  114. }"
  115. >
  116. <el-input v-model="row.startPlace"></el-input>
  117. </el-form-item>
  118. </template>
  119. <template
  120. v-slot:endPlace="{ row, $index }"
  121. v-if="dialogType !== 'view'"
  122. >
  123. <el-form-item
  124. :prop="'datasource.' + $index + '.endPlace'"
  125. :rules="{
  126. required: false,
  127. message: '请输入目的地',
  128. trigger: ['blur', 'change']
  129. }"
  130. >
  131. <el-input v-model="row.endPlace"></el-input>
  132. </el-form-item>
  133. </template>
  134. <template
  135. v-slot:planTimeStart="{ row, $index }"
  136. v-if="dialogType !== 'view'"
  137. >
  138. <el-form-item
  139. :prop="'datasource.' + $index + '.planTimeStart'"
  140. :rules="{
  141. required: false,
  142. message: '请选择发车时间',
  143. trigger: ['blur', 'change']
  144. }"
  145. >
  146. <el-date-picker
  147. v-model="row.planTimeStart"
  148. type="datetime"
  149. @change="
  150. () => handleCheckCarOrDriverIsBusy(row, 'planTimeStart', $index)
  151. "
  152. style="width: 90%"
  153. value-format="yyyy-MM-dd HH:mm:ss"
  154. placeholder="选择日期时间"
  155. >
  156. </el-date-picker>
  157. </el-form-item>
  158. </template>
  159. <template
  160. v-slot:planTimeEnd="{ row, $index }"
  161. v-if="dialogType !== 'view'"
  162. >
  163. <el-form-item
  164. :prop="'datasource.' + $index + '.planTimeEnd'"
  165. :rules="{
  166. required: false,
  167. message: '请选择结束时间',
  168. trigger: ['blur', 'change']
  169. }"
  170. >
  171. <el-date-picker
  172. v-model="row.planTimeEnd"
  173. type="datetime"
  174. @change="
  175. () => handleCheckCarOrDriverIsBusy(row, 'planTimeEnd', $index)
  176. "
  177. style="width: 90%"
  178. value-format="yyyy-MM-dd HH:mm:ss"
  179. placeholder="选择日期时间"
  180. >
  181. </el-date-picker>
  182. </el-form-item>
  183. </template>
  184. <template v-slot:remark="{ row, $index }" v-if="dialogType !== 'view'">
  185. <el-form-item :prop="'datasource.' + $index + '.remark'">
  186. <el-input type="textarea" v-model="row.remark"></el-input>
  187. </el-form-item>
  188. </template>
  189. <template v-slot:cost="{ row, $index }" v-if="dialogType !== 'view'">
  190. <el-form-item :prop="'datasource.' + $index + '.cost'">
  191. <el-input type="number" v-model="row.cost"></el-input>
  192. </el-form-item>
  193. </template>
  194. <!-- <template v-slot:taskType="{row,$index}">
  195. <el-form-item :prop="'datasource.'+$index+'.taskType'"
  196. :rules="{required:false,message:'请选择任务类型',trigger:['blur','change']}">
  197. <DictSelection clearable dictName="派车任务类型" v-model="row.taskType"
  198. :disabled="dialogType==='view'"
  199. disabled
  200. @itemChange="(val)=>handleChangeFinLink(val,row,$index)"></DictSelection>
  201. </el-form-item>
  202. </template> -->
  203. <template v-slot:headerGLLXMC="{ column }">
  204. <span class="is-required">{{ column.label }}</span>
  205. </template>
  206. </ele-pro-table>
  207. </el-form>
  208. <!-- 选择司机 -->
  209. <select-driver-dialog
  210. ref="selectDriverDialogRef"
  211. :selectDriverDialogFlag.sync="selectDriverDialogFlag"
  212. v-if="selectDriverDialogFlag"
  213. @changeParent="getDriverInfo"
  214. ></select-driver-dialog>
  215. <select-car-dialog
  216. ref="selectCarDialogRef"
  217. :selectCarDialogFlag.sync="selectCarDialogFlag"
  218. v-if="selectCarDialogFlag"
  219. @changeParent="getCarInfo"
  220. ></select-car-dialog>
  221. </div>
  222. </template>
  223. <script>
  224. import { checkDriverIsBusyAPI } from '@/api/transportManager/shipManage';
  225. import SelectDriverDialog from '@/views/transportManager/shipManage/dispatchManage/components/selectDriverDialog.vue';
  226. import SelectCarDialog from '@/views/transportManager/shipManage/dispatchManage/components/selectCarDialog.vue';
  227. import { getSummaries } from '@/utils/util.js';
  228. export default {
  229. name: 'relatedInfoTable',
  230. components: { SelectCarDialog, SelectDriverDialog },
  231. props: {
  232. dialogType: {
  233. type: String,
  234. default: ''
  235. }
  236. },
  237. data() {
  238. return {
  239. editIndex: undefined, //当前修改数据的下标
  240. selectDriverDialogFlag: false,
  241. selectCarDialogFlag: false,
  242. form: {
  243. datasource: []
  244. }
  245. };
  246. },
  247. computed: {
  248. columns() {
  249. let list = [
  250. {
  251. columnKey: 'index',
  252. label: '序号',
  253. type: 'index',
  254. width: 55,
  255. align: 'center',
  256. showOverflowTooltip: true,
  257. fixed: 'left'
  258. },
  259. {
  260. prop: 'trakNumber',
  261. label: '车牌号',
  262. align: 'center',
  263. showOverflowTooltip: true,
  264. minWidth: 160,
  265. slot: 'trakNumber',
  266. headerSlot: 'headerGLLXMC'
  267. },
  268. {
  269. prop: 'startPlace',
  270. label: '出发地',
  271. align: 'center',
  272. showOverflowTooltip: true,
  273. minWidth: 120,
  274. slot: 'startPlace'
  275. },
  276. {
  277. prop: 'endPlace',
  278. label: '目的地',
  279. align: 'center',
  280. showOverflowTooltip: true,
  281. minWidth: 120,
  282. slot: 'endPlace'
  283. },
  284. {
  285. prop: 'planTimeStart',
  286. label: '预计发车日期',
  287. align: 'center',
  288. showOverflowTooltip: true,
  289. minWidth: 240,
  290. slot: 'planTimeStart'
  291. },
  292. {
  293. prop: 'planTimeEnd',
  294. label: '预计结束日期',
  295. align: 'center',
  296. showOverflowTooltip: true,
  297. minWidth: 240,
  298. slot: 'planTimeEnd'
  299. },
  300. {
  301. prop: 'driverName',
  302. label: '司机',
  303. align: 'center',
  304. showOverflowTooltip: true,
  305. minWidth: 150,
  306. slot: 'driverName'
  307. },
  308. {
  309. prop: 'phone',
  310. label: '司机电话',
  311. align: 'center',
  312. showOverflowTooltip: true,
  313. minWidth: 120,
  314. slot: 'phone'
  315. },
  316. {
  317. prop: 'cost',
  318. label: '预计费用',
  319. align: 'center',
  320. showOverflowTooltip: true,
  321. minWidth: 120,
  322. slot: 'cost'
  323. },
  324. {
  325. prop: 'remark',
  326. label: '备注',
  327. align: 'center',
  328. showOverflowTooltip: true,
  329. minWidth: 120,
  330. slot: 'remark'
  331. }
  332. ];
  333. let action = [
  334. {
  335. columnKey: 'action',
  336. slot: 'action',
  337. label: '操作',
  338. resizable: false,
  339. width: 80,
  340. align: 'center',
  341. showOverflowTooltip: true,
  342. fixed: 'right'
  343. }
  344. ];
  345. this.dialogType === 'view'
  346. ? (list = [...list])
  347. : (list = [...list, ...action]);
  348. return list;
  349. }
  350. },
  351. methods: {
  352. getSummaries(param) {
  353. return getSummaries(param, 'cost');
  354. },
  355. //新增任务信息数据
  356. handleAddInfo() {
  357. this.form.datasource.push({
  358. driverId: '',
  359. driverName: '',
  360. endPlace: '',
  361. phone: '',
  362. planId: '',
  363. planTimeEnd: '',
  364. planTimeStart: '',
  365. realEntTime: '',
  366. realStartTime: '',
  367. remark: '',
  368. startPlace: '',
  369. trakId: '',
  370. trakNumber: '',
  371. taskId: '',
  372. taskType: '1',
  373. taskCode: '',
  374. cost: ''
  375. });
  376. },
  377. setSelectData(val) {
  378. this.$set(this.form.datasource[this.editIndex], 'taskId', val.id);
  379. this.$set(this.form.datasource[this.editIndex], 'taskCode', val.code);
  380. },
  381. //删除任务信息数据
  382. handleDelInfo(index) {
  383. this.form.datasource.splice(index, 1);
  384. },
  385. //修改任务类型
  386. handleChangeFinLink(val, row, index) {
  387. this.editIndex = index;
  388. this.setSelectData({
  389. id: '',
  390. code: ''
  391. });
  392. this.$nextTick(() => {
  393. this.$refs.form.clearValidate('datasource.' + index + '.taskCode');
  394. });
  395. },
  396. //选择司机
  397. handleDriver(row, index) {
  398. this.editIndex = index;
  399. this.selectDriverDialogFlag = true;
  400. },
  401. //选择司机回调
  402. getDriverInfo(row) {
  403. this.$set(
  404. this.form.datasource[this.editIndex],
  405. 'driverId',
  406. row.driverId
  407. );
  408. this.$set(
  409. this.form.datasource[this.editIndex],
  410. 'driverName',
  411. row.driverName
  412. );
  413. this.$set(this.form.datasource[this.editIndex], 'phone', row.phone);
  414. this.handleCheckCarOrDriverIsBusy(this.form.datasource[this.editIndex]);
  415. },
  416. //选择车辆
  417. handleCar(row, index) {
  418. this.editIndex = index;
  419. this.selectCarDialogFlag = true;
  420. },
  421. //选择车辆回调
  422. getCarInfo(row) {
  423. this.$set(
  424. this.form.datasource[this.editIndex],
  425. 'driverId',
  426. row.defaultDriverId
  427. );
  428. this.$set(
  429. this.form.datasource[this.editIndex],
  430. 'driverName',
  431. row.defaultDriver
  432. );
  433. this.$set(this.form.datasource[this.editIndex], 'phone', row.phone);
  434. this.$set(
  435. this.form.datasource[this.editIndex],
  436. 'trakNumber',
  437. row.trakNumber
  438. );
  439. this.$set(this.form.datasource[this.editIndex], 'trakId', row.id);
  440. this.handleCheckCarOrDriverIsBusy(this.form.datasource[this.editIndex]);
  441. },
  442. //检查车辆或司机是否在运输中
  443. //检查车辆或司机是否在运输中
  444. async handleCheckCarOrDriverIsBusy(row, key, index) {
  445. if (key) {
  446. if (
  447. new Date(row.planTimeEnd).getTime() <=
  448. new Date(row.planTimeStart).getTime()
  449. ) {
  450. this.$message.warning(
  451. key == 'planTimeEnd'
  452. ? '结束时间不能小于发车时间!'
  453. : '发车时间不能大于结束时间!'
  454. );
  455. this.$set(this.form.datasource[index], key, '');
  456. }
  457. }
  458. return;
  459. if (
  460. (row.driverName || row.trakNumber) &&
  461. row.planTimeStart &&
  462. row.planTimeEnd
  463. ) {
  464. let data = await checkDriverIsBusyAPI(row);
  465. console.log(data);
  466. if (data.code == 1) {
  467. this.$message.warning(data.message);
  468. }
  469. }
  470. },
  471. //修改回显
  472. putTableValue(data) {
  473. if (data) {
  474. this.form.datasource = data;
  475. }
  476. },
  477. getTableValue() {
  478. return this.form.datasource;
  479. },
  480. getTableValidate(callback) {
  481. this.$refs.form.validate((valid) => {
  482. callback(valid);
  483. });
  484. }
  485. }
  486. };
  487. </script>
  488. <style scoped lang="scss">
  489. :deep(.el-form-item) {
  490. margin-bottom: 0;
  491. }
  492. </style>