weizong song 5 years ago
parent 7567466a01
commit 5da2b59a09

@ -0,0 +1,61 @@
<?php
namespace App\Actions;
use App\Models\Orders;
class AttachAffectedOrders
{
/*
* 获取关联影响的订单
* 前置条件是订单状态为进行中
* 忽略服务开始日期因素,基于后续的主订单修改只针对今天或明天生效,原因如下:
* 1、如果服务日期开始于今天之前那今明两天势必已经包含在被影响到的范围
* 2、如果服务日期开始于明天那前端可锁定、或现场管理人员可以自定判断在后续的订单修改时提交生效起始时间为明天
* 3、如果服务日期开始于后天及以后为极小概率事件现场管理人员可在此刻忽略后续的订单处理待服务日期开始后自行调整
* todo:目前的策略为统一的只区分一对一和一对多如要按照更精确的按照1对N进行计算需要更改此action
*/
public function __invoke(Orders $order, $from_paramedic = null)
{
$affected_orders = [];
//前置条件
if ($order->status != Orders::STATUS_ONGOING) {
$order->affected_orders = $affected_orders;
return $order;
}
//更换护工查询从原护工手上退出订单后原护工的其他订单是否变成了1对1
if ($from_paramedic) {
$last_orders = Orders::where("paramedic_id", $from_paramedic)
->where("status", Orders::STATUS_ONGOING)
->where("paramedic_id", "<>", $order->paramedic_id) //剔除未更换护工的情况
->get();
//仅取唯一的一条。如果总数大于1说明护工撤出后仍然是一对多按照既定规则不产生价格变化
if ($last_orders->count() === 1) {
$many_to_one = $last_orders->first();
$many_to_one->change = "many_to_one";
$affected_orders[] = $many_to_one;
}
}
//查询护工新接手一张单之后是否有订单从1对1变成了1对多
$new_same_paramedic_orders = Orders::where("paramedic_id", $order->paramedic_id)
->where("status", Orders::STATUS_ONGOING)
->where("id", "<>", $order->id) //剔除订单本身
->get();
//仅取唯一的一条。如果总数大于1说明护工在未增加订单之前已经是1对多按照既定规则不产生价格变化
if ($new_same_paramedic_orders->count() === 1) {
$one_to_many = $new_same_paramedic_orders->first();
$one_to_many->change = "one_to_many";
$affected_orders[] = $one_to_many;
}
$order->affected_orders = $affected_orders;
return $order;
}
}

@ -4,6 +4,7 @@
namespace App\Http\Controllers\Manager;
use AlicFeng\IdentityCard\InfoHelper;
use App\Actions\AttachAffectedOrders;
use App\Customer;
use App\Events\OrderAssigned;
use App\Libs\AlipayF2F;
@ -542,7 +543,34 @@ class OrdersController extends CommonController
* @OA\Parameter(name="price", in="query", @OA\Schema(type="number"), required=true, description="协商价格"),
* @OA\Response(
* response="200",
* description="订单修改"
* description="订单修改",
* content={
* @OA\MediaType(
* mediaType="application/json",
* @OA\Schema(
* @OA\Property(
* property="errorcode",
* type="integer",
* description="错误码;仅在发生错误时发送"
* ),
* @OA\Property(
* property="errormsg",
* type="string",
* description="返回消息有errorcode时为错误内容无errorcode时为提示内容"
* ),
* @OA\Property(
* property="order.*",
* type="array",
* description="订单实体"
* )
* @OA\Property(
* property="affected_orders",
* type="array",
* description="特别说明影响到的订单如果无此字段或数组为空表示未发生订单影响。影响到的订单实体数组实体中的change字段many_to_one或one_to_many表示影响的方向"
* )
* )
* )
* }
* )
* )
*/
@ -607,6 +635,7 @@ class OrdersController extends CommonController
"status" => Orders::STATUS_ONGOING
]);
event(new OrderAssigned($order));
$order = (new AttachAffectedOrders)($order);
}
DB::commit();
@ -1247,7 +1276,34 @@ class OrdersController extends CommonController
* @OA\Parameter(name="paramedic_id", in="query", @OA\Schema(type="integer"), required=true, description="护工id"),
* @OA\Response(
* response="200",
* description="派单"
* description="订单派单",
* content={
* @OA\MediaType(
* mediaType="application/json",
* @OA\Schema(
* @OA\Property(
* property="errorcode",
* type="integer",
* description="错误码;仅在发生错误时发送"
* ),
* @OA\Property(
* property="errormsg",
* type="string",
* description="返回消息有errorcode时为错误内容无errorcode时为提示内容"
* ),
* @OA\Property(
* property="order.*",
* type="array",
* description="订单实体"
* )
* @OA\Property(
* property="affected_orders",
* type="array",
* description="特别说明影响到的订单如果无此字段或数组为空表示未发生订单影响。影响到的订单实体数组实体中的change字段many_to_one或one_to_many表示影响的方向"
* )
* )
* )
* }
* )
* )
*/

Loading…
Cancel
Save