|
|
@@ -2,8 +2,20 @@
|
|
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
|
|
+use App\CarType;
|
|
|
+use App\CommodityBarcode;
|
|
|
use App\Components\AsyncResponse;
|
|
|
+use App\DeliveryAppointment;
|
|
|
+use App\DeliveryAppointmentCar;
|
|
|
+use App\DeliveryAppointmentDetail;
|
|
|
use App\Imports\AppointmentDetail;
|
|
|
+use App\Warehouse;
|
|
|
+use Carbon\Carbon;
|
|
|
+use Carbon\CarbonPeriod;
|
|
|
+use Illuminate\Database\Eloquent\Builder;
|
|
|
+use Illuminate\Support\Facades\Auth;
|
|
|
+use Illuminate\Support\Facades\DB;
|
|
|
+use Illuminate\Support\Facades\Validator;
|
|
|
|
|
|
class DeliveryAppointmentController extends Controller
|
|
|
{
|
|
|
@@ -11,11 +23,169 @@ class DeliveryAppointmentController extends Controller
|
|
|
public function appointment()
|
|
|
{
|
|
|
$owners = app("OwnerService")->getIntersectPermitting();
|
|
|
- return view("store.checkingReceive.appointment",compact("owners"));
|
|
|
+ $cars = CarType::query()->get();
|
|
|
+ $warehouses = Warehouse::query()->select("id","name")->get();
|
|
|
+ return view("store.deliveryAppointment.appointment",compact("owners","cars","warehouses"));
|
|
|
}
|
|
|
|
|
|
public function import()
|
|
|
{
|
|
|
$this->importExcel(new AppointmentDetail());
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取产能
|
|
|
+ *
|
|
|
+ */
|
|
|
+ public function getCapacity()
|
|
|
+ {
|
|
|
+ /** @var \stdClass $warehouse */
|
|
|
+ $warehouse = Warehouse::query()->find(request("warehouse_id"));
|
|
|
+ $tonne = request("tonne");
|
|
|
+ $cubicMeter = request("cubic_meter");
|
|
|
+ $amount = request("detail_amount");
|
|
|
+ if (!$warehouse || (!$tonne && !$cubicMeter))$this->error("非法参数");
|
|
|
+ $need = app("DeliveryAppointmentService")->calculateCapacity($tonne,$cubicMeter,$amount,$warehouse->reduced_production_capacity_coefficient);//所需产能
|
|
|
+ $start = Carbon::tomorrow();
|
|
|
+ $end = Carbon::today()->addDays(7);
|
|
|
+ $map = [];
|
|
|
+ DeliveryAppointment::query()->selectRaw("appointment_date,date_period,SUM(capacity) AS capacity")
|
|
|
+ ->whereBetween("appointment_date",[$start->toDateString(),$end->toDateString()])
|
|
|
+ ->where("status",0)
|
|
|
+ ->where("warehouse_id",$warehouse->id)
|
|
|
+ ->groupBy(["appointment_date","date_period"])->get()
|
|
|
+ ->each(function ($appointment)use(&$map){
|
|
|
+ $map[$appointment->appointment_date."-".$appointment->date_period] = $appointment->capacity;
|
|
|
+ });
|
|
|
+ $list = [];
|
|
|
+ $capacity = $warehouse->production_capacity;
|
|
|
+ foreach (CarbonPeriod::create($start,$end) as $date){
|
|
|
+ /** @var $date Carbon */
|
|
|
+ $date = $date->format("Y-m-d");
|
|
|
+ $periods = [];
|
|
|
+ foreach (DeliveryAppointment::PERIOD as $key=>$period){
|
|
|
+ $total = $capacity*DeliveryAppointment::HOUR[$key];//仓库该时段产能总量
|
|
|
+ $used = $map[$date."-".$key] ?? 0; //已使用产能
|
|
|
+ $available = $total-$used; //可用产能
|
|
|
+ if ($available < $need)$periods[] = ["time"=>$period,"index"=>$key,"isAvailable"=>false];
|
|
|
+ else $periods[] = ["time"=>$period,"index"=>$key,"isAvailable"=>true];
|
|
|
+ }
|
|
|
+ $list[] = ["date"=>$date,"period"=>$periods];
|
|
|
+ }
|
|
|
+ $this->success($list);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 确定预约
|
|
|
+ */
|
|
|
+ public function submitAppointment()
|
|
|
+ {
|
|
|
+ $model = request("model");
|
|
|
+ $selectDate = request("selectDate");
|
|
|
+ $details = request("details");
|
|
|
+ $errors = Validator::make($model,[
|
|
|
+ "owner_id" => ["required","integer"],
|
|
|
+ "warehouse_id" => ["required","integer"],
|
|
|
+ "tonne" => ["required_without:cubic_meter","numeric"],
|
|
|
+ "cubic_meter" => ["required_without:tonne","numeric"],
|
|
|
+ "box_amount" => ["nullable","integer"],
|
|
|
+ "cars.*.license_plate_number" => ["required","size:7"],
|
|
|
+ "cars.*.car_id" => ["nullable","integer"],
|
|
|
+ "cars.*.driver_phone" => ["nullable"],
|
|
|
+ "cars.*.driver_name" => ["nullable"],
|
|
|
+ ],[
|
|
|
+ 'required'=>':attribute 不应为空',
|
|
|
+ 'integer'=>':attribute 应为数值',
|
|
|
+ 'required_without'=>':attribute 不应为空',
|
|
|
+ 'numeric'=>':attribute 必须为数字',
|
|
|
+ 'size'=>':attribute 非法',
|
|
|
+ ],[
|
|
|
+ 'owner_id'=>'货主',
|
|
|
+ 'warehouse_id'=>'仓库',
|
|
|
+ 'tonne'=>'吨',
|
|
|
+ 'cubic_meter'=>'立方',
|
|
|
+ 'cars.*.license_plate_number'=>'车牌号',
|
|
|
+ 'cars.*.car_id'=>'车型',
|
|
|
+ 'cars.*.driver_phone'=>'司机电话',
|
|
|
+ 'cars.*.driver_name'=>'司机姓名',
|
|
|
+ ])->errors();
|
|
|
+ if (count($errors)>0)$this->success(["errors"=>$errors]);
|
|
|
+ $errors = Validator::make($selectDate,[
|
|
|
+ "date" => ["required","date","after:today"],
|
|
|
+ "time" => ["required","integer"],
|
|
|
+ ])->errors();
|
|
|
+ if (count($errors)>0)$this->error("未选定预约日期");
|
|
|
+
|
|
|
+ DB::transaction(function ()use($model,$selectDate,$details){
|
|
|
+ $result = DeliveryAppointment::query()->selectRaw("appointment_date,date_period,SUM(capacity) AS capacity")
|
|
|
+ ->where("appointment_date",$selectDate["date"])
|
|
|
+ ->where("date_period",$selectDate["time"])
|
|
|
+ ->where("warehouse_id",$model["warehouse_id"])
|
|
|
+ ->where("status",0)
|
|
|
+ ->groupBy(["appointment_date","date_period"])
|
|
|
+ ->lockForUpdate()->first();
|
|
|
+ /** @var \stdClass $warehouse */
|
|
|
+ $warehouse = Warehouse::query()->find($model["warehouse_id"]);
|
|
|
+ $need = app("DeliveryAppointmentService")->
|
|
|
+ calculateCapacity($model["tonne"],$model["cubic_meter"],count($details),
|
|
|
+ $warehouse->reduced_production_capacity_coefficient);
|
|
|
+ if ($result){
|
|
|
+ $total = $warehouse->production_capacity*DeliveryAppointment::HOUR[$selectDate["time"]];
|
|
|
+ $available = $total-$result->capacity;
|
|
|
+ if ($available < $need)$this->success(["isFail"=>false]);
|
|
|
+ }
|
|
|
+ /** @var \stdClass $appointment */
|
|
|
+ $appointment = DeliveryAppointment::query()->create([
|
|
|
+ "user_id" => Auth::id(),
|
|
|
+ "owner_id" => $model["owner_id"],
|
|
|
+ "procurement_number" => $model["procurement_number"],
|
|
|
+ "asn_number" => $model["asn_number"],
|
|
|
+ "warehouse_id" => $model["warehouse_id"],
|
|
|
+ "tonne" => $model["tonne"],
|
|
|
+ "cubic_meter" => $model["cubic_meter"],
|
|
|
+ "box_amount" => $model["box_amount"],
|
|
|
+ "capacity" => $need,
|
|
|
+ "appointment_date" => $selectDate["date"],
|
|
|
+ "date_period" => $selectDate["time"],
|
|
|
+ ]);
|
|
|
+ if ($details)app("DeliveryAppointmentService")->insertDetails($appointment,$details);
|
|
|
+ $insert = [];
|
|
|
+ foreach ($model["cars"] as $index=>$car){
|
|
|
+ $rand = mt_rand(0,9);
|
|
|
+ $len = strlen($appointment->id);
|
|
|
+ $ten = $len < 2 ? "0" : substr($appointment->id,$len-2,1);
|
|
|
+ $one = substr($appointment->id,$len-1,1);
|
|
|
+ //唯一码 随机数+十位+当前下标+个位+日期
|
|
|
+ $number = $rand.$ten.$index.$one.date("d");
|
|
|
+ $insert[] = [
|
|
|
+ "delivery_appointment_id" => $appointment->id,
|
|
|
+ "license_plate_number" => $car["license_plate_number"],
|
|
|
+ "car_id" => $car["car_id"],
|
|
|
+ "driver_name" => $car["driver_name"],
|
|
|
+ "driver_phone" => $car["driver_phone"],
|
|
|
+ "appointment_number" => $number,
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ DeliveryAppointmentCar::query()->insert($insert);
|
|
|
+ //md5加密在密文第五位后插入
|
|
|
+ $md5 = substr_replace(md5(date("m-d")),$appointment->id,5,0);
|
|
|
+ $this->success(["key"=>$md5]);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据key取id 鉴权数据
|
|
|
+ */
|
|
|
+ public function showAppointmentInfo()
|
|
|
+ {
|
|
|
+ $key = request("k");
|
|
|
+ $len = strlen($key);
|
|
|
+ $id = substr($key,5,$len-32);
|
|
|
+ $md5 = substr($id,0,5).substr($id,5+$len-32);
|
|
|
+ if ($md5!==md5(date("m-d")))return "错误";
|
|
|
+ /** @var \stdClass $appointment */
|
|
|
+ $appointment = DeliveryAppointment::query()->with("cars")->find($id);
|
|
|
+ if (!$appointment || $appointment->user_id != Auth::id())return "错误";
|
|
|
+ return $appointment->cars;
|
|
|
+ }
|
|
|
}
|