订舱提交检查

master
sunzehua 9 months ago
parent 6dd0a71062
commit 458d85d8ed

@ -1280,3 +1280,19 @@ export function CancelAllocationSlot(parameter) {
})
}
export function GetCtnListRefsh(parameter) {
return axios({
url: '/BookingOrder/GetCtnList',
method: 'get',
params: parameter
})
}
export function CheckCtnCover(parameter) {
return axios({
url: '/BookingOrder/CheckCtnCover',
method: 'post',
data: parameter
})
}

@ -361,8 +361,8 @@ export function GetLoadStatusDetailList(parameter) {
export function RefreshBookingorder(parameter) {
return axios({
url: '/TaskManageRollingNomination/RefreshBookingorder',
method: 'post',
data: parameter
method: 'get',
params: parameter
})
}
@ -378,7 +378,7 @@ export function TaskManageRolingWominationCancelsharelink(parameter) {
return axios({
url: '/TaskManageRollingNomination/Cancelsharelink',
method: 'post',
data: parameter
params: parameter
})
}
@ -397,3 +397,27 @@ export function CreateShareLink(parameter) {
data: parameter
})
}
export function GetPreBillDetailList(parameter) {
return axios({
url: '/TaskManageRollingNomination/GetPreBillDetailList',
method: 'get',
params: parameter
})
}
export function SaveDetai1Container(parameter) {
return axios({
url: '/TaskManageRollingNomination/SaveDetailContainer',
method: 'post',
data: parameter
})
}
export function PushShareLink(parameter) {
return axios({
url: '/TaskManageRollingNomination/PushShareLink',
method: 'post',
data: parameter
})
}

@ -77,6 +77,11 @@ export const constantRouterMap = [
}
]
},
{
name: 'notifications',
path: '/notifications',
component: () => import('@/views/main/Taskmanage/notifications/index')
},
{
path: '/404',
component: () => import(/* webpackChunkName: "fail" */ '@/views/system/exception/404')

@ -10,7 +10,7 @@ import { ACCESS_TOKEN, ALL_APPS_MENU } from '@/store/mutation-types'
import { Modal, notification } from 'ant-design-vue' // NProgress Configuration
import { timeFix } from '@/utils/util' /// es/notification
NProgress.configure({ showSpinner: false })
const whiteList = ['login', 'register', 'registerResult'] // no redirect whitelist
const whiteList = ['login', 'register', 'registerResult', 'notifications'] // no redirect whitelist
// 无默认首页的情况
const defaultRoutePath = '/welcome'
@ -141,6 +141,7 @@ router.beforeEach((to, from, next) => {
}
}
} else {
console.log(to)
if (whiteList.includes(to.name)) {
// 在免登录白名单,直接进入
next()

@ -95,6 +95,7 @@
:isLockBooking="isLockBooking"
@changectnall="changectnall"
@changeDetail="changeDetailFun"
@handleRefshTable="handleRefshTable"
@changeTotal="changeTotalFun"
@changeCtnInfo="changeCtnInfoFun">
</goodsTable>
@ -119,7 +120,7 @@
ref="iframe"
@load="handleIframeLoad"
style="width: 100%;height: 1400px;"
src="http://60.209.125.238:35103/#/index"
src="http://localhost:8080/#/index"
frameborder="0"></iframe>
</div>
</div>
@ -182,7 +183,9 @@ import {
GetAllData,
DeleteBookingOrder,
listYardBwCarrier,
ListAgentByCarrier
ListAgentByCarrier,
CheckCtnCover,
GetCtnListRefsh
} from '@/api/modular/main/BookingLedger'
import { mapActions, mapGetters } from 'vuex'
import rules from './rulesTest'
@ -1690,6 +1693,41 @@ export default {
kindpkgs = item.kindpkgs
})
const that = this
const refsh = () => {
this.$refs.goodsTable.handleRefsh()
}
const check = () => {
if (this.bookingDetails.id !== 0) {
const checkData = {
bookingOrderId: this.bookingDetails.id,
ctnInputs: this.bookingDetails.ctnInputs
}
this.$message.loading({ content: '数据校验中, 请勿切换页面...' })
CheckCtnCover(checkData).then(res => {
if (res.success) {
if (!res.data) {
FnOk()
} else {
this.$confirm({
content: (<p>箱信息发生改变,是否要覆盖保存? <br /> 取消保存并刷新箱信息 覆盖保存</p>),
okText: '是',
okType: 'danger',
cancelText: '否',
onOk() {
FnOk()
},
onCancel() {
refsh()
},
class: 'test'
})
}
}
})
} else {
FnOk()
}
}
const confirm = text => {
this.$confirm({
title: `${text}不一致,是否继续?`,
@ -1697,7 +1735,7 @@ export default {
okType: 'danger',
cancelText: '否',
onOk() {
FnOk()
check()
},
onCancel() {
return false
@ -1737,7 +1775,7 @@ export default {
if (WText) {
confirm(WText)
} else {
FnOk()
check()
}
},
@ -1825,6 +1863,18 @@ export default {
this.changePage(type)
}
},
handleRefshTable() {
this.$refs.goodsTable.loadingTable = true
GetCtnListRefsh({ orderId: this.bookingDetails.id }).then(res => {
if (res.success) {
this.bookingDetails.ctnInputs = res.data
this.$refs.goodsTable.init()
} else {
this.$message.error(res.message)
}
this.$refs.goodsTable.loadingTable = false
})
},
changePage(type) {
const nowId = this.$route.query.id
const arr = Object.keys(this.bookingList)

@ -1,8 +1,10 @@
<template>
<div class="goods-table">
<a-spin :spinning="loadingTable">
<a-card :bordered="false" :bodyStyle="{ padding: '10px 20px' }">
<div class="from-line" >
<div class="left" v-if="!isLockBooking">
<a-button class="btn btn-add" type="primary" @click="handleRefsh"></a-button>
<a-button class="btn btn-add" type="primary" @click="addboxLine"></a-button>
<a-button class="btn btn-delete" @click="removeLine" :style="{ marginRight: '20px' }">删除</a-button>
<a-button class="btn btn-more-name" type="primary" @click="openDialog" :disabled="tableData.length === 0">
@ -52,6 +54,7 @@
</div>
<div class="loading" v-else> ...</div>
</a-card>
</a-spin>
<a-modal
title="多品名维护"
@ -114,7 +117,7 @@
</div>
</template>
<script>
import { GetYardData, ReadAutoYardImport } from '@/api/modular/main/BookingLedger'
import { GetYardData, ReadAutoYardImport, GetCtnListRefsh } from '@/api/modular/main/BookingLedger'
import { mapGetters } from 'vuex'
export default {
name: '',
@ -148,6 +151,7 @@ export default {
return {
id: this.$route.query.id,
rowKeyName: 'rowKey',
loadingTable:false,
BookingLockCtn: {},
cellAutofillOption: {
directionX: false,
@ -1425,6 +1429,9 @@ export default {
keydown(e) {
console.log(e)
},
handleRefsh() {
this.$emit('handleRefshTable')
},
changeEmit(row) {
this.$emit('changeCtnInfo', { type: 'kindpkgs', val: row['kindpkgs'] })
},

@ -1259,6 +1259,7 @@ import { XCard, setFormModel } from '@/components'
import columnSetting from '@/components/tableColumnSetting'
import formLabel from './modules/formLabel'
import importBc from './modules/importBc'
import moment from 'moment'
import importBcMore from './modules/importBcMore'
import {
PageDataByBooking,
@ -3199,7 +3200,6 @@ export default {
let query = {}
if (
[
'VESSEL',
'PORTDISCHARGE',
'PORTLOAD',
'PLACERECEIPT',
@ -3250,6 +3250,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) {

File diff suppressed because it is too large Load Diff

@ -59,7 +59,7 @@
</div>
<div class="main-title">
<img src="../../../../assets/icons/u995.svg" alt="">预甩明细
<a-button style="margin-left: 20px;" type="primary" @click="handleRefsh" size="small">发送通知</a-button>
<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>
</div>
<a-table
@ -67,6 +67,7 @@
size="small"
:scroll="{ x: 1500, y: 300 }"
:columns="columns"
rowKey="batchId"
:row-selection="{ selectedRowKeys: selectedRowKeysTable, onChange: onSelectChangeTable }"
:data-source="data"
bordered>
@ -74,7 +75,7 @@
<span style="color: #02A7F0">{{ text ? '是' : '否' }}</span>
</div>
<div slot="bookingId" slot-scope="text,record">
<span @click="handleOpen(record)" style="color: #02A7F0;cursor: pointer;"></span>
<span v-if="record.bookingId" @click="handleOpen(record)" style="color: #02A7F0;cursor: pointer;"></span>
</div>
<div slot="userOpinion" slot-scope="text,record">
<span style="color: #02A7F0;margin-right: 15px;">{{ record.userOpinion ? '是' : '否' }}</span>
@ -83,8 +84,9 @@
<div slot="isUserManual" slot-scope="text,record">
<span style="color: #02A7F0">{{ record.isUserManual ? '是' : '否' }}</span>
</div>
<div slot="ctnStat" slot-scope="text">
<span style="color: #02A7F0">{{ text }}</span>
<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>
</div>
</a-table>
<div style="color: black;margin: 10px 0;text-align: right;width: 100%;">
@ -356,6 +358,43 @@
</a-table>
</a-spin>
</a-modal>
<a-modal
title="Notes"
width="1100px"
v-model="ctnFlag"
:footer="null">
<a-spin :spinning="ctnLoading">
<a-table
:pagination="false"
size="small"
:scroll="{ x: 1500, y: 500 }"
:columns="columnsLoadByCtn"
:data-source="ctnList"
bordered>
<div slot="ctnNote" slot-scope="text,record">
<span style="color: #02A7F0;cursor: pointer;" @click="handleOpenchange(record)"></span>
</div>
</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-select>
</a-modal>
</div>
</template>
<script>
@ -373,7 +412,10 @@ import {
TaskManageRolingWominationGetUrl,
DispatchRollingNomination,
RefreshBookingorder,
CreateShareLink
CreateShareLink,
GetPreBillDetailList,
SaveDetai1Container,
PushShareLink
} from '@/api/modular/main/TaskmanageList'
import { mapGetters } from 'vuex'
import { DjyCustomerSuggest, GetSysUserPage, DjyCustomerContacts } from '@/api/modular/main/BookingLedger'
@ -382,6 +424,8 @@ export default {
return {
CustomerList: [],
CreateData: {},
ctnCode: '',
ctnChangeFlag: false,
UserId: '',
confirmDeadLine: '',
selectedRowKeys: [],
@ -391,6 +435,7 @@ export default {
getloadDetailList: [],
data: [],
confirmLoading: false,
ctnList: [{ shipment: '123' }],
getLoadFlag: false,
columnsGetLoad: [
{
@ -504,6 +549,69 @@ export default {
width: '120px'
}
],
columnsLoadByCtn: [
{
title: 'Shipment',
dataIndex: 'shipment',
align: 'center',
width: '120px'
},
{
title: 'Equipment Number',
dataIndex: 'equipmentNumber',
align: 'center',
width: '120px'
},
{
title: 'Container',
dataIndex: 'containerType',
align: 'center',
width: '120px'
},
{
title: 'ctnNote',
dataIndex: 'ctnNote',
align: 'center',
width: '120px',
scopedSlots: { customRender: 'ctnNote' }
},
{
title: 'FEE',
dataIndex: 'fee',
align: 'center',
width: '70px'
},
{
title: 'Weight',
dataIndex: 'weight',
align: 'center',
width: '70px'
},
{
title: 'Place of Receipt',
dataIndex: 'placeOfReceipt',
align: 'center',
width: '120px'
},
{
title: 'Load Port Name',
dataIndex: 'loadPortName',
align: 'center',
width: '120px'
},
{
title: 'Discharge Port Name',
dataIndex: 'dischargePortName',
align: 'center',
width: '120px'
},
{
title: 'Place of Delivery',
dataIndex: 'placeOfDelivery',
align: 'center',
width: '120px'
}
],
columns: [
{
title: 'Shipment',
@ -648,15 +756,19 @@ export default {
},
href: '',
spinning: false,
editCtn: {},
bookingServiceItem: [],
pdfUrl: '',
UserList: [],
fromData: {},
loadDetailList: [],
ctnLoading: false,
ctnFlag: false,
userRow: '',
userFlag: false,
totalCtn: '',
rollingPlanList: [],
nominationId: '',
toData: {},
openRow: {},
getLoad: false,
@ -666,7 +778,7 @@ export default {
},
computed: {
...mapGetters([
'userInfo'
'userInfo', 'ctnallList'
])
},
watch: {
@ -694,11 +806,44 @@ export default {
this.$message.success('复制成功')
},
handleLook(row) {
console.log(row)
TaskManageRolingWominationGetUrl({ batchId: row.batchId }).then(res => {
})
},
handleSendNotice() {
const newList = Array.from(new Set(this.selectedRowKeysTable))
console.log(this.selectedRowKeysTable, newList)
PushShareLink(newList).then(res => {
if (res.data.succ) {
this.$message.success('操作成功')
} else {
this.$message.error(res.data.msg)
}
})
},
handleSaveCtn() {
const data = {
detailPKId: this.editCtn.pkId,
ctnCode: this.ctnCode
}
SaveDetai1Container(data).then(res => {
if (res.data.succ) {
this.$message.success('操作成功')
this.ctnChangeFlag = false
} else {
this.$message.error(res.data.msg)
}
})
},
handleOpenchange(row) {
this.ctnChangeFlag = true
this.editCtn = row
},
filterOption(input, option) {
return (
option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
);
},
handleAgain(row) {
this.spinning = true
CreateShareLink([row.batchId]).then(res => {
@ -775,7 +920,9 @@ export default {
})
},
handleOpen(row) {
console.log(row)
if (row.bookingId) {
this.$router.push({ name: 'BookingDetail', query: { id: row.bookingId } })
}
},
onSelectChange(selectedRowKeys) {
this.selectedRowKeys = selectedRowKeys;
@ -873,6 +1020,7 @@ export default {
this.confirmDeadLine = res.data.confirmDeadLine
this.rollingTouchDoubleRollRemark = res.data.rollingTouchDoubleRollRemark
this.totalCtn = res.data.totalPreBillCtnStat
this.nominationId = res.data.nominationId
this.$forceUpdate()
} else {
this.$message.error(res.message)
@ -885,9 +1033,25 @@ export default {
})
},
handleOpenCtn(row) {
const data = {
nominationId: this.nominationId,
shipmentNo: row.shipment
}
this.ctnFlag = true
this.ctnLoading = true
GetPreBillDetailList(data).then(res => {
if (res.data.succ) {
this.ctnList = res.data.ext
} else {
this.$message.error(res.data.msg)
}
this.ctnLoading = false
})
},
handleCancel(row) {
this.spinning = true
TaskManageRolingWominationCancelsharelink([row.batchId]).then(res => {
TaskManageRolingWominationCancelsharelink({ dispatchBatchId: row.batchId }).then(res => {
if (res.data.succ) {
this.$message.success('操作成功')
} else {
@ -925,8 +1089,12 @@ export default {
})
},
handleRefsh() {
RefreshBookingorder().then(res => {
RefreshBookingorder({ nominationId: this.$route.query.taskPKId }).then(res => {
if (res.data.succ) {
this.$message.success('操作成功')
} else {
this.$message.error(res.data.msg)
}
})
},
OpenModal() {

@ -1,18 +1,5 @@
<template>
<div>
<!-- <a-card :bordered="false" :bodyStyle="tstyle">
<div class="table-page-search-wrapper" :class="advanced ? 'Open' : 'Close'">
<a-form :model="form" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }">
<a-row>
<a-col :span="6">
<a-form-item label="邮箱主题">
<a-input v-model="form.mailSubject" allow-clear placeholder="请输入邮箱主题" />
</a-form-item>
</a-col>
</a-row>
</a-form>
</div>
</a-card> -->
<a-card :bordered="false">
<div style="margin-bottom: 10px;display: flex;justify-content: space-between;">
<div>
@ -83,15 +70,17 @@
<a-row>
<a-col :span="12">
<a-form-model-item label="客户类别">
<a-select @change="handleChange" v-model="addForm.customerTypeCode" style="width: 100%" >
<a-select-option v-for="(item,index) in customerTypeList" :key="index" :value="item.code">{{ item.name }}</a-select-option>
<a-select @change="handleChange" v-model="addForm.customerTypeCode" style="width: 100%">
<a-select-option v-for="(item, index) in customerTypeList" :key="index" :value="item.code">{{ item.name
}}</a-select-option>
</a-select>
</a-form-model-item>
</a-col>
<a-col :span="12">
<a-form-model-item label="往来单位">
<a-select v-model="addForm.customerCode" style="width: 100%" >
<a-select-option v-for="(item,index) in customerList" :key="index" :value="item.code">{{ item.name }}</a-select-option>
<a-select v-model="addForm.customerCode" style="width: 100%">
<a-select-option v-for="(item, index) in customerList" :key="index" :value="item.code">{{ item.name
}}</a-select-option>
</a-select>
</a-form-model-item>
</a-col>
@ -99,13 +88,17 @@
<a-row>
<a-col :span="12">
<a-form-model-item label="费用名称">
<a-input v-model="addForm.feeName" />
<a-select v-model="addForm.feeName" style="width: 100%">
<a-select-option v-for="(item, index) in feeCodeList" :key="index" :value="item.name">{{ item.name
}}</a-select-option>
</a-select>
</a-form-model-item>
</a-col>
<a-col :span="12">
<a-form-model-item label="标准">
<a-select v-model="addForm.unit" style="width: 100%" >
<a-select-option v-for="(item,index) in unitList" :key="index" :value="item.name">{{ item.name }}</a-select-option>
<a-select v-model="addForm.unit" style="width: 100%">
<a-select-option v-for="(item, index) in unitList" :key="index" :value="item.name">{{ item.name
}}</a-select-option>
</a-select>
</a-form-model-item>
</a-col>
@ -114,10 +107,8 @@
<a-col :span="12">
<a-form-model-item label="币别">
<a-select v-model="addForm.currency" style="width: 100%">
<a-select-option
v-for="(item, index) in currencyList"
:key="index"
:value="item.codeName">{{ item.codeName }}</a-select-option>
<a-select-option v-for="(item, index) in currencyList" :key="index" :value="item.codeName">{{
item.codeName }}</a-select-option>
</a-select>
</a-form-model-item>
</a-col>
@ -154,7 +145,7 @@
<a-row>
<a-col :span="12">
<a-form-model-item label="是否开发票">
<a-select v-model="addForm.isInvoice" style="width: 100%" >
<a-select v-model="addForm.isInvoice" style="width: 100%">
<a-select-option value="true">
</a-select-option>
@ -166,7 +157,7 @@
</a-col>
<a-col :span="12">
<a-form-model-item label="是否垫付">
<a-select v-model="addForm.isAdvancedPay" style="width: 100%" >
<a-select v-model="addForm.isAdvancedPay" style="width: 100%">
<a-select-option value="true">
</a-select-option>
@ -196,7 +187,8 @@ import {
FeeCustTemplateDelete,
GetFeeCustomerList,
FeeCurrencyList,
GetFeeUnitList
GetFeeUnitList,
FeeCodeList
} from '@/api/modular/main/mailSetting'
import columnSetting from '@/components/tableColumnSetting'
export default {
@ -234,6 +226,7 @@ export default {
form: {},
mailHtml: '',
ColumnsQuery: [],
feeCodeList:[],
columns: [
{
title: '费用名称',
@ -327,11 +320,17 @@ export default {
this.customerTypeList = this.$options.filters['dictData']('djy_cust_prop')
this.getCurrency()
this.GetFeeUnit()
this.getFeeCode()
},
methods: {
toggleAdvanced() {
this.advanced = !this.advanced
},
getFeeCode() {
FeeCodeList().then(res => {
this.feeCodeList = res.data
})
},
getCurrency() {
FeeCurrencyList().then(res => {
this.currencyList = res.data

Loading…
Cancel
Save