chargingRecord.vue 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. <template>
  2. <div class="m-container">
  3. <h2>
  4. <div class="squrt"></div>
  5. 扣费记录
  6. </h2>
  7. <save-form
  8. :inline="true"
  9. class="searchForm"
  10. ref="searchForm"
  11. @submit="search"
  12. @reset="reset"
  13. :saveKey="'tenantTradeManager'"
  14. :model.sync="searchForm"
  15. >
  16. <el-form-item prop="search">
  17. <el-input
  18. placeholder="课程名/编号"
  19. clearable
  20. type="text"
  21. v-model.trim="searchForm.search"
  22. ></el-input>
  23. </el-form-item>
  24. <el-form-item prop="organId">
  25. <el-select
  26. class="multiple"
  27. v-model.trim="searchForm.organId"
  28. filterable
  29. multiple
  30. collapse-tags
  31. clearable
  32. placeholder="请选择分部"
  33. @change="onBranchChange"
  34. >
  35. <el-option
  36. v-for="(item, index) in organList"
  37. :key="index"
  38. :label="item.name"
  39. :value="item.id"
  40. ></el-option>
  41. </el-select>
  42. </el-form-item>
  43. <el-form-item prop="type">
  44. <el-select
  45. v-model.trim="searchForm.type"
  46. clearable
  47. filterable
  48. @clear="onClear('type')"
  49. placeholder="课程类型"
  50. >
  51. <el-option
  52. v-for="(item, index) in courseType"
  53. :key="index"
  54. :label="item.label"
  55. :value="item.value"
  56. ></el-option>
  57. </el-select>
  58. </el-form-item>
  59. <el-form-item prop="teacherId">
  60. <remote-search
  61. :commit="'setTeachers'"
  62. v-model="searchForm.teacherId"
  63. />
  64. </el-form-item>
  65. <el-form-item prop="status">
  66. <el-select
  67. v-model.trim="searchForm.status"
  68. clearable
  69. filterable
  70. @clear="onClear('status')"
  71. placeholder="课程状态"
  72. >
  73. <el-option
  74. v-for="(item, index) in courseStatus"
  75. :key="index"
  76. :label="item.label"
  77. :value="item.value"
  78. ></el-option>
  79. </el-select>
  80. </el-form-item>
  81. <el-form-item prop="deductState">
  82. <el-select
  83. v-model.trim="searchForm.deductState"
  84. clearable
  85. filterable
  86. @clear="onClear('deductState')"
  87. placeholder="扣费状态"
  88. >
  89. <el-option v-for="(item, key) of chargingStatus" :key="key" :label="item" :value="key"></el-option>
  90. </el-select>
  91. </el-form-item>
  92. <el-form-item prop="createTimer">
  93. <el-date-picker
  94. v-model.trim="searchForm.createTimer"
  95. type="daterange"
  96. value-format="yyyy-MM-dd"
  97. range-separator="至"
  98. start-placeholder="课程开始时间"
  99. end-placeholder="课程结束时间"
  100. :picker-options="{ firstDayOfWeek: 1 }"
  101. ></el-date-picker>
  102. </el-form-item>
  103. <el-form-item>
  104. <el-button native-type="submit" type="danger">搜索</el-button>
  105. <el-button native-type="reset" type="primary">重置</el-button>
  106. </el-form-item>
  107. </save-form>
  108. <!-- <div style="font-size: 14px; padding-bottom: 10px">
  109. 扣费总额:<span style="color: var(--color-primary)">1,000元</span>
  110. <i style="width: 10px; display: inline-block"></i>
  111. 冻结金额:<span style="color: var(--color-primary)">1,000元</span>
  112. </div> -->
  113. <!-- 列表 -->
  114. <div class="tableWrap">
  115. <el-table
  116. :data="tableList"
  117. :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
  118. >
  119. <el-table-column align="center" label="课程编号" prop="courseId">
  120. </el-table-column>
  121. <el-table-column align="center" label="所属分部" prop="organName">
  122. </el-table-column>
  123. <el-table-column align="center" label="课程类型" prop="type">
  124. <template slot-scope="scope">
  125. {{ scope.row.type | courseTypeFormat }}
  126. </template>
  127. </el-table-column>
  128. <!-- <el-table-column align="center" label="姓名" prop="tenantId">
  129. </el-table-column> -->
  130. <el-table-column align="center" label="老师" prop="teacherId">
  131. </el-table-column>
  132. <el-table-column align="center" label="课程人数" prop="studentNum">
  133. </el-table-column>
  134. <el-table-column align="center" label="课程时间">
  135. <template slot-scope="scope">
  136. {{ scope.row.classDate }}
  137. {{ scope.row.startClassTime }}~{{ scope.row.endClassTime }}
  138. </template>
  139. </el-table-column>
  140. <!-- <el-table-column align="center" label="网络教室剩余时长" prop="productName">
  141. </el-table-column> -->
  142. <el-table-column align="center" label="课程状态">
  143. <template slot-scope="scope">
  144. {{ scope.row.actualAmount | coursesStatus }}
  145. </template>
  146. </el-table-column>
  147. <el-table-column align="center" label="扣费状态">
  148. <template slot-scope="scope">
  149. {{ scope.row.deductState | chargingStatus }}
  150. </template>
  151. </el-table-column>
  152. <el-table-column align="center" label="冻结金额(元)">
  153. <template slot-scope="scope">
  154. {{ scope.row.amount | moneyFormat }}
  155. </template>
  156. </el-table-column>
  157. </el-table>
  158. <pagination
  159. :saveKey="'tenantTradeManager'"
  160. sync
  161. :total.sync="pageInfo.total"
  162. :page.sync="pageInfo.page"
  163. :limit.sync="pageInfo.limit"
  164. :page-sizes="pageInfo.page_size"
  165. @pagination="getList"
  166. />
  167. </div>
  168. <el-dialog title="订单详情" :visible.sync="orderVisible" width="1200px">
  169. <order-info />
  170. </el-dialog>
  171. </div>
  172. </template>
  173. <script>
  174. import pagination from "@/components/Pagination/index";
  175. import { tenantInfoQueryPage } from "../organManager/api";
  176. import { tenantCloudCourseRecord } from "./api";
  177. import { courseType, courseStatus } from "@/utils/searchArray";
  178. import { chargingStatus } from '@/constant'
  179. import OrderInfo from './model/orderInfo'
  180. import { getTimes } from "@/utils";
  181. const initSearch = {
  182. type: null,
  183. organId: null,
  184. type: null,
  185. teacherId: null,
  186. status: null,
  187. deductState: null,
  188. createTimer: [],
  189. };
  190. export default {
  191. components: { pagination, OrderInfo },
  192. data() {
  193. const baseTenantId = sessionStorage.getItem('baseTenantId')
  194. return {
  195. baseTenantId,
  196. courseType,
  197. courseStatus,
  198. chargingStatus,
  199. tableList: [],
  200. orderVisible: false,
  201. pageInfo: {
  202. // 分页规则
  203. limit: 10, // 限制显示条数
  204. page: 1, // 当前页
  205. total: 0, // 总条数
  206. page_size: [10, 20, 40, 50], // 选择限制显示条数
  207. },
  208. searchForm: { ...initSearch },
  209. tenantList: []
  210. };
  211. },
  212. async mounted() {
  213. await this.getTenant()
  214. this.getList();
  215. },
  216. methods: {
  217. async getTenant() {
  218. try {
  219. const res = await tenantInfoQueryPage({ page: 1, rows: 999 }, )
  220. this.tenantList = res.data?.rows || []
  221. } catch(e) {}
  222. },
  223. async getList() {
  224. try {
  225. let { createTimer, ...reset } = this.searchForm;
  226. const res = await tenantCloudCourseRecord({
  227. ...reset,
  228. ...getTimes(createTimer, ["startDate", "endDate"], "YYYY-MM-DD"),
  229. page: this.pageInfo.page,
  230. rows: this.pageInfo.limit,
  231. });
  232. this.pageInfo.total = res.total;
  233. this.tableList = res.rows;
  234. } catch (e) {}
  235. },
  236. search() {
  237. this.pageInfo.page = 1;
  238. this.$refs.searchForm.save(this.searchForm);
  239. this.$refs.searchForm.save(this.pageInfo, "page");
  240. this.getList();
  241. },
  242. reset() {
  243. this.searchForm = { ...initSearch };
  244. this.search();
  245. },
  246. openService(row) {
  247. this.orderVisible = true
  248. },
  249. },
  250. filters: {
  251. tenantOrderStatus(val) {
  252. const template = {
  253. 0: "待支付",
  254. 1: "已支付",
  255. 2: "支付失败"
  256. }
  257. return template[val]
  258. }
  259. }
  260. };
  261. </script>
  262. <style lang="scss" scoped>
  263. .courseMask .el-dialog__body {
  264. padding-bottom: 0;
  265. }
  266. </style>