lijingjia 2 weeks ago
commit 60ea1db15e

@ -1,97 +1,39 @@
// @ts-ignore
import { request } from '/@/utils/request' import { request } from '/@/utils/request'
import { DataResult, PageRequest } from '/@/api/model/baseModel' import { DataResult, PageRequest } from '/@/api/model/baseModel'
enum Api { enum Api {
list = '/containerManagementApi/CM_State_Change/GetCM_State_ChangeList', list = '/containerManagementApi/VW_CM_OfflineAudit/GetCM_OfflineAuditList',
edit = '/containerManagementApi/CM_State_Change/EditCM_State_Change', confirm = '/containerManagementApi/VW_CM_OfflineAudit/CM_OfflineAudit_Confirm',
multiEdit = '/containerManagementApi/CM_State_Change/CM_State_Change_Multi', cancel = '/containerManagementApi/VW_CM_OfflineAudit/CM_OfflineAudit_Cancel',
Changeinfo = '/containerManagementApi/CM_State_Change/GetCM_State_Change', detailList = '/containerManagementApi/CM_SellCtn_Detail/GetCM_SellCtn_DetailList',
Changedel = '/containerManagementApi/CM_State_Change/DeleteCM_State_Change',
info = '/containerManagementApi/CM_CurrentState/GetCM_CurrentStateInfo',
del = '/mainApi/CodeCtn/BatchDelCodeCtn',
BasicsList = '/mainApi/CodeCtn/GetBasicsCodeCtnList',
ExistList = '/mainApi/CodeCtn/GetExistCodeCtnList',
Import = '/mainApi/CodeCtn/ImportCodeCtn',
} }
// 列表 (Auth) // 列表 (Auth)
export function ApiChangeList(data: PageRequest) { export function ApiList(data: PageRequest) {
return request<DataResult>({ return request<DataResult>({
url: Api.list, url: Api.list,
method: 'post', method: 'post',
data, data,
}) })
} }
// 卖箱_明细 列表 (Auth)
// 批量编辑状态 (Auth) export function ApiDetailList(data: PageRequest) {
export function ApiMultiEdit(data: PageRequest) {
return request<DataResult>({ return request<DataResult>({
url: Api.multiEdit, url: Api.detailList,
method: 'post', method: 'post',
data, data,
}) })
} }
// 下线审批_确认 (Auth)
// 编辑 (Auth) export function ApiConfirm(data: PageRequest) {
export function ApiEdit(data: PageRequest) {
return request<DataResult>({ return request<DataResult>({
url: Api.edit, url: Api.confirm,
method: 'post', method: 'post',
data, data,
}) })
} }
// 详情 (Auth) // 下线审批_取消 (Auth)
export function ApiChangeInfo(query) { export function ApiCancel(data: PageRequest) {
return request<DataResult>({ return request<DataResult>({
url: Api.Changeinfo, url: Api.cancel,
method: 'get',
params: query,
})
}
// 详情 (Auth)
export function ApiInfo(query) {
return request<DataResult>({
url: Api.info,
method: 'get',
params: query,
})
}
// 批量删除 (Auth)
export function ApiChangeDel(data: PageRequest) {
return request<DataResult>({
url: Api.Changedel,
method: 'post',
data,
})
}
// 批量删除 (Auth)
export function ApiDel(data: PageRequest) {
return request<DataResult>({
url: Api.del,
method: 'post',
data,
})
}
// 获取商品类型列表-基础库 (Auth)
export function ApiBasicsList(data: PageRequest) {
return request<DataResult>({
url: Api.BasicsList,
method: 'post',
data,
})
}
// 获取当前租户已有的商品类型 (Auth)
export function ApiExistList() {
return request<DataResult>({
url: Api.ExistList,
method: 'get',
})
}
// 导入商品类型列表-基础库 (Auth)
export function ApiImport(data: PageRequest) {
return request<DataResult>({
url: Api.Import,
method: 'post', method: 'post',
data, data,
}) })

@ -1,175 +1,98 @@
import { ref } from 'vue'
import { BasicColumn, FormSchema } from '/@/components/Table' import { BasicColumn, FormSchema } from '/@/components/Table'
import { Tag } from 'ant-design-vue' import { Tag } from 'ant-design-vue'
import { GetCtnSelectList, GetClientListByCode } from '/@/api/common'
import { GetDeptList } from '/@/views/operation/seaexport/api/BookingLedger'
import { useOptionsStore } from '/@/store/modules/options'
const optionsStore = useOptionsStore()
// 字典
import { getDictOption } from '/@/utils/dictUtil'
// 新旧箱数据
const usedStateList = [
{
label: '',
value: '',
},
{
label: 'USED',
value: 'USED',
},
{
label: 'NEW',
value: 'NEW',
},
]
export const columns: BasicColumn[] = [ export const columns: BasicColumn[] = [
{ {
title: '号', title: '系统业务号',
dataIndex: 'cntrno', dataIndex: 'billno',
sorter: true, sorter: true,
width: 150, width: 150,
}, },
{ {
title: '箱型', title: '执行状态',
dataIndex: 'ctnall', dataIndex: 'billState',
sorter: true, sorter: true,
width: 150, width: 150,
customRender: ({ text }) => {
if (text == 1000) {
return <Tag color="default"></Tag>
} else if (text == 1001) {
return <Tag color="processing"></Tag>
} else if (text == 10001) {
return <Tag color="error"></Tag>
} else if (text == 1100) {
return <Tag color="success"></Tag>
} else {
return '-'
}
},
}, },
{ {
title: '序号', title: '业务日期',
dataIndex: 'index', dataIndex: 'bsdate',
width: 50,
},
{
title: '箱状态',
dataIndex: 'ctnState',
sorter: true,
width: 200,
},
{
title: '箱流转状态',
dataIndex: 'ctnFlowState',
sorter: true,
width: 200,
},
{
title: '船名',
dataIndex: 'vessel',
sorter: true, sorter: true,
width: 200, width: 200,
}, },
{ {
title: '航次', title: '租买箱客户',
dataIndex: 'voyno', dataIndex: 'rentCustomerName',
sorter: true, sorter: true,
width: 200, width: 200,
}, },
// {
// title: '原箱主',
// dataIndex: 'OldContainerOwner',
// sorter: true,
// width: 200,
// },
{ {
title: '提单号', title: '箱业务',
dataIndex: 'mblno', dataIndex: 'ctnBizStateId',
sorter: true, sorter: true,
width: 200, width: 200,
},
{
title: '发生日期',
dataIndex: 'changeTime',
sorter: true,
width: 150,
},
{
title: '空重箱',
dataIndex: 'isHeavy',
sorter: true,
width: 80,
customRender: ({ text }) => { customRender: ({ text }) => {
if (text) { if (text == 6) {
return <Tag color="success"></Tag> return '卖箱'
} else if (text == 1) {
return '租入退租'
} else if (text == 2) {
return '租出'
} else { } else {
return <Tag color="error"></Tag> return '-'
} }
return text
}, },
}, },
{ {
title: '始发港', title: '全部箱号',
dataIndex: 'portLoad', dataIndex: 'cntrnoAll',
sorter: true,
width: 150,
},
{
title: '目的港',
dataIndex: 'portDelivery',
sorter: true,
width: 150,
},
{
title: '预抵港',
dataIndex: 'portDischarge',
sorter: true,
width: 150,
},
{
title: '码头或场站',
dataIndex: 'depot',
sorter: true,
width: 150,
},
{
title: '关联合同号',
dataIndex: 'ctnReleaseNo',
sorter: true,
width: 150,
},
{
title: '备注',
dataIndex: 'remark',
sorter: true, sorter: true,
width: 200, width: 200,
}, },
{ {
title: '录入时间', title: '箱型',
dataIndex: 'createTime', dataIndex: 'ctntotal',
sorter: true, sorter: true,
width: 200, width: 200,
}, },
// {
// title: '当前港口',
// dataIndex: 'port',
// sorter: true,
// width: 150,
// },
// {
// title: '变动来源',
// dataIndex: 'changeSource',
// sorter: true,
// width: 150,
// },
// {
// title: '状态变动',
// dataIndex: 'ctnFlowState',
// sorter: true,
// width: 200,
// },
// {
// title: '新旧箱',
// dataIndex: 'usedState',
// sorter: true,
// width: 200,
// },
// {
// title: '箱状态',
// dataIndex: 'ctnState',
// sorter: true,
// width: 200,
// },
] ]
export const searchFormSchema: FormSchema[] = [ export const searchFormSchema: FormSchema[] = [
{ {
field: 'cntrno', field: 'billState',
label: '执行状态',
component: 'Select',
colProps: { span: 4 },
defaultValue: 1001,
componentProps: {
options: [
{ label: '录入', value: 1000 },
{ label: '提交审核', value: 1001 },
{ label: '驳回提交', value: 10001 },
{ label: '审核通过', value: 1100 },
],
},
},
{
field: 'cntrnoall',
label: '箱号', label: '箱号',
component: 'InputTextArea', component: 'InputTextArea',
colProps: { span: 8 }, colProps: { span: 8 },
@ -179,600 +102,85 @@ export const searchFormSchema: FormSchema[] = [
rows: 2, rows: 2,
}, },
}, },
// {
// field: 'changeTime',
// label: '状态时间',
// component: 'RangePicker',
// required: false,
// dynamicDisabled: false,
// colProps: { span: 4 },
// componentProps: {
// allowClear: true,
// },
// },
// {
// field: 'ctnBizState',
// label: '箱业务状态',
// component: 'ApiSelect',
// colProps: { span: 4 },
// defaultValue: '',
// componentProps: ({ formModel }) => {
// return {
// api: () => {
// return new Promise((resolve) => {
// getDictOption('CM_CtnBizState').then((res) => {
// resolve(res)
// })
// })
// },
// labelField: 'label',
// valueField: 'label',
// resultField: 'data',
// filterOption: (input: string, option: any) => {
// return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
// },
// }
// },
// },
// {
// field: 'changeSourceId',
// label: '变动来源',
// component: 'ApiSelect',
// colProps: { span: 4 },
// defaultValue: '',
// componentProps: ({ formModel }) => {
// return {
// api: () => {
// return new Promise((resolve) => {
// getDictOption('CM_ChangeSource').then((res) => {
// resolve(res)
// })
// })
// },
// labelField: 'label',
// valueField: 'value',
// resultField: 'data',
// filterOption: (input: string, option: any) => {
// return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
// },
// onChange: (v, obj) => {},
// }
// },
// },
// {
// field: 'etd',
// label: 'ETD',
// component: 'DatePicker',
// colProps: { span: 4 },
// defaultValue: '',
// componentProps: {
// showTime: true,
// style: 'width:100%',
// },
// },
// {
// field: 'Space',
// label: '',
// component: 'Space',
// colProps: { span: 4 },
// defaultValue: '',
// },
// {
// field: 'eta',
// label: 'ETA',
// component: 'DatePicker',
// colProps: { span: 4 },
// defaultValue: '',
// componentProps: {
// showTime: true,
// style: 'width:100%',
// },
// },
] ]
export const formSchema: FormSchema[] = [
{ export const detailColumns: BasicColumn[] = [
label: '',
field: 'id',
component: 'Input',
defaultValue: '',
show: false,
},
{
field: 'cntrno',
label: '集装箱号',
component: 'InputTextArea',
rules: [
{
required: true,
trigger: 'blur',
message: '请输入集装箱号',
},
],
colProps: { span: 24 },
componentProps: {
validateOnRuleChange: false,
placeholder: '请输入,多个箱号请以“,”逗号间隔',
rows: 3,
},
},
{
field: 'isOnlineId',
label: '是否上线',
component: 'ApiSelect',
colProps: { span: 6 },
defaultValue: '',
componentProps: ({ formModel }) => {
return {
api: () => {
return new Promise((resolve) => {
getDictOption('CM_IsOnlineEnum').then((res) => {
resolve(res)
})
})
},
labelField: 'label',
valueField: 'value',
resultField: 'data',
filterOption: (input: string, option: any) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
},
onChange: (v, obj) => {},
}
},
},
{
field: 'changeSourceId',
label: '变动来源',
component: 'ApiSelect',
colProps: { span: 6 },
defaultValue: '',
componentProps: ({ formModel }) => {
return {
api: () => {
return new Promise((resolve) => {
getDictOption('CM_ChangeSource').then((res) => {
resolve(res)
})
})
},
labelField: 'label',
valueField: 'value',
resultField: 'data',
filterOption: (input: string, option: any) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
},
onChange: (v, obj) => {},
}
},
},
{
field: 'usedState',
label: '新旧箱',
component: 'Select',
colProps: { span: 6 },
componentProps: {
options: usedStateList,
allowClear: true,
showSearch: true,
filterOption: (input: string, option: any) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
},
},
},
{
field: 'ctnOwner',
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: true,
filterOption: (input: string, option: any) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
},
}
},
},
{
field: 'ctnSourceId',
label: '箱来源',
component: 'ApiSelect',
colProps: { span: 6 },
defaultValue: '',
componentProps: ({ formModel }) => {
return {
api: () => {
return new Promise((resolve) => {
getDictOption('CM_CtnSource').then((res) => {
resolve(res)
})
})
},
labelField: 'label',
valueField: 'value',
resultField: 'data',
filterOption: (input: string, option: any) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
},
onChange: (v, obj) => {},
}
},
},
{
label: '',
field: 'ctnBizState',
component: 'Input',
defaultValue: '',
show: false,
},
{
field: 'ctnBizStateId',
label: '箱业务状态',
component: 'ApiSelect',
colProps: { span: 6 },
defaultValue: '',
componentProps: ({ formModel }) => {
return {
api: () => {
return new Promise((resolve) => {
getDictOption('CM_CtnBizState').then((res) => {
resolve(res)
})
})
},
labelField: 'label',
valueField: 'value',
resultField: 'data',
filterOption: (input: string, option: any) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
},
onChange: (v, obj) => {
formModel.ctnBizState = obj.label
},
}
},
},
{
field: 'billno',
label: '箱业务编号',
component: 'Input',
colProps: { span: 6 },
},
{
field: 'ctnReleaseNo',
label: '关联合同号',
component: 'Input',
colProps: { span: 6 },
// required: true,
},
{
field: 'ctnStateId',
label: '箱状态',
component: 'ApiSelect',
colProps: { span: 6 },
defaultValue: '',
componentProps: ({ formModel }) => {
return {
api: () => {
return new Promise((resolve) => {
getDictOption('CM_CtnState').then((res) => {
resolve(res)
})
})
},
labelField: 'label',
valueField: 'value',
resultField: 'data',
filterOption: (input: string, option: any) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
},
onChange: (v, obj) => {},
}
},
},
{
field: 'ctnBreakState',
label: '箱损坏',
component: 'Input',
colProps: { span: 6 },
},
{
field: 'isHeavy',
label: '空重箱',
component: 'Switch',
defaultValue: false,
colProps: { span: 6 },
componentProps: {
checkedChildren: '重箱',
unCheckedChildren: '空箱',
},
},
{
label: '',
field: 'portLoadCode',
component: 'Input',
defaultValue: '',
show: false,
},
{
label: '',
field: 'portLoad',
component: 'Input',
defaultValue: '',
show: false,
},
{
field: 'portLoadid',
label: '始发港',
component: 'ApiSelect',
colProps: { span: 6 },
required: false,
componentProps: ({ formModel }) => {
return {
option: optionsStore.getOptionsByCode('GetClientPortSelectList'),
labelField: 'portName',
valueField: 'id',
resultField: 'data',
filterOption: (input: string, option: any) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
},
onChange: (v, obj) => {
console.log(v, obj)
formModel.portLoad = obj?.label || ''
formModel.portLoadCode = obj?.ediCode || ''
},
}
},
},
{
label: '',
field: 'portDeliveryCode',
component: 'Input',
defaultValue: '',
show: false,
},
{
label: '',
field: 'portDelivery',
component: 'Input',
defaultValue: '',
show: false,
},
{
field: 'portDeliveryid',
label: '目的港',
component: 'ApiSelect',
colProps: { span: 6 },
required: false,
componentProps: ({ formModel }) => {
return {
option: optionsStore.getOptionsByCode('GetClientPortSelectList'),
labelField: 'portName',
valueField: 'id',
resultField: 'data',
filterOption: (input: string, option: any) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
},
onChange: (v, obj) => {
console.log(v, obj)
formModel.portDelivery = obj?.label || ''
formModel.portDeliveryCode = obj?.ediCode || ''
},
}
},
},
{
label: '',
field: 'portDischargeCode',
component: 'Input',
defaultValue: '',
show: false,
},
{
label: '',
field: 'portDischarge',
component: 'Input',
defaultValue: '',
show: false,
},
{
field: 'portDischargeid',
label: '预抵港',
component: 'ApiSelect',
colProps: { span: 6 },
required: false,
componentProps: ({ formModel }) => {
return {
option: optionsStore.getOptionsByCode('GetClientPortSelectList'),
labelField: 'portName',
valueField: 'id',
resultField: 'data',
filterOption: (input: string, option: any) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
},
onChange: (v, obj) => {
console.log(v, obj)
formModel.portDischarge = obj?.label || ''
formModel.portDischargeCode = obj?.ediCode || ''
},
}
},
},
{
label: '',
field: 'port',
component: 'Input',
defaultValue: '',
show: false,
},
{
field: 'portid',
label: '当前港口',
component: 'ApiSelect',
colProps: { span: 6 },
required: false,
componentProps: ({ formModel }) => {
return {
option: optionsStore.getOptionsByCode('GetClientPortSelectList'),
labelField: 'portName',
valueField: 'id',
resultField: 'data',
filterOption: (input: string, option: any) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
},
onChange: (v, obj) => {
formModel.port = obj?.label || ''
},
}
},
},
{ {
field: 'depot', title: '箱号',
label: '码头或场站', dataIndex: 'cntrno',
component: 'ApiSelect', sorter: true,
colProps: { span: 6 }, width: 150,
required: false,
componentProps: ({}) => {
return {
option: optionsStore.getOptionsByCode('GetYardClientList'),
labelField: 'shortName',
valueField: 'shortName',
resultField: 'data',
filterOption: (input: string, option: any) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
},
}
},
}, },
{ {
field: 'vessel', title: '箱型',
label: '船名', dataIndex: 'ctnall',
component: 'Input', sorter: true,
colProps: { span: 6 }, width: 150,
}, },
{ {
field: 'Voyno', title: '合同号',
label: '航次', dataIndex: 'ctnReleaseNo',
component: 'Input', sorter: true,
colProps: { span: 6 }, width: 200,
}, },
{ {
label: '', title: '提箱日期',
field: 'ctnall', dataIndex: 'pickupDate',
component: 'Input', sorter: true,
defaultValue: '', width: 200,
show: false,
}, },
{ {
field: 'ctnCode', title: '当前状态',
label: '箱型', dataIndex: 'ctnFlowState',
component: 'ApiSelect', sorter: true,
colProps: { span: 6 }, width: 200,
componentProps: ({ formModel }) => {
return {
api: GetCtnSelectList,
labelField: 'ctnName',
valueField: 'ediCode',
resultField: 'data',
onChange: (e, obj) => {
if (e && obj) {
formModel.ctnall = obj.label
}
if (!e && !obj) {
formModel.ctnall = ''
}
},
}
},
}, },
{ {
field: 'mblno', title: '箱生产日期',
label: '提单号', dataIndex: 'productionDate',
component: 'Input', sorter: true,
colProps: { span: 6 }, width: 200,
}, },
{ {
label: '', title: '箱皮重',
field: 'customerName', dataIndex: 'ctnWeight',
component: 'Input', sorter: true,
defaultValue: '', width: 200,
show: false,
}, },
{ {
label: '业务委托单位', title: '原始价格',
field: 'customerId', dataIndex: 'ctnValue_Base',
component: 'ApiSelect', sorter: true,
required: false, width: 200,
dynamicDisabled: false,
colProps: { span: 6 },
componentProps: ({ formModel }) => {
return {
option: optionsStore.getOptionsByCode('GetControllerClientList'),
labelField: 'shortName',
valueField: 'codeName',
resultField: 'data',
filterOption: (input: string, option: any) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
},
onChange: (v, obj) => {
formModel.customerName = obj?.label || ''
},
}
},
}, },
{ {
field: 'etd', title: '购入成本',
label: 'ETD', dataIndex: 'ctnValue_BuyingPrice',
component: 'DatePicker', sorter: true,
colProps: { span: 6 }, width: 200,
defaultValue: '',
componentProps: {
showTime: true,
style: 'width:100%',
},
}, },
{ {
field: 'eta', title: '卖出价格',
label: 'ETA', dataIndex: 'ctnValue_SellPrice',
component: 'DatePicker', sorter: true,
colProps: { span: 6 }, width: 200,
defaultValue: '',
componentProps: {
showTime: true,
style: 'width:100%',
},
}, },
{ {
field: 'changeTime', title: '提箱港口',
label: '状态时间', dataIndex: 'pickupPort',
component: 'DatePicker', sorter: true,
colProps: { span: 6 }, width: 200,
defaultValue: '',
componentProps: {
showTime: true,
style: 'width:100%',
},
}, },
{ {
field: 'ctnWeight', title: '当前港口',
label: '箱皮重', dataIndex: 'port',
component: 'InputNumber', sorter: true,
colProps: { span: 6 }, width: 200,
}, },
{ {
field: 'ctnValue_Base', title: '备注',
label: '箱初期成本', dataIndex: 'remark',
component: 'InputNumber', sorter: true,
colProps: { span: 6 }, width: 200,
}, },
] ]

@ -1,119 +1,159 @@
<template> <template>
<div> <div class="OfflineAudit">
<BasicTable class="ds-table" @register="registerTableTop"> </BasicTable> <div>
<BasicTable class="ds-table" @register="registerTableBotton"> </BasicTable> <BasicTable class="ds-table" @register="registerTableTop"> </BasicTable>
</div>
<div>
<a-button type="link" @click="FnAudit(true, 'confirm')">
<span class="iconfont icon-yiwancheng2-copy" :style="{ fontSize: '13px' }"></span>
整票审核通过
</a-button>
<a-button type="link" @click="FnAudit(false, 'confirm')">
<span class="iconfont icon-yiwancheng2-copy" :style="{ fontSize: '13px' }"></span>
选中审核通过
</a-button>
<a-button type="link" @click="FnAudit(true, 'cancel')">
<span class="iconfont icon-bohui-01" :style="{ fontSize: '13px' }"></span>
整票驳回
</a-button>
<a-button type="link" @click="FnAudit(false, 'cancel')">
<span class="iconfont icon-bohui-01" :style="{ fontSize: '13px' }"></span>
驳回选中行
</a-button>
</div>
<div>
<BasicTable class="ds-table" @register="registerTableBotton"> </BasicTable>
</div>
</div> </div>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { ref } from 'vue'
import { BasicTable, useTable } from '/@/components/Table' import { BasicTable, useTable } from '/@/components/Table'
import { ApiChangeList, ApiChangeDel } from './api' import { ApiList, ApiDetailList, ApiConfirm, ApiCancel } from './api'
import { columns, searchFormSchema } from './columns' import { columns, searchFormSchema, detailColumns } from './columns'
import { useMessage } from '/@/hooks/web/useMessage' import { useMessage } from '/@/hooks/web/useMessage'
const { notification } = useMessage() const { notification } = useMessage()
// //
import { formatParams } from '/@/hooks/web/common' import { formatParams } from '/@/hooks/web/common'
const [registerTableTop, { reload, getForm, getSelectRows }] = useTable({ const [registerTableTop, { reload, clearSelectedRowKeys, getSelectRows }] = useTable({
title: '', title: '',
api: async (p) => { api: async (p) => {
if (p.queryCondition == '[]') { clearSelectedRowKeys()
notification.warning({ message: '请输入查询条件!', duration: 3 }) getSelectRowsBotton()
} else { const res: API.DataResult = await ApiList(p)
const res: API.DataResult = await ApiChangeList(p) return new Promise((resolve) => {
res.data.forEach((item, index) => { resolve({ data: [...res.data], total: res.count })
item.index = index + 1 })
})
return new Promise((resolve) => {
resolve({ data: [...res.data], total: res.count })
})
}
}, },
beforeFetch: (p) => { beforeFetch: (p) => {
let Rdata = formatParams(p) let Rdata = formatParams(p)
if (!!p.cntrno) { let data = JSON.parse(Rdata.queryCondition)
let data = JSON.parse(Rdata.queryCondition) data.forEach((item) => {
data.forEach((item, index) => { if (item.FieldName == 'cntrnoall') {
if (item.FieldName == 'cntrno') { item.FieldValue = item.FieldValue.replace(/ {1,}/g, ',')
item.FieldValue = item.FieldValue.replace(/ {1,}/g, ',') item.FieldValue = item.FieldValue.replace(/\n/g, ',')
item.FieldValue = item.FieldValue.replace(/\n/g, ',') item.ConditionalType = 15
item.ConditionalType = 15 }
} })
}) Rdata.queryCondition = JSON.stringify(data)
Rdata.queryCondition = JSON.stringify(data)
}
return Rdata return Rdata
}, },
columns, columns,
rowSelection: { type: 'checkbox' }, rowSelection: {
type: 'radio',
onChange: () => {
reloadBotton()
},
},
formConfig: { formConfig: {
labelWidth: 120, labelWidth: 120,
schemas: searchFormSchema, schemas: searchFormSchema,
}, },
isTreeTable: false,
pagination: true, pagination: true,
striped: true, striped: true,
useSearchForm: true, useSearchForm: true,
showTableSetting: true, showTableSetting: false,
bordered: true, bordered: true,
showIndexColumn: true, showIndexColumn: true,
indexColumnProps: { indexColumnProps: {
width: 60, width: 60,
}, },
canResize: true, canResize: true,
resizeHeightOffset: 35, resizeHeightOffset: 335,
immediate: false, immediate: true,
}) })
const [ const [registerTableBotton, { reload: reloadBotton, getSelectRows: getSelectRowsBotton }] =
registerTableBotton, useTable({
{ reload: reloadBotton, getForm: getFormBotton, getSelectRows: getSelectRowsBotton }, title: '',
] = useTable({ api: async (p) => {
title: '', const res: API.DataResult = await ApiDetailList(p)
api: async (p) => {
if (p.queryCondition == '[]') {
notification.warning({ message: '请输入查询条件!', duration: 3 })
} else {
const res: API.DataResult = await ApiChangeList(p)
res.data.forEach((item, index) => {
item.index = index + 1
})
return new Promise((resolve) => { return new Promise((resolve) => {
resolve({ data: [...res.data], total: res.count }) resolve({ data: [...res.data], total: res.count })
}) })
},
beforeFetch: (p) => {
p['Pid'] = getSelectRows()[0].id
return formatParams(p)
},
columns: detailColumns,
rowSelection: { type: 'checkbox' },
pagination: true,
striped: true,
useSearchForm: false,
showTableSetting: false,
bordered: true,
showIndexColumn: true,
indexColumnProps: {
width: 60,
},
canResize: true,
resizeHeightOffset: 35,
immediate: false,
})
async function FnAudit(type, state) {
let ApiData: any = {
id: '',
ids: [],
}
if (type) {
if (getSelectRows()[0].id) {
ApiData.id = getSelectRows()[0].id
} else {
notification.warning({ message: '请选择一条数据', duration: 3 })
} }
}, } else {
beforeFetch: (p) => { if (getSelectRowsBotton().length) {
let Rdata = formatParams(p) getSelectRowsBotton().forEach((item) => {
if (!!p.cntrno) { ApiData.ids.push(item.id)
let data = JSON.parse(Rdata.queryCondition)
data.forEach((item, index) => {
if (item.FieldName == 'cntrno') {
item.FieldValue = item.FieldValue.replace(/ {1,}/g, ',')
item.FieldValue = item.FieldValue.replace(/\n/g, ',')
item.ConditionalType = 15
}
}) })
Rdata.queryCondition = JSON.stringify(data) ApiData.id = getSelectRows()[0].id
} else {
notification.warning({ message: '请至少选择一条数据', duration: 3 })
} }
return Rdata }
}, let res: any = state == 'confirm' ? await ApiConfirm(ApiData) : await ApiCancel(ApiData)
columns, if (res.succeeded) {
rowSelection: { type: 'checkbox' }, notification.success({ message: res.message, duration: 3 })
// formConfig: { console.log(type)
// labelWidth: 120,
// schemas: searchFormSchema, if (type) {
// }, reload()
isTreeTable: false, } else {
pagination: true, reloadBotton()
striped: true, }
useSearchForm: false, }
showTableSetting: false, }
bordered: true,
showIndexColumn: true,
indexColumnProps: {
width: 60,
},
canResize: true,
resizeHeightOffset: 35,
immediate: false,
})
</script> </script>
<style lang="less" scoped>
.OfflineAudit {
height: 100%;
> div {
&:nth-child(1) {
height: 60%;
}
&:nth-child(3) {
height: calc(40% - 32px);
}
}
}
</style>

@ -110,7 +110,8 @@
<!-- 运踪 --> <!-- 运踪 -->
<template v-if="column.dataIndex == 'bookStatus'"> <template v-if="column.dataIndex == 'bookStatus'">
<div> <div>
<span @click="checkBookStatus(record.id)" style="cursor: pointer; color: rgb(7, 231, 56);" class="iconfont icon-refresh-1-copy"></span> <span @click="checkBookStatus(record.id)" style="cursor: pointer; color: rgb(7, 231, 56);"
class="iconfont icon-refresh-1-copy"></span>
<span v-for="(item, index) in record.bookingStatus" :key="item.id"> <span v-for="(item, index) in record.bookingStatus" :key="item.id">
<a-tooltip placement="top" v-if="item.statusTime"> <a-tooltip placement="top" v-if="item.statusTime">
<template #title>{{ item.statusTime }}</template> <template #title>{{ item.statusTime }}</template>
@ -127,11 +128,11 @@
<!-- 提箱返场 --> <!-- 提箱返场 -->
<template v-if="column.dataIndex == 'statusLog'"> <template v-if="column.dataIndex == 'statusLog'">
<div v-if="record.statusLog" class="txfc"> <div v-if="record.statusLog" class="txfc">
<div v-if="record.statusLog.length > 0"> <div >
<div class="billtrace-btn1 txfc" style="display: flex; align-items: center"> <div class="billtrace-btn1 txfc" style="display: flex; align-items: center">
<i style="cursor: pointer; color: rgb(7, 231, 56); margin-right: 5px" @click="handleRefshYard(record.id)" <i style="cursor: pointer; color: rgb(7, 231, 56); margin-right: 5px"
class="iconfont icon-refresh-1-copy"></i> @click="handleRefshYard(record.id)" class="iconfont icon-refresh-1-copy"></i>
<a-popover trigger="click"> <a-popover v-if="record.statusLog.length > 0">
<template #content> <template #content>
<div> <div>
<span class="txfcSpan" style="width: 120px">箱号</span> <span class="txfcSpan" style="width: 120px">箱号</span>
@ -151,7 +152,7 @@
返场 返场
</span> </span>
</a-popover> </a-popover>
<span style="margin-left: 5px">未提{{ record.txOpNumber }}/{{ record.statusLog.length }}</span> <span v-if="record.statusLog.length > 0" style="margin-left: 5px">{{ record.txopNumber }}/{{ record.statusLog.length }}</span>
</div> </div>
</div> </div>
</div> </div>
@ -326,7 +327,7 @@ import { useMessage } from '/@/hooks/web/useMessage'
import { formatTableData } from '/@/hooks/web/common' import { formatTableData } from '/@/hooks/web/common'
import { updateTableField } from '/@/hooks/component/costomForm' import { updateTableField } from '/@/hooks/component/costomForm'
const lstDraftCompareRlt = defineAsyncComponent(() => import("../../../components/lstDraftCompareRlt/index.vue")) const lstDraftCompareRlt = defineAsyncComponent(() => import("../../../components/lstDraftCompareRlt/index.vue"))
import { RefreshYGT,RefreshYard } from './api/BookingLedger.js' import { RefreshYGT, RefreshYard } from './api/BookingLedger.js'
import { useI18n } from '/@/hooks/web/useI18n' import { useI18n } from '/@/hooks/web/useI18n'
const { t } = useI18n() const { t } = useI18n()
import { useAppStore } from '/@/store/modules/app' import { useAppStore } from '/@/store/modules/app'
@ -468,6 +469,15 @@ const [registerTable, { reload, getVxeSelectRows, setLoading }] = useTable({
}) })
}) })
} }
if (item.statusLog.length > 0) {
let num1 = item.statusLog.length
item.statusLog.forEach((item) => {
if (item.txOpTime) {
num1 -= 1
}
})
item.txopNumber = num1
}
item.bookingStatus = bookstatus item.bookingStatus = bookstatus
}) })
if (res?.data?.list) { if (res?.data?.list) {
@ -615,6 +625,8 @@ const handleRefshYard = (id) => {
RefreshYard({ ids: [id], businessType: 1 }).then(res => { RefreshYard({ ids: [id], businessType: 1 }).then(res => {
reload() reload()
setLoading(false) setLoading(false)
}).catch(()=>{
setLoading(false)
}) })
} }
const isAdvancedQuery = ref(false) const isAdvancedQuery = ref(false)

@ -868,3 +868,17 @@ export function GetChildTaskList(data) {
}) })
} }
export function GetCreateTaskConfigList() {
return request<DataResult>({
url: '/taskApi/TaskManage/GetCreateTaskConfigList',
method: 'get',
})
}
export function SaveCreateTaskConfig(data) {
return request<DataResult>({
url: '/taskApi/TaskManage/SaveCreateTaskConfig',
data: data,
method: 'post',
})
}

@ -1,67 +1,77 @@
<template> <template>
<div class="main"> <div class="main">
<div class="title"> <div class="title">
<div> 船公司</div> <a-tabs @change="handleChange" v-model:activeKey="activeKey">
<a-select size="small" @change="handleChangeSearch" v-model:value="carrierId" style="width: 180px;margin-right: 20px"> <a-tab-pane key="1" tab="任务分配"></a-tab-pane>
<a-select-option v-for="item in carrierList" :key="item.carrierId" :value="item.carrierId">{{ <a-tab-pane key="2" tab="任务生成"></a-tab-pane>
item.carrier </a-tabs>
}}</a-select-option>
</a-select>
</div> </div>
<a-spin :spinning="loading">
<div class="list">
<div title="操作" class="card">
<div class="left">
<div class="card-title"> 操作<i @click="handleEdit('Operator')"
class="icon-piliangbianji iconfont"></i>
</div>
<div class="taskTypeList">
<div class="taskType" v-for="(item, index) in roleTaskData.operatorTaskTypeList"
:key="index">{{
item.taskTypeName }}
</div>
</div>
</div> <div v-if="activeKey == '1'">
<div class="right"> <a-spin :spinning="loading">
<img src="../img/操作.png" alt=""> <div style="padding-left: 20px;margin-top: 20px">
</div> <div> 船公司</div>
<a-select size="small" @change="handleChangeSearch" v-model:value="carrierId"
style="width: 180px;margin-right: 20px">
<a-select-option v-for="item in carrierList" :key="item.carrierId" :value="item.carrierId">{{
item.carrier
}}</a-select-option>
</a-select>
</div> </div>
<div title="单证" class="card"> <div class="list">
<div class="left"> <div title="操作" class="card">
<div class="card-title"> 单证<i @click="handleEdit('VouchingClerk')" <div class="left">
class="icon-piliangbianji iconfont"></i> <div class="card-title"> 操作<i @click="handleEdit('Operator')"
</div> class="icon-piliangbianji iconfont"></i>
<div class="taskTypeList"> </div>
<div class="taskType" v-for="(item, index) in roleTaskData.vouchingClerkTaskTypeList" <div class="taskTypeList">
:key="index"> <div class="taskType" v-for="(item, index) in roleTaskData.operatorTaskTypeList"
{{ :key="index">{{
item.taskTypeName }} item.taskTypeName }}
</div>
</div> </div>
</div>
</div>
<div class="right">
<img src="../img/单证.png" alt="">
</div>
</div>
<div title="销售" class="card">
<div class="left">
<div class="card-title"> 销售<i @click="handleEdit('Sale')"
class="icon-piliangbianji iconfont"></i>
</div> </div>
<div class="taskTypeList"> <div class="right">
<div class="taskType" v-for="(item, index) in roleTaskData.saleTaskTypeList" :key="index">{{ <img src="../img/操作.png" alt="">
item.taskTypeName }}
</div>
</div> </div>
</div>
<div title="单证" class="card">
<div class="left">
<div class="card-title"> 单证<i @click="handleEdit('VouchingClerk')"
class="icon-piliangbianji iconfont"></i>
</div>
<div class="taskTypeList">
<div class="taskType" v-for="(item, index) in roleTaskData.vouchingClerkTaskTypeList"
:key="index">
{{
item.taskTypeName }}
</div>
</div>
</div>
<div class="right">
<img src="../img/单证.png" alt="">
</div>
</div> </div>
<div class="right"> <div title="销售" class="card">
<img src="../img/销售.png" alt=""> <div class="left">
<div class="card-title"> 销售<i @click="handleEdit('Sale')"
class="icon-piliangbianji iconfont"></i>
</div>
<div class="taskTypeList">
<div class="taskType" v-for="(item, index) in roleTaskData.saleTaskTypeList"
:key="index">{{
item.taskTypeName }}
</div>
</div>
</div>
<div class="right">
<img src="../img/销售.png" alt="">
</div>
</div> </div>
</div> <!-- <div title="报关员" class="card">
<!-- <div title="报关员" class="card">
<div class="card-title"> <i @click="handleEdit('Custom')" class="icon-piliangbianji iconfont"></i> </div> <div class="card-title"> <i @click="handleEdit('Custom')" class="icon-piliangbianji iconfont"></i> </div>
<div class="taskType" v-for="(item, index) in roleTaskData.customTaskTypeList" :key="index">{{ <div class="taskType" v-for="(item, index) in roleTaskData.customTaskTypeList" :key="index">{{
item.taskTypeName }} item.taskTypeName }}
@ -73,24 +83,24 @@
item.taskTypeName }} item.taskTypeName }}
</div> </div>
</div> --> </div> -->
<div title="客服" class="card"> <div title="客服" class="card">
<div class="left"> <div class="left">
<div class="card-title"> 客服<i @click="handleEdit('CustomerService')" <div class="card-title"> 客服<i @click="handleEdit('CustomerService')"
class="icon-piliangbianji iconfont"></i> class="icon-piliangbianji iconfont"></i>
</div> </div>
<div class="taskTypeList"> <div class="taskTypeList">
<div class="taskType" v-for="(item, index) in roleTaskData.customerServiceTaskTypeList" <div class="taskType" v-for="(item, index) in roleTaskData.customerServiceTaskTypeList"
:key="index">{{ :key="index">{{
item.taskTypeName }} item.taskTypeName }}
</div>
</div> </div>
</div>
</div>
<div class="right">
<img src="../img/客服.png" alt="">
</div>
</div> </div>
<div class="right"> <!-- <div title="司机" class="card">
<img src="../img/客服.png" alt="">
</div>
</div>
<!-- <div title="司机" class="card">
<div class="card-title"> <i @click="handleEdit('Driver')" class="icon-piliangbianji iconfont"></i> </div> <div class="card-title"> <i @click="handleEdit('Driver')" class="icon-piliangbianji iconfont"></i> </div>
<div class="taskType" v-for="(item, index) in roleTaskData.driverTaskTypeList" :key="index">{{ <div class="taskType" v-for="(item, index) in roleTaskData.driverTaskTypeList" :key="index">{{
item.taskTypeName }} item.taskTypeName }}
@ -102,8 +112,20 @@
item.taskTypeName }} item.taskTypeName }}
</div> </div>
</div> --> </div> -->
</div> </div>
</a-spin> </a-spin>
</div>
<div v-if="activeKey == '2'">
<a-spin :spinning="loading">
<div class="type-list">
<div class="type" v-for="(item, index) in taskTypeList" :key="index">
<span class="text"> {{ item.taskTypeName }}</span>
<a-switch @change="handleChangeSwitch($event, item)" size="small"
v-model:checked="item.isCreate" />
</div>
</div>
</a-spin>
</div>
@ -115,7 +137,7 @@
<a-select @change="handleChangeCarrier" v-model:value="carrierIdAll" style="width: 180px"> <a-select @change="handleChangeCarrier" v-model:value="carrierIdAll" style="width: 180px">
<a-select-option v-for="item in carrierListAll" :key="item.id" :value="item.id">{{ <a-select-option v-for="item in carrierListAll" :key="item.id" :value="item.id">{{
item.shortName item.shortName
}}</a-select-option> }}</a-select-option>
</a-select> </a-select>
</div> </div>
<div> <div>
@ -123,7 +145,7 @@
<a-select mode="multiple" v-model:value="taskTypeCode" style="width: 500px"> <a-select mode="multiple" v-model:value="taskTypeCode" style="width: 500px">
<a-select-option v-for="item in taskType" :key="item.code" :value="item.code">{{ <a-select-option v-for="item in taskType" :key="item.code" :value="item.code">{{
item.name item.name
}}</a-select-option> }}</a-select-option>
</a-select> </a-select>
</div> </div>
</div> </div>
@ -133,12 +155,8 @@
</template> </template>
<script lang="ts" setup name="任务分配"> <script lang="ts" setup name="任务分配">
import { ref, onMounted } from 'vue' import { ref, onMounted } from 'vue'
import { useRouter, useRoute } from 'vue-router'
import pdf from '../components/pdf.vue'
import taskData from '../components/taskData.vue'
import taskButton from '../components/taskButton.vue'
import { GetCarrierlist } from '/@/views/operation/seaexport/api/BookingLedger' import { GetCarrierlist } from '/@/views/operation/seaexport/api/BookingLedger'
import { GetTaskPlatEnumDict, TaskAllocationSave, TaskAllocationGetList, GetContainsCarrierList } from '../api' import { GetTaskPlatEnumDict, TaskAllocationSave, TaskAllocationGetList, GetContainsCarrierList, GetCreateTaskConfigList, SaveCreateTaskConfig } from '../api'
import { useMessage } from '../../../hooks/web/useMessage' import { useMessage } from '../../../hooks/web/useMessage'
const { createMessage } = useMessage() const { createMessage } = useMessage()
const open = ref(false) const open = ref(false)
@ -146,6 +164,7 @@ const carrierIdAll = ref('')
const roleType = ref('') const roleType = ref('')
const taskSaveLoad = ref(false) const taskSaveLoad = ref(false)
const loading = ref(false) const loading = ref(false)
const activeKey = ref('1')
function handleEdit(type) { function handleEdit(type) {
open.value = true open.value = true
roleType.value = type roleType.value = type
@ -234,7 +253,33 @@ function handleSave() {
}) })
}) })
} }
function handleChangeSearch(){ const taskTypeList = ref([]) as any
function handleChange(val) {
if (val == 2) {
loading.value = true
GetCreateTaskConfigList().then(res => {
if (res.succeeded) {
taskTypeList.value = res.data
}
loading.value = false
})
}
}
function handleChangeSwitch(e, val) {
const formData = new FormData()
formData.append('taskTypeCode', val.taskTypeCode)
formData.append('isCreate', e)
loading.value = true
SaveCreateTaskConfig(formData).then(res => {
if (res.succeeded) {
createMessage.success('保存成功')
}
loading.value = false
}).catch(() => {
loading.value = false
})
}
function handleChangeSearch() {
searchInfo() searchInfo()
carrierIdAll.value = carrierId.value carrierIdAll.value = carrierId.value
} }
@ -293,7 +338,7 @@ function searchInfo() {
.title { .title {
background: rgba(245, 249, 252, 1); background: rgba(245, 249, 252, 1);
padding: 15px 25px; padding-left: 20px;
div { div {
font-size: 12px; font-size: 12px;
@ -353,4 +398,25 @@ function searchInfo() {
} }
} }
} }
:deep(.ant-tabs-top > .ant-tabs-nav) {
margin: 0px !important;
}
.type-list {
display: flex;
flex-wrap: wrap;
padding: 0 40px;
margin-top: 20px;
.type {
width: 15%;
margin-bottom: 10px;
}
.text {
font-size: 12px;
margin-right: 10px;
}
}
</style> </style>
Loading…
Cancel
Save