business_tms_program 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/.editorconfig +12 -0
  2. package/.eslintrc-auto-import.json +113 -0
  3. package/.eslintrc.js +121 -0
  4. package/.prettierrc.js +9 -0
  5. package/.stylelintignore +4 -0
  6. package/README.md +43 -0
  7. package/components.d.ts +23 -0
  8. package/index.html +20 -0
  9. package/package.json +70 -0
  10. package/shims-uni.d.ts +10 -0
  11. package/src/App.vue +81 -0
  12. package/src/api/afterSale.ts +184 -0
  13. package/src/api/context.ts +26 -0
  14. package/src/api/device.ts +134 -0
  15. package/src/api/index.ts +80 -0
  16. package/src/api/installtion.ts +155 -0
  17. package/src/api/model/index.ts +15 -0
  18. package/src/api/model/userModel.ts +62 -0
  19. package/src/api/order.ts +49 -0
  20. package/src/api/system.ts +19 -0
  21. package/src/api/user.ts +171 -0
  22. package/src/auto-imports.d.ts +108 -0
  23. package/src/components/ConfirmDialog.vue +101 -0
  24. package/src/components/DaySelect.vue +212 -0
  25. package/src/components/Drawer.vue +104 -0
  26. package/src/components/DrawerSelect.vue +105 -0
  27. package/src/components/DropMenu.vue +144 -0
  28. package/src/components/Empty.vue +49 -0
  29. package/src/components/Loading.vue +41 -0
  30. package/src/components/RippleBtn.vue +159 -0
  31. package/src/components/SinglePick.vue +120 -0
  32. package/src/components/Skeleton.vue +43 -0
  33. package/src/components/Timeline.vue +85 -0
  34. package/src/components/Upload.vue +217 -0
  35. package/src/config/app.ts +32 -0
  36. package/src/config/env.ts +29 -0
  37. package/src/dict/afterSale.ts +161 -0
  38. package/src/dict/device.ts +29 -0
  39. package/src/dict/installtion.ts +141 -0
  40. package/src/dict/systems.ts +4 -0
  41. package/src/env.d.ts +8 -0
  42. package/src/hooks/useForm.ts +222 -0
  43. package/src/hooks/useUpload.ts +80 -0
  44. package/src/main.ts +8 -0
  45. package/src/manifest.json +39 -0
  46. package/src/pages/acceptance/DeviceInfo.vue +132 -0
  47. package/src/pages/acceptance/list.vue +276 -0
  48. package/src/pages/afterSale/DeviceInfo.vue +128 -0
  49. package/src/pages/afterSale/Step.vue +0 -0
  50. package/src/pages/afterSale/faultReport.vue +552 -0
  51. package/src/pages/afterSale/orderDetail.vue +327 -0
  52. package/src/pages/afterSale/orderFinish.vue +517 -0
  53. package/src/pages/afterSale/orderList.vue +305 -0
  54. package/src/pages/afterSale/returnVisit.vue +288 -0
  55. package/src/pages/afterSale/searchDeviceList.vue +148 -0
  56. package/src/pages/device/Search.vue +201 -0
  57. package/src/pages/device/acceptance.vue +270 -0
  58. package/src/pages/device/detail.vue +165 -0
  59. package/src/pages/device/index.vue +322 -0
  60. package/src/pages/device/info.vue +140 -0
  61. package/src/pages/device/list.vue +219 -0
  62. package/src/pages/device/materialTowerCode.vue +589 -0
  63. package/src/pages/device/searchList.vue +224 -0
  64. package/src/pages/installtion/Record.vue +145 -0
  65. package/src/pages/installtion/StatusTimeline.vue +85 -0
  66. package/src/pages/installtion/addAcceptance.vue +409 -0
  67. package/src/pages/installtion/addRecord.vue +338 -0
  68. package/src/pages/installtion/orderDetail.vue +220 -0
  69. package/src/pages/installtion/orderList.vue +100 -0
  70. package/src/pages/user/component/PersonAgree.vue +226 -0
  71. package/src/pages/user/component/PrivayAgree.vue +221 -0
  72. package/src/pages/user/component/SliderCode.vue +173 -0
  73. package/src/pages/user/forgetPassword.vue +249 -0
  74. package/src/pages/user/index.vue +139 -0
  75. package/src/pages/user/login.vue +342 -0
  76. package/src/pages/user/register.vue +348 -0
  77. package/src/pages/user/repassword.vue +329 -0
  78. package/src/pages/user/utils/mcaptcha.js +75 -0
  79. package/src/pages/user/utils/verifyCode.ts +41 -0
  80. package/src/pages/workspace/index.vue +225 -0
  81. package/src/pages.json +203 -0
  82. package/src/shime-uni.d.ts +6 -0
  83. package/src/static/icon/system/breeder_icon.png +0 -0
  84. package/src/static/icon/system/check.png +0 -0
  85. package/src/static/icon/system/factory_icon.png +0 -0
  86. package/src/static/icon/system/plus.png +0 -0
  87. package/src/static/icon/system/right.png +0 -0
  88. package/src/static/icon/system/unCheck.png +0 -0
  89. package/src/static/icon/tab/search.png +0 -0
  90. package/src/static/icon/tab/user.png +0 -0
  91. package/src/static/icon/tab/user_active.png +0 -0
  92. package/src/static/icon/tab/workspace.png +0 -0
  93. package/src/static/icon/tab/workspace_active.png +0 -0
  94. package/src/static/img/active_dot.png +0 -0
  95. package/src/static/img/afterSale_icon.png +0 -0
  96. package/src/static/img/check.png +0 -0
  97. package/src/static/img/close.png +0 -0
  98. package/src/static/img/confirm.png +0 -0
  99. package/src/static/img/empty.png +0 -0
  100. package/src/static/img/equipment_icon.png +0 -0
  101. package/src/static/img/fault_icon.png +0 -0
  102. package/src/static/img/install_icon.png +0 -0
  103. package/src/static/img/login_bg2.png +0 -0
  104. package/src/static/img/movable_right.png +0 -0
  105. package/src/static/img/navigation.png +0 -0
  106. package/src/static/img/psw_off.png +0 -0
  107. package/src/static/img/psw_on.png +0 -0
  108. package/src/static/img/scan.png +0 -0
  109. package/src/static/img/scan_icon.png +0 -0
  110. package/src/static/img/search.png +0 -0
  111. package/src/static/img/turn_right.png +0 -0
  112. package/src/static/img/unActive_dot.png +0 -0
  113. package/src/static/img/verifyBg.png +0 -0
  114. package/src/stores/index.ts +11 -0
  115. package/src/stores/modules/customer.ts +146 -0
  116. package/src/stores/modules/installtion.ts +30 -0
  117. package/src/stores/modules/system.ts +56 -0
  118. package/src/stores/modules/user.ts +133 -0
  119. package/src/stores/types.ts +16 -0
  120. package/src/stores/utils.ts +6 -0
  121. package/src/styles/index.less +63 -0
  122. package/src/types/chengyiApi.d.ts +36 -0
  123. package/src/types/index.d.ts +95 -0
  124. package/src/utils/address.ts +17 -0
  125. package/src/utils/cipher.ts +61 -0
  126. package/src/utils/form.ts +155 -0
  127. package/src/utils/httpEnum.ts +31 -0
  128. package/src/utils/image.ts +21 -0
  129. package/src/utils/index.ts +111 -0
  130. package/src/utils/request.ts +139 -0
  131. package/src/utils/requestCancelHandle.ts +67 -0
  132. package/stylelint.config.js +87 -0
  133. package/tsconfig.docs.json +11 -0
  134. package/tsconfig.json +30 -0
  135. package/typedoc.json +6 -0
  136. package/vite.config.ts +55 -0
@@ -0,0 +1,517 @@
1
+ <script setup lang="ts">
2
+ import { useForm } from '@/hooks/useForm';
3
+ import { reactive } from 'vue';
4
+ import { type ValidationRules } from '@/utils/form';
5
+ import { throttle } from 'lodash-es';
6
+ import RippleBtn from '@/components/RippleBtn.vue';
7
+ import Upload from '@/components/Upload.vue';
8
+ import DrawerSelect from '@/components/DrawerSelect.vue';
9
+ import SinglePick from '@/components/SinglePick.vue';
10
+ import { FILE_UPLOAD_CONFIG, scrollIdPrefix } from '@/config/app';
11
+ import {
12
+ SERVICETYPE,
13
+ WORKORDER_PROBLEM_CLASSIFICATION,
14
+ workFormOptions,
15
+ workNodeEnum,
16
+ workFormEnum,
17
+ isSolveOnce,
18
+ isSolveOnceOptions
19
+ } from "@/dict/afterSale";
20
+ import { type addFinishRecordParams, addFinishRecord } from '@/api/afterSale';
21
+ import { useSystemStoreHook } from "@/stores/modules/system";
22
+
23
+ defineOptions({
24
+ name: "follow"
25
+ });
26
+ // 定义校验规则
27
+ const validationRules: ValidationRules<Partial<addFinishRecordParams>> = {
28
+ serviceType: {
29
+ required: true,
30
+ message: '请选择服务类型',
31
+ },
32
+ workForm: {
33
+ required: true,
34
+ message: '请选择工作形式',
35
+ },
36
+ arrivalTime: {
37
+ required: false, validatFunc: (d): any => {
38
+ return new Promise((resolve, reject) => {
39
+ if(formData.workForm === workFormEnum.OFFLINE){
40
+ if(!d){
41
+ reject('请选择到场时间')
42
+ } else {
43
+ resolve(true)
44
+ }
45
+ }
46
+ resolve(true)
47
+ })
48
+ }, message: '请选择到场时间' },
49
+ problemsAnalysis: {
50
+ required: true,
51
+ message: '请填写故障问题分析',
52
+ },
53
+ processingResult: {
54
+ required: true,
55
+ message: '请填写处理结果描述',
56
+ },
57
+ completionTime: {
58
+ required: true,
59
+ message: '请选择处理完结时间',
60
+ validatFunc: (d): any => {
61
+ return new Promise((resolve, reject) => {
62
+ if(!d){
63
+ reject('请选择处理完结时间')
64
+ } else {
65
+ const selectedTime = new Date(d).getTime();
66
+ const currentTime = new Date().getTime();
67
+ if(selectedTime > currentTime){
68
+ reject('处理完结时间应小于当前时间')
69
+ } else {
70
+ resolve(true)
71
+ }
72
+ }
73
+ })
74
+ }
75
+ },
76
+ isSolveOnce: {
77
+ required: false,
78
+ message: '',
79
+ validatFunc: (d): any => {
80
+ return new Promise((resolve, reject) => {
81
+ console.log(d)
82
+ if(!d && d !== isSolveOnce.no){
83
+ reject('请选择')
84
+ } else {
85
+ resolve(true)
86
+ }
87
+ })
88
+ }
89
+ },
90
+ materialImageUrl:{
91
+ required: false,
92
+ message: '',
93
+ validatFunc: (d): any => {
94
+ return new Promise((resolve, reject) => {
95
+ if(d && d.length > 3){
96
+ reject('上传不超过3张图片')
97
+ }
98
+ resolve(true)
99
+ })
100
+ }
101
+ },
102
+ completionWatermarkPhoto:{
103
+ required: false,
104
+ validatFunc: (d): any => {
105
+ return new Promise((resolve, reject) => {
106
+ if(d && d.length > 6){
107
+ reject('上传不超过6张图片')
108
+ }
109
+ resolve(true)
110
+ })
111
+ }
112
+ },
113
+ arrivalWatermarkPhoto: {
114
+ required: false,
115
+ validatFunc: (d): any => {
116
+ return new Promise((resolve, reject) => {
117
+ if(d && d.length > 6){
118
+ reject('上传不超过6张图片')
119
+ }
120
+ resolve(true)
121
+ })
122
+ }
123
+ },
124
+ }
125
+ let timer: number | null = null
126
+ const initialData = {
127
+ serviceType: '',
128
+ workForm: '',
129
+ isSolveOnce: '',
130
+ };
131
+
132
+ const focusState = reactive({
133
+ problemsAnalysis: false,
134
+ processingResult: false,
135
+ solution: false,
136
+ solutionDescription: false,
137
+ isSolveOnce: false,
138
+ isReturnVisit: false,
139
+ returnVisitDescription: false
140
+ })
141
+ const { formData, errState, setFormItem, validateForm, initialForm } = useForm<Omit<addFinishRecordParams, 'id'>>(
142
+ initialData as any,
143
+ validationRules,
144
+ true,
145
+ )
146
+ const dict = ref(useSystemStoreHook()?.dict);
147
+ const state = reactive({
148
+ workNodeStatus: workNodeEnum.FINISH,
149
+ id: '',
150
+ showDrawer: false,
151
+ })
152
+
153
+ const changeValue = (key: keyof Omit<addFinishRecordParams, 'id'>, detail: any) => {
154
+ setFormItem(key, detail.value);
155
+ }
156
+
157
+ const submitForm = throttle(async () => {
158
+ const validate = await validateForm()
159
+ if (!validate) {
160
+ return
161
+ }
162
+ const { materialImageUrl, arrivalWatermarkPhoto, completionWatermarkPhoto, ...other } = formData;
163
+ uni.showLoading()
164
+ const res = await addFinishRecord({
165
+ id: parseInt(state.id),
166
+ materialImageUrl: materialImageUrl?.map((item: any) => item.id),
167
+ arrivalWatermarkPhoto: arrivalWatermarkPhoto?.map((item: any) => item.id),
168
+ completionWatermarkPhoto: completionWatermarkPhoto?.map((item: any) => item.id),
169
+ ...other,
170
+ workNode: parseInt(state.workNodeStatus),
171
+ })
172
+ uni.hideLoading()
173
+ if (res) {
174
+ uni.showToast({ title: '保存成功', icon: 'success' })
175
+ timer = setTimeout(() => {
176
+ uni.redirectTo({ url: `/pages/afterSale/orderDetail?orderId=${state.id}`})
177
+ }, 2000)
178
+ uni.$emit('orderDetail-updated');
179
+ }
180
+ }, 1000)
181
+ const initFormData = () => {
182
+ const storageData = uni.getStorageSync('afterSaleOrderFinishData' + state.id) || {};
183
+ initialForm(storageData)
184
+ }
185
+ onLoad((event: any) => {
186
+ const { orderId, workNodeStatus } = event;
187
+ if (workNodeStatus) {
188
+ state.workNodeStatus = workNodeStatus;
189
+ state.id = orderId;
190
+ }
191
+ });
192
+ onMounted(() => {
193
+ useSystemStoreHook().getDictList(SERVICETYPE);
194
+ useSystemStoreHook().getDictList(WORKORDER_PROBLEM_CLASSIFICATION);
195
+ initFormData()
196
+ })
197
+ onUnmounted(() => {
198
+ if (timer) {
199
+ clearInterval(timer);
200
+ timer = null;
201
+ }
202
+ })
203
+ const saveData = () => {
204
+ uni.setStorage({
205
+ key: 'afterSaleOrderFinishData' + state.id,
206
+ data: {
207
+ ...formData
208
+ }
209
+ })
210
+ uni.showToast({ title: '保存成功', icon: 'success' })
211
+ }
212
+ const confirmSelect = (v: any[]) => {
213
+ state.showDrawer = false;
214
+ changeValue('workOrderProblemClassification', { value: v })
215
+ }
216
+ const formatDict = (list: any = [], key: string) => {
217
+ let target = ''
218
+ list?.map((value: string) => {
219
+ const item = dict.value?.[key]?.find((item: any) => item.dictLabelValue === value)
220
+ target = item?.dictLabelName + '; '+ target
221
+ })
222
+ return target
223
+ }
224
+ </script>
225
+
226
+ <template>
227
+ <view class="content">
228
+ <view class="form-content">
229
+ <view class="uni-form-item flex-space">
230
+ <view class="l-label">
231
+ 工作节点
232
+ </view>
233
+ <view class="form-value">工单完结</view>
234
+ </view>
235
+ <view class="uni-form-item flex-space" :id="`${scrollIdPrefix}serviceType`">
236
+ <view class="l-label">
237
+ <view class="flag">*</view>服务类型
238
+ </view>
239
+ <SinglePick class="select-box" :value="formData.serviceType" :range="dict?.[SERVICETYPE] || []"
240
+ value-key="dictLabelValue" label-key="dictLabelName" showRightIcon placeholder="请选择"
241
+ @change="(v) => changeValue('serviceType', { value: v })" />
242
+ </view>
243
+ <view class="err-text" v-if="errState.serviceType">{{ errState.serviceType }}</view>
244
+ <view class="uni-form-item flex-space" :id="`${scrollIdPrefix}workForm`">
245
+ <view class="l-label">
246
+ <view class="flag">*</view>工作形式
247
+ </view>
248
+ <SinglePick class="select-box" :value="formData.workForm" :range="workFormOptions" value-key="value"
249
+ label-key="label" showRightIcon placeholder="请选择" @change="(v) => changeValue('workForm', { value: v })" />
250
+ </view>
251
+ <view class="err-text" v-if="errState.workForm">{{ errState.workForm }}</view>
252
+ <view class="uni-form-item flex-space" :id="`${scrollIdPrefix}arrivalTime`">
253
+ <view class="l-label">到场时间</view>
254
+ <view class="dateSelect-box select-box">
255
+ <image class="right-icon" src="/static/img/turn_right.png" />
256
+ <uni-datetime-picker v-model="formData.arrivalTime"
257
+ @change="(v: string) => changeValue('arrivalTime', { value: v })">
258
+ <view class="common-picker">{{ formData.arrivalTime || '请选择' }}</view>
259
+ </uni-datetime-picker>
260
+ </view>
261
+ </view>
262
+ <view class="err-text" v-if="errState.arrivalTime">{{ errState.arrivalTime }}</view>
263
+ </view>
264
+ <view class="form-content">
265
+ <view class="l-label">
266
+ <view class="flag">*</view>故障问题分析
267
+ </view>
268
+ <textarea class="uni-textarea" placeholder="请填写" :value="formData.problemsAnalysis" maxlength="1000"
269
+ @input="(e: any) => changeValue('problemsAnalysis', e.detail)" @focus="focusState.problemsAnalysis = true"
270
+ @blur="focusState.problemsAnalysis = false" placeholder-class="holderClass" />
271
+ <view class="annotation">{{ formData.problemsAnalysis?.length || 0 }}/1000</view>
272
+ <view class="err-text" v-if="errState.problemsAnalysis">{{ errState.problemsAnalysis }}</view>
273
+ </view>
274
+ <view class="form-content">
275
+ <view class="l-label">
276
+ <view class="flag">*</view>处理结果描述
277
+ </view>
278
+ <textarea class="uni-textarea" placeholder="请填写" :value="formData.processingResult" maxlength="1000"
279
+ @input="(e: any) => changeValue('processingResult', e.detail)" @focus="focusState.processingResult = true"
280
+ @blur="focusState.processingResult = false" placeholder-class="holderClass" />
281
+ <view class="annotation">{{ formData.processingResult?.length || 0 }}/1000</view>
282
+ <view class="err-text" v-if="errState.processingResult">{{ errState.processingResult }}</view>
283
+ </view>
284
+ <view class="form-content">
285
+ <view class="uni-form-item flex-space">
286
+ <view class="l-label">
287
+ <view class="flag">*</view>工单问题归类
288
+ </view>
289
+ <view class="select-item" @click="state.showDrawer = true">
290
+ <view v-if="formData.workOrderProblemClassification?.length > 0">
291
+ {{ formatDict(formData.workOrderProblemClassification, WORKORDER_PROBLEM_CLASSIFICATION) }}
292
+ </view>
293
+ <view v-else>请选择</view>
294
+ <image class="right-icon" src="/static/img/turn_right.png" />
295
+ </view>
296
+ <view class="err-text" v-if="errState.workOrderProblemClassification">
297
+ {{ errState.workOrderProblemClassification }}</view>
298
+ </view>
299
+ <view class="uni-form-item flex-space flex-col">
300
+ <view class="l-label">领用物料</view>
301
+ <upload class="upload-box" :files="formData.materialImageUrl" :maxCount="3" :showUpload="true" :size="176"
302
+ :moduleName="FILE_UPLOAD_CONFIG.after_order.moduleName"
303
+ @change="(files: any) => changeValue('materialImageUrl', { value: files })" />
304
+ <view class="err-text" v-if="errState.materialImageUrl">{{ errState.materialImageUrl }}</view>
305
+ </view>
306
+ <view class="uni-form-item flex-space flex-col">
307
+ <view class="l-label">领用物料描述</view>
308
+ <textarea class="uni-textarea" placeholder="请填写"
309
+ :value="formData.materialsReceived" maxlength="100"
310
+ @input="(e: any) => changeValue('materialsReceived', e.detail)"
311
+ />
312
+ <view class="annotation">{{ formData.materialsReceived?.length || 0 }}/100</view>
313
+ <view class="err-text" v-if="errState.materialsReceived">{{ errState.materialsReceived }}</view>
314
+ </view>
315
+ </view>
316
+ <view class="form-content">
317
+ <view class="uni-form-item flex-space">
318
+ <view class="l-label">
319
+ <view class="flag">*</view>处理完结时间
320
+ </view>
321
+ <view class="dateSelect-box select-box">
322
+ <image class="right-icon" src="/static/img/turn_right.png" />
323
+ <uni-datetime-picker v-model="formData.completionTime"
324
+ @change="(v: string) => changeValue('completionTime', { value: v })">
325
+ <view class="common-picker">{{ formData.completionTime || '请选择' }}</view>
326
+ </uni-datetime-picker>
327
+ </view>
328
+ </view>
329
+ <view class="err-text" v-if="errState.completionTime">{{ errState.completionTime }}</view>
330
+ <view class="uni-form-item flex-space">
331
+ <view class="l-label">
332
+ <view class="flag">*</view>一次性解决
333
+ </view>
334
+ <SinglePick class="select-box" :value="formData.isSolveOnce" :range="isSolveOnceOptions" value-key="value"
335
+ label-key="label" showRightIcon placeholder="请选择" @change="(v) => changeValue('isSolveOnce', { value: v })" />
336
+ </view>
337
+ <view class="err-text" v-if="errState.isSolveOnce">{{ errState.isSolveOnce }}</view>
338
+ <view class="uni-form-item flex-space flex-col">
339
+ <view class="l-label">到场水印照片</view>
340
+ <upload class="upload-box" :files="formData.arrivalWatermarkPhoto" :maxCount="6" :showUpload="true" :size="176"
341
+ :moduleName="FILE_UPLOAD_CONFIG.after_order.moduleName"
342
+ @change="(files: any) => changeValue('arrivalWatermarkPhoto', { value: files })" />
343
+ <view class="err-text" v-if="errState.arrivalWatermarkPhoto">{{ errState.arrivalWatermarkPhoto }}</view>
344
+ </view>
345
+ <view class="uni-form-item flex-space flex-col">
346
+ <view class="l-label">处理完结水印照片</view>
347
+ <upload class="upload-box" :files="formData.completionWatermarkPhoto" :maxCount="6" :showUpload="true" :size="176"
348
+ :moduleName="FILE_UPLOAD_CONFIG.after_order.moduleName"
349
+ @change="(files: any) => changeValue('completionWatermarkPhoto', { value: files })" />
350
+ <view class="err-text" v-if="errState.completionWatermarkPhoto">{{ errState.completionWatermarkPhoto }}</view>
351
+ </view>
352
+ </view>
353
+ <RippleBtn @click="saveData" :customStyle="'margin-top: 50rpx;padding-bottom: 10rpx'">
354
+ <view class="submit-btn">保存</view>
355
+ </RippleBtn>
356
+ <RippleBtn @click="submitForm" :customStyle="'margin-top: 18rpx;padding-bottom: 10rpx'">
357
+ <view class="submit-btn">提交</view>
358
+ </RippleBtn>
359
+ <DrawerSelect
360
+ title="工单问题归类"
361
+ v-model:visible="state.showDrawer"
362
+ value-key="dictLabelValue" label-key="dictLabelName"
363
+ :options="dict?.[WORKORDER_PROBLEM_CLASSIFICATION]"
364
+ @change="(v) => confirmSelect(v)"
365
+ />
366
+ </view>
367
+ </img>
368
+ </template>
369
+
370
+ <style scoped>
371
+ .content {
372
+ background-color: #F5F5F5;
373
+ min-height: 100vh;
374
+ padding: 32rpx;
375
+
376
+ .form-content {
377
+ margin-bottom: 32rpx;
378
+ background-color: #fff;
379
+ border-radius: 16rpx;
380
+ padding: 0 32rpx;
381
+ position: relative;
382
+ }
383
+
384
+ .form-value {
385
+ margin-right: 24rpx;
386
+ }
387
+
388
+ .uni-form-item {
389
+ display: flex;
390
+ }
391
+
392
+ .select-item {
393
+ display: flex;
394
+ align-items: center;
395
+ padding: 32rpx 0;
396
+ font-size: 32rpx;
397
+ color: rgba(0, 0, 0, 0.6);
398
+ line-height: 48rpx;
399
+ .right-icon {
400
+ margin-left: 16rpx;
401
+ width: 32rpx;
402
+ height: 32rpx;
403
+ text-align: right;
404
+ }
405
+ }
406
+ .flex-space {
407
+ display: flex;
408
+ justify-content: space-between;
409
+ align-items: center;
410
+ color: rgba(0, 0, 0, 0.6);
411
+
412
+ &:not(:last-child) {
413
+ border-bottom: 1rpx solid rgba(0, 0, 0, 0.05);
414
+ }
415
+ }
416
+
417
+ .l-label {
418
+ display: flex;
419
+ align-items: center;
420
+ padding: 32rpx 0;
421
+ font-size: 32rpx;
422
+ color: rgba(0, 0, 0, 0.6);
423
+ line-height: 48rpx;
424
+
425
+ .flag {
426
+ font-size: 32rpx;
427
+ color: #E34D59;
428
+ line-height: 38rpx;
429
+ }
430
+ }
431
+
432
+ .annotation {
433
+ position: absolute;
434
+ bottom: 32rpx;
435
+ right: 32rpx;
436
+ font-weight: 400;
437
+ font-size: 24rpx;
438
+ color: rgba(0, 0, 0, 0.26);
439
+ line-height: 28rpx;
440
+ text-align: right;
441
+ }
442
+
443
+ .flex-col {
444
+ flex-direction: column;
445
+ align-items: flex-start;
446
+ }
447
+
448
+ .uni-textarea {
449
+ width: 100%;
450
+ line-height: 48rpx;
451
+ height: 288rpx;
452
+ font-size: 28rpx;
453
+ }
454
+
455
+ .select-box {
456
+ /* 确保SinglePick组件内的容器占满剩余空间 */
457
+ flex: 1;
458
+ min-width: 0;
459
+ /* 防止内容溢出 */
460
+ }
461
+
462
+ .upload-box {
463
+ display: flex;
464
+ flex-wrap: wrap;
465
+ gap: 20rpx;
466
+ padding-bottom: 32rpx;
467
+ .view-img {
468
+ width: 176rpx;
469
+ height: 176rpx;
470
+ }
471
+ }
472
+
473
+ .common-picker {
474
+ flex: 1;
475
+ text-align: right;
476
+ }
477
+
478
+ .dateSelect-box {
479
+ display: flex;
480
+ align-items: center;
481
+ flex-direction: row-reverse;
482
+ }
483
+
484
+ .right-icon {
485
+ margin-left: 16rpx;
486
+ width: 32rpx;
487
+ height: 32rpx;
488
+ text-align: right;
489
+ }
490
+
491
+ .err-text {
492
+ margin-top: 8rpx;
493
+ padding-left: 16rpx;
494
+ padding-bottom: 12rpx;
495
+ font-size: 24rpx;
496
+ color: rgb(250, 100, 100);
497
+ }
498
+
499
+ .submit-btn {
500
+ box-sizing: border-box;
501
+ width: 686rpx;
502
+ padding: 24rpx 0 26rpx 0;
503
+ line-height: 58rpx;
504
+ font-family: Source Han Sans SC, Source Han Sans SC;
505
+ font-weight: 400;
506
+ font-size: 40rpx;
507
+ color: rgba(255, 255, 255, 0.9);
508
+ background: linear-gradient(270deg, #1D9DE9 0%, #1D6FE9 100%);
509
+ box-shadow: 0px 16rpx 16rpx 2rpx rgba(29, 157, 233, 0.1);
510
+ border-radius: 52rpx;
511
+ }
512
+ }
513
+ .holderClass{
514
+ font-size: 28rpx;
515
+ color: rgba(0,0,0,0.25);
516
+ }
517
+ </style>