更新
This commit is contained in:
@@ -478,7 +478,66 @@ class DiagnosisLogic extends BaseLogic
|
||||
}
|
||||
|
||||
/**
|
||||
* @notes 指派医助(每次成功更新写入一条操作记录,批量指派为多次接口调用各记一条)
|
||||
* 诊单下用于指派日志快照的「最新」业务单:按 create_time 最新,其次 id(避免误用更早下单但 id 更大的记录)。
|
||||
*
|
||||
* @return array{creator_id: int, create_time: int}|null
|
||||
*/
|
||||
private static function getLatestPrescriptionOrderSnapshotForDiagnosis(int $diagnosisId): ?array
|
||||
{
|
||||
if ($diagnosisId <= 0) {
|
||||
return null;
|
||||
}
|
||||
$row = Db::name('tcm_prescription_order')
|
||||
->where('diagnosis_id', $diagnosisId)
|
||||
->whereNull('delete_time')
|
||||
->order('create_time', 'desc')
|
||||
->order('id', 'desc')
|
||||
->field(['creator_id', 'create_time'])
|
||||
->find();
|
||||
|
||||
if ($row === null || $row === []) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return [
|
||||
'creator_id' => (int) ($row['creator_id'] ?? 0),
|
||||
'create_time' => (int) ($row['create_time'] ?? 0),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* 诊单 current assistant_id 为 0 时,从最近一条指派日志推断「原医助」(如发货释放后:上一条多为 from=X、to=0)。
|
||||
* - 最近一条 to_assistant_id > 0:视为上一任持有人(库未同步时的兜底)
|
||||
* - 否则若 from_assistant_id > 0:视为释放/取消前的持有人
|
||||
*/
|
||||
private static function inferPreviousAssistantIdFromLatestAssignLog(int $diagnosisId): int
|
||||
{
|
||||
if ($diagnosisId <= 0) {
|
||||
return 0;
|
||||
}
|
||||
$prev = Db::name('tcm_diagnosis_assign_log')
|
||||
->where('diagnosis_id', $diagnosisId)
|
||||
->order('id', 'desc')
|
||||
->field(['from_assistant_id', 'to_assistant_id'])
|
||||
->find();
|
||||
if ($prev === null || $prev === []) {
|
||||
return 0;
|
||||
}
|
||||
$pTo = (int) ($prev['to_assistant_id'] ?? 0);
|
||||
$pFrom = (int) ($prev['from_assistant_id'] ?? 0);
|
||||
if ($pTo > 0) {
|
||||
return $pTo;
|
||||
}
|
||||
if ($pFrom > 0) {
|
||||
return $pFrom;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @notes 指派医助(每次成功更新写入一条操作记录,批量指派为多次接口调用各记一条)。
|
||||
* **原医助**:优先诊单 `assistant_id`;若为 0 且本次为指派到某人,则从**最近一条**指派日志推断(覆盖发货释放后库为 0、业务上仍有「前任」医助的情况)。
|
||||
* @param array $params
|
||||
* @return bool
|
||||
*/
|
||||
@@ -493,33 +552,66 @@ class DiagnosisLogic extends BaseLogic
|
||||
return false;
|
||||
}
|
||||
|
||||
$diagnosis = Diagnosis::where('id', $id)->whereNull('delete_time')->find();
|
||||
if (!$diagnosis) {
|
||||
self::setError('诊单不存在');
|
||||
$now = time();
|
||||
$poSnap = self::getLatestPrescriptionOrderSnapshotForDiagnosis($id);
|
||||
$relatedPoCreatorId = 0;
|
||||
$relatedPoCreateTime = 0;
|
||||
if ($poSnap !== null) {
|
||||
$relatedPoCreatorId = $poSnap['creator_id'];
|
||||
$relatedPoCreateTime = $poSnap['create_time'];
|
||||
}
|
||||
if ($relatedPoCreateTime <= 0) {
|
||||
$relatedPoCreateTime = $now;
|
||||
$relatedPoCreatorId = 0;
|
||||
}
|
||||
|
||||
Db::startTrans();
|
||||
try {
|
||||
// 事务内 FOR UPDATE 直读库:确保「原医助」与 tcm_diagnosis.assistant_id 一致,避免模型缓存或并发覆盖
|
||||
$diagLock = Db::name('tcm_diagnosis')
|
||||
->where('id', $id)
|
||||
->whereNull('delete_time')
|
||||
->lock(true)
|
||||
->field(['id', 'assistant_id'])
|
||||
->find();
|
||||
if ($diagLock === null || $diagLock === []) {
|
||||
Db::rollback();
|
||||
self::setError('诊单不存在');
|
||||
|
||||
return false;
|
||||
}
|
||||
$fromAssistantId = (int) ($diagLock['assistant_id'] ?? 0);
|
||||
if ($fromAssistantId <= 0 && $toAssistantId > 0) {
|
||||
$fromAssistantId = self::inferPreviousAssistantIdFromLatestAssignLog($id);
|
||||
}
|
||||
|
||||
Db::name('tcm_diagnosis')
|
||||
->where('id', $id)
|
||||
->whereNull('delete_time')
|
||||
->update(['assistant_id' => $toAssistantId]);
|
||||
|
||||
$req = request();
|
||||
$admin = $req->adminInfo ?? [];
|
||||
// Db::insert 直写:与 assignLogList 一致,避免模型 allowField/schema 丢列
|
||||
Db::name('tcm_diagnosis_assign_log')->insert([
|
||||
'diagnosis_id' => $id,
|
||||
'from_assistant_id' => $fromAssistantId,
|
||||
'to_assistant_id' => $toAssistantId,
|
||||
'operator_admin_id' => (int) ($admin['admin_id'] ?? 0),
|
||||
'operator_name' => (string) ($admin['name'] ?? ''),
|
||||
'operator_account' => (string) ($admin['account'] ?? ''),
|
||||
'ip' => (string) ($req->ip() ?? ''),
|
||||
'related_po_creator_id' => $relatedPoCreatorId,
|
||||
'related_po_create_time' => $relatedPoCreateTime,
|
||||
'create_time' => $now,
|
||||
]);
|
||||
} catch (\Throwable $e) {
|
||||
Db::rollback();
|
||||
self::setError($e->getMessage());
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
$fromAssistantId = (int) ($diagnosis->getAttr('assistant_id') ?? 0);
|
||||
|
||||
Db::startTrans();
|
||||
Diagnosis::where('id', $id)->whereNull('delete_time')->update([
|
||||
'assistant_id' => $toAssistantId,
|
||||
]);
|
||||
|
||||
$req = request();
|
||||
$admin = $req->adminInfo ?? [];
|
||||
DiagnosisAssignLog::create([
|
||||
'diagnosis_id' => $id,
|
||||
'from_assistant_id' => $fromAssistantId,
|
||||
'to_assistant_id' => $toAssistantId,
|
||||
'operator_admin_id' => (int) ($admin['admin_id'] ?? 0),
|
||||
'operator_name' => (string) ($admin['name'] ?? ''),
|
||||
'operator_account' => (string) ($admin['account'] ?? ''),
|
||||
'ip' => (string) ($req->ip() ?? ''),
|
||||
'create_time' => time(),
|
||||
]);
|
||||
|
||||
Db::commit();
|
||||
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user