taskInfoTable.vue 15 KB

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