refundRecord.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. <template>
  2. <div class="container payment-records-container">
  3. <div class="dataReport-top">
  4. <span v-for="item in tabsList" :key="item.key" :class="tabs_index == item.key ? 'tab_active' : ''" @click="tabActive(item)">{{ item.lable }}</span>
  5. </div>
  6. <el-card>
  7. <div class="select-box">
  8. <el-date-picker
  9. style="margin-bottom: 20px; margin-right: 20px; width: 300px"
  10. v-model="timeRange"
  11. type="daterange"
  12. @change="handleSelectChange"
  13. value-format="yyyy-MM-dd"
  14. range-separator="至"
  15. start-placeholder="开始日期"
  16. end-placeholder="结束日期"
  17. >
  18. </el-date-picker>
  19. <el-cascader
  20. v-model="sales"
  21. placeholder="所属销售"
  22. style="width: 220px; margin: 0 20px 20px 0"
  23. :options="salesArr"
  24. :props="defaultSalesProps"
  25. :show-all-levels="false"
  26. collapse-tags
  27. clearable
  28. filterable
  29. @change="handleSelectChange"
  30. >
  31. </el-cascader>
  32. <el-select v-if="tabs_index != 3" @change="handleSelectChange" style="margin-right: 20px; width: 220px" v-model="payInfo" placeholder="付款项目" clearable>
  33. <el-option v-for="item in paymentProjectList" :key="item" :label="item" :value="item"> </el-option>
  34. </el-select>
  35. <el-select @change="handleSelectChange" style="margin-right: 20px; width: 220px" v-model="paymentType" placeholder="支付渠道" clearable>
  36. <el-option v-for="item in paymentTypeList" :key="item.key" :label="item.lable" :value="item.key"> </el-option>
  37. </el-select>
  38. <el-cascader
  39. v-model="salesRai"
  40. placeholder="推荐人"
  41. style="width: 220px; margin: 0 20px 20px 0"
  42. :options="salesArrRai"
  43. :props="defaultSalesProps"
  44. :show-all-levels="false"
  45. collapse-tags
  46. clearable
  47. filterable
  48. @change="handleSelectChange"
  49. >
  50. </el-cascader>
  51. <el-select @change="handleSelectChange" style="margin-right: 20px; width: 220px" v-model="payStatus" placeholder="退款状态" clearable>
  52. <el-option v-for="item in payStatusList" :key="item.key" :label="item.lable" :value="item.key"> </el-option>
  53. </el-select>
  54. <el-input @input="handleSelectChange" style="margin-right: 20px; width: 220px; margin-bottom: 20px" prefix-icon="el-icon-search" v-model="orderNumber" placeholder="请输入退款单号" />
  55. <el-input @input="handleSelectChange" style="width: 220px; margin-bottom: 20px" prefix-icon="el-icon-search" v-model="keyWord" placeholder="请输入姓名/手机号" />
  56. </div>
  57. <el-table :data="tableOrderData" style="width: 100%" border>
  58. <el-table-column align="center" v-for="item in tableColums" :key="item.key" :prop="item.key" :label="item.label" :width="item.widthsty">
  59. <template slot-scope="{ row }">
  60. <span @click="handleRowClick(row, item.key)" :style="handleRowStyle(row, item.key)">{{ handleRowContent(row, item.key) }}</span>
  61. </template>
  62. </el-table-column>
  63. <el-table-column label="操作" align="center" width="80">
  64. <template slot-scope="{ row }">
  65. <span class="editsty" v-if="row.OrderStatus == 2" @click="closeRefundHandler(row)">关闭退款</span>
  66. <span class="editsty" v-if="row.RefundRemark" @click="refundHandler(row)">退款原因</span>
  67. </template>
  68. </el-table-column>
  69. </el-table>
  70. <!-- 页数选择器 -->
  71. <m-page :page_no="page_no" :pageSize="page_size" :total="total" style="margin: 20px 0" @handleCurrentChange="pageChange" />
  72. </el-card>
  73. <el-dialog center v-dialogDrag title="退款原因" :visible.sync="dialogVisible" append-to-body width="30%" :before-close="handleClose">
  74. <div style="margin-bottom: 30px">
  75. {{ refundTextarea }}
  76. </div>
  77. </el-dialog>
  78. </div>
  79. </template>
  80. <script>
  81. import { contractInterface, customInterence } from "@/api/api.js";
  82. import { tableColums } from "./components/tableColums.js";
  83. import mPage from "@/components/mPage.vue";
  84. export default {
  85. name: "",
  86. components: {
  87. mPage,
  88. },
  89. props: {},
  90. data() {
  91. return {
  92. tabsList: [
  93. { lable: "畅读卡订单", key: 1 },
  94. { lable: "单场付费订单", key: 2 },
  95. { lable: "活动回放订单", key: 3 },
  96. ],
  97. paymentProjectList: ["上市公司小范围", "专家调研", "买方交流"],
  98. tabs_index: 1,
  99. timeRange: [], // 时间筛选
  100. sales: [],
  101. payStatusList: [
  102. { lable: "退款异常", key: 5 },
  103. { lable: "退款成功", key: 3 },
  104. { lable: "退款处理中", key: 4 },
  105. { lable: "退款关闭", key: 6 },
  106. ],
  107. salesArr: [], //销售
  108. salesRai: [],
  109. salesArrRai: [], //销售
  110. paymentType: "",
  111. paymentTypeList: [
  112. { lable: "小程序", key: 1 },
  113. { lable: "PC", key: 2 },
  114. { lable: "H5", key: 3 },
  115. ],
  116. defaultSalesProps: {
  117. multiple: true,
  118. label: "RealName",
  119. children: "ChildrenList",
  120. value: "AdminId",
  121. }, //销售级联配置
  122. payStatus: "", //支付状态
  123. payInfo: "", //付款项目
  124. orderNumber: "", //订单号
  125. keyWord: "",
  126. tableColums: [],
  127. tableOrderData: [],
  128. total: 0,
  129. page_no: 1,
  130. page_size: 10,
  131. dialogVisible: false, // 退款的弹框
  132. refundTextarea: "", // 退款原因
  133. orderRefundCode: "",
  134. };
  135. },
  136. computed: {},
  137. watch: {},
  138. created() {},
  139. mounted() {
  140. this.getSale();
  141. this.getSaleRai();
  142. this.getOrderRefundList();
  143. this.tableColums = tableColums(1);
  144. },
  145. methods: {
  146. /* 获取权益销售 */
  147. getSaleRai() {
  148. customInterence.getSalesRaiData().then((res) => {
  149. if (res.Ret === 200) {
  150. this.salesArrRai = res.Data.List;
  151. }
  152. });
  153. },
  154. // 修改页码
  155. pageChange(page_no) {
  156. this.page_no = page_no;
  157. this.getOrderRefundList();
  158. },
  159. /* 获取销售 */
  160. getSale() {
  161. customInterence.getSale().then((res) => {
  162. if (res.Ret === 200) {
  163. this.salesArr = res.Data.List;
  164. }
  165. });
  166. },
  167. // 获取数据
  168. async getOrderRefundList() {
  169. let salesArr = [];
  170. if (this.sales.length) {
  171. salesArr = this.sales.map((item) => {
  172. return item[item.length - 1];
  173. });
  174. }
  175. let salesArrRai = [];
  176. if (this.salesRai.length) {
  177. salesArrRai = this.salesRai.map((item) => {
  178. return item[item.length - 1];
  179. });
  180. }
  181. const res = await contractInterface.orderRefundList({
  182. PageSize: this.page_size,
  183. CurrentIndex: this.page_no,
  184. AdminId: salesArr.join(","),
  185. StartDate: this.timeRange && this.timeRange.length ? this.timeRange[0] : "",
  186. EndDate: this.timeRange && this.timeRange.length ? this.timeRange[1] : "",
  187. OrderType: this.tabs_index,
  188. PaymentProject: this.payInfo,
  189. OrderCode: this.orderNumber,
  190. KeyWord: this.keyWord,
  191. OrderStatus: this.payStatus,
  192. ShareId: salesArrRai.join(","),
  193. PaymentType: this.paymentType,
  194. });
  195. if (res.Ret === 200) {
  196. this.tableOrderData = res.Data.List;
  197. this.total = res.Data.Paging.Totals || 0;
  198. }
  199. },
  200. tabActive(item) {
  201. if (this.tabs_index == item.key) return;
  202. this.tableColums = tableColums(item.key);
  203. this.tabs_index = item.key;
  204. this.handleSelectChange();
  205. },
  206. // 所有筛选的改变
  207. handleSelectChange() {
  208. this.page_no = 1;
  209. this.getOrderRefundList();
  210. },
  211. // 表格三件套
  212. // 表格点击了
  213. handleRowClick(row, key) {
  214. if (key == "CompanyName" && row.CompanyId != 1) {
  215. this.$router.replace({
  216. path: "/customDetail",
  217. query: {
  218. id: row.CompanyId,
  219. },
  220. });
  221. } else if (key == "SourceTitle") {
  222. window.open(row.HttpUrl, "_blank");
  223. }
  224. },
  225. // 表格样式
  226. handleRowStyle(row, key) {
  227. let styleColor = {
  228. Title: "color: #409eff; cursor: pointer",
  229. CompanyName: row.CompanyId == 1 ? "" : "color: #409eff; cursor: pointer",
  230. SourceTitle: "color: #409eff; cursor: pointer",
  231. };
  232. return styleColor[key] ? styleColor[key] : "";
  233. },
  234. // 文本是否需要处理
  235. handleRowContent(row, key) {
  236. if (key == "StartDate") return `${row["StartDate"]} ~ ${row["EndDate"]}`;
  237. if (key == "OrderStatus") return row[key] == 0 ? "已取消" : row[key] == 1 ? "待支付" : row[key] == 2 ? "已支付" : row[key] == 3 ? "已退款" : "";
  238. return row[key];
  239. },
  240. // 点击了退款按钮
  241. refundHandler(row) {
  242. this.refundTextarea = row.RefundRemark;
  243. this.dialogVisible = true;
  244. },
  245. // 关闭了退款弹框
  246. handleClose() {
  247. this.refundTextarea = "";
  248. this.dialogVisible = false;
  249. },
  250. // 关闭退款
  251. closeRefundHandler(row) {
  252. this.$confirm("确定要关闭这笔退款吗?", "关闭退款", {
  253. confirmButtonText: "确定",
  254. cancelButtonText: "取消",
  255. type: "warning",
  256. })
  257. .then(() => {
  258. contractInterface
  259. .refundRevokeOrder({
  260. OrderCode: row.OrderCode,
  261. })
  262. .then(() => {
  263. this.getOrderRefundList();
  264. this.$message({
  265. type: "success",
  266. message: "操作成功!",
  267. });
  268. });
  269. })
  270. .catch(() => {});
  271. },
  272. // 退款的确认弹框
  273. async refundDialogHandlerVisible() {
  274. if (!this.refundTextarea) return this.$message.warning("退款原因不能为空");
  275. // 等待接口
  276. const res = await contractInterface.orderRefund({
  277. OrderCode: this.orderRefundCode,
  278. Remark: this.refundTextarea,
  279. });
  280. if (res.Ret === 200) {
  281. this.$message.success("操作成功");
  282. this.handleClose();
  283. }
  284. },
  285. },
  286. };
  287. </script>
  288. <style scoped lang="scss">
  289. .payment-records-container {
  290. .dataReport-top {
  291. display: flex;
  292. align-items: center;
  293. border: 1px solid #ececec;
  294. padding: 20px 30px;
  295. background: #fff;
  296. border-radius: 4px;
  297. box-shadow: 0 3px 6px rgba(0, 0, 0, 0.05);
  298. margin-bottom: 20px;
  299. .tab_active {
  300. background-color: #409eff;
  301. color: #fff;
  302. }
  303. span {
  304. display: inline-block;
  305. box-sizing: border-box;
  306. padding: 0 24px;
  307. line-height: 38px;
  308. height: 40px;
  309. background: #ecf5ff;
  310. border: 1px solid #b3d8ff;
  311. opacity: 1;
  312. font-weight: 500;
  313. font-size: 16px;
  314. color: #409eff;
  315. border-radius: 4px;
  316. margin-right: 30px;
  317. cursor: pointer;
  318. }
  319. }
  320. .select-box {
  321. /deep/ .el-input {
  322. margin-bottom: 20px;
  323. }
  324. }
  325. }
  326. </style>