You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

3999 lines
113 KiB
Plaintext

<template>
<div @click="pageClick" class="booking-list">
<a-spin tip="Loading..." :spinning="spinning">
<a-row :gutter="24" style="margin: 0">
<a-col :md="24" :sm="24" style="padding: 0 0 0 0" class="content-box">
<XCard class="content-nav">
<div class="table-page-search-wrapper">
<a-row :gutter="48" class="booking-from-box">
<a-col :xl="19" :lg="24" :md="24" :sm="24" :class="advanced ? '' : 'advanced'">
<BasicForm @register="registerForm" />
</a-col>
<a-col
style="padding: 0px"
:xl="5"
:lg="24"
:md="24"
:sm="24"
class="table-page-search-box"
>
<span
class="table-page-search-submitButtons"
:style="(advanced && { float: 'right', overflow: 'hidden' }) || {}"
>
<a-button size="small" type="primary" @click="tableRefresh">查询</a-button>
<a-button size="small" class="reset" @click="tableReset">重置</a-button>
<template v-if="screenWidth > 1600">
<a-button size="small" class="more-search" @click="tableMoreRefresh">
多提单号查询<a-icon type="search" />
</a-button>
<span class="tab-btn" @click="formSetting">
<a-icon type="setting" :style="{ marginLeft: '0px' }" />
</span>
<a
class="senior-search"
@click="toggleAdvanced"
v-if="searchFormSchema.length > 4"
>
{{ advanced ? '收起查询' : '更多查询' }}
<i class="iconfont" :class="advanced ? 'icon-shouqi' : 'icon-zhankai'"></i>
</a>
<a-button size="small" class="more-search" @click="FnOpenAdvancedQuery">
高级
</a-button>
</template>
<template v-else>
<a-button size="small" class="more-search" @click="tableMoreRefresh">
多提单号<a-icon type="search" />
</a-button>
<span class="tab-btn" @click="formSetting">
<a-icon type="setting" :style="{ marginLeft: '0px' }" />
</span>
<a
class="senior-search"
@click="toggleAdvanced"
v-if="searchFormSchema.length > 4"
>
{{ advanced ? '收起' : '更多' }}
<i class="iconfont" :class="advanced ? 'icon-shouqi' : 'icon-zhankai'"></i>
</a>
</template>
</span>
</a-col>
</a-row>
</div>
</XCard>
<XCard class="content-table" :style="{ marginTop: '-6px' }">
<vxe-toolbar>
<template #buttons> </template>
<template #tools>
<div class="right BookTopButton">
<span class="tab-btn" @click="tableRefreshFirst">
<a-icon
type="redo"
:style="{ fontSize: '14px', transform: 'rotate(278deg)' }"
/>
</span>
<span class="tab-btn" @click="tableHeaderEdit">
<a-icon type="setting" :style="{ fontSize: '14px' }" />
</span>
</div>
</template>
</vxe-toolbar>
<BasicTable @register="register" @row-dbClick="handledbclick">
<template #toolbar>
<div class="nav-box">
<div class="nav" @click="addBooking">
<i class="iconfont icon-jiahao2fill"></i>新建
</div>
<div class="nav" @click="copyBooking"
><i class="iconfont icon-fuzhi"></i>复制</div
>
<div class="nav" @click="copyBookingMore"
><i class="iconfont icon-fuzhi1"></i>复制多票</div
>
<div class="nav">
<a-dropdown>
<span> <i class="iconfont icon-bianjiwenjian"></i>批量操作 </span>
<template #overlay>
<a-menu>
<a-menu-item>
<a @click="batchEditing()" href="javascript:;">批量编辑</a>
</a-menu-item>
<!-- <a-menu-item>
<a @click="handleOpenShip" href="javascript:;">批量修改船代</a>
</a-menu-item> -->
</a-menu>
</template>
</a-dropdown>
</div>
<a-popconfirm
title="确定删除当前选中订舱?"
ok-text="是"
cancel-text="否"
@confirm="removeMoreFun"
@cancel="cancelRemove"
>
<div class="nav"><i class="iconfont icon-shanchu2"></i>删除</div>
</a-popconfirm>
<div class="nav"><i class="iconfont icon-shishijifei"></i>定时订舱</div>
<div class="nav" @click="handleSearchTxxp">
<a-spin :spinning="txxpLoading">
<i class="iconfont icon-xiaopiaodayin"></i>小票状态
</a-spin>
</div>
<div class="nav" @click="openTraceModel"
><i class="iconfont icon-yunshu1"></i>运踪订阅</div
>
<div class="nav">
<a-dropdown>
<span>
<i
class="iconfont icon-a-wendangcaozuoxiazaishangchuanshanchuxinzengfujianyasuochakan-01"
></i
>船公司文件
</span>
<template #overlay>
<a-menu>
<a-menu-item>
<a @click="handleDownByBc(1)" href="javascript:;">BC下载</a>
</a-menu-item>
<a-menu-item>
<a @click="handleDownByBc(2)" href="javascript:;">DRAFT下载</a>
</a-menu-item>
<a-menu-item>
<a @click="handleDownByBc(4)" href="javascript:;">舱位分配查询</a>
</a-menu-item>
<a-menu-item>
<a @click="handleImportBc" href="javascript:;">单票BC引入</a>
</a-menu-item>
<a-menu-item>
<a @click="handleImportBcMore" href="javascript:;">多票BC引入</a>
</a-menu-item>
</a-menu>
</template>
</a-dropdown>
</div>
<div class="nav" @click="GoExpress"><i class="iconfont icon-goods"></i>快递</div>
</div>
</template>
<template #mblno="e">
<div class="mblno">
<span @click="editColumns(e.record)">{{ e.text }}</span>
<Icon icon="ant-design:copy-outlined" @click="FnCopy(e.text)" />
</div>
</template>
<template #sourceId="e">{{ RText('sourceId', e) }} </template>
<template #sourceDetailId="e">{{ RText('sourceDetailId', e) }} </template>
<template #arFeeStatus="e">
<span class="CsFeeStatus" :class="`type${e.text}`">{{
RText('arFeeStatus', e)
}}</span>
</template>
<template #apFeeStatus="e">
<span class="CsFeeStatus" :class="`type${e.text}`">{{
RText('apFeeStatus', e)
}}</span>
</template>
</BasicTable>
</XCard>
</a-col>
</a-row>
<!-- -------------------Z----------------------->
<a-modal
title="高级查询"
:maskClosable="false"
width="40%"
:visible="AdvancedQueryVisible"
@ok="FnAdvancedQuery"
@cancel="FnCancelAdvancedQuery"
>
<div class="CsConditionFilter">
<ConditionFilter v-model="AdvancedQueryData" :filter-fields="fields" :disabled="false" />
</div>
</a-modal>
<!-- 批量编辑 -->
<BatchModification @register="registerModal" @success="BMSuccess" />
<a-modal
:title="
TaskShippingOrderCompareData.isExistsDiff ? '下货纸比对(有差异)' : '下货纸比对(正常)'
"
@cancel="TaskShippingOrderCompareHandleCancel"
:visible="TaskShippingOrderCompareVisible"
width="40%"
>
<template #footer>
<a-button key="back" @click="TaskShippingOrderCompareHandleCancel"> 关闭 </a-button>
</template>
<p class="TaskShippingOrderCompareP">
{{ TaskShippingOrderCompareData.compareTime }}
<span v-if="TaskShippingOrderCompareData.isExistsDiff">
比对异常 合计
<span class="TaskShippingOrderCompareSpan">{{
TaskShippingOrderCompareData.total
}}</span>
</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">
<a-icon type="close" :style="{ color: 'red' }" />
</p>
<p v-else><a-icon type="check" :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">
<a-icon type="close" :style="{ color: 'red' }" />
</p>
<p v-else><a-icon type="check" :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-modal>
<a-modal
:title="formatSheet.isExistsDiff ? '格式单比对(有差异)' : '格式单比对(正常)'"
@cancel="formatSheetVisible = false"
:visible="formatSheetVisible"
width="90%"
>
<template #footer>
<a-button key="back" @click="formatSheetVisible = false"> 关闭 </a-button>
</template>
<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>
</span>
</div>
<div>
显示全部
<a-switch :checked="formatFlag" @change="formatFlag = !formatFlag" />
</div>
</div>
<div style="display: flex; align-items: flex-start" v-else>
<a-icon
style="color: rgb(82, 196, 26); font-size: 50px; margin-top: 5px"
type="check-circle"
theme="filled"
/>
<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="padding-top: 4px" v-if="item.msg">
<a-icon
style="color: rgb(194, 5, 5); font-size: 18px; margin-right: 35px"
type="close-circle"
theme="filled"
/>
</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">
<a-icon
style="margin-top: 4px; margin-right: 5px; color: rgb(0, 153, 204)"
type="right-circle"
/>
<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">
<a-icon
style="margin-top: 4px; margin-right: 5px; color: rgb(100, 163, 90)"
type="right-circle"
/>
<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="padding-top: 4px"
v-if="item.msg && item.isDiff && item.fieldName != '箱号'"
>
<a-icon
style="color: rgb(194, 5, 5); font-size: 18px; margin-right: 35px"
type="close-circle"
theme="filled"
/>
</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">
<a-icon
style="margin-top: 4px; margin-right: 5px; color: rgb(0, 153, 204)"
type="right-circle"
/>
<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">
<a-icon
style="margin-top: 4px; margin-right: 5px; color: rgb(100, 163, 90)"
type="right-circle"
/>
<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="padding-top: 4px" v-if="item.msg">
<a-icon
style="color: rgb(194, 5, 5); font-size: 18px; margin-right: 35px"
type="close-circle"
theme="filled"
/>
</p>
<p style="padding-top: 4px" v-else>
<a-icon
style="color: rgb(0, 153, 68); font-size: 18px; margin-right: 35px"
type="check-circle"
theme="filled"
/>
</p>
<p style="width: 90px; margin-right: 20px">{{ item.fieldName }}:</p>
<div style="width: 60%">
<div style="display: flex">
<a-icon
style="margin-top: 4px; margin-right: 5px; color: rgb(0, 153, 204)"
type="right-circle"
/>
<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">
<a-icon
style="margin-top: 4px; margin-right: 5px; color: rgb(100, 163, 90)"
type="right-circle"
/>
<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="display: flex; margin-top: 15px; align-items: flex-start"
>
<div v-if="item.fieldName == '箱号'">箱号:{{ item.primaryKey }}</div>
<div style="display: flex; align-items: flex-start" v-else>
<p style="padding-top: 4px" v-if="item.msg">
<a-icon
style="color: rgb(194, 5, 5); font-size: 18px; margin-right: 35px"
type="close-circle"
theme="filled"
/>
</p>
<p style="padding-top: 4px" v-else>
<a-icon
style="color: rgb(0, 153, 68); font-size: 18px; margin-right: 35px"
type="check-circle"
theme="filled"
/>
</p>
<p style="width: 90px; margin-right: 20px; flex-shrink: 0"
>{{ item.fieldName }}:</p
>
<div style="width: 60%">
<div style="display: flex">
<a-icon
style="margin-top: 4px; margin-right: 5px; color: rgb(0, 153, 204)"
type="right-circle"
/>
<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">
<a-icon
style="margin-top: 4px; margin-right: 5px; color: rgb(100, 163, 90)"
type="right-circle"
/>
<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="formatPdf" frameborder="0"></iframe>
</a-spin>
</div>
</a-modal>
<a-modal
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="小票状态查询"
:width="600"
:visible="txxpFlag"
:footer="null"
@cancel="txxpFlag = false"
>
<div>
<p>提箱小票未申请:{{ txxpForm.noApply }}</p>
<p>提箱小票已申请未打印:{{ txxpForm.applyNoPrint }}</p>
<p>提箱小票已打印:{{ txxpForm.print }}</p>
<p>是否封账:{{ txxpForm.IsLockBooking }}</p>
</div>
</a-modal>
<a-modal title="提示信息" :visible="bcFileFlag" :footer="null" @cancel="bcFileFlag = false">
<div class="bcfile-title">
<div
><a-icon style="margin-right: 10px" @click="handleCopy" type="copy" />时间{{
bcFile.executeTime
}}</div
>
<span> {{ bcFile.batchTotal }}</span>
</div>
<div ref="RefbcBox" class="bc-box" v-if="bcFile.ext && bcFile.ext.length > 0">
<div class="bc-item" v-for="(item, index) in bcFile.ext" :key="index">
<span>{{ item.bno }}</span>
<span> {{ item.msg }}</span>
</div>
</div>
<div v-else>{{ bcFile.msg }}</div>
</a-modal>
<a-modal
title="输入复制数量"
:visible="copyMoreFlag"
:footer="null"
@cancel="copyMoreFlag = false"
>
<a-form
ref="RefcopyMoreForm"
:model="copyMoreForm"
:label-col="{ span: 5 }"
:wrapper-col="{ span: 12 }"
@submit="handleSubmitCopyMore"
:style="{ padding: '10px' }"
>
<a-form-item
label="数量"
name="number"
:rules="[{ required: true, message: '请输入数量' }]"
>
<a-input-number :min="1" :max="10" v-model:value="copyMoreForm.number" />
</a-form-item>
<a-form-item :wrapper-col="{ span: 12, offset: 5 }">
<a-button type="primary" html-type="submit">确定</a-button>
</a-form-item>
</a-form>
</a-modal>
<a-modal
title="批量修改船代"
:width="600"
:visible="shipagencyFlag"
:footer="null"
@cancel="shipagencyFlag = false"
>
<a-select
placeholder="请选择船代"
v-model="shipagency"
show-search
style="width: 200px; margin-right: 20px"
@focus="shipagencySearch"
@search="shipagencySearch"
:default-active-first-option="false"
:show-arrow="false"
:filter-option="false"
:not-found-content="null"
>
<a-select-option
v-for="item in shipagencyData"
:key="item.showCode"
:value="item.showCode"
>
{{ item.name }}
</a-select-option>
</a-select>
<a-button :loading="shipagencyLoad" type="primary" @click="handleSubimtShip">确认</a-button>
</a-modal>
<a-modal width="50vw" :maskClosable="false" v-model="traceModalVisible" title="运踪订阅">
<div class="trace-box">
<a-form>
<a-row :gutter="16">
<a-col :span="24" class="book-model-box">
<a-form-item
label="请选择订阅内容"
:labelCol="{ xs: { span: 24 }, sm: { span: 6 } }"
:wrapperCol="{ xs: { span: 24 }, sm: { span: 15 } }"
has-feedback
>
<a-checkbox-group
class="trace-check"
v-model="traceValue"
name="checkboxgroup"
:options="traceOptions"
@change="onTraceChange"
/>
</a-form-item>
</a-col>
</a-row>
</a-form>
</div>
<template #footer>
<a-button type="primary" @click="traceSend">订阅</a-button>
</template>
</a-modal>
<importBc
:form="bcObj"
@handleClose="bcClose"
ref="RefimportBc"
@handleSuccess="handleSuccess"
></importBc>
<importBcMore ref="RefimportBcMore"></importBcMore>
<setFormModel
ref="setForm"
:formData="formData"
:formAllData="formMoreData"
type="from"
@ok="submitForm"
v-if="formMoreData"
></setFormModel>
<setFormModel
ref="setTableForm"
:formData="formTableData"
:formAllData="formMoreTableData"
:sortLabelList="sortLabelList"
:firstSort="{ label: tableOrderLabel, type: tableOrderType }"
:maxNum="999"
type="table"
@ok="submitTableForm"
@sortList="submitSort"
v-if="formMoreTableData"
></setFormModel>
<div
class="hovers-list"
:style="{ top: `${remarkScreenY}px`, left: `${remarkScreenX}px` }"
v-if="remarkShow"
>
<div class="title">备注内容:</div>
<div class="list" v-for="(remarkItem, rindex) in remarkData" :key="rindex">
<i class="iconfont icon-yuandian icon"></i> {{ remarkItem.remark }}
</div>
</div>
<div
class="goods-hovers-list"
:class="[
{ 'hide-goods-hover': !goodStatusShow },
{ 'seat-top': goodStatusSeat === 'top' },
{ 'seat-bottom': goodStatusSeat === 'bottom' },
]"
:style="{ top: `${goodStatusScreenY}px`, left: `${goodStatusScreenX}px` }"
>
<div class="title">货运动态</div>
<template v-for="(goodStatusItem, gindex) in goodStatusData">
<template v-if="goodStatusItem.finishTime || goodStatusItem.remark">
<a-popover placement="top" :key="gindex">
<template #content>
<div>
<div v-if="goodStatusItem.finishTime">时间:{{ goodStatusItem.finishTime }}</div>
<div v-if="goodStatusItem.remark">备注:{{ goodStatusItem.remark }}</div>
<div v-if="goodStatusItem.extData">显示天数:{{ goodStatusItem.extData }}</div>
</div>
</template>
<div
class="goods-btn"
:class="{ active: goodStatusItem.finishTime || goodStatusItem.remark }"
>
{{ goodStatusItem.statusName }}
</div>
</a-popover>
</template>
<template v-else>
<div
class="goods-btn"
:key="gindex"
:class="{ active: goodStatusItem.finishTime || goodStatusItem.remark }"
>
{{ goodStatusItem.statusName }}
</div>
</template>
</template>
</div>
</a-spin>
</div>
</template>
<script lang="ts" setup>
import BatchModification from './modules/BatchModification.vue'
import ConditionFilter from '/@/components/Condition/index.vue'
import { ref, Ref, onMounted, onUnmounted, reactive, getCurrentInstance, watch } from 'vue'
import { onBeforeRouteLeave } from 'vue-router'
import XCard from '/@/components/xnComponents/XCard.vue'
import setFormModel from '/@/components/setFormModel/index.vue'
import formLabel from './modules/formLabel.vue'
import moment from 'moment'
import { useGo } from '/@/hooks/web/usePage'
import importBc from './modules/importBc.vue'
import importBcMore from './modules/importBcMore.vue'
import initData from './modules/initData.js'
import { FilterRules } from '/@/components/Condition/index'
import { Field } from '/@/components/Render/interface'
import { getColumnsByClient } from '/@/views/baseinfo/formcopy/api'
import {
GetClientSourceSelectList,
GetClientSourceDetailSelectList,
// -------------------------------------------
UpdateUserQuerySet,
GetUserQuerySet,
PageDataByBooking,
SendTrace,
getVesselInfoService,
GetPortlist,
GetPortloadlist,
BookingOrderBachUpdate,
GetCarrierlist,
DjyCustomerSuggest,
GetSysUserPage,
DjyCustomerpage,
GetCtn,
GetPackage,
Codeissuetypelist,
GetFrt,
GetService,
GetForwarderlist,
// DjyUserConfigMulti,
SeaExportBatchDel,
ExcuteShippingOrderCompareBatch,
GetTenantLineList,
downloadBookingConfirm,
downloadDraft,
checkUpdateManifestNo,
singleBCFileRead,
refreshSailingDate,
RefreshBillTrace,
SaveDataInList,
SaveBookingTxxp,
GetDraftCompareResultInfo,
BookingOrderDownload,
GetShippingOrderCompareResult,
GetWebData,
CancelServiceStatusByList,
SaveServiceStatusByList,
BachUpdateShipagency,
TxxpLink,
} from './api/BookingLedger.js'
import { useModal } from '/@/components/Modal'
import { DjyUserConfigGet, DjyUserConfigAdd } from './api/DjyUserConfig.js'
import { useAppStore } from '/@/store/modules/app'
import { useMessage } from '/@/hooks/web/useMessage'
import { useRouter, useRoute } from 'vue-router'
const router = useRouter()
const route = useRoute()
const appStore = useAppStore()
const go = useGo()
const { notification } = useMessage()
let { ctx: that, proxy }: any = getCurrentInstance()
import { usePermissionStore } from '/@/store/modules/permission'
// -----------------------------------
import { BasicColumn, BasicTable, useTable } from '/@/components/Table'
import { BasicForm, useForm } from '/@/components/Form/index'
import { columns, searchFormSchema, FeeStatus } from '/@/views/operation/seaexport/columns'
const ListData = reactive<any>({
sourceId: [],
sourceDetailId: {},
})
const ConditionalList: Ref<any> = ref()
// 初始化 数据
async function init() {
const FnsourceId: API.DataResult = await GetClientSourceSelectList()
if (FnsourceId.succeeded) {
ListData.sourceId = []
let data: any = []
FnsourceId.data.forEach((e) => {
data.push({ label: e.sourceName, value: e.id })
})
ListData.sourceId = data
}
ListData.sourceId.forEach(async (item) => {
const FnsourceDetailId: any = await GetClientSourceDetailSelectList({
id: item.value,
})
if (FnsourceDetailId.succeeded) {
ListData.sourceDetailId[item.value] = []
let data: any = []
FnsourceDetailId.data.forEach((e) => {
data.push({ label: e.detailName, value: e.id })
})
ListData.sourceDetailId[item.value] = data
}
})
}
// 查询列表数据
async function getList(queryParam = {}, isInit = false, isAdd = 'normal', isAdv = false) {
console.log('getList')
}
// 创建搜索列表
const [registerForm, { getFieldsValue, resetFields, validateFields, setFieldsValue, validate }] =
useForm({
labelWidth: 80,
schemas: searchFormSchema,
showActionButtonGroup: false,
})
// 首字母转大写
function capitalizeFirstLetter(string) {
return string.charAt(0).toUpperCase() + string.slice(1)
}
// 创建列表
const [register, { reload, getForm, getPaginationRef, getSelectRows }] = useTable({
api: async (p) => {
init()
const res: API.DataResult = await PageDataByBooking(p)
return new Promise((resolve) => {
resolve({ data: [...res.data], total: res.count })
})
},
beforeFetch: () => {
var currentPageInfo: any = getPaginationRef()
const postParam: API.PageRequest = {
queryCondition: '',
pageCondition: {
pageIndex: currentPageInfo.current,
pageSize: currentPageInfo.pageSize,
sortConditions: [],
},
}
let condition: API.ConditionItem[] = []
Object.keys(getFieldsValue()).forEach((e) => {
if (getFieldsValue()[e]) {
if (e == 'etd') {
getFieldsValue()[e].forEach((t, i) => {
condition.push({
FieldName: capitalizeFirstLetter(e),
FieldValue: t,
ConditionalType: i == 0 ? 3 : 5,
})
})
} else {
condition.push({
FieldName: capitalizeFirstLetter(e),
FieldValue: getFieldsValue()[e],
ConditionalType: 1,
})
}
}
})
if (isAdvancedQuery.value) {
condition.push(ConditionalList.value)
}
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)
}
postParam.queryCondition = JSON.stringify(condition)
return postParam
},
afterFetch: () => {
isAdvancedQuery.value = false
moreNumVisible.value = false
moreNumVal.value = ''
},
columns,
pagination: true,
bordered: true,
useSearchForm: true,
showTableSetting: true,
tableSetting: { size: false, fullScreen: false },
actionColumn: {
width: 80,
title: '操作',
dataIndex: 'action',
fixed: undefined,
},
})
// 返回列表文字
function RText(type, data) {
let Rdata = '-'
if (type == 'sourceId') {
ListData[type].forEach((item) => {
if (data.text == item.value) {
Rdata = item.label
}
})
} else if (type == 'sourceDetailId') {
if (ListData.sourceDetailId[data.record.sourceId]) {
ListData.sourceDetailId[data.record.sourceId].forEach((item) => {
if (data.text == item.value) {
Rdata = item.label
}
})
}
} else if (type == 'arFeeStatus' || type == 'apFeeStatus') {
FeeStatus.forEach((item) => {
if (data.text == item.value) {
Rdata = item.label
}
})
}
return Rdata
}
// 列设置按钮
function tableHeaderEdit() {
let setting: any = document.getElementsByClassName('anticon-setting')
console.log(setting)
setting[0].click()
// setTableForm.value.open()
}
// 刷新按钮
function tableRefreshFirst() {
let redo: any = document.getElementsByClassName('anticon-redo')
redo[0].click()
// const data = { ...formRes.value }
// nowFirst.value = true
// data.multisort = searchData.value.multisort
// searchData.value = JSON.parse(JSON.stringify(data))
// init(searchData.value)
// formRes.value = data
}
// 删除
function removeMoreFun() {
const select = getSelectRows()
if (select.length === 0) {
notification.error({ message: '请选择操作订单', duration: 3 })
return false
}
const removeArr = select.map((item) => {
return item.id
})
deleteBookingOrder(removeArr)
}
// 删除方法
function deleteBookingOrder(arr) {
// let api = ''
// arr.forEach((e, i) => {
// if (i == 0) {
// api = `?Ids=${e}`
// } else {
// api = `${api}&Ids=${e}`
// }
// })
// console.log(api);
let api = []
arr.forEach((e, i) => {
api.push(e)
})
SeaExportBatchDel({ ids: api })
.then((res) => {
if (res.succeeded) {
notification.success({ message: '删除成功', duration: 3 })
reload()
} else {
notification.error({ message: res.message, duration: 3 })
}
})
.catch((err) => {
console.log(err)
})
}
// 批量编辑
function batchEditing() {
const select = getSelectRows()
if (select.length === 0) {
notification.error({ message: '请选择操作订单', duration: 3 })
return false
}
const removeArr = select.map((item) => {
return item.id
})
openModal(true, { removeArr })
}
// 批量编辑 弹窗
const [registerModal, { openModal }] = useModal()
function BMSuccess() {
reload()
}
const isAdvancedQuery = ref(false)
//打开高级查询弹窗
function FnOpenAdvancedQuery() {
AdvancedQueryVisible.value = true
}
//关闭高级查询弹窗
function FnCancelAdvancedQuery() {
AdvancedQueryVisible.value = false
}
//执行高级查询
async function FnAdvancedQuery() {
let Api = (data) => {
let Obj: any = {}
let key: number = 0
console.log(data)
data.logicalOperator == 'and' ? (key = 0) : (key = 1)
if (data.conditions.length) {
if (!Obj.ConditionalList) {
Obj.ConditionalList = []
}
let Arr: any[] = []
data.conditions.forEach((item) => {
Arr.push({
Key: key,
Value: {
FieldName: item.field,
FieldValue: item.operator,
ConditionalType: item.value,
},
})
})
Obj.ConditionalList.push(...Arr)
}
if (data.groups.length) {
if (!Obj.ConditionalList) {
Obj.ConditionalList = []
}
let Arr: any[] = []
data.groups.forEach((item) => {
Arr.push({
Key: key,
Value: Api(item),
})
})
Obj.ConditionalList.push(...Arr)
}
return Obj
}
ConditionalList.value = {
ConditionalList: Api(AdvancedQueryData.value).ConditionalList,
}
let ApiData = {
permissionId: permissionId.value,
content: JSON.stringify(AdvancedQueryData.value),
}
const res: API.DataResult = await UpdateUserQuerySet(ApiData)
if (res.succeeded) {
console.log(res)
isAdvancedQuery.value = true
reload()
// getList(searchData.value, false, 'normal', true)
// FnCancelAdvancedQuery()
}
}
// 查询
function tableRefresh() {
isAdvancedQuery.value = false
reload()
}
onMounted(() => {
// 绑定监听事件
window.addEventListener('keydown', keyDown)
})
onUnmounted(() => {
// 销毁事件
window.removeEventListener('keydown', keyDown, false)
})
// 回车 查询
function keyDown(e) {
if (e.keyCode === 13 || e.keyCode === 100) {
tableRefresh()
}
}
// 重置
function tableReset() {
resetFields()
setTimeout(() => {
reload()
}, 100)
}
const moreNumVal = ref('') // 多提单号绑定值
const moreNumVisible = ref(false) //多提单号弹窗
// 打开多提单号查询
function tableMoreRefresh() {
moreNumVal.value = ''
moreNumVisible.value = !moreNumVisible.value
}
// 多提单号 确定
function moreNumSubmit() {
reload()
}
// 多提单号 取消
function moreNumCancel() {
moreNumVisible.value = false
}
// -----------------------------------
const formInitData = [
{ title: '主提单号', align: 'center', width: '90', label: 'MBLNO', type: 'input' },
{ title: '分提单号', align: 'center', width: '90', label: 'HBLNO', type: 'input' },
{ title: '订舱编号', align: 'center', width: '90', label: 'CUSTNO', type: 'input' },
{
title: '开船日期',
align: 'center',
width: 160,
label: 'ETD',
type: 'dateRange',
resLabel: ['BETD', 'EETD'],
},
{
title: '实际开船日期',
align: 'center',
width: 160,
label: 'ATD',
type: 'dateRange',
resLabel: ['BATD', 'EATD'],
},
{
title: '船名',
align: 'center',
width: 120,
label: 'VESSEL',
type: 'select',
showLabel: 'vessel',
},
]
const formMoreTableData = ref('')
const formTableData = ref(JSON.parse(JSON.stringify(initData.columns)))
const formatFlag = ref(false)
const AdvancedQueryVisible = ref(false)
const advanced = ref(false)
const goodStatusShow = ref(false)
const goodStatusData = ref(null)
const spinning = ref(false)
const formData = ref(formInitData)
const formRes = ref({})
const ResetType = ref(true)
const nowFirst = ref(false)
const searchData = ref({ multisort: [] })
const gridOptions = reactive({
border: false,
resizable: true,
showOverflow: true,
loading: true,
stripe: true,
round: true,
autoResize: true,
align: 'left',
scrollY: { enabled: true },
columnConfig: { resizable: true },
importConfig: {},
exportConfig: {},
pagerConfig: {
total: 0,
currentPage: 1,
pageSize: 20,
pageSizes: [10, 20, 50, 100, 200, 500],
},
columns: [],
data: [],
})
const tableOrderLabel = ref('')
const tableOrderType = ref('')
const carrierRadio = ref('CMA')
const RecentlyCarrierData = ref([])
const addNum = ref(0)
const RcarrierData = ref([])
const radioStyle = reactive({
display: 'block',
height: '50px',
lineHeight: '50px',
})
const copyMoreForm = reactive({
number: 1,
})
const RefeditingForm = ref()
const editingForm = reactive({
vessel: '',
etd: '',
voynoinner: '',
voyno: '',
portDischarge: '',
portDischargeId: '',
destination: '',
destinationid: '',
closingdate: '',
closedocdate: '',
})
const WebVessel = ref('')
const vesselData = ref([])
const portDischargeData = ref([])
const destinationData = ref([])
const shipagencyFlag = ref(false)
const shipagency = ref('')
const shipagencyData = ref([])
const shipagencyLoad = ref(false)
const txxpLoading = ref(false)
const txxpFlag = ref(false)
const txxpForm = ref({})
const traceModalVisible = ref(false)
const traceValue = ref([])
const traceOptions = ref([
{ label: '起运港', value: '1' },
{ label: '目的港', value: '2' },
])
const bcFileFlag = ref(false)
const bcFile = ref({ ext: [] })
const bcObj = ref({})
const RefimportBc = ref()
const RefimportBcMore = ref()
const xGrid = ref()
const tableHeight = ref(0)
const setForm = ref()
const formMoreData = ref()
const formAllData = ref([])
const formBtnCol = ref(8)
const sortLabelList = ref([])
const editRow = ref({})
const serviceFd = ref('')
const serviceFlag = ref(false)
const webData = ref('')
const webDataFlag = ref(false)
const webDataTitle = ref('')
const remarkScreenX = ref(0)
const remarkScreenY = ref(0)
const remarkData = ref()
const remarkShow = ref(false)
const TaskShippingOrderCompareData = ref({
showDetailList: '',
total: '',
isExistsDiff: false,
})
const TaskShippingOrderCompareVisible = ref(false)
const pdfUrl = ref('')
const formatSheet = ref({
showDetailList: [],
total: '',
isShowCntall: false,
})
const formatSheetVisible = ref(false)
const pdfLoading = ref(false)
const formatPdf = ref('')
const goodStatusScreenX = ref(0)
const goodStatusScreenY = ref(0)
const goodStatusSeat = ref('bottom')
const screenWidth = ref(document.body.clientWidth)
const RefbcBox = ref()
const setTableForm = ref()
const showColumns = ref({})
const fromTableAllData = ref({})
const AdvancedQueryData = ref<FilterRules>({ logicalOperator: 'and', conditions: [], groups: [] })
const fields = ref<Field[]>([])
const permissionId = ref<String>('')
// ========
onBeforeRouteLeave((to, from, next) => {
appStore.setbookingGridOptions(gridOptions)
appStore.setsaveNeedNumber(null)
next()
})
watch(
() => route,
(nD, oD) => {
console.log(nD, nD.name)
if (nD.name === 'booking_ledger') {
if (appStore.getsaveNeedNumber !== null) {
let index = -1
gridOptions.data.forEach((ite, inde) => {
if (ite.id === appStore.getsaveNeedNumber) {
index = inde
}
})
if (index !== -1) {
getListByone(appStore.getsaveNeedNumber, index)
}
}
if (appStore.getfirstFlag && appStore.getsaveNeedNumber === null && !appStore.getdeleteId) {
getList(searchData.value)
}
if (appStore.getdeleteId !== null) {
let index = -1
gridOptions.data.forEach((ite, inde) => {
if (ite.id === appStore.getdeleteId) {
index = inde
}
})
console.log(index)
if (index !== -1) {
gridOptions.data.splice(index, 1)
}
}
appStore.setinBookingDetailsSave(false)
}
},
{ deep: true },
)
createdInit()
//------ ZTH 状态不全 后期删掉 走 上面的createdInit------
getList()
// ----------------------------------------------------
const arr = localStorage.getItem('bookingSetting')
? JSON.parse(localStorage.getItem('bookingSetting'))
: []
if (arr.length > 0) {
gridOptions.columns = arr
} else {
gridOptions.columns = JSON.parse(JSON.stringify(initData.columns))
}
onMounted(() => {
onresize()
})
// ====================================================
// 新建
function addBooking() {
addNum.value = Math.round(Math.random() * 1000)
go(`/BookingDetail?addNum=${addNum.value}`)
}
// 复制
function copyBooking() {
const select = getSelectRows()
const pkIdArr = select.map((item, index) => {
return item.id
})
if (pkIdArr.length > 1) {
notification.error({ message: '请选择一条数据', duration: 3 })
return false
} else if (pkIdArr.length === 0) {
notification.error({ message: '请至少选择一条数据', duration: 3 })
return false
}
go(`/BookingDetail?id=${pkIdArr[0]}&isCopy=${true}`)
}
// 复制多票
const copyMoreFlag = ref(false)
function copyBookingMore() {
const select = getSelectRows()
const pkIdArr = select.map((item, index) => {
return item.id
})
if (pkIdArr.length > 1) {
notification.error({ message: '请选择一条数据', duration: 3 })
return false
} else if (pkIdArr.length === 0) {
notification.error({ message: '请至少选择一条数据', duration: 3 })
return false
}
copyMoreFlag.value = true
}
const RefcopyMoreForm = ref()
function handleSubmitCopyMore(e) {
const select = getSelectRows()
const pkIdArr = select.map((item) => {
return item.id
})
for (let index = 0; index < copyMoreForm.number; index++) {
setTimeout(() => {
console.log(`/?id=${pkIdArr[0]}&isCopy=${true}&copyId=${index}`)
router.push({
path: '/BookingDetail',
query: { id: pkIdArr[0], isCopy: true, copyId: index },
})
}, 100)
}
copyMoreFlag.value = false
}
// ====================================================
function getListByone(listId, listIndex) {
PageDataByBooking({ id: listId }).then((res) => {
const item = res.data[0]
const bookstatus = [
{ staCode: 'sta_cangdan', isChecked: false },
{ staCode: 'sta_haifang', isChecked: false },
{ staCode: 'sta_zhuangzai', isChecked: false },
{ staCode: 'sta_mafang', isChecked: false },
{ staCode: 'sta_zhuangchuan', isChecked: false },
{ staCode: 'sta_atd', isChecked: false },
]
if (item.bookstatus.length > 0) {
bookstatus.map((book, bindex) => {
item.bookstatus.map((ite, index) => {
if (ite.staCode === book.staCode) {
bookstatus[bindex] = ite
bookstatus[bindex].isChecked = true
}
})
})
}
if (item.bsstatusname) {
if (appStore.getstatusDIct) {
appStore.getstatusDIct.forEach((ite) => {
if (ite.name == item.bsstatusname) {
item.bsstatusnameColor = ite.remark
}
})
}
}
item.bookstatus = bookstatus
item.refshYzitemLoad = false
item.webDataLoad = false
item.dzmarkLoading = false
item.czmarkLoading = false
item.custnoLoading = false
item.sqxsLoading = false
item.ponoLoading = false
item.rowCzMark = false
item.rowSqxs = false
item.rowPono = false
item.rowCustno = false
item.rowDzMark = false
item.atdLoading = false
item.serviceLoad = false
if (!item.shenQingXiangShi) {
item.shenQingXiangShi = ''
}
let hasGoods = 0
item.goodsStatusList.map((gitem, gindex) => {
if (gitem.finishTime || gitem.remark) {
hasGoods++
}
})
item.hasGoods = hasGoods
gridOptions.data.listIndex = item
xGrid.value.reloadData(gridOptions.data)
xGrid.value.setCurrentRow(gridOptions.data[listIndex])
})
}
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)
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
}
FnGetUserQuerySet()
// getConfigUser(true)
}
async function FnGetUserQuerySet() {
const res: API.DataResult = await GetUserQuerySet({
permissionId: permissionId.value,
})
if (res.succeeded) {
console.log(res)
AdvancedQueryData.value = JSON.parse(res.data.content)
}
}
// function getConfigUser(isInit = false) {
// const query = {
// typeArr: ['booking_list_cond', 'booking_list_column', 'booking_list_page', 'booking_sort'],
// }
// // DjyUserConfigMulti(this.$qs.stringify(query, { arrayFormat: 'repeat' })).then((res) => {
// DjyUserConfigMulti(JSON.stringify(query, { arrayFormat: 'repeat' })).then((res) => {
// const $data = {}
// res.data.map((item, index) => {
// switch (item.type) {
// case 'booking_list_cond':
// $data.booking_list_cond = item
// break
// case 'booking_list_column':
// $data.booking_list_column = item
// break
// case 'booking_sort':
// setSort(item)
// break
// case 'booking_list_page':
// setPageSize(item)
// break
// }
// })
// if (Object.keys($data).includes('booking_list_cond')) {
// setFormData($data.booking_list_cond, false, true)
// } else {
// setFormData({}, false, true)
// }
// if (Object.keys($data).includes('booking_list_column')) {
// setTableList($data.booking_list_column)
// } else {
// setTableList({})
// }
// })
// }
function setTableList(data) {
if (Object.keys(data).length > 0 && JSON.parse(data.configJson).length) {
formTableData.value = JSON.parse(data.configJson)
formTableData.value.forEach((item) => {
if (!item.slots && item.field === 'bsstatusname') {
item.slots = { default: 'bsstatusname' }
}
if (item.field === 'zhanCangFlag') {
item.width = 35
}
if (item.field === 'custno') {
item.slots = { default: 'custno' }
}
if (item.field === 'shenQingXiangShi') {
item.slots = { default: 'shenQingXiangShi' }
}
if (item.field === 'pono') {
item.slots = { default: 'pono' }
}
if (item.label === 'LINENAME') {
item.field = 'lineName'
}
if (item.label === 'ETA') {
item.title = '目的港ETA'
}
if (item.label === 'isVGM') {
item.title = 'VGM'
item.width = 60
}
if (item.label === 'IsZZFX') {
item.title = '装载'
item.width = 50
}
if (item.label === 'IsCanDan') {
item.title = '舱单'
item.width = 50
}
})
const nowTableArr = formTableData.value.map((item, index) => {
if (item.field === 'operate') {
item.width = 60
}
return item.field
})
gridOptions.columns = JSON.parse(JSON.stringify(formTableData.value))
localStorage.setItem('bookingSetting', JSON.stringify(gridOptions.columns))
const moreTableArr = []
fromTableAllData.value.map((item, index) => {
if (!nowTableArr.includes(item.field)) {
moreTableArr.push(item)
}
})
formMoreTableData.value = moreTableArr
// that.$forceUpdate()
} else {
const nowTableArr = formTableData.value.map((item, index) => {
return item.field
})
const moreTableArr = []
fromTableAllData.value.map((item, index) => {
if (!nowTableArr.includes(item.field)) {
moreTableArr.push(item)
}
})
formMoreTableData.value = moreTableArr
// that.$forceUpdate()
}
}
function setPageSize(data) {
if (data && JSON.parse(data.configJson)) {
gridOptions.pagerConfig.pageSize = JSON.parse(data.configJson).pageSize
// that.$forceUpdate()
} else {
getList({}, true)
}
}
function setSort(item) {
if (Array.isArray(JSON.parse(item.configJson))) {
sortLabelList.value = JSON.parse(item.configJson)
if (sortLabelList.value.length > 0) {
const key = JSON.parse(item.configJson)[0].sortField
const sort = JSON.parse(item.configJson)[0].descSort
tableOrderLabel.value = key || ''
tableOrderType.value = sort ? 'desc' : 'asc'
const newArr = []
sortLabelList.value.forEach((item) => {
newArr.push({
sortField: item.sortField,
descSort: item.descSort,
})
})
searchData.value.multisort = newArr
xGrid.value.sort(key, sort)
} else {
tableOrderLabel.value = ''
tableOrderType.value = ''
xGrid.value.clearSort()
}
} else {
sortLabelList.value = []
const key = JSON.parse(item.configJson).key
const sort = JSON.parse(item.configJson).sort ? 'desc' : 'asc'
tableOrderLabel.value = key || ''
tableOrderType.value = sort ? 'desc' : 'asc'
xGrid.value.sort(key, sort)
}
}
function onresize() {
window.onresize = () => {
screenWidth.value = document.body.clientWidth
}
}
function submitSort(arr) {
const newArr = []
if (arr.length > 0) {
arr.forEach((item) => {
newArr.push({
sortField: item.field,
descSort: item.descSort,
})
})
searchData.value.multisort = newArr
DjyUserConfigAdd({
type: 'booking_sort',
configJson: JSON.stringify(newArr),
}).then((res) => {
const key = newArr[0].sortField
const sort = newArr[0].descSort
sortLabelList.value = newArr
tableOrderLabel.value = key || ''
tableOrderType.value = sort ? 'desc' : 'asc'
xGrid.value.sort(key, sort)
getList(searchData.value)
})
} else {
DjyUserConfigAdd({
type: 'booking_sort',
configJson: JSON.stringify([]),
}).then((res) => {
searchData.value.multisort = []
tableOrderLabel.value = ''
tableOrderType.value = ''
getList(searchData.value)
})
}
}
function submitTableForm(data) {
gridOptions.columns = JSON.parse(JSON.stringify(data))
setTableForm.value.handleCancel()
editColumnsSave(gridOptions.columns)
localStorage.setItem('bookingSetting', JSON.stringify(gridOptions.columns))
}
function handleCopy() {
notification.success({ message: '复制成功', duration: 3 })
const text = RefbcBox.innerText
var cInput = document.createElement('input')
cInput.value = text
document.body.appendChild(cInput)
cInput.select() // 选取文本框内容
document.execCommand('copy')
document.body.removeChild(cInput)
}
function TaskShippingOrderCompareHandleCancel() {
TaskShippingOrderCompareVisible.value = false
}
function toggleAdvanced() {
advanced.value = !advanced.value
// // that.$forceUpdate()
// const start = new Date().getTime()
// console.log('== 点击展开 ==', start, formBtnCol)
// if (!advanced.value) {
// const len = searchFormSchema.length % 4
// if (searchFormSchema.length === 4 || searchFormSchema.length > 4) {
// formBtnCol.value = 8
// } else {
// formBtnCol.value = 24 - len * 4
// }
// } else {
// const len = searchFormSchema.length % 6
// // formBtnCol.value = 24 - len * 4
// formBtnCol.value = 24 - len * 4 === 4 ? 24 : 24 - len * 4
// }
// console.log('== 展开结束 ==', new Date().getTime() - start, formBtnCol)
}
function formSetting() {
setForm.value.open()
}
function pageClick() {
goodStatusShow.value = false
goodStatusData.value = null
}
function formChange(data) {
const { form, value } = data
if (form.type === 'input') {
formRes.value[form.label] = value
} else if (form.type === 'date') {
formRes.value[form.label] = value
} else if (form.type === 'dateRange') {
formRes.value[form.resLabel[0]] = value[0] || ''
formRes.value[form.resLabel[1]] = value[1] || ''
} else if (form.type === 'select') {
formRes.value[form.label] = value
} else if (form.type === 'complete') {
formRes.value[form.label] = value
} else if (form.type === 'selectTree') {
formRes.value[form.label] = value
} else if (form.type === 'multiple') {
if (value.length == 0) {
formRes.value[form.label] = ''
} else {
formRes.value[form.label] = value
}
}
// that.$forceUpdate()
}
function pressEnterFun() {
tableRefresh()
}
function getCompleteListFun({ form, value }) {
let query = {}
if (
[
'PORTDISCHARGE',
'PORTLOAD',
'PLACERECEIPT',
'DESTINATION',
'PLACEDELIVERY',
'PAYABLEAT',
'BLFRT',
'ISSUEPLACE',
'PREPARDAT',
'SERVICE',
'SHIPAGENCY',
].includes(form.label)
) {
// 船公司 卸货港
query = {
KeyWord: value,
}
} else if (form.label === 'CUSTOMERNAME') {
// 客户/ 委托单位
query = {
KeyWord: value,
type: 'consignor',
}
} else if (form.label === 'FORWARDER') {
// 订舱代理
query = {
KeyWord: value,
type: 'booking_agent',
}
} else if (['SALE', 'CUSTSERVICE', 'DOC', 'ROUTE', 'OP'].includes(form.label)) {
// 销售 、 揽货人, 航线操作
query = {
name: value,
}
} else if (form.label === 'CUSTOMSER') {
// 报关行
query = {
SearchValue: value,
PropString: 'customs_broker',
}
} else if (form.label === 'AGENTID') {
query = {
SearchValue: value,
PropString: 'out_agent',
}
} else if (form.label === 'TRUCKER') {
query = {
SearchValue: value,
PropString: 'fleet',
}
} else if (form.label === 'VESSEL') {
const etdStart = moment().subtract(3, 'days').format('YYYY-MM-DD')
const etdEnd = moment().add(3, 'days').format('YYYY-MM-DD')
query = {
KeyWord: value,
sortField: 'etd',
descSort: true,
etdStart: etdStart,
etdEnd: etdEnd,
}
}
const fun = emnuCompleteApi(form.label)
if (fun) {
getFromSelectData(emnuCompleteApi(form.label), query).then((data) => {
if (['CUSTOMERNAME', 'FORWARDER', 'CUSTOMSER', 'AGENTID', 'TRUCKER'].includes(form.label)) {
that.$refs[`fromlabel-${form.label}`][0].$data.dataSourceList = data.rows
} else if (['VESSEL'].includes(form.label)) {
const map = new Map()
for (const item of data) {
if (!map.has(item.vessel)) {
map.set(item.vessel, item)
}
}
that.$refs[`fromlabel-${form.label}`][0].$data.dataSourceList = [...map.values()]
} else {
that.$refs[`fromlabel-${form.label}`][0].$data.dataSourceList = data
}
})
}
}
function emnuCompleteApi(type) {
switch (type) {
case 'VESSEL':
return getVesselInfoService
case 'CUSTOMERNAME':
return DjyCustomerSuggest
case 'FORWARDER':
return DjyCustomerSuggest
case 'PORTDISCHARGE': // 卸货港
return GetPortlist
case 'PORTLOAD': // 装货港
return GetPortloadlist
case 'PLACERECEIPT': // 收货地
return GetPortloadlist
case 'DESTINATION': // 目的地
return GetPortlist
case 'PLACEDELIVERY': // 交货地
return GetPortlist
case 'SALE':
return GetSysUserPage
case 'CUSTSERVICE':
return GetSysUserPage
case 'ROUTE':
return GetSysUserPage
// case 'OP':
// return GetSysUserPage
case 'DOC':
return GetSysUserPage
case 'CUSTOMSER':
return DjyCustomerpage
case 'PAYABLEAT':
return GetPortlist
case 'BLFRT':
return GetFrt
case 'ISSUEPLACE':
return GetPortloadlist
case 'PREPARDAT':
return GetPortloadlist
case 'SERVICE':
return GetService
case 'AGENTID':
return DjyCustomerpage
case 'TRUCKER':
return DjyCustomerpage
case 'SHIPAGENCY':
return GetForwarderlist
}
}
function getFromSelectData(func, ...args) {
return new Promise((resolve, reject) => {
func(...args).then((res) => {
if (res.code === 200) {
resolve(res.data)
} else {
reject(res)
}
})
})
}
function getSelectFirst({ form, index, value }) {
const fun = emnuSelectApi(form.label)
if (fun) {
getFromSelectData(fun).then((data) => {
formData.value[index].dataList = data
that.$refs[`fromlabel-${form.label}`][0].$data.dataList = data
})
}
}
function emnuSelectApi(type) {
switch (type) {
case 'CARRIER':
return GetCarrierlist
// case 'YARDID':
// return GetYardlist
case 'CNTRTOTAL':
return GetCtn
case 'KINDPKGS':
return GetPackage
case 'ISSUETYPE':
return Codeissuetypelist
case 'lineName':
return GetTenantLineList
}
}
function editingHandleOk() {
RefeditingForm.value.validateFields((errors, values) => {
if (!errors) {
values.id = []
const select = xGrid.value.getCheckboxRecords()
select.forEach((item) => {
values.id.push(item.id)
})
BookingOrderBachUpdate(values).then((res) => {
if (res.succeeded) {
notification.success({ message: '编辑成功', duration: 3 })
editingHandleCancel()
} else {
notification.error({ message: `编辑失败,${res.message}`, duration: 3 })
}
})
} else {
}
})
}
function editingHandleCancel() {
RefeditingForm.value.resetFields()
editingModalVisible.value = false
}
function vesselSearch(data) {
if (data) {
WebVessel.value = data
} else if (data === undefined) {
WebVessel.value = data
}
getVesselInfoService({ KeyWord: data }).then((res) => {
vesselData.value = res.data
})
}
function vesselBlur() {
if (WebVessel.value !== undefined) {
setTimeout(() => {
RefeditingForm.value.setFieldsValue({
...RefeditingForm.value.getFieldsValue(),
vessel: WebVessel.value,
})
}, 100)
}
}
function portDischargeSearch(data) {
GetPortlist({ KeyWord: data }).then((res) => {
portDischargeData.value = res.data
})
}
function portDischargeChange(value) {
portDischargeData.value.forEach((item) => {
if (item.enName == value) {
setTimeout(() => {
RefeditingForm.value.setFieldsValue({
...RefeditingForm.value.getFieldsValue(),
portDischargeId: item.ediCode,
})
}, 100)
}
})
}
function destinationSearch(data) {
GetPortlist({ KeyWord: data }).then((res) => {
destinationData.value = res.data
})
}
function destinationChange(value) {
destinationData.value.forEach((item) => {
if (item.enName == value) {
setTimeout(() => {
RefeditingForm.value.setFieldsValue({
...RefeditingForm.value.getFieldsValue(),
destinationid: item.ediCode,
})
}, 100)
}
})
}
// ----------------------批量修改船代----------------------
function handleOpenShip() {
const select = xGrid.value.getCheckboxRecords()
const pkIdArr = select.map((item, index) => {
return item.id
})
if (pkIdArr.length === 0) {
notification.error({ message: '请至少选择一条数据', duration: 3 })
return false
}
shipagencyFlag.value = true
}
function shipagencySearch(data) {
GetForwarderlist({ KeyWord: data }).then((res) => {
shipagencyData.value = res.data
})
}
function handleSubimtShip() {
const select = xGrid.value.getCheckboxRecords()
const pkIdArr = select.map((item, index) => {
return item.id
})
let shipagencyName = ''
shipagencyData.value.forEach((item) => {
if (item.showCode == shipagency.value) {
shipagencyName = item.name
}
})
const data = {
id: pkIdArr,
shipagencyId: shipagency.value,
shipagency: shipagencyName,
}
shipagencyLoad.value = true
BachUpdateShipagency(data).then((res) => {
if (res.succeeded) {
notification.success({ message: '操作成功', duration: 3 })
shipagencyFlag.value = false
getList()
} else {
notification.success({ message: res.message, duration: 3 })
}
shipagencyLoad.value = false
})
}
function cancelRemove() {
console.log('== 取消 ==')
}
// -----------------------小票状态-----------------------
function handleSearchTxxp() {
const select = xGrid.value.getCheckboxRecords()
if (select.length === 0) {
notification.error({ message: '请选择操作订单', duration: 3 })
return false
}
const pkIdArr = select.map((item, index) => {
return item.id
})
txxpLoading.value = true
SaveBookingTxxp({ Id: pkIdArr[0] }).then((res) => {
if (res.succeeded) {
txxpFlag.value = true
txxpForm.value = res.data
} else {
notification.error({ message: res.message, duration: 3 })
}
txxpLoading.value = false
})
}
// -----------------------运踪订阅-----------------------
function openTraceModel() {
const select = xGrid.value.getCheckboxRecords()
if (select.length === 0) {
notification.error({ message: '请选择操作订单', duration: 3 })
return false
}
traceModalVisible.value = !traceModalVisible.value
}
function onTraceChange(values) {
console.log(traceValue.value)
}
function traceSend() {
if (!traceValue.value) {
notification.error({ message: '请选择订阅内容', duration: 3 })
return false
}
const arr = []
const select = xGrid.value.getCheckboxRecords()
if (select.length === 0) {
notification.error({ message: '请选择操作订单', duration: 3 })
return false
}
let errorTip = ''
select.map((item, index) => {
if (traceValue.value.includes('1') && (!item.yard || !item.yardid)) {
errorTip = `单号${item.mblno}未选择场站`
}
if (traceValue.value.includes('2') && (!item.carrierid || !item.carrier)) {
errorTip = `单号${item.mblno}未选择船公司`
}
const query = {
businessId: item.id,
mblno: item.mblno,
yard: traceValue.value.includes('1') ? item.yard : '',
yardCode: traceValue.value.includes('1') ? item.yardid : '',
carrierid: traceValue.value.includes('2') ? item.carrierid : '',
carrier: traceValue.value.includes('2') ? item.carrier : '',
isBook: !!traceValue.value.includes('2'),
}
arr.push(query)
})
if (errorTip !== '') {
notification.error({ message: errorTip, duration: 3 })
return false
}
SendTrace(arr)
.then((res) => {
if (res.succeeded) {
const tip = `订阅成功`
notification.success({ message: tip, duration: 3 })
traceModalVisible.value = false
traceValue.value = []
} else {
notification.error({ message: res.message, duration: 3 })
traceModalVisible.value = false
traceValue.value = []
}
})
.catch((err) => {
console.log(err)
})
}
// -----------------------船公司文件-----------------------
function handleDownByBc(type) {
const select = xGrid.value.getCheckboxRecords()
const pkIdArr = select.map((item, index) => {
return item.id
})
if (pkIdArr.length === 0) {
notification.error({ message: '请至少选择一条数据', duration: 3 })
return false
} else {
spinning.value = true
if (type === 1) {
downloadBookingConfirm(pkIdArr)
.then((res) => {
if (res.succeeded) {
spinning.value = false
bcFileFlag.value = true
bcFile.value = res.data
} else {
notification.error({ message: res.message, duration: 3 })
}
})
.catch((err) => {
console.log(err)
})
}
if (type === 2) {
downloadDraft(pkIdArr)
.then((res) => {
if (res.succeeded) {
spinning.value = false
bcFileFlag.value = true
bcFile.value = res.data
} else {
notification.error({ message: res.message, duration: 3 })
}
})
.catch((err) => {
console.log(err)
})
}
if (type === 4) {
checkUpdateManifestNo(pkIdArr)
.then((res) => {
if (res.succeeded) {
spinning.value = false
bcFileFlag.value = true
bcFile.value = res.data
} else {
notification.error({ message: res.message, duration: 3 })
}
})
.catch((err) => {
console.log(err)
})
}
}
}
function handleImportBc() {
const select = xGrid.value.getCheckboxRecords()
const pkIdArr = select.map((item, index) => {
return item.id
})
if (pkIdArr.length === 0) {
notification.error({ message: '请选择一条数据', duration: 3 })
return false
} else {
if (pkIdArr.length > 1) {
notification.error({ message: '只能选择一条数据', duration: 3 })
return false
} else {
bcObj.value = {}
RefimportBc.value.open()
}
}
}
function bcClose() {
bcObj.value = {}
}
function handleSuccess(file) {
const select = xGrid.value.getCheckboxRecords()
const pkIdArr = select.map((item, index) => {
return item.id
})
const formData = new FormData()
formData.append('file', file)
formData.append('bookingOrderId', pkIdArr[0])
singleBCFileRead(formData)
.then((res) => {
if (res.data.succ) {
bcObj.value = res.data.ext
notification.success({ message: '上传成功', duration: 3 })
RefimportBc.value.loading = false
} else {
notification.error({ message: res.data.msg, duration: 3 })
RefimportBc.value.loading = false
}
})
.catch((res) => {
notification.error({ message: '上传失败', duration: 3 })
RefimportBc.value.loading = false
})
}
function handleImportBcMore() {
RefimportBcMore.value.open()
}
// ------------------------快递------------------------
function GoExpress() {
const select = xGrid.value.getCheckboxRecords()
if (select.length === 0) {
notification.error({ message: '请选择操作订单', duration: 3 })
return false
} else {
let Ids = ''
console.log(select)
select.forEach((item, index) => {
if (index == 0) {
Ids = `${item.id}`
} else {
Ids = `${Ids},${item.id}`
}
})
go(`/ExpressModuleDetails?type=Add&Ids=${Ids}`)
}
}
// ------------------------表格------------------------
function handlePageChange({ currentPage, pageSize }) {
if (gridOptions.pagerConfig.pageSize !== pageSize) {
editPageSizeSave(pageSize)
}
gridOptions.pagerConfig.currentPage = currentPage
gridOptions.pagerConfig.pageSize = pageSize
getList(searchData.value)
}
function editPageSizeSave(pageSize = 10) {
const data = {
pageSize: pageSize,
}
DjyUserConfigAdd({
type: 'booking_list_page',
configJson: JSON.stringify(data),
}).then((res) => {
console.log('页码设置成功')
})
}
function handledbclick(record, index, event) {
console.log('handledbclick', record, index, event)
editColumns(record)
}
function editColumns(row) {
if (row.mblno) {
go(`/BookingDetail?id=${row.id}&type=${row.carrierid}&mblno=${row.mblno}`)
} else {
go(`/BookingDetail?id=${row.id}&type=${row.carrierid}&customerNo=${row.customerNo}`)
}
}
function customSortMethod() {}
function resizableChange(e) {
gridOptions.columns[e.columnIndex].width = e.resizeWidth
editColumnsSave(gridOptions.columns)
localStorage.setItem('bookingSetting', JSON.stringify(gridOptions.columns))
}
function editColumnsSave(data = {}) {
DjyUserConfigAdd({
type: 'booking_list_column',
configJson: JSON.stringify(data),
}).then((res) => {
setForm.value.handleCancel()
})
}
function submitForm(data) {
formData.value = data
const arr = data.map((item, index) => {
return item.label
})
formRes.value = {}
searchData.value = {}
DjyUserConfigAdd({
type: 'booking_list_cond',
configJson: JSON.stringify(arr),
}).then((res) => {
notification.success({ message: '保存成功', duration: 3 })
setForm.value.handleCancel()
Object.keys(that.$refs).map((label, index) => {
if (label.includes('fromlabel-') && that.$refs[label].length > 0) {
that.$refs[label][0].$data.value = ''
}
})
getFormData()
init()
})
}
function getFormData(isReset = false) {
DjyUserConfigGet({ type: 'booking_list_cond' }).then((res) => {
setFormData(res.data)
})
}
function setFormData(data, isReset = false, isInit = false) {
if (Object.keys(data).length > 0 && JSON.parse(data.configJson).length) {
const arr = JSON.parse(data.configJson)
const nowData = []
const moreData = []
arr.map((item, index) => {
formAllData.value.map((fitem, findex) => {
if (fitem.label === 'VESSEL') {
fitem.type = 'select'
}
if (fitem.label === item) {
nowData.push(fitem)
}
})
})
formAllData.value.map((item, index) => {
if (!arr.includes(item.label)) {
moreData.push(item)
}
})
formData.value = nowData
formMoreData.value = moreData
} else {
const nowData = formData.value.map((item, index) => {
return item.label
})
const moreData = []
formAllData.value.map((item, index) => {
if (!nowData.includes(item.label)) {
moreData.push(item)
}
})
formMoreData.value = moreData
}
formData.value.map((item, index) => {
formRes.value[item.label] = formRes.value[item.label] || ''
// select 船公司 等获取下拉列表
if (item.type === 'select') {
if (['NOBILL', 'CARGOID'].includes(item.label)) {
item.dataList = item.data
setTimeout(() => {
that.$refs[`fromlabel-${item.label}`][0].$data.dataList = item.data
}, 300)
}
}
})
// if (!isReset && !isInit) {
// this.getList(formRes.value)
// }
if (!isReset) {
getList(formRes.value)
}
const len = formData.value.length % 4
if (formData.value.length === 4 || formData.value.length > 4) {
formBtnCol.value = 8
} else {
formBtnCol.value = 24 - len * 4
}
// that.$forceUpdate()
}
function tableSortChange(e) {
const { property, order } = e
tableOrderLabel.value = property || ''
tableOrderType.value = order
const data = [
{
sortField: property,
descSort: order === 'desc',
},
]
DjyUserConfigAdd({
type: 'booking_sort',
configJson: JSON.stringify(data),
}).then((res) => {
sortLabelList.value = []
searchData.value.multisort = data
getList(searchData.value)
})
}
function checkboxChangeEvent() {
console.log('== 选中,取消选中 ==', xGrid.value.getCheckboxRecords())
}
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)
notification.success({ message: '复制成功!', duration: 3 })
}
function handleSaveService(row) {
const data = {
bookingId: row.id,
statusCodes: [{ statusCode: 'YFD' }],
}
row.serviceLoad = true
SaveServiceStatusByList(data).then((res) => {
if (res.code === 200) {
notification.success({ message: res.data.msg, duration: 3 })
PageDataByBooking({ id: row.id }).then((ress) => {
const itme = ress.data.items[0]
row.bsstatusname = itme.bsstatusname
row.serviceLoad = false
})
} else {
notification.error({ message: res.data.msg, duration: 3 })
row.serviceLoad = false
}
})
}
function handleOpenService(row) {
editRow.value = row
serviceFd.value = ''
serviceFlag.value = true
}
function handleRefshAtd(row, index) {
row.atdLoading = true
refreshSailingDate({ id: row.id }).then((res) => {
if (res.succeeded) {
row.atdLoading = false
row.atd = res.data.atd
} else {
notification.error({ message: res.message, duration: 3 })
row.atdLoading = false
}
})
}
function removeFun(data) {
deleteBookingOrder([data.id])
}
function handleRefshYZOnce(row, rowIndex) {
row.refshYzitemLoad = true
RefreshBillTrace('ids=' + row.id).then((res) => {
if (res.succeeded) {
PageDataByBooking({ id: row.id }).then((ress) => {
const item = ress.data.items[0]
row.refshYzitemLoad = false
const bookstatus = [
{ staCode: 'sta_cangdan', isChecked: false },
{ staCode: 'sta_haifang', isChecked: false },
{ staCode: 'sta_zhuangzai', isChecked: false },
{ staCode: 'sta_mafang', isChecked: false },
{ staCode: 'sta_zhuangchuan', isChecked: false },
{ staCode: 'sta_atd', isChecked: false },
]
if (item.bookstatus.length > 0) {
bookstatus.map((book, bindex) => {
item.bookstatus.map((ite, index) => {
if (ite.staCode === book.staCode) {
bookstatus[bindex] = ite
bookstatus[bindex].isChecked = true
}
})
})
}
row.bookstatus = bookstatus
row.statuslogs1 = item.statuslogs1
notification.success({ message: '操作成功', duration: 3 })
})
} else {
row.refshYzitemLoad = false
notification.error({ message: res.message, duration: 3 })
}
})
}
function handleGetWebDataYZ(row, code) {
let webCode = ''
webData.value = ''
if (code === 'sta_haifang' || code === 'sta_cangdan') {
webCode = 'HLW_CD'
webDataTitle.value = '物流信息数据'
} else {
webCode = 'YGT'
webDataTitle.value = '云港通数据'
}
const data = {
bookingId: row.id,
webCode: webCode,
}
row.refshYzitemLoad = true
GetWebData(data).then((res) => {
if (res.code === 200) {
webData.value = res.data
webDataFlag.value = true
} else {
notification.error({ message: res.message, duration: 3 })
}
row.refshYzitemLoad = false
})
}
function enmuBookingBtn(val) {
switch (val) {
case 'sta_cangdan':
return '舱单'
case 'sta_haifang':
return '海放'
case 'sta_zhuangzai':
return '装载'
case 'sta_mafang':
return '码放'
case 'sta_zhuangchuan':
return '装船'
case 'sta_atd':
return '离港'
case 'sta_so':
return '已订舱'
case 'sta_bc':
return '订舱确认'
case 'sta_letter_yard':
return '放舱'
case 'sta_xhz':
return '下货纸'
default:
return '--'
}
}
function handleGetWebData(row, code) {
const data = {
bookingId: row.id,
webCode: code,
}
webData.value = ''
webDataTitle.value = '场站数据'
row.webDataLoad = true
GetWebData(data).then((res) => {
if (res.code === 200) {
webData.value = res.data
webDataFlag.value = true
} else {
notification.error({ message: res.message, duration: 3 })
}
row.webDataLoad = false
})
}
function remarkhover(e, data) {
if (data.bookremark.length > 0) {
const maxWidth = window.innerWidth
if (maxWidth - e.pageX > 230) {
remarkScreenX.value = e.pageX + 20
} else {
remarkScreenX.value = e.pageX - 300
}
remarkScreenY.value = e.pageY + 20
remarkData.value = data.bookremark
remarkShow.value = true
}
}
function remarkLeave() {
remarkShow.value = false
remarkData.value = null
}
function FnTxxpLink(row) {
TxxpLink(row.id)
.then((res) => {
if (res.succeeded) {
window.open(res.data)
} else {
notification.error({ message: res.message, duration: 3 })
}
})
.catch((err) => {
console.log(err)
})
}
function handleLookPdf(row) {
window.open(row.extendState.txxpPdfUrl)
}
function handleOpenResult(row) {
spinning.value = true
GetShippingOrderCompareResult({ bookingId: row.id }).then((res) => {
if (res.succeeded) {
if (!res.data.succ) {
spinning.value = false
notification.success({ message: res.data.msg, duration: 3 })
} else {
if (res.data.extra) {
TaskShippingOrderCompareData.value = { ...res.data.extra }
TaskShippingOrderCompareData.value.total = res.data.total
TaskShippingOrderCompareVisible.value = true
spinning.value = false
} else {
notification.success({ message: res.data.msg, duration: 3 })
spinning.value = false
}
}
} else {
spinning.value = false
notification.error({ message: res.data.msg, duration: 3 })
}
})
}
function excuteShippingOrderCompareBatch(data) {
let arr = []
if (data) {
arr.push(data.id.toString())
} else {
const select = xGrid.value.getCheckboxRecords()
arr = select.map((item, index) => {
return item.id.toString()
})
if (arr.length === 0) {
notification.error({ message: '请选择操作订单', duration: 3 })
return false
}
}
spinning.value = true
ExcuteShippingOrderCompareBatch(arr)
.then((res) => {
if (res.succeeded) {
if (!res.data.succ) {
spinning.value = false
notification.success({ message: res.data.msg, duration: 3 })
} else {
if (res.data.extra) {
TaskShippingOrderCompareData.value = res.data.extra
TaskShippingOrderCompareData.value.total = res.data.total
TaskShippingOrderCompareVisible.value = true
PageDataByBooking({ id: data.id }).then((ress) => {
const itme = ress.data.items[0]
spinning.value = false
data.lstShipOrderCompareRlt = itme.lstShipOrderCompareRlt
data.lstShipOrderCompareMode = itme.lstShipOrderCompareMode
data.lstShipOrderCompareDate = itme.lstShipOrderCompareDate
})
} else {
notification.success({ message: res.data.msg, duration: 3 })
spinning.value = false
}
}
} else {
spinning.value = false
notification.error({ message: res.data.msg, duration: 3 })
}
})
.catch((err) => {
console.log(err)
spinning.value = false
})
}
function handleFormatContrast(row) {
spinning.value = true
pdfUrl.value = ''
GetDraftCompareResultInfo({ bookingid: row.id }).then((res) => {
if (res.succeeded) {
if (!res.data.succ) {
spinning.value = false
notification.success({ message: res.data.msg, duration: 3 })
} else {
if (res.data.extra) {
formatSheet.value = res.data.extra
formatSheet.value.total = res.data.total
formatSheetVisible.value = true
const arr = []
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 {
notification.success({ message: res.data.msg, duration: 3 })
}
spinning.value = false
if (res.data.extra3) {
pdfLoading.value = true
BookingOrderDownload({ id: res.data.extra3 }).then((res) => {
pdfUrl.value = window.URL.createObjectURL(
new Blob([res], { type: 'application/pdf;charset=utf-8' }),
)
formatPdf.value = pdfUrl.value
pdfLoading.value = false
})
}
}
} else {
spinning.value = false
notification.error({ message: res.data.msg, duration: 3 })
}
})
}
function goodStatusclick(e, data) {
if (!goodStatusShow.value) {
goodStatusHover(e, data)
} else {
goodStatusLeave()
}
}
function goodStatusHover(e, data) {
const maxWidth = window.innerWidth
if (maxWidth - e.pageX > 230) {
// goodStatusScreenX.value = e.pageX + 20
goodStatusScreenX.value = e.pageX - 139
} else {
// goodStatusScreenX.value = e.pageX - 300
goodStatusScreenX.value = e.pageX - 139
}
if (e.pageY > window.innerHeight - 340) {
goodStatusScreenY.value = e.pageY - 370 - 10
goodStatusSeat.value = 'top'
} else {
goodStatusScreenY.value = e.pageY + 25
goodStatusSeat.value = 'bottom'
}
// goodStatusScreenY.value = e.pageY + 20
goodStatusData.value = data.goodsStatusList
goodStatusShow.value = true
}
function goodStatusLeave() {
goodStatusShow.value = false
goodStatusData.value = null
}
function getFocusMark(row, file) {
row[file] = true
}
function getBlurMark(row, file) {
row[file] = false
}
function handleSaveMark(row, type) {
const data = {
Id: row.id,
}
if (type === 1) {
row.dzmarkLoading = true
data.dzRemark = row.dzRemark
}
if (type === 2) {
row.czmarkLoading = true
data.czRemark = row.czRemark
}
if (type === 3) {
row.custnoLoading = true
data.custno = row.custno
}
if (type === 4) {
row.sqxsLoading = true
data.shenQingXiangShi = row.shenQingXiangShi
}
if (type === 5) {
row.ponoLoading = true
data.pono = row.pono
}
SaveDataInList(data).then((res) => {
if (res.succeeded) {
notification.success({ message: '修改成功', duration: 3 })
} else {
notification.error({ message: res.message, duration: 3 })
}
row.dzmarkLoading = false
row.czmarkLoading = false
row.custnoLoading = false
row.sqxsLoading = false
row.ponoLoading = false
})
}
</script>
<style lang="less" scoped>
.advanced {
height: 65px;
}
.CsConditionFilter {
padding: 16px;
}
.booking-list {
padding-top: 8px;
padding-left: 8px;
padding-right: 8px;
}
/*.ant-layout{
background: #f4f4f4;
}*/
/*列表排序按钮 */
.vxe-cell--sort {
margin-top: -6px;
i {
font-size: 10px;
}
.vxe-sort--asc-btn {
margin-top: 6px;
}
}
/*列表表头 */
.vxe-header--row {
position: relative;
background: #fff !important;
.vxe-cell--sort {
position: absolute;
z-index: 3;
right: 0;
}
&::after {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 0;
background: @primary-color;
opacity: 0.04;
}
}
/*列表分页 */
.vxe-pager {
margin: 8px 0;
}
</style>
<style lang="less" scoped>
/*订舱表格内字体颜色 */
.mblno {
text-align: left;
color: @primary-color !important;
span {
margin-right: 0.5rem;
cursor: pointer;
}
.CSMblnoCopy {
cursor: pointer;
}
}
.CsFeeStatus {
padding: 5px 10px;
&.type0 {
background: #9acd32;
}
&.type1 {
}
&.type2 {
background: #FFE37E;
}
&.type3 {
}
&.type4 {
}
&.type5 {
}
&.type6 {
background: #FF4500;
}
&.type7 {
background: #FF4500;
}
&.type8 {
background: #b9b9ff;
}
&.type9 {
background: #87cefa;
}
}
// .vessel {
// color: #77c950;
// }
.nav-box {
padding: 0 10px;
.nav {
display: inline-block;
margin-right: 8px;
cursor: pointer;
border: 1px solid rgba(255, 255, 255, 0);
padding: 0 10px;
height: 28px;
line-height: 26px;
color: #000;
.iconfont {
margin-right: 6px;
}
&:hover {
border: 1px solid rgba(255, 255, 255, 0);
border-radius: 4px;
}
&:nth-of-type(1) {
.iconfont {
color: #1d8aff;
}
&:hover {
background: #fff;
box-shadow: 0 0 10px #eee;
}
}
&:nth-of-type(2) {
.iconfont {
color: #865ef8;
}
&:hover {
background: #fff;
box-shadow: 0 0 10px #eee;
}
}
&:nth-of-type(3) {
.iconfont {
color: #ff9702;
}
&:hover {
background: #fff;
box-shadow: 0 0 10px #eee;
}
}
&:nth-of-type(4) {
.iconfont {
color: #1d8aff;
}
&:hover {
background: #fff;
box-shadow: 0 0 10px #eee;
}
}
&:nth-of-type(5) {
.iconfont {
color: #ff1062;
}
&:hover {
background: #fff;
box-shadow: 0 0 10px #eee;
}
}
&:nth-of-type(6) {
.iconfont {
color: #1ebeca;
}
&:hover {
background: #fff;
box-shadow: 0 0 10px #eee;
}
}
&:nth-of-type(7) {
.iconfont {
color: #82c93d;
}
&:hover {
background: #fff;
box-shadow: 0 0 10px #eee;
}
}
&:nth-of-type(8) {
.iconfont {
color: #1d8aff;
}
&:hover {
background: #fff;
box-shadow: 0 0 10px #eee;
}
}
&:nth-of-type(9) {
.iconfont {
color: #f6826b;
}
&:hover {
background: #fff;
box-shadow: 0 0 10px #eee;
}
}
}
}
.right {
float: right;
cursor: pointer;
padding-top: 6px;
}
.BookTopButton {
height: 33px;
.tab-btn {
padding: 6px 9px;
border: 1px solid #c7c7c9;
background: #f9fafe;
border-radius: 2px;
margin-right: 10px;
cursor: pointer;
-webkit-box-shadow: 0 2px 0 rgba(0, 0, 0, 0.02);
box-shadow: 0 2px 0 rgba(0, 0, 0, 0.02);
-webkit-user-select: 0 2px 0 rgba(0, 0, 0, 0.02);
}
}
.table-page-search-box {
display: flex;
align-items: center;
}
.table-page-search-submitButtons {
text-align: right;
padding-top: 6px;
.reset {
margin-left: 8px;
margin-right: 8px;
}
.more-search {
margin-left: 0px;
margin-right: 0px;
padding-right: 0px;
border: none;
position: relative;
box-shadow: none !important;
}
.tab-btn {
margin: 0 10px;
cursor: pointer;
position: relative;
i {
font-size: 14px;
margin-left: 8px;
}
}
// .tab-btn::before {
// content: '';
// position: absolute;
// width: 1px;
// height: 17px;
// background: #ccc;
// top: 2px;
// left: -20px;
// }
.senior-search {
margin-left: 0px;
color: rgba(0, 0, 0, 0.65);
position: relative;
i {
margin-left: 3px;
font-size: 15px;
}
}
// .senior-search::before {
// content: '';
// position: absolute;
// width: 1px;
// height: 17px;
// background: #ccc;
// top: 2px;
// left: -16px;
// }
.senior-search:hover {
color: @primary-color;
i {
color: @primary-color;
}
}
}
.ant-btn {
margin-right: 8px;
}
.table {
margin: 8px auto 20px;
}
.radio-logo {
width: 50px;
// height: 40px;
display: inline-block;
}
.group-label-box {
width: 100%;
.group-label {
width: 100%;
display: flex;
flex-wrap: wrap;
.ant-radio-wrapper {
height: 45px !important;
line-height: 45px !important;
width: 10%;
margin: 0;
}
// .label-flex {
// flex: 1;
// }
}
}
.Awrapper {
width: 100% !important;
display: flex !important;
height: 45px !important;
line-height: 45px !important;
width: 10%;
margin: 0;
.line {
margin-left: 10px;
margin-right: 40px;
height: 24px;
flex: 1;
border-bottom: 1px solid #c9c9c9;
}
}
/*查询区日期默认颜色 */
/deep/ .ant-calendar-today {
.ant-calendar-date {
color: @primary-color !important;
border-color: @primary-color !important;
}
}
/*方块边框按钮 */
.tab-btn:hover {
border-color: @primary-color;
color: @primary-color;
transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
}
/*列表双列背景色 */
// /deep/ .vxe-table--render-default .vxe-body--row.row--stripe {
// // background: #f5f9fe;
// position: relative;
// background: #fff;
// z-index: 1;
// &::after {
// content: '';
// position: absolute;
// top: 0;
// left: 0;
// width: 100%;
// height: 100%;
// z-index: 0;
// background: @primary-color;
// opacity: 0.04;
// z-index: -1;
// }
// }
/*列表操作按钮颜色 */
/deep/ .operate-btn {
color: @primary-color;
width: 19px;
margin: 0 !important;
}
/deep/ .operate-btn:hover {
color: @primary-color !important;
opacity: 0.7;
}
.book-btn {
display: inline-block;
padding: 0 10px;
height: 24px;
margin-right: 8px;
border: 1px solid #eee;
color: #999;
font-size: 12px;
line-height: 24px;
i {
display: none;
}
&.sta_so {
color: #8bc34a;
border: 1px solid #8bc34a;
}
&.sta_bc {
color: #fbc02d;
border: 1px solid #fbc02d;
}
&.sta_letter_yard {
color: #00bcd4;
border: 1px solid #00bcd4;
}
&.sta_xhz {
color: #e64a19;
border: 1px solid #e64a19;
}
}
.billtrace-box {
width: 100%;
// display: flex;
// height: 48px;
// flex-wrap:wrap;
// padding:3px 0;
// text-align: center;
.billtrace-btn {
display: inline-block;
font-size: 12px;
height: 16px;
// width:30%;
// display: flex;
span {
// flex: 1;
text-align: right;
color: black;
}
i {
font-size: 12px;
color: #ccc;
// flex: 1;
text-align: center;
&.hide {
opacity: 0;
}
}
.active {
cursor: pointer;
// color: @primary-color;
color: #ff9702;
font-weight: bold;
}
}
}
.normal-box {
.billtrace-btn {
display: inline-block;
}
}
.flex-box {
display: flex;
height: 48px;
flex-wrap: wrap;
padding: 3px 0;
text-align: center;
justify-content: center;
}
.billtrace-btn {
font-size: 12px;
height: 16px;
width: 30%;
display: flex;
span {
flex: 1;
text-align: right;
color: #999;
}
i {
font-size: 12px;
color: #ccc;
flex: 1;
text-align: center;
&.hide {
opacity: 0;
}
}
.active {
cursor: pointer;
// color: @primary-color;
color: #ff9702;
font-weight: bold;
}
&:nth-of-type(3) {
i {
opacity: 0;
}
}
}
.billtrace-btn1 {
font-size: 12px;
.active {
cursor: pointer;
// color: @primary-color;
color: #ff9702 !important;
font-weight: bold;
font-size: 12px;
}
}
/deep/ .ant-form-item {
margin-bottom: 10px !important;
}
/deep/ .table-page-search-submitButtons {
margin-bottom: 10px !important;
}
/deep/ .ant-input {
height: 28px;
margin-top: 4px;
// transform: scaleY(.8);
}
/deep/ .ant-card-body {
padding-top: 10px;
}
/deep/ .ant-calendar-picker-input {
padding: 0 4px;
}
/deep/ .ant-calendar-range-picker-input {
height: 28px;
font-size: 12px;
vertical-align: top;
text-align: center;
// background: #f99;
}
.reamrk-btns {
overflow: visible;
}
/deep/ .from-label {
padding: 0 !important;
}
.booking-from-box {
padding: 0 10px;
}
@media (min-width: 1200px) and (max-width: 1600px) {
.from-label {
padding-right: 0 !important;
}
}
@media (min-width: 1200px) and (max-width: 1438px) {
.table-page-search-submitButtons {
.ant-btn {
margin-left: 4px;
margin-right: 4px;
}
}
.table-page-search-submitButtons .senior-search {
margin-left: 20px;
&::before {
left: -7px;
}
}
}
/deep/ .book-remark-box {
> .vxe-cell {
overflow: visible !important;
}
// /deep/ .vxe-cell {
// overflow: visible !important;
// }
}
.bookremark {
position: relative;
.reamrk-label {
width: 100%;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
display: block;
cursor: pointer;
}
}
// 货物状态
.goods-status {
width: 100%;
display: flex;
height: 48px;
align-items: center;
.goods-status-left {
flex: 1;
overflow: hidden;
height: 48px;
text-overflow: ellipsis;
white-space: nowrap;
.goods-tip {
font-size: 12px;
margin: 0 4px;
cursor: pointer;
height: 48px;
line-height: 48px;
display: inline-block;
color: @primary-color;
}
}
.goods-status-right {
width: 30px;
text-align: center;
height: 48px;
i {
color: @primary-color;
cursor: pointer;
height: 48px;
line-height: 48px;
}
}
.TablelstShipOrderCompareRltRedo {
cursor: pointer;
margin-left: 0.5rem;
color: #13c2c2;
}
}
.dzRemark,
.czRemark {
display: block;
text-align: left;
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/deep/ .line-box:nth-last-of-type(-n + 5) {
.book-remark-box {
.bookremark {
.reamrk-list {
top: inherit;
bottom: calc(100% + 8px);
}
}
}
}
/deep/.line-box:nth-of-type(2n) {
position: relative;
background: #fff;
> * {
z-index: 1;
}
&::after {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 0;
background: @primary-color;
opacity: 0.04;
}
.book-remark-box {
.bookremark {
.reamrk-list {
top: inherit;
bottom: calc(100% + 8px);
}
}
}
}
.hovers-list {
max-height: 400px;
position: fixed;
top: 0;
left: 0;
z-index: 999;
width: 300px;
background: #fff;
box-shadow: 0 0 10px #eee;
border-radius: 4px;
border: 1px solid #eee;
padding: 5px 20px 10px 20px;
white-space: normal;
text-align: left;
z-index: 999 !important;
.title {
height: 30px;
line-height: 30px;
font-size: 12px;
font-weight: 600;
}
.list {
border-bottom: 1px solid #eee;
padding: 6px 0;
line-height: 18px;
font-size: 12px;
color: #666;
word-break: break-all;
&:nth-last-of-type(1) {
border: none;
}
.icon {
margin-right: 4px;
color: @primary-color;
}
}
}
.goods-hovers-list {
max-height: 400px;
position: fixed;
top: 0;
left: 0;
z-index: 999;
width: 300px;
background: #fff;
box-shadow: 0 0 50px #eee;
border-radius: 4px;
border: 1px solid #eee;
padding: 5px 20px 10px 20px;
white-space: normal;
text-align: left;
z-index: 999 !important;
transition: 0.5s all;
display: block;
opacity: 1;
&.seat-top {
&::before {
display: none;
// content: '';
// bottom: -15px;
// left: 50%;
}
}
&.hide-goods-hover {
display: none;
opacity: 0;
}
// overflow: auto;
&::before {
content: '';
float: left;
width: 0;
height: 0;
border-width: 8px;
border-style: solid;
border-color: transparent #fff transparent transparent;
-webkit-transform: rotate(90deg);
transform: rotate(90deg);
position: absolute;
top: -15px;
left: 50%;
margin-left: -16px;
}
.title {
height: 30px;
line-height: 30px;
font-size: 12px;
font-weight: 600;
}
.goods-btn {
display: inline-block;
font-size: 12px;
color: #666;
word-break: break-all;
width: 82px;
height: 28px;
line-height: 28px;
border-radius: 4px;
border: 1px solid #eee;
margin-bottom: 6px;
text-align: center;
margin: 0 2px 8px;
cursor: pointer;
&.active {
color: @primary-color;
border: 1px solid @primary-color;
}
.icon {
margin-right: 4px;
color: @primary-color;
}
}
}
@media (min-width: 1192px) and (max-width: 1591px) {
.booking-from-box {
padding-right: 24px;
/deep/ .ant-calendar-picker-icon {
display: none;
}
}
}
.booking-from-box {
/deep/ .ant-calendar-picker-icon {
margin-top: -4px !important;
}
}
/deep/ .ant-form-item-control-wrapper {
overflow: hidden !important;
}
.no-data {
display: block;
color: #aaa;
font-size: 14px;
i {
line-height: 120px;
font-size: 100px;
}
}
/deep/ .padUrl .ant-spin-container {
height: 100%;
}
/deep/ .content-table .vxe-body--column .vxe-cell div {
color: #000;
}
.pono {
text-align: left;
}
/deep/ .vxe-header--row th {
text-align: left !important;
}
/deep/ .vxe-cell--title {
width: 100%;
text-align: left;
}
.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;
}
}
}
}
}
.bcfile-title {
border-bottom: 1px dashed black;
padding-bottom: 5px;
margin-bottom: 10px;
display: flex;
align-items: center;
justify-content: space-between;
}
.bc-box {
max-height: 200px;
overflow-y: auto;
padding-right: 14px;
.bc-item {
margin: 7px 0px;
display: flex;
justify-content: space-between;
}
}
.txfcSpan {
width: 140px;
display: inline-block;
}
.flag-icon {
color: #1d8aff;
cursor: pointer;
font-size: 20px;
}
/deep/ .vxe-table--render-default .vxe-body--row.row--checked {
background: #fff3e0 !important;
}
/deep/ .booking-from-box .ant-form-item-label > label::after {
margin-right: 1px !important;
}
</style>
<style lang="less">
.vxe-table--render-default .vxe-body--row.row--current {
background: #9be945 !important;
}
.vxe-table--render-default {
color: black;
}
.fangdan-modal {
position: fixed;
top: 100px;
left: 36%;
width: 400px;
background-color: #fff;
background-clip: padding-box;
border: 0;
border-radius: 2px;
-webkit-box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
pointer-events: auto;
padding: 20px;
z-index: 999;
}
</style>
<style lang="less" scoped>
:deep(.vxe-toolbar) {
display: none;
}
:deep(.vben-basic-form--compact) {
display: none;
}
//
:deep(.vben-basic-table-header__toolbar) {
display: flex;
.nav-box {
flex: 1;
}
}
</style>
<style lang="less" scoped>
:deep(.ant-input-affix-wrapper) {
padding: 0 0 0 10px;
}
:deep(.ant-input) {
margin: 0;
}
</style>