cancelModel.vue 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. <template>
  2. <Popup title="你想取消付款嘛" isClose ref="popRef">
  3. <template #content>
  4. <view class="content">
  5. <view class="tips">
  6. <trans _t="订单取消后无法恢复,请选择取消付款的原因" />
  7. </view>
  8. <up-textarea
  9. v-model="form.cancelReason"
  10. :placeholder="t('请输入取消原因')"
  11. count
  12. maxlength="200"
  13. class="u-textarea"
  14. ></up-textarea>
  15. <!-- 快捷词条 -->
  16. <view class="quick-phrases">
  17. <view
  18. v-for="(phrase, index) in phrases"
  19. :key="index"
  20. class="phrase-tag"
  21. @click="insertPhrase(phrase)"
  22. >
  23. {{ t(phrase) }}
  24. </view>
  25. </view>
  26. </view>
  27. </template>
  28. <!-- footer -->
  29. <template #footer>
  30. <view class="footer">
  31. <view class="submit_btn submit_close" @click="close">
  32. <trans _t="取消" />
  33. </view>
  34. <view class="submit_btn" @click="submit">
  35. <trans _t="确认" />
  36. </view>
  37. </view>
  38. </template>
  39. </Popup>
  40. </template>
  41. <script setup>
  42. import { reactive, ref, nextTick } from "vue";
  43. import Popup from "@/components/popup.vue";
  44. import { t } from "@/locale";
  45. import { SHOP_ORDER_CANCEL, SELLER_ORDER_CANCEL } from "@/api";
  46. import { Toast } from "@/utils";
  47. import { useTabbarStore } from "@/store";
  48. const useTabbar = useTabbarStore();
  49. const props = defineProps({
  50. oid: { type: String, default: "" },
  51. isBuyer: Boolean,
  52. });
  53. const form = reactive({
  54. orderid: 0,
  55. cancelReason: "",
  56. });
  57. const emit = defineEmits(["open", "close"]);
  58. const popRef = ref(null);
  59. // 快捷词条列表
  60. const phrases = ref(["不想要了", "买错了", "价格太贵"]);
  61. // 插入词条方法
  62. const insertPhrase = (phrase) => {
  63. if (!form.cancelReason || form.cancelReason.endsWith(" ")) {
  64. form.cancelReason += t(phrase);
  65. } else {
  66. form.cancelReason += `,${t(phrase)}`;
  67. }
  68. };
  69. const open = (id = 0) => {
  70. form.orderid = id;
  71. form.cancelReason = "";
  72. emit("open");
  73. popRef.value && popRef.value.open();
  74. };
  75. const close = () => {
  76. emit("close");
  77. popRef.value && popRef.value.close();
  78. };
  79. const submit = async () => {
  80. if (!form.cancelReason) {
  81. Toast(t("请输入取消原因"));
  82. return;
  83. }
  84. try {
  85. let URL = props.isBuyer ? SELLER_ORDER_CANCEL : SHOP_ORDER_CANCEL;
  86. let res = await URL(form);
  87. close();
  88. Toast(res.msg, 1000).then(() => {
  89. setTimeout(() => {
  90. if (props.isBuyer) {
  91. return uni.navigateTo({ url: "/pagesBuyer/order/index" });
  92. }
  93. uni.switchTab({ url: "/pages/order/index" });
  94. useTabbar.getPageCur("order");
  95. }, 1000);
  96. });
  97. } catch (error) {
  98. Toast(error.msg);
  99. }
  100. };
  101. defineExpose({ open, close });
  102. </script>
  103. <style lang="less" scoped>
  104. @import url("@/style.less");
  105. .content {
  106. width: 100%;
  107. .tips {
  108. color: var(--text-01);
  109. .size(24rpx);
  110. margin: 24rpx 0;
  111. }
  112. .u-textarea {
  113. width: 100%;
  114. height: 200rpx;
  115. background-color: var(--inputBg);
  116. border-radius: 16rpx;
  117. padding: 16rpx;
  118. color: var(--text-01);
  119. .size(24rpx);
  120. box-sizing: border-box;
  121. /deep/ .u-textarea__content {
  122. min-height: 100%;
  123. line-height: 32rpx;
  124. color: var(--text-01);
  125. }
  126. }
  127. .quick-phrases {
  128. display: flex;
  129. flex-wrap: wrap;
  130. gap: 20rpx;
  131. margin-top: 10rpx;
  132. }
  133. .phrase-tag {
  134. padding: 12rpx 24rpx;
  135. background-color: #f0f7ff;
  136. border-radius: 40rpx;
  137. color: #2979ff;
  138. font-size: 26rpx;
  139. border: 1rpx solid #d9e6ff;
  140. }
  141. .phrase-tag:active {
  142. background-color: #e1eeff;
  143. transform: scale(0.98);
  144. }
  145. }
  146. .footer {
  147. .hor(space-between);
  148. column-gap: 20rpx;
  149. .submit_btn {
  150. height: 76rpx;
  151. padding: 16rpx 100rpx;
  152. background-color: var(--black);
  153. color: var(--light);
  154. .flex_center();
  155. border-radius: 16rpx;
  156. .size(24rpx);
  157. &.submit_close {
  158. background-color: var(--bg);
  159. border: 1rpx solid var(--black);
  160. color: var(--black);
  161. }
  162. }
  163. }
  164. </style>