修复项目修改为合伙人时合伙人为空问题

pull/853/head
wersd 2025-08-14 22:37:34 +08:00
parent e69afe7f68
commit ad6d91f78c
4 changed files with 78 additions and 34 deletions

View File

@ -8,6 +8,7 @@
v-loading="formLoading" v-loading="formLoading"
> >
<el-row> <el-row>
{{ formData }}
<el-col :span="12"> <el-col :span="12">
<el-form-item label="项目名称" prop="deptId"> <el-form-item label="项目名称" prop="deptId">
<el-select <el-select
@ -159,7 +160,7 @@
<el-tab-pane label="合伙人明细" name="partner"> <el-tab-pane label="合伙人明细" name="partner">
<ProjectPartnerForm <ProjectPartnerForm
ref="partnerFormRef" ref="partnerFormRef"
:partners="formData.partners" v-model:partners="formData.partners"
:disabled="formLoading" :disabled="formLoading"
:price="formData.totalInvestment" :price="formData.totalInvestment"
/> />

View File

@ -94,19 +94,30 @@ const getChartData = async () => {
updateChartOption() updateChartOption()
} }
function toFixed2(val: any) {
if (val === null || val === undefined || isNaN(val)) return val
return Number(val).toFixed(2)
}
function updateChartOption() { function updateChartOption() {
// x // x
const xData = chartData.value.map(item => item.projectName || '-') const xData = chartData.value.map(item => item.projectName || '-')
const chargingQuantity = chartData.value.map(item => item.chargingQuantity) const chargingQuantity = chartData.value.map(item => toFixed2(item.chargingQuantity))
const totalIncome = chartData.value.map(item => item.totalIncome) const totalIncome = chartData.value.map(item => toFixed2(item.totalIncome))
const grossProfit = chartData.value.map(item => item.grossProfit) const grossProfit = chartData.value.map(item => toFixed2(item.grossProfit))
const grossProfitRate = chartData.value.map(item => item.grossProfitRate) const grossProfitRate = chartData.value.map(item => toFixed2(item.grossProfitRate))
const perGunCharging = chartData.value.map(item => item.perGunCharging) const perGunCharging = chartData.value.map(item => toFixed2(item.perGunCharging))
const perGunProfit = chartData.value.map(item => item.perGunProfit) const perGunProfit = chartData.value.map(item => toFixed2(item.perGunProfit))
const electricityServiceFee = chartData.value.map(item => item.electricityServiceFee) const electricityServiceFee = chartData.value.map(item => toFixed2(item.electricityServiceFee))
chartOption.value = { chartOption.value = {
tooltip: { trigger: 'axis' }, tooltip: {
trigger: 'axis',
valueFormatter: (value: any) => {
if (value === null || value === undefined || value === '' || isNaN(value)) return value
return Number(value).toFixed(2)
}
},
legend: { data: [ legend: { data: [
'充电量(万度)', '总营收(万元)', '毛利润(万元)', '毛利率(%)', '充电量(万度)', '总营收(万元)', '毛利润(万元)', '毛利率(%)',
'单枪充电量(度)', '单枪服务费(元)', '度电服务费(元)' '单枪充电量(度)', '单枪服务费(元)', '度电服务费(元)'
@ -115,8 +126,11 @@ function updateChartOption() {
{ type: 'category', data: xData, axisTick: { alignWithLabel: true }} { type: 'category', data: xData, axisTick: { alignWithLabel: true }}
], ],
yAxis: [ yAxis: [
{ type: 'value', name: '金额/充电量', position: 'left', min: null, max: null, alignTicks: true }, { type: 'value', name: '金额/充电量', position: 'left', min: null, max: null, alignTicks: true,
{ type: 'value', name: '毛利率', position: 'right', min: null, max: null, axisLabel: { formatter: '{value}%' }, alignTicks: true } axisLabel: { formatter: (val: any) => (val === null || val === undefined || isNaN(val) ? val : Number(val).toFixed(2)) }
},
{ type: 'value', name: '毛利率', position: 'right', min: null, max: null,
axisLabel: { formatter: (val: any) => (val === null || val === undefined || isNaN(val) ? val : Number(val).toFixed(2) + '%') }, alignTicks: true }
], ],
series: [ series: [
{ name: '总营收(万元)', type: 'bar', data: totalIncome, yAxisIndex: 0, barMaxWidth: 28 }, { name: '总营收(万元)', type: 'bar', data: totalIncome, yAxisIndex: 0, barMaxWidth: 28 },

View File

@ -91,6 +91,11 @@ const getChartData = async () => {
updateChartOption() updateChartOption()
} }
function toFixed2(val: any) {
if (val === null || val === undefined || isNaN(val)) return val
return Number(val).toFixed(2)
}
function updateChartOption() { function updateChartOption() {
const xData = chartData.value.map(item => { const xData = chartData.value.map(item => {
const str = String(item.statMonth) const str = String(item.statMonth)
@ -99,16 +104,22 @@ function updateChartOption() {
} }
return item.statMonth return item.statMonth
}) })
const chargingQuantity = chartData.value.map(item => item.chargingQuantity) const chargingQuantity = chartData.value.map(item => toFixed2(item.chargingQuantity))
const totalIncome = chartData.value.map(item => item.totalIncome) const totalIncome = chartData.value.map(item => toFixed2(item.totalIncome))
const grossProfit = chartData.value.map(item => item.grossProfit) const grossProfit = chartData.value.map(item => toFixed2(item.grossProfit))
const grossProfitRate = chartData.value.map(item => item.grossProfitRate) const grossProfitRate = chartData.value.map(item => toFixed2(item.grossProfitRate))
const perGunCharging = chartData.value.map(item => item.perGunCharging) const perGunCharging = chartData.value.map(item => toFixed2(item.perGunCharging))
const perGunProfit = chartData.value.map(item => item.perGunProfit) const perGunProfit = chartData.value.map(item => toFixed2(item.perGunProfit))
const electricityServiceFee = chartData.value.map(item => item.electricityServiceFee) const electricityServiceFee = chartData.value.map(item => toFixed2(item.electricityServiceFee))
chartOption.value = { chartOption.value = {
tooltip: { trigger: 'axis' }, tooltip: {
trigger: 'axis',
valueFormatter: (value: any) => {
if (value === null || value === undefined || value === '' || isNaN(value)) return value
return Number(value).toFixed(2)
}
},
legend: { data: [ legend: { data: [
'充电量(万度)', '总营收(万元)', '毛利润(万元)', '毛利率(%)', '充电量(万度)', '总营收(万元)', '毛利润(万元)', '毛利率(%)',
'单枪充电量(度)', '单枪服务费(元)', '度电服务费(元)' '单枪充电量(度)', '单枪服务费(元)', '度电服务费(元)'
@ -117,8 +128,11 @@ function updateChartOption() {
{ type: 'category', data: xData, axisTick: { alignWithLabel: true }} { type: 'category', data: xData, axisTick: { alignWithLabel: true }}
], ],
yAxis: [ yAxis: [
{ type: 'value', name: '金额/充电量', position: 'left', min: null, max: null, alignTicks: true }, // 0: ///// { type: 'value', name: '金额/充电量', position: 'left', min: null, max: null, alignTicks: true,
{ type: 'value', name: '毛利率', position: 'right', min: null, max: null, axisLabel: { formatter: '{value}%' }, alignTicks: true } // 1: axisLabel: { formatter: (val: any) => (val === null || val === undefined || isNaN(val) ? val : Number(val).toFixed(2)) }
},
{ type: 'value', name: '毛利率', position: 'right', min: null, max: null,
axisLabel: { formatter: (val: any) => (val === null || val === undefined || isNaN(val) ? val : Number(val).toFixed(2) + '%') }, alignTicks: true }
], ],
series: [ series: [
{ name: '总营收(万元)', type: 'bar', data: totalIncome, yAxisIndex: 0, barMaxWidth: 28 }, { name: '总营收(万元)', type: 'bar', data: totalIncome, yAxisIndex: 0, barMaxWidth: 28 },

View File

@ -77,7 +77,15 @@ const emit = defineEmits(['update:partners'])
const formLoading = ref(false) const formLoading = ref(false)
const userOptions = ref<any[]>([]) const userOptions = ref<any[]>([])
const formData = ref([]) const formData = ref<any[]>([])
// formData
watch(
formData,
(val) => {
emit('update:partners', val)
},
{ deep: true }
)
const formRules = reactive({ const formRules = reactive({
userId: [ userId: [
@ -99,24 +107,29 @@ const formRules = reactive({
}) })
const formRef = ref<any>(null) const formRef = ref<any>(null)
onMounted(async () => { onMounted(async () => {
// //
userOptions.value = await UserApi.getSimpleUserList() userOptions.value = await UserApi.getSimpleUserList()
//
formData.value = Array.isArray(props.partners) ? props.partners.map(item => ({ ...item })) : []
}) })
const handleAdd = () => { const handleAdd = () => {
formData.value.push()
const row = { const row = {
userId: undefined, userId: undefined,
ratio: undefined, ratio: undefined,
investment: undefined investment: undefined
} }
formData.value.push(row) formData.value.push(row)
emit('update:partners', formData.value)
} }
const handleDelete = (index: number) => { const handleDelete = (index: number) => {
formData.value.splice(index, 1) formData.value.splice(index, 1)
emit('update:partners', formData.value)
} }
const validate = async () => { const validate = async () => {
@ -142,12 +155,14 @@ const getMaxRatio = (index: number) => {
const used = formData.value.reduce((sum, item, idx) => idx !== index ? sum + (Number(item.ratio) || 0) : sum, 0) const used = formData.value.reduce((sum, item, idx) => idx !== index ? sum + (Number(item.ratio) || 0) : sum, 0)
return Math.max(0, 100 - used) return Math.max(0, 100 - used)
} }
// watch formData
watch( watch(
() => props.partners, formData,
(val) => { (val) => {
formData.value = val || [] emit('update:partners', val)
}, },
{ immediate: true } { deep: true }
) )
defineExpose({ validate }) defineExpose({ validate })