租箱月结账单
parent
55c8acc741
commit
74d5041711
@ -0,0 +1,118 @@
|
||||
// @ts-ignore
|
||||
import { request } from '/@/utils/request'
|
||||
import { DataResult, PageRequest } from '/@/api/model/baseModel'
|
||||
enum Api {
|
||||
list = '/containerManagementApi/CM_CustFeeDui/GetCM_CustFeeDuiList',
|
||||
edit = '/containerManagementApi/CM_CustFeeDui/EditCM_CustFeeDui',
|
||||
info = '/containerManagementApi/CM_CustFeeDui/GetCM_CustFeeDui',
|
||||
del = '/containerManagementApi/CM_CustFeeDui/DeleteCM_CustFeeDui',
|
||||
|
||||
listDetail = '/containerManagementApi/CM_CustFeeDui_Detail/GetCM_CustFeeDui_DetailList',
|
||||
// editDetail = '/containerManagementApi/CM_RentIn_Detail/EditCM_RentIn_Detail',
|
||||
delDetail = '/containerManagementApi/CM_CustFeeDui_Detail/DeleteCM_CustFeeDui_Detail',
|
||||
|
||||
// Confirm = '/containerManagementApi/CM_RentIn/CM_RentIn_Confirm',
|
||||
// Cancel = '/containerManagementApi/CM_RentIn/CM_RentIn_Cancel',
|
||||
// MakeFee = '/containerManagementApi/CM_RentIn/CM_RentIn_MakeFee',
|
||||
|
||||
DetailView = '/containerManagementApi/CM_CustFeeDui/GetVW_CM_FeeBase_Detail',
|
||||
AddCtn = '/containerManagementApi/CM_CustFeeDui/AddVW_CM_FeeBase_Detail',
|
||||
|
||||
}
|
||||
// 租箱租入明细视图 (Auth)
|
||||
export function ApiDetailView(data: PageRequest) {
|
||||
return request<DataResult>({
|
||||
url: Api.DetailView,
|
||||
method: 'post',
|
||||
data,
|
||||
})
|
||||
}
|
||||
// 租箱租入退租_添加 (Auth)
|
||||
export function ApiAddCtn(data: PageRequest) {
|
||||
return request<DataResult>({
|
||||
url: Api.AddCtn,
|
||||
method: 'post',
|
||||
data,
|
||||
})
|
||||
}
|
||||
// 租箱租入_生成费用 (Auth)
|
||||
export function ApiMakeFee(data: PageRequest) {
|
||||
return request<DataResult>({
|
||||
url: Api.MakeFee,
|
||||
method: 'post',
|
||||
data,
|
||||
})
|
||||
}
|
||||
// 租箱租入_确认 (Auth)
|
||||
export function ApiConfirm(data: PageRequest) {
|
||||
return request<DataResult>({
|
||||
url: Api.Confirm,
|
||||
method: 'post',
|
||||
data,
|
||||
})
|
||||
}
|
||||
// 租箱租入_取消 (Auth)
|
||||
export function ApiCancel(data: PageRequest) {
|
||||
return request<DataResult>({
|
||||
url: Api.Cancel,
|
||||
method: 'post',
|
||||
data,
|
||||
})
|
||||
}
|
||||
// 列表 (Auth)
|
||||
export function ApiList(data: PageRequest) {
|
||||
return request<DataResult>({
|
||||
url: Api.list,
|
||||
method: 'post',
|
||||
data,
|
||||
})
|
||||
}
|
||||
// 编辑 (Auth)
|
||||
export function ApiEdit(data: PageRequest) {
|
||||
return request<DataResult>({
|
||||
url: Api.edit,
|
||||
method: 'post',
|
||||
data,
|
||||
})
|
||||
}
|
||||
// 详情 (Auth)
|
||||
export function ApiInfo(query) {
|
||||
return request<DataResult>({
|
||||
url: Api.info,
|
||||
method: 'get',
|
||||
params: query,
|
||||
})
|
||||
}
|
||||
// 删除 (Auth)
|
||||
export function ApiDel(data: PageRequest) {
|
||||
return request<DataResult>({
|
||||
url: Api.del,
|
||||
method: 'post',
|
||||
data,
|
||||
})
|
||||
}
|
||||
|
||||
// 列表详情 (Auth)
|
||||
export function ApiListDetail(data: PageRequest) {
|
||||
return request<DataResult>({
|
||||
url: Api.listDetail,
|
||||
method: 'post',
|
||||
data,
|
||||
})
|
||||
}
|
||||
// // 编辑详情 (Auth)
|
||||
// export function ApiEditDetail(data: PageRequest) {
|
||||
// return request<DataResult>({
|
||||
// url: Api.editDetail,
|
||||
// method: 'post',
|
||||
// data,
|
||||
// })
|
||||
// }
|
||||
// 删除详情 (Auth)
|
||||
export function ApiDelDetail(data: PageRequest) {
|
||||
return request<DataResult>({
|
||||
url: Api.delDetail,
|
||||
method: 'post',
|
||||
data,
|
||||
})
|
||||
}
|
@ -0,0 +1,402 @@
|
||||
import { ref } from 'vue'
|
||||
import { BasicColumn, FormSchema } from '/@/components/Table'
|
||||
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'
|
||||
// 下拉数据
|
||||
import { getOptions } from '/@/hooks/dict'
|
||||
const optionsStore = useOptionsStore()
|
||||
// 字典
|
||||
import { getDictOption } from '/@/utils/dictUtil'
|
||||
// 新旧箱数据
|
||||
const usedStateList = [
|
||||
{
|
||||
label: '',
|
||||
value: '',
|
||||
},
|
||||
{
|
||||
label: 'used',
|
||||
value: 'used',
|
||||
},
|
||||
{
|
||||
label: 'new',
|
||||
value: 'new',
|
||||
},
|
||||
]
|
||||
// 业务类型字典
|
||||
const businessTypeDict = ref([])
|
||||
getDictOption('CM_BusinessType').then((res) => {
|
||||
businessTypeDict.value = res
|
||||
})
|
||||
// 租箱类型字典
|
||||
const rentTypeIdDict = ref([])
|
||||
getDictOption('CM_RentType').then((res) => {
|
||||
rentTypeIdDict.value = res
|
||||
})
|
||||
|
||||
export const columns: BasicColumn[] = [
|
||||
{
|
||||
title: '租箱月结账单号',
|
||||
dataIndex: 'billno',
|
||||
sorter: true,
|
||||
width: 150,
|
||||
},
|
||||
{
|
||||
title: '客户名称',
|
||||
dataIndex: 'customerName',
|
||||
sorter: true,
|
||||
width: 150,
|
||||
},
|
||||
{
|
||||
title: '开始日期',
|
||||
dataIndex: 'billStartDate',
|
||||
sorter: true,
|
||||
width: 150,
|
||||
},
|
||||
{
|
||||
title: '结束日期',
|
||||
dataIndex: 'billEndDate',
|
||||
sorter: true,
|
||||
width: 150,
|
||||
},
|
||||
{
|
||||
title: '会计期间',
|
||||
dataIndex: 'accdate',
|
||||
sorter: true,
|
||||
width: 200,
|
||||
},
|
||||
{
|
||||
title: '总金额',
|
||||
dataIndex: 'amount',
|
||||
sorter: true,
|
||||
width: 150,
|
||||
},
|
||||
{
|
||||
title: '业务锁定',
|
||||
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: 'isFeeLocking',
|
||||
sorter: true,
|
||||
width: 200,
|
||||
customRender: ({ text }) => {
|
||||
if (text) {
|
||||
return <Tag color="success">是</Tag>
|
||||
} else {
|
||||
return <Tag color="error">否</Tag>
|
||||
}
|
||||
return text
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '费用状态??',
|
||||
dataIndex: 'billno',
|
||||
sorter: true,
|
||||
width: 150,
|
||||
},
|
||||
{
|
||||
title: '备注',
|
||||
dataIndex: 'remark',
|
||||
sorter: true,
|
||||
width: 200,
|
||||
},
|
||||
]
|
||||
|
||||
export const searchFormSchema: FormSchema[] = [
|
||||
{
|
||||
field: 'billno',
|
||||
label: '租箱业务号',
|
||||
component: 'Input',
|
||||
colProps: { span: 4 },
|
||||
},
|
||||
{
|
||||
field: 'oldContainerOwner',
|
||||
label: '原箱主',
|
||||
component: 'ApiSelect',
|
||||
required: false,
|
||||
dynamicDisabled: false,
|
||||
colProps: { span: 4 },
|
||||
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
|
||||
},
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
field: 'rentDirectId',
|
||||
label: '租箱业务',
|
||||
component: 'ApiSelect',
|
||||
colProps: { span: 4 },
|
||||
componentProps: ({}) => {
|
||||
return {
|
||||
api: () => {
|
||||
return new Promise((resolve) => {
|
||||
getDictOption('CM_RentDirect').then((res) => {
|
||||
let data: any = []
|
||||
res.forEach((item) => {
|
||||
item.value = parseInt(item.value)
|
||||
if (!item.label.indexOf('租入')) {
|
||||
data.push(item)
|
||||
}
|
||||
})
|
||||
resolve(data)
|
||||
})
|
||||
})
|
||||
},
|
||||
labelField: 'label',
|
||||
valueField: 'value',
|
||||
resultField: 'data',
|
||||
filterOption: (input: string, option: any) => {
|
||||
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
|
||||
},
|
||||
}
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'etd',
|
||||
label: 'ETD',
|
||||
component: 'DatePicker',
|
||||
colProps: { span: 4 },
|
||||
defaultValue: '',
|
||||
componentProps: {
|
||||
showTime: true,
|
||||
style: 'width:100%',
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'eta',
|
||||
label: 'ETA',
|
||||
component: 'DatePicker',
|
||||
colProps: { span: 4 },
|
||||
defaultValue: '',
|
||||
componentProps: {
|
||||
showTime: true,
|
||||
style: 'width:100%',
|
||||
},
|
||||
},
|
||||
]
|
||||
export const formSchema: FormSchema[] = [
|
||||
{
|
||||
label: '',
|
||||
field: 'id',
|
||||
component: 'Input',
|
||||
defaultValue: '',
|
||||
show: false,
|
||||
},
|
||||
{
|
||||
field: 'billno',
|
||||
label: '月结账单号',
|
||||
component: 'Input',
|
||||
colProps: { span: 6 },
|
||||
dynamicDisabled: ({}) => {
|
||||
return true
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'customerName',
|
||||
label: '客户名称',
|
||||
component: 'Input',
|
||||
colProps: { span: 6 },
|
||||
show: false,
|
||||
},
|
||||
{
|
||||
field: 'customerId',
|
||||
label: '客户名称',
|
||||
required: true,
|
||||
component: 'ApiSelect',
|
||||
colProps: { span: 6 },
|
||||
componentProps: ({ formModel }) => {
|
||||
return {
|
||||
api: () => {
|
||||
return new Promise((resolve) => {
|
||||
const arr = getOptions('custom')
|
||||
resolve(arr)
|
||||
})
|
||||
},
|
||||
labelField: 'shortName',
|
||||
valueField: 'codeName',
|
||||
resultField: 'data',
|
||||
filterOption: (input: string, option: any) => {
|
||||
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
|
||||
},
|
||||
onChange: (e, obj) => {
|
||||
if (obj) {
|
||||
formModel.customerName = obj.label
|
||||
formModel.customerId = obj.value
|
||||
} else {
|
||||
formModel.customerName = ''
|
||||
formModel.customerId = ''
|
||||
}
|
||||
},
|
||||
}
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'billStartDate',
|
||||
label: '开始日期',
|
||||
component: 'DatePicker',
|
||||
colProps: { span: 6 },
|
||||
defaultValue: '',
|
||||
required: true,
|
||||
componentProps: {
|
||||
showTime: false,
|
||||
allowClear: true,
|
||||
valueFormat: 'YYYY-MM-DD',
|
||||
format: 'YYYY-MM-DD',
|
||||
style: 'width:100%',
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'billEndDate',
|
||||
label: '结束日期',
|
||||
component: 'DatePicker',
|
||||
colProps: { span: 6 },
|
||||
defaultValue: '',
|
||||
required: true,
|
||||
componentProps: {
|
||||
showTime: false,
|
||||
allowClear: true,
|
||||
valueFormat: 'YYYY-MM-DD',
|
||||
format: 'YYYY-MM-DD',
|
||||
style: 'width:100%',
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'amount',
|
||||
label: '总金额',
|
||||
component: 'InputNumber',
|
||||
colProps: { span: 6 },
|
||||
defaultValue: '',
|
||||
dynamicDisabled: ({}) => {
|
||||
return true
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'accdate',
|
||||
label: '会计期间',
|
||||
component: 'MonthPicker',
|
||||
colProps: { span: 6 },
|
||||
defaultValue: '',
|
||||
componentProps: {
|
||||
showTime: true,
|
||||
allowClear: true,
|
||||
valueFormat: 'YYYY-MM',
|
||||
format: 'YYYY-MM',
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'isBusinessLocking',
|
||||
label: '业务锁定',
|
||||
component: 'Switch',
|
||||
defaultValue: false,
|
||||
colProps: { span: 6 },
|
||||
componentProps: {
|
||||
checkedChildren: '是',
|
||||
unCheckedChildren: '否',
|
||||
},
|
||||
dynamicDisabled: ({}) => {
|
||||
return true
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'isFeeLocking',
|
||||
label: '费用锁定',
|
||||
component: 'Switch',
|
||||
defaultValue: false,
|
||||
colProps: { span: 6 },
|
||||
componentProps: {
|
||||
checkedChildren: '是',
|
||||
unCheckedChildren: '否',
|
||||
},
|
||||
dynamicDisabled: ({}) => {
|
||||
return true
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'remark',
|
||||
label: '备注',
|
||||
component: 'Input',
|
||||
colProps: { span: 12 },
|
||||
},
|
||||
]
|
||||
|
||||
export const formSearchBoxSchema: FormSchema[] = [
|
||||
{
|
||||
field: 'oldContainerOwner',
|
||||
label: '原箱主',
|
||||
component: 'ApiSelect',
|
||||
required: 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
|
||||
},
|
||||
}
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'ctnall',
|
||||
label: '箱型',
|
||||
component: 'ApiSelect',
|
||||
required: false,
|
||||
|
||||
colProps: { span: 6 },
|
||||
componentProps: () => {
|
||||
return {
|
||||
allowClear: true,
|
||||
showSearch: true,
|
||||
api: GetCtnSelectList,
|
||||
params: { code: 'leasing' },
|
||||
labelField: 'ctnName',
|
||||
showName: 'ctnName',
|
||||
valueField: 'ctnName',
|
||||
resultField: 'data',
|
||||
immediate: false,
|
||||
filterOption: (input: string, option: any) => {
|
||||
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
|
||||
},
|
||||
}
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'cntrno',
|
||||
label: '箱号',
|
||||
component: 'Input',
|
||||
colProps: { span: 10 },
|
||||
},
|
||||
]
|
@ -0,0 +1,123 @@
|
||||
<template>
|
||||
<div>
|
||||
<BasicTable class="ds-table" @register="registerTable" @row-dbClick="handleAudit">
|
||||
<template #tableTitle>
|
||||
<a-button type="link" @click="handleCreate">
|
||||
<span class="iconfont icon-tianjia"></span>
|
||||
新建
|
||||
</a-button>
|
||||
<a-popconfirm
|
||||
title="确定删除当前选中数据?"
|
||||
ok-text="是"
|
||||
cancel-text="否"
|
||||
@confirm="handleDel"
|
||||
>
|
||||
<a-button type="link">
|
||||
<span class="iconfont icon-shanchu21"></span>
|
||||
删除
|
||||
</a-button>
|
||||
</a-popconfirm>
|
||||
</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, 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'
|
||||
import { useMessage } from '/@/hooks/web/useMessage'
|
||||
const { notification } = useMessage()
|
||||
// 引入处理入参方法
|
||||
import { formatParams } from '/@/hooks/web/common'
|
||||
const [registerModal, { openModal }] = useModal()
|
||||
const [registerTable, { reload, getSelectRows }] = useTable({
|
||||
title: '',
|
||||
api: async (p) => {
|
||||
const res: API.DataResult = await ApiList(p)
|
||||
return new Promise((resolve) => {
|
||||
resolve({ data: [...res.data], total: res.count })
|
||||
})
|
||||
},
|
||||
beforeFetch: (p) => {
|
||||
return formatParams(p)
|
||||
},
|
||||
columns,
|
||||
formConfig: {
|
||||
labelWidth: 120,
|
||||
schemas: searchFormSchema,
|
||||
},
|
||||
isTreeTable: false,
|
||||
pagination: true,
|
||||
striped: true,
|
||||
useSearchForm: true,
|
||||
showTableSetting: true,
|
||||
bordered: true,
|
||||
showIndexColumn: true,
|
||||
indexColumnProps: {
|
||||
width: 60,
|
||||
},
|
||||
canResize: true,
|
||||
resizeHeightOffset: 35,
|
||||
immediate: true,
|
||||
actionColumn: {
|
||||
width: 80,
|
||||
title: '操作',
|
||||
dataIndex: 'action',
|
||||
fixed: 'right',
|
||||
},
|
||||
})
|
||||
function handleCreate() {
|
||||
openModal(true, {
|
||||
isParent: false,
|
||||
isUpdate: false,
|
||||
})
|
||||
}
|
||||
|
||||
function handleDel() {
|
||||
const select = getSelectRows()
|
||||
let ApiData: any = {
|
||||
ids: [],
|
||||
}
|
||||
if (select.length === 0) {
|
||||
notification.warning({ message: '请至少选择一条数据', duration: 3 })
|
||||
return false
|
||||
} else {
|
||||
ApiData.ids = select.map((item) => {
|
||||
return item.id
|
||||
})
|
||||
}
|
||||
|
||||
ApiDel(ApiData).then((res) => {
|
||||
console.log(res)
|
||||
notification.success({ message: res.message, duration: 3 })
|
||||
reload()
|
||||
})
|
||||
}
|
||||
function handleSuccess() {
|
||||
reload()
|
||||
}
|
||||
function handleAudit(record) {
|
||||
openModal(true, {
|
||||
record,
|
||||
isUpdate: true,
|
||||
})
|
||||
}
|
||||
</script>
|
Loading…
Reference in New Issue