created.vue 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  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. <template v-if="isReadonly && form.waybillCode">
  7. <text class="readonly-text">{{ form.waybillCode }}</text>
  8. </template>
  9. <u-input v-else v-model="form.waybillCode" placeholder="请输入快递单号" clearable></u-input>
  10. </u-form-item>
  11. <u-form-item label="订单编号:" prop="orderId" required>
  12. <template v-if="isReadonly && form.orderId">
  13. <text class="clickable-text" @click="goToOrderDetail">{{ form.orderId }}</text>
  14. </template>
  15. <u-input v-else v-model="form.orderId" placeholder="请输入订单编号" clearable></u-input>
  16. </u-form-item>
  17. <u-form-item label="任务类型:" prop="taskType" required @click="showTaskTypePicker = true">
  18. <view class="picker-field" @tap="showTaskTypePicker = true">
  19. <u-input v-model="taskTypeText" readonly suffixIcon="arrow-down" placeholder="请选择"
  20. :disabled="false"></u-input>
  21. </view>
  22. </u-form-item>
  23. <u-form-item label="任务详情:" prop="taskDetail" required>
  24. <u-textarea v-model="form.taskDetail" placeholder="请输入" :height="120"
  25. :autoHeight="true"></u-textarea>
  26. </u-form-item>
  27. <u-form-item label="上传图片:" prop="imgInfo" required>
  28. <cy-upload :filename="form.imgInfo" @update:filename="form.imgInfo = $event" :multiple="true" :maxCount="9" />
  29. </u-form-item>
  30. </u-form>
  31. </view>
  32. <u-picker :show="showTaskTypePicker" :columns="[taskTypeOptions]" title="选择任务类型" @confirm="onPickTaskType"
  33. @cancel="showTaskTypePicker = false" @close="showTaskTypePicker = false"></u-picker>
  34. <view class="fixed-bottom">
  35. <u-button type="warning" size="large" @click="onCancel">取消</u-button>
  36. <u-button type="primary" size="large" :loading="submitting" @click="onSubmit">提交</u-button>
  37. </view>
  38. </view>
  39. </template>
  40. <script setup>
  41. import { ref } from 'vue'
  42. import { onLoad } from '@dcloudio/uni-app'
  43. import CyUpload from '@/components/cy-upload/index.vue'
  44. const formRef = ref(null)
  45. const submitting = ref(false)
  46. const form = ref({
  47. waybillCode: '',
  48. orderId: '',
  49. taskType: '',
  50. taskDetail: '',
  51. imgInfo: []
  52. })
  53. const rules = {
  54. waybillCode: [{ required: true, message: '请输入快递单号' }],
  55. orderId: [{ required: true, message: '请输入订单编号' }],
  56. taskType: [{ required: true, message: '请选择任务类型' }],
  57. taskDetail: [{ required: true, message: '请输入任务详情' }],
  58. }
  59. const taskTypeOptions = ref([])
  60. const showTaskTypePicker = ref(false)
  61. const taskTypeText = ref('')
  62. // 获取任务类型字典
  63. const getTaskTypeOptions = async () => {
  64. try {
  65. const res = await uni.$u.http.get('/system/dict/data/type/task_type')
  66. if (res.code === 200 && res.data) {
  67. taskTypeOptions.value = res.data.map(item => ({
  68. text: item.dictLabel,
  69. value: parseInt(item.dictValue)
  70. }))
  71. }
  72. } catch (e) {
  73. console.error('获取任务类型失败', e)
  74. }
  75. }
  76. const onPickTaskType = (e) => {
  77. console.log(e)
  78. const cell = e.value?.[0]
  79. form.value.taskType = cell?.value || ''
  80. taskTypeText.value = cell?.text || ''
  81. showTaskTypePicker.value = false
  82. }
  83. const onCancel = () => {
  84. uni.navigateBack()
  85. }
  86. const goToOrderDetail = () => {
  87. if (!form.value.orderId) return
  88. uni.navigateTo({
  89. url: `/pages/index/detail/index?id=${form.value.orderId}`
  90. })
  91. }
  92. const workOrderId = ref('')
  93. const isEdit = ref(false)
  94. const isReadonly = ref(false)
  95. const expressTypeFromScan = ref(0)
  96. const onLoadDetail = async (id) => {
  97. try {
  98. const res = await uni.$u.http.get('/app/workOrder/getWorkOrderDetail', {
  99. params: { workOrderId: id }
  100. })
  101. if (res.code === 200 && res.data) {
  102. const data = res.data
  103. form.value.waybillCode = data.waybillCode || ''
  104. form.value.orderId = data.orderId || ''
  105. form.value.taskDetail = data.deatil || data.taskDetail || ''
  106. form.value.imgInfo = data.imgInfo?.imgUrlList?.length ? data.imgInfo.imgUrlList : []
  107. // 加载任务类型字典
  108. await getTaskTypeOptions()
  109. // 回显任务类型
  110. if (data.taskType) {
  111. form.value.taskType = data.taskType
  112. const matchedType = taskTypeOptions.value.find(item => item.value === data.taskType)
  113. if (matchedType) {
  114. taskTypeText.value = matchedType.text
  115. }
  116. }
  117. }
  118. } catch (e) {
  119. console.error(e)
  120. }
  121. }
  122. const onSubmit = async () => {
  123. if (submitting.value) return
  124. try {
  125. await formRef.value?.validate?.()
  126. } catch (e) {
  127. return
  128. }
  129. submitting.value = true
  130. const payload = {
  131. taskType: form.value.taskType,
  132. inspectionStatus: 0, // 默认未验货
  133. deatil: form.value.taskDetail,
  134. waybillCode: form.value.waybillCode,
  135. orderId: form.value.orderId,
  136. type: 2, // 工单类型:2-收书
  137. imgInfo: form.value.imgInfo,
  138. handleUsers: []
  139. }
  140. if (isEdit.value) {
  141. payload.id = workOrderId.value
  142. payload.updateType = 2
  143. }
  144. const apiUrl = isEdit.value ? '/app/workOrder/update' : '/app/workOrder/createWorkOrder'
  145. try {
  146. const res = await uni.$u.http.post(apiUrl, payload)
  147. if (res?.code === 200) {
  148. uni.$u.ttsModule?.speak?.('提交成功')
  149. uni.$u.toast('提交成功')
  150. if (isEdit.value) {
  151. uni.navigateBack()
  152. } else {
  153. uni.redirectTo({ url: '/pages/index/work-order/recycle' })
  154. }
  155. } else {
  156. uni.$u.toast(res?.msg || '提交失败')
  157. }
  158. } catch (err) {
  159. uni.$u.toast(err?.data?.msg || err?.msg || '网络错误')
  160. } finally {
  161. submitting.value = false
  162. }
  163. }
  164. onLoad((options) => {
  165. form.value.waybillCode = options?.waybillCode ? decodeURIComponent(options.waybillCode) : ''
  166. form.value.orderId = options?.orderId ? decodeURIComponent(options.orderId) : ''
  167. if (options?.expressType) {
  168. expressTypeFromScan.value = parseInt(options.expressType)
  169. }
  170. if (options?.readonly == 1) {
  171. isReadonly.value = true
  172. }
  173. if (options?.mode === 'edit' && options?.workOrderId) {
  174. isEdit.value = true
  175. isReadonly.value = true
  176. workOrderId.value = options.workOrderId
  177. uni.setNavigationBarTitle({ title: '编辑工单' })
  178. onLoadDetail(options.workOrderId)
  179. } else {
  180. uni.setNavigationBarTitle({ title: '提交工单' })
  181. }
  182. // 加载任务类型字典
  183. getTaskTypeOptions()
  184. })
  185. </script>
  186. <style lang="scss" scoped>
  187. .form-page {
  188. padding: 24rpx 24rpx 140rpx;
  189. background: #ffffff;
  190. }
  191. .divider {
  192. height: 16rpx;
  193. background: #f4f5f5;
  194. margin: 20rpx 0;
  195. }
  196. .readonly-text {
  197. font-size: 28rpx;
  198. color: #333;
  199. line-height: 60rpx;
  200. }
  201. .clickable-text {
  202. font-size: 28rpx;
  203. color: #2979ff;
  204. line-height: 60rpx;
  205. }
  206. .picker-field {
  207. width: 100%;
  208. }
  209. </style>