refundOrder.vue 27 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069
  1. <template>
  2. <view class="content">
  3. <view class="inner">
  4. <!-- 药品列表 -->
  5. <view class="drug-list">
  6. <view class="item">
  7. <!-- 药品信息 -->
  8. <view class="drug-info" v-for="(item,index) in items" :key="index">
  9. <view class="img-box">
  10. <image :src="item.imgUrl" mode="aspectFit"></image>
  11. </view>
  12. <view class="info">
  13. <view class="top">
  14. <view class="title ellipsis2">{{item.goodsName||''}}</view>
  15. <!-- <view class="spec">{{JSON.parse(item.jsonInfo).sku}}</view> -->
  16. </view>
  17. <view class="num-box">
  18. <view class="price">
  19. <text class="num" >{{item.integral}}</text>
  20. <text class="unit">积分</text>
  21. <text class="num" v-if="item.cash>0">+{{item.cash}}</text>
  22. <text class="unit" v-if="item.cash>0">元</text>
  23. </view>
  24. <view class="amount">x{{item.num}}</view>
  25. </view>
  26. </view>
  27. </view>
  28. </view>
  29. </view>
  30. <!-- 申请类型 -->
  31. <view class="reason-apply">
  32. <view class="title-box">
  33. <text class="label">申请类型</text>
  34. <view class="radio-group">
  35. <label class="radio" @click="changeRefundType(0)">
  36. <radio :checked="refundType === 0" color="#2583EB" />仅退款
  37. </label>
  38. <label class="radio" @click="changeRefundType(1)">
  39. <radio :checked="refundType === 1" color="#2583EB" />退货退款
  40. </label>
  41. </view>
  42. </view>
  43. <view class="title-box">
  44. <text class="label">退款金额</text>
  45. <input class="money" type="text" disabled v-model="refundAmount" placeholder="退款金额" placeholder-class="form-input" />
  46. </view>
  47. <view class="title-box">
  48. <text class="label">退回积分</text>
  49. <input class="money" type="text" disabled v-model="refundIntegral" placeholder="退回积分" placeholder-class="form-input" />
  50. </view>
  51. <view class="title-box">
  52. <text class="label">申请原因</text>
  53. <picker @change="reasonsChange" :value="reasonIndex" range-key="dictLabel" :range="filteredReasonsList">
  54. <view class="chose-box" >
  55. <text class="text">{{reasons}}</text>
  56. <image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/app/newImages/shopping/arrow_gray.png" mode=""></image>
  57. </view>
  58. </picker>
  59. </view>
  60. <!-- <view class="upload-box">
  61. <view class="upload-title">申请说明图片</view>
  62. <u-upload :fileList="fileList1" @afterRead="afterRead" @delete="deletePic" name="1" multiple :maxCount="6"></u-upload>
  63. </view> -->
  64. <view class="textarea-box">
  65. <textarea v-model="explains" placeholder="请描述申请售后服务的具体原因" placeholder-class="textarea-place" />
  66. </view>
  67. <view v-if="isDeliveryReason" class="delivery-box">
  68. <view class="logistics-select-container">
  69. <view class="search-header">
  70. <text class="label">物流公司</text>
  71. <view class="search-input-wrapper">
  72. <input class="search-input" type="text" v-model="logisticsKeyword" placeholder="搜索物流公司" placeholder-class="search-input-place" @input="onSearchInput" />
  73. <image v-if="logisticsKeyword" class="clear-icon" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/close.png" @click="clearSearch"></image>
  74. </view>
  75. <text class="refresh-btn" :class="{'loading': logisticsLoading}" @click.stop="refreshLogisticsCompanies">{{logisticsLoading?'...':'刷新'}}</text>
  76. </view>
  77. <view v-if="logisticsKeyword && !deliveryForm.shipper_code" class="results-dropdown">
  78. <scroll-view scroll-y class="results-list">
  79. <view v-for="(item, index) in logisticsCompanyList" :key="index" class="result-item" @click="selectLogistics(item)">
  80. <text class="name">{{item.lcName}}</text>
  81. </view>
  82. <view v-if="!logisticsLoading && logisticsCompanyList.length === 0" class="empty-results">暂无结果</view>
  83. <view v-if="logisticsLoading" class="loading-results">搜索中...</view>
  84. </scroll-view>
  85. </view>
  86. <view v-if="deliveryForm.delivery_name && !logisticsKeyword" class="selected-display" @click="reselectLogistics">
  87. <text class="name">{{deliveryForm.delivery_name}}</text>
  88. <image class="arrow" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/app/newImages/shopping/arrow_gray.png"></image>
  89. </view>
  90. </view>
  91. <view class="title-box">
  92. <text class="label">物流单号</text>
  93. <input class="money logistics-input" type="text" v-model="deliveryForm.delivery_sn" placeholder="请输入物流单号" placeholder-class="form-input" />
  94. </view>
  95. <!-- 地址信息展示 -->
  96. <view class="address-card" v-if="order">
  97. <view class="address-item">
  98. <view class="icon-box sender">寄</view>
  99. <view class="content-box">
  100. <view class="user-info">
  101. <text class="name">{{order.realName || '寄件人'}}</text>
  102. <text class="phone">{{order.userPhone || '-'}}</text>
  103. </view>
  104. <view class="address-text">{{order.userAddress || '-'}}</view>
  105. </view>
  106. </view>
  107. <view class="address-item" v-if="deliveryBaseInfo.address">
  108. <view class="icon-box recipient">收</view>
  109. <view class="content-box">
  110. <view class="user-info">
  111. <text class="name">{{deliveryBaseInfo.consignee || '-'}}</text>
  112. <text class="phone">{{deliveryBaseInfo.phone_number || '-'}}</text>
  113. </view>
  114. <view class="address-text">{{deliveryBaseInfo.address || '-'}}</view>
  115. </view>
  116. </view>
  117. </view>
  118. </view>
  119. </view>
  120. <!-- 退回方式 -->
  121. <!-- <view class="return-method">
  122. <view class="title-box">
  123. <text class="text">退货方式</text>
  124. <text class="text">用户发货</text>
  125. </view>
  126. <view class="return-tips">
  127. <text class="text">请您在审核通过后7天内,将商品发货到指定点</text>
  128. </view>
  129. <view class="info-item">
  130. <text class="label">联系人</text>
  131. <text class="text">张三 1572325612</text>
  132. </view>
  133. <view class="info-item">
  134. <text class="label">发货地址</text>
  135. <text class="text">重庆市江北区建玛特商场5楼</text>
  136. </view>
  137. </view> -->
  138. <!-- 底部按钮 -->
  139. <view class="btn-box">
  140. <view class="sub-btn" @click="submit()">申请售后</view>
  141. </view>
  142. </view>
  143. </view>
  144. </template>
  145. <script>
  146. import {applyAfterSales,getMyStoreOrderItemByOrderId,editDelivery,getErpReturnInfo} from '../api/integralAfterSales.js'
  147. import { queryLogisticsCompany,refreshLogisticsCompany } from '../api/storeAfterSales.js'
  148. export default {
  149. computed: {
  150. isDeliveryReason() {
  151. return this.reasonValue === '6';
  152. }
  153. },
  154. data() {
  155. return {
  156. orderId:null,
  157. order:null,
  158. orderCode:null,
  159. items:[],
  160. type:null,
  161. reasonsList:[],
  162. reasons:"请选择",
  163. reasonIndex:0,
  164. reasonValue:null,
  165. explains:"",
  166. refundAmount:0.00,
  167. refundIntegral: 0,
  168. refundType: 0, // 0: 仅退款, 1: 退货退款
  169. filteredReasonsList: [],
  170. logisticsCompanyList:[],
  171. logisticsKeyword:'',
  172. selectedLogisticsIndex:0,
  173. logisticsLoading:false,
  174. searchTimer: null,
  175. deliveryBaseInfo:{
  176. consignee:'',
  177. phone_number:'',
  178. address:''
  179. },
  180. deliveryForm:{
  181. shipper_code:'',
  182. delivery_sn:'',
  183. delivery_name:''
  184. },
  185. fileList1: [],
  186. explainImg: ""
  187. }
  188. },
  189. onLoad(option) {
  190. this.type=option.type;
  191. this.orderCode=option.orderCode;
  192. this.reasonsList=this.$getDict("storeAfterSalesReasons");
  193. this.orderId=option.orderId;
  194. console.log(this.orderId);
  195. // Initialize refundType based on option.type if available, otherwise default to 0
  196. this.refundType = option.type !== undefined ? Number(option.type) : 0;
  197. this.filterReasons(); // Filter reasons initially
  198. this.getMyStoreOrderItemByOrderId()
  199. },
  200. methods: {
  201. changeRefundType(type) {
  202. this.refundType = type;
  203. this.filterReasons();
  204. // Reset selected reason when refund type changes
  205. this.reasons = "请选择";
  206. this.reasonIndex = 0;
  207. this.reasonValue = null;
  208. this.resetDeliveryForm();
  209. },
  210. filterReasons() {
  211. if (this.refundType === 0) { // 仅退款类型type0
  212. this.filteredReasonsList = this.reasonsList.filter(item => item.dictValue !== '6');
  213. } else { // 退货退款类型type1
  214. this.filteredReasonsList = this.reasonsList.filter(item => item.dictValue === '6');
  215. }
  216. },
  217. getMyStoreOrderItemByOrderId(){
  218. var data={orderId:this.orderId};
  219. getMyStoreOrderItemByOrderId(data).then(res => {
  220. if(res.code==200){
  221. this.order=res.order;
  222. this.items=res.items;
  223. this.refundAmount= this.$formatNum(this.order.payMoney)
  224. this.refundIntegral = this.order.integral || 0
  225. }else{
  226. uni.showToast({
  227. icon:'none',
  228. title: "请求失败",
  229. });
  230. }
  231. });
  232. },
  233. reasonsChange(e) {
  234. var index = Number(e.detail.value);
  235. var current = this.filteredReasonsList[index] || {};
  236. this.reasonIndex = index;
  237. this.reasons = current.dictLabel || '请选择';
  238. this.reasonValue = current.dictValue != null ? current.dictValue.toString() : null;
  239. if(this.isDeliveryReason){
  240. this.loadLogisticsCompanies();
  241. this.loadMerchantDeliveryInfo();
  242. }else{
  243. this.resetDeliveryForm();
  244. }
  245. },
  246. resetDeliveryForm(){
  247. this.selectedLogisticsIndex = 0;
  248. this.deliveryForm = {
  249. shipper_code:'',
  250. delivery_sn:'',
  251. delivery_name:''
  252. };
  253. },
  254. loadMerchantDeliveryInfo(){
  255. return getErpReturnInfo().then(res => {
  256. if(res.code==200){
  257. this.deliveryBaseInfo = {
  258. consignee: res.returnReceiver || '',
  259. phone_number: res.returnPhone || '',
  260. address: res.returnAddress || ''
  261. };
  262. return this.deliveryBaseInfo;
  263. }
  264. uni.showToast({
  265. icon:'none',
  266. title: res.msg || '获取商家收货信息失败'
  267. });
  268. return null;
  269. });
  270. },
  271. loadLogisticsCompanies(forceRefresh){
  272. if(this.logisticsLoading){
  273. return;
  274. }
  275. if(!forceRefresh&&this.logisticsCompanyList.length>0&&!this.logisticsKeyword){
  276. return;
  277. }
  278. this.logisticsLoading = true;
  279. queryLogisticsCompany({keyword:this.logisticsKeyword}).then(res => {
  280. if(res.code==0||res.code==200){
  281. var list = [];
  282. if(Array.isArray(res.data)){
  283. list = res.data;
  284. }else if(Array.isArray(res.rows)){
  285. list = res.rows;
  286. }else if(Array.isArray(res.list)){
  287. list = res.list;
  288. }
  289. this.logisticsCompanyList = list;
  290. }else{
  291. uni.showToast({
  292. icon:'none',
  293. title: res.msg || '物流公司获取失败'
  294. });
  295. }
  296. }).finally(() => {
  297. this.logisticsLoading = false;
  298. });
  299. },
  300. onSearchInput() {
  301. if (this.searchTimer) {
  302. clearTimeout(this.searchTimer);
  303. }
  304. this.deliveryForm.shipper_code = ''; // 重置选中状态以显示列表
  305. this.searchTimer = setTimeout(() => {
  306. this.loadLogisticsCompanies(true);
  307. }, 500);
  308. },
  309. clearSearch() {
  310. this.logisticsKeyword = '';
  311. this.logisticsCompanyList = [];
  312. this.resetDeliveryForm();
  313. },
  314. selectLogistics(item) {
  315. this.deliveryForm.shipper_code = item.lcId || '';
  316. this.deliveryForm.delivery_name = item.lcName || '';
  317. this.logisticsKeyword = ''; // 清空搜索词以显示选中状态
  318. this.logisticsCompanyList = [];
  319. },
  320. reselectLogistics() {
  321. this.logisticsKeyword = this.deliveryForm.delivery_name;
  322. this.deliveryForm.shipper_code = '';
  323. this.onSearchInput();
  324. },
  325. searchLogisticsCompanies(){
  326. this.loadLogisticsCompanies(true);
  327. },
  328. refreshLogisticsCompanies(){
  329. refreshLogisticsCompany({}).then(res => {
  330. if(res.code==0||res.code==200){
  331. this.logisticsCompanyList = [];
  332. this.loadLogisticsCompanies(true);
  333. }else{
  334. uni.showToast({
  335. icon:'none',
  336. title: res.msg || '刷新失败'
  337. });
  338. }
  339. });
  340. },
  341. validateDeliveryForm(){
  342. if(!this.deliveryForm.shipper_code||!this.deliveryForm.delivery_name){
  343. uni.showToast({
  344. icon:'none',
  345. title: '请选择物流公司'
  346. });
  347. return false;
  348. }
  349. if(!this.deliveryForm.delivery_sn){
  350. uni.showToast({
  351. icon:'none',
  352. title: '请输入物流单号'
  353. });
  354. return false;
  355. }
  356. return true;
  357. },
  358. buildDeliveryPayload(){
  359. if(!this.deliveryBaseInfo.consignee||!this.deliveryBaseInfo.phone_number||!this.deliveryBaseInfo.address){
  360. return null;
  361. }
  362. return {
  363. orderCode:this.orderCode,
  364. consignee:this.deliveryBaseInfo.consignee,
  365. phone_number:this.deliveryBaseInfo.phone_number,
  366. address:this.deliveryBaseInfo.address,
  367. shipper_code:this.deliveryForm.shipper_code,
  368. delivery_sn:this.deliveryForm.delivery_sn,
  369. delivery_name:this.deliveryForm.delivery_name
  370. };
  371. },
  372. handleSubmitSuccess(message){
  373. uni.showToast({
  374. icon:'success',
  375. title: message || '提交成功'
  376. });
  377. setTimeout(function() {
  378. uni.$emit('refreshOrder');
  379. uni.navigateBack({
  380. delta: 1
  381. })
  382. }, 500);
  383. },
  384. deletePic(event) {
  385. this[`fileList${event.name}`].splice(event.index, 1)
  386. },
  387. async afterRead(event) {
  388. // 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式
  389. let lists = [].concat(event.file)
  390. let fileListLen = this[`fileList${event.name}`].length
  391. lists.map((item) => {
  392. this[`fileList${event.name}`].push({
  393. ...item,
  394. status: 'uploading',
  395. message: '上传中'
  396. })
  397. })
  398. for (let i = 0; i < lists.length; i++) {
  399. const result = await this.uploadFilePromise(lists[i].url)
  400. let item = this[`fileList${event.name}`][fileListLen]
  401. this[`fileList${event.name}`].splice(fileListLen, 1, Object.assign(item, {
  402. status: result.status,
  403. message: result.status == 'failed' ? '上传失败' : '',
  404. url: result.url
  405. }))
  406. fileListLen++
  407. }
  408. },
  409. getSuccessUrls(list) {
  410. if (!list || list.length === 0) return '';
  411. const hasUploading = list.some(v => v.status === 'uploading');
  412. const hasFailed = list.some(v => v.status === 'failed');
  413. if (hasUploading) {
  414. uni.showToast({
  415. title: '请等待图片上传完成',
  416. icon: 'none'
  417. });
  418. return 'failed';
  419. }
  420. if (hasFailed) {
  421. uni.showToast({
  422. title: '请检查是否有图片上传失败',
  423. icon: 'none'
  424. });
  425. return 'failed';
  426. }
  427. return list.filter(v => v.status === 'success').map(v => v.url).join(',');
  428. },
  429. uploadFilePromise(url) {
  430. return new Promise((resolve, reject) => {
  431. let a = uni.uploadFile({
  432. url: uni.getStorageSync('requestPath') + '/app/common/uploadOSS', // 仅为示例,非真实的接口地址
  433. filePath: url,
  434. name: 'file',
  435. success: (res) => {
  436. if (res.statusCode == 200 && JSON.parse(res.data).code == 200) {
  437. resolve({
  438. url: JSON.parse(res.data).url,
  439. status: 'success'
  440. })
  441. } else {
  442. resolve({
  443. url: url,
  444. status: 'failed'
  445. })
  446. }
  447. },
  448. fail: (res) => {
  449. resolve({
  450. url: url,
  451. status: 'failed'
  452. })
  453. }
  454. });
  455. })
  456. },
  457. async submit(){
  458. if(this.reasons=="请选择"){
  459. uni.showToast({
  460. icon:'none',
  461. title: '请选择原因'
  462. });
  463. return;
  464. }
  465. if(this.refundAmount<0){
  466. uni.showToast({
  467. icon:'none',
  468. title: '请输入退款金额'
  469. });
  470. return;
  471. }
  472. const images = this.getSuccessUrls(this.fileList1);
  473. if (images === 'failed') return;
  474. this.explainImg = images;
  475. var productIds=this.items.map(item=>item.productId);
  476. var products=[];
  477. for(var i=0;i<productIds.length;i++){
  478. var item={productId:productIds[i]};
  479. products.push(item);
  480. }
  481. var afterSalesData={
  482. refundAmount:this.refundAmount,
  483. refundIntegral:this.refundIntegral,
  484. orderCode:this.orderCode,
  485. serviceType:this.refundType,
  486. reasons:this.reasons,
  487. explains:this.explains,
  488. explainImg: this.explainImg,
  489. // productList:products,
  490. };
  491. if (this.isDeliveryReason) {
  492. // 如果原因是物流相关(dictValue为6)
  493. if (!this.validateDeliveryForm()) {
  494. return;
  495. }
  496. // 1. 先获取商家收货地址
  497. await this.loadMerchantDeliveryInfo();
  498. var deliveryData = this.buildDeliveryPayload();
  499. if (!deliveryData) {
  500. uni.showToast({
  501. icon: 'none',
  502. title: '商家收货信息不完整'
  503. });
  504. return;
  505. }
  506. // 2. 合并参数:售后数据 + 物流数据
  507. let finalSubmitData = {
  508. ...afterSalesData, // 原售后参数
  509. ...deliveryData // 物流信息(已合并)
  510. };
  511. // 3. 只调用一个接口:applyAfterSales
  512. var res = await applyAfterSales(finalSubmitData);
  513. if (res.code === 200) {
  514. this.handleSubmitSuccess('提交成功');
  515. } else {
  516. uni.showToast({
  517. icon: 'none',
  518. title: res.msg || '提交失败'
  519. });
  520. }
  521. }else{
  522. // 如果不是物流相关,直接调用申请售后接口
  523. var res = await applyAfterSales(afterSalesData);
  524. if(res.code==200){
  525. this.handleSubmitSuccess('提交成功');
  526. }else{
  527. uni.showToast({
  528. icon:'none',
  529. title: res.msg
  530. });
  531. }
  532. }
  533. },
  534. }
  535. }
  536. </script>
  537. <style lang="scss">
  538. .content{
  539. margin-bottom: 170upx;
  540. .inner{
  541. padding: 20upx;
  542. .drug-list{
  543. .item{
  544. background: #FFFFFF;
  545. border-radius: 16upx;
  546. margin-bottom: 20upx;
  547. padding: 0 30upx;
  548. .drug-info{
  549. display: flex;
  550. align-items: center;
  551. padding: 30upx 0;
  552. .img-box{
  553. width: 160upx;
  554. height: 160upx;
  555. margin-right: 30upx;
  556. image{
  557. width: 100%;
  558. height: 100%;
  559. }
  560. }
  561. .info{
  562. width: calc(100% - 160upx);
  563. height: 160upx;
  564. display: flex;
  565. flex-direction: column;
  566. justify-content: space-between;
  567. .top{
  568. .title{
  569. font-size: 28upx;
  570. font-family: PingFang SC;
  571. font-weight: 500;
  572. color: #111111;
  573. line-height: 1.4;
  574. .tag{
  575. display: inline-block;
  576. padding: 0 6upx;
  577. height: 30upx;
  578. background: linear-gradient(90deg, #2583EB 0%, #2BC7A4 100%);
  579. border-radius: 4upx;
  580. margin-right: 10upx;
  581. font-size: 22upx;
  582. font-family: PingFang SC;
  583. font-weight: bold;
  584. color: #FFFFFF;
  585. line-height: 30upx;
  586. float: left;
  587. margin-top: 7upx;
  588. }
  589. }
  590. .spec{
  591. font-size: 24upx;
  592. font-family: PingFang SC;
  593. font-weight: 500;
  594. color: #999999;
  595. line-height: 1;
  596. margin-top: 14upx;
  597. }
  598. }
  599. }
  600. }
  601. }
  602. }
  603. .reason-apply{
  604. margin-top: 20upx;
  605. background: #FFFFFF;
  606. border-radius: 16upx;
  607. padding: 0 30upx;
  608. .title-box{
  609. height: 86upx;
  610. display: flex;
  611. align-items: center;
  612. justify-content: space-between;
  613. border-bottom: 1px solid #F0F0F0;
  614. .label{
  615. font-size: 30upx;
  616. font-family: PingFang SC;
  617. font-weight: bold;
  618. color: #333333;
  619. }
  620. .radio-group {
  621. display: flex;
  622. .radio {
  623. display: flex;
  624. align-items: center;
  625. margin-right: 40upx;
  626. font-size: 28upx;
  627. color: #333333;
  628. radio {
  629. transform:scale(0.7);
  630. }
  631. }
  632. }
  633. .money{
  634. font-size: 24upx;
  635. font-family: PingFang SC;
  636. font-weight: 500;
  637. color: #999999;
  638. }
  639. .chose-box{
  640. display: flex;
  641. align-items: center;
  642. .text{
  643. font-size: 24upx;
  644. font-family: PingFang SC;
  645. font-weight: 500;
  646. color: #999999;
  647. }
  648. image{
  649. width: 14upx;
  650. height: 24upx;
  651. margin-left: 10upx;
  652. }
  653. }
  654. }
  655. .upload-box{
  656. padding: 20upx 0;
  657. .upload-title{
  658. font-size: 30upx;
  659. font-family: PingFang SC;
  660. font-weight: bold;
  661. color: #333333;
  662. margin-bottom: 20upx;
  663. }
  664. }
  665. .textarea-box{
  666. padding: 30upx 0;
  667. textarea{
  668. width: 100%;
  669. box-sizing: border-box;
  670. background: #F5F5F5;
  671. border-radius: 16upx;
  672. padding: 30upx 20upx;
  673. font-size: 24upx;
  674. font-family: PingFang SC;
  675. font-weight: 500;
  676. color: #111111;
  677. }
  678. .textarea-place{
  679. font-size: 24upx;
  680. font-family: PingFang SC;
  681. font-weight: 500;
  682. color: #999999;
  683. }
  684. }
  685. .delivery-box{
  686. border-top: 1px solid #F0F0F0;
  687. padding-top: 20upx;
  688. .logistics-select-container {
  689. position: relative;
  690. margin-bottom: 20upx;
  691. .search-header {
  692. display: flex;
  693. align-items: center;
  694. height: 86upx;
  695. border-bottom: 1px solid #F0F0F0;
  696. .label {
  697. font-size: 30upx;
  698. font-family: PingFang SC;
  699. font-weight: bold;
  700. color: #333333;
  701. width: 160upx;
  702. }
  703. .search-input-wrapper {
  704. flex: 1;
  705. position: relative;
  706. display: flex;
  707. align-items: center;
  708. .search-input {
  709. width: 100%;
  710. height: 60upx;
  711. font-size: 26upx;
  712. color: #333333;
  713. text-align: left;
  714. padding-right: 50upx;
  715. }
  716. .clear-icon {
  717. position: absolute;
  718. right: 10upx;
  719. width: 32upx;
  720. height: 32upx;
  721. z-index: 10;
  722. }
  723. }
  724. .refresh-btn {
  725. font-size: 24upx;
  726. color: #2583EB;
  727. margin-left: 20upx;
  728. min-width: 60upx;
  729. text-align: center;
  730. &.loading {
  731. opacity: 0.6;
  732. }
  733. }
  734. }
  735. .results-dropdown {
  736. position: absolute;
  737. top: 86upx;
  738. left: 0;
  739. right: 0;
  740. background: #FFFFFF;
  741. box-shadow: 0 4upx 20upx rgba(0,0,0,0.1);
  742. border-radius: 8upx;
  743. z-index: 100;
  744. max-height: 400upx;
  745. overflow: hidden;
  746. .results-list {
  747. max-height: 400upx;
  748. .result-item {
  749. padding: 24upx 30upx;
  750. border-bottom: 1px solid #F8F8F8;
  751. &:active {
  752. background-color: #F5F5F5;
  753. }
  754. .name {
  755. font-size: 28upx;
  756. color: #333333;
  757. }
  758. }
  759. .empty-results, .loading-results {
  760. padding: 40upx;
  761. text-align: center;
  762. font-size: 24upx;
  763. color: #999999;
  764. }
  765. }
  766. }
  767. .selected-display {
  768. display: flex;
  769. align-items: center;
  770. justify-content: space-between;
  771. height: 80upx;
  772. background: #F8F8F8;
  773. border-radius: 8upx;
  774. padding: 0 20upx;
  775. margin-top: 10upx;
  776. .name {
  777. font-size: 28upx;
  778. color: #2583EB;
  779. font-weight: 500;
  780. }
  781. .arrow {
  782. width: 12upx;
  783. height: 20upx;
  784. }
  785. }
  786. }
  787. .logistics-input{
  788. flex: 1;
  789. }
  790. .address-card {
  791. padding: 20upx 0;
  792. background: #FFFFFF;
  793. .address-item {
  794. display: flex;
  795. align-items: flex-start;
  796. padding: 30upx 0;
  797. border-bottom: 1upx solid #F5F5F5;
  798. &:last-child {
  799. border-bottom: none;
  800. }
  801. .icon-box {
  802. width: 44upx;
  803. height: 44upx;
  804. border-radius: 8upx;
  805. display: flex;
  806. align-items: center;
  807. justify-content: center;
  808. font-size: 24upx;
  809. font-weight: bold;
  810. color: #FFFFFF;
  811. margin-top: 6upx;
  812. flex-shrink: 0;
  813. &.sender {
  814. background: #FF5A1F;
  815. }
  816. &.recipient {
  817. background: #FFB400;
  818. }
  819. }
  820. .content-box {
  821. flex: 1;
  822. margin-left: 20upx;
  823. .user-info {
  824. margin-bottom: 12upx;
  825. display: flex;
  826. align-items: center;
  827. .name {
  828. font-size: 30upx;
  829. font-weight: bold;
  830. color: #111111;
  831. margin-right: 20upx;
  832. }
  833. .phone {
  834. font-size: 30upx;
  835. font-weight: bold;
  836. color: #111111;
  837. }
  838. }
  839. .address-text {
  840. font-size: 26upx;
  841. color: #666666;
  842. line-height: 1.4;
  843. word-break: break-all;
  844. }
  845. }
  846. }
  847. }
  848. }
  849. }
  850. .return-method{
  851. background: #FFFFFF;
  852. border-radius: 16upx;
  853. margin-top: 20upx;
  854. padding: 0 30upx 40upx;
  855. .title-box{
  856. height: 86upx;
  857. display: flex;
  858. align-items: center;
  859. justify-content: space-between;
  860. border-bottom: 1px solid #F0F0F0;
  861. .text{
  862. font-size: 30upx;
  863. font-family: PingFang SC;
  864. font-weight: bold;
  865. color: #333333;
  866. }
  867. }
  868. .return-tips{
  869. margin-top: 30upx;
  870. margin-bottom: 30upx;
  871. height: 80upx;
  872. background: #FFF4E6;
  873. border-radius: 16upx;
  874. padding: 0 20upx;
  875. display: flex;
  876. align-items: center;
  877. .text{
  878. font-size: 24upx;
  879. font-family: PingFang SC;
  880. font-weight: 500;
  881. color: #EF8A07;
  882. }
  883. }
  884. .info-item{
  885. display: flex;
  886. align-items: center;
  887. justify-content: space-between;
  888. margin-bottom: 40upx;
  889. &:last-child{
  890. margin-bottom: 0;
  891. }
  892. .label{
  893. font-size: 26upx;
  894. font-family: PingFang SC;
  895. font-weight: 500;
  896. color: #666666;
  897. line-height: 1;
  898. }
  899. .text{
  900. font-size: 26upx;
  901. font-family: PingFang SC;
  902. font-weight: 500;
  903. color: #111111;
  904. line-height: 1;
  905. }
  906. .detail-box{
  907. display: flex;
  908. align-items: center;
  909. .price-box{
  910. display: flex;
  911. align-items: flex-end;
  912. margin-right: 18upx;
  913. .unit{
  914. font-size: 24upx;
  915. font-family: PingFang SC;
  916. font-weight: 500;
  917. color: #111111;
  918. line-height: 1.2;
  919. }
  920. .num{
  921. font-size: 32upx;
  922. font-family: PingFang SC;
  923. font-weight: bold;
  924. color: #111111;
  925. line-height: 1;
  926. }
  927. }
  928. .det-text{
  929. font-size: 26upx;
  930. font-family: PingFang SC;
  931. font-weight: 500;
  932. color: #111111;
  933. }
  934. image{
  935. width: 14upx;
  936. height: 24upx;
  937. margin-left: 10upx;
  938. }
  939. }
  940. }
  941. }
  942. }
  943. .reson-box{
  944. padding: 0 10upx 60upx;
  945. .reson-item{
  946. width: 100%;
  947. height: 110upx;
  948. display: flex;
  949. align-items: center;
  950. justify-content: space-between;
  951. .title{
  952. font-size: 30upx;
  953. font-family: PingFang SC;
  954. font-weight: 500;
  955. color: #111111;
  956. }
  957. }
  958. }
  959. }
  960. .btn-box{
  961. height: 120upx;
  962. padding: 0 30upx;
  963. display: flex;
  964. align-items: center;
  965. justify-content: center;
  966. .sub-btn{
  967. width: 100%;
  968. height: 88upx;
  969. line-height: 88upx;
  970. text-align: center;
  971. font-size: 30upx;
  972. font-family: PingFang SC;
  973. font-weight: bold;
  974. color: #FFFFFF;
  975. background: #2583EB;
  976. border-radius: 44upx;
  977. }
  978. }
  979. input{
  980. text-align: right;
  981. }
  982. .form-input{
  983. font-size: 30upx;
  984. font-family: PingFang SC;
  985. font-weight: 500;
  986. color: #999999;
  987. text-align: right;
  988. }
  989. .num-box{
  990. display: flex;
  991. align-items: center;
  992. justify-content: space-between;
  993. .price{
  994. display: flex;
  995. align-items: flex-end;
  996. .unit{
  997. font-size: 24upx;
  998. font-family: PingFang SC;
  999. font-weight: 500;
  1000. color: #111111;
  1001. line-height: 1.2;
  1002. margin-right: 4upx;
  1003. }
  1004. .num{
  1005. font-size: 32upx;
  1006. font-family: PingFang SC;
  1007. font-weight: 500;
  1008. color: #111111;
  1009. line-height: 1;
  1010. }
  1011. }
  1012. .amount{
  1013. font-size: 24upx;
  1014. font-family: PingFang SC;
  1015. font-weight: 500;
  1016. color: #999999;
  1017. line-height: 1;
  1018. }
  1019. }
  1020. </style>