You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

236 lines
5.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import os
import re
from datetime import datetime
from flask import render_template, request
from common.logger import system_logger
# =========================
# 路径
# =========================
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
UPLOAD_FOLDER = os.path.join(BASE_DIR, "uploads")
OUTPUT_FOLDER = os.path.join(BASE_DIR, "output")
os.makedirs(UPLOAD_FOLDER, exist_ok=True)
os.makedirs(OUTPUT_FOLDER, exist_ok=True)
# =========================
# 工具:时间
# =========================
def now_str():
return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# =========================
# 校验工号
# =========================
def validate_emp_id(emp_id: str):
if not emp_id:
return False, "工作证号不能为空"
if not re.fullmatch(r"\d{8}", emp_id):
return False, "工作证号必须为8位数字如 00313390"
return True, None
# =========================
# SQL授权模式原逻辑
# =========================
def build_auth_sql(center_name: str, emp_id: str):
like_center = f"%{center_name}%"
ts = now_str()
return f"""-- =========================================
-- 每周动态人员授权 SQL标准版
-- 生成时间: {ts}
-- 中心: {center_name}
-- 工号: {emp_id}
-- =========================================
-- =========================
-- Step 1: 获取部门ID
-- =========================
select f_id as department_id
from wd_department
where f_name like '{like_center}';
-- =========================
-- Step 2: 查询部门下已有人员配置
-- =========================
select *
from wd_user
where f_department = (
select f_id
from wd_department
where f_name like '{like_center}'
);
-- =========================
-- Step 3: 查询人员基础信息
-- =========================
select
f_user_id,
f_user_name,
t.f_phone
from t_wxdept_users t
where f_user_id = '{emp_id}';
-- =========================
-- Step 4: 获取新增主键
-- =========================
select max(f_id) + 1 as f_id
from wd_user;
-- =========================
-- Step 5: 新增用户(授权核心)
-- =========================
insert into wd_user values(
'主键',
'人员姓名',
'{emp_id}',
(
select f_id
from wd_department
where f_name like '{like_center}'
),
0,
'手机号',
now()
);
commit;
-- =========================
-- Step 6: 更新用户信息(兜底同步)
-- =========================
update wd_user
set
f_name = '人员姓名',
f_uid = '{emp_id}',
f_desc = '{emp_id}'
where f_id = 10182;
commit;
"""
# =========================
# SQL重复动态处理新增核心
# =========================
def build_rebuild_sql(center_name: str):
like_center = f"%{center_name}%"
ts = now_str()
return f"""-- =========================================
-- 重复动态处理 SQL
-- 生成时间: {ts}
-- 中心: {center_name}
-- =========================================
-- 1. 获取部门ID
select * from wd_department where f_name like '{like_center}';
-- 2. 获取最新关联动态ID
select * from wd_department where f_name like '{like_center}';
-- 3. 查最新通知记录(按时间)
select *
from wd_document
where f_department_id = (
select f_id from wd_department where f_name like '{like_center}'
)
order by f_create_date desc;
-- 4. 查重复通知ID示例
select *
from wd_document
where f_department_id = (
select f_id from wd_department where f_name like '{like_center}'
)
and f_id in (44992, 44991)
order by f_create_date desc;
-- 5. 查附件
select *
from wd_attachment
where f_document in (44992, 44991);
-- 6. 删除重复通知(保留最新)
delete from wd_document
where f_department_id = (
select f_id from wd_department where f_name like '{like_center}'
)
and f_id in (44991);
delete from wd_attachment
where f_document in (44991);
-- 7. 重新确认
select * from wd_document
where f_department_id = (
select f_id from wd_department where f_name like '{like_center}'
);
select * from wd_attachment
where f_document in (44991);
"""
# =========================
# 页面入口
# =========================
def weekly_permission_page():
sql_text = None
message = None
center_name = ""
emp_id = ""
try:
if request.method == "POST":
center_name = (request.form.get("center_name") or "").strip()
emp_id = (request.form.get("emp_id") or "").strip()
action = (request.form.get("action") or "auth").strip()
# ===== 校验 =====
if not center_name:
raise Exception("中心名称不能为空")
ok, err = validate_emp_id(emp_id)
if not ok:
raise Exception(err)
# ===== 分流核心 =====
if action == "auth":
sql_text = build_auth_sql(center_name, emp_id)
message = "授权SQL生成成功"
elif action == "rebuild":
sql_text = build_rebuild_sql(center_name)
message = "重复动态处理SQL生成成功"
else:
raise Exception("未知操作类型")
system_logger.info(
f"[WeeklySQL] action={action}, center={center_name}, emp_id={emp_id}"
)
except Exception as e:
message = f"错误:{str(e)}"
system_logger.exception("[WeeklyPermission ERROR]")
return render_template(
"weekly_permission.html",
sql_text=sql_text,
message=message,
center_name=center_name,
emp_id=emp_id
)