From d1174fed5cfc1de969ea9f0b8f75be115ddc9b5f Mon Sep 17 00:00:00 2001 From: taojinlong Date: Fri, 9 Jul 2021 10:52:20 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=95=B8=E6=93=9A=E9=9B=86):=20=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E4=BB=BB=E5=8A=A1=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E7=AE=80=E5=8D=95=E9=87=8D=E5=A4=8D=E6=89=A7=E8=A1=8C=E7=9A=84?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/domain/DatasetTableTask.java | 2 + .../base/domain/DatasetTableTaskExample.java | 70 +++++++++++++++ .../base/mapper/DatasetTableTaskMapper.xml | 25 ++++-- .../commons/constants/ScheduleType.java | 2 +- .../dataease/listener/AppStartListener.java | 2 +- .../io/dataease/service/ScheduleService.java | 2 +- .../service/dataset/DataSetTableService.java | 2 + .../dataset/DataSetTableTaskService.java | 3 +- .../db/migration/V13__system_task.sql | 1 + .../src/main/resources/generatorConfig.xml | 4 +- frontend/src/lang/en.js | 6 +- frontend/src/lang/tw.js | 6 +- frontend/src/lang/zh.js | 6 +- .../src/views/dataset/data/UpdateInfo.vue | 80 +++++++++++++++-- .../src/views/system/task/DatasetTaskList.vue | 89 ++++++++++++++++--- frontend/src/views/system/task/TaskRecord.vue | 35 ++++---- 16 files changed, 283 insertions(+), 52 deletions(-) diff --git a/backend/src/main/java/io/dataease/base/domain/DatasetTableTask.java b/backend/src/main/java/io/dataease/base/domain/DatasetTableTask.java index 46da2b5eeb..7573fe5fb1 100644 --- a/backend/src/main/java/io/dataease/base/domain/DatasetTableTask.java +++ b/backend/src/main/java/io/dataease/base/domain/DatasetTableTask.java @@ -31,5 +31,7 @@ public class DatasetTableTask implements Serializable { private String lastExecStatus; + private String extraData; + private static final long serialVersionUID = 1L; } \ No newline at end of file diff --git a/backend/src/main/java/io/dataease/base/domain/DatasetTableTaskExample.java b/backend/src/main/java/io/dataease/base/domain/DatasetTableTaskExample.java index 801373393a..95015707b8 100644 --- a/backend/src/main/java/io/dataease/base/domain/DatasetTableTaskExample.java +++ b/backend/src/main/java/io/dataease/base/domain/DatasetTableTaskExample.java @@ -973,6 +973,76 @@ public class DatasetTableTaskExample { addCriterion("last_exec_status not between", value1, value2, "lastExecStatus"); return (Criteria) this; } + + public Criteria andExtraDataIsNull() { + addCriterion("extra_data is null"); + return (Criteria) this; + } + + public Criteria andExtraDataIsNotNull() { + addCriterion("extra_data is not null"); + return (Criteria) this; + } + + public Criteria andExtraDataEqualTo(String value) { + addCriterion("extra_data =", value, "extraData"); + return (Criteria) this; + } + + public Criteria andExtraDataNotEqualTo(String value) { + addCriterion("extra_data <>", value, "extraData"); + return (Criteria) this; + } + + public Criteria andExtraDataGreaterThan(String value) { + addCriterion("extra_data >", value, "extraData"); + return (Criteria) this; + } + + public Criteria andExtraDataGreaterThanOrEqualTo(String value) { + addCriterion("extra_data >=", value, "extraData"); + return (Criteria) this; + } + + public Criteria andExtraDataLessThan(String value) { + addCriterion("extra_data <", value, "extraData"); + return (Criteria) this; + } + + public Criteria andExtraDataLessThanOrEqualTo(String value) { + addCriterion("extra_data <=", value, "extraData"); + return (Criteria) this; + } + + public Criteria andExtraDataLike(String value) { + addCriterion("extra_data like", value, "extraData"); + return (Criteria) this; + } + + public Criteria andExtraDataNotLike(String value) { + addCriterion("extra_data not like", value, "extraData"); + return (Criteria) this; + } + + public Criteria andExtraDataIn(List values) { + addCriterion("extra_data in", values, "extraData"); + return (Criteria) this; + } + + public Criteria andExtraDataNotIn(List values) { + addCriterion("extra_data not in", values, "extraData"); + return (Criteria) this; + } + + public Criteria andExtraDataBetween(String value1, String value2) { + addCriterion("extra_data between", value1, value2, "extraData"); + return (Criteria) this; + } + + public Criteria andExtraDataNotBetween(String value1, String value2) { + addCriterion("extra_data not between", value1, value2, "extraData"); + return (Criteria) this; + } } public static class Criteria extends GeneratedCriteria { diff --git a/backend/src/main/java/io/dataease/base/mapper/DatasetTableTaskMapper.xml b/backend/src/main/java/io/dataease/base/mapper/DatasetTableTaskMapper.xml index 3ebbb5442c..b395161511 100644 --- a/backend/src/main/java/io/dataease/base/mapper/DatasetTableTaskMapper.xml +++ b/backend/src/main/java/io/dataease/base/mapper/DatasetTableTaskMapper.xml @@ -15,6 +15,7 @@ + @@ -76,7 +77,7 @@ id, table_id, `name`, `type`, start_time, rate, cron, `end`, end_time, create_time, - last_exec_time, `status`, last_exec_status + last_exec_time, `status`, last_exec_status, extra_data @@ -253,6 +260,9 @@ last_exec_status = #{record.lastExecStatus,jdbcType=VARCHAR}, + + extra_data = #{record.extraData,jdbcType=VARCHAR}, + @@ -272,7 +282,8 @@ create_time = #{record.createTime,jdbcType=BIGINT}, last_exec_time = #{record.lastExecTime,jdbcType=BIGINT}, `status` = #{record.status,jdbcType=VARCHAR}, - last_exec_status = #{record.lastExecStatus,jdbcType=VARCHAR} + last_exec_status = #{record.lastExecStatus,jdbcType=VARCHAR}, + extra_data = #{record.extraData,jdbcType=VARCHAR} @@ -316,6 +327,9 @@ last_exec_status = #{lastExecStatus,jdbcType=VARCHAR}, + + extra_data = #{extraData,jdbcType=VARCHAR}, + where id = #{id,jdbcType=VARCHAR} @@ -332,7 +346,8 @@ create_time = #{createTime,jdbcType=BIGINT}, last_exec_time = #{lastExecTime,jdbcType=BIGINT}, `status` = #{status,jdbcType=VARCHAR}, - last_exec_status = #{lastExecStatus,jdbcType=VARCHAR} + last_exec_status = #{lastExecStatus,jdbcType=VARCHAR}, + extra_data = #{extraData,jdbcType=VARCHAR} where id = #{id,jdbcType=VARCHAR} \ No newline at end of file diff --git a/backend/src/main/java/io/dataease/commons/constants/ScheduleType.java b/backend/src/main/java/io/dataease/commons/constants/ScheduleType.java index 98b4fde4dd..8f458e0878 100644 --- a/backend/src/main/java/io/dataease/commons/constants/ScheduleType.java +++ b/backend/src/main/java/io/dataease/commons/constants/ScheduleType.java @@ -1,5 +1,5 @@ package io.dataease.commons.constants; public enum ScheduleType { - CRON, SIMPLE + CRON, SIMPLE, SIMPLE_CRON } diff --git a/backend/src/main/java/io/dataease/listener/AppStartListener.java b/backend/src/main/java/io/dataease/listener/AppStartListener.java index ffd313c23a..81c31ef5c6 100644 --- a/backend/src/main/java/io/dataease/listener/AppStartListener.java +++ b/backend/src/main/java/io/dataease/listener/AppStartListener.java @@ -30,7 +30,7 @@ public class AppStartListener implements ApplicationListener list = dataSetTableTaskService.list(new DatasetTableTask()); for (DatasetTableTask task : list) { try { - if (StringUtils.equalsIgnoreCase(task.getRate(), ScheduleType.CRON.toString())) { + if (!StringUtils.equalsIgnoreCase(task.getRate(), ScheduleType.SIMPLE.toString())) { if (StringUtils.equalsIgnoreCase(task.getEnd(), "1")) { if (task.getEndTime() != null && task.getEndTime() > 0) { if (task.getEndTime() > System.currentTimeMillis()) { diff --git a/backend/src/main/java/io/dataease/service/ScheduleService.java b/backend/src/main/java/io/dataease/service/ScheduleService.java index b0016bac06..ac52171430 100644 --- a/backend/src/main/java/io/dataease/service/ScheduleService.java +++ b/backend/src/main/java/io/dataease/service/ScheduleService.java @@ -28,7 +28,7 @@ public class ScheduleService { ExtractDataJob.class, new Date(datasetTableTask.getStartTime()), scheduleManager.getDefaultJobDataMap(datasetTableTask.getTableId(), datasetTableTask.getCron(), datasetTableTask.getId(), datasetTableTask.getType())); - } else if (StringUtils.equalsIgnoreCase(datasetTableTask.getRate(), ScheduleType.CRON.toString())) { + } else { Date endTime; if (StringUtils.equalsIgnoreCase(datasetTableTask.getEnd(), "1")) { if (datasetTableTask.getEndTime() == null || datasetTableTask.getEndTime() == 0) { diff --git a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java index 36d023133e..b62fe0f8e7 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -10,6 +10,7 @@ import io.dataease.base.mapper.ext.ExtDataSetTableMapper; import io.dataease.base.mapper.ext.UtilMapper; import io.dataease.commons.constants.JobStatus; import io.dataease.commons.constants.ScheduleType; +import io.dataease.commons.constants.TaskStatus; import io.dataease.commons.utils.*; import io.dataease.controller.request.dataset.DataSetGroupRequest; import io.dataease.controller.request.dataset.DataSetTableRequest; @@ -110,6 +111,7 @@ public class DataSetTableService { datasetTableTask.setType("all_scope"); datasetTableTask.setName(datasetTable.getName() + " 更新设置"); datasetTableTask.setEnd("0"); + datasetTableTask.setStatus(TaskStatus.Underway.name()); datasetTableTask.setStartTime(System.currentTimeMillis()); dataSetTaskRequest.setDatasetTableTask(datasetTableTask); dataSetTableTaskService.save(dataSetTaskRequest); diff --git a/backend/src/main/java/io/dataease/service/dataset/DataSetTableTaskService.java b/backend/src/main/java/io/dataease/service/dataset/DataSetTableTaskService.java index 391a92ac69..faef6c2f47 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableTaskService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableTaskService.java @@ -61,7 +61,7 @@ public class DataSetTableTaskService { dataSetTableService.saveIncrementalConfig(dataSetTaskRequest.getDatasetTableIncrementalConfig()); } // check - if (StringUtils.equalsIgnoreCase(datasetTableTask.getRate(),"CRON")){ + if (!StringUtils.equalsIgnoreCase(datasetTableTask.getRate(), ScheduleType.SIMPLE.toString())){ if (StringUtils.isNotEmpty(datasetTableTask.getCron())) { if (!CronExpression.isValidExpression(datasetTableTask.getCron())) { throw new RuntimeException(Translator.get("i18n_cron_expression_error")); @@ -96,6 +96,7 @@ public class DataSetTableTaskService { scheduleService.addSchedule(datasetTableTask); }else { if(datasetTableTask.getStatus().equalsIgnoreCase(JobStatus.Underway.name())){ + System.out.println(new Gson().toJson(datasetTableTask)); scheduleService.addSchedule(datasetTableTask); } } diff --git a/backend/src/main/resources/db/migration/V13__system_task.sql b/backend/src/main/resources/db/migration/V13__system_task.sql index efbdc47965..69e1a52875 100644 --- a/backend/src/main/resources/db/migration/V13__system_task.sql +++ b/backend/src/main/resources/db/migration/V13__system_task.sql @@ -12,3 +12,4 @@ update dataset_table_task set rate='SIMPLE' where rate='SIMPLE_COMPLETE'; ALTER TABLE `dataset_table_task_log` ADD COLUMN `trigger_type` VARCHAR(45) NULL AFTER `create_time`; update dataset_table_task_log set trigger_type='Cron'; +ALTER TABLE `dataset_table_task` ADD COLUMN `extra_data` LONGTEXT NULL AFTER `last_exec_status`; diff --git a/backend/src/main/resources/generatorConfig.xml b/backend/src/main/resources/generatorConfig.xml index 3a6f7816c8..890da30db5 100644 --- a/backend/src/main/resources/generatorConfig.xml +++ b/backend/src/main/resources/generatorConfig.xml @@ -74,7 +74,9 @@ - +
+ +
diff --git a/frontend/src/lang/en.js b/frontend/src/lang/en.js index 555a33eba1..707bbca04f 100644 --- a/frontend/src/lang/en.js +++ b/frontend/src/lang/en.js @@ -857,6 +857,7 @@ export default { select_data_time: 'Select date time', execute_rate: 'Execution frequency', execute_once: 'Execution Now', + simple_cron: 'Simple repeat', cron_config: 'Expression setting', no_limit: 'No limit', set_end_time: 'Set the end time', @@ -1213,7 +1214,10 @@ export default { week_start: 'From week', week_end: 'to week', every_year: 'Every year', - week_tips: 'Tips:1-7 mapping SUN-SAT' + week_tips: 'Tips:1-7 mapping SUN-SAT', + minute_limit: 'Minutes cannot be less than 1 and greater than 59', + hour_limit: 'Hours cannot be less than 1 and greater than 23', + day_limit: 'Days cannot be less than 1 and greater than 31' }, dept: { can_not_move_change_sort: 'Cannot move to change sort', diff --git a/frontend/src/lang/tw.js b/frontend/src/lang/tw.js index 081d10fbd6..fc41b39cac 100644 --- a/frontend/src/lang/tw.js +++ b/frontend/src/lang/tw.js @@ -856,6 +856,7 @@ export default { add_scope: '增量更新', select_data_time: '選擇日期時間', execute_rate: '執行頻率', + simple_cron: '簡單重複', execute_once: '立即執行', cron_config: '表達時設定', no_limit: '無限製', @@ -1213,7 +1214,10 @@ export default { week_start: '從星期', week_end: '至星期', every_year: '每年', - week_tips: '說明:1-7 分別對應 周日-周六' + week_tips: '说明:1-7 分别对应 周日-周六', + minute_limit: '分鐘不能小於1,大於59', + hour_limit: '小時不能小於1,大於523', + day_limit: '天不能小於1,大於531' }, dept: { can_not_move_change_sort: '不能移動以改變排序', diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index c53c83bd07..6eac8021aa 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -857,6 +857,7 @@ export default { select_data_time: '选择日期时间', execute_rate: '执行频率', execute_once: '立即执行', + simple_cron: '简单重复', cron_config: '表达式设定', no_limit: '无限制', set_end_time: '设定结束时间', @@ -1215,7 +1216,10 @@ export default { week_start: '从星期', week_end: '至星期', every_year: '每年', - week_tips: '说明:1-7 分别对应 周日-周六' + week_tips: '说明:1-7 分别对应 周日-周六', + minute_limit: '分钟不能小于1,大于59', + hour_limit: '小时不能小于1,大于23', + day_limit: '天不能小于1,大于31' }, dept: { can_not_move_change_sort: '不能移动以改变排序', diff --git a/frontend/src/views/dataset/data/UpdateInfo.vue b/frontend/src/views/dataset/data/UpdateInfo.vue index 239a4f0c69..de74858d22 100644 --- a/frontend/src/views/dataset/data/UpdateInfo.vue +++ b/frontend/src/views/dataset/data/UpdateInfo.vue @@ -122,6 +122,10 @@ :label="$t('dataset.execute_once')" value="SIMPLE" /> + - + + + + + + + + + + + + + + + + + + + + - + @@ -206,7 +229,7 @@ type="primary" icon="el-icon-edit" circle - :disabled="scope.row.rate === 'SIMPLE_COMPLETE'" + :disabled="scope.row.rate === 'SIMPLE'" @click="addTask(scope.row)" /> { @@ -544,12 +574,42 @@ export default { this.update_task = false this.resetTaskForm() }, + onSimpleCronChange() { + if (this.taskForm.extraData.simple_cron_type === 'minute') { + if(this.taskForm.extraData.simple_cron_value < 1 || this.taskForm.extraData.simple_cron_value > 59){ + this.$message({message: this.$t('cron.minute_limit'), type: 'warning', showClose: true}) + this.taskForm.extraData.simple_cron_value = 59 + } + this.taskForm.cron = '0 0/'+ this.taskForm.extraData.simple_cron_value + ' * * * ? *' + return + } + if (this.taskForm.extraData.simple_cron_type === 'hour') { + if(this.taskForm.extraData.simple_cron_value < 1 || this.taskForm.extraData.simple_cron_value > 23){ + this.$message({message: this.$t('cron.hour_limit'), type: 'warning', showClose: true}) + this.taskForm.extraData.simple_cron_value = 23 + } + this.taskForm.cron = '0 0 0/'+ this.taskForm.extraData.simple_cron_value + ' * * ? *' + return + } + if (this.taskForm.extraData.simple_cron_type === 'day') { + if(this.taskForm.extraData.simple_cron_value < 1 || this.taskForm.extraData.simple_cron_value > 31){ + this.$message({message: this.$t('cron.day_limit'), type: 'warning', showClose: true}) + this.taskForm.extraData.simple_cron_value = 31 + } + this.taskForm.cron = '0 0 0 1/'+ this.taskForm.extraData.simple_cron_value + ' * ? *' + return + } + }, onRateChange() { if (this.taskForm.rate === 'SIMPLE') { this.taskForm.end = '0' this.taskForm.endTime = '' this.taskForm.cron = '' - } else { + } + if (this.taskForm.rate === 'SIMPLE_CRON'){ + this.taskForm.cron = '0 0 0/1 * * ? *' + } + if (this.taskForm.rate === 'CRON'){ this.taskForm.cron = '00 00 * ? * * *' } }, @@ -575,7 +635,11 @@ export default { startTime: '', rate: 'SIMPLE', endTime: '', - end: '0' + end: '0', + extraData: { + simple_cron_type: 'hour', + simple_cron_value: 1 + } } }, showSQL(val) { diff --git a/frontend/src/views/system/task/DatasetTaskList.vue b/frontend/src/views/system/task/DatasetTaskList.vue index c5c8e8b244..b4e3db81f1 100644 --- a/frontend/src/views/system/task/DatasetTaskList.vue +++ b/frontend/src/views/system/task/DatasetTaskList.vue @@ -11,8 +11,8 @@ @@ -80,6 +80,7 @@ + @@ -89,6 +90,25 @@ + + + + + + + + + + + + + + + + + + + @@ -182,7 +202,11 @@ export default { rate: 'SIMPLE', cron: '', endTime: '', - end: '0' + end: '0', + extraData: { + simple_cron_type: 'hour', + simple_cron_value: 1 + } }, update_task: false, header: '', @@ -254,7 +278,7 @@ export default { cronEdit: false, lang: this.$store.getters.language === 'en_US' ? 'en' : 'cn', selectDatasetFlag: false, - table: {}, + table: {} } }, computed: { @@ -370,7 +394,50 @@ export default { startTime: '', rate: 'SIMPLE', endTime: '', - end: '0' + end: '0', + extraData: { + simple_cron_type: 'hour', + simple_cron_value: 1 + } + } + }, + onSimpleCronChange() { + if (this.taskForm.extraData.simple_cron_type === 'minute') { + if(this.taskForm.extraData.simple_cron_value < 1 || this.taskForm.extraData.simple_cron_value > 59){ + this.$message({message: this.$t('cron.minute_limit'), type: 'warning', showClose: true}) + this.taskForm.extraData.simple_cron_value = 59 + } + this.taskForm.cron = '0 0/'+ this.taskForm.extraData.simple_cron_value + ' * * * ? *' + return + } + if (this.taskForm.extraData.simple_cron_type === 'hour') { + if(this.taskForm.extraData.simple_cron_value < 1 || this.taskForm.extraData.simple_cron_value > 23){ + this.$message({message: this.$t('cron.hour_limit'), type: 'warning', showClose: true}) + this.taskForm.extraData.simple_cron_value = 23 + } + this.taskForm.cron = '0 0 0/'+ this.taskForm.extraData.simple_cron_value + ' * * ? *' + return + } + if (this.taskForm.extraData.simple_cron_type === 'day') { + if(this.taskForm.extraData.simple_cron_value < 1 || this.taskForm.extraData.simple_cron_value > 31){ + this.$message({message: this.$t('cron.day_limit'), type: 'warning', showClose: true}) + this.taskForm.extraData.simple_cron_value = 31 + } + this.taskForm.cron = '0 0 0 1/'+ this.taskForm.extraData.simple_cron_value + ' * ? *' + return + } + }, + onRateChange() { + if (this.taskForm.rate === 'SIMPLE') { + this.taskForm.end = '0' + this.taskForm.endTime = '' + this.taskForm.cron = '' + } + if (this.taskForm.rate === 'SIMPLE_CRON'){ + this.taskForm.cron = '0 0 0/1 * * ? *' + } + if (this.taskForm.rate === 'CRON'){ + this.taskForm.cron = '00 00 * ? * * *' } }, incrementalUpdateTypeChange: function() { @@ -454,6 +521,7 @@ export default { } else { // update this.getIncrementalConfig(task.tableId) this.taskForm = JSON.parse(JSON.stringify(task)) + this.taskForm.extraData = JSON.parse(this.taskForm.extraData) this.update_task_dialog_title = this.$t('dataset.task_edit_title') } this.update_task = true @@ -484,8 +552,10 @@ export default { } task.startTime = new Date(task.startTime).getTime() task.endTime = new Date(task.endTime).getTime() + const form = JSON.parse(JSON.stringify(task)) + form.extraData = JSON.stringify(form.extraData) const dataSetTaskRequest = { - datasetTableTask: task, + datasetTableTask: form, datasetTableIncrementalConfig: task.type === 'add_scope' ? this.incrementalConfig : undefined } post('/dataset/task/save', dataSetTaskRequest).then(response => { @@ -499,15 +569,6 @@ export default { this.search() }) }, - onRateChange() { - if (this.taskForm.rate === 'SIMPLE') { - this.taskForm.end = '0' - this.taskForm.endTime = '' - this.taskForm.cron = '' - } else { - this.taskForm.cron = '00 00 * ? * * *' - } - }, handleClose() { this.depts = null this.formType = 'add' diff --git a/frontend/src/views/system/task/TaskRecord.vue b/frontend/src/views/system/task/TaskRecord.vue index a9f3056c4f..7939b95540 100644 --- a/frontend/src/views/system/task/TaskRecord.vue +++ b/frontend/src/views/system/task/TaskRecord.vue @@ -28,6 +28,19 @@ + + {{ error_massage }} + + {{ $t('dataset.close') }} + + @@ -86,6 +99,8 @@ export default { formType: 'add', orderConditions: [], last_condition: null, + show_error_massage: false, + error_massage: '' } }, created() { @@ -120,7 +135,6 @@ export default { }, search(condition) { this.last_condition = condition - console.log(condition) condition = formatQuickCondition(condition, 'dataset_table_task.name') const temp = formatCondition(condition) const param = temp || {} @@ -130,22 +144,9 @@ export default { this.paginationConfig.total = response.data.itemCount }) }, - deleteTask(task) { - this.$confirm(this.$t('dataset.confirm_delete'), this.$t('dataset.tips'), { - confirmButtonText: this.$t('dataset.confirm'), - cancelButtonText: this.$t('dataset.cancel'), - type: 'warning' - }).then(() => { - post('/dataset/task/delete/' + task.id, null).then(response => { - this.$message({ - message: this.$t('dataset.delete_success'), - type: 'success', - showClose: true - }) - this.search() - }) - }).catch(() => { - }) + showErrorMassage(massage) { + this.show_error_massage = true + this.error_massage = massage } } }