会诊管理中 门诊会诊申请确认和门诊会诊申请管理模块全部功能的实现。包括数据库设计,前端UI设计,后端接口开发。

This commit is contained in:
weixin_45799331
2026-02-11 13:40:32 +08:00
parent b826afb17c
commit c5d75f053b
25 changed files with 3249 additions and 365 deletions

View File

@@ -1,8 +1,6 @@
package com.openhis.web.consultation.appservice;
import com.openhis.web.consultation.dto.ConsultationActivityDto;
import com.openhis.web.consultation.dto.ConsultationRequestDto;
import com.openhis.web.consultation.dto.DepartmentTreeDto;
import com.openhis.web.consultation.dto.*;
import java.util.List;
import java.util.Map;
@@ -23,6 +21,24 @@ public interface IConsultationAppService {
*/
List<ConsultationRequestDto> getConsultationList(Long encounterId);
/**
* 查询会诊申请列表(支持多条件查询)
*
* @param dto 查询条件DTO
* @return 会诊列表
*/
List<ConsultationRequestDto> queryConsultationList(ConsultationRequestDto dto);
/**
* 分页查询会诊申请列表(支持多条件查询)
*
* @param dto 查询条件DTO
* @param pageNum 页码
* @param pageSize 每页大小
* @return 分页结果
*/
com.baomidou.mybatisplus.extension.plugins.pagination.Page<ConsultationRequestDto> queryConsultationListPage(ConsultationRequestDto dto, Integer pageNum, Integer pageSize);
/**
* 保存会诊申请
*
@@ -84,6 +100,55 @@ public interface IConsultationAppService {
* @return 会诊项目列表
*/
List<ConsultationActivityDto> getConsultationActivities();
// ==================== 会诊确认相关接口 ====================
/**
* 获取待确认的会诊列表(当前医生被邀请的会诊)
*
* @return 待确认的会诊列表
*/
List<ConsultationConfirmationDto> getPendingConfirmationList();
/**
* 确认会诊
*
* @param dto 会诊确认DTO
* @return 是否成功
*/
Boolean confirmConsultation(ConsultationConfirmationDto dto);
/**
* 取消确认会诊
*
* @param consultationId 会诊申请单号
* @return 是否成功
*/
Boolean cancelConfirmation(String consultationId);
/**
* 签名会诊
*
* @param consultationId 会诊申请单号
* @return 是否成功
*/
Boolean signConsultation(String consultationId);
/**
* 获取会诊确认详情
*
* @param consultationId 会诊申请单号
* @return 会诊确认详情
*/
ConsultationConfirmationDto getConfirmationDetail(String consultationId);
/**
* 获取会诊意见列表
*
* @param consultationId 会诊申请单号
* @return 会诊意见列表
*/
List<ConsultationOpinionDto> getConsultationOpinions(String consultationId);
}

View File

@@ -3,6 +3,8 @@ package com.openhis.web.consultation.controller;
import com.core.common.core.domain.R;
import com.openhis.web.consultation.appservice.IConsultationAppService;
import com.openhis.web.consultation.dto.ConsultationActivityDto;
import com.openhis.web.consultation.dto.ConsultationConfirmationDto;
import com.openhis.web.consultation.dto.ConsultationOpinionDto;
import com.openhis.web.consultation.dto.ConsultationRequestDto;
import com.openhis.web.consultation.dto.DepartmentTreeDto;
import io.swagger.annotations.Api;
@@ -49,6 +51,41 @@ public class ConsultationController {
}
}
/**
* 查询会诊申请列表(支持多条件查询)
*/
@ApiOperation("查询会诊申请列表")
@PostMapping("/query")
public R<List<ConsultationRequestDto>> queryConsultationList(@RequestBody ConsultationRequestDto dto) {
try {
List<ConsultationRequestDto> list = consultationAppService.queryConsultationList(dto);
return R.ok(list);
} catch (Exception e) {
log.error("查询会诊申请列表失败", e);
return R.fail("查询会诊申请列表失败: " + e.getMessage());
}
}
/**
* 分页查询会诊申请列表(支持多条件查询)
*/
@ApiOperation("分页查询会诊申请列表")
@PostMapping("/queryPage")
public R<com.baomidou.mybatisplus.extension.plugins.pagination.Page<ConsultationRequestDto>> queryConsultationListPage(
@RequestBody ConsultationRequestDto dto,
@ApiParam("页码") @RequestParam(required = false, defaultValue = "1") Integer pageNum,
@ApiParam("每页大小") @RequestParam(required = false, defaultValue = "10") Integer pageSize) {
try {
log.info("分页查询会诊申请列表pageNum: {}, pageSize: {}", pageNum, pageSize);
com.baomidou.mybatisplus.extension.plugins.pagination.Page<ConsultationRequestDto> page =
consultationAppService.queryConsultationListPage(dto, pageNum, pageSize);
return R.ok(page);
} catch (Exception e) {
log.error("分页查询会诊申请列表失败", e);
return R.fail("分页查询会诊申请列表失败: " + e.getMessage());
}
}
/**
* 保存会诊申请
*/
@@ -173,5 +210,99 @@ public class ConsultationController {
return R.fail("获取会诊项目列表失败: " + e.getMessage());
}
}
// ==================== 会诊确认相关接口 ====================
/**
* 获取待确认的会诊列表(当前医生被邀请的会诊)
*/
@ApiOperation("获取待确认的会诊列表")
@GetMapping("/confirmation/pending")
public R<List<ConsultationConfirmationDto>> getPendingConfirmationList() {
try {
List<ConsultationConfirmationDto> list = consultationAppService.getPendingConfirmationList();
return R.ok(list);
} catch (Exception e) {
log.error("获取待确认会诊列表失败", e);
return R.fail("获取待确认会诊列表失败: " + e.getMessage());
}
}
/**
* 确认会诊
*/
@ApiOperation("确认会诊")
@PostMapping("/confirmation/confirm")
public R<String> confirmConsultation(@RequestBody ConsultationConfirmationDto dto) {
try {
Boolean result = consultationAppService.confirmConsultation(dto);
return result ? R.ok("确认成功") : R.fail("确认失败");
} catch (Exception e) {
log.error("确认会诊失败", e);
return R.fail("确认会诊失败: " + e.getMessage());
}
}
/**
* 取消确认会诊
*/
@ApiOperation("取消确认会诊")
@PostMapping("/confirmation/cancelConfirm")
public R<String> cancelConfirmation(@ApiParam("会诊申请单号") @RequestParam String consultationId) {
try {
Boolean result = consultationAppService.cancelConfirmation(consultationId);
return result ? R.ok("取消确认成功") : R.fail("取消确认失败");
} catch (Exception e) {
log.error("取消确认会诊失败", e);
return R.fail("取消确认会诊失败: " + e.getMessage());
}
}
/**
* 签名会诊
*/
@ApiOperation("签名会诊")
@PostMapping("/confirmation/sign")
public R<String> signConsultation(@ApiParam("会诊申请单号") @RequestParam String consultationId) {
try {
Boolean result = consultationAppService.signConsultation(consultationId);
return result ? R.ok("签名成功") : R.fail("签名失败");
} catch (Exception e) {
log.error("签名会诊失败", e);
return R.fail("签名会诊失败: " + e.getMessage());
}
}
/**
* 获取会诊确认详情
*/
@ApiOperation("获取会诊确认详情")
@GetMapping("/confirmation/detail")
public R<ConsultationConfirmationDto> getConfirmationDetail(
@ApiParam("会诊申请单号") @RequestParam String consultationId) {
try {
ConsultationConfirmationDto detail = consultationAppService.getConfirmationDetail(consultationId);
return R.ok(detail);
} catch (Exception e) {
log.error("获取会诊确认详情失败", e);
return R.fail("获取会诊确认详情失败: " + e.getMessage());
}
}
/**
* 获取会诊意见列表
*/
@ApiOperation("获取会诊意见列表")
@GetMapping("/confirmation/opinions")
public R<List<ConsultationOpinionDto>> getConsultationOpinions(
@ApiParam("会诊申请单号") @RequestParam String consultationId) {
try {
List<ConsultationOpinionDto> opinions = consultationAppService.getConsultationOpinions(consultationId);
return R.ok(opinions);
} catch (Exception e) {
log.error("获取会诊意见列表失败", e);
return R.fail("获取会诊意见列表失败: " + e.getMessage());
}
}
}

View File

@@ -0,0 +1,167 @@
package com.openhis.web.consultation.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 会诊确认表实体类
*
* @author system
* @date 2026-02-06
*/
@Data
@TableName("consultation_confirmation")
public class ConsultationConfirmation implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id", type = IdType.ASSIGN_ID)
private Long id;
/**
* 会诊申请ID外键consultation_request.id
*/
@TableField("consultation_request_id")
private Long consultationRequestId;
/**
* 会诊申请单号
*/
@TableField("consultation_id")
private String consultationId;
/**
* 确认会诊的医生ID操作【确认】按钮的当前医生ID
*/
@TableField("confirming_physician_id")
private Long confirmingPhysicianId;
/**
* 确认会诊的医生姓名(操作【确认】按钮的当前医生姓名)
*/
@TableField("confirming_physician_name")
private String confirmingPhysicianName;
/**
* 代表科室ID操作【确认】按钮的当前开单科室ID
*/
@TableField("confirming_dept_id")
private Long confirmingDeptId;
/**
* 代表科室名称(操作【确认】按钮的当前开单科室)
*/
@TableField("confirming_dept_name")
private String confirmingDeptName;
/**
* 确认会诊的日期(操作【确认】按钮当前系统时间)
*/
@TableField("confirming_date")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date confirmingDate;
/**
* 会诊状态0-取消确认作废20-已确认(会诊医生已查看/同意可写初步意见30-已签名已电子签名意见最终生效40-已完成(会诊报告已回写,流程关闭)
*/
@TableField("consultation_status")
private Integer consultationStatus;
/**
* 会诊意见最多500字
*/
@TableField("consultation_opinion")
private String consultationOpinion;
/**
* 会诊确认参加医师多个医师信息JSON格式
*/
@TableField("confirming_physicians")
private String confirmingPhysicians;
/**
* 所有医生都确认的时间
*/
@TableField("all_confirmed_date")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date allConfirmedDate;
/**
* 所有医生都签名的时间
*/
@TableField("all_signed_date")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date allSignedDate;
/**
* 签名医生姓名
*/
@TableField("signature")
private String signature;
/**
* 签名医生ID
*/
@TableField("signature_physician_id")
private Long signaturePhysicianId;
/**
* 签名时间
*/
@TableField("signature_date")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date signatureDate;
/**
* 创建时间
*/
@TableField(value = "create_time", fill = FieldFill.INSERT)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**
* 更新时间(由 Java 代码维护)
*/
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
/**
* 创建人
*/
@TableField(value = "create_by", fill = FieldFill.INSERT)
private String createBy;
/**
* 更新人
*/
@TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE)
private String updateBy;
/**
* 租户ID
*/
@TableField("tenant_id")
private Long tenantId;
/**
* 逻辑删除标识0-未删除1-已删除
*/
@TableField("is_deleted")
@TableLogic
private Integer isDeleted;
/**
* 备注
*/
@TableField("remark")
private String remark;
}

View File

@@ -56,7 +56,13 @@ public class ConsultationInvited implements Serializable {
private String invitedPhysicianName;
/**
* 邀请状态(0-待确认1-已确认2-已拒绝
* 邀请状态(使用ConsultationStatusEnum
* 0-新开(待确认)
* 10-已提交(待确认)
* 20-已确认
* 30-已签名
* 40-已完成
* 50-已取消(已拒绝)
*/
@TableField("invited_status")
private Integer invitedStatus;
@@ -69,11 +75,18 @@ public class ConsultationInvited implements Serializable {
private Date confirmTime;
/**
* 确认意见
* 确认意见(格式:科室-医生:意见内容)
*/
@TableField("confirm_opinion")
private String confirmOpinion;
/**
* 签名时间
*/
@TableField("signature_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date signatureTime;
/**
* 创建时间
*/

View File

@@ -218,6 +218,24 @@ public class ConsultationRequest implements Serializable {
@TableField("cancel_reason")
private String cancelReason;
/**
* 已确认的医生数量
*/
@TableField("confirmed_count")
private Integer confirmedCount;
/**
* 已签名的医生数量
*/
@TableField("signed_count")
private Integer signedCount;
/**
* 被邀请的医生总数
*/
@TableField("invited_count")
private Integer invitedCount;
/**
* 创建时间
*/

View File

@@ -0,0 +1,132 @@
package com.openhis.web.consultation.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 会诊确认DTO
*
* @author system
* @date 2026-02-06
*/
@Data
@ApiModel("会诊确认DTO")
public class ConsultationConfirmationDto implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("主键ID")
private Long id;
@ApiModelProperty("会诊申请ID")
private Long consultationRequestId;
@ApiModelProperty("会诊申请单号")
private String consultationId;
@ApiModelProperty("确认医生ID")
private Long confirmingPhysicianId;
@ApiModelProperty("确认医生姓名")
private String confirmingPhysicianName;
@ApiModelProperty("代表科室ID")
private Long confirmingDeptId;
@ApiModelProperty("代表科室名称")
private String confirmingDeptName;
@ApiModelProperty("确认日期")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date confirmingDate;
@ApiModelProperty("会诊状态0-取消确认20-已确认30-已签名40-已完成")
private Integer consultationStatus;
@ApiModelProperty("会诊意见")
private String consultationOpinion;
@ApiModelProperty("会诊确认参加医师")
private String confirmingPhysician;
@ApiModelProperty("签名医生姓名")
private String signature;
@ApiModelProperty("签名医生ID")
private Long signaturePhysicianId;
@ApiModelProperty("签名时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date signatureDate;
@ApiModelProperty("备注")
private String remark;
// ========== 扩展字段(用于前端显示) ==========
@ApiModelProperty("患者姓名")
private String patientName;
@ApiModelProperty("性别")
private String genderText;
@ApiModelProperty("年龄")
private Integer age;
@ApiModelProperty("就诊卡号")
private String patientIdentifierNo;
@ApiModelProperty("申请科室")
private String applyDept;
@ApiModelProperty("申请医师")
private String applyDoctor;
@ApiModelProperty("申请时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date applyTime;
@ApiModelProperty("会诊时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date consultationDate;
@ApiModelProperty("紧急标志")
private Boolean urgent;
@ApiModelProperty("会诊邀请对象")
private String invitedObject;
@ApiModelProperty("病史及目的")
private String consultationPurpose;
@ApiModelProperty("门诊诊断")
private String provisionalDiagnosis;
@ApiModelProperty("提交医生")
private String submittingPhysician;
@ApiModelProperty("提交时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date submittingTime;
// ========== 当前医生的个人状态 ==========
@ApiModelProperty("当前医生的邀请状态0-待确认1-已确认2-已拒绝3-已签名")
private Integer myInvitedStatus;
@ApiModelProperty("当前医生的确认时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date myConfirmTime;
@ApiModelProperty("当前医生的签名时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date mySignatureTime;
}

View File

@@ -0,0 +1,52 @@
package com.openhis.web.consultation.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 会诊意见DTO
*
* @author system
* @date 2026-02-09
*/
@Data
@ApiModel("会诊意见DTO")
public class ConsultationOpinionDto implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("医生ID")
private Long physicianId;
@ApiModelProperty("医生姓名")
private String physicianName;
@ApiModelProperty("科室ID")
private Long deptId;
@ApiModelProperty("科室名称")
private String deptName;
@ApiModelProperty("会诊意见(已包含科室-医生前缀)")
private String opinion;
@ApiModelProperty("确认时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date confirmTime;
@ApiModelProperty("签名时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date signatureTime;
@ApiModelProperty("状态0-待确认1-已确认2-已拒绝3-已签名")
private Integer status;
@ApiModelProperty("是否已签名")
private Boolean isSigned;
}

View File

@@ -105,7 +105,7 @@ public class ConsultationRequestDto implements Serializable {
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date consultationDate;
/**
* 申请时间
*/
@@ -132,7 +132,7 @@ public class ConsultationRequestDto implements Serializable {
* 会诊项目名称(如:院内会诊、远程会诊等)
*/
private String consultationActivityName;
/**
* 紧急程度1=普通2=紧急)
*/
@@ -185,6 +185,34 @@ public class ConsultationRequestDto implements Serializable {
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date myConfirmTime;
// ==================== 会诊记录相关字段(会诊完成后显示) ====================
/**
* 会诊邀请参加医师(已签名医生列表,格式:科室-姓名、科室-姓名)
*/
private String invitedPhysiciansText;
/**
* 所属医生(第一个签名的医生)
*/
private String attendingPhysician;
/**
* 代表科室(第一个签名医生的科室)
*/
private String representDepartment;
/**
* 签名医生(第一个签名的医生)
*/
private String signPhysician;
/**
* 签名时间(第一个签名医生的签名时间)
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date signTime;
}

View File

@@ -5,6 +5,7 @@ import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 邀请对象DTO
@@ -38,6 +39,20 @@ public class InvitedObjectDto implements Serializable {
* 医生姓名
*/
private String physicianName;
/**
* 邀请状态0=待确认1=已确认3=已签名
*/
private Integer invitedStatus;
/**
* 确认时间
*/
private Date confirmTime;
/**
* 签名时间
*/
private Date signatureTime;
}

View File

@@ -72,7 +72,7 @@ public enum ConsultationStatusEnum {
* 判断是否可以编辑
*/
public boolean canEdit() {
return this == NEW || this == SUBMITTED;
return this == NEW;
}
/**
@@ -83,3 +83,6 @@ public enum ConsultationStatusEnum {
}
}

View File

@@ -0,0 +1,29 @@
package com.openhis.web.consultation.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.openhis.web.consultation.domain.ConsultationConfirmation;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* 会诊确认Mapper接口
*
* @author system
* @date 2026-02-06
*/
@Mapper
public interface ConsultationConfirmationMapper extends BaseMapper<ConsultationConfirmation> {
/**
* 物理删除确认记录根据会诊申请ID
*
* @param consultationRequestId 会诊申请ID
* @return 删除的记录数
*/
@Delete("DELETE FROM consultation_confirmation WHERE consultation_request_id = #{consultationRequestId}")
int physicalDeleteByRequestId(@Param("consultationRequestId") Long consultationRequestId);
}

View File

@@ -0,0 +1,27 @@
-- ============================================
-- 修复会诊确认表的 NOT NULL 约束问题
-- ============================================
-- 将 confirming_physician_id 等字段改为可空
-- 因为在新的方案中,这些字段在所有医生确认后才会填充
ALTER TABLE hisdev.consultation_confirmation
ALTER COLUMN confirming_physician_id DROP NOT NULL;
ALTER TABLE hisdev.consultation_confirmation
ALTER COLUMN confirming_physician_name DROP NOT NULL;
ALTER TABLE hisdev.consultation_confirmation
ALTER COLUMN confirming_dept_id DROP NOT NULL;
ALTER TABLE hisdev.consultation_confirmation
ALTER COLUMN confirming_dept_name DROP NOT NULL;
ALTER TABLE hisdev.consultation_confirmation
ALTER COLUMN confirming_date DROP NOT NULL;
-- 说明:
-- 在新的方案中consultation_confirmation 记录在所有医生确认后才创建
-- 这些字段用于记录"最后一个确认的医生"或"代表性医生"
-- 因此允许为 NULL实际的医生信息存储在 confirming_physicians (JSON) 字段中

View File

@@ -0,0 +1,94 @@
-- ============================================
-- 会诊确认功能优化 - 数据库表结构修改 (PostgreSQL版本)
-- ============================================
-- 1. 修改 consultation_request 表(添加计数字段)
ALTER TABLE hisdev.consultation_request
ADD COLUMN IF NOT EXISTS confirmed_count INT DEFAULT 0;
ALTER TABLE hisdev.consultation_request
ADD COLUMN IF NOT EXISTS signed_count INT DEFAULT 0;
ALTER TABLE hisdev.consultation_request
ADD COLUMN IF NOT EXISTS invited_count INT DEFAULT 0;
-- 2. 修改 consultation_invited 表(添加签名时间字段)
ALTER TABLE hisdev.consultation_invited
ADD COLUMN IF NOT EXISTS signature_time TIMESTAMP NULL;
-- 3. 修改 consultation_confirmation 表(优化字段)
ALTER TABLE hisdev.consultation_confirmation
ADD COLUMN IF NOT EXISTS all_confirmed_date TIMESTAMP NULL;
ALTER TABLE hisdev.consultation_confirmation
ADD COLUMN IF NOT EXISTS all_signed_date TIMESTAMP NULL;
-- 检查 confirming_physicians 字段是否存在,如果不存在则添加
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = 'hisdev'
AND table_name = 'consultation_confirmation'
AND column_name = 'confirming_physicians'
) THEN
-- 如果 confirming_physician 存在,则重命名
IF EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = 'hisdev'
AND table_name = 'consultation_confirmation'
AND column_name = 'confirming_physician'
) THEN
ALTER TABLE hisdev.consultation_confirmation
RENAME COLUMN confirming_physician TO confirming_physicians;
ELSE
-- 如果都不存在,则新增
ALTER TABLE hisdev.consultation_confirmation
ADD COLUMN confirming_physicians TEXT;
END IF;
END IF;
END $$;
-- 4. 为现有数据初始化计数字段
UPDATE hisdev.consultation_request cr
SET invited_count = (
SELECT COUNT(*)
FROM hisdev.consultation_invited ci
WHERE ci.consultation_request_id = cr.id
AND ci.is_deleted = 0
)
WHERE cr.invited_count = 0 OR cr.invited_count IS NULL;
UPDATE hisdev.consultation_request cr
SET confirmed_count = (
SELECT COUNT(*)
FROM hisdev.consultation_invited ci
WHERE ci.consultation_request_id = cr.id
AND ci.invited_status >= 1
AND ci.is_deleted = 0
)
WHERE cr.confirmed_count = 0 OR cr.confirmed_count IS NULL;
UPDATE hisdev.consultation_request cr
SET signed_count = (
SELECT COUNT(*)
FROM hisdev.consultation_invited ci
WHERE ci.consultation_request_id = cr.id
AND ci.invited_status >= 3
AND ci.is_deleted = 0
)
WHERE cr.signed_count = 0 OR cr.signed_count IS NULL;
-- 5. 添加索引优化查询性能(如果不存在)
CREATE INDEX IF NOT EXISTS idx_invited_status ON hisdev.consultation_invited(invited_status);
CREATE INDEX IF NOT EXISTS idx_confirm_time ON hisdev.consultation_invited(confirm_time);
-- 6. 添加字段注释
COMMENT ON COLUMN hisdev.consultation_request.confirmed_count IS '已确认的医生数量';
COMMENT ON COLUMN hisdev.consultation_request.signed_count IS '已签名的医生数量';
COMMENT ON COLUMN hisdev.consultation_request.invited_count IS '被邀请的医生总数';
COMMENT ON COLUMN hisdev.consultation_invited.signature_time IS '签名时间';
COMMENT ON COLUMN hisdev.consultation_confirmation.all_confirmed_date IS '所有医生都确认的时间';
COMMENT ON COLUMN hisdev.consultation_confirmation.all_signed_date IS '所有医生都签名的时间';
COMMENT ON COLUMN hisdev.consultation_confirmation.confirming_physicians IS '参与确认的医生列表JSON格式';