|
@@ -9,6 +9,7 @@ use App\MaterialBox;
|
|
|
use App\MaterialBoxCommodity;
|
|
use App\MaterialBoxCommodity;
|
|
|
use App\MaterialBoxModel;
|
|
use App\MaterialBoxModel;
|
|
|
use App\Owner;
|
|
use App\Owner;
|
|
|
|
|
+use App\Services\ForeignHaiRoboticsService;
|
|
|
use App\Services\LogService;
|
|
use App\Services\LogService;
|
|
|
use App\Station;
|
|
use App\Station;
|
|
|
use App\StationTask;
|
|
use App\StationTask;
|
|
@@ -113,7 +114,7 @@ SQL;
|
|
|
foreach ($models as $model){
|
|
foreach ($models as $model){
|
|
|
if (!isset($map[$model->id]))continue;
|
|
if (!isset($map[$model->id]))continue;
|
|
|
$model->maximum = $map[$model->id]->maximum;
|
|
$model->maximum = $map[$model->id]->maximum;
|
|
|
- $boxCodes = app("MaterialBoxService")->getModelAvailableBox($model->id,true);
|
|
|
|
|
|
|
+ list($boxCodes) = app("MaterialBoxService")->getModelAvailableBox($model->id,true);
|
|
|
if (!$boxCodes)continue;
|
|
if (!$boxCodes)continue;
|
|
|
if (!$m)$m = $model;
|
|
if (!$m)$m = $model;
|
|
|
$sql = <<<SQL
|
|
$sql = <<<SQL
|
|
@@ -189,6 +190,154 @@ sql;
|
|
|
* 取得料箱
|
|
* 取得料箱
|
|
|
*/
|
|
*/
|
|
|
public function acquireBox()
|
|
public function acquireBox()
|
|
|
|
|
+ {
|
|
|
|
|
+ $this->gate("入库管理-入库-半箱补货入库");
|
|
|
|
|
+
|
|
|
|
|
+ list($track, $barCode, $lotNum, $amount) = request()->only(["track","barCode","lotNum","amount"]);
|
|
|
|
|
+ if (!$track || !$barCode || !$lotNum || !$amount)$this->error("提交信息不完整");
|
|
|
|
|
+
|
|
|
|
|
+ $sql = <<<SQL
|
|
|
|
|
+SELECT SUM(FMQTY) qty,TSK_TASKLISTS.SKU,TSK_TASKLISTS.CUSTOMERID
|
|
|
|
|
+FROM TSK_TASKLISTS
|
|
|
|
|
+LEFT JOIN BAS_SKU ON TSK_TASKLISTS.CUSTOMERID = BAS_SKU.CUSTOMERID
|
|
|
|
|
+AND TSK_TASKLISTS.SKU = BAS_SKU.SKU
|
|
|
|
|
+WHERE FMID = ? AND FMLOTNUM = ? AND
|
|
|
|
|
+ (ALTERNATE_SKU1 = ? OR ALTERNATE_SKU2 = ? OR ALTERNATE_SKU3 = ?)
|
|
|
|
|
+ AND TASKPROCESS = '00' AND TASKTYPE = 'PA'
|
|
|
|
|
+GROUP BY FMID,FMLOTNUM,TSK_TASKLISTS.SKU,TSK_TASKLISTS.CUSTOMERID
|
|
|
|
|
+SQL;
|
|
|
|
|
+ $task = DB::connection("oracle")->selectOne(DB::raw($sql));
|
|
|
|
|
+ if (!$task || $task->qty<$amount)$this->error("待上架数量不足");
|
|
|
|
|
+ $commodity = Commodity::query()->whereHas("owner",function ($query)use($task){
|
|
|
|
|
+ $query->where("code",$task->customerid);
|
|
|
|
|
+ })->where("sku",$task->sku)->first();
|
|
|
|
|
+ if (!$commodity)$this->error("商品在WAS丢失,联系管理员处理");
|
|
|
|
|
+
|
|
|
|
|
+ /** @var \Illuminate\Database\Eloquent\Collection $models */
|
|
|
|
|
+ $models = app("MaterialBoxModelService")->getModelSortedByOwner($commodity->owner_id);
|
|
|
|
|
+ $models->load(["commodity"=>function($query)use($commodity){
|
|
|
|
|
+ $query->where("commodity_id",$commodity->id);
|
|
|
|
|
+ }]);
|
|
|
|
|
+ $models = $models->whereNotNull("commodity");
|
|
|
|
|
+ if ($models->count()==0)$this->success(["status"=>false]);
|
|
|
|
|
+
|
|
|
|
|
+ //设定一个默认缓存架 仅用于任务占位 没有实际作用
|
|
|
|
|
+ $defaultStation = Station::query()->where("station_type_id",5)
|
|
|
|
|
+ ->whereNull("parent_id")->first();
|
|
|
|
|
+ if (!$defaultStation)$this->error("默认缓存架丢失");
|
|
|
|
|
+ DB::beginTransaction();
|
|
|
|
|
+ try {
|
|
|
|
|
+ //建立任务
|
|
|
|
|
+ $exe = function ($station, $boxId, $amount)use($defaultStation, $commodity, $lotNum, $track){
|
|
|
|
|
+ $stationId = $station ? $station->id : $defaultStation->id;
|
|
|
|
|
+ $task = StationTask::query()->create([
|
|
|
|
|
+ 'status' => "待处理",
|
|
|
|
|
+ 'station_id' => $stationId,
|
|
|
|
|
+ ]);
|
|
|
|
|
+ $task = StationTaskMaterialBox::query()->create([
|
|
|
|
|
+ 'station_id' => $stationId,
|
|
|
|
|
+ 'material_box_id'=>$boxId,
|
|
|
|
|
+ 'status'=>"待处理",
|
|
|
|
|
+ 'type' => '取',
|
|
|
|
|
+ 'station_task_id' => $task->id,
|
|
|
|
|
+ ]);
|
|
|
|
|
+ //生成临时任务事务
|
|
|
|
|
+ TaskTransaction::query()->create([
|
|
|
|
|
+ "bar_code" => request("barCode"),
|
|
|
|
|
+ "fm_station_id" => $stationId,
|
|
|
|
|
+ "material_box_id" => $boxId,
|
|
|
|
|
+ "commodity_id" => $commodity->id,
|
|
|
|
|
+ "amount" => $amount,
|
|
|
|
|
+ "type" => "入库",
|
|
|
|
|
+ "user_id" => Auth::id(),
|
|
|
|
|
+ "mark" => 1,
|
|
|
|
|
+ "lot_num" => $lotNum,
|
|
|
|
|
+ "track_num" => $track,
|
|
|
|
|
+ "status" => $station ? 0 : 3,
|
|
|
|
|
+ "task_id" => $task->id
|
|
|
|
|
+ ]);
|
|
|
|
|
+ return $task;
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ $stations = app("StationService")->getCacheShelf(true);
|
|
|
|
|
+ $collection = collect();
|
|
|
|
|
+ $location = collect();
|
|
|
|
|
+ $ids = [];
|
|
|
|
|
+ //寻找半箱
|
|
|
|
|
+ foreach ($models as $model){
|
|
|
|
|
+ list($invs,$map) = app("StorageService")->getMaxAvailableHalfBoxLocation($model->commodity, request("lotNum"));
|
|
|
|
|
+ if (!$invs)continue;
|
|
|
|
|
+ foreach ($invs as $inv){
|
|
|
|
|
+ $station = $stations->last();
|
|
|
|
|
+ $boxId = $map[$inv->locationid];
|
|
|
|
|
+ $number = $amount >= $inv->qty ? $amount-$inv->qty : $amount;
|
|
|
|
|
+ $task = $exe($station, $boxId, $number);
|
|
|
|
|
+ if ($station){
|
|
|
|
|
+ $stations->offsetUnset($stations->count()-1);
|
|
|
|
|
+ $collection->push($task);
|
|
|
|
|
+ $location->push($station->code);
|
|
|
|
|
+ $ids[] = ["code"=>$station->code,"id"=>$station->id,"amount"=>$number];
|
|
|
|
|
+ }
|
|
|
|
|
+ $amount -= $number;
|
|
|
|
|
+ if ($amount==0)break;
|
|
|
|
|
+ }
|
|
|
|
|
+ if ($amount==0)break;
|
|
|
|
|
+ }
|
|
|
|
|
+ if ($amount){
|
|
|
|
|
+ //寻找空箱
|
|
|
|
|
+ $blacklist = [];//空箱逐一寻找需要列队黑名单
|
|
|
|
|
+ foreach ($models as $model){
|
|
|
|
|
+ while ($amount!=0){
|
|
|
|
|
+ $station = $stations->last();
|
|
|
|
|
+ $box = app("MaterialBoxService")->getAnEmptyBox($model,$blacklist);
|
|
|
|
|
+ if (!$box)break; //此型号下无空箱可用
|
|
|
|
|
+ $blacklist[] = $box->id; //当前空箱黑名单
|
|
|
|
|
+ $number = $amount >= $model->commodity->maximum ? $amount-$model->commodity->maximum : $amount;
|
|
|
|
|
+ $task = $exe($station, $box->id, $number);
|
|
|
|
|
+ if ($station){
|
|
|
|
|
+ $stations->offsetUnset($stations->count()-1);
|
|
|
|
|
+ $collection->push($task);
|
|
|
|
|
+ $location->push($station->code);
|
|
|
|
|
+ $ids[] = ["code"=>$station->code,"id"=>$station->id,"amount"=>$number];
|
|
|
|
|
+ }
|
|
|
|
|
+ $amount -= $number;
|
|
|
|
|
+ }
|
|
|
|
|
+ if ($amount==0)break;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if ($location->count()){
|
|
|
|
|
+ /** @var ForeignHaiRoboticsService $service */
|
|
|
|
|
+ $service = app("ForeignHaiRoboticsService");
|
|
|
|
|
+ $result = $service->fetchGroup_multiLocation($location,$collection,'','立架出至缓存架');
|
|
|
|
|
+ if (!$result){
|
|
|
|
|
+ DB::rollBack();
|
|
|
|
|
+ $this->error("机器人呼叫失败,海柔任务错误");
|
|
|
|
|
+ }
|
|
|
|
|
+ foreach ($ids as $obj){
|
|
|
|
|
+ $options = [
|
|
|
|
|
+ "detail01" => $obj["code"],
|
|
|
|
|
+ "detail02" => $barCode,
|
|
|
|
|
+ "qty02" => $obj["amount"],
|
|
|
|
|
+ "title" => '入库任务',
|
|
|
|
|
+ "uomDesc02" => "件"
|
|
|
|
|
+ ];
|
|
|
|
|
+ app("CacheShelfService")->lightUp($obj["code"],'3','0',$options);
|
|
|
|
|
+ Cache::forever("CACHE_SHELF_OCCUPANCY_{$obj["id"]}",true);
|
|
|
|
|
+ }
|
|
|
|
|
+ app("StationService")->locationOccupyMulti($location->toArray());
|
|
|
|
|
+ }
|
|
|
|
|
+ DB::commit();
|
|
|
|
|
+ $this->success(["status"=>true,"amount"=>$amount]);
|
|
|
|
|
+ }catch (\Exception $e){
|
|
|
|
|
+ DB::rollBack();
|
|
|
|
|
+ $this->error("处理失败:".$e->getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 取得料箱 废弃
|
|
|
|
|
+ */
|
|
|
|
|
+ public function acquireBoxTemp()
|
|
|
{
|
|
{
|
|
|
$this->gate("入库管理-入库-半箱补货入库");
|
|
$this->gate("入库管理-入库-半箱补货入库");
|
|
|
$boxId = request("material_box_id");
|
|
$boxId = request("material_box_id");
|
|
@@ -293,12 +442,13 @@ sql;
|
|
|
public function overflowRevision()
|
|
public function overflowRevision()
|
|
|
{
|
|
{
|
|
|
$this->gate("入库管理-入库-半箱补货入库");
|
|
$this->gate("入库管理-入库-半箱补货入库");
|
|
|
- $station = request("station");
|
|
|
|
|
|
|
+ $ide = request("ide");
|
|
|
$amount = request("amount");
|
|
$amount = request("amount");
|
|
|
- //获取目标库位
|
|
|
|
|
- $station = app("StationService")->getMirrorMappingLocation($station);
|
|
|
|
|
- if (!$station)$this->error("未知库位");
|
|
|
|
|
- $task = TaskTransaction::query()->with("materialBox")->where("fm_station_id",$station->id)->where("amount",">",$amount)
|
|
|
|
|
|
|
+ //获取目标料箱
|
|
|
|
|
+ $box = MaterialBox::query()->where("code",$ide)->first();
|
|
|
|
|
+ if (!$box)$this->error("未知料箱");
|
|
|
|
|
+
|
|
|
|
|
+ $task = TaskTransaction::query()->where("material_box_id",$box->id)->where("amount",">",$amount)
|
|
|
->where("type","入库")->where("mark",1)->where("status",0)->first();
|
|
->where("type","入库")->where("mark",1)->where("status",0)->first();
|
|
|
if (!$task)$this->error("无任务存在");
|
|
if (!$task)$this->error("无任务存在");
|
|
|
$task->update(["amount" => DB::raw("amount - {$amount}")]);
|
|
$task->update(["amount" => DB::raw("amount - {$amount}")]);
|
|
@@ -550,23 +700,33 @@ SQL;
|
|
|
$track = request("track");
|
|
$track = request("track");
|
|
|
$barCode = request("barCode");
|
|
$barCode = request("barCode");
|
|
|
$sql = <<<SQL
|
|
$sql = <<<SQL
|
|
|
-SELECT TSK_TASKLISTS.FMLOTNUM FROM TSK_TASKLISTS LEFT JOIN BAS_SKU ON TSK_TASKLISTS.CUSTOMERID = BAS_SKU.CUSTOMERID
|
|
|
|
|
|
|
+SELECT TSK_TASKLISTS.FMLOTNUM,SUM(FMQTY) qty FROM TSK_TASKLISTS LEFT JOIN BAS_SKU ON TSK_TASKLISTS.CUSTOMERID = BAS_SKU.CUSTOMERID
|
|
|
AND TSK_TASKLISTS.SKU = BAS_SKU.SKU
|
|
AND TSK_TASKLISTS.SKU = BAS_SKU.SKU
|
|
|
WHERE FMID = ? AND (ALTERNATE_SKU1 = ? OR ALTERNATE_SKU2 = ? OR ALTERNATE_SKU3 = ?)
|
|
WHERE FMID = ? AND (ALTERNATE_SKU1 = ? OR ALTERNATE_SKU2 = ? OR ALTERNATE_SKU3 = ?)
|
|
|
AND TASKPROCESS = '00' AND TASKTYPE = 'PA' GROUP BY FMID,FMLOTNUM
|
|
AND TASKPROCESS = '00' AND TASKTYPE = 'PA' GROUP BY FMID,FMLOTNUM
|
|
|
SQL;
|
|
SQL;
|
|
|
$tasks = DB::connection("oracle")->select(DB::raw($sql),[$track,$barCode,$barCode,$barCode]);
|
|
$tasks = DB::connection("oracle")->select(DB::raw($sql),[$track,$barCode,$barCode,$barCode]);
|
|
|
$result = ["count"=>count($tasks)];
|
|
$result = ["count"=>count($tasks)];
|
|
|
- if (count($tasks)>1){
|
|
|
|
|
- $lotNums = "";
|
|
|
|
|
- foreach ($tasks as $task)$lotNums .= "'".$task->fmlotnum."',";
|
|
|
|
|
- $lotNums = rtrim($lotNums,",");
|
|
|
|
|
- $sql = <<<SQL
|
|
|
|
|
|
|
+ switch ($result["count"]){
|
|
|
|
|
+ case 0:
|
|
|
|
|
+ break;
|
|
|
|
|
+ case 1:
|
|
|
|
|
+ $result["lots"] = $tasks[0]->fmlotnum;
|
|
|
|
|
+ $result["lotMap"] = [$result["lots"] => $tasks[0]->qty];
|
|
|
|
|
+ break;
|
|
|
|
|
+ default:
|
|
|
|
|
+ $lotNums = "";
|
|
|
|
|
+ $result["lotMap"] = [];
|
|
|
|
|
+ foreach ($tasks as $task){
|
|
|
|
|
+ $lotNums .= "'".$task->fmlotnum."',";
|
|
|
|
|
+ $result["lotMap"][$task->fmlotnum] = $task->qty;
|
|
|
|
|
+ }
|
|
|
|
|
+ $lotNums = rtrim($lotNums,",");
|
|
|
|
|
+ $sql = <<<SQL
|
|
|
SELECT * FROM INV_LOT_ATT WHERE LOTNUM IN ({$lotNums});
|
|
SELECT * FROM INV_LOT_ATT WHERE LOTNUM IN ({$lotNums});
|
|
|
SQL;
|
|
SQL;
|
|
|
- $result["lots"] = DB::connection("oracle")->select(DB::raw($sql));
|
|
|
|
|
|
|
+ $result["lots"] = DB::connection("oracle")->select(DB::raw($sql));
|
|
|
}
|
|
}
|
|
|
- if (count($tasks)==1)$result["lots"] = $tasks[0]->fmlotnum;
|
|
|
|
|
$this->success($result);
|
|
$this->success($result);
|
|
|
}
|
|
}
|
|
|
|
|
|