|
@@ -1,133 +1,21 @@
|
1
|
1
|
<template>
|
2
|
|
- <van-form
|
3
|
|
- @failed="onFailed"
|
4
|
|
- @submit="onSubmit"
|
5
|
|
- :readonly="formData.isFinished"
|
6
|
|
- >
|
7
|
|
- <h2 :style="{ textAlign: 'center' }">{{ formData.invoiceName }}</h2>
|
8
|
|
- <van-cell-group title="报销人信息">
|
9
|
|
- <van-field
|
10
|
|
- label="所属公司"
|
11
|
|
- v-model="formData.invoiceOrgName"
|
12
|
|
- name="invoiceOrgName"
|
13
|
|
- readonly
|
14
|
|
- @click="changeOrg"
|
15
|
|
- placeholder="请输入所属公司"
|
16
|
|
- :rules="[{ required: true, message: '请输入所属公司' }]"
|
17
|
|
- />
|
18
|
|
- <van-popup
|
19
|
|
- v-model:show="showOrgPicker"
|
20
|
|
- position="left"
|
21
|
|
- :style="{ height: '100%', width: '80%' }"
|
22
|
|
- >
|
23
|
|
- <org-picker
|
24
|
|
- v-model="formData.orgId"
|
25
|
|
- :invoiceId="formData.invoiceId"
|
26
|
|
- @change="onOrgConfirm"
|
27
|
|
- />
|
28
|
|
- </van-popup>
|
29
|
|
- <van-field
|
30
|
|
- label="报销人"
|
31
|
|
- v-model="formData.personName"
|
32
|
|
- name="personName"
|
33
|
|
- readonly
|
34
|
|
- @click="showOrgPopup"
|
35
|
|
- placeholder="请输入报销人"
|
36
|
|
- :rules="[{ required: true, message: '请输入报销人' }]"
|
37
|
|
- />
|
38
|
|
- <van-popup
|
39
|
|
- v-model:show="showPersonPicker"
|
40
|
|
- position="left"
|
41
|
|
- :style="{ height: '100%', width: '80%' }"
|
42
|
|
- >
|
43
|
|
- <person-picker
|
44
|
|
- v-model="formData.personId"
|
45
|
|
- :invoiceId="formData.invoiceId"
|
46
|
|
- :orgId="formData.orgId"
|
47
|
|
- @change="onPersonConfirm"
|
48
|
|
- />
|
49
|
|
- </van-popup>
|
50
|
|
- </van-cell-group>
|
|
2
|
+ <van-form @failed="onFailed" @submit="onSubmit" :readonly="isFinished">
|
|
3
|
+ <back-button />
|
|
4
|
+ <h2 :style="{ textAlign: 'center' }">{{ fillData.name }}</h2>
|
|
5
|
+ <person-info
|
|
6
|
+ :isFinished="isFinished"
|
|
7
|
+ :invoiceId="route.query.invoiceId"
|
|
8
|
+ :pdata="personData"
|
|
9
|
+ @changeOrgValue="changeOrg"
|
|
10
|
+ @changePersonValue="changePerson"
|
|
11
|
+ />
|
|
12
|
+ <invoice-info :isFinished="isFinished" :pdata="formData" />
|
51
|
13
|
|
52
|
|
- <van-cell-group title="开票单位">
|
53
|
|
- <van-field
|
54
|
|
- label="开票单位"
|
55
|
|
- v-model="formData.orgName"
|
56
|
|
- name="orgName"
|
57
|
|
- placeholder="请输入开票单位"
|
58
|
|
- :rules="[{ required: true, message: '请输入开票单位' }]"
|
59
|
|
- />
|
60
|
|
- <van-field
|
61
|
|
- label="纳 税 号"
|
62
|
|
- v-model="formData.taxNo"
|
63
|
|
- name="taxNo"
|
64
|
|
- placeholder="请输入纳税识别号"
|
65
|
|
- :rules="[{ required: true, message: '请输入纳税识别号' }]"
|
66
|
|
- />
|
67
|
|
- <van-field
|
68
|
|
- label="单位地址"
|
69
|
|
- v-model="formData.address"
|
70
|
|
- name="address"
|
71
|
|
- placeholder="请输入单位地址"
|
72
|
|
- :rules="[{ required: true, message: '请输入单位地址' }]"
|
73
|
|
- />
|
74
|
|
- <van-field
|
75
|
|
- label="单位电话"
|
76
|
|
- v-model="formData.phone"
|
77
|
|
- name="phone"
|
78
|
|
- placeholder="请输入单位电话"
|
79
|
|
- :rules="[{ required: true, message: '请输入单位电话' }]"
|
80
|
|
- />
|
81
|
|
- <van-field
|
82
|
|
- label="开户银行"
|
83
|
|
- v-model="formData.bankName"
|
84
|
|
- name="bankName"
|
85
|
|
- placeholder="请输入开户银行"
|
86
|
|
- :rules="[{ required: true, message: '请输入开户银行' }]"
|
87
|
|
- />
|
88
|
|
- <van-field
|
89
|
|
- label="开户账户"
|
90
|
|
- v-model="formData.cardNo"
|
91
|
|
- name="cardNo"
|
92
|
|
- placeholder="请输入开户行账号"
|
93
|
|
- :rules="[{ required: true, message: '请输入开户行账号' }]"
|
94
|
|
- />
|
95
|
|
- <van-field
|
96
|
|
- name="radio"
|
97
|
|
- label="是否合开"
|
98
|
|
- error-message="如果合开请和报销专员联系"
|
99
|
|
- >
|
100
|
|
- <template #input>
|
101
|
|
- <van-radio-group
|
102
|
|
- v-model="formData.mergeRemark"
|
103
|
|
- direction="horizontal"
|
104
|
|
- :disabled="formData.isFinished"
|
105
|
|
- >
|
106
|
|
- <van-radio name="是">是</van-radio>
|
107
|
|
- <van-radio name="否">否</van-radio>
|
108
|
|
- </van-radio-group>
|
109
|
|
- </template>
|
110
|
|
- </van-field>
|
111
|
|
- </van-cell-group>
|
|
14
|
+ <item-tpl :itemList="itemList" />
|
112
|
15
|
|
113
|
|
- <van-cell-group v-if="itemList.length != 0" title="报销信息">
|
114
|
|
- <div class="itembox" v-for="item in itemList" :key="item.invoiceItemId">
|
115
|
|
- <van-cell title="报销项目">
|
116
|
|
- <template #value>
|
117
|
|
- <span style="color: #000">{{ item.name }}</span>
|
118
|
|
- </template>
|
119
|
|
- </van-cell>
|
120
|
|
- <van-cell title="开票金额">
|
121
|
|
- <template #value>
|
122
|
|
- <span style="color: #000">{{ item.charge }}</span>
|
123
|
|
- </template>
|
124
|
|
- </van-cell>
|
125
|
|
- <div class="lastLine" />
|
126
|
|
- </div>
|
127
|
|
- </van-cell-group>
|
128
|
16
|
<div style="margin: 16px">
|
129
|
17
|
<van-button
|
130
|
|
- v-show="!formData.isFinished"
|
|
18
|
+ v-show="!isFinished"
|
131
|
19
|
round
|
132
|
20
|
block
|
133
|
21
|
type="primary"
|
|
@@ -146,62 +34,54 @@ import { Dialog, Toast } from 'vant'
|
146
|
34
|
import dayjs from 'dayjs'
|
147
|
35
|
import { getInvoiceModel, setInvoiceDetail, getInvoiceFill } from '@/services/invoice'
|
148
|
36
|
import { useModel } from '@zjxpcyc/vue-tiny-store'
|
|
37
|
+import PersonInfo from './components/PersonInfo.vue'
|
|
38
|
+import InvoiceInfo from './components/InvoiceInfo.vue'
|
|
39
|
+import ItemTpl from './components/ItemTpl.vue'
|
149
|
40
|
|
150
|
|
-const formData = reactive({
|
151
|
|
- //班级名称
|
152
|
|
- invoiceName: '',
|
153
|
|
- detailId: undefined,
|
154
|
|
- invoiceId: undefined,
|
155
|
|
- invoicePersonId: undefined,
|
156
|
|
- personId: undefined,
|
157
|
|
- personName: undefined,
|
158
|
|
- orgNameId: undefined,
|
159
|
|
- orgId: undefined,
|
160
|
|
- invoiceOrgName: undefined,
|
161
|
|
- orgName: undefined,
|
162
|
|
- taxNo: undefined,
|
163
|
|
- address: undefined,
|
164
|
|
- phone: undefined,
|
165
|
|
- bankId: undefined,
|
166
|
|
- bankName: undefined,
|
167
|
|
- cardNo: undefined,
|
168
|
|
- invoiceItemTplId: undefined,
|
169
|
|
- itemName: undefined,
|
170
|
|
- charge: undefined,
|
171
|
|
- //是否结束
|
172
|
|
- isFinished: false,
|
173
|
|
- mergeRemark: '否',
|
174
|
|
- status: undefined
|
175
|
|
-})
|
|
41
|
+const formData = reactive({})
|
|
42
|
+//person组件数据
|
|
43
|
+const personData = ref({})
|
176
|
44
|
const itemList = ref([])
|
177
|
|
-const showOrgPicker = ref(false)
|
178
|
|
-const showPersonPicker = ref(false)
|
|
45
|
+const fillData = ref([])
|
|
46
|
+//是否结束
|
|
47
|
+const isFinished = ref(false)
|
179
|
48
|
const router = useRouter();
|
180
|
49
|
const route = useRoute();
|
181
|
50
|
const { user } = useModel('user')
|
182
|
51
|
|
183
|
52
|
const personId = computed(() => route.query.personId || user.personId)
|
184
|
53
|
|
|
54
|
+const changeOrg = (val) => {
|
|
55
|
+ personData.value = val
|
|
56
|
+}
|
|
57
|
+const changePerson = (val) => {
|
|
58
|
+ personData.value = val
|
|
59
|
+ formData.invoicePersonId = val.invoicePersonId
|
|
60
|
+ getDetail()
|
|
61
|
+}
|
|
62
|
+
|
185
|
63
|
onMounted(() => {
|
186
|
64
|
//不是扫码进入
|
187
|
65
|
if (!route.query.invoiceId) {
|
188
|
66
|
Dialog.alert({
|
189
|
67
|
message: '请退出页面重新扫码进入'
|
190
|
68
|
}).then(() => { })
|
191
|
|
- formData.isFinished = ture
|
|
69
|
+ isFinished.value = true
|
192
|
70
|
return
|
193
|
71
|
}
|
|
72
|
+ if (route.query.isFinished) {
|
|
73
|
+ isFinished.value = true
|
|
74
|
+ }
|
194
|
75
|
getInvoiceFill(route.query.invoiceId).then(res => {
|
|
76
|
+ fillData.value = res
|
195
|
77
|
//过期
|
196
|
78
|
if (dayjs().isAfter(dayjs(res.endDate) || res.status == 2)) {
|
197
|
|
- formData.isFinished = true
|
|
79
|
+ isFinished.value = true
|
198
|
80
|
Dialog.alert({
|
199
|
81
|
message: '该班次已截止如有问题请联系报销助理'
|
200
|
82
|
})
|
201
|
|
- formData.invoiceName = res.name
|
202
|
|
- } else {
|
203
|
|
- getDetail({ invoiceName: res.name })
|
204
|
83
|
}
|
|
84
|
+ getDetail()
|
205
|
85
|
}).catch(err => {
|
206
|
86
|
console.log(err)
|
207
|
87
|
})
|
|
@@ -211,58 +91,19 @@ const onFailed = (errorInfo) => {
|
211
|
91
|
console.log('failed', formData);
|
212
|
92
|
};
|
213
|
93
|
|
214
|
|
-//选择企业
|
215
|
|
-const changeOrg = () => {
|
216
|
|
- if (!formData.isFinished) {
|
217
|
|
- showOrgPicker.value = true
|
218
|
|
- }
|
219
|
|
-}
|
220
|
|
-//确认企业
|
221
|
|
-const onOrgConfirm = (value) => {
|
222
|
|
- if (value) {
|
223
|
|
- formData.orgId = value.invoiceOrgId
|
224
|
|
- formData.invoiceOrgName = value.name
|
225
|
|
- formData.personName = ''
|
226
|
|
- formData.invoicePersonId = ''
|
227
|
|
- }
|
228
|
|
- showOrgPicker.value = false;
|
229
|
|
-};
|
230
|
|
-//选择报销人
|
231
|
|
-const showOrgPopup = () => {
|
232
|
|
- if (!formData.isFinished) {
|
233
|
|
- if (formData.orgId) {
|
234
|
|
- showPersonPicker.value = true
|
235
|
|
- } else {
|
236
|
|
- Dialog.alert({
|
237
|
|
- message: '请先选择所属公司'
|
238
|
|
- }).then(() => { })
|
239
|
|
- }
|
240
|
|
- }
|
241
|
|
-}
|
242
|
|
-//确认报销人
|
243
|
|
-const onPersonConfirm = (value) => {
|
244
|
|
- if (value) {
|
245
|
|
- console.log(value);
|
246
|
|
- formData.personName = value.name
|
247
|
|
- formData.invoicePersonId = value.invoicePersonId
|
248
|
|
- getDetail({
|
249
|
|
- invoiceName: formData.name,
|
250
|
|
- invoicePersonId: formData.invoicePersonId,
|
251
|
|
- personName: formData.personName,
|
252
|
|
- orgId: formData.orgId,
|
253
|
|
- invoiceOrgName: formData.invoiceOrgName
|
254
|
|
- })
|
255
|
|
- }
|
256
|
|
- showPersonPicker.value = false;
|
257
|
|
-};
|
|
94
|
+
|
258
|
95
|
//获取模板详情
|
259
|
|
-const getDetail = (data) => {
|
260
|
|
- getInvoiceModel(route.query.invoiceId, { invoicePersonId: formData.invoicePersonId, personId: personId }).then(res => {
|
261
|
|
- const info = {
|
262
|
|
- ...(res.detail || res.tpl),
|
263
|
|
- ...data
|
264
|
|
- }
|
|
96
|
+const getDetail = () => {
|
|
97
|
+ getInvoiceModel(route.query.invoiceId, { invoicePersonId: formData.invoicePersonId, personId: personId.value }).then(res => {
|
|
98
|
+ let info = res.detail || res.tpl
|
|
99
|
+ info.mergeRemark = info.mergeRemark || formData.mergeRemark
|
265
|
100
|
Object.assign(formData, info)
|
|
101
|
+ if (!personData.value.invoicePersonId) {
|
|
102
|
+ personData.value.invoiceOrgId = info.invoiceOrgId
|
|
103
|
+ personData.value.invoiceOrgName = info.invoiceOrgName
|
|
104
|
+ personData.value.personName = info.personName
|
|
105
|
+ personData.value.invoicePersonId = info.invoicePersonId
|
|
106
|
+ }
|
266
|
107
|
itemList.value = info.itemList
|
267
|
108
|
}).catch(err => {
|
268
|
109
|
console.log(err);
|
|
@@ -276,7 +117,9 @@ const onSubmit = (val) => {
|
276
|
117
|
}).then(() => { })
|
277
|
118
|
return;
|
278
|
119
|
}
|
279
|
|
- setInvoiceDetail(formData.invoiceId, formData).then(() => {
|
|
120
|
+ //需要调用中间列表的提交事件获取数据
|
|
121
|
+ let value = { ...formData, ...val, ...personData.value }
|
|
122
|
+ setInvoiceDetail(fillData.value.invoiceId, value).then(() => {
|
280
|
123
|
Toast.success('提交成功');
|
281
|
124
|
setTimeout(() => {
|
282
|
125
|
router.back()
|
|
@@ -285,24 +128,4 @@ const onSubmit = (val) => {
|
285
|
128
|
console.log(err);
|
286
|
129
|
})
|
287
|
130
|
}
|
288
|
|
-
|
289
|
131
|
</script>
|
290
|
|
-<style lang="less" scoped>
|
291
|
|
-.lastLine::after {
|
292
|
|
- position: absolute;
|
293
|
|
- box-sizing: border-box;
|
294
|
|
- content: " ";
|
295
|
|
- pointer-events: none;
|
296
|
|
- right: var(--van-padding-md);
|
297
|
|
- bottom: 0;
|
298
|
|
- left: var(--van-padding-md);
|
299
|
|
- border-bottom: 1px solid var(--van-cell-border-color);
|
300
|
|
- transform: scaleY(0.5);
|
301
|
|
-}
|
302
|
|
-.cellClassName {
|
303
|
|
- .van-cell__value {
|
304
|
|
- min-width: 80% !important; //可根据自己需求设定值
|
305
|
|
- text-align: left !important;
|
306
|
|
- }
|
307
|
|
-}
|
308
|
|
-</style>
|