created.vue 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. <template>
  2. <view class="common-page" style="padding: 0;">
  3. <view class="form-page">
  4. <u-form ref="formRef" :model="form" :rules="rules" labelPosition="left" labelWidth="85px">
  5. <u-form-item label="快递单号:" prop="waybillCode" required>
  6. <u-input v-model="form.waybillCode" placeholder="请输入快递单号" clearable></u-input>
  7. </u-form-item>
  8. <u-form-item label="承运商:" prop="carrier" required>
  9. <u-input :value="carrierText" readonly suffixIcon="arrow-down" placeholder="请选择"
  10. @click="showCarrierPicker = true"></u-input>
  11. </u-form-item>
  12. <u-form-item label="验货状态:" prop="verifyStatus" required>
  13. <u-input :value="verifyText" readonly suffixIcon="arrow-down" placeholder="请选择"
  14. @click="showVerifyPicker = true"></u-input>
  15. </u-form-item>
  16. <u-form-item label="任务类型:" prop="taskType" required>
  17. <u-input :value="taskTypeText" readonly suffixIcon="arrow-down" placeholder="请选择"
  18. @click="showTaskTypePicker = true"></u-input>
  19. </u-form-item>
  20. <u-form-item label="任务详情:" prop="taskDetail" required>
  21. <u-textarea v-model="form.taskDetail" placeholder="请输入" :height="120"
  22. :autoHeight="true"></u-textarea>
  23. </u-form-item>
  24. <u-form-item label="上传图片:" prop="images" required>
  25. <cy-upload :filename="form.images" @update:filename="form.images = $event" />
  26. </u-form-item>
  27. <view class="divider"></view>
  28. <u-form-item label="指派给:" prop="assignTo" required>
  29. <u-input :value="assignText" readonly suffixIcon="arrow-down" placeholder="请选择"
  30. @click="showAssignPicker = true"></u-input>
  31. </u-form-item>
  32. </u-form>
  33. </view>
  34. <u-picker :show="showCarrierPicker" :columns="[carrierOptions]" title="选择承运商" @confirm="onPickCarrier"
  35. @cancel="showCarrierPicker = false" @close="showCarrierPicker = false"></u-picker>
  36. <u-picker :show="showVerifyPicker" :columns="[verifyOptions]" title="选择验货状态" @confirm="onPickVerify"
  37. @cancel="showVerifyPicker = false" @close="showVerifyPicker = false"></u-picker>
  38. <u-picker :show="showTaskTypePicker" :columns="[taskTypeOptions]" title="选择任务类型" @confirm="onPickTaskType"
  39. @cancel="showTaskTypePicker = false" @close="showTaskTypePicker = false"></u-picker>
  40. <u-picker :show="showAssignPicker" :columns="[assignOptions]" title="指派给" @confirm="onPickAssign"
  41. @cancel="showAssignPicker = false" @close="showAssignPicker = false"></u-picker>
  42. <view class="fixed-bottom">
  43. <u-button type="warning" size="large" @click="onCancel">取消</u-button>
  44. <u-button type="primary" size="large" :loading="submitting" @click="onSubmit">提交</u-button>
  45. </view>
  46. </view>
  47. </template>
  48. <script setup>
  49. import { ref } from 'vue'
  50. import { onLoad } from '@dcloudio/uni-app'
  51. import CyUpload from '@/components/cy-upload/index.vue'
  52. const formRef = ref(null)
  53. const submitting = ref(false)
  54. const form = ref({
  55. waybillCode: '',
  56. carrier: '',
  57. verifyStatus: '',
  58. taskType: '',
  59. taskDetail: '',
  60. images: [],
  61. assignTo: ''
  62. })
  63. const rules = {
  64. waybillCode: [{ required: true, message: '请输入快递单号' }],
  65. carrier: [{ required: true, message: '请选择承运商' }],
  66. verifyStatus: [{ required: true, message: '请选择验货状态' }],
  67. taskType: [{ required: true, message: '请选择任务类型' }],
  68. taskDetail: [{ required: true, message: '请输入任务详情' }],
  69. images: [{ type: 'array', required: true, min: 1, message: '请上传图片' }],
  70. assignTo: [{ required: true, message: '请选择指派对象' }]
  71. }
  72. const carrierOptions = [
  73. { text: '圆通', value: 'YTO' },
  74. { text: '中通', value: 'ZTO' },
  75. { text: '申通', value: 'STO' },
  76. { text: '韵达', value: 'YUNDA' },
  77. { text: '京东', value: 'JD' }
  78. ]
  79. const verifyOptions = [
  80. { text: '已验货', value: 'VERIFIED' },
  81. { text: '未验货', value: 'UNVERIFIED' }
  82. ]
  83. const taskTypeOptions = [
  84. { text: '部分发货', value: 'PART_SHIP' },
  85. { text: '少发', value: 'LESS_SHIP' },
  86. { text: '破损', value: 'BROKEN' },
  87. { text: '其他', value: 'OTHER' }
  88. ]
  89. const assignOptions = [
  90. { text: 'Agoni', value: 'Agoni' },
  91. { text: '张三', value: 'ZhangSan' },
  92. { text: '李四', value: 'LiSi' }
  93. ]
  94. const showCarrierPicker = ref(false)
  95. const showVerifyPicker = ref(false)
  96. const showTaskTypePicker = ref(false)
  97. const showAssignPicker = ref(false)
  98. const carrierText = ref('')
  99. const verifyText = ref('')
  100. const taskTypeText = ref('')
  101. const assignText = ref('')
  102. const onPickCarrier = (e) => {
  103. const cell = e.value?.[0]
  104. form.value.carrier = cell?.value || ''
  105. carrierText.value = cell?.text || ''
  106. showCarrierPicker.value = false
  107. }
  108. const onPickVerify = (e) => {
  109. const cell = e.value?.[0]
  110. form.value.verifyStatus = cell?.value || ''
  111. verifyText.value = cell?.text || ''
  112. showVerifyPicker.value = false
  113. }
  114. const onPickTaskType = (e) => {
  115. const cell = e.value?.[0]
  116. form.value.taskType = cell?.value || ''
  117. taskTypeText.value = cell?.text || ''
  118. showTaskTypePicker.value = false
  119. }
  120. const onPickAssign = (e) => {
  121. const cell = e.value?.[0]
  122. form.value.assignTo = cell?.value || ''
  123. assignText.value = cell?.text || ''
  124. showAssignPicker.value = false
  125. }
  126. const onCancel = () => {
  127. uni.navigateBack()
  128. }
  129. const onSubmit = async () => {
  130. if (submitting.value) return
  131. try {
  132. await formRef.value?.validate?.()
  133. } catch (e) {
  134. return
  135. }
  136. submitting.value = true
  137. const payload = { ...form.value, type: 'mall' }
  138. try {
  139. const res = await uni.$u.http.post('/app/workorder/create', payload)
  140. if (res?.code === 200) {
  141. uni.$u.toast('提交成功')
  142. uni.navigateBack()
  143. } else {
  144. uni.$u.toast(res?.msg || '提交失败')
  145. }
  146. } catch (err) {
  147. uni.$u.toast('网络错误,已本地保存')
  148. } finally {
  149. submitting.value = false
  150. }
  151. }
  152. onLoad((options) => {
  153. form.value.waybillCode = options?.waybillCode || ''
  154. uni.setNavigationBarTitle({ title: '提交工单' })
  155. })
  156. </script>
  157. <style lang="scss" scoped>
  158. .form-page {
  159. padding: 24rpx 24rpx 140rpx;
  160. background: #ffffff;
  161. }
  162. .divider {
  163. height: 16rpx;
  164. background: #f4f5f5;
  165. margin: 8rpx 0 16rpx;
  166. }
  167. </style>