更新若干功能

This commit is contained in:
hero920103 committed 2026-10-21 17:45:50 +08:00
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;
+66
View File
@@ -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-工作日报评论';
+2 -1
View File
@@ -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;
+64
View File
@@ -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;