修改bug

master
sunzehua 6 months ago
parent e66d702523
commit 7ecd616222

@ -87,6 +87,11 @@ export const constantRouterMap = [
path: '/ServiceItems',
component: () => import('@/views/ServiceItems/index')
},
{
name: 'flowList',
path: '/flowList',
component: () => import('@/views/flowList/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', 'notifications', 'getway', 'ServiceItems'] // no redirect whitelist
const whiteList = ['login', 'register', 'registerResult', 'notifications', 'getway', 'ServiceItems', 'flowList'] // no redirect whitelist
// 无默认首页的情况
const defaultRoutePath = '/welcome'

@ -1,6 +1,6 @@
<template>
<div class="service">
<!-- <a-card :bodyStyle="tstyle" :bordered="false">
<a-card :bodyStyle="tstyle" :bordered="false">
<div class="title"><i class="iconfont icon-fuwu"></i><span>服务项目</span></div>
<a-spin :spinning="seriveLoading">
<div class="content">
@ -46,100 +46,7 @@
</div>
</div>
</a-spin>
</a-card> -->
<a-spin :spinning="flowLoad">
<div class="list-box">
<div class="list-box-title">
<span>提单号{{ flowData.blNo }}</span>
<span style="display: flex;align-items: center;">
<img src="./u1041.svg" alt=""> 起运港:{{ flowData.routingInfoList ? flowData.routingInfoList[0].loading : '-' }}
<a-icon style="margin: 0 15px;" type="swap-right" />
<img src="./u1041.svg" alt=""> 目的港{{ flowData.routingInfoList ? flowData.routingInfoList[0].discharging : '-' }}</span>
<span style="cursor: pointer;color: blue;" @click="handleDetail"><a-icon
type="appstore"
theme="filled" /></span>
</div>
<div class="list-box-content">
<div class="content-left">
<div>{{ flowData.carrier }}</div>
<div>订阅港区CNTAO</div>
<div>船名{{ flowData.vslNameEn }}</div>
<div>航次{{ flowData.voy }}</div>
</div>
<div class="content-right">
<div
class="conent-item"
:class="{ 'active': item.active, 'isEnd': item.isEnd }"
v-for="(item, index) in timeData"
:key="index">
<div class="line" v-if="index !== 0"></div>
<div class="cont-box">
<div class="item-top">{{ item.name }}</div>
<a-icon class="icon" type="check-circle" theme="filled" />
<div class="item-bottom">{{ item.text }}</div>
<div class="item-time">{{ item.time }}</div>
</div>
</div>
</div>
</div>
</div>
<div class="main-box" v-if="showFlag">
<div class="box-left">
<div
class="box-tab"
@click="handleClick(index)"
:class="{ 'isActive': item.isActive }"
v-for="(item, index) in flowData.containerInfoList"
:key="index">
<div style="font-size: 15px;font-weight: bold;color: black">{{ item.containerNo }}</div>
<div style="font-size: 12px;color: #666;margin: 5px 0;">{{ item.size }}</div>
<div style="font-size: 12px;color: green;">开船:{{ item.currentNodeTime }}</div>
</div>
</div>
<div class="box-right">
<div>
<!-- <a-row>
<a-col :span="6">铅封号M/CN50000001</a-col>
<a-col :span="6">VGMM/CN50000001</a-col>
<a-col :span="6">VGM接收时间-</a-col>
<a-col :span="6">配载Y</a-col>
</a-row>
<a-table
style="margin: 15px 0;margin-bottom: 30px;"
:pagination="false"
bordered
size="small"
:data-source="data">
<a-table-column key="name" title="报关单号" data-index="name"></a-table-column>
<a-table-column key="name1" title="件数" data-index="name1"></a-table-column>
<a-table-column key="name2" title="毛重" data-index="name2"></a-table-column>
<a-table-column key="name3" title="体积" data-index="name3"></a-table-column>
<a-table-column key="name4" title="船公司操作" data-index="name4"></a-table-column>
</a-table> -->
</div>
<div class="box-right-title">
<span style="width: 150px">动态</span>
<span style="width: 200px">时间</span>
<span style="width: 200px;margin-right: 30px;">地点</span>
<span style="width: 200px">船名航次</span>
</div>
<div class="box-item" :class="{ 'isActive': item.isActive }" v-for="(item, index) in timeList" :key="index">
<div class="box-time">
<div class="time-line" :style="{ background: index == 0 ? 'none' : '' }"></div>
<div class="time-circular"></div>
<div class="time-line" :style="{ background: index == timeList.length - 1 ? 'none' : '' }"></div>
</div>
<div style="display: flex;align-items: center;padding: 15px 0;">
<div style="width: 150px;">{{ item.statusDescription }}</div>
<div style="width: 200px;">{{ item.statusTime }} <span class="tag"></span> </div>
<div style="width: 200px;word-wrap: break-word;margin-right: 30px;">{{ item.statusPlace }}</div>
<div style="width: 200px;">{{ item.voy ? item.voy : '-' }}/{{ item.vslName ? item.vslName : '-' }}</div>
</div>
</div>
</div>
</div>
</a-spin>
</a-card>
<a-modal v-model="GoodsStatusVisible" width="600px" title="编辑" @ok="GoodsStatusHandleOk">
<a-spin :spinning="goodStatusLoading">
@ -197,9 +104,8 @@ export default {
goodStatusLoading: false,
booGoodsStatusItem: [],
delayTime: 500,
timeData: [
],
embedTraceFlowStatusList: [],
timeData: [ ],
boxList: [
{
name: 'SLEU0000001',
@ -220,9 +126,7 @@ export default {
isActive: false
}
],
timeList: [
],
timeList: [],
data: [{
name: '测试111',
name1: '测试111',
@ -259,9 +163,8 @@ export default {
this.USER_KEY = this.$route.query.USER_KEY
this.businessId = this.$route.query.businessId
this.USER_SECRET = this.$route.query.USER_SECRET
this.getFlowInfo()
// this.getServiceItemList(1)
// this.getStatusServiceList(1)
this.getServiceItemList(1)
this.getStatusServiceList(1)
},
watch: {
'$route': {
@ -271,8 +174,8 @@ export default {
this.USER_KEY = this.$route.query.USER_KEY
this.businessId = this.$route.query.businessId
this.USER_SECRET = this.$route.query.USER_SECRET
// this.getServiceItemList(1)
// this.getStatusServiceList(1)
this.getServiceItemList(1)
this.getStatusServiceList(1)
}
}
}
@ -351,7 +254,6 @@ export default {
billNo: '237065744',
carrier: 'MSK',
ctnNo: '',
isAllCtn: true,
USER_KEY: '731e2d42af0f4209a8edccfcae20d7c4',
USER_SECRET: 'c513dff9ac617fd064ada5f3ccdbd6a1bde59e7c7ffe29e9dc225c49a0904a1535f7bf3d97bc2ff4'
}
@ -359,6 +261,7 @@ export default {
GetTraceFlowInfo(data).then(res => {
if (res.success) {
this.flowData = res.data.resultData
this.embedTraceFlowStatusList = res.data.embedTraceFlowStatusList
} else {
this.$message.error(res.message)
}
@ -663,11 +566,7 @@ export default {
height: 20px;
width: 20px;
}
.service {
background: rgb(234, 242, 255);
padding-top: 50px;
min-height: 100vh;
}
.list-box {
background: white;

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

@ -0,0 +1,698 @@
<template>
<div class="service">
<a-spin :spinning="flowLoad">
<div class="list-box" @click="handleDetail">
<div class="list-box-title">
<span>提单号{{ flowData.blNo }}</span>
<div>{{ flowData.carrier }}</div>
<span style="display: flex;align-items: center;">
<img src="./u1041.svg" alt=""> 起运港:{{ flowData.routingInfoList ? flowData.routingInfoList[0].loading : '-'
}}
<a-icon style="margin: 0 15px;" type="swap-right" />
<img src="./u1041.svg" alt=""> 目的港{{ flowData.routingInfoList ? flowData.routingInfoList[0].discharging :
'-' }}</span>
<div>船名{{ flowData.vslNameEn }}</div>
<div>航次{{ flowData.voy }}</div>
<span style="cursor: pointer;color: blue;" >详情<a-icon
type="appstore"
theme="filled" /></span>
</div>
<div class="list-box-content">
<div class="content-right">
<div
class="conent-item"
:class="{ 'active': item.isComplete, 'isEnd': item.isCurrentStatus }"
v-for="(item, index) in embedTraceFlowStatusList"
:key="index">
<div class="line" v-if="index !== 0 && !item.isSplitEnd"></div>
<div class="line-long" v-if="item.isSplitEnd"></div>
<div class="cont-box">
<div class="item-top">{{ item.statusCnName }}</div>
<a-icon class="icon" v-if="!item.isCurrentStatus" type="check-circle" theme="filled" />
<img v-else src="./1.png" style="height: 20px;width: 20px;" alt="">
<div class="item-bottom">{{ item.statusCtnStatic }}</div>
<div class="item-time" v-if="item.isCurrentStatus">{{ item.statusTime }}</div>
</div>
</div>
</div>
</div>
</div>
<div class="main-box" v-if="showFlag">
<div class="box-left">
<div
class="box-tab"
@click="handleClick(index)"
:class="{ 'isActive': item.isActive }"
v-for="(item, index) in flowData.containerInfoList"
:key="index">
<div style="font-size: 15px;font-weight: bold;color: black">{{ item.containerNo }}</div>
<div style="font-size: 12px;color: #666;margin: 5px 0;">{{ item.sizeName ? item.sizeName : item.size }}</div>
<div style="font-size: 12px;color: green;">开船:{{ item.currentNodeTime }}</div>
</div>
</div>
<div class="box-right">
<div>
<a-row style="margin-bottom: 20px">
<a-col :span="6" style="color: #122db3;font-size: 14px;font-weight: bold;">箱号{{ flowData.containerInfoList[changeIndex].containerNo }}</a-col>
<!-- <a-col :span="6">VGMM/CN50000001</a-col>
<a-col :span="6">VGM接收时间-</a-col>
<a-col :span="6">配载Y</a-col> -->
</a-row>
<!-- <a-table
style="margin: 15px 0;margin-bottom: 30px;"
:pagination="false"
bordered
size="small"
:data-source="data">
<a-table-column key="name" title="报关单号" data-index="name"></a-table-column>
<a-table-column key="name1" title="件数" data-index="name1"></a-table-column>
<a-table-column key="name2" title="毛重" data-index="name2"></a-table-column>
<a-table-column key="name3" title="体积" data-index="name3"></a-table-column>
<a-table-column key="name4" title="船公司操作" data-index="name4"></a-table-column>
</a-table> -->
</div>
<div class="box-right-title">
<span style="width: 150px">动态</span>
<span style="width: 190px">时间</span>
<span style="width: 150px;margin-right: 20px;">地点</span>
<span style="width: 150px">船名航次</span>
</div>
<div
class="box-item"
:class="{ 'isActive': item.isEst == 'N' }"
v-for="(item, index) in timeList"
:key="index">
<div class="box-time">
<div class="time-line" :style="{ background: index == 0 ? 'none' : '' }"></div>
<div class="time-circular" v-if="!item.isCurrentStatus"></div>
<img v-else src="./1.png" style="height: 15px;width: 15px;" alt="">
<div class="time-line" :style="{ background: index == timeList.length - 1 ? 'none' : '' }"></div>
</div>
<div style="display: flex;align-items: center;padding: 15px 0;">
<div style="width: 150px;">{{ item.statusCnName }}</div>
<div style="width: 200px;" v-if="item.isEst == 'N'">{{ item.statusTime }} <span class="tag"></span> </div>
<div style="width: 200px;" v-else>{{ item.statusTime }} <span class="tag" style="background: #FFF2E6;color: #ff8d1a;"></span> </div>
<div style="width: 150px;word-wrap: break-word;margin-right: 20px;">{{ item.statusPlace }}</div>
<div style="width: 150px;font-size: 12px;word-break: break-all;" v-if="item.vslName">{{ item.vslName }} / {{ item.voy }}</div>
<div style="width: 150px;font-size: 12px;word-break: break-all;" v-if="!item.vslName">-</div>
</div>
</div>
</div>
</div>
</a-spin>
</div>
</template>
<script>
import {
GetServiceProiectListIfram,
GetServiceStatusListIfram,
CancelServiceProjectIfram,
SaveServiceProjectIfram,
SaveServiceStatusIfram,
CancelServiceStatusIfram,
GetTraceFlowInfo
} from '@/api/modular/main/BookingLedger'
export default {
data() {
return {
seriveLoading: false,
bookingServiceItem: [],
changeGoods: true,
flowLoad: true,
showFlag: false,
flowData: {},
GoodsStatusVisible: false,
GoodsStatusEditData: {},
StatusVisibleForm: this.$form.createForm(this),
goodStatusLoading: false,
booGoodsStatusItem: [],
delayTime: 500,
embedTraceFlowStatusList: [],
timeData: [],
boxList: [
{
name: 'SLEU0000001',
type: '20GP',
text: '开航,2024-02-20 14:00',
isActive: true
},
{
name: 'SLEU0000002',
type: '20GP',
text: '开航,2024-02-20 14:00',
isActive: false
},
{
name: 'SLEU0000003',
type: '20GP',
text: '开航,2024-02-20 14:00',
isActive: false
}
],
timeList: [],
data: [{
name: '测试111',
name1: '测试111',
name2: '测试111',
name3: '测试111',
name4: '测试111'
}],
time: null,
changeIndex:0,
labelCol: {
xs: { span: 24 },
sm: { span: 8 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 16 }
},
labelCol2: {
xs: { span: 24 },
sm: { span: 4 }
},
wrapperCol2: {
xs: { span: 24 },
sm: { span: 20 }
},
spinning: false,
USER_KEY: '',
businessId: '',
billNo: '',
carrier: '',
ctnNo: '',
USER_SECRET: '',
tstyle: { padding: '0 15px 15px', 'margin-bottom': '10px', background: '#fff' }
};
},
created() {
this.USER_KEY = this.$route.query.USER_KEY
this.carrier = this.$route.query.carrier
this.billNo = this.$route.query.billNo
this.ctnNo = this.$route.query.ctnNo
this.USER_SECRET = this.$route.query.USER_SECRET
this.getFlowInfo()
},
watch: {
'$route': {
immediate: true,
handler(to, from) {
if (this.$route.name == 'ServiceItems') {
this.USER_KEY = this.$route.query.USER_KEY
this.carrier = this.$route.query.carrier
this.billNo = this.$route.query.billNo
this.ctnNo = this.$route.query.ctnNo
this.USER_SECRET = this.$route.query.USER_SECRET
this.getFlowInfo()
}
}
}
},
methods: {
saveService(data) {
const obj = {
businessId: this.businessId,
USER_KEY: this.USER_KEY,
USER_SECRET: this.USER_SECRET,
projectCodes: [data.projectCode]
}
if (!data.isYield) {
this.bookingServiceItem.forEach((item) => {
if (item.projectCode == data.projectCode) {
item.isYield = !item.isYield
}
})
SaveServiceProjectIfram(obj).then((res) => {
if (res.success) {
if (res.data.succ) {
if (this.time !== null) {
this.stopTimer()
}
this.time = setTimeout(() => {
this.spinning = true
this.getServiceItemList(2, data.projectCode)
}, 500)
} else {
this.$message.error(res.message)
this.spinning = false
this.getServiceItemList(1)
}
} else {
this.$message.error(res.message)
}
})
} else {
this.bookingServiceItem.forEach((item) => {
if (item.projectCode == data.projectCode) {
item.isYield = !item.isYield
}
})
CancelServiceProjectIfram(obj).then((res) => {
if (res.data.succ) {
if (this.time !== null) {
this.stopTimer()
}
this.time = setTimeout(() => {
this.spinning = true
this.getServiceItemList(2, data.projectCode)
}, 500)
} else {
this.$message.error(res.message)
this.spinning = false
this.getServiceItemList(1)
}
})
}
},
handleDetail() {
this.showFlag = !this.showFlag
this.timeList = this.flowData.containerInfoList[0].containerStatusInfoList
this.flowData.containerInfoList[0].isActive = true
this.$forceUpdate()
},
handleClick(index) {
this.flowData.containerInfoList.forEach(item => {
item.isActive = false
})
this.changeIndex = index
this.flowData.containerInfoList[index].isActive = true
this.timeList = this.flowData.containerInfoList[index].containerStatusInfoList
this.$forceUpdate()
},
getFlowInfo() {
const data = {
billNo: this.billNo,
carrier: this.carrier,
ctnNo: this.ctnNo,
USER_KEY: this.USER_KEY,
USER_SECRET: this.USER_SECRET
}
// const data = {
// billNo: '237065744',
// carrier: 'MSK',
// ctnNo: '',
// USER_KEY: '731e2d42af0f4209a8edccfcae20d7c4',
// USER_SECRET: 'c513dff9ac617fd064ada5f3ccdbd6a1bde59e7c7ffe29e9dc225c49a0904a1535f7bf3d97bc2ff4'
// }
this.flowLoad = true
GetTraceFlowInfo(data).then(res => {
if (res.success) {
this.flowData = res.data.resultData
this.embedTraceFlowStatusList = res.data.embedTraceFlowStatusList
} else {
this.$message.error(res.message)
}
this.flowLoad = false
})
},
GoodsStatusHandleOk() {
const {
StatusVisibleForm: { validateFields }
} = this
this.GoodsStatusVisible = true
validateFields((errors, values) => {
if (!errors || this.GoodsStatusEditData.systemCode === 'SQXS') {
for (const key in values) {
if (typeof values[key] === 'object' && !(values[key] === null)) {
values[key] = JSON.stringify(values[key])
}
}
const data = {
businessId: this.businessId,
USER_KEY: this.USER_KEY,
USER_SECRET: this.USER_SECRET,
statusCodes: [
{
setActDate: values.setActDate,
actRemark: values.actRemark,
setActVal: values.setActVal,
statusCode: this.GoodsStatusEditData.statusSKUCode
}
]
}
this.goodStatusLoading = true
SaveServiceStatusIfram(data).then((res) => {
if (res.data.succ) {
this.GoodsStatusVisible = false
this.getStatusServiceList(1)
} else {
this.$message.error(res.data.msg)
}
this.goodStatusLoading = false
})
} else {
console.log(errors, values)
}
})
},
stopTimer() {
window.clearTimeout(this.time)
},
FnOpenEdit(data) {
setTimeout(() => {
this.GoodsStatusEditData = data
this.GoodsStatusVisible = true
this.$nextTick(() => {
this.StatusVisibleForm.setFieldsValue({
setActDate: data.actDate ? data.actDate : '',
actRemark: data.actRemark ? data.actRemark : '',
setActVal: data.actVal ? data.actVal : ''
})
})
}, 100)
},
saveGoodsStatus(data) {
const obj = {
businessId: this.businessId,
USER_KEY: this.USER_KEY,
USER_SECRET: this.USER_SECRET,
statusCodes: [{ statusCode: data.statusSKUCode }]
}
this.spinning = true
if (!data.isYield) {
this.booGoodsStatusItem.forEach((item) => {
if (item.statusSKUCode == data.statusSKUCode) {
item.isYield = !item.isYield
}
})
SaveServiceStatusIfram(obj).then((res) => {
if (res.data.succ) {
} else {
this.$message.error(res.data.msg)
this.getStatusServiceList(1)
}
this.spinning = false
})
} else {
this.booGoodsStatusItem.forEach((item) => {
if (item.statusSKUCode == data.statusSKUCode) {
item.isYield = !item.isYield
}
})
CancelServiceStatusIfram(obj).then((res) => {
if (res.data.succ) {
} else {
this.$message.error(res.data.msg)
this.getStatusServiceList(1)
}
this.spinning = false
})
}
},
getStatusServiceList(type, code) {
const data = {
queryType: 2,
businessId: this.businessId,
USER_KEY: this.USER_KEY,
USER_SECRET: this.USER_SECRET
}
if (type == 2) {
this.booGoodsStatusItem.forEach((item) => {
if (item.statusSKUCode == code) {
item.isYield = !item.isYield
}
})
}
this.spinning = true
GetServiceStatusListIfram(data).then((res) => {
if (res.data.succ) {
for (let i = 0; i < res.data.ext.length; i++) {
if (res.data.ext[i].isEnd) {
res.data.ext.splice(i + 1, 0, { isBr: true })
}
}
this.booGoodsStatusItem = res.data.ext
} else {
this.$message.error(res.data.msg)
}
this.spinning = false
})
},
getServiceItemList(type, code) {
if (type === 1) {
this.seriveLoading = true
const data = {
USER_KEY: this.USER_KEY,
USER_SECRET: this.USER_SECRET,
queryType: 0,
businessId: this.businessId
}
GetServiceProiectListIfram(data).then((res) => {
if (res.data.succ) {
this.bookingServiceItem = res.data.ext
} else {
this.$message.error(res.data.msg)
}
this.seriveLoading = false
})
} else {
this.spinning = true
this.getStatusServiceList(1)
}
}
}
}
</script>
<style lang="less" scoped>
.tag {
display: inline-block;
margin-left: 10px;
color: rgb(26, 184, 26);
text-align: center;
line-height: 20px;
background: rgb(227, 252, 248);
font-size: 12px;
height: 20px;
width: 20px;
}
.service {
background: rgb(234, 242, 255);
padding-top: 10px;
min-height: 100vh;
padding-left: 15px;
}
.list-box {
background: white;
width: 950px;
color: #17181a;
font-weight: 400;
.list-box-title {
padding: 10px;
font-size: 13px;
border-bottom: 1px solid rgb(168, 177, 192);
display: flex;
align-items: center;
justify-content: space-between;
img {
margin-right: 5px;
}
}
.list-box-content {
padding: 10px;
display: flex;
align-items: center;
padding-bottom: 10px;
.content-right {
display: flex;
overflow-x: auto;
align-content: center;
padding-bottom: 70px;
padding-left: 50px;
width: 100%;
.cont-box {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
.conent-item {
display: flex;
align-items: center;
position: relative;
flex-shrink: 0;
&.active {
.item-top {
font-weight: bold;
color: black;
}
.icon {
color: rgb(66, 102, 246);
}
.item-bottom {
color: black;
}
.line {
background: rgb(66, 102, 246);
}
}
&.isEnd {
.item-top {
font-weight: bold;
color: rgb(255, 141, 26);
}
.item-time {
color: rgb(255, 141, 26);
}
.icon {
color: rgb(255, 141, 26);
}
.item-bottom {
font-weight: bold;
color: rgb(255, 141, 26);
}
.line {
color: rgb(66, 102, 246);
}
}
.item-time {
word-wrap: break-word;
width: 80px;
position: absolute;
bottom: -48px;
text-align: center;
}
.item-top {
color: #c0bebe;
margin-bottom: 10px;
}
.icon {
height: 20px;
width: 20px;
color: #c0bebe;
}
.item-bottom {
color: #c0bebe;
margin-top: 10px;
font-size: 12px;
}
.line {
width: 50px;
height: 2px;
background: #c0bebe;
}
.line-long {
width: 100px;
border-bottom: 2px dashed #c0bebe;
}
}
}
}
}
.main-box {
background: white;
width: 950px;
margin-top: 50px;
display: flex;
.box-left {
width: 20%;
background: rgb(234, 242, 255);
}
.box-tab {
background: rgb(234, 242, 255);
border-left: 2px solid rgb(255, 87, 51);
margin-bottom: 3px;
padding: 15px 0;
padding-left: 10px;
cursor: pointer;
&.isActive {
background: white;
}
}
.box-right {
padding-top: 20px;
margin-left: 30px;
width: 80%;
padding-right: 10px;
color: #17181a;
font-weight: 400;
padding-bottom: 30px;
max-height: 1000px;
overflow-y: auto;
overflow-x: hidden;
.box-right-title {
text-align: left;
padding-left: 25px;
padding-bottom: 8px;
border-bottom: 1px solid rgb(235, 238, 245);
span {
display: inline-block;
}
}
.box-item {
border-bottom: 1px solid rgb(235, 238, 245);
display: flex;
color: #737780;
font-weight: 400;
&.isActive {
color: #17181a;
font-weight: 400;
.time-line {
background: rgb(66, 102, 246);
}
.time-circular {
border: 3px solid rgb(66, 102, 246);
}
}
}
.box-time {
width: 20px;
display: flex;
margin-right: 5px;
flex-shrink: 0;
flex-direction: column;
align-items: center;
}
.time-line {
width: 2px;
height: calc(50% - 5px);
background: rgb(201, 203, 209);
}
.time-circular {
width: 10px;
height: 10px;
border: 3px solid rgb(201, 203, 209);
border-radius: 50%;
}
}
}
</style>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="14px" height="14px" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(1 0 0 1 -8 -10 )">
<path d="M 7.351562499999999 2.372747747747747 C 7.450520833333334 2.272897897897897 7.500000000000002 2.154654654654654 7.5 2.018018018018018 C 7.500000000000002 1.8813813813813798 7.450520833333334 1.7631381381381366 7.351562499999999 1.663288288288288 C 7.252604166666667 1.5634384384384379 7.135416666666667 1.5135135135135136 7 1.5135135135135136 C 6.864583333333334 1.5135135135135136 6.747395833333334 1.5634384384384379 6.6484375 1.663288288288288 C 6.549479166666667 1.7631381381381366 6.5 1.8813813813813798 6.5 2.018018018018018 C 6.5 2.154654654654654 6.549479166666667 2.272897897897897 6.6484375 2.372747747747747 C 6.747395833333334 2.472597597597596 6.864583333333334 2.5225225225225234 7 2.5225225225225234 C 7.135416666666667 2.5225225225225234 7.252604166666667 2.472597597597596 7.351562499999999 2.372747747747747 Z M 13.9296875 9.152027027027028 C 13.9765625 9.199324324324323 14 9.25975975975976 14 9.333333333333334 L 14 12.108108108108109 C 14 12.223723723723724 13.947916666666668 12.302552552552552 13.84375 12.344594594594595 C 13.802083333333336 12.355105105105105 13.770833333333336 12.36036036036036 13.75 12.36036036036036 C 13.6875 12.36036036036036 13.627604166666668 12.336711711711711 13.5703125 12.289414414414415 L 12.84375 11.556306306306308 C 12.223958333333334 12.307807807807807 11.39453125 12.902965465465465 10.35546875 13.34177927927928 C 9.31640625 13.780593093093094 8.197916666666668 14 7 14 C 5.802083333333334 14 4.68359375 13.780593093093094 3.64453125 13.34177927927928 C 2.60546875 12.902965465465465 1.776041666666667 12.307807807807807 1.15625 11.556306306306308 L 0.4296875 12.289414414414415 C 0.3828125 12.336711711711711 0.3229166666666667 12.36036036036036 0.25 12.36036036036036 C 0.22916666666666669 12.36036036036036 0.19791666666666669 12.355105105105105 0.15625 12.344594594594595 C 0.05208333333333333 12.302552552552552 0 12.223723723723724 0 12.108108108108109 L 0 9.333333333333334 C 0 9.25975975975976 0.0234375 9.199324324324323 0.0703125 9.152027027027028 C 0.11718750000000003 9.10472972972973 0.17708333333333334 9.08108108108108 0.25 9.08108108108108 L 3 9.08108108108108 C 3.1145833333333335 9.08108108108108 3.1927083333333335 9.133633633633634 3.234375 9.23873873873874 C 3.276041666666667 9.338588588588587 3.2578125 9.430555555555555 3.1796875 9.51463963963964 L 2.3984375 10.302927927927929 C 2.7473958333333335 10.781156156156158 3.240885416666667 11.184496996996996 3.87890625 11.51295045045045 C 4.516927083333334 11.841403903903904 5.223958333333334 12.058183183183182 6 12.163288288288289 L 6 7.063063063063062 L 4.5 7.063063063063062 C 4.364583333333334 7.063063063063062 4.247395833333334 7.013138138138138 4.1484375 6.913288288288288 C 4.049479166666667 6.813438438438438 4 6.695195195195195 4 6.558558558558558 L 4 5.549549549549549 C 4 5.412912912912911 4.049479166666667 5.294669669669668 4.1484375 5.194819819819819 C 4.247395833333334 5.094969969969969 4.364583333333334 5.045045045045045 4.5 5.045045045045045 L 6 5.045045045045045 L 6 3.760135135135134 C 5.697916666666667 3.5814564564564555 5.455729166666667 3.3384009009009006 5.2734375 3.030968468468469 C 5.091145833333334 2.7235360360360366 5 2.3858858858858856 5 2.018018018018018 C 5 1.460960960960961 5.1953125 0.98536036036036 5.5859375 0.591216216216216 C 5.9765625 0.197072072072072 6.447916666666667 0 7 0 C 7.552083333333334 0 8.0234375 0.197072072072072 8.4140625 0.591216216216216 C 8.8046875 0.98536036036036 9 1.460960960960961 9 2.018018018018018 C 9 2.3858858858858856 8.908854166666668 2.7235360360360366 8.7265625 3.030968468468469 C 8.544270833333334 3.3384009009009006 8.302083333333334 3.5814564564564555 8 3.760135135135134 L 8 5.045045045045045 L 9.5 5.045045045045045 C 9.635416666666668 5.045045045045045 9.752604166666668 5.094969969969969 9.8515625 5.194819819819819 C 9.950520833333334 5.294669669669668 10 5.412912912912911 10 5.549549549549549 L 10 6.558558558558558 C 10 6.695195195195195 9.950520833333334 6.813438438438438 9.8515625 6.913288288288288 C 9.752604166666668 7.013138138138138 9.635416666666668 7.063063063063062 9.5 7.063063063063062 L 8 7.063063063063062 L 8 12.163288288288289 C 8.776041666666668 12.058183183183182 9.483072916666668 11.841403903903904 10.12109375 11.51295045045045 C 10.759114583333334 11.184496996996996 11.252604166666668 10.781156156156158 11.6015625 10.302927927927929 L 10.8203125 9.51463963963964 C 10.7421875 9.430555555555555 10.723958333333334 9.338588588588587 10.765625 9.23873873873874 C 10.807291666666668 9.133633633633634 10.885416666666668 9.08108108108108 11 9.08108108108108 L 13.75 9.08108108108108 C 13.822916666666668 9.08108108108108 13.8828125 9.10472972972973 13.9296875 9.152027027027028 Z " fill-rule="nonzero" fill="#02a7f0" stroke="none" transform="matrix(1 0 0 1 8 10 )" />
</g>
</svg>

@ -143,7 +143,8 @@
@rules="getRules"
@upDateRight="upDateRightFun"
@inGoodsSave="inGoodsSaveFun"
@handleRefsh="handleRefshRight"></rightContent>
@handleRefsh="handleRefshRight">
</rightContent>
</a-col>
</a-row>
</a-tab-pane>
@ -502,6 +503,7 @@ export default {
)
},
beforeRouteUpdate(to, from, next) {
console.log(222)
if (this.inAddSave) {
next()
return false
@ -522,7 +524,11 @@ export default {
const secActive = this.$refs.sedOrder.$data.editIndex
hisData.secActive = secActive
}
if (!this.$route.query.copyId) {
this.$set(this.historyData, `copy-${this.id}`, hisData)
} else {
this.$set(this.historyData, `copy-${this.id}-${this.$route.query.copyId}`, hisData)
}
} else if (this.$route.query.addNum) {
const hisData = {
bookingDetails: this.bookingDetails,
@ -574,6 +580,7 @@ export default {
}, 800)
},
beforeRouteLeave(to, from, next) {
console.log(3333)
this.inChildLoading = true
if (this.isCopy) {
const hisData = {
@ -595,6 +602,7 @@ export default {
this.$set(this.historyData, `copy-${this.id}`, hisData)
} else {
this.$set(this.historyData, `copy-${this.id}-${this.$route.query.copyId}`, hisData)
console.log(this.historyData,this.$route.query.copyId)
}
} else if (this.$route.query.addNum) {
const hisData = {
@ -640,6 +648,7 @@ export default {
}, 2000)
},
beforeRouteEnter(to, from, next) {
console.log(1111)
next(vm => {
vm.getRouterHis()
})
@ -742,8 +751,7 @@ export default {
getRouterHis() {
this.inChildLoading = true
const newId = this.$route.query.id ? this.$route.query.id.toString() : ''
if ((Object.keys(this.historyData).includes(`copy-${newId}`) || Object.keys(this.historyData).includes(`copy-${newId}-${this.$route.query.copyId}`)) &&
this.$route.query.isCopy === 'true') {
if ((Object.keys(this.historyData).includes(`copy-${newId}`)) && this.$route.query.isCopy === 'true' && !this.$route.query.copyId) {
if (!this.$route.query.copyId) {
const $data = JSON.parse(JSON.stringify(this.historyData[`copy-${newId}`]))
this.bookingDetails = $data.bookingDetails
@ -753,7 +761,41 @@ export default {
this.isAdd = $data.isAdd
this.tabActiveKey = $data.tabActiveKey
this.mainOrderActiveKey = $data.mainOrderActiveKey
}
this.id = this.$route.query.id
this.isCopy = this.$route.query.isCopy
this.inPageLoading = false
setTimeout(() => {
if (this.bookingDetails.hbList && this.bookingDetails.hbList.length > 0) {
this.Showtabs = true
if (Object.keys(this.$refs).includes('sedOrder')) {
this.$refs.sedOrder.init(this.bookingDetails.hbList)
}
} else {
this.Showtabs = false
if (Object.keys(this.$refs).includes('sedOrder')) {
this.$refs.sedOrder.init([])
}
}
if (Object.keys(this.$refs).includes('goodsTable')) {
this.$refs.goodsTable.init()
}
}, 200)
setTimeout(() => {
const key = this.$route.fullPath
const detailsChange = Object.keys(this.needSavePages).includes(key)
? !!this.needSavePages[key].details
: false
this.checkSaveFun({ type: 'details', hasChange: detailsChange })
const hbListChange = !!this.needSavePages[key].hbList
this.checkSaveFun({ type: 'hbList', hasChange: hbListChange })
this.inChildLoading = false
}, 500)
this.isLockBooking = false
this.getFilter()
this.$forceUpdate()
} else if (this.$route.query.isCopy === 'true' && this.$route.query.copyId && Object.keys(this.historyData).includes(`copy-${newId}-${this.$route.query.copyId}`)) {
const $data = JSON.parse(JSON.stringify(this.historyData[`copy-${newId}-${this.$route.query.copyId}`]))
this.bookingDetails = $data.bookingDetails
this.oldBookingDetails = JSON.parse(JSON.stringify(this.bookingDetails))
@ -762,7 +804,6 @@ export default {
this.isAdd = $data.isAdd
this.tabActiveKey = $data.tabActiveKey
this.mainOrderActiveKey = $data.mainOrderActiveKey
}
this.id = this.$route.query.id
this.isCopy = this.$route.query.isCopy
this.inPageLoading = false
@ -950,6 +991,7 @@ export default {
this.$refs.basicInfo.$refs.basicFrom.clearValidate()
this.$refs.mailingInfo.$refs.mailingFrom.clearValidate()
this.$refs.cargoInfo.$refs.cargoFrom.clearValidate()
console.log(this.historyData)
},
init() {
this.bookingDetails = JSON.parse(JSON.stringify(initDetail))

@ -1503,7 +1503,6 @@ export default {
this.tableData = arr
this.tableLoaded = true
this.totalCtnall = ''
console.log(this.tableData)
} else {
this.tableData = []
this.tableLoaded = true

@ -1,7 +1,7 @@
<template>
<a-spin :spinning="loading">
<div class="main">
<div style="width: 80%;margin-right: 20px;background: white;padding: 10px;">
<div style="width: 74%;margin-right: 20px;background: white;padding: 10px;">
<div style="margin-bottom: 20px;">
<a-button type="primary" @click="handleSave"></a-button>
<a-button v-if="type === 'Edit'" style="margin: 0 10px;" type="primary"></a-button>
@ -12,9 +12,12 @@
</a-popconfirm>
</div>
<a-form-model :model="form" :label-col="labelCol" :wrapper-col="wrapperCol">
<div class="title" v-if="type === 'Edit'"></div>
<div class="title" v-if="type === 'Edit' && form.bookingSlotSaleInfoList.length > 0"></div>
<div v-if="type === 'Edit'">
<div class="line-bootm" v-for="(item, index) in form.bookingSlotSaleInfoList" :key="index">
<div
:class="{ 'line-bootm': index != form.bookingSlotSaleInfoList.length - 1 }"
v-for="(item, index) in form.bookingSlotSaleInfoList"
:key="index">
<a-row>
<a-col :span="6">
<a-form-model-item label="委托单位">
@ -171,7 +174,7 @@
<a-form-model-item label="ETD">
<a-date-picker
valueFormat="YYYY-MM-DD 00:00:00"
style="width: 75%;"
style="width: 70%;"
v-model="form.etd"
format="YYYY-MM-DD" />
<span class="week" v-if="etdWeek && etdWeek !== 'NaN'">W{{ etdWeek || '--' }}</span>
@ -245,7 +248,7 @@
</a-col>
<a-col :span="6">
<a-form-model-item label="箱使天数">
<a-input style="width: 90%;" v-model="form.detensioN_FREE_DAYS" />
<a-input style="width: 80%;" v-model="form.detensioN_FREE_DAYS" />
<span style="margin-left: 10px;"></span>
</a-form-model-item>
</a-col>
@ -363,7 +366,7 @@
</vxe-pager>
</div>
</div>
<div style="background: white;padding: 10px;width: 19%;">
<div style="background: white;padding: 10px;width: 25%;">
<a-card :bodyStyle="tstyle" :bordered="false">
<div class="right-title"><i class="iconfont icon-fujian-wenjian"></i><span>附件</span></div>
<div class="content">
@ -406,7 +409,7 @@
<div class="list">
<span class="btn">{{ log.createdUserName }}</span>
<span class="btn">
{{ log.createdTime.substring(0, 10) }}
{{ log.createdTime }}
<!-- <span class="more"> -->
<i
class="iconfont icon-xia more"
@ -475,7 +478,8 @@ export default {
return {
form: {
ctnList: [],
logList: []
logList: [],
bookingSlotSaleInfoList: []
},
boxOpenFlag: false,
loadData: [],
@ -502,6 +506,7 @@ export default {
UserList1: [],
UserList: [],
id: 0,
oldBook: [],
dataSource: [],
columns: [
{
@ -758,6 +763,9 @@ export default {
BookingSlotDetail({ id: this.id }).then(res => {
if (res.success) {
this.form = res.data
if (this.form.bookingSlotSaleInfoList) {
this.oldBook = JSON.parse(JSON.stringify(this.form.bookingSlotSaleInfoList))
}
} else {
this.$message.error(res.message)
}
@ -815,7 +823,6 @@ export default {
this.$forceUpdate()
},
handleSave() {
console.log(this.form)
if (this.form.bookinG_SLOT_TYPE === 'CONTRACT_ORDER') {
this.form.bookinG_SLOT_TYPE_NAME = '合约订舱'
}
@ -835,15 +842,23 @@ export default {
}
})
}
// this.form.weeK_AT = 'W' + this.etdWeek
this.form.ctN_STAT = this.boxTotal
this.loading = true
for (let i = 0; i < this.form.bookingSlotSaleInfoList.length; i++) {
this.form.bookingSlotSaleInfoList[i].updateFlag = false
const change = this.compareObjects(this.form.bookingSlotSaleInfoList[i], this.oldBook[i])
if (Object.keys(change).length > 0) {
this.form.bookingSlotSaleInfoList[i].updateFlag = true
}
}
BookingSlotSave(this.form).then(res => {
if (res.success) {
this.$message.success('保存成功')
this.type = 'Edit'
this.id = res.data.id
this.getDetail()
this.form = res.data
this.loading = false
// this.getDetail()
} else {
this.$message.error(res.message)
this.loading = false
@ -876,6 +891,35 @@ export default {
})
this.$forceUpdate()
},
compareObjects(oldObj, newObj) {
const differences = {};
for (const key in oldObj) {
if (oldObj.hasOwnProperty(key)) {
if (newObj.hasOwnProperty(key)) {
if (oldObj[key] !== newObj[key]) {
differences[key] = {
oldValue: oldObj[key],
newValue: newObj[key]
};
}
} else {
differences[key] = {
oldValue: oldObj[key],
newValue: undefined // undefined
};
}
}
}
for (const key in newObj) {
if (newObj.hasOwnProperty(key) && !oldObj.hasOwnProperty(key)) {
differences[key] = {
oldValue: undefined, // undefined
newValue: newObj[key]
};
}
}
return differences;
},
getWeek(dateTime) {
// eslint-disable-next-line camelcase
const temp_ms = new Date(dateTime).getTime()
@ -927,7 +971,7 @@ export default {
font-size: 16px;
margin-left: 8px;
border-radius: 2px;
width: 52px;
width: 48px;
text-align: center;
}
@ -1153,8 +1197,8 @@ export default {
}
.cargo-info {
max-height: 1015px;
overflow: visible;
max-height: 800px;
overflow: scroll;
.info-header {
display: flex;
@ -1258,10 +1302,12 @@ export default {
}
}
}
.line-bootm {
border-bottom: 1px dashed #696767;
border-bottom: 1px dashed #cccbcb;
margin-bottom: 10px;
}
/deep/ .ant-form-item {
margin-bottom: 10px !important;
}

@ -146,12 +146,12 @@
<a-row>
<a-col :span="4">
<a-form-item label="航线名称">
<a-input v-model="form.week_at" allow-clear placeholder="请输入航线名称" />
<a-input v-model="form.LANENAME" allow-clear placeholder="请输入航线名称" />
</a-form-item>
</a-col>
<a-col :span="4">
<a-form-item label="Week">
<a-input v-model="form.week_at" allow-clear placeholder="请输入Week" />
<a-input-number style="width:100%" v-model="form.week_at" allow-clear placeholder="请输入Week" />
</a-form-item>
</a-col>
<a-col :span="4">
@ -680,6 +680,48 @@ export default {
field: 'iS_CANCELLATION',
slots: { default: 'iS_CANCELLATION' }
},
{
title: '委托单位',
align: 'center',
width: '100',
field: 'customername'
},
{
title: '客服',
align: 'center',
width: '100',
field: 'custservice'
},
{
title: '销售',
align: 'center',
width: '100',
field: 'sale'
},
{
title: 'SHIPPER',
align: 'center',
width: '100',
field: 'shipper'
},
{
title: '品名',
align: 'center',
width: '100',
field: 'goodsname'
},
{
title: '卖价',
align: 'center',
width: '100',
field: 'sellinG_PRICE'
},
{
title: '销售日期',
align: 'center',
width: '100',
field: 'salE_TIME'
},
{
title: '装货地',
align: 'center',
@ -939,7 +981,7 @@ export default {
const arr = ['salE_TIME', 'sellinG_PRICE', 'goodsname', 'shipper', 'sale', 'custservice', 'customername']
const fields = [];
const cellValue = row[column.property];
if ((cellValue && !arr.includes(column.property)) || column.type === 'checkbox') {
if ((cellValue && !arr.includes(column.property)) || column.type === 'checkbox' || column.field === 'caozuo') {
const prevRow = visibleData[_rowIndex - 1];
let nextRow = visibleData[_rowIndex + 1];
if (prevRow && prevRow.id === row.id) {

@ -219,6 +219,16 @@ export default {
values[key] = JSON.stringify(values[key])
}
}
const arr = []
this.ItemData.forEach(item => {
if (item.itemCode == values.itemCode) {
values.itemName = item.itemName
arr.push(1)
}
})
if (arr.length === 0) {
values.itemName = values.itemCode
}
DJYTenantParamAddParamValue(values)
.then(res => {
if (res.success) {

@ -220,7 +220,16 @@ export default {
}
values.id = this.data.id
const arr = []
this.ItemData.forEach(item => {
if (item.itemCode == values.itemCode) {
values.itemName = item.itemName
arr.push(1)
}
})
if (arr.length === 0) {
values.itemName = values.itemCode
}
DJYTenantParamEditParamValue(values)
.then(res => {
if (res.success) {

@ -79,7 +79,13 @@
</div>
</template>
</vxe-toolbar>
<vxe-table :data="loadData" stripe resizable round :loading="loading" empty-text="">
<vxe-table
:data="loadData"
stripe
resizable
round
:loading="loading"
empty-text="没有更多数据了!">
<vxe-column type="seq" width="40" fixed="left"></vxe-column>
<vxe-column
v-for="item in columns"
@ -89,6 +95,10 @@
:title="item.title"
:align="item.align"
>
<template #default="{ row }">
<span v-if="item.dataIndex == 'itemCodeName'"> {{ row.itemCodeName ? row.itemCodeName : row.itemCode }} </span>
<span v-else>{{ row[item.dataIndex] }}</span>
</template>
</vxe-column>
<vxe-column title="操作" fixed="right" width="200" align="center">
<template #default="{ row }">
@ -172,7 +182,7 @@ export default {
title: '租户参数名称',
align: 'center',
width: '80',
dataIndex: 'itemCode'
dataIndex: 'itemCodeName'
},
{
title: '备注',
@ -259,7 +269,7 @@ export default {
})
DJYTenantParamGet({ pageNo: 1, pageSize: 999 }).then(res => {
this.TypeData = res.data.items
let data = []
const data = []
res.data.items.forEach(item => {
if (data.length) {
let type2 = false
@ -286,7 +296,7 @@ export default {
},
FnGetData() {
this.loading = true
let data = { ...this.queryParam }
const data = { ...this.queryParam }
DJYTenantParamGetParamValue(data).then(res => {
this.loadData = res.data.items
this.loading = false

@ -3,7 +3,6 @@
<a-card :bordered="false" :bodyStyle="tstyle">
<div
class="table-page-search-wrapper"
v-if="hasPerm('BookingTemplate:page')"
:class="advanced ? 'Open' : 'Close'">
<a-form layout="inline">
<a-row :gutter="48">

@ -189,11 +189,16 @@ export default {
values.paramType = item.type
}
})
const arr = []
this.ItemData.forEach(item => {
if (item.itemCode == values.itemCode) {
values.itemName = item.itemName
arr.push(1)
}
})
if (arr.length === 0) {
values.itemName = values.itemCode
}
saveParamValue(values)
.then(res => {
if (res.success) {

@ -199,11 +199,16 @@ export default {
values.paramType = item.type
}
})
const arr = []
this.ItemData.forEach(item => {
if (item.itemCode == values.itemCode) {
values.itemName = item.itemName
arr.push(1)
}
})
if (arr.length === 0) {
values.itemName = values.itemCode
}
saveParamValue(values)
.then(res => {
if (res.success) {

@ -81,6 +81,10 @@
:title="item.title"
:align="item.align"
>
<template #default="{ row }">
<span v-if="item.dataIndex == 'itemCodeName'"> {{ row.itemCodeName ? row.itemCodeName : row.itemCode }} </span>
<span v-else>{{ row[item.dataIndex] }}</span>
</template>
</vxe-column>
<vxe-column title="操作" fixed="right" width="200" align="center">
<template #default="{ row }">
@ -146,7 +150,7 @@ export default {
pageSize: 10
},
ColumnsQuery: [],
customerQuery:"",
customerQuery: '',
columns: [
{
title: '客户',

Loading…
Cancel
Save