job.vue 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  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. export default {
  49. components: {mycron},
  50. name: 'job',
  51. data () {
  52. // var checkExtractionPeriod = (rule, value, callback) => {
  53. // if (!value) {
  54. // return callback(new Error('抽取周期不能为空'))
  55. // } else {
  56. // return callback()
  57. // }
  58. // }
  59. return {
  60. jobcForm: {
  61. name: '',
  62. measureID: '',
  63. cron: '',
  64. range: [-1, 0],
  65. dropdownList: []
  66. },
  67. marks: {
  68. '-1': '-1 day',
  69. '-2': '-2 day',
  70. '-3': '-3 day',
  71. '-5': '-5 day',
  72. '-7': '-7 day',
  73. '-10': '-10 day'
  74. },
  75. dialogVisible: false,
  76. measures: [],
  77. rules: {
  78. name: [
  79. {required: true, message: '请输入任务名称', trigger: 'blur'},
  80. {min: 3, max: 18, message: '长度在 3 到 18 个字符', trigger: 'blur'}
  81. ],
  82. measureID: [
  83. { required: true, message: '请选择度量方案', trigger: 'change' }
  84. ],
  85. cron: [
  86. // { validator: checkExtractionPeriod, trigger: 'blur' }
  87. { required: true, message: '请输入调度周期', trigger: 'change' }
  88. ]
  89. }
  90. }
  91. },
  92. methods: {
  93. redirectHandle () {
  94. this.$router.replace({ path: '/snoop-home' })
  95. },
  96. // 向后台提交数据
  97. async finallySubmit () {
  98. this.newJob = {
  99. 'job.name': this.jobcForm.name,
  100. 'job.type': 'batch',
  101. 'measure.id': this.jobcForm.measureID,
  102. 'cron.expression': this.jobcForm.cron,
  103. // 'cron.time.zone': this.timezone,
  104. 'cron.time.zone': 'GMT+8:00',
  105. // "predicate.config": {
  106. // "interval": "1m",
  107. // "repeat": 2
  108. // },
  109. 'data.segments': [
  110. // {
  111. // "data.connector.index": "source[0]",
  112. // "segment.range": {
  113. // "begin": "",
  114. // "length": ""
  115. // }
  116. // },
  117. // {
  118. // "data.connector.index": "target[0]",
  119. // "segment.range": {
  120. // "begin": "",
  121. // "length": ""
  122. // }
  123. // }
  124. ]
  125. }
  126. for (let i = 0; i < this.dropdownList.length; i++) {
  127. var connector = this.dropdownList[i]
  128. var begin = this.jobcForm.range[0]
  129. var length = this.jobcForm.range[1] - this.jobcForm.range[0]
  130. var beginStr = this.getTimeByUnit(begin, connector.size)
  131. var lengthStr = this.getTimeByUnit(length, connector.size)
  132. this.newJob['data.segments'].push({
  133. 'data.connector.name': connector.connectorname,
  134. 'as.baseline': true,
  135. 'segment.range': {
  136. begin: beginStr,
  137. length: lengthStr
  138. }
  139. })
  140. }
  141. if (this.dropdownList.length === 2) {
  142. delete this.newJob['data.segments'][1]['as.baseline']
  143. }
  144. console.log(this.newJob)
  145. await this.$http({
  146. url: this.$http.snoopUrl('/v1/jobs'),
  147. method: 'post',
  148. data: this.$http.adornData(this.newJob)
  149. }).then((datas) => {
  150. // console.log(6666)
  151. if (datas.status === 201) {
  152. return true
  153. } else {
  154. return false
  155. }
  156. })
  157. // .catch(err => {
  158. // console.log(err)
  159. // let response = JSON.parse(err.error)
  160. // console.log(response)
  161. // if (response.code === '40004') {
  162. // console.log('error', 'Error!', 'Job name already exists!')
  163. // } else {
  164. // console.log('error', 'Error!', response.message)
  165. // }
  166. // })
  167. },
  168. submitForm () {
  169. this.$refs['jobForm'].validate((valid) => {
  170. if (valid) {
  171. var submit = this.finallySubmit()
  172. setTimeout(() => {
  173. if (submit) {
  174. this.$message({
  175. message: '调度任务 ' + this.jobcForm.name + ' 创建成功',
  176. type: 'success'
  177. })
  178. } else {
  179. this.$message({
  180. message: '调度任务 ' + this.jobcForm.name + ' 创建失败',
  181. type: 'error'
  182. })
  183. }
  184. this.$router.replace({path: '/snoop-home', query: {'status': '1'}})
  185. this.$destroy()
  186. }, 2 * 1000)
  187. } else {
  188. // console.log('error submit!!')
  189. return false
  190. }
  191. })
  192. },
  193. getTimeByUnit (multiplier, unit) {
  194. var regex = /^(\d+)([a-zA-Z]+)$/g
  195. var arr = regex.exec(unit)
  196. if (arr.length > 2) {
  197. var n = parseInt(arr[1])
  198. var unitStr = arr[2]
  199. return ((n * multiplier).toString() + arr[2])
  200. } else {
  201. return multiplier.toString()
  202. }
  203. },
  204. onChange (measure) {
  205. this.dropdownList = []
  206. console.log(measure)
  207. for (let index in this.measures) {
  208. var map = this.measures[index]
  209. // console.log(measure)
  210. // console.log(map.id)
  211. if (measure === map.id) {
  212. var source = map['data.sources']
  213. for (let i = 0; i < source.length; i++) {
  214. var connector = source[i].connector
  215. if (connector['data.unit'] !== undefined) {
  216. var table = connector.config.database + '.' + connector.config['table.name']
  217. var size = connector['data.unit']
  218. var connectorname = connector['name']
  219. var detail = {
  220. id: i + 1,
  221. name: table,
  222. size: size,
  223. connectorname: connectorname
  224. }
  225. this.dropdownList.push(detail)
  226. }
  227. }
  228. }
  229. }
  230. }
  231. },
  232. mounted () {
  233. // console.log(this.$http.snoopUrl('/v1/measures/owner/') + this.$store.state.user.name) 实际项目用这个
  234. this.$http({
  235. url: this.$http.snoopUrl('/v1/measures/owner/') + 'test',
  236. method: 'get'
  237. }).then((datas) => {
  238. if (datas && datas.status === 200) {
  239. var res = datas.data.reverse()
  240. res.forEach((info) => {
  241. if (info['process.type'] === 'BATCH') {
  242. this.measures.push(info)
  243. }
  244. })
  245. }
  246. })
  247. // for (var i = 0; i < 10; i++) {
  248. // obj = { 'id': i, 'name': 'demo' + i}
  249. // this.measures.push(obj)
  250. // }
  251. }
  252. }
  253. </script>
  254. <style scoped>
  255. .divi2 {
  256. display: block;
  257. height: 1px;
  258. width: 100%;
  259. position: relative;
  260. }
  261. </style>