| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389 | <!-- 售后申请 --><template>  <s-layout title="申请售后">    <!-- 售后商品 -->    <view class="goods-box">      <s-goods-item        :img="state.item.picUrl"        :title="state.item.spuName"        :skuText="state.item.properties?.map((property) => property.valueName).join(' ')"        :price="state.item.price"        :num="state.item.count"      />    </view>    <uni-forms ref="form" v-model="formData" :rules="rules" label-position="top">      <!-- 售后类型 -->      <view class="refund-item">        <view class="item-title ss-m-b-20">售后类型</view>        <view class="ss-flex-col">          <radio-group @change="onRefundChange">            <label              class="ss-flex ss-col-center ss-p-y-10"              v-for="(item, index) in state.wayList"              :key="index"            >              <radio                :checked="formData.type === item.value"                color="var(--ui-BG-Main)"                style="transform: scale(0.8)"                :value="item.value"              />              <view class="item-value ss-m-l-8">{{ item.text }}</view>            </label>          </radio-group>        </view>      </view>      <!-- 退款金额 -->      <view class="refund-item ss-flex ss-col-center ss-row-between" @tap="state.showModal = true">        <text class="item-title">退款金额</text>        <view class="ss-flex refund-cause ss-col-center">          <text class="ss-m-r-20">¥{{ fen2yuan(state.item.payPrice) }}</text>        </view>      </view>      <!-- 申请原因 -->      <view class="refund-item ss-flex ss-col-center ss-row-between" @tap="state.showModal = true">        <text class="item-title">申请原因</text>        <view class="ss-flex refund-cause ss-col-center">          <text class="ss-m-r-20" v-if="formData.applyReason">{{ formData.applyReason }}</text>          <text class="ss-m-r-20" v-else>请选择申请原因~</text>          <text class="cicon-forward" style="height: 28rpx"></text>        </view>      </view>      <!-- 留言 -->      <view class="refund-item">        <view class="item-title ss-m-b-20">相关描述</view>        <view class="describe-box">          <uni-easyinput            :inputBorder="false"            class="describe-content"            type="textarea"            maxlength="120"            autoHeight            v-model="formData.applyDescription"            placeholder="客官~请描述您遇到的问题,建议上传照片"          />          <!-- TODO 非繁人:上传的测试 -->          <view class="upload-img">            <s-uploader              v-model:url="formData.applyPicUrls"              fileMediatype="image"              limit="9"              mode="grid"              :imageStyles="{ width: '168rpx', height: '168rpx' }"            />          </view>        </view>      </view>    </uni-forms>    <!-- 底部按钮 -->    <su-fixed bottom placeholder>      <view class="foot-wrap">        <view class="foot_box ss-flex ss-col-center ss-row-between ss-p-x-30">          <button class="ss-reset-button contcat-btn" @tap="sheep.$router.go('/pages/chat/index')">            联系客服          </button>          <button class="ss-reset-button ui-BG-Main-Gradient sub-btn" @tap="submit">提交</button>        </view>      </view>    </su-fixed>    <!-- 申请原因弹窗 -->    <su-popup :show="state.showModal" round="10" :showClose="true" @close="state.showModal = false">      <view class="modal-box page_box">        <view class="modal-head item-title head_box ss-flex ss-row-center ss-col-center">          申请原因        </view>        <view class="modal-content content_box">          <radio-group @change="onChange">            <label              class="radio ss-flex ss-col-center"              v-for="item in state.reasonList"              :key="item"            >              <view class="ss-flex-1 ss-p-20">{{ item }}</view>              <radio                :value="item"                color="var(--ui-BG-Main)"                :checked="item === state.currentValue"              />            </label>          </radio-group>        </view>        <view class="modal-foot foot_box ss-flex ss-row-center ss-col-center">          <button class="ss-reset-button close-btn ui-BG-Main-Gradient" @tap="onReason">            确定          </button>        </view>      </view>    </su-popup>  </s-layout></template><script setup>  import sheep from '@/sheep';  import { onLoad } from '@dcloudio/uni-app';  import { reactive, ref } from 'vue';  import OrderApi from '@/sheep/api/trade/order';  import TradeConfigApi from '@/sheep/api/trade/config';  import { fen2yuan } from '@/sheep/hooks/useGoods';  import AfterSaleApi from '@/sheep/api/trade/afterSale';  const form = ref(null);  const state = reactive({    orderId: 0, // 订单编号    itemId: 0, // 订单项编号    order: {}, // 订单    item: {}, // 订单项    config: {}, // 交易配置    // 售后类型    wayList: [      // {      //   text: '仅退款',      //   value: '10',      // },      {        text: '退款退货',        value: '20',      },    ],    reasonList: [], // 可选的申请原因数组    showModal: false, // 是否显示申请原因弹窗    currentValue: '' // 当前选择的售后原因  });  const formData = reactive({    way: '',    applyReason: '',    applyDescription: '',    applyPicUrls: [],  });  const rules = reactive({});  // 提交表单  async function submit() {    if(formData.way == ""){	  	uni.showToast({	  		title: '请选择售后类型',	  		icon: 'error',    	  		duration: 1000   	  	})  	  	return false;	  }	  if(state.currentValue == ""){	  	uni.showToast({	  		title: '请选择申请原因',	  		icon: 'error',    	  		duration: 1000    	  	})  	  	return false;	  }    if(formData.applyDescription == ""){	  	uni.showToast({	  		title: '请填写相关描述',	  		icon: 'error',    	  		duration: 1000   	  	})  	  	return false;	  }			    // #ifdef MP    sheep.$platform.useProvider('wechat').subscribeMessage('order_aftersale_change');    // #endif    let data = {      orderItemId: state.itemId,      refundPrice: state.item.payPrice,      ...formData,    };    const { code } = await AfterSaleApi.createAfterSale(data);    if (code === 0) {      uni.showToast({        title: '申请成功',      });      sheep.$router.go('/pages/order/aftersale/list');    }  }  // 选择售后类型  function onRefundChange(e) {    formData.way = e.detail.value;    // 清理理由    state.reasonList =      formData.way === '10'        ? state.config.afterSaleRefundReasons || []        : state.config.afterSaleReturnReasons || [];    formData.applyReason = '';    state.currentValue = '';  }  // 选择申请原因  function onChange(e) {    state.currentValue = e.detail.value;  }  // 确定  function onReason() {    formData.applyReason = state.currentValue;    state.showModal = false;  }  onLoad(async (options) => {    // 解析参数    if (!options.orderId || !options.itemId) {      sheep.$helper.toast(`缺少订单信息,请检查`);      return;    }    state.orderId = options.orderId;    state.itemId = parseInt(options.itemId);    // 读取订单信息    const { code, data } = await OrderApi.getOrder(state.orderId);    if (code !== 0) {      return;    }    state.order = data;    state.item = data.items.find((item) => item.id === state.itemId) || {};    // 设置选项    if (state.order.status === 10) {      state.wayList.splice(1, 1);    }    // 读取配置    state.config = (await TradeConfigApi.getTradeConfig()).data;		// 取消仅退款,所以一进入这个页面就默认选中售后退款	formData.way = '20';	formData.type = '20';	state.reasonList = state.config.afterSaleReturnReasons || [];  });</script><style lang="scss" scoped>  .item-title {    font-size: 30rpx;    font-weight: bold;    color: rgba(51, 51, 51, 1);    // margin-bottom: 20rpx;  }  // 售后项目  .refund-item {    background-color: #fff;    border-bottom: 1rpx solid #f5f5f5;    padding: 30rpx;    &:last-child {      border: none;    }    // 留言    .describe-box {      width: 690rpx;      background: rgba(249, 250, 251, 1);      padding: 30rpx;      box-sizing: border-box;      border-radius: 20rpx;      .describe-content {        height: 200rpx;        font-size: 24rpx;        font-weight: 400;        color: #333;      }    }    // 联系方式    .input-box {      height: 84rpx;      background: rgba(249, 250, 251, 1);      border-radius: 20rpx;    }  }  .goods-box {    background: #fff;    padding: 20rpx;    margin-bottom: 20rpx;  }  .foot-wrap {    height: 100rpx;    width: 100%;  }  .foot_box {    height: 100rpx;    background-color: #fff;    .sub-btn {      width: 336rpx;      line-height: 74rpx;      border-radius: 38rpx;      color: rgba(#fff, 0.9);      font-size: 28rpx;    }    .contcat-btn {      width: 336rpx;      line-height: 74rpx;      background: rgba(238, 238, 238, 1);      border-radius: 38rpx;      font-size: 28rpx;      font-weight: 400;      color: rgba(51, 51, 51, 1);    }  }  .modal-box {    width: 750rpx;    // height: 680rpx;    border-radius: 30rpx 30rpx 0 0;    background: #fff;    .modal-head {      height: 100rpx;      font-size: 30rpx;    }    .modal-content {      font-size: 28rpx;    }    .modal-foot {      .close-btn {        width: 710rpx;        line-height: 80rpx;        border-radius: 40rpx;        color: rgba(#fff, 0.9);      }    }  }  .success-box {    width: 600rpx;    padding: 90rpx 0 64rpx 0;    .cicon-check-round {      font-size: 96rpx;      color: #04b750;    }    .success-title {      font-weight: 500;      color: #333333;      font-size: 32rpx;    }    .success-btn {      width: 492rpx;      height: 70rpx;      background: linear-gradient(90deg, var(--ui-BG-Main-gradient), var(--ui-BG-Main));      border-radius: 35rpx;    }  }</style>
 |