You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

406 lines
8.2 KiB

  1. <template>
  2. <view class="order-modify-page">
  3. <!-- 页面头部 -->
  4. <view class="page-header">
  5. <text class="header-title">修改订单</text>
  6. </view>
  7. <!-- 订单内容区域 -->
  8. <view class="order-modify-content">
  9. <!-- 订单修改说明 -->
  10. <view class="modify-notice">
  11. <view class="notice-item">
  12. <text class="notice-icon">🐾</text>
  13. <text class="notice-text">您可以对<text class="highlight-text">未服务或未支付</text>的订单进行修改或取消</text>
  14. </view>
  15. <view class="notice-item">
  16. <text class="notice-icon">🐾</text>
  17. <text class="notice-text">若需修改已支付的服务项目增加服务时间/服务项目可点击下方按钮<text class="highlight-text">联系客服</text>寻求帮助感谢</text>
  18. </view>
  19. </view>
  20. <!-- 服务修改信息 -->
  21. <view class="modify-info-card">
  22. <view class="card-title">
  23. <text>服务修改信息</text>
  24. </view>
  25. <view class="info-content">
  26. <view class="info-item">
  27. <text class="info-label">联系人</text>
  28. <text class="info-value">{{modifyInfo.contactName}}</text>
  29. </view>
  30. <view class="info-item">
  31. <text class="info-label">联系方式</text>
  32. <text class="info-value">{{modifyInfo.contactPhone}}</text>
  33. </view>
  34. <view class="info-item payment-method">
  35. <text class="info-label">销售支持方式</text>
  36. <view class="info-value payment-value">
  37. <text>{{modifyInfo.paymentMethod}}</text>
  38. <text class="arrow-right">></text>
  39. </view>
  40. </view>
  41. </view>
  42. </view>
  43. <!-- 修改原因 -->
  44. <view class="modify-reason-card">
  45. <view class="card-title">
  46. <text>修改原因</text>
  47. </view>
  48. <view class="reason-content">
  49. <textarea
  50. class="reason-input"
  51. v-model="modifyReason"
  52. placeholder="请输入修改原因(选填)"
  53. maxlength="200"
  54. ></textarea>
  55. <view class="word-count">
  56. <text>{{modifyReason.length}}/200</text>
  57. </view>
  58. </view>
  59. </view>
  60. </view>
  61. <!-- 底部按钮区域 -->
  62. <view class="order-modify-footer">
  63. <view class="footer-btn cancel-service-btn" @click="$refs.cancelPopup.open()">
  64. <text>取消服务</text>
  65. </view>
  66. <view class="footer-btn confirm-modify-btn" @click="confirmModify">
  67. <text>确认修改</text>
  68. </view>
  69. </view>
  70. <!-- 取消订单弹窗 -->
  71. <cancel-order-popup
  72. ref="cancelPopup"
  73. @cancel="handleCancelOrder"
  74. ></cancel-order-popup>
  75. <!-- 客服组件 -->
  76. <Kefu></Kefu>
  77. </view>
  78. </template>
  79. <script>
  80. import CancelOrderPopup from '../../components/order/CancelOrderPopup.vue';
  81. export default {
  82. components: {
  83. CancelOrderPopup
  84. },
  85. data() {
  86. return {
  87. orderId: '', // 订单ID
  88. modifyInfo: {
  89. contactName: '张小二',
  90. contactPhone: '18888888888',
  91. paymentMethod: '存子快递宝'
  92. },
  93. modifyReason: '', // 修改原因
  94. showCancelOrderPopup: false // 是否显示取消订单弹窗
  95. };
  96. },
  97. onLoad(options) {
  98. // 获取路由参数中的订单ID
  99. if (options.id) {
  100. this.orderId = options.id;
  101. // 加载订单数据
  102. this.loadOrderData();
  103. }
  104. },
  105. methods: {
  106. // 加载订单数据
  107. loadOrderData() {
  108. // 这里应该调用API获取订单详情
  109. // 示例代码:
  110. /*
  111. const params = {
  112. openId: getOpenIdKey(),
  113. orderId: this.orderId
  114. };
  115. getOrderDetail(params).then(res => {
  116. if (res && res.code === 200) {
  117. // 设置订单信息
  118. this.modifyInfo = {
  119. contactName: res.data.contactName,
  120. contactPhone: res.data.contactPhone,
  121. paymentMethod: res.data.paymentMethod
  122. };
  123. }
  124. }).catch(err => {
  125. console.error('获取订单详情失败', err);
  126. uni.showToast({
  127. title: '获取订单信息失败',
  128. icon: 'none'
  129. });
  130. });
  131. */
  132. // 这里使用模拟数据
  133. console.log('加载订单数据,ID:', this.orderId);
  134. },
  135. // 确认修改订单
  136. confirmModify() {
  137. // 这里应该调用API修改订单
  138. // 示例代码:
  139. /*
  140. const params = {
  141. openId: getOpenIdKey(),
  142. orderId: this.orderId,
  143. reason: this.modifyReason
  144. };
  145. modifyOrder(params).then(res => {
  146. if (res && res.code === 200) {
  147. uni.showToast({
  148. title: '订单修改成功',
  149. icon: 'success'
  150. });
  151. // 修改成功后返回订单详情页
  152. setTimeout(() => {
  153. uni.navigateBack();
  154. }, 1500);
  155. }
  156. }).catch(err => {
  157. console.error('修改订单失败', err);
  158. uni.showToast({
  159. title: '修改订单失败',
  160. icon: 'none'
  161. });
  162. });
  163. */
  164. // 这里使用模拟数据,显示修改成功提示
  165. uni.showToast({
  166. title: '订单修改成功',
  167. icon: 'success'
  168. });
  169. // 1.5秒后返回订单详情页
  170. setTimeout(() => {
  171. uni.navigateBack();
  172. }, 1500);
  173. },
  174. // 处理取消订单
  175. handleCancelOrder(orderId) {
  176. this.hideCancelPopup();
  177. // 这里应该调用API取消订单
  178. // 示例代码:
  179. /*
  180. const params = {
  181. openId: getOpenIdKey(),
  182. orderId: this.orderId,
  183. reason: this.modifyReason
  184. };
  185. cancelOrder(params).then(res => {
  186. if (res && res.code === 200) {
  187. uni.showToast({
  188. title: '订单已取消',
  189. icon: 'success'
  190. });
  191. // 取消成功后返回订单列表页
  192. setTimeout(() => {
  193. uni.navigateBack({delta: 2});
  194. }, 1500);
  195. }
  196. }).catch(err => {
  197. console.error('取消订单失败', err);
  198. });
  199. */
  200. // 这里使用模拟数据,显示取消成功提示
  201. uni.showToast({
  202. title: '订单已取消',
  203. icon: 'success'
  204. });
  205. // 1.5秒后返回订单列表页
  206. setTimeout(() => {
  207. uni.navigateBack({delta: 2});
  208. }, 1500);
  209. }
  210. }
  211. };
  212. </script>
  213. <style lang="scss" scoped>
  214. .order-modify-page {
  215. background-color: #f5f5f5;
  216. min-height: 100vh;
  217. display: flex;
  218. flex-direction: column;
  219. }
  220. .page-header {
  221. background-color: #FFAA48;
  222. padding: 20rpx 30rpx;
  223. color: #FFFFFF;
  224. .header-title {
  225. font-size: 36rpx;
  226. font-weight: bold;
  227. }
  228. }
  229. .order-modify-content {
  230. flex: 1;
  231. padding: 20rpx;
  232. }
  233. .modify-notice {
  234. background-color: #FFF9F0;
  235. border-radius: 20rpx;
  236. padding: 20rpx;
  237. margin-bottom: 20rpx;
  238. .notice-item {
  239. display: flex;
  240. align-items: flex-start;
  241. margin-bottom: 10rpx;
  242. &:last-child {
  243. margin-bottom: 0;
  244. }
  245. .notice-icon {
  246. margin-right: 10rpx;
  247. font-size: 28rpx;
  248. }
  249. .notice-text {
  250. font-size: 26rpx;
  251. color: #666;
  252. line-height: 1.5;
  253. flex: 1;
  254. .highlight-text {
  255. color: #FFAA48;
  256. }
  257. }
  258. }
  259. }
  260. .modify-info-card, .modify-reason-card {
  261. background-color: #FFFFFF;
  262. border-radius: 20rpx;
  263. padding: 30rpx;
  264. margin-bottom: 20rpx;
  265. box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
  266. }
  267. .card-title {
  268. font-size: 32rpx;
  269. font-weight: bold;
  270. color: #333;
  271. margin-bottom: 20rpx;
  272. display: flex;
  273. align-items: center;
  274. &::before {
  275. content: '';
  276. display: inline-block;
  277. width: 8rpx;
  278. height: 32rpx;
  279. background-color: #FFAA48;
  280. margin-right: 16rpx;
  281. border-radius: 4rpx;
  282. }
  283. }
  284. .info-content {
  285. .info-item {
  286. display: flex;
  287. justify-content: space-between;
  288. align-items: center;
  289. padding: 20rpx 0;
  290. border-bottom: 1px solid #EEEEEE;
  291. &:last-child {
  292. border-bottom: none;
  293. }
  294. .info-label {
  295. font-size: 28rpx;
  296. color: #666;
  297. }
  298. .info-value {
  299. font-size: 28rpx;
  300. color: #333;
  301. }
  302. &.payment-method {
  303. .payment-value {
  304. display: flex;
  305. align-items: center;
  306. .arrow-right {
  307. margin-left: 10rpx;
  308. color: #999;
  309. }
  310. }
  311. }
  312. }
  313. }
  314. .reason-content {
  315. .reason-input {
  316. width: 100%;
  317. height: 200rpx;
  318. background-color: #F8F8F8;
  319. border-radius: 10rpx;
  320. padding: 20rpx;
  321. font-size: 28rpx;
  322. color: #333;
  323. box-sizing: border-box;
  324. }
  325. .word-count {
  326. text-align: right;
  327. margin-top: 10rpx;
  328. text {
  329. font-size: 24rpx;
  330. color: #999;
  331. }
  332. }
  333. }
  334. .order-modify-footer {
  335. display: flex;
  336. justify-content: space-between;
  337. align-items: center;
  338. padding: 20rpx 30rpx;
  339. background-color: #FFFFFF;
  340. border-top: 1px solid #EEEEEE;
  341. .footer-btn {
  342. padding: 16rpx 30rpx;
  343. border-radius: 30rpx;
  344. font-size: 28rpx;
  345. text-align: center;
  346. width: 45%;
  347. }
  348. .cancel-service-btn {
  349. background-color: #F5F5F5;
  350. color: #666;
  351. border: 1px solid #DDDDDD;
  352. }
  353. .confirm-modify-btn {
  354. background-color: #FFAA48;
  355. color: #FFFFFF;
  356. }
  357. }
  358. </style>