246 lines
8.8 KiB
PHP
246 lines
8.8 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace app\adminapi\logic\tcm;
|
|
|
|
use app\common\model\tcm\Prescription;
|
|
use app\common\model\tcm\Diagnosis;
|
|
|
|
class PrescriptionLogic
|
|
{
|
|
private static $error = '';
|
|
|
|
public static function setError(string $msg): void
|
|
{
|
|
self::$error = $msg;
|
|
}
|
|
|
|
public static function getError(): string
|
|
{
|
|
return self::$error;
|
|
}
|
|
|
|
private static function generateSn(): string
|
|
{
|
|
return 'RX' . date('Ymd') . str_pad((string)mt_rand(1, 9999), 4, '0', STR_PAD_LEFT);
|
|
}
|
|
|
|
/**
|
|
* 添加处方
|
|
*/
|
|
public static function add(array $params, int $adminId): ?int
|
|
{
|
|
// 如果没有诊单ID,允许直接创建处方模板
|
|
if (!empty($params['diagnosis_id'])) {
|
|
$diagnosis = Diagnosis::find($params['diagnosis_id']);
|
|
if (!$diagnosis) {
|
|
self::setError('诊单不存在');
|
|
return null;
|
|
}
|
|
}
|
|
|
|
$herbs = $params['herbs'] ?? [];
|
|
if (empty($herbs) || !is_array($herbs)) {
|
|
self::setError('请添加中药');
|
|
return null;
|
|
}
|
|
|
|
foreach ($herbs as $h) {
|
|
if (empty($h['name'])) {
|
|
self::setError('中药名称不能为空');
|
|
return null;
|
|
}
|
|
}
|
|
|
|
$sn = self::generateSn();
|
|
while (Prescription::where('sn', $sn)->find()) {
|
|
$sn = self::generateSn();
|
|
}
|
|
|
|
$data = [
|
|
'sn' => $sn,
|
|
'prescription_name' => $params['prescription_name'] ?? '',
|
|
'prescription_type' => $params['prescription_type'] ?? '浓缩水丸',
|
|
'diagnosis_id' => (int)($params['diagnosis_id'] ?? 0),
|
|
'appointment_id' => (int)($params['appointment_id'] ?? 0),
|
|
'patient_id' => (int)($params['patient_id'] ?? 0),
|
|
'patient_name' => $params['patient_name'] ?? '',
|
|
'gender' => (int)($params['gender'] ?? 1),
|
|
'age' => (int)($params['age'] ?? 0),
|
|
'phone' => $params['phone'] ?? '',
|
|
'visit_no' => $params['visit_no'] ?? $sn,
|
|
'prescription_date' => $params['prescription_date'] ?? date('Y-m-d'),
|
|
'pulse' => $params['pulse'] ?? '',
|
|
'pulse_condition' => $params['pulse_condition'] ?? '',
|
|
'tongue' => $params['tongue'] ?? '',
|
|
'tongue_image' => $params['tongue_image'] ?? '',
|
|
'clinical_diagnosis' => $params['clinical_diagnosis'] ?? '',
|
|
'case_record' => $params['case_record'] ?? null,
|
|
'herbs' => $herbs,
|
|
'dose_count' => (int)($params['dose_count'] ?? 1),
|
|
'dose_unit' => $params['dose_unit'] ?? '剂',
|
|
'usage_days' => (int)($params['usage_days'] ?? 7),
|
|
'usage_instruction' => $params['usage_instruction'] ?? '水煎服一日二次',
|
|
'usage_time' => $params['usage_time'] ?? '饭前',
|
|
'usage_way' => $params['usage_way'] ?? '温水送服',
|
|
'dietary_taboo' => is_array($params['dietary_taboo'] ?? null) ? implode(',', $params['dietary_taboo']) : ($params['dietary_taboo'] ?? ''),
|
|
'usage_notes' => $params['usage_notes'] ?? '',
|
|
'amount' => (float)($params['amount'] ?? 0),
|
|
'doctor_name' => $params['doctor_name'] ?? '',
|
|
'doctor_signature' => $params['doctor_signature'] ?? '',
|
|
'template_id' => (int)($params['template_id'] ?? 0),
|
|
'is_shared' => (int)($params['is_shared'] ?? 0),
|
|
'creator_id' => $adminId,
|
|
];
|
|
|
|
$prescription = new Prescription();
|
|
$prescription->save($data);
|
|
return (int)$prescription->id;
|
|
}
|
|
|
|
/**
|
|
* 编辑处方
|
|
*/
|
|
public static function edit(array $params, int $adminId): bool
|
|
{
|
|
try {
|
|
$prescription = Prescription::find($params['id']);
|
|
if (!$prescription) {
|
|
self::setError('处方不存在');
|
|
return false;
|
|
}
|
|
|
|
// 检查权限:只有创建者或共享的处方才能编辑
|
|
if ($prescription->creator_id != $adminId && $prescription->is_shared != 1) {
|
|
self::setError('无权限编辑此处方');
|
|
return false;
|
|
}
|
|
|
|
$herbs = $params['herbs'] ?? [];
|
|
if (empty($herbs) || !is_array($herbs)) {
|
|
self::setError('请添加中药');
|
|
return false;
|
|
}
|
|
|
|
foreach ($herbs as $h) {
|
|
if (empty($h['name'])) {
|
|
self::setError('中药名称不能为空');
|
|
return false;
|
|
}
|
|
}
|
|
|
|
$data = [
|
|
'prescription_name' => $params['prescription_name'] ?? $prescription->prescription_name,
|
|
'prescription_type' => $params['prescription_type'] ?? $prescription->prescription_type,
|
|
'patient_name' => $params['patient_name'] ?? $prescription->patient_name,
|
|
'gender' => (int)($params['gender'] ?? $prescription->gender),
|
|
'age' => (int)($params['age'] ?? $prescription->age),
|
|
'visit_no' => $params['visit_no'] ?? $prescription->visit_no,
|
|
'prescription_date' => $params['prescription_date'] ?? $prescription->prescription_date,
|
|
'tongue' => $params['tongue'] ?? $prescription->tongue,
|
|
'tongue_image' => $params['tongue_image'] ?? $prescription->tongue_image,
|
|
'pulse' => $params['pulse'] ?? $prescription->pulse,
|
|
'pulse_condition' => $params['pulse_condition'] ?? $prescription->pulse_condition,
|
|
'clinical_diagnosis' => $params['clinical_diagnosis'] ?? $prescription->clinical_diagnosis,
|
|
'herbs' => $herbs,
|
|
'dose_count' => (int)($params['dose_count'] ?? $prescription->dose_count),
|
|
'dose_unit' => $params['dose_unit'] ?? $prescription->dose_unit,
|
|
'usage_days' => (int)($params['usage_days'] ?? $prescription->usage_days),
|
|
'usage_instruction' => $params['usage_instruction'] ?? $prescription->usage_instruction,
|
|
'usage_time' => $params['usage_time'] ?? $prescription->usage_time,
|
|
'usage_way' => $params['usage_way'] ?? $prescription->usage_way,
|
|
'dietary_taboo' => is_array($params['dietary_taboo'] ?? null) ? implode(',', $params['dietary_taboo']) : ($params['dietary_taboo'] ?? $prescription->dietary_taboo),
|
|
'usage_notes' => $params['usage_notes'] ?? $prescription->usage_notes,
|
|
'doctor_name' => $params['doctor_name'] ?? $prescription->doctor_name,
|
|
'is_shared' => (int)($params['is_shared'] ?? $prescription->is_shared),
|
|
];
|
|
|
|
$prescription->save($data);
|
|
return true;
|
|
} catch (\Exception $e) {
|
|
self::setError($e->getMessage());
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 删除处方
|
|
*/
|
|
public static function delete(int $id): bool
|
|
{
|
|
try {
|
|
$prescription = Prescription::find($id);
|
|
if (!$prescription) {
|
|
self::setError('处方不存在');
|
|
return false;
|
|
}
|
|
|
|
$prescription->delete();
|
|
return true;
|
|
} catch (\Exception $e) {
|
|
self::setError($e->getMessage());
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 处方详情
|
|
*/
|
|
public static function detail(int $id): ?array
|
|
{
|
|
$row = Prescription::find($id);
|
|
if (!$row) {
|
|
return null;
|
|
}
|
|
$arr = $row->toArray();
|
|
$arr['gender_desc'] = $arr['gender'] == 1 ? '男' : '女';
|
|
return $arr;
|
|
}
|
|
|
|
/**
|
|
* 根据诊单ID获取处方列表
|
|
*/
|
|
public static function listByDiagnosis(int $diagnosisId): array
|
|
{
|
|
return Prescription::where('diagnosis_id', $diagnosisId)
|
|
->whereNull('delete_time')
|
|
->order('id', 'desc')
|
|
->select()
|
|
->toArray();
|
|
}
|
|
|
|
/**
|
|
* 根据预约ID获取处方
|
|
*/
|
|
public static function getByAppointment(int $appointmentId): ?array
|
|
{
|
|
$row = Prescription::where('appointment_id', $appointmentId)
|
|
->whereNull('delete_time')
|
|
->order('id', 'desc')
|
|
->find();
|
|
return $row ? $row->toArray() : null;
|
|
}
|
|
|
|
/**
|
|
* 作废处方
|
|
*/
|
|
public static function void(int $id, int $adminId, string $adminName): bool
|
|
{
|
|
$row = Prescription::find($id);
|
|
if (!$row) {
|
|
self::setError('处方不存在');
|
|
return false;
|
|
}
|
|
if ((int)($row->void_status ?? 0) === 1) {
|
|
self::setError('该处方已作废');
|
|
return false;
|
|
}
|
|
$row->void_status = 1;
|
|
$row->void_time = time();
|
|
$row->void_by = $adminId;
|
|
$row->void_by_name = $adminName;
|
|
return $row->save();
|
|
}
|
|
}
|