Skip to content

Commit

Permalink
在instance表添加业务低峰时段执行工单执行
Browse files Browse the repository at this point in the history
  • Loading branch information
woshiyanghai committed Jan 24, 2025
1 parent c78bf80 commit b6d187b
Show file tree
Hide file tree
Showing 5 changed files with 84 additions and 53 deletions.
44 changes: 17 additions & 27 deletions common/templates/config.html
Original file line number Diff line number Diff line change
Expand Up @@ -161,26 +161,6 @@ <h4 style="color: darkgrey"><b>功能模块配置</b></h4>
<h5 style="color: darkgrey"><b>SQL上线</b></h5>
<hr/>
<div class="form-horizontal">
<div class="form-group">
<label for="query_low_peak_start"
class="col-sm-4 control-label">QUERY_LOW_PEAK_START</label>
<div class="col-sm-5">
<input type="number" class="form-control" id="query_low_peak_start"
key="query_low_peak_start"
value="{{ config.query_low_peak_start }}"
placeholder="每天业务低峰开始时间,单位小时,默认为空" />
</div>
</div>
<div class="form-group">
<label for="query_low_peak_end"
class="col-sm-4 control-label">QUERY_LOW_PEAK_END</label>
<div class="col-sm-5">
<input type="number" class="form-control" id="query_low_peak_end"
key="query_low_peak_end"
value="{{ config.query_low_peak_end }}"
placeholder="每天业务低峰结束时间,单位小时,默认为空" />
</div>
</div>
<div class="form-group">
<label for="critical_ddl_regex"
class="col-sm-4 control-label">CRITICAL_DDL_REGEX</label>
Expand Down Expand Up @@ -324,6 +304,18 @@ <h5 style="color: darkgrey"><b>SQL上线</b></h5>
</div>
</div>
</div>
<div class="form-group">
<label for="query_low_peak_query"
class="col-sm-4 control-label">QUERY_LOW_PEAK_QUERY</label>
<div class="col-sm-5">
<select id="query_low_peak_query" key="query_low_peak_query"
class="selectpicker show-tick form-control bs-select-hidden"
data-live-search="true"
data-none-selected-text="必须在低峰期执行操作操作?默认DDL"
multiple required>
</select>
</div>
</div>
<div class="form-group">
<label for="ban_self_audit"
class="col-sm-4 control-label">BAN_SELF_AUDIT</label>
Expand Down Expand Up @@ -1203,6 +1195,11 @@ <h5 class="control-label text-bold">当前审批流程:<b id="workflow_auditor
$("#notify_phase_control").selectpicker('render');
$("#notify_phase_control").selectpicker('refresh');

// query_low_peak_query参数处理
let queryConfig = "{{ config.query_low_peak_query }}";
let queryPhases = ['DML', 'DDL'];
setupSelectPicker("#query_low_peak_query", queryConfig, queryPhases);

// api_user_whitelist参数处理
let api_config = "{{ config.api_user_whitelist }}";
$.ajax({
Expand Down Expand Up @@ -1339,13 +1336,6 @@ <h5 class="control-label text-bold">当前审批流程:<b id="workflow_auditor
return;
}
}
// 业务低峰期时间设置开始时间和结束时间必须同时填写
var start = $("#query_low_peak_start").val();
var end = $("#query_low_peak_end").val();
if ((start === "" && end !== "") || (start !== "" && end === "")) {
alert('业务低峰开始时间和结束时间必须同时填写!');
return;
}
var sys_config = $("#div-system-config");
var configs = [];
sys_config.find('[key]').each(
Expand Down
19 changes: 19 additions & 0 deletions sql/models.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
# -*- coding: UTF-8 -*-
import re
from typing import Optional

from django.db import models
from django.contrib.auth.models import AbstractUser
from mirage import fields
from django.utils.translation import gettext as _
from mirage.crypto import Crypto
from django.core.exceptions import ValidationError

from common.utils.const import WorkflowStatus, WorkflowType, WorkflowAction

Expand Down Expand Up @@ -176,6 +178,16 @@ class Meta:
verbose_name = "隧道配置"
verbose_name_plural = "隧道配置"

def validate_peak_time_period(value):
"""
验证 peak_time_period 格式是否正确。
格式示例: "14:00-14:50,15:00-16:00"
"""
time_period_regex = r'^(\d{2}:\d{2}-\d{2}:\d{2})(,\d{2}:\d{2}-\d{2}:\d{2})*$'
if not re.match(time_period_regex, value):
raise ValidationError(
'时间段格式不正确,正确格式为 "HH:MM-HH:MM" 或 "HH:MM-HH:MM,HH:MM-HH:MM"'
)

class Instance(models.Model):
"""
Expand Down Expand Up @@ -223,6 +235,13 @@ class Instance(models.Model):
on_delete=models.CASCADE,
default=None,
)
peak_time_period = models.CharField(
"业务低峰时间段",
max_length=255,
default="",
blank=True,
validators=[validate_peak_time_period]
)
create_time = models.DateTimeField("创建时间", auto_now_add=True)
update_time = models.DateTimeField("更新时间", auto_now=True)

Expand Down
17 changes: 10 additions & 7 deletions sql/sql_workflow.py
Original file line number Diff line number Diff line change
Expand Up @@ -307,14 +307,17 @@ def execute(request):
"errMsg": "不在可执行时间范围内,如果需要修改执行时间请重新提交工单!"
}
return render(request, "error.html", context)
sys_config = SysConfig()
if not request.user.is_superuser and on_query_low_peak_time_ddl(workflow_id) is False:
start = sys_config.get("query_low_peak_start", 0)
end = sys_config.get("query_low_peak_end", 24)
context = {
"errMsg": "管理员设置了业务低峰期时间范围:每天%s:00至%s,你只能在业务低峰时间范围执行DDL工单操作!" % (start, end)
}
if not request.user.is_superuser:
sys_config = SysConfig()
is_allowed, time_periods = on_query_low_peak_time_ddl(workflow_id)
if not is_allowed:
peak_action = sys_config.get("query_low_peak_query", "")
context = {
"errMsg": "管理员设置了实例业务低峰时间范围:%s,你只能在业务低峰时间范围执行%s工单操作!"
% (time_periods, peak_action)
}
return render(request, "error.html", context)

# 获取审核信息
audit_id = Audit.detail_by_workflow_id(
workflow_id=workflow_id, workflow_type=WorkflowType.SQL_REVIEW
Expand Down
36 changes: 24 additions & 12 deletions sql/utils/sql_review.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from django.db import transaction

from sql.engines.models import ReviewResult
from sql.models import SqlWorkflow
from sql.models import SqlWorkflow,Instance
from common.config import SysConfig
from sql.utils.resource_group import user_groups
from sql.utils.sql_utils import remove_comments
Expand Down Expand Up @@ -42,23 +42,35 @@ def can_execute(user, workflow_id):

def on_query_low_peak_time_ddl(workflow_id, run_date=None):
"""
判断是否是ddl,ddl必须在业务低峰期执行,包括人工执行和定时执行
判断是否是DDL,DDL必须在业务低峰期执行,包括人工执行和定时执行
:param workflow_id:
:param run_date:
:return:
:return: bool
"""
config = SysConfig()
workflow_detail = SqlWorkflow.objects.get(id=workflow_id)
start = int(config.get("query_low_peak_start", ""))
end = int(config.get("query_low_peak_end", ""))
result = True
ctime = run_date or datetime.datetime.now()
hour = ctime.hour
instance_id = workflow_detail.instance_id # 假设 SqlWorkflow 有 instance_id 字段
instance = Instance.objects.get(id=instance_id)
peak_time_period = instance.peak_time_period

# 解析 peak_time_period 字符串为时间段列表
if peak_time_period:
time_periods = [
tuple(map(int, period.split('-')))
for period in peak_time_period.split(',')
]
else:
time_periods = []

ctime = run_date or datetime.now()
current_hour = ctime.hour
syntax_type = workflow_detail.syntax_type

# 如果是DDL操作,检查当前时间是否在低峰期
if syntax_type == 1:
if (start and hour < start) or (end and hour > end):
result = False
return result
if not any(start <= current_hour < end for start, end in time_periods):
return False,time_periods

return True,None


def on_correct_time_period(workflow_id, run_date=None):
Expand Down
21 changes: 14 additions & 7 deletions sql_api/api_workflow.py
Original file line number Diff line number Diff line change
Expand Up @@ -340,13 +340,20 @@ def post(self, request):
"errors": "不在可执行时间范围内,如果需要修改执行时间请重新提交工单!"
}
)
sys_config = SysConfig()
if not request.user.is_superuser and on_query_low_peak_time_ddl(workflow_id) is False:
start = sys_config.get("query_low_peak_start", 0)
end = sys_config.get("query_low_peak_end", 24)
raise serializers.ValidationError(
{"errMsg": "管理员设置了业务低峰期时间范围:每天%s:00至%s,你只能在业务低峰时间范围执行DDL工单操作!" % (start, end)}
)
is_allowed, error_message = on_query_low_peak_time_ddl(workflow_id)
if not request.user.is_superuser and not is_allowed:
raise serializers.ValidationError({"errMsg": error_message})
if not request.user.is_superuser:
sys_config = SysConfig()
is_allowed, time_periods = on_query_low_peak_time_ddl(workflow_id)
if not is_allowed:
peak_action = sys_config.get("query_low_peak_query", "")
raise serializers.ValidationError(
{
"errMsg": "管理员设置了业务低峰期时间范围:%s,你只能在业务低峰时间范围执行%s工单操作!"
% (time_periods, peak_action)
}
)

# 获取审核信息
audit_id = Audit.detail_by_workflow_id(
Expand Down

0 comments on commit b6d187b

Please sign in to comment.