setMemberList.vue 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. <template>
  2. <div>
  3. <save-form
  4. :inline="true"
  5. class="searchForm"
  6. @submit="onSearch"
  7. @reset="onReSet"
  8. ref="saveForm"
  9. save-key="studentLit-memberChange"
  10. :model.sync="searchForm"
  11. >
  12. <el-form-item prop="memberRankSettingId">
  13. <el-cascader
  14. v-model.trim="searchForm.memberRankSettingId"
  15. :options="memberRankList"
  16. :props="{ value: 'id', label: 'name' }"
  17. :show-all-levels="false"
  18. collapse-tags
  19. clearable
  20. placeholder="请选择学练宝版本"
  21. ></el-cascader>
  22. </el-form-item>
  23. <el-form-item prop="buyType">
  24. <el-select
  25. class="multiple"
  26. v-model.trim="searchForm.buyType"
  27. clearable
  28. placeholder="请选择变更方式"
  29. >
  30. <el-option label="自行购买" value="1"></el-option>
  31. <el-option label="后台添加" value="2"></el-option>
  32. <el-option label="后台扣减" value="3"></el-option>
  33. </el-select>
  34. </el-form-item>
  35. <el-form-item prop="operatorName">
  36. <el-input
  37. clearable
  38. placeholder="请输入操作人"
  39. @keydown.enter.native="
  40. e => {
  41. e.target.blur();
  42. $refs.saveForm.save();
  43. onSearch();
  44. }
  45. "
  46. v-model.trim="searchForm.operatorName"
  47. ></el-input>
  48. </el-form-item>
  49. <el-form-item prop="timer">
  50. <el-date-picker
  51. :clearable="false"
  52. v-model.trim="searchForm.timer"
  53. style="width: 420px"
  54. type="daterange"
  55. clearable
  56. value-format="yyyy-MM-dd"
  57. range-separator="至"
  58. start-placeholder="开始日期"
  59. end-placeholder="结束日期"
  60. :picker-options="{
  61. firstDayOfWeek: 1
  62. }"
  63. >
  64. </el-date-picker>
  65. </el-form-item>
  66. <el-form-item>
  67. <el-button native-type="submit" type="primary">搜索</el-button>
  68. <el-button native-type="reset" type="danger">重置</el-button>
  69. </el-form-item>
  70. </save-form>
  71. <el-button
  72. @click="operationTimer('add')"
  73. type="primary"
  74. style="margin-bottom: 20px"
  75. v-if="$helpers.permission('studentManage/updateStudentMember')"
  76. >
  77. 添加时长
  78. </el-button>
  79. <el-button
  80. @click="operationTimer('plus')"
  81. type="default"
  82. style="margin-bottom: 20px"
  83. v-if="$helpers.permission('studentManage/updateStudentMember')"
  84. >
  85. 扣减时长
  86. </el-button>
  87. <div class="tableWrap">
  88. <el-table
  89. style="width: 100%"
  90. :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
  91. :data="tableList"
  92. >
  93. <el-table-column
  94. align="center"
  95. prop="buyType"
  96. label="变更方式"
  97. >
  98. <template slot-scope="scope">
  99. {{ scope.row.buyType | filterBuyType }}
  100. </template>
  101. </el-table-column>
  102. <el-table-column
  103. align="center"
  104. prop="memberRankSettingName"
  105. label="学练宝版本"
  106. ></el-table-column>
  107. <el-table-column
  108. align="center"
  109. prop="type"
  110. label="周期"
  111. >
  112. <template slot-scope="scope">
  113. {{ scope.row.type | memberEnumType }}
  114. </template>
  115. </el-table-column>
  116. <el-table-column
  117. align="center"
  118. prop="time"
  119. label="数量"
  120. ></el-table-column>
  121. <el-table-column
  122. align="center"
  123. prop="operatorName"
  124. label="操作人"
  125. ></el-table-column>
  126. <el-table-column
  127. align="center"
  128. prop="createTime"
  129. label="添加时间"
  130. ></el-table-column>
  131. <el-table-column align="center" prop="activeDate" label="添加原因">
  132. <template slot-scope="scope">
  133. <Tooltip
  134. :content="
  135. scope.row.memo
  136. ? scope.row.memo
  137. : '--'
  138. "
  139. />
  140. </template>
  141. </el-table-column>
  142. </el-table>
  143. <pagination
  144. sync
  145. save-key="studentLit-memberChange"
  146. :total.sync="pageInfo.total"
  147. :page.sync="pageInfo.page"
  148. :limit.sync="pageInfo.limit"
  149. :page-sizes="pageInfo.page_size"
  150. @pagination="getList"
  151. />
  152. </div>
  153. <el-dialog
  154. :title="`${operationType === 'add' ? '添加': '扣减'}学练宝`"
  155. width="600px"
  156. :visible.sync="cloudDateVisible"
  157. append-to-body
  158. @close="() => {
  159. getList()
  160. getUserInfo()
  161. }"
  162. >
  163. <setMemberDate
  164. v-if="cloudDateVisible"
  165. :memberRankList="memberRankList"
  166. :type="operationType"
  167. :row="userDetail"
  168. @close="cloudDateVisible = false"
  169. @confirm="() => {
  170. getList()
  171. getUserInfo()
  172. }"
  173. ></setMemberDate>
  174. </el-dialog>
  175. </div>
  176. </template>
  177. <script>
  178. import setMemberDate from "./setMemberDate";
  179. import pagination from "@/components/Pagination/index";
  180. import Tooltip from "@/components/Tooltip";
  181. import { api_studentMemberUpdateLog, api_studentManageUserInfo } from "../api";
  182. import { getTimeFormat } from "@/utils";
  183. export default {
  184. props: ["row", "type", "memberRankList"],
  185. components: {
  186. pagination,
  187. Tooltip,
  188. setMemberDate
  189. },
  190. data() {
  191. return {
  192. userDetail: {},
  193. cloudDateVisible: false,
  194. searchForm: {
  195. memberRankSettingId: null,
  196. buyType: null,
  197. operatorName: null,
  198. timer: [],
  199. },
  200. tableList: [],
  201. pageInfo: {
  202. // 分页规则
  203. limit: 10, // 限制显示条数
  204. page: 1, // 当前页
  205. total: 0, // 总条数
  206. page_size: [10, 20, 40, 50] // 选择限制显示条数
  207. },
  208. operationType: 'add',
  209. };
  210. },
  211. mounted() {
  212. this.getUserInfo()
  213. this.getList()
  214. },
  215. methods: {
  216. async getUserInfo() {
  217. try {
  218. const { data } = await api_studentManageUserInfo({ userId: this.row.userId })
  219. this.userDetail = data;
  220. } catch {}
  221. },
  222. async getList() {
  223. try {
  224. const { timer, memberRankSettingId, ...more } = this.searchForm
  225. let rankId = null;
  226. if(memberRankSettingId && memberRankSettingId.length > 0) {
  227. rankId = memberRankSettingId[memberRankSettingId.length - 1]
  228. }
  229. let params = { ...more, ...getTimeFormat(timer, ["startTime", "endTime"]), userId: this.row.userId, memberRankSettingId: rankId };
  230. const { data } = await api_studentMemberUpdateLog(params)
  231. this.tableList = data.rows || []
  232. this.pageInfo.total = data.total || 0
  233. } catch {}
  234. },
  235. onSearch() {
  236. this.pageInfo.page = 1;
  237. this.getList();
  238. },
  239. onReSet() {
  240. this.$nextTick(() => {
  241. this.searchForm.timer = []
  242. this.onSearch();
  243. });
  244. },
  245. operationTimer(type) {
  246. this.operationType = type
  247. this.cloudDateVisible = true
  248. }
  249. },
  250. filters: {
  251. filterBuyType(type) {
  252. const template = {
  253. 1: '自行购买',
  254. 2: '后台添加',
  255. 3: '后台扣减',
  256. }
  257. return template[type]
  258. }
  259. }
  260. };
  261. </script>
  262. <style lang="scss" scoped>
  263. .title {
  264. margin-bottom: 30px;
  265. font-size: 16px;
  266. color: #000;
  267. }
  268. </style>