jufubao-takeorder 1.0.2-beta4 → 1.0.2-beta6

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 (27) hide show
  1. package/package.json +1 -1
  2. package/src/components/JfbTakeorderFilterOrderList/Api.js +16 -31
  3. package/src/components/JfbTakeorderFilterOrderList/Attr.js +10 -6
  4. package/src/components/JfbTakeorderFilterOrderList/JfbTakeorderFilterOrderList.vue +304 -161
  5. package/src/components/JfbTakeorderFilterOrderList/Mock.js +1 -1
  6. package/src/components/JfbTakeorderFilterOrderList/cusAttr/advanced.js +26 -0
  7. package/src/components/JfbTakeorderFilterOrderList/cusAttr/content.js +9 -0
  8. package/src/components/JfbTakeorderFilterOrderList/cusAttr/style.js +11 -0
  9. package/src/components/JfbTakeorderIndex/Api.js +47 -1
  10. package/src/components/JfbTakeorderIndex/JfbTakeorderIndex.vue +221 -129
  11. package/src/components/JfbTakeorderIndex/Mock.js +4 -4
  12. package/src/components/JfbTakeorderIndex/components/cityPicker.vue +29 -21
  13. package/src/components/JfbTakeorderOrderDetail/Api.js +102 -0
  14. package/src/components/JfbTakeorderOrderDetail/JfbTakeorderOrderDetail.vue +1031 -665
  15. package/src/components/JfbTakeorderOrderDetail/Mock.js +9 -9
  16. package/src/components/JfbTakeorderOrderDetail/components/CusEditQuote.vue +2 -13
  17. package/src/components/JfbTakeorderOrderDetail/components/products.vue +16 -13
  18. package/src/components/JfbTakeorderOrderList/Api.js +16 -31
  19. package/src/components/JfbTakeorderOrderList/JfbTakeorderOrderList.vue +259 -123
  20. package/src/components/JfbTakeorderOrderList/Mock.js +1 -1
  21. package/src/components/JfbTakeorderOrderList/cusAttr/content.js +5 -5
  22. package/src/components/JfbTakeorderVoiceSwitch/Api.js +14 -33
  23. package/src/components/JfbTakeorderVoiceSwitch/JfbTakeorderVoiceSwitch.vue +154 -105
  24. package/src/components/JfbTakeorderVoiceSwitch/Mock.js +2 -10
  25. package/src/components/JfbTakeorderFilterOrderList/components/order.vue +0 -277
  26. package/src/components/JfbTakeorderIndex/components/order.vue +0 -273
  27. package/src/components/JfbTakeorderOrderList/components/order.vue +0 -273
@@ -2,131 +2,287 @@
2
2
  <view
3
3
  class="jfb-takeorder-order-detail"
4
4
  @click="handleEditxSelect"
5
- :class="{ editx : isEditx && active }"
5
+ :class="{ editx: isEditx && active }"
6
6
  >
7
7
  <!--#ifdef H5-->
8
8
  <view
9
9
  class="jfb-takeorder-order-detail__edit"
10
- :class="{ editx : isEditx && active }"
10
+ :class="{ editx: isEditx && active }"
11
11
  v-if="isEditx && active"
12
12
  >
13
13
  <view class="jfb-takeorder-order-detail__edit-icon" @click.stop="delEdit">
14
- <xd-font-icon icon="iconshanchu-01" color="#fff" size="30"></xd-font-icon>
14
+ <xd-font-icon
15
+ icon="iconshanchu-01"
16
+ color="#fff"
17
+ size="30"
18
+ ></xd-font-icon>
15
19
  </view>
16
20
  </view>
17
21
  <!-- #endif -->
18
22
  <!-- 待上报状态倒计时横幅 -->
19
- <view
20
- v-if="status==='daishangbao' && !isOrderCountdownEnd"
21
- class="jfb-takeorder-order-detail__countdown-banner"
22
- :style="{backgroundColor: mainColor}"
23
+ <view
24
+ class="jfb-takeorder-order-detail__body"
25
+ :style="{ minHeight: layoutInfo.bodyMinHeight }"
26
+ v-if="info"
23
27
  >
24
- <xd-font-icon icon="iconshijian-01" color="#fff" size="36"></xd-font-icon>
25
- <view class="jfb-takeorder-order-detail__countdown-text">
26
- 订单剩余完成时间: {{ formatCountdownTime(orderCountdownSeconds) }}
28
+ <view
29
+ v-if="
30
+ (info.user_quotation_status === 'received' ||
31
+ info.user_quotation_status === 'win_order') &&
32
+ info.order_status !== 'close'
33
+ "
34
+ class="jfb-takeorder-order-detail__countdown-banner"
35
+ :style="{ backgroundColor: mainColor }"
36
+ >
37
+ <xd-font-icon
38
+ style="margin-right: 10rpx"
39
+ icon="iconshijian-01"
40
+ color="#fff"
41
+ size="36"
42
+ ></xd-font-icon>
43
+ <view
44
+ v-if="info.user_quotation_status === 'received'"
45
+ class="jfb-takeorder-order-detail__countdown-text"
46
+ >
47
+ 订单剩余完成时间: {{ formatCountdownTime(reportCountdownSeconds) }}
48
+ </view>
49
+ <view
50
+ v-if="info.user_quotation_status === 'win_order'"
51
+ class="jfb-takeorder-order-detail__countdown-text"
52
+ >
53
+ 订单剩余完成时间: {{ formatCountdownTime(receiveCountdownSeconds) }}
54
+ </view>
27
55
  </view>
28
- </view>
29
- <view class="jfb-takeorder-order-detail__body">
30
- <Products :info="info" :status="status"></Products>
31
- <view v-if="status!=='daishangbao'" class="wrap">
32
- <view class="other-info-item" v-if="step===1||step===3">
56
+ <Products :info="info"></Products>
57
+ <view
58
+ v-if="
59
+ info.user_quotation_status === 'wait_quote' ||
60
+ info.user_quotation_status === 'quoted' ||
61
+ info.order_status === 'close' ||
62
+ info.user_quotation_status === 'cancel_quotation'
63
+ "
64
+ class="wrap"
65
+ >
66
+ <view
67
+ class="other-info-item"
68
+ v-if="
69
+ step === 1 ||
70
+ info.user_quotation_status === 'quoted' ||
71
+ info.order_status === 'close'
72
+ "
73
+ >
33
74
  <view>市场原价(仅供参考)</view>
34
- <view :style="{color:mainColor}"><text>¥ </text>145</view>
75
+ <view :style="{ color: mainColor }"
76
+ ><text>¥ </text
77
+ >{{
78
+ $xdUniHelper.divisionFloatNumber(info.market_amount, 100)
79
+ }}</view
80
+ >
35
81
  </view>
36
82
  <view class="other-info-item">
37
83
  <view>商品总数</view>
38
- <view style="display:flex;align-items: center;"><xd-font-icon size="28" icon="iconguanbi"></xd-font-icon>9</view>
84
+ <view style="display: flex; align-items: center"
85
+ ><xd-font-icon size="28" icon="iconguanbi"></xd-font-icon
86
+ >{{ info.product_total }}</view
87
+ >
39
88
  </view>
40
- <view class="other-info-item" v-if="step===1||step===3">
89
+ <view
90
+ class="other-info-item"
91
+ v-if="
92
+ step === 1 ||
93
+ info.user_quotation_status === 'quoted' ||
94
+ info.order_status === 'close'
95
+ "
96
+ >
41
97
  <view>报价人数</view>
42
- <view>78人</view>
98
+ <view>{{ info.quotation_person_count }}人</view>
43
99
  </view>
44
- <view class="other-info-item" v-if="step===1||step===3">
100
+ <view
101
+ class="other-info-item"
102
+ v-if="
103
+ step === 1 ||
104
+ info.user_quotation_status === 'quoted' ||
105
+ info.order_status === 'close'
106
+ "
107
+ >
45
108
  <view>报价倒计时</view>
46
- <view :style="{color:mainColor}">{{ !isCountdownEnd?formatTime(remainingSeconds):'报价结束' }}</view>
109
+ <view :style="{ color: mainColor }">{{
110
+ !isCountdownEnd ? formatTime(info.rest_quotation_time) : "报价结束"
111
+ }}</view>
47
112
  </view>
48
- <view class="other-info-item" v-if="step===2">
113
+ <view class="other-info-item" v-if="step === 2">
49
114
  <view>您的报价</view>
50
- <view :style="{color:mainColor}"><text>¥ </text>145</view>
115
+ <view :style="{ color: mainColor }"
116
+ ><text>¥ </text>{{ quotePrice }}</view
117
+ >
51
118
  </view>
52
- <view class="other-info-item" v-if="step===2">
119
+ <view class="other-info-item" v-if="step === 2">
53
120
  <view>预计结算</view>
54
- <view :style="{color:mainColor}"><text>¥ </text>145</view>
121
+ <view :style="{ color: mainColor }"
122
+ ><text>¥ </text>{{ quotePriceTotal }}</view
123
+ >
55
124
  </view>
56
125
  </view>
57
126
  <view v-else class="wrap">
58
127
  <view class="other-info-item">
59
128
  <view>订单编号</view>
60
- <view>HJKYUYYU7878</view>
129
+ <view>{{ info.order_id }}</view>
61
130
  </view>
62
131
  <view class="other-info-item">
63
132
  <view>商品总数</view>
64
- <view style="display:flex;align-items: center;"><xd-font-icon size="28" icon="iconguanbi"></xd-font-icon>9</view>
133
+ <view style="display: flex; align-items: center"
134
+ ><xd-font-icon size="28" icon="iconguanbi"></xd-font-icon
135
+ >{{ info.product_total }}</view
136
+ >
65
137
  </view>
66
138
  <view class="other-info-item">
67
139
  <view>订购电话</view>
68
- <view>18888888888</view>
140
+ <view>{{ info.buyer_phone_number }}</view>
69
141
  </view>
70
142
  <view class="other-info-item">
71
143
  <view>订单结算价</view>
72
- <view :style="{color:mainColor}"><text>¥ </text>145</view>
144
+ <view :style="{ color: mainColor }"
145
+ ><text>¥ </text>
146
+ {{
147
+ $xdUniHelper.divisionFloatNumber(
148
+ info.receive_user_settle_amount,
149
+ 100
150
+ )
151
+ }}</view
152
+ >
73
153
  </view>
74
154
  </view>
75
- <view class="wrap" v-if="!isCountdownEnd&&step!==2&&status!=='daishangbao'">
155
+ <view
156
+ class="wrap"
157
+ v-if="
158
+ (info.user_quotation_status === 'cancel_quotation' ||
159
+ info.user_quotation_status === 'wait_quote' ||
160
+ info.user_quotation_status === 'quoted') &&
161
+ step !== 2 &&
162
+ info.order_status !== 'reported' &&
163
+ info.order_status !== 'close'
164
+ "
165
+ >
76
166
  <view class="quote-title">订单报价</view>
77
167
  <view class="quote-input">
78
168
  <view class="quote-input-unit">¥</view>
79
- <input :disabled="quoteDisabled" v-model="quotePrice" placeholder="请输入单张报价金额" />
169
+ <input
170
+ :disabled="quoteDisabled"
171
+ v-model="quotePrice"
172
+ placeholder="请输入单张报价金额"
173
+ />
80
174
  </view>
81
- <view class="quote-advice">建议报价:<text :style="{color:mainColor}">¥16.96 ~ ¥36.96</text></view>
82
- </view>
83
- <view v-if="status!=='daishangbao'" class="wrap" style="padding: 24rpx 32rpx">
84
- <XdContentXss v-if="notice" :html="notice"></XdContentXss>
175
+ <view class="quote-advice"
176
+ >建议报价:<text :style="{ color: mainColor }"
177
+ >¥{{
178
+ $xdUniHelper.divisionFloatNumber(info.suggest_min_quotation, 100)
179
+ }}~ ¥{{
180
+ $xdUniHelper.divisionFloatNumber(info.suggest_max_quotation, 100)
181
+ }}</text
182
+ ></view
183
+ >
85
184
  </view>
86
- <view class="wrap upload">
87
- <view class="voucher">
88
- <view class="voucher-item">
185
+ <view
186
+ class="wrap upload"
187
+ v-if="
188
+ info.user_quotation_status === 'received' &&
189
+ info.order_status !== 'close'
190
+ "
191
+ >
192
+ <view class="voucher" v-if="voucherImages && voucherImages.length > 0">
193
+ <view
194
+ class="voucher-item"
195
+ v-for="(item, index) in voucherImages"
196
+ :key="index"
197
+ >
89
198
  <view class="voucher-item-image">
90
- <image />
199
+ <image :src="item.report_voucher_preview_url" />
91
200
  <view>凭证图</view>
92
201
  </view>
93
- <view class="voucher-item-info">
94
- <view class="voucher-item-info-number">
95
- <text class="voucher-item-info-label">凭证号</text>
96
- <view>202101020200110</view>
97
- </view>
98
- <view class="voucher-item-info-qrcode">
99
- <text class="voucher-item-info-label">二维码</text>
100
- <image></image>
202
+ <view>
203
+ <view
204
+ class="voucher-item-info"
205
+ v-for="(code, index) in item.code_list"
206
+ :key="index"
207
+ >
208
+ <view
209
+ v-if="code.show_type === 'text'"
210
+ class="voucher-item-info-number"
211
+ >
212
+ <text class="voucher-item-info-label">凭证号</text>
213
+ <view>{{ code.code }}</view>
214
+ </view>
215
+ <view
216
+ v-if="code.show_type === 'qrcode'"
217
+ class="voucher-item-info-qrcode"
218
+ >
219
+ <text class="voucher-item-info-label">二维码</text>
220
+ <image :src="code.code_preview_url"></image>
221
+ </view>
101
222
  </view>
102
223
  </view>
103
224
  </view>
104
225
  </view>
105
- <view style="display: flex;justify-content: center;">
106
- <xd-upload
107
- @onDone="handleUploadDone"
226
+ <view style="display: flex; justify-content: center">
227
+ <xd-upload
228
+ @on-done="handleUploadDone"
108
229
  selectType="image"
109
230
  :selectSource="['album']"
110
231
  ossType="private"
111
- borderWidth="2rpx"
232
+ borderWidth="2rpx"
112
233
  borderRadius="4rpx"
113
- :backgroundColor="uploadBackground"
114
- :borderColor="mainColor"
234
+ :backgroundColor="uploadBackground"
235
+ :borderColor="mainColor"
115
236
  borderStyle="solid"
116
- width="654"
117
- height="88">
118
- <view :style="{color:mainColor}">上传凭证</view>
237
+ width="654"
238
+ height="88"
239
+ >
240
+ <view :style="{ color: mainColor, fontSize: '28rpx' }"
241
+ >上传凭证</view
242
+ >
119
243
  </xd-upload>
120
244
  </view>
121
245
  <view class="upload-notice">
122
246
  <text>请务必按真实报单并仔细校对取餐码正确无误,</text>
123
- <text :style="{color:mainColor}">取餐码错误或未上报真实取餐码造成客诉产生损失将由您承担!</text>
247
+ <text :style="{ color: mainColor }"
248
+ >取餐码错误或未上报真实取餐码造成客诉产生损失将由您承担!</text
249
+ >
124
250
  </view>
125
251
  </view>
126
- <view v-if="!isCountdownEnd" :style="{ height: '100rpx' }"></view>
127
- <view v-if="!isCountdownEnd&&status!=='daishangbao'" class="fixe_bottom" :style="prod_bottom">
252
+ <view
253
+ v-if="
254
+ (info.order_status === 'close' || info.order_status === 'quoting') &&
255
+ notice &&
256
+ info.user_quotation_status !== 'received'
257
+ "
258
+ class="special-tip wrap"
259
+ style="padding: 24rpx 32rpx"
260
+ >
261
+ <view>特别提示</view>
262
+ <XdContentXss
263
+ v-if="
264
+ (info.user_quotation_status === 'wait_quote' && step !== 2) ||
265
+ info.user_quotation_status === 'quoted'
266
+ "
267
+ :html="notice"
268
+ ></XdContentXss>
269
+ <view v-else :style="{ color: mainColor }"
270
+ >因各平台市场价有出入,建议报价前自主核实价格,避免因价格出入问题弃单导致的纠纷!</view
271
+ >
272
+ </view>
273
+ <view v-if="!isCountdownEnd" :style="{ height: '100rpx' }"></view>
274
+ <view
275
+ :key="info.user_quotation_status"
276
+ v-if="info.order_status !== 'close' && info.order_status !== 'reported'"
277
+ class="fixe_bottom"
278
+ :style="prod_bottom"
279
+ >
128
280
  <XdButton
129
- v-if="step===1"
281
+ v-if="
282
+ step === 1 &&
283
+ (info.user_quotation_status === 'wait_quote' ||
284
+ info.user_quotation_status === 'cancel_quotation')
285
+ "
130
286
  width="680rpx"
131
287
  @click="toConfirmQuote"
132
288
  size="small"
@@ -134,15 +290,23 @@
134
290
  >确认报价</XdButton
135
291
  >
136
292
  <XdButton
137
- v-if="step===2"
293
+ v-if="
294
+ step === 2 &&
295
+ (info.user_quotation_status === 'wait_quote' ||
296
+ info.user_quotation_status === 'cancel_quotation')
297
+ "
138
298
  width="320rpx"
139
- @click="step=1"
299
+ @click="step = 1"
140
300
  size="small"
141
301
  :cusStyle="[btnStyle]"
142
302
  >再想想</XdButton
143
303
  >
144
304
  <XdButton
145
- v-if="step===2"
305
+ v-if="
306
+ step === 2 &&
307
+ (info.user_quotation_status === 'wait_quote' ||
308
+ info.user_quotation_status === 'cancel_quotation')
309
+ "
146
310
  width="320rpx"
147
311
  @click="handleSubmitQuote"
148
312
  size="small"
@@ -150,696 +314,898 @@
150
314
  >提交报价</XdButton
151
315
  >
152
316
  <XdButton
153
- v-if="step===3"
317
+ v-if="info.user_quotation_status === 'quoted'"
154
318
  width="320rpx"
155
- @click="showCancelDialog=true"
319
+ @click="showCancelDialog = true"
156
320
  size="small"
157
321
  :cusStyle="[btnStyle]"
158
322
  >取消报价</XdButton
159
323
  >
160
324
  <XdButton
161
- v-if="step===3"
325
+ v-if="info.user_quotation_status === 'quoted'"
162
326
  width="320rpx"
163
- @click="showEditQuoteDialog=true"
327
+ @click="showEditQuoteDialog = true"
164
328
  size="small"
165
329
  type="primary"
166
330
  >修改报价</XdButton
167
331
  >
168
- </view>
169
- <view v-if="status==='daishangbao'" class="fixe_bottom" :style="prod_bottom">
170
332
  <XdButton
333
+ v-if="
334
+ info.user_quotation_status === 'received' ||
335
+ info.user_quotation_status === 'win_order'
336
+ "
171
337
  width="320rpx"
172
- @click="showCancelDialog=true"
338
+ @click="showDiscardDialog = true"
173
339
  size="small"
174
340
  :cusStyle="[btnStyle]"
175
341
  >放弃订单</XdButton
176
342
  >
177
343
  <XdButton
344
+ v-if="info.user_quotation_status === 'received'"
178
345
  width="320rpx"
179
- @click="showEditQuoteDialog=true"
180
346
  size="small"
181
347
  type="primary"
348
+ @click="handleReportOrder"
182
349
  >上报订单</XdButton
183
350
  >
351
+ <XdButton
352
+ v-if="info.user_quotation_status === 'win_order'"
353
+ width="320rpx"
354
+ @click="handleAcceptOrder"
355
+ size="small"
356
+ type="primary"
357
+ >接单</XdButton
358
+ >
184
359
  </view>
185
- <!-- <XdDailog
186
- :showClose="false"
187
- :show.sync="showConfirmDialog" >
188
- <template slot="title">
189
- <view class="dialog-title">确认报价</view>
190
- </template>
191
- <view class="confirm-info">
192
- <view class="confirm-info-item">
193
- <view class="confirm-info-item-label">购买名称:</view>
194
- <view class="confirm-info-item-value">畅享套餐</view>
195
- </view>
196
- <view class="confirm-info-item">
197
- <view class="confirm-info-item-label">购买数量:</view>
198
- <view class="confirm-info-item-value">2</view>
199
- </view>
200
- <view class="confirm-info-item">
201
- <view class="confirm-info-item-label">您的报价:</view>
202
- <view class="confirm-info-item-value">¥35.11</view>
203
- </view>
204
- <view class="confirm-info-item">
205
- <view class="confirm-info-item-label">预计结算:</view>
206
- <view class="confirm-info-item-value">¥70.22</view>
207
- </view>
208
- </view>
209
- <view :style="{ color: mainColor,textAlign: 'center',fontSize:'24rpx'}">因各平台市场价有出入,建议报价前自主核实价格,避免因价格出入问题弃单被扣分!</view>
210
- <template slot="btn">
211
- <XdButton
212
- width="180rpx"
213
- size="small"
214
- type="default"
215
- bgColor="#EEE"
216
- color="#999"
217
- @click="showConfirmDialog = false"
218
- >取消</XdButton>
219
- <XdButton
220
- width="180rpx"
221
- size="small"
222
- type="primary"
223
- @click="handleConfirmQuote"
224
- >确定</XdButton>
225
- </template>
226
- </XdDailog> -->
227
- <XdDailog width="70%" :showClose="false" :show.sync="showMsgDialog">
228
- <template slot="title">
229
- <view class="dialog-title">{{ msgTitle }}</view>
230
- </template>
231
- <view>{{ msg }}</view>
232
- <template slot="btn">
233
- <XdButton
234
- width="180rpx"
235
- size="small"
236
- type="primary"
237
- @click="showMsgDialog = false"
238
- >确定</XdButton>
239
- </template>
240
- </XdDailog>
241
- <XdDailog width="70%" :showClose="false" :show.sync="showCancelDialog">
242
- <template slot="title">
243
- <view class="dialog-title">提示</view>
244
- </template>
245
- <view>是否确认取消报价</view>
246
- <template slot="btn">
247
- <XdButton
248
- width="180rpx"
249
- size="small"
250
- bgColor="#EEE"
251
- color="#999"
252
- type="primary"
253
- @click="showCancelDialog = false"
254
- >取消</XdButton>
255
- <XdButton
256
- width="180rpx"
257
- size="small"
258
- type="primary"
259
- @click="handleCancelQuote"
260
- >确定</XdButton>
261
- </template>
262
- </XdDailog>
263
- <CusEditQuote
264
- v-if="showEditQuoteDialog"
265
- :mainColor="mainColor"
266
- :info="info"
267
- @close="showEditQuoteDialog=false"
268
- @confirm="handleConfirmEditQuote"
269
- ></CusEditQuote>
360
+ <XdDailog width="70%" :showClose="false" :show.sync="showMsgDialog">
361
+ <template slot="title">
362
+ <view class="dialog-title">{{ msgTitle }}</view>
363
+ </template>
364
+ <view style="font-size: 28rpx">{{ msg }}</view>
365
+ <template slot="btn">
366
+ <XdButton
367
+ width="180rpx"
368
+ size="small"
369
+ type="primary"
370
+ @click="showMsgDialog = false"
371
+ >确定</XdButton
372
+ >
373
+ </template>
374
+ </XdDailog>
375
+ <XdDailog width="70%" :showClose="false" :show.sync="showCancelDialog">
376
+ <template slot="title">
377
+ <view class="dialog-title">提示</view>
378
+ </template>
379
+ <view style="font-size: 28rpx">是否确认取消报价</view>
380
+ <template slot="btn">
381
+ <XdButton
382
+ width="180rpx"
383
+ size="small"
384
+ bgColor="#EEE"
385
+ color="#999"
386
+ type="primary"
387
+ @click="showCancelDialog = false"
388
+ >取消</XdButton
389
+ >
390
+ <XdButton
391
+ width="180rpx"
392
+ size="small"
393
+ type="primary"
394
+ @click="handleCancelQuote"
395
+ >确定</XdButton
396
+ >
397
+ </template>
398
+ </XdDailog>
399
+ <XdDailog width="70%" :showClose="false" :show.sync="showDiscardDialog">
400
+ <template slot="title">
401
+ <view class="dialog-title">提示</view>
402
+ </template>
403
+ <view style="font-size: 28rpx">是否确认放弃订单</view>
404
+ <template slot="btn">
405
+ <XdButton
406
+ width="180rpx"
407
+ size="small"
408
+ bgColor="#EEE"
409
+ color="#999"
410
+ type="primary"
411
+ @click="showDiscardDialog = false"
412
+ >取消</XdButton
413
+ >
414
+ <XdButton
415
+ width="180rpx"
416
+ size="small"
417
+ type="primary"
418
+ @click="handleDiscardOrder"
419
+ >确定</XdButton
420
+ >
421
+ </template>
422
+ </XdDailog>
423
+ <CusEditQuote
424
+ v-if="showEditQuoteDialog"
425
+ :mainColor="mainColor"
426
+ :info="info"
427
+ @close="showEditQuoteDialog = false"
428
+ @confirm="handleConfirmEditQuote"
429
+ ></CusEditQuote>
270
430
  </view>
271
431
  </view>
272
432
  </template>
273
433
 
274
434
  <script>
275
- import XdFontIcon from "@/components/XdFontIcon/XdFontIcon";
276
- import XdContentXss from "@/components/XdContentXss/XdContentXss";
277
- import XdDailog from "@/components/XdDailog/XdDailog";
278
- import XdButton from "@/components/XdButton/XdButton";
279
- import XdUpload from "@/components/XdUpload/XdUpload";
280
- import Products from './components/products.vue'
281
- import CusEditQuote from "./components/CusEditQuote.vue";
282
- import { jfbRootExec } from "@/utils/xd.event";
283
- import JfbTakeorderOrderDetailMixin from "./JfbTakeorderOrderDetailMixin";
284
- import { getContainerPropsValue } from "@/utils/xd.base";
285
- import componentsMixins from "@/mixins/componentsMixins";
286
- import extsMixins from "@/mixins/extsMixins";
287
- const Color = require("color");
288
-
289
- export default {
290
- name: "JfbTakeorderOrderDetail",
291
- components: {
292
- XdFontIcon,
293
- XdContentXss,
294
- XdDailog,
295
- XdButton,
296
- Products,
297
- CusEditQuote,
298
- XdUpload
299
- },
300
- mixins: [
301
- componentsMixins, extsMixins, JfbTakeorderOrderDetailMixin
302
- ],
303
- data() {
435
+ import XdFontIcon from "@/components/XdFontIcon/XdFontIcon";
436
+ import XdContentXss from "@/components/XdContentXss/XdContentXss";
437
+ import XdDailog from "@/components/XdDailog/XdDailog";
438
+ import XdButton from "@/components/XdButton/XdButton";
439
+ import XdUpload from "@/components/XdUpload/XdUpload";
440
+ import Products from "./components/products.vue";
441
+ import CusEditQuote from "./components/CusEditQuote.vue";
442
+ import { jfbRootExec } from "@/utils/xd.event";
443
+ import JfbTakeorderOrderDetailMixin from "./JfbTakeorderOrderDetailMixin";
444
+ import { getContainerPropsValue } from "@/utils/xd.base";
445
+ import getServiceUrl from "@/common/getServiceUrl";
446
+ import componentsMixins from "@/mixins/componentsMixins";
447
+ import extsMixins from "@/mixins/extsMixins";
448
+ const Color = require("color");
449
+ import { mapState } from "vuex";
450
+ export default {
451
+ name: "JfbTakeorderOrderDetail",
452
+ components: {
453
+ XdFontIcon,
454
+ XdContentXss,
455
+ XdDailog,
456
+ XdButton,
457
+ Products,
458
+ CusEditQuote,
459
+ XdUpload,
460
+ },
461
+ mixins: [componentsMixins, extsMixins, JfbTakeorderOrderDetailMixin],
462
+ data() {
463
+ return {
464
+ info: null,
465
+ notice: "",
466
+ // 报价倒计时是否结束
467
+ isCountdownEnd: false,
468
+ // 报价倒计时定时器标识(用于清除定时器)
469
+ countdownTimer: null,
470
+ // 接单倒计时是否结束
471
+ isReceiveCountdownEnd: false,
472
+ // 接单倒计时定时器标识
473
+ receiveCountdownTimer: null,
474
+ // 接单倒计时剩余秒数(3分钟 = 180秒)
475
+ receiveCountdownSeconds: 180,
476
+ // 上报倒计时是否结束
477
+ isReportCountdownEnd: false,
478
+ // 上报倒计时定时器标识
479
+ reportCountdownTimer: null,
480
+ // 上报倒计时剩余秒数(10分钟 = 600秒)
481
+ reportCountdownSeconds: 600,
482
+ quotePrice: "",
483
+ closeMask: true,
484
+ showConfirmDialog: false,
485
+ quoteDisabled: false,
486
+ showMsgDialog: false,
487
+ step: 1,
488
+ showCancelDialog: false,
489
+ msg: "",
490
+ msgTitle: "",
491
+ showEditQuoteDialog: false,
492
+ status: "daishangbao",
493
+ uploadBackground: "",
494
+ order_id: "",
495
+ showDiscardDialog: false,
496
+ // 上传的凭证图片列表
497
+ voucherImages: [],
498
+ };
499
+ },
500
+ computed: {
501
+ ...mapState(["brandInfo"]),
502
+ prod_bottom() {
503
+ return this.fixedStyle({ height: 0, zIndex: 111 });
504
+ },
505
+ btnStyle() {
304
506
  return {
305
- info: {
306
- id: 1,
307
- num: 15,
308
- people: 30,
309
- remainingTime: 10,
310
- shop_name: "味多美(北京西单大悦城店)",
311
- brand_name: "味多美",
312
- city: "北京市",
313
- products: [
314
- {
315
- product_thumb:
316
- "https://img.js.design/assets/img/68b554c9c3a1ea02642d7d2f.png#afa2b9b9d50bcd2f1394619ecc488a99",
317
- product_name:
318
- "贝欧宝 BIOBOR贝欧宝维生素C+叶黄素酯软糖118g多重营养3D小熊造型糖果Q弹维生素C+叶黄素酯软糖",
319
- product_sku: "118g",
320
- minPrice: 132,
321
- maxPrice: 1232,
322
- num: 15,
323
- },
324
- {
325
- product_thumb:
326
- "https://img.js.design/assets/img/68b554c9c3a1ea02642d7d2f.png#afa2b9b9d50bcd2f1394619ecc488a99",
327
- product_name:
328
- "贝欧宝 BIOBOR贝欧宝维生素C+叶黄素酯软糖118g多重营养3D小熊造型糖果Q弹维生素C+叶黄素酯软糖",
329
- product_sku: "450g",
330
- minPrice: 456,
331
- maxPrice: 1546,
332
- num: 16,
333
- },
334
- ],
335
- market_price: 4000,
336
- minPrice: 456,
337
- maxPrice: 1546,
338
- order_status: 1,
339
- },
340
- notice: '',
341
- // 报价倒计时是否结束
342
- isCountdownEnd: false,
343
- // 报价倒计时定时器标识(用于清除定时器)
344
- countdownTimer: null,
345
- // 报价倒计时剩余秒数
346
- remainingSeconds: 20,
347
- // 待上报订单倒计时是否结束
348
- isOrderCountdownEnd: false,
349
- // 待上报订单倒计时定时器标识
350
- orderCountdownTimer: null,
351
- // 待上报订单倒计时剩余秒数
352
- orderCountdownSeconds: 600,
353
- quotePrice: '',
354
- closeMask: true,
355
- showConfirmDialog: false,
356
- quoteDisabled: false,
357
- showMsgDialog: false,
358
- step: 1,
359
- showCancelDialog: false,
360
- msg: "",
361
- msgTitle: "",
362
- showEditQuoteDialog: false,
363
- status: 'daishangbao',
364
- uploadBackground: ""
365
- }
507
+ color: this.mainColor,
508
+ border: `1px solid ${this.mainColor}`,
509
+ };
366
510
  },
367
- computed: {
368
- prod_bottom() {
369
- return this.fixedStyle({ height: 0, zIndex: 111 });
370
- },
371
- btnStyle() {
372
- return {
373
- color: this.mainColor,
374
- border: `1px solid ${this.mainColor}`,
375
- };
376
- },
377
- },
378
- watch: {
379
- container(value, oldValue) {
380
- if (JSON.stringify(value) === JSON.stringify(oldValue)) return;
381
- if (this.$configProject['isPreview']) this.init(value)
382
- },
383
- status(newVal) {
384
- // 当状态变为待上报时,启动10分钟倒计时
385
- if (newVal === 'daishangbao') {
386
- this.orderCountdownSeconds = 600; // 10分钟 = 600秒
387
- this.isOrderCountdownEnd = false;
388
- this.startOrderCountdown();
389
- } else {
390
- // 其他状态时清除待上报订单倒计时
391
- this.clearOrderCountdown();
392
- }
393
- },
511
+ quotePriceTotal() {
512
+ return this.$xdUniHelper.multiplyFloatNumber(this.quotePrice, this.info.product_total);
513
+ },
514
+ },
515
+ watch: {
516
+ container(value, oldValue) {
517
+ if (JSON.stringify(value) === JSON.stringify(oldValue)) return;
518
+ if (this.$configProject["isPreview"]) this.init(value);
394
519
  },
395
- created() {
396
- this.init(this.container);
520
+ },
521
+ created() {
522
+ this.init(this.container);
397
523
 
398
- //todo
399
- },
400
- methods: {
401
- onJfbLoad(options) {
402
- this.getContent()
403
- // 如果是待上报状态,启动10分钟倒计时
404
- if (this.status === 'daishangbao') {
405
- this.orderCountdownSeconds = 600; // 10分钟 = 600秒
406
- this.isOrderCountdownEnd = false;
407
- this.startOrderCountdown();
408
- }
409
- },
410
- getContent() {
411
- jfbRootExec("getListBaseNewsContent", {
412
- vm: this,
413
- data: {
414
- page_id: this.pageAttr["page_id"], //页面ID
415
- container_id: this.containerId, //组件ID
416
- limit: 1,
417
- },
418
- })
419
- .then((res) => {
420
- if (res.list.length > 0) {
421
- if (res.list && res.list.length > 0) {
422
- this.notice = this.$xdUniHelper.filterHtml(res.list[0].content);
423
- }
524
+ //todo
525
+ },
526
+ methods: {
527
+ onJfbLoad(options) {
528
+ this.order_id = options.order_id;
529
+ this.getOrderDetail();
530
+ this.getContent();
531
+ },
532
+ getContent() {
533
+ jfbRootExec("getListOrderNewsContent", {
534
+ vm: this,
535
+ data: {
536
+ page_id: this.pageAttr["page_id"], //页面ID
537
+ container_id: this.containerId, //组件ID
538
+ limit: 1,
539
+ },
540
+ })
541
+ .then((res) => {
542
+ if (res.list.length > 0) {
543
+ if (res.list && res.list.length > 0) {
544
+ this.notice = this.$xdUniHelper.filterHtml(res.list[0].content);
424
545
  }
425
- })
426
- .catch((error) => {
427
- console.error(error);
428
- });
429
- },
430
- /**
431
- * @description 监听事件变化
432
- * @param container {object} 业务组件对象自己
433
- */
434
- init(container) {
435
- this.uploadBackground = Color(this.mainColor).alpha(0.15).toString();
436
- //this.bgcolor = getContainerPropsValue(container, 'content.bgcolor', '#fff');
437
-
438
- //this.height = getContainerPropsValue(container, 'content.height', 10);
439
- },
440
- toConfirmQuote() {
441
- if (!this.quotePrice) {
442
- this.$xdAlert({ content: "请输入报价" });
443
- return
444
- }
445
- this.step=2
446
- },
447
- handleSubmitQuote() {
448
- // this.showConfirmDialog = false;
449
- this.step=3
450
- this.quoteDisabled = true;
451
-
452
- },
453
- handleCancelQuote() {
454
- //请求接口,判断是否可以取消报价
455
- this.msg = '报价已结束'
456
- this.msgTitle = '提示'
457
- this.showCancelDialog = false
458
- this.showMsgDialog = true
459
- },
460
- handleConfirmEditQuote() {
461
- //调用接口
462
- // 上报订单时停止待上报订单倒计时
463
- if (this.status === 'daishangbao') {
464
- this.clearOrderCountdown();
465
- this.isOrderCountdownEnd = true;
466
- }
467
- },
468
- startCountdown() {
469
- // 先清除可能存在的旧定时器,防止重复计时
470
- this.clearCountdown();
471
-
472
- // 创建每秒执行的定时器
473
- this.countdownTimer = setInterval(() => {
474
- if (this.remainingSeconds > 0) {
475
- // 剩余秒数减1
476
- this.remainingSeconds--;
477
- } else {
478
- // 倒计时结束:清除定时器 + 标记结束状态
479
- this.clearCountdown();
546
+ }
547
+ })
548
+ .catch((error) => {
549
+ this.$xdLog.catch(err);
550
+ });
551
+ },
552
+ getOrderDetail() {
553
+ jfbRootExec("getTakeorderOrderDetail", {
554
+ vm: this,
555
+ data: {
556
+ order_id: this.order_id,
557
+ },
558
+ })
559
+ .then((res) => {
560
+ this.info = res;
561
+ if (this.info.user_quotation_status === "quoted") {
562
+ this.quotePrice = this.$xdUniHelper.divisionFloatNumber(
563
+ this.info.user_quotation,
564
+ 100
565
+ );
566
+ this.quoteDisabled = true;
567
+ }
568
+ if (
569
+ (this.info.user_quotation_status === "cancel_quotation" ||
570
+ this.info.user_quotation_status === "wait_quote" ||
571
+ this.info.user_quotation_status === "quoted") &&
572
+ this.info.order_status !== "reported" &&
573
+ this.info.order_status !== "close"
574
+ ) {
575
+ this.startCountdown();
576
+ }
577
+ if (this.info.user_quotation_status === "win_order") {
578
+ //如果中标,则显示接单按钮,并开启三分钟接单倒计时
579
+ this.startReceiveCountdown();
580
+ }
581
+ if (this.info.user_quotation_status === "received") {
582
+ //如果已接单,开启十分钟上报订单倒计时
583
+ this.startReportCountdown();
584
+ }
585
+ if (this.info.order_status === "close") {
586
+ //如果订单已关闭,则隐藏所有按钮,并且清除倒计时
480
587
  this.isCountdownEnd = true;
481
- console.log("报价倒计时结束");
588
+ this.clearReceiveCountdown();
589
+ this.clearReportCountdown();
482
590
  }
483
- }, 1000);
484
- },
485
- /**
486
- * 启动待上报订单倒计时
487
- */
488
- startOrderCountdown() {
489
- // 先清除可能存在的旧定时器,防止重复计时
490
- this.clearOrderCountdown();
591
+ })
592
+ .catch((error) => {
593
+ this.$xdLog.catch(err);
594
+ });
595
+ },
596
+ /**
597
+ * @description 监听事件变化
598
+ * @param container {object} 业务组件对象自己
599
+ */
600
+ init(container) {
601
+ this.uploadBackground = Color(this.mainColor).alpha(0.15).toString();
602
+ //this.bgcolor = getContainerPropsValue(container, 'content.bgcolor', '#fff');
491
603
 
492
- // 创建每秒执行的定时器
493
- this.orderCountdownTimer = setInterval(() => {
494
- if (this.orderCountdownSeconds > 0) {
495
- // 剩余秒数减1
496
- this.orderCountdownSeconds--;
497
- } else {
498
- // 倒计时结束:清除定时器 + 标记结束状态
499
- this.clearOrderCountdown();
500
- this.isOrderCountdownEnd = true;
501
- // 倒计时结束自动放弃订单
502
- this.handleAutoCancelOrder();
503
- console.log("待上报订单倒计时结束");
604
+ //this.height = getContainerPropsValue(container, 'content.height', 10);
605
+ },
606
+ toConfirmQuote() {
607
+ if (!this.quotePrice) {
608
+ this.$xdAlert({ content: "请输入报价" });
609
+ return;
610
+ }
611
+ // 校验报价范围
612
+ const min = this.$xdUniHelper.divisionFloatNumber(
613
+ this.info.suggest_min_quotation,
614
+ 100
615
+ );
616
+ const max = this.$xdUniHelper.divisionFloatNumber(
617
+ this.info.suggest_max_quotation,
618
+ 100
619
+ );
620
+ const price = parseFloat(this.quotePrice);
621
+ if (price < min || price > max) {
622
+ this.$xdAlert({ content: `报价价格只能在建议报价区间内` });
623
+ return;
624
+ }
625
+ this.step = 2;
626
+ },
627
+ handleSubmitQuote() {
628
+ this.$xdShowLoading({});
629
+ jfbRootExec("createQuotation", {
630
+ vm: this,
631
+ data: {
632
+ order_id: this.order_id,
633
+ amount: this.$xdUniHelper.multiplyFloatNumber(this.quotePrice, 100),
634
+ },
635
+ })
636
+ .then((res) => {
637
+ this.$xdHideLoading();
638
+ this.step = "";
639
+ // 提交创建报价之后重新刷新订单详情
640
+ this.getOrderDetail();
641
+ })
642
+ .catch((error) => {
643
+ this.$xdHideLoading();
644
+ });
645
+ },
646
+ handleCancelQuote() {
647
+ //请求接口,判断是否可以取消报价
648
+ jfbRootExec("cancelQuotation", {
649
+ vm: this,
650
+ data: {
651
+ order_id: this.order_id,
652
+ },
653
+ }).then((res) => {
654
+ this.$xdUniHelper.navigateBack();
655
+ });
656
+ },
657
+ handleConfirmEditQuote(price) {
658
+ jfbRootExec("updateQuotation", {
659
+ vm: this,
660
+ data: {
661
+ order_id: this.order_id,
662
+ amount: this.$xdUniHelper.multiplyFloatNumber(price, 100),
663
+ },
664
+ })
665
+ .then((res) => {
666
+ if (res.msg) {
667
+ this.msg = "报价已结束";
668
+ this.msgTitle = "提示";
669
+ this.showMsgDialog = true;
504
670
  }
505
- }, 1000);
506
- },
507
- /**
508
- * 格式化秒数为 分:秒 格式(比如 60秒 → 01:00,5秒 → 00:05)
509
- * @param {Number} seconds 待格式化的秒数
510
- * @returns {String} 格式化后的时间字符串
511
- */
512
- formatTime(seconds) {
513
- // 计算分钟
514
- const minutes = Math.floor(seconds / 60);
515
- // 计算剩余秒数
516
- const secs = seconds % 60;
517
- // 补零处理(确保两位数显示)
518
- const formatMinutes = minutes.toString().padStart(2, "0");
519
- const formatSecs = secs.toString().padStart(2, "0");
520
- return `${formatMinutes}:${formatSecs}`;
521
- },
522
- /**
523
- * 格式化秒数为 XX分XX秒 格式(用于待上报状态倒计时显示)
524
- * @param {Number} seconds 待格式化的秒数
525
- * @returns {String} 格式化后的时间字符串,如 "02分59秒"
526
- */
527
- formatCountdownTime(seconds) {
528
- // 计算分钟
529
- const minutes = Math.floor(seconds / 60);
530
- // 计算剩余秒数
531
- const secs = seconds % 60;
532
- // 补零处理(确保两位数显示)
533
- const formatMinutes = minutes.toString().padStart(2, "0");
534
- const formatSecs = secs.toString().padStart(2, "0");
535
- return `${formatMinutes}分${formatSecs}秒`;
536
- },
537
- /**
538
- * 倒计时结束时自动放弃订单
539
- */
540
- handleAutoCancelOrder() {
541
- // 自动放弃订单的逻辑
542
- this.msg = '订单已自动放弃,倒计时结束前未进行操作';
543
- this.msgTitle = '提示';
544
- this.showMsgDialog = true;
545
- // 这里可以调用放弃订单的接口
546
- // TODO: 调用放弃订单接口
547
- },
548
- /**
549
- * 清除报价倒计时定时器
550
- */
551
- clearCountdown() {
552
- if (this.countdownTimer) {
553
- clearInterval(this.countdownTimer);
554
- this.countdownTimer = null;
671
+ this.showEditQuoteDialog = false;
672
+ this.getOrderDetail();
673
+ })
674
+ .catch((error) => {
675
+ this.$xdLog.catch(err);
676
+ });
677
+ },
678
+ startCountdown() {
679
+ // 先清除可能存在的旧定时器,防止重复计时
680
+ this.clearCountdown();
681
+ // 创建每秒执行的定时器
682
+ this.countdownTimer = setInterval(() => {
683
+ if (this.info.rest_quotation_time > 0) {
684
+ // 剩余秒数减1
685
+ this.info.rest_quotation_time--;
686
+ } else {
687
+ // 倒计时结束:清除定时器 + 标记结束状态
688
+ this.clearCountdown();
689
+ if (this.isPreview) return;
690
+ this.getOrderDetail();
691
+ console.log("报价倒计时结束");
555
692
  }
556
- },
557
- /**
558
- * 清除待上报订单倒计时定时器
559
- */
560
- clearOrderCountdown() {
561
- if (this.orderCountdownTimer) {
562
- clearInterval(this.orderCountdownTimer);
563
- this.orderCountdownTimer = null;
693
+ }, 1000);
694
+ },
695
+ /**
696
+ * 格式化秒数为 分:秒 格式(比如 60秒 → 01:00,5秒 → 00:05)
697
+ * @param {Number} seconds 待格式化的秒数
698
+ * @returns {String} 格式化后的时间字符串
699
+ */
700
+ formatTime(seconds) {
701
+ // 计算分钟
702
+ const minutes = Math.floor(seconds / 60);
703
+ // 计算剩余秒数
704
+ const secs = seconds % 60;
705
+ // 补零处理(确保两位数显示)
706
+ const formatMinutes = minutes.toString().padStart(2, "0");
707
+ const formatSecs = secs.toString().padStart(2, "0");
708
+ return `${formatMinutes}:${formatSecs}`;
709
+ },
710
+ /**
711
+ * 格式化秒数为 XX分XX秒 格式(用于待上报状态倒计时显示)
712
+ * @param {Number} seconds 待格式化的秒数
713
+ * @returns {String} 格式化后的时间字符串,如 "02分59秒"
714
+ */
715
+ formatCountdownTime(seconds) {
716
+ // 计算分钟
717
+ const minutes = Math.floor(seconds / 60);
718
+ // 计算剩余秒数
719
+ const secs = seconds % 60;
720
+ // 补零处理(确保两位数显示)
721
+ const formatMinutes = minutes.toString().padStart(2, "0");
722
+ const formatSecs = secs.toString().padStart(2, "0");
723
+ return `${formatMinutes}分${formatSecs}秒`;
724
+ },
725
+ /**
726
+ * 清除报价倒计时定时器
727
+ */
728
+ clearCountdown() {
729
+ if (this.countdownTimer) {
730
+ clearInterval(this.countdownTimer);
731
+ this.countdownTimer = null;
732
+ }
733
+ },
734
+ /**
735
+ * 启动接单倒计时(3分钟)
736
+ */
737
+ startReceiveCountdown() {
738
+ // 先清除可能存在的旧定时器,防止重复计时
739
+ this.clearReceiveCountdown();
740
+ // 初始化倒计时秒数(3分钟 = 180秒)
741
+ this.receiveCountdownSeconds = this.info.rest_receive_time;
742
+ this.isReceiveCountdownEnd = false;
743
+
744
+ // 创建每秒执行的定时器
745
+ this.receiveCountdownTimer = setInterval(() => {
746
+ if (this.receiveCountdownSeconds > 0) {
747
+ // 剩余秒数减1
748
+ this.receiveCountdownSeconds--;
749
+ } else {
750
+ // 倒计时结束:清除定时器 + 标记结束状态
751
+ this.clearReceiveCountdown();
752
+ this.isReceiveCountdownEnd = true;
753
+ // 倒计时结束请求详情接口
754
+ this.getOrderDetail();
755
+ console.log("接单倒计时结束");
564
756
  }
565
- },
566
- handleUploadDone(files) {
567
- console.log('event.handleUploadDone', files);
568
- },
569
- onJfbScroll(options) {
570
- console.log('event.onJfbScroll', options)
571
- },
572
- onJfbReachBottom(options) {
573
- console.log('event.onJfbReachBottom', options)
574
- },
575
- onJfbShow(options) {
576
- console.log('event.onJfbShow', options)
577
- },
578
- onJfbHide(options) {
579
- console.log('event.onJfbHide', options)
580
- },
581
- onJfbBack(options) {
582
- console.log('event.onJfbBack', options)
583
- },
584
- onJfbUpdate(...data) {
585
- console.log('event.onJfbUpdate', data)
586
- },
587
- onJfbCustomEvent(options) {
588
- console.log('event.onJfbReachBottom', options)
589
- },
590
- onJfbUnload(){
591
- this.clearCountdown();
592
- this.clearOrderCountdown();
757
+ }, 1000);
758
+ },
759
+ /**
760
+ * 清除接单倒计时定时器
761
+ */
762
+ clearReceiveCountdown() {
763
+ if (this.receiveCountdownTimer) {
764
+ clearInterval(this.receiveCountdownTimer);
765
+ this.receiveCountdownTimer = null;
593
766
  }
594
- }
595
- }
767
+ },
768
+ /**
769
+ * 启动上报倒计时(10分钟)
770
+ */
771
+ startReportCountdown() {
772
+ // 先清除可能存在的旧定时器,防止重复计时
773
+ this.clearReportCountdown();
774
+ // 初始化倒计时秒数(10分钟 = 600秒),如果有接口返回的时间则使用接口返回的时间
775
+ this.reportCountdownSeconds = this.info.rest_report_time || 600;
776
+ this.isReportCountdownEnd = false;
596
777
 
778
+ // 创建每秒执行的定时器
779
+ this.reportCountdownTimer = setInterval(() => {
780
+ if (this.reportCountdownSeconds > 0) {
781
+ // 剩余秒数减1
782
+ this.reportCountdownSeconds--;
783
+ } else {
784
+ // 倒计时结束:清除定时器 + 标记结束状态
785
+ this.clearReportCountdown();
786
+ this.isReportCountdownEnd = true;
787
+ // 倒计时结束请求详情接口
788
+ this.getOrderDetail();
789
+ console.log("上报倒计时结束");
790
+ }
791
+ }, 1000);
792
+ },
793
+ /**
794
+ * 清除上报倒计时定时器
795
+ */
796
+ clearReportCountdown() {
797
+ if (this.reportCountdownTimer) {
798
+ clearInterval(this.reportCountdownTimer);
799
+ this.reportCountdownTimer = null;
800
+ }
801
+ },
802
+ /**
803
+ * 处理放弃订单
804
+ */
805
+ handleDiscardOrder() {
806
+ this.$xdShowLoading({});
807
+ jfbRootExec("discardOrder", {
808
+ vm: this,
809
+ data: {
810
+ order_id: this.order_id,
811
+ },
812
+ })
813
+ .then((res) => {
814
+ this.$xdHideLoading();
815
+ this.showDiscardDialog = false;
816
+ // 接口成功后重新请求订单详情
817
+ this.getOrderDetail();
818
+ })
819
+ .catch((error) => {
820
+ this.$xdHideLoading();
821
+ this.$xdLog.catch(error);
822
+ });
823
+ },
824
+ /**
825
+ * 处理接受订单
826
+ */
827
+ handleAcceptOrder() {
828
+ this.$xdShowLoading({});
829
+ jfbRootExec("acceptOrder", {
830
+ vm: this,
831
+ data: {
832
+ order_id: this.order_id,
833
+ },
834
+ })
835
+ .then((res) => {
836
+ this.$xdHideLoading();
837
+ // 清除接单倒计时
838
+ this.clearReceiveCountdown();
839
+ // 接口成功后重新请求订单详情
840
+ this.getOrderDetail();
841
+ })
842
+ .catch((error) => {
843
+ this.$xdHideLoading();
844
+ this.$xdLog.catch(error);
845
+ });
846
+ },
847
+ handleUploadDone(files) {
848
+ console.log("event.handleUploadDone", files);
849
+ this.$xdShowLoading({});
850
+ jfbRootExec("imageRecognition", {
851
+ vm: this,
852
+ data: {
853
+ image_url: files[0].url,
854
+ },
855
+ })
856
+ .then((res) => {
857
+ console.log("event.handleUploadDone", res);
858
+ jfbRootExec("getImagePreview", {
859
+ vm: this,
860
+ data: {
861
+ image_url: files[0].url,
862
+ },
863
+ })
864
+ .then((res1) => {
865
+ console.log("event.getImagePreview", res);
866
+ let obj = {
867
+ report_voucher: files[0].url,
868
+ report_voucher_preview_url: res1.preview_url,
869
+ code_list: res.list.map((item) => {
870
+ if (item.show_type === "qrcode") {
871
+ let reg = /^(http:\/\/|https:\/\/|\/\/)+.+$/;
872
+ item.code_preview_url = reg.test(item.preview_url)
873
+ ? item.preview_url
874
+ : `${this.brandInfo["api_host"]}${item.preview_url}`;
875
+ } else {
876
+ item.code = item.code;
877
+ }
878
+ return item;
879
+ }),
880
+ };
881
+ this.voucherImages.push(obj);
882
+ this.$xdHideLoading();
883
+ })
884
+ .catch((error) => {
885
+ this.$xdHideLoading();
886
+ this.$xdLog.catch(error);
887
+ });
888
+ })
889
+ .catch((error) => {
890
+ this.$xdHideLoading();
891
+ this.$xdLog.catch(error);
892
+ });
893
+ },
894
+ /**
895
+ * 处理上报订单
896
+ */
897
+ handleReportOrder() {
898
+ // 检查是否上传了凭证
899
+ if (!this.voucherImages || this.voucherImages.length === 0) {
900
+ this.$xdAlert({ content: "请先上传凭证" });
901
+ return;
902
+ }
903
+ this.$xdShowLoading({});
904
+ jfbRootExec("reportOrder", {
905
+ vm: this,
906
+ data: {
907
+ order_id: this.order_id,
908
+ report_voucher_list: this.voucherImages,
909
+ },
910
+ })
911
+ .then((res) => {
912
+ this.$xdHideLoading();
913
+ // 清除上报倒计时
914
+ this.clearReportCountdown();
915
+ // 接口成功后重新请求订单详情
916
+ this.getOrderDetail();
917
+ })
918
+ .catch((error) => {
919
+ this.$xdHideLoading();
920
+ this.$xdLog.catch(error);
921
+ });
922
+ },
923
+ onJfbScroll(options) {
924
+ console.log("event.onJfbScroll", options);
925
+ },
926
+ onJfbReachBottom(options) {
927
+ console.log("event.onJfbReachBottom", options);
928
+ },
929
+ onJfbShow(options) {
930
+ console.log("event.onJfbShow", options);
931
+ },
932
+ onJfbHide(options) {
933
+ console.log("event.onJfbHide", options);
934
+ },
935
+ onJfbBack(options) {
936
+ console.log("event.onJfbBack", options);
937
+ },
938
+ onJfbUpdate(...data) {
939
+ console.log("event.onJfbUpdate", data);
940
+ },
941
+ onJfbCustomEvent(options) {
942
+ console.log("event.onJfbReachBottom", options);
943
+ },
944
+ onJfbUnload() {
945
+ this.clearCountdown();
946
+ this.clearReceiveCountdown();
947
+ this.clearReportCountdown();
948
+ },
949
+ },
950
+ };
597
951
  </script>
598
952
 
599
953
  <style scoped lang="less">
600
- @import "./JfbTakeorderOrderDetailLess.less";
954
+ @import "./JfbTakeorderOrderDetailLess.less";
601
955
 
602
- .jfb-takeorder-order-detail {
603
- &__countdown-banner {
604
- display: flex;
605
- align-items: center;
606
- padding: 24rpx 32rpx;
607
- margin: 16rpx 16rpx 0 16rpx;
608
- border-radius: 16rpx 16rpx 0 0;
609
- background: #E5010E;
610
- & > xd-font-icon {
611
- margin-right: 16rpx;
612
- }
956
+ .jfb-takeorder-order-detail {
957
+ &__countdown-banner {
958
+ display: flex;
959
+ align-items: center;
960
+ padding: 24rpx 32rpx;
961
+ margin: 16rpx 16rpx 0 16rpx;
962
+ border-radius: 16rpx 16rpx 0 0;
963
+ background: #e5010e;
964
+ & > xd-font-icon {
965
+ margin-right: 16rpx;
613
966
  }
614
- &__countdown-text {
615
- color: #fff;
616
- font-size: 28rpx;
617
- flex: 1;
967
+ }
968
+ &__countdown-text {
969
+ color: #fff;
970
+ font-size: 28rpx;
971
+ flex: 1;
972
+ }
973
+ &__body {
974
+ .wrap {
975
+ background: #fff;
976
+ margin: 16rpx;
977
+ border-radius: 16rpx;
618
978
  }
619
- &__body{
620
- .wrap{
621
- background: #fff;
622
- margin: 16rpx;
623
- border-radius: 16rpx;
979
+ .special-tip {
980
+ padding: 24rpx 32rpx;
981
+ color: #333;
982
+ & > view:first-child {
983
+ font-size: 28rpx;
984
+ color: #333;
985
+ margin-bottom: 20rpx;
624
986
  }
625
- .order-info{
626
- &-title {
987
+ & > view:last-child {
988
+ font-size: 24rpx;
989
+ }
990
+ }
991
+ .order-info {
992
+ &-title {
993
+ display: flex;
994
+ justify-content: space-between;
995
+ padding: 24rpx 32rpx;
996
+ border-bottom: 1px solid #f4f4f4;
997
+ &-left {
627
998
  display: flex;
628
- justify-content: space-between;
629
- padding: 24rpx 32rpx;
630
- border-bottom: 1px solid #f4f4f4;
631
- &-left {
632
- display: flex;
633
- align-items: center;
634
- }
635
- &-right {
636
- font-weight: 500;
637
- }
999
+ align-items: center;
638
1000
  }
639
- &-product {
640
- display: flex;
641
- padding: 16rpx 32rpx;
642
- border-bottom: 1px solid #f4f4f4;
643
- & > image {
644
- width: 180rpx;
645
- height: 180rpx;
646
- flex-shrink: 0;
647
- border: 10rpx;
1001
+ &-right {
1002
+ font-weight: 500;
1003
+ }
1004
+ }
1005
+ &-product {
1006
+ display: flex;
1007
+ padding: 16rpx 32rpx;
1008
+ border-bottom: 1px solid #f4f4f4;
1009
+ & > image {
1010
+ width: 180rpx;
1011
+ height: 180rpx;
1012
+ flex-shrink: 0;
1013
+ border: 10rpx;
1014
+ }
1015
+ &-info {
1016
+ margin-left: 24rpx;
1017
+ &-name {
1018
+ .uni-max-cut(2,80);
1019
+ margin-bottom: 10rpx;
648
1020
  }
649
- &-info {
650
- margin-left: 24rpx;
651
- &-name {
652
- .uni-max-cut(2,80);
653
- margin-bottom: 10rpx;
1021
+ &-sku {
1022
+ font-size: 24rpx;
1023
+ color: #999;
1024
+ }
1025
+ &-price {
1026
+ margin-top: 10rpx;
1027
+ display: flex;
1028
+ justify-content: space-between;
1029
+ align-items: center;
1030
+ &-left {
1031
+ color: #ff2c18;
1032
+ font-size: 32rpx;
1033
+ font-weight: 500;
1034
+ & > text {
1035
+ font-size: 24rpx;
1036
+ margin-right: 10rpx;
1037
+ }
1038
+ .range {
1039
+ margin: 0 10rpx;
1040
+ }
654
1041
  }
655
- &-sku {
656
- font-size: 24rpx;
1042
+ &-right {
657
1043
  color: #999;
658
- }
659
- &-price {
660
- margin-top: 10rpx;
661
1044
  display: flex;
662
- justify-content: space-between;
663
- align-items: center;
664
- &-left {
665
- color: #ff2c18;
666
- font-size: 32rpx;
667
- font-weight: 500;
668
- & > text {
669
- font-size: 24rpx;
670
- margin-right: 10rpx;
671
- }
672
- .range {
673
- margin: 0 10rpx;
674
- }
675
- }
676
- &-right {
677
- color: #999;
678
- display: flex;
679
- align-items: baseline;
680
- & > view {
681
- margin-left: 10rpx;
682
- }
1045
+ align-items: baseline;
1046
+ & > view {
1047
+ margin-left: 10rpx;
683
1048
  }
684
1049
  }
685
1050
  }
686
1051
  }
687
1052
  }
688
- .other-info-item {
689
- display: flex;
690
- justify-content: space-between;
691
- padding: 20rpx 32rpx;
692
- color: #333;
1053
+ }
1054
+ .other-info-item {
1055
+ display: flex;
1056
+ justify-content: space-between;
1057
+ padding: 20rpx 32rpx;
1058
+ color: #333;
1059
+ font-size: 28rpx;
1060
+ border-bottom: 2rpx solid #f8f8f8;
1061
+ }
1062
+ .quote {
1063
+ &-title {
693
1064
  font-size: 28rpx;
694
- border-bottom: 2rpx solid #f8f8f8;
1065
+ color: #333;
1066
+ padding: 24rpx 0 24rpx 32rpx;
695
1067
  }
696
- .quote {
697
- &-title {
1068
+ &-input {
1069
+ position: relative;
1070
+ padding: 0 32rpx 24rpx 32rpx;
1071
+ &-unit {
1072
+ position: absolute;
1073
+ left: 55rpx;
1074
+ top: 50%;
1075
+ transform: translateY(-80%);
698
1076
  font-size: 28rpx;
699
1077
  color: #333;
700
- padding: 24rpx 0 24rpx 32rpx;
701
- }
702
- &-input {
703
- position: relative;
704
- padding: 0 32rpx 24rpx 32rpx;
705
- &-unit {
706
- position: absolute;
707
- left: 55rpx;
708
- top: 50%;
709
- transform: translateY(-80%);
710
- font-size: 28rpx;
711
- color: #333;
712
- font-weight: 700;
713
- }
714
- &>input {
715
- background:#F8F8F8;
716
- font-size: 28rpx;
717
- padding: 20rpx 46rpx 20rpx 60rpx;
718
- border-radius: 16rpx;
719
- }
1078
+ font-weight: 700;
720
1079
  }
721
- &-advice{
722
- font-size: 24rpx;
723
- color: #666666;
724
- padding: 0 0 24rpx 32rpx;
1080
+ & > input {
1081
+ background: #f8f8f8;
1082
+ font-size: 28rpx;
1083
+ padding: 20rpx 46rpx 20rpx 60rpx;
1084
+ border-radius: 16rpx;
725
1085
  }
726
1086
  }
727
- .fixe_bottom {
1087
+ &-advice {
1088
+ font-size: 24rpx;
1089
+ color: #666666;
1090
+ padding: 0 0 24rpx 32rpx;
1091
+ }
1092
+ }
1093
+ .fixe_bottom {
1094
+ display: flex;
1095
+ align-items: center;
1096
+ justify-content: space-around;
1097
+ height: unit(100, rpx);
1098
+ padding: 0 unit(40, rpx);
1099
+ flex-flow: nowrap;
1100
+ background: #fff;
1101
+ box-shadow: 0 0 unit(16, rpx) rgba(0, 0, 0, 0.05);
1102
+ .flex_l {
728
1103
  display: flex;
729
1104
  align-items: center;
730
- justify-content: space-around;
731
- height: unit(100, rpx);
732
- padding: 0 unit(40, rpx);
733
- flex-flow: nowrap;
734
- background: #fff;
735
- box-shadow: 0 0 unit(16, rpx) rgba(0, 0, 0, 0.05);
736
- .flex_l {
737
- display: flex;
738
- align-items: center;
739
- font-size: unit(32, rpx);
740
- }
1105
+ font-size: unit(32, rpx);
1106
+ }
741
1107
 
742
- & > view {
743
- flex: 1;
744
- padding: 0 unit(15, rpx);
745
- }
1108
+ & > view {
1109
+ flex: 1;
1110
+ padding: 0 unit(15, rpx);
746
1111
  }
747
- .dialog-title{
748
- color: #666666;
1112
+ }
1113
+ .dialog-title {
1114
+ color: #666666;
1115
+ font-size: 28rpx;
1116
+ }
1117
+ .confirm-info {
1118
+ display: flex;
1119
+ flex-direction: column;
1120
+ align-items: center;
1121
+ justify-content: center;
1122
+ margin-bottom: 32rpx;
1123
+
1124
+ &-item {
1125
+ display: flex;
1126
+ justify-content: center;
1127
+ margin-bottom: 16rpx;
749
1128
  font-size: 28rpx;
1129
+ color: #333;
1130
+ &-label {
1131
+ width: 140rpx;
1132
+ flex-shrink: 0;
1133
+ }
1134
+ &-value {
1135
+ margin-left: 48rpx;
1136
+ width: 120rpx;
1137
+ flex: 1;
1138
+ flex-wrap: wrap;
1139
+ display: flex;
1140
+ justify-content: flex-start;
1141
+ }
750
1142
  }
751
- .confirm-info {
1143
+ }
1144
+ .upload-title {
1145
+ border-radius: 4rpx;
1146
+ background: #e5010e;
1147
+ border: 1px solid #e5010e;
1148
+ padding: 24rpx 0;
1149
+ text-align: center;
1150
+ }
1151
+ .upload {
1152
+ padding: 24rpx 32rpx;
1153
+ }
1154
+ .upload-notice {
1155
+ color: #999999;
1156
+ font-size: 24rpx;
1157
+ margin-top: 24rpx;
1158
+ }
1159
+ .voucher {
1160
+ &-item {
752
1161
  display: flex;
753
- flex-direction: column;
754
- align-items: center;
755
- justify-content: center;
756
- margin-bottom: 32rpx;
757
-
758
- &-item {
1162
+ margin-bottom: 26rpx;
1163
+ &-image {
1164
+ flex-shrink: 0;
759
1165
  display: flex;
1166
+ flex-direction: column;
1167
+ align-items: center;
760
1168
  justify-content: center;
761
- margin-bottom: 16rpx;
762
- font-size: 28rpx;
763
- color: #333;
764
- &-label {
765
- width: 140rpx;
766
- flex-shrink: 0;
1169
+ & > image {
1170
+ width: 180rpx;
1171
+ height: 180rpx;
1172
+ border-radius: 4rpx;
767
1173
  }
768
- &-value{
769
- margin-left: 48rpx;
770
- width: 120rpx;
771
- flex: 1;
772
- flex-wrap: wrap;
773
- display: flex;
774
- justify-content: flex-start;
1174
+ & > view {
1175
+ color: #666;
1176
+ font-size: 24rpx;
775
1177
  }
776
1178
  }
777
- }
778
- .upload-title {
779
- border-radius: 4rpx;
780
- background: #E5010E;
781
- border: 1px solid #E5010E;
782
- padding: 24rpx 0;
783
- text-align: center;
784
- }
785
- .upload {
786
- padding: 24rpx 32rpx;
787
- }
788
- .upload-notice {
789
- color: #999999;
790
- font-size: 24rpx;
791
- margin-top: 24rpx;
792
- }
793
- .voucher {
794
- &-item {
795
- display: flex;
796
- margin-bottom: 26rpx;
797
- &-image {
798
- flex-shrink: 0;
1179
+ &-info {
1180
+ &-label {
1181
+ color: #666;
1182
+ font-size: 24rpx;
1183
+ margin-left: 24rpx;
1184
+ }
1185
+ &-number {
799
1186
  display: flex;
800
- flex-direction: column;
801
1187
  align-items: center;
802
- justify-content: center;
803
- & > image {
804
- width: 180rpx;
805
- height: 180rpx;
806
- border-radius: 4rpx;
807
- }
1188
+ margin-bottom: 24rpx;
808
1189
  & > view {
809
- color: #666;
810
- font-size: 24rpx;
1190
+ font-size: 28rpx;
1191
+ color: #999;
1192
+ background: #f8f8f8;
1193
+ padding: 20rpx;
1194
+ border-radius: 16rpx;
811
1195
  }
812
1196
  }
813
- &-info {
814
- &-label {
815
- color: #666;
816
- font-size: 24rpx;
817
- margin-right: 24rpx;
818
- }
819
- &-number {
820
- display: flex;
821
- align-items: center;
822
- margin-bottom: 24rpx;
823
- & > view {
824
- font-size: 28rpx;
825
- color: #999;
826
- background: #f8f8f8;
827
- padding: 20rpx;
828
- border-radius: 16rpx;
829
- }
830
- }
831
- &-qrcode {
832
- display: flex;
833
- align-items: flex-start;
834
- & > image {
835
- width: 120rpx;
836
- height: 120rpx;
837
- border-radius: 4rpx;
838
- }
1197
+ &-qrcode {
1198
+ display: flex;
1199
+ align-items: flex-start;
1200
+ & > image {
1201
+ width: 120rpx;
1202
+ height: 120rpx;
1203
+ border-radius: 4rpx;
839
1204
  }
840
1205
  }
841
1206
  }
842
1207
  }
843
1208
  }
844
1209
  }
1210
+ }
845
1211
  </style>