船期维护

master
sunzehua 9 months ago
parent 458d85d8ed
commit b35d85d615

@ -414,6 +414,14 @@ export function SaveDetai1Container(parameter) {
})
}
export function GenShareLink(parameter) {
return axios({
url: '/TaskManageRollingNomination/GenShareLink',
method: 'post',
data: parameter
})
}
export function PushShareLink(parameter) {
return axios({
url: '/TaskManageRollingNomination/PushShareLink',
@ -421,3 +429,27 @@ export function PushShareLink(parameter) {
data: parameter
})
}
export function shareGetinfo(parameter) {
return axios({
url: '/TaskManageShareLink/GetInfo',
method: 'get',
params: parameter
})
}
export function PushShareLinkFeedBack(parameter) {
return axios({
url: '/TaskManageShareLink/PushShareLinkFeedBack',
method: 'post',
data: parameter
})
}
export function GetUserFeedBack(parameter) {
return axios({
url: '/TaskManageRollingNomination/GetUserFeedBack',
method: 'post',
params: parameter
})
}

@ -0,0 +1,239 @@
<template>
<a-popover v-model="visible" placement="bottom" trigger="click">
<template slot="content">
<div class="box">
<div class="s-tool-column-header s-tool-column-item fiex-top" style="height: 30px;">
<a-checkbox :indeterminate="indeterminate" :checked="checkAll" @change="onCheckAllChange">
</a-checkbox>
<a-input
@change="handleSearch"
size="small"
allowClear
v-model="search"
style="width: 100px;margin-right: 10px;" />
<a @click="reset"></a>
</div>
<div class="line"></div>
<div class="ant-checkbox-group">
<div>
<draggable v-model="columnsSetting" animation="300">
<div
class="s-tool-column-item"
v-for="item in columnsSetting"
:key="`${item.title}tableColumnSetting`"
v-show="item.show">
<div class="s-tool-column-handle">
<a-icon type="more" />
<a-icon type="more" />
<!-- <a-icon type="fullscreen" /> -->
</div>
<a-checkbox v-model="item.checked" @change="onChange">{{ item.title }}</a-checkbox>
</div>
</draggable>
</div>
</div>
<div class="fiex-down">
<a-button type="primary" size="small" style="margin-right: 15px;" @click="handleSure"></a-button>
<a-button type="danger" size="small" @click="visible = false">关闭</a-button>
</div>
</div>
</template>
<span class="tab-btn">
<a-icon type="setting" :style="{ fontSize: '14px' }" />
</span>
</a-popover>
</template>
<script>
import draggable from 'vuedraggable'
export default {
props: {
columnsAll: {
type: Array,
default: () => []
},
columns: {
type: Array,
default: () => []
}
},
components: {
draggable
},
data() {
return {
indeterminate: false,
checkAll: true,
visible: false,
search: '',
columnsSetting: [],
originColumns: [],
oldColumnsAll: [],
columnsAllSearch: []
}
},
watch: {
columns: {
deep: true,
handler(nD, oD) {
this.columnsAll.forEach(item => {
item.checked = false
item.sortIndex = 999
item.show = true
nD.forEach((ite, index) => {
if (item.field) {
if (item.field === ite.field) {
item.checked = true
item.sortIndex = index
}
}
})
})
this.oldColumnsAll = JSON.parse(JSON.stringify(this.columnsAll))
this.columnsAll = this.columnsAll.sort(this.topSort)
this.columnsSetting = this.columnsAll.map(value => ({
...value,
checked: value.checked === undefined || value.checked
}))
this.columnsAllSearch = JSON.parse(JSON.stringify(this.columnsSetting))
}
}
},
methods: {
reset() {
this.columnsSetting = this.columnsAllSearch.map(value => ({
...value,
checked: value.checked
}))
},
topSort(a, b) {
return Number(a.sortIndex) - Number(b.sortIndex);
},
onChange() {
const checkedList = this.columnsSetting.filter(value => value.checked)
this.indeterminate = !!checkedList.length && checkedList.length < this.columnsSetting.length
this.checkAll = checkedList.length === this.columnsSetting.length
},
handleSure() {
const arr = []
this.columnsSetting.forEach(item => {
if (item.checked) {
arr.push(item)
}
})
this.$emit('columnChange', arr)
this.visible = false
},
handleSearch(val) {
if (this.search) {
this.columnsSetting.forEach(item => {
item.show = false
if (item.title.includes(this.search)) {
item.show = true
}
})
this.$forceUpdate()
} else {
this.columnsSetting.forEach(item => {
item.show = true
})
this.$forceUpdate()
}
},
onCheckAllChange(e) {
const val = e.target.checked
Object.assign(this, {
indeterminate: false,
checkAll: val,
columnsSetting: this.columnsAll.map(value => ({ ...value, checked: val }))
})
}
},
mounted() {
}
}
</script>
<style lang="less" scoped>
.fiex-top {
position: sticky;
top: 0;
background-color: white;
z-index: 99;
}
.tab-btn {
padding: 6px 9px;
border: 1px solid #c7c7c9;
background: #f9fafe;
border-radius: 2px;
margin-right: 10px;
cursor: pointer;
-webkit-box-shadow: 0 2px 0 rgba(0, 0, 0, 0.02);
box-shadow: 0 2px 0 rgba(0, 0, 0, 0.02);
-webkit-user-select: 0 2px 0 rgba(0, 0, 0, 0.02);
}
.fiex-down {
position: sticky;
bottom: 0;
background-color: white;
z-index: 99;
padding-top: 10px;
display: flex;
justify-content: center;
}
.tab-btn:hover {
border-color: @primary-color;
color: @primary-color;
transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
}
.box {
max-height: 300px;
overflow-y: scroll;
}
.line {
margin: 10px 0;
height: 1px;
background: #eee;
transform: scaleY(0.5);
}
.s-tool-column-item {
height: 24px;
}
.s-tool-column {
min-width: 140px;
a {
float: right;
}
}
.s-tool-column-handle {
display: inline-block;
width: 20px;
text-align: left;
margin-left: -5px;
margin-right: 5px;
.anticon-more {
display: inline-block;
width: 8px;
text-align: center;
overflow: hidden;
color: #999;
}
.anticon-fullscreen {
transform: rotate(45deg) scale(0.7);
display: inline-block;
color: #999;
}
}
</style>

@ -4,7 +4,9 @@ import { sysDictTypeTree } from '@/api/modular/system/dictManage'
import { sysMenuChange } from '@/api/modular/system/menuManage'
import { ACCESS_TOKEN, ALL_APPS_MENU, DICT_TYPE_TREE_DATA, NOTICE_RECEIVED } from '@/store/mutation-types'
import { sysFileInfoPreview } from '@/api/modular/system/fileManage'
import { getVesselInfoService } from '@/api/modular/main/BookingLedger'
import { unReadNotice } from '@/api/modular/system/noticeReceivedManage'
import moment from 'moment'
import { welcome, dateFormat } from '@/utils/util'
import store from '../index'
import router from '../../router'
@ -213,6 +215,23 @@ const user = {
})
},
getVesselinfo() {
const etdStart = moment().subtract(3, 'days').format('YYYY-MM-DD');
const etdEnd = moment().add(3, 'days').format('YYYY-MM-DD');
const query = {
sortField: 'etd',
descSort: true,
etdStart: etdStart,
etdEnd: etdEnd,
limit: 1000
}
getVesselInfoService(query).then(res => {
if (res.success) {
localStorage.setItem('vesselInfo', JSON.stringify(res.data))
}
})
},
// 加载所有字典数据
dictTypeData() {
return new Promise((resolve, reject) => {

@ -48,39 +48,39 @@ class SocketConnection extends EventEmitter {
async start(token) {
// 组件重新加载时, 如果 socket 存在, 不需要新建
// if (!this.socket) {
// this.socket = new SignalR.HubConnectionBuilder()
// .configureLogging(SignalR.LogLevel.Information)
// .withUrl(`/hubs/chathub`, {
// accessTokenFactory: () => token,
// skipNegotiation: true,
// transport: SignalR.HttpTransportType.WebSockets
// })
// .build()
// this.socket.on('ForceExist', () => {
// //可以做相关业务逻辑
// store
// .dispatch('Logout')
// .then(() => {
// window.location.reload()
// })
// .catch(err => {
// this.$message.error({
// title: '错误',
// description: err.message
// })
// })
// })
// this.socket.on('AppendNotice', notice => {
// store.commit('APPEND_NOTICE', notice)
// })
// this.socket.onclose(async () => {
// this.offline = true
// this.emit('onclose')
// await this._initialize()
// })
// await this._initialize()
// }
if (!this.socket) {
this.socket = new SignalR.HubConnectionBuilder()
.configureLogging(SignalR.LogLevel.Information)
.withUrl(`/hubs/chathub`, {
accessTokenFactory: () => token,
skipNegotiation: true,
transport: SignalR.HttpTransportType.WebSockets
})
.build()
this.socket.on('ForceExist', () => {
store
.dispatch('Logout')
.then(() => {
window.location.reload()
})
.catch(err => {
this.$message.error({
title: '错误',
description: err.message
})
})
})
this.socket.on('NotifyVesselChange', () => {
store.dispatch('getVesselinfo')
})
this.socket.onclose(async () => {
this.offline = true
this.emit('onclose')
await this._initialize()
})
await this._initialize()
}
}
async authenticate(token) {

@ -120,7 +120,7 @@
ref="iframe"
@load="handleIframeLoad"
style="width: 100%;height: 1400px;"
src="http://localhost:8080/#/index"
src="http://60.209.125.238:35103/#/index"
frameborder="0"></iframe>
</div>
</div>
@ -1833,8 +1833,19 @@ export default {
return diffRes;
},
refreshPage() {
this.init()
this.$refs.rightContent.init()
if (this.feeShow) {
const mapFrame = this.$refs['iframe']
const iframeWin = mapFrame.contentWindow
iframeWin.postMessage(
{
id: this.bookingDetails.id,
type: 'empty'
}, '*')
}
setTimeout(() => {
this.init()
this.$refs.rightContent.init()
}, 100);
},
getRules(data) {
const { rows, type } = data

@ -2159,7 +2159,7 @@ export default {
.left {
text-align: left;
width: 660px;
width: 715px;
float: left;
.btn {

@ -1310,7 +1310,7 @@ const formInitData = [
{ title: '订舱编号', align: 'center', width: '90', label: 'CUSTNO', type: 'input' },
{ title: '开船日期', align: 'center', width: 160, label: 'ETD', type: 'dateRange', resLabel: ['BETD', 'EETD'] },
{ title: '实际开船日期', align: 'center', width: 160, label: 'ATD', type: 'dateRange', resLabel: ['BATD', 'EATD'] },
{ title: '船名', align: 'center', width: '90', label: 'VESSEL', type: 'input' }
{ title: '船名', align: 'center', width: '90', label: 'VESSEL', type: 'select' }
]
export default {
name: 'BookingLedger',
@ -2176,6 +2176,9 @@ export default {
const moreData = []
arr.map((item, index) => {
this.formAllData.map((fitem, findex) => {
if (fitem.label === 'VESSEL') {
fitem.type = 'select'
}
if (fitem.label === item) {
nowData.push(fitem)
}
@ -3252,7 +3255,7 @@ export default {
}
} else if (form.label === 'VESSEL') {
const etdStart = moment().subtract(3, 'days').format('YYYY-MM-DD');
const etdEnd = moment().add(7, 'days').format('YYYY-MM-DD');
const etdEnd = moment().add(3, 'days').format('YYYY-MM-DD');
query = {
KeyWord: value,
sortField: 'etd',

@ -144,13 +144,11 @@
</div>
</template>
<template #tools>
<div class="right BookTopButton">
<div class="right BookTopButton" >
<span class="tab-btn" @click="tableRefreshFirst">
<a-icon type="redo" :style="{ fontSize: '14px', transform: 'rotate(278deg)' }" />
</span>
<span class="tab-btn" @click="tableHeaderEdit">
<a-icon type="setting" :style="{ fontSize: '14px' }" />
</span>
<tableSort @columnChange="handleColumnChange" :columns="formTableData" :columnsAll="fromTableAllData"></tableSort>
</div>
</template>
</vxe-toolbar>
@ -345,19 +343,13 @@
</template>
<template #txxp="{ row }">
<div style="display: flex;align-items: center;">
<span
style="margin-right: 10px;cursor: pointer;color: #36cfc9;"
class="iconfont icon-dayinxiaopiao"
@click="TxxpLink(row)"></span>
<span style="margin-right: 10px;cursor: pointer;color: #36cfc9;" class="iconfont icon-dayinxiaopiao" @click="TxxpLink(row)"></span>
<div v-if="row.extendState" style="display: flex;align-items: center;">
<div>
<div>{{ row.extendState.txxpBeginTime.substring(0, 16) }}</div>
<div>{{ row.extendState.txxpEndTime.substring(0, 16) }}</div>
<div>{{ row.extendState.txxpBeginTime.substring(0,16) }}</div>
<div>{{ row.extendState.txxpEndTime.substring(0,16) }}</div>
</div>
<div
v-if="row.extendState.txxpPdfUrl"
@click="handleLookPdf(row)"
style="cursor: pointer;color: #36cfc9;margin-left:10px;">查看</div>
<div v-if="row.extendState.txxpPdfUrl" @click="handleLookPdf(row)" style="cursor: pointer;color: #36cfc9;margin-left:10px;"></div>
</div>
</div>
</template>
@ -1263,10 +1255,13 @@
<script>
import { XCard, setFormModel } from '@/components'
import columnSetting from '@/components/tableColumnSetting'
import tableSort from '@/components/tableSort'
import formLabel from './modules/formLabel'
import importBc from './modules/importBc'
import moment from 'moment'
import importBcMore from './modules/importBcMore'
import {
PageDataByBooking,
SendTrace,
getVesselInfoService,
GetPortlist,
@ -1302,8 +1297,7 @@ import {
CancelServiceStatusByList,
SaveServiceStatusByList,
BachUpdateShipagency,
TxxpLink,
PageDataNew
TxxpLink
} from '@/api/modular/main/BookingLedger'
import initData from './modules/initData'
@ -1326,7 +1320,8 @@ export default {
setFormModel,
formLabel,
importBc,
importBcMore
importBcMore,
tableSort
},
data() {
return {
@ -1393,10 +1388,10 @@ export default {
pageSize: 20,
pageSizes: [10, 20, 50, 100, 200, 500]
},
columns: [],
columns: JSON.parse(JSON.stringify(initData.columns)),
data: []
},
formTableData: JSON.parse(JSON.stringify(initData.columns)),
formTableData: [],
fromTableAllData: null,
formMoreTableData: null,
addVisible: false,
@ -1446,8 +1441,7 @@ export default {
txxpLoading: false,
txxpFlag: false,
formatPdf: '',
formatFlag: false,
showLabel: []
formatFlag: false
}
},
computed: {
@ -1501,11 +1495,6 @@ export default {
},
created() {
this.createdInit()
if (localStorage.getItem('formTableData')) {
this.gridOptions.columns = JSON.parse(localStorage.getItem('formTableData'));
} else {
this.gridOptions.columns = JSON.parse(JSON.stringify(initData.columns))
}
},
mounted() {
this.onresize()
@ -1567,13 +1556,7 @@ export default {
this.bcObj = {}
},
getListByone(listId, listIndex) {
const showArr = []
this.showLabel.forEach(item => {
if (item.field) {
showArr.push(item.field)
}
})
PageDataNew({ id: listId, showColumns: showArr }).then(res => {
PageDataByBooking({ id: listId }).then(res => {
const item = res.data.items[0]
const bookstatus = [
{ staCode: 'sta_cangdan', isChecked: false },
@ -1699,13 +1682,7 @@ export default {
SaveServiceStatusByList(data).then(res => {
if (res.code === 200) {
this.$message.success(res.data.msg)
const showArr = []
this.showLabel.forEach(item => {
if (item.field) {
showArr.push(item.field)
}
})
PageDataNew({ id: row.id, showColumns: showArr }).then(ress => {
PageDataByBooking({ id: row.id }).then(ress => {
const itme = ress.data.items[0]
row.bsstatusname = itme.bsstatusname
row.serviceLoad = false
@ -1716,6 +1693,11 @@ export default {
}
})
},
handleColumnChange(list) {
this.gridOptions.columns = JSON.parse(JSON.stringify(list))
this.$refs.setTableForm.handleCancel()
this.editColumnsSave(this.gridOptions.columns)
},
handleCancelService(row) {
const data = {
bookingId: row.id,
@ -1725,13 +1707,7 @@ export default {
CancelServiceStatusByList(data).then(res => {
if (res.code === 200) {
this.$message.success(res.data.msg)
const showArr = []
this.showLabel.forEach(item => {
if (item.field) {
showArr.push(item.field)
}
})
PageDataNew({ id: row.id, showColumns: showArr }).then(ress => {
PageDataByBooking({ id: row.id }).then(ress => {
const itme = ress.data.items[0]
row.bsstatusname = itme.bsstatusname
row.serviceLoad = false
@ -1753,13 +1729,7 @@ export default {
SaveServiceStatusByList(data).then(res => {
if (res.code === 200) {
this.$message.success(res.data.msg)
const showArr = []
this.showLabel.forEach(item => {
if (item.field) {
showArr.push(item.field)
}
})
PageDataNew({ id: this.editRow.id, showColumns: showArr }).then(ress => {
PageDataByBooking({ id: this.editRow.id }).then(ress => {
const itme = ress.data.items[0]
this.editRow.bsstatusname = itme.bsstatusname
})
@ -1778,13 +1748,7 @@ export default {
CancelServiceStatusByList(data).then(res => {
if (res.code === 200) {
this.$message.success(res.data.msg)
const showArr = []
this.showLabel.forEach(item => {
if (item.field) {
showArr.push(item.field)
}
})
PageDataNew({ id: this.editRow.id, showColumns: showArr }).then(ress => {
PageDataByBooking({ id: this.editRow.id }).then(ress => {
const itme = ress.data.items[0]
this.editRow.bsstatusname = itme.bsstatusname
})
@ -2033,17 +1997,17 @@ export default {
break
}
})
this.showLabel = JSON.parse($data.booking_list_column.configJson)
if (Object.keys($data).includes('booking_list_column')) {
this.setTableList($data.booking_list_column)
} else {
this.setTableList({})
}
if (Object.keys($data).includes('booking_list_cond')) {
this.setFormData($data.booking_list_cond, false, true)
} else {
this.setFormData({}, false, true)
}
if (Object.keys($data).includes('booking_list_column')) {
this.setTableList($data.booking_list_column)
} else {
this.setTableList({})
}
})
},
handleRefshYZ() {
@ -2079,13 +2043,7 @@ export default {
row.refshYzitemLoad = true
RefreshBillTrace('ids=' + row.id).then(res => {
if (res.success) {
const showArr = []
this.showLabel.forEach(item => {
if (item.field) {
showArr.push(item.field)
}
})
PageDataNew({ id: row.id, showColumns: showArr }).then(ress => {
PageDataByBooking({ id: row.id }).then(ress => {
const item = ress.data.items[0]
row.refshYzitemLoad = false
const bookstatus = [
@ -2259,6 +2217,9 @@ export default {
}
}
})
// if (!isReset && !isInit) {
// this.getList(this.formRes)
// }
if (!isReset) {
this.getList(this.formRes)
}
@ -2652,9 +2613,7 @@ export default {
this.$refs.setTableForm.open()
},
submitTableForm(data) {
this.showLabel = JSON.parse(JSON.stringify(data))
this.gridOptions.columns = JSON.parse(JSON.stringify(data))
localStorage.setItem('formTableData', JSON.stringify(data));
this.$refs.setTableForm.handleCancel()
this.editColumnsSave(this.gridOptions.columns)
},
@ -2740,14 +2699,7 @@ export default {
if (this.searchData.multisort && this.searchData.multisort.length > 0) {
query.multisort = this.searchData.multisort
}
const showArr = []
this.showLabel.forEach(item => {
if (item.field) {
showArr.push(item.field)
}
})
query.showColumns = showArr
PageDataNew(query)
PageDataByBooking(query)
.then(res => {
if (res.success) {
let newBookingList = {}
@ -2764,7 +2716,7 @@ export default {
{ staCode: 'sta_zhuangchuan', isChecked: false },
{ staCode: 'sta_atd', isChecked: false }
]
if (item.bookstatus && item.bookstatus.length > 0) {
if (item.bookstatus.length > 0) {
bookstatus.map((book, bindex) => {
item.bookstatus.map((item, index) => {
if (item.staCode === book.staCode) {
@ -3253,7 +3205,6 @@ export default {
let query = {}
if (
[
'VESSEL',
'PORTDISCHARGE',
'PORTLOAD',
'PLACERECEIPT',
@ -3304,6 +3255,16 @@ export default {
SearchValue: value,
PropString: 'fleet'
}
} else if (form.label === 'VESSEL') {
const etdStart = moment().subtract(3, 'days').format('YYYY-MM-DD');
const etdEnd = moment().add(7, 'days').format('YYYY-MM-DD');
query = {
KeyWord: value,
sortField: 'etd',
descSort: true,
etdStart: etdStart,
etdEnd: etdEnd
}
}
const fun = this.emnuCompleteApi(form.label)
if (fun) {
@ -3452,13 +3413,7 @@ export default {
this.TaskShippingOrderCompareData = res.data.extra
this.TaskShippingOrderCompareData.total = res.data.total
this.TaskShippingOrderCompareVisible = true
const showArr = []
this.showLabel.forEach(item => {
if (item.field) {
showArr.push(item.field)
}
})
PageDataNew({ id: data.id, showColumns: showArr }).then(ress => {
PageDataByBooking({ id: data.id }).then(ress => {
const itme = ress.data.items[0]
this.spinning = false
data.lstShipOrderCompareRlt = itme.lstShipOrderCompareRlt

@ -380,9 +380,11 @@ export default {
'taskSource',
'taskType',
'OP',
'VESSEL',
'bsStatusList'
].includes(this.labelData.label)
) {
console.log(this.emnuData(this.labelData.label))
this.dataList = this.emnuData(this.labelData.label)
} else {
this.$emit('selectFirst', {
@ -427,6 +429,8 @@ export default {
return this.dpTreeList
case 'OrgOp':
return this.dpTreeList
case 'VESSEL':
return localStorage.getItem('vesselInfo') ? JSON.parse(localStorage.getItem('vesselInfo')) : []
case 'BSSTATUSNAME':
const arr = this.statusDIct
return arr

@ -544,7 +544,7 @@ export default {
showLabel2: 'name'
}, // 场站显示 name , yardid 取字段 code
// { title: '船名/航次', align: 'center', width: 120, label: 'VESSEL', type: 'complete', showLabel: 'vessel', showLabel2: 'voyno' }, // 船名航次换接口 船名 vessel 航次 voyno
{ title: '船名', align: 'center', width: 120, label: 'VESSEL', type: 'complete', showLabel: 'vessel' }, // 船名航次换接口 船名 vessel 航次 voyno
{ title: '船名', align: 'center', width: 120, label: 'VESSEL', type: 'select', showLabel: 'vessel' }, // 船名航次换接口 船名 vessel 航次 voyno
{ title: '开船日期', align: 'center', width: 160, label: 'ETD', type: 'dateRange', resLabel: ['BETD', 'EETD'] },
{ title: '实际开船', align: 'center', width: 160, label: 'ATD', type: 'dateRange', resLabel: ['BATD', 'EATD'] },
{ title: '预计到港日期', align: 'center', width: 160, label: 'ETA', type: 'dateRange', resLabel: ['BETA', 'EETA'] },

File diff suppressed because it is too large Load Diff

@ -61,12 +61,14 @@
<img src="../../../../assets/icons/u995.svg" alt="">预甩明细
<a-button style="margin-left: 20px;" type="primary" @click="handleSendNotice" size="small">发送通知</a-button>
<a-button style="margin-left: 20px;" type="primary" @click="handleRefsh" size="small">刷新订舱对应</a-button>
<a-button style="margin-left: 20px;" type="primary" @click="handleRefshPage" size="small">刷新</a-button>
</div>
<a-table
:pagination="false"
size="small"
:scroll="{ x: 1500, y: 300 }"
:columns="columns"
:loading="tableLoad"
rowKey="batchId"
:row-selection="{ selectedRowKeys: selectedRowKeysTable, onChange: onSelectChangeTable }"
:data-source="data"
@ -86,7 +88,10 @@
</div>
<div slot="ctnStat" slot-scope="text,record">
<span v-if="!record.ctnNote" style="color: #02A7F0;">{{ text }}</span>
<span v-if="record.ctnNote" style="color: #02A7F0;cursor: pointer;background-color: yellow;" @click="handleOpenCtn(record)">{{ text }}</span>
<span
v-if="record.ctnNote"
style="color: #02A7F0;cursor: pointer;background-color: yellow;"
@click="handleOpenCtn(record)">{{ text }}</span>
</div>
</a-table>
<div style="color: black;margin: 10px 0;text-align: right;width: 100%;">
@ -337,7 +342,7 @@
</div>
</a-modal>
<a-modal title="意见" v-model="userFlag" @cancel="userFlag = false" :footer="null">
<div>{{ userRow.userOpinionTxt }}</div>
<div>{{ userRow }}</div>
</a-modal>
<a-modal
title="可改配"
@ -358,11 +363,7 @@
</a-table>
</a-spin>
</a-modal>
<a-modal
title="Notes"
width="1100px"
v-model="ctnFlag"
:footer="null">
<a-modal title="Notes" width="1100px" v-model="ctnFlag" :footer="null">
<a-spin :spinning="ctnLoading">
<a-table
:pagination="false"
@ -377,23 +378,14 @@
</a-table>
</a-spin>
</a-modal>
<a-modal
title="修改箱型"
width="600px"
@ok="handleSaveCtn"
@cancel="ctnChangeFlag = false"
v-model="ctnChangeFlag"
>
<a-select
v-model="ctnCode"
style="width: 100%"
show-search
:filter-option="filterOption"
placeholder="请选择箱型箱量"
>
<a-select-option v-for="(item,index) in ctnallList" :key="index" :value="item.code">{{ item.name }}</a-select-option>
<a-modal title="修改箱型" width="600px" @ok="handleSaveCtn" @cancel="ctnChangeFlag = false" v-model="ctnChangeFlag">
<a-select v-model="ctnCode" style="width: 100%" show-search :filter-option="filterOption" placeholder="请选择箱型箱量">
<a-select-option v-for="(item, index) in ctnallList" :key="index" :value="item.code">{{ item.name
}}</a-select-option>
</a-select>
</a-modal>
<a-modal title="最后期限" width="600px" @ok="handleSaveDate" @cancel="dateFlag = false" v-model="dateFlag">
<a-date-picker show-time v-model="manualDeadLineDate" />
</a-modal>
</div>
</template>
@ -415,7 +407,9 @@ import {
CreateShareLink,
GetPreBillDetailList,
SaveDetai1Container,
PushShareLink
PushShareLink,
GenShareLink,
GetUserFeedBack
} from '@/api/modular/main/TaskmanageList'
import { mapGetters } from 'vuex'
import { DjyCustomerSuggest, GetSysUserPage, DjyCustomerContacts } from '@/api/modular/main/BookingLedger'
@ -425,14 +419,17 @@ export default {
CustomerList: [],
CreateData: {},
ctnCode: '',
manualDeadLineDate: '',
ctnChangeFlag: false,
UserId: '',
confirmDeadLine: '',
dateFlag: false,
selectedRowKeys: [],
carrierId: '',
value: '',
selectedRowKeysTable: [],
getloadDetailList: [],
tableLoad: false,
data: [],
confirmLoading: false,
ctnList: [{ shipment: '123' }],
@ -704,9 +701,12 @@ export default {
<span onClick={() => this.handleCopy(row)} style={{ marginRight: '5px' }} >复制</span>
<span onClick={() => this.handleChange(row)}>改配</span>
</div>
<div>
<div v-show={row.shareLinkKey}>
<span style={{ 'color': 'blue' }} onClick={() => this.handleAgain(row)}>重新生成</span>
</div>
<div v-show={!row.shareLinkKey}>
<span style={{ 'color': 'blue' }} onClick={() => this.handleShare(row)}>生成</span>
</div>
</div>,
attrs: {}
};
@ -770,6 +770,7 @@ export default {
rollingPlanList: [],
nominationId: '',
toData: {},
dateRow: {},
openRow: {},
getLoad: false,
rollingTouchDoubleRollRemark: '',
@ -806,8 +807,31 @@ export default {
this.$message.success('复制成功')
},
handleLook(row) {
TaskManageRolingWominationGetUrl({ batchId: row.batchId }).then(res => {
this.tableLoad = true
TaskManageRolingWominationGetUrl({ dispatchBatchId: row.batchId }).then(res => {
if (res.data.succ) {
const href = 'http://' + window.location.host + '/notifications?key=' + res.data.ext
window.open(href, '_blank')
} else {
this.$message.error(res.data.msg)
}
this.tableLoad = false
})
},
handleShare(row) {
this.tableLoad = true
const data = {
dispatchBatchId: row.batchId,
isRenew: false
}
GenShareLink(data).then(res => {
if (res.data.succ) {
this.$message.success('操作成功')
this.getList()
} else {
this.$message.error(res.data.msg)
}
this.tableLoad = false
})
},
handleSendNotice() {
@ -821,6 +845,9 @@ export default {
}
})
},
handleRefshPage() {
this.getList()
},
handleSaveCtn() {
const data = {
detailPKId: this.editCtn.pkId,
@ -845,19 +872,34 @@ export default {
);
},
handleAgain(row) {
this.spinning = true
CreateShareLink([row.batchId]).then(res => {
this.dateFlag = true
this.dateRow = row
},
onSelectChangeTable(selectedRowKeys) {
this.selectedRowKeysTable = selectedRowKeys;
},
handleSaveDate() {
if (!this.manualDeadLineDate) {
this.$message.warning('请先选择')
return false
}
this.tableLoad = true
const data = {
dispatchBatchId: this.dateRow.batchId,
isRenew: true,
manualDeadLineDate: this.manualDeadLineDate
}
GenShareLink(data).then(res => {
if (res.data.succ) {
this.$message.success('操作成功')
this.dateFlag = false
this.getList()
} else {
this.$message.error(res.data.msg)
}
this.spinning = false
this.tableLoad = false
})
},
onSelectChangeTable(selectedRowKeys) {
this.selectedRowKeysTable = selectedRowKeys;
},
mergeCells(text, data, key, index) {
//
if (index !== 0 && text === data[index - 1][key]) {
@ -875,7 +917,13 @@ export default {
},
handleOpenUser(row) {
this.userFlag = true
this.userRow = row
GetUserFeedBack({ dispatchBatchId: row.batchId }).then(res => {
if (res.data.succ) {
this.userRow = res.data.ext
} else {
this.$message.error(res.data.msg)
}
})
},
ChangeFileRadio() {
this.spinning = true
@ -1029,8 +1077,21 @@ export default {
})
},
handleCopy(row) {
TaskManageRolingWominationGetUrl({ batchId: row.batchId }).then(res => {
this.tableLoad = true
TaskManageRolingWominationGetUrl({ dispatchBatchId: row.batchId }).then(res => {
if (res.data.succ) {
const inputDom = document.createElement('textarea')
document.body.appendChild(inputDom)
inputDom.value = 'http://' + window.location.host + '/notifications?key=' + res.data.ext
inputDom.select()
inputDom.focus()
document.execCommand('copy')
document.body.removeChild(inputDom)
this.$message.success('复制成功')
} else {
this.$message.error(res.data.msg)
}
this.tableLoad = false
})
},
handleOpenCtn(row) {

@ -793,6 +793,7 @@ export default {
this.GetFeeUnit()
this.getFeeCurrencyList()
document.onkeydown = (event) => {
console.log(this.$refs['tableRef'].getRangeCellSelection())
if (event.key === 'Backspace') {
const index = this.$refs['tableRef'].getRangeCellSelection().selectionRangeKeys.startRowKey
const val = document

@ -22,8 +22,7 @@
:default-active-first-option="false"
:show-arrow="false"
:filter-option="false"
:not-found-content="null"
>
:not-found-content="null">
<a-select-option v-for="item in carrierData" :key="item.cnName" :value="item.cnName">
{{ item.cnName }}
</a-select-option>
@ -66,15 +65,13 @@
:style="{ width: '48%' }"
placeholder="开始日期"
v-model="queryParam.StartETD"
valueFormat="YYYY-MM-DD"
/>
valueFormat="YYYY-MM-DD" />
-
<a-date-picker
:style="{ width: '48%' }"
placeholder="结束日期"
v-model="queryParam.EndETD"
valueFormat="YYYY-MM-DD"
/>
valueFormat="YYYY-MM-DD" />
</a-form-item>
</a-col>
</a-row>
@ -94,54 +91,45 @@
</div>
</a-card>
<a-card :bordered="false">
<vxe-toolbar>
<template #buttons>
<div class="nav-box">
<div class="nav" @click="$refs.addForm.add()"><i class="iconfont icon-jiahao2fill"></i>新建</div>
</div>
</template>
</vxe-toolbar>
<vxe-table
<div style="display: flex;justify-content: space-between;align-items: center;margin-bottom: 7px;">
<div class="nav-box">
<div class="nav" @click="$refs.addForm.add()"><i class="iconfont icon-jiahao2fill"></i>新建</div>
</div>
<tableSort @columnChange="handleColumnChange" :columns="columns" :columnsAll="columnsAll"></tableSort>
</div>
<vxe-grid
:data="loadData"
stripe
resizable
round
ref="table"
:columns="columns"
:loading="loading"
@sort-change="tableSortChange"
@resizable-change="resizableChange"
height="600px"
empty-text="没有更多数据了!"
>
<vxe-column type="seq" width="50" fixed="left"></vxe-column>
<vxe-column
v-for="item in columns"
:key="item.dataIndex"
:field="item.dataIndex"
:width="item.width"
:title="item.title"
:align="item.align"
:show-overflow="true"
>
</vxe-column>
<vxe-column title="操作" fixed="right" width="70" align="center">
<template #default="{ row }">
<vxe-button style="padding:0;margin:0;margin-right:5px;" type="text" @click="$refs.editForm.edit(row)">
<a-icon type="form" :style="{ color: '#13c2c2' }" />
empty-text="没有更多数据了!">
<template #caozuo="{ row }">
<vxe-button style="padding:0;margin:0;margin-right:5px;" type="text" @click="$refs.editForm.edit(row)">
<a-icon type="form" :style="{ color: '#13c2c2' }" />
</vxe-button>
<a-popconfirm title="是否确认删除?" ok-text="" cancel-text="" @confirm="confirm(row)">
<vxe-button style="padding:0;margin:0;" type="text">
<a-icon type="delete" :style="{ color: '#13c2c2' }" />
</vxe-button>
<a-popconfirm title="是否确认删除?" ok-text="" cancel-text="" @confirm="confirm(row)">
<vxe-button style="padding:0;margin:0;" type="text">
<a-icon type="delete" :style="{ color: '#13c2c2' }" />
</vxe-button>
</a-popconfirm>
</template>
</vxe-column>
</vxe-table>
<vxe-pager
:current-page="queryParam.PageNo"
:page-size="queryParam.PageSize"
:total="queryParam.totalCount"
:layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
@page-change="handlePageChange1"
>
</vxe-pager>
</a-popconfirm>
</template>
<template #pager>
<vxe-pager
:current-page="queryParam.PageNo"
:page-size="queryParam.PageSize"
:total="queryParam.totalCount"
:layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
@page-change="handlePageChange1">
</vxe-pager>
</template>
</vxe-grid>
<add-form ref="addForm" @ok="handleOk" />
<edit-form ref="editForm" @ok="handleOk" />
</a-card>
@ -149,13 +137,16 @@
</template>
<script>
import { DjyVesselInfoServicePage, DjyVesselInfoServiceDelete, SysUserPage, GetCarrierlist, GetVessellist } from '@/api/modular/main/vesselinfo'
import { DjyUserConfigAdd } from '@/api/modular/main/DjyUserConfig'
import { DjyUserConfigMulti } from '@/api/modular/main/BookingLedger'
import addForm from './addForm.vue'
import tableSort from '@/components/tableSort'
import editForm from './editForm.vue'
export default {
components: {
addForm,
editForm
editForm,
tableSort
},
data() {
return {
@ -175,120 +166,183 @@ export default {
// pageSize: 10,
// totalResult: 1
},
ColumnsQuery: [],
columns: [
// {
// title: 'Id',
// align: 'center',
// dataIndex: 'tenantId'
// },
{
title: '船名',
align: 'center',
dataIndex: 'vessel',
field: 'vessel',
width: 150
},
{
title: '船公司',
align: 'center',
dataIndex: 'carrier',
field: 'carrier',
width: 150
},
{
title: '海关航次',
align: 'center',
dataIndex: 'voyno',
field: 'voyno',
width: 150
},
{
title: '内部航次',
align: 'center',
dataIndex: 'voynoInside',
field: 'voynoInside',
width: 150
},
{
title: '云港通ETD',
align: 'center',
dataIndex: 'ygtETD',
width: 150
field: 'ygtETD',
width: 150,
sortable: true
},
{
title: '开船日期',
align: 'center',
dataIndex: 'etd',
width: 150
field: 'etd',
width: 150,
sortable: true
},
{
title: '实际开船',
align: 'center',
dataIndex: 'atd',
field: 'atd',
width: 150,
sortable: true
},
{
title: '操作',
align: 'center',
field: 'caozuo',
slots: { default: 'caozuo' },
width: 100,
fixed: 'right'
}
],
ColumnsQuery: [],
columnsAll: [
{
title: '船名',
align: 'center',
field: 'vessel',
width: 150
},
{
title: '截港日期',
title: '船公司',
align: 'center',
dataIndex: 'closingDate',
field: 'carrier',
width: 150
},
{
title: '预抵日期',
title: '海关航次',
align: 'center',
field: 'voyno',
width: 150
},
{
title: '内部航次',
align: 'center',
dataIndex: 'eta',
field: 'voynoInside',
width: 150
},
{
title: '云港通ETD',
align: 'center',
field: 'ygtETD',
width: 150,
sortable: true
},
{
title: '开船日期',
align: 'center',
field: 'etd',
width: 150,
sortable: true
},
{
title: '实际开船',
align: 'center',
field: 'atd',
width: 150,
sortable: true
},
{
title: '截港日期',
align: 'center',
field: 'closingDate',
width: 150,
sortable: true
},
{
title: '预抵日期',
align: 'center',
field: 'eta',
width: 150,
sortable: true
},
{
title: '装货港',
align: 'center',
dataIndex: 'portLoading',
field: 'portLoading',
width: 150
},
{
title: '中转港',
align: 'center',
dataIndex: 'portTransit',
field: 'portTransit',
width: 150
},
{
title: '卸货港',
align: 'center',
dataIndex: 'portDischarge',
field: 'portDischarge',
width: 150
},
{
title: '默认场站',
align: 'center',
dataIndex: 'yard',
field: 'yard',
width: 150
},
{
title: '截单时间',
align: 'center',
dataIndex: 'closeDocTime',
field: 'closeDocTime',
width: 150
},
{
title: '创建人',
align: 'center',
dataIndex: 'createdUserName',
field: 'createdUserName',
width: 100
},
{
title: '创建时间',
align: 'center',
dataIndex: 'createdTime',
field: 'createdTime',
width: 150
},
{
title: '修改人',
align: 'center',
dataIndex: 'updatedUserName',
field: 'updatedUserName',
width: 100
},
{
title: '修改时间',
align: 'center',
dataIndex: 'updatedTime',
field: 'updatedTime',
width: 150
},
{
title: '操作',
align: 'center',
field: 'caozuo',
slots: { default: 'caozuo' },
width: 100,
fixed: 'right'
}
],
tstyle: { 'padding-bottom': '0px', 'margin-bottom': '10px' },
@ -301,7 +355,7 @@ export default {
UserList: []
}
},
created() {},
created() { },
mounted() {
this.init()
},
@ -311,11 +365,78 @@ export default {
this.vesselData = res.data
})
},
getConfigUser(isInit = false) {
const query = {
typeArr: ['vesselinfo_sort', 'vesselinfo_list_column']
}
this.loading = true
DjyUserConfigMulti(this.$qs.stringify(query, { arrayFormat: 'repeat' })).then(res => {
if (res.data.length === 0) {
this.columns = JSON.parse(JSON.stringify(this.columnsAll))
this.FnGetData()
} else {
if (res.data.length === 1) {
if (res.data[0].type === 'vesselinfo_list_column') {
this.FnGetData()
}
}
res.data.forEach(item => {
if (item.type === 'vesselinfo_list_column') {
this.columns = JSON.parse(item.configJson)
}
if (item.type === 'vesselinfo_sort') {
const data = JSON.parse(item.configJson)
setTimeout(() => {
this.$refs.table.sort(data.sortField, data.descSort ? 'desc' : 'asc')
}, 200);
this.queryParam.sortField = data.sortField
this.queryParam.descSort = data.descSort
this.FnGetData()
}
})
}
})
},
resizableChange(e) {
this.columns[e.columnIndex].width = e.resizeWidth
this.editColumnsSave(this.columns)
},
tableSortChange(e) {
const { property, order } = e
const data =
{
sortField: property,
descSort: order === 'desc'
}
this.queryParam.sortField = data.sortField
this.queryParam.descSort = data.descSort
this.FnGetData(this.queryParam)
DjyUserConfigAdd({
type: 'vesselinfo_sort',
configJson: JSON.stringify(data)
}).then(res => {
})
},
handleColumnChange(list) {
this.columns = JSON.parse(JSON.stringify(list))
this.columns.forEach((item, index) => {
this.$set(this.columns, index, item)
})
this.$forceUpdate()
this.editColumnsSave(this.columns)
},
carrierSearch(data) {
GetCarrierlist({ KeyWord: data }).then(res => {
this.carrierData = res.data
})
},
editColumnsSave(data = {}) {
DjyUserConfigAdd({
type: 'vesselinfo_list_column',
configJson: JSON.stringify(data)
}).then(res => {
})
},
handlePageChange1({ currentPage, pageSize }) {
this.queryParam.PageNo = currentPage
this.queryParam.PageSize = pageSize
@ -336,13 +457,10 @@ export default {
init() {
Object.assign(this.$data, this.$options.data())
this.ColumnsQuery = this.columns
this.FnGetData()
SysUserPage().then(res => {
this.UserList = res.data.rows
})
GetCarrierlist().then(res => {
this.carrierData = res.data
})
this.getConfigUser()
},
FnGetData() {
this.loading = true
@ -371,18 +489,22 @@ export default {
button {
margin-right: 8px;
}
.Open {
}
.Open {}
.Close {
height: 45px;
overflow: hidden;
}
.vxe-table--render-default .vxe-body--row.row--stripe {
background: #f5f9fe;
}
.ant-card-body {
padding-top: 10px;
}
.nav-box {
padding: 0 10px;
@ -408,6 +530,7 @@ button {
.iconfont {
color: #1d8aff;
}
&:hover {
background: #fff;
box-shadow: 0 0 10px #eee;
@ -418,6 +541,7 @@ button {
.iconfont {
color: #865ef8;
}
&:hover {
background: #fff;
box-shadow: 0 0 10px #eee;
@ -428,6 +552,7 @@ button {
.iconfont {
color: #ff9702;
}
&:hover {
background: #fff;
box-shadow: 0 0 10px #eee;
@ -438,6 +563,7 @@ button {
.iconfont {
color: #1d8aff;
}
&:hover {
background: #fff;
box-shadow: 0 0 10px #eee;
@ -448,6 +574,7 @@ button {
.iconfont {
color: #ff1062;
}
&:hover {
background: #fff;
box-shadow: 0 0 10px #eee;
@ -458,6 +585,7 @@ button {
.iconfont {
color: #1ebeca;
}
&:hover {
background: #fff;
box-shadow: 0 0 10px #eee;
@ -468,6 +596,7 @@ button {
.iconfont {
color: #82c93d;
}
&:hover {
background: #fff;
box-shadow: 0 0 10px #eee;
@ -478,6 +607,7 @@ button {
.iconfont {
color: #1d8aff;
}
&:hover {
background: #fff;
box-shadow: 0 0 10px #eee;

@ -393,6 +393,7 @@ export default {
localStorage.setItem('formTableData', JSON.stringify(initData.columns));
}
})
this.$store.dispatch('getVesselinfo')
},
requestFailed(err) {
this.accountLoginErrMsg = err

@ -3,7 +3,7 @@ const webpack = require('webpack')
const createThemeColorReplacerPlugin = require('./config/plugin.config')
const CompressionWebpackPlugin = require('compression-webpack-plugin')
const productionGzipExtensions = ['js', 'css']
console.log(process.env.VUE_APP_SOCKET_BASE_URL)
function resolve(dir) {
return path.join(__dirname, dir)
}
@ -90,7 +90,6 @@ const vueConfig = {
}
}
},
devServer: {
port: 82,
proxy: {

Loading…
Cancel
Save