海运出口详情ui

szh-new
lijingjia 3 months ago
commit 769dc6f656

@ -9,11 +9,27 @@
<MainInfo :data="details"></MainInfo>
<!-- 应收表格 -->
<div class="fee-card-box mt15">
<FeeTable tbType="receive" :height="height" :type="type" :broData="broPayData" :id="data.id" :details="details" @broInsert="broReceive"></FeeTable>
<FeeTable
tbType="receive"
:height="height"
:type="type"
:broData="broPayData"
:id="data.id"
:details="details"
@broInsert="broReceive"
></FeeTable>
</div>
<!-- 应付表格 -->
<div class="fee-card-box mt15">
<FeeTable tbType="pay" :height="height" :broData="broReceiveData" :type="type" :id="data.id" :details="details" @broInsert="broPay"></FeeTable>
<FeeTable
tbType="pay"
:height="height"
:broData="broReceiveData"
:type="type"
:id="data.id"
:details="details"
@broInsert="broPay"
></FeeTable>
</div>
<FeeStatistic :id="data.id" />
</div>
@ -33,8 +49,8 @@
//
height: {
type: [String, Number],
default: '300'
}
default: '300',
},
})
const data = ref(null)
// data.value = props.details
@ -56,13 +72,13 @@
console.log(val)
data.value = val
},
{ immediate: true, deep: true }
{ immediate: true, deep: true },
)
</script>
<style scoped>
.fee-card-box {
border: 1px solid #E8EBED;
border: 1px solid #e8ebed;
padding: 0 20px 20px;
}
</style>
</style>

@ -26,8 +26,8 @@ export const columns: BasicColumn[] = [
width: 200,
},
{
title: '备注',
dataIndex: '',
title: '备注',
dataIndex: 'remark',
sorter: true,
width: 200,
},
@ -38,8 +38,8 @@ export const columns: BasicColumn[] = [
width: 200,
},
{
title: '购入价格',
dataIndex: '',
title: '购入价格',
dataIndex: 'ctnValue_BuyingPrice',
sorter: true,
width: 200,
},
@ -138,14 +138,14 @@ export const formSchema: FormSchema[] = [
colProps: { span: 20 },
},
{
field: 'ctnValue_Base',
label: '购入价格',
field: 'ctnValue_BuyingPrice',
label: '购入价格',
component: 'InputNumber',
colProps: { span: 20 },
},
{
field: 'note',
label: '备注',
field: 'remark',
label: '备注',
component: 'InputTextArea',
colProps: { span: 20 },
componentProps: {

@ -47,9 +47,9 @@
import { useMessage } from '/@/hooks/web/useMessage'
// Emits
const emit = defineEmits(['success', 'register'])
const isUpdate = ref(true)
const select = ref([])
const loading = ref(false)
const rowId = ref('')
const rowId = ref()
const { createMessage } = useMessage()
const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({
labelWidth: 100,
@ -60,21 +60,14 @@
const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
resetFields()
setModalProps({ confirmLoading: false, loading: true })
isUpdate.value = !!data?.isUpdate
if (unref(isUpdate)) {
// setModalProps({ confirmLoading: true });
rowId.value = data.record.id
const res: API.DataResult = await ApiInfo({ id: unref(rowId) })
if (res.succeeded) {
setFieldsValue({
...res.data,
})
// console.log('Form', getFieldsValue());
// setFieldsValue({ trainId: unref(res.data.trainId) });
}
// setModalProps({ confirmLoading: false });
} else {
setFieldsValue({ permissionIdentity: unref(2) })
select.value = data.select
if (select.value.length) {
console.log(select.value)
let cntrno = ''
select.value.forEach((item: any) => {
cntrno = cntrno ? `${cntrno},${item.cntrno}` : item.cntrno
})
setFieldsValue({ cntrno })
}
setModalProps({ loading: false })
})
@ -83,23 +76,16 @@
try {
const values = await validate()
setModalProps({ confirmLoading: true, loading: true })
// TODO custom api
console.log(values)
// loading.value = true;
const res: API.DataResult = await ApiMultiEdit(values)
console.log(res)
if (res.succeeded) {
createMessage.success(res.message)
emit('success')
//
if (!exit) {
if (unref(isUpdate)) {
await refresh()
} else {
rowId.value = res.data
isUpdate.value = true
await refresh()
}
rowId.value = res.data
select.value = []
await refresh()
}
} else {
createMessage.error(res.message)

@ -504,7 +504,7 @@ export const formSchema: FormSchema[] = [
component: 'ApiSelect',
colProps: { span: 6 },
defaultValue: '',
componentProps: ({ formModel }) => {
componentProps: () => {
return {
api: () => {
return new Promise((resolve) => {
@ -519,17 +519,57 @@ export const formSchema: FormSchema[] = [
filterOption: (input: string, option: any) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
},
onChange: (v, obj) => {},
}
},
},
{
field: 'ctnBreakState',
field: 'ctnBreakStateId',
label: '箱损坏',
component: 'Input',
component: 'ApiSelect',
colProps: { span: 6 },
defaultValue: '',
componentProps: () => {
return {
api: () => {
return new Promise((resolve) => {
getDictOption('CM_BreakState').then((res) => {
resolve(res)
})
})
},
labelField: 'label',
valueField: 'value',
resultField: 'data',
filterOption: (input: string, option: any) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
},
}
},
},
{
field: 'ctnFlowStateId',
label: '状态变动',
component: 'ApiSelect',
colProps: { span: 6 },
defaultValue: '',
componentProps: () => {
return {
api: () => {
return new Promise((resolve) => {
getDictOption('CM_CtnFlowState').then((res) => {
resolve(res)
})
})
},
labelField: 'label',
valueField: 'value',
resultField: 'data',
filterOption: (input: string, option: any) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
},
}
},
},
{
field: 'isHeavy',
label: '空重箱',
@ -548,6 +588,13 @@ export const formSchema: FormSchema[] = [
defaultValue: '',
show: false,
},
{
label: '',
field: 'portCode',
component: 'Input',
defaultValue: '',
show: false,
},
{
field: 'portid',
label: '当前港口',
@ -565,6 +612,7 @@ export const formSchema: FormSchema[] = [
},
onChange: (v, obj) => {
formModel.port = obj?.label || ''
formModel.portCode = obj?.ediCode || ''
},
}
},
@ -704,8 +752,8 @@ export const InfoColumns: BasicColumn[] = [
width: 150,
},
{
title: '状态变动',
dataIndex: 'usedState',
title: '状态变动',
dataIndex: 'ctnFlowState',
sorter: true,
width: 150,
},

@ -40,7 +40,7 @@
const [registerModal, { openModal }] = useModal()
const [registerInfoModal, { openModal: openInfoModal }] = useModal()
const [registerTable, { reload, getForm }] = useTable({
const [registerTable, { reload, getForm, getSelectRows }] = useTable({
title: '集装箱信息列表',
api: async (p) => {
const res: API.DataResult = await ApiList(p)
@ -105,9 +105,11 @@
},
})
function handleCreate() {
const select = getSelectRows()
openModal(true, {
isParent: false,
isUpdate: false,
select,
})
}
function handleAudit(record: Recordable) {

@ -5,8 +5,8 @@
title="箱状态详情"
width="55%"
@register="registerModal"
@ok="handleSave"
>
<!-- @ok="handleSave" -->
<BasicTable @register="registerTable"> </BasicTable>
</BasicModal>
</template>
@ -16,11 +16,12 @@
import { ApiChangeList } from '../StateChange/api'
import { BasicModal, useModalInner } from '/@/components/Modal'
import { InfoColumns } from './columns'
import { formatParams } from '/@/hooks/web/common'
const cntrno = ref('')
const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
setModalProps({ confirmLoading: false, loading: true })
reload()
cntrno.value = data.cntrno
reload()
setModalProps({ loading: false })
})
@ -33,20 +34,9 @@
resolve({ data: [...res.data], total: res.count })
})
},
beforeFetch: () => {
var currentPageInfo: any = getPaginationRef()
var data = getForm().getFieldsValue()
const postParam: API.PageRequest = {
queryCondition: '',
pageCondition: {
pageIndex: currentPageInfo.current,
pageSize: currentPageInfo.pageSize,
sortConditions: [],
},
}
let condition: API.ConditionItem[] = []
postParam.queryCondition = JSON.stringify(condition)
return postParam
beforeFetch: (p) => {
p['cntrno'] = cntrno.value
return formatParams(p)
},
columns: InfoColumns,
pagination: true,

@ -51,8 +51,32 @@
</div>
</div>
</a-tab-pane>
<a-tab-pane key="2" tab="电子文档" disabled></a-tab-pane>
<a-tab-pane key="3" tab="费用" disabled></a-tab-pane>
<a-tab-pane key="2" tab="电子文档" :disabled="!rowId">
<DsFile ref="dsFile" fileType="infoclient" :id="rowId" />
</a-tab-pane>
<a-tab-pane key="3" tab="费用" :disabled="!rowId">
<div class="fee-card-box mt15">
<FeeTable
tbType="receive"
:height="height"
type="1"
:broData="broPayData"
:id="rowId"
@broInsert="broReceive"
></FeeTable>
</div>
<!-- 应付表格 -->
<div class="fee-card-box mt15">
<FeeTable
tbType="pay"
:height="height"
type="1"
:broData="broReceiveData"
:id="rowId"
@broInsert="broPay"
></FeeTable>
</div>
</a-tab-pane>
</a-tabs>
<!--右下角按钮-->
<template #footer>
@ -92,17 +116,23 @@
registerAllModules()
import 'handsontable/dist/handsontable.full.css'
import { formSchema } from './columns'
import { GetCtnSelectList } from '/@/views/operation/seaexport/api/BookingLedger'
import {
GetCtnSelectList,
GetClientPortSelectList,
} from '/@/views/operation/seaexport/api/BookingLedger'
import { ApiEdit, ApiInfo, ApiListDetail, ApiDelDetail } from './api'
import { GetClientListByCode } from '/@/api/common'
import { useMessage } from '/@/hooks/web/useMessage'
const { notification } = useMessage()
import DsFile from '/@/components/File/index.vue'
//
import FeeTable from '/@/components/CostEntry/feeTable.vue'
// Emits
const emit = defineEmits(['success', 'register'])
const isUpdate = ref(true)
const loading = ref(false)
const rowId = ref('')
const height = ref(300)
const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({
labelWidth: 100,
schemas: formSchema,
@ -113,6 +143,7 @@
resetFields()
setModalProps({ confirmLoading: false, loading: true })
isUpdate.value = !!data?.isUpdate
activeKey.value = '1'
if (unref(isUpdate)) {
// setModalProps({ confirmLoading: true });
rowId.value = data.record.id
@ -123,12 +154,9 @@
setFieldsValue({
...res.data,
})
// console.log('Form', getFieldsValue());
// setFieldsValue({ trainId: unref(res.data.trainId) });
}
// setModalProps({ confirmLoading: false });
} else {
setFieldsValue({ permissionIdentity: unref(2) })
rowId.value = ''
}
setModalProps({ loading: false })
})
@ -139,6 +167,7 @@
setModalProps({ confirmLoading: true, loading: true })
// TODO custom api
console.log(values)
values.bodyList = list.value
// loading.value = true;
const res: API.DataResult = await ApiEdit(values)
console.log(res)
@ -185,6 +214,8 @@
const ctnDict = ref([])
//
const ContainerOwnerDict = ref([])
//
const PortDict = ref([])
watchEffect(() => {
//
if (allCheck.value) {
@ -257,11 +288,33 @@
width: 120,
data: 'oldContainerOwnerId',
},
{
title: '提箱港口ID',
width: 120,
data: 'pickupPortid',
},
{
title: '提箱港口五字码',
width: 120,
data: 'pickupPortCode',
},
{
title: '还箱港口ID',
width: 120,
data: 'dropoffPortid',
},
{
title: '还箱港口五字码',
width: 120,
data: 'dropoffPortCode',
},
// -----------------
{
title: '租箱业务号',
width: 200,
data: 'billno',
readOnly: true,
},
{
title: '箱号',
@ -284,23 +337,23 @@
process(dict)
},
},
{
title: '原箱主',
width: 120,
data: 'oldContainerOwner',
type: 'dropdown',
// (process)
source: async (query, process) => {
const res = ContainerOwnerDict.value.length
? ContainerOwnerDict.value
: (await GetClientListByCode({ code: 'leasing' }))?.data
if (!ContainerOwnerDict.value.length) ContainerOwnerDict.value = res
const dict = res.map((res) => {
return res.pinYinCode
})
process(dict)
},
},
// {
// title: '',
// width: 120,
// data: 'oldContainerOwner',
// type: 'dropdown',
// // (process)
// source: async (query, process) => {
// const res = ContainerOwnerDict.value.length
// ? ContainerOwnerDict.value
// : (await GetClientListByCode({ code: 'leasing' }))?.data
// if (!ContainerOwnerDict.value.length) ContainerOwnerDict.value = res
// const dict = res.map((res) => {
// return res.pinYinCode
// })
// process(dict)
// },
// },
{
title: '租箱业务',
width: 120,
@ -375,25 +428,36 @@
type: 'date',
dateFormat: 'YYYY-MM-DD',
},
{
title: '提箱港口名称',
width: 120,
data: 'pickupPort',
},
{
title: '提箱港口',
width: 120,
data: 'pickupPortid',
},
{
title: '还箱港口名称',
width: 120,
data: 'dropoffPort',
data: 'pickupPort',
type: 'dropdown',
// (process)
source: async (query, process) => {
const res = PortDict.value.length ? PortDict.value : (await GetClientPortSelectList())?.data
if (!PortDict.value.length) PortDict.value = res
const dict = res.map((res) => {
return res.portName
})
process(dict)
},
},
{
title: '还箱港口',
width: 120,
data: 'dropoffPortid',
data: 'dropoffPort',
type: 'dropdown',
// (process)
source: async (query, process) => {
const res = PortDict.value.length ? PortDict.value : (await GetClientPortSelectList())?.data
if (!PortDict.value.length) PortDict.value = res
const dict = res.map((res) => {
return res.portName
})
process(dict)
},
},
{
title: '业务编号/提单号',
@ -415,7 +479,7 @@
fixedColumnsLeft: 1,
//
hiddenColumns: {
columns: [1, 2, 3, 4],
columns: [1, 2, 3, 4, 5, 6, 7, 8],
indicators: true,
},
//
@ -447,7 +511,7 @@
if (changes[0][1] === 'oldContainerOwner') {
const res = ContainerOwnerDict.value.length
? ContainerOwnerDict.value
: (await GetCtnSelectList())?.data
: (await GetClientListByCode({ code: 'leasing' }))?.data
if (!ContainerOwnerDict.value.length) ContainerOwnerDict.value = res
const item = res.filter((item) => {
return item.pinYinCode === changes[0][3]
@ -456,6 +520,28 @@
list.value[changes[0][0]]['oldContainerOwner'] = dict?.pinYinCode
list.value[changes[0][0]]['oldContainerOwnerId'] = dict?.id
}
if (changes[0][1] === 'pickupPort' || changes[0][1] === 'dropoffPort') {
const res = PortDict.value.length
? PortDict.value
: (await GetClientPortSelectList())?.data
if (!PortDict.value.length) PortDict.value = res
const item = res.filter((item) => {
return item.portName === changes[0][3]
})
if (item) dict = item[0]
console.log(dict)
if (changes[0][1] === 'pickupPort') {
list.value[changes[0][0]]['pickupPort'] = dict?.portName
list.value[changes[0][0]]['pickupPortid'] = dict?.id
list.value[changes[0][0]]['pickupPortCode'] = dict?.ediCode
}
if (changes[0][1] === 'dropoffPort') {
list.value[changes[0][0]]['dropoffPort'] = dict?.portName
list.value[changes[0][0]]['dropoffPortid'] = dict?.id
list.value[changes[0][0]]['dropoffPortCode'] = dict?.ediCode
}
}
}
},
}
@ -482,6 +568,19 @@
})
}
}
//--------------------------------------- tab3 ---------------------------------------
//
const broReceiveData = ref([])
//
const broPayData = ref([])
//
const broReceive = (v) => {
broReceiveData.value = v
}
//
const broPay = (v) => {
broPayData.value = v
}
</script>
<style lang="less" scoped>
.ds-goods-tb-check {

@ -10,6 +10,32 @@ enum Api {
listDetail = '/containerManagementApi/CM_RentIn_Detail/GetCM_RentIn_DetailList',
editDetail = '/containerManagementApi/CM_RentIn_Detail/EditCM_RentIn_Detail',
delDetail = '/containerManagementApi/CM_RentIn_Detail/DeleteCM_RentIn_Detail',
Confirm = '/containerManagementApi/CM_RentIn/CM_RentIn_Confirm',
Cancel = '/containerManagementApi/CM_RentIn/CM_RentIn_Cancel',
}
// 租箱租入_确认 (Auth)
export function ApiConfirm(data: PageRequest) {
return request<DataResult>({
url: Api.Confirm,
method: 'post',
headers:{
'Content-Type':'application/json-patch+json'
},
data,
})
}
// 租箱租入_取消 (Auth)
export function ApiCancel(data: PageRequest) {
return request<DataResult>({
url: Api.Cancel,
method: 'post',
headers:{
'Content-Type':'application/json-patch+json'
},
data,
})
}
// 列表 (Auth)
export function ApiList(data: PageRequest) {

@ -1,7 +1,7 @@
import { ref } from 'vue'
import { BasicColumn, FormSchema } from '/@/components/Table'
import { Tag } from 'ant-design-vue'
import { GetCtnSelectList } from '/@/api/common'
import { GetCtnSelectList, GetClientListByCode } from '/@/api/common'
import { GetDeptList } from '/@/views/operation/seaexport/api/BookingLedger'
import { useOptionsStore } from '/@/store/modules/options'
const optionsStore = useOptionsStore()
@ -24,75 +24,84 @@ const usedStateList = [
]
export const columns: BasicColumn[] = [
{
title: '箱业务号',
dataIndex: 'cntrno',
title: '箱业务号',
dataIndex: 'billno',
sorter: true,
width: 150,
},
{
title: '租箱/退租',
dataIndex: 'rentDirect',
title: '业务类型',
dataIndex: 'businessType',
sorter: true,
width: 150,
},
{
title: '租箱类型',
dataIndex: 'isOnline',
title: '租箱业务',
dataIndex: 'rentDirect',
sorter: true,
width: 200,
width: 150,
},
{
title: '业务状态',
dataIndex: 'usedState',
title: '租箱类型',
dataIndex: 'rentType',
sorter: true,
width: 200,
width: 150,
},
{
title: '所属分部',
dataIndex: 'ctnOwner',
title: '业务状态',
dataIndex: 'billState',
sorter: true,
width: 200,
},
{
title: '原箱主',
dataIndex: 'ctnSource',
dataIndex: 'oldContainerOwner',
sorter: true,
width: 200,
},
{
title: '业务日期',
dataIndex: 'ctnBizState',
dataIndex: 'bsdate',
sorter: true,
width: 200,
},
{
title: '会计期间',
dataIndex: 'billno',
dataIndex: 'accdate',
sorter: true,
width: 200,
},
{
title: '业务锁定',
dataIndex: 'ctnState',
dataIndex: 'isBusinessLocking',
sorter: true,
width: 200,
customRender: ({ text }) => {
if (text) {
return <Tag color="success"></Tag>
} else {
return <Tag color="error"></Tag>
}
return text
},
},
{
title: '费用锁定',
dataIndex: 'ctnBreakState',
sorter: true,
width: 200,
},
{
title: '费用状态',
dataIndex: 'depot',
dataIndex: 'isFeeLocking',
sorter: true,
width: 200,
customRender: ({ text }) => {
if (text) {
return <Tag color="success"></Tag>
} else {
return <Tag color="error"></Tag>
}
return text
},
},
{
title: '备注',
dataIndex: 'vehicleName',
dataIndex: 'remark',
sorter: true,
width: 200,
},
@ -111,9 +120,10 @@ export const searchFormSchema: FormSchema[] = [
component: 'Input',
colProps: { span: 4 },
},
{
field: 'rentDirect',
label: '租箱/退租',
label: '租箱业务',
component: 'ApiSelect',
colProps: { span: 4 },
defaultValue: '',
@ -168,14 +178,15 @@ export const formSchema: FormSchema[] = [
show: false,
},
{
field: 'custno',
label: '租箱业务',
field: 'rentDirect',
label: '租箱业务',
component: 'Input',
colProps: { span: 6 },
show: false,
},
{
field: 'rentDirect',
label: '租箱/退租',
field: 'rentDirectId',
label: '租箱业务',
component: 'ApiSelect',
colProps: { span: 6 },
defaultValue: '',
@ -184,6 +195,9 @@ export const formSchema: FormSchema[] = [
api: () => {
return new Promise((resolve) => {
getDictOption('CM_RentDirect').then((res) => {
res.forEach((item) => {
item.value = parseInt(item.value)
})
resolve(res)
})
})
@ -194,28 +208,66 @@ export const formSchema: FormSchema[] = [
filterOption: (input: string, option: any) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
},
onChange: (v, obj) => {},
onChange: (e, obj) => {
if (e && obj) {
formModel.rentDirect = obj.label
} else {
formModel.rentDirect = ''
}
},
}
},
},
{
field: 'rentType',
label: '短租/长租',
label: '租箱类型',
component: 'Input',
colProps: { span: 6 },
},
{
label: '原箱主名称',
field: 'oldContainerOwner',
field: 'billState',
label: '业务状态',
component: 'Input',
defaultValue: '',
show: false,
colProps: { span: 6 },
},
{
field: 'oldContainerOwnerId',
label: '原箱主',
component: 'Input',
colProps: { span: 6 },
show: false,
},
{
field: 'oldContainerOwner',
label: '原箱主',
component: 'ApiSelect',
required: false,
dynamicDisabled: false,
colProps: { span: 6 },
componentProps: ({ formModel }) => {
return {
allowClear: true,
showSearch: true,
api: GetClientListByCode,
params: { code: 'leasing' },
labelField: 'pinYinCode',
showName: 'shortName',
valueField: 'shortName',
resultField: 'data',
immediate: false,
filterOption: (input: string, option: any) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
},
onChange: (e, obj) => {
if (e && obj) {
formModel.oldContainerOwnerId = obj.id
}
if (!e && !obj) {
formModel.oldContainerOwnerId = ''
}
},
}
},
},
{
field: 'bsdate',
@ -225,31 +277,44 @@ export const formSchema: FormSchema[] = [
defaultValue: '',
componentProps: {
showTime: true,
allowClear: true,
style: 'width:100%',
},
},
{
field: 'accdate',
label: '会计期间',
component: 'DatePicker',
component: 'MonthPicker',
colProps: { span: 6 },
defaultValue: '',
componentProps: {
showTime: true,
style: 'width:100%',
allowClear: true,
valueFormat: 'YYYY-MM',
format: 'YYYY-MM',
},
},
{
field: 'isBusinessLocking',
label: '业务锁定',
component: 'Input',
component: 'Switch',
defaultValue: false,
colProps: { span: 6 },
componentProps: {
checkedChildren: '是',
unCheckedChildren: '否',
},
},
{
field: 'isFeeLocking',
label: '费用锁定',
component: 'Input',
component: 'Switch',
defaultValue: false,
colProps: { span: 6 },
componentProps: {
checkedChildren: '是',
unCheckedChildren: '否',
},
},
{
field: 'remark',

@ -1,6 +1,6 @@
<template>
<div>
<BasicTable class="ds-table" @register="registerTable">
<BasicTable class="ds-table" @register="registerTable" @row-dbClick="handleAudit">
<template #tableTitle>
<a-button type="link" @click="handleCreate">
<span class="iconfont icon-tianjia"></span>
@ -12,28 +12,42 @@
cancel-text="否"
@confirm="handleDel"
>
<a-button type="link" disabled>
<a-button type="link">
<span class="iconfont icon-shanchu21"></span>
删除
</a-button>
</a-popconfirm>
<a-button type="link" @click="handleCreate" disabled>
<span class="iconfont icon-tianjia"></span>
<a-button type="link" @click="Confirm" disabled>
<span class="iconfont icon-yiwancheng2"></span>
确认执行
</a-button>
<a-button type="link" @click="handleCreate" disabled>
<span class="iconfont icon-tianjia"></span>
<a-button type="link" @click="Cancel" disabled>
<span class="iconfont icon-weiwancheng"></span>
取消确认
</a-button>
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
:actions="[
{
icon: 'clarity:note-edit-line',
tooltip: '编辑',
onClick: handleAudit.bind(null, record),
},
]"
/>
</template>
</template>
</BasicTable>
<TenantAuditStepModal @register="registerModal" @success="handleSuccess" />
</div>
</template>
<script lang="ts" setup>
import { ref } from 'vue'
import { BasicTable, useTable } from '/@/components/Table'
import { ApiList, ApiDel } from './api'
import { BasicTable, useTable, TableAction } from '/@/components/Table'
import { ApiList, ApiDel, ApiConfirm, ApiCancel } from './api'
import { useModal } from '/@/components/Modal'
import TenantAuditStepModal from './TenantAuditStepModal.vue'
import { columns, searchFormSchema } from './columns'
@ -84,6 +98,29 @@
isUpdate: false,
})
}
function Confirm() {
const select = getSelectRows()
if (select.length !== 1) {
notification.warning({ message: '请选择一条数据', duration: 3 })
} else {
ApiConfirm(select[0].id).then((res) => {
notification.success({ message: res.message, duration: 3 })
reload()
})
}
}
function Cancel() {
const select = getSelectRows()
if (select.length !== 1) {
notification.warning({ message: '请选择一条数据', duration: 3 })
} else {
ApiCancel(select[0].id).then((res) => {
notification.success({ message: res.message, duration: 3 })
reload()
})
}
}
function handleDel() {
const select = getSelectRows()
let ApiData: any = {
@ -107,4 +144,10 @@
function handleSuccess() {
reload()
}
function handleAudit(record) {
openModal(true, {
record,
isUpdate: true,
})
}
</script>

@ -43,7 +43,7 @@ export const columns: BasicColumn[] = [
},
{
title: '状态变动',
dataIndex: 'ctnState',
dataIndex: 'ctnFlowState',
sorter: true,
width: 200,
},

@ -7,13 +7,31 @@ enum Api {
multiEdit = '/containerManagementApi/CM_State_Change/CM_State_Change_Multi',
Changeinfo = '/containerManagementApi/CM_State_Change/GetCM_State_Change',
Changedel = '/containerManagementApi/CM_State_Change/DeleteCM_State_Change',
OnLine='/containerManagementApi/CM_State_Change/CM_State_Change_Multi_OnLine',
OffLine='/containerManagementApi/CM_State_Change/CM_State_Change_Multi_OffLine',
info = '/containerManagementApi/CM_CurrentState/GetCM_CurrentStateInfo',
del = '/mainApi/CodeCtn/BatchDelCodeCtn',
BasicsList = '/mainApi/CodeCtn/GetBasicsCodeCtnList',
ExistList = '/mainApi/CodeCtn/GetExistCodeCtnList',
Import = '/mainApi/CodeCtn/ImportCodeCtn',
}
// 批量上线 (Auth)
export function ApiOnLine(data: PageRequest) {
return request<DataResult>({
url: Api.OnLine,
method: 'post',
data,
})
}
// 批量下线 (Auth)
export function ApiOffLine(data: PageRequest) {
return request<DataResult>({
url: Api.OffLine,
method: 'post',
data,
})
}
// 列表 (Auth)
export function ApiChangeList(data: PageRequest) {
return request<DataResult>({

@ -17,7 +17,7 @@
<script lang="ts" setup>
import { ref } from 'vue'
import { BasicTable, useTable } from '/@/components/Table'
import { ApiChangeList, ApiChangeDel } from './api'
import { ApiChangeList, ApiChangeDel, ApiOnLine, ApiOffLine } from './api'
import { columns, searchFormSchema } from './columns'
import { useMessage } from '/@/hooks/web/useMessage'
const { notification } = useMessage()
@ -68,7 +68,7 @@
})
}
ApiChangeDel(ApiData).then((res) => {
ApiOnLine(ApiData).then((res) => {
console.log(res)
notification.success({ message: res.message, duration: 3 })
reload()
@ -88,7 +88,7 @@
})
}
ApiChangeDel(ApiData).then((res) => {
ApiOffLine(ApiData).then((res) => {
console.log(res)
notification.success({ message: res.message, duration: 3 })
reload()

@ -269,11 +269,11 @@
Rdata.formProperties = []
}
if (Rdata.child) {
Rdata.child = Flat(Rdata.child)
Rdata.child = Flat(Rdata.child).type ? Flat(Rdata.child) : null
}
if (Rdata.type == 'exclusive') {
Rdata.children.forEach((item) => {
item.child = Flat(item.child)
item.child = Flat(item.child).type ? Flat(item.child) : null
})
}
return Rdata

@ -14,14 +14,16 @@
</BasicForm>
</div>
<div class="ctn-box">
<div style="margin-bottom: 10px;">服务项目</div>
<div class="project-list">
<div @click="handleClickPro(index)" :class="{ active: item.active }" class="project-item"
v-for="(item, index) in projectList" :key="index">{{
item.name }}</div>
</div>
<a-spin :spinning="serverLoad">
<div style="margin-bottom: 10px;">服务项目</div>
<div class="project-list">
<div @click="handleClickPro(index)" :class="{ active: item.active }" class="project-item"
v-for="(item, index) in projectList" :key="index">{{
item.name }}</div>
</div>
</a-spin>
</div>
<div class="ctn-box" v-if="generationType=='cabin'" >
<div class="ctn-box" v-if="generationType == 'cabin'">
<div style="margin-bottom: 10px;">选择箱型</div>
<div class="list">
<div class="item" v-for="item in CtnList" :key="item.gid">
@ -51,7 +53,7 @@
import { ref, watch, onMounted } from 'vue'
import { BasicModal, useModalInner } from '/@/components/Modal'
import { BasicForm, useForm } from '/@/components/Form/index'
import { getAvailableCtnsBySlot, CreateBookingOrder, GetEnableProjectDictTreeList,CreateBookingAndSlot } from './api'
import { getAvailableCtnsBySlot, CreateBookingOrder, GetEnableProjectDictTreeList, CreateBookingAndSlot } from './api'
import { useMessage } from '/@/hooks/web/useMessage'
import { getOptions } from '/@/hooks/dict'
const { createMessage } = useMessage()
@ -91,12 +93,12 @@ const formSchema: FormSchema[] = [
},
componentProps: ({ formModel }) => {
return {
options:[
{label: '更新订舱', value: 'UPD_BOOKING' },
{label: '直接生成舱位和订舱', value: 'GEN_BOOKING_SLOT' },
{label: '只生成订舱', value: 'GEN_BOOKING' },
{label: '只生成舱位', value: 'GEN_SLOT' },
{label: '匹配已有订舱', value: 'GEN_EXIST_BOOKING' }
options: [
{ label: '更新订舱', value: 'UPD_BOOKING' },
{ label: '直接生成舱位和订舱', value: 'GEN_BOOKING_SLOT' },
{ label: '只生成订舱', value: 'GEN_BOOKING' },
{ label: '只生成舱位', value: 'GEN_SLOT' },
{ label: '匹配已有订舱', value: 'GEN_EXIST_BOOKING' }
]
}
},
@ -112,8 +114,8 @@ const formSchema: FormSchema[] = [
},
componentProps: ({ formModel }) => {
return {
options:[
{label: '是否直接发送邮件给订舱联系人', value: 'isDirectSend' },
options: [
{ label: '是否直接发送邮件给订舱联系人', value: 'isDirectSend' },
]
}
},
@ -438,6 +440,7 @@ const [registerForm, { resetFields, setFieldsValue, getFieldsValue }] = useForm(
schemas: formSchema,
showActionButtonGroup: false,
})
const serverLoad = ref(false)
const generationType = ref('')
const taskId = ref('')
const [registerModal, { setModalProps, closeModal }] = useModalInner((data) => {
@ -451,9 +454,7 @@ const [registerModal, { setModalProps, closeModal }] = useModalInner((data) => {
taskInit()
taskId.value = data.taskId
}
})
const projectList = ref([]) as any
onMounted(() => {
serverLoad.value = true
GetEnableProjectDictTreeList({ isAvoidCache: false }).then(res => {
if (res.success) {
if (res.data) {
@ -465,7 +466,12 @@ onMounted(() => {
} else {
createMessage.error(res.message)
}
serverLoad.value = false
})
})
const projectList = ref([]) as any
onMounted(() => {
})
function handleClickPro(index) {
projectList.value[index].active = !projectList.value[index].active
@ -530,7 +536,7 @@ function cabinInit(row) {
}
//
function taskInit() {
setFieldsValue({generateMethod:'GEN_BOOKING'})
setFieldsValue({ generateMethod: 'GEN_BOOKING' })
}
function handleSave() {
if (generationType.value === 'cabin') {
@ -581,7 +587,7 @@ function handleSaveCabin() {
})
}
//
function handleSaveTask(){
function handleSaveTask() {
const projectArr = [] as any
projectList.value.forEach(item => {
if (item.active) {
@ -658,6 +664,7 @@ function handleSaveTask(){
.project-list {
display: flex;
flex-wrap: wrap;
.project-item {
background-color: rgb(255, 255, 255);
color: rgb(37, 122, 250);

@ -31,6 +31,14 @@ export function GetInvoiceCodeList() {
})
}
export function InvoiceApplicationGet(parameter) {
return request({
url: '/feeApi/InvoiceApplication/Get',
method: 'get',
params:parameter
})
}
export function InvoiceApplicationSave(parameter) {
return request({
url: '/feeApi/InvoiceApplication/Save',
@ -54,4 +62,38 @@ export function InvoiceApplicationGetFees(parameter) {
method: 'post',
data: parameter,
})
}
}
export function GetTemplateFields(parameter) {
return request({
url: '/feeApi/InvoiceApplication/GetTemplateFields',
method: 'get',
params:parameter
})
}
export function SaveTemplate(parameter) {
return request({
url: '/feeApi/InvoiceApplication/SaveTemplate',
method: 'post',
data: parameter,
})
}
export function GetTemplateList(parameter) {
return request({
url: '/feeApi/InvoiceApplication/GetTemplateList',
method: 'get',
params:parameter
})
}
export function RenderTemplate(parameter) {
return request({
url: '/feeApi/InvoiceApplication/RenderTemplate',
method: 'get',
params:parameter
})
}

@ -275,6 +275,12 @@ export const columns: BasicColumn[] = [
]
export const detailForm: FormSchema[] = [
{
field: 'id',
label: 'id',
component: 'Input',
show: false,
},
{
field: 'applicationNO',
label: '申请单号',
@ -388,7 +394,7 @@ export const detailForm: FormSchema[] = [
},
},
{
field: 'Category',
field: 'category',
label: '申请类型',
component: 'Select',
colProps: { span: 4 },
@ -428,8 +434,8 @@ export const detailForm: FormSchema[] = [
{
label: '委托单位',
field: 'customerId',
required: true,
component: 'ApiSelect',
required: false,
dynamicDisabled: false,
colProps: { span: 4 },
componentProps: ({ formModel }) => {
@ -550,17 +556,13 @@ export const detailForm: FormSchema[] = [
},
{
field: 'note',
label: '备注',
label: '',
component: 'InputTextArea',
colProps: { span: 12 },
componentProps: () => {
return {
autoSize: { minRows: 4, maxRows: 7 }
}
},
slot: 'note',
},
{
field: 'note',
field: 'invoiceRemark',
label: '开票要求',
component: 'InputTextArea',
colProps: { span: 12 },

@ -42,7 +42,7 @@
添加
</a-button>
</div>
<a-table rowKey="feeId" :row-selection="{ selectedRowKeys: selectedRowKeysDetial, onChange: onSelectChangeDetail }"
<a-table rowKey="recordId" :row-selection="{ selectedRowKeys: selectedRowKeysDetial, onChange: onSelectChangeDetail }"
:loading="loading" :columns="columns" :data-source="dataSource" bordered>
<template v-slot:bodyCell="{ column, record }">
<template v-if="column.dataIndex == 'applyAmount'">
@ -196,22 +196,23 @@ function onSelectChange(selectedRowKeys) {
})
})
}
const emits = defineEmits(['updateList'])
function handleAddDetial() {
const arr = [] as any
dataSource.value.forEach(item=>{
selectedRowKeysDetial.value.forEach(ite=>{
if(item.feeId == ite){
if(item.recordId == ite){
arr.push(item)
}
})
})
const data = {
details:arr
}
InvoiceApplicationSave(data).then(res=>{
arr.forEach(item=>{
item.originalCurrency = item.currency
item.originalAmount = item.applyAmount
item.originalProcessedAmount = item.processedAmount ? item.processedAmount : 0
})
emits('updateList', arr)
}
const selectedRowKeysDetial = ref([]) as any
function onSelectChangeDetail(selectedRowKeys) {

@ -54,7 +54,7 @@
</span>
</div>
</div>
<InvoiceDetails ref="InvoiceDetailsRef"></InvoiceDetails>
<InvoiceDetails @updateList="updateList" ref="InvoiceDetailsRef"></InvoiceDetails>
</a-spin>
</template>
<script lang="ts" setup>
@ -112,7 +112,10 @@ const props = defineProps({
default: '300'
}
})
const emits = defineEmits(['updateAmount'])
const emits = defineEmits(['updateAmount','updateListSave'])
function updateList(val){
emits('updateListSave',val)
}
//
const feeDict = ref([])
//

@ -1,53 +1,196 @@
<template>
<div class="main">
<div>
<a-button type="link" @click="handleSave" > <i class="iconfont icon-zhcc_tidan"></i>保存</a-button>
<a-button type="link" ><i class="iconfont icon-return"></i>撤销审核</a-button>
</div>
<BasicForm @register="registerForm" />
<feeTable @updateAmount="updateAmount" ref="feeTableRef"></feeTable>
<a-spin :spinning="loading">
<div>
<a-button type="link" @click="handleSave"> <i class="iconfont icon-zhcc_tidan"></i>保存</a-button>
<a-button type="link"><i class="iconfont icon-return"></i>撤销审核</a-button>
</div>
<BasicForm @register="registerForm">
<template #note="{ model, field }">
<div style="display: flex;align-items: center;height: 22px;line-height: 22px;">
备注:
<a-button @click="openTempName" style="margin: 0 15px 0 20px;" type="link"> <i
class="icon-a-17Btuichu iconfont"></i>
提取备注</a-button>
<a-button type="link" @click="openTemp"><i class="icon-jichupeizhi iconfont"></i>模板设置</a-button>
</div>
<a-textarea v-model:value="model[field]" :auto-size="{ minRows: 4, maxRows: 7 }" />
</template>
</BasicForm>
<feeTable @updateListSave=updateListSave @updateAmount="updateAmount" ref="feeTableRef"></feeTable>
<a-modal @cancel="open = false" width="700px" :visible="open" title="模板设置" @ok="handleSaveTemp">
<div style="display: flex;">
<div class="label-list">
<div class="label-item" @click="handleAddLabel(item)" v-for="item in labelList"
:key="item.fieldName">{{
item.displayName }}
</div>
</div>
<div style="width: 80%;margin-left: 10px">
<a-textarea style="height: 90%;" v-model:value="tempContent" />
<div style="margin-top: 15px;">
<span>发票备注模板</span>
<el-autocomplete v-model="tempName" style="width: 81%;margin-left: 10px;"
:fetch-suggestions="querySearch" clearable @select="handleSelect" />
</div>
</div>
</div>
</a-modal>
<a-modal @cancel="nameFlag = false" width="700px" :visible="nameFlag" title="提取发票备注" @ok="handleRender">
<a-select v-model:value="tempNameId" style="width: 80%">
<a-select-option :value="item.id" v-for="(item,index) in tempList" :key="index" >{{ item.name }}</a-select-option>
</a-select>
</a-modal>
</a-spin>
</div>
</template>
<script lang="ts" setup>
import { ref, onMounted, unref } from 'vue'
import { BasicForm, useForm } from '/@/components/Form/index'
import { AutoComplete } from 'ant-design-vue'
import { detailForm } from '../columns'
import feeTable from './feeTable.vue';
import { InvoiceApplicationSave } from '../api'
import { InvoiceApplicationSave, InvoiceApplicationGet, GetTemplateFields, SaveTemplate, GetTemplateList } from '../api'
import { useMessage } from '/@/hooks/web/useMessage'
import { useRoute } from 'vue-router'
const route = useRoute()
const { createMessage } = useMessage()
const id = ref(route.query.id)
const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({
labelWidth: 100,
schemas: detailForm,
showActionButtonGroup: false,
})
const feeTableRef = ref(null) as any
async function handleSave(){
const values = await validate()
const open = ref(false)
const nameFlag = ref(false)
async function handleSave() {
const values = await validate()
const data = {
...values,
invoiceDetails: feeTableRef.value.list
}
InvoiceApplicationSave(data).then(res=>{
loading.value = true
InvoiceApplicationSave(data).then(res => {
if (res.succeeded) {
createMessage.success('保存成功')
} else {
createMessage.error(res.message)
}
loading.value = false
}).catch(err => {
loading.value = false
})
console.log(feeTableRef.value.list)
}
function updateAmount(val){
const loading = ref(false)
function updateAmount(val) {
setFieldsValue({
invoiceAmount:val
invoiceAmount: val
})
}
const tempContent = ref('')
function handleSaveTemp() {
const data = {
name: tempName.value,
content: tempContent.value,
id: ''
}
if (tempId.value) {
data.id = tempId.value
}
SaveTemplate([data]).then(res => {
if (res.succeeded) {
createMessage.success('保存成功')
GetTemplateList().then(res => {
tempList.value = res.data
tempList.value.forEach(item => {
item.value = item.name
})
})
} else {
createMessage.error(res.message)
}
})
}
onMounted(() => {
init()
})
function init(){
setFieldsValue({
statusText:'未提交'
const labelList = ref([]) as any
const tempList = ref([]) as any
function openTemp() {
open.value = true
GetTemplateFields().then(res => {
labelList.value = res.data
})
GetTemplateList().then(res => {
tempList.value = res.data
tempList.value.forEach(item => {
item.value = item.name
})
})
}
function init() {
if (id.value) {
getDetail()
} else {
setFieldsValue({
statusText: '未提交'
})
}
}
function handleAddLabel(val) {
tempContent.value += '[' + val.displayName + ']'
}
function getDetail() {
InvoiceApplicationGet({ id: id.value }).then(res => {
if (res.succeeded) {
setFieldsValue(res.data)
}
})
}
function openTempName() {
nameFlag.value = true
}
function updateListSave() {
}
const tempNameId = ref('')
function handleRender(){
let temp = ''
tempList.value.forEach(item=>{
if(item.id==tempNameId.value){
temp = item.content
}
})
}
const tempName = ref('')
const tempId = ref('')
const querySearch = (queryString: string, cb: any) => {
cb(tempList.value)
}
function handleSelect(value) {
tempId.value = value.id
tempContent.value = value.content
}
</script>
<style lang="less" scoped >
.main{
<style lang="less" scoped>
.main {
padding: 20px;
padding-top: 5px;
}
/deep/ .ant-btn-link {
padding: 0px !important;
}
.label-list {
max-height: 400px;
width: 20%;
overflow-y: scroll;
.label-item {
margin-bottom: 5px;
cursor: pointer;
}
}
</style>

@ -1702,10 +1702,10 @@
let RData = 0
list.value.forEach((e) => {
if (e.kgs) {
RData = RData + parseInt(e.kgs)
RData = RData + Number(e.kgs)
}
})
totalKgs.value = RData
totalKgs.value = RData.toFixed(2)
emit('changeTotal', { type: 'totalKgs', val: totalKgs.value })
}
//
@ -1713,10 +1713,10 @@
let RData = 0
list.value.forEach((e) => {
if (e.cbm) {
RData = RData + parseInt(e.cbm)
RData = RData + Number(e.cbm)
}
})
totalCbm.value = RData
totalCbm.value = RData.toFixed(2)
emit('changeTotal', { type: 'totalCbm', val: totalCbm.value })
}
//

@ -1053,7 +1053,7 @@
const voltaFlag = ref(false)
const voltaData = ref([])
const bookingModelFrom = reactive({
id: props,
id: props.id,
orderNo: props.details.mblno,
useForwarderCode: false,
forwarderCode: '',
@ -1281,7 +1281,6 @@
fileRole: bookingModelFrom.fileRole,
sendType: modelType.value === 'bookingSpace' ? 'B' : 'E',
}
EDISloading.value = true
if (modelType.value === 'bookingSpace') {
//

@ -379,7 +379,7 @@ export function TaskManageBCSendEmai1(parameter) {
}
export function TaskTransPlanHasChange(parameter) {
return request<DataResult>({
url: '/TaskTransPlanHasChange/taskPKId',
url: '/taskApi/TaskTransPlanHasChange/GetInfoByTaskId',
method: 'get',
params: parameter
})

@ -8,12 +8,18 @@
<p>
<i class="icon-PC_gangkou iconfont"
style="color: red;margin-right: 10px;font-size: 16px"></i>
截止时间变更通知({{ taskData.carrier }})
截止时间变更通知({{ carrier }})
</p>
<p>时间{{ taskData.createTime }}</p>
<p>时间{{ createTime }}</p>
</div>
<a-table :pagination="false" size="small" :scroll="{ x: 1500, y: 300 }" :columns="columns"
:data-source="taskData" bordered>
<template #bodyCell="{ column, record }">
<span v-if="column.key === 'bookingId'">
<div v-if="record.bookingId > 0" class="point"></div>
<div v-if="record.bookingId == 0">-</div>
</span>
</template>
</a-table>
</div>
</div>
@ -31,6 +37,8 @@ import taskButton from '../components/taskButton.vue'
const { createMessage } = useMessage()
import { useRoute } from 'vue-router'
const route = useRoute()
const carrier = ref('')
const createTime = ref('')
const spinning = ref(false)
const taskData = ref([]) as any
const taskPKId = ref(route.query.taskPKId)
@ -48,14 +56,14 @@ const columns = [
{
title: '船名/航次',
dataIndex: 'vessel',
width: 100,
width: 150,
key: 'vessel',
align: 'center',
},
{
title: '样单截止时间',
dataIndex: 'siCutDateTxt',
width: 100,
width: 150,
key: 'siCutDateTxt',
align: 'center'
},
@ -70,7 +78,7 @@ const columns = [
title: '截港时间',
dataIndex: 'cyCutoffTimeTxt',
key: 'cyCutoffTimeTxt',
width: 100,
width: 150,
align: 'center'
},
{
@ -88,7 +96,7 @@ const columns = [
{
title: 'VGM截止时间',
dataIndex: 'vgmCutoffTimeTxt',
width: 100,
width: 150,
key: 'vgmCutoffTimeTxt',
align: 'center'
},
@ -115,8 +123,16 @@ const columns = [
]
function getInfo() {
spinning.value = true
CutDateGetInfoByTaskId({ taskPKId: taskPKId.value }).then(res => {
if (res.succeeded) {
taskData.value = res.data
carrier.value = res.data[0].carrier
createTime.value = res.data[0].noticeDate
} else {
createMessage.error(res.message)
}
spinning.value = false
})
}
@ -130,4 +146,11 @@ function loadingStop() {
</script>
<style lang="less" scoped>
@import url('./taskStyle.less');
.point {
height: 10px;
width: 10px;
border-radius: 50%;
margin: 0 auto;
background: green;
}
</style>

@ -158,6 +158,11 @@ function getInfoBasic(){
if (res.succeeded) {
if (res.data.length > 0) {
const arr = JSON.parse(res.data[0].content)
basicList.value.forEach((item,index) => {
arr[index].title = item.title
arr[index].width = item.width
arr[index].dataIndex = item.dataIndex
})
basicList.value = arr
} else {
basicList.value.forEach(item => {

@ -29,7 +29,7 @@
}
.box {
border: 1px solid rgba(232, 235, 237, 1);
border-bottom: 1px solid rgba(232, 235, 237, 1);
padding: 15px 20px;
margin-bottom: 16px;

@ -1,121 +1,120 @@
<template>
<div class="main">
<a-spin :spinning="spinning">
<div class="box">
<div class="LeftHead">
<p>
<i style="color: orange;margin-right: 10px;font-size: 16px" class="icon-lunchuan iconfont"></i>
货物运输计划已变更 {{ taskData.carrier }}
</p>
<p>时间{{ taskData.createTime }}</p>
</div>
<a-row>
<a-col :span="4">
<div class="text">提单号</div>
{{ taskData.billNo }}
</a-col>
<a-col :span="4">
<div class="text">此订舱号派生自原单号</div>
{{ taskData.origBillNo }}
</a-col>
</a-row>
<a-row>
<a-col :span="4">
<div class="text">订舱号</div>
{{ taskData.bookingNo }}
</a-col>
<a-col :span="4">
<div class="text">集装箱号</div>
{{ taskData.contaNoList }}
</a-col>
</a-row>
<a-row>
<a-col :span="20">
<div class="text">变更原因</div>
{{ taskData.changeReasonNotes }}
</a-col>
</a-row>
</div>
<div class="box">
<div class="LeftHead">
<div style="font-weight: bold;">出运计划</div>
</div>
<div style="display: flex;margin-top: 15px;">
<div style="width: 33%;">
<div style="font-weight: bold;font-size: 13px;">港口名,国家,码头</div>
<div :class="{
gray: taskData.from.portList.length == 1,
red: taskData.from.portList.length > 1 && item.isRemoved,
green: taskData.from.portList.length > 1 && !item.isRemoved
}" v-for="(item, index) in taskData.from.portList" :key="index">
{{ item.portName }},{{ item.countryCode }},{{ item.terminalName }}</div>
<div class="main-box">
<div class="box">
<div class="LeftHead">
<p>
<i style="color: orange;margin-right: 10px;font-size: 16px"
class="icon-lunchuan iconfont"></i>
货物运输计划已变更 {{ taskData.carrier }}
</p>
<p>时间{{ taskData.createTime }}</p>
</div>
<div style="width: 33%;">
<div style="font-weight: bold;font-size: 13px;">预计离港日</div>
<div :class="{
gray: taskData.from.dateList.length == 1,
red: taskData.from.dateList.length > 1 && item.isRemoved,
green: taskData.from.dateList.length > 1 && !item.isRemoved
}" v-for="(item, index) in taskData.from.dateList" :key="index">
{{ item.dateVal }}</div>
<a-row>
<a-col :span="4">
<div class="text">提单号</div>
{{ taskData.billNo }}
</a-col>
<a-col :span="4">
<div class="text">此订舱号派生自原单号</div>
{{ taskData.origBillNo }}
</a-col>
</a-row>
<a-row>
<a-col :span="4">
<div class="text">订舱号</div>
{{ taskData.bookingNo }}
</a-col>
<a-col :span="4">
<div class="text">集装箱号</div>
{{ taskData.contaNoList }}
</a-col>
</a-row>
<a-row>
<a-col :span="20">
<div class="text">变更原因</div>
{{ taskData.changeReasonNotes }}
</a-col>
</a-row>
</div>
<div class="box">
<div class="LeftHead">
<div style="font-weight: bold;">出运计划</div>
</div>
<div style="width: 33%;">
<div style="font-weight: bold;font-size: 13px;">船名,航次,船旗</div>
<div :class="{
gray: taskData.from.vesselList.length == 1,
red: taskData.from.vesselList.length > 1 && item.isRemoved,
green: taskData.from.vesselList.length > 1 && !item.isRemoved
}" v-for="(item, index) in taskData.from.vesselList" :key="index">
{{ item.vessel }},{{ item.voyno }},{{ item.flag }}</div>
<div style="display: flex;margin-top: 15px;">
<div style="width: 33%;">
<div style="font-weight: bold;font-size: 13px;">港口名,国家,码头</div>
<div :class="{
gray: taskData.from.portList.length == 1,
red: taskData.from.portList.length > 1 && item.isRemoved,
green: taskData.from.portList.length > 1 && !item.isRemoved
}" v-for="(item, index) in taskData.from.portList" :key="index">
{{ item.portName }},{{ item.countryCode }},{{ item.terminalName }}</div>
</div>
<div style="width: 33%;">
<div style="font-weight: bold;font-size: 13px;">预计离港日</div>
<div :class="{
gray: taskData.from.dateList.length == 1,
red: taskData.from.dateList.length > 1 && item.isRemoved,
green: taskData.from.dateList.length > 1 && !item.isRemoved
}" v-for="(item, index) in taskData.from.dateList" :key="index">
{{ item.dateVal }}</div>
</div>
<div style="width: 33%;">
<div style="font-weight: bold;font-size: 13px;">船名,航次,船旗</div>
<div :class="{
gray: taskData.from.vesselList.length == 1,
red: taskData.from.vesselList.length > 1 && item.isRemoved,
green: taskData.from.vesselList.length > 1 && !item.isRemoved
}" v-for="(item, index) in taskData.from.vesselList" :key="index">
{{ item.vessel }},{{ item.voyno }},{{ item.flag }}</div>
</div>
</div>
</div>
</div>
<div class="box">
<div class="LeftHead">
<div style="font-weight: bold;">到达计划</div>
</div>
<div style="display: flex;margin-top: 15px;">
<div style="width: 33%;">
<div style="font-weight: bold;font-size: 13px;">港口名,国家,码头</div>
<div :class="{
gray: taskData.to.portList.length == 1,
red: taskData.to.portList.length > 1 && item.isRemoved,
green: taskData.to.portList.length > 1 && !item.isRemoved
}" v-for="(item, index) in taskData.to.portList" :key="index">
{{ item.portName }},{{ item.countryCode }},{{ item.terminalName }}</div>
</div>
<div style="width: 33%;">
<div style="font-weight: bold;font-size: 13px;">预计到港日</div>
<div :class="{
gray: taskData.to.dateList.length == 1,
red: taskData.to.dateList.length > 1 && item.isRemoved,
green: taskData.to.dateList.length > 1 && !item.isRemoved
}" v-for="(item, index) in taskData.to.dateList" :key="index">
{{ item.dateVal }}</div>
<div class="box">
<div class="LeftHead">
<div style="font-weight: bold;">到达计划</div>
</div>
<div style="width: 33%;">
<div style="font-weight: bold;font-size: 13px;">船名,航次,船旗</div>
<div :class="{
gray: taskData.to.vesselList.length == 1,
red: taskData.to.vesselList.length > 1 && item.isRemoved,
green: taskData.to.vesselList.length > 1 && !item.isRemoved
}" v-for="(item, index) in taskData.to.vesselList" :key="index">
{{ item.vessel }},{{ item.voyno }},{{ item.flag }}</div>
<div style="display: flex;margin-top: 15px;">
<div style="width: 33%;">
<div style="font-weight: bold;font-size: 13px;">港口名,国家,码头</div>
<div :class="{
gray: taskData.to.portList.length == 1,
red: taskData.to.portList.length > 1 && item.isRemoved,
green: taskData.to.portList.length > 1 && !item.isRemoved
}" v-for="(item, index) in taskData.to.portList" :key="index">
{{ item.portName }},{{ item.countryCode }},{{ item.terminalName }}</div>
</div>
<div style="width: 33%;">
<div style="font-weight: bold;font-size: 13px;">预计到港日</div>
<div :class="{
gray: taskData.to.dateList.length == 1,
red: taskData.to.dateList.length > 1 && item.isRemoved,
green: taskData.to.dateList.length > 1 && !item.isRemoved
}" v-for="(item, index) in taskData.to.dateList" :key="index">
{{ item.dateVal }}</div>
</div>
<div style="width: 33%;">
<div style="font-weight: bold;font-size: 13px;">船名,航次,船旗</div>
<div :class="{
gray: taskData.to.vesselList.length == 1,
red: taskData.to.vesselList.length > 1 && item.isRemoved,
green: taskData.to.vesselList.length > 1 && !item.isRemoved
}" v-for="(item, index) in taskData.to.vesselList" :key="index">
{{ item.vessel }},{{ item.voyno }},{{ item.flag }}</div>
</div>
</div>
</div>
</div>
<a-row style="margin-top: 40px;" type="flex" justify="end" :gutter="16">
<taskButton :buttonList="['取消', '完成', '转移', '邮件', '检索']" @loadingStart="loadingStart"
@loadingStop="loadingStop" :id="taskPKId"></taskButton>
</a-row>
</a-spin>
<taskButton :buttonList="['取消', '完成', '转移', '邮件', '检索']" @loadingStart="loadingStart" @loadingStop="loadingStop"
:id="taskPKId"></taskButton>
</div>
</template>
<script lang="ts" setup>
import { ref, onMounted, computed } from 'vue'
import { GetInfoByTaskIdNotice } from '../api'
import { TaskTransPlanHasChange } from '../api'
import taskButton from '../components/taskButton.vue'
import { useMessage } from '../../../hooks/web/useMessage'
const { createMessage } = useMessage()
@ -141,257 +140,17 @@ const tableLoad = ref(false)
onMounted(() => {
// getInfo()
taskData.value = {
"taskPkId": "08dcaf78-2a14-4a17-8754-fb8dd5630677",
"pkId": "08dcaf78-2a19-49df-8a32-b7b30cac12c3",
"billNo": "241585502",
"contaNoList": [
"TEMU1415619"
],
"carrier": "MSK",
"changeReasonNotes": "We would like to inform you that we are facing certain operational challenges at the terminal which will impact our container discharge operations. We are doing our utmost to minimize the delay & make the container available for further clearance.",
"groupBatchNo": "08dcaf78-0f8f-40a3-8c0e-689706b3f3bc",
"isLast": true,
"from": {
"portList": [
{
"indx": 1,
"portName": "Qingdao",
"countryCode": "CN",
"terminalName": "Qingdao Qianwan Container Co Ltd",
"isRemoved": false
}
],
"dateList": [
{
"indx": 1,
"dateVal": "2024-07-27 08:00:00",
"isRemoved": true
},
{
"indx": 2,
"dateVal": "2024-07-27 15:01:00",
"isRemoved": true
},
{
"indx": 3,
"dateVal": "2024-07-29 07:10:00",
"isRemoved": false
}
],
"vesselList": [
{
"indx": 1,
"vessel": "MAERSK SEBAROK",
"voyno": "430S",
"flag": "SG",
"isRemoved": false
}
]
},
"to": {
"portList": [
{
"indx": 1,
"portName": "Brisbane",
"countryCode": "AU",
"terminalName": "Brisbane Patrick Terminal",
"isRemoved": false
}
],
"dateList": [
{
"indx": 1,
"dateVal": "2024-08-22 07:00:00",
"isRemoved": true
},
{
"indx": 2,
"dateVal": "2024-08-27 14:00:00",
"isRemoved": true
},
{
"indx": 3,
"dateVal": "2024-08-28 02:00:00",
"isRemoved": false
}
],
"vesselList": [
{
"indx": 1,
"vessel": "MAERSK SEBAROK",
"voyno": "430S",
"flag": "SG",
"isRemoved": false
}
]
}
}
getInfo()
})
const columns = [
{
title: 'Shipment',
dataIndex: 'shipment',
align: 'center',
width: '120px'
},
{
title: 'equipmentNumber',
dataIndex: 'equipmentNumber',
align: 'center',
width: '150px'
},
{
title: 'Place of Receipt',
dataIndex: 'placeOfReceipt',
align: 'center',
width: '150px'
},
{
title: 'Load Port Name',
dataIndex: 'loadPortName',
align: 'center',
width: '150px'
},
{
title: 'Discharge Port Name',
align: 'center',
dataIndex: 'dischargePortName',
width: '180px'
},
{
title: 'Place of Delivery',
dataIndex: 'placeOfDelivery',
align: 'center',
width: '150px'
},
{
title: '已发通知',
dataIndex: 'isSend',
align: 'center',
width: '90px'
},
{
title: '订舱',
dataIndex: 'bookingId',
width: '70px',
align: 'center',
},
{
title: '客户同意换船',
dataIndex: 'userOpinion',
width: '120px',
align: 'center',
},
{
title: '是否客户提交',
dataIndex: 'isUserManual',
align: 'center',
width: '120px',
},
{
title: '箱型箱量',
dataIndex: 'ctnStat',
align: 'center',
width: '120px',
},
{
title: '客户',
width: '120px',
align: 'center',
dataIndex: 'customerName'
},
{
title: '分享链接',
dataIndex: 'groupName',
align: 'center',
width: '100px',
fixed: 'right',
customCell: (_, index) => {
return {
rowspan: mergeCells(_.groupName, taskData.value.preBillList, 'groupName', index)
}
},
}
]
const columnsLoad = [
{
title: 'Shipment',
dataIndex: 'shipment',
align: 'center',
width: '120px'
},
{
title: 'Equipment Number',
dataIndex: 'equipmentNumber',
align: 'center',
width: '120px'
},
{
title: 'Container',
dataIndex: 'containerType',
align: 'center',
width: '120px'
},
{
title: 'FEE',
dataIndex: 'fee',
align: 'center',
width: '70px'
},
{
title: 'Weight',
dataIndex: 'weight',
align: 'center',
width: '70px'
},
{
title: 'Place of Receipt',
dataIndex: 'placeOfReceipt',
align: 'center',
width: '120px'
},
{
title: 'Load Port Name',
dataIndex: 'loadPortName',
align: 'center',
width: '120px'
},
{
title: 'Discharge Port Name',
dataIndex: 'dischargePortName',
align: 'center',
width: '120px'
},
{
title: 'Place of Delivery',
dataIndex: 'placeOfDelivery',
align: 'center',
width: '120px'
}
]
function mergeCells(text, data, key, index) {
//
if (index !== 0 && text == data[index - 1][key]) {
return 0;
}
let rowSpan = 1;
//
for (let i = index + 1; i < data.length; i++) {
if (text !== data[i][key]) {
break;
}
rowSpan++;
}
return rowSpan;
}
function getInfo() {
spinning.value = true
const ApiData = {
taskPKId: taskPKId.value
}
GetInfoByTaskIdNotice(ApiData).then(res => {
TaskTransPlanHasChange(ApiData).then(res => {
if (res.succeeded) {
taskData.value = res.data
} else {

Loading…
Cancel
Save