|
|
<?php
|
|
|
|
|
|
namespace App\Actions;
|
|
|
|
|
|
use App\Models\Orders;
|
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
|
|
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;
|
|
|
}
|
|
|
//护工没换
|
|
|
if ($order->paramedic_id == $from_paramedic) {
|
|
|
$order->affected_orders = $affected_orders;
|
|
|
return $order;
|
|
|
}
|
|
|
|
|
|
//更换护工,查询从原护工手上退出订单后,原护工的其他订单是否变成了1对1
|
|
|
if ($from_paramedic) {
|
|
|
$last_orders = $this->getOrderModel()->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 = $this->getOrderModel()->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;
|
|
|
}
|
|
|
|
|
|
foreach ($affected_orders as $affected_order) {
|
|
|
$affected_order->from_order_id = $order->id;
|
|
|
$affected_order->from_paramedic_id = $from_paramedic;
|
|
|
}
|
|
|
|
|
|
$order->affected_orders = collect($affected_orders);
|
|
|
return $order;
|
|
|
}
|
|
|
|
|
|
public function getOrderModel()
|
|
|
{
|
|
|
$model = Orders::with([
|
|
|
"project" => function ($query) {
|
|
|
$query->select("id", "name");
|
|
|
},
|
|
|
"bed" => function ($query) {
|
|
|
$query->select("bed.id", "bed.name")
|
|
|
->leftJoin("building", "building.id", "=", "bed.building_id")
|
|
|
->leftJoin("area", "area.id", "=", "bed.area_id")
|
|
|
->leftJoin("room", "room.id", "=", "bed.room_id")
|
|
|
->addSelect("room.name as room_name", "area.name as area_name", "building.name as building_name");
|
|
|
},
|
|
|
"patient" => function ($query) {
|
|
|
$query->select("id", "name", "sex", "age", "mobile");
|
|
|
},
|
|
|
"paramedic" => function ($query) {
|
|
|
$query->select("paramedic.id", "paramedic.name", "paramedic.mobile")
|
|
|
->leftJoin("paramedic_level", "paramedic_level.id", "=", "paramedic.paramedic_level_id")
|
|
|
->addSelect("paramedic_level.name as paramedic_level_name");
|
|
|
}
|
|
|
]);
|
|
|
return $model;
|
|
|
}
|
|
|
}
|