ModifyDatabaseSync.vue 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  1. <template>
  2. <div>
  3. <el-dialog
  4. class="modify-course"
  5. :visible.sync="modalIsShow"
  6. :title="title"
  7. top="10vh"
  8. width="700px"
  9. :close-on-click-modal="false"
  10. :close-on-press-escape="false"
  11. append-to-body
  12. @open="visibleChange"
  13. >
  14. <el-form
  15. ref="modalFormComp"
  16. :model="modalForm"
  17. :rules="rules"
  18. :key="modalForm.id"
  19. label-width="130px"
  20. >
  21. <el-form-item prop="semesterId" label="学期:">
  22. <el-select
  23. v-model="modalForm.semesterId"
  24. placeholder="学期"
  25. filterable
  26. :disabled="isEdit"
  27. @change="semesterChange"
  28. >
  29. <el-option
  30. v-for="item in semesterList"
  31. :key="item.id"
  32. :value="item.id"
  33. :label="item.name"
  34. >
  35. </el-option>
  36. </el-select>
  37. </el-form-item>
  38. <el-form-item prop="examId" label="考试:">
  39. <el-select
  40. v-model="modalForm.examId"
  41. placeholder="考试"
  42. filterable
  43. :disabled="isEdit"
  44. >
  45. <el-option
  46. v-for="item in examList"
  47. :key="item.id"
  48. :value="item.id"
  49. :label="item.name"
  50. >
  51. </el-option>
  52. </el-select>
  53. </el-form-item>
  54. <el-form-item label="学年(考务):">
  55. <el-input
  56. v-model.trim="modalForm.xn"
  57. placeholder="请输入学年(考务)"
  58. clearable
  59. ></el-input>
  60. </el-form-item>
  61. <el-form-item label="学期(考务):">
  62. <el-input
  63. v-model.trim="modalForm.xq"
  64. placeholder="请输入学期(考务)"
  65. clearable
  66. ></el-input>
  67. </el-form-item>
  68. <el-form-item label="考试名称(考务):">
  69. <el-input
  70. v-model.trim="modalForm.ksmc"
  71. placeholder="请输入考试名称(考务)"
  72. clearable
  73. ></el-input>
  74. </el-form-item>
  75. <el-form-item prop="dataType" label="同步数据类型:">
  76. <el-checkbox-group v-model="modalForm.dataType">
  77. <el-checkbox
  78. v-for="(val, key) in DATABASE_SYNC_TYPE"
  79. :key="key"
  80. :label="key"
  81. >{{ val }}</el-checkbox
  82. >
  83. </el-checkbox-group>
  84. </el-form-item>
  85. <el-form-item prop="startTime" label="同步开始时间:">
  86. <el-date-picker
  87. v-model="modalForm.startTime"
  88. type="datetime"
  89. value-format="timestamp"
  90. placeholder="选择时间"
  91. @change="() => timeChange('startTime')"
  92. >
  93. </el-date-picker>
  94. </el-form-item>
  95. <el-form-item prop="endTime" label="同步结束时间:">
  96. <el-date-picker
  97. v-model="modalForm.endTime"
  98. type="datetime"
  99. value-format="timestamp"
  100. placeholder="选择时间"
  101. @change="() => timeChange('endTime')"
  102. >
  103. </el-date-picker>
  104. </el-form-item>
  105. <el-form-item prop="cron" label="定时同步时间:">
  106. <el-input
  107. v-model.trim="modalForm.cron"
  108. placeholder="请输入定时同步时间"
  109. clearable
  110. ></el-input>
  111. <p class="tips-info">如:每天1点开始同步,0 0 1 * * ?</p>
  112. </el-form-item>
  113. <el-form-item prop="phoneNumber" label="同步异常预警:">
  114. <el-input
  115. v-model.trim="modalForm.phoneNumber"
  116. placeholder="请输入同步异常预警"
  117. clearable
  118. ></el-input>
  119. <p class="tips-info">支持填写多个手机号,用英文,隔开</p>
  120. </el-form-item>
  121. </el-form>
  122. <div slot="footer">
  123. <el-button type="primary" :disabled="isSubmit" @click="submit"
  124. >确认</el-button
  125. >
  126. <el-button @click="cancel">取消</el-button>
  127. </div>
  128. </el-dialog>
  129. </div>
  130. </template>
  131. <script>
  132. import { schoolSetDatabaseSyncUpdate } from "../../api";
  133. import { conditionListSemester, conditionListExam } from "../../../base/api";
  134. import { DATABASE_SYNC_TYPE } from "@/constants/enumerate";
  135. const initModalForm = {
  136. semesterId: "",
  137. examId: "",
  138. dataType: "",
  139. startTime: "",
  140. endTime: "",
  141. cron: "0 0 1 * * ?",
  142. phoneNumber: "",
  143. xn: "",
  144. xq: "",
  145. ksmc: "",
  146. };
  147. export default {
  148. name: "modify-database-sync",
  149. props: {
  150. instance: {
  151. type: Object,
  152. default() {
  153. return {};
  154. },
  155. },
  156. schoolId: {
  157. type: String,
  158. default: "",
  159. },
  160. },
  161. computed: {
  162. isEdit() {
  163. return !!this.instance.examId;
  164. },
  165. title() {
  166. return (this.isEdit ? "编辑" : "新增") + "同步记录";
  167. },
  168. },
  169. data() {
  170. return {
  171. modalIsShow: false,
  172. isSubmit: false,
  173. DATABASE_SYNC_TYPE,
  174. modalForm: { ...initModalForm },
  175. rules: {
  176. semesterId: [
  177. {
  178. required: true,
  179. message: "请选择学期",
  180. trigger: "change",
  181. },
  182. ],
  183. examId: [
  184. {
  185. required: true,
  186. message: "请选择考试",
  187. trigger: "change",
  188. },
  189. ],
  190. dataType: [
  191. {
  192. required: true,
  193. validator: (rule, value, callback) => {
  194. if (!value || !value.length) {
  195. return callback(new Error(`请选择同步数据类型`));
  196. }
  197. callback();
  198. },
  199. trigger: "change",
  200. },
  201. ],
  202. startTime: [
  203. {
  204. required: true,
  205. validator: (rule, value, callback) => {
  206. if (!value) {
  207. return callback(new Error(`请选择同步开始时间`));
  208. }
  209. if (this.modalForm.endTime && value >= this.modalForm.endTime) {
  210. return callback(new Error(`开始时间必须早于结束时间`));
  211. }
  212. callback();
  213. },
  214. trigger: "change",
  215. },
  216. ],
  217. endTime: [
  218. {
  219. required: true,
  220. validator: (rule, value, callback) => {
  221. if (!value) {
  222. return callback(new Error(`请选择同步结束时间`));
  223. }
  224. if (
  225. this.modalForm.startTime &&
  226. value <= this.modalForm.startTime
  227. ) {
  228. return callback(new Error(`结束时间必须晚于开始时间`));
  229. }
  230. callback();
  231. },
  232. trigger: "change",
  233. },
  234. ],
  235. cron: [
  236. {
  237. required: true,
  238. message: "请输入定时同步时间",
  239. trigger: "change",
  240. },
  241. ],
  242. phoneNumber: [
  243. {
  244. required: true,
  245. validator: (rule, value, callback) => {
  246. if (!value) {
  247. return callback(new Error(`请输入同步异常预警`));
  248. }
  249. const vals = value.split(",");
  250. const reg = /^1\d{10}$/;
  251. if (vals.some((val) => !reg.test(val))) {
  252. return callback(new Error(`内容中存在不合适的手机号码`));
  253. }
  254. callback();
  255. },
  256. trigger: "change",
  257. },
  258. ],
  259. },
  260. semesterList: [],
  261. examList: [],
  262. };
  263. },
  264. mounted() {
  265. this.getSemesters();
  266. },
  267. methods: {
  268. initData(val) {
  269. if (val.examId) {
  270. this.modalForm = this.$objAssign(initModalForm, val);
  271. this.modalForm.dataType = val.dataType ? val.dataType.split(",") : [];
  272. } else {
  273. this.modalForm = { ...initModalForm };
  274. this.modalForm.dataType = [];
  275. }
  276. this.getExams();
  277. },
  278. visibleChange() {
  279. this.initData(this.instance);
  280. },
  281. cancel() {
  282. this.modalIsShow = false;
  283. },
  284. open() {
  285. this.modalIsShow = true;
  286. },
  287. async getSemesters() {
  288. const res = await conditionListSemester(
  289. {},
  290. { headers: { schoolId: this.schoolId } }
  291. );
  292. this.semesterList = res || [];
  293. },
  294. async getExams() {
  295. if (!this.modalForm.semesterId) return;
  296. const res = await conditionListExam(
  297. { semesterId: this.modalForm.semesterId },
  298. { headers: { schoolId: this.schoolId } }
  299. );
  300. this.examList = res || [];
  301. },
  302. semesterChange() {
  303. this.examList = [];
  304. this.modalForm.examId = "";
  305. this.getExams();
  306. },
  307. timeChange(field) {
  308. const key = field === "startTime" ? "endTime" : "startTime";
  309. this.$refs.modalFormComp.validateField(key);
  310. },
  311. async submit() {
  312. const valid = await this.$refs.modalFormComp.validate().catch(() => {});
  313. if (!valid) return;
  314. if (this.isSubmit) return;
  315. this.isSubmit = true;
  316. const datas = {
  317. ...this.modalForm,
  318. schoolId: this.schoolId,
  319. dataType: this.modalForm.dataType.join(),
  320. };
  321. const res = await schoolSetDatabaseSyncUpdate(datas).catch(() => {});
  322. this.isSubmit = false;
  323. if (!res) return;
  324. this.$message.success(this.title + "成功!");
  325. this.$emit("modified");
  326. this.cancel();
  327. },
  328. },
  329. };
  330. </script>