job.vue 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. <template>
  2. <div>
  3. <el-breadcrumb class="divi2" separator-class="el-icon-arrow-right">
  4. <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
  5. <el-breadcrumb-item :to="{ path: '/snoop-home'}">数据质量探测</el-breadcrumb-item>
  6. <el-breadcrumb-item>创建度量标准</el-breadcrumb-item>
  7. </el-breadcrumb>
  8. <el-divider class="divi"></el-divider>
  9. <el-col :span="16" style="height: 100%;margin-left: 160px;">
  10. <h4> 配置调度任务 :</h4>
  11. <div style="height: 360px;overflow-scrolling: auto">
  12. <el-form ref="jobForm" :model="jobcForm" label-width="120px" :rules="rules">
  13. <el-form-item label="任务名称 :" prop="name">
  14. <el-input v-model="jobcForm.name"></el-input>
  15. </el-form-item>
  16. <el-form-item label="度量名称 :" prop="measureID">
  17. <el-select v-model="jobcForm.measureID" @change="onChange" placeholder="请选择" >
  18. <el-option
  19. v-for="measure in measures"
  20. :key="measure.id"
  21. :label="measure.name"
  22. :value="measure.id"></el-option>
  23. </el-select>
  24. </el-form-item>
  25. <el-form-item label="调度周期 :" prop="cron">
  26. <el-input v-model="jobcForm.cron" placeholder="请输入抽取周期" clearable
  27. @focus="dialogVisible = true">
  28. </el-input>
  29. <el-dialog custom-class="cron-box-dialog-first" :visible.sync="dialogVisible" v-if="dialogVisible">
  30. <mycron v-bind:extractionPeriod.sync="jobcForm.cron"></mycron>
  31. </el-dialog>
  32. </el-form-item>
  33. <el-form-item label="请选择时间范围 :" prop="range">
  34. <el-slider v-model="jobcForm.range" range show-stops :max="0" :min="-10" :marks="marks">
  35. </el-slider>
  36. </el-form-item>
  37. <el-form-item style="float:right ;margin-top: 20px">
  38. <el-button @click="visible = false;redirectHandle()">取消</el-button>
  39. <el-button type="primary" @click="submitForm()">确定</el-button>
  40. </el-form-item>
  41. </el-form>
  42. </div>
  43. </el-col>
  44. </div>
  45. </template>
  46. <script>
  47. import mycron from '../visi/quartz/mycron'
  48. import { MessageBox } from 'element-ui'
  49. import { Message } from "element-ui"
  50. export default {
  51. components: {mycron},
  52. name: 'job',
  53. data () {
  54. // var checkExtractionPeriod = (rule, value, callback) => {
  55. // if (!value) {
  56. // return callback(new Error('抽取周期不能为空'))
  57. // } else {
  58. // return callback()
  59. // }
  60. // }
  61. return {
  62. jobcForm: {
  63. name: '',
  64. measureID: '',
  65. cron: '',
  66. range: [-1, 0],
  67. dropdownList: []
  68. },
  69. marks: {
  70. '-1': '-1 day',
  71. '-2': '-2 day',
  72. '-3': '-3 day',
  73. '-5': '-5 day',
  74. '-7': '-7 day',
  75. '-10': '-10 day'
  76. },
  77. dialogVisible: false,
  78. measures: [],
  79. rules: {
  80. name: [
  81. {required: true, message: '请输入任务名称', trigger: 'blur'},
  82. {min: 3, max: 18, message: '长度在 3 到 18 个字符', trigger: 'blur'}
  83. ],
  84. measureID: [
  85. { required: true, message: '请选择度量方案', trigger: 'change' }
  86. ],
  87. cron: [
  88. // { validator: checkExtractionPeriod, trigger: 'blur' }
  89. { required: true, message: '请输入调度周期', trigger: 'change' }
  90. ]
  91. }
  92. }
  93. },
  94. methods: {
  95. redirectHandle () {
  96. this.$router.replace({ path: '/snoop-home' })
  97. },
  98. // 向后台提交数据
  99. async finallySubmit () {
  100. this.newJob = {
  101. 'job.name': this.jobcForm.name,
  102. 'job.type': 'batch',
  103. 'measure.id': this.jobcForm.measureID,
  104. 'cron.expression': this.jobcForm.cron,
  105. // 'cron.time.zone': this.timezone,
  106. 'cron.time.zone': 'GMT+8:00',
  107. // "predicate.config": {
  108. // "interval": "1m",
  109. // "repeat": 2
  110. // },
  111. 'data.segments': [
  112. // {
  113. // "data.connector.index": "source[0]",
  114. // "segment.range": {
  115. // "begin": "",
  116. // "length": ""
  117. // }
  118. // },
  119. // {
  120. // "data.connector.index": "target[0]",
  121. // "segment.range": {
  122. // "begin": "",
  123. // "length": ""
  124. // }
  125. // }
  126. ]
  127. }
  128. for (let i = 0; i < this.dropdownList.length; i++) {
  129. var connector = this.dropdownList[i]
  130. var begin = this.jobcForm.range[0]
  131. var length = this.jobcForm.range[1] - this.jobcForm.range[0]
  132. var beginStr = this.getTimeByUnit(begin, connector.size)
  133. var lengthStr = this.getTimeByUnit(length, connector.size)
  134. this.newJob['data.segments'].push({
  135. 'data.connector.name': connector.connectorname,
  136. 'as.baseline': true,
  137. 'segment.range': {
  138. begin: beginStr,
  139. length: lengthStr
  140. }
  141. })
  142. }
  143. if (this.dropdownList.length === 2) {
  144. delete this.newJob['data.segments'][1]['as.baseline']
  145. }
  146. console.log(this.newJob)
  147. await this.$http({
  148. url: this.$http.snoopUrl('/v1/jobs'),
  149. method: 'post',
  150. data: this.$http.adornData(this.newJob)
  151. }).then((datas) => {
  152. // console.log(6666)
  153. if (datas.status === 201) {
  154. return true
  155. } else {
  156. return false
  157. }
  158. })
  159. // .catch(err => {
  160. // console.log(err)
  161. // let response = JSON.parse(err.error)
  162. // console.log(response)
  163. // if (response.code === '40004') {
  164. // console.log('error', 'Error!', 'Job name already exists!')
  165. // } else {
  166. // console.log('error', 'Error!', response.message)
  167. // }
  168. // })
  169. },
  170. submitForm () {
  171. this.$refs['jobForm'].validate((valid) => {
  172. if (valid) {
  173. var submit = this.finallySubmit()
  174. setTimeout(() => {
  175. if (submit) {
  176. Message({
  177. message: '调度任务 ' + this.jobcForm.name + ' 创建成功',
  178. type: 'success'
  179. })
  180. } else {
  181. Message({
  182. message: '调度任务 ' + this.jobcForm.name + ' 创建失败',
  183. type: 'error'
  184. })
  185. }
  186. this.$router.replace({path: '/snoop-home', query: {'status': '1'}})
  187. this.$destroy()
  188. }, 2 * 1000)
  189. } else {
  190. // console.log('error submit!!')
  191. return false
  192. }
  193. })
  194. },
  195. getTimeByUnit (multiplier, unit) {
  196. var regex = /^(\d+)([a-zA-Z]+)$/g
  197. var arr = regex.exec(unit)
  198. if (arr.length > 2) {
  199. var n = parseInt(arr[1])
  200. var unitStr = arr[2]
  201. return ((n * multiplier).toString() + arr[2])
  202. } else {
  203. return multiplier.toString()
  204. }
  205. },
  206. onChange (measure) {
  207. this.dropdownList = []
  208. console.log(measure)
  209. for (let index in this.measures) {
  210. var map = this.measures[index]
  211. // console.log(measure)
  212. // console.log(map.id)
  213. if (measure === map.id) {
  214. var source = map['data.sources']
  215. for (let i = 0; i < source.length; i++) {
  216. var connector = source[i].connector
  217. if (connector['data.unit'] !== undefined) {
  218. var table = connector.config.database + '.' + connector.config['table.name']
  219. var size = connector['data.unit']
  220. var connectorname = connector['name']
  221. var detail = {
  222. id: i + 1,
  223. name: table,
  224. size: size,
  225. connectorname: connectorname
  226. }
  227. this.dropdownList.push(detail)
  228. }
  229. }
  230. }
  231. }
  232. }
  233. },
  234. mounted () {
  235. // console.log(this.$http.snoopUrl('/v1/measures/owner/') + this.$store.state.user.name) 实际项目用这个
  236. this.$http({
  237. url: this.$http.snoopUrl('/v1/measures/owner/') + 'test',
  238. method: 'get'
  239. }).then((datas) => {
  240. if (datas && datas.status === 200) {
  241. var res = datas.data.reverse()
  242. res.forEach((info) => {
  243. if (info['process.type'] === 'BATCH') {
  244. this.measures.push(info)
  245. }
  246. })
  247. }
  248. })
  249. // for (var i = 0; i < 10; i++) {
  250. // obj = { 'id': i, 'name': 'demo' + i}
  251. // this.measures.push(obj)
  252. // }
  253. }
  254. }
  255. </script>
  256. <style scoped>
  257. .divi2 {
  258. display: block;
  259. height: 1px;
  260. width: 100%;
  261. position: relative;
  262. }
  263. </style>