index.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475
  1. <template>
  2. <div class="table-container">
  3. <vab-query-form>
  4. <vab-query-form-left-panel>
  5. <el-form
  6. ref="searchForm"
  7. :model="searchForm"
  8. :inline="true"
  9. @submit.native.prevent
  10. >
  11. <el-form-item>
  12. <el-input v-model="searchForm.name" placeholder="定时任务名称" />
  13. </el-form-item>
  14. <el-form-item>
  15. <el-button
  16. icon="el-icon-search"
  17. type="primary"
  18. native-type="submit"
  19. @click="handleQuery"
  20. >
  21. 查询
  22. </el-button>
  23. <el-button icon="el-icon-plus" type="primary" @click="handleAdd">
  24. 添加
  25. </el-button>
  26. </el-form-item>
  27. </el-form>
  28. </vab-query-form-left-panel>
  29. </vab-query-form>
  30. <el-table
  31. ref="tableSort"
  32. v-loading="listLoading"
  33. :data="tableData"
  34. :element-loading-text="elementLoadingText"
  35. :height="height"
  36. :header-cell-style="{ 'text-align': 'center' }"
  37. :cell-style="{ 'text-align': 'center' }"
  38. >
  39. >
  40. <el-table-column show-overflow-tooltip label="序号" width="95">
  41. <template #default="scope">
  42. {{ scope.$index + 1 }}
  43. </template>
  44. </el-table-column>
  45. <el-table-column show-overflow-tooltip prop="name" label="名称" />
  46. <el-table-column
  47. show-overflow-tooltip
  48. prop="executeClass"
  49. label="执行类"
  50. />
  51. <el-table-column show-overflow-tooltip prop="code" label="编码" />
  52. <el-table-column show-overflow-tooltip prop="sor" label="排序" />
  53. <el-table-column
  54. show-overflow-tooltip
  55. prop="type"
  56. label="类型"
  57. :formatter="formatType"
  58. />
  59. <el-table-column show-overflow-tooltip prop="description" label="描述" />
  60. <el-table-column
  61. show-overflow-tooltip
  62. prop="inCode"
  63. label="所属公司"
  64. :formatter="formatCompany"
  65. />
  66. <el-table-column show-overflow-tooltip label="操作" width="180px">
  67. <template #default="{ row }">
  68. <el-button type="text" @click="handleEdit(row)">
  69. <el-tag type="success">编辑</el-tag>
  70. </el-button>
  71. <el-button type="text" @click="handleDelete(row)">
  72. <el-tag type="danger">删除</el-tag>
  73. </el-button>
  74. </template>
  75. </el-table-column>
  76. </el-table>
  77. <el-pagination
  78. :background="background"
  79. :current-page="page.currentPage"
  80. :layout="layout"
  81. :page-size="page.pageSize"
  82. :total="page.total"
  83. @current-change="handleCurrentChange"
  84. @size-change="handleSizeChange"
  85. ></el-pagination>
  86. <el-dialog
  87. :title="title"
  88. :visible.sync="dialogFormVisible"
  89. width="500px"
  90. @close="close"
  91. >
  92. <el-form ref="form" :model="form" :rules="rules" label-width="80px">
  93. <el-form-item label="名称" prop="name">
  94. <el-input v-model.trim="form.name" autocomplete="off"></el-input>
  95. </el-form-item>
  96. <el-form-item label="执行类" prop="executeClass">
  97. <el-input
  98. :disabled="typeEdit"
  99. v-model.trim="form.executeClass"
  100. autocomplete="off"
  101. ></el-input>
  102. </el-form-item>
  103. <el-form-item label="编码" prop="code">
  104. <el-input v-model.trim="form.code" :disabled="typeEdit" autocomplete="off"></el-input>
  105. </el-form-item>
  106. <el-form-item label="排序" prop="sor">
  107. <el-input
  108. v-model.trim="form.sor"
  109. type="string"
  110. autocomplete="off"
  111. ></el-input>
  112. </el-form-item>
  113. <el-form-item label="类型" prop="type">
  114. <el-select
  115. v-model.trim="form.type"
  116. clearable
  117. placeholder="请选择"
  118. @change="typeChange"
  119. >
  120. <el-option
  121. v-for="item in types"
  122. :key="item.value"
  123. :label="item.label"
  124. :value="item.value"
  125. ></el-option>
  126. </el-select>
  127. </el-form-item>
  128. <el-form-item label="所属公司" prop="inCode">
  129. <el-select
  130. v-model.trim="form.inCode"
  131. clearable
  132. placeholder="请选择"
  133. :disabled="companyEdit"
  134. >
  135. <el-option
  136. v-for="item in companys"
  137. :key="item.code"
  138. :label="item.name"
  139. :value="item.code"
  140. ></el-option>
  141. </el-select>
  142. </el-form-item>
  143. <el-form-item label="描述" prop="description">
  144. <el-input
  145. v-model.trim="form.description"
  146. autocomplete="off"
  147. ></el-input>
  148. </el-form-item>
  149. </el-form>
  150. <div slot="footer" class="dialog-footer">
  151. <el-button @click="close">取 消</el-button>
  152. <el-button type="primary" @click="saveOrUpdate()">确 定</el-button>
  153. </div>
  154. </el-dialog>
  155. </div>
  156. </template>
  157. <script>
  158. import {
  159. fetchList,
  160. addObj,
  161. putObj,
  162. delObj,
  163. getExecuteClass,
  164. getCode,
  165. } from '@/api/quartzBase'
  166. import { getCompanyAll } from '@/api/integrationCompany'
  167. export default {
  168. name: 'QuartzBase',
  169. data() {
  170. const validateExecuteClass = (rule, value, callback) => {
  171. if (!value) {
  172. return callback(new Error('请输入执行类'))
  173. }
  174. getExecuteClass(this.form.code, value).then((response) => {
  175. if (this.dialogType === 'edit') callback()
  176. let result = response.data
  177. if (result !== null) {
  178. callback(new Error('执行类已存在'))
  179. } else {
  180. callback()
  181. }
  182. })
  183. }
  184. const validateCode = (rule, value, callback) => {
  185. if (!value) {
  186. return callback(new Error('请输入编码'))
  187. }
  188. getCode(this.form.code, value).then((response) => {
  189. if (this.dialogType === 'edit') callback()
  190. let result = response.data
  191. if (result !== null) {
  192. callback(new Error('编码已存在'))
  193. } else {
  194. callback()
  195. }
  196. })
  197. }
  198. const validateSor = (rule, value, callback) => {
  199. if (!value) {
  200. return callback(new Error('请输入排序'))
  201. }
  202. let isTel =/^([0-9]+\.?[0-9]*|-[0-9]+\.?[0-9]*)$/.test(value);
  203. if (!isTel) {
  204. return callback(new Error('请输入整数'))
  205. } else {
  206. return callback()
  207. }
  208. }
  209. return {
  210. typeEdit: false,
  211. companyEdit: false,
  212. dialogFormVisible: false,
  213. dialogType: '',
  214. title: '',
  215. tableData: [],
  216. companys: [],
  217. searchForm: {
  218. code: null,
  219. name: null,
  220. },
  221. form: {},
  222. types: [
  223. { label: '公共', value: 'PUBLIC' },
  224. { label: '私有', value: 'PRIVATE' },
  225. ],
  226. listLoading: true,
  227. layout: 'total, sizes, prev, pager, next, jumper',
  228. total: 0,
  229. background: true,
  230. elementLoadingText: '正在加载...',
  231. page: {
  232. total: 0, // 总页数
  233. currentPage: 1, // 当前页数
  234. pageSize: 20, // 每页显示多少条
  235. },
  236. rules: {
  237. name: [
  238. { required: true, trigger: 'blur', message: '请输入公司名称' },
  239. ],
  240. executeClass: [
  241. {
  242. required: true,
  243. trigger: 'blur',
  244. validator: validateExecuteClass,
  245. },
  246. ],
  247. code: [
  248. {
  249. required: true,
  250. trigger: 'blur',
  251. validator: validateCode,
  252. },
  253. ],
  254. type: [
  255. {
  256. required: true,
  257. trigger: 'blur',
  258. message: '请输入类型'
  259. },
  260. ],
  261. sor: [
  262. {
  263. required: true,
  264. trigger: 'blur',
  265. validator: validateSor,
  266. },
  267. ],
  268. },
  269. }
  270. },
  271. computed: {
  272. height() {
  273. return this.$baseTableHeight()
  274. },
  275. },
  276. created() {
  277. this.getCompany()
  278. },
  279. methods: {
  280. handleChange(value) {
  281. this.form.sor = value
  282. },
  283. getCompany() {
  284. getCompanyAll()
  285. .then((response) => {
  286. this.companys = response.data
  287. this.fetchData()
  288. this.listLoading = false
  289. })
  290. .catch(() => {
  291. this.listLoading = false
  292. })
  293. },
  294. async fetchData() {
  295. this.listLoading = true
  296. fetchList(
  297. Object.assign(
  298. {
  299. current: this.page.currentPage,
  300. size: this.page.pageSize,
  301. },
  302. this.searchForm
  303. )
  304. )
  305. .then((response) => {
  306. this.tableData = response.data.records
  307. this.page.total = response.data.total
  308. this.listLoading = false
  309. })
  310. .catch(() => {
  311. this.listLoading = false
  312. })
  313. },
  314. handleSizeChange(val) {
  315. this.page.pageSize = val
  316. this.page.currentPage = 1
  317. this.fetchData()
  318. },
  319. handleCurrentChange(val) {
  320. this.page.currentPage = val
  321. this.fetchData()
  322. },
  323. handleQuery() {
  324. for (var v in this.searchForm) {
  325. if (this.searchForm[v] == '') {
  326. delete this.searchForm[v]
  327. }
  328. }
  329. this.page.currentPage = 1
  330. this.fetchData()
  331. },
  332. close() {
  333. this.$refs['form'].resetFields()
  334. this.form = this.$options.data().form
  335. this.dialogFormVisible = false
  336. this.$emit('fetch-data')
  337. },
  338. handleAdd() {
  339. this.typeEdit = false
  340. this.form = {}
  341. this.title = '新增'
  342. this.dialogType = 'add'
  343. this.dialogFormVisible = true
  344. },
  345. handleEdit(row) {
  346. this.typeEdit = true
  347. this.form = row
  348. this.title = '修改'
  349. this.dialogType = 'edit'
  350. this.dialogFormVisible = true
  351. },
  352. handleDelete(row) {
  353. this.$baseConfirm('你确定要删除当前项吗', null, async () => {
  354. const { msg } = await delObj(row.id)
  355. this.$baseMessage(msg, 'success')
  356. this.fetchData()
  357. })
  358. },
  359. saveOrUpdate() {
  360. if (this.dialogType == 'add') {
  361. this.save()
  362. } else {
  363. this.update()
  364. }
  365. },
  366. save() {
  367. this.$refs.form.validate((valid) => {
  368. if (valid) {
  369. this.listLoading = true
  370. addObj(this.form)
  371. .then((response) => {
  372. this.dialogFormVisible = false
  373. this.fetchData()
  374. this.listLoading = false
  375. })
  376. .catch(() => {
  377. this.listLoading = false
  378. })
  379. } else {
  380. return false
  381. }
  382. })
  383. },
  384. update() {
  385. this.$refs.form.validate((valid) => {
  386. if (valid) {
  387. this.listLoading = true
  388. console.log(this.form)
  389. putObj(this.form)
  390. .then((response) => {
  391. this.$message({
  392. message: '修改成功',
  393. type: 'success',
  394. })
  395. this.dialogFormVisible = false
  396. this.fetchData()
  397. this.listLoading = false
  398. })
  399. .catch(() => {
  400. this.$message({
  401. message: '修改失败',
  402. type: 'warning',
  403. })
  404. this.listLoading = false
  405. })
  406. } else {
  407. return false
  408. }
  409. })
  410. },
  411. formatCompany(row, column) {
  412. for (let i = 0; i < this.companys.length; i++) {
  413. if (row.inCode == this.companys[i].code) {
  414. return this.companys[i].name
  415. }
  416. }
  417. },
  418. formatType(row, column) {
  419. for (let i = 0; i < this.types.length; i++) {
  420. if (row.type == this.types[i].value) {
  421. return this.types[i].label
  422. }
  423. }
  424. },
  425. typeChange(value) {
  426. if (value == 'PUBLIC') {
  427. this.$set(this.form, 'inCode', null)
  428. this.companyEdit = true
  429. } else {
  430. this.companyEdit = false
  431. }
  432. },
  433. },
  434. }
  435. </script>
  436. <style>
  437. .demo-table-expand {
  438. font-size: 0;
  439. }
  440. .demo-table-expand label {
  441. width: 90px;
  442. color: #99a9bf;
  443. }
  444. .demo-table-expand .el-form-item {
  445. margin-right: 0;
  446. margin-bottom: 0;
  447. width: 50%;
  448. }
  449. </style>