detail.vue 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. <template>
  2. <view class="common-page" style="padding: 0;padding-bottom: 130rpx;">
  3. <InfoCard :detail="detail" type="mall" />
  4. <TrackRecord v-if="records.length > 0" :records="records" class="mt-20" />
  5. <view class="fixed-bottom" v-if="showButtons">
  6. <u-button v-if="canEdit" type="warning" size="large" @click="onEdit">编辑</u-button>
  7. <u-button v-if="canVoid" type="error" size="large" @click="onVoid">作废</u-button>
  8. <u-button v-if="canFinish" type="primary" size="large" @click="onFinish">完成</u-button>
  9. <u-button v-if="canReopen" type="primary" size="large" @click="onReopen">重开</u-button>
  10. </view>
  11. </view>
  12. </template>
  13. <script setup>
  14. import { ref, computed } from 'vue'
  15. import { onLoad } from '@dcloudio/uni-app'
  16. import InfoCard from '@/pages/order/components/info-card.vue'
  17. import TrackRecord from '@/pages/order/components/track-record.vue'
  18. const detail = ref({})
  19. const records = ref([])
  20. const workOrderId = ref('')
  21. // 获取当前用户信息
  22. const currentUserId = ref(uni.getStorageSync('userInfo')?.userId || '')
  23. // 计算按钮显示逻辑
  24. const canEdit = computed(() => {
  25. const status = detail.value.status
  26. const isCreator = currentUserId.value === detail.value.createUserId
  27. const isAssignee = detail.value.handleUsers?.some(user => user.userId === currentUserId.value)
  28. if (isCreator) {
  29. return status === 1 || status === 2 || status === 3 // 待处理、处理中、仓库处理
  30. } else if (isAssignee) {
  31. return status === 1 || status === 2 || status === 3 // 待处理、处理中、仓库处理
  32. }
  33. return false
  34. })
  35. const canVoid = computed(() => {
  36. const status = detail.value.status
  37. const isCreator = currentUserId.value === detail.value.createUserId
  38. return isCreator && (status === 1 || status === 2 || status === 3) // 待处理、处理中、仓库处理
  39. })
  40. const canFinish = computed(() => {
  41. const status = detail.value.status
  42. const isCreator = currentUserId.value === detail.value.createUserId
  43. const isAssignee = detail.value.handleUsers?.some(user => user.userId === currentUserId.value)
  44. return (isCreator || isAssignee) && (status === 1 || status === 2 || status === 3) // 待处理、处理中、仓库处理
  45. })
  46. const canReopen = computed(() => {
  47. const status = detail.value.status
  48. const isCreator = currentUserId.value === detail.value.createUserId
  49. return isCreator && (status === 4 || status === 5) // 已完成、已作废
  50. })
  51. const showButtons = computed(() => {
  52. return canEdit.value || canVoid.value || canFinish.value || canReopen.value
  53. })
  54. const getDetail = async (id) => {
  55. try {
  56. const res = await uni.$u.http.get(`/app/workOrder/getWorkOrderDetail`, {
  57. params: { workOrderId: id }
  58. })
  59. if (res?.code === 200 && res?.data) {
  60. const data = res.data;
  61. detail.value = {
  62. ...data,
  63. waybillCode: data.waybillCode || '',
  64. taskTypeName: data.taskTypeName || '',
  65. verifyStatusName: data.inspectionStatusName || '', // 验货状态
  66. taskDetail: data.deatil || data.taskDetail || '',
  67. createUser: data.createUserName || '',
  68. createUserId: data.createUserId || '',
  69. createTime: data.createTime || '',
  70. imageUrl: (data.imgInfo && data.imgInfo.imgUrlList && data.imgInfo.imgUrlList[0]) || data.imageUrl || '/static/img/book.png',
  71. imageUrls: (data.imgInfo && data.imgInfo.imgUrlList) || [],
  72. status: data.status,
  73. handleUsers: data.handleUsers || []
  74. }
  75. records.value = data.changeRecords || []
  76. return
  77. }
  78. } catch (e) {
  79. console.error(e)
  80. }
  81. }
  82. const onEdit = () => {
  83. uni.navigateTo({
  84. url: `/pages/order/mall/created?workOrderId=${workOrderId.value}&mode=edit&waybillCode=${detail.value.waybillCode}&readonly=1`
  85. })
  86. }
  87. const onVoid = () => {
  88. uni.showModal({
  89. title: '提示',
  90. content: '确定要作废该工单吗?',
  91. success: async (res) => {
  92. if (res.confirm) {
  93. try {
  94. const result = await uni.$u.http.post('/app/workOrder/cancel', { id: workOrderId.value })
  95. if (result.code === 200) {
  96. uni.$u.toast('已作废')
  97. setTimeout(() => {
  98. uni.navigateBack()
  99. }, 1000)
  100. } else {
  101. uni.$u.toast(result.msg || '操作失败')
  102. }
  103. } catch (e) {
  104. console.error(e)
  105. }
  106. }
  107. }
  108. })
  109. }
  110. const onFinish = () => {
  111. uni.showModal({
  112. title: '提示',
  113. content: '确定要完成该工单吗?',
  114. success: async (res) => {
  115. if (res.confirm) {
  116. try {
  117. const result = await uni.$u.http.post('/app/workOrder/finish', { ids: [workOrderId.value] })
  118. if (result.code === 200) {
  119. uni.$u.toast('已完成')
  120. setTimeout(() => {
  121. uni.navigateBack()
  122. }, 1000)
  123. } else {
  124. uni.$u.toast(result.msg || '操作失败')
  125. }
  126. } catch (e) {
  127. console.error(e)
  128. }
  129. }
  130. }
  131. })
  132. }
  133. const onReopen = () => {
  134. uni.showModal({
  135. title: '提示',
  136. content: '确定要重开该工单吗?',
  137. success: async (res) => {
  138. if (res.confirm) {
  139. try {
  140. // 这里需要调用重开工单的接口
  141. // 假设接口是 /app/workOrder/reopen
  142. const result = await uni.$u.http.post('/app/workOrder/reopen', { id: workOrderId.value })
  143. if (result.code === 200) {
  144. uni.$u.toast('已重开')
  145. setTimeout(() => {
  146. uni.navigateBack()
  147. }, 1000)
  148. } else {
  149. uni.$u.toast(result.msg || '操作失败')
  150. }
  151. } catch (e) {
  152. console.error(e)
  153. }
  154. }
  155. }
  156. })
  157. }
  158. onLoad((options) => {
  159. workOrderId.value = options.id
  160. getDetail(options.id)
  161. })
  162. </script>
  163. <style lang="scss" scoped>
  164. .mt-20 {
  165. margin-top: 20rpx;
  166. }
  167. </style>