You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

90 lines
4.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?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;
}
//护工没换
if ($order->paramedic_id == $from_paramedic) {
$order->affected_orders = $affected_orders;
return $order;
}
$model = Orders::with([
"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");
}
]);
//更换护工查询从原护工手上退出订单后原护工的其他订单是否变成了1对1
if ($from_paramedic) {
$last_orders = $model->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 = $model->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;
}
}