From ffda9c618ecbb2db5aee0701ab45085c0c97b83f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=AD=E5=BA=86=E6=B3=B0?= <12369755+htcloud1@user.noreply.gitee.com> Date: Tue, 18 Aug 2026 23:00:41 +0800 Subject: [PATCH] =?UTF-8?q?feat(biz=5Fproject):=20=E5=8A=A0=20create=5Fuse?= =?UTF-8?q?r=5Fid=20=E5=88=97,=20JOIN=20biz=5Fperson=20=E5=8F=96=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E4=BA=BA=E5=A7=93=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _self/manager_meeting_new.md | 12 ++++++++++++ .../com/ruoyi/business/domain/BizProject.java | 8 ++++++++ .../service/impl/BizProjectServiceImpl.java | 9 ++++++++- .../mapper/business/BizProjectMapper.xml | 17 ++++++++++++++--- ry-vue3/src/views/manager/MeetingNew.vue | 6 +++--- 5 files changed, 45 insertions(+), 7 deletions(-) diff --git a/_self/manager_meeting_new.md b/_self/manager_meeting_new.md index b26e088..e885c19 100644 --- a/_self/manager_meeting_new.md +++ b/_self/manager_meeting_new.md @@ -36,6 +36,18 @@ | CSS 不是原型风格 (Element Plus 默认) | 完整照搬原型 CSS: #169bd5 主按钮 + 32px input + 12px 灰字面包屑 + 22px h1 + ff4d4f 红字 + grid 1fr 1fr + 768px 响应式 | | 字段映射 | 项目编号→projectNo, 项目名称→projectName, 总场次/总期数→totalSessions (不是 totalPeriods, biz_project 没此字段), 支持单位→sponsorOrgName (JOIN biz_org), 创建时间→createTime, 创建人员→createBy, 会议名称默认=项目名称 | +### 第三轮: biz_project 加 create_user_id 列 (commit `待push`) + +| 问题 | 修复 | +|---|---| +| `biz_project` 没存"创建人 user_id", 只存 `create_by varchar(64)` (兼容字段, 来自 BaseEntity MetaObjectHandler 自动填当前登录用户名), 新建会议页 `snap.createBy` 显示原始用户名而非真实姓名 | DB: `ALTER TABLE biz_project ADD COLUMN create_user_id bigint DEFAULT NULL COMMENT '创建人user_id (JOIN biz_person 取 name)' AFTER create_by;` | +| BizProject 实体无 `createUserId` / `createUserName` 字段 | `BizProject.java:80-83` 加 2 字段 + getter/setter; createUserName 不入库 (派生) | +| BizProjectMapper.xml 不查 `create_user_id` | `BizProjectMapper.xml:4-42 resultMap` 加 2 result; `selectFields` (主) + `selectFieldsForSponsor` + `selectExecutorList` 全部加 `p.create_user_id` 列 + `LEFT JOIN biz_person bp ON bp.user_id = p.create_user_id` 取 `bp.name as create_user_name`; INSERT/UPDATE 加 `create_user_id` (INSERT 由 service 自动写, 旧调用方兼容) | +| BizProjectServiceImpl.insert 不写 create_user_id | `BizProjectServiceImpl:32-37` 加 `entity.setCreateUserId(SecurityUtils.getUserId())` (留 null 给手工 import/seed 入口) | +| MeetingNew.vue 用 `snap.createBy` | 改 `snap.createUserName`; onMounted 兼容 `d.createUserName \|\| d.createBy \|\| ''` | +| 旧数据 (11 行) create_user_id 全 NULL, project 13 是 seed (create_time=NULL, lead_user_id=101) | **不回填** (用户指示: 测试数据, 无修改价值); 后续新项目 INSERT 自动带 user_id | +| 受影响角色 (免费) | sponsor/executor 端 `Projects.vue` 列表的"创建人"列 (如有) 也走新字段 — 暂未引用, 不破坏 | + --- ## 0. 4 跳定位 (铁律: 不按名字猜) diff --git a/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/domain/BizProject.java b/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/domain/BizProject.java index 5572532..e4310b6 100644 --- a/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/domain/BizProject.java +++ b/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/domain/BizProject.java @@ -80,6 +80,10 @@ public class BizProject extends BaseEntity { /** create_by */ @Excel(name = "create_by") private String createBy; + /** create_user_id (创建人 sys_user.user_id, JOIN biz_person 取 name) */ + private Long createUserId; + /** create_user_name (LEFT JOIN biz_person.name 派生, 不入库, 仅展示) */ + private String createUserName; /** create_time */ @Excel(name = "create_time") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @@ -183,6 +187,10 @@ public class BizProject extends BaseEntity { public void setIsBidProject(String isBidProject) { this.isBidProject = isBidProject; } public String getCreateBy() { return createBy; } public void setCreateBy(String createBy) { this.createBy = createBy; } + public Long getCreateUserId() { return createUserId; } + public void setCreateUserId(Long createUserId) { this.createUserId = createUserId; } + public String getCreateUserName() { return createUserName; } + public void setCreateUserName(String createUserName) { this.createUserName = createUserName; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public String getUpdateBy() { return updateBy; } diff --git a/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/service/impl/BizProjectServiceImpl.java b/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/service/impl/BizProjectServiceImpl.java index 7b5d147..0be87b4 100644 --- a/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/service/impl/BizProjectServiceImpl.java +++ b/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/service/impl/BizProjectServiceImpl.java @@ -6,6 +6,7 @@ import org.springframework.stereotype.Service; import com.ruoyi.business.domain.BizProject; import com.ruoyi.business.mapper.BizProjectMapper; import com.ruoyi.business.service.IBizProjectService; +import com.ruoyi.common.utils.SecurityUtils; @Service public class BizProjectServiceImpl implements IBizProjectService @@ -28,7 +29,13 @@ public class BizProjectServiceImpl implements IBizProjectService @Override // 注: biz_project.project_id 用 DB AUTO_INCREMENT, 不需要 SnowflakeId 注入; // 项目 ID 用 Long 后, SnowflakeId.injectIfEmpty 反射 setProjectId(String) 会 NoSuchMethodException 被吞掉 (SnowflakeId.java:30-31), 行为安全. - public int insert(BizProject entity) { return bizProjectMapper.insert(entity); } + // create_user_id 走当前登录用户 (前台 API 无 @DataScope, 不会被过滤; 后台 @PreAuthorize 受角色限制) + public int insert(BizProject entity) { + if (entity.getCreateUserId() == null) { + entity.setCreateUserId(SecurityUtils.getUserId()); + } + return bizProjectMapper.insert(entity); + } @Override public int updateByPrimaryKey(BizProject entity) { return bizProjectMapper.updateByPrimaryKey(entity); } diff --git a/ry-api/ruoyi-business/src/main/resources/mapper/business/BizProjectMapper.xml b/ry-api/ruoyi-business/src/main/resources/mapper/business/BizProjectMapper.xml index 8a908b6..c7dda30 100644 --- a/ry-api/ruoyi-business/src/main/resources/mapper/business/BizProjectMapper.xml +++ b/ry-api/ruoyi-business/src/main/resources/mapper/business/BizProjectMapper.xml @@ -27,6 +27,8 @@ + + @@ -41,9 +43,10 @@ - select p.project_id, p.project_no, p.project_name, p.total_sessions, p.done_sessions, p.todo_sessions, p.total_amount, p.available_amount, p.paid_labor_amount, p.paid_meeting_amount, p.manager_score, p.sponsor_score, p.sponsor_admin_user_name, p.project_form, p.is_finished, p.is_settled, p.sponsor_admin_user_id, p.lead_user_id, p.is_bid_project, p.create_by, p.create_time, p.update_by, p.update_time, p.manage_fee, p.start_time, p.end_time, p.submit_deadline_days, p.support_contract_url, p.execute_contract_url, p.invitation_url, p.support_letter_url, p.publish_url, + select p.project_id, p.project_no, p.project_name, p.total_sessions, p.done_sessions, p.todo_sessions, p.total_amount, p.available_amount, p.paid_labor_amount, p.paid_meeting_amount, p.manager_score, p.sponsor_score, p.sponsor_admin_user_name, p.project_form, p.is_finished, p.is_settled, p.sponsor_admin_user_id, p.lead_user_id, p.is_bid_project, p.create_by, p.create_user_id, p.create_time, p.update_by, p.update_time, p.manage_fee, p.start_time, p.end_time, p.submit_deadline_days, p.support_contract_url, p.execute_contract_url, p.invitation_url, p.support_letter_url, p.publish_url, o.org_name as sponsor_org_name, lu.user_name as lead_user_name, + bp.name as create_user_name, (select group_concat(distinct o2.org_name separator ',') from biz_project_assign bpa join biz_org o2 on o2.org_id = bpa.execution_unit_id and o2.org_type = 'executor' @@ -51,6 +54,7 @@ from biz_project p left join biz_org o on o.user_id = p.sponsor_admin_user_id and o.org_type = 'sponsor' left join sys_user lu on lu.user_id = p.lead_user_id + left join biz_person bp on bp.user_id = p.create_user_id @@ -59,12 +63,13 @@ p.total_amount, p.available_amount, p.paid_labor_amount, p.paid_meeting_amount, p.manager_score, p.sponsor_score, p.sponsor_admin_user_name, p.project_form, p.is_finished, p.is_settled, p.sponsor_admin_user_id, p.lead_user_id, p.is_bid_project, - p.create_by, p.create_time, p.update_by, p.update_time, p.manage_fee, + p.create_by, p.create_user_id, p.create_time, p.update_by, p.update_time, p.manage_fee, p.start_time, p.end_time, p.submit_deadline_days, p.support_contract_url, p.execute_contract_url, p.invitation_url, p.support_letter_url, p.publish_url, o.org_name as sponsor_org_name, lu.user_name as lead_user_name, + bp.name as create_user_name, (select group_concat(distinct o2.org_name separator ',') from biz_project_assign bpa join biz_org o2 on o2.org_id = bpa.execution_unit_id and o2.org_type = 'executor' @@ -72,6 +77,7 @@ from biz_project p left join biz_org o on o.user_id = p.sponsor_admin_user_id and o.org_type = 'sponsor' left join sys_user lu on lu.user_id = p.lead_user_id + left join biz_person bp on bp.user_id = p.create_user_id - select distinct p.project_id, p.project_no, p.project_name, p.total_sessions, p.done_sessions, p.todo_sessions, p.total_amount, p.available_amount, p.paid_labor_amount, p.paid_meeting_amount, p.manager_score, p.sponsor_score, p.sponsor_admin_user_name, p.project_form, p.is_finished, p.is_settled, p.sponsor_admin_user_id, p.lead_user_id, p.is_bid_project, p.create_by, p.create_time, p.update_by, p.update_time, p.manage_fee, p.start_time, p.end_time, p.submit_deadline_days, p.support_contract_url, p.execute_contract_url, p.invitation_url, p.support_letter_url, p.publish_url, + select distinct p.project_id, p.project_no, p.project_name, p.total_sessions, p.done_sessions, p.todo_sessions, p.total_amount, p.available_amount, p.paid_labor_amount, p.paid_meeting_amount, p.manager_score, p.sponsor_score, p.sponsor_admin_user_name, p.project_form, p.is_finished, p.is_settled, p.sponsor_admin_user_id, p.lead_user_id, p.is_bid_project, p.create_by, p.create_user_id, p.create_time, p.update_by, p.update_time, p.manage_fee, p.start_time, p.end_time, p.submit_deadline_days, p.support_contract_url, p.execute_contract_url, p.invitation_url, p.support_letter_url, p.publish_url, o.org_name as sponsor_org_name, lu.user_name as lead_user_name, + bp.name as create_user_name, (select group_concat(distinct o2.org_name separator ',') from biz_project_assign bpa2 join biz_org o2 on o2.org_id = bpa2.execution_unit_id and o2.org_type = 'executor' @@ -126,6 +133,7 @@ join biz_project_assign a on a.project_id = p.project_id left join biz_org o on o.user_id = p.sponsor_admin_user_id and o.org_type = 'sponsor' left join sys_user lu on lu.user_id = p.lead_user_id + left join biz_person bp on bp.user_id = p.create_user_id (a.exec_user_id = #{params.executorUserId} or a.execution_unit_id = (select org_id from biz_org where user_id = #{params.executorUserId} and org_type = 'executor')) @@ -204,6 +212,7 @@ lead_user_id, is_bid_project, create_by, + create_user_id, create_time, update_by, update_time, @@ -238,6 +247,7 @@ #{leadUserId}, #{isBidProject}, #{createBy}, + #{createUserId}, #{createTime}, #{updateBy}, #{updateTime}, @@ -283,6 +293,7 @@ lead_user_id = #{leadUserId}, is_bid_project = #{isBidProject}, create_by = #{createBy}, + create_user_id = #{createUserId}, create_time = #{createTime}, update_by = #{updateBy}, update_time = #{updateTime}, diff --git a/ry-vue3/src/views/manager/MeetingNew.vue b/ry-vue3/src/views/manager/MeetingNew.vue index 2f40f1e..30e38fd 100644 --- a/ry-vue3/src/views/manager/MeetingNew.vue +++ b/ry-vue3/src/views/manager/MeetingNew.vue @@ -24,7 +24,7 @@ {{ snap.createTime }} - {{ snap.createBy }} + {{ snap.createUserName }} @@ -72,7 +72,7 @@ const snap = reactive({ totalSessions: '', sponsorOrgName: '', createTime: '', - createBy: '' + createUserName: '' }) // 表单 (右列 5 项: meetingName 只读 + 4 输入) @@ -126,7 +126,7 @@ onMounted(async () => { snap.totalSessions = d.totalSessions ?? '' snap.sponsorOrgName = d.sponsorOrgName || '' snap.createTime = d.createTime || '' - snap.createBy = d.createBy || '' + snap.createUserName = d.createUserName || d.createBy || '' // 会议名称默认 = 项目名称 (跟红字提示一致) form.projectNo = d.projectNo || '' form.projectName = d.projectName || ''