jufubao-base 1.0.221 → 1.0.222-beta2

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 (35) hide show
  1. package/package.json +1 -1
  2. package/src/components/JfbBaseAfterOrderList/Attr.js +13 -0
  3. package/src/components/JfbBaseAfterOrderList/JfbBaseAfterOrderList.vue +33 -1
  4. package/src/components/JfbBaseAfterSales/Api.js +58 -0
  5. package/src/components/JfbBaseAfterSales/Attr.js +25 -0
  6. package/src/components/JfbBaseAfterSales/JfbBaseAfterSales.vue +505 -0
  7. package/src/components/JfbBaseAfterSales/JfbBaseAfterSalesLess.less +79 -0
  8. package/src/components/JfbBaseAfterSales/JfbBaseAfterSalesMixin.js +30 -0
  9. package/src/components/JfbBaseAfterSales/Mock.js +13 -0
  10. package/src/components/JfbBaseAfterSales/refundOrderInfo.vue +96 -0
  11. package/src/components/JfbBaseAfterSalesDetail/Api.js +41 -0
  12. package/src/components/JfbBaseAfterSalesDetail/Attr.js +14 -0
  13. package/src/components/JfbBaseAfterSalesDetail/JfbBaseAfterSalesDetail.vue +518 -0
  14. package/src/components/JfbBaseAfterSalesDetail/JfbBaseAfterSalesDetailLess.less +79 -0
  15. package/src/components/JfbBaseAfterSalesDetail/JfbBaseAfterSalesDetailMixin.js +30 -0
  16. package/src/components/JfbBaseAfterSalesDetail/Mock.js +13 -0
  17. package/src/components/JfbBaseAfterSalesDetail/secProd.vue +54 -0
  18. package/src/components/JfbBaseAfterSalesFast/Api.js +30 -0
  19. package/src/components/JfbBaseAfterSalesFast/Attr.js +32 -0
  20. package/src/components/JfbBaseAfterSalesFast/JfbBaseAfterSalesFast.vue +273 -0
  21. package/src/components/JfbBaseAfterSalesFast/JfbBaseAfterSalesFastLess.less +79 -0
  22. package/src/components/JfbBaseAfterSalesFast/JfbBaseAfterSalesFastMixin.js +30 -0
  23. package/src/components/JfbBaseAfterSalesFast/Mock.js +13 -0
  24. package/src/components/JfbBaseAfterSalesList/Api.js +18 -0
  25. package/src/components/JfbBaseAfterSalesList/Attr.js +48 -0
  26. package/src/components/JfbBaseAfterSalesList/JfbBaseAfterSalesList.vue +454 -0
  27. package/src/components/JfbBaseAfterSalesList/JfbBaseAfterSalesListLess.less +79 -0
  28. package/src/components/JfbBaseAfterSalesList/JfbBaseAfterSalesListMixin.js +30 -0
  29. package/src/components/JfbBaseAfterSalesList/Mock.js +5 -0
  30. package/src/components/JfbBaseOrderDetail/Attr.js +12 -0
  31. package/src/components/JfbBaseOrderDetail/JfbBaseOrderDetail.vue +4 -0
  32. package/src/components/JfbBaseOrderList/Attr.js +36 -0
  33. package/src/components/JfbBaseOrderList/JfbBaseOrderList.vue +30 -0
  34. package/src/components/JfbBaseOrderList/Mock.js +1 -1
  35. package/src/components/JfbBaseOrderList/XdTfkOrderItem.vue +17 -5
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jufubao-base",
3
- "version": "1.0.221",
3
+ "version": "1.0.222-beta2",
4
4
  "private": false,
5
5
  "description": "聚福宝业务组件基础插件包",
6
6
  "main": "index.js",
@@ -5,6 +5,19 @@ export default {
5
5
  advanced: [],
6
6
  content: (data)=>{
7
7
  return [
8
+ {
9
+ label: "状态筛选:",
10
+ ele: "xd-radio",
11
+ valueKey: "showStatusFilter",
12
+ groupKey: "content",
13
+ value: data['showStatusFilter'],
14
+ placeholder: '请选择状态筛选',
15
+ className: 'input80',
16
+ list: [
17
+ {label:'展示',value:'Y'},
18
+ {label:'隐藏',value:'N'}
19
+ ]
20
+ },
8
21
  {
9
22
  label: '外填充:',
10
23
  ele: 'xd-margin-padding',
@@ -16,7 +16,17 @@
16
16
  <view class="jfb-base-after-order-list__edit-icon" @click="delEdit">删除</view>
17
17
  </view>
18
18
  <!-- #endif -->
19
- <view class="jfb-base-after-order-list__body">
19
+ <view class="jfb-base-after-order-list__body" :style="{
20
+ '--main-color': mainColor,
21
+ }">
22
+ <view v-if="showStatusFilter==='Y'" class="filter_tab" :style="{
23
+ top: layoutInfo.top + 'rpx',
24
+ }">
25
+ <view class="filter_item active">处理中</view>
26
+ <view class="filter_item">已完成</view>
27
+ </view>
28
+ <view style="height: 80rpx"></view>
29
+
20
30
  <view :style="{ padding: outMargin }">
21
31
  <view v-if="loadingList" class="skeleton-wrap">
22
32
  <view
@@ -131,6 +141,8 @@ export default {
131
141
  loadingList: true,
132
142
  brandTextColor:'',
133
143
 
144
+ showStatusFilter: "",
145
+
134
146
  //基础
135
147
  radius: 0,
136
148
  backgroundColor: "",
@@ -187,6 +199,7 @@ export default {
187
199
  * @param container {object} 业务组件对象自己
188
200
  */
189
201
  init(container) {
202
+ this.showStatusFilter = getContainerPropsValue(container, "content.showStatusFilter", "");
190
203
  this.margin = getContainerPropsValue(container, "content.margin", {});
191
204
  this.radius = getContainerPropsValue(container, "content.radius", 0);
192
205
  this.backgroundColor = getContainerPropsValue(container, "content.backgroundColor", "#f8f8f8");
@@ -272,6 +285,25 @@ export default {
272
285
 
273
286
  .jfb-base-after-order-list {
274
287
  &__body {
288
+ .filter_tab{
289
+ display: flex;
290
+ align-items: center;
291
+ justify-content: center;
292
+ height: 80rpx;
293
+ line-height: 80rpx;
294
+ border-bottom: 1px solid #DDD;
295
+ position: fixed;
296
+ top: 0;
297
+ left: 0;
298
+ width: 100%;
299
+ .filter_item{
300
+ margin: 0 40rpx;
301
+ &.active{
302
+ border-bottom: 1px solid var(--main-color);
303
+ color: var(--main-color);
304
+ }
305
+ }
306
+ }
275
307
  .brand-name {
276
308
  padding-top: 5rpx;
277
309
  font-size: 24rpx;
@@ -0,0 +1,58 @@
1
+ 'use strict';
2
+ /**
3
+ * @description 接口配置,
4
+ * 在设置方法名字当时候,别忘记加上【模块名字】:After
5
+ * @type {*[]}
6
+ */
7
+ module.exports = [
8
+ {
9
+ mapFnName: "getAfterOmsOrder",
10
+ path: "/aftersale/v1/service-order/get-oms-order",
11
+ title: "获取订单信息",
12
+ isRule: false,
13
+ params: {
14
+ main_order_id: ['主单订单号', 'String', true],
15
+ db_from: ['来源', 'String', true],
16
+ },
17
+ isConsole: true,
18
+ disabled: true,
19
+ },
20
+ {
21
+ mapFnName: "getAfterSalesTypeList",
22
+ path: "/aftersale/v1/service-order/after-sales-type-list",
23
+ title: "售后类型列表",
24
+ isRule: false,
25
+ params: {},
26
+ isConsole: true,
27
+ disabled: true,
28
+ },
29
+ {
30
+ mapFnName: "createAfterServiceOrder",
31
+ path: "/aftersale/v1/service-order/create",
32
+ title: "服务单创建",
33
+ isRule: false,
34
+ data: {
35
+ after_sale_method: ['售后方式', 'refund:退款 refund_and_good:退货退款 exchange:换货 again:补发 good:退货不退款', true],
36
+ after_sale_type: ['售后类型', 'String', true],
37
+ main_order_id: ['订单号', 'String', true],
38
+ customer_feedback: ['客户反馈', 'String', true],
39
+ sub_order_id: ['子订单号', 'String', true],
40
+ business_code: ['业务编码', 'String', false],
41
+ refund_voucher: ['售后图片json', 'String', false],
42
+ product_list: ['商品列表', 'String', false],
43
+ db_from: ['来源', 'String', true],
44
+ },
45
+ isConsole: true,
46
+ disabled: true,
47
+ },
48
+ {
49
+ mapFnName: "getConOssSign",
50
+ title: "获取上传参数",
51
+ path: "/common-user/v1/h5-oss/sign",
52
+ isRule: false,
53
+ data: {
54
+ },
55
+ isConsole: true,
56
+ disabled: true,
57
+ },
58
+ ];
@@ -0,0 +1,25 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @description 当表单组件中有联动操作时候,使用方法进行返回
5
+ */
6
+ export default {
7
+ style: [],
8
+ content: (data) => {
9
+ return [
10
+ {
11
+ label: '售后详情页面路径:',
12
+ ele: 'xd-select-pages-path',
13
+ valueKey: 'refundStepPath',
14
+ groupKey:'advanced',
15
+ placeholder: '请选择售后详情页面路径',
16
+ value: data['refundStepPath'] || null,
17
+ setting: {
18
+ router: XdBus.getParentApi('getPagesTree'),
19
+ },
20
+ inline: false,
21
+ },
22
+ ].filter(i=>i)
23
+ },
24
+ advanced: [],
25
+ };
@@ -0,0 +1,505 @@
1
+ <template>
2
+ <view
3
+ class="jfb-base-after-sales"
4
+ @click="handleEditxSelect"
5
+ :class="{ editx : isEditx && active }"
6
+ >
7
+ <!--#ifdef H5-->
8
+ <view
9
+ class="jfb-base-after-sales__edit"
10
+ :class="{ editx : isEditx && active }"
11
+ v-if="isEditx && active"
12
+ >
13
+ <view class="jfb-base-after-sales__edit-icon" @click="delEdit">删除</view>
14
+ </view>
15
+ <!-- #endif -->
16
+ <view class="jfb-base-after-sales__body" :style="{
17
+ minHeight: layoutInfo.bodyMinHeightRpx + 'rpx',
18
+ '--main-color': mainColor
19
+ }">
20
+ <template v-if="step == 1">
21
+ <view class="s_type_box">
22
+ <view class="s_type_title">请选择售后类型</view>
23
+ <view class="service_types">
24
+ <view class="service_item"
25
+ :class="{ active: item.value === after_sale_method }"
26
+ v-for="item in afterSalesMethod" :key="item.value"
27
+ @click="handleSelectAfterSalesMethod(item)"
28
+ >{{ item.label }}</view>
29
+ </view>
30
+ </view>
31
+
32
+ <RefundOrderInfo :list="productList"
33
+ :orderNumber="baseInfo.main_order_id"
34
+ :showRadio="canChoseProduct"
35
+ ></RefundOrderInfo>
36
+
37
+ <view class="bottom_fixed">
38
+ <xd-button type="primary" @click="handleStepNext">下一步</xd-button>
39
+ </view>
40
+ </template>
41
+
42
+ <template v-if="step == 2">
43
+ <RefundOrderInfo :list="productList"
44
+ :showRadio="false"
45
+ :orderNumber="baseInfo.main_order_id"
46
+ ></RefundOrderInfo>
47
+
48
+ <view class="list_section section_inline" @click="toChoseReason">
49
+ <view class="sec_label">
50
+ <view class="label_require">*</view>
51
+ <view>申请原因</view>
52
+ </view>
53
+ <view class="sec_content">
54
+ <view>{{ afterSaleTypeText }}</view>
55
+ <xd-font-icon icon="iconxiangyou_xian" :size="28" style="margin-left: 8rpx;"></xd-font-icon>
56
+ </view>
57
+ </view>
58
+ <view class="list_section">
59
+ <view class="sec_label">
60
+ <view class="label_require">*</view>
61
+ <view>问题描述</view>
62
+ </view>
63
+ <view class="sec_content">
64
+ <textarea v-model="customer_feedback"
65
+ placeholder="请描述您遇到的问题"
66
+ style="width: 100%;background:#FAFAFA;height: 140rpx;padding: 16rpx;border-radius: 8rpx;font-size: 24rpx;"
67
+ ></textarea>
68
+ </view>
69
+ </view>
70
+
71
+ <view class="list_section">
72
+ <view class="sec_label">
73
+ <view>上传凭证</view>
74
+ <view class="label_sub">最多9张</view>
75
+ </view>
76
+ <view class="sec_content">
77
+ <view class="img_list">
78
+ <view class="img_box" v-for="(img, i) in showRefundImages" :key="i">
79
+ <image :src="img" class="img_item" mode="aspectFit"></image>
80
+ </view>
81
+ <view class="img_box img_add" @click="doAddImage">
82
+ <view class="icon">+</view>
83
+ </view>
84
+ </view>
85
+ </view>
86
+ </view>
87
+
88
+ <view class="bottom_fixed">
89
+ <xd-button type="primary" @click="handleApplyRefund">提交申请</xd-button>
90
+ </view>
91
+ </template>
92
+ <xd-down-drawer :show.sync="reasonShow" :isClose="false">
93
+ <view class="refund_reason_head">申请原因</view>
94
+ <view class="refund_reason_body" style="min-height: 50vh;max-height: 75vh;">
95
+ <view class="reason_cont">
96
+ <view class="reason_item" v-for="item in afterSalesTypes" :key="item.id">
97
+ <view>{{ item.type_name }}</view>
98
+ <xd-radio :value="temp_type === item.id" @change="selectApplyReason(item.id)"></xd-radio>
99
+ </view>
100
+ </view>
101
+ <view class="reason_foot">
102
+ <xd-button type="primary" @click="handleChoseReason">确定</xd-button>
103
+ </view>
104
+ </view>
105
+ </xd-down-drawer>
106
+ </view>
107
+ </view>
108
+ </template>
109
+
110
+ <script>
111
+ import XdFontIcon from "@/components/XdFontIcon/XdFontIcon";
112
+ import XdButton from "@/components/XdButton/XdButton";
113
+ import XdRadio from "@/components/XdRadio/XdRadio"
114
+ import XdDownDrawer from "@/components/XdDownDrawer/XdDownDrawer"
115
+ import RefundOrderInfo from "./refundOrderInfo.vue"
116
+ import { jfbRootExec } from "@/utils/xd.event";
117
+ import JfbBaseAfterSalesMixin from "./JfbBaseAfterSalesMixin";
118
+ import { getContainerPropsValue } from "@/utils/xd.base";
119
+ import componentsMixins from "@/mixins/componentsMixins";
120
+ import extsMixins from "@/mixins/extsMixins";
121
+ import getServiceUrl from "@/common/getServiceUrl";
122
+ export default {
123
+ name: "JfbBaseAfterSales",
124
+ components: {
125
+ XdFontIcon,
126
+ XdButton,
127
+ XdRadio,
128
+ XdDownDrawer,
129
+ RefundOrderInfo
130
+ },
131
+ mixins: [
132
+ componentsMixins, extsMixins, JfbBaseAfterSalesMixin
133
+ ],
134
+ data() {
135
+ return {
136
+ step: 1,
137
+ reasonShow: false,
138
+ afterSalesMethod: [],
139
+ after_sale_method: "",
140
+ after_sale_type: "",
141
+ temp_type: "",
142
+ service_product_list: [],
143
+ customer_feedback: "",
144
+
145
+ productList: [],
146
+ afterSalesTypes: [],
147
+ baseInfo: {},
148
+
149
+ refundImgList: [],
150
+ order_id: "",
151
+ //todo
152
+ refundStepPath: "",
153
+ }
154
+ },
155
+ computed: {
156
+ canChoseProduct(){
157
+ if(!this.after_sale_method) return false;
158
+ if(this.baseInfo.support_refund_method === 'all' && this.after_sale_method === 'refund_and_good') return false;
159
+ if(this.productList.length === 1) return false;
160
+ return true;
161
+ },
162
+ afterSaleTypeText(){
163
+ if(!this.after_sale_type) return "";
164
+ let item = this.afterSalesTypes.find(i => i.id === this.after_sale_type);
165
+ return item ? item.type_name : "";
166
+ },
167
+ showRefundImages(){
168
+ return this.refundImgList.map(item => getServiceUrl(item))
169
+ }
170
+ },
171
+ watch: {
172
+ container(value, oldValue) {
173
+ if (JSON.stringify(value) === JSON.stringify(oldValue)) return;
174
+ if (this.$configProject['isPreview']) this.init(value)
175
+ },
176
+ },
177
+ created() {
178
+ this.init(this.container);
179
+
180
+ //todo
181
+ },
182
+ methods: {
183
+ onJfbLoad(options) {
184
+ this.order_id = options.order_id;
185
+ this.p_getAfterOmsOrder();
186
+ this.p_getAfterSalesTypeList();
187
+ },
188
+ /**
189
+ * @description 监听事件变化
190
+ * @param container {object} 业务组件对象自己
191
+ */
192
+ init(container) {
193
+ this.refundStepPath = getContainerPropsValue(container, 'content.refundStepPath', {value: ""}).value;
194
+ },
195
+ doAddImage(){
196
+ uni.chooseImage({
197
+ count: 1,
198
+ sourceType: ['camera'],
199
+ success: async (res) => {
200
+ console.log('chooseImage',res);
201
+ // let filePath = res.tempFilePaths[0];
202
+ let file = res.tempFiles[0];
203
+ this.$xdShowLoading({});
204
+ try{
205
+ let image = await this.uploadImage(file);
206
+ this.refundImgList.push(image);
207
+ this.$xdHideLoading();
208
+ }catch(err){
209
+ this.$xdHideLoading();
210
+ }
211
+ }
212
+ })
213
+ },
214
+ uploadImage(file){
215
+ let fileName = file.name;
216
+ return new Promise((resolve, reject) => {
217
+ jfbRootExec("getConOssSign", {
218
+ vm: this,
219
+ data: { name: fileName }
220
+ }).then(res => {
221
+ let OSSAccessKeyId = res['id']
222
+ let cdnUrl = res['cdn_url']
223
+ delete res['id']
224
+ delete res['cdn_url']
225
+ uni.uploadFile({
226
+ url: res.action,
227
+ file: file,
228
+ name: 'file',
229
+ formData: {
230
+ ...res,
231
+ OSSAccessKeyId: OSSAccessKeyId,
232
+ name: fileName,
233
+ cdnUrl: cdnUrl,
234
+ success_action_status: 200
235
+ },
236
+ success: (r) => {
237
+ resolve(`/${res.key}`);
238
+ },
239
+ fail:(err)=>{
240
+ resolve('');
241
+ console.error(err)
242
+ }
243
+ });
244
+ }).catch(err => {
245
+ reject(err);
246
+ })
247
+ })
248
+
249
+ },
250
+ p_getAfterSalesTypeList(){
251
+ jfbRootExec("getAfterSalesTypeList", {
252
+ vm: this,
253
+ data: {}
254
+ }).then(res => {
255
+ this.afterSalesTypes = res.list;
256
+ })
257
+ },
258
+ p_getAfterOmsOrder(){
259
+ this.$xdShowLoading({});
260
+ jfbRootExec("getAfterOmsOrder", {
261
+ vm: this,
262
+ data: {
263
+ main_order_id: this.order_id
264
+ }
265
+ }).then(res => {
266
+ this.$xdHideLoading();
267
+ const { product_list, base_info } = res;
268
+ this.productList = product_list.map(item => {
269
+ item.product_thumb = getServiceUrl(item.product_thumb, 'size2');
270
+ return item;
271
+ });
272
+ this.baseInfo = base_info;
273
+ try{
274
+ this.afterSalesMethod = JSON.parse(base_info.support_aftersale_method);
275
+ }catch(e){}
276
+
277
+ })
278
+ },
279
+ handleSelectAfterSalesMethod(item){
280
+ this.after_sale_method = item.value;
281
+ this.$nextTick(() => {
282
+ if(this.productList.length === 1){
283
+ this.service_product_list = [this.productList[0]];
284
+ }
285
+ })
286
+ },
287
+ handleApplyRefund(){
288
+ let { order_id, after_sale_method, after_sale_type, customer_feedback } = this;
289
+ let data = {
290
+ main_order_id: order_id,
291
+ after_sale_method,
292
+ after_sale_type,
293
+ customer_feedback,
294
+ refund_voucher: JSON.stringify(this.refundImgList),
295
+ product_list: JSON.stringify(this.service_product_list.map(item => ({
296
+ product_id: item.product_id,
297
+ product_sku_id: item.sku_id,
298
+ product_num: item.product_num,
299
+ gift_id: item.gift_id
300
+ })))
301
+ }
302
+ jfbRootExec("createAfterServiceOrder", {
303
+ vm: this,
304
+ data: data
305
+ }).then(res => {
306
+ this.$xdUniHelper.navigateTo({
307
+ url: `${this.refundStepPath}?service_order_id=${res.service_order_id}`,
308
+ });
309
+ })
310
+ },
311
+ handleStepNext(){
312
+ if(!this.after_sale_method){
313
+ this.$xdAlert({
314
+ content: '请选择售后类型',
315
+ type: "error"
316
+ })
317
+ return;
318
+ }
319
+ this.step = 2;
320
+ },
321
+ toChoseReason(){
322
+ this.reasonShow = true;
323
+ },
324
+ selectApplyReason(id){
325
+ this.temp_type = id;
326
+ },
327
+ handleChoseReason(){
328
+ this.reasonShow = false;
329
+ this.after_sale_type = this.temp_type;
330
+ },
331
+ onJfbScroll(options) {
332
+ // console.log('event.onJfbScroll', options)
333
+ },
334
+ onJfbReachBottom(options) {
335
+ console.log('event.onJfbReachBottom', options)
336
+ },
337
+ onJfbShow(options) {
338
+ console.log('event.onJfbShow', options)
339
+ },
340
+ onJfbHide(options) {
341
+ console.log('event.onJfbHide', options)
342
+ },
343
+ onJfbBack(options) {
344
+ console.log('event.onJfbBack', options)
345
+ },
346
+ onJfbUpdate(...data) {
347
+ console.log('event.onJfbUpdate', data)
348
+ },
349
+ onJfbCustomEvent(options) {
350
+ console.log('event.onJfbReachBottom', options)
351
+ },
352
+ }
353
+ }
354
+
355
+ </script>
356
+
357
+ <style scoped lang="less">
358
+ @import "./JfbBaseAfterSalesLess.less";
359
+
360
+ .jfb-base-after-sales {
361
+ &__body{
362
+ padding: 20rpx 20rpx 120rpx;
363
+ box-sizing: border-box;
364
+ background-color: #EEEEEE;
365
+ .s_type_box{
366
+ background-color: #FFFFFF;
367
+ border-radius: 16rpx;
368
+ padding: 36rpx;
369
+ font-size: 26rpx;
370
+ .s_type_title{
371
+ color: #333333;
372
+ font-weight: 500;
373
+ margin-bottom: 28rpx;
374
+ }
375
+ .service_types{
376
+ display: flex;
377
+ flex-wrap: wrap;
378
+
379
+ .service_item{
380
+ padding: 12rpx 48rpx;
381
+ border-radius: 40rpx;
382
+ background-color: #F3F3F3;
383
+ color: #999999;
384
+ margin-right: 15rpx;
385
+ &:nth-child(4n){
386
+ margin-right: 0;
387
+ }
388
+ &.active{
389
+ background-color: var(--main-color);
390
+ color: #FFFFFF;
391
+ }
392
+ }
393
+ }
394
+ }
395
+
396
+ .list_section{
397
+ padding: 24rpx 36rpx;
398
+ border-radius: 16rpx;
399
+ background-color: #FFFFFF;
400
+ display: flex;
401
+ flex-direction: column;
402
+ margin: 20rpx 0;
403
+ color: #333333;
404
+ font-size: 28rpx;
405
+ &.section_inline{
406
+ flex-direction: row;
407
+ justify-content: space-between;
408
+ .sec_label{
409
+ margin-bottom: 0;
410
+ }
411
+ }
412
+ .sec_label{
413
+ display: flex;
414
+ align-items: center;
415
+ margin-bottom: 24rpx;
416
+ .label_require{
417
+ color: #FF5733;
418
+ margin-right: 4rpx;
419
+ }
420
+ .label_sub{
421
+ color: #CCCCCC;
422
+ font-size: 24rpx;
423
+ margin-left: 16rpx;
424
+ }
425
+ }
426
+ .sec_content{
427
+ display: flex;
428
+ align-items: center;
429
+ color: #666666;
430
+
431
+ .img_list{
432
+ display: flex;
433
+ flex-wrap: wrap;
434
+ .img_box{
435
+ width: 160rpx;
436
+ height: 160rpx;
437
+ border-radius: 8rpx;
438
+ border: 1px solid #E0E0E0;
439
+ margin-right: 28rpx;
440
+ margin-bottom: 28rpx;
441
+ .img_item{
442
+ width: 100%;
443
+ height: 100%;
444
+ }
445
+
446
+ &.img_add{
447
+ display: flex;
448
+ align-items: center;
449
+ justify-content: center;
450
+ .icon{
451
+ border: 1px solid #E0E0E0;
452
+ width: 36rpx;
453
+ height: 36rpx;
454
+ border-radius: 6rpx;
455
+ display: flex;
456
+ align-items: center;
457
+ justify-content: center;
458
+ color: #E0E0E0;
459
+ }
460
+ }
461
+ }
462
+ }
463
+ }
464
+ }
465
+ .bottom_fixed{
466
+ position: fixed;
467
+ bottom: 0;
468
+ left: 0;
469
+ width: 100%;
470
+ padding: 20rpx;
471
+ box-sizing: border-box;
472
+ }
473
+ .refund_reason_head{
474
+ padding: 32rpx 0;
475
+ text-align: center;
476
+ border-bottom: 1px solid #F2F2F2;
477
+ margin: 0 32rpx;
478
+ font-size: 28rpx;
479
+ color: #333333;
480
+ font-weight: bold;
481
+ }
482
+ .refund_reason_body{
483
+ display: flex;
484
+ flex-direction: column;
485
+ .reason_cont{
486
+ flex: 1;
487
+ padding: 0 40rpx;
488
+ overflow: auto;
489
+ .reason_item{
490
+ display: flex;
491
+ align-items: center;
492
+ justify-content: space-between;
493
+ padding: 20rpx 20rpx;
494
+ font-size: 28rpx;
495
+ color: #333333;
496
+ }
497
+ }
498
+ .reason_foot{
499
+ padding: 32rpx;
500
+ border-top: 1px solid #F2F2F2;
501
+ }
502
+ }
503
+ }
504
+ }
505
+ </style>