更新若干功能
This commit is contained in:
1 parent
892ba5886d
commit
79d5ae6b66
45 files changed
+6755
-38
No files matched your search
@@ -0,0 +1,44 @@
|
||||
-- =============================================================
|
||||
-- OA工作日报:删除改为软删除(已建表环境执行)
|
||||
--
|
||||
-- 背景:原设计为物理删除(日报被删时同步删除评论),现改为软删除。
|
||||
-- 日报:is_deleted=0 未删除;删除时写入记录 ID 作为删除批次标记。
|
||||
-- 评论:is_deleted=0 未删除;删除时置 1。
|
||||
--
|
||||
-- 为什么唯一键要加 is_deleted:
|
||||
-- 原唯一键 (tid, user_id, report_date) 会让「删除后同一天重新填写」与
|
||||
-- 历史软删记录冲突。把 is_deleted 加入唯一键后,删除时写入记录 ID
|
||||
-- (每条记录 ID 唯一),同一天可反复「填写→删除→重新填写」。
|
||||
--
|
||||
-- 适用:已执行过 create_oa_dailyreport.sql 的环境;
|
||||
-- 新库直接执行 create_oa_dailyreport.sql 即为软删除结构,无需本脚本。
|
||||
-- 幂等:重复执行安全。
|
||||
-- =============================================================
|
||||
|
||||
USE `go-platform`;
|
||||
|
||||
-- 1) is_deleted 扩为 BIGINT UNSIGNED,用于存放删除批次(记录 ID)。MODIFY 幂等。
|
||||
ALTER TABLE `yz_backend_oa_daily_report`
|
||||
MODIFY COLUMN `is_deleted` BIGINT UNSIGNED NOT NULL DEFAULT 0
|
||||
COMMENT '软删除标记:0=未删除;删除时写入记录ID(避免唯一键冲突)';
|
||||
|
||||
-- 2) 唯一键加入 is_deleted(先判断当前索引列,避免重复执行报 1091)
|
||||
SET @idx_cols := (
|
||||
SELECT GROUP_CONCAT(`COLUMN_NAME` ORDER BY `SEQ_IN_INDEX`)
|
||||
FROM `information_schema`.`STATISTICS`
|
||||
WHERE `TABLE_SCHEMA` = DATABASE()
|
||||
AND `TABLE_NAME` = 'yz_backend_oa_daily_report'
|
||||
AND `INDEX_NAME` = 'uk_tid_user_date'
|
||||
);
|
||||
SET @ddl := IF(
|
||||
@idx_cols = 'tid,user_id,report_date,is_deleted',
|
||||
'SELECT ''uk_tid_user_date 已包含 is_deleted,跳过'' AS msg',
|
||||
'ALTER TABLE `yz_backend_oa_daily_report` DROP INDEX `uk_tid_user_date`, ADD UNIQUE KEY `uk_tid_user_date` (`tid`, `user_id`, `report_date`, `is_deleted`)'
|
||||
);
|
||||
PREPARE stmt FROM @ddl;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- 3) 核对结果
|
||||
SHOW INDEX FROM `yz_backend_oa_daily_report` WHERE `Key_name` = 'uk_tid_user_date';
|
||||
SHOW FULL COLUMNS FROM `yz_backend_oa_daily_report` WHERE `Field` = 'is_deleted';
|
||||
@@ -0,0 +1,11 @@
|
||||
-- 微信小程序多应用表补充「小程序码」字段
|
||||
-- 平台端「小程序配置 - 新增/编辑小程序」上传并保存二维码图片地址,
|
||||
-- 官网 / H5 等其他端通过 GET /site/miniapp 读取 qrcode_url 展示。
|
||||
-- 存储格式:上传后的访问地址(本地为 /uploads/...,七牛为 CDN 绝对地址)
|
||||
ALTER TABLE `yz_platform_wechat_mini_app`
|
||||
ADD COLUMN `qrcode_url` varchar(512) NOT NULL DEFAULT '' COMMENT '小程序码图片地址(供官网/H5等其他端调取)' AFTER `app_secret`;
|
||||
|
||||
-- 结果校验
|
||||
SELECT id, name, app_id, enabled, qrcode_url
|
||||
FROM yz_platform_wechat_mini_app
|
||||
WHERE delete_time IS NULL;
|
||||
@@ -0,0 +1,66 @@
|
||||
-- =============================================================
|
||||
-- OA 工作日报 —— 表结构
|
||||
--
|
||||
-- 对应代码:
|
||||
-- models/oa_daily_report.go
|
||||
-- services/oauth/dailyreport_service.go
|
||||
-- controllers/backend_oa_dailyreport.go(后台 PC 端)
|
||||
-- controllers/app_oa_dailyreport.go(小程序端)
|
||||
--
|
||||
-- 设计要点:
|
||||
-- 1. 每人每天一条日报,用 (tid, user_id, report_date, is_deleted) 唯一键约束;
|
||||
-- user_id 存 SystemTenantUser.uid(不是 JWT 里的 identity_id)。
|
||||
-- 2. 删除为软删除:is_deleted=0 表示未删除;删除时写入记录 ID 作为删除批次标记,
|
||||
-- 使唯一键在「删除后同一天重新填写」时不与历史软删记录冲突。
|
||||
-- 评论同步软删除(is_deleted=1)。
|
||||
-- 3. 同一天允许先存草稿(status=0)后提交(status=1)。
|
||||
-- 4. 不显式指定 COLLATE,沿用数据库默认排序规则,避免与其他表
|
||||
-- JOIN 字符串时出现 Illegal mix of collations。
|
||||
-- =============================================================
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
|
||||
-- ---------------- 1. 工作日报主表 ----------------
|
||||
CREATE TABLE IF NOT EXISTS `yz_backend_oa_daily_report` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`tid` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '租户ID',
|
||||
`user_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '作者uid(yz_system_tenant_user.uid)',
|
||||
`user_name` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '作者姓名快照',
|
||||
`org_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '作者部门ID(yz_backend_organization.id)',
|
||||
`org_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '部门名称快照',
|
||||
`report_date` DATE NOT NULL COMMENT '日报日期',
|
||||
`today_done` TEXT COMMENT '今日完成',
|
||||
`tomorrow_plan` TEXT COMMENT '明日计划',
|
||||
`issues` TEXT COMMENT '问题与建议',
|
||||
`attachments` TEXT COMMENT '附件JSON数组:[{"id":1,"url":"","name":"","size":0}]',
|
||||
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '0草稿 1已提交',
|
||||
`submit_time` DATETIME DEFAULT NULL COMMENT '提交时间',
|
||||
`is_deleted` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '软删除标记:0=未删除;删除时写入记录ID(避免唯一键冲突)',
|
||||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`update_time` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
|
||||
`delete_time` DATETIME DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_tid_user_date` (`tid`, `user_id`, `report_date`, `is_deleted`),
|
||||
KEY `idx_tid_date` (`tid`, `report_date`),
|
||||
KEY `idx_tid_org_date` (`tid`, `org_id`, `report_date`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='OA-工作日报';
|
||||
|
||||
-- ---------------- 2. 日报评论表 ----------------
|
||||
-- reply_to_id 指向同表评论ID,用于两级回复(0 表示直接评论日报)。
|
||||
CREATE TABLE IF NOT EXISTS `yz_backend_oa_daily_report_comment` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`tid` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '租户ID',
|
||||
`report_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '日报ID',
|
||||
`user_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '评论人uid',
|
||||
`user_name` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '评论人姓名快照',
|
||||
`content` VARCHAR(1000) NOT NULL DEFAULT '' COMMENT '评论内容',
|
||||
`reply_to_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '回复的评论ID,0=直接评论',
|
||||
`reply_to_name` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '被回复人姓名快照',
|
||||
`is_deleted` TINYINT NOT NULL DEFAULT 0 COMMENT '软删除标记:0=未删除 1=已删除',
|
||||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`update_time` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
|
||||
`delete_time` DATETIME DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_report` (`report_id`, `id`),
|
||||
KEY `idx_tid` (`tid`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='OA-工作日报评论';
|
||||
@@ -12,6 +12,7 @@ CREATE TABLE IF NOT EXISTS yz_platform_wechat_mini_app (
|
||||
name varchar(128) NOT NULL DEFAULT '' COMMENT '应用名称',
|
||||
app_id varchar(64) NOT NULL COMMENT '小程序 AppID',
|
||||
app_secret varchar(512) NOT NULL DEFAULT '' COMMENT 'AppSecret(AES-256-GCM 加密存储)',
|
||||
qrcode_url varchar(512) NOT NULL DEFAULT '' COMMENT '小程序码图片地址(供官网/H5等其他端调取)',
|
||||
enabled tinyint NOT NULL DEFAULT 0 COMMENT '1=启用 0=停用',
|
||||
auto_bind tinyint NOT NULL DEFAULT 1 COMMENT '1=手机号命中身份后自动绑定小程序',
|
||||
remark varchar(255) NOT NULL DEFAULT '' COMMENT '备注',
|
||||
@@ -32,6 +33,6 @@ WHERE c.app_id <> ''
|
||||
);
|
||||
|
||||
-- 结果校验
|
||||
SELECT id, name, app_id, enabled, auto_bind, remark
|
||||
SELECT id, name, app_id, enabled, auto_bind, remark, qrcode_url
|
||||
FROM yz_platform_wechat_mini_app
|
||||
WHERE delete_time IS NULL;
|
||||
@@ -0,0 +1,64 @@
|
||||
-- ============================================================
|
||||
-- OA 工作日报 —— 菜单配置(yz_system_menu)
|
||||
-- 幂等脚本:按 path 判重,重复执行不会产生重复菜单
|
||||
-- 执行:mysql -h <host> -P <port> -u <user> -p <db> < oa_dailyreport_menus.sql
|
||||
--
|
||||
-- 挂载位置:OA → 个人办公(path = '/apps/oa/personal')
|
||||
-- 页面:我的日报 + 团队日报(同一页面内 Tab,团队 Tab 由接口权限决定是否显示)
|
||||
-- 说明:platforms 显式声明为 Web + APP(JSON:["web","app"]),小程序端
|
||||
-- 通过 utils/nav.js 的原生规则跳转到 pages/oa/dailyreport/index。
|
||||
--
|
||||
-- 注意:租户端角色(cid=2)的 rights 是显式菜单 ID 列表,菜单接口会按
|
||||
-- rights 过滤。只插菜单不授权,会导致「个人办公」目录可见但
|
||||
-- 「工作日报」被过滤掉。因此本脚本同时把菜单 ID 追加到角色 rights。
|
||||
-- ============================================================
|
||||
|
||||
SET @personal_id := (
|
||||
SELECT id FROM yz_system_menu
|
||||
WHERE path = '/apps/oa/personal' AND delete_time IS NULL
|
||||
LIMIT 1
|
||||
);
|
||||
|
||||
INSERT INTO yz_system_menu
|
||||
(pid, title, path, component_path, icon, sort, status, is_visible, views, platforms, type, creater, remark)
|
||||
SELECT @personal_id, '工作日报', '/apps/oa/dailyreport', '/apps/oa/dailyreport/index.vue',
|
||||
'Notebook', 3, 1, 1, '[2]', '["web","app"]', 2, 'system',
|
||||
'按日填写今日完成/明日计划/问题建议,支持附件与评论;主管可查看团队汇总'
|
||||
FROM DUAL
|
||||
WHERE @personal_id IS NOT NULL
|
||||
AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM yz_system_menu WHERE path = '/apps/oa/dailyreport' AND delete_time IS NULL) x);
|
||||
|
||||
-- 已有菜单的组件路径统一为带前导斜杠(与个人办公下其他菜单一致)
|
||||
UPDATE yz_system_menu
|
||||
SET component_path = '/apps/oa/dailyreport/index.vue'
|
||||
WHERE path = '/apps/oa/dailyreport'
|
||||
AND delete_time IS NULL
|
||||
AND component_path = 'apps/oa/dailyreport/index.vue';
|
||||
|
||||
SET @report_menu_id := (
|
||||
SELECT id FROM yz_system_menu
|
||||
WHERE path = '/apps/oa/dailyreport' AND delete_time IS NULL
|
||||
LIMIT 1
|
||||
);
|
||||
|
||||
-- ---------- 角色授权:把菜单追加到所有租户端角色的 rights ----------
|
||||
-- 只处理 rights 非空(显式授权)的角色;rights 为空表示全权限,无需追加。
|
||||
UPDATE yz_system_admin_role
|
||||
SET rights = CAST(JSON_ARRAY_APPEND(CAST(rights AS JSON), '$', @report_menu_id) AS CHAR)
|
||||
WHERE cid = 2
|
||||
AND rights IS NOT NULL
|
||||
AND TRIM(rights) <> ''
|
||||
AND JSON_VALID(rights)
|
||||
AND @report_menu_id IS NOT NULL
|
||||
AND NOT JSON_CONTAINS(CAST(rights AS JSON), CAST(@report_menu_id AS JSON));
|
||||
|
||||
-- ---------- 结果校验 ----------
|
||||
SELECT id, pid, title, path, component_path, platforms, type, sort
|
||||
FROM yz_system_menu
|
||||
WHERE delete_time IS NULL AND path = '/apps/oa/dailyreport';
|
||||
|
||||
SELECT id, name, tenant_id,
|
||||
JSON_CONTAINS(CAST(rights AS JSON), CAST(@report_menu_id AS JSON)) AS has_dailyreport
|
||||
FROM yz_system_admin_role
|
||||
WHERE cid = 2 AND rights IS NOT NULL AND TRIM(rights) <> ''
|
||||
ORDER BY tenant_id, id;
|
||||
Reference in new issue
Block a user