This commit is contained in:
Your Name
2026-05-19 10:18:00 +08:00
parent 4f9494db0b
commit 0fb51e12d1
7 changed files with 231 additions and 9 deletions
@@ -124,6 +124,25 @@ class PrescriptionOrderController extends BaseAdminController
return $this->success('修改成功');
}
/**
* 设置发货类型(甘草 / 洛阳)
*/
public function setShipMode()
{
$params = (new PrescriptionOrderValidate())->post()->goCheck('setShipMode');
$result = PrescriptionOrderLogic::setShipMode(
(int) $params['id'],
(string) ($params['ship_mode'] ?? 'gancao'),
$this->adminId,
$this->adminInfo
);
if ($result === false) {
return $this->fail(PrescriptionOrderLogic::getError());
}
return $this->success('已保存', $result);
}
/**
* 修改关联处方的患者姓名与手机号(订单详情场景)
*/
@@ -677,9 +677,10 @@ class PrescriptionOrderLogic
$rows = Order::whereIn('id', $ids)->whereNull('delete_time')
->field(['id', 'order_no', 'order_type', 'amount', 'status', 'create_time', 'creator_id', 'remark', 'is_exempt'])
->order('id', 'asc')
->where('status', 2)
->select()
->toArray();
$creatorIds = array_values(array_unique(array_filter(array_map('intval', array_column($rows, 'creator_id')))));
$creatorNames = [];
if ($creatorIds !== []) {
@@ -1664,6 +1665,7 @@ class PrescriptionOrderLogic
$order->express_company = self::normalizeExpressCompany($expressCompany);
$order->tracking_number = $trackingNumber;
$order->ship_mode = $shipMode;
// 仅履约中(2)时才推进到已发货(5),已发货(5)则只更新快递信息保持状态
$isFirstShip = false;
if ((int) $order->fulfillment_status === 2) {
@@ -2425,7 +2427,7 @@ class PrescriptionOrderLogic
$linkedPayPaidTotal += (float) ($o['amount'] ?? 0);
}
$linkedPayPaidTotal = round($linkedPayPaidTotal, 2);
if ($targetFulfillmentStatus === 3) {
$order->fulfillment_status = 3;
$order->paid = $linkedPayPaidTotal;
@@ -3267,6 +3269,72 @@ class PrescriptionOrderLogic
];
}
/**
* 设置发货类型(甘草 / 洛阳),与确认发货选项一致
*
* @return array<string,mixed>|false
*/
public static function setShipMode(int $id, string $shipMode, int $adminId, array $adminInfo)
{
self::$error = '';
$order = PrescriptionOrder::where('id', $id)->whereNull('delete_time')->find();
if (!$order) {
self::$error = '订单不存在';
return false;
}
if (!self::canAccessOrder($order, $adminId, $adminInfo)) {
self::$error = '无权限操作';
return false;
}
$fs = (int) $order->fulfillment_status;
if ($fs === 3 || $fs === 4) {
self::$error = '已完成或已取消的订单不可修改发货类型';
return false;
}
$shipMode = self::normalizeShipMode($shipMode);
if ($shipMode === 'direct' && trim((string) $order->gancao_reciperl_order_no) !== '') {
self::$error = '已上传甘草药方,发货类型须为甘草药房';
return false;
}
$oldMode = self::normalizeShipMode((string) ($order->ship_mode ?? 'gancao'));
if ($oldMode === $shipMode) {
$out = $order->toArray();
self::maskInternalCostIfNeeded($out, $adminInfo);
self::maskRemarkExtraIfNeeded($out, $adminInfo);
self::attachLinkedPayOrders($out);
return $out;
}
$order->ship_mode = $shipMode;
try {
$order->save();
} catch (\Throwable $e) {
self::$error = $e->getMessage();
return false;
}
$oldText = $oldMode === 'direct' ? '洛阳药房' : '甘草药房';
$newText = $shipMode === 'direct' ? '洛阳药房' : '甘草药房';
self::writeLog($id, $adminId, $adminInfo, 'set_ship_mode', '发货类型:' . $oldText . ' → ' . $newText);
$out = $order->toArray();
self::maskInternalCostIfNeeded($out, $adminInfo);
self::maskRemarkExtraIfNeeded($out, $adminInfo);
self::attachLinkedPayOrders($out);
return $out;
}
/**
* 修改订单金额
*/
@@ -78,6 +78,7 @@ class PrescriptionOrderValidate extends BaseValidate
'previewGancaoRecipel' => ['id'],
'patchPrescriptionPatient' => ['id', 'patient_name', 'phone'],
'updateAmount' => ['id', 'amount'],
'setShipMode' => ['id', 'ship_mode'],
];
public function updateAmount(): PrescriptionOrderValidate
@@ -0,0 +1,16 @@
-- 处方业务订单:设置发货类型(甘草 / 洛阳)
-- 执行前确认表前缀为 zyt_;若已有相同 perms 则跳过。
SET @po_menu_id := (SELECT id FROM zyt_system_menu WHERE perms = 'tcm.prescriptionOrder/lists' LIMIT 1);
INSERT INTO zyt_system_menu (
pid, type, name, icon, sort, perms, paths, component,
selected, params, is_cache, is_show, is_disable, create_time, update_time
)
SELECT
@po_menu_id, 'A', '设置发货类型', '', 61,
'tcm.prescriptionOrder/setShipMode', '', '',
'', '', 0, 1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
FROM DUAL
WHERE @po_menu_id IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM zyt_system_menu WHERE perms = 'tcm.prescriptionOrder/setShipMode');
@@ -0,0 +1,7 @@
-- 业务订单:发货药方(甘草 / 洛阳),与确认发货 ship_mode 一致
-- 执行前确认表前缀为 zyt_;若列已存在可跳过。
ALTER TABLE `zyt_tcm_prescription_order`
ADD COLUMN `ship_mode` varchar(16) NOT NULL DEFAULT 'gancao'
COMMENT '发货药方:gancao=甘草药房 direct=洛阳药房'
AFTER `express_company`;