付费申请明细

szh-new
lijingjia 2 months ago
parent 041bef0e4d
commit 7ce5766f0f

@ -9,7 +9,7 @@
:loading="loading" :loading="loading"
:row-selection="{ selectedRowKeys: state.infoRowKeys, onChange: infoChange }" :row-selection="{ selectedRowKeys: state.infoRowKeys, onChange: infoChange }"
rowKey="id" rowKey="id"
:scroll="{ x: '100%', y: 300 }" :scroll="{ x: '100%', y: tHeight }"
:columns="nowFeeColumns" :columns="nowFeeColumns"
:data-source="feeData" :data-source="feeData"
:pagination="false" :pagination="false"
@ -36,7 +36,7 @@
</div> </div>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { ref, reactive, defineExpose, watch } from 'vue' import { ref, reactive, defineExpose, watch, defineProps } from 'vue'
// //
import { feeColumns, feeApplyColumns } from './feeColumns' import { feeColumns, feeApplyColumns } from './feeColumns'
import { feeStatusList } from '../columns' import { feeStatusList } from '../columns'
@ -44,6 +44,12 @@
import { GetList, GetFees } from '../api' import { GetList, GetFees } from '../api'
// id // id
import { GetFeeTemplateDetailList } from '/@/views/fee/template/api' import { GetFeeTemplateDetailList } from '/@/views/fee/template/api'
const props = defineProps({
tHeight: {
type: Number,
default: 300
}
})
// //
const state = reactive({ const state = reactive({
infoRowKeys: [] infoRowKeys: []

@ -191,7 +191,7 @@
}) })
const checkIndex = ref(false) const checkIndex = ref(false)
const checkSelect = ref(false) const checkSelect = ref(true)
const { prefixCls } = useDesign('basic-column-setting') const { prefixCls } = useDesign('basic-column-setting')

@ -9,6 +9,7 @@ import { useOptionsStore } from '/@/store/modules/options'
const optionsStore = useOptionsStore() const optionsStore = useOptionsStore()
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
const route = useRoute() const route = useRoute()
import { GetClientListByCode, getOrgList } from '/@/api/common'
// 引入字典数据 // 引入字典数据
import { getDictOption } from '/@/utils/dictUtil' import { getDictOption } from '/@/utils/dictUtil'
import { placeholderSign } from 'element-plus/es/components/table-v2/src/private' import { placeholderSign } from 'element-plus/es/components/table-v2/src/private'
@ -396,42 +397,86 @@ export const formSchema: FormSchema[] = [
] ]
export const searchFormSchema: FormSchema[] = [ export const searchFormSchema: FormSchema[] = [
{ {
label: '结算对象', label: '费用对象',
field: 'customerId', field: 'customerId',
component: 'ApiSelect', component: 'ApiSelect',
dynamicDisabled: false, dynamicDisabled: false,
colProps: { span: 4 }, colProps: { span: 4 },
componentProps: () => { componentProps: () => {
return { return {
option: optionsStore.getOptionsByCode('GetClientListByCode'), api: GetClientListByCode,
labelField: 'shortName', labelField: 'pinYinCode',
showName: 'shortName',
valueField: 'id', valueField: 'id',
resultField: 'data', resultField: 'data',
filterOption: (input: string, option: any) => { immediate: false
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
}
} }
} }
}, },
{ {
label: '主提单号', label: '编号查询',
field: 'mblno', field: 'mblno:hblno:debitNo:hblno:bookingNO:customerNo',
component: 'Input', component: 'Input',
dynamicDisabled: false, dynamicDisabled: false,
colProps: { span: 4 } colProps: { span: 4 }
}, },
{ {
label: '分提单号', label: '编号查询',
field: 'hblno', field: 'mblno:hblno:debitNo',
component: 'Input', component: 'Input',
dynamicDisabled: false, dynamicDisabled: false,
colProps: { span: 4 } colProps: { span: 4 }
}, },
{ {
label: '对账编号', field: 'accountDate',
field: 'debitNo', label: '会计期间',
component: 'Input', component: 'DatePicker',
dynamicDisabled: false, colProps: { span: 4 },
colProps: { span: 4 } componentProps: {
allowClear: true,
valueFormat: 'YYYY-MM'
}
},
{
field: 'isInvoice',
label: '是否开票',
defaultValue: false,
component: 'Select',
colProps: { span: 4 },
componentProps: {
options: [
{ label: '是', value: true },
{ label: '否', value: false }
]
}
},
{
field: 'isAdvancedPay',
label: '是否垫付',
defaultValue: false,
component: 'Select',
colProps: { span: 4 },
componentProps: {
options: [
{ label: '是', value: true },
{ label: '否', value: false }
]
}
},
{
label: '所属分部',
field: 'saleOrgId',
component: 'ApiSelect',
required: false,
colProps: { span: 4 },
componentProps: () => {
return {
api: getOrgList,
labelField: 'label',
valueField: 'id',
resultField: 'data',
immediate: false
}
}
} }
] ]

@ -7,24 +7,32 @@
<div class="ds-pay-apply-detail-fee-info"> <div class="ds-pay-apply-detail-fee-info">
<BasicTable @register="registerTable"> <BasicTable @register="registerTable">
<template #tableTitle> <template #tableTitle>
<h4>申请明细</h4> <div class="flex">
<div> <h4>申请明细</h4>
<a-button type="link" @click="add"> </a-button> <div>
<a-popconfirm <a-button class="ml15" type="link" @click="add">
:visible="deleteFlag" <span class="iconfont icon-zengjiatianjiajiajian" :style="{ fontSize: '12px' }"></span>
title="确定要删除勾选的数据?" 添加
ok-text="确定" </a-button>
cancel-text="取消" <a-popconfirm
@confirm="del" :visible="deleteFlag"
@cancel="cancelDel" title="确定要删除勾选的数据?"
@click="checkDel" ok-text="确定"
> cancel-text="取消"
<a-button danger type="link" > @confirm="del"
<span class="iconfont icon-shanchu1" :style="{ fontSize: '12px' }"></span> @cancel="cancelDel"
删除 @click="checkDel"
>
<a-button type="link" >
<span class="iconfont icon-shanchu1" :style="{ fontSize: '12px' }"></span>
删除
</a-button>
</a-popconfirm>
<a-button style="margin-left: 100px;" type="link" @click="exportExcel">
<span class="iconfont icon-fujian" :style="{ fontSize: '12px' }"></span>
导出
</a-button> </a-button>
</a-popconfirm> </div>
<a-button type="link" @click="exportExcel"> </a-button>
</div> </div>
</template> </template>
</BasicTable> </BasicTable>
@ -142,10 +150,13 @@
<style lang="less"> <style lang="less">
.ds-pay-apply-detail-fee-info { .ds-pay-apply-detail-fee-info {
.vben-basic-table-header__toolbar { h4 {
h4 { margin-bottom: 0;
margin-bottom: 0; }
} .flex {
align-items: center;
}
.items-center {
justify-content: space-between; justify-content: space-between;
} }
.vben-basic-table .ant-table-wrapper { .vben-basic-table .ant-table-wrapper {

@ -9,30 +9,68 @@
<BasicTable <BasicTable
class="ds-table-detail" class="ds-table-detail"
:canRowSelect="true" :canRowSelect="true"
:scroll="{ x: '100%', y: 500 }" :scroll="{ x: '100%', y: 400 }"
style="height: 500px;"
:row-selection="{ selectedRowKeys: state.historyRowKeys, onChange: historyChange }" :row-selection="{ selectedRowKeys: state.historyRowKeys, onChange: historyChange }"
rowKey="id" rowKey="id"
@register="registerTable" @register="registerTable"
@row-click="onRowClick" @row-click="onRowClick"
> >
<template #toolbar> <template #toolbar>
<a-button type="link" @click="addInfos"></a-button> <div class="flex">
<h4>结算明细</h4>
<a-button class="ml15" type="link" @click="addInfos">
<span class="iconfont icon-zengjiatianjiajiajian" :style="{ fontSize: '12px' }"></span>
增加结算明细
</a-button>
</div>
</template> </template>
<template #right> <template #right>
<Divider <Divider
type="vertical" type="vertical"
/> />
<div class="info"> <div class="info">
<div> <div style="height: 48px;">
<a-button @click="save" type="link">增加申请费用明细</a-button> <a-button type="link" @click="save" style="margin: 8px -10px;">
<span class="iconfont icon-zengjiatianjiajiajian" :style="{ fontSize: '12px' }"></span>
增加申请费用明细
</a-button>
</div> </div>
<feeTable <feeTable
style="width: 350px;" style="width: 350px;"
:tHeight="364"
ref="feeTabel" ref="feeTabel"
></feeTable> ></feeTable>
</div> </div>
</template> </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>
<span>
<span class="title">未收其他:</span>
<span class="count">{{ rother }}</span>
</span>
<span>
<span class="title">未付其他:</span>
<span class="count">{{ pother }}</span>
</span>
</div>
</template>
</BasicTable> </BasicTable>
<!-- <div class="info"> <!-- <div class="info">
<div> <div>
@ -73,6 +111,18 @@
type: Function type: Function
} }
}) })
// rmb
const rrmb = ref(0)
// rmb
const prmb = ref(0)
// usd
const rusd = ref(0)
// usd
const pusd = ref(0)
//
const rother = ref(0)
//
const pother = ref(0)
const loading = ref(false) const loading = ref(false)
const [registerTable, { reload, getForm, getPaginationRef, getSelectRows, setSelectedRows, getDataSource }] = useTable({ const [registerTable, { reload, getForm, getPaginationRef, getSelectRows, setSelectedRows, getDataSource }] = useTable({
api: async (p) => { api: async (p) => {
@ -89,7 +139,9 @@
columns: businessColumns, columns: businessColumns,
formConfig: { formConfig: {
labelWidth: 120, labelWidth: 120,
schemas: searchFormSchema schemas: searchFormSchema,
// ()
useAdvancedSearch: true
}, },
isTreeTable: false, isTreeTable: false,
pagination: true, pagination: true,
@ -97,7 +149,7 @@
useSearchForm: true, useSearchForm: true,
showTableSetting: false, showTableSetting: false,
bordered: true, bordered: true,
showIndexColumn: true, showIndexColumn: false,
canResize: false, canResize: false,
immediate: false immediate: false
}) })
@ -305,6 +357,21 @@
let btype = rows[0].businessType let btype = rows[0].businessType
feeTabel.value.init(v, 'apply', btype) feeTabel.value.init(v, 'apply', btype)
} }
rrmb.value = 0
prmb.value = 0
rusd.value = 0
pusd.value = 0
rother.value = 0
pother.value = 0
//
rows.forEach(item => {
rrmb.value = rrmb.value + item.unreceivedRMB || 0
prmb.value = prmb.value + item.unpaidRMB || 0
rusd.value = rusd.value + item.unreceivedUSD || 0
pusd.value = pusd.value + item.unpaidUSD || 0
rother.value = rother.value + item.unreceivedOther || 0
pother.value = pother.value + item.unpaidOther || 0
})
}) })
onMounted(async () => { onMounted(async () => {
@ -326,6 +393,36 @@
<style lang="less"> <style lang="less">
.ds-bus-table { .ds-bus-table {
.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;
}
}
.ant-table-container {
height: 400px;
}
.ant-table-body {
height: 364px!important;
}
.flex {
height: 48px;
align-items: center;
h4 {
margin-bottom: 0;
}
}
.ant-divider-vertical { .ant-divider-vertical {
margin: 12px 20px; margin: 12px 20px;
height: auto; height: auto;

@ -299,6 +299,16 @@
}) })
} }
} }
// :
if (status && status != 'WAIT_ORDER_AUDIT' && status != 'ORDER_AUDIT_REJECTED') {
if (content && content.length) {
content.forEach(item => {
if (item.field == 'carrier' || item.field == 'loadPortCode' || item.field == 'dischargePortCode' || item.field == 'deliveryPlaceCode' || item.field == 'contractClientName' || item.field == 'contractNo') {
item['dynamicDisabled'] = true
}
})
}
}
// //
OtherInfo.value.updateSchema(content) OtherInfo.value.updateSchema(content)
RefbasicInfo.value.updateSchema(content) RefbasicInfo.value.updateSchema(content)
@ -417,7 +427,7 @@
if (!goodsForm.ctnPriceInfo[i].quotePrice && goodsForm.ctnPriceInfo[i].quotePrice !== 0) { if (!goodsForm.ctnPriceInfo[i].quotePrice && goodsForm.ctnPriceInfo[i].quotePrice !== 0) {
return createMessage.warning('请填写报价!') return createMessage.warning('请填写报价!')
} }
if (route.query.status == 'WAIT_ORDER_AUDIT' && !goodsForm.ctnPriceInfo[i].floorPrice) { if (route.query.status == 'WAIT_ORDER_AUDIT' && !goodsForm.ctnPriceInfo[i].floorPrice && goodsForm.ctnPriceInfo[i].floorPrice !== 0) {
return createMessage.warning('请填写底价!') return createMessage.warning('请填写底价!')
} }
} }
@ -861,7 +871,6 @@
businessType: 1, businessType: 1,
taskTypeName: 'WAIT_ORDER_AUDIT' taskTypeName: 'WAIT_ORDER_AUDIT'
}).then(res => { }).then(res => {
console.log(res)
tabStore.closeTabByKey(fullPath, router) tabStore.closeTabByKey(fullPath, router)
}) })
} else { } else {

@ -110,19 +110,7 @@
async function handleSave(exit) { async function handleSave(exit) {
try { try {
const values = await validate() const values = await validate()
// const postData = {} if (!values.mobile && !values.tel) return createMessage.warning('请填写电话或者手机!')
// postData['clientId'] = values.customerId
// postData['tel'] = values.tel
// postData['email'] = values.email
// postData['note'] = values.note
// postData['name'] = values.name
// if (values.customerContactId) {
// //
// postData['id'] = values.customerContactId
// }
// ApiEdit(postData).then(res => {
// console.log(res)
// })
values['businessId'] = id.value values['businessId'] = id.value
loading.value = true loading.value = true
setModalProps({ confirmLoading: true, loading: true }) setModalProps({ confirmLoading: true, loading: true })

@ -688,8 +688,8 @@ export const mailingInfoFormSchemaR: FormSchema[] = [
colProps: { className: 'edt-picker ant-col ant-col-5' }, colProps: { className: 'edt-picker ant-col ant-col-5' },
componentProps: { componentProps: {
allowClear: true, allowClear: true,
valueFormat: 'YYYY-MM-DD', valueFormat: 'YYYY-MM-DD'
}, }
}, },
{ {
field: 'closingDate', field: 'closingDate',
@ -2798,7 +2798,6 @@ export const otherInfoFormSchema: FormSchema[] = [
// 客户类别下拉框数据 // 客户类别下拉框数据
const customTypeDict = ref([]) const customTypeDict = ref([])
const companyDict = ref([])
const personList = ref([]) const personList = ref([])
getDictOption('djy_cust_prop').then((data) => { getDictOption('djy_cust_prop').then((data) => {
customTypeDict.value = data customTypeDict.value = data
@ -2825,14 +2824,6 @@ export const personFormSchema: FormSchema[] = [
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0 return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
}, },
onChange: (v: string, obj) => { onChange: (v: string, obj) => {
GetClientListByCode({ code: v }).then((res) => {
const { data } = res
data.forEach((item) => {
item['label'] = item.shortName
item['value'] = item.id
})
companyDict.value = data
})
if (obj) { if (obj) {
formModel.customerTypeName = obj.label formModel.customerTypeName = obj.label
} else { } else {
@ -2849,44 +2840,44 @@ export const personFormSchema: FormSchema[] = [
}, },
}, },
{ {
field: 'customerId', field: 'customerName',
label: '客户名称', label: '客户名称',
defaultValue: null, defaultValue: null,
component: 'Select', component: 'ApiSelect',
colProps: { span: 12 }, colProps: { span: 12 },
componentProps: ({ formModel }) => { componentProps: ({ formModel }) => {
return { return {
options: companyDict.value, api: GetClientListByCode,
allowClear: true, params: { code: formModel.customerType },
showSearch: true, labelField: 'pinYinCode',
filterOption: (input: string, option: any) => { showName: 'shortName',
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0 valueField: 'shortName',
}, immediate: false,
onChange: (v, obj) => { onChange: (v, obj) => {
if (obj) { if (obj) {
formModel.name = null formModel.name = null
formModel.customerName = obj.label formModel.customerId = obj.id
formModel.customerContactId = null formModel.customerContactId = null
formModel.email = '' formModel.email = ''
formModel.tel = '' formModel.tel = ''
} // 设置关系人下拉
// 设置关系人下拉 GetOrderContactListByClientId({ id: obj.id }).then((res) => {
GetOrderContactListByClientId({ id: v }).then((res) => { personList.value = res.data.map((item) => {
personList.value = res.data.map((item) => { return {
return { label: item.name,
label: item.name, value: item.id,
value: item.id, email: item.email,
email: item.email, mobile: item.mobile,
mobile: item.mobile, }
} })
}) })
}) }
}, }
} }
}, }
}, },
{ {
field: 'customerName', field: 'customerId',
label: '', label: '',
component: 'Input', component: 'Input',
show: false, show: false,
@ -2923,6 +2914,12 @@ export const personFormSchema: FormSchema[] = [
} }
}, },
}, },
{
label: '职位',
field: 'duty',
component: 'Input',
colProps: { span: 12 }
},
{ {
field: 'customerContactId', field: 'customerContactId',
label: '', label: '',
@ -2948,7 +2945,6 @@ export const personFormSchema: FormSchema[] = [
label: '手机', label: '手机',
field: 'mobile', field: 'mobile',
component: 'Input', component: 'Input',
required: true,
rules: [ rules: [
{ {
pattern: /^1\d{10}$/, pattern: /^1\d{10}$/,

@ -74,7 +74,7 @@
<a-input-number v-model:value="item.floorPrice" size="small" :min="0" :max="999999999" placeholder="底价" /> <a-input-number v-model:value="item.floorPrice" size="small" :min="0" :max="999999999" placeholder="底价" />
</div> </div>
<span v-show="model.ctnPriceInfo.length > 1" @click="deleteCtnPrice(model.ctnPriceInfo, index, item)" class="iconfont icon-del"></span> <span v-show="model.ctnPriceInfo.length > 1" @click="deleteCtnPrice(model.ctnPriceInfo, index, item)" class="iconfont icon-del"></span>
<span v-show="model.ctnPriceInfo.length != 3" @click="model.ctnPriceInfo.push({ guidePrice: 0, floorPrice: 0 })" class="iconfont icon-zengjiatianjiajiajian"></span> <span v-show="model.ctnPriceInfo.length != 3" @click="model.ctnPriceInfo.push()" class="iconfont icon-zengjiatianjiajiajian"></span>
</div> </div>
</div> </div>
</a-form-item-rest> </a-form-item-rest>

@ -1566,6 +1566,7 @@
<style lang="less" scoped> <style lang="less" scoped>
.operation-area { .operation-area {
display: flex; display: flex;
height: 48px;
align-items: center; align-items: center;
span { span {
display: inline-block; display: inline-block;

@ -849,6 +849,7 @@
const [registerTable, { reload, setProps, getForm, getSelectRows, setColumns }] = useTable({ const [registerTable, { reload, setProps, getForm, getSelectRows, setColumns }] = useTable({
api: async (p) => { api: async (p) => {
const res: API.DataResult = await GetPageAsync(p) const res: API.DataResult = await GetPageAsync(p)
console.log(res)
return new Promise((resolve) => { return new Promise((resolve) => {
res.data.forEach((item) => { res.data.forEach((item) => {
if (item.recvUserList) { if (item.recvUserList) {

Loading…
Cancel
Save