repair.vue 7.3 KB

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