review.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. <template>
  2. <el-card class="main-card">
  3. <template #header>
  4. <el-breadcrumb separator-class="el-icon-arrow-right">
  5. <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
  6. <el-breadcrumb-item>订单审核</el-breadcrumb-item>
  7. </el-breadcrumb>
  8. </template>
  9. <el-form :model="forms" ref="forms" label-width="70px" class="search-form">
  10. <el-row>
  11. <el-form-item label="关键词" prop="keyword">
  12. <el-col>
  13. <el-input v-model="forms.keyword" prefix-icon="Search"></el-input>
  14. </el-col>
  15. </el-form-item>
  16. <el-form-item label="" label-width="20px">
  17. <el-button type="primary" icon="search" @click="submit('forms')">
  18. 搜索
  19. </el-button>
  20. </el-form-item>
  21. </el-row>
  22. </el-form>
  23. <div class="toolbar">
  24. <!-- <el-button type="primary" icon="plus" @click="add">
  25. 新增
  26. </el-button> -->
  27. <!-- <el-button type="primary" plain icon="fold" @click="toggleRowExpand">
  28. 展开
  29. </el-button>
  30. <el-button type="primary" plain icon="Expand" @click="toggleRowExpand">
  31. 折叠
  32. </el-button> -->
  33. </div>
  34. <el-table class="table" ref="table" :data="tableData" row-key="id" border size="small">
  35. <el-table-column type="index" label="序号" align="center" width="60"></el-table-column>
  36. <el-table-column prop="orderNo" label="订单号" min-width="180"></el-table-column>
  37. <el-table-column prop="agencyName" label="旅行社名称" min-width="180" show-overflow-tooltip></el-table-column>
  38. <el-table-column prop="travelStartDate" label="游玩日期" width="200">
  39. <template #default="scope">
  40. <div>开始日期: {{ moment(scope.row.travelStartDate).format('YYYY-MM-DD') }}</div>
  41. <div>结束日期: {{ getEndDay(scope.row) }}</div>
  42. <div>共: <el-tag size="small">{{ scope.row.travelDays }}天</el-tag></div>
  43. </template>
  44. </el-table-column>
  45. <el-table-column prop="touristCount" label="人数" width="80" align="center"></el-table-column>
  46. <el-table-column label="金额" width="120">
  47. <template #default="scope">
  48. <div>总额:¥{{ scope.row.totalAmount }}</div>
  49. <div>已付:¥{{ scope.row.paidAmount }}</div>
  50. </template>
  51. </el-table-column>
  52. <el-table-column prop="status" label="订单状态" width="100">
  53. <template #default="scope">
  54. <el-tag :type="getOrderStatusType(scope.row.status)">
  55. {{ getOrderStatusText(scope.row.status) }}
  56. </el-tag>
  57. </template>
  58. </el-table-column>
  59. <el-table-column prop="auditStatus" label="审核状态" width="100">
  60. <template #default="scope">
  61. <el-tag :type="scope.row.auditStatus === 'Approved' ? 'success' :
  62. scope.row.auditStatus === 'Rejected' ? 'danger' : 'warning'">
  63. {{ scope.row.auditStatus === 'Approved' ? '已通过' :
  64. scope.row.auditStatus === 'Rejected' ? '已驳回' : '待审核' }}
  65. </el-tag>
  66. </template>
  67. </el-table-column>
  68. <el-table-column prop="paymentStatus" label="支付状态" width="100">
  69. <template #default="scope">
  70. <el-tag :type="getPaymentStatusType(scope.row.paymentStatus)">
  71. {{ getPaymentStatusText(scope.row.paymentStatus) }}
  72. </el-tag>
  73. </template>
  74. </el-table-column>
  75. <!-- <el-table-column prop="progress" label="进度" width="180">
  76. <template #default="scope">
  77. <el-progress :percentage="scope.row.progress"></el-progress>
  78. </template>
  79. </el-table-column> -->
  80. <el-table-column fixed="right" label="操作" width="320">
  81. <template #default="scope">
  82. <!-- <el-button type="primary" link size="small" @click="edit(scope.row)">编辑</el-button> -->
  83. <el-button type="success" link size="small" @click="audit(scope.row)">
  84. {{ scope.row.status === 'Cancelling' ? '退费' : '订单' }}审核
  85. </el-button>
  86. <el-button type="info" link size="small" @click="view(scope.row)">详情</el-button>
  87. <!-- <el-button type="warning" link size="small" @click="payment(scope.row)">付款</el-button>
  88. <el-button type="info" link size="small" @click="editSchedule(scope.row)">行程</el-button>
  89. <el-button type="primary" link size="small" @click="editTourists(scope.row)">游客</el-button>
  90. <el-button type="danger" link size="small" @click="del(scope.row)">删除</el-button> -->
  91. </template>
  92. </el-table-column>
  93. </el-table>
  94. <el-pagination class="pagination" background layout="total, sizes, prev, pager, next"
  95. :page-sizes="[10, 20, 50, 100]" :page-size="forms.rows" :total="total" @size-change="sizeHandler"
  96. @current-change="pageHandler">
  97. </el-pagination>
  98. <el-dialog title="订单审核" width="800px" destroy-on-close v-model="formDialogVisible" @close="close">
  99. <el-form :model="formData" :rules="formRules" ref="formRef" label-width="100px" class="audit-form">
  100. <el-form-item label="审核结果" prop="isApproved">
  101. <el-radio-group v-model="formData.isApproved">
  102. <el-radio :label="true">通过</el-radio>
  103. <el-radio :label="false">驳回</el-radio>
  104. </el-radio-group>
  105. </el-form-item>
  106. <el-form-item label="备注" prop="remark">
  107. <el-input v-model="formData.remark" type="textarea" :rows="3" placeholder="请输入备注信息"></el-input>
  108. </el-form-item>
  109. </el-form>
  110. <template #footer>
  111. <span class="dialog-footer">
  112. <el-button @click="formDialogVisible = false">取 消</el-button>
  113. <el-button type="primary" @click="submitReviewOrder">确 定</el-button>
  114. </span>
  115. </template>
  116. </el-dialog>
  117. <order-detail-dialog ref="orderDetailDialog" :orderId="currentOrderId"></order-detail-dialog>
  118. </el-card>
  119. </template>
  120. <script>
  121. import request from '@/utils/request'
  122. import { getOrders, reviewOrder, getOrderRefundInfo, reviewRefundOrder } from '@/api/order';
  123. import { cloneDeep, groupBy } from 'lodash-es';
  124. import moment from 'moment/moment';
  125. import { ProductTypes } from '@/constant';
  126. import utils from '@/utils/util';
  127. import { getOrderStatusText, getOrderStatusType, getPaymentStatusText, getPaymentStatusType } from '@/utils/order';
  128. import OrderDetailDialog from './detial.vue';
  129. export default {
  130. name: "OrderReview",
  131. components: {
  132. OrderDetailDialog
  133. },
  134. data() {
  135. return {
  136. forms: {
  137. keyword: "",
  138. columns: [
  139. { label: "订单号", prop: "orderNo" },
  140. { label: "旅行社名称", prop: "agencyName" },
  141. { label: "游玩日期", prop: "travelStartDate" },
  142. { label: "游玩日期", prop: "travelEndDate" },
  143. { label: "游玩天数", prop: "travelDays" },
  144. { label: "人数", prop: "touristCount" },
  145. { label: "金额", prop: "totalAmount" },
  146. { label: "金额", prop: "paidAmount" },
  147. { label: "订单状态", prop: "status" },
  148. { label: "审核状态", prop: "auditStatus" },
  149. { label: "支付状态", prop: "paymentStatus" },
  150. { label: "进度", prop: "progress" },
  151. ],
  152. sorters: [
  153. {
  154. name: 'createDate',
  155. asc: false,
  156. }
  157. ],
  158. filters: [
  159. {
  160. name: "paymentStatus",
  161. operate: 0, // 0 等于; 1 不等于; 2 like; 3 not like
  162. value: 'Paid',
  163. },
  164. {
  165. name: "status",
  166. operate: 1, // 0 等于; 1 不等于; 2 like; 3 not like
  167. value: 'Cancelled',
  168. },
  169. {
  170. name: "auditStatus",
  171. operate: 0, // 0 等于; 1 不等于; 2 like; 3 not like
  172. value: 'Pending',
  173. }
  174. ],
  175. page: 1,
  176. rows: 10,
  177. },
  178. expand: false, //默认展开所有节点
  179. tableData: [],
  180. total: 0,
  181. formDialogVisible: false,
  182. formData: {
  183. id: '',
  184. status: '',
  185. isApproved: true,
  186. remark: '',
  187. },
  188. isAdd: true,
  189. formLabelWidth: "120px",
  190. activeTab: ['basic', 'details', 'tourists'],
  191. currUseDate: '',
  192. useDateList: [],
  193. categoryOptions: [],
  194. agencyOptions: [],
  195. formRules: {
  196. isApproved: [
  197. { required: true, message: "请选择审核结果", trigger: "change" }
  198. ],
  199. remark: [
  200. { max: 500, message: '长度不能超过500个字符', trigger: 'blur' }
  201. ]
  202. },
  203. };
  204. },
  205. methods: {
  206. moment,
  207. getEndDay(row) {
  208. if (!row.travelStartDate || !row.travelDays) return '-';
  209. return moment(row.travelStartDate).add(row.travelDays - 1, 'days').format('YYYY-MM-DD');
  210. },
  211. sizeHandler(val) {
  212. this.forms.rows = val;
  213. this.getOrderList();
  214. },
  215. pageHandler(val) {
  216. this.forms.page = val;
  217. this.getOrderList();
  218. },
  219. audit(row) {
  220. this.formData.id = row.id;
  221. this.formData.status = row.status;
  222. this.formDialogVisible = true;
  223. },
  224. view(row) {
  225. if (!row.id) return;
  226. this.$refs.orderDetailDialog.open(row.id);
  227. },
  228. close() {
  229. this.$refs.formRef.resetFields();
  230. this.formData = {
  231. id: '',
  232. status: '',
  233. isApproved: true,
  234. remark: '',
  235. };
  236. },
  237. getOrderList() {
  238. getOrders(this.forms || {}).then((res) => {
  239. this.tableData = res.data?.data || []
  240. this.total = res.data?.records || 0
  241. });
  242. },
  243. submitReviewOrder() {
  244. this.$refs.formRef.validate((valid) => {
  245. const { id, isApproved, remark, status } = this.formData;
  246. if (!valid || !id) return;
  247. if (status === 'Cancelling') {
  248. this.reviewCancelOrder(id, isApproved, remark);
  249. } else {
  250. this.reviewNormalOrder(id, isApproved, remark);
  251. }
  252. });
  253. },
  254. reviewCancelOrder(orderId, isApproved, remark) {
  255. getOrderRefundInfo(orderId).then((res) => {
  256. const refundInfo = res.data || {};
  257. const refundId = refundInfo.refundList?.[0]?.id || '';
  258. if (!refundId) {
  259. this.$message.error('未找到退款信息,无法审核取消订单');
  260. return;
  261. }
  262. reviewRefundOrder(refundId, isApproved, remark).then((res) => {
  263. if (res.code === 200) {
  264. this.$message({
  265. type: "success",
  266. message: "审核成功",
  267. });
  268. this.formDialogVisible = false;
  269. this.getOrderList();
  270. }
  271. });
  272. });
  273. },
  274. reviewNormalOrder(orderId, isApproved, remark) {
  275. reviewOrder(orderId, isApproved, remark).then((res) => {
  276. if (res.code === 200) {
  277. this.$message({
  278. type: "success",
  279. message: "审核成功",
  280. });
  281. this.formDialogVisible = false;
  282. this.getOrderList();
  283. }
  284. });
  285. },
  286. toggleRowExpand() {
  287. let that = this;
  288. this.tableData.forEach(function (row) {
  289. that.$refs.table.toggleRowExpansion(row);
  290. });
  291. },
  292. del(row) {
  293. this.$confirm("此操作将删除选择数据, 是否继续?", "提示", { confirmButtonText: "确定", cancelButtonText: "取消", type: "warning", })
  294. .then(() => {
  295. delOrder(row.id).then((res) => {
  296. if (res.code === 200) {
  297. this.$message({
  298. type: "success",
  299. message: "删除成功",
  300. });
  301. this.getOrderList();
  302. }
  303. });
  304. })
  305. .catch(() => {
  306. });
  307. },
  308. getOrderStatusType,
  309. getOrderStatusText,
  310. getPaymentStatusType,
  311. getPaymentStatusText,
  312. },
  313. created() {
  314. this.getOrderList();
  315. },
  316. };
  317. </script>