lijingjia 4 months ago
commit dfe0d6c038

@ -0,0 +1,44 @@
import { request } from '/@/utils/request'
import { DataResult, PageRequest } from '/@/api/model/baseModel'
export function GetShippingOrderCompareResult(data) {
return request<DataResult>({
url: '/taskApi/TaskShippingOrderCompare/GetShippingOrderCompareResult',
method: 'get',
params: data,
})
}
export function GetDraftCompareResultInfo(data) {
return request<DataResult>({
url: '/taskApi/TaskDraftCompare/GetDraftCompareResultInfo',
method: 'post',
data: data,
})
}
export function DownloadFileByBC(parameter) {
return request<DataResult>({
url: '/taskApi/TaskManage/DownloadFile',
method: 'get',
params: parameter,
responseType: 'blob'
})
}
export function SaveDraftComparellanual(parameter) {
return request<DataResult>({
url: '/taskApi/TaskDraftCompare/SaveDraftCompareManual',
method: 'post',
data: parameter
})
}
export function ExcuteShippingOrderCompareBatch(parameter) {
return request<DataResult>({
url: '/taskApi/TaskShippingOrderCompare/ExcuteShippingOrderCompareBatch',
method: 'post',
data: parameter
})
}

@ -0,0 +1,581 @@
<template>
<div>
<a-modal :title="formatSheet.isExistsDiff ? '格式单比对(有差异)' : '格式单比对(正常)'" @cancel="formatSheetVisible = false"
:visible="formatSheetVisible" class="formatSheetModal" width="90%">
<template slot="footer">
<a-button key="back" @click="formatSheetVisible = false"> 关闭 </a-button>
</template>
<a-spin :spinning="spinning">
<div>
<div style="margin:10px 0" v-if="formatSheet.manualFeedBackResult">
{{ formatSheet.manualFeedBackResult.operTime }}
人工修正 {{ formatSheet.manualFeedBackResult.operUser }}
原因{{ formatSheet.manualFeedBackResult.reason }}
备注 {{ formatSheet.manualFeedBackResult.operNote }}
</div>
<div style="display: flex">
<div style="width: 55%">
<div>
<div v-if="formatSheet.total > 0" style="display: flex; justify-content: space-between"
class="TaskShippingOrderCompareP">
<div>
{{ formatSheet.compareTime }}
<span v-if="formatSheet.isExistsDiff">
比对异常 合计
<span class="TaskShippingOrderCompareSpan">{{ formatSheet.total }}</span>
<a v-if="formatSheet.lstDraftCompareRlt === 'DIFF'" href="javascript:;"
@click="openPersonal('DRAFT')">人工处理</a>
</span>
</div>
<div>
显示全部
<a-switch :checked="formatFlag" @change="formatFlag = !formatFlag" />
</div>
</div>
<div style="display: flex; align-items: flex-start" v-else>
<CheckCircleFilled
style="color: rgb(82, 196, 26); font-size: 50px; margin-top: 5px">
</CheckCircleFilled>
<div style="margin-left: 20px">
<div style="font-weight: bold; font-size: 22px">格式单比对(正常)</div>
<div style="font-weight: bold">提单号:{{ formatSheet.mBlNo }}</div>
<div style="font-weight: bold">{{ formatSheet.compareTime }}</div>
</div>
<div style="margin: 5px 0px 0px 40px">
显示全部
<a-switch :checked="formatFlag" @change="formatFlag = !formatFlag" />
</div>
</div>
<div v-if="!formatFlag && formatSheet.total > 0" class="TaskShippingOrderCompareMainBox"
style="height: 600px">
<div class="TaskShippingOrderCompareMain">
<div class="TaskShippingOrderCompareMainHeader">
<div>
<p>提单号</p>
<div
style="width: 100%; height: 1px; border-bottom: 1px dashed; margin: 5px 0">
</div>
<p>{{ formatSheet.mBlNo }}</p>
</div>
</div>
<div v-for="(item, index) in formatSheet.showDetailList" :key="index"
style="display: flex; margin-top: 15px"
v-show="item.pCode != 'ContaList' && item.isDiff">
<p style="" v-if="item.msg">
<CloseCircleFilled
style="color: rgb(194, 5, 5); font-size: 18px; margin-right: 35px">
</CloseCircleFilled>
</p>
<p v-if="item.isDiff" style="width: 90px; margin-right: 20px">{{
item.fieldName
}}:
</p>
<div v-if="item.isDiff" style="width: 60%">
<div style="display: flex">
<RightCircleOutlined
style="margin-top: 4px; margin-right: 5px; color: rgb(0, 153, 204)" />
<span
style="margin-right: 10px; font-weight: bold; width: 42px; flex-shrink: 0">本地</span>
<div style="margin-bottom: 15px">{{ item.reqVal }}</div>
</div>
<div style="display: flex">
<RightCircleOutlined
style="margin-top: 4px; margin-right: 5px; color: rgb(100, 163, 90)" />
<span
style="margin-right: 10px; font-weight: bold; width: 42px; flex-shrink: 0">格式单</span>
<div v-html="item.mergeHtml"></div>
</div>
</div>
</div>
</div>
<div class="TaskShippingOrderCompareMain">
<div>
<div>
<p>箱信息</p>
<div
style="width: 100%; height: 1px; border-bottom: 1px dashed; margin: 5px 0">
</div>
</div>
</div>
<div v-for="(item, index) in formatSheet.showDetailList" :key="index"
v-show="(item.pCode == 'ContaList' && item.isDiff) || item.fieldName == '箱号'"
style="display: flex; margin-top: 15px; align-items: flex-start">
<div v-if="item.fieldName == '箱号' && formatSheet.isShowCntall">:{{
item.primaryKey
}}
</div>
<p style="" v-if="item.msg && item.isDiff && item.fieldName != '箱号'">
<CloseCircleFilled
style="color: rgb(194, 5, 5); font-size: 18px; margin-right: 35px">
</CloseCircleFilled>
</p>
<p v-if="item.isDiff && item.fieldName != ''"
style="width: 90px; margin-right: 20px">
{{ item.fieldName }}:
</p>
<div v-if="item.isDiff && item.fieldName != '箱号'" style="width: 60%">
<div style="display: flex">
<RightCircleOutlined
style="margin-top: 4px; margin-right: 5px; color: rgb(0, 153, 204)" />
<span
style="margin-right: 10px; font-weight: bold; width: 42px; flex-shrink: 0">本地</span>
<div style="margin-bottom: 15px">{{ item.reqVal }}</div>
</div>
<div style="display: flex">
<RightCircleOutlined
style="margin-top: 4px; margin-right: 5px; color: rgb(100, 163, 90)" />
<span
style="margin-right: 10px; font-weight: bold; width: 42px; flex-shrink: 0">格式单</span>
<div v-html="item.mergeHtml"></div>
</div>
</div>
</div>
</div>
</div>
<div v-if="!formatFlag && formatSheet.total == 0"></div>
<div v-if="formatFlag" class="TaskShippingOrderCompareMainBox" style="height: 600px">
<div class="TaskShippingOrderCompareMain">
<div class="TaskShippingOrderCompareMainHeader">
<div>
<p>提单号</p>
<div
style="width: 100%; height: 1px; border-bottom: 1px dashed; margin: 5px 0">
</div>
<p>{{ formatSheet.mBlNo }}</p>
</div>
</div>
<div v-for="(item, index) in formatSheet.showDetailList" :key="index"
style="display: flex; margin-top: 15px" v-show="item.pCode != 'ContaList'">
<p style="" v-if="item.msg">
<CloseCircleFilled
style="color: rgb(194, 5, 5); font-size: 18px; margin-right: 35px">
</CloseCircleFilled>
</p>
<p style="" v-else>
<CheckCircleFilled
style="color: rgb(0, 153, 68); font-size: 18px; margin-right: 35px">
</CheckCircleFilled>
</p>
<p style="width: 90px; margin-right: 20px">{{ item.fieldName }}:</p>
<div style="width: 60%">
<div style="display: flex">
<RightCircleOutlined
style="margin-top: 4px; margin-right: 5px; color: rgb(0, 153, 204)" />
<span
style="margin-right: 10px; font-weight: bold; width: 42px; flex-shrink: 0">本地</span>
<div style="margin-bottom: 15px">{{ item.reqVal }}</div>
</div>
<div style="display: flex">
<RightCircleOutlined
style="margin-top: 4px; margin-right: 5px; color: rgb(100, 163, 90)" />
<span
style="margin-right: 10px; font-weight: bold; width: 42px; flex-shrink: 0">格式单</span>
<div v-if="item.isDiff" v-html="item.mergeHtml"></div>
<div v-else v-html="item.targetVal"></div>
</div>
</div>
</div>
</div>
<div class="TaskShippingOrderCompareMain">
<div>
<div>
<p>箱信息</p>
<div
style="width: 100%; height: 1px; border-bottom: 1px dashed; margin: 5px 0">
</div>
</div>
</div>
<div v-for="(item, index) in formatSheet.showDetailList" :key="index"
v-show="item.pCode == 'ContaList'"
:style="{ marginTop: (item.pCode == 'ContaList' ? '15x' : '0px') }"
style="display: flex; align-items: flex-start">
<div v-if="item.fieldName == '箱号'">:{{ item.primaryKey }}</div>
<div style="display: flex; align-items: flex-start" v-else>
<p style="" v-if="item.msg">
<CloseCircleFilled
style="color: rgb(194, 5, 5); font-size: 18px; margin-right: 35px">
</CloseCircleFilled>
</p>
<p style="" v-else>
<CheckCircleFilled
style="color: rgb(0, 153, 68); font-size: 18px; margin-right: 35px">
</CheckCircleFilled>
</p>
<p style="width: 90px; margin-right: 20px; flex-shrink: 0">{{
item.fieldName
}}:
</p>
<div style="width: 60%">
<div style="display: flex">
<RightCircleOutlined
style="margin-top: 4px; margin-right: 5px; color: rgb(0, 153, 204)" />
<span
style="margin-right: 10px; font-weight: bold; width: 42px; flex-shrink: 0">本地</span>
<div style="margin-bottom: 15px">{{ item.reqVal }}</div>
</div>
<div style="display: flex">
<RightCircleOutlined
style="margin-top: 4px; margin-right: 5px; color: rgb(100, 163, 90)" />
<span
style="margin-right: 10px; font-weight: bold; width: 42px; flex-shrink: 0">格式单</span>
<div v-if="item.isDiff" v-html="item.mergeHtml"></div>
<div v-else v-html="item.targetVal"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<a-spin class="padUrl" style="width: 100%; min-height: 600px" :spinning="pdfLoading">
<iframe style="width: 100%; height: 100%" :src="pdfUrl" frameborder="0"></iframe>
</a-spin>
</div>
</div>
</a-spin>
</a-modal>
<a-modal :title="TaskShippingOrderCompareData.isExistsDiff ? '下货纸比对(有差异)' : '下货纸比对(正常)'"
@cancel="TaskShippingOrderCompareVisible = false" :visible="TaskShippingOrderCompareVisible"
class="formatSheetModal" width="40%">
<template slot="footer">
<a-button key="back" @click="TaskShippingOrderCompareVisible = false"> 关闭 </a-button>
</template>
<a-spin :spinning="spinning">
<div style="margin:10px 0;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;"
:title="TaskShippingOrderCompareData.manualFeedBackResult.operNote"
v-if="TaskShippingOrderCompareData.manualFeedBackResult">
{{ TaskShippingOrderCompareData.manualFeedBackResult.operTime }}
人工修正 {{ TaskShippingOrderCompareData.manualFeedBackResult.operUser }}
原因{{ TaskShippingOrderCompareData.manualFeedBackResult.reason }}
备注 {{ TaskShippingOrderCompareData.manualFeedBackResult.operNote }}
</div>
<p class="TaskShippingOrderCompareP">
{{ TaskShippingOrderCompareData.compareTime }}
<span v-if="TaskShippingOrderCompareData.isExistsDiff">
比对异常 合计
<span class="TaskShippingOrderCompareSpan">{{ TaskShippingOrderCompareData.total }}</span>
<a v-if="TaskShippingOrderCompareData.lstShipOrderCompareRlt != 'NO_DIFF'" href="javascript:;"
@click="openPersonal('SHIPORDER')">人工处理</a>
</span>
</p>
<div class="TaskShippingOrderCompareMainBox">
<div class="TaskShippingOrderCompareMain">
<div class="TaskShippingOrderCompareMainHeader">
<div>
<p>提单号本地数据</p>
<p>--------------------------</p>
<p>{{ TaskShippingOrderCompareData.mBlNo }}</p>
</div>
<div></div>
<div>
<p>提单号场站数据</p>
<p>--------------------------</p>
<p>{{ TaskShippingOrderCompareData.mBlNo }}</p>
</div>
</div>
<div class="TaskShippingOrderCompareMainList"
v-for="(item, index) in TaskShippingOrderCompareData.showDetailList" :key="index"
v-show="item.pCode != 'ContaList'">
<p>{{ item.fieldName }}:</p>
<p>{{ item.reqVal }}</p>
<p v-if="item.msg">
<CloseOutlined :style="{ color: 'red' }" />
</p>
<p v-else>
<CheckOutlined :style="{ color: 'green' }" />
</p>
<p>{{ item.fieldName }}:</p>
<p v-if="!item.isDiff">{{ item.targetVal }}</p>
<p v-else v-html="item.mergeHtml"></p>
</div>
</div>
<div class="TaskShippingOrderCompareMain">
<div class="TaskShippingOrderCompareMainHeader Box">
<div>
<p>箱信息本地数据</p>
</div>
<div></div>
<div>
<p>箱信息场站数据</p>
</div>
</div>
<div v-for="(item, index) in TaskShippingOrderCompareData.showDetailList" :key="index"
v-show="item.pCode == 'ContaList'" :class="item.fieldName == '箱号' ? 'TaskShippingOrderCompareMainList BoxNo' : 'TaskShippingOrderCompareMainList'
">
<p>{{ item.fieldName }}:</p>
<p>{{ item.reqVal }}</p>
<p v-if="item.msg">
<CloseOutlined :style="{ color: 'red' }" />
</p>
<p v-else>
<CheckOutlined :style="{ color: 'green' }" />
</p>
<p>{{ item.fieldName }}:</p>
<p v-if="!item.isDiff">{{ item.targetVal }}</p>
<p v-else v-html="item.mergeHtml"></p>
</div>
</div>
</div>
</a-spin>
</a-modal>
<a-modal :title="formatTitle" width="900px" :visible="personalFlag" :zIndex="1100" @ok="handleSubPer"
@cancel="personalFlag = false">
<div style="margin-top: 20px">修正说明</div>
<a-textarea v-model:value="personal.notes" :auto-size="{ minRows: 4, maxRows: 8 }" />
<div style="display: flex; align-items: center; margin-top: 20px">
原因
<div style="margin-left: 20px">
<a-checkbox v-model:checked="personal.isOCRError">识别有问题</a-checkbox>
<a-checkbox v-model:checked="personal.isEditError">订舱录入有问题</a-checkbox>
<a-checkbox v-model:checked="personal.isAgentError">代理录入有问题</a-checkbox>
</div>
</div>
</a-modal>
</div>
</template>
<script lang="ts" setup>
import { ref, emit, watch, defineExpose } from 'vue'
import { GetDraftCompareResultInfo, GetShippingOrderCompareResult, DownloadFileByBC, SaveDraftComparellanual, ExcuteShippingOrderCompareBatch } from './api'
import { RightCircleOutlined, CheckCircleFilled, CloseCircleFilled, CloseOutlined, CheckOutlined } from '@ant-design/icons-vue';
import { useMessage } from '../../hooks/web/useMessage'
const { createMessage } = useMessage()
const TaskShippingOrderCompareVisible = ref(false)
const TaskShippingOrderCompareData = ref({}) as any
const formatSheetVisible = ref(false)
const formatSheet = ref({}) as any
const formatPdf = ref('')
const pdfLoading = ref(false)
const formatFlag = ref(false)
const spinning = ref(false)
const formatTitle = ref('')
const personalFlag = ref(false)
const personal = ref({}) as any
const formatType = ref('')
function openPersonal(type) {
personalFlag.value = true
personal.value = {}
if (type === 'DRAFT') {
formatTitle.value = '格式单比对-人工处理'
} else {
formatTitle.value = '下货纸比对-人工处理'
}
formatType.value = type
}
function handleSubPer() {
const data = {
bookingId: formatSheet.value.origPKId || TaskShippingOrderCompareData.value.origPKId,
mblNo: formatSheet.value.mBlNo || TaskShippingOrderCompareData.value.mBlNo,
taskCompareId: formatSheet.value.taskCompareId || TaskShippingOrderCompareData.value.taskCompareId,
compareType: formatType.value,
compareTime: personal.value.compareTime,
isOCRError: personal.value.isOCRError ? 1 : 0,
isEditError: personal.value.isEditError ? 1 : 0,
isAgentError: personal.value.isAgentError ? 1 : 0,
notes: personal.value.notes
}
SaveDraftComparellanual(data).then(res => {
if (res.success) {
createMessage.success('操作成功')
formatSheetVisible.value = false
TaskShippingOrderCompareVisible.value = false
personal.valueFlag = false
} else {
createMessage.error(res.message)
}
})
}
const pdfUrl = ref('')
function initLstDraft(row) {
spinning.value = true
pdfUrl.value = ''
TaskShippingOrderCompareData.value = {}
GetDraftCompareResultInfo({ bookingid: row.id }).then((res) => {
if (!res.succ) {
spinning.value = false
createMessage.success(res.msg)
} else {
if (res.extra) {
formatSheet.value = res.extra
formatSheet.value.lstDraftCompareRlt = row.lstDraftCompareRlt
formatSheet.value.total = res.total
formatSheetVisible.value = true
const arr = [] as any
formatSheet.value.showDetailList.forEach((item) => {
if (item.pCode === 'ContaList' && item.isDiff) {
arr.push(1)
}
})
if (arr.length == 0) {
formatSheet.value.isShowCntall = false
} else {
formatSheet.value.isShowCntall = true
}
} else {
createMessage.success(res.msg)
}
spinning.value = false
if (res.extra3) {
pdfLoading.value = true
const data = {
taskId: res.extra3,
fileCategory: 'draft'
}
DownloadFileByBC(data).then(res => {
if (res.type === 'application/json') {
const reader = new FileReader() as any
reader.readAsText(res, 'utf-8')
reader.onload = () => {
const _res = JSON.parse(reader.result)
createMessage.error(_res.message)
}
} else {
var contentDisposition = res.headers['content-disposition']
var patt = new RegExp('filename=([^;]+\\.[^\\.;]+);*')
var result = patt.exec(contentDisposition) as any
console.log(patt, result, contentDisposition, res)
var filename = result[1]
var reg = /^["](.*)["]$/g
if (res.data.size > 150) {
pdfUrl.value = window.URL.createObjectURL(new Blob([res.data], { type: 'application/pdf;charset=utf-8' }))
}
}
pdfLoading.value = false
})
}
}
})
}
function initTask(row) {
TaskShippingOrderCompareVisible.value = true
spinning.value = true
GetShippingOrderCompareResult({ bookingId: row.id }).then((res) => {
if (!res.succ) {
spinning.value = false
createMessage.error(res.msg)
} else {
if (res.extra) {
TaskShippingOrderCompareData.value = res.extra
TaskShippingOrderCompareData.value.total = res.total
TaskShippingOrderCompareData.value.lstShipOrderCompareRlt = row.lstShipOrderCompareRlt
spinning.value = false
} else {
createMessage.success(res.msg)
spinning.value = false
}
}
})
}
const emit = defineEmits(['setLoad', 'handleSuccess'])
function reload(row) {
emit('setLoad')
ExcuteShippingOrderCompareBatch([row.id])
.then((res) => {
if (!res.succ) {
createMessage.success(res.msg)
} else {
if (res.extra) {
TaskShippingOrderCompareData.value = res.extra
TaskShippingOrderCompareData.value.total = res.total
TaskShippingOrderCompareData.value.lstShipOrderCompareRlt = row.lstShipOrderCompareRlt
} else {
createMessage.success(res.msg)
}
}
emit('handleSuccess')
})
}
defineExpose({ initLstDraft, initTask, reload })
</script>
<style lang="less" scoped>
.TaskShippingOrderCompareP {
border-bottom: 1px solid #000;
padding: 5px;
background: #0000000e;
.TaskShippingOrderCompareSpan {
font-weight: bolder;
color: red;
}
}
.TaskShippingOrderCompareMainBox {
height: 55vh;
overflow-y: auto;
.TaskShippingOrderCompareMain {
p {
margin-bottom: 0;
}
.TaskShippingOrderCompareMainHeader {
display: flex;
>div {
&:nth-child(1) {
flex: 3;
}
&:nth-child(2) {
width: 46px;
}
&:nth-child(3) {
flex: 3;
}
>p {
&:first-child {
font-weight: bolder;
}
}
}
&.Box {
border-top: 1px solid #000;
// border-bottom: 1px solid #000;
padding: 0.5rem 0 0 0;
margin-bottom: 0.5rem;
}
}
.TaskShippingOrderCompareMainList {
display: flex;
align-items: center;
margin-bottom: 0.5rem;
>p {
flex: 2;
&:nth-child(1) {
flex: 1;
}
&:nth-child(3) {
flex: 0;
margin: 0 1rem;
}
&:nth-child(4) {
flex: 1;
}
}
&.BoxNo {
padding-top: 0.5rem;
border-top: 1px solid #000;
&:nth-child(1) {
padding-top: 0;
border: none;
}
}
}
}
}
</style>

@ -346,6 +346,16 @@ export const FeeStatus = [
]
//列表
export const columns: BasicColumn[] = [
{
dataIndex: 'lstDraftCompareRlt',
title: '格式单比对',
width: 120,
},
{
dataIndex: 'lstShipOrderCompareRlt',
title: '下货纸比对',
width: 120,
},
{
dataIndex: 'customerNo',
title: '委托编号',

@ -88,60 +88,106 @@
</span>
<span v-else> <i class="iconfont icon-lock-openkaisuo"></i> </span>
</template>
<!-- 格式单比对 -->
<template v-if="column.dataIndex == 'lstDraftCompareRlt'">
<div class="goods-status">
<a-popover>
<template slot="content">
<p>
比对时间: <span>{{ record.lstDraftCompareDate }}</span>
</p>
</template>
<div>
<div v-if="record.lstDraftCompareRlt == 'DIFF'">
<i class="icon-shibai iconfont compareIcon" style="color: red;"></i>
</div>
<div v-else-if="record.lstDraftCompareRlt == 'NO DIFF'">
<i class="icon-chenggong iconfont compareIcon" style="color: green;"></i>
</div>
</div>
</a-popover>
<i v-if="record.lstDraftCompareRlt" title="查看比对结果" style="margin-left: 10px" @click="handleFormatContrast(record)"
class="icon-shiyongwendang iconfont compareIcon"></i>
</div>
</template>
<!-- 下货纸比对 -->
<template v-if="column.dataIndex == 'lstShipOrderCompareRlt'">
<div class="goods-status">
<a-popover>
<template slot="content">
<p>
比对方式:
<span>{{
record.lstShipOrderCompareMode
? record.lstShipOrderCompareMode == 'MANUAL'
? '手动'
: '自动'
: ''
}}</span>
<span>-{{ record.lstShipOrderCompareRltName }}</span>
</p>
<p>
比对时间: <span>{{ record.lstShipOrderCompareDate }}</span>
</p>
</template>
<div style="cursor: pointer" @click="handleOpenResult(record)">
<div v-if="record.lstShipOrderCompareRlt == 'DIFF'">
<CloseCircleFilled :style="{ color: 'red' }" />
</div>
<div v-if="record.lstShipOrderCompareRlt == 'NO_DIFF'">
<CheckCircleFilled :style="{ color: '#54bc25' }" />
</div>
<div v-if="record.lstShipOrderCompareRlt == 'BEFORE_EQUAL'">
<CheckCircleFilled :style="{ color: 'rgb(187,37,155)' }" />
</div>
<div v-if="record.lstShipOrderCompareRlt == 'BEFORE_DIFF'">
<CloseCircleFilled :style="{ color: 'red' }" />
</div>
<div v-if="record.lstShipOrderCompareRlt == 'NO_DIFF_U'">
<CheckCircleFilled :style="{ color: '#54bc25' }" />
</div>
<div v-if="record.lstShipOrderCompareRlt == 'DIFF_U'">
<CloseCircleFilled :style="{ color: 'red' }" />
</div>
</div>
</a-popover>
<RedoOutlined style="margin-left: 10px" @click="excuteShippingOrderCompareBatch(record)"/>
</div>
</template>
<template v-if="column.key === 'action'">
<TableAction
:actions="[
{
icon: 'ant-design:copy-outlined',
tooltip: '复制',
onClick: () => {
copyBooking(record)
},
<TableAction :actions="[
{
icon: 'ant-design:copy-outlined',
tooltip: '复制',
onClick: () => {
copyBooking(record)
},
{
icon: 'clarity:note-edit-line',
tooltip: '编辑',
onClick: () => {
handledbclick(record)
},
},
{
icon: 'clarity:note-edit-line',
tooltip: '编辑',
onClick: () => {
handledbclick(record)
},
]"
/>
},
]" />
</template>
</template>
</BasicTable>
<!-- 合计 -->
<div class="static-box">
<h5 v-if="calcData.length" style="position: absolute; bottom: 68px; left: 22px"></h5>
<a-table
class="ds-table"
:columns="calcColumns"
:data-source="calcData"
:pagination="false"
></a-table>
<a-table class="ds-table" :columns="calcColumns" :data-source="calcData" :pagination="false"></a-table>
</div>
<!-- 多提单号查询 -->
<a-modal
class="ds-modal-small"
title="多提单号查询"
:maskClosable="false"
:width="400"
:visible="moreNumVisible"
@ok="moreNumSubmit"
@cancel="moreNumCancel"
>
<a-modal class="ds-modal-small" title="多提单号查询" :maskClosable="false" :width="400" :visible="moreNumVisible"
@ok="moreNumSubmit" @cancel="moreNumCancel">
<div>
<a-textarea v-model:value="moreNumVal" style="height: 200px" />
</div>
</a-modal>
<a-modal
:title="
TaskShippingOrderCompareData.isExistsDiff ? '下货纸比对(有差异)' : '下货纸比对(正常)'
"
@cancel="TaskShippingOrderCompareHandleCancel"
:visible="TaskShippingOrderCompareVisible"
width="40%"
>
<a-modal :title="TaskShippingOrderCompareData.isExistsDiff ? '' : ''
" @cancel="TaskShippingOrderCompareHandleCancel" :visible="TaskShippingOrderCompareVisible" width="40%">
<template #footer>
<a-button key="back" @click="TaskShippingOrderCompareHandleCancel"> </a-button>
</template>
@ -168,12 +214,9 @@
<p>{{ TaskShippingOrderCompareData.mBlNo }}</p>
</div>
</div>
<div
class="TaskShippingOrderCompareMainList"
v-for="(item, index) in TaskShippingOrderCompareData.showDetailList"
:key="index"
v-show="item.pCode != 'ContaList'"
>
<div class="TaskShippingOrderCompareMainList"
v-for="(item, index) in TaskShippingOrderCompareData.showDetailList" :key="index"
v-show="item.pCode != 'ContaList'">
<p>{{ item.fieldName }}:</p>
<p>{{ item.reqVal }}</p>
<p>{{ item.fieldName }}:</p>
@ -191,16 +234,11 @@
<p>箱信息场站数据</p>
</div>
</div>
<div
v-for="(item, index) in TaskShippingOrderCompareData.showDetailList"
:key="index"
v-show="item.pCode == 'ContaList'"
:class="
item.fieldName == '箱号'
? 'TaskShippingOrderCompareMainList BoxNo'
: 'TaskShippingOrderCompareMainList'
"
>
<div v-for="(item, index) in TaskShippingOrderCompareData.showDetailList" :key="index"
v-show="item.pCode == 'ContaList'" :class="item.fieldName == '箱号'
? 'TaskShippingOrderCompareMainList BoxNo'
: 'TaskShippingOrderCompareMainList'
">
<p>{{ item.fieldName }}:</p>
<p>{{ item.reqVal }}</p>
<p>{{ item.fieldName }}:</p>
@ -210,351 +248,384 @@
</div>
</div>
</a-modal>
<lstDraftCompareRlt @setLoad="setLoadCompare" @handleSuccess="compareSuccess" ref="lstDraftCompareRltRef"></lstDraftCompareRlt>
</div>
</template>
<script lang="ts" setup name="海运出口">
import TableActionBar from './components/tableActionBar.vue'
import tableActionBarRight from './components/tableActionBarRight.vue'
import { onMounted, ref } from 'vue'
import { BasicTable, useTable, TableAction } from '/@/components/Table'
import { PageDataByBooking, SeaExportCopy } from './api/BookingLedger.js'
import { getColumnsByClient } from '/@/views/baseinfo/formcopy/api'
import { useModal } from '/@/components/Modal'
import { columns, searchFormSchema, FeeStatus } from './columns'
import { useGo } from '/@/hooks/web/usePage'
import { useMessage } from '/@/hooks/web/useMessage'
import { formatTableData } from '/@/hooks/web/common'
import { Field } from '/@/components/Render/interface'
import { useOptionsStore } from '/@/store/modules/options'
const optionsStore = useOptionsStore()
import { usePermissionStore } from '/@/store/modules/permission'
import { useI18n } from '/@/hooks/web/useI18n'
const { t } = useI18n()
import initData from './modules/initData.js'
import { useRouter } from 'vue-router'
import { useAppStore } from '/@/store/modules/app'
//
import { formatParams } from '/@/hooks/web/common'
const appStore = useAppStore()
const router = useRouter()
const { createMessage } = useMessage()
const go = useGo()
//
const calcColumns = [
{
title: '主票数',
dataIndex: 'mainCount',
width: 110,
},
{
title: '分票数',
dataIndex: 'partCount',
width: 110,
},
{
title: '退仓数',
dataIndex: 'returnCount',
width: 110,
},
{
title: '箱TEU',
dataIndex: 'teu',
width: 110,
},
{
title: '件数',
dataIndex: 'pkgs',
width: 110,
},
{
title: '毛重',
dataIndex: 'kgs',
width: 110,
},
{
title: '20GP',
dataIndex: 'cntr1',
width: 110,
},
{
title: '40GP',
dataIndex: 'cntr2',
width: 110,
},
{
title: '40HC',
dataIndex: 'cntr3',
width: 110,
},
{
title: '20OT',
dataIndex: 'cntr4',
width: 110,
},
{
title: '40OT',
dataIndex: 'cntr5',
width: 110,
},
{
title: '20FR',
dataIndex: 'cntr6',
width: 110,
},
{
title: '40FR',
dataIndex: 'cntr7',
width: 110,
},
{
title: '20RF',
dataIndex: 'cntr8',
width: 110,
},
{
title: '40RF',
dataIndex: 'cntr9',
width: 110,
},
{
title: '40HQ',
dataIndex: 'cntr10',
width: 110,
},
{
title: '其他箱型',
dataIndex: 'otherCntr',
width: 120,
},
]
//
const calcData = ref([])
//
const [registerModal, { openModal }] = useModal()
const [registerTable, { reload, getForm, getPaginationRef, getSelectRows }] = useTable({
title: '',
api: async (p) => {
const res: API.DataResult = await PageDataByBooking(p)
calcData.value = [res.data?.dataTotal]
return new Promise((resolve) => {
res.data?.list.forEach((item) => {
item.stlDate = formatTableData(item.stlDate)
item.etd = formatTableData(item.etd)
item.closingDate = formatTableData(item.closingDate)
item.eta = formatTableData(item.eta)
item.issueDate = formatTableData(item.issueDate)
item.customDate = formatTableData(item.customDate)
item.inspectionDate = formatTableData(item.inspectionDate)
})
if (res?.data?.list) {
const ids = res.data.list.map((item) => {
return item.id
})
appStore.setIds(ids, 'hyck')
}
resolve({ data: [...res.data.list], total: res.data.totalCount })
// 使
optionsStore.getOptionsByCode('GetVesselSelectList')
optionsStore.getOptionsByCode('GetClientStlModeSelectList')
optionsStore.getOptionsByCode('GetClientSourceSelectList')
optionsStore.getOptionsByCode('GetVoynoSelectList')
optionsStore.getOptionsByCode('GetClientLanesSelectList')
optionsStore.getOptionsByCode('GetSaleList')
optionsStore.getOptionsByCode('GetDeptList')
optionsStore.getOptionsByCode('GetCustomerServiceList')
optionsStore.getOptionsByCode('GetVouchingClerkList')
optionsStore.getOptionsByCode('GetClientPortSelectList')
optionsStore.getOptionsByCode('GetIssueTypeSelectList')
optionsStore.getOptionsByCode('GetClientFrtSelectList')
optionsStore.getOptionsByCode('GetServiceSelectList')
optionsStore.getOptionsByCode('GetPackageSelectList')
import { CheckCircleFilled,CloseCircleFilled,RedoOutlined } from '@ant-design/icons-vue';
import TableActionBar from './components/tableActionBar.vue'
import tableActionBarRight from './components/tableActionBarRight.vue'
import { onMounted, ref } from 'vue'
import { BasicTable, useTable, TableAction } from '/@/components/Table'
import { PageDataByBooking, SeaExportCopy } from './api/BookingLedger.js'
import { getColumnsByClient } from '/@/views/baseinfo/formcopy/api'
import { useModal } from '/@/components/Modal'
import { columns, searchFormSchema, FeeStatus } from './columns'
import { useGo } from '/@/hooks/web/usePage'
import { useMessage } from '/@/hooks/web/useMessage'
import { formatTableData } from '/@/hooks/web/common'
import { Field } from '/@/components/Render/interface'
import { useOptionsStore } from '/@/store/modules/options'
import lstDraftCompareRlt from '../../../components/lstDraftCompareRlt/index.vue'
const optionsStore = useOptionsStore()
import { usePermissionStore } from '/@/store/modules/permission'
import { useI18n } from '/@/hooks/web/useI18n'
const { t } = useI18n()
import initData from './modules/initData.js'
import { useRouter } from 'vue-router'
import { useAppStore } from '/@/store/modules/app'
//
import { formatParams } from '/@/hooks/web/common'
const appStore = useAppStore()
const router = useRouter()
const { createMessage } = useMessage()
const go = useGo()
//
const calcColumns = [
{
title: '主票数',
dataIndex: 'mainCount',
width: 110,
},
{
title: '分票数',
dataIndex: 'partCount',
width: 110,
},
{
title: '退仓数',
dataIndex: 'returnCount',
width: 110,
},
{
title: '箱TEU',
dataIndex: 'teu',
width: 110,
},
{
title: '件数',
dataIndex: 'pkgs',
width: 110,
},
{
title: '毛重',
dataIndex: 'kgs',
width: 110,
},
{
title: '20GP',
dataIndex: 'cntr1',
width: 110,
},
{
title: '40GP',
dataIndex: 'cntr2',
width: 110,
},
{
title: '40HC',
dataIndex: 'cntr3',
width: 110,
},
{
title: '20OT',
dataIndex: 'cntr4',
width: 110,
},
{
title: '40OT',
dataIndex: 'cntr5',
width: 110,
},
{
title: '20FR',
dataIndex: 'cntr6',
width: 110,
},
{
title: '40FR',
dataIndex: 'cntr7',
width: 110,
},
{
title: '20RF',
dataIndex: 'cntr8',
width: 110,
},
{
title: '40RF',
dataIndex: 'cntr9',
width: 110,
},
{
title: '40HQ',
dataIndex: 'cntr10',
width: 110,
},
{
title: '其他箱型',
dataIndex: 'otherCntr',
width: 120,
},
]
//
const calcData = ref([])
//
const [registerModal, { openModal }] = useModal()
const [registerTable, { reload, getForm, setLoading, getSelectRows }] = useTable({
title: '',
api: async (p) => {
const res: API.DataResult = await PageDataByBooking(p)
calcData.value = [res.data?.dataTotal]
return new Promise((resolve) => {
res.data?.list.forEach((item) => {
item.stlDate = formatTableData(item.stlDate)
item.etd = formatTableData(item.etd)
item.closingDate = formatTableData(item.closingDate)
item.eta = formatTableData(item.eta)
item.issueDate = formatTableData(item.issueDate)
item.customDate = formatTableData(item.customDate)
item.inspectionDate = formatTableData(item.inspectionDate)
})
},
//
beforeFetch: (p) => {
return formatParams(p)
},
// if (moreNumVal.value) {
// let ManyQueryData: any = { ConditionalList: [] }
// moreNumVal.value
// .replace(/\n|\r/g, ',')
// .split(',')
// .forEach((item) => {
// ManyQueryData.ConditionalList.push({
// Key: 0,
// Value: { FieldName: 'mblno', FieldValue: item, ConditionalType: 1 },
// })
// })
if (res?.data?.list) {
const ids = res.data.list.map((item) => {
return item.id
})
appStore.setIds(ids, 'hyck')
}
resolve({ data: [...res.data.list], total: res.data.totalCount })
// 使
optionsStore.getOptionsByCode('GetVesselSelectList')
optionsStore.getOptionsByCode('GetClientStlModeSelectList')
optionsStore.getOptionsByCode('GetClientSourceSelectList')
optionsStore.getOptionsByCode('GetVoynoSelectList')
optionsStore.getOptionsByCode('GetClientLanesSelectList')
optionsStore.getOptionsByCode('GetSaleList')
optionsStore.getOptionsByCode('GetDeptList')
optionsStore.getOptionsByCode('GetCustomerServiceList')
optionsStore.getOptionsByCode('GetVouchingClerkList')
optionsStore.getOptionsByCode('GetClientPortSelectList')
optionsStore.getOptionsByCode('GetIssueTypeSelectList')
optionsStore.getOptionsByCode('GetClientFrtSelectList')
optionsStore.getOptionsByCode('GetServiceSelectList')
optionsStore.getOptionsByCode('GetPackageSelectList')
})
},
//
beforeFetch: (p) => {
return formatParams(p)
},
// if (moreNumVal.value) {
// let ManyQueryData: any = { ConditionalList: [] }
// moreNumVal.value
// .replace(/\n|\r/g, ',')
// .split(',')
// .forEach((item) => {
// ManyQueryData.ConditionalList.push({
// Key: 0,
// Value: { FieldName: 'mblno', FieldValue: item, ConditionalType: 1 },
// })
// })
// condition.push(ManyQueryData)
// }
afterFetch: () => {
isAdvancedQuery.value = false
moreNumVisible.value = false
moreNumVal.value = ''
},
columns,
formConfig: {
labelWidth: 120,
//
schemas: searchFormSchema,
// ()
useAdvancedSearch: true,
},
isTreeTable: false,
pagination: true,
striped: true,
useSearchForm: true,
showTableSetting: true,
bordered: true,
showIndexColumn: true,
indexColumnProps: {
width: 60,
},
canResize: true,
resizeHeightOffset: 75,
immediate: false,
actionColumn: {
width: 80,
title: '操作',
dataIndex: 'action',
fixed: 'right',
},
// showSummary: true,
})
function editColumns(row) {
if (row.mblno) {
go(`/BookingDetail?id=${row.id}&source=edit`)
} else {
go(`/BookingDetail?id=${row.id}&customerNo=${row.customerNo}&source=edit`)
}
}
function FnCopy(data) {
const el = document.createElement('input')
el.setAttribute('value', data)
document.body.appendChild(el)
el.select()
document.execCommand('copy')
document.body.removeChild(el)
createMessage.success('复制成功!')
}
const moreNumVal = ref('') //
const moreNumVisible = ref(false) //
//
function tableMoreRefresh() {
moreNumVal.value = ''
moreNumVisible.value = !moreNumVisible.value
}
//
function moreNumSubmit() {
reload()
}
//
function moreNumCancel() {
// condition.push(ManyQueryData)
// }
afterFetch: () => {
isAdvancedQuery.value = false
moreNumVisible.value = false
moreNumVal.value = ''
},
columns,
formConfig: {
labelWidth: 120,
//
schemas: searchFormSchema,
// ()
useAdvancedSearch: true,
},
isTreeTable: false,
pagination: true,
striped: true,
useSearchForm: true,
showTableSetting: true,
bordered: true,
showIndexColumn: true,
indexColumnProps: {
width: 60,
},
canResize: true,
resizeHeightOffset: 75,
immediate: false,
actionColumn: {
width: 80,
title: '操作',
dataIndex: 'action',
fixed: 'right',
},
// showSummary: true,
})
function editColumns(row) {
if (row.mblno) {
go(`/BookingDetail?id=${row.id}&source=edit`)
} else {
go(`/BookingDetail?id=${row.id}&customerNo=${row.customerNo}&source=edit`)
}
const isAdvancedQuery = ref(false)
const showColumns = ref({})
const formAllData = ref([])
const fromTableAllData = ref({})
const fields = ref<Field[]>([])
const tableHeight = ref(0)
const TaskShippingOrderCompareData = ref({
showDetailList: '',
total: '',
isExistsDiff: false,
})
const TaskShippingOrderCompareVisible = ref(false)
const formatSheetVisible = ref(false)
}
function FnCopy(data) {
const el = document.createElement('input')
el.setAttribute('value', data)
document.body.appendChild(el)
el.select()
document.execCommand('copy')
document.body.removeChild(el)
createMessage.success('复制成功!')
}
const moreNumVal = ref('') //
const moreNumVisible = ref(false) //
//
function tableMoreRefresh() {
moreNumVal.value = ''
moreNumVisible.value = !moreNumVisible.value
}
//
function moreNumSubmit() {
reload()
}
//
function moreNumCancel() {
moreNumVisible.value = false
}
const isAdvancedQuery = ref(false)
const showColumns = ref({})
const formAllData = ref([])
const fromTableAllData = ref({})
const fields = ref<Field[]>([])
const tableHeight = ref(0)
const TaskShippingOrderCompareData = ref({
showDetailList: '',
total: '',
isExistsDiff: false,
})
const TaskShippingOrderCompareVisible = ref(false)
const formatSheetVisible = ref(false)
// //
// function batchEditing() {
// const select = getSelectRows()
// if (select.length === 0) {
// createMessage.warning('')
// return false
// }
// const removeArr = select.map((item) => {
// return item.id
// })
// openModal(true, { removeArr })
// }
function TaskShippingOrderCompareHandleCancel() {
TaskShippingOrderCompareVisible.value = false
}
const permissionId = ref<String>('')
const ConditionalList: Ref<any> = ref()
async function createdInit() {
showColumns.value = JSON.parse(JSON.stringify(initData.columns))
formAllData.value = JSON.parse(JSON.stringify(initData.condAllData))
fromTableAllData.value = JSON.parse(JSON.stringify(initData.columnsAllData))
tableHeight.value = document.body.clientHeight - 230
const res: API.DataResult = await getColumnsByClient({
tableViewName: 'op_sea_export',
})
const fullPath = ref(router.currentRoute.value.fullPath)
usePermissionStore().getWrouteList.forEach((item: Record<any, any>) => {
item.children[0].children?.forEach((item2: Record<any, any>) => {
if (fullPath.value.indexOf(item2.path) != -1) {
permissionId.value = item2.id
}
})
// //
// function batchEditing() {
// const select = getSelectRows()
// if (select.length === 0) {
// createMessage.warning('')
// return false
// }
// const removeArr = select.map((item) => {
// return item.id
// })
// openModal(true, { removeArr })
// }
function TaskShippingOrderCompareHandleCancel() {
TaskShippingOrderCompareVisible.value = false
}
const permissionId = ref<String>('')
const ConditionalList: Ref<any> = ref()
async function createdInit() {
showColumns.value = JSON.parse(JSON.stringify(initData.columns))
formAllData.value = JSON.parse(JSON.stringify(initData.condAllData))
fromTableAllData.value = JSON.parse(JSON.stringify(initData.columnsAllData))
tableHeight.value = document.body.clientHeight - 230
const res: API.DataResult = await getColumnsByClient({
tableViewName: 'op_sea_export',
})
const fullPath = ref(router.currentRoute.value.fullPath)
usePermissionStore().getWrouteList.forEach((item: Record<any, any>) => {
item.children[0].children?.forEach((item2: Record<any, any>) => {
if (fullPath.value.indexOf(item2.path) != -1) {
permissionId.value = item2.id
}
})
if (res.succeeded) {
console.log(res)
})
if (res.succeeded) {
console.log(res)
let data: any[] = []
res.data.forEach((item) => {
data.push({
id: item.dbColumnName,
title: item.columnDescription,
name: 'Select',
value: null,
props: {
disabled: false,
multiple: false,
// placeholder: '',
options: [],
},
style: {
width: '100%',
},
})
let data: any[] = []
res.data.forEach((item) => {
data.push({
id: item.dbColumnName,
title: item.columnDescription,
name: 'Select',
value: null,
props: {
disabled: false,
multiple: false,
// placeholder: '',
options: [],
},
style: {
width: '100%',
},
})
fields.value = data
}
}
function handledbclick(record) {
editColumns(record)
}
//
function copyBooking(record) {
SeaExportCopy({ id: record.id }).then((res) => {
reload()
})
// go(`/BookingDetail?id=${record.id}&isCopy=${true}`)
fields.value = data
}
onMounted(() => {
//
}
function handledbclick(record) {
editColumns(record)
}
//
function copyBooking(record) {
SeaExportCopy({ id: record.id }).then((res) => {
reload()
createdInit()
})
// go(`/BookingDetail?id=${record.id}&isCopy=${true}`)
}
//
const lstDraftCompareRltRef = ref()
function handleFormatContrast(row) {
lstDraftCompareRltRef.value.initLstDraft(row)
}
function excuteShippingOrderCompareBatch(row){
lstDraftCompareRltRef.value.reload(row)
}
function handleOpenResult(row){
lstDraftCompareRltRef.value.initTask(row)
}
function setLoadCompare(){
setLoading(true);
}
function compareSuccess(){
setLoading(false);
reload()
}
onMounted(() => {
//
reload()
createdInit()
})
</script>
<style lang="less">
.ds-sea-export-table {
height: 100%;
.vben-basic-table-header__toolbar {
justify-content: space-between;
}
.static-box {
position: fixed;
bottom: 0;
}
.icon-fuzhi3 {
color: #257afa;
cursor: pointer;
}
.ds-sea-export-table {
height: 100%;
.vben-basic-table-header__toolbar {
justify-content: space-between;
}
.static-box {
position: fixed;
bottom: 0;
}
.icon-fuzhi3 {
color: #257afa;
cursor: pointer;
}
}
.compareIcon {
color: #257afa;
cursor: pointer;
font-size: 15px
}
.goods-status{
display: flex;
}
</style>

@ -32,9 +32,9 @@
<a-modal @cancel="UserVisible = false" :visible="UserVisible" title="转移任务" @ok="UserhandleOk">
<a-spin :spinning="userLoad">
<div style="margin: 15px 0;">接收人</div>
<a-select mode="multiple" show-search style="width: 100%;margin-bottom: 30px" :filter-option="filterOption"
<a-select mode="multiple" :filter-option="filterOption" style="width: 100%;margin-bottom: 30px"
v-model:value="UserId">
<a-select-option v-for="item in UserList" :key="item.value" :value="item.value">
<a-select-option v-for="item in UserList" :key="item.label" :value="item.value">
{{ item.label }}
</a-select-option>
</a-select>
@ -64,6 +64,9 @@ const userLoad = ref(false)
const UserVisible = ref(false);
const UserList = ref([]) as any
const UserId = ref([]) as any //id
const filterOption = (input: string, option: any) => {
return option.key.toLowerCase().indexOf(input.toLowerCase()) >= 0;
};
const emit = defineEmits(['loadingStart', 'loadingStop'])
function OpenUser() {
UserVisible.value = true
@ -95,11 +98,7 @@ function UserhandleOk() {
})
}
function filterOption(input, option) {
return (
option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
);
}
//
function FnCompleteTask() {
const ApiData = [props.id]

@ -251,11 +251,11 @@
import { ref, onMounted, watch,onActivated } from 'vue'
import { formatParams } from '/@/hooks/web/common'
import { searchFormSchema } from './columns'
import { useOptionsStore } from '/@/store/modules/options'
const optionsStore = useOptionsStore()
import { BasicTable, useTable, TableAction } from '/@/components/Table'
import { useMessage } from '../../hooks/web/useMessage'
import { useRoute, useRouter } from 'vue-router';
import { useOptionsStore } from '/@/store/modules/options'
const optionsStore = useOptionsStore()
const { createMessage } = useMessage()
const route = useRoute();
const router = useRouter();

@ -4,10 +4,18 @@
<a-col :span="pdfUrl ? 11 : 24">
<taskData ref="taskDataRef" title='Booking Amendment'></taskData>
</a-col>
<a-col>
<a-col :span="13" v-show="pdfUrl">
<pdf v-show="pdfUrl" @handleSuccess="handleSuccess" style="margin-bottom: 20px;" :id="taskPKId" ref="pdfData"></pdf>
<taskButton :buttonList="['取消', '完成', '转移']" @loadingStart="loadingStart" @loadingStop="loadingStop" :id="taskPKId" ref="taskButtonRef">
</taskButton>
<a-row style="margin-top: 20px;" type="flex" justify="end" :gutter="16">
<taskButton :buttonList="['取消', '完成', '转移', '生成', '邮件']" @loadingStart="loadingStart" @loadingStop="loadingStop" :id="taskPKId" ref="taskButtonRef">
</taskButton>
</a-row>
</a-col>
<a-col :span="24" v-show="!pdfUrl">
<a-row style="margin-top: 20px;" type="flex" justify="end" :gutter="16">
<taskButton :buttonList="['取消', '完成', '转移', '生成', '邮件']" @loadingStart="loadingStart" @loadingStop="loadingStop" :id="taskPKId" ref="taskButtonRef">
</taskButton>
</a-row>
</a-col>
</a-row>
</a-spin>

@ -4,10 +4,18 @@
<a-col :span="pdfUrl ? 11 : 24">
<taskData ref="taskDataRef" title='Booking Confirmation'></taskData>
</a-col>
<a-col :span="pdfUrl ? 13 : 0">
<pdf @handleSuccess="handleSuccess" style="margin-bottom: 20px;" :id="taskPKId" ref="pdfData"></pdf>
<taskButton :buttonList="['取消', '完成', '转移', '生成', '邮件']" @loadingStart="loadingStart"
@loadingStop="loadingStop" :id="taskPKId" ref="taskButtonRef"></taskButton>
<a-col :span="13" v-show="pdfUrl">
<pdf v-show="pdfUrl" @handleSuccess="handleSuccess" style="margin-bottom: 20px;" :id="taskPKId" ref="pdfData"></pdf>
<a-row style="margin-top: 20px;" type="flex" justify="end" :gutter="16">
<taskButton :buttonList="['取消', '完成', '转移', '生成', '邮件']" @loadingStart="loadingStart" @loadingStop="loadingStop" :id="taskPKId" ref="taskButtonRef">
</taskButton>
</a-row>
</a-col>
<a-col :span="24" v-show="!pdfUrl">
<a-row style="margin-top: 20px;" type="flex" justify="end" :gutter="16">
<taskButton :buttonList="['取消', '完成', '转移', '生成', '邮件']" @loadingStart="loadingStart" @loadingStop="loadingStop" :id="taskPKId" ref="taskButtonRef">
</taskButton>
</a-row>
</a-col>
</a-row>
</a-spin>

@ -4,9 +4,18 @@
<a-col :span="pdfUrl ? 11 : 24">
<taskData ref="taskDataRef" title='Booking Cancellation' ></taskData>
</a-col>
<a-col>
<pdf @handleSuccess="handleSuccess" style="margin-bottom: 20px;" :id="taskPKId" ref="pdfData"></pdf>
<taskButton :buttonList="['取消', '完成', '转移']" @loadingStart="loadingStart" @loadingStop="loadingStop" :id="taskPKId" ref="taskButtonRef"></taskButton>
<a-col :span="13" v-show="pdfUrl">
<pdf v-show="pdfUrl" @handleSuccess="handleSuccess" style="margin-bottom: 20px;" :id="taskPKId" ref="pdfData"></pdf>
<a-row style="margin-top: 20px;" type="flex" justify="end" :gutter="16">
<taskButton :buttonList="['取消', '完成', '转移', '生成', '邮件']" @loadingStart="loadingStart" @loadingStop="loadingStop" :id="taskPKId" ref="taskButtonRef">
</taskButton>
</a-row>
</a-col>
<a-col :span="24" v-show="!pdfUrl">
<a-row style="margin-top: 20px;" type="flex" justify="end" :gutter="16">
<taskButton :buttonList="['取消', '完成', '转移', '生成', '邮件']" @loadingStart="loadingStart" @loadingStop="loadingStop" :id="taskPKId" ref="taskButtonRef">
</taskButton>
</a-row>
</a-col>
</a-row>
</a-spin>

Loading…
Cancel
Save