OrderDetailView.vue 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. <template>
  2. <view class="order-detail-view">
  3. <!-- 页面切换 -->
  4. <view
  5. class="page-item"
  6. v-show="activeIndex === 0"
  7. >
  8. <PageOne
  9. :order-detail="orderDetail"
  10. :order-id="orderId"
  11. :current-receipt="currentReceipt"
  12. @next="handleNext"
  13. />
  14. </view>
  15. <view
  16. class="page-item"
  17. v-show="activeIndex === 1"
  18. >
  19. <PageTwo
  20. :order-detail="orderDetail"
  21. :order-id="orderId"
  22. :current-receipt="currentReceipt"
  23. :follow-up-list="followUpList"
  24. @next="handleNext"
  25. @update-file-ids="handleUpdateFileIds"
  26. />
  27. </view>
  28. <view
  29. class="page-item"
  30. v-show="activeIndex === 2"
  31. >
  32. <PageThree
  33. :order-detail="orderDetail"
  34. :order-id="orderId"
  35. :current-receipt="currentReceipt"
  36. @next="handleNext"
  37. @save="handleNeedSave"
  38. @confirm-pay="handleConfirmPay"
  39. @update-file-ids="handleUpdateFileIds"
  40. ref="pageThreeRef"
  41. />
  42. </view>
  43. <view
  44. class="page-item"
  45. v-show="activeIndex === 3"
  46. >
  47. <PageFour
  48. :order-detail="orderDetail"
  49. :current-receipt="currentReceipt"
  50. @next="handleNext"
  51. @confirm-warehouse="handleConfirmWarehouse"
  52. />
  53. </view>
  54. <!-- 页面导航 -->
  55. <ul class="page-navigation">
  56. <li
  57. v-for="(tab, index) in tabs"
  58. :key="index"
  59. :class="{ 'active': activeIndex === index }"
  60. @click="handleTabClick(index)"
  61. >
  62. {{ tab }}
  63. </li>
  64. </ul>
  65. </view>
  66. </template>
  67. <script>
  68. import PageOne from './PageOne.vue'
  69. import PageTwo from './PageTwo.vue'
  70. import PageThree from './PageThree.vue'
  71. import PageFour from './PageFour.vue'
  72. export default {
  73. name: 'OrderDetailView',
  74. components: {
  75. PageOne,
  76. PageTwo,
  77. PageThree,
  78. PageFour
  79. },
  80. props: {
  81. orderDetail: {
  82. type: Object,
  83. default: () => ({})
  84. },
  85. topInfo: {
  86. type: Object,
  87. default: () => ({})
  88. },
  89. orderId: {
  90. type: String,
  91. default: ''
  92. },
  93. currentReceipt: {
  94. type: Object,
  95. default: () => ({})
  96. }
  97. },
  98. data() {
  99. return {
  100. activeIndex: 0,
  101. tabs: ['一', '二', '三', '四'],
  102. // 表单数据
  103. formData: {
  104. formOne: {},
  105. formTwo: {},
  106. formThree: {},
  107. formFour: {}
  108. },
  109. pageThreeForm: {},
  110. fileIds: '',
  111. // 跟进记录
  112. followUpList: []
  113. }
  114. },
  115. watch: {
  116. orderDetail: {
  117. handler(newVal) {
  118. if (newVal && newVal.clueId) {
  119. this.loadFollowUpList()
  120. }
  121. },
  122. deep: true,
  123. immediate: true
  124. }
  125. },
  126. methods: {
  127. /**
  128. * 加载跟进记录
  129. */
  130. async loadFollowUpList() {
  131. try {
  132. const res = await uni.$u.api.getDuplicateOrderFollowListByClueId({
  133. clueId: this.orderDetail.clueId
  134. })
  135. const data = res.data || {}
  136. const followUpList = []
  137. for (const key in data) {
  138. followUpList.push(...(data[key] || []))
  139. }
  140. this.followUpList = followUpList
  141. } catch (error) {
  142. console.error('获取跟进记录失败:', error)
  143. uni.$u.toast('获取跟进记录失败')
  144. }
  145. },
  146. /**
  147. * 处理下一步
  148. */
  149. handleNext({ nowPage, form }) {
  150. this.activeIndex++
  151. if (nowPage) {
  152. this.formData[nowPage] = form
  153. }
  154. // 当切换到第三页时,更新第三页的图片列表
  155. if (nowPage === 'formTwo' && this.$refs.pageThreeRef) {
  156. this.$refs.pageThreeRef.refreshImageList()
  157. }
  158. },
  159. /**
  160. * 处理保存
  161. */
  162. handleNeedSave({ nowPage, form, fileIds }) {
  163. this.pageThreeForm = form
  164. this.fileIds = fileIds
  165. },
  166. /**
  167. * 处理确认支付
  168. */
  169. async handleConfirmPay() {
  170. try {
  171. const response = await uni.$u.api.saveOrderFileAndTransfer({
  172. id: this.orderId,
  173. clueId: this.orderDetail.clueId
  174. })
  175. uni.$u.toast(response.msg || '支付成功')
  176. } catch (error) {
  177. console.error('支付失败:', error)
  178. uni.$u.toast(`支付失败:${error}`)
  179. }
  180. },
  181. /**
  182. * 处理确认入库
  183. */
  184. async handleConfirmWarehouse({ warehouseInfo }) {
  185. try {
  186. const params = {
  187. searchValue: this.orderDetail.searchValue,
  188. createBy: this.orderDetail.createBy,
  189. createTime: this.orderDetail.createTime,
  190. updateBy: this.orderDetail.updateBy,
  191. updateTime: this.orderDetail.updateTime,
  192. params: this.orderDetail.params,
  193. id: this.currentReceipt.id,
  194. sendFormId: this.orderId,
  195. clueId: this.orderDetail.clueId,
  196. item: warehouseInfo.item || '',
  197. code: warehouseInfo.codeStorage || '',
  198. phone: this.orderDetail.phone,
  199. tableFee: warehouseInfo.watchPrice || '',
  200. benefitFee: warehouseInfo.benefitFee || '',
  201. freight: warehouseInfo.freight || '',
  202. checkCodeFee: warehouseInfo.checkCodeFee || '',
  203. receiptRemark: `${warehouseInfo.remarks || ''};${warehouseInfo.uploadedImage || ''}`,
  204. repairAmount: warehouseInfo.repairAmount || '',
  205. grossPerformance: warehouseInfo.grossPerformance || '',
  206. expressOrderNo: warehouseInfo.expressOrderNo || '',
  207. fileIds: this.fileIds,
  208. customerServiceName: warehouseInfo.customerServiceName || '1',
  209. deptId: this.orderDetail.deptId,
  210. category: warehouseInfo.category || this.orderDetail.category,
  211. delFlag: this.orderDetail.delFlag,
  212. idCard: this.pageThreeForm.idNumber || '',
  213. paymentMethod: '小葫芦线上支付',
  214. bankCardNumber: this.pageThreeForm.bankAccount || '',
  215. bankName: this.pageThreeForm.bankName || '',
  216. customName: this.pageThreeForm.customName || ''
  217. }
  218. if (this.currentReceipt.id) {
  219. await uni.$u.api.updateReceiptForm(params)
  220. } else {
  221. await uni.$u.api.addReceiptForm(params)
  222. }
  223. uni.$u.toast('入库成功')
  224. } catch (error) {
  225. console.error('入库失败:', error)
  226. uni.$u.toast('入库失败')
  227. }
  228. },
  229. /**
  230. * 处理标签点击
  231. */
  232. handleTabClick(index) {
  233. this.activeIndex = index
  234. // 切换到第三页时刷新图片列表
  235. if (index === 2 && this.$refs.pageThreeRef) {
  236. this.$refs.pageThreeRef.refreshImageList()
  237. }
  238. },
  239. /**
  240. * 更新 fileIds
  241. */
  242. handleUpdateFileIds(fileIds) {
  243. if (this.currentReceipt) {
  244. this.$set(this.currentReceipt, 'fileIds', fileIds)
  245. this.fileIds = fileIds
  246. }
  247. }
  248. }
  249. }
  250. </script>
  251. <style scoped lang="scss">
  252. .order-detail-view {
  253. padding: 20rpx;
  254. min-height: calc(100vh - 200rpx);
  255. }
  256. .page-item {
  257. width: 100%;
  258. }
  259. .page-navigation {
  260. position: fixed;
  261. right: 20rpx;
  262. top: 40%;
  263. display: flex;
  264. flex-direction: column;
  265. align-items: center;
  266. justify-content: center;
  267. list-style: none;
  268. color: #000;
  269. font-size: 20rpx;
  270. font-weight: 800;
  271. z-index: 100;
  272. li {
  273. opacity: 0.7;
  274. display: flex;
  275. align-items: center;
  276. justify-content: center;
  277. background-color: #fff;
  278. border-radius: 50%;
  279. width: 70rpx;
  280. height: 70rpx;
  281. line-height: 70rpx;
  282. text-align: center;
  283. margin-bottom: 20rpx;
  284. transition: all 0.3s ease-in-out;
  285. font-weight: 800;
  286. box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
  287. cursor: pointer;
  288. &.active {
  289. color: #fff;
  290. opacity: 1;
  291. background-color: rgb(37 99 235 / 1);
  292. }
  293. &:hover {
  294. opacity: 0.9;
  295. transform: scale(1.05);
  296. }
  297. }
  298. }
  299. </style>