after_sale_submit.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527
  1. <template>
  2. <!-- 申请的表单 换货2,退货3 -->
  3. <view class="dt-page">
  4. <view class="comp-list-item">
  5. <view class="left-item">
  6. <text>售后类型</text>
  7. </view>
  8. <view class="right-item">{{loadOptions.saleType==2?'申请换货':'申请退货'}}</view>
  9. </view>
  10. <!-- <view class="comp-list-item" @tap="showSaleType">
  11. <view class="left-item">
  12. <text>售后类型</text>
  13. </view>
  14. <view class="right-item">
  15. <input :value="saleTypeLabel" type="text" placeholder="请选择售后类型" disabled/>
  16. </view>
  17. </view> -->
  18. <view class="comp-list-item">
  19. <view class="left-item">
  20. <text>订单编号</text>
  21. </view>
  22. <!-- <view class="right-item">{{ loadOptions.orderSn|defaultValue('无') }}</view> -->
  23. <view class="right-item">{{ orderSn|defaultValue('无') }}</view>
  24. </view>
  25. <view class="item-margin"></view>
  26. <block v-if="loadOptions.saleType==2">
  27. <view class="comp-list-item">
  28. <view class="left-item">
  29. <text>收货人</text>
  30. </view>
  31. <view class="right-item">
  32. <input v-model="formData.receiver" type="text" placeholder="请填写收货人姓名">
  33. </view>
  34. </view>
  35. <view class="comp-list-item">
  36. <view class="left-item">
  37. <text>地区</text>
  38. </view>
  39. <picker mode="multiSelector"
  40. @change="onMultiPickerChange"
  41. @columnchange="onMultiPickerColumnChange"
  42. range-key="name"
  43. :value="regionIndex"
  44. :range="regionList">
  45. <view class="right-item">
  46. <input v-model="formData.area" type="text" placeholder="请选择您收货的地区" disabled/>
  47. <image src="http://139.9.103.171:1888/img/image/arrow.png"></image>
  48. </view>
  49. </picker>
  50. </view>
  51. <view class="comp-list-item">
  52. <view class="left-item">
  53. <text>详细地址</text>
  54. </view>
  55. <view class="right-item">
  56. <input v-model="formData.detail" type="text" placeholder="请输入详细地址" />
  57. </view>
  58. </view>
  59. <view class="comp-list-item">
  60. <view class="left-item">
  61. <text>联系电话</text>
  62. </view>
  63. <view class="right-item">
  64. <input v-model="formData.phone" type="text" maxlength="11" placeholder="请填写联系电话" />
  65. </view>
  66. </view>
  67. <view class="item-margin"></view>
  68. <view class="comp-list-item form-block">
  69. <view class="left-item">
  70. <text>售后原因</text>
  71. </view>
  72. <view class="right-item">
  73. <textarea v-model="formData.reason" maxlength="-1" class="reason" placeholder="请输入您售后的原因"></textarea>
  74. </view>
  75. </view>
  76. </block>
  77. <block v-else>
  78. <view class="comp-list-item">
  79. <view class="left-item">
  80. <text>退货方式</text>
  81. </view>
  82. <view class="right-item">在线支付</view>
  83. </view>
  84. <view class="item-margin"></view>
  85. <view class="comp-list-item form-block">
  86. <view class="left-item">
  87. <text>售后原因</text>
  88. </view>
  89. <view class="right-item">
  90. <textarea v-model="formData2.reason" maxlength="-1" class="reason" placeholder="请输入您售后的原因"></textarea>
  91. </view>
  92. </view>
  93. </block>
  94. <FootToolbar bgColor="#fff">
  95. <view slot="main" class="btn-voucher-wrap">
  96. <button @tap="tapSubmit" class="dt-btn-submit btn-voucher" hover-class="button-hover-scale">提交售后申请</button>
  97. </view>
  98. </FootToolbar>
  99. <FootSaleType ref="footSaleType"
  100. :dataList.sync="saleTypeList"
  101. @choose="onChoose" />
  102. </view>
  103. </template>
  104. <script>
  105. import FootToolbar from '../comps/foot_toolbar.vue'
  106. import FootSaleType from '../comps/foot_sale_type.vue'
  107. export default {
  108. components:{
  109. FootToolbar,
  110. FootSaleType
  111. },
  112. data(){
  113. return {
  114. formData:{
  115. receiver:'', // 收货人
  116. area:'', // 收货地址
  117. detail:'', // 详细地址
  118. phone:'', // 联系电话
  119. reason:'', // 售后原因
  120. },
  121. formRules:{
  122. receiver:[{
  123. required:true,
  124. message:'请输入收货人'
  125. }],
  126. area:[{
  127. required:true,
  128. message:'请选择地址'
  129. }],
  130. detail:[{
  131. required:true,
  132. message:'请输入详细地址'
  133. }],
  134. phone:[{
  135. required:true,
  136. message:'请输入联系电话'
  137. },{
  138. type:'mobile',
  139. message:'手机号码有误!'
  140. }],
  141. reason:[{
  142. required:true,
  143. message:'请输入退货原因'
  144. }],
  145. },
  146. formData2:{
  147. reason:'', // 售后原因
  148. },
  149. formRules2:{
  150. reason:[{
  151. required:true,
  152. message:'请输入售后原因'
  153. }]
  154. },
  155. areaId:0,
  156. areaValue:'',
  157. regionIndex:[],
  158. regionList:[],
  159. orderItems:{},
  160. orderSn:'',
  161. saleTypeList:[
  162. { label:'申请换货',value:2, checked:false },
  163. { label:'申请退货',value:3, checked:true }
  164. ],
  165. saleTypeLabel:'申请退货'
  166. }
  167. },
  168. methods:{
  169. showSaleType(){
  170. this.$refs.footSaleType.show(this.formData.saleType)
  171. },
  172. onChoose(curCheck){
  173. this.loadOptions.saleType = curCheck.value
  174. this.saleTypeLabel = curCheck.label
  175. },
  176. // 整体变化响应
  177. onMultiPickerChange(e){
  178. console.log(103,e)
  179. let regionIndex = this.regionIndex.slice(0)
  180. let regionList = this.regionList.slice(0)
  181. let pItem = regionList[0][regionIndex[0]]
  182. let cItem = regionList[1][regionIndex[1]]
  183. let aItem = regionList[2][regionIndex[2]]
  184. this.areaId = aItem.id
  185. this.formData.area = this.$util.uniqueArray([
  186. pItem.name,
  187. cItem.name,
  188. aItem.name
  189. ]).join('-')
  190. },
  191. // 列变化响应
  192. onMultiPickerColumnChange(e){
  193. console.log(107,e.detail)
  194. let {column, value} = e.detail
  195. let regionIndex = this.regionIndex.slice(0)
  196. if(column==2){// 区变化
  197. regionIndex[2] = value
  198. this.regionIndex = regionIndex
  199. return
  200. }
  201. let regionList = this.regionList.slice(0)
  202. if(column==0){ // 省份变化
  203. let pList = regionList[0]
  204. let pItem = pList[value]
  205. if(pItem.addresses.length==0){// 只有省份
  206. regionList[1] = [pItem]
  207. regionList[2] = [pItem]
  208. }else{
  209. if(pItem.addresses[0].addresses.length==0){// 只有城市和区
  210. regionList[1] = [pItem]
  211. regionList[2] = pItem.addresses
  212. }else{// 正常省市区
  213. regionList[1] = pItem.addresses
  214. regionList[2] = pItem.addresses[0].addresses
  215. }
  216. }
  217. regionIndex = [value,0,0]
  218. }else if(column==1){ // 城市变化
  219. let cList = regionList[1]
  220. regionList[2] = cList[value].addresses
  221. regionIndex = [regionIndex[0],value,0]
  222. }
  223. this.regionIndex = regionIndex
  224. this.regionList = regionList
  225. },
  226. tapSubmit(){
  227. if(this.loadOptions.saleType==2){
  228. if(!this.validate(this.formRules,this.formData)){
  229. return
  230. }
  231. this.exchange()
  232. }else{
  233. if(!this.validate(this.formRules2,this.formData2)){
  234. return
  235. }
  236. this.refund()
  237. }
  238. },
  239. // 申请售后,换货
  240. async exchange(){
  241. let resp = await this.$api.applyAfterSale({
  242. type: 2,
  243. sn: this.loadOptions.orderSn,
  244. consignee: this.formData.receiver,
  245. area: this.formData.area,
  246. address: this.formData.detail,
  247. phone: this.formData.phone,
  248. reason: this.formData.reason,
  249. orderItems: this.loadOptions.orderItems || {},
  250. })
  251. this.$dialog.success('申请成功', () => {
  252. this.$util.refreshPage(['pages/mine','pages/mine_order_list'])
  253. uni.navigateBack({
  254. delta:4
  255. })
  256. })
  257. },
  258. // 申请售后,退款
  259. async refund(){
  260. let resp = await this.$api.applyAfterSale({
  261. type: 3,
  262. // sn: this.loadOptions.orderSn,
  263. sn: this.orderSn,
  264. method: 'ONLINE',
  265. reason: this.formData2.reason,
  266. // orderItems: this.loadOptions.orderItems || {},
  267. orderItems: this.orderItems
  268. })
  269. this.$dialog.success('申请成功', () => {
  270. this.$util.refreshPage(['pages/mine','pages/mine_order_list'])
  271. uni.navigateBack({
  272. delta:2
  273. })
  274. })
  275. },
  276. async qeuryAreaList(){
  277. let resp = await this.$api.areaList()
  278. let regionList = []
  279. regionList[0] = resp
  280. if(true){
  281. if(resp[0].addresses.length==0){// 只有省份
  282. regionList[1] = [resp[0]]
  283. regionList[2] = [resp[0]]
  284. }else{
  285. if(resp[0].addresses[0].addresses.length==0){// 只有城市和区
  286. regionList[1] = [resp[0]]
  287. regionList[2] = resp[0].addresses
  288. }else{// 正常省市区
  289. regionList[1] = resp[0].addresses
  290. regionList[2] = resp[0].addresses[0].addresses
  291. }
  292. }
  293. this.regionIndex = [0,0,0]
  294. }else{
  295. let regionIndex = []
  296. let areaIds = this.itemObj.areaIds.slice(0)
  297. let pid = areaIds[0]
  298. let cid = areaIds[1]
  299. let aid = areaIds[2]
  300. let provinceItem = {}
  301. let pidx = 0, cidx = 0, aidx = 0;
  302. for(let i=0,pitem; pitem = resp[i];i++){
  303. if(pitem.id == pid){
  304. provinceItem = pitem
  305. pidx = i
  306. break;
  307. }
  308. }
  309. if(areaIds.length==1){// 只有省
  310. regionList[1] = [provinceItem]
  311. regionList[2] = [provinceItem]
  312. regionIndex = [pidx,0,0]
  313. this.areaId = pid
  314. }else if(areaIds.length==2){// 只有市、区
  315. regionList[1] = [provinceItem]
  316. regionList[2] = provinceItem.addresses
  317. for(let j=0,citem;citem = regionList[2][j];j++){
  318. if(citem==cid){
  319. cidx = j
  320. break;
  321. }
  322. }
  323. regionIndex = [pidx,0,cidx]
  324. this.areaId = cid
  325. }else{// 省、市、区
  326. let cityItem = {}
  327. regionList[1] = provinceItem.addresses
  328. for(let j=0,citem;citem = regionList[1][j];j++){
  329. if(citem.id==cid){
  330. cityItem = citem
  331. cidx = j
  332. break;
  333. }
  334. }
  335. // console.log(252,cityItem)
  336. regionList[2] = cityItem.addresses
  337. for(let k=0,aitem;aitem = regionList[2][k];k++){
  338. if(aitem==aid){
  339. aidx = k
  340. break;
  341. }
  342. }
  343. regionIndex = [pidx,cidx,aidx]
  344. this.areaId = aid
  345. }
  346. this.regionIndex = regionIndex
  347. }
  348. this.regionList = regionList
  349. },
  350. async queryDataList() {
  351. let resp = await this.$api.getOrderAfterSaleInfo({
  352. _isShowLoading: true,
  353. orderId: this.loadOptions.orderId
  354. })
  355. if(Array.isArray(resp)){
  356. this.orderItems = {}
  357. for (let item of resp) {
  358. if(item.store.id == this.$global.server.storeId){
  359. for (let orderItem of item.orderItems) {
  360. if(orderItem.allowApplyAftersalesQuantity > 0){
  361. this.orderItems[orderItem.id] = orderItem.allowApplyAftersalesQuantity;
  362. }
  363. }
  364. this.orderSn = item.sn
  365. }
  366. }
  367. }
  368. if(JSON.stringify(this.orderItems)=="{}"){
  369. this.$dialog.alert({
  370. content:'当前商品已申请售后',
  371. confirmText: '确定',
  372. success: (res) => {
  373. if (res.confirm) {
  374. this.$util.refreshPage(['pages/mine','pages/mine_order_list'])
  375. uni.navigateBack({
  376. delta:2
  377. })
  378. }
  379. }
  380. })
  381. }
  382. },
  383. onLoadPage(options){
  384. wx.hideShareMenu();
  385. if(this.isLoad){
  386. // if(options.orderItems){
  387. // let orderItems = JSON.parse(options.orderItems)
  388. // this.loadOptions.orderItems = orderItems
  389. // }
  390. // if(options.saleType==2){// 换货
  391. // this.formData.reason = options.reason
  392. // this.qeuryAreaList()
  393. // }else{// 退货
  394. // this.formData2.reason = options.reason
  395. // }
  396. this.loadOptions.saleType = 3 // 默认 退货
  397. this.queryDataList()
  398. }
  399. },
  400. }
  401. }
  402. </script>
  403. <style lang="scss" scoped>
  404. .dt-page{
  405. min-height:100vh;
  406. background-color:#f2f2f2;
  407. .comp-list-item {
  408. position: relative;
  409. display: flex;
  410. flex-direction: row;
  411. align-items: center;
  412. padding: 0 30upx;
  413. color: #353535;
  414. justify-content: space-between;
  415. margin-top: 0;
  416. min-height: 90upx;
  417. border-bottom: 2upx solid #f2f2f2;
  418. background: #fff;
  419. .left-item {
  420. display: flex;
  421. align-items: center;
  422. text {
  423. max-height: 100%;
  424. overflow: hidden;
  425. display: -webkit-box;
  426. -webkit-box-orient: vertical;
  427. -webkit-line-clamp: 1;
  428. text-overflow: ellipsis;
  429. }
  430. }
  431. .right-item {
  432. display: flex;
  433. align-items: center;
  434. justify-content: flex-end;
  435. width:50vw;
  436. min-height:90upx;
  437. text {
  438. color: #999999;
  439. }
  440. image {
  441. margin-left: 20upx;
  442. width: 13upx;
  443. height: 24upx;
  444. }
  445. .reason{
  446. width:100%;
  447. min-height:200upx;
  448. padding-bottom:30upx;
  449. box-sizing:border-box;
  450. }
  451. }
  452. }
  453. .form-block{
  454. flex-wrap:wrap;
  455. .left-item{
  456. width:100%;
  457. line-height:1;
  458. padding:30upx 0;
  459. }
  460. .right-item{
  461. flex-wrap:wrap;
  462. width:100%;
  463. .choose-item{
  464. padding-left:16upx;
  465. width:100%;
  466. display:flex;
  467. align-items: center;
  468. line-height:60upx;
  469. .lable{
  470. padding-left:10upx;
  471. }
  472. }
  473. .choose-item:last-child{
  474. padding-bottom:20upx;
  475. }
  476. }
  477. }
  478. .item-margin{
  479. width:100%;
  480. height:20upx;
  481. }
  482. .hidden{
  483. opacity:0;
  484. }
  485. input{
  486. text-align: right;
  487. }
  488. .btn-voucher-wrap{
  489. display:flex;
  490. justify-content: center;
  491. align-items: center;
  492. width:100vw;
  493. height:110upx;
  494. background-color:#fff;
  495. .btn-voucher{
  496. width:690upx;
  497. height:80upx;
  498. line-height:80upx;
  499. color:#fff;
  500. background-color:$dt-color-primary;
  501. font-size: 30upx;
  502. }
  503. }
  504. }
  505. </style>