This commit is contained in:
Your Name
2026-09-10 15:19:17 +08:00
parent 27fbef9321
commit 36975c6c1b
487 changed files with 15696 additions and 78 deletions
@@ -15,7 +15,10 @@ use app\common\service\pharmacy\PharmacyHerbIdentityResolver;
use app\common\service\pharmacy\LockedPharmacySnapshotMutation;
use app\adminapi\logic\auth\AuthLogic;
use think\facade\Config;
use think\facade\Log;
use think\facade\Log;
use think\facade\Db;
use app\common\service\prescriptionai\PrescriptionAiStore;
use app\common\service\prescriptionai\PrescriptionAiRequest;
class PrescriptionLogic
{
@@ -251,6 +254,15 @@ class PrescriptionLogic
public static function add(array $params, int $adminId, array $adminInfo): ?int
{
self::setError('');
try {
$replayed = PrescriptionAiRequest::replay($params, $adminId);
if ($replayed !== null) {
return $replayed;
}
} catch (\DomainException $e) {
self::setError($e->getMessage());
return null;
}
$diagnosis = null;
$authoritativeCaseRecord = null;
$authoritativeAppointmentId = 0;
@@ -288,9 +300,6 @@ class PrescriptionLogic
}
$dateYmd = self::normalizePrescriptionDate($params['prescription_date'] ?? date('Y-m-d'));
if ($diagnosisIdRule > 0 && !self::assertUniquePrescriptionPerDiagnosisDay($diagnosisIdRule, $adminId, $dateYmd, null)) {
return null;
}
$herbs = $params['herbs'] ?? [];
if (empty($herbs) || !is_array($herbs)) {
@@ -385,10 +394,32 @@ class PrescriptionLogic
'assistant_id' => $assistantIdForRx,
];
$prescription = new Prescription();
$prescription->save($data);
return (int) $prescription->id;
try {
return Db::transaction(static function () use ($data, $params, $adminId, $adminInfo, $diagnosisIdRule, $dateYmd): int {
$replayed = PrescriptionAiRequest::replay($params, $adminId, true);
if ($replayed !== null) {
return $replayed;
}
if ($diagnosisIdRule > 0) {
Diagnosis::where('id', $diagnosisIdRule)->lock(true)->find();
if (!self::assertUniquePrescriptionPerDiagnosisDay($diagnosisIdRule, $adminId, $dateYmd, null)) {
throw new \DomainException(self::getError());
}
}
$prescription = new Prescription();
$prescription->save($data);
$id = (int) $prescription->id;
// Read database defaults and JSON exactly as workers will fingerprint them.
$saved = Db::name('tcm_prescription')->where('id', $id)->find();
self::scheduleAiSaved($saved, $adminId, $adminInfo,
['trigger' => 'first_manual'] + array_intersect_key($params, ['ai_assisted' => true]));
PrescriptionAiRequest::complete($params, $adminId, $id);
return $id;
});
} catch (\Throwable $e) {
self::setError($e instanceof \DomainException ? $e->getMessage() : '处方保存失败,请稍后重试');
return null;
}
}
/**
@@ -411,10 +442,10 @@ class PrescriptionLogic
}
}
private static function editLocked(array $params, int $adminId): bool
{
try {
$prescription = Prescription::find($params['id']);
private static function editLocked(array $params, int $adminId): bool
{
try {
$prescription = Prescription::where('id', $params['id'])->lock(true)->find();
if (!$prescription) {
self::setError('处方不存在');
return false;
@@ -477,7 +508,8 @@ class PrescriptionLogic
return false;
}
$wasVoid = (int) ($prescription->void_status ?? 0) === 1;
$wasVoid = (int) ($prescription->void_status ?? 0) === 1;
$wasBlank = (int) ($prescription->is_system_auto ?? 0) === 1;
$assistantIdForRx = (int) ($prescription->assistant_id ?? 0);
if ($newDiagnosisId > 0) {
@@ -487,8 +519,11 @@ class PrescriptionLogic
$assistantIdForRx = 0;
}
$data = [
'diagnosis_id' => $newDiagnosisId,
$data = [
'diagnosis_id' => $newDiagnosisId,
'patient_id' => $newDiagnosisId > 0
? (int) Diagnosis::where('id', $newDiagnosisId)->value('patient_id')
: (int) ($prescription->patient_id ?? 0),
'assistant_id' => $assistantIdForRx,
'prescription_name' => $params['prescription_name'] ?? $prescription->prescription_name,
'prescription_type' => $params['prescription_type'] ?? $prescription->prescription_type,
@@ -544,7 +579,12 @@ class PrescriptionLogic
}
$prescription->save($data);
PrescriptionOrderLogic::onConsumerPrescriptionSaved((int) $params['id']);
PrescriptionOrderLogic::onConsumerPrescriptionSaved((int) $params['id']);
self::scheduleAiSaved(
Db::name('tcm_prescription')->where('id', (int) $params['id'])->find(), $adminId, null,
['trigger' => $wasBlank ? 'blank_to_manual' : 'clinical_change', 'restored' => $wasVoid]
+ array_intersect_key($params, ['ai_assisted' => true])
);
return true;
} catch (\Exception $e) {
@@ -553,9 +593,18 @@ class PrescriptionLogic
}
}
/**
* 仅修正处方笺展示用患者姓名、手机号与性别(zyt_tcm_prescription),不改变审核状态与其它字段
*/
private static function scheduleAiSaved(array $saved, int $actor, ?array $info, array $options): void
{
try {
PrescriptionAiStore::recordSaved($saved, $actor, $info, $options);
} catch (\Throwable $e) {
throw new \DomainException('AI分析任务登记失败,本次处方保存已回滚,请联系管理员检查服务');
}
}
/**
* 仅修正处方笺展示用患者姓名、手机号与性别(zyt_tcm_prescription),不改变审核状态与其它字段
*/
public static function patchPatientContact(int $rxId, string $patientName, string $phone, int $gender, int $adminId, array $adminInfo): bool
{
self::setError('');
@@ -704,10 +753,10 @@ class PrescriptionLogic
}
}
private static function deleteLocked(int $id): bool
{
try {
$prescription = Prescription::find($id);
private static function deleteLocked(int $id): bool
{
try {
$prescription = Prescription::where('id', $id)->lock(true)->find();
if (!$prescription) {
self::setError('处方不存在');
return false;
@@ -718,7 +767,8 @@ class PrescriptionLogic
return false;
}
$prescription->delete();
$prescription->delete();
PrescriptionAiStore::invalidate($id, 'deleted');
return true;
} catch (\Exception $e) {
self::setError($e->getMessage());
@@ -908,10 +958,17 @@ class PrescriptionLogic
$row->void_by = $adminId;
$row->void_by_name = $name;
$ok = (bool) $row->save();
if ($ok) {
self::$lastAuditWecomNotify = self::notifyCreatorAuditResult($row, 'reject', $remark, $adminInfo);
}
$ok = Db::transaction(static function () use ($row, $id): bool {
Prescription::where('id', $id)->lock(true)->find();
$saved = (bool) $row->save();
if ($saved) {
PrescriptionAiStore::invalidate($id, 'voided');
}
return $saved;
});
if ($ok) {
self::$lastAuditWecomNotify = self::notifyCreatorAuditResult($row, 'reject', $remark, $adminInfo);
}
return $ok;
}
@@ -1202,9 +1259,9 @@ class PrescriptionLogic
}
}
private static function voidLocked(int $id, int $adminId, string $adminName): bool
{
$row = Prescription::find($id);
private static function voidLocked(int $id, int $adminId, string $adminName): bool
{
$row = Prescription::where('id', $id)->lock(true)->find();
if (!$row) {
self::setError('处方不存在');
return false;
@@ -1227,6 +1284,10 @@ class PrescriptionLogic
$row->void_time = time();
$row->void_by = $adminId;
$row->void_by_name = $adminName;
return $row->save();
$saved = (bool) $row->save();
if ($saved) {
PrescriptionAiStore::invalidate($id, 'voided');
}
return $saved;
}
}