detail.vue 7.7 KB

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