feat(meeting): 会议详情页参会人 CRUD + BizProjectPlan audit 字段

- 后端: BizMeetingAttendee 增 list/add/update/delete 4 端点
  按手机号定位 sys_user (无则新建, 用户名=密码=phone, role_type='doctor')
  Mapper: insertWithProfile (一次写完整档案) + deleteByPrimaryKey
  Service: insertByPhoneWithProfile (重复参会人抛友好异常)
- #4 配套: BizProjectPlan.auditOpinion/auditBy/auditTime + 关联项目名
  BizProjectPlan.projectName (LEFT JOIN biz_project) 用于 #4 通知 content
- 前端 MeetingDetail.vue: 劳务材料 tab 内, 劳务明细表 file-row 下方
  直接出表 (无表题), 含姓名/手机/单位/科室/职称/劳务费/签字状态/操作
  新增/编辑 dialog 共用, 删除走 ElMessageBox.confirm 二次确认
- 触发 #5: 新参会人 POST 时也发会议邀请通知 (与 BizMeetingController.add 一致)
This commit is contained in:
郭庆泰
2026-08-22 15:53:06 +08:00
parent 86e85d02cb
commit 2cef296b1e
10 changed files with 522 additions and 13 deletions
@@ -40,6 +40,20 @@
insert into biz_meeting_attendee(meeting_id, user_id, create_by, create_time)
values(#{meetingId}, #{userId}, #{createBy}, sysdate())
</insert>
<!--
管理端新增参会人 (MeetingDetail 参会人 CRUD 用):
一次性写入 meeting_id+user_id+档案字段 (name/phone/work_unit/...).
若档案字段为 NULL 则不写 (COALESCE 在调用方给空字符串兜底).
useGeneratedKeys 让调用方能拿到新 attendee.id (用于 #5 触发邀请通知).
-->
<insert id="insertWithProfile" parameterType="BizMeetingAttendee" useGeneratedKeys="true" keyProperty="id">
insert into biz_meeting_attendee(meeting_id, user_id, name, phone, work_unit, department, title,
id_card, bank_card, bank_name, bank_branch, bank_region, bank_address, account_name,
id_card_attachments, labor_form, fee_pre_tax, tax, fee, create_by, create_time)
values(#{meetingId}, #{userId}, #{name}, #{phone}, #{workUnit}, #{department}, #{title},
#{idCard}, #{bankCard}, #{bankName}, #{bankBranch}, #{bankRegion}, #{bankAddress}, #{accountName},
#{idCardAttachments}, #{laborForm}, #{feePreTax}, #{tax}, #{fee}, #{createBy}, sysdate())
</insert>
<!-- 批量插入参会人 (BizMeetingController.add 调用) -->
<insert id="insertBatch">
insert into biz_meeting_attendee(meeting_id, user_id, create_by, create_time)
@@ -103,6 +117,10 @@
<delete id="deleteByMeetingId" parameterType="Long">
delete from biz_meeting_attendee where meeting_id = #{meetingId}
</delete>
<!-- MeetingDetail 参会人 CRUD 用: 按 id 单删 -->
<delete id="deleteByPrimaryKey" parameterType="Long">
delete from biz_meeting_attendee where id = #{id}
</delete>
<delete id="deleteByMeetingIdAndUserId" parameterType="BizMeetingAttendee">
delete from biz_meeting_attendee where meeting_id = #{meetingId} and user_id = #{userId}
</delete>
@@ -133,4 +151,11 @@
and (a.handsign is null or a.handsign = '' or a.labor_protocol is null or a.labor_protocol = '')
order by m.start_time asc
</select>
<!--
给 BizMeetingController.edit 做差集用: 查该会议已存在的参会人 userId 列表.
用于 #5 会议邀请: 仅给"新加入"的 userId 发通知, 已存在的用户不重发.
-->
<select id="selectUserIdsByMeetingId" resultType="java.lang.Long" parameterType="Long">
select user_id from biz_meeting_attendee where meeting_id = #{meetingId}
</select>
</mapper>
@@ -13,7 +13,11 @@
<result property="status" column="status" />
<result property="isSettled" column="is_settled" />
<result property="projectNo" column="project_no" />
<result property="projectName" column="project_name" />
<result property="remark" column="remark" />
<result property="auditOpinion" column="audit_opinion" />
<result property="auditBy" column="audit_by" />
<result property="auditTime" column="audit_time" />
<result property="submitterId" column="submitter_id" />
<result property="submitterName" column="submitter_name" />
<result property="createBy" column="create_by" />
@@ -25,13 +29,15 @@
select p.plan_id, p.plan_name, p.plan_direction, p.plan_direction_id,
s.title as plan_direction_title,
p.plan_category, p.project_form, p.design_file_url, p.status, p.is_settled,
p.project_no, p.remark, p.submitter_id,
p.project_no, p.remark, p.audit_opinion, p.audit_by, p.audit_time, p.submitter_id,
COALESCE(bp.name, u.user_name) as submitter_name,
proj.project_name as project_name,
p.create_by, p.create_time, p.update_by, p.update_time
from biz_project_plan p
left join biz_special_plan s on s.id = p.plan_direction_id
left join sys_user u on u.user_id = p.submitter_id
left join biz_person bp on bp.user_id = u.user_id
left join biz_project proj on proj.project_no = p.project_no
</sql>
<select id="selectByPrimaryKey" resultMap="BizProjectPlanResult" parameterType="String">
<include refid="selectFields"/>