index.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438
  1. <!-- 订单管理 商品订单 -->
  2. <template>
  3. <div class="app-container">
  4. <!-- 搜索 -->
  5. <el-form inline size="mini">
  6. <el-form-item label="订单编号:">
  7. <el-input v-model="form.orderCode" placeholder="请输入订单编号" clearable />
  8. </el-form-item>
  9. <el-form-item label="用户账号:">
  10. <el-input v-model="form.userName" placeholder="请输入用户账户" clearable />
  11. </el-form-item>
  12. <el-form-item label="用户手机号:">
  13. <el-input type="number" v-model.number="form.phone" placeholder="请输入用户手机号" clearable />
  14. </el-form-item>
  15. <!-- 流量订单 -->
  16. <span v-if="form.searchType === '2'">
  17. <el-form-item label="SIM卡号:">
  18. <el-input v-model="form.simCode" placeholder="请输入SIM卡号" clearable />
  19. </el-form-item>
  20. <el-form-item label="生效状态">
  21. <el-select v-model="form.flowStatus" placeholder="请选择生效状态" clearable>
  22. <el-option v-for="item in flowOptions" :key="item.value" :value="item.value" :label="item.label" />
  23. </el-select>
  24. </el-form-item>
  25. </span>
  26. <!-- 除充值订单 -->
  27. <span v-if="form.searchType !== '3'">
  28. <el-form-item label="商品ID:">
  29. <el-input v-model="form.goodsid" placeholder="请输入商品ID" clearable />
  30. </el-form-item>
  31. <el-form-item label="商品名称:">
  32. <el-input v-model="form.goodsName" placeholder="请输入商品名称" clearable />
  33. </el-form-item>
  34. </span>
  35. <el-form-item label="操作系统" v-else>
  36. <el-select v-model="form.platform" placeholder="请选择操作系统" clearable>
  37. <el-option v-for="item in systemOptions" :key="item.value" :value="item.value" :label="item.label" />
  38. </el-select>
  39. </el-form-item>
  40. <!-- 会员订单 int platformId 字段平台ID:灵活配置多个平台的 0-vip会员 1-联通 -->
  41. <el-form-item v-if="form.searchType === '1' || form.searchType === '4'" label="资源平台:">
  42. <el-select v-model="form.platformId" placeholder="请选择资源平台" clearable>
  43. <el-option v-for="item in platformOptions" :key="item.value" :value="item.value" :label="item.label" />
  44. </el-select>
  45. </el-form-item>
  46. <el-form-item label="支付状态:">
  47. <el-select v-model="form.status" placeholder="请选择支付状态" clearable>
  48. <el-option v-for="item in statusOptions" :key="item.value" :value="item.value" :label="item.label" />
  49. </el-select>
  50. </el-form-item>
  51. <el-form-item label="支付方式:">
  52. <el-select v-model="form.payType" placeholder="请选择支付方式" clearable>
  53. <el-option v-for="item in payOptions" :key="item.value" :value="item.value" :label="item.label" />
  54. </el-select>
  55. </el-form-item>
  56. <!-- 商品订单 -->
  57. <el-form-item v-if="form.searchType === '1'" label="订单内容类型:">
  58. <el-select v-model="form.goodsType" placeholder="请选择订单内容类型" clearable>
  59. <el-option v-for="item in goodsTypeOptions" :key="item.value" :value="item.value" :label="item.label" />
  60. </el-select>
  61. </el-form-item>
  62. <el-form-item label="下单时间:">
  63. <el-date-picker v-model="form.listDate" type="datetimerange" start-placeholder="开始日期" end-placeholder="结束日期"
  64. format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss" :picker-options="pickerOptions" />
  65. </el-form-item>
  66. <el-form-item>
  67. <el-button type="primary" icon="el-icon-search" @click="getSearch">搜索</el-button>
  68. <el-button icon="el-icon-refresh" @click="getRefresh">重置</el-button>
  69. <el-button type="primary" icon="el-icon-download" @click="handleExport"
  70. v-hasPermi="['order:list:export']">导出</el-button>
  71. <el-button type="primary" @click="getDialog" v-hasPermi="['order:list:export']">查看</el-button>
  72. </el-form-item>
  73. </el-form>
  74. <!-- 列表 -->
  75. <el-table :data="tableData" v-loading="loading">
  76. <el-table-column label="订单编号" prop="orderCode" key="orderCode" align="center" show-overflow-tooltip />
  77. <!-- 流量订单 -->
  78. <span v-if="form.searchType === '2'">
  79. <el-table-column label="第三方订单编号" key="thirdOrderId" align="center" show-overflow-tooltip>
  80. <template slot-scope="scope">
  81. <span>{{
  82. scope.row.thirdOrderId | empty(scope.row.thirdOrderId)
  83. }}</span>
  84. </template>
  85. </el-table-column>
  86. <el-table-column label="SIM卡号" prop="simCode" key="simCode" align="center" show-overflow-tooltip>
  87. <template slot-scope="scope">
  88. <span>{{ scope.row.simCode | empty(scope.row.simCode) }}</span>
  89. </template>
  90. </el-table-column>
  91. </span>
  92. <el-table-column label="商品ID" prop="goodsid" key="goodsid" align="center" show-overflow-tooltip />
  93. <el-table-column label="商品名称" prop="goodsName" key="goodsName" align="center" show-overflow-tooltip />
  94. <el-table-column label="订单金额 / 元" prop="amount" key="amount" align="center" :formatter="amountFormatter" />
  95. <!-- 商品订单 -->
  96. <span v-if="form.searchType === '1'">
  97. <el-table-column label="购买类型" prop="charging" key="charging" align="center" :formatter="chargingFormatter" />
  98. <el-table-column label="订单内容类型" prop="goodsType" key="goodsType" align="center"
  99. :formatter="goodsTypeFormatter" />
  100. </span>
  101. <!-- 充值订单 -->
  102. <el-table-column v-if="form.searchType === '3'" label="订单来源" prop="platform" key="platform" align="center"
  103. :formatter="platformFormatter" />
  104. <!-- 会员订单 -->
  105. <span v-if="form.searchType === '4'">
  106. <el-table-column label="栏目" prop="groupId" key="groupId" align="center" :formatter="groupFormatter" />
  107. <el-table-column label="服务时长" prop="expirationTime" key="expirationTime" align="center"
  108. :formatter="timeFormatter" />
  109. </span>
  110. <!-- 商品订单 或 会员订单 -->
  111. <!-- <el-table-column v-if="['1', '4'].includes(form.searchType)" label="资源平台" prop="platformId" key="platformId"
  112. align="center" :formatter="platformIdFormatter" /> -->
  113. <el-table-column label="下单时间" prop="createTime" key="createTime" align="center" show-overflow-tooltip />
  114. <el-table-column label="支付方式" prop="payType" key="payType" align="center" :formatter="payTypeFormatter" />
  115. <el-table-column label="支付状态" prop="status" key="status" align="center" :formatter="statusFormatter" />
  116. <el-table-column label="支付时间" prop="goodsUpdateTime" key="goodsUpdateTime" align="center" show-overflow-tooltip />
  117. <el-table-column label="用户账号" prop="userName" key="userName" align="center" show-overflow-tooltip />
  118. <el-table-column label="支付流水号" key="payId" align="center" show-overflow-tooltip>
  119. <template slot-scope="scope">
  120. <span>{{ scope.row.payId | empty(scope.row.payId) }}</span>
  121. </template>
  122. </el-table-column>
  123. <!-- 流量订单 -->
  124. <span v-if="form.searchType === '2'">
  125. <el-table-column label="生效状态" prop="flowStatus" key="flowStatus" align="center" :formatter="flowFormatter" />
  126. <el-table-column label="生效时间" key="effectTime" align="center" show-overflow-tooltip>
  127. <template slot-scope="scope">
  128. <span>{{
  129. scope.row.effectTime | empty(scope.row.effectTime)
  130. }}</span>
  131. </template>
  132. </el-table-column>
  133. </span>
  134. </el-table>
  135. <pagination v-show="total > 0" :total="total" :page.sync="form.pageNum" :limit.sync="form.pageSize"
  136. @pagination="getList" />
  137. <!-- 弹窗 -->
  138. <el-dialog :visible.sync="dialogVisible" title="导出历史" width="1000px">
  139. <el-table :data="dialogTable" v-loading="dialogLoading">
  140. <el-table-column type="index" label="序号" align="center" />
  141. <el-table-column label="任务ID" prop="msgId" align="center" />
  142. <el-table-column label="任务名称" prop="jobName" align="center" />
  143. <el-table-column label="任务类型" prop="jobType" align="center" />
  144. <el-table-column label="导出时间" prop="updateTime" align="center" />
  145. <el-table-column label="操作人" prop="useName" align="center" />
  146. <el-table-column label="操作" align="center">
  147. <template slot-scope="scope">
  148. <el-button type="text" @click="getDownLoad(scope.row)">下载</el-button>
  149. </template>
  150. </el-table-column>
  151. </el-table>
  152. <pagination v-show="dialogTotal > 0" :total="dialogTotal" :page.sync="dialogForm.pageNum"
  153. :limit.sync="dialogForm.pageSize" @pagination="getDialogList" />
  154. </el-dialog>
  155. </div>
  156. </template>
  157. <script>
  158. import { list as sceneList } from "@/api/operation/scene";
  159. import { dialogList, download, downLoadHistory, list } from "@/api/order/list";
  160. import {
  161. payTypeMixin,
  162. platformMixin,
  163. serviceTimeMixin,
  164. systemMixin,
  165. } from "@/mixin/index";
  166. export default {
  167. name:"OrderList",
  168. mixins: [payTypeMixin, systemMixin, serviceTimeMixin, platformMixin],
  169. data() {
  170. return {
  171. // 遮罩层
  172. loading: false,
  173. dialogLoading: false,
  174. // 表单
  175. form: {
  176. pageNum: 1,
  177. pageSize: 10,
  178. searchType: this.$route.query.searchType,
  179. },
  180. // 列表
  181. tableData: [],
  182. // 总数据
  183. total: 0,
  184. // 弹窗
  185. dialogVisible: false,
  186. // 弹窗表单
  187. dialogForm: {
  188. pageNum: 1,
  189. pageSize: 10,
  190. searchType: this.$route.query.searchType,
  191. },
  192. // 弹窗列表
  193. dialogTable: [],
  194. // 历史数据
  195. dialogTotal: 0,
  196. // 支付方式
  197. payOptions: [
  198. {
  199. value: 1,
  200. label: "微信",
  201. },
  202. {
  203. value: 2,
  204. label: "支付宝",
  205. },
  206. {
  207. value: 6,
  208. label: "系统赠送",
  209. },
  210. {
  211. value: 7,
  212. label: "后台手动赠送",
  213. },
  214. ],
  215. // 支付状态
  216. statusOptions: [
  217. {
  218. value: 2,
  219. label: "支付成功",
  220. },
  221. {
  222. value: 3,
  223. label: "支付失败",
  224. },
  225. ],
  226. // 栏目
  227. sceneOptions: [],
  228. // 生效状态
  229. flowOptions: [
  230. {
  231. value: 0,
  232. label: "已生效",
  233. },
  234. {
  235. value: 1,
  236. label: "待生效",
  237. },
  238. {
  239. value: 2,
  240. label: "已失效",
  241. },
  242. ],
  243. // 订单内容类型
  244. goodsTypeOptions: [
  245. {
  246. value: 4,
  247. label: "播客专辑",
  248. },
  249. {
  250. value: 17,
  251. label: "歌单",
  252. },
  253. ],
  254. // 时间搜索不超过1个月
  255. selectDate: "",
  256. pickerOptions: {
  257. onPick: ({ maxDate, minDate }) => {
  258. this.selectDate = minDate.getTime();
  259. if (maxDate) {
  260. this.selectDate = "";
  261. }
  262. },
  263. disabledDate: (time) => {
  264. if (this.selectDate !== "") {
  265. const one = 30 * 24 * 3600 * 1000;
  266. const minTime = this.selectDate - one;
  267. const maxTime = this.selectDate + one;
  268. return time.getTime() < minTime || time.getTime() > maxTime;
  269. }
  270. },
  271. },
  272. };
  273. },
  274. mounted() {
  275. this.getScene();
  276. this.getList();
  277. this.getPlatform({});
  278. this.payOptions.push(
  279. this.form.searchType === "3"
  280. ? {
  281. value: 3,
  282. label: "苹果支付",
  283. }
  284. : {
  285. value: 4,
  286. label: "猫币支付",
  287. }
  288. );
  289. },
  290. methods: {
  291. // 列表
  292. getList() {
  293. this.loading = true;
  294. list(this.form).then((res) => {
  295. if (res.code === 0) {
  296. this.tableData = res.data.records;
  297. this.tableData.forEach((item) => {
  298. if (item.platformId === 0) {
  299. item.platformId = null;
  300. }
  301. });
  302. this.total = res.data.total;
  303. this.loading = false;
  304. }
  305. });
  306. },
  307. // 搜索
  308. getSearch() {
  309. this.form.pageNum = 1;
  310. this.getList();
  311. },
  312. // 重置
  313. getRefresh() {
  314. this.form = {
  315. pageNum: 1,
  316. pageSize: 10,
  317. searchType: this.$route.query.searchType,
  318. };
  319. this.getList();
  320. },
  321. // 导出
  322. handleExport() {
  323. download(this.form).then((res) => {
  324. if (res.code === 0) {
  325. this.$message.success(`${res.data}`);
  326. }
  327. });
  328. },
  329. // 弹窗
  330. getDialog() {
  331. this.dialogVisible = true;
  332. this.getDialogList();
  333. },
  334. // 历史列表
  335. getDialogList() {
  336. this.dialogLoading = true;
  337. dialogList(this.dialogForm).then((res) => {
  338. if (res.code === 0) {
  339. this.dialogTable = res.data.records;
  340. this.dialogTotal = res.data.total;
  341. this.dialogLoading = false;
  342. }
  343. });
  344. },
  345. // 历史下载
  346. getDownLoad(row) {
  347. this.$confirm(`是否下载${row.jobName}?`, "提示", {
  348. type: "warning",
  349. })
  350. .then(() => {
  351. downLoadHistory(row.msgId).then((res) => {
  352. if (res.code === 0) {
  353. this.$message.success("下载成功!");
  354. window.location.href = res.data;
  355. this.getDialogList();
  356. }
  357. });
  358. })
  359. .catch(() => { });
  360. },
  361. // 栏目
  362. getScene() {
  363. sceneList().then((res) => {
  364. if (res.code === 0) {
  365. res.data.map((i) => {
  366. this.sceneOptions.push({
  367. value: i.id,
  368. label: i.name,
  369. });
  370. });
  371. }
  372. });
  373. },
  374. // 字典翻译
  375. payTypeFormatter(row) {
  376. return this.selectDictLabel(this.payOptions, row.payType);
  377. },
  378. statusFormatter(row) {
  379. return this.selectDictLabel(this.statusOptions, row.status);
  380. },
  381. groupFormatter(row) {
  382. return row.groupId === null
  383. ? "-"
  384. : this.selectDictLabel(this.sceneOptions, row.groupId);
  385. },
  386. chargingFormatter(row) {
  387. return this.selectDictLabel(this.payTypeOptions, row.charging);
  388. },
  389. platformFormatter(row) {
  390. return this.selectDictLabel(this.systemOptions, row.platform);
  391. },
  392. platformIdFormatter(row) {
  393. return row.platformId === null
  394. ? "-"
  395. : this.selectDictLabel(this.platformOptions, row.platformId);
  396. },
  397. flowFormatter(row) {
  398. return row.flowStatus === null
  399. ? "-"
  400. : this.selectDictLabel(this.flowOptions, row.flowStatus);
  401. },
  402. amountFormatter(row) {
  403. return row.amount.toFixed(2);
  404. },
  405. timeFormatter(row) {
  406. return this.selectDictLabel(this.serviceTimeOptions, row.expirationTime);
  407. },
  408. goodsTypeFormatter(row) {
  409. return this.selectDictLabel(this.goodsTypeOptions, row.goodsType);
  410. },
  411. },
  412. // 过滤器
  413. filters: {
  414. empty(row) {
  415. return !row ? "-" : row;
  416. },
  417. },
  418. };
  419. </script>