index.vue 17 KB

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