This commit is contained in:
Your Name
2026-04-24 14:42:52 +08:00
parent a3e035b74b
commit aaba330f0d
7 changed files with 175 additions and 46 deletions
@@ -4,8 +4,10 @@ declare(strict_types=1);
namespace app\api\controller;
use app\common\model\Order;
use app\common\model\tcm\PrescriptionOrder;
use app\common\model\tcm\PrescriptionOrderLog;
use app\common\model\tcm\PrescriptionOrderPayOrder;
use think\facade\Config;
use think\facade\Log;
use think\Response;
@@ -237,11 +239,66 @@ class GancaoCallbackController extends BaseApiController
* 11 系统审核通过
* 110 订单药房流转制作中(ext: flow_name, supplier
* 20 物流中(ext: shipping_name, nu, supplier
* 30 完成 - 终态ext: shipping_name, nu, supplier
* 30 完成 - 终态。fulfillment 见 resolveFulfilmentOnGancaoState30(与 zyt_order 已付/关联合计对比业务订单 amount
* 90 拦截 - 可恢复
* 91 主动撤单 - 终态(退费)
* 92 驳回 - 终态(无法制作并退费)
*/
/**
* 甘草 state=30:返回 fulfillment_status 3=已完成 或 6=已签收
* 1) 已支付金额(zyt_order.status=2 的 amount 合计)与业务订单 amount 一致 → 3
* 2) 否则已关联订单金额合计(全部关联单 amount)与业务订单 amount 一致 → 3
* 3) 否则 → 6(含:已支付与总金额不一致且关联合计也不一致)
* 无关联 zyt_order:仅甘草完成则 3
*/
private function resolveFulfilmentOnGancaoState30(PrescriptionOrder $order): int
{
$poId = (int) $order->id;
if ($poId <= 0) {
return 3;
}
$payIds = PrescriptionOrderPayOrder::where('prescription_order_id', $poId)
->column('pay_order_id');
$payIds = array_values(array_filter(
array_map('intval', is_array($payIds) ? $payIds : []),
static fn (int $id): bool => $id > 0
));
if ($payIds === []) {
return 3;
}
$orderAmt = round((float) ($order->amount ?? 0), 2);
$sumAll = round(
(float) Order::whereIn('id', $payIds)->whereNull('delete_time')->sum('amount'),
2
);
$sumPaid = round(
(float) Order::whereIn('id', $payIds)
->whereNull('delete_time')
->where('status', 2)
->sum('amount'),
2
);
if (abs($sumPaid - $orderAmt) <= 0.02) {
return 3;
}
if (abs($sumAll - $orderAmt) <= 0.02) {
return 3;
}
Log::warning('Gancao 完成回调:已支付(status=2)与关联合计均未与业务订单金额对齐,标已签收(6)', [
'prescription_order_id' => $poId,
'order_no' => (string) ($order->order_no ?? ''),
'tcm_order_amount' => $orderAmt,
'sum_paid_status2' => $sumPaid,
'sum_linked_all' => $sumAll,
'linked_pay_order_ids' => $payIds,
]);
return 6;
}
private function updateOrderStatus(PrescriptionOrder $order, int $state, array $ext): void
{
$order->gancao_order_state = $state;
@@ -262,7 +319,7 @@ class GancaoCallbackController extends BaseApiController
case 30:
$this->handleShipping($order, $ext);
if ((int) $order->fulfillment_status !== 4) {
$order->fulfillment_status = 3; // 已完成
$order->fulfillment_status = $this->resolveFulfilmentOnGancaoState30($order);
}
break;