BookingView.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549
  1. <script setup lang="ts">
  2. import emitter from '@/utils/bus'
  3. import FilterTags from '@/components/FliterTags'
  4. import TransportMode from '@/components/TransportMode'
  5. import BookingTable from './components/BookingTable'
  6. import DateRange from '@/components/DateRange'
  7. import MoreFilters from '@/components/MoreFilters'
  8. import { ref, reactive } from 'vue'
  9. import { useCalculatingHeight } from '@/hooks/calculatingHeight'
  10. const filterRef: Ref<HTMLElement | null> = ref(null)
  11. const containerHeight = useCalculatingHeight(document.documentElement, 246, [filterRef])
  12. const BookingSearch = ref()
  13. const tableLoadingTableData = ref(false)
  14. let searchTableQeury: any = {}
  15. const filterData = reactive({
  16. filtersTagData: [] as Array<string>,
  17. transportData: [] as Array<string>,
  18. daterangeData: [] as Array<string>,
  19. morefiltersData: [] as Array<string>
  20. })
  21. onMounted(() => {})
  22. const tagsData: any = ref([])
  23. const handleClose = (tag: any) => {
  24. emitter.emit('clearTag', tag)
  25. tagsData.value.splice(tagsData.value.indexOf(tag), 1)
  26. if (tag.includes('Transport')) {
  27. delete searchTableQeury.transport_mode
  28. } else if (tag.includes('ETD')) {
  29. filterData.daterangeData.forEach((item: any, index: any) => {
  30. if (item.includes('ETD')) {
  31. filterData.daterangeData.splice(index, 1)
  32. }
  33. })
  34. delete searchTableQeury.f_etd_start
  35. delete searchTableQeury.f_etd_end
  36. } else if (tag.includes('ETA')) {
  37. filterData.daterangeData.forEach((item: any, index: any) => {
  38. if (item.includes('ETA')) {
  39. filterData.daterangeData.splice(index, 1)
  40. }
  41. })
  42. delete searchTableQeury.m_eta_start
  43. delete searchTableQeury.m_eta_end
  44. } else if (tag.includes('Creation')) {
  45. filterData.daterangeData.forEach((item: any, index: any) => {
  46. if (item.includes('Creation')) {
  47. filterData.daterangeData.splice(index, 1)
  48. }
  49. })
  50. delete searchTableQeury.created_time_start
  51. delete searchTableQeury.created_time_end
  52. } else if (tag.includes('Shippername')) {
  53. delete searchTableQeury.shipper
  54. } else if (tag.includes('Consigneename')) {
  55. delete searchTableQeury.consignee
  56. } else if (tag.includes('Origin Agent')) {
  57. delete searchTableQeury.origin
  58. } else if (tag.includes('Destination Agent')) {
  59. delete searchTableQeury.agent
  60. } else if (tag.includes('Sales')) {
  61. delete searchTableQeury.sales_rep
  62. } else if (tag.includes('Origin')) {
  63. delete searchTableQeury.shipper_city
  64. } else if (tag.includes('Destination')) {
  65. delete searchTableQeury.consignee_city
  66. } else if (tag.includes('Place of Receipt')) {
  67. delete searchTableQeury['place_of_receipt/place_of_receipt_exp']
  68. } else if (tag.includes('Port of Loading')) {
  69. delete searchTableQeury['fport_of_loading_uncode/fport_of_loading_exp']
  70. } else if (tag.includes('Place of delivery')) {
  71. delete searchTableQeury['place_of_delivery/place_of_delivery_exp']
  72. } else if (tag.includes('Vessel')) {
  73. delete searchTableQeury['f_vessel/m_vessel']
  74. } else if (tag.includes('Voyage')) {
  75. delete searchTableQeury['f_voyage/m_voyage']
  76. }
  77. sessionStorage.setItem('searchTableQeury', JSON.stringify(searchTableQeury))
  78. getbookingdata()
  79. }
  80. // 筛选框查询
  81. const FiltersSeach = (val: any, value: any) => {
  82. searchTableQeury[val] = value
  83. sessionStorage.setItem('searchTableQeury', JSON.stringify(searchTableQeury))
  84. getbookingdata()
  85. }
  86. //TransportSearch
  87. const TransportSearch = (val: any) => {
  88. filterData.transportData = []
  89. if (val.data.length != 0) {
  90. let str = `${val.title}:${val.data}`
  91. filterData.transportData.push(str)
  92. }
  93. FiltersSeach('transport_mode', val.data)
  94. renderTagsData()
  95. }
  96. // defaultTransport
  97. const defaultTransport = (val: any, value: any) => {
  98. filterData.transportData = []
  99. if (val.data.length != 0) {
  100. let str = `${val.title}:${val.data}`
  101. filterData.transportData.push(str)
  102. }
  103. if (sessionStorage.getItem('searchTableQeury') == null) {
  104. searchTableQeury.transport_mode = val.data
  105. } else {
  106. searchTableQeury = value
  107. }
  108. renderTagsData()
  109. }
  110. // defaultDate
  111. const defaultDate = (val: any, value: any, data: any) => {
  112. filterData.daterangeData = []
  113. if (Object.keys(val).length) {
  114. for (const key in val) {
  115. let str = `${key}:${val[key]}`
  116. filterData.daterangeData.push(str)
  117. }
  118. }
  119. if (sessionStorage.getItem('searchTableQeury') == null) {
  120. for (const key in value) {
  121. searchTableQeury.f_etd_start = value[key].data[0]
  122. searchTableQeury.f_etd_end = value[key].data[1]
  123. }
  124. } else {
  125. searchTableQeury = data
  126. if (searchTableQeury._textSearch) {
  127. BookingSearch.value = searchTableQeury._textSearch
  128. }
  129. }
  130. getbookingdata()
  131. renderTagsData()
  132. }
  133. //DateRangeSearch
  134. const DateRangeSearch = (val: any, value: any) => {
  135. filterData.daterangeData = []
  136. if (Object.keys(val).length) {
  137. for (const key in val) {
  138. let str = `${key}:${val[key]}`
  139. filterData.daterangeData.push(str)
  140. }
  141. }
  142. if (Object.keys(value).length == 0) {
  143. delete searchTableQeury.f_etd_start
  144. delete searchTableQeury.f_etd_end
  145. delete searchTableQeury.m_eta_start
  146. delete searchTableQeury.m_eta_end
  147. delete searchTableQeury.created_time_start
  148. delete searchTableQeury.created_time_end
  149. }
  150. for (const key in value) {
  151. if (key == 'ETD') {
  152. searchTableQeury.f_etd_start = value[key].data[0]
  153. searchTableQeury.f_etd_end = value[key].data[1]
  154. } else if (key == 'ETA') {
  155. searchTableQeury.m_eta_start = value[key].data[0]
  156. searchTableQeury.m_eta_end = value[key].data[1]
  157. } else {
  158. searchTableQeury.created_time_start = value[key].data[0]
  159. searchTableQeury.created_time_end = value[key].data[1]
  160. }
  161. }
  162. sessionStorage.setItem('searchTableQeury', JSON.stringify(searchTableQeury))
  163. getbookingdata()
  164. renderTagsData()
  165. }
  166. //MoreFiltersSearch
  167. const MoreFiltersSearch = (val: any, value: any) => {
  168. filterData.morefiltersData = []
  169. if (Object.keys(value).length == 0) {
  170. delete searchTableQeury.shipper
  171. delete searchTableQeury.consignee
  172. delete searchTableQeury.origin
  173. delete searchTableQeury.agent
  174. delete searchTableQeury.sales_rep
  175. delete searchTableQeury.shipper_city
  176. delete searchTableQeury.consignee_city
  177. delete searchTableQeury['place_of_receipt/place_of_receipt_exp']
  178. delete searchTableQeury['fport_of_loading_uncode/fport_of_loading_exp']
  179. delete searchTableQeury['place_of_delivery/place_of_delivery_exp']
  180. delete searchTableQeury['f_vessel/m_vessel']
  181. delete searchTableQeury['f_voyage/m_voyage']
  182. }
  183. for (const key in val) {
  184. let str = `${key}:${val[key]}`
  185. filterData.morefiltersData.push(str)
  186. if (key == 'Shippername') {
  187. searchTableQeury.shipper = value[key]
  188. } else if (key == 'Consigneename') {
  189. searchTableQeury.consignee = value[key]
  190. } else if (key == 'Origin Agent') {
  191. searchTableQeury.origin = value[key]
  192. } else if (key == 'Destination Agent') {
  193. searchTableQeury.agent = value[key]
  194. } else if (key == 'Sales') {
  195. searchTableQeury.sales_rep = value[key]
  196. } else if (key == 'Origin') {
  197. searchTableQeury.shipper_city = value[key]
  198. } else if (key == 'Destination') {
  199. searchTableQeury.consignee_city = value[key]
  200. } else if (key == 'Place of Receipt') {
  201. searchTableQeury['place_of_receipt/place_of_receipt_exp'] = value[key]
  202. } else if (key == 'Port of Loading') {
  203. searchTableQeury['fport_of_loading_uncode/fport_of_loading_exp'] = value[key]
  204. } else if (key == 'Place of delivery') {
  205. searchTableQeury['place_of_delivery/place_of_delivery_exp'] = value[key]
  206. } else if (key == 'Vessel') {
  207. searchTableQeury['f_vessel/m_vessel'] = value[key]
  208. } else if (key == 'Voyage') {
  209. searchTableQeury['f_voyage/m_voyage'] = value[key]
  210. }
  211. }
  212. sessionStorage.setItem('searchTableQeury', JSON.stringify(searchTableQeury))
  213. getbookingdata()
  214. renderTagsData()
  215. }
  216. const defaultMorefilters = (val: any, value: any, data: any) => {
  217. filterData.morefiltersData = []
  218. for (const key in val) {
  219. let str = `${key}:${val[key]}`
  220. filterData.morefiltersData.push(str)
  221. if (key == 'Shippername') {
  222. searchTableQeury.shipper = value[key]
  223. } else if (key == 'Consigneename') {
  224. searchTableQeury.consignee = value[key]
  225. } else if (key == 'Origin Agent') {
  226. searchTableQeury.origin = value[key]
  227. } else if (key == 'Destination Agent') {
  228. searchTableQeury.agent = value[key]
  229. } else if (key == 'Sales') {
  230. searchTableQeury.sales_rep = value[key]
  231. } else if (key == 'Origin') {
  232. searchTableQeury.shipper_city = value[key]
  233. } else if (key == 'Destination') {
  234. searchTableQeury.consignee_city = value[key]
  235. } else if (key == 'Place of Receipt') {
  236. searchTableQeury['place_of_receipt/place_of_receipt_exp'] = value[key]
  237. } else if (key == 'Port of Loading') {
  238. searchTableQeury['fport_of_loading_uncode/fport_of_loading_exp'] = value[key]
  239. } else if (key == 'Place of delivery') {
  240. searchTableQeury['place_of_delivery/place_of_delivery_exp'] = value[key]
  241. } else if (key == 'Vessel') {
  242. searchTableQeury['f_vessel/m_vessel'] = value[key]
  243. } else if (key == 'Voyage') {
  244. searchTableQeury['f_voyage/m_voyage'] = value[key]
  245. }
  246. }
  247. if (sessionStorage.getItem('searchTableQeury') != null) {
  248. searchTableQeury = data
  249. }
  250. renderTagsData()
  251. }
  252. const clearfilters = () => {
  253. BookingSearch.value = ''
  254. filterData.filtersTagData = []
  255. tagsData.value = []
  256. let str = 'Shipment status: All'
  257. filterData.filtersTagData.push(str)
  258. filterData.transportData = []
  259. filterData.daterangeData = []
  260. filterData.morefiltersData = []
  261. emitter.emit('clearTag', 'Shipment status')
  262. emitter.emit('clearTag', 'Transport Mode')
  263. emitter.emit('clearTag', 'ETD')
  264. emitter.emit('clearTag', 'ETA')
  265. emitter.emit('clearTag', 'Creation Time')
  266. emitter.emit('clearTag', 'Shippername')
  267. emitter.emit('clearTag', 'Consigneename')
  268. emitter.emit('clearTag', 'Origin Agent')
  269. emitter.emit('clearTag', 'Destination Agent')
  270. emitter.emit('clearTag', 'Sales')
  271. emitter.emit('clearTag', 'Origin')
  272. emitter.emit('clearTag', 'Destination')
  273. emitter.emit('clearTag', 'Place of Receipt')
  274. emitter.emit('clearTag', 'Port of Loading')
  275. emitter.emit('clearTag', 'Place of delivery')
  276. emitter.emit('clearTag', 'Vessel')
  277. emitter.emit('clearTag', 'Voyage')
  278. searchTableQeury = {}
  279. searchTableQeury.filterTag = ['All']
  280. sessionStorage.setItem('searchTableQeury', JSON.stringify(searchTableQeury))
  281. getbookingdata()
  282. renderTagsData()
  283. }
  284. const renderTagsData = () => {
  285. tagsData.value = []
  286. if (filterData.transportData.length) {
  287. tagsData.value.push(filterData.transportData[0])
  288. }
  289. if (filterData.daterangeData.length) {
  290. filterData.daterangeData.forEach((item) => {
  291. tagsData.value.push(item)
  292. })
  293. }
  294. if (filterData.morefiltersData.length) {
  295. filterData.morefiltersData.forEach((item) => {
  296. tagsData.value.push(item)
  297. })
  298. }
  299. if (filterData.filtersTagData.length) {
  300. filterData.filtersTagData.forEach((item) => {
  301. tagsData.value.push(item)
  302. })
  303. }
  304. }
  305. // 清除 Transport Tags
  306. const clearTransportTags = () => {
  307. filterData.transportData = []
  308. }
  309. // 清除 Daterange Tags
  310. const clearDaterangeTags = () => {
  311. filterData.daterangeData = []
  312. }
  313. // 清除 MoreFilters Tags
  314. const clearMoreFiltersTags = () => {
  315. filterData.morefiltersData = []
  316. }
  317. const BookingTable_ref = ref()
  318. const TransportListItem = ref()
  319. interface ListItem {
  320. name: string
  321. number: number
  322. type: string
  323. checked: boolean
  324. }
  325. const TagsList = ref<ListItem[]>([])
  326. const filterTag = ref(['All'])
  327. const isShowAlertIcon = ref(false)
  328. const getbookingdata = () => {
  329. tableLoadingTableData.value = true
  330. BookingTable_ref.value.getLoadingData(tableLoadingTableData.value)
  331. $api
  332. .getBookingTableData({
  333. cp: BookingTable_ref.value.pageInfo.pageNo,
  334. ps: BookingTable_ref.value.pageInfo.pageSize,
  335. rc: -1,
  336. other_filed: '',
  337. ...searchTableQeury
  338. })
  339. .then((res: any) => {
  340. if (res.code === 200) {
  341. TransportListItem.value = res.data.TransportList
  342. TagsList.value = res.data.tagsList
  343. let taglist: any = []
  344. if (Object.keys(filterData.filtersTagData).length == 0) {
  345. TagsList.value.forEach((item: any) => {
  346. if (item.checked == true) {
  347. taglist.push(item.name)
  348. }
  349. })
  350. let str = 'Shipment status: ' + taglist.toString()
  351. filterData.filtersTagData.push(str)
  352. filterData.filtersTagData.forEach((item) => {
  353. tagsData.value.push(item)
  354. })
  355. }
  356. sessionStorage.setItem('BookingData', JSON.stringify(res.data))
  357. BookingTable_ref.value.searchTableData(searchTableQeury)
  358. // 查询没结果的话显示icon
  359. if (BookingSearch.value != '' && BookingSearch.value != undefined) {
  360. if (res.data.searchData.length == 0) {
  361. isShowAlertIcon.value = true
  362. }
  363. } else {
  364. isShowAlertIcon.value = false
  365. }
  366. }
  367. })
  368. }
  369. const changeTag = (val: any, boolean: any) => {
  370. filterData.filtersTagData = []
  371. searchTableQeury.filterTag = val
  372. let str = 'Shipment status: ' + val
  373. filterData.filtersTagData.push(str)
  374. sessionStorage.setItem('searchTableQeury', JSON.stringify(searchTableQeury))
  375. if (boolean) {
  376. getbookingdata()
  377. }
  378. renderTagsData()
  379. filterTag.value = val
  380. }
  381. // 点击search按钮
  382. const SearchInput = () => {
  383. searchTableQeury._textSearch = BookingSearch.value
  384. sessionStorage.setItem('searchTableQeury', JSON.stringify(searchTableQeury))
  385. getbookingdata()
  386. }
  387. </script>
  388. <template>
  389. <div class="Title">Booking</div>
  390. <div class="display" ref="filterRef">
  391. <FilterTags :TagsListItem="TagsList" @changeTag="changeTag"></FilterTags>
  392. <div class="heaer_top">
  393. <div class="search">
  394. <el-input
  395. placeholder="Enter Booking/HBL/PO/Carrier Booking No. "
  396. v-model="BookingSearch"
  397. class="log_input"
  398. @keyup.enter="SearchInput"
  399. >
  400. <template #prefix>
  401. <span class="iconfont_icon">
  402. <svg class="iconfont icon_search" aria-hidden="true">
  403. <use xlink:href="#icon-icon_search_b"></use>
  404. </svg>
  405. </span>
  406. </template>
  407. <template #suffix>
  408. <el-tooltip
  409. v-if="isShowAlertIcon"
  410. :offset="6"
  411. popper-class="ShowAlerIcon"
  412. effect="dark"
  413. content="We support the following references number to find bookings:· Booking No./HAWB No./MAWB No./PO No./Carrier Booking No./Contract No./File No./Quote No."
  414. placement="bottom"
  415. >
  416. <span class="iconfont_icon iconfont_icon_tip">
  417. <svg class="iconfont icon_search" aria-hidden="true">
  418. <use xlink:href="#icon-icon_info_b"></use>
  419. </svg>
  420. </span>
  421. </el-tooltip>
  422. </template>
  423. </el-input>
  424. </div>
  425. <TransportMode
  426. :isShipment="false"
  427. :TransportListItem="TransportListItem"
  428. @TransportSearch="TransportSearch"
  429. @defaultTransport="defaultTransport"
  430. @clearTransportTags="clearTransportTags"
  431. ></TransportMode>
  432. <DateRange
  433. :isShipment="false"
  434. @DateRangeSearch="DateRangeSearch"
  435. @clearDaterangeTags="clearDaterangeTags"
  436. @defaultDate="defaultDate"
  437. ></DateRange>
  438. <MoreFilters
  439. :isShipment="false"
  440. :searchTableQeury="searchTableQeury"
  441. @MoreFiltersSearch="MoreFiltersSearch"
  442. @clearMoreFiltersTags="clearMoreFiltersTags"
  443. @defaultMorefilters="defaultMorefilters"
  444. ></MoreFilters>
  445. <el-button class="el-button--dark" style="margin-left: 8px" @click="SearchInput"
  446. >Search</el-button
  447. >
  448. </div>
  449. <!-- 筛选项 -->
  450. <div class="filtersTag" v-if="tagsData.length">
  451. <el-tag
  452. :key="tag"
  453. class="tag"
  454. v-for="tag in tagsData"
  455. :closable="!tag.includes('Shipment')"
  456. :disable-transitions="false"
  457. @close="handleClose(tag)"
  458. color="#EFEFF0"
  459. >
  460. <el-tooltip
  461. class="box-item"
  462. effect="dark"
  463. :content="tag"
  464. placement="top"
  465. v-if="tag.length > 39"
  466. >
  467. {{ tag.length > 39 ? tag.substr(0, 39) + '...' : tag }}
  468. </el-tooltip>
  469. <div v-else>{{ tag }}</div>
  470. </el-tag>
  471. <div class="text_button" @click="clearfilters">Clear Filters</div>
  472. </div>
  473. </div>
  474. <BookingTable
  475. :height="containerHeight"
  476. :tagsData="tagsData"
  477. ref="BookingTable_ref"
  478. ></BookingTable>
  479. </template>
  480. <style lang="scss" scoped>
  481. .Title {
  482. display: flex;
  483. height: 68px;
  484. border-bottom: 1px solid var(--color-border);
  485. font-size: var(--font-size-6);
  486. font-weight: 700;
  487. padding: 0 24px;
  488. align-items: center;
  489. }
  490. .display {
  491. border: 1px solid var(--color-border);
  492. border-width: 0 0 1px 0;
  493. padding: 0 24px;
  494. }
  495. .heaer_top {
  496. margin-top: 6.57px;
  497. margin-bottom: 8px;
  498. display: flex;
  499. }
  500. .search {
  501. width: 400px;
  502. height: 32px;
  503. }
  504. .filtersTag {
  505. margin-bottom: 8.7px;
  506. display: flex;
  507. align-items: center;
  508. flex-wrap: wrap;
  509. }
  510. .tag {
  511. border-radius: var(--border-radius-22);
  512. margin: 0 8px 8px 0;
  513. color: var(--color-neutral-1);
  514. font-weight: 600;
  515. font-size: var(--font-size-2);
  516. border-color: var(--tag-boder-color);
  517. background-color: var(--tag-bg-color) !important;
  518. }
  519. .iconfont_icon_tip {
  520. margin-left: 8px;
  521. width: 16px;
  522. height: 16px;
  523. display: flex;
  524. align-items: center;
  525. }
  526. .icon_search {
  527. fill: var(--color-neutral-1);
  528. }
  529. @media only screen and (min-width: 1280px) {
  530. .search {
  531. width: 480px;
  532. }
  533. }
  534. @media only screen and (min-width: 1440px) {
  535. .search {
  536. width: 740px;
  537. }
  538. }
  539. :deep(.log_input .el-input__wrapper) {
  540. box-shadow: 0 0 0 1px var(--color-select-border) inset;
  541. border-radius: 6px;
  542. }
  543. </style>