新建页面
parent
fe36edebfb
commit
05721f0817
@ -0,0 +1,382 @@
|
||||
import { ref } from 'vue'
|
||||
import { FormSchema } from '/@/components/Table'
|
||||
// 引入字典数据
|
||||
import { getDictOption } from '/@/utils/dictUtil'
|
||||
// 下拉框数据接口
|
||||
import { GetFeeCurrencySelectList, GetClientListByCode, GetFeeCodeSelectList } from '/@/api/common'
|
||||
// 客户类别下拉框数据
|
||||
const customTypeDict = ref([])
|
||||
// 往来单位下拉框数据
|
||||
const companyDict = ref([])
|
||||
// 引入计费标准字典
|
||||
import { feeUnitDict } from '/@/hooks/dict/index'
|
||||
export const formSchema: FormSchema[] = [
|
||||
{
|
||||
label: '',
|
||||
field: 'id',
|
||||
component: 'Input',
|
||||
defaultValue: '',
|
||||
show: false
|
||||
},
|
||||
{
|
||||
label: '',
|
||||
field: 'feeName',
|
||||
component: 'Input',
|
||||
defaultValue: '',
|
||||
show: false
|
||||
},
|
||||
{
|
||||
label: '',
|
||||
field: 'costomerName',
|
||||
component: 'Input',
|
||||
defaultValue: '',
|
||||
show: false
|
||||
},
|
||||
{
|
||||
label: '',
|
||||
field: 'customerTypeText',
|
||||
component: 'Input',
|
||||
defaultValue: '',
|
||||
show: false
|
||||
},
|
||||
{
|
||||
label: '',
|
||||
field: 'unitText',
|
||||
component: 'Input',
|
||||
defaultValue: '',
|
||||
show: false
|
||||
},
|
||||
{
|
||||
field: 'feeCode',
|
||||
label: '费用名称',
|
||||
defaultValue: '',
|
||||
component: 'ApiSelect',
|
||||
colProps: { span: 5 },
|
||||
componentProps: ({ formModel }) => {
|
||||
return {
|
||||
api: GetFeeCodeSelectList,
|
||||
labelField: 'name',
|
||||
valueField: 'code',
|
||||
resultField: 'data',
|
||||
onChange: (v, obj) => {
|
||||
if (obj) {
|
||||
formModel['feeName'] = obj.name
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'customerType',
|
||||
label: '客户类别',
|
||||
defaultValue: '',
|
||||
component: 'Select',
|
||||
colProps: { span: 5 },
|
||||
componentProps: ({ formModel }) => {
|
||||
getDictOption('djy_cust_prop').then(data => {
|
||||
customTypeDict.value = data
|
||||
})
|
||||
return {
|
||||
options: customTypeDict.value,
|
||||
allowClear: true,
|
||||
showSearch: true,
|
||||
filterOption: (input: string, option: any) => {
|
||||
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
|
||||
},
|
||||
onChange: (v:string, obj) => {
|
||||
if (obj) formModel.customerTypeText = obj.name
|
||||
GetClientListByCode({ code: v }).then(res => {
|
||||
const { data } = res
|
||||
data.forEach(item => {
|
||||
item['label'] = item.shortName
|
||||
item['value'] = item.codeName
|
||||
})
|
||||
companyDict.value = data
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'costomerCode',
|
||||
label: '结算对象',
|
||||
defaultValue: '',
|
||||
component: 'Select',
|
||||
colProps: { span: 5 },
|
||||
componentProps: ({ formModel }) => {
|
||||
return {
|
||||
options: companyDict.value,
|
||||
resultField: 'data',
|
||||
onChange: (v, obj) => {
|
||||
if (obj) formModel.costomerName = obj.shortName
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'unit',
|
||||
label: '单位标准',
|
||||
defaultValue: '',
|
||||
component: 'ApiSelect',
|
||||
colProps: { span: 5 },
|
||||
componentProps: ({ formModel }) => {
|
||||
return {
|
||||
api: feeUnitDict,
|
||||
labelField: 'name',
|
||||
valueField: 'value',
|
||||
resultField: 'data',
|
||||
onChange: (v, obj) => {
|
||||
if (obj) formModel.unitText = obj.label
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'noTaxPrice',
|
||||
label: '不含税单价',
|
||||
defaultValue: 0,
|
||||
component: 'InputNumber',
|
||||
colProps: { span: 5 },
|
||||
componentProps: ({ formModel }) => {
|
||||
return {
|
||||
min: 0,
|
||||
precision: 6,
|
||||
onChange: (v) => {
|
||||
// 单价
|
||||
formModel.unitPrice = (v || 0) * ((formModel.taxRate || 0) / 100 + 1)
|
||||
// 金额
|
||||
formModel.amount = (formModel.unitPrice || 0) * (formModel.quantity || 0)
|
||||
// 不含税金额
|
||||
formModel.noTaxAmount = (v || 0) * (formModel.quantity || 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'taxRate',
|
||||
label: '税率',
|
||||
defaultValue: 0,
|
||||
component: 'InputNumber',
|
||||
colProps: { span: 5 },
|
||||
componentProps: ({ formModel }) => {
|
||||
return {
|
||||
min: 0,
|
||||
precision: 2,
|
||||
onChange: (v) => {
|
||||
// 不含税单价
|
||||
formModel.noTaxPrice = (formModel.unitPrice || 0) / ((v || 0) / 100 + 1)
|
||||
// 不含税金额
|
||||
formModel.noTaxAmount = (formModel.noTaxPrice || 0) * (formModel.quantity || 0)
|
||||
formModel.afterValue = formModel.amount - formModel.amountCopy + formModel.beforeValue
|
||||
formModel.difference = formModel.afterValue - formModel.beforeValue
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'unitPrice',
|
||||
label: '单价',
|
||||
defaultValue: 0,
|
||||
component: 'InputNumber',
|
||||
colProps: { span: 5 },
|
||||
componentProps: ({ formModel }) => {
|
||||
return {
|
||||
min: 0,
|
||||
precision: 6,
|
||||
onChange: (v) => {
|
||||
// 不含税单价
|
||||
formModel.noTaxPrice = (v || 0) / ((formModel.taxRate || 0) / 100 + 1)
|
||||
// 金额
|
||||
formModel.amount = (v || 0) * (formModel.quantity || 0)
|
||||
// 不含税金额
|
||||
formModel.noTaxAmount = (formModel.noTaxPrice || 0) * (formModel.quantity || 0)
|
||||
formModel.afterValue = formModel.amount - formModel.amountCopy + formModel.beforeValue
|
||||
formModel.difference = formModel.afterValue - formModel.beforeValue
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'quantity',
|
||||
label: '数量',
|
||||
defaultValue: 0,
|
||||
component: 'InputNumber',
|
||||
colProps: { span: 5 },
|
||||
componentProps: ({ formModel }) => {
|
||||
return {
|
||||
min: 0,
|
||||
precision: 0,
|
||||
onChange: (v) => {
|
||||
// 金额
|
||||
formModel.amount = (v || 0) * (formModel.unitPrice || 0)
|
||||
// 不含税金额
|
||||
formModel.noTaxAmount = (v || 0) * (formModel.noTaxPrice || 0)
|
||||
formModel.afterValue = formModel.amount - formModel.amountCopy + formModel.beforeValue
|
||||
formModel.difference = formModel.afterValue - formModel.beforeValue
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'noTaxAmount',
|
||||
label: '不含税金额',
|
||||
defaultValue: 0,
|
||||
dynamicDisabled: true,
|
||||
component: 'InputNumber',
|
||||
colProps: { span: 5 },
|
||||
componentProps: {
|
||||
min: 0,
|
||||
precision: 6
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'amount',
|
||||
label: '金额',
|
||||
defaultValue: 0,
|
||||
dynamicDisabled: true,
|
||||
component: 'InputNumber',
|
||||
colProps: { span: 5 },
|
||||
componentProps: ({ formModel }) => {
|
||||
return {
|
||||
min: 0,
|
||||
precision: 6,
|
||||
onChange: (v) => {
|
||||
formModel.afterValue = v - formModel.amountCopy + formModel.beforeValue
|
||||
formModel.difference = formModel.afterValue - formModel.beforeValue
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'currency',
|
||||
label: '币别',
|
||||
defaultValue: '',
|
||||
component: 'ApiSelect',
|
||||
colProps: { span: 5 },
|
||||
componentProps: () => {
|
||||
return {
|
||||
api: GetFeeCurrencySelectList,
|
||||
labelField: 'codeName',
|
||||
valueField: 'codeName',
|
||||
resultField: 'data'
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'exchangeRate',
|
||||
label: '汇率',
|
||||
defaultValue: 0,
|
||||
component: 'InputNumber',
|
||||
colProps: { span: 5 },
|
||||
componentProps: {
|
||||
min: 0,
|
||||
precision: 2
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'accTaxAmount',
|
||||
label: '销项税额',
|
||||
defaultValue: 0,
|
||||
component: 'InputNumber',
|
||||
colProps: { span: 5 },
|
||||
componentProps: {
|
||||
min: 0,
|
||||
precision: 6
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'accTaxRate',
|
||||
label: '销项税率',
|
||||
defaultValue: 0,
|
||||
component: 'InputNumber',
|
||||
colProps: { span: 5 },
|
||||
componentProps: {
|
||||
min: 0,
|
||||
precision: 2
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'reason',
|
||||
label: '修改原因',
|
||||
defaultValue: '',
|
||||
component: 'InputTextArea',
|
||||
colProps: { span: 5 }
|
||||
},
|
||||
{
|
||||
field: 'isInvoice',
|
||||
label: '是否开发票',
|
||||
defaultValue: false,
|
||||
component: 'RadioGroup',
|
||||
colProps: { span: 5 },
|
||||
componentProps: {
|
||||
options: [
|
||||
{ label: '是', value: true },
|
||||
{ label: '否', value: false }
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'isAdvancedPay',
|
||||
label: '是否垫付',
|
||||
defaultValue: false,
|
||||
component: 'RadioGroup',
|
||||
colProps: { span: 5 },
|
||||
componentProps: {
|
||||
options: [
|
||||
{ label: '是', value: true },
|
||||
{ label: '否', value: false }
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'note',
|
||||
label: '备注',
|
||||
defaultValue: '',
|
||||
component: 'InputTextArea',
|
||||
colProps: { span: 12 }
|
||||
},
|
||||
{
|
||||
field: 'beforeValue',
|
||||
label: '更改前利润',
|
||||
defaultValue: 0,
|
||||
dynamicDisabled: true,
|
||||
component: 'InputNumber',
|
||||
colProps: { span: 5 },
|
||||
componentProps: {
|
||||
min: 0,
|
||||
precision: 6
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'afterValue',
|
||||
label: '更改后利润',
|
||||
defaultValue: 0,
|
||||
dynamicDisabled: true,
|
||||
component: 'InputNumber',
|
||||
colProps: { span: 5 },
|
||||
componentProps: {
|
||||
min: 0,
|
||||
precision: 6
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'difference',
|
||||
label: '利润差额',
|
||||
dynamicDisabled: true,
|
||||
defaultValue: 0,
|
||||
component: 'InputNumber',
|
||||
colProps: { span: 5 },
|
||||
componentProps: {
|
||||
min: 0,
|
||||
precision: 6
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'amountCopy',
|
||||
label: '',
|
||||
defaultValue: 0,
|
||||
component: 'InputNumber',
|
||||
colProps: { span: 5 },
|
||||
show: false
|
||||
}
|
||||
]
|
@ -0,0 +1,127 @@
|
||||
<!--
|
||||
* @Description: 申请修改组件
|
||||
* @Author: lijj
|
||||
* @Date: 2024-05-07 15:19:07
|
||||
-->
|
||||
<template>
|
||||
<div>
|
||||
<!-- 引入弹窗 -->
|
||||
<BasicModal
|
||||
v-bind="$attrs"
|
||||
:use-wrapper="true"
|
||||
title="费用申请修改"
|
||||
:form-schema="formSchema"
|
||||
width="60%"
|
||||
@register="registerModal"
|
||||
@ok="handleSave"
|
||||
@cancel="handleCancel"
|
||||
>
|
||||
<div class="ds-apply-modify">
|
||||
<h3>费用旧值</h3>
|
||||
<a-form layout="vertical" class="ds-form-detail">
|
||||
<a-row :gutter="15">
|
||||
<a-col v-for="item in list" :span="item.span" :key='item.value'>
|
||||
<a-form-item
|
||||
:label="item.label"
|
||||
>
|
||||
<div>
|
||||
<span v-if="item.field != 'isAdvancedPay'">
|
||||
{{ detailData[item.field] || '-' }}
|
||||
</span>
|
||||
<span v-else>
|
||||
{{ detailData[item.field] ? '是' : '否' }}
|
||||
</span>
|
||||
</div>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
</a-row>
|
||||
</a-form>
|
||||
<h3>费用新值</h3>
|
||||
<BasicForm @register="registerForm" />
|
||||
</div>
|
||||
</BasicModal>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import { defineEmits, defineProps, ref, reactive, onMounted, defineExpose, watch, q } from 'vue'
|
||||
import { useMessage } from '/@/hooks/web/useMessage'
|
||||
const { createMessage } = useMessage()
|
||||
import { BasicForm, useForm } from '/@/components/Form/index'
|
||||
// 弹窗组件
|
||||
import { BasicModal, useModalInner } from '/@/components/Modal'
|
||||
import emitter from '/@/utils/Bus'
|
||||
import { formSchema } from './applyModify'
|
||||
import { ApplyModification } from '../api'
|
||||
const visible = ref(false)
|
||||
const beforeValue = ref(null)
|
||||
const emits = defineEmits(['refresh'])
|
||||
const list = [
|
||||
{ label: '费用名称', field: 'feeName', span: 5 },
|
||||
{ label: '费用对象', field: 'customerName', span: 5 },
|
||||
// { label: '核算单位', field: 'customerNo', span: 4, value: '1' },
|
||||
{ label: '单位标准', field: 'unitText', span: 5 },
|
||||
{ label: '不含税单价', field: 'noTaxPrice', span: 5 },
|
||||
{ label: '税率', field: 'taxRate', span: 5 },
|
||||
{ label: '含税单价', field: 'unitPrice', span: 5 },
|
||||
{ label: '计费数量', field: 'quantity', span: 5 },
|
||||
{ label: '不含税金额', field: 'noTaxAmount', span: 5 },
|
||||
{ label: '含税金额', field: 'amount', span: 5 },
|
||||
{ label: '币别', field: 'currency', span: 5 },
|
||||
{ label: '汇率', field: 'exchangeRate', span: 5 },
|
||||
{ label: '财务税率', field: 'accTaxRate', span: 5 },
|
||||
{ label: '是否垫付', field: 'isAdvancedPay', span: 5 }
|
||||
]
|
||||
const detailData = ref({})
|
||||
const [registerForm, { resetFields, setFieldsValue, validate, updateSchema, getFieldsValue }] =
|
||||
useForm({
|
||||
labelWidth: 150,
|
||||
schemas: formSchema,
|
||||
showActionButtonGroup: false,
|
||||
})
|
||||
const [registerModal, { setModalProps, closeModal, updateFormField }] = useModalInner(async (data) => {
|
||||
detailData.value = JSON.parse(JSON.stringify(data.record))
|
||||
setFieldsValue({
|
||||
...data.record,
|
||||
beforeValue: JSON.parse(JSON.stringify(beforeValue.value)),
|
||||
afterValue: JSON.parse(JSON.stringify(beforeValue.value)),
|
||||
amountCopy: JSON.parse(JSON.stringify(data.record.amount)),
|
||||
difference: 0
|
||||
})
|
||||
})
|
||||
const handleSave = async () => {
|
||||
const values = await validate()
|
||||
setModalProps({ confirmLoading: true, loading: true })
|
||||
const copy = JSON.parse(JSON.stringify(detailData.value))
|
||||
const formData = Object.assign(copy, values)
|
||||
formData.feeRecordId = values.id
|
||||
formData.id = 0
|
||||
const res: API.DataResult = await ApplyModification([formData])
|
||||
setModalProps({ confirmLoading: false, loading: false })
|
||||
if (res.succeeded) {
|
||||
createMessage.success(res.message)
|
||||
emits('refresh')
|
||||
} else {
|
||||
createMessage.error(res.message)
|
||||
}
|
||||
closeModal()
|
||||
}
|
||||
onMounted(() => {
|
||||
emitter.on('profitCNY', (v) => {
|
||||
beforeValue.value = v
|
||||
})
|
||||
})
|
||||
const handleCancel = () => {
|
||||
closeModal()
|
||||
// visible.value = false
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.ds-apply-modify {
|
||||
padding: 0 20px 0 20px;
|
||||
h3 {
|
||||
padding-left: 0;
|
||||
width: 95%;
|
||||
}
|
||||
}
|
||||
</style>
|
@ -0,0 +1,6 @@
|
||||
<template>
|
||||
<div>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
</script>
|
@ -0,0 +1,6 @@
|
||||
<template>
|
||||
<div>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
</script>
|
@ -0,0 +1,7 @@
|
||||
<template>
|
||||
<div>
|
||||
1
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
</script>
|
@ -0,0 +1,6 @@
|
||||
<template>
|
||||
<div>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
</script>
|
Loading…
Reference in New Issue