发票审核

szh-new
lijingjia 2 months ago
parent 17d6166e7d
commit 00e7bcbc9f

@ -10,7 +10,7 @@
/>
<title><%= title %></title>
<link rel="icon" href="/favicon.ico" />
<link rel="stylesheet" href="//at.alicdn.com/t/c/font_3756681_gav4guhyv4i.css" />
<link rel="stylesheet" href="//at.alicdn.com/t/c/font_3756681_tzka2hidzs.css" />
</head>
<body>
<script>

@ -92,8 +92,11 @@ enum Api {
// 根据权限id获取表单设置
GetFormSetListByModule = '/mainApi/FormSet/GetFormSetListByModule',
GetFormSetInfoByModule = '/mainApi/FormSet/GetFormSetInfoByModule',
// 获取所有往来单位下拉列表 (Auth)
GetAllClientList = '/mainApi/ClientCommon/GetAllClientList',
// 获取往来单位银行信息下拉
GetClientBank = '/mainApi/ClientCommon/GetClientBank'
}
// 所有往来单位下拉数据
export function GetAllClientList(params) {
@ -499,6 +502,22 @@ export function GetFormSetListByModule(params) {
params
})
}
export function GetFormSetInfoByModule(params) {
return request({
url: Api.GetFormSetInfoByModule,
method: 'get',
params
})
}
export function GetClientBank(params) {
return request({
url: Api.GetClientBank,
method: 'get',
params
})
}
/**
* api

@ -12,7 +12,7 @@
<slot name="formHeader"></slot>
<template v-for="schema in getSchema" :key="schema.field">
<FormItem
v-if="schema.isEdit != 1 || schema.component == 'Divider'"
v-if="schema.isEdit != 1 || schema.component == 'Divider' || schema.component == 'InputTextArea'"
:is-advanced="fieldsIsAdvancedMap[schema.field]"
:table-action="tableAction"
:form-action-type="formActionType"
@ -27,7 +27,7 @@
</template>
</FormItem>
<!-- 只读 -->
<a-col :span="schema?.colProps?.span || 24" v-if="schema.show !== false && schema.isEdit == 1 && schema.component != 'Divider'">
<a-col :span="schema?.colProps?.span || 24" v-if="schema.show !== false && schema.isEdit == 1 && schema.component != 'Divider' && schema.component != 'InputTextArea'">
<div class="ds-form-onlyread">
<span class="label">{{ schema.label }}</span> {{ formModel[schema.field] || '-' }}
<span class="iconfont icon-bianji1" @click="editFormItem(schema)"></span>

@ -19,17 +19,20 @@ export const searchFormSchema: FormSchema[] = [
colProps: { span: 4 }
},
{
label: '结算单位',
field: 'customerId',
label: '结算单位',
component: 'ApiSelect',
required: false,
dynamicDisabled: false,
colProps: { span: 4 },
componentProps: () => {
return {
api: GetClientListByCode,
immediate: false,
labelField: 'shortName',
labelField: 'pinYinCode',
valueField: 'id',
resultField: 'data'
showName: 'shortName',
resultField: 'data',
immediate: false
}
}
},

@ -7,7 +7,7 @@
<a-spin :spinning="loading">
<div class="ds-approve-fee">
<BasicTable
class="main-tb"
class="ds-table"
:scroll="{ 'x': '100%', 'y': fheight + 'px' }"
:showSearchForm='searchFlag'
@register="registerTable"

@ -7,7 +7,8 @@ const Api = {
GetCodeGoodsTypeInfo: '/mainApi/FormSet/GetFormSetInfo',
GetFormSetInfoByModule: '/mainApi/FormSet/GetFormSetInfoByModule',
BatchDelFormSet: '/mainApi/FormSet/BatchDelFormSet',
SetPublicFormSet: '/mainApi/FormSet/SetPublicFormSet'
SetPublicFormSet: '/mainApi/FormSet/SetPublicFormSet',
FormSetCopy: '/mainApi/FormSet/FormSetCopy'
}
// 列表 (Auth)
export function getCodeGoodsTypeList(data: PageRequest) {
@ -60,3 +61,12 @@ export function SetPublicFormSet(data: PageRequest) {
data
})
}
// 复制
export function FormSetCopy(params) {
return request<DataResult>({
url: Api.FormSetCopy,
method: 'get',
params
})
}

@ -9,12 +9,17 @@ export const columns: BasicColumn[] = [
{
title: '模板名称',
dataIndex: 'templateName',
width: 200,
width: 150,
},
{
title: '权限模块名称',
dataIndex: 'permissionName',
width: 200,
width: 150,
},
{
title: '任务状态',
dataIndex: 'taskStatus',
width: 120,
},
{
title: '是否公共标识',
@ -24,7 +29,7 @@ export const columns: BasicColumn[] = [
{
title: '创建时间',
dataIndex: 'createTime',
width: 200,
width: 120,
},
]
export const searchFormSchema: FormSchema[] = [

@ -1,17 +1,40 @@
<!--
* @Desc:
* @Author: lijj
* @Date: 2024-08-14 18:23:31
* @Date: 2024-09-20 08:43:11
-->
<!--
* @Desc:
* @Desc: 表单设置列表
* @Author: lijj
* @Date: 2024-08-14 18:23:31
-->
<template>
<div>
<div class="ds-form-set">
<BasicTable class="ds-table" @register="registerTable" @row-dbClick="handleAudit">
<template #tableTitle>
<ActionBar
:showBtns="['copy']"
:copy="copy"
layout="horizontal"
></ActionBar>
</template>
<template #bodyCell="{ column, record }">
<!-- 任务状态 -->
<template v-if="column.dataIndex == 'taskStatus'">
<a-dropdown v-if="record.permissionName == '海运出口-详情'">
<a class="ant-dropdown-link" @click.prevent>
{{ taskName(record.taskStatus) }}
<span class="iconfont icon-30jiantouxiangxiafill"></span>
</a>
<template #overlay>
<a-menu>
<a-menu-item v-for="item in taskTypeDict" :key="item.value" @click="editTaskType(item.value, record)">
<a href="javascript:;">{{ item.label }}</a>
</a-menu-item>
</a-menu>
</template>
</a-dropdown>
</template>
<!-- 是否公共标识 -->
<template v-if="column.dataIndex == 'isPublic'">
<a-switch
@ -50,15 +73,25 @@
</div>
</template>
<script lang="ts" setup>
import { ref, computed } from 'vue'
import { checkPermissions } from '/@/hooks/Permissions/index'
import { BasicTable, useTable, TableAction } from '/@/components/Table'
import { getCodeGoodsTypeList, BatchDelFormSet, SetPublicFormSet } from './api'
import { getCodeGoodsTypeList, BatchDelFormSet, SetPublicFormSet, FormSetCopy, editCodeGoodsType } from './api'
import { useModal } from '/@/components/Modal'
import FormModel from './component/FormModel.vue'
import { formatParams } from '/@/hooks/web/common'
import { columns, searchFormSchema } from './columns'
//
import { useMessage } from '/@/hooks/web/useMessage'
import { getDictOption } from '/@/utils/dictUtil'
const { createMessage } = useMessage()
//
const taskTypeDict = ref([])
getDictOption('SeaTaskType').then((res) => {
taskTypeDict.value = res
})
const [registerModal, { openModal }] = useModal()
const [registerTable, { reload }] = useTable({
const [registerTable, { reload, getSelectRows }] = useTable({
title: '',
api: async (p) => {
const res: API.DataResult = await getCodeGoodsTypeList(p)
@ -94,6 +127,27 @@
fixed: 'right',
},
})
//
const taskName = (v) => {
const name = taskTypeDict.value.filter(item => {
return item.value == v
})
if (name && name.length) {
return name[0].label
} else {
return '请选择'
}
}
//
const editTaskType = (v, row) => {
row.taskStatus = v
editCodeGoodsType(row).then(res => {
if (res.succeeded) {
reload()
}
})
}
function handleDelete(record) {
BatchDelFormSet({ ids: [record.id] }).then((res) => {
reload()
@ -108,6 +162,19 @@
})
}
}
//
const copy = () => {
const rows = getSelectRows()
console.log(rows)
if (rows.length != 1) return createMessage.warning('请选中一条数据进行复制!')
const id = rows[0].id
FormSetCopy({ id }).then(res => {
if (res.succeeded) {
createMessage.success('复制成功!')
reload()
}
})
}
//
const handleChange = (v, id) => {
SetPublicFormSet({ id, isPublic: v }).then(res => {
@ -119,7 +186,8 @@
}
</script>
<style>
<style lang="less">
.ds-form-set {
.s-txt {
font-size: 12px;
margin-left: 10px;
@ -130,4 +198,8 @@
.s-active {
color: #257AFA;
}
</style>
.ant-table-title {
padding: 0 15px!important;
}
}
</style>

@ -9,7 +9,7 @@ import { useOptionsStore } from '/@/store/modules/options'
const optionsStore = useOptionsStore()
import { useRoute } from 'vue-router'
const route = useRoute()
import { GetClientListByCode, getOrgList } from '/@/api/common'
import { GetClientListByCode, getOrgList, GetClientBank } from '/@/api/common'
// 引入字典数据
import { getDictOption } from '/@/utils/dictUtil'
import { placeholderSign } from 'element-plus/es/components/table-v2/src/private'
@ -260,6 +260,7 @@ export const formSchema: FormSchema[] = [
}
},
{
field: 'line1',
component: 'Divider',
colProps: {
span: 24
@ -274,18 +275,20 @@ export const formSchema: FormSchema[] = [
colProps: { span: 4 },
componentProps: ({ formModel }) => {
return {
option: optionsStore.getOptionsByCode('GetClientListByCode'),
labelField: 'shortName',
api: GetClientListByCode,
labelField: 'pinYinCode',
valueField: 'shortName',
showName: 'shortName',
resultField: 'data',
filterOption: (input: string, option: any) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
},
immediate: false,
onChange: (e, obj) => {
if (e && obj) {
formModel.customerId = obj.id
}
}
if (!e && !obj) {
formModel.customerId = ''
}
},
}
}
},
@ -296,27 +299,48 @@ export const formSchema: FormSchema[] = [
show: false
},
{
field: 'customerBankId',
field: 'customerBankName',
label: '开户行',
component: 'ApiSelect',
required: false,
dynamicDisabled: false,
colProps: { span: 4 },
componentProps: () => {
componentProps: ({ formModel }) => {
return {
option: optionsStore.getOptionsByCode('getClientBankList'),
api: GetClientBank,
params: {
id: formModel.customerId
},
labelField: 'bankName',
valueField: 'id',
resultField: 'data',
immediate: false,
filterOption: (input: string, option: any) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
},
onChange: (e, obj) => {
console.log(obj)
if (e && obj) {
formModel.customerBankId = obj.id
formModel.customerAccount = obj.bankAccountNo
}
if (!e && !obj) {
formModel.customerBankId = null
formModel.customerBankName = null
formModel.customerAccount = null
}
}
}
}
},
{
field: 'customerBank',
field: 'customerBankId',
label: '',
component: 'Input',
show: false
},
{
field: 'customerAccount',
label: '开户行账号',
component: 'Input',
required: false,
@ -324,32 +348,110 @@ export const formSchema: FormSchema[] = [
colProps: { span: 4 }
},
{
field: 'applicationNO',
label: '申请编号',
component: 'Input',
dynamicDisabled: true,
label: '所属分部',
field: 'saleOrgName',
component: 'ApiSelect',
required: false,
colProps: { span: 4 },
// render: ({ model, field }) => {
// return h(resolveComponent('span') as ComponentOptions, {
// value: model[field]
// })
// }
calssName: 'saleOrgId',
componentProps: ({ formModel }) => {
return {
api: getOrgList,
labelField: 'label',
valueField: 'value',
resultField: 'data',
immediate: false,
onChange: (e, obj) => {
if (e && obj) {
formModel.saleOrgName = obj.label
formModel.saleOrgId = obj.id
}
if (!e && !obj) {
formModel.saleOrgName = null
formModel.saleOrgId = null
}
},
}
},
},
{
field: 'statusText',
label: '状态',
field: 'saleDeptId',
label: '',
component: 'Input',
dynamicDisabled: true,
colProps: { span: 4 },
// render: ({ model, field }) => {
// return h(resolveComponent('span') as ComponentOptions, {
// value: model[field]
// })
// }
show: false,
},
// {
// field: 'applicationNO',
// label: '申请编号',
// component: 'Input',
// dynamicDisabled: true,
// colProps: { span: 4 },
// },
// {
// field: 'statusText',
// label: '状态',
// component: 'Input',
// dynamicDisabled: true,
// colProps: { span: 4 },
// },
// {
// field: 'createTime',
// label: '申请日期',
// component: 'DatePicker',
// dynamicDisabled: false,
// colProps: { span: 4 },
// componentProps: {
// showTime: true,
// allowClear: true,
// format: 'YYYY-MM-DD HH:mm:ss',
// valueFormat: 'YYYY-MM-DD HH:mm:ss'
// },
// },
// {
// field: 'currency',
// label: '币别',
// component: 'ApiSelect',
// required: false,
// dynamicDisabled: false,
// defaultValue: null,
// colProps: { span: 4 },
// componentProps: () => {
// return {
// option: optionsStore.getOptionsByCode('GetFeeCurrencySelectList'),
// labelField: 'name',
// valueField: 'codeName',
// placeholder: '原币申请',
// resultField: 'data',
// immediate: false,
// filterOption: (input: string, option: any) => {
// return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
// }
// }
// }
// },
// {
// field: 'settlementType',
// label: '结算方式',
// component: 'ApiSelect',
// required: false,
// dynamicDisabled: false,
// colProps: { span: 4 },
// componentProps: () => {
// return {
// option: optionsStore.getOptionsByCode('GetClientStlModeSelectList'),
// labelField: 'stlName',
// valueField: 'id',
// resultField: 'data',
// immediate: false,
// filterOption: (input: string, option: any) => {
// return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
// }
// }
// }
// },
{
field: 'createTime',
label: '申请日期',
field: 'paymentDate',
label: '申请支付日期',
component: 'DatePicker',
dynamicDisabled: false,
colProps: { span: 4 },
@ -358,62 +460,38 @@ export const formSchema: FormSchema[] = [
allowClear: true,
format: 'YYYY-MM-DD HH:mm:ss',
valueFormat: 'YYYY-MM-DD HH:mm:ss'
},
}
},
{
field: 'currency',
label: '币别',
component: 'ApiSelect',
required: false,
dynamicDisabled: false,
defaultValue: null,
colProps: { span: 4 },
componentProps: () => {
return {
option: optionsStore.getOptionsByCode('GetFeeCurrencySelectList'),
labelField: 'name',
valueField: 'codeName',
placeholder: '原币申请',
resultField: 'data',
immediate: false,
filterOption: (input: string, option: any) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
}
}
field: 'line2',
component: 'Divider',
colProps: {
span: 24
}
},
{
field: 'settlementType',
label: '结算方式',
component: 'ApiSelect',
field: 'chequeRemarks',
label: '发票备注',
component: 'InputTextArea',
required: false,
dynamicDisabled: false,
colProps: { span: 4 },
componentProps: () => {
return {
option: optionsStore.getOptionsByCode('GetClientStlModeSelectList'),
labelField: 'stlName',
valueField: 'id',
resultField: 'data',
immediate: false,
filterOption: (input: string, option: any) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
}
}
// defaultValue: '',
colProps: { span: 8 },
componentProps: {
autoSize: { minRows: 3, maxRows: 3 },
}
},
{
field: 'paymentDate',
label: '申请支付日期',
component: 'DatePicker',
field: 'note',
label: '备注',
component: 'InputTextArea',
required: false,
dynamicDisabled: false,
colProps: { span: 4 },
// defaultValue: '',
colProps: { span: 16 },
componentProps: {
showTime: true,
allowClear: true,
format: 'YYYY-MM-DD HH:mm:ss',
valueFormat: 'YYYY-MM-DD HH:mm:ss'
},
autoSize: { minRows: 3, maxRows: 3 },
}
},
// {
// field: 'createBy',

@ -35,6 +35,9 @@
</div>
</div>
</template>
<template #footer>
合计
</template>
</BasicTable>
<!-- <a-tabs v-model:activeKey="activeKey">
<a-tab-pane key="2" tab="费用明细">
@ -84,13 +87,14 @@
title: '',
columns,
isTreeTable: false,
pagination: true,
pagination: false,
striped: false,
useSearchForm: false,
showTableSetting: true,
bordered: true,
showIndexColumn: true,
canResize: false,
canResize: true,
resizeHeightOffset: 0,
rowSelection: { type: 'checkbox' },
immediate: false,
id: '1'

@ -56,7 +56,27 @@
@refresh="refresh"
></BusinessTable>
</a-spin>
<template #footer></template>
<template #footer>
<div class="main-statistic">
<span>合计</span>
<!-- <span>
<span class="title">应收RMB:</span>
<span class="count">{{ rrmb }}</span>
</span>
<span>
<span class="title">未收RMB:</span>
<span class="count">{{ prmb }}</span>
</span>
<span>
<span class="title">应收USD:</span>
<span class="count">{{ rusd }}</span>
</span>
<span>
<span class="title">未收USD:</span>
<span class="count">{{ pusd }}</span>
</span> -->
</div>
</template>
</a-modal>
</div>
</template>
@ -232,6 +252,23 @@
top: -12px;
}
}
.main-statistic {
background: #ffffff;
font-size: 12px;
height: 34px;
display: flex;
align-items: center;
.title {
font-size: 14px;
font-weight: 600;
margin-left: 20px;
}
.count {
font-size: 14px;
font-weight: 600;
color: #257AFA;
}
}
.fee-modal {
.ant-modal-body {
padding-top: 0 10px;

@ -12,7 +12,7 @@
<template v-slot:bodyCell="{ column, record }">
<!-- 复制单号 -->
<template v-if="column.dataIndex == 'applicationNO'">
<span @click="copyNo($event, record.applicationNO)" style="cursor: pointer"><span>{{ record.applicationNO }}</span><span class="iconfont icon-fuzhi11"></span></span>
<span style="cursor: pointer"><span><span @click="copyNo($event, record.applicationNO)" class="iconfont icon-fuzhi11"></span>{{ record.applicationNO }}</span></span>
</template>
<!-- 状态 -->
<template v-if="column.dataIndex == 'statusText'">
@ -144,7 +144,7 @@
}
.icon-fuzhi11 {
color: #257AFA;
margin-left: 5px;
margin-right: 5px;
}
}
</style>

@ -98,6 +98,14 @@
}
function handleSubmitCopyMore() {
const select = props.selectRow()
if (copyMoreForm.number === 1) {
SeaExportCopy({ id: select[0].id }).then((res) => {
createMessage.success('复制成功')
go(`/BookingDetail?id=${res.data}&source=copy`)
})
copyMoreFlag.value = false
return
}
for (var i = 0; i < copyMoreForm.number; i++) {
SeaExportCopy({ id: select[0].id }).then(res => {
props.reload()

@ -184,7 +184,7 @@
SubmitAudit,
Withdraw
} from '../api/BookingLedger'
import { GetFormSetListByModule } from '/@/api/common'
import { GetFormSetInfoByModule } from '/@/api/common'
const appStore = useAppStore()
const { notification, createMessage } = useMessage()
const operationArea = defineAsyncComponent(() => import("./modules/operationArea.vue"))
@ -292,11 +292,11 @@
RefNoteInfo.value.setAddress(data, v)
}
//
const getFormSet = () => {
GetFormSetListByModule({ permissionId: permissionsInfo('/BookingDetail').permissionId }).then(res => {
const getFormSet = (v) => {
GetFormSetInfoByModule({ permissionId: permissionsInfo('/BookingDetail').permissionId, formNo: 10, taskStatus: route.query.status || v }).then(res => {
const { data } = res
if (data && data.length) {
const content = JSON.parse(data[0].content).columns
if (data && data.id) {
const content = JSON.parse(data.content).columns
//
const status = route.query.status
if (status == 'WAIT_BILL_CONFIRM') {
@ -343,8 +343,6 @@
})
}
onMounted(() => {
// permission
getFormSet()
// tab
if (source.value != 'edit') document.getElementsByClassName('main-tab')[0].getElementsByClassName('ant-tabs-nav-wrap')[0].style.display = 'none'
})
@ -363,6 +361,8 @@
//
detailsLoadOver.value = false
isLockBooking.value = false
// permission
getFormSet(null)
}
}
//
@ -400,6 +400,8 @@
hblno: null
}
}
// permission
getFormSet(res.data.businessStatus)
loading.value = false
if (!res.data.ctnPriceInfo.length) {
res.data.ctnPriceInfo = [{}]

@ -1842,6 +1842,12 @@ export const cargoInfoFormSchema2: FormSchema[] = [
component: 'Input',
show: false,
},
{
label: '',
field: 'goodsId',
component: 'Input',
show: false,
},
{
field: 'goodsName',
label: '品名',
@ -1865,6 +1871,8 @@ export const cargoInfoFormSchema2: FormSchema[] = [
resultField: 'data',
onChange: (v, obj) => {
if (v && obj) {
console.log(obj)
formModel.goodsName = obj.goodName
formModel.goodsId = obj.id
if (obj.hsCode) {
formModel.hsCode = obj.hsCode

@ -29,6 +29,7 @@
v-model="formData.customerNo"
/>
<span @click="editCustomerNo" class="iconfont icon-bianji1"></span>
<span @click="copyNo(formData.customerNo)" class="iconfont icon-fuzhi5 ml5"></span>
</span>
<Divider type="vertical" />
<a-dropdown>
@ -200,6 +201,11 @@
navigator.clipboard.writeText(v.values[key])
createMessage.success('复制成功')
}
//
const copyNo = (v) => {
navigator.clipboard.writeText(v)
createMessage.success('复制成功')
}
//
const customerNoRef = ref(null)
const editCustomerNo = () => {
@ -292,7 +298,7 @@
font-weight: 600;
min-width: 68px;
}
.icon-bianji1 {
.icon-bianji1, .icon-fuzhi5 {
font-size: 10px;
color: #7a8798;
cursor: pointer;

@ -13,6 +13,13 @@
</div>
</template>
<template v-slot:bodyCell="{ column, record }">
<!-- 委托编号 -->
<template v-if="column.dataIndex == 'customerNo'">
<div class="customerNo">
<span v-if="record.customerNo" @click="FnCopy(record.customerNo)" class="iconfont icon-fuzhi3"></span>
<span>{{ record.customerNo }}</span>
</div>
</template>
<!-- 应收费用 -->
<template v-if="column.dataIndex == 'arFeeStatus'">
<span v-if="record.arFeeStatus == 0" class="ds-green-tag">

@ -147,7 +147,8 @@ export const temFormSchema: FormSchema[] = [
formModel.carrierId = obj.id
}
if (!e && !obj) {
formModel.carrierId = ''
formModel.carrierId = null
formModel.carrierName = null
}
}
}

Loading…
Cancel
Save