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.

97 lines
4.2 KiB

5 years ago
<?php
namespace App\Actions;
use App\Models\Orders;
5 years ago
use Illuminate\Support\Facades\DB;
5 years ago
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;
}
5 years ago
//护工没换
if ($order->paramedic_id == $from_paramedic) {
$order->affected_orders = $affected_orders;
return $order;
}
5 years ago
//更换护工查询从原护工手上退出订单后原护工的其他订单是否变成了1对1
if ($from_paramedic) {
5 years ago
$last_orders = $this->getOrderModel()->where("paramedic_id", $from_paramedic)
5 years ago
->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";
5 years ago
$affected_orders[] = $many_to_one;
5 years ago
}
}
//查询护工新接手一张单之后是否有订单从1对1变成了1对多
5 years ago
$new_same_paramedic_orders = $this->getOrderModel()->where("paramedic_id", $order->paramedic_id)
5 years ago
->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";
5 years ago
$affected_orders[] = $one_to_many;
5 years ago
}
5 years ago
foreach ($affected_orders as $affected_order) {
$affected_order->from_order_id = $order->id;
$affected_order->from_paramedic_id = $from_paramedic;
}
5 years ago
$order->affected_orders = collect($affected_orders);
5 years ago
return $order;
}
5 years ago
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;
}
5 years ago
}