replace.vue 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. <template>
  2. <div class='app-container' v-loading="loading">
  3. <el-form :model="data.form" :rules="data.rules" ref="form" label-width="auto">
  4. <el-form-item label="收货人" prop="contact">
  5. <el-input v-model="data.form.contact" placeholder="请输入收货人名称" />
  6. </el-form-item>
  7. <el-form-item label="手机号" prop="mobile">
  8. <el-input v-model="data.form.mobile" placeholder="请输入手机号" />
  9. </el-form-item>
  10. <el-form-item class="address" label="收货地址" required>
  11. <el-form-item prop="provinceName">
  12. <el-select v-model="data.form.provinceName" placeholder="省">
  13. <el-option v-for="item in addressOptions" :key="item.id" :value="item.name" :label="item.name" />
  14. </el-select>
  15. </el-form-item>
  16. <span>/</span>
  17. <el-form-item prop="cityName">
  18. <el-select v-model="data.form.cityName" placeholder="市">
  19. <el-option v-for="item in cityOptions" :key="item.id" :value="item.name" :label="item.name" />
  20. </el-select>
  21. </el-form-item>
  22. <span>/</span>
  23. <el-form-item>
  24. <el-select v-model="data.form.areaName" placeholder="区">
  25. <el-option v-for="item in areaOptions" :key="item.id" :value="item.name" :label="item.name" />
  26. </el-select>
  27. </el-form-item>
  28. </el-form-item>
  29. <el-form-item label="详细地址" prop="address">
  30. <el-input v-model="data.form.address" type="textarea" :autosize="{ minRows: 5 }" placeholder="请输入详细地址" />
  31. </el-form-item>
  32. <el-form-item label="物流公司" prop="buyerExpressName">
  33. <el-input v-model="data.form.logisticsName" placeholder="请输入物流公司" />
  34. </el-form-item>
  35. <el-form-item label="快递单号" prop="buyerExpressNo">
  36. <el-input v-model="data.form.logisticsCode" placeholder="请输入快递单号(示例:SF)" />
  37. </el-form-item>
  38. <el-form-item label="产品型号" prop="specCode">
  39. <el-select v-model="data.form.specCode" filterable remote :remote-method="remoteMethod" placeholder="请选择产品型号">
  40. <el-option v-for="item in goodsOptions" :key="item.goodsId" :value="item.goodsId" :label="item.goodsName" />
  41. </el-select>
  42. </el-form-item>
  43. <el-form-item label="换新数量" prop="quantity">
  44. <el-input-number v-model="data.form.quantity" :min="1" />
  45. </el-form-item>
  46. <el-form-item label="购买渠道" prop="shopCode">
  47. <el-select v-model="data.form.shopCode" prop="shopCode" placeholder="请选择购买渠道" @change="handleChangeShopCode">
  48. <el-option v-for="item in storeOptions" :key="item.storeCode" :value="item.storeCode"
  49. :label="item.storeName" />
  50. </el-select>
  51. </el-form-item>
  52. <el-form-item label="购买凭证" prop="proofPurchase">
  53. <CustomUpload list-type="picture-card" :src="data.form.proofPurchase" @upload="upload" />
  54. <div>
  55. <div>示例:</div>
  56. <el-image :src="data.img[0]" :preview-src-list="data.img" />
  57. </div>
  58. </el-form-item>
  59. </el-form>
  60. <el-button class="submit" type="primary" round @click="getSubmit">提交</el-button>
  61. </div>
  62. </template>
  63. <script setup>
  64. import Steps from '@/components/Steps'
  65. import { submit } from '@/api/mobile/replace'
  66. import { useAddress, useStore, useGoods } from '@/hooks/index'
  67. const { addressOptions, getAddress } = useAddress()
  68. const { storeOptions, getStore } = useStore()
  69. const { goodsForm, goodsOptions, getGoods } = useGoods()
  70. const { proxy } = getCurrentInstance()
  71. document.title = '换新申请'
  72. const data = reactive({
  73. // 表单
  74. form: {
  75. quantity: 1,
  76. oid: "",
  77. outSkuId: 564,
  78. provinceName: "",
  79. cityName: "",
  80. areaName: ""
  81. },
  82. // 校验
  83. rules: {
  84. shopCode: [{ required: true, message: '请选择购买渠道', trigger: 'change' }],
  85. contact: [{ required: true, message: '请输入收货人姓名', trigger: 'blur' }],
  86. mobile: [{ required: true, pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "请输入正确的手机号码", trigger: "blur" }],
  87. provinceName: [{ required: true, message: '请选择省', trigger: 'change' }],
  88. cityName: [{ required: true, message: '请选择市', trigger: 'change' }],
  89. address: [{ required: true, message: '请输入详细地址', trigger: 'blur' }],
  90. logisticsName: [{ required: true, message: '请输入物流公司', trigger: 'blur' }],
  91. logisticsCode: [{ required: true, message: '请输入快递单号', trigger: 'blur' }],
  92. specCode: [{ required: true, message: '请选择产品型号', trigger: 'change' }],
  93. quantity: [{ required: true, message: '请输入数量', trigger: 'blur' }],
  94. proofPurchase: [{ required: true, message: '请上传购买凭证', trigger: 'change' }]
  95. },
  96. // 购买凭证模板
  97. img: [new URL(`../../assets/images/example.jpg`, import.meta.url).href]
  98. })
  99. // 遮罩层
  100. const loading = ref(false)
  101. // 计算属性
  102. const cityOptions = computed(() => {
  103. data.form.cityName = ""
  104. data.form.areaName = ""
  105. return data.form.provinceName ? addressOptions.value.find(i => i.name == data.form.provinceName).childList : []
  106. })
  107. const areaOptions = computed(() => {
  108. data.form.areaName = ""
  109. return data.form.cityName ? cityOptions.value.find(i => i.name == data.form.cityName).childList : []
  110. })
  111. // 搜索产品型号
  112. const remoteMethod = (e) => {
  113. goodsForm.value.goodsName = e
  114. goodsForm.value.goodsType = 2
  115. getGoods()
  116. }
  117. // 上传图片
  118. const upload = (file) => {
  119. data.form.proofPurchase = file.data.url
  120. }
  121. watch(() => data.form.contact, (val) => {
  122. data.form.buyerNick = val
  123. })
  124. // 购买渠道
  125. const handleChangeShopCode = (e) => {
  126. data.form.shopNick = storeOptions.value.find(i => i.storeCode == e).storeName
  127. }
  128. // 提交
  129. const getSubmit = () => {
  130. proxy.$refs.form.validate((valid) => {
  131. if (valid) {
  132. loading.value = true
  133. submit({ exchangeApplyOrderList: [data.form] }).then(res => {
  134. if (res.code === 0) {
  135. proxy.$modal.msgSuccess('提交成功!')
  136. proxy.$refs.form.resetFields()
  137. data.form = {
  138. quantity: 1,
  139. oid: "",
  140. outSkuId: 564,
  141. provinceName: "",
  142. cityName: "",
  143. areaName: ""
  144. }
  145. loading.value = false
  146. }
  147. })
  148. } else {
  149. return false
  150. }
  151. })
  152. }
  153. getAddress()
  154. getStore()
  155. </script>
  156. <style lang="scss" scoped>
  157. .el-form {
  158. .el-image {
  159. width: 146px;
  160. }
  161. .address {
  162. width: 100%;
  163. display: flex;
  164. align-items: center;
  165. .el-form-item {
  166. width: 100%;
  167. flex: 1;
  168. }
  169. span {
  170. margin: 0 4px
  171. }
  172. }
  173. }
  174. .submit {
  175. width: 100%;
  176. height: 40px;
  177. }
  178. </style>