index.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470
  1. <template>
  2. <div class="app-container">
  3. <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
  4. <el-form-item label="所属部门" prop="deptId">
  5. <treeselect style="width:220px" v-model="queryParams.deptId" :options="deptOptions" :show-count="true" placeholder="请选择所属部门" />
  6. </el-form-item>
  7. <el-form-item label="订单号" prop="orderCode">
  8. <el-input
  9. v-model="queryParams.orderCode"
  10. placeholder="请输入订单号"
  11. clearable
  12. size="small"
  13. @keyup.enter.native="handleQuery"
  14. />
  15. </el-form-item>
  16. <el-form-item label="用户ID" prop="userId">
  17. <el-input
  18. v-model="queryParams.userId"
  19. placeholder="请输入用户ID"
  20. clearable
  21. size="small"
  22. @keyup.enter.native="handleQuery"
  23. />
  24. </el-form-item>
  25. <el-form-item label="收货人" prop="userName">
  26. <el-input
  27. v-model="queryParams.userName"
  28. placeholder="请输入收货人"
  29. clearable
  30. size="small"
  31. @keyup.enter.native="handleQuery"
  32. />
  33. </el-form-item>
  34. <el-form-item label="手机号" prop="userPhone">
  35. <el-input
  36. v-model="queryParams.userPhone"
  37. placeholder="请输入手机号"
  38. clearable
  39. size="small"
  40. @keyup.enter.native="handleQuery"
  41. />
  42. </el-form-item>
  43. <el-form-item label="地址" prop="userAddress">
  44. <el-input
  45. v-model="queryParams.userAddress"
  46. placeholder="请输入地址"
  47. clearable
  48. size="small"
  49. @keyup.enter.native="handleQuery"
  50. />
  51. </el-form-item>
  52. <el-form-item label="支付金额" prop="payMoney">
  53. <el-input
  54. v-model="queryParams.payMoney"
  55. placeholder="请输入支付金额"
  56. clearable
  57. size="small"
  58. @keyup.enter.native="handleQuery"
  59. />
  60. </el-form-item>
  61. <el-form-item label="订单金额" prop="totalPrice">
  62. <el-input
  63. v-model="queryParams.totalPrice"
  64. placeholder="请输入订单金额"
  65. clearable
  66. size="small"
  67. @keyup.enter.native="handleQuery"
  68. />
  69. </el-form-item>
  70. <el-form-item style="margin-left: 20px;">
  71. <el-button type="text" :icon="isCollapsed ? 'el-icon-arrow-down' : 'el-icon-arrow-up'" @click="upDown">{{ isCollapsed ? '展开' : '收起' }}</el-button>
  72. <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
  73. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
  74. </el-form-item>
  75. <div v-if="!isCollapsed">
  76. <el-form-item label="物流信息" prop="searchKey">
  77. <el-input
  78. v-model.trim="searchKey"
  79. :placeholder="searchType=='deliveryCode'?'请输入物流编号':searchType=='deliveryName'?'请输入物流名称':searchType=='deliverySn'?'请输入物流单号':'请先选择搜索类型'"
  80. clearable
  81. size="small"
  82. @keyup.enter.native="handleQuery"
  83. >
  84. <el-select
  85. slot="prepend"
  86. v-model="searchType"
  87. placeholder="请选择"
  88. clearable
  89. @change="handleTypeChange"
  90. class="select-box"
  91. >
  92. <el-option label="物流编号" value="deliveryCode" />
  93. <el-option label="物流名称" value="deliveryName" />
  94. <el-option label="物流单号" value="deliverySn" />
  95. </el-select>
  96. </el-input>
  97. </el-form-item>
  98. <el-form-item label="支付时间" prop="payTimeStart">
  99. <el-date-picker
  100. v-model="payTimeRange"
  101. type="daterange"
  102. value-format="yyyy-MM-dd"
  103. range-separator="至"
  104. start-placeholder="开始日期"
  105. end-placeholder="结束日期"
  106. size="small"
  107. @change="handlePayTimeChange"
  108. />
  109. </el-form-item>
  110. <el-form-item label="完成时间" prop="finishTimeStart">
  111. <el-date-picker
  112. v-model="finishTimeRange"
  113. type="daterange"
  114. value-format="yyyy-MM-dd"
  115. range-separator="至"
  116. start-placeholder="开始日期"
  117. end-placeholder="结束日期"
  118. size="small"
  119. @change="handleFinishTimeChange"
  120. />
  121. </el-form-item>
  122. <el-form-item label="员工姓名" prop="companyUserName">
  123. <el-input
  124. v-model="queryParams.companyUserName"
  125. placeholder="请输入员工姓名"
  126. clearable
  127. size="small"
  128. @keyup.enter.native="handleQuery"
  129. />
  130. </el-form-item>
  131. <el-form-item label="发货时间" prop="deliverySendTime">
  132. <el-date-picker
  133. v-model="deliveryTimeRange"
  134. type="daterange"
  135. value-format="yyyy-MM-dd"
  136. range-separator="至"
  137. start-placeholder="开始日期"
  138. end-placeholder="结束日期"
  139. size="small"
  140. @change="handleDateChange"
  141. />
  142. </el-form-item>
  143. </div>
  144. </el-form>
  145. <el-row :gutter="10" class="mb8">
  146. <el-col :span="1.5">
  147. <el-button
  148. type="warning"
  149. plain
  150. icon="el-icon-download"
  151. size="mini"
  152. :loading="exportLoading"
  153. @click="handleExport"
  154. v-hasPermi="['live:liveOrder:export']"
  155. >导出</el-button>
  156. </el-col>
  157. <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
  158. </el-row>
  159. <el-tabs type="card" v-model="actName" @tab-click="handleClickX">
  160. <el-tab-pane label="全部订单" name="10"></el-tab-pane>
  161. <el-tab-pane v-for="(item,index) in orderOptions" :key="item.dictValue" :label="item.dictLabel" :name="item.dictValue"></el-tab-pane>
  162. </el-tabs>
  163. <el-table border v-loading="loading" :data="liveOrderList" @selection-change="handleSelectionChange">
  164. <el-table-column type="selection" width="55" align="center" />
  165. <el-table-column label="订单ID" align="center" prop="orderId"/>
  166. <el-table-column label="订单号" align="center" prop="orderCode" />
  167. <el-table-column label="用户ID" align="center" prop="userId" />
  168. <el-table-column label="收货人" align="center" prop="userName" />
  169. <el-table-column label="手机号" align="center" prop="userPhone" />
  170. <el-table-column label="支付金额" align="center" prop="payMoney" />
  171. <el-table-column label="订单金额" align="center" prop="totalPrice" />
  172. <el-table-column label="物流编号" align="center" prop="deliveryCode" />
  173. <el-table-column label="物流名称" align="center" prop="deliveryName" />
  174. <el-table-column label="物流单号" align="center" prop="deliverySn" />
  175. <el-table-column label="员工名称" align="center" prop="companyUserName" />
  176. <el-table-column label="支付时间" align="center" prop="payTime" width="180">
  177. <template slot-scope="scope">
  178. <span>{{ parseTime(scope.row.payTime, '{y}-{m}-{d}') }}</span>
  179. </template>
  180. </el-table-column>
  181. <el-table-column label="完成时间" align="center" prop="finishTime" width="180">
  182. <template slot-scope="scope">
  183. <span>{{ parseTime(scope.row.finishTime, '{y}-{m}-{d}') }}</span>
  184. </template>
  185. </el-table-column>
  186. <el-table-column label="发货时间" align="center" prop="deliverySendTime" width="180">
  187. <template slot-scope="scope">
  188. <span>{{ parseTime(scope.row.deliverySendTime, '{y}-{m}-{d}') }}</span>
  189. </template>
  190. </el-table-column>
  191. <el-table-column label="状态" align="center" prop="status" :formatter="orderStatusFormatter"/>
  192. <el-table-column label="备注" align="center" prop="remark" />
  193. <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
  194. <template slot-scope="scope">
  195. <el-button
  196. size="mini"
  197. type="text"
  198. icon="el-icon-edit"
  199. @click="handledetails(scope.row)"
  200. v-hasPermi="['live:liveOrder:edit']"
  201. >查看</el-button>
  202. </template>
  203. </el-table-column>
  204. </el-table>
  205. <pagination
  206. v-show="total>0"
  207. :total="total"
  208. :page.sync="queryParams.pageNum"
  209. :limit.sync="queryParams.pageSize"
  210. @pagination="getList"
  211. />
  212. <el-drawer
  213. :with-header="false"
  214. size="75%"
  215. :title="show.title" :visible.sync="show.open">
  216. <liveOrderDetails ref="Details" />
  217. </el-drawer>
  218. </div>
  219. </template>
  220. <script>
  221. import { listLiveOrder, exportLiveOrder } from "@/api/live/liveOrder";
  222. import liveOrderDetails from './liveOrderDetails.vue';
  223. import { treeselect } from "@/api/company/companyDept";
  224. import Treeselect from "@riophae/vue-treeselect";
  225. import "@riophae/vue-treeselect/dist/vue-treeselect.css";
  226. import {parseTime} from "../../../utils/common";
  227. export default {
  228. name: "LiveOrder",
  229. components: { Treeselect, liveOrderDetails },
  230. data() {
  231. return {
  232. searchType: '',
  233. searchKey: '',
  234. isCollapsed: true,
  235. // 发货时间范围
  236. deliveryTimeRange: [],
  237. // 支付时间范围
  238. payTimeRange: [],
  239. // 完成时间范围
  240. finishTimeRange: [],
  241. //字典
  242. orderStatusOptions: [],
  243. loading: true,
  244. exportLoading: false,
  245. ids: [],
  246. single: true,
  247. multiple: true,
  248. showSearch: true,
  249. total: 0,
  250. liveOrderList: [],
  251. queryParams: {
  252. pageNum: 1,
  253. liveId: null,
  254. pageSize: 10,
  255. deptId: null,
  256. orderCode: null,
  257. userId: null,
  258. userName: null,
  259. userPhone: null,
  260. userAddress: null,
  261. payMoney: null,
  262. totalPrice: null,
  263. deliveryCode: null,
  264. deliveryName: null,
  265. deliverySn: null,
  266. payTimeStart: null,
  267. payTimeEnd: null,
  268. finishTimeStart: null,
  269. finishTimeEnd: null,
  270. status: null,
  271. companyUserName: null,
  272. deliverySendTimeStart: null,
  273. deliverySendTimeEnd: null,
  274. },
  275. orderOptions: [],
  276. actName: "10",
  277. show: {
  278. title: "订单详情",
  279. open: false,
  280. },
  281. deptOptions: undefined,
  282. deptName: undefined,
  283. };
  284. },
  285. watch: {
  286. deptName(val) {
  287. this.$refs.tree.filter(val);
  288. },
  289. },
  290. created() {
  291. this.getTreeselect();
  292. this.queryParams.liveId = this.$route.query.liveId;
  293. this.getList();
  294. this.getDicts("sys_live_order_status").then(response => {
  295. this.orderStatusOptions = response.data;
  296. });
  297. this.getDicts("sys_order_status").then(response => {
  298. this.orderOptions = response.data;
  299. });
  300. },
  301. methods: {
  302. parseTime,
  303. // 发货时间范围处理
  304. handleDateChange(val) {
  305. if (val && val.length === 2) {
  306. this.queryParams.deliverySendTimeStart = val[0];
  307. this.queryParams.deliverySendTimeEnd = val[1];
  308. } else {
  309. this.queryParams.deliverySendTimeStart = null;
  310. this.queryParams.deliverySendTimeEnd = null;
  311. }
  312. },
  313. // 支付时间范围处理
  314. handlePayTimeChange(val) {
  315. if (val && val.length === 2) {
  316. this.queryParams.payTimeStart = val[0];
  317. this.queryParams.payTimeEnd = val[1];
  318. } else {
  319. this.queryParams.payTimeStart = null;
  320. this.queryParams.payTimeEnd = null;
  321. }
  322. },
  323. // 完成时间范围处理
  324. handleFinishTimeChange(val) {
  325. if (val && val.length === 2) {
  326. this.queryParams.finishTimeStart = val[0];
  327. this.queryParams.finishTimeEnd = val[1];
  328. } else {
  329. this.queryParams.finishTimeStart = null;
  330. this.queryParams.finishTimeEnd = null;
  331. }
  332. },
  333. // 获取部门树
  334. getTreeselect() {
  335. treeselect().then((response) => {
  336. this.deptOptions = response.data;
  337. });
  338. },
  339. // 查看详情
  340. handledetails(row) {
  341. this.show.open = true;
  342. this.$nextTick(() => {
  343. this.$refs.Details.getDetails(row.orderId, row.nickName, row.storeName);
  344. });
  345. },
  346. // 订单tab切换
  347. handleClickX(tab, event) {
  348. this.orderStatus = tab.name;
  349. if (tab.name == "10") {
  350. this.queryParams.status = null;
  351. } else {
  352. this.queryParams.status = tab.name;
  353. }
  354. this.handleQuery();
  355. },
  356. /** 查询订单列表 */
  357. getList() {
  358. this.loading = true;
  359. const params = { ...this.queryParams };
  360. listLiveOrder(params).then(response => {
  361. this.liveOrderList = response.rows;
  362. this.total = response.total;
  363. this.loading = false;
  364. });
  365. },
  366. orderStatusFormatter(row, column) {
  367. return this.selectDictLabel(this.orderStatusOptions, row.status);
  368. },
  369. upDown() {
  370. this.isCollapsed = !this.isCollapsed;
  371. },
  372. handleTypeChange(newType) {
  373. this.searchKey = '';
  374. this.searchType = newType;
  375. },
  376. /** 搜索按钮操作 */
  377. handleQuery() {
  378. this.queryParams.pageNum = 1;
  379. this.queryParams.deliveryCode = null;
  380. this.queryParams.deliveryName = null;
  381. this.queryParams.deliverySn = null;
  382. if (this.searchKey !== '' && this.searchType !== '') {
  383. this.queryParams[this.searchType] = this.searchKey;
  384. }
  385. this.getList();
  386. },
  387. /** 重置按钮操作 */
  388. resetQuery() {
  389. this.searchKey = '';
  390. this.searchType = '';
  391. this.deliveryTimeRange = [];
  392. this.payTimeRange = [];
  393. this.finishTimeRange = [];
  394. this.resetForm("queryForm");
  395. this.queryParams = {
  396. pageNum: 1,
  397. liveId: this.$route.query.liveId,
  398. pageSize: 10,
  399. deptId: null,
  400. orderCode: null,
  401. userId: null,
  402. userName: null,
  403. userPhone: null,
  404. userAddress: null,
  405. payMoney: null,
  406. totalPrice: null,
  407. deliveryCode: null,
  408. deliveryName: null,
  409. deliverySn: null,
  410. payTimeStart: null,
  411. payTimeEnd: null,
  412. finishTimeStart: null,
  413. finishTimeEnd: null,
  414. status: null,
  415. companyUserName: null,
  416. deliverySendTimeStart: null,
  417. deliverySendTimeEnd: null,
  418. };
  419. if (this.actName !== "10") {
  420. this.queryParams.status = this.actName;
  421. }
  422. this.handleQuery();
  423. },
  424. // 多选框选中数据
  425. handleSelectionChange(selection) {
  426. this.ids = selection.map(item => item.orderId);
  427. this.single = selection.length !== 1;
  428. this.multiple = !selection.length;
  429. },
  430. /** 导出按钮操作 */
  431. handleExport() {
  432. const queryParams = { ...this.queryParams };
  433. this.$confirm('是否确认导出所有订单数据项?', "警告", {
  434. confirmButtonText: "确定",
  435. cancelButtonText: "取消",
  436. type: "warning"
  437. }).then(() => {
  438. this.exportLoading = true;
  439. return exportLiveOrder(queryParams);
  440. }).then(response => {
  441. this.download(response.msg);
  442. this.exportLoading = false;
  443. }).catch(() => {
  444. this.exportLoading = false;
  445. });
  446. }
  447. }
  448. };
  449. </script>
  450. <style scoped>
  451. ::v-deep .el-input-group__prepend {
  452. background-color: #fff !important;
  453. width: 100px;
  454. }
  455. ::v-deep .el-input-group--prepend {
  456. vertical-align: middle;
  457. }
  458. ::v-deep .vue-treeselect__control {
  459. height: 30px !important;
  460. line-height: 30px;
  461. }
  462. ::v-deep .vue-treeselect__placeholder {
  463. line-height: 32px;
  464. }
  465. </style>