created.vue 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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" label-width="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="orderId" required>
  9. <u-input v-model="form.orderId" placeholder="请输入订单编号" clearable></u-input>
  10. </u-form-item>
  11. <u-form-item label="任务类型:" prop="taskType" required>
  12. <u-input :value="taskTypeText" readonly suffixIcon="arrow-down" placeholder="请选择"
  13. @click="showTaskTypePicker = true"></u-input>
  14. </u-form-item>
  15. <u-form-item label="任务详情:" prop="taskDetail" required>
  16. <u-textarea v-model="form.taskDetail" placeholder="请输入" :height="120"
  17. :autoHeight="true"></u-textarea>
  18. </u-form-item>
  19. <u-form-item label="上传图片:" prop="images" required>
  20. <cy-upload :filename="form.images" @update:filename="form.images = $event" />
  21. </u-form-item>
  22. </u-form>
  23. </view>
  24. <u-picker :show="showTaskTypePicker" :columns="[taskTypeOptions]" title="选择任务类型" @confirm="onPickTaskType"
  25. @cancel="showTaskTypePicker = false" @close="showTaskTypePicker = false"></u-picker>
  26. <view class="fixed-bottom">
  27. <u-button type="warning" size="large" @click="onCancel">取消</u-button>
  28. <u-button type="primary" size="large" :loading="submitting" @click="onSubmit">提交</u-button>
  29. </view>
  30. </view>
  31. </template>
  32. <script setup>
  33. import { ref } from 'vue'
  34. import { onLoad } from '@dcloudio/uni-app'
  35. import CyUpload from '@/components/cy-upload/index.vue'
  36. const formRef = ref(null)
  37. const submitting = ref(false)
  38. const form = ref({
  39. waybillCode: '',
  40. orderId: '',
  41. taskType: '',
  42. taskDetail: '',
  43. images: []
  44. })
  45. const rules = {
  46. waybillCode: [{ required: true, message: '请输入快递单号' }],
  47. orderId: [{ required: true, message: '请输入订单编号' }],
  48. taskType: [{ required: true, message: '请选择任务类型' }],
  49. taskDetail: [{ required: true, message: '请输入任务详情' }],
  50. images: [{ type: 'array', required: true, min: 1, message: '请上传图片' }]
  51. }
  52. const taskTypeOptions = [
  53. { text: '书单不符', value: 'MISMATCH' },
  54. { text: '破损', value: 'BROKEN' },
  55. { text: '缺件', value: 'LACK' },
  56. { text: '其他', value: 'OTHER' }
  57. ]
  58. const showTaskTypePicker = ref(false)
  59. const taskTypeText = ref('')
  60. const onPickTaskType = (e) => {
  61. const cell = e.value?.[0]
  62. form.value.taskType = cell?.value || ''
  63. taskTypeText.value = cell?.text || ''
  64. showTaskTypePicker.value = false
  65. }
  66. const onCancel = () => {
  67. uni.navigateBack()
  68. }
  69. const onSubmit = async () => {
  70. if (submitting.value) return
  71. try {
  72. await formRef.value?.validate?.()
  73. } catch (e) {
  74. return
  75. }
  76. submitting.value = true
  77. const payload = { ...form.value, type: 'recycle' }
  78. try {
  79. const res = await uni.$u.http.post('/app/workorder/create', payload)
  80. if (res?.code === 200) {
  81. uni.$u.toast('提交成功')
  82. uni.navigateBack()
  83. } else {
  84. uni.$u.toast(res?.msg || '提交失败')
  85. }
  86. } catch (err) {
  87. uni.$u.toast('网络错误,已本地保存')
  88. } finally {
  89. submitting.value = false
  90. }
  91. }
  92. onLoad((options) => {
  93. form.value.waybillCode = options?.waybillCode || ''
  94. form.value.orderId = options?.orderId || ''
  95. uni.setNavigationBarTitle({ title: '提交工单' })
  96. })
  97. </script>
  98. <style lang="scss" scoped>
  99. .form-page {
  100. padding: 24rpx 24rpx 140rpx;
  101. background: #ffffff;
  102. }
  103. .divider {
  104. height: 16rpx;
  105. background: #f4f5f5;
  106. margin: 20rpx 0;
  107. }
  108. </style>