@@ -216,136 +216,186 @@ public class RequestFormManageAppServiceImpl implements IRequestFormManageAppSer
}
// 如果是手术申请单,需要额外生成手术医嘱
if ( ActivityDefCategory . PROCEDURE . getCode ( ) . equals ( typeCode ) ) {
log . info ( " 开始生成手术医嘱, encounterId={}, patientId={}, typeCode={} " , encounterId , patientId , typeCode ) ;
// 从 descJson 中解析手术信息
String descJson = requestFormSaveDto . getDescJson ( ) ;
Map < String , Object > descMap = null ;
if ( descJson ! = null & & ! descJson . isEmpty ( ) ) {
try {
ObjectMapper objectMapper = new ObjectMapper ( ) ;
descMap = objectMapper . readValue ( descJson , Map . class ) ;
} catch ( Exception e ) {
log . error ( " 解析手术申请单 descJson 失败 " , e ) ;
}
}
// 获取手术信息
String surgeryName = descMap ! = null ? ( String ) descMap . get ( " surgeryName " ) : null ;
String surgeryCode = descMap ! = null ? ( String ) descMap . get ( " surgeryCode " ) : null ;
String surgeryFee = descMap ! = null ? ( String ) descMap . get ( " surgeryFee " ) : null ;
String anesthesiaFee = descMap ! = null ? ( String ) descMap . get ( " anesthesiaFee " ) : null ;
String plannedTime = descMap ! = null ? ( String ) desc Map. get ( " plannedTime " ) : null ;
String surgeryIndication = descMap ! = null ? ( String ) descMap . get ( " surgeryIndication " ) : null ;
String preoperativeDiagnosis = descMap ! = null ? ( String ) descMap . get ( " preoperativeDiagnosis " ) : null ;
// 生成手术医嘱
ServiceRequest surgeryServiceRequest = new ServiceRequest ( ) ;
surgeryServiceRequest . setStatusEnum ( RequestStatus . DRAFT . getValue ( ) ) ;
surgeryServiceRequest . setBusNo ( String . format ( " %04d " , ( int ) ( Math . random ( ) * 10000 ) ) ) ;
surgeryServiceRequest . setGenerateSourceEnum ( GenerateSource . DOCTOR_PRESCRIPTION . getValue ( ) ) ;
surgeryServiceRequest . setPrescriptionNo ( prescriptionNo ) ;
surgeryServiceRequest . setTherapyEnum ( TherapyTimeType . TEMPORARY . getValue ( ) ) ;
surgeryServiceRequest . setQuantity ( BigDecimal . valueOf ( 1 ) ) ;
surgeryServiceRequest . setUnitCode ( " 次 " ) ;
surgeryServiceRequest . setCategoryEnum ( 4 ) ; // 4-手术
// 优先从 activityList 获取手术 ID, 如果为空则从 descJson 获取
if ( ! activityList . isEmpty ( ) ) {
surgeryServiceRequest . setActivityId ( activityList . get ( 0 ) . getAdviceDefinitionId ( ) ) ;
}
surgeryServiceRequest . setPatientId ( patientId ) ;
surgeryServiceRequest . setRequesterId ( practitionerId ) ;
surgeryServiceRequest . setEncounterId ( encounterId ) ;
surgeryServiceRequest . setAuthoredTime ( curDate ) ;
surgeryServiceRequest . setOrgId ( orgId ) ;
// 设置手术相关信息到 contentJson 字段
Map < String , String > contentMap = new java . util . HashMap < > ( ) ;
if ( surgeryName ! = null & & ! surgeryName . isEmpty ( ) ) {
contentMap . put ( " surgeryName " , surgeryName ) ;
}
if ( surgeryCode ! = null & & ! surgeryCode . isEmpty ( ) ) {
contentMap . put ( " surgeryCode " , surgeryCode ) ;
}
if ( plannedTime ! = null & & ! plannedTime . isEmpty ( ) ) {
contentMap . put ( " plannedTime " , plannedTime ) ;
}
if ( surgeryIndication ! = null & & ! surgeryIndication . isEmpty ( ) ) {
contentMap . put ( " surgeryIndication " , surgeryIndication ) ;
}
if ( preoperativeDiagnosis ! = null & & ! preoperativeDiagnosis . isEmpty ( ) ) {
contentMap . put ( " preoperativeDiagnosis " , preoperativeDiagnosis ) ;
}
if ( ! contentMap . isEmpty ( ) ) {
try {
ObjectMapper objectMapper = new ObjectMapper ( ) ;
surgeryServiceRequest . setContentJson ( objectMapper . writeValueAsString ( contentMap ) ) ;
} catch ( Exception e ) {
log . error ( " 序列化手术信息失败 " , e ) ;
}
}
iServiceRequestService . save ( surgeryServiceRequest ) ;
log . info ( " 手术医嘱生成成功, serviceRequestId={}, prescriptionNo={} " , surgeryServiceRequest . getId ( ) , prescriptionNo ) ;
// 生成手术收费项目
ChargeItem surgeryChargeItem = new ChargeItem ( ) ;
surgeryChargeItem . setStatusEnum ( ChargeItemStatus . DRAFT . getValue ( ) ) ;
surgeryChargeItem . setBusNo ( AssignSeqEnum . CHARGE_ITEM_NO . getPrefix ( ) . concat ( surgeryServiceRequest . getBusNo ( ) ) ) ;
surgeryChargeItem . setGenerateSourceEnum ( GenerateSource . DOCTOR_PRESCRIPTION . getValue ( ) ) ;
surgeryChargeItem . setPatientId ( patientId ) ;
surgeryChargeItem . setContextEnum ( 6 ) ; // 6-手术
surgeryChargeItem . setEncounterId ( encounterId ) ;
surgeryChargeItem . setEntererId ( practitionerId ) ;
surgeryChargeItem . setEnteredDate ( curDate ) ;
surgeryChargeItem . setServiceTable ( CommonConstants . TableName . WOR_SERVICE_REQUEST ) ;
surgeryChargeItem . setServiceId ( surgeryServiceRequest . getId ( ) ) ;
surgeryChargeItem . setProductTable ( CommonConstants . TableName . WOR_ACTIVITY_DEFINITION ) ;
// 优先从 activityList 获取 productId, 如果为空则不设置
if ( ! activityList . isEmpty ( ) ) {
surgeryChargeItem . setProductId ( activityList . get ( 0 ) . getAdviceDefinitionId ( ) ) ;
}
surgeryChargeItem . setAccountId ( activityList . isEmpty ( ) ? null : activityList . get ( 0 ) . getAccountId ( ) ) ;
surgeryChargeItem . setRequestingOrgId ( orgId ) ;
surgeryChargeItem . setQuantityValue ( BigDecimal . valueOf ( 1 ) ) ;
surgeryChargeItem . setQuantityUnit ( " 次 " ) ;
// 设置手术费用
if ( surgeryFee ! = null & & ! surgeryFee . isEmpty ( ) ) {
try {
surgeryChargeItem . setUnitPrice ( new BigDecimal ( surgeryFee ) ) ;
surgeryChargeItem . setTotalPrice ( new BigDecimal ( surgeryFee ) ) ;
} catch ( NumberFormatException e ) {
log . warn ( " 手术费用格式不正确:{} " , surgeryFee ) ;
}
}
iChargeItemService . save ( surgeryChargeItem ) ;
// 如果存在麻醉费用,生成麻醉收费项目
if ( anesthesiaFee ! = null & & ! anesthesiaFee . isEmpty ( ) ) {
try {
BigDecimal anesthesiaFeeAmount = new BigDecimal ( anesthesiaFee ) ;
if ( anesthesiaFeeAmount . compareTo ( BigDecimal . ZERO ) > 0 ) {
ChargeItem anesthesiaChargeItem = new ChargeItem ( ) ;
anesthesiaChargeItem . setStatusEnum ( ChargeItemStatus . DRAFT . getValue ( ) ) ;
anesthesiaChargeItem . setBusNo ( AssignSeqEnum . CHARGE_ITEM_NO . getPrefix ( ) . concat ( surgeryServiceRequest . getBusNo ( ) ) ) ;
anesthesiaChargeItem . setGenerateSourceEnum ( GenerateSource . DOCTOR_PRESCRIPTION . getValue ( ) ) ;
anesthesiaChargeItem . setPatientId ( patientId ) ;
anesthesiaChargeItem . setContextEnum ( 3 ) ; // 3-诊疗
anesthesiaChargeItem . setEncounterId ( encounterId ) ;
anesthesiaChargeItem . setEntererId ( practitionerId ) ;
anesthesiaChargeItem . setEnteredDate ( curDate ) ;
anesthesiaChargeItem . setServiceTable ( CommonConstants . TableName . WOR_SERVICE_REQUEST ) ;
anesthesiaChargeItem . setServiceId ( surgeryServiceRequest . getId ( ) ) ;
anesthesiaChargeItem . setProductTable ( CommonConstants . TableName . WOR_ACTIVITY_DEFINITION ) ;
anesthesiaChargeItem . setRequestingOrgId ( orgId ) ;
anesthesiaChargeItem . setQuantityValue ( BigDecimal . valueOf ( 1 ) ) ;
anesthesiaChargeItem . setQuantityUnit ( " 次 " ) ;
anesthesiaChargeItem . setUnitPrice ( anesthesiaFeeAmount ) ;
anesthesiaChargeItem . setTotalPrice ( anesthesiaFeeAmount ) ;
iChargeItemService . save ( anesthesiaChargeItem ) ;
log . info ( " 【调试】判断手术医嘱生成条件: typeCode={}, PROCEDURE.code={}, typeCode类型={}, PROCEDURE.code类型={} " ,
typeCode , ActivityDefCategory . PROCEDURE . getCode ( ) ,
typeCode ! = null ? typeCode . getClass ( ) . getName ( ) : " null " ,
ActivityDefCategory . PROCEDURE . getCode ( ) . getClass ( ) . getName ( ) ) ;
boolean isProcedure = ActivityDefCategory . PROCEDURE . getCode ( ) . equals ( typeCode ) ;
log . info ( " 【调试】判断结果: isProcedure={}, typeCode字符串={}, PROCEDURE.code字符串={} " ,
isProcedure ,
typeCode ! = null ? " ' " + typeCode + " ' " : " null " ,
" ' " + ActivityDefCategory . PROCEDURE . getCode ( ) + " ' " ) ;
if ( isProcedur e ) {
log . info ( " 开始生成手术医嘱, encounterId={}, patientId={}, typeCode={}, activityListSize={} " ,
encounterId , patientId , typeCode , activityList ! = null ? activityList . size ( ) : 0 ) ;
try {
// 从 descJson 中解析手术信息
String descJson = requestFormSaveDto . getDescJson ( ) ;
Map < String , Object > descMap = null ;
if ( descJson ! = null & & ! descJson . isEmpty ( ) ) {
try {
ObjectMapper objectMapper = new ObjectMapper ( ) ;
descMap = objectMapper . readValue ( descJson , Map . class ) ;
log . info ( " 解析手术申请单 descJson 成功: {} " , descMap ) ;
} catch ( Exception e ) {
log . error ( " 解析手术申请单 descJson 失败: {} " , descJson , e ) ;
}
} catch ( NumberFormatException e ) {
log . warn ( " 麻醉费用格式不正确:{} " , anesthesiaFee ) ;
} else {
log . warn ( " 手术申请单 descJson 为空 " ) ;
}
// 获取手术信息
String surgeryName = descMap ! = null ? ( String ) descMap . get ( " surgeryName " ) : null ;
String surgeryCode = descMap ! = null ? ( String ) descMap . get ( " surgeryCode " ) : null ;
String surgeryFee = descMap ! = null ? ( String ) descMap . get ( " surgeryFee " ) : null ;
String anesthesiaFee = descMap ! = null ? ( String ) descMap . get ( " anesthesiaFee " ) : null ;
String plannedTime = descMap ! = null ? ( String ) descMap . get ( " plannedTime " ) : null ;
String surgeryIndication = descMap ! = null ? ( String ) descMap . get ( " surgeryIndication " ) : null ;
String preoperativeDiagnosis = descMap ! = null ? ( String ) descMap . get ( " preoperativeDiagnosis " ) : null ;
// 🔧 BugFix#318: 从 activityList 获取手术项目名称
String adviceDefinitionName = null ;
if ( activityList ! = null & & ! activityList . isEmpty ( ) ) {
adviceDefinitionName = activityList . get ( 0 ) . getAdviceDefinitionName ( ) ;
log . info ( " 从 activityList 获取手术项目名称: {} " , adviceDefinitionName ) ;
}
log . info ( " 手术信息: surgeryName={}, surgeryCode={}, surgeryFee={}, anesthesiaFee={}, adviceDefinitionName={} " ,
surgeryName , surgeryCode , surgeryFee , anesthesiaFee , adviceDefinitionName ) ;
// 生成手术医嘱
ServiceRequest surgeryServiceRequest = new ServiceRequest ( ) ;
surgeryServiceRequest . setStatusEnum ( RequestStatus . DRAFT . getValue ( ) ) ;
surgeryServiceRequest . setBusNo ( String . format ( " %04d " , ( int ) ( Math . random ( ) * 10000 ) ) ) ;
surgeryServiceRequest . setGenerateSourceEnum ( GenerateSource . DOCTOR_PRESCRIPTION . getValue ( ) ) ;
surgeryServiceRequest . setPrescriptionNo ( prescriptionNo ) ;
surgeryServiceRequest . setTherapyEnum ( TherapyTimeType . TEMPORARY . getValue ( ) ) ;
surgeryServiceRequest . setQuantity ( BigDecimal . valueOf ( 1 ) ) ;
surgeryServiceRequest . setUnitCode ( " 次 " ) ;
surgeryServiceRequest . setCategoryEnum ( 4 ) ; // 4-手术
// 优先从 activityList 获取手术 ID
if ( activityList ! = null & & ! activityList . isEmpty ( ) ) {
Long activityId = activityList . get ( 0 ) . getAdviceDefinitionId ( ) ;
surgeryServiceRequest . setActivityId ( activityId ) ;
log . info ( " 从 activityList 获取手术ID: {} " , activityId ) ;
} else {
log . warn ( " activityList 为空, 无法获取手术ID " ) ;
}
surgeryServiceRequest . setPatientId ( patientId ) ;
surgeryServiceRequest . setRequesterId ( practitionerId ) ;
surgeryServiceRequest . setEncounterId ( encounterId ) ;
surgeryServiceRequest . setAuthoredTime ( curDate ) ;
surgeryServiceRequest . setOrgId ( orgId ) ;
// 设置手术相关信息到 contentJson 字段
Map < String , String > contentMap = new java . util . HashMap < > ( ) ;
// 🔧 BugFix#318: 优先使用 activityList 中的手术项目名称
if ( adviceDefinitionName ! = null & & ! adviceDefinitionName . isEmpty ( ) ) {
contentMap . put ( " surgeryName " , adviceDefinitionName ) ;
} else if ( surgeryName ! = null & & ! surgeryName . isEmpty ( ) ) {
contentMap . put ( " surgeryName " , surgeryName ) ;
}
if ( surgeryCode ! = null & & ! surgeryCode . isEmpty ( ) ) {
contentMap . put ( " surgeryCode " , surgeryCode ) ;
}
if ( plannedTime ! = null & & ! plannedTime . isEmpty ( ) ) {
contentMap . put ( " plannedTime " , plannedTime ) ;
}
if ( surgeryIndication ! = null & & ! surgeryIndication . isEmpty ( ) ) {
contentMap . put ( " surgeryIndication " , surgeryIndication ) ;
}
if ( preoperativeDiagnosis ! = null & & ! preoperativeDiagnosis . isEmpty ( ) ) {
contentMap . put ( " preoperativeDiagnosis " , preoperativeDiagnosis ) ;
}
if ( ! contentMap . isEmpty ( ) ) {
try {
ObjectMapper objectMapper = new ObjectMapper ( ) ;
surgeryServiceRequest . setContentJson ( objectMapper . writeValueAsString ( contentMap ) ) ;
} catch ( Exception e ) {
log . error ( " 序列化手术信息失败 " , e ) ;
}
}
try {
iServiceRequestService . save ( surgeryServiceRequest ) ;
log . info ( " 手术医嘱生成成功, serviceRequestId={}, prescriptionNo={} " , surgeryServiceRequest . getId ( ) , prescriptionNo ) ;
} catch ( Exception e ) {
log . error ( " 保存手术医嘱失败 " , e ) ;
throw new ServiceException ( " 保存手术医嘱失败: " + e . getMessage ( ) ) ;
}
// 生成手术收费项目
try {
ChargeItem surgeryChargeItem = new ChargeItem ( ) ;
surgeryChargeItem . setStatusEnum ( ChargeItemStatus . DRAFT . getValue ( ) ) ;
surgeryChargeItem . setBusNo ( AssignSeqEnum . CHARGE_ITEM_NO . getPrefix ( ) . concat ( surgeryServiceRequest . getBusNo ( ) ) ) ;
surgeryChargeItem . setGenerateSourceEnum ( GenerateSource . DOCTOR_PRESCRIPTION . getValue ( ) ) ;
surgeryChargeItem . setPatientId ( patientId ) ;
surgeryChargeItem . setContextEnum ( 6 ) ; // 6-手术
surgeryChargeItem . setEncounterId ( encounterId ) ;
surgeryChargeItem . setEntererId ( practitionerId ) ;
surgeryChargeItem . setEnteredDate ( curDate ) ;
surgeryChargeItem . setServiceTable ( CommonConstants . TableName . WOR_SERVICE_REQUEST ) ;
surgeryChargeItem . setServiceId ( surgeryServiceRequest . getId ( ) ) ;
surgeryChargeItem . setProductTable ( CommonConstants . TableName . WOR_ACTIVITY_DEFINITION ) ;
// 优先从 activityList 获取 productId
if ( activityList ! = null & & ! activityList . isEmpty ( ) ) {
surgeryChargeItem . setProductId ( activityList . get ( 0 ) . getAdviceDefinitionId ( ) ) ;
surgeryChargeItem . setAccountId ( activityList . get ( 0 ) . getAccountId ( ) ) ;
}
surgeryChargeItem . setRequestingOrgId ( orgId ) ;
surgeryChargeItem . setQuantityValue ( BigDecimal . valueOf ( 1 ) ) ;
surgeryChargeItem . setQuantityUnit ( " 次 " ) ;
// 设置手术费用
if ( surgeryFee ! = null & & ! surgeryFee . isEmpty ( ) ) {
try {
surgeryChargeItem . setUnitPrice ( new BigDecimal ( surgeryFee ) ) ;
surgeryChargeItem . setTotalPrice ( new BigDecimal ( surgeryFee ) ) ;
} catch ( NumberFormatException e ) {
log . warn ( " 手术费用格式不正确:{} " , surgeryFee ) ;
}
}
iChargeItemService . save ( surgeryChargeItem ) ;
log . info ( " 手术收费项目生成成功, chargeItemId={} " , surgeryChargeItem . getId ( ) ) ;
} catch ( Exception e ) {
log . error ( " 生成手术收费项目失败 " , e ) ;
throw new ServiceException ( " 生成手术收费项目失败: " + e . getMessage ( ) ) ;
}
// 如果存在麻醉费用,生成麻醉收费项目
if ( anesthesiaFee ! = null & & ! anesthesiaFee . isEmpty ( ) ) {
try {
BigDecimal anesthesiaFeeAmount = new BigDecimal ( anesthesiaFee ) ;
if ( anesthesiaFeeAmount . compareTo ( BigDecimal . ZERO ) > 0 ) {
ChargeItem anesthesiaChargeItem = new ChargeItem ( ) ;
anesthesiaChargeItem . setStatusEnum ( ChargeItemStatus . DRAFT . getValue ( ) ) ;
anesthesiaChargeItem . setBusNo ( AssignSeqEnum . CHARGE_ITEM_NO . getPrefix ( ) . concat ( surgeryServiceRequest . getBusNo ( ) ) ) ;
anesthesiaChargeItem . setGenerateSourceEnum ( GenerateSource . DOCTOR_PRESCRIPTION . getValue ( ) ) ;
anesthesiaChargeItem . setPatientId ( patientId ) ;
anesthesiaChargeItem . setContextEnum ( 3 ) ; // 3-诊疗
anesthesiaChargeItem . setEncounterId ( encounterId ) ;
anesthesiaChargeItem . setEntererId ( practitionerId ) ;
anesthesiaChargeItem . setEnteredDate ( curDate ) ;
anesthesiaChargeItem . setServiceTable ( CommonConstants . TableName . WOR_SERVICE_REQUEST ) ;
anesthesiaChargeItem . setServiceId ( surgeryServiceRequest . getId ( ) ) ;
anesthesiaChargeItem . setProductTable ( CommonConstants . TableName . WOR_ACTIVITY_DEFINITION ) ;
anesthesiaChargeItem . setRequestingOrgId ( orgId ) ;
anesthesiaChargeItem . setQuantityValue ( BigDecimal . valueOf ( 1 ) ) ;
anesthesiaChargeItem . setQuantityUnit ( " 次 " ) ;
anesthesiaChargeItem . setUnitPrice ( anesthesiaFeeAmount ) ;
anesthesiaChargeItem . setTotalPrice ( anesthesiaFeeAmount ) ;
iChargeItemService . save ( anesthesiaChargeItem ) ;
log . info ( " 麻醉收费项目生成成功 " ) ;
}
} catch ( NumberFormatException e ) {
log . warn ( " 麻醉费用格式不正确:{} " , anesthesiaFee ) ;
}
}
} catch ( Exception e ) {
log . error ( " 生成手术医嘱过程中发生异常 " , e ) ;
throw e ;
}
} else {
log . info ( " 不是手术申请单, 跳过手术医嘱生成, typeCode={} " , typeCode ) ;
}
return R . ok ( null , MessageUtils . createMessage ( PromptMsgConstant . Common . M00002 , new Object [ ] { " 申请单 " } ) ) ;