sen
2026-03-23 075d8b76626b2c830cc3bef11fb32e89d6067a3e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
<template>
    <el-dialog v-model="visible" title="账单信息" width="1200px" @close="handleClose" append-to-body>
        <div class="bill-info-container">
            <div class="info-header">
 
 
                <el-descriptions title="账单基本信息" :column="3" border class="mb-5">
                    <el-descriptions-item label="系统编号">{{ detailData.systemNo }}</el-descriptions-item>
                    <el-descriptions-item label="账单名称">{{ detailData.billName }}</el-descriptions-item>
                    <el-descriptions-item label="客户名称">
                        {{ detailData.customerName }}
                    </el-descriptions-item>
                    <el-descriptions-item label="单据数量">{{ detailData.documentCount }}</el-descriptions-item>
                    <el-descriptions-item label="应结算金额"><span class="text-bold">{{ detailData.totalAmount
                            }}</span></el-descriptions-item>
                    <el-descriptions-item label="币制">{{ detailData.currency }}</el-descriptions-item>
                    <el-descriptions-item label="减免金额">{{ detailData.discountAmount }}</el-descriptions-item>
                    <el-descriptions-item label="已收金额">{{ detailData.receivedAmount
                        }}</el-descriptions-item>
                    <el-descriptions-item label="待收金额">
                        <span class="text-danger">{{ detailData.pendingAmount }}</span>
                    </el-descriptions-item>
                    <el-descriptions-item label="周期类型">{{ dictFormat(sys_period_type,detailData.periodType)   }}</el-descriptions-item>
                    <el-descriptions-item label="业务期间">{{ detailData.businessStartDate }} ~ {{
                        detailData.businessEndDate
                        }}</el-descriptions-item>
                    <el-descriptions-item label="账单周期">{{ detailData.billingStartDate }} ~ {{ detailData.billingEndDate
                        }}</el-descriptions-item>
                </el-descriptions>
            </div>
 
            <el-form ref="formRef" :model="formData" :rules="rules" label-width="120px" class="bill-form"
                style="margin-top: 20px">
                <el-row :gutter="20">
                    <el-col :span="8">
                        <el-form-item label="周期类型" prop="periodType">
                            <el-select v-model="formData.periodType"  placeholder="请选择周期类型"
                                clearable>
                                <el-option v-for="dict in sys_period_type" :key="dict.value" :label="dict.label"
                                    :value="dict.value" />
                            </el-select>
                        </el-form-item>
                    </el-col>
                    <el-col :span="8">
                        <el-form-item label="业务期间" prop="businessPeriod">
                            <el-date-picker v-model="formData.businessPeriod" value-format="YYYY-MM-DD" type="daterange" range-separator="→"
                                start-placeholder="开始日期" end-placeholder="结束日期" style="width: 100%" />
                        </el-form-item>
                    </el-col>
                    <el-col :span="8">
                        <el-form-item label="账单周期" prop="billPeriod">
                            <el-date-picker v-model="formData.billPeriod" value-format="YYYY-MM-DD" type="daterange" range-separator="→"
                                start-placeholder="开始日期" end-placeholder="结束日期" style="width: 100%" />
                        </el-form-item>
                    </el-col>
                </el-row>
 
                <el-row :gutter="20">
                    <el-col :span="8">
                        <el-form-item label="账单生成日期" prop="billGenerateDate">
                            <el-date-picker v-model="formData.billGenerateDate" value-format="YYYY-MM-DD" type="date" placeholder="请选择日期"
                                style="width: 100%" />
                        </el-form-item>
                    </el-col>
                    <el-col :span="8">
                        <el-form-item label="账单发送日期" prop="billSendDate">
                            <el-date-picker v-model="formData.billSendDate" value-format="YYYY-MM-DD" type="date" placeholder="请选择日期"
                                style="width: 100%" />
                        </el-form-item>
                    </el-col>
                    <el-col :span="8">
                        <el-form-item label="账单到期日期" prop="billDueDate">
                            <el-date-picker v-model="formData.billDueDate" value-format="YYYY-MM-DD" type="date" placeholder="请选择日期"
                                style="width: 100%" />
                        </el-form-item>
                    </el-col>
                </el-row>
            </el-form>
        </div>
 
        <template #footer>
            <div class="dialog-footer" style="text-align: center">
                <el-button @click="visible = false">取 消</el-button>
                <el-button type="primary" @click="handleSubmit">确 定</el-button>
            </div>
        </template>
    </el-dialog>
</template>
 
<script setup lang="ts">
import { ref, reactive } from 'vue';
import useCurrentInstance from "@/utils/useCurrentInstance";
const { proxy } = useCurrentInstance();
// 获取所需的字典
const { sys_period_type } = proxy.useDict(
    'sys_period_type'
);
const visible = ref(false);
const formRef = ref();
const detailData = ref<any>({}); // 存放顶部只读数据
 
const formData = reactive({
    periodType: '',
    businessPeriod: [],
    billPeriod: [],
    billGenerateDate: '',
    billSendDate: '',
    billDueDate: ''
});
const dictFormat = (dict: any, value: any) => {
  return proxy.selectDictLabel(dict, value);
};
const rules = {
    periodType: [{ required: true, message: '请选择周期类型', trigger: 'change' }],
    businessPeriod: [{ required: true, message: '请选择业务期间', trigger: 'change' }],
    billPeriod: [{ required: true, message: '请选择账单周期', trigger: 'change' }],
    billGenerateDate: [{ required: true, message: '请选择账单生成日期', trigger: 'change' }],
    billSendDate: [{ required: true, message: '请选择账单发送日期', trigger: 'change' }],
    billDueDate: [{ required: true, message: '请选择账单到期日期', trigger: 'change' }],
};
 
const openDialog = (row: any) => {
    visible.value = true;
    if (row) {
        // 顶部只读展示
        detailData.value = row; 
 
        // 表单回显初始化
        formData.periodType = row.periodType;
        formData.billGenerateDate = row.billGenerateDate;
        formData.billSendDate = row.billSendDate;
        formData.billDueDate = row.billDueDate;
 
        // 核心:将后端字段合成前端范围数组
        if (row.businessStartDate && row.businessEndDate) {
            formData.businessPeriod = [row.businessStartDate, row.businessEndDate];
        } else {
            formData.businessPeriod = [];
        }
 
        if (row.billingStartDate && row.billingEndDate) {
            formData.billPeriod = [row.billingStartDate, row.billingEndDate];
        } else {
            formData.billPeriod = [];
        }
    }
};
 
const handleClose = () => {
    formRef.value?.resetFields();
    visible.value = false;
};
 
const emit = defineEmits(['submit']);
const handleSubmit = () => {
    formRef.value?.validate((valid: boolean) => {
        if (valid) {
            // 1. 浅拷贝表单数据,避免直接污染响应式对象
            const params = { ...formData };
 
            // 2. 注入 ID (从只读数据中获取)
            if (detailData.value && detailData.value.id) {
                params.id = detailData.value.id;
            }
 
            // 3. 拆解业务期间 [开始, 结束] -> 对应字段
            if (formData.businessPeriod && formData.businessPeriod.length === 2) {
                params.businessStartDate = formData.businessPeriod[0];
                params.businessEndDate = formData.businessPeriod[1];
            }
 
            // 4. 拆解账单周期 [开始, 结束] -> 对应字段
            if (formData.billPeriod && formData.billPeriod.length === 2) {
                params.billingStartDate = formData.billPeriod[0];
                params.billingEndDate = formData.billPeriod[1];
            }
                params.systemNo=  detailData.systemNo
            // 5. 抛出最终数据
            emit('submit', params);
        }
    });
};
 
defineExpose({ openDialog, handleClose });
</script>
 
<style scoped>
:deep(.el-descriptions__label) {
    width: 120px;
    background-color: #f9f9f9;
}
 
.bill-form :deep(.el-form-item__label) {
    font-weight: bold;
}
 
::v-deep .el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell {
    border: var(--el-descriptions-table-border);
    padding: 8px 11px;
    width: 200px;
}
</style>