CardRuleManage.vue 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. <template>
  2. <div class="card-rule-manage">
  3. <div class="part-box part-box-filter part-box-flex">
  4. <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
  5. <template v-if="checkPrivilege('condition', 'condition')">
  6. <el-form-item label="规则名称:">
  7. <el-input
  8. style="width: 142px"
  9. v-model.trim="filter.name"
  10. placeholder="规则名称"
  11. clearable
  12. ></el-input>
  13. </el-form-item>
  14. <el-form-item label="创建时间:">
  15. <el-date-picker
  16. v-model="createTime"
  17. type="datetimerange"
  18. :picker-options="pickerOptions"
  19. range-separator="至"
  20. start-placeholder="创建开始时间"
  21. end-placeholder="创建结束时间"
  22. value-format="timestamp"
  23. align="right"
  24. unlink-panels
  25. >
  26. </el-date-picker>
  27. </el-form-item>
  28. <el-form-item label="启用/禁用:" label-width="90px">
  29. <el-select
  30. v-model="filter.enable"
  31. style="width: 120px"
  32. placeholder="启用/禁用"
  33. clearable
  34. >
  35. <el-option
  36. v-for="(val, key) in ABLE_TYPE"
  37. :key="key"
  38. :value="key * 1"
  39. :label="val"
  40. ></el-option>
  41. </el-select>
  42. </el-form-item>
  43. </template>
  44. <el-form-item>
  45. <el-button
  46. v-if="checkPrivilege('button', 'select')"
  47. type="primary"
  48. @click="toPage(1)"
  49. >查询</el-button
  50. >
  51. </el-form-item>
  52. </el-form>
  53. <div class="part-box-action">
  54. <el-button
  55. v-if="checkPrivilege('button', 'add')"
  56. type="primary"
  57. icon="el-icon-circle-plus-outline"
  58. @click="toAdd"
  59. >添加</el-button
  60. >
  61. </div>
  62. </div>
  63. <div class="part-box part-box-pad">
  64. <el-table ref="TableList" :data="rules">
  65. <el-table-column
  66. type="index"
  67. label="序号"
  68. width="70"
  69. :index="indexMethod"
  70. ></el-table-column>
  71. <el-table-column
  72. prop="name"
  73. label="题卡规则名称"
  74. min-width="200"
  75. ></el-table-column>
  76. <el-table-column prop="remark" label="备注">
  77. <span slot-scope="scope">{{
  78. scope.row.remark | defaultFieldFilter
  79. }}</span>
  80. </el-table-column>
  81. <el-table-column prop="enable" label="启用/禁用" width="100">
  82. <template slot-scope="scope">
  83. {{ scope.row.enable | enableFilter }}
  84. </template>
  85. </el-table-column>
  86. <el-table-column prop="createTime" label="创建时间" width="170">
  87. <span slot-scope="scope">{{
  88. scope.row.createTime | timestampFilter
  89. }}</span>
  90. </el-table-column>
  91. <el-table-column class-name="action-column" label="操作" width="180">
  92. <template slot-scope="scope">
  93. <el-button
  94. v-if="checkPrivilege('link', 'preview')"
  95. class="btn-primary"
  96. type="text"
  97. @click="toDetail(scope.row)"
  98. >预览</el-button
  99. >
  100. <el-button
  101. v-if="checkPrivilege('link', 'edit')"
  102. class="btn-primary"
  103. type="text"
  104. @click="toEdit(scope.row)"
  105. >编辑</el-button
  106. >
  107. <el-button
  108. v-if="checkPrivilege('link', 'delete')"
  109. class="btn-danger"
  110. type="text"
  111. @click="toDelete(scope.row)"
  112. >删除</el-button
  113. >
  114. <el-button
  115. v-if="checkPrivilege('link', 'enable')"
  116. :class="scope.row.enable ? 'btn-danger' : 'btn-primary'"
  117. type="text"
  118. @click="toEnable(scope.row)"
  119. >{{ scope.row.enable ? "禁用" : "启用" }}</el-button
  120. >
  121. </template>
  122. </el-table-column>
  123. </el-table>
  124. <div class="part-page">
  125. <el-pagination
  126. background
  127. layout="total, sizes, prev, pager, next, jumper"
  128. :pager-count="5"
  129. :current-page="current"
  130. :total="total"
  131. :page-size="size"
  132. @current-change="toPage"
  133. @size-change="pageSizeChange"
  134. >
  135. </el-pagination>
  136. </div>
  137. </div>
  138. <!-- ModifyCardRule -->
  139. <modify-card-rule
  140. ref="ModifyCardRule"
  141. :instance="curRule"
  142. :edit-type="editType"
  143. @modified="getList"
  144. ></modify-card-rule>
  145. </div>
  146. </template>
  147. <script>
  148. import { ABLE_TYPE } from "@/constants/enumerate";
  149. import {
  150. examRuleDetail,
  151. cardRuleListPage,
  152. ableCardRule,
  153. deleteCardRule,
  154. } from "../api";
  155. import { getEnums } from "../../login/api";
  156. import pickerOptions from "@/constants/datePickerOptions";
  157. import ModifyCardRule from "../components/ModifyCardRule";
  158. export default {
  159. name: "card-rule-manage",
  160. components: {
  161. ModifyCardRule,
  162. },
  163. data() {
  164. return {
  165. filter: {
  166. enable: null,
  167. name: "",
  168. createStartTime: null,
  169. createEndTime: null,
  170. },
  171. current: 1,
  172. size: this.GLOBAL.pageSize,
  173. total: 0,
  174. rules: [],
  175. examRule: {},
  176. curRule: {},
  177. editType: "ADD",
  178. cardRequiredFields: [],
  179. cardExtendFields: [],
  180. ABLE_TYPE,
  181. // date-picker
  182. createTime: [],
  183. pickerOptions,
  184. };
  185. },
  186. mounted() {
  187. this.getList();
  188. this.getExamRule();
  189. },
  190. methods: {
  191. async getExamRule() {
  192. if (!this.checkPrivilege("button", "add")) return;
  193. const examRequiredFields = await getEnums("REQUIRED_FIELDS");
  194. this.cardRequiredFields = await getEnums("CARD_REQUIRED_FIELDS");
  195. const cardRequiredFieldCodes = this.cardRequiredFields.map(
  196. (item) => item.code
  197. );
  198. const extendFields = examRequiredFields
  199. .filter((field) => !cardRequiredFieldCodes.includes(field.code))
  200. .map((item) => {
  201. return {
  202. code: item.code,
  203. name: item.name,
  204. };
  205. });
  206. let examRule = await examRuleDetail();
  207. if (!examRule) {
  208. this.$notify.error({
  209. title: "错误",
  210. message: "请先设置通用考务规则配置",
  211. });
  212. return;
  213. }
  214. this.examRule = examRule;
  215. this.cardExtendFields = [
  216. ...extendFields,
  217. ...JSON.parse(examRule.extendFields).filter((item) => item.enable),
  218. ];
  219. },
  220. async getList() {
  221. if (!this.checkPrivilege("list", "list")) return;
  222. const datas = {
  223. ...this.filter,
  224. pageNumber: this.current,
  225. pageSize: this.size,
  226. };
  227. if (this.createTime) {
  228. datas.createStartTime = this.createTime[0];
  229. datas.createEndTime = this.createTime[1];
  230. }
  231. if (datas.enable !== null && datas.enable !== "")
  232. datas.enable = !!datas.enable;
  233. const data = await cardRuleListPage(datas);
  234. this.rules = data.records;
  235. this.total = data.total;
  236. },
  237. toPage(page) {
  238. this.current = page;
  239. this.getList();
  240. },
  241. toAdd() {
  242. this.curRule = {
  243. fillNumber: this.examRule.examNumberDigit,
  244. requiredFields: this.cardRequiredFields.map((item) => {
  245. return {
  246. code: item.code,
  247. name: item.name,
  248. enable: true,
  249. };
  250. }),
  251. extendFields: this.cardExtendFields.map((item) => {
  252. return {
  253. code: item.code,
  254. name: item.name,
  255. enable: false,
  256. };
  257. }),
  258. };
  259. this.editType = "ADD";
  260. this.$refs.ModifyCardRule.open();
  261. },
  262. toEdit(row) {
  263. this.curRule = row;
  264. this.editType = "EDIT";
  265. this.$refs.ModifyCardRule.open();
  266. },
  267. toDetail(row) {
  268. // this.curRule = row;
  269. // this.editType = "PREVIEW";
  270. // this.$refs.ModifyCardRule.open();
  271. window.open(
  272. this.getRouterPath({
  273. name: "CardRulePreview",
  274. params: {
  275. cardRuleId: row.id,
  276. },
  277. })
  278. );
  279. },
  280. toEnable(row) {
  281. const action = row.enable ? "禁用" : "启用";
  282. this.$confirm(`确定要${action}题卡规则【${row.name}】吗?`, "提示", {
  283. type: "warning",
  284. })
  285. .then(async () => {
  286. const enable = !row.enable;
  287. await ableCardRule({
  288. id: row.id,
  289. enable,
  290. });
  291. row.enable = enable;
  292. this.$message.success("操作成功!");
  293. })
  294. .catch(() => {});
  295. },
  296. async toDelete(row) {
  297. const confirm = await this.$confirm(
  298. `确定要删除题卡规则【${row.name}】吗?`,
  299. "提示",
  300. {
  301. type: "warning",
  302. }
  303. ).catch(() => {});
  304. if (confirm !== "confirm") return;
  305. await deleteCardRule(row.id);
  306. this.$message.success("删除成功!");
  307. this.deletePageLastItem();
  308. },
  309. },
  310. };
  311. </script>