index.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683
  1. <template>
  2.  
  3. <div class="app-container">
  4. <el-card class="filter-container" shadow="never">
  5. <div>
  6. <i class="el-icon-search"></i>
  7. <span>筛选搜索</span>
  8. <el-button
  9. style="float: right; "
  10. @click="onExport()"
  11. size="small"
  12. type="danger"
  13. >
  14. 导出
  15. </el-button>
  16. <el-button
  17. style="float: right; margin-right: 15px"
  18. type="primary"
  19. @click="handleSearchList()"
  20. size="small"
  21. >
  22. 查询搜索
  23. </el-button>
  24. <el-button
  25. style="float: right; margin-right: 15px"
  26. @click="handleResetSearch()"
  27. size="small"
  28. >
  29. 重置
  30. </el-button>
  31. </div>
  32. <div style="margin-top: 15px">
  33. <el-form
  34. :inline="true"
  35. :model="listQuery"
  36. size="small"
  37. label-width="140px"
  38. >
  39. <el-form-item label="输入搜索:">
  40. <el-input
  41. v-model="listQuery.orderSn"
  42. class="input-width"
  43. placeholder="订单编号"
  44. ></el-input>
  45. </el-form-item>
  46. <el-form-item label="收货人:">
  47. <el-input
  48. v-model="listQuery.receiverKeyword"
  49. class="input-width"
  50. placeholder="收货人姓名/手机号码"
  51. ></el-input>
  52. </el-form-item>
  53. <el-form-item label="提交时间:">
  54. <el-date-picker
  55. class="input-width"
  56. v-model="listQuery.dateRange"
  57. value-format="yyyy-MM-dd"
  58. type="daterange"
  59. placeholder="请选择时间"
  60. range-separator="~"
  61. start-placeholder="开始日期"
  62. end-placeholder="结束日期"
  63. style="width: 260px;"
  64. >
  65. </el-date-picker>
  66. </el-form-item>
  67. <el-form-item label="订单状态:">
  68. <el-select
  69. v-model="listQuery.status"
  70. class="input-width"
  71. placeholder="全部"
  72. clearable
  73. >
  74. <el-option
  75. v-for="item in statusOptions"
  76. :key="item.value"
  77. :label="item.label"
  78. :value="item.value"
  79. >
  80. </el-option>
  81. </el-select>
  82. </el-form-item>
  83. <el-form-item label="订单分类:">
  84. <el-select
  85. v-model="listQuery.orderType"
  86. class="input-width"
  87. placeholder="全部"
  88. clearable
  89. >
  90. <el-option
  91. v-for="item in orderTypeOptions"
  92. :key="item.value"
  93. :label="item.label"
  94. :value="item.value"
  95. >
  96. </el-option>
  97. </el-select>
  98. </el-form-item>
  99. <el-form-item label="订单来源:">
  100. <el-select
  101. v-model="listQuery.sourceType"
  102. class="input-width"
  103. placeholder="全部"
  104. clearable
  105. >
  106. <el-option
  107. v-for="item in sourceTypeOptions"
  108. :key="item.value"
  109. :label="item.label"
  110. :value="item.value"
  111. >
  112. </el-option>
  113. </el-select>
  114. </el-form-item>
  115. </el-form>
  116. </div>
  117. </el-card>
  118. <el-card class="operate-container" shadow="never">
  119. <i class="el-icon-tickets"></i>
  120. <span>数据列表</span>
  121. </el-card>
  122. <div class="table-container">
  123. <el-table
  124. ref="orderTable"
  125. :data="list"
  126. style="width: 100%"
  127. @selection-change="handleSelectionChange"
  128. v-loading="listLoading"
  129. border
  130. >
  131. <el-table-column
  132. type="selection"
  133. width="60"
  134. align="center"
  135. ></el-table-column>
  136. <el-table-column label="编号" width="80" align="center">
  137. <template slot-scope="scope">{{ scope.row.id }}</template>
  138. </el-table-column>
  139. <el-table-column label="订单编号" width="180" align="center">
  140. <template slot-scope="scope">{{ scope.row.orderSn }}</template>
  141. </el-table-column>
  142. <el-table-column label="提交时间" width="180" align="center">
  143. <template slot-scope="scope">{{
  144. scope.row.createTime | formatCreateTime
  145. }}</template>
  146. </el-table-column>
  147. <el-table-column label="来源" align="center">
  148. <template slot-scope="scope">{{ scope.row.orderFormType | formatOrderFormType }}</template>
  149. </el-table-column>
  150. <el-table-column label="用户类型" align="center">
  151. <template slot-scope="scope">
  152. <p v-if="scope.row.platformType == 'STUDENT'">学生</p>
  153. <p v-else-if="scope.row.platformType == 'TEACHER'">老师</p>
  154. <p v-else-if="scope.row.platformType == 'SCHOOL'">学校</p>
  155. <p v-else>--</p>
  156. </template>
  157. </el-table-column>
  158. <el-table-column label="用户编号" align="center">
  159. <template slot-scope="scope">{{ scope.row.userId }}</template>
  160. </el-table-column>
  161. <el-table-column label="用户名" align="center">
  162. <template slot-scope="scope">{{ scope.row.username }}</template>
  163. </el-table-column>
  164. <el-table-column label="手机号" align="center">
  165. <template slot-scope="scope">{{ scope.row.phone || '-' }}</template>
  166. </el-table-column>
  167. <el-table-column label="订单金额" width="120" align="center">
  168. <template slot-scope="scope">¥{{ scope.row.totalAmount }}</template>
  169. </el-table-column>
  170. <el-table-column label="支付方式" width="120" align="center">
  171. <template slot-scope="scope">{{
  172. scope.row.payType | formatPayType
  173. }}</template>
  174. </el-table-column>
  175. <el-table-column label="订单来源" width="120" align="center">
  176. <template slot-scope="scope">{{
  177. scope.row.sourceType | formatSourceType
  178. }}</template>
  179. </el-table-column>
  180. <el-table-column label="订单状态" width="120" align="center">
  181. <template slot-scope="scope">{{
  182. scope.row.status | formatStatus
  183. }}</template>
  184. </el-table-column>
  185. <el-table-column label="操作" width="200" align="center">
  186. <template slot-scope="scope">
  187. <p class="table-btn-group">
  188. <el-button
  189. size="mini"
  190. @click="handleViewOrder(scope.$index, scope.row)"
  191. >查看订单</el-button
  192. >
  193. <!-- <el-button
  194. size="mini"
  195. @click="handleCloseOrder(scope.$index, scope.row)"
  196. v-show="scope.row.status === 0 || scope.row.status === 6"
  197. >关闭订单</el-button
  198. > -->
  199. <el-button
  200. size="mini"
  201. @click="handleDeliveryOrder(scope.$index, scope.row)"
  202. v-show="scope.row.status === 1"
  203. >订单发货</el-button
  204. >
  205. <el-button
  206. size="mini"
  207. @click="handleOverOrder(scope.$index, scope.row)"
  208. v-show="scope.row.status === 1"
  209. >完成订单</el-button
  210. >
  211. <!-- <el-button
  212. size="mini"
  213. @click="handleViewLogistics(scope.$index, scope.row)"
  214. v-show="scope.row.status===2||scope.row.status===3">订单跟踪</el-button> -->
  215. <!-- <el-button
  216. size="mini"
  217. type="danger"
  218. @click="handleDeleteOrder(scope.$index, scope.row)"
  219. v-show="scope.row.status === 4"
  220. >删除订单</el-button
  221. > -->
  222. </p>
  223. </template>
  224. </el-table-column>
  225. </el-table>
  226. </div>
  227. <!-- <div class="batch-operate-container">
  228. <el-select size="small" v-model="operateType" placeholder="批量操作">
  229. <el-option
  230. v-for="item in operateOptions"
  231. :key="item.value"
  232. :label="item.label"
  233. :value="item.value"
  234. >
  235. </el-option>
  236. </el-select>
  237. <el-button
  238. style="margin-left: 20px"
  239. class="search-button"
  240. @click="handleBatchOperate()"
  241. type="primary"
  242. size="small"
  243. >
  244. 确定
  245. </el-button>
  246. </div> -->
  247. <div class="pagination-container">
  248. <el-pagination
  249. background
  250. @size-change="handleSizeChange"
  251. @current-change="handleCurrentChange"
  252. layout="total, sizes,prev, pager, next,jumper"
  253. :current-page.sync="listQuery.pageNum"
  254. :page-size="listQuery.pageSize"
  255. :page-sizes="[5, 10, 15]"
  256. :total="total"
  257. >
  258. </el-pagination>
  259. </div>
  260. <el-dialog
  261. title="关闭订单"
  262. :visible.sync="closeOrder.dialogVisible"
  263. width="30%"
  264. >
  265. <el-form :model="closeOrder" label-width="150px" ref="closeOrder">
  266. <el-form-item
  267. label="操作备注:"
  268. prop="content"
  269. :rules="[
  270. { required: true, message: '请填写操作备注', trigger: 'blur' },
  271. ]"
  272. >
  273. <el-input v-model="closeOrder.content" type="textarea" rows="3">
  274. </el-input>
  275. </el-form-item>
  276. </el-form>
  277. <!-- <span style="vertical-align: top">操作备注:</span>
  278. <el-input
  279. style="width: 80%"
  280. type="textarea"
  281. :rows="5"
  282. placeholder="请输入内容"
  283. v-model="closeOrder.content"
  284. >
  285. </el-input> -->
  286. <span slot="footer" class="dialog-footer">
  287. <el-button @click="closeOrder.dialogVisible = false">取 消</el-button>
  288. <el-button type="primary" @click="handleCloseOrderConfirm"
  289. >确 定</el-button
  290. >
  291. </span>
  292. </el-dialog>
  293. <logistics-dialog v-model="logisticsDialogVisible"></logistics-dialog>
  294. </div>
  295. </template>
  296. <script>
  297. import { fetchList, closeOrder, deleteOrder, updateOrderSuccess } from "@/api/order";
  298. import { formatDate } from "@/utils/date";
  299. import { Export } from "@/utils/downLoadFile";
  300. import dayjs from 'dayjs'
  301. import LogisticsDialog from "@/views/oms/order/components/logisticsDialog";
  302. const defaultListQuery = {
  303. pageNum: 1,
  304. pageSize: 10,
  305. orderSn: null,
  306. receiverKeyword: null,
  307. status: null,
  308. orderType: null,
  309. sourceType: null,
  310. dateRange: [],
  311. createTime: null,
  312. endTime: null,
  313. };
  314. export default {
  315. name: "orderList",
  316. components: { LogisticsDialog },
  317. data() {
  318. return {
  319. listQuery: Object.assign({}, defaultListQuery),
  320. listLoading: true,
  321. list: null,
  322. total: null,
  323. operateType: null,
  324. multipleSelection: [],
  325. closeOrder: {
  326. dialogVisible: false,
  327. content: null,
  328. orderIds: [],
  329. },
  330. statusOptions: [
  331. {
  332. label: "待付款",
  333. value: 0,
  334. },
  335. {
  336. label: "待发货",
  337. value: 1,
  338. },
  339. {
  340. label: "已发货",
  341. value: 2,
  342. },
  343. {
  344. label: "已完成",
  345. value: 3,
  346. },
  347. {
  348. label: "已关闭",
  349. value: 4,
  350. },
  351. ],
  352. orderTypeOptions: [
  353. {
  354. label: "正常订单",
  355. value: 0,
  356. },
  357. {
  358. label: "秒杀订单",
  359. value: 1,
  360. },
  361. ],
  362. sourceTypeOptions: [
  363. {
  364. label: "PC订单",
  365. value: 0,
  366. },
  367. {
  368. label: "APP订单",
  369. value: 1,
  370. },
  371. ],
  372. operateOptions: [
  373. {
  374. label: "批量发货",
  375. value: 1,
  376. },
  377. {
  378. label: "关闭订单",
  379. value: 2,
  380. },
  381. {
  382. label: "删除订单",
  383. value: 3,
  384. },
  385. ],
  386. logisticsDialogVisible: false,
  387. };
  388. },
  389. created() {
  390. this.getList();
  391. // console.log(this.$route)
  392. if (this.$route.params.status + "") {
  393. this.listQuery.status = this.$route.params.status;
  394. }
  395. if(this.$route.query.orderSn){
  396. this.listQuery.orderSn = this.$route.query.orderSn
  397. }
  398. },
  399. filters: {
  400. formatCreateTime(time) {
  401. let date = new Date(time);
  402. return formatDate(date, "yyyy-MM-dd hh:mm:ss");
  403. },
  404. formatPayType(value) {
  405. if (value === 1) {
  406. return "支付宝";
  407. } else if (value === 2) {
  408. return "微信";
  409. } else if (value === 3) {
  410. return "余额";
  411. }else {
  412. return "未支付";
  413. }
  414. },
  415. formatOrderFormType(value) {
  416. if(value === 'MEC') {
  417. return '管乐迷'
  418. }
  419. },
  420. formatSourceType(value) {
  421. // 0->PC订单;1->app订单 2->学校采购 3 个人订单 4 其他订单")
  422. if(value === 0) {
  423. return "PC订单";
  424. } else if (value === 1) {
  425. return "APP订单";
  426. } else if (value === 2) {
  427. return "学校采购";
  428. } else if (value === 3) {
  429. return "个人订单";
  430. } else {
  431. return "其他订单";
  432. }
  433. },
  434. formatStatus(value) {
  435. if (value === 1) {
  436. return "待发货";
  437. } else if (value === 2) {
  438. return "已发货";
  439. } else if (value === 3) {
  440. return "已完成";
  441. } else if (value === 4) {
  442. return "已关闭";
  443. } else if (value === 5) {
  444. return "无效订单";
  445. } else {
  446. return "待付款";
  447. }
  448. },
  449. },
  450. methods: {
  451. handleResetSearch() {
  452. this.listQuery = Object.assign({}, defaultListQuery);
  453. },
  454. handleSearchList() {
  455. this.listQuery.pageNum = 1;
  456. this.getList();
  457. },
  458. handleSelectionChange(val) {
  459. this.multipleSelection = val;
  460. },
  461. handleViewOrder(index, row) {
  462. this.$router.push({ path: "/oms/orderDetail", query: { id: row.id } });
  463. },
  464. handleCloseOrder(index, row) {
  465. this.closeOrder.dialogVisible = true;
  466. this.closeOrder.content = "";
  467. this.closeOrder.orderIds = [row.id];
  468. },
  469. handleDeliveryOrder(index, row) {
  470. let listItem = this.covertOrder(row);
  471. this.$router.push({
  472. path: "/oms/deliverOrderList",
  473. query: { list: [listItem] },
  474. });
  475. },
  476. /** 完成订单 */
  477. handleOverOrder(index, row) {
  478. this.$confirm("是否要完成订单?", "提示", {
  479. confirmButtonText: "确定",
  480. cancelButtonText: "取消",
  481. type: "warning",
  482. }).then(() => {
  483. // let obj = {
  484. // ids:ids.join(',')
  485. // }
  486. updateOrderSuccess([row.id]).then((response) => {
  487. this.$message({
  488. message: "完成成功!",
  489. type: "success",
  490. duration: 1000,
  491. });
  492. this.getList();
  493. });
  494. });
  495. },
  496. handleViewLogistics(index, row) {
  497. this.logisticsDialogVisible = true;
  498. },
  499. handleDeleteOrder(index, row) {
  500. let ids = [];
  501. ids.push(row.id);
  502. this.deleteOrder(ids);
  503. },
  504. handleBatchOperate() {
  505. if (this.multipleSelection == null || this.multipleSelection.length < 1) {
  506. this.$message({
  507. message: "请选择要操作的订单",
  508. type: "warning",
  509. duration: 1000,
  510. });
  511. return;
  512. }
  513. if (this.operateType === 1) {
  514. //批量发货
  515. let list = [];
  516. for (let i = 0; i < this.multipleSelection.length; i++) {
  517. if (this.multipleSelection[i].status === 1) {
  518. list.push(this.covertOrder(this.multipleSelection[i]));
  519. }
  520. }
  521. if (list.length === 0) {
  522. this.$message({
  523. message: "选中订单中没有可以发货的订单",
  524. type: "warning",
  525. duration: 1000,
  526. });
  527. return;
  528. }
  529. this.$router.push({
  530. path: "/oms/deliverOrderList",
  531. query: { list: list },
  532. });
  533. } else if (this.operateType === 2) {
  534. //关闭订单
  535. this.closeOrder.orderIds = [];
  536. for (let i = 0; i < this.multipleSelection.length; i++) {
  537. this.closeOrder.orderIds.push(this.multipleSelection[i].id);
  538. }
  539. this.closeOrder.dialogVisible = true;
  540. } else if (this.operateType === 3) {
  541. //删除订单
  542. let ids = [];
  543. for (let i = 0; i < this.multipleSelection.length; i++) {
  544. ids.push(this.multipleSelection[i].id);
  545. }
  546. this.deleteOrder(ids);
  547. }
  548. },
  549. handleSizeChange(val) {
  550. this.listQuery.pageNum = 1;
  551. this.listQuery.pageSize = val;
  552. this.getList();
  553. },
  554. handleCurrentChange(val) {
  555. this.listQuery.pageNum = val;
  556. this.getList();
  557. },
  558. handleCloseOrderConfirm() {
  559. // if (this.closeOrder.content == null || this.closeOrder.content === "") {
  560. // this.$message({
  561. // message: "操作备注不能为空",
  562. // type: "warning",
  563. // duration: 1000,
  564. // });
  565. // return;
  566. // }
  567. this.$refs.closeOrder.validate((valid) => {
  568. if (valid) {
  569. // let params = new URLSearchParams();
  570. // params.append("ids", this.closeOrder.orderIds);
  571. // params.append("note", this.closeOrder.content);
  572. let obj = {
  573. ids:this.closeOrder.orderIds.join(','),
  574. note: this.closeOrder.content
  575. }
  576. closeOrder(obj).then((response) => {
  577. this.closeOrder.orderIds = [];
  578. // this.closeOrder.dialogVisible = false;
  579. (this.closeOrder = {
  580. dialogVisible: false,
  581. content: null,
  582. orderIds: [],
  583. }),
  584. this.getList();
  585. this.$message({
  586. message: "修改成功",
  587. type: "success",
  588. duration: 1000,
  589. });
  590. });
  591. }
  592. });
  593. },
  594. getList() {
  595. this.listLoading = true;
  596. console.log(this.listQuery, 'listQuery')
  597. let { dateRange, createTime, endTime, ...res } = this.listQuery
  598. if(dateRange && dateRange.length > 0) {
  599. createTime = dayjs(dateRange[0]).format('YYYY-MM-DD')
  600. endTime = dayjs(dateRange[1]).format('YYYY-MM-DD')
  601. }
  602. fetchList({
  603. createTime: createTime,
  604. endTime: endTime,
  605. ...res
  606. }).then((response) => {
  607. this.listLoading = false;
  608. this.list = response.data.list;
  609. this.total = response.data.total;
  610. });
  611. },
  612. deleteOrder(ids) {
  613. this.$confirm("是否要进行该删除操作?", "提示", {
  614. confirmButtonText: "确定",
  615. cancelButtonText: "取消",
  616. type: "warning",
  617. }).then(() => {
  618. // let params = new URLSearchParams();
  619. // params.append("ids", ids);
  620. let obj = {
  621. ids:ids.join(',')
  622. }
  623. deleteOrder(obj).then((response) => {
  624. this.$message({
  625. message: "删除成功!",
  626. type: "success",
  627. duration: 1000,
  628. });
  629. this.getList();
  630. });
  631. });
  632. },
  633. covertOrder(order) {
  634. let address =
  635. order.receiverProvince +
  636. order.receiverCity +
  637. order.receiverRegion +
  638. order.receiverDetailAddress;
  639. let listItem = {
  640. orderId: order.id,
  641. orderSn: order.orderSn,
  642. receiverName: order.receiverName,
  643. receiverPhone: order.receiverPhone,
  644. receiverPostCode: order.receiverPostCode,
  645. address: address,
  646. deliveryCompany: null,
  647. deliverySn: null,
  648. };
  649. return listItem;
  650. },
  651. onExport() {
  652. Export(
  653. this,
  654. {
  655. url: "/api-mall-admin/export/orderDetail",
  656. fileName: "订单列表.xls",
  657. method: "post",
  658. params: { ...this.listQuery },
  659. },
  660. "您确定导出订单列表?"
  661. );
  662. },
  663. },
  664. };
  665. </script>
  666. <style scoped>
  667. .input-width {
  668. width: 203px;
  669. }
  670. .table-btn-group {
  671. .el-button {
  672. margin: 5px 3px;
  673. }
  674. }
  675. </style>