szh-new
张同海 4 months ago
commit 526ddc045f

@ -166,18 +166,13 @@
go({
path: route.path,
query: {
id,
id
},
})
closePage(route.path + '?id=' + id)
} else {
createMessage.warning('列表页面数据丢失,请回退列表页面后重试!')
}
// if (v == 'next') {
// const index = ids.find(v)
// console.log(index)
// }
// console.log(ids)
}
//
const saveHandle = async () => {

@ -112,9 +112,6 @@
createMessage.success('添加成功!')
}
})
.catch(() => {
createMessage.error('添加失败!')
})
}
return {
t,

@ -5,10 +5,11 @@
-->
<template>
<div class="cost-entry-main-info">
<a-form layout="vertical" class="ds-form-detail">
<a-form>
<a-row :gutter="15">
<a-col v-for="(item, index) in list" :span="item.span" :key='item.value + index'>
<a-form-item
:class="{ noBorder: item.field == 'cbm' || item.field == 'dischargePort' || item.field == 'invoiceNo' || item.field == 'note' }"
:label="item.label"
>
<div>
@ -27,21 +28,21 @@
{ label: '委托编号', field: 'customerNo', span: 4, value: '' },
{ label: '主题单号', field: 'mblno', span: 4, value: '' },
{ label: '箱型箱量', field: 'packingType', span: 4, value: '' },
{ label: '件数', field: 'pkgs', span: 3, value: '' },
{ label: '毛重', field: 'kgs', span: 3, value: '' },
{ label: '尺码', field: 'cbm', span: 3, value: '' },
{ label: '发票号', field: 'invoiceNo', span: 3, value: '' },
{ label: '委托单位', field: 'customerName', span: 4, value: '' },
{ label: '卸货港', field: 'dischargePort', span: 4, value: '' },
{ label: '件数', field: 'pkgs', span: 4, value: '' },
{ label: '毛重', field: 'kgs', span: 4, value: '' },
{ label: '尺码', field: 'cbm', span: 4, value: '' },
{ label: '委托单位', field: 'customerName', span: 8, value: '' },
{ label: '船名', field: 'vessel', span: 4, value: '' },
{ label: '航次', field: 'voyno', span: 3, value: '' },
{ label: '揽货人', field: 'sale', span: 3, value: '' },
{ label: 'ETD', field: 'etd', span: 3, value: '' },
{ label: '付费方式', field: 'mblFrt', span: 3, value: '' },
{ label: '航次', field: 'voyno', span: 4, value: '' },
{ label: '装货港', field: 'loadPort', span: 4, value: '' },
{ label: '卸货港', field: 'dischargePort', span: 4, value: '' },
{ label: '揽货人', field: 'sale', span: 4, value: '' },
{ label: 'ETD', field: 'etd', span: 4, value: '' },
{ label: '付费方式', field: 'mblFrt', span: 4, value: '' },
{ label: '分提单号', field: 'hblno', span: 4, value: '' },
{ label: '目的地', field: 'destination', span: 4, value: '' },
{ label: '装货港', field: 'loadPort', span: 4, value: '' },
{ label: '备注', field: 'note', span: 12, value: '' },
{ label: '发票号', field: 'invoiceNo', span: 4, value: '' },
{ label: '备注', field: 'note', span: 24, value: '' },
])
const props = defineProps({
data: { type: [Object, Array] }
@ -53,6 +54,9 @@
list.value.forEach(item => {
for(let key in val) {
if (item.field === key) {
if (key == 'etd' && val[key]) {
val[key] = val[key].split(' ')[0]
}
item.value = val[key]
}
}
@ -62,11 +66,31 @@
)
</script>
<style>
<style lang="less">
.cost-entry-main-info {
.ant-form-item-label {
label {
font-size: 12px;
}
}
.ant-form-item-control-input-content {
font-size: 12px;
font-weight: 600;
}
.ant-form-item {
margin-bottom: 4px;
}
.ant-form-item-control {
border-right: 1px solid #CED5D9;
}
background-color: #ffffff;
padding: 6px 20px 0 20px;
border: 1px solid #E8EBED;
border-top: none;
.noBorder {
.ant-form-item-control {
border-right: none;
}
}
}
</style>

@ -108,6 +108,6 @@
text-overflow: ellipsis;
overflow: hidden;
display: inline-block;
margin-top: 8px;
margin-top: 11px;
}
</style>

@ -87,7 +87,7 @@
v-model:value="company"
style="width: 100px; height: 16px"
placeholder="请选择"
:disabled="!!route.query.source"
:disabled="source != 'edit'"
optionLabelProp="label"
@change="handleChange"
>
@ -175,6 +175,7 @@
import { useMessage } from '/@/hooks/web/useMessage'
import { useRoute } from 'vue-router'
const route = useRoute()
const source = route.query.source || 'edit'
const { createMessage } = useMessage()
const props = defineProps({
details: {

@ -1,8 +1,13 @@
<!--
* @Desc:
* @Author: lijj
* @Date: 2024-07-27 16:53:34
-->
<template>
<textarea
class="ant-input"
v-model="tvalue"
:disabled="!!route.query.source"
:disabled="source != 'edit'"
:style="`width:100%;display:inline-block;height: ${height}px; line-height: 16px;`"
@input="debounce(textareaChange, 300, $event)"
@blur="textareaBlur"
@ -13,6 +18,7 @@
import { useMessage } from '/@/hooks/web/useMessage'
import { useRoute } from 'vue-router'
const route = useRoute()
const source = route.query.source || 'edit'
const { notification } = useMessage()
let timer
const props = defineProps({

@ -4,7 +4,7 @@
* @Date: 2024-04-29 11:54:04
-->
<template>
<div class="ds-detail-box sea-export-detail" :class="{ 'ds-view-box': route.query.source != 'edit' }">
<div class="ds-detail-box sea-export-detail" :class="{ 'ds-view-box': source != 'edit' }">
<a-tabs
size="small"
:class="!Showtabs ? 'Showtabs' : ''"
@ -67,7 +67,7 @@
</goodsTable>
</div>
<!-- 联系人信息 -->
<ContactList v-if="source == 'edit'" :id="id"></ContactList>
<ContactList v-if="source == 'edit' && id" :id="id"></ContactList>
<!-- 其他信息 -->
<otherInfo
v-if="source == 'edit'"
@ -105,12 +105,12 @@
agreeText="审核通过"
rejectText="驳回任务"
:approve="approveDc"
:source="route.query.source"
:source="source"
:id="id"
businessType="1"
>
<a-button v-repeat v-if="taskType > 201" @click="completeTask" type="primary">
{{ route.query.status == 'WAIT_BC' ? '收到BC' : '完成任务' }}
{{ completeText }}
</a-button>
</ApproveBtns>
</a-spin>
@ -260,6 +260,17 @@
const height = window.innerHeight
return 300
})
//
const completeText = computed((v) => {
const status = route.query.status
if (status == 'WAIT_BC') {
return '收到BC'
} else if (status == 'WAIT_CANGDAN') {
return '提单确认'
} else {
return '完成任务'
}
})
watch(
() => bookingDetails.value,
(val) => {
@ -615,12 +626,6 @@
Object.keys(_data).forEach((item) => {
if (item == 'ediInfo') {
ApiData[item] = {}
console.log(ApiData)
// Object.keys(_data[item])?.forEach((item2) => {
// if (_data[item][item2] !== '' && _data[item][item2] !== null) {
// ApiData[item][item2] = _data[item][item2]
// }
// })
} else if (item == 'ctnInfo') {
let Arr: any = []
ApiData[item] = {}
@ -650,8 +655,8 @@
} else {
createMessage.success('新增成功!')
id.value = res.data
init()
}
init()
}
})
.catch((err) => {

@ -69,7 +69,7 @@
schemas: formSchema1,
showActionButtonGroup: false,
})
const loading = false
const loading = ref(false)
async function handleSave() {
let ApiData: any = {
}
@ -103,8 +103,8 @@
})
</script>
<style lang="less" scoped>
.MainBox {
height: 60vh;
overflow: auto;
}
.MainBox {
height: 60vh;
overflow: auto;
}
</style>

@ -56,11 +56,13 @@
schemas: personFormSchema,
showActionButtonGroup: false,
})
// id
const id = ref()
const [registerModal, { setModalProps, closeModal, updateFormField }] = useModalInner(async (data) => {
resetFields()
setModalProps({ confirmLoading: false, loading: true })
isUpdate.value = !!data?.isUpdate
id.value = data.id
if (unref(isUpdate)) {
setModalProps({ confirmLoading: true });
updateFormField(updateSchema)
@ -98,6 +100,7 @@
async function handleSave(exit) {
try {
const values = await validate()
values['businessId'] = id.value
loading.value = true
setModalProps({ confirmLoading: true, loading: true })
const res: API.DataResult = await EditBusinessOrderContact(values)

@ -1,44 +1,63 @@
<template>
<div class="operation-area">
<a-button v-repeat v-if="urlParams.source == 'edit' || taskType == 202" type="link" @click="openModel('bookingSpace')">
<a-button v-repeat v-if="source == 'edit' || taskType == 202" type="link" @click="openModel('bookingSpace')">
<span class="iconfont icon-gongdanqueren"></span>
订舱
</a-button>
<a-button v-if="urlParams.source == 'edit'" type="link" @click="openModel('cutOff')">
<a-button v-if="source == 'edit' || taskType == 206" type="link" @click="openModel('cutOff')">
<span class="iconfont icon-lanjie"></span>
截单
</a-button>
<a-button v-if="urlParams.source == 'edit'" type="link" @click="openModel('trace')">
<a-popconfirm
title="您当前未选择服务项目,是否继续操作?"
ok-text="是"
cancel-text="否"
@confirm="openModel('vgm')"
>
<a-button v-if="source == 'edit'" type="link">
<span class="iconfont icon-lanjie"></span>
VGM
</a-button>
</a-popconfirm>
<a-button v-if="source == 'edit'" type="link" @click="openModel('trace')">
<span class="iconfont icon-dingwei"></span>
运踪
</a-button>
<a-button v-if="urlParams.source == 'edit'" type="link" @click="openPreOrderFun">
<a-button v-if="source == 'edit'" type="link" @click="openPreOrderFun">
<span class="iconfont icon-chuanfanguanli-chuanfanshenqing"></span>
舱单
</a-button>
<a-button v-if="urlParams.source == 'edit'" type="link" @click="openModel('paper')">
<a-button v-if="source == 'edit'" type="link" @click="openModel('paper')">
<span class="iconfont icon-touzijilu"></span>
下货纸
</a-button>
<Divider v-if="urlParams.source == 'edit'" type="vertical" />
<a-button v-if="urlParams.source == 'edit' || taskType == 204" type="link" @click="FnOpBusinessYard">
<Divider v-if="source == 'edit'" type="vertical" />
<a-button v-if="source == 'edit' || taskType == 204" type="link" @click="FnOpBusinessYard">
<span class="iconfont icon-a-fahuodaifahuo"></span>
场站入货
</a-button>
<a-button v-if="urlParams.source == 'edit'" type="link" @click="FnOpBusinessTruck">
<a-button v-if="source == 'edit'" type="link" @click="FnOpBusinessTruck">
<span class="iconfont icon-yunshu1"></span>
派车信息
</a-button>
<Divider v-if="urlParams.source == 'edit'" type="vertical" />
<a-button v-if="urlParams.source == 'edit'" type="link" v-repeat @click="FnTxxpLink">
<Divider v-if="source == 'edit'" type="vertical" />
<a-button v-if="source == 'edit'" type="link" v-repeat @click="FnTxxpLink">
<span class="iconfont icon-a-xiaopiaofapiao-01"></span>
提箱小票
</a-button>
<a-button v-if="urlParams.source == 'edit'" type="link" v-repeat @click="ShowOCR">
<span class="iconfont icon-OCR"></span>
OCR
</a-button>
<a-button v-if="urlParams.source == 'edit'" type="link" v-repeat @click="handleSubmitTelex">
<a-upload
:file-list="fileList"
accept=".pdf"
:before-upload="beforeUpload"
name="file"
:customRequest="uploadFile"
>
<a-button v-if="source == 'edit'" type="link" v-repeat @click="ShowOCR">
<span class="iconfont icon-OCR"></span>
OCR
</a-button>
</a-upload>
<a-button v-if="source == 'edit'" type="link" v-repeat @click="handleSubmitTelex">
<span class="iconfont icon-lunchuan"></span>
船司电放
</a-button>
@ -803,34 +822,36 @@
@close="OcrOnClose"
class="OCRBox"
>
<a-row justify="end" :style="{ width: '100%', marginTop: '5px' }">
<a-col :span="6" :offset="18">
<span>缩放比例</span>
<a-select size="small" v-model:value="scale" style="width: 120px">
<a-select-option value="1.0">100%</a-select-option>
<a-select-option value="1.2">120%</a-select-option>
<a-select-option value="1.5">150%</a-select-option>
<a-select-option value="2.0">200%</a-select-option>
</a-select>
</a-col>
</a-row>
<a-spin :spinning="uloading">
<a-row justify="end" :style="{ width: '100%', marginTop: '5px' }">
<a-col :span="6" :offset="18">
<span>缩放比例</span>
<a-select size="small" v-model:value="scale" style="width: 120px">
<a-select-option value="1.0">100%</a-select-option>
<a-select-option value="1.2">120%</a-select-option>
<a-select-option value="1.5">150%</a-select-option>
<a-select-option value="2.0">200%</a-select-option>
</a-select>
</a-col>
</a-row>
<canvas
class="CV"
id="myCanvas"
ref="myCanvas"
width="893"
height="1262"
@mousedown="mousedown"
@mouseup="mouseup"
@mousemove="mousemove"
:style="{ backgroundImage: `url(${imgSrc})` }"
></canvas>
<ul class="CvBox" v-if="CvBoxType" :style="{ left: `${Bx}px`, top: `${By}px` }">
<li v-for="item in BCvData" :key="item.name" @click="FnClickCvBox(item)">{{
item.name
}}</li>
</ul>
<canvas
class="CV"
id="myCanvas"
ref="myCanvas"
width="893"
height="1262"
@mousedown="mousedown"
@mouseup="mouseup"
@mousemove="mousemove"
:style="{ backgroundImage: `url(${imgSrc})` }"
></canvas>
<ul class="CvBox" v-if="CvBoxType" :style="{ left: `${Bx}px`, top: `${By}px` }">
<li v-for="item in BCvData" :key="item.name" @click="FnClickCvBox(item)">{{
item.name
}}</li>
</ul>
</a-spin>
</a-drawer>
<!-- 运踪弹窗 -->
<a-modal
@ -910,7 +931,7 @@
import { useRoute, useRouter } from 'vue-router'
const router = useRouter()
const route = useRoute()
const urlParams = route.query
const source = route.query.source || 'edit'
import { useMessage } from '/@/hooks/web/useMessage'
const { notification, createMessage } = useMessage()
import { columns, searchFormSchema } from './operationAreaColumns'
@ -948,7 +969,7 @@
},
//
taskType: {
type: [String || Number]
type: Number
}
})
// =============
@ -1169,7 +1190,7 @@
}
if (['bookingSpace', 'cutOff', 'initCabin', 'ladingBill', 'vgmlink'].includes(type)) {
//
if (type === 'bookingSpace') {
if (type === 'bookingSpace' || type === 'cutOff') {
const id = props.details.forwarderId
// id
GetClientParamListById({ id }).then(res => {
@ -1179,8 +1200,14 @@
})
if (Email.length) {
const ids = []
if (props.details.saleId) ids.push(props.details.saleId)
if (props.details.operatorId) ids.push(props.details.operatorId)
if (type === 'bookingSpace') {
if (props.details.saleId) ids.push(props.details.saleId)
if (props.details.operatorId) ids.push(props.details.operatorId)
}
if (type === 'cutOff') {
if (props.details.saleId) ids.push(props.details.doc)
if (props.details.operatorId) ids.push(props.details.operatorId)
}
//
emailModal.value.init(ids, props.details)
} else {
@ -1249,42 +1276,56 @@
}
EDISloading.value = true
CheckAndInitVOLTAEdi(data).then((res) => {
if (res.code === 200) {
voltaForm.value = res.data.extra
voltaFlag.value = true
if (res.data.msg) {
notification.warning({ message: res.data.msg, duration: 3 })
}
if (!voltaForm.value.notifySecondAddr) {
voltaForm.value.notifySecondAddr = ''
}
if (!voltaForm.value.notifySecondName) {
voltaForm.value.notifySecondName = ''
}
voltaData.value = res.data.extra.contaList
EDISloading.value = false
if (modelType.value === 'bookingSpace') {
//
if (type == 'save') {
// EDI
EDISloading.value = true
downloadBookingOrEDI(type)
} else {
// this.$message.error(res.message)
if (modelType.value === 'bookingSpace') {
bookingModelFrom.sendType = 'B'
} else if (modelType.value === 'cutOff') {
bookingModelFrom.sendType = 'E'
}
bookingModelFrom.send = type === 'send'
bookingModelFrom.orderNo = props.details.mblno
bookingModelFrom.id = props.id
if (type == 'save') {
// EDI
EDISloading.value = true
downloadBookingOrEDI(type)
// EDI
EDIUloading.value = true
sendBookingOrEDI(type)
}
} else {
//
CheckAndInitVOLTAEdi(data).then((res) => {
if (res.code === 200) {
voltaForm.value = res.data.extra
voltaFlag.value = true
if (res.data.msg) {
notification.warning({ message: res.data.msg, duration: 3 })
}
if (!voltaForm.value.notifySecondAddr) {
voltaForm.value.notifySecondAddr = ''
}
if (!voltaForm.value.notifySecondName) {
voltaForm.value.notifySecondName = ''
}
voltaData.value = res.data.extra.contaList
EDISloading.value = false
} else {
// EDI
EDIUloading.value = true
sendBookingOrEDI(type)
// this.$message.error(res.message)
if (modelType.value === 'bookingSpace') {
bookingModelFrom.sendType = 'B'
} else if (modelType.value === 'cutOff') {
bookingModelFrom.sendType = 'E'
}
bookingModelFrom.send = type === 'send'
bookingModelFrom.orderNo = props.details.mblno
bookingModelFrom.id = props.id
if (type == 'save') {
// EDI
EDISloading.value = true
downloadBookingOrEDI(type)
} else {
// EDI
EDIUloading.value = true
sendBookingOrEDI(type)
}
}
}
})
})
}
}
function sendBookingOrEDI(type) {
SendBookingOrClosingEDI(bookingModelFrom)
@ -1581,6 +1622,34 @@
{ name: '卸货港', code: 'dischargePort' },
{ name: '通知人', code: 'notifyPartyContent' },
])
// function uploadFile(file) {
// const formData = new FormData()
// formData.append('file', file.file)
// // formData.append('bookingId', id.value)
// const type = file.file.type
// let id = id.value
// if (route.query.isCopy) {
// id = 0
// }
// if (!id.value) {
// id = 0
// }
// BookingOrderOcrUpFile({ data: formData, parameter: { bookingId: id } }).then((res) => {
// if (res.success) {
// fileName.value = res.data.ocrFileName
// if (id == 0) {
// emit('ocrUpflie', res.data.uploadFileName)
// }
// BookingOrderOcrGetImg({ fileName: fileName.value, scale: scale.value }).then((res) => {
// imgSrc.value = window.URL.createObjectURL(
// new Blob([res], { type: `${type};chartset=UTF-8` }),
// )
// })
// } else {
// notification.error({ message: res.message, duration: 3 })
// }
// })
// }
function FnClickCvBox(data) {
let details = { ...props.details }
const Arr = ['pkgs', 'cbm', 'kgs', 'portdischarge', 'destination', 'kindpkgs']
@ -1621,6 +1690,7 @@
}).then((res) => {
Rdata.value = res.data
Bx.value = x.value + width.value
console.log(Bx)
By.value = y.value + height.value
CvBoxType.value = true
})
@ -1688,26 +1758,25 @@
formData.append('file', file.file)
const type = file.file.type
uloading.value = true
UploadOcrFile({
data: formData,
// parameter: { LinkId: Did, TypeCode: 'other', TypeName: '' },
}).then((res) => {
uloading.value = false
if (res.succeeded) {
fileName.value = res.data
// if (Did == 0) {
// emit('ocrUpflie', res.data.uploadFileName)
// }
GetOcrImg({ fileName: fileName.value, scale: scale.value }).then((res) => {
imgSrc.value = window.URL.createObjectURL(
new Blob([res], { type: `${type};chartset=UTF-8` }),
)
})
} else {
notification.error({ message: res.message, duration: 3 })
}
}).catch(() => {
uloading.value = false
})
}
const uloading = ref(false)
function ShowOCR() {
if (OcrVisible.value) {
OcrOnClose()
@ -1860,5 +1929,31 @@
<style lang="less" scoped>
.operation-area {
margin: 8px -10px;
span {
display: inline-block;
}
}
.OCRBox {
.ant-drawer-body {
position: relative;
padding: 0 !important;
}
.CvBox {
position: absolute;
width: 100px;
border: 1px solid #f0f0f0;
box-shadow: 0 1px 2px -2px #00000029, 0 3px 6px #0000001f, 0 5px 12px 4px #00000017;
padding: 0;
background: #ffffff;
li {
width: 100%;
text-align: center;
list-style-type: none;
padding: 3px 0;
&:hover {
background: #f0f0f0;
}
}
}
}
</style>

@ -544,13 +544,13 @@
<style lang="less">
.ds-sea-export-table {
height: 100%;
.vben-basic-table-header__toolbar {
justify-content: space-between;
}
.static-box {
position: fixed;
bottom: 0;
height: 66.5px;
}
.icon-fuzhi3 {
color: #257afa;

@ -77,11 +77,11 @@
</template>
</BasicForm>
</a-tab-pane>
<!-- <a-tab-pane key="1" tab="个人开户信息">
<a-tab-pane key="1" tab="个人开户信息">
<BankInfo
:id="id"
></BankInfo>
</a-tab-pane> -->
</a-tab-pane>
</a-tabs>
<!--右下角按钮-->
<template #footer>
@ -123,6 +123,7 @@
// id
const id = ref('')
const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
activeKey.value = '0'
resetFields()
setModalProps({ confirmLoading: false, loading: true })
isUpdate.value = !!data?.isUpdate

@ -54,6 +54,7 @@
const [registerModal, { openModal }] = useModal()
const [registerTable, { reload, getForm, getSelectRows }] = useTable({
title: '',
maxHeight: 460,
rowSelection: { type: 'checkbox' },
clickToRowSelect: false,
api: async (p) => {
@ -63,6 +64,7 @@
})
},
beforeFetch: (p) => {
p['']
return formatParams(p)
},
columns: Tablecolumns,
@ -74,7 +76,7 @@
bordered: true,
showIndexColumn: true,
canResize: true,
immediate: true,
immediate: false,
actionColumn: {
width: 80,
title: '操作',

@ -740,10 +740,11 @@ function handleEdit(data) {
case 'WAIT_BOOKING':
case 'WAIT_BC':
case 'WAIT_SPACE_RELEASE':
case 'WAIT_CANGDAN':
//
go({
path: '/taskmanage/booking-approval',
query: { id: data.ouT_BS_NO, source: data.status, taskId: data.id, status: data.tasK_TYPE }
query: { id: data.ouT_BS_NO, source: data.tasK_USER_STATUS, taskId: data.id, status: data.tasK_TYPE }
});
break;
default:

Loading…
Cancel
Save